• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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