首页 > 编程笔记 > 通用技能 阅读:2

鸿蒙中的MDNS管理(附带实例)

MDNS 即多播 DNS,提供局域网内的本地服务添加、移除、发现、解析等能力。

本地服务是局域网内服务的提供方,比如打印机、扫描器等。

MDNS 管理的典型场景有:
为了保证应用的运行效率,大部分 API 调用都是异步的。对于异步调用的 API,均提供了 callback 和 Promise 两种方式。

MDNS接口

MDNS 的接口及其说明如下表所示:

表:MDNS 的接口
接口名 说明
addLocalService(context:Context, serviceInfo:LocalServiceInfo,callback: AsyncCallback<LocalServiceInfo>): void 添加一个 MDNS 服务,使用 callback 方式作为异步方法
removeLocalService(context:Context, serviceInfo:LocalServiceInfo,callback: AsyncCallback<LocalServiceInfo>): void 移除一个 MDNS 服务,使用 callback 方式作为异步方法
createDiscoveryService(context:Context, serviceType: string): DiscoveryService 返回一个 DiscoveryService 对象,该对象用于发现指定服务类型的 MDNS 服务
resolveLocalService(context:Context, serviceInfo:LocalServiceInfo,callback: AsyncCallback<LocalServiceInfo>): void 解析一个 MDNS 服务,使用 callback 方式作为异步方法
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<LocalServiceInfo>): void 订阅发现 MDNS 服务的通知
off(type:'serviceFound',callback?: Callback<LocalServiceInfo>): void 取消发现 MDNS 服务的通知
on(type:'serviceLost',callback: Callback<LocalServiceInfo>): void 订阅移除 MDNS 服务的通知
off(type:'serviceLost',callback?: Callback<LocalServiceInfo>): void 取消移除 MDNS 服务的通知

管理本地服务

管理本地服务的步骤如下:
管理本地服务的示例代码如下:
let context = getContext(this) as Context;
class ServiceAttribute {
    key: string = "111"
    value: Array<number> = [1]
}

// 建立 LocalService 对象
let localServiceInfo: mdns.LocalServiceInfo = {
    serviceType: "_print._tcp",
    serviceName: "Servicename",
    port: 5555,
    host: {
        address: "10.14.**.***"
    },
    serviceAttribute: [
        {key: "111", value: [1]}
    ]
}

// addLocalService 添加本地服务
mdns.addLocalService(context, localServiceInfo).then((data: mdns.LocalServiceInfo) => {
    console.log(JSON.stringify(data));
});

// resolveLocalService 解析本地服务对象(非必要,根据需求使用)
mdns.resolveLocalService(context, localServiceInfo).then((data: mdns.LocalServiceInfo) => {
    console.log(JSON.stringify(data));
});

// removeLocalService 移除本地服务
mdns.removeLocalService(context, localServiceInfo).then((data: mdns.LocalServiceInfo) => {
    console.log(JSON.stringify(data));
});

发现本地服务

发现本地服务的步骤如下:
发现本地服务的示例代码如下:
export class GlobalContext {
    private constructor() {}
    private static instance: GlobalContext;
    private _objects = new Map<string, Object>();

    public static getContext(): GlobalContext {
        if (!GlobalContext.instance) {
            GlobalContext.instance = new GlobalContext();
        }
        return GlobalContext.instance;
    }
    getObject(value: string): Object | undefined {
        return this._objects.get(value);
    }
    setObject(key: string, objectClass: Object): void {
        this._objects.set(key, objectClass);
    }
}

// Stage 模型获取
contextclass EntryAbility extends UIAbility {
    value:number = 0;
    onWindowStageCreate(windowStage: window.WindowStage): void{
        GlobalContext.getContext().setObject("value", this.value);
    }
}

let context = GlobalContext.getContext().getObject("value") as common.UIAbilityContext;
// 创建 DiscoveryService 对象,用于发现指定服务类型的 MDNS 服务
let serviceType = "_print._tcp";
let discoveryService = mdns.createDiscoveryService(context, serviceType);

// 订阅 MDNS 服务发现相关状态变化
discoveryService.on('discoveryStart', (data: mdns.DiscoveryEventInfo) => {
    console.log(JSON.stringify(data));
});

discoveryService.on('discoveryStop', (data: mdns.DiscoveryEventInfo) => {
    console.log(JSON.stringify(data));
});

discoveryService.on('serviceFound', (data: mdns.LocalServiceInfo) => {
    console.log(JSON.stringify(data));
});

discoveryService.on('serviceLost', (data: mdns.LocalServiceInfo) => {
    console.log(JSON.stringify(data));
});

// 启动搜索局域网内的 MDNS 服务
discoveryService.startSearchingMDNS();
// 停止搜索局域网内的 MDNS 服务
discoveryService.stopSearchingMDNS();
// 取消订阅的 MDNS 服务
discoveryService.off('discoveryStart', (data: mdns.DiscoveryEventInfo) => {
    console.log(JSON.stringify(data));
});
discoveryService.off('discoveryStop', (data: mdns.DiscoveryEventInfo) => {
    console.log(JSON.stringify(data));
});
discoveryService.off('serviceFound', (data: mdns.LocalServiceInfo) => {
    console.log(JSON.stringify(data));
});
discoveryService.off('serviceLost', (data: mdns.LocalServiceInfo) => {
    console.log(JSON.stringify(data));
});

相关文章