上一篇简单介绍了蓝牙4.0的iOS实现代码,详细的东西大家可以去github上搜babyBluetooth,里面有一些学习资料,接下来分享的是OTA升级的东西,我们假定看这篇文章的时候,关于iOS和外设间的蓝牙收发数据已经掌握的很6
OTA(Over-the-Air)空中传输,一般用于固件升级。其实和数据传输一样,很简单,发送指令,接受指令,发送bin数据包,结束指令。。。只是蓝牙传输的数据大小使得这一步骤稍显复杂。
首先,文件传输,其实也是传输的数据,即 NSData,和普通的 peripheral 写入没什么区别。固件升级的文件一般是 .bin 文件,也有 .zip 的。不过这些文件,都是数据,所以首先将文件转为 NSData
需要注意的是:data 一般很长,毕竟是文件。直接通过 writeValue:forCharacteristic:type: 写入的话,不会有任何回调。哪怕是错误的回调,都没有。这是因为蓝牙单次传输的数据大小是有限制的。
我们一般使用20bytes作为标准,即将bin文件转为NSData,然后截成每个20bytes的包发送;这些步骤需要和刷firmware的工程师协商,指定一个协议,接下来以公司的YModem协议举例
YModem协议是由XModem协议演变而来的,是一种发送并等待的协议,即发送方发送一个数据包以后,都 要等待接收方的确认。如果是 ACK 信号,则可以发送新的包。如果是 NAK 信号, 则重发或者错误退出。
每包数据可以达到1024字节,是一个非常高效的文件传输协议
开启是由接收方开启传输,它发一个大写字母 C(0x43) 开启传输。然后进入 等待 SOH(0x01))状态,如果没有回应,就会超时退出。
发送方开始时处于等待过程中,等待 C。收到 C 以后,发送(SOH)数 据包开始信号,发送序号(00),补码(FF),“文件名”,“\0”“文件大小” “除去序号外,补满 128 字节”,16位CRC 校验两个字节,高字节在前,低字节在后。进入等待(ACK)状态。 - 内容示例: SOH 00 FF Foo.bin NUL[123] CRC CRC
接收方收到以后,CRC 校验满足,则发送 ACK。发送方接收到 ACK,又 进入等待“文件传输开启”信号,即重新进入等待“C”的状态。
前面接收方只是收到了一个文件名,现在正式开启文件传输,Ymodem 支持 128 字节和 1024 字节一个数据包。128 字节以(SOH)开始,1024 字节以(STX)开始。接收方又发出一个“C”信号,开始准备接收文件。进入等待“SOH”或者“STX”状态。
发送接收到“C”以后,发送第一个数据包,(SOH)(01序号)(F E补码)(128位数据)(CRC校验),或者(STX)(01序号)(F E补码)(1024位数据)(CRC校验),不满128或者1024,用0x00补齐,等待接收方“ACK”。 - 内容示例:STX 01 FE data[1024] CRC CRC
文件发送完以后,发送方发出一个“EOT”信号,接收方也以“A CK”回应。然后接收方会再次发出“C”开启另一次传输,若接着发送方会发出一个“全0数据包”,接收方“ACK”以后,本次通信正式结束。
当然Ymodem相对于Xmodem改进的地方就在于传输再次 开启以后,又可以发送另外一个文件,即一次传输允许发送多个文件,但这个 特性我还没有用过,暂且不提。
最后CRC两字节:这里需要注意,只有数据部分128或者1024参与了效CRC验,不包括头和编码部分。
以上就是YModem协议进行OTA升级的概述
https://github.com/jakajacky/OTA_YModem
