Test.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. <?php
  2. namespace app\green\swoole;
  3. use app\green\model\GreenAlarm;
  4. use app\green\model\GreenDevice;
  5. use app\green\model\GreenDeviceState;
  6. use app\green\model\GreenUser;
  7. use app\green\model\GreenUserLog;
  8. use think\swoole\Server;
  9. class Test extends Server
  10. {
  11. protected $host = '0.0.0.0';
  12. protected $swoole;
  13. protected $port = 8080;
  14. protected $serverType = 'server';
  15. protected $mode = SWOOLE_PROCESS;
  16. protected $sockType = SWOOLE_SOCK_UDP;
  17. protected $option = [
  18. 'worker_num'=> 8,
  19. 'daemonize' => false,
  20. 'backlog' => 128,
  21. ];
  22. public function onPacket($server, $data, $fd)
  23. {
  24. try{
  25. $buffer = str_split(bin2hex($data),2);
  26. var_dump($buffer);
  27. switch (count($buffer)) {
  28. //回收箱心跳包
  29. case 4:
  30. $result = $this->checkHeart($buffer);
  31. if($result){
  32. $info = GreenDevice::where(['device_id' => $result])->find();
  33. if ($info) {
  34. if($info->state == 1){
  35. $info->state = 0;
  36. $this->send($server, $fd['address'], $fd['port'], [0x53, 0xAB]);
  37. }
  38. $info->ip = $fd['address'];
  39. $info->port = $fd['port'];
  40. $info->update_time = time();
  41. $info->save();
  42. }
  43. }else{
  44. $this->send($server, $fd['address'], $fd['port'], [0x53, 0x00]);
  45. }
  46. break;
  47. //回收箱 状态变化
  48. case 12:
  49. if($this->checkSum($buffer)){
  50. //设备
  51. $device = GreenDevice::where(['device_id' => hexdec(implode("", [$buffer[2], $buffer[3]]))])->find();
  52. //回收口开
  53. if($buffer[5] == '4f'){
  54. $info = GreenDeviceState::where(['device_id' => $device->device_id,'type' => 2,'state' => 0])->find();
  55. if($info){
  56. $this->send($server, $info->ip, $info->port, [0x53, 0x4F]);
  57. GreenDeviceState::where(['id' => $info->id])->update(['state' => 1,'update_time' => time(),'device_content' => bin2hex($data)]);
  58. break;
  59. }
  60. }
  61. //箱满
  62. if($buffer[6] == '31'){
  63. GreenAlarm::create(['device_id' => $device->device_id,'operate_id' => $device->operate_id,'content' => '箱满','create_time' => time(),'member_miniapp_id' => $device->member_miniapp_id]);
  64. }else{
  65. $alarm = GreenAlarm::where(['device_id' => $device->device_id,'state' => 0,'member_miniapp_id' => $device->member_miniapp_id])->find();
  66. if($alarm){
  67. GreenAlarm::where(['id' => $alarm->id])->where(['state' => 1,'relieve_time' => time()]);
  68. break;
  69. }
  70. }
  71. //投口开
  72. if($buffer[4] == '4f' && $device->type == 0){
  73. $info = GreenDeviceState::where(['device_id' => $device->device_id,'type' => 0,'state' => 0])->find();
  74. if($info){
  75. $this->send($server, $info->ip, $info->port, [0x53, 0x4F]);
  76. GreenDeviceState::where(['id' => $info->id])->update(['state' => 1,'update_time' => time(),'device_content' => bin2hex($data)]);
  77. GreenDevice::where(['device_id' => $device->device_id, ])->update(['type' => 1]);
  78. }
  79. }else if($buffer[4] == '43' && $device->type == 1){ //投口关
  80. $begin = GreenDeviceState::where(['device_id' => $device->device_id,'type' => 0,'state' => 1])->order('id desc,update_time desc')->limit('1')->select();
  81. if(count($begin) > 0){
  82. $info = GreenDeviceState::where(['device_id' => $device->device_id,'type' => 1,'state' => 0])->find();
  83. if($info){
  84. GreenDeviceState::where(['id' => $info->id])->update(['state' => 1,'update_time' => time(),'device_content' => bin2hex($data)]);
  85. $this->send($server, $info->ip, $info->port, [0x53, 0x43]);
  86. }else{
  87. GreenDeviceState::where(['id' => $begin[0]->id])->update(['update_time' => time(),'end_content' => bin2hex($data)]);
  88. $this->send($server, $begin[0]->ip, $begin[0]->port, [0x53, 0x43]);
  89. }
  90. //计算重量
  91. $result = $this->weight(str_split($begin[0]->device_content,2),$buffer);
  92. if($result > 0){
  93. //创建用户数据
  94. GreenUserLog::create(['member_miniapp_id' => $device->member_miniapp_id,'uid' => $begin[0]->uid,'device_id' => $device->device_id,'create_time' => time(),'weight' => $result]);
  95. $greenUser = GreenUser::where(['member_miniapp_id' => $device->member_miniapp_id,'uid' => $begin[0]->uid])->find();
  96. if($greenUser){
  97. GreenUser::where(['id' => $greenUser->id])->update(['weight' => $greenUser->weight + $result,'points' => $greenUser->points + $result,'update_time' => time()]);
  98. }else{
  99. GreenUser::create(['member_miniapp_id' => $device->member_miniapp_id,'uid' => $begin[0]->uid,'weight' =>$result,'points' =>$result,'create_time' => time(),'update_time' => time()]);
  100. }
  101. }
  102. }
  103. GreenDevice::where(['device_id' => $device->device_id, ])->update(['type' => 0]);
  104. }
  105. }else{
  106. $this->send($server, $fd['address'], $fd['port'], [0x53, 0x00]);
  107. }
  108. break;
  109. //小程序
  110. case 9:
  111. if($this->checkSum($buffer)){
  112. //设备
  113. $device = GreenDevice::where(['device_id' => hexdec(implode("", [$buffer[2], $buffer[3]]))])->find();
  114. //离线
  115. if($device->state == 1){
  116. $this->send($server, $fd['address'], $fd['port'], [0x53, 0x40]);
  117. break;
  118. //箱满
  119. }else if($device->danger){
  120. $this->send($server, $fd['address'], $fd['port'], [0x53, 0x31]);
  121. break;
  122. }
  123. $data = [
  124. 'member_miniapp_id' => $device->member_miniapp_id,
  125. 'device_id' => $device->device_id, //设备号
  126. 'uid' => hexdec(implode("", [$buffer[4], $buffer[5], $buffer[6]])), //用户id
  127. 'ip' => $fd['address'],
  128. 'port' => $fd['port'],
  129. 'user_content' => bin2hex($data),
  130. 'create_time' => time(),
  131. ];
  132. switch ($buffer[7]){
  133. //开投递门
  134. case 'a1':
  135. $data['type'] = 0;
  136. $state = GreenDeviceState::where(['member_miniapp_id' => $data['member_miniapp_id'],'device_id' => $data['device_id'],'uid' => $data['uid'],
  137. 'type' => $data['type'],'state' => 0])->find();
  138. if(empty($state)){
  139. GreenDeviceState::create($data);
  140. }else{
  141. GreenDeviceState::where(['id' => $state->id])->update($data);
  142. }
  143. $this->send($server, $device->ip, $device->port, [0x53, 0xA1]);
  144. break;
  145. //关投递门
  146. case 'a2':
  147. $data['type'] = 1;
  148. $state = GreenDeviceState::where(['member_miniapp_id' => $data['member_miniapp_id'],'device_id' => $data['device_id'],'uid' => $data['uid'],
  149. 'type' => $data['type'],'state' => 0])->find();
  150. if(empty($state)){
  151. GreenDeviceState::create($data);
  152. }else{
  153. GreenDeviceState::where(['id' => $state->id])->update($data);
  154. }
  155. $this->send($server, $device->ip, $device->port, [0x53, 0xB1]);
  156. break;
  157. //开回收门
  158. case 'b1' :
  159. $data['type'] = 2;
  160. $manage = GreenDevice::where(['member_miniapp_id' =>$device->member_miniapp_id,'device_id' => $device->device_id,'manage_uid' => $data['uid']])->find();
  161. if($manage){
  162. $state = GreenDeviceState::where(['member_miniapp_id' => $data['member_miniapp_id'],'device_id' => $data['device_id'],'uid' => $data['uid'],
  163. 'type' => $data['type'],'state' => 0])->find();
  164. if(empty($state)){
  165. GreenDeviceState::create($data);
  166. }else{
  167. GreenDeviceState::where(['id' => $state->id])->update($data);
  168. }
  169. $this->send($server, $device->ip, $device->port, [0x53, 0xC1]);
  170. }
  171. break;
  172. }
  173. }else{
  174. $this->send($server, $fd['address'], $fd['port'], [0x53, 0x00]);
  175. }
  176. break;
  177. }
  178. }catch (\Exception $e){
  179. $this->send($server, $fd['address'], $fd['port'], [0x53, 0x00]);
  180. }
  181. }
  182. //发送消息
  183. public function send($server, $ip, $port, $array){
  184. var_dump($array);
  185. $str = '';
  186. foreach ($array as $ch) {
  187. $str .= chr($ch);
  188. }
  189. $server->sendto($ip, $port, $str);
  190. }
  191. //校验心跳包
  192. public function checkHeart($buffer){
  193. if(bin2hex(~hex2bin($buffer[0])) == $buffer[2] && bin2hex(~hex2bin($buffer[1])) == $buffer[3]){
  194. return hexdec(implode("",[$buffer[0],$buffer[1]]));
  195. }else{
  196. return false;
  197. }
  198. }
  199. //校验数据包
  200. public function checkSum($buffer){
  201. $sum = 0;
  202. $data = array_chunk($buffer,count($buffer) - 1);
  203. foreach ($data[0] as $value) {
  204. $sum = base_convert( hexdec('0x'.$sum) + hexdec('0x'.$value),10,16);
  205. if(strlen($sum) >= 3){
  206. $sum = substr($sum,1,2);
  207. }
  208. }
  209. return (string)$sum == $data[1][0] ? true : false;
  210. }
  211. //计算重量
  212. public function weight($buffer1,$buffer2){
  213. $weight1 = implode("",[$buffer1[9],$buffer1[10]]);
  214. $weight2 = implode("",[$buffer2[9],$buffer2[10]]);
  215. return hexdec(base_convert(((hexdec('0x'.$weight2) - hexdec('0x'.$weight1)) * 0x6),10,16));
  216. }
  217. }