注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
zhuzhubaobao300的个人空间 https://home.eeworld.com.cn/space-uid-622252.html [收藏] [复制] [分享] [RSS]
日志

Cc2541广播数据及扫描响应,实现设备名称的读取

已有 11534 次阅读2015-7-29 16:34 | 蓝牙, ble, dreamstreaking, 电子, 嵌入式

   CC2541TI公司生产的一款基于8051的蓝牙BLE芯片,现在做一个项目需要制作一个蓝牙主机设备。但苦于无法获取从机的设备名称。现将实现方法分享:

首先探讨一下广播数据(advertData)和扫描回应(scanRspData)的问题:在典型的蓝牙BLEBluetooth Low Energy )系统中,从机设备广播数据让所有主机设备知道它是一个可连接的设备。接收到广播数据的主机,发送一个扫描请求(scan request)给从机,从机再返回扫描请求。

CC2541的从机例程(simpleBLEPeripheral.c)中,广播数据(advertData[])内容如下图1

advertData[]数组中第一个字节0x02代表此段数据的长度,第二个字节为广播的数据模式,从第三个字节到第一个字节指定的长度为止,为有效的数据。以此类推。此广播数据中包含了从设备的广播模式和UUID

 

1

扫描回应(scanRspData[])内容如下图2

此数组的看法如上,其中定义了设备名称和连接间隔。

也就是说,现在想获取设备名称,所以要获得扫描回应scanRspData[]的数据,并从中分离出类型为GAP_ADTYPE_LOCAL_NAME_COMPLETE的数据。

下面再讲解如何在主机获取设备名称:

在例程的simpleBLECentral.c中,主机回调函数simpleBLECentralEventCB( gapCentralRoleEvent_t *pEvent )是当发生某一件事时调用的函数。其中会分辨到底是哪个事件发生,并进行处理。GAP_DEVICE_INFO_EVENT是获取从机设备信息的处理事件,GAP_DEVICE_DISCOVERY_EVENT是设备发现事件。我们主要用到的就是这两个事件。

GAP_DEVICE_INFO_EVENT事件中还存在两个不同数据,广播数据和扫描回应数据。现介绍这两个数据的读取方法。主机回调函数传递一个gapCentralRoleEvent_t的参数指针。其结构为:

 

 之中的deviceInfo中存在一下成员:

 

  这里存在两个变量,uint8 dataLen; //!< Length (in bytes) of the data field (evtData);uint8 *pEvtData; //!< Data field of advertisement or SCAN_RSP,资料中说广播或扫描回应的数据域。那如何分辨到底pEvtData存的是什么数据?可以在GAP_DEVICE_INFO_EVENT中读取eventType来确定,例如:

case GAP_DEVICE_INFO_EVENT:

      {

       if(pEvent->deviceInfo.eventType == GAP_ADRPT_SCAN_RSP )//scan_rsp

        {

          //

           mid_data_length = pEvent->deviceInfo.dataLen;//扫描回应数据长度

           mid_data_name  = pEvent->deviceInfo.pEvtData;//扫描回应数据

        }

        if(pEvent->deviceInfo.eventType == GAP_ADRPT_ADV_IND )//adv

        {

           pEvent->deviceInfo.dataLen;//其为广播数据长度

           pEvent->deviceInfo.pEvtData;//其为广播数据

        }

      }

Break

  扫描时先执行广播数据,在进行扫描回应。之后会进入GAP_DEVICE_DISCOVERY_EVENT事件,在设备发现事件中,就可以使用设备名称,设备地址等等。

新浪微博:DreamStreaking

 

 

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章