DpjkIndexAction.class.php 59 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672
  1. <?php
  2. class DpjkIndexAction extends Action {
  3. public function getSessionKey( ){
  4. $username = I('get.username');
  5. $password = I('get.password');
  6. if(!$username){//用户名参数为空
  7. $this->errorMsg(\Zndp\Api\ResponseCode::EMPTY_USERNAME);
  8. }
  9. //获取用户信息
  10. $where = array(
  11. 'UserName'=>$username,
  12. 'RoleId' => \Zndp\User\RoleEnum::API_CLIENT,
  13. );
  14. $userinfo = MM('uc_user')->where($where)->field('ID,UserName,Password')->find();
  15. if(!$userinfo){//用户名不存在
  16. $this->errorMsg(\Zndp\Api\ResponseCode::USERNAME_NOT_EXISTS);
  17. }
  18. //密码错误
  19. $password = (new \Zndp\User\Util)->encPwd($password);
  20. if($password != $userinfo['Password']){
  21. $this->errorMsg(\Zndp\Api\ResponseCode::PASSWORD_ERROR);
  22. }
  23. //返回ID(sessionKey)
  24. $sessionkeyArr = array('sessionkey'=>$userinfo['ID']);
  25. $sessionkeyJson= json_encode($sessionkeyArr);
  26. echo $sessionkeyJson;
  27. }
  28. public function loginBusiness( ){
  29. $username = I('businessUsername');
  30. $password = I('businessPassword');
  31. //检查用户名
  32. $userinfo = $this->checkUserName($username);
  33. //密码错误
  34. $password = (new \Zndp\User\Util)->encPwd($password);
  35. if($password != $userinfo['Password']){
  36. $this->errorMsg(\Zndp\Api\ResponseCode::PASSWORD_ERROR);
  37. }
  38. //登录成功 --》 添加登录记录到login表
  39. $data['UserId'] = $userinfo['ID'];
  40. $data['LoginTime'] = date('Y-m-d H:i:s');
  41. $login_id = MM('dpyh_login')->add($data);
  42. // 返回json数据串
  43. $cond = array('FarmId'=>$userinfo['OrganizationId']);
  44. $orginfo = MM('dpsb_group')->where($cond)->field('ID as orgid,OrgName as orgname')->select();
  45. $dataArr = array(
  46. 'response' => 'success',
  47. 'CODE' => '0',
  48. 'sessionkey' => $userinfo['ID'],
  49. 'custid' => $userinfo['OrganizationId'],
  50. 'ysAppkey' => '',
  51. 'ysSecket' => '',
  52. 'ysUsername' => '',
  53. 'ysPassword' => '',
  54. 'operatorid' => '',
  55. 'orginfo' => $orginfo,
  56. 'loginid' => $login_id
  57. );
  58. $dataJson = json_encode($dataArr,JSON_UNESCAPED_UNICODE);
  59. echo $dataJson;
  60. }
  61. public function getRealTimeDeviceDetailData( ){
  62. //header('Content-type: application/json');
  63. //单台设备信息,包括5张最新图片(如果有摄像头),传感器值,行程控制值,开关控制值
  64. $username = I('get.username');
  65. $device_addr = I('get.addr');
  66. //检查必填参数
  67. $this->checkRequiredParam('username,addr');
  68. //检查用户名
  69. $userinfo = $this->checkUserName($username,true);
  70. //检查设备
  71. $device_info = $this->checkDeviceControlRight($userinfo,$device_addr);
  72. //设备失去连接
  73. //获取农场名称(顾客名称)
  74. $where = array('ID'=>$userinfo['FarmId']);
  75. $custName = MM('uc_organization')->where( $where )->getField('DepartName');
  76. //获取A类型传感器数据集
  77. $where = array(
  78. 'DeviceId'=>$device_info['ID'],
  79. 'ChType' => array('IN',\Zndp\Device\ChannelType::SENSOR_TYPES)
  80. );
  81. $sensors = MM('dpsb_channel')->where($where)->field('ChNumberText as Chx,DisplayName,ChType as channelType,ChValue as chValue,Unit,Flag,ChMan as man')->select();
  82. $sensorValue = array();
  83. $channel_type_model = new \Zndp\Device\ChannelType();
  84. foreach($sensors as $sensor){
  85. $sensor['workUnitName'] = $device_info['WorkUnitName'];
  86. $sensor['Unit'] = $channel_type_model->getTypeUnit($sensor['channelType']);
  87. $sensor['Flag'] = $channel_type_model->getTypeFlag($sensor['channelType']);
  88. $sensor['channelType'] = $sensor['channelType'];
  89. array_push($sensorValue,$sensor);
  90. }
  91. //获取行程类传感器数据集
  92. $where = array(
  93. 'DeviceId'=>$device_info['ID'],
  94. 'ChType' => array('IN',\Zndp\Device\ChannelType::ITINERARY_SENSOR)
  95. );
  96. $travels = MM('dpsb_channel')->where($where)->field('ChNumberText as Chx,DisplayName,ChType as channelType,ChValue as chValue,Unit,Flag,ChMan as man')->select();
  97. $travelValue = array();
  98. foreach($travels as $travel){
  99. $travel['workUnitName'] = $device_info['WorkUnitName'];
  100. $travel['Unit'] = $channel_type_model->getTypeUnit($travel['channelType']);
  101. $travel['Flag'] = $channel_type_model->getTypeFlag($travel['channelType']);
  102. $travel['channelType'] = (int)$travel['channelType'];
  103. array_push($travelValue,$travel);
  104. }
  105. //返回json串
  106. $arr = array(
  107. 'Addr' => $device_addr,
  108. 'custname' => $custName,
  109. 'custid' => (int)$userinfo['FarmId'],
  110. 'gatherTime' => $device_info['GatherTime'],
  111. 'workUnitName' => $device_info['WorkUnitName'],
  112. 'hikValue' => array(
  113. 'videosn'=>'',
  114. 'ysAppkey'=>'',
  115. //'accessToken'=>''
  116. ),
  117. 'imageValue' => array(),
  118. 'sensorValue' => $sensorValue,
  119. 'travelValue' => $travelValue,
  120. 'onoffValue' => array(),
  121. 'proportionValue' => array()
  122. );
  123. echo json_encode($arr,JSON_UNESCAPED_UNICODE);
  124. }
  125. public function sendControl_test( ){
  126. //根据设备、通道号控制设备状态,行程量5个(全开,全关,打开运行中,关闭运行中,停止),开关量(打开,停止),返回是否自动控制信息。修改设备后的信息会保存。
  127. $device_addr = I('get.addr');
  128. $channel_status = I('get.status');
  129. $channel_number = I('get.channelNumber');
  130. $sessionkey = I('get.sessionkey');
  131. // 检查必填参数
  132. $this->checkRequiredParam('addr,status,channelNumber,sessionkey');
  133. // 检查sessionkey
  134. $userinfo = $this->checkSessionKey();
  135. // 检查用户对设备权限
  136. //$device_info = $this->checkDeviceControlRight($userinfo,$device_addr);
  137. // 对应设备失去连接
  138. // 对应序号传感器不是控制设备
  139. $channel_info = $this->checkControlChannel($device_addr,$channel_number);
  140. // 控制参数错误
  141. if( !in_array($channel_status,[0,1,2]) ){
  142. $error = array("response"=>"error",
  143. "error" =>"4",
  144. "errorinfo"=>"Wrong Status!"
  145. );
  146. echo json_encode($error);exit;
  147. }
  148. // 设备应答操作失败(应答状态为0)
  149. // 传给信号服务
  150. $host = '127.0.0.1';
  151. $port = 10240;
  152. $socket = new Jms\Network\TcpClient($host,$port);
  153. $cmd = array(
  154. "method" => "apiSendControl",
  155. "Addr" => $device_addr, //设备addr
  156. "channelNumber" => $channel_number, //通道编号
  157. "status" => $channel_status
  158. );
  159. $res = $socket->send(json_encode($cmd)."\n");
  160. //修改设备后的保存信息
  161. if(!$res['success']){//操作失败
  162. $this->errorMsg(\Zndp\Api\ResponseCode::DEVICE_RESPONSE_FAIL);
  163. }
  164. $data_arr = array(
  165. 'response' => $res['success'] ? 'success' : 'error',
  166. 'decstate' => $res['data']['decstate'],
  167. 'isauto' => $res['data']['isauto']
  168. );
  169. // 返回json串
  170. echo json_encode($data_arr,JSON_UNESCAPED_UNICODE);
  171. }
  172. public function getControlInfo( ){
  173. $device_addr = I('get.addr');
  174. $channel_number = I('get.channelNumber');
  175. $sessionkey = I('get.sessionkey');
  176. // 检查必要的参数
  177. $this->checkRequiredParam('addr,channelNumber,sessionkey');
  178. // 检查sessionkey
  179. $this->checkSessionKey();
  180. // 检查设备是否存在
  181. $device_info = $this->checkDevice($device_addr);
  182. // 对应设备失去连接
  183. // 检查对应序号传感器是否控制设备
  184. $channel_info = $this->checkControlChannel($device_addr,$channel_number);
  185. // 设备应答操作失败(应答状态为0)
  186. $where = array(
  187. 'DeviceId' => $device_info['ID'],
  188. 'Channel' => $channel_number,
  189. );
  190. $channel_config = MM('dpsb_policy')->where($where)->find();
  191. if(!$channel_config){
  192. $this->errorMsg(\Zndp\Api\ResponseCode::NO_DATA);
  193. }
  194. $where = array('DeviceId' => $device_info['ID'],$channel_number);
  195. $channel_type = MM('dpsb_channel')->where($where)->getField('ChType');
  196. $model = new \Zndp\Device\ChannelType();
  197. // 返回json串
  198. $arr = array(
  199. 'response' => 'success',
  200. 'devtype' => $device_info['DeviceType'] ?:'',
  201. 'devinfojson' => array(
  202. "channel"=> $channel_config['Channel'], //通道编号值
  203. "IsUse"=> 1, //传感器?是否使用
  204. "N"=> $device_info['WorkUnitName'], //名称
  205. "U"=> $model->getTypeUnit($channel_type), //单位
  206. //"Bus"=>"", //总线地址
  207. //"BusAddr"=> '', //总线类型
  208. "T"=> $channel_type, //通道类型,参见第四章‘设备通道类型字段’
  209. "Man"=> $channel_config['Man'], //是否自动, 0自动,1手动
  210. //"MOut"=>"",
  211. //"Load"=>"",
  212. "refChannel"=> $channel_config['RefChannel'], //参考通道,此通道指传感器通道(refChannel)
  213. //"RefAddr"=>"", //参考目标设备地址(暂未启用)
  214. //"InterLock"=>"", //参考互锁通道编号(暂未启用,此通道指控制通道)
  215. //"Over_Value"=>"2.5",
  216. "UpperLimit_Value"=> $channel_config['UpperLimitValue'],//上限值参考值 可通过上线下线参考值 设置扩值(温度范围)
  217. "UpperLimit_State"=> $channel_config['UpperLimitState'], //上限值参考状态 0关 1开
  218. "LowerLimit_Value"=> $channel_config['LowerLimitValue'], //下限值参考值 可通过上线下线参考值 设置扩值(温度范围)
  219. "LowerLimit_State"=> $channel_config['LowerLimitState'], //下限值参考状态 0关 1开
  220. "TimeEn"=> $channel_config['IsTime'], //定时任务使能 1开启,0关闭
  221. "OnTime1"=> $channel_config['OnTime1'], //打开时间1
  222. "OffTime1"=> $channel_config['OffTime1'], //关闭时间1
  223. "OnTime2"=> $channel_config['OnTime2'], //打开时间2
  224. "OffTime2"=> $channel_config['OffTime2'], //关闭时间2
  225. "OnTime3"=> $channel_config['OnTime3'], //打开时间3
  226. "OffTime3"=> $channel_config['OffTime3'], //关闭时间3
  227. "OnTime4"=> $channel_config['OnTime4'], //打开时间4
  228. "OffTime4"=> $channel_config['OffTime4'], //关闭时间4
  229. "OnTime5"=> $channel_config['OnTime5'], //打开时间5
  230. "OffTime5"=> $channel_config['OffTime5'], //关闭时间5
  231. //"Cycle"=>"1",
  232. //"OpenTime"=>"10",
  233. //"CloseTime"=>"60"
  234. )
  235. );
  236. echo json_encode($arr,JSON_UNESCAPED_UNICODE);
  237. }
  238. public function ModifyAutoControlInfo_test( ){
  239. //设备可通过设置参数进行自动控制,onTime时间单位为分钟,比如8:10对应8*60+10=490 可通过上线下线参考值 设置扩值(温度范围)
  240. $addr = I('get.addr'); //设备地址
  241. $channelNumber = I('get.channelNumber'); //设备通道
  242. $man = I('get.man'); //是否自动,0自动,1手动
  243. //$RefAddr = I('get.RefAddr'); //参考目标设备地址,暂未启用
  244. $refChannel = I('get.refChannel'); //参考通道,此通道指传感器通道
  245. //$InterLock = I('get.InterLock'); //参考互锁通道编号,暂未启用,此通道指控制通道
  246. $TimeEn = I('get.TimeEn'); //定时任务使能,1开启,0关闭
  247. $UpperLimit_Value = I('get.UpperLimit_Value'); //上限值参考值,可通过上线下线参考值 设置扩值(温度范围)
  248. $UpperLimit_State = I('get.UpperLimit_State'); //上限值参考状态,0关 1开
  249. $LowerLimit_Value = I('get.LowerLimit_Value'); //下限值参考值,可通过上线下线参考值 设置扩值(温度范围)
  250. $LowerLimit_State = I('get.LowerLimit_State'); //下限值参考状态,0关 1开
  251. $OnTime1 = I('get.OnTime1'); //打开时间1
  252. $OffTime1 = I('get.OffTime1'); //关闭时间1
  253. $OnTime2 = I('get.OnTime2'); //打开时间2
  254. $OffTime2 = I('get.OffTime2'); //关闭时间2
  255. $OnTime3 = I('get.OnTime3'); //打开时间3
  256. $OffTime3 = I('get.OffTime3'); //关闭时间3
  257. $OnTime4 = I('get.OnTime4'); //打开时间4
  258. $OffTime4 = I('get.OffTime4'); //关闭时间4
  259. $OnTime5 = I('get.OnTime5'); //打开时间5
  260. $OffTime5 = I('get.OffTime5'); //关闭时间5
  261. // 检查必填参数
  262. $this->checkRequiredParam('addr,channelNumber,man,TimeEn');
  263. // 检查sessionkey
  264. $this->checkSessionKey();
  265. // 检查设备是否存在
  266. $device_info = $this->checkDevice($addr);
  267. // 检查是否为控制类传感器
  268. $channel_infp= $this->checkControlChannel($addr,$channelNumber);
  269. // 发送给信号服务
  270. $host = '127.0.0.1';
  271. $port = 10240;
  272. $socket = new Jms\Network\TcpClient($host,$port);
  273. $msg = array(
  274. 'method' => 'apiModifyAutoControlInfo',
  275. 'Addr' => $addr,
  276. 'channelNumber' => $channelNumber,
  277. 'man' => $man,
  278. 'refChannel' => $refChannel,
  279. 'TimeEn' => $TimeEn,
  280. 'UpperLimit_Value' => $UpperLimit_Value,
  281. 'UpperLimit_State' => $UpperLimit_State,
  282. 'LowerLimit_Value' => $LowerLimit_Value,
  283. 'LowerLimit_State' => $LowerLimit_State,
  284. 'OnTime1' => $OnTime1 >= 0 ? $OnTime1 : -1,
  285. 'OffTime1' => $OffTime1 >= 0 ? $OffTime1 : -1,
  286. 'OnTime2' => $OnTime2 >= 0 ? $OnTime2 : -1,
  287. 'OffTime2' => $OffTime2 >= 0 ? $OffTime2 : -1,
  288. 'OnTime3' => $OnTime3 >= 0 ? $OnTime3 : -1,
  289. 'OffTime3' => $OffTime3 >= 0 ? $OffTime3 : -1,
  290. 'OnTime4' => $OnTime4 >= 0 ? $OnTime4 : -1,
  291. 'OffTime4' => $OffTime4 >= 0 ? $OffTime4 : -1,
  292. 'OnTime5' => $OnTime5 >= 0 ? $OnTime5 : -1,
  293. 'OffTime5' => $OffTime5 >= 0 ? $OffTime5 : -1,
  294. );
  295. //测试是否为字符串
  296. //$res = $socket->send($msg);
  297. $res = $socket->send(json_encode($msg)."\n");
  298. // 对应设备失去连接
  299. // 设备应答操作失败(应答状态为0)
  300. //$arr = array("error"=>"302",'response'=>'success','man'=>1);
  301. $arr = array(
  302. 'response' => $res['success'] ? 'success':'error',
  303. 'man' => $res['data']['man'],
  304. );
  305. echo json_encode($arr,JSON_UNESCAPED_UNICODE);
  306. }
  307. public function getDeviceSensorDataFromTime( ){
  308. //获取传感器数据,获取设备指定时间之间的所有数据,如果不传endTime参数,则返回开始时间之后的数据。也可以用该接口返回单个通道的历史数据
  309. $device_addr = I('get.addr'); //设备
  310. $startTime = I('get.startTime'); //采集时间开始值,不可为空
  311. $endTime = I('get.endTime'); //结束时间,如不传该参数,则返回开始时间之后的所有数据
  312. $channelNumber = I('get.channelNumber'); //通道编号,如果无通道编号参数,则返回所有传感器通道数据
  313. $sessionkey = I('get.sessionkey');
  314. // 检查必要的参数
  315. $this->checkRequiredParam('addr,startTime,sessionkey');
  316. // 检查sessionkey
  317. $this->checkSessionKey();
  318. // 设备不存在
  319. $device_info = $this->checkDevice($device_addr);
  320. // 组装查询条件
  321. $startTime = date('Y-m-d H:i:s',strtotime($startTime));//值为2018会当成当天20:18
  322. $where = array(
  323. 'GatherTime' => array('egt',$startTime),
  324. 'DeviceId' => $device_info['ID']
  325. );
  326. //时间格式错误
  327. if( strtotime($startTime) === false ){
  328. $this->errorMsg(\Zndp\Api\ResponseCode::TIME_FORMAT_ERROR);
  329. }
  330. // 有结束时间
  331. if($endTime){
  332. //时间范围错误
  333. if( strtotime($startTime) > strtotime($endTime) ){//开始时间大于结束时间
  334. $this->errorMsg(\Zndp\Api\ResponseCode::WRONG_TIME_RANGE);
  335. }
  336. //时间格式错误
  337. if( strtotime($endTime) === false ){
  338. $this->errorMsg(\Zndp\Api\ResponseCode::TIME_FORMAT_ERROR);
  339. }
  340. $endTime = date('Y-m-d H:i:s',strtotime($endTime));
  341. $where['GatherTime'] = array('between',array($startTime,$endTime));
  342. }
  343. // 有通道编号
  344. if($channelNumber){
  345. $where['ChNumber'] = $channelNumber;
  346. }
  347. // 获取数据集
  348. $datalist = MM('dpsj_channel')->where($where)->select();
  349. if( count($datalist) == 0 ){
  350. $this->errorMsg(\Zndp\Api\ResponseCode::NO_DATA);
  351. }
  352. $dataArr = array();
  353. foreach($datalist as $data){
  354. $dataArr[] = array(
  355. 'dataid' => $data['ID'],
  356. 'gatherTime' => $data['GatherTime'],
  357. 'column_'.$data['ChNumber'] => $data['ChValue']
  358. );
  359. }
  360. //返回json串
  361. $arr = array(
  362. "addr" => $device_addr,
  363. "unitId" => $device_info['ID'],
  364. "unitName" => $device_info['WorkUnitName'],
  365. "upperLimit" => null,
  366. "lowerLimit" => null,
  367. "startTime" => $startTime,
  368. "endTime" => $endTime,
  369. "dataarr" => $dataArr
  370. );
  371. echo json_encode($arr,JSON_UNESCAPED_UNICODE);
  372. }
  373. public function getRealTimeDeviceData( ){
  374. //获取设备的传感器(不包括控制设备)的最新一条数据
  375. $device_addr = I('get.addr');
  376. $sessionkey = I('get.sessionkey');
  377. // 检查必填参数
  378. $this->checkRequiredParam('addr,sessionkey');
  379. // 检查sessionkey
  380. $this->checkSessionKey();
  381. // 检查设备是否存在
  382. $device_info = $this->checkDevice($device_addr);
  383. //获取设备最新数据
  384. $where = array('DeviceId'=>$device_info['ID']);
  385. $device_data = MM('dpsj_device')->where($where)->order('GatherTime desc')->find();
  386. //通过DeviceDataId到通道数据表中取出关联数据
  387. $where = array('DeviceDataId'=>$device_data['ID']);
  388. $channel_list = MM('dpsj_channel')->where($where)->field('ChNumber as `column`,DisplayName as `name`,ChValue as `value`,ChType')->select();
  389. $type_model = new \Zndp\Device\ChannelType();
  390. $util_model = new \Zndp\Device\Util();
  391. $channel_arr = array();
  392. foreach($channel_list as $channel){
  393. $channel['unit'] = $type_model->getTypeUnit($channel['ChType']);
  394. unset($channel['ChType']);
  395. array_push($channel_arr,$channel);
  396. }
  397. //返回json串
  398. $arr = array(
  399. "id" => $device_data['ID'],
  400. "addr" => $device_addr,
  401. "devname" => $device_info['WorkUnitName'],
  402. "gathertime"=> $device_data['GatherTime'],
  403. "devValue" => $channel_arr
  404. );
  405. echo json_encode($arr,JSON_UNESCAPED_UNICODE);
  406. }
  407. public function getDeviceChannel( ){
  408. $username = I('get.username');
  409. $sessionkey = I('get.sessionkey');
  410. // 检查必填参数
  411. $this->checkRequiredParam('username,sessionkey');
  412. // 检查用户名
  413. $userinfo = $this->checkUserName($username);
  414. // 检查sessionkey
  415. $this->checkSessionKey();
  416. $where = array('FarmId'=>$userinfo['OrganizationId']);
  417. $device_group = MM('dpsb_group')->where($where)->select();
  418. if( empty($device_group) ){//用户名下无授权设备
  419. $this->errorMsg(\Zndp\Api\ResponseCode::NOT_AUTH_DEVICE);
  420. }
  421. $model = new \Zndp\Device\ChannelType();
  422. $arr = array();
  423. foreach($device_group as $group){
  424. $cond1 = array('DeviceGroupId'=>$group['ID']);
  425. $device_list = MM('dpsb_device')->where($cond1)->field('ID,DeviceAddr')->select();
  426. foreach($device_list as $device){
  427. $cond2 = array('DeviceId'=>$device['ID']);
  428. $channel_list = MM('dpsb_channel')->where($cond2)->field('ChNumber as Chx,DisplayName,ChValue as chValue,ChMan as chMan,ChType')->select();
  429. $device_arr = array();
  430. foreach($channel_list as $channel){
  431. $channel['Unit'] = $model->getTypeUnit($channel['ChType']);
  432. $channel['Flag'] = $model->getTypeFlag($channel['ChType']);
  433. unset($channel['ChType']);
  434. $device_arr[] = array_merge(array('Addr'=>$device['DeviceAddr']),$channel);
  435. }
  436. $group_arr = array( $group['OrgName'] => $device_arr);
  437. array_push($arr,$group_arr);
  438. }
  439. }
  440. //返回json串
  441. echo json_encode($arr,JSON_UNESCAPED_UNICODE);
  442. }
  443. public function getDeviceChannelState( ){
  444. $device_addr = I('get.addr');
  445. $channel_number = I('get.channelNumber');
  446. $sessionkey = I('get.sessionkey');
  447. //检查必填参数
  448. $this->checkRequiredParam('addr,channelNumber,sessionkey');
  449. //检查sessionkey
  450. $userinfo = $this->checkSessionKey();
  451. //检查用户对设备的权限
  452. //$this->checkDeviceControlRight($userinfo,$device_addr);
  453. //获取设备信息
  454. $device_info = $this->checkDevice($device_addr);
  455. //获取通道信息
  456. $where = array('ChNumber'=>$channel_number,'DeviceId'=>$device_info['ID']);
  457. $field = 'ChNumberText as Chx,DisplayName,ChValue as chValue,ChMan as chMan,ChType';
  458. $channel_info = MM('dpsb_channel')->where($where)->field($field)->find();
  459. if( !$channel_info ){ // 通道号不存在,返回暂无数据
  460. $this->errorMsg(\Zndp\Api\ResponseCode::NO_DATA);
  461. }
  462. $model = new \Zndp\Device\ChannelType();
  463. $channel_info['Unit'] = $model->getTypeUnit($channel_info['ChType']);
  464. $channel_info['Flag'] = $model->getTypeFlag($channel_info['ChType']);
  465. $channel_info['Addr'] = $device_addr;
  466. unset($channel_info['ChType']);
  467. $where = array('ID'=>$device_info['DeviceGroupId']);
  468. $group_name = MM('dpsb_group')->where($where)->getField('OrgName');
  469. //返回json串
  470. $arr = array( $group_name => array($channel_info) );
  471. echo json_encode($arr,JSON_UNESCAPED_UNICODE);
  472. }
  473. public function getCamImageFromTime ( ){
  474. $arr = array('error'=>401);
  475. echo json_encode($arr,JSON_UNESCAPED_UNICODE);
  476. }
  477. public function getCamRealTimeImage( ){
  478. $arr = array('error'=>401);
  479. echo json_encode($arr,JSON_UNESCAPED_UNICODE);
  480. }
  481. public function getRealTimeDeviceChannelData( ){
  482. //根据前台账号名获取账号下所有设备信息
  483. $username = I('get.username'); //前台用户名
  484. $workUnitName = I('get.workUnitName'); //设备名称,用于模糊查询
  485. $pageNumber = I('get.pageNumber'); //页码 从1开始,默认为1
  486. $pageSize = I('get.pageSize'); //每页的数据记录条数 默认为50
  487. $sessionkey = I('get.sessionkey');
  488. //检查用户名
  489. $userinfo = $this->checkUserName($username);
  490. //检查sessionkey
  491. $this->checkSessionKey();
  492. //获取用户所有设备组,设备,通道信息
  493. $where = array('FarmId'=>$userinfo['OrganizationId']);
  494. $group_list = MM('dpsb_group')->where($where)->select();
  495. if(!$group_list){//无授权设备
  496. $this->errorMsg(\Zndp\Api\ResponseCode::NOT_AUTH_DEVICE);
  497. }
  498. $device_arr = array();
  499. foreach($group_list as $group){
  500. $where = array('DeviceGroupId'=>$group['ID']);
  501. $device_list = MM('dpsb_device')->where($where)->select();
  502. foreach($device_list as $device){
  503. $where = array('DeviceId'=>$device['ID']);
  504. $field = 'ChType as ChannelType,ChNumberText as Chx,DisplayName,ChValue as chValue,ChType';
  505. $channel_list = MM('dpsb_channel')->where($where)->field($field)->select();
  506. $model = new \Zndp\Device\ChannelType();
  507. foreach($channel_list as $channel){
  508. $channel['Unit'] = $model->getTypeUnit($channel['ChType']);
  509. $channel['Flag'] = $model->getTypeFlag($channel['ChType']);
  510. unset($channel['ChType']);
  511. }
  512. $channel_list = $channel_list ?: [];
  513. $device_arr[] = array(
  514. 'gatherTime'=> $device['GatherTime'],
  515. 'Addr' => $device['DeviceAddr'],
  516. 'workUnitName' => $device['WorkUnitName'],
  517. 'latestImagePath' => '',
  518. 'latestImagePathWhole' => '',
  519. 'devValue' => $channel_list
  520. );
  521. }
  522. }
  523. //返回json串格式
  524. echo json_encode($device_arr,JSON_UNESCAPED_UNICODE);
  525. }
  526. public function getDeviceByFarmId ( ){
  527. $farmid = I('get.custId');
  528. $sessionkey = I('get.sessionkey');
  529. //检查必填参数
  530. $this->checkRequiredParam('custId,sessionkey');
  531. //检查农场是否存在
  532. //$where = array('FarmId'=>$farmid);
  533. $where = array('OrganizationId'=>$farmid);//新流程
  534. $count = MM('uc_user')->where($where)->count();
  535. if( $count == 0 ){
  536. $this->errorMsg(\Zndp\Api\ResponseCode::NO_DATA);
  537. }
  538. //检查农场基地是否属于sessionkey用户所在公司
  539. $where = array('ID'=>$sessionkey);
  540. $depart_id= MM('uc_user')->where($where)->getField('OrganizationId');
  541. $farm_ids = \Zndp\User\Util::get_depart_farm($depart_id);
  542. if( !in_array($farmid,$farm_ids) ){
  543. $this->errorMsg(\Zndp\Api\ResponseCode::SESSIONKEY_ERROR);
  544. }
  545. /*$where = array('FarmId'=>$farmid,'ID'=>$sessionkey);
  546. $userinfo = MM('uc_user')->where($where)->find();
  547. if(!$userinfo){
  548. $this->errorMsg(\Zndp\Api\ResponseCode::SESSIONKEY_ERROR);
  549. }*/
  550. //组装返回数据
  551. //获取农场下用户组
  552. $where = array('FarmId'=>$farmid);
  553. $group_list = MM('dpsb_group')->where($where)->select();
  554. $arr = array();
  555. foreach($group_list as $group){
  556. $where = array('ID'=>$group['FarmId']);
  557. $address = MM('dpyh_farm')->where($where)->getField('Address');
  558. $where = array('DeviceGroupId'=>$group['ID']);
  559. $device_list = MM('dpsb_device')->where($where)->select();
  560. $device_arr = array();
  561. foreach($device_list as $device){
  562. $devarr = array(
  563. 'unitid' => $device['ID'],
  564. 'unitname'=> $device['WorkUnitName'],
  565. 'unittype'=> $device['DeviceType']?:'',
  566. 'address' => $address,
  567. 'geom' => array(),
  568. 'addr' => $device['DeviceAddr'],
  569. 'devtype' => $device['DeviceType']?:'',
  570. );
  571. array_push($device_arr,$devarr);
  572. }
  573. $arr[] = array(
  574. 'orgid' => $group['ID'],
  575. 'orgname' => $group['OrgName'],
  576. 'devarr' => $device_arr
  577. );
  578. }
  579. //返回json串
  580. echo json_encode($arr,JSON_UNESCAPED_UNICODE);
  581. }
  582. public function getDeviceByUsername ( ){
  583. //获取内容包括设备组、设备、通道、摄像头信息
  584. $sessionkey = I('get.sessionkey');
  585. $username = I('get.businessUsername'); //客户账号名称
  586. $havechannel = I('get.havechannel'); //是否包含通道 0不包含 1包含 默认为1
  587. //检查用户名
  588. $userinfo = $this->checkUserName($username);
  589. //检查sessionKey
  590. $this->checkSessionKey();
  591. //获取用户设备组
  592. $where = array('FarmId'=>$userinfo['OrganizationId']);
  593. $group_list = MM('dpsb_group')->where($where)->select();
  594. //获取farm地址
  595. $where = array('ID'=>$userinfo['OrganizationId']);
  596. $FarmAddr = MM('uc_organization')->where($where)->getField('Address');
  597. //组装返回数据
  598. $arr = array();
  599. foreach($group_list as $group){
  600. $where = array('DeviceGroupId'=>$group['ID']);
  601. $device_list = MM('dpsb_device')->where($where)->select();
  602. $device_arr = array();
  603. foreach($device_list as $device){
  604. $devarr = array(
  605. 'unitid' => $device['ID'],
  606. 'unitname'=> $device['WorkUnitName'],
  607. 'unittype'=> $device['DeviceType']?:'',
  608. 'address' => $FarmAddr,
  609. 'geom' => array(),
  610. 'addr' => $device['DeviceAddr'],
  611. 'devtype' => $device['DeviceType']?:'',
  612. );
  613. if($havechannel){//如果需要通道信息
  614. //获取设备最新一条数据
  615. $where = array('DeviceId'=>$device['ID']);
  616. $device_data = MM('dpsj_device')->where($where)->order('GatherTime desc')->limit(1)->find();
  617. //根据设备数据ID查找关联通道数据
  618. $where = array('DeviceDataId'=>$device_data['ID']);
  619. $fields= "ChNumber as Chx,DisplayName,ChType as channelType,ChValue as chValue,Unit,Flag";
  620. $channel_data = MM('dpsj_channel')->where($where)->field($field)->select();
  621. $devarr['gathertime'] = $device_data['GatherTime'];
  622. $devarr['channelarr'] = $channel_data ?: [];//Chx是 column_x方式的
  623. }
  624. array_push($device_arr,$devarr);
  625. }
  626. $arr[] = array(
  627. 'orgid' => $group['ID'],
  628. 'orgname' => $group['OrgName'],
  629. 'devarr' => $device_arr
  630. );
  631. }
  632. //返回json串
  633. echo json_encode($arr,JSON_UNESCAPED_UNICODE);
  634. }
  635. public function getHistoryData( ){
  636. //根据设备设备号、开始时间、结束时间、页号、页数获取传感器历史记录。
  637. $device_addr = I('get.addr');
  638. $sessionkey = I('get.sessionkey');
  639. $startTime = I('get.startTime');
  640. $endTime = I('get.endTime');
  641. $orderby = strtolower(I('get.orderby')); //排序方式 Asc desc
  642. $pageSize = I('get.pageSize'); //单页返回记录数量 不能大于500
  643. $pageNumber = I('get.pageNumber'); //页数 从1开始
  644. //检查必填参数
  645. $this->checkRequiredParam('addr,sessionkey,startTime,endTime,orderby,pageSize,pageNumber');
  646. //检查设备是否存在
  647. $device_info = $this->checkDevice($device_addr);
  648. //检查设备是不是sessionkey用户的
  649. $userinfo = $this->checkSessionKey();
  650. $where = array('ID'=>$device_info['DeviceGroupId']);
  651. $farmid= MM('dpsb_group')->where($where)->getField('FarmId');
  652. /*
  653. if( $userinfo['FarmId'] != $farmid ){
  654. $this->errorMsg(\Zndp\Api\ResponseCode::SESSIONKEY_ERROR);
  655. }*/
  656. //开始时间格式错误
  657. if( strtotime($startTime) === false){
  658. $this->errorMsg(\Zndp\Api\ResponseCode::TIME_FORMAT_ERROR);
  659. }
  660. if( $endTime ){//存在结束时间
  661. //时间范围错误
  662. if( strtotime($startTime) > strtotime($endTime) ){//开始时间大于结束时间
  663. $this->errorMsg(\Zndp\Api\ResponseCode::WRONG_TIME_RANGE);
  664. }
  665. //时间格式错误
  666. if( strtotime($endTime) === false ){
  667. $this->errorMsg(\Zndp\Api\ResponseCode::TIME_FORMAT_ERROR);
  668. }
  669. }else{
  670. $endTime = date('Y-m-d H:i:s');
  671. }
  672. if( !is_numeric($pageSize) || $pageSize <= 0 ){//默认一页给几条数据还是返回错误信息?
  673. $pageSize = 5;
  674. // $this->errorMsg(\Zndp\Api\ResponseCode::TIME_FORMAT_ERROR);
  675. }elseif( $pageSize > 300 ){
  676. $pageSize = 300;
  677. }
  678. if( !is_numeric($pageNumber) ){//默认页
  679. $pageNumber = 1;
  680. //$this->errorMsg(\Zndp\Api\ResponseCode::TIME_FORMAT_ERROR);
  681. }
  682. $orderArr = array('asc','desc');
  683. if( !in_array($orderby,$orderArr) ){//默认排序
  684. $orderby = 'desc';
  685. }
  686. $startTime = date('Y-m-d H:i:s',strtotime($startTime));//值为2018会当成当天20:18
  687. $endTime = date('Y-m-d H:i:s',strtotime($endTime));
  688. //组装返回数据
  689. $where = array(
  690. 'DeviceId' => $device_info['ID'],
  691. 'GatherTime' => array('between',array($startTime,$endTime)),
  692. );
  693. $device_list = MM('dpsj_device')->where($where)->order('GatherTime '.$orderby)->limit($pageNumber,$pageSize)->select();
  694. if(!$device_list){
  695. $this->errorMsg(\Zndp\Api\ResponseCode::NO_DATA);
  696. }
  697. //组装返回数据
  698. $data_arr = array();
  699. foreach($device_list as $device){
  700. $where = array('DeviceDataId' => $device['ID']);
  701. $channel_info = MM('dpsj_channel')->where($where)->select();
  702. $data['id'] = $device['ID'];
  703. $data['设备编号'] = $device_addr;
  704. $data['设备名称'] = $device_info['WorkUnitName'];
  705. $data['工作单元ID'] = $device_info['ID'];
  706. $data['工作单元名称'] = $device_addr;
  707. $data['采集数据时间'] = $device['GatherTime'];
  708. foreach($channel_info as $channel_sj){
  709. $data['插入数据库时间'] = $channel_sj['GatherTime'];
  710. $data[$channel_sj['DisplayName']] = $channel_sj['ChValue'];
  711. }
  712. array_push($data_arr,$data);
  713. }
  714. echo json_encode($data_arr,JSON_UNESCAPED_UNICODE);
  715. }
  716. public function getSystemNoticeList ( ){
  717. $userid = I('get.operatorid'); //前台用户ID
  718. $sessionkey = I('get.sessionkey'); //sessionkey
  719. $pageNumber = I('get.pageNumber'); //页码 从1开始,默认为1
  720. $pageSize = I('get.pageSize'); //每页的数据记录条数 默认为10,不能大于300
  721. $this->checkSessionKey();
  722. //返回json串
  723. $arr = array(
  724. "notice"=>[
  725. [
  726. "msgid"=>6166,
  727. "title"=>"报警提示",
  728. "msgtype"=>1,
  729. "content"=>"设备:854715的传感器:温度超出上限:45.0目前为:46.4 时间:2018-05-28 12:38:20",
  730. "time"=>"2018-05-28 12:38:20",
  731. "state"=>0
  732. ]
  733. ],
  734. "unreadcount"=>"0"
  735. );
  736. echo json_encode($arr,JSON_UNESCAPED_UNICODE);
  737. }
  738. public function setSystemNoticeState( ){
  739. $this->checkSessionKey();
  740. $arr = array('response'=>'success');
  741. echo json_encode($arr,JSON_UNESCAPED_UNICODE);
  742. }
  743. public function getHealthState( ){
  744. $device_addr = I('get.addr');
  745. $sessionkey = I('get.sessionkey');
  746. //检查必填字段
  747. $this->checkRequiredParam('addr,sessionkey');
  748. //检查设备
  749. $device_info = $this->checkDevice($device_addr);
  750. //检查sessionkey
  751. $userinfo = $this->checkSessionKey();
  752. $where = array('ID'=>$device_info['DeviceGroupId']);
  753. $farmid = MM('dpsb_group')->where($where)->getField('FarmId');
  754. /*
  755. if( $userinfo['FarmId'] != $farmid ){//检查设备是否属于该sessionKey用户
  756. $this->errorMsg(\Zndp\Api\ResponseCode::SESSIONKEY_ERROR);
  757. }
  758. */
  759. $where = array('DeviceId'=>$device_info['ID']);
  760. $device_sj = MM('dpsj_device')->where($where)->order('GatherTime desc')->find();
  761. //返回json串
  762. $arr = array(
  763. "msgid"=> $device_sj['ID'],
  764. "addr"=> $device_addr,
  765. "voltage"=> $device_sj['Voltage'],
  766. "signal"=> $device_sj['Signal'],
  767. "worktemp"=> $device_sj['WorkTemp'],
  768. "gathertime"=> $device_sj['GatherTime'],
  769. "pwrstate"=> $device_sj['PwrState'],
  770. "custId"=> $farmid
  771. );
  772. echo json_encode($arr,JSON_UNESCAPED_UNICODE);
  773. }
  774. public function getDevHealthList( ){
  775. $device_addr = I('get.addr');
  776. $startTime = I('get.startTime'); //采集时间开始值 不可为空
  777. $endTime = I('get.endTime'); //结束时间 如不传该参数,则返回开始时间之后的所有数据
  778. $pageSize = I('get.pageSize');
  779. $pageNumber = I('get.pageNumber');
  780. $sessionkey = I('get.sessionkey');
  781. //检查必填参数
  782. $this->checkRequiredParam('addr,startTime,sessionkey');
  783. //检查设备
  784. $device_info = $this->checkDevice($device_addr);
  785. //检查sessionKey
  786. $userinfo = $this->checkSessionKey();
  787. //检查设备是否属于该sessionkey用户
  788. $where = array('ID'=>$device_info['DeviceGroupId']);
  789. $farmid = MM('dpsb_group')->where($where)->getField('FarmId');
  790. /*
  791. if($userinfo['FarmId'] != $farmid){
  792. $this->errorMsg(\Zndp\Api\ResponseCode::SESSIONKEY_ERROR);
  793. }
  794. */
  795. //开始时间格式错误
  796. if( strtotime($startTime) === false){
  797. $this->errorMsg(\Zndp\Api\ResponseCode::TIME_FORMAT_ERROR);
  798. }
  799. if( $endTime ){//存在结束时间
  800. //时间范围错误
  801. if( strtotime($startTime) > strtotime($endTime) ){//开始时间大于结束时间
  802. $this->errorMsg(\Zndp\Api\ResponseCode::WRONG_TIME_RANGE);
  803. }
  804. //时间格式错误
  805. if( strtotime($endTime) === false ){
  806. $this->errorMsg(\Zndp\Api\ResponseCode::TIME_FORMAT_ERROR);
  807. }
  808. }else{
  809. $endTime = date('Y-m-d H:i:s');
  810. }
  811. if( !is_numeric($pageSize) || $pageSize <= 0 ){//默认一页给几条数据还是返回错误信息?
  812. $pageSize = 5;
  813. // $this->errorMsg(\Zndp\Api\ResponseCode::TIME_FORMAT_ERROR);
  814. }elseif( $pageSize > 30 ){
  815. $pageSize = 30;
  816. }
  817. if( !is_numeric($pageNumber) ){//默认页
  818. $pageNumber = 1;
  819. //$this->errorMsg(\Zndp\Api\ResponseCode::TIME_FORMAT_ERROR);
  820. }
  821. $startTime = date('Y-m-d H:i:s',strtotime($startTime));//值为2018会当成当天20:18
  822. $endTime = date('Y-m-d H:i:s',strtotime($endTime));
  823. //组装返回数据
  824. $where = array(
  825. 'DeviceId' => $device_info['ID'],
  826. 'GatherTime' => array('between',array($startTime,$endTime)),
  827. );
  828. $device_data = MM('dpsj_device')->where($where)->order('GatherTime desc')->limit($pageNumber,$pageSize)->select();
  829. if(!$device_data){
  830. $this->errorMsg(\Zndp\Api\ResponseCode::NO_DATA);
  831. }
  832. $device_arr = array();
  833. foreach($device_data as $data){
  834. $device_sj["msgid"] = $data['ID'];
  835. $device_sj["addr"]= $device_addr;
  836. $device_sj["devname"] = $device_info['WorkUnitName'];
  837. $device_sj["voltage"]= $data['Voltage'];
  838. $device_sj["signal"]= $data['Signal'];
  839. $device_sj["worktemp"] = $data['WorkTemp'];
  840. $device_sj["gathertime"] = $data['GatherTime'];
  841. $device_sj["pwrstate"] = $data['PwrState'];
  842. $device_sj["custId"] = $farmid;
  843. array_push($device_arr,$device_sj);
  844. }
  845. //返回json串
  846. /*
  847. $arr = array(
  848. [
  849. "msgid"=>10600110,
  850. "addr"=>"854715",
  851. "devname"=>"测试设备",
  852. "voltage"=>5.298,
  853. "signal"=>"31",
  854. "worktemp"=>31.943,
  855. "gathertime"=>"2018-05-26 23:14:00",
  856. "pwrstate"=>1
  857. ],
  858. );*/
  859. echo json_encode($device_arr,JSON_UNESCAPED_UNICODE);
  860. }
  861. public function index( ){
  862. $method = I('get.method');
  863. if(!$method){//方法为空
  864. $this->errorMsg(\Zndp\Api\ResponseCode::EMPTY_METHOD);
  865. }
  866. if(!method_exists($this,$method)){//方法不存在
  867. $this->errorMsg(\Zndp\Api\ResponseCode::METHOD_NOT_EXISTS);
  868. }
  869. $this->$method();
  870. }
  871. private function errorMsg( $code ){
  872. $code = str_pad($code,3,0,STR_PAD_LEFT );
  873. $dataArray = array('response'=>'error','error'=>$code);
  874. $dataJson = json_encode($dataArray);
  875. echo $dataJson;
  876. exit;
  877. }
  878. private function checkRequiredParam( $fields ){
  879. $fields = explode(',',$fields);
  880. foreach($fields as $field){
  881. if(! isset($_GET[$field]) ){
  882. $this->errorMsg(\Zndp\Api\ResponseCode::PARAM_LACK);
  883. }
  884. }
  885. }
  886. private function checkSessionKey( $username = '' ){
  887. $where = array(
  888. 'ID'=>I('get.sessionkey'),
  889. //'AssocId' => I('get.sessionkey'),
  890. //'RoleId' => ['eq',\Zndp\User\RoleEnum::API_CLIENT],
  891. );
  892. if( $username ){
  893. $where['UserName'] = $username;
  894. }
  895. $userinfo = MM('uc_user')->where($where)->find();
  896. if(!$userinfo){
  897. $this->errorMsg(\Zndp\Api\ResponseCode::SESSIONKEY_ERROR);
  898. }
  899. return $userinfo;
  900. }
  901. private function checkUserName( $username, $checkDev = false ){
  902. if(!$username){//用户名参数为空
  903. $this->errorMsg(\Zndp\Api\ResponseCode::EMPTY_USERNAME);
  904. }
  905. $where = array(
  906. 'UserName'=>$username,
  907. 'RoleId' => ['neq',\Zndp\User\RoleEnum::API_CLIENT],
  908. );
  909. $userinfo = MM('uc_user')->where($where)->find();
  910. if(!$userinfo){//用户名不存在
  911. $this->errorMsg(\Zndp\Api\ResponseCode::USERNAME_NOT_EXISTS);
  912. }
  913. if($checkDev){
  914. $where = array('FarmId'=>$userinfo['OrganizationId']);
  915. $count = MM('dpsb_group')->where($where)->count();
  916. if( $count == 0 ){
  917. $this->errorMsg(\Zndp\Api\ResponseCode::NOT_AUTH_DEVICE);
  918. }
  919. }
  920. return $userinfo;
  921. }
  922. private function checkDeviceControlRight( $userinfo, $addr = '' ){
  923. //所有浏览员都不行
  924. $role_arr = array(
  925. //\Zndp\User\RoleEnum::FARM_ADMINISTRATOR,//农场管理员
  926. //\Zndp\User\RoleEnum::FARM_OPERATOR,//农场操作员
  927. \Zndp\User\RoleEnum::BASE_ADMINISTRATOR,//基地管理员
  928. \Zndp\User\RoleEnum::BASE_LEADER,//基地负责人
  929. );
  930. //检查是否是自己农场的设备
  931. $cond = array('DeviceAddr'=>$addr);
  932. $device_info = MM('dpsb_device')->where($cond)->find();
  933. if( !$device_info ){//设备不存在
  934. $this->errorMsg(\Zndp\Api\ResponseCode::DEVICE_NOT_EXISTS);
  935. }
  936. if( !in_array($userinfo['RoleId'],$role_arr) ){ //仅限农场管理员,农场操作员
  937. $this->errorMsg(\Zndp\Api\ResponseCode::DEVICE_OPRATE_DISALLOWED);
  938. }
  939. $cond = array('ID'=>$device_info['DeviceGroupId']);
  940. $group_info = MM('dpsb_group')->where($cond)->find();
  941. if($group_info['FarmId'] != $userinfo['OrganizationId']){
  942. $this->errorMsg(\Zndp\Api\ResponseCode::DEVICE_OPRATE_DISALLOWED);//不允许操作该设备
  943. }
  944. //检查是否是农场操作员控制的设备(???要问客户)
  945. return $device_info;
  946. }
  947. private function checkDevice( $device_addr ){
  948. $where = array('DeviceAddr'=>$device_addr);
  949. $device_info = MM('dpsb_device')->where($where)->find();
  950. if( !$device_info ){//设备不存在
  951. $this->errorMsg(\Zndp\Api\ResponseCode::DEVICE_NOT_EXISTS);
  952. }
  953. return $device_info;
  954. }
  955. private function checkControlChannel( $device_addr, $channel_number ){
  956. $where = array('DeviceAddr'=>$device_addr);
  957. $device_id = MM('dpsb_device')->where($where)->getField('ID');
  958. $where = array('ChNumber'=>$channel_number,'DeviceId'=>$device_id);
  959. $channel_info = MM('dpsb_channel')->where($where)->find();
  960. //通道号不存在,返回暂无数据错误码401
  961. if( !$channel_info ){
  962. $this->errorMsg(\Zndp\Api\ResponseCode::NO_DATA);
  963. }
  964. //通道不是控制类型
  965. $control_sensor = \Zndp\Device\ChannelType::CONTROL_SENSOR;
  966. if( !in_array($channel_info['ChType'],$control_sensor) ){
  967. $this->errorMsg(\Zndp\Api\ResponseCode::NOT_CONTROLLABLE_SENSOR);
  968. }
  969. return $channel_info;
  970. }
  971. private function getUserDeviceGroup( $farmid ){
  972. $where = array('FarmId'=>$farmid);
  973. $group_list = MM('dpsb_group')->where($where)->select();
  974. }
  975. private function getDeviceNewlyGatherData( $addr ){
  976. }
  977. public function appLogin( ){
  978. $username = I('get.username');
  979. $password = I('get.password');
  980. //检查账号密码
  981. $password = (new \Zndp\User\Util)->encPwd($password);
  982. $where = array('UserName'=>$username,'Password'=>$password);
  983. $roleid = MM('uc_user')->where($where)->getField('RoleId');
  984. if( !$roleid ){
  985. json_fail('用户名或密码错误!');
  986. }
  987. // 管理员,操作员可登录
  988. //$roleArr = array(\Zndp\User\RoleEnum::FARM_ADMINISTRATOR,\Zndp\User\RoleEnum::FARM_OPERATOR);
  989. $roleArr = array(
  990. \Zndp\User\RoleEnum::BASE_ADMINISTRATOR,//基地管理员
  991. \Zndp\User\RoleEnum::BASE_LEADER,//基地负责人
  992. );
  993. if( !in_array($roleid,$roleArr) ){
  994. json_fail('没有权限!');
  995. }
  996. json_success('登陆成功!');
  997. }
  998. private function checkDateQueryParam( $params ){
  999. //参数需要重新设计:考虑pageSize最大值
  1000. if( !is_array($params) ){
  1001. exit("<script>alert('params must be array!')</script>");
  1002. }
  1003. $startTime = $params['startTime'];
  1004. $endTime = $params['endTime'];
  1005. $pageSize = $params['pageSize'];
  1006. $pageNumber = $params['pageNumber'];
  1007. $order = $params['order'] ?: 'desc';
  1008. //开始时间格式错误
  1009. if( strtotime($startTime) === false){
  1010. $this->errorMsg(\Zndp\Api\ResponseCode::TIME_FORMAT_ERROR);
  1011. }
  1012. if( $endTime ){//存在结束时间
  1013. //时间范围错误
  1014. if( strtotime($startTime) > strtotime($endTime) ){//开始时间大于结束时间
  1015. $this->errorMsg(\Zndp\Api\ResponseCode::WRONG_TIME_RANGE);
  1016. }
  1017. //时间格式错误
  1018. if( strtotime($endTime) === false ){
  1019. $this->errorMsg(\Zndp\Api\ResponseCode::TIME_FORMAT_ERROR);
  1020. }
  1021. }else{
  1022. $endTime = date('Y-m-d H:i:s');
  1023. }
  1024. if( !is_numeric($pageSize) || $pageSize <= 0 ){//默认一页给几条数据还是返回错误信息?
  1025. $pageSize = 5;
  1026. // $this->errorMsg(\Zndp\Api\ResponseCode::TIME_FORMAT_ERROR);
  1027. }elseif( $pageSize > 300 ){
  1028. $pageSize = 300;
  1029. }
  1030. if( !is_numeric($pageNumber) ){//默认页
  1031. $pageNumber = 1;
  1032. //$this->errorMsg(\Zndp\Api\ResponseCode::TIME_FORMAT_ERROR);
  1033. }
  1034. //返回处理好的参数
  1035. $params['startTime'] = $startTime;
  1036. $params['endTime'] = $endTime;
  1037. $params['pageSize'] = $pageSize;
  1038. $params['pageNumber']= $pageNumber;
  1039. $params['order'] = $order;
  1040. return $params;
  1041. }
  1042. public function upgradeAppVersion( ){
  1043. $fields = 'AppVersionCode as versionCode,AppVersion as versionName,AppPath as url,UpdateMessage as updateMessage,Md5Hash as md5';
  1044. $type = I('get.type');
  1045. $type = $type ? $type : 'zndp'; // 默认智能大棚APP
  1046. $where = array('AppName' => $type);
  1047. $appData = MM('dpyh_app_version')->where($where)->order('AddTime desc')->field($fields)->find();
  1048. if(!$appData['url']){
  1049. json_fail('没有App文件!');
  1050. }
  1051. $data = array(
  1052. 'success' => true,
  1053. 'message' => '',
  1054. 'data' => $appData,
  1055. );
  1056. echo json_encode($data,JSON_UNESCAPED_UNICODE);
  1057. /*
  1058. //区分农用通和大棚app
  1059. $type = I('get.type');
  1060. if($type == 'nyt'){
  1061. $appname = '农用通';
  1062. }else{
  1063. $appname = '智能大棚';
  1064. $type = 'zndp';
  1065. }
  1066. $where = array('AppName'=>$appname);
  1067. $appData = MM('dpyh_app_version')->where($where)->order('AddTime desc')->field($fields)->find();
  1068. if(!$appData['url']){
  1069. json_fail('文件不存在!');
  1070. }
  1071. // 拼接文件绝对路径,校验时不用下载
  1072. $apk_name = substr($appData['url'], strrpos($appData['url'],'/'));
  1073. $root_path = getcwd();
  1074. $realpath = $root_path .'/apk/'. $type . $apk_name;
  1075. $appData['md5'] = md5_file($realpath);
  1076. */
  1077. }
  1078. public function appLog( ){
  1079. //$message = '['.date('Y-m-d H:i:s') . ']' . htmlspecialchars_decode(I('post.message')). PHP_EOL;
  1080. $dir_path = SOLUTION_DATA_PATH . "app";
  1081. if(!is_dir($dir_path)){
  1082. mkdir($dir_path,0777,1);
  1083. }
  1084. //file_put_contents(SOLUTION_RUNTIME_PATH."../app/app_old.log",$message,FILE_APPEND);
  1085. if (!function_exists('gzdecode')) {
  1086. function gzdecode ($data) {
  1087. $flags = ord(substr($data, 3, 1));
  1088. $headerlen = 10;
  1089. $extralen = 0;
  1090. $filenamelen = 0;
  1091. if ($flags & 4) {
  1092. $extralen = unpack('v' ,substr($data, 10, 2));
  1093. $extralen = $extralen[1];
  1094. $headerlen += 2 + $extralen;
  1095. }
  1096. if ($flags & 8) // Filename
  1097. $headerlen = strpos($data, chr(0), $headerlen) + 1;
  1098. if ($flags & 16) // Comment
  1099. $headerlen = strpos($data, chr(0), $headerlen) + 1;
  1100. if ($flags & 2) // CRC at end of file
  1101. $headerlen += 2;
  1102. $unpacked = @gzinflate(substr($data, $headerlen));
  1103. if ($unpacked === FALSE)
  1104. $unpacked = $data;
  1105. return $unpacked;
  1106. }
  1107. }
  1108. if(!empty($GLOBALS['HTTP_RAW_POST_DATA']) && strlen($GLOBALS['HTTP_RAW_POST_DATA'])>0)
  1109. {
  1110. // 解压
  1111. $message = gzdecode($GLOBALS['HTTP_RAW_POST_DATA']);
  1112. // 倒序
  1113. $msg_arr = explode("\n",$message);
  1114. krsort($msg_arr);
  1115. $final_msg = implode("\n",$msg_arr);
  1116. }
  1117. $file_path = $dir_path ."/app.log";
  1118. // 检查文件大小,超过20M不处理
  1119. $file_size = filesize($file_path);
  1120. if( $file_size >= 1024*1024*20 ){
  1121. json_fail('File size: '.$file_size.'Byte');
  1122. }
  1123. clearstatcache();
  1124. file_put_contents($file_path,$final_msg."\n".file_get_contents($file_path));
  1125. }
  1126. public function sendControl( ){
  1127. //根据设备、通道号控制设备状态,行程量5个(全开,全关,打开运行中,关闭运行中,停止),开关量(打开,停止),返回是否自动控制信息。修改设备后的信息会保存。
  1128. $device_addr = I('get.addr');
  1129. $channel_status = I('get.status');
  1130. $channel_number = I('get.channelNumber');
  1131. $sessionkey = I('get.sessionkey');
  1132. // 检查必填参数
  1133. $this->checkRequiredParam('addr,status,channelNumber,sessionkey');
  1134. // 检查sessionkey
  1135. $userinfo = $this->checkSessionKey();
  1136. // 检查用户对设备权限
  1137. //$device_info = $this->checkDeviceControlRight($userinfo,$device_addr);
  1138. // 对应设备失去连接
  1139. // 转换中科通道号
  1140. $channel_number = \Zndp\Device\Util::MapChannelNumber($channel_number);
  1141. if(!$channel_number){
  1142. $this->errorMsg(\Zndp\Api\ResponseCode::NO_DATA);
  1143. }
  1144. // 对应序号传感器不是控制设备
  1145. $channel_info = $this->checkControlChannel($device_addr,$channel_number);
  1146. // 控制参数错误
  1147. if( !in_array($channel_status,[0,1,2]) ){
  1148. $error = array("response"=>"error",
  1149. "error" =>"4",
  1150. "errorinfo"=>"Wrong Status!"
  1151. );
  1152. echo json_encode($error);exit;
  1153. }
  1154. // 设备应答操作失败(应答状态为0)
  1155. // 传给信号服务
  1156. $host = '127.0.0.1';
  1157. $port = 10240;
  1158. $socket = new Jms\Network\TcpClient($host,$port);
  1159. $cmd = array(
  1160. "method" => "apiSendControl",
  1161. "Addr" => $device_addr, //设备addr
  1162. "channelNumber" => $channel_number, //通道编号
  1163. "status" => $channel_status
  1164. );
  1165. $res = $socket->send(json_encode($cmd)."\n");
  1166. //修改设备后的保存信息
  1167. if(!$res['success']){//操作失败
  1168. $this->errorMsg(\Zndp\Api\ResponseCode::DEVICE_RESPONSE_FAIL);
  1169. }
  1170. $data_arr = array(
  1171. 'response' => $res['success'] ? 'success' : 'error',
  1172. 'decstate' => $res['data']['decstate'],
  1173. 'isauto' => $res['data']['isauto']
  1174. );
  1175. // 返回json串
  1176. echo json_encode($data_arr,JSON_UNESCAPED_UNICODE);
  1177. }
  1178. public function ModifyAutoControlInfo( ){
  1179. //设备可通过设置参数进行自动控制,onTime时间单位为分钟,比如8:10对应8*60+10=490 可通过上限下限参考值 设置扩值(温度范围)
  1180. $addr = I('get.addr'); //设备地址
  1181. $channelNumber = I('get.channelNumber'); //设备通道
  1182. $man = I('get.man'); //是否自动,0自动,1手动
  1183. //$RefAddr = I('get.RefAddr'); //参考目标设备地址,暂未启用
  1184. $refChannel = I('get.refChannel'); //参考通道,此通道指传感器通道
  1185. //$InterLock = I('get.InterLock'); //参考互锁通道编号,暂未启用,此通道指控制通道
  1186. $TimeEn = I('get.TimeEn'); //定时任务使能,1开启,0关闭
  1187. $UpperLimit_Value = I('get.UpperLimit_Value'); //上限值参考值,可通过上限下限参考值 设置扩值(温度范围)
  1188. $UpperLimit_State = I('get.UpperLimit_State'); //上限值参考状态,0关 1开
  1189. $LowerLimit_Value = I('get.LowerLimit_Value'); //下限值参考值,可通过上限下限参考值 设置扩值(温度范围)
  1190. $LowerLimit_State = I('get.LowerLimit_State'); //下限值参考状态,0关 1开
  1191. $OnTime1 = I('get.OnTime1'); //打开时间1
  1192. $OffTime1 = I('get.OffTime1'); //关闭时间1
  1193. $OnTime2 = I('get.OnTime2'); //打开时间2
  1194. $OffTime2 = I('get.OffTime2'); //关闭时间2
  1195. $OnTime3 = I('get.OnTime3'); //打开时间3
  1196. $OffTime3 = I('get.OffTime3'); //关闭时间3
  1197. $OnTime4 = I('get.OnTime4'); //打开时间4
  1198. $OffTime4 = I('get.OffTime4'); //关闭时间4
  1199. $OnTime5 = I('get.OnTime5'); //打开时间5
  1200. $OffTime5 = I('get.OffTime5'); //关闭时间5
  1201. // 检查必填参数
  1202. $this->checkRequiredParam('addr,channelNumber,man,TimeEn');
  1203. // 检查sessionkey
  1204. $this->checkSessionKey();
  1205. // 检查设备是否存在
  1206. $device_info = $this->checkDevice($addr);
  1207. // 转换中科通道号
  1208. $channelNumber = \Zndp\Device\Util::MapChannelNumber($channelNumber);
  1209. if(!$channelNumber){
  1210. $this->errorMsg(\Zndp\Api\ResponseCode::NO_DATA);
  1211. }
  1212. // 检查是否为控制类传感器
  1213. $channel_infp= $this->checkControlChannel($addr,$channelNumber);
  1214. // 发送给信号服务
  1215. $host = '127.0.0.1';
  1216. $port = 10240;
  1217. $socket = new Jms\Network\TcpClient($host,$port);
  1218. $msg = array(
  1219. 'method' => 'apiModifyAutoControlInfo',
  1220. 'Addr' => $addr,
  1221. 'channelNumber' => $channelNumber,
  1222. 'man' => $man,
  1223. 'refChannel' => $refChannel,
  1224. 'TimeEn' => $TimeEn,
  1225. 'UpperLimit_Value' => $UpperLimit_Value,
  1226. 'UpperLimit_State' => $UpperLimit_State,
  1227. 'LowerLimit_Value' => $LowerLimit_Value,
  1228. 'LowerLimit_State' => $LowerLimit_State,
  1229. 'OnTime1' => $OnTime1 >= 0 ? $OnTime1 : -1,
  1230. 'OffTime1' => $OffTime1 >= 0 ? $OffTime1 : -1,
  1231. 'OnTime2' => $OnTime2 >= 0 ? $OnTime2 : -1,
  1232. 'OffTime2' => $OffTime2 >= 0 ? $OffTime2 : -1,
  1233. 'OnTime3' => $OnTime3 >= 0 ? $OnTime3 : -1,
  1234. 'OffTime3' => $OffTime3 >= 0 ? $OffTime3 : -1,
  1235. 'OnTime4' => $OnTime4 >= 0 ? $OnTime4 : -1,
  1236. 'OffTime4' => $OffTime4 >= 0 ? $OffTime4 : -1,
  1237. 'OnTime5' => $OnTime5 >= 0 ? $OnTime5 : -1,
  1238. 'OffTime5' => $OffTime5 >= 0 ? $OffTime5 : -1,
  1239. );
  1240. //测试是否为字符串
  1241. //$res = $socket->send($msg);
  1242. $res = $socket->send(json_encode($msg)."\n");
  1243. // 对应设备失去连接
  1244. // 设备应答操作失败(应答状态为0)
  1245. if(!$res['success']){
  1246. $this->errorMsg(\Zndp\Api\ResponseCode::DEVICE_RESPONSE_FAIL);
  1247. }
  1248. $arr = array(
  1249. 'response' => $res['success'] ? 'success':'error',
  1250. 'man' => $res['data']['man'],
  1251. );
  1252. echo json_encode($arr,JSON_UNESCAPED_UNICODE);
  1253. }
  1254. public function activityRestart( ){
  1255. $dir_path = SOLUTION_LOG_PATH."../test/";
  1256. if(!is_dir(dir_path)){
  1257. mkdir($dir_path,0777);
  1258. }
  1259. $log_path = $dir_path.'test_'.time() .".log";
  1260. file_put_contents($log_path,'');
  1261. }
  1262. public function getRealTimeDeviceDetailDataInner( ){
  1263. header('Content-type: application/json');
  1264. //单台设备信息,包括5张最新图片(如果有摄像头),传感器值,行程控制值,开关控制值
  1265. $username = I('get.username');
  1266. $device_addr = I('get.addr');
  1267. //检查必填参数
  1268. $this->checkRequiredParam('username,addr');
  1269. //检查用户名
  1270. $userinfo = $this->checkUserName($username,true);
  1271. //检查设备
  1272. $device_info = $this->checkDeviceControlRight($userinfo,$device_addr);
  1273. //设备失去连接
  1274. //获取农场名称(顾客名称)
  1275. $where = array('ID'=>$userinfo['FarmId']);
  1276. $custName = MM('dpyh_farm')->where($where)->getField('FarmName');
  1277. //获取A类型传感器数据集
  1278. $where = array(
  1279. 'DeviceId'=>$device_info['ID'],
  1280. 'ChType' => array('IN',\Zndp\Device\ChannelType::SENSOR_TYPES)
  1281. );
  1282. $sensors = MM('dpsb_channel')->where($where)->field('ChNumberText as Chx,DisplayName,ChType as channelType,ChValue,Unit,Flag,ChMan as man')->select();
  1283. $sensorValue = array();
  1284. $channel_type_model = new \Zndp\Device\ChannelType();
  1285. foreach($sensors as $sensor){
  1286. $sensor['workUnitName'] = $device_info['WorkUnitName'];
  1287. $sensor['Unit'] = $channel_type_model->getTypeUnit($sensor['channelType']);
  1288. $sensor['Flag'] = $channel_type_model->getTypeFlag($sensor['channelType']);
  1289. $sensor['channelType'] = (int)$sensor['channelType'];
  1290. array_push($sensorValue,$sensor);
  1291. }
  1292. //获取行程类传感器数据集
  1293. $where = array(
  1294. 'DeviceId'=>$device_info['ID'],
  1295. 'ChType' => array('IN',\Zndp\Device\ChannelType::ITINERARY_SENSOR)
  1296. );
  1297. $travels = MM('dpsb_channel')->where($where)->field('ChNumberText as Chx,DisplayName,ChType as channelType,ChValue,Unit,Flag,ChMan as man')->select();
  1298. $travelValue = array();
  1299. foreach($travels as $travel){
  1300. $travel['workUnitName'] = $device_info['WorkUnitName'];
  1301. $travel['Unit'] = $channel_type_model->getTypeUnit($travel['channelType']);
  1302. $travel['Flag'] = $channel_type_model->getTypeFlag($travel['channelType']);
  1303. $travel['channelType'] = (int)$travel['channelType'];
  1304. array_push($travelValue,$travel);
  1305. }
  1306. //返回json串
  1307. $arr = array(
  1308. 'Addr' => $device_addr,
  1309. 'custname' => $custName,
  1310. 'custid' => (int)$userinfo['FarmId'],
  1311. 'gatherTime' => $device_info['GatherTime'],
  1312. 'workUnitName' => $device_info['WorkUnitName'],
  1313. 'hikValue' => array(
  1314. 'videosn'=>'',
  1315. 'ysAppkey'=>'',
  1316. //'accessToken'=>''
  1317. ),
  1318. 'imageValue' => array(),
  1319. 'sensorValue' => $sensorValue,
  1320. 'travelValue' => $travelValue,
  1321. 'onoffValue' => array(),
  1322. 'proportionValue' => array()
  1323. );
  1324. echo json_encode($arr,JSON_UNESCAPED_UNICODE);
  1325. }
  1326. public function store_invalid_data( ){
  1327. $addr = I('get.addr'); //设备编号
  1328. $temp = I('get.temp'); //温度
  1329. $damp = I('get.damp'); //湿度
  1330. $device_data = json_encode(array('temp'=>$temp,'damp'=>$damp));
  1331. $data = array(
  1332. 'Addr' => $addr,
  1333. 'DeviceData' => $device_data,
  1334. 'AddTime' => date('Y-m-d H:i:s')
  1335. );
  1336. MM('dpsj_invalid')->createAdd($data);
  1337. }
  1338. public function catch_data( ){
  1339. //header('Content-Type:application/json');
  1340. function getNearlyData($temp,$damp){ //获取处理后的相近温湿度数据
  1341. //获取数据库中最后一次采集温湿度数据
  1342. $where = array('DeviceId'=>34);
  1343. $device_dataid = MM('dpsj_device')->where($where)->order('GatherTime desc')->getField('ID');
  1344. $where = array('DeviceDataId'=> $device_dataid);
  1345. $channel_data = MM('dpsj_channel')->where($where)->select();
  1346. $data = array();
  1347. foreach($channel_data as $v){
  1348. if($v['ChNumber'] == 2){ //温度
  1349. if($v['ChValue'] - $temp > 1){
  1350. $data['temp'] = (string)round($v['ChValue'] - ($v['ChValue'] - $temp)*0.3 ,1);
  1351. }elseif($temp - $v['ChValue'] > 1){
  1352. $data['temp'] = (string)round($temp - ($temp - $v['ChValue'])*0.3 ,1);
  1353. }else{
  1354. $data['temp'] = (string)$temp + rand(1,3)/10;
  1355. }
  1356. }
  1357. if($v['ChNumber'] == 3){ //湿度
  1358. if($v['ChValue'] - $damp > 10){
  1359. $data['damp'] = (string)($v['ChValue'] - rand(3,8));
  1360. }elseif($damp - $v['ChValue'] > 10){
  1361. $data['damp'] = (string)($damp - rand(3,8) );
  1362. }else{
  1363. $data['damp'] = (string)$damp - rand(1,5);
  1364. }
  1365. }
  1366. }
  1367. $data['qishuo'] = false;
  1368. return json_encode($data);
  1369. }
  1370. function method1(){
  1371. $url = "http://api.nongyongtong.com:8081/qfls/api?method=getRealTimeDeviceDetailData&addr=44045632&username=wannanyanye&sessionkey=82BA0712C75800201C177AD425107EA2";
  1372. $json_data = file_get_contents($url);
  1373. $data_arr = iconv('GBK','UTF-8',$json_data);
  1374. $data_arr = json_decode($data_arr,true);
  1375. if(!$data_arr){ //没有抓取到数据则返回false
  1376. return false;
  1377. }
  1378. $temp = $data_arr['sensorValue'][1]['chValue']; //抓取到的温度
  1379. $damp = $data_arr['sensorValue'][2]['chValue']; //抓取到的湿度
  1380. //获取处理后的相近温湿度数据
  1381. $json_data = getNearlyData($temp,$damp);
  1382. echo $json_data;
  1383. //记录访问api日志
  1384. $message = '['.date('Y-m-d H:i:s') . '] method1:'.$json_data .PHP_EOL;
  1385. if(!is_dir(SOLUTION_RUNTIME_PATH . "../app")){
  1386. mkdir('app',0777);
  1387. }
  1388. file_put_contents(SOLUTION_RUNTIME_PATH."../app/catch.log",$message,FILE_APPEND);
  1389. return true;
  1390. }
  1391. function method2(){
  1392. $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=";
  1393. $html = file_get_contents($url);
  1394. //"now":{"text":"多云","code":"4","temperature":"30","humidity":"62","wind_direction":"东","wind_speed":"12.24","wind_scale":"3"}
  1395. preg_match('/temperature(.{1,30})/i',$html,$match);
  1396. preg_match_all('/\d+/',$match[0],$data_arr);
  1397. if(!$data_arr){
  1398. return false;
  1399. }
  1400. $temp = $data_arr[0][0];
  1401. $damp = $data_arr[0][1];
  1402. $json_data = getNearlyData($temp,$damp);
  1403. echo $json_data;
  1404. //记录访问api日志
  1405. $message = '['.date('Y-m-d H:i:s') . '] method2:'.$json_data .PHP_EOL;
  1406. if(!is_dir(SOLUTION_RUNTIME_PATH . "../app")){
  1407. mkdir('app',0777);
  1408. }
  1409. file_put_contents(SOLUTION_RUNTIME_PATH."../app/catch.log",$message,FILE_APPEND);
  1410. return true;
  1411. }
  1412. //
  1413. $data = method1();
  1414. if($data){
  1415. return;
  1416. }
  1417. $data = method2();
  1418. if($data){
  1419. return;
  1420. }
  1421. json_fail("获取数据失败");
  1422. }
  1423. public function getCropsInfo( ){
  1424. $addr = I('get.addr');
  1425. if(!$addr){
  1426. json_fail('addr param not exists!');
  1427. }
  1428. // 通过设备编号addr获取作物信息
  1429. $where = array('DeviceAddr'=>$addr);
  1430. $fields = "FirstCrop,SecondCrop,ThirdCrop,FourthCrop";
  1431. $crops = MM('dpsb_device')->field($fields)->where($where)->find();
  1432. $crops = array_values($crops);
  1433. /*
  1434. //组装信息
  1435. $unit_array = array('g'=>'斤','kg'=>'公斤','t'=>'吨');
  1436. for($i=0; $i<count($crops); $i++){
  1437. $crops[$i] = json_decode($crops[$i],true);
  1438. $crops[$i] = $crops[$i]['num'.($i+1)] .'号大棚:种植品种:'. $crops[$i]['variety'.($i+1)] .',种植农户:'.$crops[$i]['farmer'.($i+1)].',预计产量:'.$crops[$i]['output'.($i+1)] . $unit_array[$crops[$i]['unit'.($i+1)]] .'。';
  1439. }*/
  1440. $data = array('data'=>$crops);
  1441. echo json_encode($data,JSON_UNESCAPED_UNICODE);
  1442. }
  1443. public function setScreenMsg( ){
  1444. // 设备编号,几号棚,信息内容,token
  1445. $addr = I('get.addr');
  1446. $num = I('get.num');
  1447. $msg = urldecode( I('get.msg') );
  1448. $token = I('get.token');
  1449. //检查必填参数
  1450. if(!$addr || !$num || !$msg || !$token){
  1451. json_fail('Missing parame!');
  1452. }
  1453. //检查token
  1454. if($token != 'zndp'){
  1455. json_fail('Unauthorized token!');
  1456. }
  1457. //大棚信息对应字段(一、二、三、四组)
  1458. $shed = array(1=>'FirstCrop','SecondCrop','ThirdCrop','FourthCrop');
  1459. if(!$shed[$num]){
  1460. json_fail('Undefind number!');
  1461. }
  1462. //存入大棚设备dpsb_device表中
  1463. $where = array('DeviceAddr'=>$addr);
  1464. //$data = array($shed[$num] => $msg);
  1465. // 设置点阵屏信息(新)
  1466. $shed_data = json_decode(htmlspecialchars_decode($msg),true);
  1467. if( !$shed_data['num'] || !$shed_data['variety'] || !$shed_data['farmer'] || !$shed_data['output'] || !$shed_data['unit']){
  1468. json_fail('msg格式:{"num":"大棚编号","variety":"种植品种","farmer":"种植农户","output":"预计产量","unit":"单位"}');
  1469. }
  1470. $save_msg = array(
  1471. 'num'.$num => $shed_data['num'],
  1472. 'variety'.$num => $shed_data['variety'],
  1473. 'farmer'.$num => $shed_data['farmer'],
  1474. 'output'.$num => $shed_data['output'],
  1475. 'unit'.$num => $shed_data['unit'],
  1476. );
  1477. $data = array($shed[$num] => json_encode($save_msg, JSON_UNESCAPED_UNICODE));
  1478. $result = MM('dpsb_device')->createSave($where,$data);
  1479. if($result === false){
  1480. json_fail('Set failed,Please try again later!');
  1481. }
  1482. // 重启控制台APP
  1483. $host = '127.0.0.1';
  1484. $port = 10240;
  1485. $socket = new Jms\Network\TcpClient($host,$port);
  1486. $cmd = array(
  1487. "method" => "apiReboot",
  1488. "Addr"=>$addr,
  1489. );
  1490. $res = $socket->send(json_encode($cmd));
  1491. if(!$res['success']){
  1492. json_fail($res['message']);
  1493. }
  1494. json_success('Set successfully!');
  1495. }
  1496. public function syncFarmlandId2Redis( ){
  1497. //获取所有已绑定设备的大棚
  1498. $where = array(
  1499. 'FarmlandId' => array('NEQ',-1),
  1500. );
  1501. $fields = 'DeviceId,ChGroup,FarmlandId';
  1502. $farmland_list = MM('dpsb_chgroup')->field($fields)->where($where)->select();
  1503. if( empty($farmland_list) ){
  1504. json_fail('no data');
  1505. }
  1506. $redis = Redis("dpsb_farmland_list","hash");
  1507. foreach($farmland_list as $farmland){
  1508. // 添加到Redis
  1509. $key = 'DeviceId-'.$farmland['DeviceId'] .'-ChGroup-'.$farmland['ChGroup'];
  1510. $val = $farmland['FarmlandId'];
  1511. $hash = array($key => $val);
  1512. $result = $redis->add($hash);
  1513. var_dump($result);
  1514. }
  1515. }
  1516. }