BatteryServer.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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\Models\BatteryTraitModel;
  10. class BatteryServer extends BaseServer
  11. {
  12. use BatteryTraitModel;
  13. /**
  14. *
  15. * @param $body
  16. * @return array
  17. * User: Mead
  18. */
  19. public function main($body)
  20. {
  21. $data = $this->decode($body);
  22. self::log($data, 'BatteryServer', self::$LOG_MAJOR);
  23. if ($this->is_ep_min($data['box_no'], 'update_battery_box_no', 3)) {
  24. // 更新电车的电量
  25. // $cols['battery_power'] = $this->byVoltageGetElectric($data['battery_voltage']);
  26. $cols['battery_power'] = $this->byVoltageGetElectric($data['battery_voltage'], $data['battery_xd_soc']);
  27. $cols['is_low_battery_power'] = 1;
  28. if ($cols['battery_power'] <= self::$max_ride_v) {
  29. $cols['is_low_battery_power'] = 0;
  30. }
  31. $this->db->update('bikes')->where('box_no = ' . $data['box_no'])->cols($cols)->query();
  32. }
  33. return $this->response();
  34. }
  35. /**
  36. * 解析装载的数据
  37. * @param $body
  38. * @return array
  39. * User: Mead
  40. */
  41. private function decode($body)
  42. {
  43. $i = 0;
  44. $box_no = self::stitching($body, $i, 5);
  45. $i += 5;
  46. // 设备时间
  47. $time = self::stitching($body, $i, 4);
  48. $i += 4;
  49. // 相对soc
  50. $battery_xd_soc = self::stitching($body, $i, 1);
  51. $i += 1;
  52. // 可用剩余容量
  53. $battery_mb_free = self::stitching($body, $i, 2);
  54. $i += 2;
  55. // 绝对soc
  56. $battery_jd_soc = self::stitching($body, $i, 1);
  57. $i += 1;
  58. // 绝对满电容量
  59. $i += 2;
  60. // SOH
  61. // $battery_soh = self::stitching($body, $i, 1);
  62. $i += 1;
  63. // 内部温度
  64. $i += 2;
  65. // 实时电流
  66. $i += 2;
  67. // 电压
  68. $battery_voltage = self::stitching($body, $i, 2);
  69. $i += 2;
  70. // 循环次数
  71. $i += 2;
  72. // 1~7节电池电压
  73. $i += 14;
  74. // 8~14节电池电压
  75. $i += 14;
  76. // 当前充电间隔时间
  77. $i += 2;
  78. // 最大充电间隔时间
  79. $i += 2;
  80. // 读写成本条形码
  81. $i += 16;
  82. //读版本号
  83. $i += 2;
  84. //电池组制造厂名称
  85. $battery_name = self::stitching($body, $i, 16);
  86. $i += 16;
  87. // 处理值
  88. $box_no = $this->decodeBoxNo($box_no);
  89. $time = $this->decodeTime($time);
  90. $battery_voltage = $this->decodeBatteryVoltage($battery_voltage);
  91. return [
  92. 'box_no' => $box_no,
  93. 'time' => $time,
  94. 'battery_voltage' => $battery_voltage,
  95. 'battery_name' => $battery_name,
  96. 'battery_xd_soc' => hexdec($battery_xd_soc),
  97. 'battery_mb_free' => $battery_mb_free,
  98. 'battery_jd_soc' => $battery_jd_soc,
  99. ];
  100. }
  101. }