nRF 蓝牙一从对应多主

一从对多主例程路径:examples\ble_peripheral\experimental\ble_app_multiperipheral\pca10040\s132\arm5_no_packs

 

 

SDK15.3:

与普通流程不同:

一从对多主在连接时可同时存在n个连接句柄(conn_handle),具体多少个,需要看NRF_SDH_BLE_PERIPHERAL_LINK_COUNT 与 NRF_SDH_BLE_TOTAL_LINK_COUNT的数值,在通讯过程中使用到QWR 队列写模块实现与多个主之间的通讯

 

在连接时会自带一个连接句柄,连接句柄具体值不固定在0到n-1之间变化,断开后则变成0xFF

 

nus服务通讯过程中:

ble_nus_evt_t --> conn_handle也带有连接句柄参数,可与建立连接时的连接句柄对应上,也可用这个连接句柄做到,回复对应哪个主的操作

 

 

需要注意的几点:

ble_stack_init --> ble_evt_handler --> BLE_GAP_EVT_CONNECTED and BLE_GAP_EVT_DISCONNECTED

 

gatt_init --> 一对一:

err_code = nrf_ble_gatt_init(&m_gatt, gatt_evt_handler);
APP_ERROR_CHECK(err_code);

err_code = nrf_ble_gatt_att_mtu_periph_set(&m_gatt, NRF_SDH_BLE_GATT_MAX_MTU_SIZE);
APP_ERROR_CHECK(err_code);

 

一从对多主:

ret_code_t err_code = nrf_ble_gatt_init(&m_gatt, NULL);
APP_ERROR_CHECK(err_code);

 

services_init --> 一对一:

// Initialize Queued Write Module.
qwr_init.error_handler = nrf_qwr_error_handler;

err_code = nrf_ble_qwr_init(&m_qwr, &qwr_init);
APP_ERROR_CHECK(err_code);

// Initialize NUS.
memset(&nus_init, 0, sizeof(nus_init));

nus_init.data_handler = nus_data_handler;

err_code = ble_nus_init(&m_nus, &nus_init);
APP_ERROR_CHECK(err_code);

 

一从对多主:

ret_code_t err_code;

nrf_ble_qwr_init_t qwr_init = {0};

// Initialize Queued Write Module instances.
qwr_init.error_handler = nrf_qwr_error_handler;

for (uint32_t i = 0; i < LINK_TOTAL; i++)
{
    err_code = nrf_ble_qwr_init(&m_qwr[i], &qwr_init);
    APP_ERROR_CHECK(err_code);
}


uint32_t err_code;

ble_nus_init_t nus_init;

// Initialize NUS.
memset(&nus_init, 0, sizeof(nus_init));

nus_init.data_handler = nus_data_handler;

err_code = ble_nus_init(&m_nus, &nus_init);
APP_ERROR_CHECK(err_code);

ble_conn_state_init();

 

conn_params_init --> 一对一:

uint32_t err_code;

ble_conn_params_init_t cp_init;

memset(&cp_init, 0, sizeof(cp_init));

cp_init.p_conn_params = NULL;
cp_init.first_conn_params_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY;
cp_init.next_conn_params_update_delay = NEXT_CONN_PARAMS_UPDATE_DELAY;
cp_init.max_conn_params_update_count = MAX_CONN_PARAMS_UPDATE_COUNT;
cp_init.start_on_notify_cccd_handle = BLE_GATT_HANDLE_INVALID;
cp_init.disconnect_on_fail = false;
cp_init.evt_handler = on_conn_params_evt;
cp_init.error_handler = conn_params_error_handler;

err_code = ble_conn_params_init(&cp_init);
APP_ERROR_CHECK(err_code);

一从对多主:

ret_code_t err_code;

ble_conn_params_init_t cp_init;

memset(&cp_init, 0, sizeof(cp_init));

cp_init.p_conn_params = NULL;
cp_init.first_conn_params_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY;
cp_init.next_conn_params_update_delay = NEXT_CONN_PARAMS_UPDATE_DELAY;
cp_init.max_conn_params_update_count = MAX_CONN_PARAMS_UPDATE_COUNT;
cp_init.start_on_notify_cccd_handle = BLE_GATT_HANDLE_INVALID;
cp_init.disconnect_on_fail = true;
cp_init.error_handler = conn_params_error_handler;

err_code = ble_conn_params_init(&cp_init);
APP_ERROR_CHECK(err_code);

具体操作流程,参考 16-享钥-wiegand-可多主连接 项目

 

nrf52832蓝牙从机端,你可以使用Gatt Service和Gatt Characteristic来实现句柄绑定下发的指令。具体实现步骤如下: 1. 在从机端,创建一个Gatt Service和多个Gatt Characteristic。 2. 为每个Gatt Characteristic定义一个唯一的UUID,用于标识该Characteristic。 3. 在Gatt Service中添加所有的Gatt Characteristic。 4. 在从机端实现Gatt Server的回调函数,例如onDataReceived()函数,用于接收主机下发的指令。 5. 在onDataReceived()函数中,根据接收到的数据包中Characteristic的句柄,判断是哪个Characteristic接收到了指令。 6. 根据句柄找到对应的Characteristic,并解析数据包中的指令内容。 7. 根据指令内容执行相应的操作。 示例代码如下: ```C++ // 创建Gatt Service和多个Gatt Characteristic BLEService myService = BLEService(UUID_SERVICE); BLECharacteristic char1 = BLECharacteristic(UUID_CHAR1); BLECharacteristic char2 = BLECharacteristic(UUID_CHAR2); myService.addCharacteristic(char1); myService.addCharacteristic(char2); // 实现Gatt Server的回调函数 void onDataReceived(BLECharacteristic& characteristic) { uint16_t handle = characteristic.getValueHandle(); if (handle == char1.getValueHandle()) { // 解析char1接收到的指令 // 执行相应的操作 } else if (handle == char2.getValueHandle()) { // 解析char2接收到的指令 // 执行相应的操作 } } // 主程序中添加Gatt Service和Gatt Server BLEDevice ble; ble.addService(myService); ble.onDataReceived(onDataReceived); ble.startAdvertising(); ``` 在这个示例代码中,每个Characteristic的UUID用于标识该Characteristic,而每个Characteristic的句柄则用于确定是哪个Characteristic接收到了指令。在onDataReceived()函数中,根据句柄找到对应的Characteristic,并解析数据包中的指令内容,然后执行相应的操作。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值