index.js 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. import Vue from 'vue'
  2. import Vuex from 'vuex'
  3. import WebSocketUtil from '@/utils/WebSocketUtil';
  4. import { Toast, Dialog } from 'vant';
  5. import config from '@/utils/config'
  6. Vue.use(Vuex)
  7. export default new Vuex.Store({
  8. state: {
  9. status: 0, // 连接状态:0-未连接,1-连接中,2-已连接
  10. // 全局状态
  11. width: 0,
  12. height: 0,
  13. apiToken: "",
  14. webSocket: WebSocketUtil,
  15. // wsUrl: "ws://192.168.0.19:9002/socket/flight",
  16. wsUrl: config.socketUrl,
  17. userId: '', // 用户名称
  18. orderInfo: null, // 订单信息
  19. flightTaskUuid: '', // 无人机飞行任务id
  20. loading: null, // loading
  21. taskNum: 0, // 重新创建任务次数
  22. takeOffShow: false, // 是否可以起飞
  23. flightData: {
  24. capacityPercent: 100, // 电池的总剩余电量
  25. homeDistance: 0, //与起飞点的水平距离
  26. height: 0, // 绝对高度
  27. verticalSpeed: 0, // 垂直速度
  28. horizontalSpeed: 0, // 水平速度
  29. quality: 0, // 网络质量 0:无信号 1:差 2:较差 3:一般 4:较好 5:好
  30. }, // 无人机飞行数据
  31. currentPage: 1, // 1: 订单详情页,2:无人机详情页
  32. router: null, // 路由数据
  33. currentPosition: {
  34. latitude: 0, // 当前位置纬度
  35. longitude: 0, // 当前位置经度
  36. },
  37. attitudeHead: 0, // 偏航轴角度(Z轴 0到6点钟方向为正值,6到12点钟方向为负值)
  38. },
  39. mutations: {
  40. // 全局状态修改方法
  41. SET_APP_VERSION(state, version) {
  42. // console.log(version)
  43. state[version.type] = version.value;
  44. // console.log(this.state.status)
  45. // console.log('初始化WebSocket', this.state.orderInfo.businessProductId)
  46. }
  47. },
  48. actions: {
  49. // 全局异步操作
  50. updateAppVersion({ commit }, value) {
  51. this.apiToken = value
  52. },
  53. // 初始化WebSocket
  54. initWebSocketUtil({ commit }, value) {
  55. // console.log('初始化WebSocket', this.$router)
  56. // console.log('初始化WebSocket', this.state.orderInfo)
  57. // return
  58. if (this.state.status != 0) return;
  59. if (!this.state.orderInfo) return;
  60. if (!this.state.userId) return;
  61. // console.log('11111');
  62. this.state.status = 1; // 标记为连接中
  63. const url = `${this.state.wsUrl}/${this.state.orderInfo.businessProductId}/${this.state.userId}`
  64. // console.log('初始化WebSocket_url', url)
  65. // 初始化WebSocket
  66. this.state.webSocket.init({
  67. url,
  68. heartbeatInterval: 5000, // 10秒发送一次心跳,方便演示
  69. reconnectInterval: 3000, // 3秒重连一次
  70. reconnectMaxTimes: 5 // 最多重连5次
  71. });
  72. this.dispatch('addWebSocketListeners');
  73. },
  74. // 添加WebSocket事件监听
  75. addWebSocketListeners() {
  76. // console.log('添加WebSocket事件监听');
  77. // 连接打开事件
  78. this.state.webSocket.addEventListener('open', (event) => {
  79. this.state.status = 2;
  80. // Toast('WebSocket连接已打开');
  81. // console.log('WebSocket连接已打开');
  82. // this.addMessage('system', '连接已建立');
  83. });
  84. // 消息接收事件
  85. this.state.webSocket.addEventListener('message', ({ data }) => {
  86. // console.log('收到消息:', data);
  87. // 如果是心跳消息
  88. if (data && data.type === 'heartbeat') {
  89. // this.lastHeartbeat = this.formatTime(new Date());
  90. // this.addMessage('heartbeat', `收到心跳响应: ${JSON.stringify(data)}`);
  91. return;
  92. }
  93. // 排队完成可以起飞
  94. if (data.msgType == 1) {
  95. // Toast('可以起飞');
  96. // if (this.state.loading) this.state.loading.clear();
  97. // this.state.loading = null;
  98. // Router.push(`/droneOperation?flightTaskUuid=${this.state.flightTaskUuid}`);
  99. setTimeout(() => {
  100. this.state.takeOffShow = true;
  101. }, 1000);
  102. }
  103. // 飞行结束
  104. if (data.msgType == 2) {
  105. Toast('飞行结束,即将退出');
  106. setTimeout(() => {
  107. this.state.router.replace(`/?orderNumber=${this.state.orderInfo.orderNumber}&t=${new Date().getTime()}`);
  108. }, 1000);
  109. this.dispatch('disconnect');
  110. }
  111. // 创建任务失败,是否重新创建
  112. if (data.msgType == 3) {
  113. if (this.state.currentPage == 2) {
  114. // Toast('飞行任务创建失败');
  115. setTimeout(() => {
  116. try {
  117. this.state.router.replace(`/?orderNumber=${this.state.orderInfo.orderNumber}&t=${new Date().getTime()}`);
  118. } catch (e) {
  119. console.log(e);
  120. }
  121. }, 2000);
  122. return
  123. }
  124. Dialog.confirm({
  125. title: '提示',
  126. message: '飞行任务创建失败,是否重新创建飞行任务?',
  127. }).then(() => {
  128. this.state.taskNum++;
  129. }).catch(() => {
  130. this.state.taskNum = 0;
  131. if (this.state.currentPage == 2) {
  132. // this.state.router.back();
  133. this.state.router.replace(`/?orderNumber=${this.state.orderInfo.orderNumber}&t=${new Date().getTime()}`);
  134. }
  135. });
  136. }
  137. // 飞行任务创建结束,可以起飞
  138. if (data.msgType == 4) {
  139. this.state.taskNum = 0;
  140. if (this.state.loading) this.state.loading.clear();
  141. this.state.loading = null;
  142. // Toast('飞行任务创建成功,即将起飞');
  143. // this.state.router.replace(`/droneOperation?flightTaskUuid=${this.state.flightTaskUuid}&t=${new Date().getTime()}`);
  144. if (this.state.flightTaskUuid == '') {
  145. return
  146. }
  147. // console.log("flightTaskUuid===》", this.state.flightTaskUuid);
  148. // console.log("跳转页面vuex====>")
  149. this.state.router.replace(`/droneOperation?t=${new Date().getTime()}&flightTaskUuid=${this.state.flightTaskUuid}`);
  150. }
  151. // 收到无人机数据
  152. if (data.msgType == 10) {
  153. if (data.data) {
  154. let obj = JSON.parse(data.data) || {};
  155. // console.log('obj==>', obj);
  156. let flightData = this.state.flightData;
  157. let currentPosition = this.state.currentPosition ? { ...this.state.currentPosition } : {};
  158. if (obj.battery && obj.battery.capacityPercent != null) flightData.capacityPercent = obj.battery.capacityPercent;
  159. if (obj.homeDistance != null) flightData.homeDistance = (obj.homeDistance * 1).toFixed(2);
  160. if (obj.height != null) flightData.height = (obj.height * 1).toFixed(2);
  161. if (obj.verticalSpeed != null) flightData.verticalSpeed = (obj.verticalSpeed * 1).toFixed(2);
  162. if (obj.horizontalSpeed != null) flightData.horizontalSpeed = (obj.horizontalSpeed * 2).toFixed(2);
  163. if (obj.networkState && obj.networkState.quality != null) flightData.quality = obj.networkState.quality;
  164. if (obj.latitude != null) currentPosition.latitude = obj.latitude;
  165. if (obj.longitude != null) currentPosition.longitude = obj.longitude;
  166. if (obj.attitudeHead != null) this.state.attitudeHead = obj.attitudeHead;
  167. this.state.currentPosition = { ...currentPosition };
  168. this.state.flightData = flightData;
  169. }
  170. }
  171. // 普通消息
  172. // this.addMessage('received', typeof data === 'object' ? JSON.stringify(data) : data);
  173. });
  174. // 错误事件
  175. this.state.webSocket.addEventListener('error', (event) => {
  176. this.status = 0;
  177. console.log('WebSocket连接错误:', event);
  178. // Toast('WebSocket连接错误');
  179. });
  180. // 关闭事件
  181. this.state.webSocket.addEventListener('close', (event) => {
  182. this.state.status = 0;
  183. // Toast('WebSocket连接关闭');
  184. console.log('WebSocket连接关闭:', event);
  185. });
  186. },
  187. // 断开WebSocket连接
  188. disconnect() {
  189. if (this.state.status == 0) return;
  190. this.state.webSocket.close();
  191. this.state.status = 0;
  192. },
  193. },
  194. modules: {
  195. }
  196. })