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);
}
}
}