【WCH蓝牙系列芯片】-基于CH592开发板—蓝牙主机获取蓝牙从机广播数据包

-------------------------------------------------------------------------------------------------------------------------------------

  在BLE广播中,广播包中是分为广播数据和扫描应答包数据,这两个数据包的总长度都是31个字节;数据包格式都是以[数据长度+类型+内容值]循环放置。在广播包中,可以解析出蓝牙从机的各种参数,比较蓝牙从机的MAC地址,蓝牙名字,RSSI值等。

  以CH592为例,将一块CH592作为蓝牙从机设备,将另一块CH592作为蓝牙主机设备,以CH592EVT中的Peripheral(从机)和Central(主机)。

  先看一下从机中的内容,通过修改蓝牙从机的MAC地址,先将属性配置中,将BLE_MAC=1,然后再修改MAC地址中的六个地址。

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

  在扫描应答包中,包含蓝牙名字、连接间隔参数和发射功率参数。在蓝牙名字中,使用工具进行编码获取生成的字符并填写;URL 编码/解码 | 菜鸟工具 (runoob.com)https://www.jyshare.com/front-end/695/,所以将中文编码成十六进制的数据,在放在蓝牙名字中,就可以实现蓝牙广播时显示中文的广播字。

 

  在广播包中,包含两个参数,一个是广播类型,还有一个是服务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,还有广播包类型,和数据长度和具体广播包类型对应的数据,由于广播数据和扫描应答包数据是合在一起的,需要通过广播类型来区分,并获取到对应的数据包。

  串口打印数据的方式来观察,整个打印出来的数据。对应蓝牙库中的广播包类型

 

 

 
posted on 2025-03-04 15:36  凡仕  阅读(320)  评论(0)    收藏  举报