更新记录

1.0.0(2026-01-08)

  • 插件初始版本

平台兼容性

uni-app(4.66)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android Android插件版本 iOS iOS插件版本 鸿蒙 鸿蒙插件版本
× × × × × × 8.0 1.0.0 14 1.0.0 12 1.0.0
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 快应用-华为 快应用-联盟
× × × × × × × × × × ×

uni-app x(4.66)

Chrome Safari Android Android插件版本 iOS iOS插件版本 鸿蒙 鸿蒙插件版本 微信小程序
× × 8.0 1.0.0 14 1.0.0 12 1.0.0 ×

关于版本

【源码授权版】和【普通授权版】功能上是完全一样的。
【源码授权版】适用于项目对外部插件源代码有要求或者需要基于插件源码进行二次开发和定制的场景。

关于插件

本插件为uniapp提供mDNS(多播DNS)功能。支持服务注册、服务发现。通常用于进行局域网服务和设备发现。适用于智能家具、iot物联网等场景。

如何使用

引入

import { UtsMDNSRegisterService, UtsMDNSDiscoveryService } from '@/uni_modules/ts-mdns-tool';

服务(设备)搜索

使用UtsMDNSDiscoveryService进行局域网内的设备搜索。可以搜索局域网内当前活跃的服务或者设备。
智能家具、物联网iot设备如果支持WIFI网络的一般都会通过mDNS发布服务,以便让局域网的其他设备或者APP感知到自己。

常见的服务类型:

  1. 苹果AirPlay投屏服务类型: _airplay._tcp
  2. 苹果HomeKit配件服务类型: _hap._tcp
  3. 小米智能网关服务类型: _miot._tcp
  4. 打印机服务类型: _ipp._tcp
  5. NAS文件共享服务类型: _smb._tcp
  6. Web服务类型: _http._tcp
  7. ...等等

当然,你也可以自定义自己的服务类型。

// 新建实例
// 一个实例只能搜索和发现一类服务或者设备,如果需要搜索多种服务和设备请创建多个UtsMDNSDiscoveryService实例
const discoveryService = new UtsMDNSDiscoveryService()

// 启动服务搜索和发现
function testStartDiscoveryService() {
    // 苹果iOS系统需要注意:服务类型serviceType需要在Info.plist文件中声明才能使用,否则报错
    discoveryService.startDiscovery({
        serviceType: "_myapp._tcp", // 指定搜索的服务类型,这里指定的是一个自定义的类型
        serviceFoundCallback: (serviceInfo) => {
            // 发现新的服务(设备)通知回调
            console.log("发现新的服务: ", JSON.stringify(serviceInfo, null, 2))
        },
        serviceLostCallback: (serviceInfo) => {
            // 之前发现的服务下线通知回调,设备下线,可能是服务已经关闭,也可以能是网络不稳定导致失联
            console.log("服务失联(下线): ", JSON.stringify(serviceInfo))
        },
        success: (result) => {
            console.log("成功启动服务搜索: ", "现在可以自动搜索和发现局域网的其他设备或者服务")
            console.log("查询服务搜索状态: ", `${discoveryService.isDiscovering()}`)
        },
        fail: (errMsg) => {
            console.log("启动服务搜索出错: ", JSON.stringify(errMsg))
            return
        },
        complete: () => {}
    })
}

搜索到局域网服务的样例:
{
  "serviceDomain": "local.",
  "serviceName": "uniapp_mdns_service_android",
  "serviceType": "._myapp._tcp",
  "hostAddresses": [
    "192.168.22.2",
    "fe80::dc0c:76ff:fec4:c483%wlan0"
  ],
  "port": 18080,
  "textRecords": [
    {
      "key": "identifier",
      "value": "adcb2779-9fb0-4bc7-9c78-9b6336e57208"
    },
    {
      "key": "authTag",
      "value": "dste4"
    },
    {
      "key": "ver",
      "value": "24"
    }
  ]
}

停止搜索

当不再需要搜索局域网服务(设备)的时候,则可以停止搜索。

// 停止搜索
function testStopDiscoveryService() {
    discoveryService.stopDiscovery({
        success: (result) => {
            console.log("成功停止服务搜索", "")
        },
        fail: (errMsg) => {
            console.log("停止服务搜索出错: ", errMsg)
            return
        },
        complete: () => {}
    })
}

服务发布

插件支持服务注册发布。服务发布后,同一个局域网的其他设备或者APP就可以搜索的到。
注意:本插件只支持服务发布,服务的具体功能需要你自己实现。

服务注册

使用UtsMDNSRegisterService发布服务,一个UtsMDNSRegisterService实例只能发布一个服务,如果有多个服务可以创建多个UtsMDNSRegisterService实例。

// 新建实例
// 一个实例只能注册一个服务,如果需要注册多个服务请创建多个UtsMDNSRegisterService实例
const registerService = new UtsMDNSRegisterService()

// 服务注册
function testRegisterService() {
    console.log("===测试服务注册===", "")
    // 苹果iOS系统需要注意:服务类型serviceType需要在Info.plist文件中声明才能使用,否则报错
    registerService.register({
        serviceName: `uniapp_mdns_service`, // 服务名称,不超过63个字符,不能包含空格、点号(.)、下划线(_)以外的特殊字符
        serviceType: "_myapp._tcp",         // 服务类型,格式:_<服务名>._<传输协议>。其中服务名部分不超过15个字符,传输协议只能是 _tcp或 _udp
        servicePort: 18080,                 // 服务端口
        textRecords: [                      // TXT记录,可以多个,对方服务发现的时候可以获取到TXT记录
            {key: "identifier", value: "adcb2779-9fb0-4bc7-9c78-9b6336e57208"},
            {key: "ver", value: "24"},
            {key: "authTag", value: "dste4"},
        ],
        success: (result) => {
            console.log("成功注册服务: ", "服务现在可以被其他局域网的设备发现了")

            console.log("查询服务注册状态: ", `${registerService.isServiceRegistered()}`)
        },
        fail: (errMsg) => {
            console.log("注册服务出错: ", JSON.stringify(errMsg))
            return
        },
        complete: () => {}
    })
}

服务注销

当不再提供服务的时候,需要注销服务,这样局域网内的其他设备或者APP就能接收到服务下线通知。

function testUnregisterService() {
    console.log("===测试服务注销===", "")
    registerService.unregister({
        success: (result) => {
            console.log("成功注销服务: ", JSON.stringify(result))
        },
        fail: (errMsg) => {
            console.log("注销服务出错: ", JSON.stringify(errMsg))
            return
        },
        complete: () => {}
    })
}

权限要求

安卓Android权限

需要增加以下权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />

苹果iOS权限

需要增加以下权限

<key>NSLocalNetworkUsageDescription</key>
<string>需要访问本地网络以发现附近的设备和服务</string>
<key>NSMulticastServiceUsageDescription</key>
<string>需要加入多播组以发现附近的设备和服务</string>

鸿蒙Harmony权限

需要增加以下权限

    "requestPermissions": [
    {
        "name": "ohos.permission.INTERNET"
    },
    {
        "name": "ohos.permission.GET_NETWORK_INFO"
    },
    {
        "name": "ohos.permission.GET_WIFI_INFO"
    }
]

隐私、权限声明

1. 本插件需要申请的系统权限列表:

请查看上面文档说明

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。