以下是一个具体的示例,展示了基于上述自定义蓝牙数据传输应用层协议的完整数据传输过程,包括发送端的数据准备和发送,以及接收端的数据接收和处理。
示例场景
假设我们有两个蓝牙设备,设备 A(源设备)要向设备 B(目标设备)发送一条文本消息 “Hello, Bluetooth World!” 以及一组传感器数据(温度为 26.5 摄氏度,湿度为 55.0%)。
发送端(设备 A)操作
1. 发送文本消息
-
构建数据帧:
- 帧头(Header):
- 起始标志(Start Flag):设置为
0xAA。 - 帧长度(Frame Length):暂时未知,需在确定数据负载后计算得出,先预留 2 个字节位置。
- 数据类型(Data Type):文本消息对应的数据类型为
0x01。 - 源地址(Source Address):假设设备 A 的自定义地址为
0x1234(这里简化为 2 个字节表示),则设置为[0x12, 0x34]。 - 目标地址(Destination Address):假设设备 B 的自定义地址为
0x5678,则设置为[0x56, 0x78]。
- 起始标志(Start Flag):设置为
- 数据负载(Data Payload):
- 将文本消息 “Hello, Bluetooth World!” 转换为 UTF - 8 编码的字节数组,得到
[72, 101, 108, 108, 111, 44, 32, 66, 108, 117, 101, 116, 111, 111, 116, 104, 32, 87, 111, 114, 108, 100, 33]。
- 将文本消息 “Hello, Bluetooth World!” 转换为 UTF - 8 编码的字节数组,得到
- 帧尾(Trailer):
- 校验和(Checksum):采用简单的求和校验方法。先将帧头(除帧长度字段,因为还未确定完整长度)和数据负载部分的所有字节相加,得到总和。假设总和为
0x1234(这里只是示例值),则将其转换为 2 个字节表示,即[0x12, 0x34]。 - 结束标志(End Flag):设置为
0xBB。
- 校验和(Checksum):采用简单的求和校验方法。先将帧头(除帧长度字段,因为还未确定完整长度)和数据负载部分的所有字节相加,得到总和。假设总和为
- 帧头(Header):
-
确定帧长度并填充帧长度字段:
- 计算整个数据帧的长度,从起始标志到结束标志的所有字节数。此时数据帧长度为:1(起始标志) + 2(帧长度字段占位) + 1(数据类型) + 2(源地址) + 2(目标地址) + 23(数据负载字节数) + 2(校验和) + 1(结束标志) = 34 字节。
- 将帧长度值
34转换为 2 个字节的十六进制表示,即[0x22, 0x00],填充到帧长度字段位置。
-
通过蓝牙发送数据帧:将构建好的完整数据帧通过蓝牙模块发送给设备 B。
2. 发送传感器数据
-
构建数据帧:
- 帧头(Header):
- 起始标志(Start Flag):同样为
0xAA。 - 帧长度(Frame Length):预留 2 个字节位置。
- 数据类型(Data Type):传感器数据对应的数据类型为
0x02。 - 源地址(Source Address):还是
[0x12, 0x34]。 - 目标地址(Destination Address):
[0x56, 0x78]。
- 起始标志(Start Flag):同样为
- 数据负载(Data Payload):
- 温度为 26.5 摄氏度,其 IEEE 754 浮点数表示为
[64, 8, 0, 0]。 - 湿度为 55.0%,其 IEEE 754 浮点数表示为
[64, 69, 0, 0]。 - 将温度和湿度的字节数组拼接起来,得到
[64, 8, 0, 0, 64, 69, 0, 0]作为数据负载。
- 温度为 26.5 摄氏度,其 IEEE 754 浮点数表示为
- 帧尾(Trailer):
- 校验和(Checksum):再次采用求和校验。先将帧头(除帧长度字段)和数据负载部分的所有字节相加,假设得到总和为
0x5678(示例值),转换为 2 个字节表示为[0x56, 0x78]。 - 结束标志(End Flag):
0xBB。
- 校验和(Checksum):再次采用求和校验。先将帧头(除帧长度字段)和数据负载部分的所有字节相加,假设得到总和为
- 帧头(Header):
-
确定帧长度并填充帧长度字段:
- 计算数据帧长度:1(起始标志) + 2(帧长度字段占位) + 1(数据类型) + 2(源地址) + 2(目标地址) + 8(数据负载字节数) + 2(校验和) + 1(结束标志) = 19 字节。
- 将帧长度值
19转换为 2 个字节的十六进制表示,即[0x13, 0x00],填充到帧长度字段位置。
-
通过蓝牙发送数据帧:将构建好的传感器数据帧通过蓝牙模块发送给设备 B。
接收端(设备 B)操作
1. 接收文本消息数据帧
- 接收数据:通过蓝牙模块接收来自设备 A 的数据,假设完整接收到了发送端发送的文本消息数据帧。
- 验证帧头:
- 首先检查起始标志是否为
0xAA,如果不是,则认为数据接收错误,丢弃该数据帧。 - 读取帧长度字段,得到值为
34字节,这表示接下来应该接收完整的 34 字节数据帧。 - 检查数据类型字段,确认是否为
0x01,以确定是文本消息类型的数据。 - 验证源地址和目标地址是否与预期相符,这里确认源地址为
[0x12, 0x34],目标地址为[0x56, 0x78],符合预期。
- 首先检查起始标志是否为
- 接收数据负载:根据帧长度指示,继续接收后面的 23 字节数据负载部分,将其存储下来。
- 验证帧尾:
- 接收完数据负载后,接着接收 2 个字节的校验和以及 1 个字节的结束标志。
- 重新计算校验和:按照与发送端相同的求和校验方法,对除校验和字段本身以外的数据部分进行计算。假设重新计算得到的校验和为
0x1234(与发送端计算结果相同),与接收到的校验和[0x12, 0x34]进行比较,两者相等,说明数据传输正确。 - 检查结束标志是否为
0xBB,如果是,则确认完整接收并验证通过了该数据帧。
- 解析数据负载:由于数据类型为文本消息,将接收到的 23 字节数据负载按照 UTF - 8 解码,得到 “Hello, Bluetooth World!”,然后将该消息传递给上层应用进行进一步处理,比如显示在设备屏幕上。
2. 接收传感器数据帧
- 接收数据:同样通过蓝牙模块接收来自设备 A 的传感器数据帧,假设完整接收到了该帧。
- 验证帧头:
- 检查起始标志为
0xAA,读取帧长度字段得到值为19字节,确认接下来要接收完整的 19 字节数据帧。 - 检查数据类型字段,确认是否为
0x02,确定是传感器数据类型。 - 验证源地址和目标地址与预期相符,即源地址为
[0x12, 0x34],目标地址为[0x56, 0x78]。
- 检查起始标志为
- 接收数据负载:根据帧长度指示,接收后面的 8 字节数据负载部分并存储。
- 验证帧尾:
- 接收完数据负载后,接收 2 个字节的校验和以及 1 个字节的结束标志。
- 重新计算校验和:按照求和校验方法,对除校验和字段本身以外的数据部分进行计算。假设重新计算得到的校验和为
0x5678(与发送端计算结果相同),与接收到的校验和[0x56, 0x78]进行比较,两者相等,说明数据传输正确。 - 检查结束标志为
0xBB,确认完整接收并验证通过了该数据帧。
- 解析数据负载:因为数据类型为传感器数据,按照顺序从接收到的 8 字节数据负载中解析出温度和湿度数值。先解析出前 4 个字节
[64, 8, 0, 0]对应的温度值为 26.5 摄氏度,再解析出后 4 个字节[64, 69, 0, 0]对应的湿度值为 55.0%,然后将这些传感器数据传递给上层应用进行相应处理,比如存储、显示或用于其他相关操作。
通过这个具体示例,展示了如何基于自定义的蓝牙数据传输应用层协议在两个蓝牙设备之间进行不同类型数据的有效传输、接收和处理。
1841

被折叠的 条评论
为什么被折叠?



