开篇
此文带领大家简单使用一下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));
}
结尾
今天微信小程序 相关技术的分享就到这里喽,小伴们,觉得有点用的话,或者已经看到这里面来的请点赞加关注吧~~ 后续分享更多移动物联网相关文章。如果有疑问的话,请在下方留言~
网友评论