基于 NXP QN9080 蓝牙 OTA 实现

一、        概述

在实际产品开发中需要实现蓝牙在线升级的功能,方便用户在使用中能够更新代码,升级版本,本文将介绍如何在实际应用中添加蓝牙 OTA 的功能


二、        环境搭建

2.1 SDK 下载

本文基于 NXP QN9080 IC,SDK 可在 NXP 官网 https://mcuxpresso.nxp.com 下载

2.2 硬件

本文基于 QN9080 DK 板进行开发,DK 板如图 2.2 所示

图 2.2

2.3 开发软件

SDK 支持 IAR 、 Keil 、 MCUXpreeso IDE 三种开发软件、本文以 Keil 为开发环境作为介绍

三、        工程移植

在 SDK_2.2.0_QN908XCDK\boards\qn908xcdk\wireless_examples\bluetooth\hid_device 目录下的工程已经实现蓝牙鼠标的功能,我们可在此工程上移植 otap_client_att 工程

3.1 将 otap_client_att 工程 otap_client_att 目录下 otap_client_att.c 和 otap_client_att.h 文件移到 hid_device 工程 hid_device 目录下,如图 3.1 所示

图 3.1

3.2 打开 hid_device 工程,在工程中需要添加关于 OTA 的 5 个文件夹,在文件夹下添加各自的文件,如图 3.2 所示

图 3.2

3.3 在 C++ 选项卡下添加 5 个路径,如图 3.3 所示

图 3.3

 

3.4 在 souce 文件夹下添加第一步加入的 otap_client_att.c 和 otap_client_att.h ,如图 3.4 所示



图 3.4

3.5 在 otap_client_att.c 中有很多函数与 hid_device.c 中的函数重复,我们需要把相同函数的不同部分进行移植,移植相同函数包括 : BleApp_Config() 、BleApp_ConnectionCallback() 、 BleApp_GattServerCallback()

(1) 在 BleApp_Config() 中添加寄存器回调、开启服务,分配定时器三条语句、如图 3.5-1 所示

图 3.5-1

(2) 在 BleApp_ConnectionCallback() 函数 gConnEvtConnected_c 下添加停止定时器 、Subscribe client 、连接事件处理三条语句,如图 3.5-2 所示

图 3.5-2

(3) 在 BleApp_ConnectionCallback() 函数 gConnEvtDisconnected_c 下添加Unsubscribe client 、断开连接事件处理二条语句,如图 3.5-3 所示

图 3.5-3

(4) 将 otap_client_att.c 中 BleApp_GattServerCallback() 函数的所有 case 语句添加到 hid_device.c 中 BleApp_GattServerCallback() 函数中,如图 3.5-4-1 所示,将添加进来的重复的 case gEvtAttributeWritten_c 进行合并,如图 3.5-4-2 所示

图 3.5-4-1

图 3.5-4-2

3.6 otap_client_att.c 与 hid_device.c 有很多重复的部分,需要在 otap_client_att.c 中删除和 hid_device.c 重复的函数、变量和宏定义

删除关于广播两个结构体声明,两个变量定义重复的部分,如图 3.6-1-1 和3. 6-1-2 所示

图 3.6-1-1



图 3.6-1-2

 

  • 删除关于电池服务一个宏定义、一个变量重复的部分,如图 6-2-1 和3.6-2-2 所示

 

图 3.6-2-1

图 3.6-2-2

  • 删除 Service Data 的 3 个数组,如图 6-3 所示

图 3.6-3

  • 删除前面 9 个重复的函数和最后面一个电池服务的函数,具体包括: BleApp_Init() 、 BleApp_Start() 、 BleApp_HandleKeys() 、 BleApp_GenericCallback() 、 BleApp_Config() 、 BleApp_Advertise() 、BleApp_AdvertisingCallback() 、 BleApp_ConnectionCallback() 、BleApp_GattServerCallback() 、 BatteryMeasurementTimerCallback()

(4) 删除 6 个重复的函数声明,具体如图 6-4 所示

图 3.6-4

3.7 将 otap_client_att.c 中剩余所有函数的 static 属性去掉,因为需要在 hid_device.c 中调用,部分移除效果如图 3.7 所示

图 3.7


3.8 将 otap_client_att.c 中剩余函数声明的 static 属性去掉,将函数声明放入 otap_client_att.h,如图 3.8 所示

图 3.8

3.9 将 otap_client_att.h 中函数声明和宏定义部分去除,如图 3.9 所示

图 3.9

3.10 将 otap_client_att.c 中 otapClientState_tag 和 otapClientAppData_tag  两个结构体的声明放入 otap_client_att.h, 如图 3.10 所示

图 3.10

3.11 将 otap_client_att.c中 appTimerId 、 otapServiceConfig 、otapWriteNotifHandles 、 otapClientData 四个变量的 static 去掉、在otap_client_att.h 中将其声明为外部变量,如图 3.11 所示

图 3.11

3.12 将 otap_client_att.c 中的除了 otap_client_att.h 的所有头文件移到 otap_client_att.h 中,如图 3.12 所示

图 3.12

3.13 因为 otap_client_att.h 与 hid_device.h 采用相同的字段 _APP_H_ 防止重复调用,应把 otap_client_att.h 的 _APP_H_ 修改为 _OTAP_CLIENT_ATT_H_,如图 3.13 所示

 

图 3.13

 

3.14 在 hid_device.c 中添加 otap_client_att.h 头文件,如图 3.14 所示

 

图 3.14

 

3.15 在 otap_client_att 工程 gatt_db.h 中关于创建 OTA 服务和特征的部分添加到 hid_device 工程 gatt_db.h 中,如图 3.15 所示

 

图 3.15

3.16 在 otap_client_att 工程 gatt_uuid128.h 中关于 OTA UUID 的部分添加到 hid_device 工程 gatt_uuid128.h 中,如图 3.16 所示

 

图 3.16

 

3.17 在 otap_client_att 工程 app_preinclude.h 全部复制到 hid_device 工程 app_preinclude.h 中

3.18 在 option -> linker -> Misc controls 中添加两条设置,这两条是设置在烧录的时候预留前面 Bootloader 的空间避免覆盖掉之前烧录好的 Bootloader 内容,如图 3.18 所示

图 3.18

3.19 在 otap_client_att 工程 app_config.c 中关于广播参数的的部分添加到 hid_device 工程 app_config.c 中,移植完成,如图 3.19 所示

图 3.19

四、        总结

本文介绍如何在产品应用中添加 OTA 的功能,实际产品开发还有很多功能需要完成,更多资料可关注大联大世平 - 大大通博文专区编写的《基于 NXP QN9080 低功耗移植》、《基于 NXP QN9080 蓝牙键盘开发》等文档介绍

 

五、        参考文献

【1】《 QN908x user manual 》

【2】《 BLE Application Developer’s Guide 》

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论