【杰理AC632n】关于杰理AC632n芯片SDK中使用CONFIG_APP_CENTRAL例程的多机连接中,连接到多个设备时,接收数据的问题

项目场景:

使用ac6321芯片使用CONFIG_APP_CENTRAL例程进行多机连接通信:


更新

20240804

蓝牙通信模块地址
https://github.com/OULIHONG1999/HPY_BLE_MOULD_ALL.git
以上是我后来开发的基于蓝牙一主多从的项目工程,内部基本实现了设备的链接和数据的分发和获取,可以作为参考。
有问题可联系1756950720@qq.com


我使用该芯片制作了一款遥控器,目标是实现遥控器可同时连接多个设备,并向所有设备发送统一指令,不同的设备也会向遥控器返回自身的状态,遥控器将收到的数据进行整理并显示在遥控器上的lcd屏幕中。

通过更改CONFIG_BT_GATT_CLIENT_NUM,并配置相关的uuid,遥控器可以实现同时连接不同的设备,并向所有设备发送统一指令,(如需发送不同的指令,可以在发送数据时,指定目标设备所分配得到的handle),这样就可以同时控制不同的设备


问题

当我需要取得不同的设备数据时,发现只能获得第一个设备发送来的数据,设备的handle始终未0X50,其他的设备获取不到,导致遥控器上不能显示所有设备的信息。


问题解决经过

经过查找杰理提供的SDA中的CONFIG_APP_MULTI,找到了这一个结构体

//gatt 控制块初始化
static gatt_ctrl_t mul_gatt_control_block = {
    //public
    .mtu_size = ATT_LOCAL_MTU_SIZE,
    .cbuffer_size = ATT_SEND_CBUF_SIZE,
    .multi_dev_flag	= 1,

结构体内的所有元素

typedef struct {
    //connect
    u16 mtu_size;         /*mtu配置大小, range:23 ~517*/
    u16 cbuffer_size;     /*缓存buffer大小,>= mtu_size*/
    u8  multi_dev_flag;    /*多机使用标识*/

    //config
    gatt_server_cfg_t *server_config; /*gatt server 配置*/
    gatt_client_cfg_t *client_config; /*gatt client 配置*/
    sm_cfg_t *sm_config; /**/

    /*hci 回调,保留未用*/
    int (*hci_cb_packet_handler)(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size);
} gatt_ctrl_t;

通过注释可以发现,multi_dev_flag为多机使用标识。在ble_central.c文件中也有关于这个结构体的配置,当把multi_dev_flag置1时,即可实现不同设备数据的接收。

在case GATT_COMM_EVENT_GATT_DATA_REPORT中即可读取到来自不同设备的数据,并且,每个设备都有自己的handle进行数据区分。

static int cetl_client_event_packet_handler(int event, u8 *packet, u16 size, u8 *ext_param)
{
    int i;
    // log_info("event: %02x,size= %d\n", event, size);
    switch (event)
    {
    case GATT_COMM_EVENT_GATT_DATA_REPORT:
    {
        att_data_report_t *report_data = (void *)packet;

#if CETL_TEST_DISPLAY_DATA
        log_info("data_report:hdl=%04x,pk_type=%02x,size=%d", report_data->conn_handle, report_data->packet_type, report_data->blob_length);
        // put_buf(report_data->blob, report_data->blob_length);
#else
        /* putchar('R'); */
#endif
        i = ble_comm_dev_get_index(report_data->conn_handle, SUPPORT_MAX_GATT_CLIENT);
        if (i != INVAIL_INDEX)
        {
            recieve_test_count[i] += report_data->blob_length;
        }

        switch (report_data->packet_type)
        {
        case GATT_EVENT_NOTIFICATION: // notify
            printf("get notify");
            // 将数据传感处理lcd显示的函数
            get_data_from_master(report_data->blob, report_data->blob_length);
            // 将数据发送给遥控驱动的函数
            extern void analyze_master_ble_data(u8 *packet, u32 size, u8 handle);
            analyze_master_ble_data(report_data->blob, report_data->blob_length, report_data->conn_handle);
            break;
        case GATT_EVENT_INDICATION: // indicate
            printf("GATT_EVENT_INDICATION");
            break;
        case GATT_EVENT_CHARACTERISTIC_VALUE_QUERY_RESULT: // read
            printf("GATT_EVENT_CHARACTERISTIC_VALUE_QUERY_RESULT");

            break;
        case GATT_EVENT_LONG_CHARACTERISTIC_VALUE_QUERY_RESULT: // read long
            printf("GATT_EVENT_LONG_CHARACTERISTIC_VALUE_QUERY_RESULT");
            break;
        default:
            printf("no gatt event");
            break;
        }
    }
    break;
.....

将程序烧录到芯片中,成功收到了来自不同设备的数据。
收到的数据效果


  • 14
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值