【WCH蓝牙系列芯片】-基于CH592开发板—蓝牙主机获取蓝牙从机广播数据包
-------------------------------------------------------------------------------------------------------------------------------------
以CH592为例,将一块CH592作为蓝牙从机设备,将另一块CH592作为蓝牙主机设备,以CH592EVT中的Peripheral(从机)和Central(主机)。
先看一下从机中的内容,通过修改蓝牙从机的MAC地址,先将属性配置中,将BLE_MAC=1,然后再修改MAC地址中的六个地址。


在从机程序中,可以发现有扫描应答包和广播包。


在扫描应答包中,包含蓝牙名字、连接间隔参数和发射功率参数。在蓝牙名字中,使用工具进行编码获取生成的字符并填写;

在广播包中,包含两个参数,一个是广播类型,还有一个是服务UUID数值。

可以先通过BLE调试助手观察这个蓝牙从机设备,找到蓝牙名字是一个蓝牙Peripheral的蓝牙设备,可以看到BLE调试助手APP获取到蓝牙广播数据,是将扫描应答包和广播包放在一个大的广播包中。在广播包详细信息中,可以看到这个两个数据包。


在主机中,可以在BLE_LIB蓝牙库中找到图中的结构体参数,里面包含广播包类型、地址类型、地址数据、信号强度还有广播包数据等


/* 发现常规广播设备事件 */
case GAP_DEVICE_INFO_EVENT:
{
// Add device to list // 当发现新设备时,将其添加到设备列表中
centralAddDeviceInfo(pEvent->deviceInfo.addr, // 设备地址
pEvent->deviceInfo.addrType); // 设备地址类型
if (pEvent->deviceInfo.rssi > -35)
{
printf("******************************************************************************\r\n");
printf("MAC-addr:");
for(uint8_t i = 0; i < B_ADDR_LEN; i++)
{
PRINT("%02x ",pEvent->deviceInfo.addr[i]);
}
PRINT("\n");
printf("RSSI = %d\r\n",pEvent->deviceInfo.rssi);
printf("EventType = %d\r\n",pEvent->deviceInfo.eventType);
printf("dataLen = %d\r\n",pEvent->deviceInfo.dataLen);
printf("broadcast packet = ");
for(uint8_t i = 0; i < pEvent->deviceInfo.dataLen; i++)
{
PRINT("%02x ",pEvent->deviceInfo.pEvtData[i]);
}
PRINT("\r\n");
}
}
break;
在蓝牙主机中,通过RSSI先进行一边过滤筛选,来扫描蓝牙主机附近蓝牙从机,当扫描到蓝牙从机设备时,先打印设备MAC地址,信号强度RSSI,还有广播包类型,和数据长度和具体广播包类型对应的数据,由于广播数据和扫描应答包数据是合在一起的,需要通过广播类型来区分,并获取到对应的数据包。
串口打印数据的方式来观察,整个打印出来的数据。对应蓝牙库中的广播包类型


浙公网安备 33010602011771号