' . $box_no, "log", self::$LOG_DEV); $_SESSION['box_no'] = $imei; if (!Gateway::getUidByClientId($client_id)) { Gateway::bindUid($client_id, $imei); } if (!isset($_SESSION['bike_no'])) { $_SESSION['bike_no'] = self::byBoxNoGetBikeNoStatic($box_no); } if (!Gateway::isUidOnline($imei)) { //离线检查 if (self::$redis->exists('bike:offline:' . $box_no)) { self::log($box_no, 'EVENT_ONLINE', self::$LOG_MAJOR); $cols['is_link'] = \App\Maps\BikeMap::LINK_ONLINE; self::$db->update('bikes')->where('box_no = ' . $box_no)->cols($cols)->query(); self::$redis->del('bike:offline:' . $box_no); } } $response_body = ''; switch ($cmd) { case '5a': //状态 self::log('CMD==>状态', "log", self::$LOG_DEV); $response_body = (new StatusTransform($param))->main($body); break; case '5b': //登录 // self::log('CMD==>登录', "log", self::$LOG_DEV); $response_body = (new LoginTransform($param))->main($body); break; case '5c': self::log('CMD==>控制', "log", self::$LOG_DEV); $response_body = (new ControlTransform($param))->main($body); break; case '5d': self::log('CMD==>声音', "log", self::$LOG_DEV); $response_body = (new VoiceTransform($param))->main($body); break; case '5e': self::log('CMD==>心跳', "log", self::$LOG_DEV); $response_body = (new HeartTransform($param))->main($body); break; case '51': //告警消息 self::log('CMD==>告警消息', "log", self::$LOG_DEV); $response_body = (new WarningTransform($param))->main($body); break; case '52': //卫星位置消息 self::log('CMD==>卫星位置消息', "log", self::$LOG_DEV); $response_body = (new SatelliteLocationTransform($param))->main($body); break; case '53': //基站位置消息 self::log('CMD==>基站位置消息', "log", self::$LOG_DEV); $response_body = (new BaseStationLocationTransform($param))->main($body); break; case '54': // 实时追踪 case '55': // 位置查询 //基站位置消息 self::log('CMD==>基站位置消息(实时)', "log", self::$LOG_DEV); $response_body = (new LocationTransform($param))->main($body); break; case '56': //配置消息 self::log('CMD==>配置消息', "log", self::$LOG_DEV); $response_body = (new ConfigTransform($param))->main($body); break; case '5f': self::log('CMD==>域名配置', "log", self::$LOG_DEV); $response_body = (new UrlConfigTransform($param))->main($body); break; case '08': self::log('CMD==>响应', "log", self::$LOG_DEV); $response_body = (new ResponseTransform($param))->main($body); break; } if ($response_body === false) { self::log('==>', 'RESPONSE_LOG', self::$LOG_DEV); return false; } $response_body[0] = $cmd; if (is_array($response_body)) { $response = self::response($response_body, $number); self::log($response, 'RESPONSE_LOG', self::$LOG_DEV); Gateway::sendToCurrentClient('+NNMI,' . hex2bin(str_replace(' ', '', $response))); } self::log('<===========================================>', 'RESPONSE_LOG', self::$LOG_DEV); } public static function outLine($client_id) { } /** * 校检 * @param $data * @param $verification * @return bool * Author: Mead */ protected static function verification($data) { $a = $b = 0; for ($i = 0; $i < count($data); $i++) { $a = $a + hexdec($data[$i]); $b = $a + $b; } return str_pad(substr(dechex($a), -2), 2, 0, STR_PAD_LEFT) . str_pad(substr(dechex($b), -2), 2, 0, STR_PAD_LEFT); } /** * 验证数据 * @param $data * @param $verification * @return bool * Author: Mead */ private static function is_verification($data, $verification) { $n_verification = self::verification($data); return (bool)((string)$n_verification === (string)$verification); } /** * 处理响应包 * @param $body * @param $number * @return string * Author: Mead */ private static function response($body, $number) { $header = [ '28', "{$number}", '00', '0003', ]; $data = self::arr2str($header, $body); $data .= self::verification(explode(' ', $data)); return self::format('4244' . $data . '0D0A'); } private static function format($str) { return strtoupper(implode(' ', str_split(str_replace(' ', '', $str), 2))); } private static function arr2str() { $args = func_get_args(); $arr = ''; foreach ($args as $arg) { if (is_array($arg)) { $arr .= implode('', $arg); } else { $arr .= str_replace(' ', '', $arg); } } return implode(' ', str_split($arr, 2)); } /** * 根据box_no获取车的no * @param $box_no * @return mixed * User: Mead */ private static $redis_bike_no_tags = 'box_no_and_bike_no'; public static function byBoxNoGetBikeNoStatic($box_no) { return self::$redis->hget(self::$redis_bike_no_tags, $box_no); } }