BLE 低功耗蓝牙是现在很多智能硬件产品的必备模块,今天分享一个基于 BLE 4.0 协议的开发实战案例。

相关知识点

数据大小端

即数据在内存布局中的字节序问题,比如 0x1122,在大端模式中 0x11 在低字节位,0x22 在高字节位,小端模式中相反,大小端模式( Big Endian / Little Endian )也可记为大尾端模式/小尾端模式。

图1-Big/Little Endian

TCP/IP 协议规定了网络字节序为大端模式。

实战

数据包的大小

BLE 4.0 协议规定了 payload 最大 27 字节,L2CAP 的头占去了 4 个字节,剩下 23 字节的 MTU,其中 ATT 层会用掉 1 个字节作为 op code,2 个字节作为 attribute handle,最后剩下的 20 个字节就可以作为我们今天案例的用武之地了。

分片包组成结构

今天分享的案例中,假定我们已经和硬件模块约定好了分片包的组成结构,最长为 20 个字节,我们用内存地址 0-19 简单表示其结构如下图所示:

图2-分片包组成结构

具体的:

  1. 第 1 包 offset 为 0
  2. 第 1 包 endflag 为 0 表示本包为分片包,为 1 表示本包为非分片包,非第 1 包中,endflag 为 0 表示非结束包,为 1 表示最后的包
  3. 第 1 包中,taildata 为 7-19 bytes
  4. 非第 1 包中,taildata 为 5-len bytes

数据包解码

有时我们需要对原始数据做一些简单处理后再传输,这时就需要约定编/解码规则,比如:

  1. 第 1、2 字节为固定字符
  2. 剩余字节采用 Base64 编码
  3. 约定具体字段所在字节位
  4. 约定 crc 多项式、宽度、初始值等校验模型
  5. 处理多字节字段的网络字节序

相关资源:

  1. libcrc - Multi platform CRC library
  2. CRC(循环冗余校验)在线计算

最后

好的,今天就分享到这里吧!谢谢 各位看官辛苦了💦!如果喜欢请赏个雪糕🍦吃呗大爷,打个赏呗!