[OpenHarmony] 通过MDNS查找局域网内的设备
·
前言
今天接触了通过MDNS来寻找局域网内的设备并进行websocket进行长连接,所以来整理一下这方面的知识和使用方法。
正文
1.MDNS介绍
mDNS(多播DNS)是一种局域网内设备通过主机名直接通信的协议,无需传统DNS服务器。设备以多播方式发送查询,自动发现同网络内的服务,如打印机、摄像头等,简化配置,提升物联网设备连接效率。
2.harmony/openharmony的mdns
在harmonyos中,我们可以通过Network Kit(网络服务)来实现MDNS管理的能力,我们首先需要保证两个设备都在同一局域网下,才可以搜索到
基本方法介绍:
相关接口 | 接口介绍 |
---|---|
addLocalService(context: Context, serviceInfo: LocalServiceInfo, callback: AsyncCallback): void | 添加一个MDNS服务 |
removeLocalService(context: Context, serviceInfo: LocalServiceInfo, callback: AsyncCallback): void | 移除一个MDNS服务 |
createDiscoveryService(context: Context, serviceType: string): DiscoveryService | 返回一个DiscoveryService对象,该对象用于发现指定服务类型的MDNS服务。 |
resolveLocalService(context: Context, serviceInfo: LocalServiceInfo, callback: AsyncCallback): void | 解析一个MDNS服务 |
startSearchingMDNS(): void | 开始搜索局域网内的MDNS服务。 |
stopSearchingMDNS(): void | 停止搜索局域网内的MDNS服务。 |
on(type: 'discoveryStart', callback: Callback<{serviceInfo: LocalServiceInfo, errorCode?: MdnsError}>): void | 订阅开启监听MDNS服务的通知。 |
off(type: 'discoveryStart', callback?: Callback<{ serviceInfo: LocalServiceInfo, errorCode?: MdnsError }>): void | 取消开启监听MDNS服务的通知。 |
on(type: 'discoveryStop', callback: Callback<{serviceInfo: LocalServiceInfo, errorCode?: MdnsError}>): void | 订阅停止监听MDNS服务的通知。 |
off(type: 'discoveryStop', callback?: Callback<{ serviceInfo: LocalServiceInfo, errorCode?: MdnsError }>): void | 取消停止监听MDNS服务的通知。 |
on(type: 'serviceFound', callback: Callback): void | 订阅发现MDNS服务的通知。 |
off(type: 'serviceFound', callback?: Callback): void | 取消发现MDNS服务的通知。 |
on(type: 'serviceLost', callback: Callback): void | 订阅移除MDNS服务的通知。 |
off(type: 'serviceLost', callback?: Callback): void | 取消移除MDNS服务的通知。 |
3.发现mdns服务操作展示
1.添加网络权限
在module.json5文件下添加网络权限
"requestPermissions": [
{
"name": "ohos.permission.INTERNET" // 添加网络权限
}
]
2. 搜索设备
这里我写的是可以搜索到当前局域网内的设备显示在屏幕上,我们可以做一个自定义的选择
要注意的是**serviceType = "_test._tcp"**需要根据我们发起mdns请求的设备保持一致
@State equipmentList: string[] = []
@State chooseEquipment: string = ''
// 搜索设备
SearchEquipmentList() {
let serviceType = "_test._tcp";
let discoveryService =
mdns.createDiscoveryService(GlobalContext.getContext().getValue('Context') as common.UIAbilityContext,
serviceType);
discoveryService.stopSearchingMDNS();
discoveryService.startSearchingMDNS();
discoveryService.on('discoveryStart', (data: mdns.DiscoveryEventInfo) => {
console.log(TAG, JSON.stringify(data));
});
discoveryService.on('serviceFound', (data: mdns.LocalServiceInfo) => {
mdns.resolveLocalService(GlobalContext.getContext().getValue('Context') as common.UIAbilityContext, data,
(error: BusinessError, resolveData: mdns.LocalServiceInfo) => {
console.info(TAG, 'serviceFound', JSON.stringify(resolveData));
if (resolveData.host?.address) {
// 设置webserver IP
// changeDeviceIP(resolveData.host?.address)
this.equipmentList.push(resolveData.host?.address)
}
})
}
);
}
build() {
Column() {
Text("可连接设备")
Button("重新扫描")
.onClick(() => {
this.equipmentList = []
this.SearchEquipmentList()
})
ForEach((this.equipmentList), (item: string) => {
Column() {
Text(item)
.fontSize(30)
}
.height(50)
.width("100%")
.onClick(() => {
this.chooseEquipment = item
})
.border({ width: 3, radius: 10, color: this.chooseEquipment == item ? "#00ff00" : "#000000" })
})
}
}
展示效果如下:
更多推荐
所有评论(0)