美文网首页
小程序mdns 使用,解析attributes,ip,port,

小程序mdns 使用,解析attributes,ip,port,

作者: 微风_10a5 | 来源:发表于2023-02-21 11:30 被阅读0次

    开篇

    此文带领大家简单使用一下mdns,mdns用于局域网发现其他设备的服务, 进而获取其他设备ip,port等,从而就可以通过UDP,或者TCP与设备进行通信,完成各种各样的业务场景

    最终效果

    获取到智能设备 -> 网关的ip,port,serviceName,serviceType信息以及attributes里面附带信息, 网关的mac地址,如下图


    image.png
    正题

    直接进入正题,界面很简单,点击一个按钮,就开始在局域网中扫描设备,如果发现了,就把信息打印出来


    image.png
    // index.js
    // 获取应用实例
    const app = getApp()
    
    Page({
      data: {
        serviceList: [],
        resolveFailList: []
      },
    
    
      /**
       * 开始搜索
       */
      startDiscovery: function () {
        let that = this
        wx.startLocalServiceDiscovery({
          serviceType: '_x5_cfg._tcp',
          success: function (res) {
            that.onLocalService()
    
          },
          fail: function (err) {
            console.log(err)
          },
          complete: function () {
            console.log('complete')
          }
        })
      },
    
      /**
       * 监听方法合集
       */
      onLocalService: function () {
        let that = this
        // 监听服务发现事件
        wx.onLocalServiceFound(function (obj) {
          console.log('返回结果:', obj)
          let ip = obj.ip
          let port = obj.port
          let serviceName = obj.serviceName
          let serviceType = obj.serviceType
          let attrs = obj.attributes
          // let mac = that.ab2str(attrs.MAC)
          let mac = that.ab2str(attrs.MAC)
          console.log('返回结果 mac', mac)
        })
    
    
    
        // 监听服务解析失败事件
        wx.onLocalServiceResolveFail(function (obj) {
          this.data.resolveFailList.push(obj)
          that.setData({
            resolveFailList: this.data.resolveFailList
          })
        })
    
        // 监听服务离开
        wx.onLocalServiceLost(function (obj) {
          that.showTips('有服务离开啦');
          console.log(obj)
        })
    
        // 监听搜索停止
        wx.onLocalServiceDiscoveryStop(function (obj) {
          console.log('监听到搜索停止事件')
        })
    
      },
    
      /**
       * stopDiscovery
       */
      stopDiscovery: function () {
        let that = this
        wx.stopLocalServiceDiscovery({
          success: function () {
            that.showTips('停止搜索成功', 'success')
            serviceList = []
            resolveFailList = []
            that.setData({
              lists: [],
              resolveFailList: []
            })
            that.offLocalService()
          },
          fail: function () {
            that.showTips('停止搜索失败,请重试!')
          },
          complete: function () {
            console.log('stopDiscovery complete')
          }
        })
      },
    
      /**
       * 提示方法
       */
      showTips: function (title = '出错啦', icon = 'none') {
        wx.showToast({
          title: title,
          icon: icon,
          duration: 2000
        })
      },
    
      ab2str(buf) {
        return String.fromCharCode.apply(null, new Uint8Array(buf));
      },
    
      uint8ToStr(arr) {
        var uStr = ''
        for (var i = 0; i < arr.length; i++)
          uStr += String.fromCharCode(arr[i]);
        return uStr;
      },
    
      /**
       * offLocalService
       */
      offLocalService: function () {
    
        console.log('是否执行此部分数据')
        // 取消监听服务发现事件
        wx.offLocalServiceFound(function () {
          console.log('取消监听服务发现事件 成功')
        })
    
        // 取消监听服务解析失败事件
        wx.offLocalServiceResolveFail(function () {
          console.log('取消监听 mDNS 服务解析失败的事件 成功')
        })
    
        // 取消监听服务离开
        wx.offLocalServiceLost(function () {
          console.log('取消监听服务离开事件 成功')
        })
    
        // 取消监听搜索停止
        wx.offLocalServiceDiscoveryStop(function () {
          console.log('取消监听 mDNS 服务停止搜索的事件 成功')
        })
      },
    })
    

    难点----->解析attributes,取出我们需要的附带信息网关mac
    通过console控制台,我们可以看出,它是一个object类型:{MAC:ArrayBuffer(16)},所以要分几步去获取到我们想要的信息

    • 取出attributes对应的值attrs ,取值方式obj.attributes
    • 根据上面object类型的attrs,取出MAC这个key,对应的值 ,取值方式attrs.MAC,从而得到一个ArrayBuffer的类型数据
    • 将ArrayBuffer的类型数据,转换成人类可读的字符串mac ,其中调用了转换方法ab2str(buf)
     ab2str(buf) {
        return String.fromCharCode.apply(null, new Uint8Array(buf));
      }
    

    结尾

    今天微信小程序 相关技术的分享就到这里喽,小伴们,觉得有点用的话,或者已经看到这里面来的请点赞加关注吧~~ 后续分享更多移动物联网相关文章。如果有疑问的话,请在下方留言~

    相关文章

      网友评论

          本文标题:小程序mdns 使用,解析attributes,ip,port,

          本文链接:https://www.haomeiwen.com/subject/hewkkdtx.html