|
CC2541是TI公司生产的一款基于8051的蓝牙BLE芯片,现在做一个项目需要制作一个蓝牙主机设备。但苦于无法获取从机的设备名称。现将实现方法分享:
首先探讨一下广播数据(advertData)和扫描回应(scanRspData)的问题:在典型的蓝牙BLE(Bluetooth 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