一.为何要晋级

蓝牙固件晋级是运用手机给固件进行更新,以达到修正bug的目的,完善功能的效果。晋级的大概流程是:
1.当蓝牙设备的固件需要晋级时,由嵌入式开发人员供给新的固件,由服务器管理人员将固件放到服务器上。
2.用户打开手机 APP 的时候会检测到服务器有更新,恳求更新蓝牙设备固件,承认更新后,手时机从服务器下载固件。
3.下载完毕后,APP 会读取固件内容,并依据晋级协议将内容传到蓝牙设备里,完结晋级。

我们常讲的DFUDevice Firmware Update(设备固件更新) ,OTAOver The Air(隔空晋级)

二.固件晋级的流程
各个厂商的设备流程或许不一致,但大同小异,这里只说大致的流程:
首先要从云端下载的固件为 .bin 后缀的文件,文件名会有必定的格局,含有固件版本号和文件 CRC32 校验值。
其次是数据分块,规定一个数据块大小比如 1024 字节,然后把晋级数据进行分块,不够的就剩余多少作为一块。蓝牙一次发送的数据量是有限的,所以每次发送 20 字节的数据。这个数据要遵循晋级数据格局,带指令头和校验码,下载包的数据仅仅这 20 字节中的一部分。所有包内数据都携带在每条晋级数据指令中。
最终便是晋级的进程:

1.  连接设备,发送晋级恳求。
2.  待蓝牙承认之后,开端发送数据头奉告蓝牙此次发送的数据量和 CRC 校验。
3.  开端发送晋级数据。(每条数据之间距离 20ms 为了蓝牙可以便利处理)。
4.  等候一个块发送完就发送块结束指令。
5.  蓝牙承认发送下一个块,返回过错则终止此次晋级。
6.  发完所有数据之后发送晋级完结。
7.  蓝牙承认则晋级完结,返回过错则晋级失利。

蓝牙固件晋级最复杂的就在晋级进程,很多的数据与蓝牙交互。DFU固件晋级可以运用NRF的github开源库,具体完成可参阅这篇文章.