自定义蓝牙数据传输应用层协议 - 2

以下是一个具体的示例,展示了基于上述自定义蓝牙数据传输应用层协议的完整数据传输过程,包括发送端的数据准备和发送,以及接收端的数据接收和处理。

示例场景

假设我们有两个蓝牙设备,设备 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]
    • 数据负载(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]
    • 帧尾(Trailer)
      • 校验和(Checksum):采用简单的求和校验方法。先将帧头(除帧长度字段,因为还未确定完整长度)和数据负载部分的所有字节相加,得到总和。假设总和为0x1234(这里只是示例值),则将其转换为 2 个字节表示,即[0x12, 0x34]
      • 结束标志(End Flag):设置为0xBB
  • 确定帧长度并填充帧长度字段

    • 计算整个数据帧的长度,从起始标志到结束标志的所有字节数。此时数据帧长度为: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]
    • 数据负载(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]作为数据负载。
    • 帧尾(Trailer)
      • 校验和(Checksum):再次采用求和校验。先将帧头(除帧长度字段)和数据负载部分的所有字节相加,假设得到总和为0x5678(示例值),转换为 2 个字节表示为[0x56, 0x78]
      • 结束标志(End Flag)0xBB
  • 确定帧长度并填充帧长度字段

    • 计算数据帧长度: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%,然后将这些传感器数据传递给上层应用进行相应处理,比如存储、显示或用于其他相关操作。

通过这个具体示例,展示了如何基于自定义的蓝牙数据传输应用层协议在两个蓝牙设备之间进行不同类型数据的有效传输、接收和处理。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐诺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值