<?php namespace App\Http\Controllers\Auth; use Illuminate\Support\Facades\DB; use App\Laravue\Models\Users; use Illuminate\Http\Request; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\Redis; use App\Http\Controllers\DevicesController; use Illuminate\Support\Facades\Config; use App\Http\Controllers\Auth\SwooleCommandMeTcpController; use App\Http\Controllers\SmsailiyunController; class ZehongTcpController extends Controller { //获取 tcp 上传数据 public function swooletcplist($data = '') { if ($data != '') { return $this->substrdata($data); } } // 解开数据包 protected function substrdata($data) { if (is_string($data) && strlen($data) == 26) { $deviceId = substr($data, 0, 15); // 设备编号 $status = substr($data, 15, 1); // 状态 $devicenp = substr($data, 16, 3); // 浓度 $devicefamen = substr($data, 19, 1); $devicechongqi = substr($data, 20, 1); $devicezijian = substr($data, 21, 1); $devicecrc = substr($data, 22, 4); $isdata = substr($data, 0, 22); // return $this->jsonSuccessData([$this->getPrc($isdata),$devicecrc]); if($this->getPrc($isdata) == $devicecrc){ $data = ['id'=>$deviceId,'status'=>$status,'np'=>$devicenp,'famen'=>$devicefamen,'chongqi'=>$devicechongqi,'zijian'=>$devicezijian]; $totcp = json_decode($this->mysqldb($data),true); if ($totcp == "No equipment"){ return $totcp; } $totcpdata = $totcp['devicenum'] . $totcp['device_control'] . $devicechongqi . $devicezijian; $crcdata = $this->getPrc($totcpdata); return $totcpdata .$crcdata ; } } else { return "Data format error"; } } //解出prc protected function getPrc($msg) { /** * If your input string is HEX-formatted you should comment #15 line * for example: $msg="0123" equals to 0x0123 without leading 0x */ //conversion input string to plain HEX string. See comment above $msg = bin2hex($msg); //pack HEX-formatted $msg to the pure HEX array $data = pack('H*', $msg); //initialize crc as start HEX value; $crc = 0xFFFF; //loop $data array of HEX bytes for ($i = 0; $i < strlen($data); $i++) { //xor bits in the first byte of HEX value $crc ^= ord($data[$i]); //loop to shift every of 8 bits for ($j = 8; $j != 0; $j--) { //shift bits to the right and xor with polynome if (($crc & 0x0001) != 0) { $crc >>= 1; $crc ^= 0xA001; } else $crc >>= 1; } } //return the result as HEX-formatted string $data = strrev(sprintf('%04X', $crc)); $crc1 = strrev(substr($data, 0, 2)); $crc2 = strrev(substr($data, 2, 2)); return $crc1 . $crc2; } //获取上报数据从数据库查询 public function mysqldb($data){ if($data != []){ // 报警提醒 $meTcp = new SwooleCommandMeTcpController(); $alarmData = $data['id'] . '/' . $data['status'] . '/' . $data['np']; $meTcp->swooletcplist($alarmData); $this->smsphone($data); $datainfo = DB::table('device') ->where('devicenum','=',$data['id']) ->update(['nd'=>intval($data['np']),'devicepolice'=>$data['status'] == 0 ? '1' : $data['status'],'update_time'=>time(),'shutoff_status'=>$data['famen']]); $todata = DB::table('device') ->where('devicenum','=',$data['id']) ->select('devicenum','nd','device_control','devicepolice') ->first(); if ($todata){ return json_encode($todata); }else{ return json_encode("No equipment"); } } } // 发送手机报警信息 public function smsphone($data){ if(Redis::get('smsyanshi') != ''){ if($data['status'] != 1 || $data['status'] != 0){ $sms = new SmsailiyunController(); $code = json_encode($sms->sendSms(),true); if($code['Message'] == 'OK' && $code['Code'] == 'OK'){ Redis::set('smsyanshi',$code); } } } } }