鸿蒙开发(NEXT/API 12)【应用间消息通信】手机侧应用开发

在手机侧与穿戴设备侧构建应用到应用的通信隧道,用于收发应用自定义的报文消息以及文件。实现手机应用和穿戴设备应用间的交互,为用户提供分布式场景和体验。比如手机应用发送音频文件到穿戴设备侧应用,实现在穿戴设备侧应用上播放音乐;手机应用发送暂停指令,实现穿戴设备音乐播放暂停等。

收发点对点消息前,需要确保应用已在开发者联盟申请获取设备基础信息权限权限,否则接口将调用失败。

说明

使用该功能前,请确保穿戴设备支持应用安装能力,同时穿戴设备侧已有对应的应用。

  • 手机App和穿戴设备App必须同时处于启动状态。
  • 当手机App启动且穿戴设备App没有启动时,手机App可以通过[startRemoteApp]方法拉起穿戴设备App。

手机侧应用检测穿戴设备侧应用是否安装

注意

该接口的调用需要在开发者联盟申请设备基础信息权限。

  1. 参见[查询可用穿戴设备]章节,获取已连接设备列表。
  2. 参见[目标设备选择]章节,从已连接设备列表中选定需要通信的设备。
  1. 调用[wearEngine]中的[getP2pClient]方法,获取[P2pClient]对象。

  2. 调用[isRemoteAppInstalled]方法,查看是否安装指定的设备应用。

    // 将设备侧应用包名定义为remoteBundleName
    let remoteBundleName: string = '';

    // 步骤3 获取P2pClient对象
    let p2pClient: wearEngine.P2pClient = wearEngine.getP2pClient(getContext(this));

    // 步骤4 查看是否安装指定的设备侧应用
    p2pClient.isRemoteAppInstalled(targetDevice.randomId, remoteBundleName).then((isInstall) => {
    console.info(Succeeded in checking remote app install, result is ${isInstall}.);
    }).catch((error: BusinessError) => {
    console.error(Failed to check remote app install. Code is ${error.code}, message is ${error.message}.);
    })

手机侧应用获取穿戴设备侧应用的版本号

注意

该接口的调用需要在开发者联盟申请设备基础信息权限。

  1. 参见[查询可用穿戴设备]章节,获取已连接设备列表。
  2. 参见[目标设备选择]章节,从已连接设备列表中选定需要通信的设备。
  1. 调用[wearEngine]中的[getP2pClient]方法,获取[P2pClient]对象。

  2. 调用[getRemoteAppVersion]方法,获取指定设备对应的应用版本号。

    // 将设备侧应用包名定义为remoteBundleName
    let remoteBundleName: string = '';

    // 步骤3 获取P2pClient对象
    let p2pClient: wearEngine.P2pClient = wearEngine.getP2pClient(getContext(this));

    // 步骤4 获取指定设备对应的应用版本号
    p2pClient.getRemoteAppVersion(targetDevice.randomId, remoteBundleName).then((version) => {
    console.info(Succeeded in getting remote app version, version is ${version}.);
    }).catch((error: BusinessError) => {
    console.error(Failed to check get remote app version. Code is ${error.code}, message is ${error.message}.);
    })

手机侧应用拉起设备侧应用

注意

该接口的调用需要在开发者联盟申请设备基础信息权限。

在发送点对点消息前,可以用[startRemoteApp]方法拉起设备侧应用。

  1. 参见[查询可用穿戴设备]章节,获取已连接设备列表。

  2. 参见[目标设备选择]章节,从已连接设备列表中选定需要通信的设备。

  3. 调用[wearEngine]中的[getP2pClient]方法,获取[P2pClient]对象。

  4. 调用[startRemoteApp]方法,指定需要拉起设备侧应用包名。[transformLocalBundleName]默认值为false,传入为true时,wearEnigne会将本地的应用包名和指纹转换为兼容应用在云侧存储的包名和指纹。

    // 将设备侧应用包名定义为remoteBundleName
    let remoteBundleName: string = '';

    // 步骤3 获取P2pClient对象
    let p2pClient: wearEngine.P2pClient = wearEngine.getP2pClient(getContext(this));

    // 步骤4 拉起设备侧指定应用(transformLocalBundleName不传入参数,默认为false)
    p2pClient.startRemoteApp(targetDevice.randomId, remoteBundleName).then((p2pResult) => {
    console.info(Succeeded in starting remote app, result is ${p2pResult.code}.);
    }).catch((error: BusinessError) => {
    console.error(Failed to start remote app. Code is ${error.code}, message is ${error.message}.);
    })

手机侧应用发送点对点消息或文件到穿戴设备侧应用

注意

