load->model('Videomonitor_model'); $this->load->model('Project_model'); $this->load->model('Network_model'); $this->load->model('System_config_model'); } // 视屏监控列表 public function getlist() { $userid = $this->get_user_info('id'); $role = $this->get_user_info('role'); $companyid = $this->get_user_info('companyid'); $page = $this->input->post('page',true); $count = $this->input->post('count',true); $page = empty($page) ? 1 : $page; $count = empty($count) ? 16 : $count; $project_id = intval($this->input->post('project_id',true)); // $network_id = $this->input->post('network_id',true); // $lamp_id = $this->input->post('lamp_id',true); // $action = $this->input->post('action',true); $keyword = $this->input->post('keyword',true); $filter = []; if ($project_id > 0) $filter['projectid'] = $project_id; $field = "V.name as video_name, V.address, V.id, V.channel, V.devid, V.password, V.type, V.image"; if (!empty($keyword)) { $filter['keyword'] = $keyword; } $accessToken = $this->get_accessToken(); $total = $this->Videomonitor_model->getTotal($filter,$role,$userid,$companyid,$project_id); $data = $this->Videomonitor_model->get_list_by_role($role,$userid,$companyid,$field,$page,$count,$project_id,$filter); foreach ($data as &$v) { if (!empty($v['image'])) { $v['image'] = base_url($v['image']); } } json_result('0000',$this->response['0000'],array('list'=>$data,'total'=>ceil($total/$count),'accessToken'=>$accessToken)); // if (empty($action)) { // (视屏监控页)带分页的列表 // }else{ // (项目管理页)不带分页的列表 // if ($network_id > 0) $filter['networkid'] = $network_id; // if ($lamp_id > 0) $filter['lampid'] = $lamp_id; // $data = $this->Videomonitor_model->get_list_by_filter($filter,$field); // json_result('0000',$this->response['0000'],array('video_list'=>$data)); // } } // 获取萤石云accessToken private function get_accessToken(){ $accessToken = $this->System_config_model->get_system_config('YSYAccessToken'); $expireTime = $this->System_config_model->get_system_config('YSYAccessTokenExpireTime'); if (empty($accessToken) || empty($expireTime) || strtotime($expireTime) < time()) { // token不存在或者token过期,重新获取token $url = 'https://open.ys7.com/api/lapp/token/get'; $appKey = $this->config->config['YSYAppkey']; $appSecret = $this->config->config['YXYSecret']; $resData = request_post($url,array('appKey'=>$appKey,'appSecret'=>$appSecret)); $resData = json_decode($resData); if ($resData->code != 200) { exit(json_result('0814',$this->response['0814'],array())); } // 获取token成功,记录token值与过期时间 $accessToken = $resData->data->accessToken; $this->System_config_model->set_system_config('YSYAccessToken',$resData->data->accessToken); $expireTime = floor($resData->data->expireTime/1000) - 24*3600; $expireDate = date('Y-m-d H:i:s',$expireTime); $this->System_config_model->set_system_config('YSYAccessTokenExpireTime',$expireDate); } return $accessToken; } // 翻译提示信息 private function translation_info($code){ if (!isset($code) || empty($code)) { return 'Unknown error'; } $data = array( '20002' => 'Equipment does not exist', '20007' => 'Equipment is not online', '20010' => 'Device verification code error', '20011' => 'Device add failure', '20013' => 'The equipment has been added to others', '20014' => 'DeviceSerial illegality', '20017' => 'The device has been added to its own', '10004' => 'User does not exist', '20018' => 'The user does not have the device', '20032' => 'The user\'s lower channel does not exist', '60020' => 'The command is not supported', '60061' => 'Account flow exceeded or not purchased, limit opening', '60060' => 'Unbound address', '49999' => 'Data anomaly', ); return empty($data['code']) ? 'Unknown error' : $data['code']; } // 添加/编辑视频监控 public function update(){ $where['id'] = $this->input->post('id',true); $role = $this->get_user_info('role'); $data['name'] = $this->input->post('name',true); $data['projectid'] = $this->input->post('projectid',true); $data['devid'] = $this->input->post('devid',true); $data['password'] = $this->input->post('password',true); $data['type'] = intval($this->input->post('type',true)); $address = $this->input->post('address',true); $channel = $this->input->post('channel',true); $longitude = $this->input->post('longitude',true); $latitude = $this->input->post('latitude',true); if ($data['type'] == 0) { $data['channel'] = 1; }else{ $data['channel'] = $channel; } if(isset($address)) $data['address'] = $address; if(isset($longitude)) $data['longitude'] = $longitude; if(isset($latitude)) $data['latitude'] = $latitude; if(empty($data['name'])) exit(json_result('0803',$this->response['0803'],array())); if(empty($data['projectid'])) exit(json_result('0308',$this->response['0308'],array())); if(empty($data['devid'])) exit(json_result('0808',$this->response['0808'],array())); if(empty($data['password'])) exit(json_result('0809',$this->response['0809'],array())); if($data['type'] < 0) exit(json_result('0810',$this->response['0810'],array())); if($data['type'] == 1 && empty($channel)) exit(json_result('0811',$this->response['0811'],array())); // 获取accessToken $data['devid'] = strtoupper($data['devid']); $accessToken = $this->get_accessToken(); $version = $this->session->userdata('version'); if (empty($where['id'])) { // 添加数据 if ($this->Videomonitor_model->getDataCount(array('name'=>$data['name'],'projectid'=>$data['projectid']))) { exit(json_result('0801',$this->response['0801'],array())); } if ($data['type'] == 1 && $this->Videomonitor_model->getDataCount(array('devid'=>$data['devid'],'channel'=>$data['channel']))) { exit(json_result('0812',$this->response['0812'],array())); } //1. 添加设备 $url = 'https://open.ys7.com/api/lapp/device/add'; $res1 = request_post($url,array('accessToken'=>$accessToken,'deviceSerial'=>$data['devid'],'validateCode'=>$data['password'])); $res1 = json_decode($res1); if ($res1->code != 200) { if (empty($version)) { exit(json_result('other',$res1->msg,array())); }else{ exit(json_result('other',$this->translation_info($res1->code),array())); } } // 关闭视频加密 $url = 'https://open.ys7.com/api/lapp/device/encrypt/off'; request_post($url,array('accessToken'=>$accessToken,'deviceSerial'=>$data['devid'],'validateCode'=>$data['password'])); // 修改设备名称 $url = 'https://open.ys7.com/api/lapp/device/name/update'; request_post($url,array('accessToken'=>$accessToken,'deviceSerial'=>$data['devid'],'deviceName'=>$data['name'])); // 2.开通直播 $url = 'https://open.ys7.com/api/lapp/live/video/open'; $res2 = request_post($url,array('accessToken'=>$accessToken,'source'=>$data['devid'].':'.$data['channel'])); $res2 = json_decode($res2); if ($res2->code != 200) { if (empty($version)) { exit(json_result('other',$res1->msg,array())); }else{ exit(json_result('other',$this->translation_info($res1->code),array())); } }else{ if ($res2->data[0]->ret != 200 && $res2->data[0]->ret != 60062) { if (empty($version)) { exit(json_result('other',$res2->data[0]->desc,array())); }else{ exit(json_result('other',$this->translation_info($res2->data[0]->ret),array())); } } } // 3.获取播放地址 $url = 'https://open.ys7.com/api/lapp/live/address/get'; $res3 = request_post($url,array('accessToken'=>$accessToken,'source'=>$data['devid'].':'.$data['channel'])); $res3 = json_decode($res3); if ($res3->code != 200) { if (empty($version)) { exit(json_result('other',$res3->msg,array())); }else{ exit(json_result('other',$this->translation_info($res3->code),array())); } } $res = $res3->data[0]; $data['hls'] = $res->hls; $data['hlsHd'] = $res->hlsHd; $data['rtmp'] = $res->rtmp; $data['rtmpHd'] = $res->rtmpHd; // 4.获取图片 $url = 'https://open.ys7.com/api/lapp/device/capture'; $res4 = request_post($url,array('accessToken'=>$accessToken,'deviceSerial'=>$data['devid'],'channelNo'=>$data['channel'])); $res4 = json_decode($res4); if ($res4->code == 200) { $image = file_get_contents($res4->data->picUrl); $filename = FCPATH.'file/image/C24816636_'.date('YmdHis').'.jpg'; $file = fopen($filename, 'w'); fwrite($file, $image); fclose($file); $data['image'] = 'api/file/image/C24816636_'.date('YmdHis').'.jpg'; } $data['createtime'] = date('Y-m-d H-i-s',time()); $id = $this->Videomonitor_model->insert($data); $data['count'] = 1; // 设置项目跟网络的监控数 $this->Project_model->add_monitor_count($data); $projectData = $this->Project_model->getData(array('id'=>$data['projectid']),'projectname'); $this->add_operation_log('insert',"在\"{$projectData['projectname']}\"项目下添加视屏监控,监控名称\"{$data['name']}\"",0); $this->add_operation_log('insert',"Add video monitor.Monitor name:\"{$data['name']}\".Project name:\"{$projectData['projectname']}\"",0,1); }else{ // 编辑数据 if ($this->Videomonitor_model->getDataCount(array('name'=>$data['name'],'projectid'=>$data['projectid']),$where['id'])) { exit(json_result('0801',$this->response['0801'],array())); } if ($data['type'] == 1 && $this->Videomonitor_model->getDataCount(array('devid'=>$data['devid'],'channel'=>$data['channel']),$where['id'])) { exit(json_result('0812',$this->response['0812'],array())); } $oldData = $this->Videomonitor_model->getOne($where['id']); $this->Videomonitor_model->update(array('id'=>$where['id']),$data); $data['count'] = 1; $oldData['count'] = 1; if ($oldData['projectid'] != $data['projectid']) { $this->Project_model->add_monitor_count($data); $this->Project_model->minus_monitor_count($oldData); } if ($oldData['name'] != $data['name']) { $url = 'https://open.ys7.com/api/lapp/device/name/update'; request_post($url,array('accessToken'=>$accessToken,'deviceSerial'=>$data['devid'],'deviceName'=>$data['name'])); } $projectData = $this->Project_model->getData(array('id'=>$data['projectid']),'projectname'); $this->add_operation_log('update',"修改\"{$projectData['projectname']}\"项目下的视屏监控,监控名称\"{$data['name']}\"",0); $this->add_operation_log('update',"Update video monitor.Monitor name:\"{$data['name']}\".Project name:\"{$projectData['projectname']}\"",0,1); $id = $where['id']; } exit(json_result('0000',$this->response['0000'],array('id'=>$id))); } // 删除视频监控(支持批量操作) public function del(){ $videoIds = $this->input->post('id',true); $role = $this->get_user_info('role'); if (empty($videoIds)) { exit(json_result('0007',$this->response['0007'],array())); } $ids = explode(',', $videoIds); $data = $this->Videomonitor_model->get_list_by_filter(array('id'=>$ids),'V.id,V.projectid,V.devid,V.name,V.image'); $url = 'https://open.ys7.com/api/lapp/device/delete'; $accessToken = $this->get_accessToken(); foreach ($data as $v) { @unlink($v['image']); // 删除萤石云上监控 request_post($url,array('accessToken'=>$accessToken,'deviceSerial'=>$v['devid'])); $v['count'] = 1; $this->Project_model->minus_monitor_count($v); $projectData = $this->Project_model->getData(array('id'=>$v['projectid']),'projectname'); $this->add_operation_log('delete',"删除\"{$projectData['projectname']}\"项目下的视屏监控,监控名称\"{$v['name']}\"",0); $this->add_operation_log('delete',"Delete video monitor.Monitor name:\"{$v['name']}\".Project name:\"{$projectData['projectname']}\"",0,1); } $this->Videomonitor_model->delData(array('id'=>$ids)); // 删除视频日志信息 $this->Videomonitor_model->del_video_info_log(array('videoid'=>$ids)); exit(json_result('0000',$this->response['0000'],array())); } // 视屏监控详情 public function video_info(){ $id = $this->input->post('id',true); if (empty($id)) { exit(json_result('0007',$this->response['0007'],array())); } $field = "id,name,address,type,projectid,devid,password,channel,status,longitude,latitude,hls,hlsHD,rtmp,rtmpHD,image"; $data = $this->Videomonitor_model->getOne($id,$field); $data['accessToken'] = $this->get_accessToken(); exit(json_result('0000',$this->response['0000'],$data)); } // 播放视频监控 public function video_play(){ $id = $this->input->post('id',true); if (empty($id)) { exit(json_result('0007',$this->response['0007'],array())); } $field = "id,name,address,type,projectid,devid,password,channel,status,longitude,latitude,hls,hlsHD,rtmp,rtmpHD,image"; $data = $this->Videomonitor_model->getOne($id,$field); // 4.获取图片 $accessToken = $this->get_accessToken(); $url = 'https://open.ys7.com/api/lapp/device/capture'; $res4 = request_post($url,array('accessToken'=>$accessToken,'deviceSerial'=>$data['devid'],'channelNo'=>$data['channel'])); $res4 = json_decode($res4); if ($res4->code == 200) { $image = file_get_contents($res4->data->picUrl); $filename = FCPATH.'file/image/C24816636_'.date('YmdHis').'.jpg'; $file = fopen($filename, 'w'); fwrite($file, $image); fclose($file); $image = 'api/file/image/C24816636_'.date('YmdHis').'.jpg'; $this->Videomonitor_model->update(array('id'=>$id),array('image'=>$image)); @unlink($data['image']); $data['image'] = $image; } $data['accessToken'] = $this->get_accessToken(); exit(json_result('0000',$this->response['0000'],$data)); } // 云台控制 public function yun_start(){ $deviceSerial = $this->input->post('deviceSerial',true); $channelNo = $this->input->post('channelNo',true); $direction = intval($this->input->post('direction',true)); $speed = intval($this->input->post('speed',true)); if (empty($channelNo) || empty($deviceSerial)) { exit(json_result('0007',$this->response['0007'],array())); } $accessToken = $this->get_accessToken(); $version = $this->session->userdata('version'); // 开始云台控制 $url1 = 'https://open.ys7.com/api/lapp/device/ptz/start'; $request_data = array('accessToken'=>$accessToken,'deviceSerial'=>$deviceSerial,'channelNo'=>$channelNo,'direction'=>$direction,'speed'=>$speed); // var_dump($request_data); $data = request_post($url1,$request_data); $data = json_decode($data); if ($data->code != '200') { if (empty($version)) { exit(json_result('other',$data->msg,array())); }else{ exit(json_result('other',$this->translation_info($data->msg),array())); } } // sleep(1); // var_dump($data); // 停止云台控制 // $url2 = 'https://open.ys7.com/api/lapp/device/ptz/stop'; // $data2 = request_post($url2,array('accessToken'=>$accessToken,'deviceSerial'=>$deviceSerial,'channelNo'=>$channelNo,'direction'=>$direction)); // $data2 = json_decode($data2); exit(json_result('0000',$this->response['0000'],array())); } public function yun_end(){ $deviceSerial = $this->input->post('deviceSerial',true); $channelNo = $this->input->post('channelNo',true); $direction = intval($this->input->post('direction',true)); $accessToken = $this->get_accessToken(); $version = $this->session->userdata('version'); if (empty($channelNo) || empty($deviceSerial)) { exit(json_result('0007',$this->response['0007'],array())); } $url2 = 'https://open.ys7.com/api/lapp/device/ptz/stop'; $data2 = request_post($url2,array('accessToken'=>$accessToken,'deviceSerial'=>$deviceSerial,'channelNo'=>$channelNo,'direction'=>$direction)); $data2 = json_decode($data2); if ($data2->code != 200) { if (empty($version)) { exit(json_result('other',$data2->msg,array())); }else{ exit(json_result('other',$this->translation_info($data2->msg),array())); } } exit(json_result('0000',$this->response['0000'],array())); } } ?>