HarmonyOS NEXT-杰理SDK对接流程 原创

猜丁壳_
发布于 2025-2-26 18:30
1.8w浏览
0收藏

为啥要写这篇文章 !

  • 想必能看到这篇文章一定是被鸿蒙版本的杰理SDK折磨过的吧!
  • 杰理提供的 demo 业务量太大,提供的文档 api 写的很全面。但是没有接入流程。
  • 所以对于第一次接触这个产品的我来讲,一头雾水不知道如何做起。
  • 但是又不想把整个 杰理demo 全部搬运过来,体积太大了。
  • 自己尝试又不知道从何入手。
  • 希望 杰理 能看到后面 HarmonyOS NEXT版本文档出一个初始化对接必要流程.

下面是我查询到的 鸿蒙next 版本的对接说明

下面我来介绍一下 HarmonyOS Next 中 BLE杰理SDK对接流程!

上面必须的流程做完可以尝试做业务了

  • OTA

详细步骤

一. 正常初始化蓝牙 、二. 获取 杰理服务和特征值

三. 进行设备认证 ⭐

  • 在获取到 杰理的服务和特征值之后,必须要先进行设备认证
  • ⭐ writeTrait_JieLi 这个是我在第二步获取到的 杰理的写入特征值
  • ⭐ bleSendClass.BLESEND_autoPushSend 这个是消息发送队列
let authListener: JL_Auth.AuthListener = {
  onSendData: (devId: string, data: ArrayBuffer) => {
    // 发送认证数据
    if (writeTrait_JieLi) {
      bleSendClass.BLESEND_autoPushSend({serviceData:new Uint8Array(data),serviceType:writeTrait_JieLi})
    }
  },
  onAuthSuccess: () => {
    console.log("认证成功");
  },
  onAuthFailed: () => {
    console.log("认证失败");
  },
}

// 开始认证
let JLAuth = new JL_Auth.Auth();
JLAuth.startAuth(deviceId, authListener)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

四.进行 RCSP协议 初始化

  • 等到设备认证成功之后在进行 RCSP协议的初始化
  • 在第3onAuthSuccess回调代表已经认证成功了,可以进行 RCSP协议的初始化
  • ⭐ 但是需要知道一点 所谓的初始化,不过是把连接状态同步给 RCSP协议对象 。
// ⭐1. 首先我们需要先创建好 RCSP协议对象
let BLEPROPERTY_rcspImpl: JL_RCSP.RcspImpl = new JL_RCSP.RcspImpl();


// ⭐⭐⭐ 然后给 RCSP协议对象 添加Rcsp事件回调 和 设置RCSP数据发送回调
// 2. 添加 RCSP事件回调
// 2-1 创建回调函数
let  oRcspCallback: JL_RCSP.OnRcspCallback = {
  //Rcsp协议初始化回调
  onRcspInit: async (device, isInit) => {
      // ⭐ isInit true 代表初始化成功
      // ⭐ isInit false 代表初始化失败
     console.log('Rcsp协议已经初始化,结果为:', isInit)
  },
  //RCSP错误事件回调
  onRcspError: (_device, _error, message) => {
    console.log('RCSP错误事件回调', message)
  },
  //需要强制升级回调
  onMandatoryUpgrade: () => { 
    console.log('需要强制升级回调')
  },
  //设备连接状态
  onConnectStateChange: () => { 
    console.log('设备连接状态')
  },
  //设备主动发送的rcsp命令回调
  onRcspCommand: () => {
  },
  //设备回复的rcsp命令回调
  onRcspResponse: () => {
  },
  //设备主动发送的数据命令回调
  onRcspDataCmd: () => {
  },
}
// 2-2 添加事件回调
BLEPROPERTY_rcspImpl.addOnRcspCallback(oRcspCallback)



// 3. 设置RCSP数据发送回调
// 3-1 创建发送数据的回调函数
let onSendDataCallback: JL_RCSP.OnSendDataCallback = {
  //向设备发送RCSP数据包
  sendDataToDevice: (device, data) => {
    // 把收到的消息依旧放入消息队列
    bleSendClass.BLESEND_autoPushSend({serviceData:data ,serviceType:writeTrait_JieLi})
    return true
  }
}
// 3-2 设置RCSP数据发送回调
BLEPROPERTY_rcspImpl.setOnSendDataCallback(this.onSendDataCallback)



