123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254 |
- <?php
- /**
- * Created by PhpStorm.
- * User: Mead
- * Date: 2019/9/3
- * Time: 8:05 PM
- */
- namespace App\Servers\Weikemu\Transforms;
- use App\Maps\WarningLogMap;
- use App\Models\BoxSettingTraitModel;
- use App\Models\WarningLogTraitModel;
- use App\Servers\BaseServer;
- use App\Servers\Weikemu\BikeControl;
- use Workerman\Lib\Timer;
- /**
- * 告警报文
- * Class WarningServer
- * @package App\Servers\Weikemu
- */
- class WarningTransform extends BaseServer
- {
- use BoxSettingTraitModel, WarningLogTraitModel;
- public static $typeMaps = [
- '震动告警',
- '外部电池移除',
- '位移告警',
- '温度告警',
- '自动落锁(ACC断开)',
- '',
- '',
- '终端电量告警',
- '外部电量告警',
- '外部电池接入',
- 'ACC接通',
- 'ACC断开',
- '移动告警',
- '后座锁关闭',
- '后座锁打开'
- ];
- /**
- * 处理设备序列号
- * @param $no
- * @return bool|string
- * User: Mead
- */
- private
- static function box_no($no)
- {
- return substr($no, 0, 9);
- }
- public function main($body)
- {
- $data = $this->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;
- }
- }
|