3 Star 25 Fork 8

Walkline / MicroPython Beacon Library

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

MicroPython Beacon Library

项目介绍

A MicroPython library providing APIs to interact with Beacons, for ESP32

相关知识

以个人理解介绍一些和Beacon相关的知识,尽量不误导

蓝牙设备的角色定义

  • Broadcaster Role (Advertiser):蓝牙设备想要被其它设备发现并使用,第一步就是要作为Advertiser(广播员角色,广告商,基站等等)进行数据广播,将自己的名字、MAC 地址、包含的服务和外观等关键信息发布出去

  • Observer Role (Scanner):有Advertiser发送广播就要有Scanner进行观察扫描,得到对方的关键信息,比如:MAC 地址,RSSI 信号强度,可连接性,和广播信息等

  • Central Role (GATT Client):Scanner扫描并得到关键信息后,可以选择和Advertiser进行连接,此时Scanner就转变为中心设备(Central

  • Peripheral Role (GATT Server):当Central选择进行连接后,Advertiser也就转变为外围设备(Peripheral),并终止数据广播

我们的Beacon设备为了做到不间断的数据广播,所以必须不具备可连接性,也就是只作为Advertiser角色使用

参考资料:

广播数据格式分析

Advertiser广播的数据,简单说就是若干组数据的组合,每组数据包含:

  • 数据长度(Length)
  • 数据类型(AD_TYPE
  • 数据内容(Data)

每条广播内容的长度限制为 37 字节,去掉 6 字节的设备 MAC 地址,我们实际可以使用的最大长度为 31 字节

ESP32 BLE 项目的HID 设备广播数据为例,它广播的数据为:

bytearray(b'\x02\x01\x06\x03\x03\x0f\x18\x03\x03\x0a\x18\x03\x03\x12\x18\x03\x19\xc1\x03\x06\xff\x06\x00\x03\x00\x80')

# 拆分后得到 6 组数据
b'\x02\x01\x06'
b'\x03\x03\x0f\x18'
b'\x03\x03\x0a\x18'
b'\x03\x03\x12\x18'
b'\x03\x19\xc1\x03'
b'\x06\xff\x06\x00\x03\x00\x80'

根据数据格式分析后,得到如下内容:

Length AD_TYPE Data
1 x02 x01 (FLAGS) x06
2 x03 x03 (16BIT_SERVICE_UUID) x0fx18
3 x03 x03 (16BIT_SERVICE_UUID) x0ax18
4 x03 x03 (16BIT_SERVICE_UUID) x12x18
5 x03 x19 (APPEARANCE) xc1x03
6 x06 xff (MANUFACTURER_SPECIFIC_DATA) x06x00x03x00x80

逐一分析一下 4 个不同的AD_TYPE

  • x01:数据x06转换二进制为0b00000110,根据下表即可得到x06代表设备模式为:LE General Disconverable ModeBR/EDR Not Supported

    位数 数值 描述
    1 0 LE Limited Discoverable Mode
    2 1 LE General Disconverable Mode
    3 1 BR/EDR Not Supported
    4 0 LE and BR/ERD Capable (Controller)
    5 0 LE and BR/ERD Capable (Host)
    6 0 Reserved
    7 0 Reserved
    8 0 Reserved
  • x03:数据x0fx18大端模式表示的Service UUID,即0x180f,从 GATT Services | Bluetooth® Technology Website 页面查询可知0x180fBattery Service,其余两个分别为Device InformationHuman Interface Device

  • x19:数据xc1x03也是大端模式表示,转换十进制为961查询可知设备的AppearanceKeyboard,即图中左侧的图标

  • xff:数据x06x00x03x00x80可拆分为:

    • x06x00大端模式表示的公司标识符,从 Company Identifiers | Bluetooth® Technology Website 页面查询可知0x0006Microsoft
    • x03:代表微软的Swift Pair Beacon技术
    • x00:代表应用场景为Pairing over Bluetooth LE only
    • x80:代表已保留的发射功率值

    xff代表的AD_TYPE根据不同的制造商设置不同的参数数据

最终总结:

bytearray(b'\x02\x01\x06\x03\x03\x0f\x18\x03\x03\x0a\x18\x03\x03\x12\x18\x03\x19\xc1\x03\x06\xff\x06\x00\x03\x00\x80')

Scanner扫描到这条广播内容后分析得出,这个即将成为Peripheral的设备支持通用发现模式不支持 BR/EDR,它的外观图标为键盘,包含了Battery ServiceDevice InformationHuman Interface Device这 3 个服务(这是作为 HID 设备的必要服务),并且它还支持微软Swift Pair Beacon技术

需要广播的内容太多,31 字节不够用怎么办?

首先把我们必须要广播的数据准备好,再准备一个Scan Response数据然后进行广播,在Scanner扫描的时候同时会读取Scan Response的数据,整合两部分数据再进行内容分析,我们以此达到广播超过 31 字节内容的目的

Scan Response实际不会进行广播,它只是在响应Scanner扫描的时候才会进行传递

参考资料:

如何计算 tx_power

谷歌官方称为tx_power,苹果官方称为Measured Power,是根据设备自身性能统计得到的发射功率平均值,根据设备到设备之间的功率值计算相对距离,根据文档介绍,当相对距离大于1 米时得到的数值并不可靠,所以只需给出 4 种状态(Proximity State)即可:

状态 简单描述
Immediate 非常接近,甚至是叠放状态
Near 1 到 3 米之内
Far 仅可以接收到广播,但不稳定
Unknown 无法确定距离

苹果官方给出的确定设备发射功率的方法如下:

  • 至少使用iPhone 5s
  • Apple Store下载Air Locate
  • 去掉手机保护壳,垂直方向握住手机并保证上半部分未被遮挡
  • Beacon 设备开始广播后,站在 1 米 距离,重复采样RSSI 数值至少 10 秒
  • 采样结果降序排序,去掉 10% 最高值和 20% 最低值
  • 将剩余采样结果求平均值,得到发射功率

参考资料:

MIT License Copyright (c) 2020 Walkline Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

A MicroPython library providing APIs to interact with Beacons 展开 收起
Python
MIT
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
Python
1
https://gitee.com/walkline/micropython-beacon-library.git
git@gitee.com:walkline/micropython-beacon-library.git
walkline
micropython-beacon-library
MicroPython Beacon Library
master

搜索帮助