项目场景:
使用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;
.....
将程序烧录到芯片中,成功收到了来自不同设备的数据。