// 4 连接状态传递 -- 这两步骤必须做
// 4-1 通知设备状态
BLEPROPERTY_rcspImpl.transmitDeviceState(new JL_RCSP.BtDevice(deviceId), JL_RCSP.ConnectState.CONNECTED)
// 4-2 初始化RCSP操作封装对象
const operateWrapper = new JL_RCSPOP.RcspOperateWrapper(rcspImpl);

// 注意点:⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
// 1、2、3 这个步骤在认证之前做也可以。不用非的等到认证成功再去创建。
// 4-2 可以在 步骤三 中的 onAuthSuccess 回调中做
// 4-1 需要在 'BLECharacteristicChange' 监听蓝牙状态中调用,通知杰理SDK当前设备的状态
//     并且,new JL_RCSP.BtDevice(deviceId) 这个需要保存下来让更新状态的时候为 同一个设备。

// 所以当设备认证成功后,执行 4-2 , 然后实时的还要更新当前设备的状态

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.

五. 进行必须的获取操作

  • 这个是根据 杰理 提供的 demo 中所描述必须操作
  • 在 Rcsp协议初始化回调 onRcspInit 回调中执行。但是要是初始化成功状态
  • 这里只是展示需要的操作,实际工作中需要做好错误处理

//step:获取系统flash信息(必须)
  const flashInfo =
    await operateWrapper.getOperateByClass(JL_RCSPOP.OPWatch.OperateWatch.prototype)?.getFlashInfo()

//step:获取在线的SDCardBean信息(在线的存储设备)(必须)
  const lineSdCardBeans =
    await operateWrapper.getOperateByClass(JL_RCSPOP.OPFile.OperateFile.prototype)?.getOnLineSdCardBeansAsync()

//step:读取表盘列表(必须)
  const diallist =
    await operateWrapper.getOperateByClass(JL_RCSPOP.OPWatchDial.OperateWatchDial.prototype)?.getWatchResourseFileList()

//step:获取手表配置信息(必须)
  const configureInfo =
    await operateWrapper.getOperateByClass(JL_RCSPOP.OPDevice.OperateDevice.prototype)?.getDeviceConfigureInfo()

//step:读取手表是否在运动模式(必须)
  const sportStatus =
    await operateWrapper.getOperateByClass(JL_RCSPOP.OPSport.OperateSport.prototype)?.getSportsStatus(true)

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.

做完上述操作,杰理SDK 就已经把 关键性动作 做完了。剩下就是看 API 完成业务和整个项目的架构

有一个需要知道的地方可以优化的地方

  • getOperateByClass 用来获取对应RCSP操作OP
    • 注意:在设备未改变的情况下,RCSP对象是同一个的情况下。getOperateByClass 获取到的操作类,为同一个;
    • 所以可以把 获取对象的操作类,可以保存起来下次直接使用。

下面讲一下 OTA升级流程

  • 打开升级资源文件
  • 创建 OTA类
  • 开始升级
  • 设备回连函数
  • 更新RCSP协议

详细步骤

一 打开升级资源文件

  • 如果是线上资源则需要先把资源下载并保存到本地
// updateFilePath 是资源文件的路径
let file = fileIo.openSync(updateFilePath, fileIo.OpenMode.READ_WRITE);
// 获取文件的 文件描述符fd
let fileFD = file.fd;

// ⭐⭐⭐ 注意:现在获取完了不要关闭文件!!!!
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

二 创建 OTA类

const OTAManager = new JL_OTA.RcspOTAManager(rcspImpl);
  • 1.

三 开始升级

  • 开始升级通过 OTAManager.startOTA 方法进行升级
    • 需要俩个参数,第一个是配置信息,第二个是 回调对象
// 1. 创建 配置信息
let otaConfig: JL_OTA.OtaConfig = new JL_OTA.OtaConfig();
otaConfig.isSupportNewRebootWay = true;


// 2. 创建 回调对象
let upgradeCallback: JL_OTA.OnUpgradeCallback = {
  onStartOTA: () => {
    console.log('OTA开始')
  },
  onReadData: (offset: number, size: number): Uint8Array => {
    console.log('OTA读取升级数据并返回')
  },
  onNeedReconnect: (reConnectMsg: JL_OTA.ReconnectInfo) => {
    console.log('OTA需要回连进行升级重启')
  },
  onProgress: (type: JL_OTA.UpgradeType, progress: number) => {
    console.log('OTA当前升级进度')
  },
  onStopOTA: () => {
    console.log('OTA升级结束')
  },
  onCancelOTA: () => {
    console.log('OTA取消升级')
  },
  onError: (error: number, message: string) => {
    console.log('OTA升级出现错误')
  },
};