该接口的调用需要在开发者联盟申请设备基础信息权限。

消息长度大小的限制为4096字节。针对消息长度超过限制的情况可以采用发送文件(文件大小不超过100MB)的方式或进行消息分包控制。

手机侧实现发送消息和文件功能后,穿戴设备侧应用需要对应实现接收消息和文件的功能。

发送点对点消息

为了使用工具类构造消息体,请先导入所需模块。

import { util } from '@kit.ArkTS';
  1. 参见[查询可用穿戴设备]章节,获取已连接设备列表。
  2. 参见[目标设备选择]章节,从已连接设备列表中选定需要通信的设备。
  3. 构造设备侧应用参数[P2pAppParam]。
  4. 构造需要发送的消息[P2pMessage]。
  1. 调用[wearEngine]中的[getP2pClient]方法,获取[P2pClient]对象。

  2. 调用[sendMessage]方法,从手机上的应用发送简短消息到穿戴设备侧对应的应用。设备侧已注册监听消息接收后,即可收到手机发送的消息。

    // 步骤3 构造设备侧应用参数
    let appInfo: wearEngine.AppInfo = {
    // 设置设备侧应用的应用信息:包名与指纹
    bundleName: '',
    fingerprint: ''
    }
    let appParam: wearEngine.P2pAppParam = {
    remoteApp: appInfo
    // transformLocalAppInfo默认为false,不转换包名指纹
    }

    // 设置需要发送的消息内容,长度限制为4096字节
    let messageContent: string = 'this is message';

    // 步骤4 构造消息结构体
    let textEncoder: util.TextEncoder = new util.TextEncoder;
    let message: wearEngine.P2pMessage = {
    content: textEncoder.encodeInto(messageContent)
    }

    // 步骤5 获取P2pClient对象
    let p2pClient: wearEngine.P2pClient = wearEngine.getP2pClient(getContext(this));

    // 步骤6 发送消息
    p2pClient.sendMessage(targetDevice.randomId, appParam, message).then((p2pResult) => {
    console.info(Succeeded in sending message, result is ${p2pResult.code}.);
    }).catch((error: BusinessError) => {
    console.error(Failed to send message. Code is ${error.code}, message is ${error.message}.);
    })

发送文件

为能正确打开文件描述符,请先导入模块。

import { fileIo } from '@kit.CoreFileKit';
  1. 参见[查询可用穿戴设备]章节,获取已连接设备列表。
  2. 参见[目标设备选择]章节,从已连接设备列表中选定需要通信的设备。
  3. 构造设备侧应用参数[P2pAppParam]。
  1. 根据文件路径filePath,构造需要发送的文件[P2pFile]。

  2. 调用[wearEngine]中的[getP2pClient]方法,获取[P2pClient]对象。

  3. 调用[transferFile]方法,从手机上的应用发送文件到穿戴设备侧对应的应用。

    // 步骤3 构造设备侧应用参数
    let appInfo: wearEngine.AppInfo = {
    // 设置设备侧应用的应用信息:包名与指纹
    bundleName: '',
    fingerprint: ''
    }
    let appParam: wearEngine.P2pAppParam = {
    remoteApp: appInfo
    // transformLocalAppInfo默认为false,不转换包名指纹
    }

    // 步骤4 构造需要发送的文件
    let p2pfile: wearEngine.P2pFile = {
    // 设置需要发送的文件路径,其中不能包含'..'
    file: fileIo.openSync('')
    }

    // 步骤5 获取P2pClient对象
    let p2pClient: wearEngine.P2pClient = wearEngine.getP2pClient(getContext(this));

    // 步骤6 发送指定文件至设备
    p2pClient.transferFile(targetDevice.randomId, appParam, p2pfile, (error: BusinessError, p2pResult: wearEngine.P2pResult) => {
    // callback处理逻辑
    if (error) {
    console.error(Failed to transfer file. Code is ${error.code}, message is ${error.message}.);
    return;
    }
    if (p2pResult.code) {
    if (p2pResult.code === wearEngine.P2pResultCode.COMMUNICATION_SUCCESS) {
    console.info(Succeeded in transfering file, the result is ${p2pResult.code}.);
    }
    console.info(Failed to transfer file, the error code is ${p2pResult.code}.);
    }
    if (p2pResult.progress) {
    console.info(Succeeded in transfering file, the progress is ${p2pResult.progress}.);
    }
    });

    fileIo.close(p2pfile.file);

