ToolsHandler.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Mead
  5. * Date: 2019/9/3
  6. * Time: 8:46 PM
  7. */
  8. namespace App\Handlers;
  9. trait ToolsHandler
  10. {
  11. public static function stitching($arr, $offset, $length = false)
  12. {
  13. if ($length === false) return implode('', array_slice($arr, $offset));
  14. return implode('', array_slice($arr, $offset, $length));
  15. }
  16. /**
  17. * 处理状态信息
  18. *
  19. * @param $status string
  20. * @return array
  21. * @author Fx
  22. *
  23. */
  24. public static function handleStatus($status, $offset = 0, $len = 11)
  25. {
  26. $data = self::handleU4($status);
  27. $data = array_slice($data, $offset, $len);
  28. $res = [
  29. 'bike_lock' => $data[0],
  30. 'guard_lock' => $data[1],
  31. 'rear_wheel_lock' => $data[2],
  32. 'backseat_lock' => $data[3],
  33. 'lamp_status' => $data[4],
  34. 'battery_lock' => $data[5],
  35. 'rear_wheel_motion' => $data[6],
  36. 'is_motion' => $data[7],
  37. 'location_type' => $data[8],
  38. 'backseat_status' => $data[9],
  39. 'order_status' => $data[10],
  40. ];
  41. return $res;
  42. }
  43. /**
  44. * 解析u1
  45. *
  46. * @param $u1
  47. * @return array
  48. * @author Fx
  49. *
  50. */
  51. public static function handleU1($u1)
  52. {
  53. $str2 = base_convert($u1, 16, 2);
  54. $u1_bin = str_pad($str2, 8, 0, STR_PAD_LEFT);
  55. $data = str_split(str_replace(' ', '', trim($u1_bin)));
  56. return array_reverse($data);
  57. }
  58. /**
  59. * 解析u2
  60. *
  61. * @param $u2
  62. * @return array
  63. * @author Fx
  64. *
  65. */
  66. public static function handleU2($u2)
  67. {
  68. $str2 = base_convert($u2, 16, 2);
  69. $u2_bin = str_pad($str2, 16, 0, STR_PAD_LEFT);
  70. $data = str_split(str_replace(' ', '', trim($u2_bin)));
  71. return array_reverse($data);
  72. }
  73. public static function handleI2($i2)
  74. {
  75. $str10 = base_convert($i2, 16, 10);
  76. if ($str10 > 32767) {
  77. return $str10 - (32768 * 2);
  78. } else {
  79. return $str10;
  80. }
  81. }
  82. /**
  83. * 解析u4
  84. *
  85. * @param $u4
  86. * @return array
  87. * @author Fx
  88. *
  89. */
  90. public static function handleU4($u4)
  91. {
  92. // $u4 = hexdec($u4);
  93. // $u4_bin = self::decto_bin([$u4], 2);
  94. $str2 = base_convert($u4, 16, 2);
  95. $u4_bin = str_pad($str2, 32, 0, STR_PAD_LEFT);
  96. $data = str_split(str_replace(' ', '', trim($u4_bin)));
  97. // var_dump($data);
  98. return array_reverse($data);
  99. }
  100. public static function formatCoordinate($val)
  101. {
  102. return $val / 1000000;
  103. }
  104. /**
  105. *十进制转二进制、八进制、十六进制 不足位数前面补零*
  106. *
  107. * @param array $datalist 传入数据array(100,123,130)
  108. * @param int $bin 转换的进制可以是:2,8,16
  109. * @return array 返回数据 array() 返回没有数据转换的格式
  110. */
  111. public static function decto_bin($datalist, $bin)
  112. {
  113. static $arr = array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'A', 'B', 'C', 'D', 'E', 'F');
  114. if (!is_array($datalist)) $datalist = array($datalist);
  115. if ($bin == 10) return $datalist; //相同进制忽略
  116. $bytelen = ceil(16 / $bin); //获得如果是$bin进制,一个字节的长度
  117. $aOutChar = array();
  118. foreach ($datalist as $num) {
  119. $t = "";
  120. $num = intval($num);
  121. if ($num === 0) continue;
  122. while ($num > 0) {
  123. $t = $arr[$num % $bin] . $t;
  124. $num = floor($num / $bin);
  125. }
  126. $tlen = strlen($t);
  127. if ($tlen % $bytelen != 0) {
  128. $pad_len = $bytelen - $tlen % $bytelen;
  129. $t = str_pad("", $pad_len, "0", STR_PAD_LEFT) . $t; //不足一个字节长度,自动前面补充0
  130. }
  131. $aOutChar[] = $t;
  132. }
  133. return $aOutChar;
  134. }
  135. }