HeartBeatServer.php 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Mead
  5. * Date: 2019/9/3
  6. * Time: 8:05 PM
  7. */
  8. namespace App\Servers;
  9. use App\Handlers\BikeStatusInfoSyncHandler;
  10. use App\Maps\BikeMap;
  11. use App\Models\BatteryTraitModel;
  12. use App\Models\WarningLogTraitModel;
  13. class HeartBeatServer extends BaseServer
  14. {
  15. use BatteryTraitModel, WarningLogTraitModel;
  16. public function main($body)
  17. {
  18. $data = $this->decode($body);
  19. // self::log($data, 'HeartBeatServer', self::$LOG_MAJOR);
  20. $bike_no = $_SESSION['bike_no'];
  21. if (!$bike_no) return [];
  22. $box_no = $data['box_no'];
  23. $is_low_battery_power = BikeMap::BATTERY_POWER_OK;
  24. $battery_power = $this->byVoltageGetElectric($data['battery_voltage'], $data['battery']['bike_soc']);
  25. if ($battery_power <= self::$max_ride_v) {
  26. // 低电量
  27. $is_low_battery_power = BikeMap::BATTERY_POWER_LOW;
  28. //电量低报警信息
  29. $this->warningLogBatteryLow($bike_no, $data['box_no'], ['battery_power' => $battery_power], $body, 'heart');
  30. }
  31. $this->updateBikeData($box_no, 'BikeStatus', [
  32. 'battery_power' => $battery_power,
  33. 'is_low_battery_power' => $is_low_battery_power,
  34. ], []);
  35. if ((!$data['bike_status']['is_huanche'])) {
  36. // 获取用户信息
  37. $order = (new BikeStatusInfoSyncHandler($this->redis))->getRideBikeOrderInfo($bike_no);
  38. if (!$order) {
  39. //非法骑行
  40. $num = $this->redis->incr('bike:illegal:open:' . $bike_no, 1);
  41. $this->redis->expire('bike:illegal:open:' . $bike_no, 120);
  42. BikeControl::closeLock($data['box_no']);
  43. if ($num > 5) {
  44. if (!$this->is_ep_min($box_no, 'bike:illegal:open:location', 20)) {
  45. $this->warningFF($bike_no, $data['box_no'], $data, $body);
  46. }
  47. }
  48. }
  49. }
  50. // if ($data['box_no'] === '003454406') return $this->response();
  51. // if (!$this->is_ep_min($data['box_no'], 'heart', 30)) {
  52. // $cols['is_link'] = BikeMap::LINK_ONLINE;
  53. //// $cols['battery_power'] = $this->byVoltageGetElectric($data['battery_voltage']);
  54. // $cols['battery_power'] = $this->byVoltageGetElectric($data['battery_voltage'], $data['battery']['bike_soc']);
  55. // $cols['is_low_battery_power'] = BikeMap::BATTERY_POWER_OK;
  56. // if ($cols['battery_power'] <= self::$max_ride_v) {
  57. // // 低电量
  58. // $cols['is_low_battery_power'] = BikeMap::BATTERY_POWER_LOW;
  59. //
  60. // //电量低报警信息
  61. // $this->warningLogBatteryLow($bike_no, $data['box_no'], ['battery_power' => $cols['battery_power']], $body, 'heart');
  62. //
  63. // }
  64. // $this->db->update('bikes')->where('box_no = ' . $data['box_no'])->cols($cols)->query();
  65. // } else {
  66. // //换电池及时更新电量
  67. // $openBatteryKey = "cache:open_battery:{$box_no}";
  68. // if ($this->redis->exists($openBatteryKey)) {
  69. // $cols['is_link'] = BikeMap::LINK_ONLINE;
  70. //// $cols['battery_power'] = $this->byVoltageGetElectric($data['battery_voltage']);
  71. // $cols['battery_power'] = $this->byVoltageGetElectric($data['battery_voltage'], $data['battery']['bike_soc']);
  72. // $cols['is_low_battery_power'] = BikeMap::BATTERY_POWER_OK;
  73. // if ($cols['battery_power'] <= self::$max_ride_v) {
  74. // // 低电量
  75. // $cols['is_low_battery_power'] = BikeMap::BATTERY_POWER_LOW;
  76. // }
  77. //
  78. // $this->db->update('bikes')->where('box_no = ' . $data['box_no'])->cols($cols)->query();
  79. // }
  80. // }
  81. //
  82. // if ((!$data['bike_status']['is_huanche'])) {
  83. // // 获取用户信息
  84. // $order = (new BikeStatusInfoSyncHandler($this->redis))->getRideBikeOrderInfo($bike_no);
  85. // if (!$order) {
  86. // //非法骑行
  87. // $num = $this->redis->incr('bike:illegal:open:' . $bike_no, 1);
  88. // $this->redis->expire('bike:illegal:open:' . $bike_no, 120);
  89. // BikeControl::closeLock($data['box_no']);
  90. //
  91. // if ($num > 5) {
  92. // if (!$this->is_ep_min($box_no, 'bike:illegal:open:location', 20)) {
  93. // $this->warningFF($bike_no, $data['box_no'], $data, $body);
  94. // }
  95. // }
  96. // }
  97. // }
  98. return $this->response();
  99. }
  100. /**
  101. * 解析装载的登录数据
  102. * @param $body
  103. * @return array
  104. * User: Mead
  105. */
  106. private function decode($body)
  107. {
  108. $i = 0;
  109. $box_no = $this->decodeBoxNo(self::stitching($body, $i, 5));
  110. $i += 5;
  111. // 信号强度
  112. // $signal_status = self::stitching($body, $i, 2);
  113. $i += 2;
  114. // 车辆状态
  115. $bike_status = self::stitching($body, $i, 2);
  116. $i += 2;
  117. // 电池电压
  118. $battery_voltage = self::stitching($body, $i, 2);
  119. $i += 2;
  120. // 相对SOC
  121. $soc = hexdec(self::stitching($body, $i, 1));
  122. $i += 1;
  123. // 电池余量
  124. $battery_mb_free = self::stitching($body, $i, 2);
  125. return [
  126. 'box_no' => $box_no,
  127. 'bike_status' => $this->decodeBikeStatus($bike_status),
  128. 'battery_voltage' => $this->decodeBatteryVoltage($battery_voltage),
  129. 'battery' => [
  130. 'bike_battery_mb_free' => $battery_mb_free,
  131. 'bike_soc' => $soc
  132. ]
  133. ];
  134. }
  135. }