取消发送文件

  1. 参见[查询可用穿戴设备]章节,获取已连接设备列表。
  2. 参见[目标设备选择]章节,从已连接设备列表中选定需要通信的设备。
  3. 构造设备侧应用参数[P2pAppParam]。
  1. 根据文件路径filePath,构造需要取消发送的文件[P2pFile])。

  2. 调用[wearEngine]中的[getP2pClient]方法,获取[P2pClient]对象。

  3. 调用[cancelFileTransfer]方法,取消从手机上的应用到穿戴设备侧对应的应用的文件发送。

    // 步骤3 构造设备侧应用参数
    let appInfo: wearEngine.AppInfo = {
    // 设置设备侧应用的应用信息:包名与指纹
    bundleName: '',
    fingerprint: ''
    }
    let appParam: wearEngine.P2pAppParam = {
    remoteApp: appInfo
    // transformLocalAppInfo默认为false,不转换包名指纹
    }

    // 步骤4 构造需要发送的文件
    let p2pfile: wearEngine.P2pFile = {
    // 设置需要发送的文件路径,其中不能包含'..'
    file: fileIo.openSync('')
    }

    // 步骤5 获取P2pClient对象
    let p2pClient: wearEngine.P2pClient = wearEngine.getP2pClient(getContext(this));

    // 发送指定文件至设备
    p2pClient.transferFile(targetDevice.randomId, appParam, p2pfile, () => {
    // 回调函数执行逻辑
    })

    // 步骤6 取消发送文件
    p2pClient.cancelFileTransfer(targetDevice.randomId, appParam, p2pfile).then((p2pResult) => {
    if (p2pResult.code === wearEngine.P2pResultCode.COMMUNICATION_SUCCESS) {
    console.info(Succeeded in cancelling transfer file, the result is ${p2pResult.code}.);
    }
    }).catch((error: BusinessError) => {
    console.error(Failed to cancel transfer file. Code is ${error.code}, message is ${error.message}.);
    })

    fileIo.close(p2pfile.file);

订阅接收穿戴设备侧应用发过来的消息

注意

该接口的调用需要在开发者联盟申请设备基础信息权限。

  1. 参见[查询可用穿戴设备]章节,获取已连接设备列表。

  2. 参见[目标设备选择]章节,从已连接设备列表中选定需要通信的设备。

  3. 调用[wearEngine]中的[getP2pClient]方法,获取[P2pClient]对象。

  4. 构造设备侧应用参数[P2pAppParam]。

  5. 构造接收到设备侧传来消息后的回调函数[callback]。

  6. 调用[registerMessageReceiver]方法,订阅监听消息接收事件。

    // 步骤3 获取P2pClient对象
    let p2pClient: wearEngine.P2pClient = wearEngine.getP2pClient(getContext(this));

    // 步骤4 构造设备侧应用参数
    let appInfo: wearEngine.AppInfo = {
    bundleName: '',
    fingerprint: ''
    }
    // 将设备侧应用参数类定义为appParam
    let appParam: wearEngine.P2pAppParam = {
    remoteApp: appInfo
    // transformLocalAppInfo默认为false,不转换包名指纹
    }

    // 步骤5 构造回调函数
    let callback = (p2pMessage: wearEngine.P2pMessage) => {
    console.info(Succeeded in receiving message, the message is ${p2pMessage.content}.);
    }

    // 步骤6 订阅监听消息接收事件
    p2pClient.registerMessageReceiver(targetDevice.randomId, appParam, callback).then(() => {
    console.info(Succeeded in registering message receiver.);
    }).catch((error: BusinessError) => {
    console.error(Failed to register message receiver. Code is ${error.code}, message is ${error.message}.);
    })

  7. 调用[unregisterMessageReceiver]方法,手机应用取消接收穿戴设备侧应用发过来的消息,需要传入订阅监听时的同一个回调函数对象。

    p2pClient.unregisterMessageReceiver(targetDevice.randomId, appParam, callback).then(() => {
    console.info(Succeeded in unregistering message receiver.);
    }).catch((error: BusinessError) => {
    console.error(Failed to unregister message receiver. Code is ${error.code}, message is ${error.message}.);
    })

