errorMsg(\Zndp\Api\ResponseCode::EMPTY_USERNAME); } //获取用户信息 $where = array( 'UserName'=>$username, 'RoleId' => \Zndp\User\RoleEnum::API_CLIENT, ); $userinfo = MM('uc_user')->where($where)->field('ID,UserName,Password')->find(); if(!$userinfo){//用户名不存在 $this->errorMsg(\Zndp\Api\ResponseCode::USERNAME_NOT_EXISTS); } //密码错误 $password = (new \Zndp\User\Util)->encPwd($password); if($password != $userinfo['Password']){ $this->errorMsg(\Zndp\Api\ResponseCode::PASSWORD_ERROR); } //返回ID(sessionKey) $sessionkeyArr = array('sessionkey'=>$userinfo['ID']); $sessionkeyJson= json_encode($sessionkeyArr); echo $sessionkeyJson; } public function loginBusiness( ){ $username = I('businessUsername'); $password = I('businessPassword'); //检查用户名 $userinfo = $this->checkUserName($username); //密码错误 $password = (new \Zndp\User\Util)->encPwd($password); if($password != $userinfo['Password']){ $this->errorMsg(\Zndp\Api\ResponseCode::PASSWORD_ERROR); } //登录成功 --》 添加登录记录到login表 $data['UserId'] = $userinfo['ID']; $data['LoginTime'] = date('Y-m-d H:i:s'); $login_id = MM('dpyh_login')->add($data); // 返回json数据串 $cond = array('FarmId'=>$userinfo['OrganizationId']); $orginfo = MM('dpsb_group')->where($cond)->field('ID as orgid,OrgName as orgname')->select(); $dataArr = array( 'response' => 'success', 'CODE' => '0', 'sessionkey' => $userinfo['ID'], 'custid' => $userinfo['OrganizationId'], 'ysAppkey' => '', 'ysSecket' => '', 'ysUsername' => '', 'ysPassword' => '', 'operatorid' => '', 'orginfo' => $orginfo, 'loginid' => $login_id ); $dataJson = json_encode($dataArr,JSON_UNESCAPED_UNICODE); echo $dataJson; } public function getRealTimeDeviceDetailData( ){ //header('Content-type: application/json'); //单台设备信息,包括5张最新图片(如果有摄像头),传感器值,行程控制值,开关控制值 $username = I('get.username'); $device_addr = I('get.addr'); //检查必填参数 $this->checkRequiredParam('username,addr'); //检查用户名 $userinfo = $this->checkUserName($username,true); //检查设备 $device_info = $this->checkDeviceControlRight($userinfo,$device_addr); //设备失去连接 //获取农场名称(顾客名称) $where = array('ID'=>$userinfo['FarmId']); $custName = MM('uc_organization')->where( $where )->getField('DepartName'); //获取A类型传感器数据集 $where = array( 'DeviceId'=>$device_info['ID'], 'ChType' => array('IN',\Zndp\Device\ChannelType::SENSOR_TYPES) ); $sensors = MM('dpsb_channel')->where($where)->field('ChNumberText as Chx,DisplayName,ChType as channelType,ChValue as chValue,Unit,Flag,ChMan as man')->select(); $sensorValue = array(); $channel_type_model = new \Zndp\Device\ChannelType(); foreach($sensors as $sensor){ $sensor['workUnitName'] = $device_info['WorkUnitName']; $sensor['Unit'] = $channel_type_model->getTypeUnit($sensor['channelType']); $sensor['Flag'] = $channel_type_model->getTypeFlag($sensor['channelType']); $sensor['channelType'] = $sensor['channelType']; array_push($sensorValue,$sensor); } //获取行程类传感器数据集 $where = array( 'DeviceId'=>$device_info['ID'], 'ChType' => array('IN',\Zndp\Device\ChannelType::ITINERARY_SENSOR) ); $travels = MM('dpsb_channel')->where($where)->field('ChNumberText as Chx,DisplayName,ChType as channelType,ChValue as chValue,Unit,Flag,ChMan as man')->select(); $travelValue = array(); foreach($travels as $travel){ $travel['workUnitName'] = $device_info['WorkUnitName']; $travel['Unit'] = $channel_type_model->getTypeUnit($travel['channelType']); $travel['Flag'] = $channel_type_model->getTypeFlag($travel['channelType']); $travel['channelType'] = (int)$travel['channelType']; array_push($travelValue,$travel); } //返回json串 $arr = array( 'Addr' => $device_addr, 'custname' => $custName, 'custid' => (int)$userinfo['FarmId'], 'gatherTime' => $device_info['GatherTime'], 'workUnitName' => $device_info['WorkUnitName'], 'hikValue' => array( 'videosn'=>'', 'ysAppkey'=>'', //'accessToken'=>'' ), 'imageValue' => array(), 'sensorValue' => $sensorValue, 'travelValue' => $travelValue, 'onoffValue' => array(), 'proportionValue' => array() ); echo json_encode($arr,JSON_UNESCAPED_UNICODE); } public function sendControl_test( ){ //根据设备、通道号控制设备状态,行程量5个(全开,全关,打开运行中,关闭运行中,停止),开关量(打开,停止),返回是否自动控制信息。修改设备后的信息会保存。 $device_addr = I('get.addr'); $channel_status = I('get.status'); $channel_number = I('get.channelNumber'); $sessionkey = I('get.sessionkey'); // 检查必填参数 $this->checkRequiredParam('addr,status,channelNumber,sessionkey'); // 检查sessionkey $userinfo = $this->checkSessionKey(); // 检查用户对设备权限 //$device_info = $this->checkDeviceControlRight($userinfo,$device_addr); // 对应设备失去连接 // 对应序号传感器不是控制设备 $channel_info = $this->checkControlChannel($device_addr,$channel_number); // 控制参数错误 if( !in_array($channel_status,[0,1,2]) ){ $error = array("response"=>"error", "error" =>"4", "errorinfo"=>"Wrong Status!" ); echo json_encode($error);exit; } // 设备应答操作失败(应答状态为0) // 传给信号服务 $host = '127.0.0.1'; $port = 10240; $socket = new Jms\Network\TcpClient($host,$port); $cmd = array( "method" => "apiSendControl", "Addr" => $device_addr, //设备addr "channelNumber" => $channel_number, //通道编号 "status" => $channel_status ); $res = $socket->send(json_encode($cmd)."\n"); //修改设备后的保存信息 if(!$res['success']){//操作失败 $this->errorMsg(\Zndp\Api\ResponseCode::DEVICE_RESPONSE_FAIL); } $data_arr = array( 'response' => $res['success'] ? 'success' : 'error', 'decstate' => $res['data']['decstate'], 'isauto' => $res['data']['isauto'] ); // 返回json串 echo json_encode($data_arr,JSON_UNESCAPED_UNICODE); } public function getControlInfo( ){ $device_addr = I('get.addr'); $channel_number = I('get.channelNumber'); $sessionkey = I('get.sessionkey'); // 检查必要的参数 $this->checkRequiredParam('addr,channelNumber,sessionkey'); // 检查sessionkey $this->checkSessionKey(); // 检查设备是否存在 $device_info = $this->checkDevice($device_addr); // 对应设备失去连接 // 检查对应序号传感器是否控制设备 $channel_info = $this->checkControlChannel($device_addr,$channel_number); // 设备应答操作失败(应答状态为0) $where = array( 'DeviceId' => $device_info['ID'], 'Channel' => $channel_number, ); $channel_config = MM('dpsb_policy')->where($where)->find(); if(!$channel_config){ $this->errorMsg(\Zndp\Api\ResponseCode::NO_DATA); } $where = array('DeviceId' => $device_info['ID'],$channel_number); $channel_type = MM('dpsb_channel')->where($where)->getField('ChType'); $model = new \Zndp\Device\ChannelType(); // 返回json串 $arr = array( 'response' => 'success', 'devtype' => $device_info['DeviceType'] ?:'', 'devinfojson' => array( "channel"=> $channel_config['Channel'], //通道编号值 "IsUse"=> 1, //传感器?是否使用 "N"=> $device_info['WorkUnitName'], //名称 "U"=> $model->getTypeUnit($channel_type), //单位 //"Bus"=>"", //总线地址 //"BusAddr"=> '', //总线类型 "T"=> $channel_type, //通道类型,参见第四章‘设备通道类型字段’ "Man"=> $channel_config['Man'], //是否自动, 0自动,1手动 //"MOut"=>"", //"Load"=>"", "refChannel"=> $channel_config['RefChannel'], //参考通道,此通道指传感器通道(refChannel) //"RefAddr"=>"", //参考目标设备地址(暂未启用) //"InterLock"=>"", //参考互锁通道编号(暂未启用,此通道指控制通道) //"Over_Value"=>"2.5", "UpperLimit_Value"=> $channel_config['UpperLimitValue'],//上限值参考值 可通过上线下线参考值 设置扩值(温度范围) "UpperLimit_State"=> $channel_config['UpperLimitState'], //上限值参考状态 0关 1开 "LowerLimit_Value"=> $channel_config['LowerLimitValue'], //下限值参考值 可通过上线下线参考值 设置扩值(温度范围) "LowerLimit_State"=> $channel_config['LowerLimitState'], //下限值参考状态 0关 1开 "TimeEn"=> $channel_config['IsTime'], //定时任务使能 1开启,0关闭 "OnTime1"=> $channel_config['OnTime1'], //打开时间1 "OffTime1"=> $channel_config['OffTime1'], //关闭时间1 "OnTime2"=> $channel_config['OnTime2'], //打开时间2 "OffTime2"=> $channel_config['OffTime2'], //关闭时间2 "OnTime3"=> $channel_config['OnTime3'], //打开时间3 "OffTime3"=> $channel_config['OffTime3'], //关闭时间3 "OnTime4"=> $channel_config['OnTime4'], //打开时间4 "OffTime4"=> $channel_config['OffTime4'], //关闭时间4 "OnTime5"=> $channel_config['OnTime5'], //打开时间5 "OffTime5"=> $channel_config['OffTime5'], //关闭时间5 //"Cycle"=>"1", //"OpenTime"=>"10", //"CloseTime"=>"60" ) ); echo json_encode($arr,JSON_UNESCAPED_UNICODE); } public function ModifyAutoControlInfo_test( ){ //设备可通过设置参数进行自动控制,onTime时间单位为分钟,比如8:10对应8*60+10=490 可通过上线下线参考值 设置扩值(温度范围) $addr = I('get.addr'); //设备地址 $channelNumber = I('get.channelNumber'); //设备通道 $man = I('get.man'); //是否自动,0自动,1手动 //$RefAddr = I('get.RefAddr'); //参考目标设备地址,暂未启用 $refChannel = I('get.refChannel'); //参考通道,此通道指传感器通道 //$InterLock = I('get.InterLock'); //参考互锁通道编号,暂未启用,此通道指控制通道 $TimeEn = I('get.TimeEn'); //定时任务使能,1开启,0关闭 $UpperLimit_Value = I('get.UpperLimit_Value'); //上限值参考值,可通过上线下线参考值 设置扩值(温度范围) $UpperLimit_State = I('get.UpperLimit_State'); //上限值参考状态,0关 1开 $LowerLimit_Value = I('get.LowerLimit_Value'); //下限值参考值,可通过上线下线参考值 设置扩值(温度范围) $LowerLimit_State = I('get.LowerLimit_State'); //下限值参考状态,0关 1开 $OnTime1 = I('get.OnTime1'); //打开时间1 $OffTime1 = I('get.OffTime1'); //关闭时间1 $OnTime2 = I('get.OnTime2'); //打开时间2 $OffTime2 = I('get.OffTime2'); //关闭时间2 $OnTime3 = I('get.OnTime3'); //打开时间3 $OffTime3 = I('get.OffTime3'); //关闭时间3 $OnTime4 = I('get.OnTime4'); //打开时间4 $OffTime4 = I('get.OffTime4'); //关闭时间4 $OnTime5 = I('get.OnTime5'); //打开时间5 $OffTime5 = I('get.OffTime5'); //关闭时间5 // 检查必填参数 $this->checkRequiredParam('addr,channelNumber,man,TimeEn'); // 检查sessionkey $this->checkSessionKey(); // 检查设备是否存在 $device_info = $this->checkDevice($addr); // 检查是否为控制类传感器 $channel_infp= $this->checkControlChannel($addr,$channelNumber); // 发送给信号服务 $host = '127.0.0.1'; $port = 10240; $socket = new Jms\Network\TcpClient($host,$port); $msg = array( 'method' => 'apiModifyAutoControlInfo', 'Addr' => $addr, 'channelNumber' => $channelNumber, 'man' => $man, 'refChannel' => $refChannel, 'TimeEn' => $TimeEn, 'UpperLimit_Value' => $UpperLimit_Value, 'UpperLimit_State' => $UpperLimit_State, 'LowerLimit_Value' => $LowerLimit_Value, 'LowerLimit_State' => $LowerLimit_State, 'OnTime1' => $OnTime1 >= 0 ? $OnTime1 : -1, 'OffTime1' => $OffTime1 >= 0 ? $OffTime1 : -1, 'OnTime2' => $OnTime2 >= 0 ? $OnTime2 : -1, 'OffTime2' => $OffTime2 >= 0 ? $OffTime2 : -1, 'OnTime3' => $OnTime3 >= 0 ? $OnTime3 : -1, 'OffTime3' => $OffTime3 >= 0 ? $OffTime3 : -1, 'OnTime4' => $OnTime4 >= 0 ? $OnTime4 : -1, 'OffTime4' => $OffTime4 >= 0 ? $OffTime4 : -1, 'OnTime5' => $OnTime5 >= 0 ? $OnTime5 : -1, 'OffTime5' => $OffTime5 >= 0 ? $OffTime5 : -1, ); //测试是否为字符串 //$res = $socket->send($msg); $res = $socket->send(json_encode($msg)."\n"); // 对应设备失去连接 // 设备应答操作失败(应答状态为0) //$arr = array("error"=>"302",'response'=>'success','man'=>1); $arr = array( 'response' => $res['success'] ? 'success':'error', 'man' => $res['data']['man'], ); echo json_encode($arr,JSON_UNESCAPED_UNICODE); } public function getDeviceSensorDataFromTime( ){ //获取传感器数据,获取设备指定时间之间的所有数据,如果不传endTime参数,则返回开始时间之后的数据。也可以用该接口返回单个通道的历史数据 $device_addr = I('get.addr'); //设备 $startTime = I('get.startTime'); //采集时间开始值,不可为空 $endTime = I('get.endTime'); //结束时间,如不传该参数,则返回开始时间之后的所有数据 $channelNumber = I('get.channelNumber'); //通道编号,如果无通道编号参数,则返回所有传感器通道数据 $sessionkey = I('get.sessionkey'); // 检查必要的参数 $this->checkRequiredParam('addr,startTime,sessionkey'); // 检查sessionkey $this->checkSessionKey(); // 设备不存在 $device_info = $this->checkDevice($device_addr); // 组装查询条件 $startTime = date('Y-m-d H:i:s',strtotime($startTime));//值为2018会当成当天20:18 $where = array( 'GatherTime' => array('egt',$startTime), 'DeviceId' => $device_info['ID'] ); //时间格式错误 if( strtotime($startTime) === false ){ $this->errorMsg(\Zndp\Api\ResponseCode::TIME_FORMAT_ERROR); } // 有结束时间 if($endTime){ //时间范围错误 if( strtotime($startTime) > strtotime($endTime) ){//开始时间大于结束时间 $this->errorMsg(\Zndp\Api\ResponseCode::WRONG_TIME_RANGE); } //时间格式错误 if( strtotime($endTime) === false ){ $this->errorMsg(\Zndp\Api\ResponseCode::TIME_FORMAT_ERROR); } $endTime = date('Y-m-d H:i:s',strtotime($endTime)); $where['GatherTime'] = array('between',array($startTime,$endTime)); } // 有通道编号 if($channelNumber){ $where['ChNumber'] = $channelNumber; } // 获取数据集 $datalist = MM('dpsj_channel')->where($where)->select(); if( count($datalist) == 0 ){ $this->errorMsg(\Zndp\Api\ResponseCode::NO_DATA); } $dataArr = array(); foreach($datalist as $data){ $dataArr[] = array( 'dataid' => $data['ID'], 'gatherTime' => $data['GatherTime'], 'column_'.$data['ChNumber'] => $data['ChValue'] ); } //返回json串 $arr = array( "addr" => $device_addr, "unitId" => $device_info['ID'], "unitName" => $device_info['WorkUnitName'], "upperLimit" => null, "lowerLimit" => null, "startTime" => $startTime, "endTime" => $endTime, "dataarr" => $dataArr ); echo json_encode($arr,JSON_UNESCAPED_UNICODE); } public function getRealTimeDeviceData( ){ //获取设备的传感器(不包括控制设备)的最新一条数据 $device_addr = I('get.addr'); $sessionkey = I('get.sessionkey'); // 检查必填参数 $this->checkRequiredParam('addr,sessionkey'); // 检查sessionkey $this->checkSessionKey(); // 检查设备是否存在 $device_info = $this->checkDevice($device_addr); //获取设备最新数据 $where = array('DeviceId'=>$device_info['ID']); $device_data = MM('dpsj_device')->where($where)->order('GatherTime desc')->find(); //通过DeviceDataId到通道数据表中取出关联数据 $where = array('DeviceDataId'=>$device_data['ID']); $channel_list = MM('dpsj_channel')->where($where)->field('ChNumber as `column`,DisplayName as `name`,ChValue as `value`,ChType')->select(); $type_model = new \Zndp\Device\ChannelType(); $util_model = new \Zndp\Device\Util(); $channel_arr = array(); foreach($channel_list as $channel){ $channel['unit'] = $type_model->getTypeUnit($channel['ChType']); unset($channel['ChType']); array_push($channel_arr,$channel); } //返回json串 $arr = array( "id" => $device_data['ID'], "addr" => $device_addr, "devname" => $device_info['WorkUnitName'], "gathertime"=> $device_data['GatherTime'], "devValue" => $channel_arr ); echo json_encode($arr,JSON_UNESCAPED_UNICODE); } public function getDeviceChannel( ){ $username = I('get.username'); $sessionkey = I('get.sessionkey'); // 检查必填参数 $this->checkRequiredParam('username,sessionkey'); // 检查用户名 $userinfo = $this->checkUserName($username); // 检查sessionkey $this->checkSessionKey(); $where = array('FarmId'=>$userinfo['OrganizationId']); $device_group = MM('dpsb_group')->where($where)->select(); if( empty($device_group) ){//用户名下无授权设备 $this->errorMsg(\Zndp\Api\ResponseCode::NOT_AUTH_DEVICE); } $model = new \Zndp\Device\ChannelType(); $arr = array(); foreach($device_group as $group){ $cond1 = array('DeviceGroupId'=>$group['ID']); $device_list = MM('dpsb_device')->where($cond1)->field('ID,DeviceAddr')->select(); foreach($device_list as $device){ $cond2 = array('DeviceId'=>$device['ID']); $channel_list = MM('dpsb_channel')->where($cond2)->field('ChNumber as Chx,DisplayName,ChValue as chValue,ChMan as chMan,ChType')->select(); $device_arr = array(); foreach($channel_list as $channel){ $channel['Unit'] = $model->getTypeUnit($channel['ChType']); $channel['Flag'] = $model->getTypeFlag($channel['ChType']); unset($channel['ChType']); $device_arr[] = array_merge(array('Addr'=>$device['DeviceAddr']),$channel); } $group_arr = array( $group['OrgName'] => $device_arr); array_push($arr,$group_arr); } } //返回json串 echo json_encode($arr,JSON_UNESCAPED_UNICODE); } public function getDeviceChannelState( ){ $device_addr = I('get.addr'); $channel_number = I('get.channelNumber'); $sessionkey = I('get.sessionkey'); //检查必填参数 $this->checkRequiredParam('addr,channelNumber,sessionkey'); //检查sessionkey $userinfo = $this->checkSessionKey(); //检查用户对设备的权限 //$this->checkDeviceControlRight($userinfo,$device_addr); //获取设备信息 $device_info = $this->checkDevice($device_addr); //获取通道信息 $where = array('ChNumber'=>$channel_number,'DeviceId'=>$device_info['ID']); $field = 'ChNumberText as Chx,DisplayName,ChValue as chValue,ChMan as chMan,ChType'; $channel_info = MM('dpsb_channel')->where($where)->field($field)->find(); if( !$channel_info ){ // 通道号不存在,返回暂无数据 $this->errorMsg(\Zndp\Api\ResponseCode::NO_DATA); } $model = new \Zndp\Device\ChannelType(); $channel_info['Unit'] = $model->getTypeUnit($channel_info['ChType']); $channel_info['Flag'] = $model->getTypeFlag($channel_info['ChType']); $channel_info['Addr'] = $device_addr; unset($channel_info['ChType']); $where = array('ID'=>$device_info['DeviceGroupId']); $group_name = MM('dpsb_group')->where($where)->getField('OrgName'); //返回json串 $arr = array( $group_name => array($channel_info) ); echo json_encode($arr,JSON_UNESCAPED_UNICODE); } public function getCamImageFromTime ( ){ $arr = array('error'=>401); echo json_encode($arr,JSON_UNESCAPED_UNICODE); } public function getCamRealTimeImage( ){ $arr = array('error'=>401); echo json_encode($arr,JSON_UNESCAPED_UNICODE); } public function getRealTimeDeviceChannelData( ){ //根据前台账号名获取账号下所有设备信息 $username = I('get.username'); //前台用户名 $workUnitName = I('get.workUnitName'); //设备名称,用于模糊查询 $pageNumber = I('get.pageNumber'); //页码 从1开始,默认为1 $pageSize = I('get.pageSize'); //每页的数据记录条数 默认为50 $sessionkey = I('get.sessionkey'); //检查用户名 $userinfo = $this->checkUserName($username); //检查sessionkey $this->checkSessionKey(); //获取用户所有设备组,设备,通道信息 $where = array('FarmId'=>$userinfo['OrganizationId']); $group_list = MM('dpsb_group')->where($where)->select(); if(!$group_list){//无授权设备 $this->errorMsg(\Zndp\Api\ResponseCode::NOT_AUTH_DEVICE); } $device_arr = array(); foreach($group_list as $group){ $where = array('DeviceGroupId'=>$group['ID']); $device_list = MM('dpsb_device')->where($where)->select(); foreach($device_list as $device){ $where = array('DeviceId'=>$device['ID']); $field = 'ChType as ChannelType,ChNumberText as Chx,DisplayName,ChValue as chValue,ChType'; $channel_list = MM('dpsb_channel')->where($where)->field($field)->select(); $model = new \Zndp\Device\ChannelType(); foreach($channel_list as $channel){ $channel['Unit'] = $model->getTypeUnit($channel['ChType']); $channel['Flag'] = $model->getTypeFlag($channel['ChType']); unset($channel['ChType']); } $channel_list = $channel_list ?: []; $device_arr[] = array( 'gatherTime'=> $device['GatherTime'], 'Addr' => $device['DeviceAddr'], 'workUnitName' => $device['WorkUnitName'], 'latestImagePath' => '', 'latestImagePathWhole' => '', 'devValue' => $channel_list ); } } //返回json串格式 echo json_encode($device_arr,JSON_UNESCAPED_UNICODE); } public function getDeviceByFarmId ( ){ $farmid = I('get.custId'); $sessionkey = I('get.sessionkey'); //检查必填参数 $this->checkRequiredParam('custId,sessionkey'); //检查农场是否存在 //$where = array('FarmId'=>$farmid); $where = array('OrganizationId'=>$farmid);//新流程 $count = MM('uc_user')->where($where)->count(); if( $count == 0 ){ $this->errorMsg(\Zndp\Api\ResponseCode::NO_DATA); } //检查农场基地是否属于sessionkey用户所在公司 $where = array('ID'=>$sessionkey); $depart_id= MM('uc_user')->where($where)->getField('OrganizationId'); $farm_ids = \Zndp\User\Util::get_depart_farm($depart_id); if( !in_array($farmid,$farm_ids) ){ $this->errorMsg(\Zndp\Api\ResponseCode::SESSIONKEY_ERROR); } /*$where = array('FarmId'=>$farmid,'ID'=>$sessionkey); $userinfo = MM('uc_user')->where($where)->find(); if(!$userinfo){ $this->errorMsg(\Zndp\Api\ResponseCode::SESSIONKEY_ERROR); }*/ //组装返回数据 //获取农场下用户组 $where = array('FarmId'=>$farmid); $group_list = MM('dpsb_group')->where($where)->select(); $arr = array(); foreach($group_list as $group){ $where = array('ID'=>$group['FarmId']); $address = MM('dpyh_farm')->where($where)->getField('Address'); $where = array('DeviceGroupId'=>$group['ID']); $device_list = MM('dpsb_device')->where($where)->select(); $device_arr = array(); foreach($device_list as $device){ $devarr = array( 'unitid' => $device['ID'], 'unitname'=> $device['WorkUnitName'], 'unittype'=> $device['DeviceType']?:'', 'address' => $address, 'geom' => array(), 'addr' => $device['DeviceAddr'], 'devtype' => $device['DeviceType']?:'', ); array_push($device_arr,$devarr); } $arr[] = array( 'orgid' => $group['ID'], 'orgname' => $group['OrgName'], 'devarr' => $device_arr ); } //返回json串 echo json_encode($arr,JSON_UNESCAPED_UNICODE); } public function getDeviceByUsername ( ){ //获取内容包括设备组、设备、通道、摄像头信息 $sessionkey = I('get.sessionkey'); $username = I('get.businessUsername'); //客户账号名称 $havechannel = I('get.havechannel'); //是否包含通道 0不包含 1包含 默认为1 //检查用户名 $userinfo = $this->checkUserName($username); //检查sessionKey $this->checkSessionKey(); //获取用户设备组 $where = array('FarmId'=>$userinfo['OrganizationId']); $group_list = MM('dpsb_group')->where($where)->select(); //获取farm地址 $where = array('ID'=>$userinfo['OrganizationId']); $FarmAddr = MM('uc_organization')->where($where)->getField('Address'); //组装返回数据 $arr = array(); foreach($group_list as $group){ $where = array('DeviceGroupId'=>$group['ID']); $device_list = MM('dpsb_device')->where($where)->select(); $device_arr = array(); foreach($device_list as $device){ $devarr = array( 'unitid' => $device['ID'], 'unitname'=> $device['WorkUnitName'], 'unittype'=> $device['DeviceType']?:'', 'address' => $FarmAddr, 'geom' => array(), 'addr' => $device['DeviceAddr'], 'devtype' => $device['DeviceType']?:'', ); if($havechannel){//如果需要通道信息 //获取设备最新一条数据 $where = array('DeviceId'=>$device['ID']); $device_data = MM('dpsj_device')->where($where)->order('GatherTime desc')->limit(1)->find(); //根据设备数据ID查找关联通道数据 $where = array('DeviceDataId'=>$device_data['ID']); $fields= "ChNumber as Chx,DisplayName,ChType as channelType,ChValue as chValue,Unit,Flag"; $channel_data = MM('dpsj_channel')->where($where)->field($field)->select(); $devarr['gathertime'] = $device_data['GatherTime']; $devarr['channelarr'] = $channel_data ?: [];//Chx是 column_x方式的 } array_push($device_arr,$devarr); } $arr[] = array( 'orgid' => $group['ID'], 'orgname' => $group['OrgName'], 'devarr' => $device_arr ); } //返回json串 echo json_encode($arr,JSON_UNESCAPED_UNICODE); } public function getHistoryData( ){ //根据设备设备号、开始时间、结束时间、页号、页数获取传感器历史记录。 $device_addr = I('get.addr'); $sessionkey = I('get.sessionkey'); $startTime = I('get.startTime'); $endTime = I('get.endTime'); $orderby = strtolower(I('get.orderby')); //排序方式 Asc desc $pageSize = I('get.pageSize'); //单页返回记录数量 不能大于500 $pageNumber = I('get.pageNumber'); //页数 从1开始 //检查必填参数 $this->checkRequiredParam('addr,sessionkey,startTime,endTime,orderby,pageSize,pageNumber'); //检查设备是否存在 $device_info = $this->checkDevice($device_addr); //检查设备是不是sessionkey用户的 $userinfo = $this->checkSessionKey(); $where = array('ID'=>$device_info['DeviceGroupId']); $farmid= MM('dpsb_group')->where($where)->getField('FarmId'); /* if( $userinfo['FarmId'] != $farmid ){ $this->errorMsg(\Zndp\Api\ResponseCode::SESSIONKEY_ERROR); }*/ //开始时间格式错误 if( strtotime($startTime) === false){ $this->errorMsg(\Zndp\Api\ResponseCode::TIME_FORMAT_ERROR); } if( $endTime ){//存在结束时间 //时间范围错误 if( strtotime($startTime) > strtotime($endTime) ){//开始时间大于结束时间 $this->errorMsg(\Zndp\Api\ResponseCode::WRONG_TIME_RANGE); } //时间格式错误 if( strtotime($endTime) === false ){ $this->errorMsg(\Zndp\Api\ResponseCode::TIME_FORMAT_ERROR); } }else{ $endTime = date('Y-m-d H:i:s'); } if( !is_numeric($pageSize) || $pageSize <= 0 ){//默认一页给几条数据还是返回错误信息? $pageSize = 5; // $this->errorMsg(\Zndp\Api\ResponseCode::TIME_FORMAT_ERROR); }elseif( $pageSize > 300 ){ $pageSize = 300; } if( !is_numeric($pageNumber) ){//默认页 $pageNumber = 1; //$this->errorMsg(\Zndp\Api\ResponseCode::TIME_FORMAT_ERROR); } $orderArr = array('asc','desc'); if( !in_array($orderby,$orderArr) ){//默认排序 $orderby = 'desc'; } $startTime = date('Y-m-d H:i:s',strtotime($startTime));//值为2018会当成当天20:18 $endTime = date('Y-m-d H:i:s',strtotime($endTime)); //组装返回数据 $where = array( 'DeviceId' => $device_info['ID'], 'GatherTime' => array('between',array($startTime,$endTime)), ); $device_list = MM('dpsj_device')->where($where)->order('GatherTime '.$orderby)->limit($pageNumber,$pageSize)->select(); if(!$device_list){ $this->errorMsg(\Zndp\Api\ResponseCode::NO_DATA); } //组装返回数据 $data_arr = array(); foreach($device_list as $device){ $where = array('DeviceDataId' => $device['ID']); $channel_info = MM('dpsj_channel')->where($where)->select(); $data['id'] = $device['ID']; $data['设备编号'] = $device_addr; $data['设备名称'] = $device_info['WorkUnitName']; $data['工作单元ID'] = $device_info['ID']; $data['工作单元名称'] = $device_addr; $data['采集数据时间'] = $device['GatherTime']; foreach($channel_info as $channel_sj){ $data['插入数据库时间'] = $channel_sj['GatherTime']; $data[$channel_sj['DisplayName']] = $channel_sj['ChValue']; } array_push($data_arr,$data); } echo json_encode($data_arr,JSON_UNESCAPED_UNICODE); } public function getSystemNoticeList ( ){ $userid = I('get.operatorid'); //前台用户ID $sessionkey = I('get.sessionkey'); //sessionkey $pageNumber = I('get.pageNumber'); //页码 从1开始,默认为1 $pageSize = I('get.pageSize'); //每页的数据记录条数 默认为10,不能大于300 $this->checkSessionKey(); //返回json串 $arr = array( "notice"=>[ [ "msgid"=>6166, "title"=>"报警提示", "msgtype"=>1, "content"=>"设备:854715的传感器:温度超出上限:45.0目前为:46.4 时间:2018-05-28 12:38:20", "time"=>"2018-05-28 12:38:20", "state"=>0 ] ], "unreadcount"=>"0" ); echo json_encode($arr,JSON_UNESCAPED_UNICODE); } public function setSystemNoticeState( ){ $this->checkSessionKey(); $arr = array('response'=>'success'); echo json_encode($arr,JSON_UNESCAPED_UNICODE); } public function getHealthState( ){ $device_addr = I('get.addr'); $sessionkey = I('get.sessionkey'); //检查必填字段 $this->checkRequiredParam('addr,sessionkey'); //检查设备 $device_info = $this->checkDevice($device_addr); //检查sessionkey $userinfo = $this->checkSessionKey(); $where = array('ID'=>$device_info['DeviceGroupId']); $farmid = MM('dpsb_group')->where($where)->getField('FarmId'); /* if( $userinfo['FarmId'] != $farmid ){//检查设备是否属于该sessionKey用户 $this->errorMsg(\Zndp\Api\ResponseCode::SESSIONKEY_ERROR); } */ $where = array('DeviceId'=>$device_info['ID']); $device_sj = MM('dpsj_device')->where($where)->order('GatherTime desc')->find(); //返回json串 $arr = array( "msgid"=> $device_sj['ID'], "addr"=> $device_addr, "voltage"=> $device_sj['Voltage'], "signal"=> $device_sj['Signal'], "worktemp"=> $device_sj['WorkTemp'], "gathertime"=> $device_sj['GatherTime'], "pwrstate"=> $device_sj['PwrState'], "custId"=> $farmid ); echo json_encode($arr,JSON_UNESCAPED_UNICODE); } public function getDevHealthList( ){ $device_addr = I('get.addr'); $startTime = I('get.startTime'); //采集时间开始值 不可为空 $endTime = I('get.endTime'); //结束时间 如不传该参数,则返回开始时间之后的所有数据 $pageSize = I('get.pageSize'); $pageNumber = I('get.pageNumber'); $sessionkey = I('get.sessionkey'); //检查必填参数 $this->checkRequiredParam('addr,startTime,sessionkey'); //检查设备 $device_info = $this->checkDevice($device_addr); //检查sessionKey $userinfo = $this->checkSessionKey(); //检查设备是否属于该sessionkey用户 $where = array('ID'=>$device_info['DeviceGroupId']); $farmid = MM('dpsb_group')->where($where)->getField('FarmId'); /* if($userinfo['FarmId'] != $farmid){ $this->errorMsg(\Zndp\Api\ResponseCode::SESSIONKEY_ERROR); } */ //开始时间格式错误 if( strtotime($startTime) === false){ $this->errorMsg(\Zndp\Api\ResponseCode::TIME_FORMAT_ERROR); } if( $endTime ){//存在结束时间 //时间范围错误 if( strtotime($startTime) > strtotime($endTime) ){//开始时间大于结束时间 $this->errorMsg(\Zndp\Api\ResponseCode::WRONG_TIME_RANGE); } //时间格式错误 if( strtotime($endTime) === false ){ $this->errorMsg(\Zndp\Api\ResponseCode::TIME_FORMAT_ERROR); } }else{ $endTime = date('Y-m-d H:i:s'); } if( !is_numeric($pageSize) || $pageSize <= 0 ){//默认一页给几条数据还是返回错误信息? $pageSize = 5; // $this->errorMsg(\Zndp\Api\ResponseCode::TIME_FORMAT_ERROR); }elseif( $pageSize > 30 ){ $pageSize = 30; } if( !is_numeric($pageNumber) ){//默认页 $pageNumber = 1; //$this->errorMsg(\Zndp\Api\ResponseCode::TIME_FORMAT_ERROR); } $startTime = date('Y-m-d H:i:s',strtotime($startTime));//值为2018会当成当天20:18 $endTime = date('Y-m-d H:i:s',strtotime($endTime)); //组装返回数据 $where = array( 'DeviceId' => $device_info['ID'], 'GatherTime' => array('between',array($startTime,$endTime)), ); $device_data = MM('dpsj_device')->where($where)->order('GatherTime desc')->limit($pageNumber,$pageSize)->select(); if(!$device_data){ $this->errorMsg(\Zndp\Api\ResponseCode::NO_DATA); } $device_arr = array(); foreach($device_data as $data){ $device_sj["msgid"] = $data['ID']; $device_sj["addr"]= $device_addr; $device_sj["devname"] = $device_info['WorkUnitName']; $device_sj["voltage"]= $data['Voltage']; $device_sj["signal"]= $data['Signal']; $device_sj["worktemp"] = $data['WorkTemp']; $device_sj["gathertime"] = $data['GatherTime']; $device_sj["pwrstate"] = $data['PwrState']; $device_sj["custId"] = $farmid; array_push($device_arr,$device_sj); } //返回json串 /* $arr = array( [ "msgid"=>10600110, "addr"=>"854715", "devname"=>"测试设备", "voltage"=>5.298, "signal"=>"31", "worktemp"=>31.943, "gathertime"=>"2018-05-26 23:14:00", "pwrstate"=>1 ], );*/ echo json_encode($device_arr,JSON_UNESCAPED_UNICODE); } public function index( ){ $method = I('get.method'); if(!$method){//方法为空 $this->errorMsg(\Zndp\Api\ResponseCode::EMPTY_METHOD); } if(!method_exists($this,$method)){//方法不存在 $this->errorMsg(\Zndp\Api\ResponseCode::METHOD_NOT_EXISTS); } $this->$method(); } private function errorMsg( $code ){ $code = str_pad($code,3,0,STR_PAD_LEFT ); $dataArray = array('response'=>'error','error'=>$code); $dataJson = json_encode($dataArray); echo $dataJson; exit; } private function checkRequiredParam( $fields ){ $fields = explode(',',$fields); foreach($fields as $field){ if(! isset($_GET[$field]) ){ $this->errorMsg(\Zndp\Api\ResponseCode::PARAM_LACK); } } } private function checkSessionKey( $username = '' ){ $where = array( 'ID'=>I('get.sessionkey'), //'AssocId' => I('get.sessionkey'), //'RoleId' => ['eq',\Zndp\User\RoleEnum::API_CLIENT], ); if( $username ){ $where['UserName'] = $username; } $userinfo = MM('uc_user')->where($where)->find(); if(!$userinfo){ $this->errorMsg(\Zndp\Api\ResponseCode::SESSIONKEY_ERROR); } return $userinfo; } private function checkUserName( $username, $checkDev = false ){ if(!$username){//用户名参数为空 $this->errorMsg(\Zndp\Api\ResponseCode::EMPTY_USERNAME); } $where = array( 'UserName'=>$username, 'RoleId' => ['neq',\Zndp\User\RoleEnum::API_CLIENT], ); $userinfo = MM('uc_user')->where($where)->find(); if(!$userinfo){//用户名不存在 $this->errorMsg(\Zndp\Api\ResponseCode::USERNAME_NOT_EXISTS); } if($checkDev){ $where = array('FarmId'=>$userinfo['OrganizationId']); $count = MM('dpsb_group')->where($where)->count(); if( $count == 0 ){ $this->errorMsg(\Zndp\Api\ResponseCode::NOT_AUTH_DEVICE); } } return $userinfo; } private function checkDeviceControlRight( $userinfo, $addr = '' ){ //所有浏览员都不行 $role_arr = array( //\Zndp\User\RoleEnum::FARM_ADMINISTRATOR,//农场管理员 //\Zndp\User\RoleEnum::FARM_OPERATOR,//农场操作员 \Zndp\User\RoleEnum::BASE_ADMINISTRATOR,//基地管理员 \Zndp\User\RoleEnum::BASE_LEADER,//基地负责人 ); //检查是否是自己农场的设备 $cond = array('DeviceAddr'=>$addr); $device_info = MM('dpsb_device')->where($cond)->find(); if( !$device_info ){//设备不存在 $this->errorMsg(\Zndp\Api\ResponseCode::DEVICE_NOT_EXISTS); } if( !in_array($userinfo['RoleId'],$role_arr) ){ //仅限农场管理员,农场操作员 $this->errorMsg(\Zndp\Api\ResponseCode::DEVICE_OPRATE_DISALLOWED); } $cond = array('ID'=>$device_info['DeviceGroupId']); $group_info = MM('dpsb_group')->where($cond)->find(); if($group_info['FarmId'] != $userinfo['OrganizationId']){ $this->errorMsg(\Zndp\Api\ResponseCode::DEVICE_OPRATE_DISALLOWED);//不允许操作该设备 } //检查是否是农场操作员控制的设备(???要问客户) return $device_info; } private function checkDevice( $device_addr ){ $where = array('DeviceAddr'=>$device_addr); $device_info = MM('dpsb_device')->where($where)->find(); if( !$device_info ){//设备不存在 $this->errorMsg(\Zndp\Api\ResponseCode::DEVICE_NOT_EXISTS); } return $device_info; } private function checkControlChannel( $device_addr, $channel_number ){ $where = array('DeviceAddr'=>$device_addr); $device_id = MM('dpsb_device')->where($where)->getField('ID'); $where = array('ChNumber'=>$channel_number,'DeviceId'=>$device_id); $channel_info = MM('dpsb_channel')->where($where)->find(); //通道号不存在,返回暂无数据错误码401 if( !$channel_info ){ $this->errorMsg(\Zndp\Api\ResponseCode::NO_DATA); } //通道不是控制类型 $control_sensor = \Zndp\Device\ChannelType::CONTROL_SENSOR; if( !in_array($channel_info['ChType'],$control_sensor) ){ $this->errorMsg(\Zndp\Api\ResponseCode::NOT_CONTROLLABLE_SENSOR); } return $channel_info; } private function getUserDeviceGroup( $farmid ){ $where = array('FarmId'=>$farmid); $group_list = MM('dpsb_group')->where($where)->select(); } private function getDeviceNewlyGatherData( $addr ){ } public function appLogin( ){ $username = I('get.username'); $password = I('get.password'); //检查账号密码 $password = (new \Zndp\User\Util)->encPwd($password); $where = array('UserName'=>$username,'Password'=>$password); $roleid = MM('uc_user')->where($where)->getField('RoleId'); if( !$roleid ){ json_fail('用户名或密码错误!'); } // 管理员,操作员可登录 //$roleArr = array(\Zndp\User\RoleEnum::FARM_ADMINISTRATOR,\Zndp\User\RoleEnum::FARM_OPERATOR); $roleArr = array( \Zndp\User\RoleEnum::BASE_ADMINISTRATOR,//基地管理员 \Zndp\User\RoleEnum::BASE_LEADER,//基地负责人 ); if( !in_array($roleid,$roleArr) ){ json_fail('没有权限!'); } json_success('登陆成功!'); } private function checkDateQueryParam( $params ){ //参数需要重新设计:考虑pageSize最大值 if( !is_array($params) ){ exit(""); } $startTime = $params['startTime']; $endTime = $params['endTime']; $pageSize = $params['pageSize']; $pageNumber = $params['pageNumber']; $order = $params['order'] ?: 'desc'; //开始时间格式错误 if( strtotime($startTime) === false){ $this->errorMsg(\Zndp\Api\ResponseCode::TIME_FORMAT_ERROR); } if( $endTime ){//存在结束时间 //时间范围错误 if( strtotime($startTime) > strtotime($endTime) ){//开始时间大于结束时间 $this->errorMsg(\Zndp\Api\ResponseCode::WRONG_TIME_RANGE); } //时间格式错误 if( strtotime($endTime) === false ){ $this->errorMsg(\Zndp\Api\ResponseCode::TIME_FORMAT_ERROR); } }else{ $endTime = date('Y-m-d H:i:s'); } if( !is_numeric($pageSize) || $pageSize <= 0 ){//默认一页给几条数据还是返回错误信息? $pageSize = 5; // $this->errorMsg(\Zndp\Api\ResponseCode::TIME_FORMAT_ERROR); }elseif( $pageSize > 300 ){ $pageSize = 300; } if( !is_numeric($pageNumber) ){//默认页 $pageNumber = 1; //$this->errorMsg(\Zndp\Api\ResponseCode::TIME_FORMAT_ERROR); } //返回处理好的参数 $params['startTime'] = $startTime; $params['endTime'] = $endTime; $params['pageSize'] = $pageSize; $params['pageNumber']= $pageNumber; $params['order'] = $order; return $params; } public function upgradeAppVersion( ){ $fields = 'AppVersionCode as versionCode,AppVersion as versionName,AppPath as url,UpdateMessage as updateMessage,Md5Hash as md5'; $type = I('get.type'); $type = $type ? $type : 'zndp'; // 默认智能大棚APP $where = array('AppName' => $type); $appData = MM('dpyh_app_version')->where($where)->order('AddTime desc')->field($fields)->find(); if(!$appData['url']){ json_fail('没有App文件!'); } $data = array( 'success' => true, 'message' => '', 'data' => $appData, ); echo json_encode($data,JSON_UNESCAPED_UNICODE); /* //区分农用通和大棚app $type = I('get.type'); if($type == 'nyt'){ $appname = '农用通'; }else{ $appname = '智能大棚'; $type = 'zndp'; } $where = array('AppName'=>$appname); $appData = MM('dpyh_app_version')->where($where)->order('AddTime desc')->field($fields)->find(); if(!$appData['url']){ json_fail('文件不存在!'); } // 拼接文件绝对路径,校验时不用下载 $apk_name = substr($appData['url'], strrpos($appData['url'],'/')); $root_path = getcwd(); $realpath = $root_path .'/apk/'. $type . $apk_name; $appData['md5'] = md5_file($realpath); */ } public function appLog( ){ //$message = '['.date('Y-m-d H:i:s') . ']' . htmlspecialchars_decode(I('post.message')). PHP_EOL; $dir_path = SOLUTION_DATA_PATH . "app"; if(!is_dir($dir_path)){ mkdir($dir_path,0777,1); } //file_put_contents(SOLUTION_RUNTIME_PATH."../app/app_old.log",$message,FILE_APPEND); if (!function_exists('gzdecode')) { function gzdecode ($data) { $flags = ord(substr($data, 3, 1)); $headerlen = 10; $extralen = 0; $filenamelen = 0; if ($flags & 4) { $extralen = unpack('v' ,substr($data, 10, 2)); $extralen = $extralen[1]; $headerlen += 2 + $extralen; } if ($flags & 8) // Filename $headerlen = strpos($data, chr(0), $headerlen) + 1; if ($flags & 16) // Comment $headerlen = strpos($data, chr(0), $headerlen) + 1; if ($flags & 2) // CRC at end of file $headerlen += 2; $unpacked = @gzinflate(substr($data, $headerlen)); if ($unpacked === FALSE) $unpacked = $data; return $unpacked; } } if(!empty($GLOBALS['HTTP_RAW_POST_DATA']) && strlen($GLOBALS['HTTP_RAW_POST_DATA'])>0) { // 解压 $message = gzdecode($GLOBALS['HTTP_RAW_POST_DATA']); // 倒序 $msg_arr = explode("\n",$message); krsort($msg_arr); $final_msg = implode("\n",$msg_arr); } $file_path = $dir_path ."/app.log"; // 检查文件大小,超过20M不处理 $file_size = filesize($file_path); if( $file_size >= 1024*1024*20 ){ json_fail('File size: '.$file_size.'Byte'); } clearstatcache(); file_put_contents($file_path,$final_msg."\n".file_get_contents($file_path)); } public function sendControl( ){ //根据设备、通道号控制设备状态,行程量5个(全开,全关,打开运行中,关闭运行中,停止),开关量(打开,停止),返回是否自动控制信息。修改设备后的信息会保存。 $device_addr = I('get.addr'); $channel_status = I('get.status'); $channel_number = I('get.channelNumber'); $sessionkey = I('get.sessionkey'); // 检查必填参数 $this->checkRequiredParam('addr,status,channelNumber,sessionkey'); // 检查sessionkey $userinfo = $this->checkSessionKey(); // 检查用户对设备权限 //$device_info = $this->checkDeviceControlRight($userinfo,$device_addr); // 对应设备失去连接 // 转换中科通道号 $channel_number = \Zndp\Device\Util::MapChannelNumber($channel_number); if(!$channel_number){ $this->errorMsg(\Zndp\Api\ResponseCode::NO_DATA); } // 对应序号传感器不是控制设备 $channel_info = $this->checkControlChannel($device_addr,$channel_number); // 控制参数错误 if( !in_array($channel_status,[0,1,2]) ){ $error = array("response"=>"error", "error" =>"4", "errorinfo"=>"Wrong Status!" ); echo json_encode($error);exit; } // 设备应答操作失败(应答状态为0) // 传给信号服务 $host = '127.0.0.1'; $port = 10240; $socket = new Jms\Network\TcpClient($host,$port); $cmd = array( "method" => "apiSendControl", "Addr" => $device_addr, //设备addr "channelNumber" => $channel_number, //通道编号 "status" => $channel_status ); $res = $socket->send(json_encode($cmd)."\n"); //修改设备后的保存信息 if(!$res['success']){//操作失败 $this->errorMsg(\Zndp\Api\ResponseCode::DEVICE_RESPONSE_FAIL); } $data_arr = array( 'response' => $res['success'] ? 'success' : 'error', 'decstate' => $res['data']['decstate'], 'isauto' => $res['data']['isauto'] ); // 返回json串 echo json_encode($data_arr,JSON_UNESCAPED_UNICODE); } public function ModifyAutoControlInfo( ){ //设备可通过设置参数进行自动控制,onTime时间单位为分钟,比如8:10对应8*60+10=490 可通过上限下限参考值 设置扩值(温度范围) $addr = I('get.addr'); //设备地址 $channelNumber = I('get.channelNumber'); //设备通道 $man = I('get.man'); //是否自动,0自动,1手动 //$RefAddr = I('get.RefAddr'); //参考目标设备地址,暂未启用 $refChannel = I('get.refChannel'); //参考通道,此通道指传感器通道 //$InterLock = I('get.InterLock'); //参考互锁通道编号,暂未启用,此通道指控制通道 $TimeEn = I('get.TimeEn'); //定时任务使能,1开启,0关闭 $UpperLimit_Value = I('get.UpperLimit_Value'); //上限值参考值,可通过上限下限参考值 设置扩值(温度范围) $UpperLimit_State = I('get.UpperLimit_State'); //上限值参考状态,0关 1开 $LowerLimit_Value = I('get.LowerLimit_Value'); //下限值参考值,可通过上限下限参考值 设置扩值(温度范围) $LowerLimit_State = I('get.LowerLimit_State'); //下限值参考状态,0关 1开 $OnTime1 = I('get.OnTime1'); //打开时间1 $OffTime1 = I('get.OffTime1'); //关闭时间1 $OnTime2 = I('get.OnTime2'); //打开时间2 $OffTime2 = I('get.OffTime2'); //关闭时间2 $OnTime3 = I('get.OnTime3'); //打开时间3 $OffTime3 = I('get.OffTime3'); //关闭时间3 $OnTime4 = I('get.OnTime4'); //打开时间4 $OffTime4 = I('get.OffTime4'); //关闭时间4 $OnTime5 = I('get.OnTime5'); //打开时间5 $OffTime5 = I('get.OffTime5'); //关闭时间5 // 检查必填参数 $this->checkRequiredParam('addr,channelNumber,man,TimeEn'); // 检查sessionkey $this->checkSessionKey(); // 检查设备是否存在 $device_info = $this->checkDevice($addr); // 转换中科通道号 $channelNumber = \Zndp\Device\Util::MapChannelNumber($channelNumber); if(!$channelNumber){ $this->errorMsg(\Zndp\Api\ResponseCode::NO_DATA); } // 检查是否为控制类传感器 $channel_infp= $this->checkControlChannel($addr,$channelNumber); // 发送给信号服务 $host = '127.0.0.1'; $port = 10240; $socket = new Jms\Network\TcpClient($host,$port); $msg = array( 'method' => 'apiModifyAutoControlInfo', 'Addr' => $addr, 'channelNumber' => $channelNumber, 'man' => $man, 'refChannel' => $refChannel, 'TimeEn' => $TimeEn, 'UpperLimit_Value' => $UpperLimit_Value, 'UpperLimit_State' => $UpperLimit_State, 'LowerLimit_Value' => $LowerLimit_Value, 'LowerLimit_State' => $LowerLimit_State, 'OnTime1' => $OnTime1 >= 0 ? $OnTime1 : -1, 'OffTime1' => $OffTime1 >= 0 ? $OffTime1 : -1, 'OnTime2' => $OnTime2 >= 0 ? $OnTime2 : -1, 'OffTime2' => $OffTime2 >= 0 ? $OffTime2 : -1, 'OnTime3' => $OnTime3 >= 0 ? $OnTime3 : -1, 'OffTime3' => $OffTime3 >= 0 ? $OffTime3 : -1, 'OnTime4' => $OnTime4 >= 0 ? $OnTime4 : -1, 'OffTime4' => $OffTime4 >= 0 ? $OffTime4 : -1, 'OnTime5' => $OnTime5 >= 0 ? $OnTime5 : -1, 'OffTime5' => $OffTime5 >= 0 ? $OffTime5 : -1, ); //测试是否为字符串 //$res = $socket->send($msg); $res = $socket->send(json_encode($msg)."\n"); // 对应设备失去连接 // 设备应答操作失败(应答状态为0) if(!$res['success']){ $this->errorMsg(\Zndp\Api\ResponseCode::DEVICE_RESPONSE_FAIL); } $arr = array( 'response' => $res['success'] ? 'success':'error', 'man' => $res['data']['man'], ); echo json_encode($arr,JSON_UNESCAPED_UNICODE); } public function activityRestart( ){ $dir_path = SOLUTION_LOG_PATH."../test/"; if(!is_dir(dir_path)){ mkdir($dir_path,0777); } $log_path = $dir_path.'test_'.time() .".log"; file_put_contents($log_path,''); } public function getRealTimeDeviceDetailDataInner( ){ header('Content-type: application/json'); //单台设备信息,包括5张最新图片(如果有摄像头),传感器值,行程控制值,开关控制值 $username = I('get.username'); $device_addr = I('get.addr'); //检查必填参数 $this->checkRequiredParam('username,addr'); //检查用户名 $userinfo = $this->checkUserName($username,true); //检查设备 $device_info = $this->checkDeviceControlRight($userinfo,$device_addr); //设备失去连接 //获取农场名称(顾客名称) $where = array('ID'=>$userinfo['FarmId']); $custName = MM('dpyh_farm')->where($where)->getField('FarmName'); //获取A类型传感器数据集 $where = array( 'DeviceId'=>$device_info['ID'], 'ChType' => array('IN',\Zndp\Device\ChannelType::SENSOR_TYPES) ); $sensors = MM('dpsb_channel')->where($where)->field('ChNumberText as Chx,DisplayName,ChType as channelType,ChValue,Unit,Flag,ChMan as man')->select(); $sensorValue = array(); $channel_type_model = new \Zndp\Device\ChannelType(); foreach($sensors as $sensor){ $sensor['workUnitName'] = $device_info['WorkUnitName']; $sensor['Unit'] = $channel_type_model->getTypeUnit($sensor['channelType']); $sensor['Flag'] = $channel_type_model->getTypeFlag($sensor['channelType']); $sensor['channelType'] = (int)$sensor['channelType']; array_push($sensorValue,$sensor); } //获取行程类传感器数据集 $where = array( 'DeviceId'=>$device_info['ID'], 'ChType' => array('IN',\Zndp\Device\ChannelType::ITINERARY_SENSOR) ); $travels = MM('dpsb_channel')->where($where)->field('ChNumberText as Chx,DisplayName,ChType as channelType,ChValue,Unit,Flag,ChMan as man')->select(); $travelValue = array(); foreach($travels as $travel){ $travel['workUnitName'] = $device_info['WorkUnitName']; $travel['Unit'] = $channel_type_model->getTypeUnit($travel['channelType']); $travel['Flag'] = $channel_type_model->getTypeFlag($travel['channelType']); $travel['channelType'] = (int)$travel['channelType']; array_push($travelValue,$travel); } //返回json串 $arr = array( 'Addr' => $device_addr, 'custname' => $custName, 'custid' => (int)$userinfo['FarmId'], 'gatherTime' => $device_info['GatherTime'], 'workUnitName' => $device_info['WorkUnitName'], 'hikValue' => array( 'videosn'=>'', 'ysAppkey'=>'', //'accessToken'=>'' ), 'imageValue' => array(), 'sensorValue' => $sensorValue, 'travelValue' => $travelValue, 'onoffValue' => array(), 'proportionValue' => array() ); echo json_encode($arr,JSON_UNESCAPED_UNICODE); } public function store_invalid_data( ){ $addr = I('get.addr'); //设备编号 $temp = I('get.temp'); //温度 $damp = I('get.damp'); //湿度 $device_data = json_encode(array('temp'=>$temp,'damp'=>$damp)); $data = array( 'Addr' => $addr, 'DeviceData' => $device_data, 'AddTime' => date('Y-m-d H:i:s') ); MM('dpsj_invalid')->createAdd($data); } public function catch_data( ){ //header('Content-Type:application/json'); function getNearlyData($temp,$damp){ //获取处理后的相近温湿度数据 //获取数据库中最后一次采集温湿度数据 $where = array('DeviceId'=>34); $device_dataid = MM('dpsj_device')->where($where)->order('GatherTime desc')->getField('ID'); $where = array('DeviceDataId'=> $device_dataid); $channel_data = MM('dpsj_channel')->where($where)->select(); $data = array(); foreach($channel_data as $v){ if($v['ChNumber'] == 2){ //温度 if($v['ChValue'] - $temp > 1){ $data['temp'] = (string)round($v['ChValue'] - ($v['ChValue'] - $temp)*0.3 ,1); }elseif($temp - $v['ChValue'] > 1){ $data['temp'] = (string)round($temp - ($temp - $v['ChValue'])*0.3 ,1); }else{ $data['temp'] = (string)$temp + rand(1,3)/10; } } if($v['ChNumber'] == 3){ //湿度 if($v['ChValue'] - $damp > 10){ $data['damp'] = (string)($v['ChValue'] - rand(3,8)); }elseif($damp - $v['ChValue'] > 10){ $data['damp'] = (string)($damp - rand(3,8) ); }else{ $data['damp'] = (string)$damp - rand(1,5); } } } $data['qishuo'] = false; return json_encode($data); } function method1(){ $url = "http://api.nongyongtong.com:8081/qfls/api?method=getRealTimeDeviceDetailData&addr=44045632&username=wannanyanye&sessionkey=82BA0712C75800201C177AD425107EA2"; $json_data = file_get_contents($url); $data_arr = iconv('GBK','UTF-8',$json_data); $data_arr = json_decode($data_arr,true); if(!$data_arr){ //没有抓取到数据则返回false return false; } $temp = $data_arr['sensorValue'][1]['chValue']; //抓取到的温度 $damp = $data_arr['sensorValue'][2]['chValue']; //抓取到的湿度 //获取处理后的相近温湿度数据 $json_data = getNearlyData($temp,$damp); echo $json_data; //记录访问api日志 $message = '['.date('Y-m-d H:i:s') . '] method1:'.$json_data .PHP_EOL; if(!is_dir(SOLUTION_RUNTIME_PATH . "../app")){ mkdir('app',0777); } file_put_contents(SOLUTION_RUNTIME_PATH."../app/catch.log",$message,FILE_APPEND); return true; } function method2(){ $url = "http://www.seniverse.com/weather/weather.aspx?uid=U6C673001E&cid=CHAH130000&l=zh-CHS&p=SMART&a=0&u=C&s=1&m=2&x=1&d=3&fc=&bgc=&bc=&ti=0&in=0&li="; $html = file_get_contents($url); //"now":{"text":"多云","code":"4","temperature":"30","humidity":"62","wind_direction":"东","wind_speed":"12.24","wind_scale":"3"} preg_match('/temperature(.{1,30})/i',$html,$match); preg_match_all('/\d+/',$match[0],$data_arr); if(!$data_arr){ return false; } $temp = $data_arr[0][0]; $damp = $data_arr[0][1]; $json_data = getNearlyData($temp,$damp); echo $json_data; //记录访问api日志 $message = '['.date('Y-m-d H:i:s') . '] method2:'.$json_data .PHP_EOL; if(!is_dir(SOLUTION_RUNTIME_PATH . "../app")){ mkdir('app',0777); } file_put_contents(SOLUTION_RUNTIME_PATH."../app/catch.log",$message,FILE_APPEND); return true; } // $data = method1(); if($data){ return; } $data = method2(); if($data){ return; } json_fail("获取数据失败"); } public function getCropsInfo( ){ $addr = I('get.addr'); if(!$addr){ json_fail('addr param not exists!'); } // 通过设备编号addr获取作物信息 $where = array('DeviceAddr'=>$addr); $fields = "FirstCrop,SecondCrop,ThirdCrop,FourthCrop"; $crops = MM('dpsb_device')->field($fields)->where($where)->find(); $crops = array_values($crops); /* //组装信息 $unit_array = array('g'=>'斤','kg'=>'公斤','t'=>'吨'); for($i=0; $i$crops); echo json_encode($data,JSON_UNESCAPED_UNICODE); } public function setScreenMsg( ){ // 设备编号,几号棚,信息内容,token $addr = I('get.addr'); $num = I('get.num'); $msg = urldecode( I('get.msg') ); $token = I('get.token'); //检查必填参数 if(!$addr || !$num || !$msg || !$token){ json_fail('Missing parame!'); } //检查token if($token != 'zndp'){ json_fail('Unauthorized token!'); } //大棚信息对应字段(一、二、三、四组) $shed = array(1=>'FirstCrop','SecondCrop','ThirdCrop','FourthCrop'); if(!$shed[$num]){ json_fail('Undefind number!'); } //存入大棚设备dpsb_device表中 $where = array('DeviceAddr'=>$addr); //$data = array($shed[$num] => $msg); // 设置点阵屏信息(新) $shed_data = json_decode(htmlspecialchars_decode($msg),true); if( !$shed_data['num'] || !$shed_data['variety'] || !$shed_data['farmer'] || !$shed_data['output'] || !$shed_data['unit']){ json_fail('msg格式:{"num":"大棚编号","variety":"种植品种","farmer":"种植农户","output":"预计产量","unit":"单位"}'); } $save_msg = array( 'num'.$num => $shed_data['num'], 'variety'.$num => $shed_data['variety'], 'farmer'.$num => $shed_data['farmer'], 'output'.$num => $shed_data['output'], 'unit'.$num => $shed_data['unit'], ); $data = array($shed[$num] => json_encode($save_msg, JSON_UNESCAPED_UNICODE)); $result = MM('dpsb_device')->createSave($where,$data); if($result === false){ json_fail('Set failed,Please try again later!'); } // 重启控制台APP $host = '127.0.0.1'; $port = 10240; $socket = new Jms\Network\TcpClient($host,$port); $cmd = array( "method" => "apiReboot", "Addr"=>$addr, ); $res = $socket->send(json_encode($cmd)); if(!$res['success']){ json_fail($res['message']); } json_success('Set successfully!'); } public function syncFarmlandId2Redis( ){ //获取所有已绑定设备的大棚 $where = array( 'FarmlandId' => array('NEQ',-1), ); $fields = 'DeviceId,ChGroup,FarmlandId'; $farmland_list = MM('dpsb_chgroup')->field($fields)->where($where)->select(); if( empty($farmland_list) ){ json_fail('no data'); } $redis = Redis("dpsb_farmland_list","hash"); foreach($farmland_list as $farmland){ // 添加到Redis $key = 'DeviceId-'.$farmland['DeviceId'] .'-ChGroup-'.$farmland['ChGroup']; $val = $farmland['FarmlandId']; $hash = array($key => $val); $result = $redis->add($hash); var_dump($result); } } }