CC2541解析广播数据及扫描响应
广播数据(advertData)和扫描响应(scanRspData)
在典型的蓝牙BLE(Bluetooth Low Energy )系统中,从机设备广播数据让所有主机设备知道它是一个可连接的设备。接收到广播数据的主机,发送一个扫描请求(scan request)给从机,从机再返回扫描请求。
首先看一下广播数据,下面是广播包的数据定义:
static uint8 advertData[] =
{// Flags; this sets the device to use limited discoverable// mode (advertises for 30 seconds at a time) instead of general// discoverable mode (advertises indefinitely)0x02, // length of this dataGAP_ADTYPE_FLAGS,DEFAULT_DISCOVERABLE_MODE | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED,// in this peripheral0x1A, // length of this data 26byteGAP_ADTYPE_MANUFACTURER_SPECIFIC, /*Apple Pre-Amble*/0x4C,0x00,0x02,0x15,/*Device UUID (16 Bytes)*/0x4A, 0xA8, 0x31, 0x6E, 0x88, 0xE8, 0x96, 0x78, 0xCA, 0x74, 0xDE, 0x07, 0x19, 0x8A, 0xB3, 0x9B,
// 0x2A, 0x97, 0x20, 0x4E, 0x68, 0xB8, 0x86, 0x18, 0xC8, 0x34, 0xDD, 0x67, 0x79, 0x85, 0x43, 0x8B,
//0xe2, 0xc5, 0x6d, 0xb5, 0xdf, 0xfb, 0x48, 0xd2, 0xb0, 0x60, 0xd0, 0xf5, 0xa7, 0x10, 0x96, 0xe0,/*Major Value (2 Bytes)*/0x00,0x00, /*Minor Value (2 Bytes)*/0x00,0x00, /*Measured Power*/0xCD
};
advertData[] 数组中第一个字节 0x1A 代表此段数据的长度,第二个字节为广播的数据模式,从第三个字节到第一个字节指定的长度为止,为有效的数据。以此类推。此广播数据中包含了从设备的广播模式和 UUID 。这个是ibeacon的广播数据定义。
扫描响应的数据定义如下:
// GAP - SCAN RSP data (max size = 31 bytes)
static uint8 scanRspData[] =
{// complete name0x05, // length of this dataGAP_ADTYPE_LOCAL_NAME_COMPLETE,'N', 'A', 'M', 'E',// connection interval range0x05, // length of this dataGAP_ADTYPE_SLAVE_CONN_INTERVAL_RANGE,LO_UINT16( DEFAULT_DESIRED_MIN_CONN_INTERVAL ), // 100msHI_UINT16( DEFAULT_DESIRED_MIN_CONN_INTERVAL ),LO_UINT16( DEFAULT_DESIRED_MAX_CONN_INTERVAL ), // 1sHI_UINT16( DEFAULT_DESIRED_MAX_CONN_INTERVAL ),// Tx power level0x02, // length of this dataGAP_ADTYPE_POWER_LEVEL,0 // 0dBm
};
我们平时打开手机扫描蓝牙设备时扫描到的设备的名字,就是在这里进行定义的,所以如果 想获取设备名称,就要获得扫描回应 scanRspData[] 的数据,并从中分离出类型为 GAP_ADTYPE_LOCAL_NAME_COMPLETE 的数据。
那么,如何解析广播数据和扫描响应包呢?
主机回调函数simpleBLECentralEventCB( gapCentralRoleEvent_t *pEvent )是当发生某一件事时调用的函数,当相应事件发生时,分析出是哪个事件并进行相应的处理。GAP_DEVICE_INFO_EVENT是获取从机设备信息的处理事件,GAP_DEVICE_DISCOVERY_EVENT是设备发现事件。在GAP_DEVICE_INFO_EVENT事件中有两个不同数据,广播数据和扫描回应数据,这就是我们要解析的部分。我们先来看一下主机回调函数simpleBLECentralEventCB( gapCentralRoleEvent_t *pEvent )传递的gapCentralRoleEvent_t的参数指针。其结构为:
/*** Central Event Structure*/
typedef union
{gapEventHdr_t gap; //!< GAP_MSG_EVENT and status.gapDeviceInitDoneEvent_t initDone; //!< GAP initialization done.gapDeviceInfoEvent_t deviceInfo; //!< Discovery device information event structure.gapDevDiscEvent_t discCmpl; //!< Discovery complete event structure.gapEstLinkReqEvent_t linkCmpl; //!< Link complete event structure.gapLinkUpdateEvent_t linkUpdate; //!< Link update event structure.gapTerminateLinkEvent_t linkTerminate; //!< Link terminated event structure.
} gapCentralRoleEvent_t;
其中有一个deviceInfo成员,为设备信息相关的数据,其类型为gapDeviceInitDoneEvent_t,结构定义如下:
<pre name="code" class="cpp">/*** GAP_DEVICE_INFO_EVENT message format. This message is sent to the* app during a Device Discovery Request, when a new advertisement or scan* response is received.*/
typedef struct
{osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and statusuint8 opcode; //!< GAP_DEVICE_INFO_EVENTuint8 eventType; //!< Advertisement Type: @ref GAP_ADVERTISEMENT_REPORT_TYPE_DEFINESuint8 addrType; //!< address type: @ref GAP_ADDR_TYPE_DEFINESuint8 addr[B_ADDR_LEN]; //!< Address of the advertisement or SCAN_RSPint8 rssi; //!< Advertisement or SCAN_RSP RSSIuint8 dataLen; //!< Length (in bytes) of the data field (evtData)uint8 *pEvtData; //!< Data field of advertisement or SCAN_RSP
} gapDeviceInfoEvent_t;
在这个结构体里,有定义广播的类型,以及具体指向广播数据或者扫描响应数据段的指针和数据长度。我们可以通过eventType来区分*pEvtData的数据具体为广播数据还是扫描响应数据。通过主机回调函数simpleBLECentralEventCB( gapCentralRoleEvent_t *pEvent ),我们再进一步来解析eventType和*pEvtData。
case GAP_DEVICE_INFO_EVENT:{if(pEvent->deviceInfo.eventType == GAP_ADRPT_SCAN_RSP ) //scan_rsp{pEvent->deviceInfo.dataLen; //扫描回应数据长度pEvent->deviceInfo.pEvtData; //扫描回应数据}if(pEvent->deviceInfo.eventType == GAP_ADRPT_ADV_IND ) //adv{pEvent->deviceInfo.dataLen; //广播数据长度pEvent->deviceInfo.pEvtData; //广播数据}}
Break;
欢迎大家扫描下方二维码关注我的个人微信公众号,一起交流学习,谢谢。
CC2541解析广播数据及扫描响应相关推荐
- Android的BLE广播数据包介绍和解析---BLE--Android系列, 蓝牙技术BLE
目录 一.引言 二.广播的类型 三.广播数据格式 四.广播数据解析 五.总结 一.引言 理解和分析这个数据包结构(这里面也涉及广播间隔时间的设置,设备广播数据间隔设置长了,会影响设备被发现的效率:设置 ...
- BLE 广播数据解析
从上一篇 GATT Profile 简介中提到过,BLE 设备工作的第一步就是向外广播数据.广播数据中带有设备相关的信息.本文主要说一下 BLE 的广播中的数据的规范以及广播包的解析. 广播模式 BL ...
- android 蓝牙数据分包_Android 蓝牙广播数据包分析
Android 4.0以后开始引入ble(低功耗蓝牙),但是5.0之前的版本只支持手机做为中央设备(Central ),手机不能设置外设模式, 谷歌从5.0后才加入,而手机作为外设时需要发送广播,中央 ...
- 蓝牙广播数据包_一分钟读懂低功耗蓝牙(BLE)广播数据包
一分钟读懂低功耗蓝牙(BLE)广播数据包 低功耗蓝牙 => BLE (Bluetooth Low Energy) 1. 怎样抓取BLE广播数据包 * 硬件:一个BLE设备(具有广播功能): 一台 ...
- 蓝牙广播数据包_Android 蓝牙广播数据包分析
Android 4.0以后开始引入ble(低功耗蓝牙),但是5.0之前的版本只支持手机做为中央设备(Central ),手机不能设置外设模式, 谷歌从5.0后才加入,而手机作为外设时需要发送广播,中央 ...
- 【BLE】广播数据包结构讲解,五颗蓝牙芯片对比
[广播数据包结构讲解] 广播数据包的讲解网上可参考的也挺多,讲解了整个数据包的每个字节每个位的功能描述,非常详细. 今天我们换个方式,按照代码编写的方式,只要是被SDK封装的部分都不做考虑,例如报头. ...
- 蓝牙广播数据包_蓝牙BLE数据包格式汇总
以蓝牙4.0为例说明: BLE包格式有:广播包.扫描包.初始化连接包.链路层控制包(LL层数据包).逻辑链路控制和自适应协议数据包(即L2CAP数据包)等: 其中广播包又分为:定向广播包和非定向广播包 ...
- C++ 捕获与解析IP数据包 (winpcap)
源代码链接:https://download.csdn.net/download/chd_lcj/10891420 (不知道为什么积分涨到4积分了...原先只是单纯的想分享下的,结果最低只能设置1积分 ...
- Android网络之数据解析----SAX方式解析XML数据
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
最新文章
- java 二叉树_二叉树实现java
- HDU2024 C语言合法标识符
- 7-9将灰度转为彩色
- 分布式领域架构师要掌握的技术
- cmd copy命令 文件复制【转】
- matplotlib学习笔记.CookBook
- ES6 Fetch API和Cookie相关的知识点
- mysql 导入密码_mysql 常用命令导入导出修改root密码
- 计算机可以辅助解决哪些医学问题,计算机辅助医学影像诊查之关键学习技术研究...
- test dword ptr [eax],eax ; probe page.
- 基于java的邮件服务器以及webmail的搭建
- Windows驱动开发(中间层)
- linux centos用户修改密码,centos怎么修改用户密码
- EXCEL中所有函数的使用
- cdr添加节点快捷键_CorelDRAW快捷键大全(学习CDR必备)
- influxDB快速入门实战教程
- Ubuntu动态壁纸
- Python创意编程100例turtle篇题目串烧
- 3D建模入门学习方法,制作过程的六个主要阶段讲解 小白教程
- Android下的linux指令集