// 通过 startOTA 方法开始升级
OTAManager.startOTA(otaConfig, upgradeCallback);

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.

在进行升级回连函数之前,先来完善下,OTA的回调对象 upgradeCallback

  • 只有onReadData读取升级数据返回给SDk 和 onNeedReconnect进行设备回连。这俩个回调是必须要做的,这个是升级的必须步骤。
  • 剩下的内容都是自己业务处理和错误处理。非必须实现
// ⭐⭐⭐ 1. onReadData 读取升级资源文件进度并返回给 SDK
onReadData: (offset: number, size: number): Uint8Array => {
    const buffer = new Uint8Array(size)
    const result = fileIo.readSync(fileFD, buffer.buffer, { offset: offset, length: size })
    if (result == size) {
      return buffer
    } else {
      return new Uint8Array();
    }
}
// ⭐⭐⭐ 2. onNeedReconnect  设备回连
onNeedReconnect: (reConnectMsg: JL_OTA.ReconnectInfo) => {
  // 回连设备的 MAC 地址 
  const oldDeviceMac = reConnectMsg.deviceBleMac?.toUpperCase().replace(/:/g, "");
  
  // 断开已经连接的设备然后重置所有数据
  // 1. 断开连接设备
  // 2. 重置所有数据(包括设备信息、蓝牙gattClient、和所有 杰理相关的所有数据)
  // ⭐ 3. 但是需要保留一个数据就是刚刚为了升级创建的 OTAManager , 因为这个等下回连还需要用到
  
  // 断开连接重置所有数据之后,重新进行蓝牙扫描
  // 把扫描到的数据执行 设备回连函数
},
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.

四、设备回连函数

  • 这个完全可以直接写在 onNeedReconnect 函数里面,我是为了精简业务,所以拆分了一下。
  • 完整的蓝牙流程
// 重连函数
reconnect(scanResult: ble.ScanResult) {
  let result = false;
  // 判断刚刚获取的 回连设备的mac地址
  if (oldDeviceMac) {
    const advertisStr = (JL_OTA.toHexString(scanResult.data) as string).toUpperCase();
    const index = advertisStr.indexOf("D60541544F4C4A");
    if (index != -1 && scanResult.data) {
      const unit8Array = new Uint8Array(scanResult.data);
      const macArray = unit8Array.slice((index / 2) + 8, (index / 2) + 14).reverse();
      result = this.oldDeviceMac == JL_OTA.toHexString(macArray).toUpperCase();
    }
  }
  // 判断当前扫描到的设备是需要回连的设备
  if (result) {
     // 当找到了需要回连设备时候,重新完整走一下蓝牙的流程。
     // 因为已经找到需要回连的设备了,直接走 第3步 开始连接。
     // 这个第3步就是完整蓝牙流程中的第3步,可点击上方连接查看
     // 而且杰理的 RCSP 协议一些数据也需要重新释放然后创建
  }
  // return result;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.

五、更新RCSP协议

  • 当回连设备时候,回连状态通过 BLEConnectionStateChange 得到当前设备已连接时候。需要进行更新动作
// 通过 OTAManager.updateRcspImpl 来更新,刚刚新创建的 RCSP协议 对象
OTAManager.updateRcspImpl(BLEPROPERTY_rcspImpl);
  • 1.
  • 2.

然后OTA就升级结束了,接下来一切顺利的情况下会调用 onStopOTA 这个回调。你可以在这里做你需要的业务。和清空所有数据。包括所有蓝牙数据和杰理所有数据。让用户重新手动连接需要连接的设备。

有什么疑问或问题可以留言,如果哪里有问题欢迎指正。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2025-2-26 20:07:31修改
收藏
回复
举报
1
1条回复
按时间正序
/
按时间倒序
鸿蒙活动小助手
鸿蒙活动小助手

upupup

回复
2025-2-27 14:52:21


回复
    相关推荐
    这个用户很懒,还没有个人简介
    帖子
    视频
    声望
    粉丝
    最近发布
    社区精华内容