decode($body); $type = 100; foreach ($data['warning'] as $k => $v) { if ($v) { $type = $k; break; } } $box_no = $data['box_no']; $bike_no = $_SESSION['bike_no']; switch ($type) { case 0: // 震动告警 self::log('震动告警:' . $box_no, 'WARNING'); $type = WarningLogMap::TYPE_WARNING_BIKE_SHOCK; $error_grade = WarningLogMap::ERROR_GRADE_MINOR; if ($this->is_throw_num_time($box_no, 'warning_log_' . $type, 3, 10)) { $this->warningLog($bike_no, $box_no, $data['status'], $body, $type, ($error_grade + 1)); } else { $this->warningLog($bike_no, $box_no, $data['status'], $body, $type, $error_grade); } break; case 1: //外部电池移除 self::log('外部电池移除:' . $box_no, 'WARNING'); $this->redis->setex("cache:warnning:{$type}:{$box_no}", 320, 1); Timer::add(300, function ($box_no, $type, $bike_no, $body, $data) { // 检测电池是否接入 if ($this->redis->exists("cache:warnning:{$type}:{$box_no}")) { $type = WarningLogMap::TYPE_WARNING_CLOSE_ELECTRIC; $error_grade = WarningLogMap::ERROR_GRADE_MINOR; $this->warningLog($bike_no, $box_no, $data['status'], $body, $type, $error_grade); } }, array($box_no, $type, $bike_no, $body, $data), false); break; case 2: //位移告警 self::log('位移告警:' . $box_no, 'WARNING'); $type = WarningLogMap::TYPE_WARNING_WHEEL_MOVE; $error_grade = WarningLogMap::ERROR_GRADE_MINOR; $this->warningLog($bike_no, $box_no, $data['status'], $body, $type, $error_grade); break; case 3: //温度告警 self::log('温度告警:' . $box_no, 'WARNING'); break; case 4: //自动落锁(ACC断开) self::log('自动落锁:' . $box_no, 'WARNING'); $status = json_decode(file_get_contents(Config['close_order_api_url'] . "&box_no={$box_no}&bike_no={$bike_no}&type=静止30分钟"), true); break; case 5: case 6: break; case 7: // 终端电量告警 self::log('终端电量告警:' . $box_no, 'WARNING'); $type = WarningLogMap::TYPE_BATTERY_LOW; $error_grade = WarningLogMap::ERROR_GRADE_MINOR; $this->warningLog($bike_no, $box_no, $data['status'], $body, $type, $error_grade); break; case 8: // 外部电量告警 self::log('外部电量告警:' . $box_no, 'WARNING'); $status = json_decode(file_get_contents(Config['close_order_api_url'] . "&box_no={$box_no}&bike_no={$bike_no}&type=电量低&position=4"), true); self::log($box_no, 'LOCATION_BATTERY_LOW_AUTO_ORDER', self::$LOG_COMMON); break; case 9: // 外部电池接入 self::log('外部电池接入:' . $box_no, 'WARNING'); //删除断电检测 $this->redis->del("cache:warnning:1:{$box_no}"); //删除电池缓存 $key = "cache:min:update_stop_bike_battery:{$box_no}"; $this->redis->del($key); $this->redis->setex("cache:open_battery:{$box_no}", 60, 1); BikeControl::nowBoxStatus($box_no); Timer::add(30, function ($box_no) { BikeControl::nowBoxStatus($box_no); }, array($box_no), false); Timer::add(60, function ($box_no) { BikeControl::nowBoxStatus($box_no); }, array($box_no), false); break; case 10: //ACC接通 self::log('ACC接通:' . $box_no, 'WARNING'); break; case 11: //ACC断开 self::log('ACC断开:' . $box_no, 'WARNING'); break; case 12: //移动告警 self::log('移动告警:' . $box_no, 'WARNING'); $type = WarningLogMap::TYPE_WARNING_BIKE_SHOCK; $error_grade = WarningLogMap::ERROR_GRADE_MINOR; $this->warningLog($bike_no, $box_no, $data['status'], $body, $type, $error_grade); break; case 13: //后座锁关闭 self::log('后座锁关闭:' . $box_no, 'WARNING'); BikeControl::nowBoxStatus($box_no); break; case 14: //后座锁打开 self::log('后座锁打开:' . $box_no, 'WARNING'); break; } return $this->response(); } /** * 解析装载的状态消息 * @param $body * @return array * User: Mead */ private function decode($body) { $top34Data = $this->decodeWeiKeMuTop34($body); $i = 34; // 告警消息 $warning = self::stitching($body, $i, 2); // i=34 $i += 2; // 定位类型 $location_type = self::stitching($body, $i, 1); // i=36 $i += 1; //ACC状态 $acc_status = self::stitching($body, $i, 1); // i=37 $i += 1; // 动态计算 $yjlx = self::stitching($body, $i, -1); // i=38 return array_merge($top34Data, [ 'warning' => self::handleWarning($warning), 'location_type' => self::handleLocationType($location_type),//0为基站定位 1为卫星定位 'acc_status' => self::handleACCStatus($acc_status),// 1:ACC接通;0:ACC断开 ]); } /** * handleWarning 解析告警 * * @param $warning * @param int $offset * @param int $len * @return array * @author Fx * */ private static function handleWarning($warning, $offset = 0, $len = 16) { $data = self::handleU2($warning); return array_slice($data, $offset, $len); } private static function handleLocationType($location_type) { $data = self::handleU1($location_type); return $data[0]; } private static function handleACCStatus($acc_status) { $data = self::handleU1($acc_status); return $data[0]; } /** * 告警响应 * @param $login_type * @return array * User: Mead */ public function response($login_type = '00') { $body = [ '5b', '0000' ]; return $body; } }