前言

今天接触了通过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" })

      })
    }
}

展示效果如下:

Screenshot_20250507170935062.jpeg

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