订阅接收穿戴设备侧发送过来的文件

  1. 参见[查询可用穿戴设备]章节,获取已连接设备列表。

  2. 参见[目标设备选择]章节,从已连接设备列表中选定需要通信的设备。

  3. 调用[wearEngine]中的[getP2pClient]方法,获取[P2pClient]对象。

  4. 构造设备侧应用参数[P2pAppParam]。

  5. 构造接收到设备侧传来文件后的回调函数[callback]

  6. 调用[registerFileReceiver] 方法,订阅监听文件接收事件。

    // 步骤3 获取P2pClient对象
    let p2pClient: wearEngine.P2pClient = wearEngine.getP2pClient(getContext(this));

    // 步骤4 构造设备侧应用参数
    let appInfo: wearEngine.AppInfo = {
    bundleName: '',
    fingerprint: ''
    }
    // 将设备侧应用参数类定义为appParam
    let appParam: wearEngine.P2pAppParam = {
    remoteApp: appInfo
    // transformLocalAppInfo默认为false,不转换包名指纹
    }

    // 步骤5 构造回调函数
    let callback = (p2pMessage: wearEngine.P2pFile) => {
    console.info(Succeeded in receiving file.);
    }

    // 步骤6 订阅监听文件接收事件
    p2pClient.registerFileReceiver(targetDevice.randomId, appParam, callback).then(() => {
    console.info(Succeeded in registering file receiver.);
    }).catch((error: BusinessError) => {
    console.error(Failed to register file receiver. Code is ${error.code}, message is ${error.message}.);
    })

  7. 调用[unregisterFileReceiver] 方法,手机应用取消接收穿戴设备侧应用发过来的文件,需要传入订阅监听时的同一个回调函数对象。

    p2pClient.unregisterFileReceiver(targetDevice.randomId, appParam, callback).then(() => {
    console.info(Succeeded in unregistering file receiver.);
    }).catch((error: BusinessError) => {
    console.error(Failed to unregister file receiver. Code is ${error.code}, message is ${error.message}.);
    })

最后呢

很多开发朋友不知道需要学习那些鸿蒙技术?鸿蒙开发岗位需要掌握那些核心技术点?为此鸿蒙的开发学习必须要系统性的进行。

而网上有关鸿蒙的开发资料非常的少,假如你想学好鸿蒙的应用开发与系统底层开发。你可以参考这份资料,少走很多弯路,节省没必要的麻烦。由两位前阿里高级研发工程师联合打造的《鸿蒙NEXT星河版OpenHarmony开发文档 》里面内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(Harmony NEXT)技术知识点

如果你是一名Android、Java、前端等等开发人员,想要转入鸿蒙方向发展。可以直接领取这份资料辅助你的学习。下面是鸿蒙开发的学习路线图。

针对鸿蒙成长路线打造的鸿蒙学习文档。话不多说,我们直接看详细鸿蒙(OpenHarmony )手册(共计1236页)与鸿蒙(OpenHarmony )开发入门视频,帮助大家在技术的道路上更进一步。

  • 《鸿蒙 (OpenHarmony)开发学习视频》
  • 《鸿蒙生态应用开发V2.0白皮书》
  • 《鸿蒙 (OpenHarmony)开发基础到实战手册》
  • OpenHarmony北向、南向开发环境搭建
  • 《鸿蒙开发基础》
  • 《鸿蒙开发进阶》
  • 《鸿蒙开发实战》

总结

鸿蒙---作为国家主力推送的国产操作系统。部分的高校已经取消了安卓课程,从而开设鸿蒙课程;企业纷纷跟进启动了鸿蒙研发。

并且鸿蒙是完全具备无与伦比的机遇和潜力的;预计到年底将有 5,000 款的应用完成原生鸿蒙开发,未来将会支持 50 万款的应用。那么这么多的应用需要开发,也就意味着需要有更多的鸿蒙人才。鸿蒙开发工程师也将会迎来爆发式的增长,学习鸿蒙势在必行! 自↓↓↓拿

相关推荐
嵌入式大圣2 小时前
单片机结合OpenCV
单片机·嵌入式硬件·opencv
️ 邪神3 小时前
【Android、IOS、Flutter、鸿蒙、ReactNative 】自定义View
flutter·ios·鸿蒙·reactnative·anroid
日晨难再3 小时前
嵌入式:STM32的启动(Startup)文件解析
stm32·单片机·嵌入式硬件
yufengxinpian4 小时前
集成了高性能ARM Cortex-M0+处理器的一款SimpleLink 2.4 GHz无线模块-RF-BM-2340B1
单片机·嵌入式硬件·音视频·智能硬件
SameX4 小时前
HarmonyOS Next 安全生态构建与展望
前端·harmonyos
SameX4 小时前
HarmonyOS Next 打造智能家居安全系统实战
harmonyos
__基本操作__5 小时前
历遍单片机下的IIC设备[ESP--0]
单片机·嵌入式硬件
zy张起灵11 小时前
48v72v-100v转12v 10A大功率转换电源方案CSM3100SK
经验分享·嵌入式硬件·硬件工程
Random_index12 小时前
#Uniapp篇:支持纯血鸿蒙&发布&适配&UIUI
uni-app·harmonyos
鸿蒙自习室15 小时前
鸿蒙多线程开发——线程间数据通信对象02
ui·harmonyos·鸿蒙