OSD_DRONE_CLIENT.php 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. <?php
  2. require('../vendor/autoload.php');
  3. use \PhpMqtt\Client\MqttClient;
  4. use \PhpMqtt\Client\ConnectionSettings;
  5. use think\facade\Cache;
  6. use think\facade\Db;
  7. date_default_timezone_set("PRC");
  8. // define('HOST', '127.0.0.1');
  9. // define('PORT', '6379');
  10. // define('PASSWORD', '123456');
  11. // define('DATABASE', 2);
  12. define('HOST', '172.16.222.97');
  13. define('PORT', '6379');
  14. define('PASSWORD', 'jrtk.net');
  15. define('DATABASE', 4);
  16. (new think\App())->initialize();
  17. function app_redis()
  18. {
  19. static $redis = null;
  20. static $conn = false;
  21. if (!$conn) {
  22. connect: //定义标签
  23. $redis = new Redis();
  24. try {
  25. //建立的Redis短连接,在请求结束后不会自动关闭,相当于持久连接.
  26. $conn = $redis->connect(HOST, PORT);
  27. $conn = $redis->auth(PASSWORD);
  28. $conn = $redis->select(DATABASE);
  29. // 连接成功,返回$redis对象,连接失败,返回false.
  30. return ($conn === true) ? $redis : false;
  31. } catch (Exception $e) {
  32. return false;
  33. }
  34. } else {
  35. // 这里假设PHP-FPM在处理一个请求的时间内,Redis连接都是可用的.
  36. // 所以只在PHP-CLI下检查Redis连接的状态,进行断线重连.
  37. if (php_sapi_name() === 'cli') {
  38. try {
  39. // ping用于检查当前连接的状态,成功时返回+PONG,失败时抛出一个RedisException对象.
  40. // ping失败时警告:
  41. // Warning: Redis::ping(): connect() failed: Connection refused
  42. // var_dump('AAAAAAAAA', $redis);
  43. // echo 'Redis 连接状态' . $redis->ping() . PHP_EOL;
  44. @$redis->ping();
  45. if (!$redis->ping()) {
  46. goto connect; //跳转到标签出继续执行连接操作
  47. }
  48. } catch (Exception $e) {
  49. // 信息如 Connection lost 或 Redis server went away
  50. echo $e->getMessage();
  51. echo 'Redis 连接失败 重新连接:' . PHP_EOL;
  52. // 断线重连
  53. goto connect;
  54. }
  55. }
  56. return $redis;
  57. }
  58. }
  59. function publishMqtt($topic,$data)
  60. {
  61. //$server = '47.114.189.154';
  62. $server = '172.16.222.99';
  63. $port = 1883;
  64. $clientId = 'mqtt_dji_drone_client_0815';
  65. $username = 'rl241107';
  66. $password = "rlian2024";
  67. $clean_session = false;
  68. $connectionSettings = new ConnectionSettings();
  69. $connectionSettings = $connectionSettings
  70. ->setUsername($username)
  71. ->setPassword($password)
  72. ->setKeepAliveInterval(60)
  73. // Last Will 设置
  74. // ->setLastWillTopic('emqx/test/last-will')
  75. // ->setLastWillMessage('client disconnect')
  76. // ->setLastWillQualityOfService(1)
  77. ;
  78. $mqtt = new MqttClient($server, $port, $clientId);
  79. $mqtt->connect($connectionSettings, $clean_session);
  80. echo 'connect OK'.PHP_EOL;
  81. echo 'topic:'.$topic.PHP_EOL;
  82. echo 'data:'.$data.PHP_EOL;
  83. $res=$mqtt->publish(
  84. $topic,
  85. $data,
  86. 1
  87. );
  88. echo 'publish end'.PHP_EOL;
  89. $mqtt->loop(true,true);
  90. $mqtt->disconnect();
  91. return $res;
  92. }
  93. while (1) {
  94. $jsonData= app_redis()->rpop("OSD_DRONE_LIST");
  95. if(!$jsonData){
  96. sleep(3);
  97. continue;
  98. }
  99. $redis_data=json_decode($jsonData,true);
  100. $data=$redis_data['val'];
  101. if(!isset($data['longitude']) || !isset($data['latitude']) || !isset($data['height'])){
  102. continue;
  103. }
  104. if(!isset($redis_data['ts'])){
  105. echo 'ts不存在';
  106. continue;
  107. }
  108. $save_data=[
  109. 'longitude'=>$data['longitude'],
  110. 'latitude'=>$data['latitude'],
  111. 'height'=>$data['height'],
  112. 'time'=>floor($redis_data['ts']/1000),
  113. 'gateway'=>$redis_data['gateway'],
  114. 'device_sn'=>$redis_data['from'] ,
  115. ];
  116. var_dump($save_data);
  117. try {
  118. $res = Db::connect('uav')->name('uav_route')->insertGetId($save_data);
  119. var_dump($res);
  120. if($res){
  121. $mqtt_data=[
  122. 'devId'=>$redis_data['gateway'],
  123. 'osid'=>$redis_data['from'],
  124. 'Longitude'=>$data['longitude'],
  125. 'Latitude'=>$data['latitude'],
  126. 'Height'=>$data['height'],
  127. 'AltitudeGeo'=>$data['height'],
  128. 'time'=>floor($redis_data['ts']/1000),
  129. 'SpeedHorizontal'=>$data['horizontal_speed'],
  130. 'distance'=>$data['home_distance'],
  131. 'SpeedVertical'=>$data['vertical_speed'],
  132. 'Direction'=>$data['attitude_head'],
  133. ];
  134. $topic='DJI/DATA/'.$redis_data['from'];
  135. publishMqtt($topic,json_encode($mqtt_data));
  136. }
  137. } catch (\Exception $e) {
  138. // 错误日志或重新连接逻辑
  139. echo "错误: " . $e->getMessage().PHP_EOL;
  140. // 重新连接逻辑(示例):
  141. Db::connect('uav')->close(); // 关闭现有连接
  142. Db::connect('uav')->connect(); // 重新连接
  143. $res = Db::connect('uav')->name('uav_route')->insertGetId($save_data);
  144. var_dump($res);
  145. }
  146. }