1# 使用MDNS访问局域网服务 2<!--Kit: Network Kit--> 3<!--Subsystem: Communication--> 4<!--Owner: @wmyao_mm--> 5<!--Designer: @guo-min_net--> 6<!--Tester: @tongxilin--> 7<!--Adviser: @zhang_yixin13--> 8 9## 简介 10 11MDNS即多播DNS(Multicast DNS),提供局域网内的本地服务添加、移除、发现、解析等能力。 12- 本地服务:局域网内服务的提供方,比如打印机、扫描器等。 13 14MDNS管理的典型场景有: 15 16- 管理本地服务,通过对本地服务的创建,删除和解析等管理本地服务。 17- 发现本地服务,通过DiscoveryService对象,对指定类型的本地服务状态变化进行监听。 18 19> **说明:** 20> 为了保证应用的运行效率,大部分API调用都是异步的,对于异步调用的API均提供了callback和Promise两种方式,以下示例均采用promise函数,更多方式可以查阅[MDNS管理-API参考](../reference/apis-network-kit/js-apis-net-mdns.md)。 21 22以下分别介绍具体开发方式。 23 24>**说明:** 25> 26>在本文档的示例中,通过this.context来获取UIAbilityContext,其中this代表继承自UIAbility的UIAbility实例。如需在页面中使用UIAbilityContext提供的能力,请参见[获取UIAbility的上下文信息](../application-models/uiability-usage.md#获取uiability的上下文信息)。 27 28## 管理本地服务 29 301. 设备连接WiFi。 312. 从@kit.NetworkKit里导入mdns、错误码、featureAbility以及common命名空间。 32 33 ```ts 34 // 从@kit.NetworkKit中导入mdns命名空间。 35 import { mdns } from '@kit.NetworkKit'; 36 import { BusinessError } from '@kit.BasicServicesKit'; 37 import { featureAbility, common } from '@kit.AbilityKit'; 38 ``` 39 403. 调用addLocalService方法,添加本地服务。 41 42 <!--code_no_check--> 43 ```ts 44 let context: common.UIAbilityContext = this.getUIContext().getHostContext() as common.UIAbilityContext; 45 46 class ServiceAttribute { 47 key: string = "111" 48 value: Array<number> = [1] 49 } 50 51 // 建立LocalService对象。 52 let localServiceInfo: mdns.LocalServiceInfo = { 53 serviceType: "_print._tcp", 54 serviceName: "servicename", 55 port: 5555, 56 host: { 57 address: "10.14.**.**" 58 }, 59 serviceAttribute: [{key: "111", value: [1]}] 60 } 61 62 // addLocalService添加本地服务。 63 mdns.addLocalService(context, localServiceInfo).then((data: mdns.LocalServiceInfo) => { 64 console.log(JSON.stringify(data)); 65 }); 66 ``` 67 684. 通过resolveLocalService方法,解析本地网络的IP地址(非必要,根据需求使用)。 69 70 ```ts 71 // resolveLocalService解析本地服务对象(非必要,根据需求使用)。 72 mdns.resolveLocalService(context, localServiceInfo).then((data: mdns.LocalServiceInfo) => { 73 console.log(JSON.stringify(data)); 74 }); 75 ``` 76 775. 通过removeLocalService方法,移除本地服务。 78 79 ```ts 80 // removeLocalService移除本地服务。 81 mdns.removeLocalService(context, localServiceInfo).then((data: mdns.LocalServiceInfo) => { 82 console.log(JSON.stringify(data)); 83 }); 84 ``` 85 86## 发现本地服务 87 881. 设备连接WiFi。 892. 从@kit.NetworkKit里导入mdns的命名空间。 90 91 ```ts 92 // 从@kit.NetworkKit中导入mdns命名空间。 93 import { common, featureAbility, UIAbility } from '@kit.AbilityKit'; 94 import { mdns } from '@kit.NetworkKit'; 95 import { BusinessError } from '@kit.BasicServicesKit'; 96 import { window } from '@kit.ArkUI'; 97 ``` 98 993. 创建DiscoveryService对象,用于发现指定服务类型的MDNS服务。 100 101 <!--code_no_check--> 102 ```ts 103 let context: common.UIAbilityContext = this.getUIContext().getHostContext() as common.UIAbilityContext; 104 105 // 创建DiscoveryService对象,用于发现指定服务类型的MDNS服务。 106 let serviceType = "_print._tcp"; 107 let discoveryService = mdns.createDiscoveryService(context, serviceType); 108 ``` 109 1104. 订阅MDNS服务发现相关状态变化。 111 112 ```ts 113 // 订阅MDNS服务发现相关状态变化。 114 discoveryService.on('discoveryStart', (data: mdns.DiscoveryEventInfo) => { 115 console.log(JSON.stringify(data)); 116 }); 117 discoveryService.on('discoveryStop', (data: mdns.DiscoveryEventInfo) => { 118 console.log(JSON.stringify(data)); 119 }); 120 discoveryService.on('serviceFound', (data: mdns.LocalServiceInfo) => { 121 console.log(JSON.stringify(data)); 122 }); 123 discoveryService.on('serviceLost', (data: mdns.LocalServiceInfo) => { 124 console.log(JSON.stringify(data)); 125 }); 126 ``` 127 1285. 启动搜索局域网内的MDNS服务。 129 130 ```ts 131 // 启动搜索局域网内的MDNS服务。 132 discoveryService.startSearchingMDNS(); 133 ``` 134 1356. 停止搜索局域网内的MDNS服务。 136 137 ```ts 138 // 停止搜索局域网内的MDNS服务。 139 discoveryService.stopSearchingMDNS(); 140 ``` 141 1427. 取消订阅的MDNS服务。 143 144 ```ts 145 // 取消订阅的MDNS服务。 146 discoveryService.off('discoveryStart', (data: mdns.DiscoveryEventInfo) => { 147 console.log(JSON.stringify(data)); 148 }); 149 discoveryService.off('discoveryStop', (data: mdns.DiscoveryEventInfo) => { 150 console.log(JSON.stringify(data)); 151 }); 152 discoveryService.off('serviceFound', (data: mdns.LocalServiceInfo) => { 153 console.log(JSON.stringify(data)); 154 }); 155 discoveryService.off('serviceLost', (data: mdns.LocalServiceInfo) => { 156 console.log(JSON.stringify(data)); 157 }); 158 ``` 159 160## 相关实例 161 162针对MDNS管理,有以下相关实例可供参考: 163 164* [MDNS管理](https://gitcode.com/openharmony/applications_app_samples/tree/master/code/DocsSample/NetWork_Kit/NetWorkKit_Datatransmission/MDNS_case) 165