CameraServices.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: qiuzijian
  5. * Date: 2021-04-20
  6. * Time: 15:33
  7. */
  8. namespace Modules\Camera\Services;
  9. use App\Enum\ApiEnum;
  10. use Illuminate\Support\Facades\Cache;
  11. use Illuminate\Support\Facades\Input;
  12. use Illuminate\Support\Facades\Log;
  13. use Modules\Admin\Enum\AdminEnum;
  14. use Modules\Camera\Entities\CameraFieldList;
  15. use Modules\Camera\Entities\CameraList;
  16. use Modules\Camera\Enum\CameraEnum;
  17. use Modules\Camera\Http\Controllers\Api\HaiKangController;
  18. use Modules\Mine\Entities\MineList;
  19. use Modules\Mine\Entities\MineListExt;
  20. class CameraServices
  21. {
  22. //添加摄像头链接
  23. public static function addCameraList($params)
  24. {
  25. $result['status'] = true;
  26. $result['msg'] = AdminEnum::RETURN_SUCCESS;
  27. //通过ip+端口+通道号作为唯一标识判断数据是否存在
  28. $query = CameraList::where(
  29. [
  30. 'ip' => $params['ip'],
  31. 'port' => $params['port'],
  32. 'com_number' => $params['com_number'],
  33. ]
  34. )->first();
  35. if ($query) {
  36. $result['status'] = false;
  37. $result['msg'] = AdminEnum::RECORD_ALREADY_EXIST;
  38. return $result;
  39. }
  40. $camera_url = self::makeCameraUrl($params);
  41. //入库动作
  42. $res = CameraList::insert(
  43. [
  44. 'mine_id' => $params['mine_id'],
  45. 'ip' => $params['ip'],
  46. 'port' => $params['port'],
  47. 'user_name' => $params['user_name'],
  48. 'password' => $params['password'],
  49. 'com_number' => $params['com_number'],
  50. 'camera_name' => $params['camera_name'],
  51. 'revert_id' => CameraEnum::CAMERA_DEFAULT_REVERT_ID,
  52. // 'status' => $params['status'],
  53. 'camera_url' => $camera_url,
  54. 'sort' => $params['sort'],
  55. 'created_at' => date('Y-m-d H:i:s'),
  56. 'updated_at' => date('Y-m-d H:i:s'),
  57. ]
  58. );
  59. if (!$res) {
  60. $result['status'] = false;
  61. $result['msg'] = AdminEnum::DATABASE_ERROR;
  62. }
  63. return $result;
  64. }
  65. //生成摄像头请求链接
  66. public static function makeCameraUrl($params)
  67. {
  68. $url = 'rtsp://' . $params['user_name'] . ':' . $params['password'] . '@';
  69. $url .= $params['ip'] . ':' . $params['port'] . '/' . 'h264' . '/' . 'ch' . $params['com_number'] . '/';
  70. $url .= 'sub/av_stream'; //sub 子码流
  71. // $url .= 'main/av_stream'; //main 主码流
  72. return $url;
  73. }
  74. //编辑摄像头链接
  75. public static function editCameraList($params)
  76. {
  77. $result['status'] = true;
  78. $result['msg'] = AdminEnum::RETURN_SUCCESS;
  79. $camera_url = self::makeCameraUrl($params);
  80. //判断记录是否存在
  81. $query = CameraList::find($params['id']);
  82. if (!$query) {
  83. $result['status'] = false;
  84. $result['msg'] = AdminEnum::RECORD_NOT_EXIST;
  85. return $result;
  86. }
  87. //通过ip+端口+通道号作为唯一标识判断数据是否存在
  88. $query = CameraList::where(
  89. [
  90. 'ip' => $params['ip'],
  91. 'port' => $params['port'],
  92. 'com_number' => $params['com_number'],
  93. ]
  94. )->where('id', '!=', $params['id'])->first();
  95. if ($query) {
  96. $result['status'] = false;
  97. $result['msg'] = AdminEnum::RECORD_ALREADY_EXIST;
  98. return $result;
  99. }
  100. //更新动作
  101. $res = CameraList::where('id', $params['id'])->update(
  102. [
  103. 'mine_id' => $params['mine_id'],
  104. 'ip' => $params['ip'],
  105. 'port' => $params['port'],
  106. 'user_name' => $params['user_name'],
  107. 'password' => $params['password'],
  108. 'com_number' => $params['com_number'],
  109. 'camera_name' => $params['camera_name'],
  110. // 'status' => $params['status'],
  111. 'camera_url' => $camera_url,
  112. 'sort' => $params['sort'],
  113. 'updated_at' => date('Y-m-d H:i:s'),
  114. ]
  115. );
  116. if (!$res) {
  117. $result['status'] = false;
  118. $result['msg'] = AdminEnum::DATABASE_ERROR;
  119. }
  120. return $result;
  121. }
  122. //删除摄像头列表记录
  123. public static function delCameraList($params)
  124. {
  125. $result['status'] = true;
  126. $result['msg'] = AdminEnum::RETURN_SUCCESS;
  127. //判断字段是否存在
  128. $query = CameraList::find($params['id']);
  129. if (!$query) {
  130. $result['status'] = false;
  131. $result['msg'] = AdminEnum::RECORD_NOT_EXIST;
  132. return $result;
  133. }
  134. $res = CameraList::where('id', $params['id'])->delete();
  135. if (!$res) {
  136. $result['status'] = false;
  137. $result['msg'] = AdminEnum::DATABASE_ERROR;
  138. }
  139. return $result;
  140. }
  141. //添加摄像头链接生成字段
  142. public static function addCameraFieldList($params)
  143. {
  144. $result['status'] = true;
  145. $result['msg'] = AdminEnum::RETURN_SUCCESS;
  146. //判断字段是否已存在
  147. $query = CameraFieldList::where('field_name', $params['field_name'])->first();
  148. if ($query) {
  149. $result['status'] = false;
  150. $result['msg'] = AdminEnum::RECORD_ALREADY_EXIST;
  151. return $result;
  152. }
  153. //入库动作
  154. $res = CameraFieldList::insert(
  155. [
  156. 'field_name' => $params['field_name'],
  157. 'created_at' => date('Y-m-d H:i:s'),
  158. 'updated_at' => date('Y-m-d H:i:s'),
  159. ]
  160. );
  161. if (!$res) {
  162. $result['status'] = false;
  163. $result['msg'] = AdminEnum::DATABASE_ERROR;
  164. }
  165. return $result;
  166. }
  167. //编辑摄像头链接生成字段
  168. public static function editCameraFieldList($params)
  169. {
  170. $result['status'] = true;
  171. $result['msg'] = AdminEnum::RETURN_SUCCESS;
  172. //判断字段是否存在
  173. $query = CameraFieldList::find($params['id']);
  174. if (!$query) {
  175. $result['status'] = false;
  176. $result['msg'] = AdminEnum::RECORD_NOT_EXIST;
  177. return $result;
  178. }
  179. $res = CameraFieldList::where('id', $params['id'])->update(
  180. [
  181. 'field_name' => $params['field_name'],
  182. 'updated_at' => date('Y-m-d H:i:s'),
  183. ]
  184. );
  185. if (!$res) {
  186. $result['status'] = false;
  187. $result['msg'] = AdminEnum::DATABASE_ERROR;
  188. }
  189. return $result;
  190. }
  191. //删除摄像头链接生成字段
  192. public static function delCameraFieldList($params)
  193. {
  194. $result['status'] = true;
  195. $result['msg'] = AdminEnum::RETURN_SUCCESS;
  196. //判断字段是否存在
  197. $query = CameraFieldList::find($params['id']);
  198. if (!$query) {
  199. $result['status'] = false;
  200. $result['msg'] = AdminEnum::RECORD_NOT_EXIST;
  201. return $result;
  202. }
  203. $res = CameraFieldList::where('id', $params['id'])->delete();
  204. if (!$res) {
  205. $result['status'] = false;
  206. $result['msg'] = AdminEnum::DATABASE_ERROR;
  207. }
  208. return $result;
  209. }
  210. //根据矿区id获取摄像头列表
  211. public static function getCameraListByMineId($mine_id)
  212. {
  213. $result['status'] = true;
  214. $result['msg'] = ApiEnum::RETURN_SUCCESS;
  215. $query = CameraList::where('mine_id', $mine_id)->orderBy('sort', 'desc')->select(
  216. [
  217. 'id as camera_id',
  218. 'mine_id',
  219. 'camera_name'
  220. ]
  221. )->get()->toArray();
  222. $result['data'] = $query;
  223. return $result;
  224. }
  225. //根据摄像头id获取摄像头播放链接
  226. public static function getCameraUrlByCameraId($camera_id)
  227. {
  228. $result['status'] = true;
  229. $result['msg'] = ApiEnum::RETURN_SUCCESS;
  230. $query = CameraList::where('id', $camera_id)->first();
  231. if (!$query) {
  232. $result['status'] = false;
  233. $result['msg'] = ApiEnum::NO_CAMERA_URL;
  234. return $result;
  235. }
  236. $degree = MineList::where('id', $query->mine_id)->value('degree');
  237. $mine_list = MineList::whereIn('id', explode('|', $degree))->select(['title'])->get()->toArray();
  238. $path = '';
  239. foreach ($mine_list as $key => $val) {
  240. $path .= '/' . $val['title'];
  241. }
  242. $path .= '/' . $query->camera_name . $camera_id;
  243. //已有拉流id,直接返回拉流链接
  244. if ($query->revert_id != CameraEnum::CAMERA_DEFAULT_REVERT_ID) {
  245. $result['data'] = [
  246. 'camera_id' => $camera_id,
  247. 'url' => env('VIDEO_SYSTEM_URL') . CameraEnum::M3U8_FILE_PATH . $path . '/' . date('Ymd', time()) . '/' . CameraEnum::M3U8_FILE_NAME,
  248. ];
  249. return $result;
  250. }
  251. $data = [
  252. 'url' => $query->camera_url,
  253. 'customPath' => $path,
  254. ];
  255. Log::info('请求流媒体服务器参数------------');
  256. Log::info($data);
  257. $curl = env('EASY_DARWIN_URL') . CameraEnum::API_STREAM_START . '?' . http_build_query($data);
  258. //请求流媒体服务器拉流
  259. $curl_res = curl_request($curl);
  260. Log::info('请求流媒体服务器result------------');
  261. Log::info($curl_res);
  262. if (strpos($curl_res,' ')) {
  263. $result['status'] = false;
  264. $result['msg'] = ApiEnum::EASY_DAWIN_REQUEST_FAIL;
  265. return $result;
  266. }
  267. //更新拉流id
  268. CameraList::where('id', $camera_id)->update(
  269. [
  270. 'revert_id' => trim($curl_res, '"'),
  271. 'updated_at' => date('Y-m-d H:i:s'),
  272. ]
  273. );
  274. $result['data'] = [
  275. 'camera_id' => $camera_id,
  276. 'url' => env('VIDEO_SYSTEM_URL') . CameraEnum::M3U8_FILE_PATH . $path . '/' . date('Ymd', time()) . '/' . CameraEnum::M3U8_FILE_NAME,
  277. ];
  278. return $result;
  279. }
  280. //停止流媒体推流
  281. public static function stopCameraStream($camera_id = '')
  282. {
  283. $result['status'] = true;
  284. $result['msg'] = ApiEnum::RETURN_SUCCESS;
  285. $query = CameraList::where('revert_id', '!=', CameraEnum::CAMERA_DEFAULT_REVERT_ID);
  286. if ($camera_id) {
  287. $query = $query->where('id', $camera_id);
  288. }
  289. $query = $query->get()->toArray();
  290. if (!$query) {
  291. $result['status'] = false;
  292. $result['msg'] = ApiEnum::NO_CAMERA_URL;
  293. return $result;
  294. }
  295. $res_data = [];
  296. foreach ($query as $key => $val) {
  297. $data = [
  298. 'id' => $val['revert_id']
  299. ];
  300. Log::info('请求流媒体服务器参数------------');
  301. Log::info($data);
  302. $curl = env('EASY_DARWIN_URL') . CameraEnum::API_STREAM_STOP . '?' . http_build_query($data);
  303. //请求流媒体服务器拉流
  304. $curl_res = curl_request($curl);
  305. Log::info('请求流媒体服务器result------------');
  306. Log::info($curl_res);
  307. if (trim($curl_res, '"') != 'OK') {
  308. $res_data['error'][] = [
  309. 'id' => $val['id'],
  310. 'revert_id' => $val['revert_id'],
  311. 'result' => $curl_res,
  312. ];
  313. } else {
  314. $res_data['success'][] = [
  315. 'id' => $val['id'],
  316. 'revert_id' => $val['revert_id'],
  317. ];
  318. //更新拉流id为默认id
  319. CameraList::where('id', $val['id'])->update(
  320. [
  321. 'revert_id' => CameraEnum::CAMERA_DEFAULT_REVERT_ID,
  322. 'updated_at' => date('Y-m-d H:i:s'),
  323. ]
  324. );
  325. }
  326. }
  327. //递归删除目录
  328. $dir = public_path() . '/files/video/m3u8/';
  329. deldir($dir);
  330. $result['data'] = $res_data;
  331. return $result;
  332. }
  333. //查询海康矿井摄像头列表
  334. public static function getHaiKangCamera($parent_id, $mine_id)
  335. {
  336. $result['status'] = true;
  337. $result['msg'] = ApiEnum::RETURN_SUCCESS;
  338. $result['data'] = [];
  339. $query = MineListExt::where('mine_id', $parent_id)->first();
  340. $list = [];
  341. Input::replace(
  342. [
  343. 'url' => trim($query->ip, '/') . ':' . $query->port,
  344. 'key' => $query->key,
  345. 'secret' => $query->secret,
  346. 'indexCode' => $mine_id,
  347. ]
  348. );
  349. $haikang = new HaiKangController();
  350. $result_hk = $haikang->getCamerasList();
  351. if ($result_hk['data']['list']) {
  352. foreach ($result_hk['data']['list'] as $key => $val) {
  353. $list[$key]['mine_id'] = $mine_id;
  354. $list[$key]['camera_id'] = $val['cameraIndexCode'];
  355. $list[$key]['camera_name'] = $val['cameraName'];
  356. }
  357. }
  358. $result['data'] = $list;
  359. return $result;
  360. }
  361. //查询海康矿井摄像头播放链接
  362. public static function getHaiKangCameraUrl($parent_id, $camera_id)
  363. {
  364. $result['status'] = true;
  365. $result['msg'] = ApiEnum::RETURN_SUCCESS;
  366. $result['data'] = [];
  367. $query = MineListExt::where('mine_id', $parent_id)->first();
  368. Input::replace(
  369. [
  370. 'url' => trim($query->ip, '/') . ':' . $query->port,
  371. 'key' => $query->key,
  372. 'secret' => $query->secret,
  373. 'cameraIndexCode' => $camera_id,
  374. ]
  375. );
  376. $haikang = new HaiKangController();
  377. $result_hk = $haikang->getCamerasUrl();
  378. if ($result_hk['data']['url']) {
  379. $result['data']['camera_id'] = $camera_id;
  380. $result['data']['url'] = $result_hk['data']['url'];
  381. }
  382. return $result;
  383. }
  384. }