安卓ble广播数据简析

手环,跳绳各种~

广播

蓝牙的广播包有两种: 广播包 (Advertising Data)和 响应包 (Scan Response),其中广播包是每个设备必须广播的,而响应包是可选的。每个包都是 31 字节,数据包中分为有效数据(significant)和无效数据(non-significant)两部分。

scanRecord数据

有效数据部分 :包含若干个广播数据单元,称为 AD Structure 。AD Structure 的组成是:第一个字节是长度值 Len ,表示接下来的 Len 个字节是数据部分。数据部分的第一个字节表示数据的类型 AD Type ,剩下的 Len - 1 个字节是真正的数据 AD data 。其中 AD type 非常关键,决定了 AD Data 的数据代表的是什么和怎么解析。无效数据部分 :因为广播包的长度必须是 31 个 byte,如果有效数据部 分不到 31 自己,剩下的就用 0 补全。这部分的数据是无效的,解释的时候,忽略即可。在 Android 中,系统会把这两个数据拼接在一起,返回一个 62 字节的数组。

厂商数据 0xFF

厂商自定义数据: TYPE = 0xFF,厂商自定义的数据中,前两个字节表示厂商 ID,剩下的是厂商自己按照需求添加,里面的数据内容自己定义。
在这里插入图片描述
在这里插入图片描述

0x02010610FF1400F6A0717A01B7023400D30000000A08776F7A75696C5F30311106000045534957504C4100000001530000

第一个 字节代表广播数据单元的长度 ,02 转为10进制就是 2代表其数据长度为2 , 而数据单元的第一个字节代表类型 。
01 代表 代表物理连接功能为普通发现模式 06代表其数据类容
紧接着下一个数据单元:0B代表数据长度为11

String hex = BLEManagerUtils.bytesToHexString1(scanRecord);
//找到厂商自定义数据位置
int ffIndex = hex.indexOf("FF");
//020106 数据类容模式
if (ffIndex >= 2 && hex.startsWith("020106")) {
    //自定义数据长度
    String lenStr = hex.substring(ffIndex - 2, ffIndex);
    int len = Integer.parseInt(lenStr, 16);
    //自定义数据hex字符串
    String substring = hex.substring(ffIndex, ffIndex + 2 * len);
    //FF+厂商ID+Mac地址+数据
    String dataStr = substring.substring(2 + 4 + 12);
    //低字节
    String jj = dataStr.substring(8, 10) + dataStr.substring(6, 8);
    int count = Integer.parseInt(jj, 16);
    Log.d(TAG, "isJumping: " + count);
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值