websocket.ts 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. import { ElMessage } from 'element-plus'
  2. import useWSStore from '../store/modules/websocket'
  3. let websocket: WebSocket | null = null; // 用于存储实例化后websocket
  4. let rec: any; // 断线重连后,延迟5秒重新创建WebSocket连接 rec用来存储延迟请求的代码
  5. const store = useWSStore();
  6. // 创建websocket
  7. function creatWebSocket(wsUrl: string) {
  8. console.log("websocket==================");
  9. // 判断当前浏览器是否支持WebSocket
  10. if ("WebSocket" in window) {
  11. console.log("当前浏览器支持 WebSocket");
  12. } else if ("MozWebSocket" in window) {
  13. console.log("当前浏览器支持 MozWebSocket");
  14. } else {
  15. console.log("当前浏览器不支持 WebSocket");
  16. }
  17. try {
  18. initWebSocket(wsUrl); // 初始化websocket连接
  19. } catch (e) {
  20. console.log("尝试创建连接失败");
  21. reConnect(wsUrl); // 如果无法连接上 webSocket 那么重新连接!可能会因为服务器重新部署,或者短暂断网等导致无法创建连接
  22. }
  23. }
  24. // 初始化websocket
  25. function initWebSocket(wsUrl: string) {
  26. websocket = new WebSocket(wsUrl);
  27. console.log("websocket:", websocket);
  28. websocket.onopen = function () {
  29. websocketOpen();
  30. };
  31. // // 接收
  32. websocket.onmessage = function (e: MessageEvent<any>) {
  33. websocketonmessage(e);
  34. };
  35. // 连接发生错误
  36. websocket.onerror = function () {
  37. console.log("WebSocket连接发生错误");
  38. // isConnect = false; // 连接断开修改标识
  39. reConnect(wsUrl); // 连接错误 需要重连
  40. };
  41. websocket.onclose = function (e) {
  42. websocketclose(e);
  43. };
  44. }
  45. // 定义重连函数
  46. let reConnect = (wsUrl: string) => {
  47. console.log("尝试重新连接");
  48. if (store.state.isConnected) return; // 如果已经连上就不在重连了
  49. rec && clearTimeout(rec);
  50. rec = setTimeout(function () {
  51. // 延迟5秒重连 避免过多次过频繁请求重连
  52. creatWebSocket(wsUrl);
  53. }, 5000);
  54. };
  55. // 创建连接
  56. function websocketOpen() {
  57. console.log("连接成功");
  58. store.connect(); // 修改连接状态
  59. }
  60. // 数据接收
  61. function websocketonmessage(e: MessageEvent<any>) {
  62. console.log("数据接收", e.data);
  63. const data = JSON.parse(e.data); // 解析JSON格式的数据
  64. // 下面的判断则是后台返回的接收到的数据 如何处理自己决定
  65. if (data.code === 400) {
  66. console.log("数据接收", data.msg);
  67. ElMessage({
  68. showClose: true,
  69. message: data.msg,
  70. type: 'warning',
  71. })
  72. } else if (data.code === 404) {
  73. ElMessage({
  74. showClose: true,
  75. message: data.msg,
  76. type: 'warning',
  77. })
  78. } else if (data.code === 0) {
  79. ElMessage({
  80. showClose: true,
  81. message: "连接成功",
  82. type: 'success',
  83. })
  84. } else if (data.code === 200) {
  85. ElMessage({
  86. showClose: true,
  87. message: data.msg,
  88. type: 'success',
  89. })
  90. // 成功后的相应处理 此处成功后播放音乐
  91. const audio = new Audio('./tipMusic.mp3');
  92. audio.play();
  93. } else {
  94. ElMessage({
  95. showClose: true,
  96. message: data.msg,
  97. type: 'error',
  98. })
  99. // 延时5秒后刷新页面
  100. setTimeout(() => {
  101. location.reload();
  102. }, 1000);
  103. }
  104. // let data = JSON.parse(decodeUnicode(e.data))
  105. }
  106. // 关闭
  107. function websocketclose(e: any) {
  108. console.log(e);
  109. store.disconnect(); // 修改连接状态
  110. console.log("connection closed (" + e.code + ")");
  111. }
  112. // 数据发送
  113. function websocketsend(data: any) {
  114. console.log("发送的数据", data, JSON.stringify(data));
  115. if (websocket && store.state.isConnected) { // 检查连接状态
  116. websocket.send(JSON.stringify(data));
  117. } else {
  118. ElMessage({
  119. showClose: true,
  120. message: "请选择设备连接",
  121. type: 'error',
  122. })
  123. }
  124. }
  125. // 实际调用的方法==============
  126. // 发送
  127. function sendWebSocket(data: any) {
  128. // 如果未保持连接状态 不允许直接发送消息 提示请选择连接设备
  129. if (!store.state.isConnected) {
  130. ElMessage({
  131. showClose: true,
  132. message: "请选择设备连接",
  133. type: 'error',
  134. })
  135. } else {
  136. websocketsend(data);
  137. console.log("------------------");
  138. }
  139. }
  140. // 关闭
  141. let closeWebSocket = () => {
  142. if (websocket) {
  143. websocket.close();
  144. ElMessage({
  145. showClose: true,
  146. message: "设备已关闭",
  147. type: 'success',
  148. })
  149. }
  150. };
  151. export {
  152. initWebSocket,
  153. sendWebSocket,
  154. creatWebSocket,
  155. closeWebSocket,
  156. }