IOS蓝牙4.0BLE开发之空中升级(OAD)
1.简述
IOS蓝牙开发中有时候会有这样的需求,当你的APP为中心设备的时候,如果你的外部设备的固件需要更新,那么你就可以很方便的利用这种基于BLE协议栈的无线更新技术OAD来更新你的固件,从而达到不需要拆机就可以实现更新的目的。这其中还有一些其他的硬件相关的东西就不再一一阐述了,因为这个功能不同的设备有不同的方式,这里只是提供一种实现思路,可以作为参考。具体的实现还需要根据实际情况来完成。
2.开启设备的OAD服务
一般情况下使用空中升级功能的时候你的外部设备都会专门开启一个服务,来进行空中升级。不过有的设备是这个服务一直在开着,那么就不需要开启了,直接进行升级操作就好了。但是为了安全起见基本上都是采取需要升级时通过向设备发送开启命令,来开启OAD服务的。
一般的步骤就是:
1.向设备的基础服务(根据具体情况)中的写入特征写入一个开启OAD服务的命令。
2.断开与设备的连接。
3.连接设备并重新扫描设备的服务于特征。
4.发现OAD服务和特征(一般是两个)之后 开始准备进行OAD升级。
注意:这里说一下为什么发送开启OAD服务的命令之后要断开与设备的连接呢,由于设备开启OAD服务之后有的可能会重启也有可能不会重启这个要看具体的硬件情况,所以为了保证两种情况下都可以扫描到该服务,所以就有了重新连接这个操作。当然,你也可以根据实际的硬件情况具体来设置。
3.开始OAD升级
当你已经开启了OAD服务并且扫描到其中的特征之后,你就可以开始你的OAD升级过程了,一般这个服务中都会有两个特征。这个过程的步骤是要根据硬件的设置来具体分析进行的。
一般情况下分为以下几个步骤:
1.向其中一个特征值写入一个命令,写入成功之后BLE设备会给你返回来一个值,然后对这个值做一些运算,以此来判断该升级映像A还是映像B。关于映像AB这方面的东西如果大家想了解的话可以去看一下一些资料BLE空中升级教程 。
2.我们会事先拿到两个对应于A和B的两个bin文件,如果升级A就将A.bin转化为data刷入,反之就刷入B.bin。在刷入bin文件之前一般会先会向其中一个特征写入一个命令,进行一次握手。
3.如果握手成功那么就先取得将要刷入文件的版本以及长度等信息,这个取得的计算过程要看实际各自的算法,取到之后先把这些数据通过规定的特征发送给硬件,接下来就是开始正式刷入了。
4.一般刷入的过程是每次向硬件写入16或者18个字节,这个也是看具体的设置情况,最好是开一个分线程再分线程里进行刷入的操作。但是如果直接通过一个for循环来持续刷入,刷入的速度过快可能会导致写入失败。这时候我么就需要一个定时器了,每隔一段时间刷入一次来确保安全刷入。
注意:每刷入一次数据都会通过系统的回调方法来判断你是否刷入成功,但是可能是由于刷入的速度比较快,并不是每次刷入完之后,通过回调告诉你刷入成功之后才会进行下次刷入。就是说每次的刷入和回调不是同步的,但是你刷入几次肯定是会回调几次的。这个问题我还没有完全的搞清楚。所以会出现我的数据可能一分钟就已经全部写进去了,但是回调的比较慢,数据都读完了,系统还在不断的回调告诉我写入成功,此时你必须要等回调方法完全调完停止调用之后,你才是真正的全部刷完了,这里一定要注意这个问题。
最近由于有需求所以写了这么一个功能,这里写一下这个过程,供大家参考。有什么错误或者有问题的地方希望大家多多指正,共同进步。