尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

2.2 示例代码-蓝牙Beacon

2.2 示例代码-蓝牙Beacon 目录可收获一、详细分析广播数据1.1 图一1.2 图二1.3 详细分析广播数据1.4 补充二、学习示例代码可收获1.BLE广播的应用:蓝牙标签 2.使用nrf connect 查看广播信息详解广播数据 3.讲解代码了解 Assigned_Numbers 4.掌握使用 NimBLE 主机层协议栈构建Beacon源自IDF_5.2.6\v5.2.6\esp-idf\examples\bluetooth\ble_get_started\nimble\NimBLE_Beacon蓝牙标签应用室内定位、自动打卡、自动跳转网站一、详细分析广播数据1.1 图一图一可以直观的看出很多信息这些信息来源于广播数据是根据广播数据整理后便于我们查看的1.2 图二点击RAW 会展示原始的广播数据我们重点分析1.3 详细分析广播数据在前面04章节有提及过广播数据格式如下序号名称字节数备注1数据长度 (AD Length)12数据类型 (AD Type)n大部分数据类型占用 1 字节3数据 (AD Data)(AD Length - n)先说数据类型 (AD Type)就是一个值对应一个类型所有蓝牙设备都遵循这个标准比如0x01就代表Flags 在《Assigned_Numbers.pdf》 第12页 开始 列出了Common Data Types字段对应 AD Type说明Flags0x01标志位说明设备是 LE only、不支持经典蓝牙等Complete Local Name0x09设备全名就是 NimBLE_BeaconTx Power Level0x0A发射功率Appearance0x19外观类别LE Role0x1C设备支持的角色“Only Peripheral Role supported”URL (https://espressif.com)0x24URI 数据隐含在 Raw data 里0x1BService Data这里是 Eddystone 信标服务数据那么数据又代表什么呢比如原始数据中flags中的value为0x06是什么意思 查找官方协议文档几千页的文档怎么查在我们不熟悉的情况下用点“投机取巧”的办法 在第一张图flags:BR/EDR Not Supported, 在文档搜索 BR/EDR Not Supported找到P2094《Core_v5.0》要我们去找Core Specification Supplement,ctrl左键点击跳转到https://www.bluetooth.com/specifications/specs/core-specification-6-2/ 没有找到别慌点击下图红框再搜索可能会有小伙伴有疑问为啥bit位置1就代表有效呢 结合下图以及nrf中0x06代表的也是LE General Discoverable、BR/EDR Not Supported 文档中其他地方也有说明这个问题就到这里了接下来看第二组Type 09 对应的数据 4E696D424C455F426561636F6E 为啥这个数据代表NimBLE_Beacon 需要用ASCII解码首先数据格式是十六进制的0x4E对应的字符是 N ...说完了第1、2组 广播数据结构其他的也是类似的 大家可以尝试按照上面的方法去查询蓝牙协议文档带着目的去翻阅是一种熟悉文档很好的方式1.4 补充不知道小伙伴们有没有发现图一显示的数据除了RAW data中的数据还有3项是广播数据中没有的。Device type: LE only 这是一个综合判断。nrf 看到设备标志位里有BR/EDR Not Supported所以直接给出了“LE only”这个结论。Advertising type: Legacy这指的是广播包本身的协议类型即“传统广播”。这个信息是由芯片固件决定的体现在链路层的广播包头部Header不在 AD payload 里面 LE Bluetooth Device Address在04章节有讲过是PDU有效负载的一部分广播地址 这个MAC地址在蓝牙协议里有个专门的称呼叫 AdvA (Advertiser Address即广播设备地址二、学习示例代码在深入代码细节前我们先对程序的行为有一个宏观的认识这是一个很好的习惯 2.1 第一步我们会对程序中使用到的各个模块进行初始化主要包括 NVS Flash、NimBLE 主机层协议栈以及 GAP 服务的初始化。2.2 第二步在 NimBLE 主机层协议栈与蓝牙控制器完成同步时我们先确认蓝牙地址可用然后发起 不定向、不可连接、可扫描的广播。之后持续处于广播状态直到设备重启。我们从入口函数 app_main()开始 app_main主要做以下几件事情初始化 NVS Flash 与 NimBLE 主机层协议栈初始化 GAP 服务启动 NimBLE 主机层的 FreeRTOS 线程负责从底层控制器Controller接收 HCI 事件、处理 BLE 协议栈逻辑如连接管理、GATT 事务、安全配对等并分发到相应的回调函数使用 NimBLE 主机层协议栈进行应用开发时的编程模型为事件驱动编程例如在 NimBLE 主机层协议栈与蓝牙控制器完成同步以后将会触发同步完成事件调用 ble_hs_cfg.sync_cb 函数。在回调函数设定时我们令该函数指针指向 on_stack_sync 函数所以这是同步完成时实际被调用的函数。 // 注意暂时不要关注如何触发事件的只需要知道蓝牙底层完成某个事情后会触发一个事件给我们使用注意Bluetooth LE 的空中数据包遵循小端 (Little Endian) 传输的顺序所以低字节的数据会在靠前的位置。static void start_advertising(void)准备数据调用 ble_gap_adv_set_fields 和 ble_gap_adv_rsp_set_fields 配置内容。配置行为配置 adv_params如不可连接、通用发现模式。启动广播调用 ble_gap_adv_start此时手机才能搜索到这个设备。
返回列表