analysislen($content_len); $result = $this->checklen($content_len, $content_str); if (empty($result)) { $errmsg = '内容位数错误'; Log::write($errmsg . ":" . $str, 'shouhuan'); throw new \Exception($errmsg); } $data = [ 'device_id_code' => $device_id_code, 'content_len' => $content_len, 'content_str' => $content_str, ]; $contentarr = $this->getcommandcontent($content_str); $command = $contentarr['command']; $data['command'] = $command; $data['content_arr'] = $contentarr['content']; $config = $this->getreceivecommandinfo($command); $data['config'] = $config; if (!$config) { $errmsg = '命令无解析配置 command:' . $command; Log::write($errmsg, 'shouhuan'); return false; } if (isset($field)) { return $data[$field]; } return $data; } /** * 内容解析 * * @param [type] $content_str * @return void * @author wj * @date 2023-08-19 */ public function getcommandcontent($content_str) { $content = explode(',', $content_str); $command = $content[0]; unset($content[0]); $data = [ 'command' => $command, 'content' => $content, ]; return $data; } /** * 解析终端发送命令长度 * * @param [type] $len * @return void * @author wj * @date 2023-08-18 */ public function analysislen($len) { $len = base_convert($len, 16, 10); return $len; } /** * 获取平台发送命令信息 * * @param [type] $command * @return void * @author wj * @date 2023-08-11 */ public function getsendcommandinfo($command) { $command = strtoupper($command); $data = [ //平台发送 'ZONE' => [ 'content' => [ 'command' => 'ZONE', 'zone' => '', ], 'kind' => 'send', 'need_back' => 1, ], 'UPLOAD' => [ 'content' => [ 'command' => 'UPLOAD', ], 'kind' => 'send', 'need_back' => 1, ], 'CR' => [ 'content' => [ 'command' => 'CR', ], 'kind' => 'send', 'need_back' => 1, ], 'SLEEPTIME' => [ 'content' => [ 'command' => 'CR', ], 'kind' => 'send', 'content_custom' => true, 'need_back' => 1, ], 'FALLDOWN' => [ 'content' => [ 'command' => 'FALLDOWN', 'is_open' => '', ], 'kind' => 'send', 'need_back' => 1, ], 'FACTORY' => [ 'content' => [ 'command' => 'FACTORY', ], 'kind' => 'send', 'need_back' => 1, ], 'SOS' => [ 'content' => [ 'command' => 'SOS', ], 'kind' => 'send', 'content_custom' => true, 'need_back' => 1, ], 'VERNO' => [ 'content' => [ 'command' => 'VERNO', ], 'kind' => 'send', 'need_back' => 1, ], 'LOWBAT' => [ 'content' => [ 'command' => 'LOWBAT', 'is_open' => '', ], 'kind' => 'send', 'need_back' => 1, ], 'POWEROFF' => [ 'content' => [ 'command' => 'POWEROFF', ], 'kind' => 'send', 'need_back' => 1, ], 'LSSET' => [ 'content' => [ 'command' => 'LSSET', 'content_custom' => true, ], 'kind' => 'send', 'need_back' => 1, ], 'PEDO' => [ 'content' => [ 'command' => 'PEDO', 'is_open' => '', ], 'kind' => 'send', 'need_back' => 1, ], 'PHL' => [ 'content' => [ 'command' => 'PEDO', ], 'kind' => 'send', 'content_custom' => true, 'need_back' => 1, ], 'REMIND' => [ 'content' => [ 'command' => 'REMIND', ], 'kind' => 'send', 'content_custom' => true, 'need_back' => 1, ], 'SILENCETIME2' => [ 'content' => [ 'command' => 'SILENCETIME2', ], 'kind' => 'send', 'content_custom' => true, 'need_back' => 1, ], 'BOOTOFF' => [ 'content' => [ 'command' => 'BOOTOFF', 'is_open' => '', 'bootup_time' => '', 'shutdown_time' => '', ], 'kind' => 'send', 'need_back' => 1, ], 'REMOVE' => [ 'content' => [ 'command' => 'REMOVE', 'is_open' => '', ], 'kind' => 'send', 'need_back' => 1, ], //平台回复 'LK' => [ 'content' => [ 'command' => 'LK', ], 'kind' => 'back', ], 'PING' => [ 'content' => [ 'command' => 'PING', 'isbind' => 1, ], 'kind' => 'back', ], 'KA' => [ 'content' => [ 'command' => 'KA', ], 'kind' => 'back', ], 'TEMP' => [ 'content' => [ 'command' => 'temp', ], 'kind' => 'back', ], 'BPHRT' => [ 'content' => [ 'command' => 'bphrt', ], 'kind' => 'back', ], 'HEART' => [ 'content' => [ 'command' => 'heart', ], 'kind' => 'back', ], 'BLOOD' => [ 'content' => [ 'command' => 'blood', ], 'kind' => 'back', ], 'OXYGEN' => [ 'content' => [ 'command' => 'oxygen', ], 'kind' => 'back', ], 'AL' => [ 'content' => [ 'command' => 'AL', ], 'kind' => 'back', ], ]; if (!isset($data[$command])) { return false; } return $data[$command]; } /** * 设置可解析数据 终端发送信息解析 * * @param [type] $command * @return void * @author wj * @date 2023-08-18 * analysis_digit 解析位数 * content 解析对应字段 * kind 类型 tsend 平台发送 tback平台回复 * need_back 是否需回复 1是 0否 没设置为0 * command 未设置则和键值相同 */ public function getreceivecommandinfo($command) { $command = strtoupper($command); $data = [ 'UD' => [ 'analysis_digit' => [1, 2, 4, 6, 8, 9, 10, 13, 14, 15, 16], 'content' => [ 'date', 'time', 'gps_long', 'gps_lat', 'speed', 'direction', 'poster', 'electric_quantity', 'step_number', 'roll_number', 'terminal_status', ], 'kind' => 'tsend', 'need_back' => 0, ], 'AL' => [ 'analysis_digit' => [1, 2, 4, 6, 8, 9, 10, 13, 14, 15, 16], 'content' => [ 'date', 'time', 'gps_long', 'gps_lat', 'speed', 'direction', 'poster', 'electric_quantity', 'step_number', 'roll_number', 'terminal_status', ], 'kind' => 'tsend', 'need_back' => 0, ], 'KA' => [ 'analysis_digit' => [1, 2, 3, 4], 'content' => [ 'date', 'step_number', 'roll_number', 'electric_quantity', ], 'kind' => 'tsend', 'need_back' => 1, ], 'LK' => [ 'analysis_digit' => null, 'content' => null, 'kind' => 'tsend', 'need_back' => 1, ], 'BPHRT' => [ 'analysis_digit' => [1, 2, 3], 'content' => [ 'blood_height_pressure', 'blood_low_pressure', 'heart_rate', ], 'kind' => 'tsend', 'need_back' => 1, 'command' => 'bphrt', ], 'TEMP' => [ 'analysis_digit' => [1], 'content' => [ 'temp', ], 'kind' => 'tsend', 'need_back' => 1, 'command' => 'temp', ], 'HEART' => [ 'analysis_digit' => [1], 'content' => [ 'heart_rate', ], 'kind' => 'tsend', 'need_back' => 1, 'command' => 'heart', ], 'BLOOD' => [ 'analysis_digit' => [1, 2], 'content' => [ 'blood_height_pressure', 'blood_low_pressure', ], 'kind' => 'tsend', 'need_back' => 1, 'command' => 'blood', ], 'OXYGEN' => [ 'analysis_digit' => [1], 'content' => [ 'oxygen', ], 'kind' => 'tsend', 'need_back' => 1, 'command' => 'oxygen', ], //终端回复 //ZONE UPLOAD CR SLEEPTIME FALLDOWN FACTORY SOS VERNO LOWBAT //POWEROFF LSSET PEDO PHL REMIND SILENCETIME2 BOOTOFF REMOVE 'ZONE' => [ 'analysis_digit' => null, 'content' => null, 'kind' => 'tback', ], 'UPLOAD' => [ 'analysis_digit' => null, 'content' => null, 'kind' => 'tback', ], 'CR' => [ 'analysis_digit' => null, 'content' => null, 'kind' => 'tback', ], 'SLEEPTIME' => [ 'analysis_digit' => null, 'content' => null, 'kind' => 'tback', ], 'FALLDOWN' => [ 'analysis_digit' => null, 'content' => null, 'kind' => 'tback', ], 'SOS' => [ 'analysis_digit' => null, 'content' => null, 'kind' => 'tback', ], 'VERNO' => [ 'analysis_digit' => [1], 'content' => ['version'], 'kind' => 'tback', ], 'LOWBAT' => [ 'analysis_digit' => null, 'content' => null, 'kind' => 'tback', ], 'POWEROFF' => [ 'analysis_digit' => null, 'content' => null, 'kind' => 'tback', ], 'LSSET' => [ 'analysis_digit' => null, 'content' => null, 'kind' => 'tback', ], 'PEDO' => [ 'analysis_digit' => null, 'content' => null, 'kind' => 'tback', ], 'PHL' => [ 'analysis_digit' => null, 'content' => null, 'kind' => 'tback', ], 'REMIND' => [ 'analysis_digit' => null, 'content' => null, 'kind' => 'tback', ], 'SILENCETIME2' => [ 'analysis_digit' => null, 'content' => null, 'kind' => 'tback', ], 'BOOTOFF' => [ 'analysis_digit' => null, 'content' => null, 'kind' => 'tback', ], 'REMOVE' => [ 'analysis_digit' => null, 'content' => null, 'kind' => 'tback', ], ]; if (!isset($data[$command])) { return false; } return $data[$command]; } /** * 获取回复权重 * * @param [type] $command * @return void * @author wj * @date 2023-08-11 */ public function getsendweight($command) { $weight = -1; switch ($command) { case 'POWEROFF': //关机 $weight = 99; break; case 'RESET': //重启 $weight = 98; //硬件未测试 break; //平台回复命令 case 'AL': case 'KA': case 'LK': case 'PING': case 'BPHRT': case 'TEMP': case 'HEART': case 'BLOOD': case 'OXYGEN': $weight = 1; break; //平台发送命令 case 'ZONE': case 'UPLOAD': case 'CR': case 'SLEEPTIME': case 'FALLDOWN': case 'FACTORY': case 'SOS': case 'VERNO': case 'LOWBAT': case 'POWEROFF': case 'LSSET': case 'PEDO': case 'PHL': case 'REMIND': case 'SILENCETIME2': case 'BOOTOFF': case 'REMOVE': $weight = 0; break; default: $weight = -1; break; } if ($weight < 0) { //不需设置 发送信息 return false; } return $weight; } /** * 获取数据值 * * @param [type] $data * @param [type] $command * @return void * @author wj * @date 2023-08-14 */ public function getdata($config, $content_arr) { $analysis_digit = $config['analysis_digit']; $config_content = $config['content']; $data = []; if (is_array($analysis_digit)) { foreach ($analysis_digit as $key => $value) { if (isset($content_arr[$value])) { if (isset($config_content[$key])) { $item_key = $config_content[$key]; $item_value = $content_arr[$value]; $data[$item_key] = $item_value; } } } } if (isset($data['time'])) { $time = $data['time']; $data['time'] = $this->gettime($time); } if (isset($data['date'])) { $date = $data['date']; $data['date'] = $this->getdate($date); } if (isset($data['terminal_status'])) { $terminalstatus = $data['terminal_status']; $terminal_status_arr = $this->getterminalstatus($terminalstatus); unset($data['terminal_status']); $data['status_type'] = $terminal_status_arr['status_type']; $data['alarm_type'] = $terminal_status_arr['alarm_type']; } return $data; } /** * 时间解析 * * @param [type] $time * @return void * @author wj * @date 2023-08-19 */ public function gettime($time) { $hour = substr($time, 0, 2); $minute = substr($time, 2, 2); $second = substr($time, 4, 2); $time = $hour . ':' . $minute . ':' . $second; return $time; } /** * 日期解析 * * @return void * @author wj * @date 2023-08-15 */ public function getdate($date) { $day = substr($date, 0, 2); $month = substr($date, 2, 2); $year = substr($date, 4, 2); $year1 = date('Y'); $year2 = substr($year1, 0, 2); $year = $year2 . $year; if ($year != $year1) { $day = date('Y-m-d'); } else { $day = $year . '-' . $month . '-' . $day; } return $day; } /** * 解析终端状态 * * @param [type] $terminal_status * @return void * @author wj * @date 2023-08-19 */ public function getterminalstatus($terminal_status) { $terminal_status = str_split($terminal_status); foreach ($terminal_status as $key => $value) { $value = base_convert($value, 16, 2); $value = str_pad($value, 4, "0", STR_PAD_LEFT); $terminal_status[$key] = $value; } $terminal_status_str = implode("", $terminal_status); $mid = mb_strlen($terminal_status_str) / 2; $alarm = substr($terminal_status_str, 0, $mid); $first_num = strpos($alarm, 1); $end_num = strrpos($alarm, 1); if ($first_num != $end_num) { Log::write("状态解析错误:报警:" . $terminal_status . " " . $terminal_status_str, 'shouhuan'); } //16:SOS报警;17:低电报警;20:手环拆除报警;21:跌倒报警;22:心率异常报警 $alarm_type = $first_num; $status = substr($terminal_status_str, $mid); $first_num = strpos($status, 1); $end_num = strrpos($status, 1); if ($first_num != $end_num) { Log::write("状态解析错误:状态:" . $terminal_status . " " . $terminal_status_str, 'shouhuan'); } //1:低电状态;2:出围栏状态;3:进围栏状态;4:手环戴上取下状态;5:手表运行静止状态 $status_type = $first_num + 1; $data = [ 'alarm_type' => $alarm_type, 'status_type' => $status_type, ]; return $data; } // /** // * 解析报警 // * // * @param [type] $first_num // * @return void // * @author wj // * @date 2023-08-19 // */ // public function getalarm($first_num) // { // $data = [ // 16 => 'SOS报警', // 17 => '低电报警', // 18 => '出围栏报警', // 19 => '进围栏报警', // 20 => '手环拆除报警', // 21 => '跌倒报警', // 22 => '心率异常报警', // ]; // if (isset($data[$first_num])) { // return $data[$first_num]; // } // return false; // } // /** // * 解析状态 // * // * @param [type] $first_num // * @return void // * @author wj // * @date 2023-08-19 // */ // public function getstatus($first_num) // { // $data = [ // 0 => '低电状态', // 1 => '出围栏状态', // 2 => '进围栏状态', // 3 => '手环戴上取下状态', // 4 => '手表运行静止状态', // ]; // if (isset($data[$first_num])) { // return $data[$first_num]; // } // return false; // } // ̄へ ̄-----------内容解析结束---------------- ̄へ ̄ // ̄へ ̄-----------业务处理开始---------------- ̄へ ̄ /** * 获取设别表id * * @return void * @author wj * @date 2023-08-11 */ public function getfacilityid($device_id_code) { $m_f = new FacilityModel(); $where = ['code' => $device_id_code, 'status' => 1]; $finfo = $m_f->getInfo($where, ['id']); if (empty($finfo)) { throw new \Exception("设备信息错误:" . $device_id_code); return false; } $id = $finfo['id']; return $id; } /** * 保存接收信息队列 * * @param [type] $data * @return void * @author wj * @date 2023-08-14 */ public function savereceivequeue($data) { $m_srq = new ShreceivequeueModel(); $data = [ 'msg' => $data, 'createtime' => date('Y-m-d H:i:s'), ]; $id = $m_srq->insertData($data); if (empty($id)) { return false; } return true; } /** * 获取接收信息队列列表 * * @param [type] $page * @param [type] $size * @return void * @author wj * @date 2023-08-14 */ public function getreceivequeuelist($page = null, $size = null) { $m_srq = new ShreceivequeueModel(); $where = ['status' => 0]; $size = empty($size) ? 20 : $size; if (empty($page)) { $count = $m_srq->getList($where, 'count'); $totalpage = ceil($count / $size); $data = ['totalpage' => $totalpage, 'size' => $size]; return $data; } else { $list = $m_srq->getList($where, '*', $page, $size, 'id asc'); if (empty($list)) { //Log::write("手环接收信息队列-无数据", 'shouhuan'); return false; } $list = $list->toArray(); foreach ($list as $key => $value) { $id = $value['id']; if (1 != $value['status']) { $row = $m_srq->updateinfo(['id' => $id], ['status' => 1]); if (1 != $row) { $msg = "Shreceivequeue id:" . $id . " 修改失败"; Log::write($msg, 'shouhuan'); unset($list[$key]); } } } return $list; } } /** * 获取发送信息队列列表 * * @param [type] $page * @param [type] $size * @return void * @author wj * @date 2023-08-14 */ public function getsendqueuelist($device_id_code, $page = null, $size = null) { $m_ssq = new ShsendqueueModel(); $where = ['status' => 0, 'device_id_code' => $device_id_code]; $size = empty($size) ? 20 : $size; if (empty($page)) { $count = $m_ssq->getList($where, 'count'); $totalpage = ceil($count / $size); $data = ['totalpage' => $totalpage, 'size' => $size]; return $data; } else { $list = $m_ssq->getList($where, '*', $page, $size, 'id asc,weight desc'); if (empty($list)) { Log::write("手环发送信息队列-无数据", 'shouhuan'); return false; } $list = $list->toArray(); foreach ($list as $key => $value) { $id = $value['id']; if (1 != $value['status']) { $row = $m_ssq->updateinfo(['id' => $id], ['status' => 1]); if (1 != $row) { $msg = "Shsendqueue id:" . $id . " 修改失败"; Log::write($msg, 'shouhuan'); unset($list[$key]); } } } return $list; } } /** * 保存手环信息 * * @return void * @author wj * @date 2023-08-14 */ public function saveshinfo($facility_id, $device_id_code, $data, $original_str) { $command = $data['command']; $content_arr = $data['content_arr']; $config = $data['config']; $data = $this->getdata($config, $content_arr); $m_sri = new ShinfoModel(); $m_srir = new ShreceiveredocdeModel(); $m_sa = new ShalarmlistModel(); if ('AL' == $command) { //手环警报信息 $data['alarm_from_type'] = 1; $said = $m_sa->insertData($data); if (empty($said)) { $msg = "报警信息添加失败:" . $original_str; Log::write($msg, 'shouhuan'); throw new \Exception($msg); } } else { //手环基础信息修改 $sriData = $data; $sriwhere = [ 'facility_id' => $facility_id, 'device_id_code' => $device_id_code, ]; $sriinfo = $m_sri->getInfo($sriwhere); if (empty($sriinfo)) { $sriData = [ 'device_id_code' => $device_id_code, 'facility_id' => $facility_id, ]; $sriinsertData = $sriData; $sriinsertData['createtime'] = date('Y-m-d H:i:s'); $sriinsertData['updatetime'] = date('Y-m-d H:i:s'); $sriinsertData = $m_sri->formatinfo($sriinsertData); $sriid = $m_sri->insertData($sriinsertData); if (empty($sriid)) { throw new \Exception("设备信息添加失败:" . $device_id_code); } } else { $sriid = $sriinfo['id']; $sriupdateData = $sriData; $sriupdateData['updatetime'] = date('Y-m-d H:i:s'); $sriupdateData = $m_sri->formatinfo($sriupdateData); $row = $m_sri->updateinfo(['id' => $sriid], $sriupdateData); if (empty($row)) { throw new \Exception("设备信息修改失败:" . $device_id_code); } } //接收信息历史添加 $sririnsertData['facility_id'] = $facility_id; $sririnsertData['device_id_code'] = $device_id_code; $sririnsertData['original_str'] = $original_str; $sririnsertData['content'] = json_encode($sriData); $sririnsertData['command'] = $command; $sririnsertData['createtime'] = date('Y-m-d H:i:s'); if ('tback' == $config['kind']) { $is_back_msg = true; $sririnsertData['is_back_msg'] = 0; } else { $is_back_msg = false; $sririnsertData['is_back_msg'] = 1; } $sririd = $m_srir->insertData($sririnsertData); if (empty($sririd)) { throw new \Exception("设备历史信息添加失败:" . $device_id_code); } if ($is_back_msg) { //处理回复信息 $m_ssl = new ShsendlistModel(); $where = [ 'is_success' => 0, 'is_send' => 1, 'command' => $command, ]; $sslinfo = $m_ssl->getInfo($where); if ($sslinfo) { //发送成功状态回写 $sslid = $sslinfo['id']; $sslupdateData = ['is_success' => 1]; $m_ssl->updateinfo(['id' => $sslid], $sslupdateData); $srirupdateData = ['send_list_id' => $sslid]; $m_srir->updateinfo(['id' => $sririd], $srirupdateData); } } } } /** * 创建发送信息 * * @param [type] $data * @param [type] $command * @return void * @author wj * @date 2023-08-14 */ public function createsendmsg($facility_id, $device_id_code, $data, $command, $param = []) { $infoarr = $this->getsendcommandinfo($command); if (!$infoarr) { Log::write("无对应命令数据1:" . $command, 'shouhuan'); Log::write($data, 'shouhuan'); return false; } $command = $data['command']; $content_arr = $data['content_arr']; $config = $data['config']; $m_ssl = new ShsendlistModel(); $commandxy = "3G"; //仅创建 if ('back' == $config['kind']) { $content = $config['content']; $content = implode(',', $content); $send_type = 0; $is_success = 1; } if ('send' == $config['kind']) { $content = $config['content']; $useconmmand = $content['command']; $content_custom = $config['content_custom']; $need_back = $config['need_back']; if ($content_custom) { $functionname = 'get' . $command . "Commandinfo"; if (method_exists($this, $functionname)) { $content = $useconmmand . "," . $this->$functionname($param); } else { throw new \Exception($command . "自定义方法不存在"); } } else { $content = implode(',', $content_arr); } $send_type = 1; if ($need_back) { $is_success = 0; } else { $is_success = 1; } } $weight = $this->getsendweight($command); $msgdata = [ 0 => $commandxy, 'device_id_code' => $device_id_code, 'len' => str_pad(dechex(mb_strlen($content)), 4, "0", STR_PAD_LEFT), 'content' => $content, ]; $msg = '[' . implode('*', $msgdata) . ']'; $sslInsertData = [ 'facility_id' => $facility_id, 'device_id_code' => $device_id_code, 'command' => $command, 'send_msg' => $msg, 'send_weight' => $weight, 'send_time' => date('Y-m-d H:i:s'), 'is_success' => $is_success, 'send_type' => $send_type, ]; $sslid = $m_ssl->insertData($sslInsertData); if (empty($sslid)) { throw new \Exception("发送数据添加失败"); } $data = [ 'msg' => $msg, 'weight' => $weight, 'createtime' => date('Y-m-d H:i:s'), 'facility_id' => $facility_id, 'device_id_code' => $device_id_code, 'send_list_id' => $sslid, ]; $m_ssq = new ShsendqueueModel(); $id = $m_ssq->insertData($data); if (empty($id)) { throw new \Exception("发送队列数据添加失败"); } return true; } /** * 创建sos电话设置命令 * 最多三个电话 * * @return void * @author wj * @date 2023-08-21 */ public function getSOSCommandinfo($param) { if (count($param) <= 3) { throw new \Exception("未设置电话"); } if (count($param) > 3) { throw new \Exception("设置电话数量过多"); } foreach ($param as $key => $value) { //判断是否为手机号 //暂不处理 } $info = implode(",", $param); return $info; } /** * 设置跌倒灵敏度命令 * [3G*358800006072996*0009*LSSET,3+6] * * @return void * @author wj * @date 2023-08-21 */ public function getLSSETCommandinfo($param) { if (2 != count($param)) { throw new \Exception("LSSET参数错误"); } foreach ($param as $key => $value) { if (!is_numeric($value)) { throw new \Exception("LSSET参数错误:" . $value); } } $info = $param[0] . "+" . $param[1]; return $info; } /** * 设置电话本 * 最多10条 *{telno=>'',name=>''} * @param [type] $param * @return void * @author wj * @date 2023-08-21 */ public function getPHLCommaninfo($param) { if (50 > count($param)) { throw new \Exception("PHL参数错误"); } if (0 != count($param) % 2) { throw new \Exception("PHL参数长度错误"); } $usedata = []; foreach ($param as $key => $value) { $telno = $value['telno']; $name = $value['name']; //电话号码 if (20 > mb_strlen($telno)) { throw new \Exception("PHL电话号码错误:" . $telno); } $name = $this->srtingToUnicode($name); $usedata[] = $telno; $usedata[] = $name; } $info = implode(",", $usedata); return $info; } /** * 设置电话本 * 最多10条 *{[time=>'',isopen=>'','type'=>'','weeks'=>[]]} * weeks 数组 每个1到7 周日到周六 * 最多设置三个 * @param [type] $param * @return void * @author wj * @date 2023-08-21 */ /* 08:10-1-1:闹钟时间 8:10,打开,响铃一次 08:10-1-2:闹钟时间 8:10,打开,每天响铃 08:10-1-3-0111110:闹钟时间 8:10,打开,自定义周一至周五打开 最左边是周日,最右边是周六,即 0111110 的顺序是:周日,周一,周二,周三,周四,周五,周 六(1 为打开,0 为关闭),其中周一至周五打开闹钟 */ public function getREMINDCommandinfo($param) { if (3 > count($param)) { throw new \Exception("PHL参数错误"); } $usedata = []; $useweeks = ["0", "0", "0", "0", "0", "0", "0"]; foreach ($param as $key => $value) { $time = date('H:i', $value['time']); $isopen = $value['isopen']; $type = $value['type']; $weeks = $param['weeks']; if (3 == $type) { foreach ($weeks as $wkey => $wvalue) { $useweeks[$wvalue - 1] = 1; } $useweeks = implode("", $useweeks); $type = $useweeks; } $usedata[] = $time . "-" . $isopen . "-" . $type; } $usedata = implode(",", $usedata); return $usedata; } /** * 静默时间段测试 *{[starttime=>'',endtime=>'',isopen=>'',weeks=>[]]} * weeks 数组 每个1到7 周日到周六 * 最多设置三个 * * @return void * @author wj * @date 2023-08-21 */ /* [DW*334588000000156*0038*SILENCETIME2,7:30-21:10-1-0111110,7:30-21:10-1-0111110,7: 30-21:10-0-0111110] 设置上课禁用时间段范围,拦截终端的任何来电。格式为“起始时间-结束时间-自定义星期几”, 比 如上面的 7:30-21:00-0111110,则表示周一到周五 7:30 到 21:00 之间上课禁用生效,起始时间 默认大于结束时间。 总开关:0 为关,1 为开 关于自定义星期几的规则:最左边是周日,最右边是周六,即 0111110 的顺序是:周日,周一,周 二,周三,周四,周五,周六(1 为打开,0 为关闭),所以上面的意思是周一至周五打开上课禁 用。 */ public function getSILENCETIME2Commandinfo($param) { if (3 > count($param)) { throw new \Exception("SILENCETIME2参数错误"); } $usedata = []; $useweeks = ["0", "0", "0", "0", "0", "0", "0"]; foreach ($param as $key => $value) { //未比较时间大小 $starttime = date('H:i', $value['starttime']); $endtime = date('H:i', $value['endtime']); $isopen = $value['isopen']; $weeks = $param['weeks']; foreach ($weeks as $wkey => $wvalue) { $useweeks[$wvalue - 1] = 1; } $useweeks = implode("", $useweeks); $usedata[] = $starttime . "-" . $endtime . "-" . $isopen . "-" . $useweeks; } $usedata = implode(",", $usedata); return $usedata; } /** * 睡眠时间段设置 *{starttime=>'',endtime=>''} * * @return void * @author wj * @date 2023-08-21 */ public function getSLEEPTIMECommandinfo($param) { if (2 > count($param)) { throw new \Exception("SLEEPTIME参数错误"); } $starttime = date('H:i', $param['starttime']); $endtime = date('H:i', $param['endtime']); $usedata = $starttime . "-" . $endtime; return $usedata; } /** * 发送成功 删除发送数据 * * @param [type] $item * @return void * @author wj * @date 2023-08-21 */ public function sendmsgsuccess($item) { $m_ssq = new ShsendqueueModel(); $m_ssl = new ShsendlistModel(); $ssqid = $item['id']; if ($item['list_id']) { $list_id = $item['list_id']; $sslwhere = ['id' => $list_id, 'is_send' => 0]; $sslinfo = $m_ssl->getInfo($sslwhere); if ($sslinfo) { $row = $m_ssl->updateinfo(['id' => $sslinfo['id']], ['is_send' => 1, 'send_time' => date('Y-m-d H:i:s')]); } } $ssqwhere = ['id' => $ssqid]; $ssqinfo = $m_ssq->getInfo($ssqwhere); if ($ssqinfo) { $m_ssq->deleteinfobyid($ssqid); } } /** * 解析成功 删除接收数据 * * @param [type] $item * @return void * @author wj * @date 2023-08-21 */ public function receivemsgsuccess($item) { $m_srq = new ShreceivequeueModel(); $srqid = $item['id']; $srqwhere = ['id' => $srqid, 'status' => 1]; $srqinfo = $m_srq->getInfo($srqwhere); if ($srqinfo) { $m_srq->deleteinfobyid($srqid); } } /** * 初始化手环接收信息解析 * * @return void * @author wj * @date 2023-08-15 */ public function initanalysisShoneReceiveMsg() { $m_srq = new ShreceivequeueModel(); $where = ['status' => 1]; $m_srq->updateinfo($where, ['status' => 0]); } /** * 测试使用 * * @param [type] $data * @return void * @author wj * @date 2023-08-21 */ public function showfortest($data) { $strdata = $this->getline($data); $content = $strdata['content_str']; $content = $this->getcommandcontent($content); $command = $content[0]; $showcommands = [ 'SOS', 'CR', 'UPLOAD', 'SLEEPTIME', 'ZONE', 'FALLDOWN', 'APPLOCK', 'FACTORY', 'VERNO', 'LOWBAT', 'UD', 'POWEROFF', 'MESSAGE', 'WALKTIME', 'PEDO', 'PHB', 'PHL', 'REMIND', 'SILENCETIME2', 'BOOTOFF', 'REMOVE', 'INFO', 'AL', 'LSSET', ]; if (in_array($command, $showcommands)) { var_dump(date('Y-m-d H:i:s')); var_dump($data); } } /** * 设置设备上线 * * @return void * @author wj * @date 2023-08-21 */ public function setonlineinfo($device_id_code) { $m_si = new ShinfoModel(); $where = ['device_id_code' => $device_id_code, 'online_statis' => 0]; $finfo = $m_si->getInfo($where, ['id', 'online_statis']); if ($finfo) { $facility_id = $finfo['id']; $m_si->setonlineinfobyid($facility_id); } } /** * 设置设备下线 * * @return void * @author wj * @date 2023-08-21 */ public function setofflineinfo() { $m_si = new ShinfoModel(); $list = $m_si->getcheckupdatetimelist(); $list = (array) $list; if (!empty($list)) { $facility_ids = array_column($list, 'id'); $m_si->setofflineinfobyids($facility_ids); } } //工具方法 /** * unicode 编码 * * @param [type] $str * @return void * @author wj * @date 2023-08-21 */ public function srtingToUnicode($str) { $unicode = ''; $arr = str_split($str); foreach ($arr as $key => $value) { $char = bin2hex(iconv('UTF-8', 'UCS-2BE', $value)); $char = str_pad($char, 4, '0', STR_PAD_LEFT); $arr[$key] = $char; } $unicode = implode("", $arr); return $unicode; } /** * unicode 解码 * * @param [type] $str * @return void * @author wj * @date 2023-08-21 */ public function unicodeToChn($str) { $arr = str_split($str); $items = []; $item = ""; foreach ($arr as $key => $value) { $index = $key + 1; if (0 != $index % 4) { $item .= $value; } else { $item = ""; $items[] = $item; } } foreach ($items as $key => $value) { $char = hex2bin($value); $char = iconv('UCS-2BE', 'UTF-8', $char); $items[$key] = $char; } $info = implode("", $items); return $info; } /** * 拆包 * * @return void * @author wj * @date 2023-08-15 */ public function unpack($data) { $arr = explode("][", $data); foreach ($arr as $key => $value) { if ($value[0] !== "[") { $arr[$key] = '[' . $value; } if ($value[mb_strlen($value) - 1] !== "]") { $arr[$key] .= "]"; } } return $arr; } }