Android Ble 广播数据分包

背景:

  1. 广播数据长度限制20字节
  2. 某设备的广播数据现有19字节长度,剩一位可扩展
  3. 需求要在最后一位字节向外广播一个:最大的最小值大为500的一个大于0的数

分析:

一个字节8位,不考虑符号的情况下用二进制最大可表示 1111 1111 => 十进制 255
而需求最大值至少需要500 => 1111 1010 0 需要9位,明显通过一条广播数据不能处理,需要分包。

解决:

那么,如果现在分两条广播数据存储,广播数据的前19个字节保持不变,就有2个字节来存储数据。
2个字节最大可处理 1111 1111 1111 1111 => 十进制 65535,远远达到需求要求。

虽然达到需求,但是广播接收方怎么区分处理这个两个字节的数据呢?如何区分第一个包和第二包数据呢?

给每包数据打上标记:
我们用每包数据的高三位打标记,低5位存储数据,那么最后就有10位,最大可表示1111 1111 11 => 十进制 1023,已到达需求要求。

所以:
共10个有效位分两包,高三位为 000表示第一包数据,高三位为 111表示第二包数据
广播数据第一包最后一个字节包含真实数据的高5位
广播数据第二包最后一个字节包含真实数据的低5位

示例:

蓝牙广播一个250的数:

  1. 蓝牙设备处理

    1
    2
    3
    205 ==> 16进制 fa ==> 2进制 1111 1010
    第一包:1111 1010 >> 5 = 000 00111
    第二包:1111 1010 | 0xE0 = 111 11010
  2. 手机接收

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    import *.ScanCallback

    /**
    * byte 转 bit 字符串
    */
    public static String byte2BitStr(byte by) {
    return String.valueOf(
    (by >> 7) & 0x1) +
    ((by >> 6) & 0x1) +
    ((by >> 5) & 0x1) +
    ((by >> 4) & 0x1) +
    ((by >> 3) & 0x1) +
    ((by >> 2) & 0x1) +
    ((by >> 1) & 0x1) +
    ((by >> 0) & 0x1);
    }

    ...

    //蓝牙搜索结果
    public void onScanResult(int callbackType, ScanResult result) {
    BluetoothDevice device = result.getDevice();
    int rssi = result.getRssi();
    ScanRecord scanRecord = result.getScanRecord();
    byte[] adBytes = scanRecord.getBytes();
    }

    ...

    byte lastByte = adBytes[19]
    //000 00111
    String package1 = byte2BitStr(lastByte1);
    //111 11010
    String package2 = byte2BitStr(lastByte2);

    //去除第一包和第二包的高三位标识 package1 + package2
    String content = "00111 11010"
    //转10进制
    int num = Integer.valueOf(content, 2);

    ...

系列文章:
Android Ble 通讯数据分包:https://mecono.cn/2485615358.html

--- 青山不改 绿水长流,日后江湖相见,自当杯酒言欢,咱们就此别过。---

本文标题:Android Ble 广播数据分包

文章作者:mecono

发布时间:2019年04月24日 - 10:04

最后更新:2019年12月19日 - 09:12

原始链接:https://mecono.cn/2985357922.html

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-ND 4.0许可协议。转载请注明出处!