ipDiscovery.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. // utils/ipDiscovery.js
  2. class IPDiscovery {
  3. constructor() {
  4. this.commonIPs = [
  5. '192.168.1.100',
  6. '192.168.0.100',
  7. '10.0.0.100',
  8. '127.0.0.1'
  9. ];
  10. this.defaultPort = 8080;
  11. this.defaultPath = '/websocket';
  12. }
  13. // 检测指定IP的WebSocket服务是否可用
  14. async checkWebSocketServer(ip, port = this.defaultPort) {
  15. return new Promise((resolve) => {
  16. const url = `ws://${ip}:${port}${this.defaultPath}`;
  17. let socket = new WebSocket(url);
  18. let timeoutTimer = null;
  19. const cleanup = () => {
  20. if (socket) {
  21. socket.close();
  22. socket = null;
  23. }
  24. if (timeoutTimer) {
  25. clearTimeout(timeoutTimer);
  26. }
  27. };
  28. timeoutTimer = setTimeout(() => {
  29. cleanup();
  30. resolve(false);
  31. }, 3000);
  32. socket.onopen = () => {
  33. cleanup();
  34. resolve(true);
  35. };
  36. socket.onerror = () => {
  37. cleanup();
  38. resolve(false);
  39. };
  40. });
  41. }
  42. // 自动发现可用的WebSocket服务端
  43. async autoDiscoverServer() {
  44. console.log('开始自动发现WebSocket服务端...');
  45. for (let ip of this.commonIPs) {
  46. console.log(`检测 ${ip}:${this.defaultPort}...`);
  47. const isAvailable = await this.checkWebSocketServer(ip, this.defaultPort);
  48. if (isAvailable) {
  49. console.log(`找到可用的WebSocket服务端: ${ip}:${this.defaultPort}`);
  50. return {
  51. ip: ip,
  52. port: this.defaultPort,
  53. path: this.defaultPath
  54. };
  55. }
  56. }
  57. console.log('未找到可用的WebSocket服务端,使用默认配置');
  58. return {
  59. ip: this.commonIPs[0],
  60. port: this.defaultPort,
  61. path: this.defaultPath
  62. };
  63. }
  64. // 获取本机网络信息(尝试获取)
  65. async getLocalNetworkInfo() {
  66. return new Promise((resolve) => {
  67. // 获取网络类型
  68. uni.getNetworkType({
  69. success: (res) => {
  70. console.log('网络类型:', res.networkType);
  71. }
  72. });
  73. // 获取WiFi信息(部分平台支持)
  74. // 注意:这个API可能需要特定权限
  75. if (uni.getConnectedWifi) {
  76. uni.getConnectedWifi({
  77. success: (res) => {
  78. console.log('WiFi信息:', res.wifi);
  79. },
  80. fail: (err) => {
  81. console.log('获取WiFi信息失败:', err);
  82. }
  83. });
  84. }
  85. // 返回默认的本地IP段
  86. resolve({
  87. localIPRange: '192.168.1.x'
  88. });
  89. });
  90. }
  91. }
  92. export default new IPDiscovery();