广播数据(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解析广播数据及扫描响应相关推荐

  1. Android的BLE广播数据包介绍和解析---BLE--Android系列, 蓝牙技术BLE

    目录 一.引言 二.广播的类型 三.广播数据格式 四.广播数据解析 五.总结 一.引言 理解和分析这个数据包结构(这里面也涉及广播间隔时间的设置,设备广播数据间隔设置长了,会影响设备被发现的效率:设置 ...

  2. BLE 广播数据解析

    从上一篇 GATT Profile 简介中提到过,BLE 设备工作的第一步就是向外广播数据.广播数据中带有设备相关的信息.本文主要说一下 BLE 的广播中的数据的规范以及广播包的解析. 广播模式 BL ...

  3. android 蓝牙数据分包_Android 蓝牙广播数据包分析

    Android 4.0以后开始引入ble(低功耗蓝牙),但是5.0之前的版本只支持手机做为中央设备(Central ),手机不能设置外设模式, 谷歌从5.0后才加入,而手机作为外设时需要发送广播,中央 ...

  4. 蓝牙广播数据包_一分钟读懂低功耗蓝牙(BLE)广播数据包

    一分钟读懂低功耗蓝牙(BLE)广播数据包 低功耗蓝牙 => BLE (Bluetooth Low Energy) 1. 怎样抓取BLE广播数据包 * 硬件:一个BLE设备(具有广播功能): 一台 ...

  5. 蓝牙广播数据包_Android 蓝牙广播数据包分析

    Android 4.0以后开始引入ble(低功耗蓝牙),但是5.0之前的版本只支持手机做为中央设备(Central ),手机不能设置外设模式, 谷歌从5.0后才加入,而手机作为外设时需要发送广播,中央 ...

  6. 【BLE】广播数据包结构讲解,五颗蓝牙芯片对比

    [广播数据包结构讲解] 广播数据包的讲解网上可参考的也挺多,讲解了整个数据包的每个字节每个位的功能描述,非常详细. 今天我们换个方式,按照代码编写的方式,只要是被SDK封装的部分都不做考虑,例如报头. ...

  7. 蓝牙广播数据包_蓝牙BLE数据包格式汇总

    以蓝牙4.0为例说明: BLE包格式有:广播包.扫描包.初始化连接包.链路层控制包(LL层数据包).逻辑链路控制和自适应协议数据包(即L2CAP数据包)等: 其中广播包又分为:定向广播包和非定向广播包 ...

  8. C++ 捕获与解析IP数据包 (winpcap)

    源代码链接:https://download.csdn.net/download/chd_lcj/10891420 (不知道为什么积分涨到4积分了...原先只是单纯的想分享下的,结果最低只能设置1积分 ...

  9. Android网络之数据解析----SAX方式解析XML数据

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

最新文章

  1. java 二叉树_二叉树实现java
  2. HDU2024 C语言合法标识符
  3. 7-9将灰度转为彩色
  4. 分布式领域架构师要掌握的技术
  5. cmd copy命令 文件复制【转】
  6. matplotlib学习笔记.CookBook
  7. ES6 Fetch API和Cookie相关的知识点
  8. mysql 导入密码_mysql 常用命令导入导出修改root密码
  9. 计算机可以辅助解决哪些医学问题,计算机辅助医学影像诊查之关键学习技术研究...
  10. test dword ptr [eax],eax ; probe page.
  11. 基于java的邮件服务器以及webmail的搭建
  12. Windows驱动开发(中间层)
  13. linux centos用户修改密码,centos怎么修改用户密码
  14. EXCEL中所有函数的使用
  15. cdr添加节点快捷键_CorelDRAW快捷键大全(学习CDR必备)
  16. influxDB快速入门实战教程
  17. Ubuntu动态壁纸
  18. Python创意编程100例turtle篇题目串烧
  19. 3D建模入门学习方法,制作过程的六个主要阶段讲解 小白教程
  20. Android下的linux指令集

热门文章

  1. 家用燃气灶的自动保护问题
  2. c++ unicode转中文
  3. python if return语句_Python: return语句
  4. win10 开机慢优化方法
  5. AI 再次向人类精英发起挑战,这次是法律领域
  6. 1680 Catalan数
  7. 读书笔记-精准努力-走出第一步
  8. 查看Tomcat的版本
  9. wyy课堂cmos模拟设计课学习笔记-bandgap电路设计2
  10. PhpExcel的使用、示例及注意事项