BlueNRG 蓝牙:读取中央设备名称
BlueNRG Bluetooth: read central device name
我在外围设备上使用 STM BlueNRG-MS 芯片,连接后我想读取连接的中央设备的名称 (android phone)。
我想我可以直接在注册为 hci 回调的 user_notify
例程中执行此操作
/* Initialize the Host-Controller Interface */
hci_init(user_notify, NULL);
因此,在 EVT_LE_CONN_COMPLETE
事件中,我为中央设备获取提供的句柄,并使用 aci_gatt_read_using_charac_uuid()
读取我认为具有设备名称 (uuid 0x2a00) 的特征。
case EVT_LE_META_EVENT:
{
evt_le_meta_event *evt = (void *)event_pckt->data;
switch(evt->subevent){
case EVT_LE_CONN_COMPLETE:
{
evt_le_connection_complete *cc = (void *)evt->data;
GAP_ConnectionComplete_CB(cc->peer_bdaddr, cc->handle);
uint16_t uuid = 0x2a00;
resp = aci_gatt_read_using_charac_uuid(cc->handle, 0, 1, UUID_TYPE_16, (uint8_t*)&uuid);
LOG("GATT read status: %d", resp);
enqueEvent(EVENT_BLE_CONNECTED);
}
break;
}
}
长话短说,它不起作用。我不确定的第一件事是,aci_gatt_read_using_charac_uuid()
的 start_handle
和 end_handle
参数是什么,它是 returns ERR_INVALID_HCI_CMD_PARAMS
.
有人可以在这里阐明一下吗?
更新
让我感到困惑的是 BlueNRG-MS Programming Guidelines.
中没有引用函数 aci_gatt_read_using_charac_uuid()
更新2
我将函数调用更改为 aci_gatt_read_using_charac_uuid(cc->handle, 0x0001, 0xffff, UUID_TYPE_16, (uint8_t*)&uuid);
,但我仍然得到 ERR_INVALID_HCI_CMD_PARAMS
。哪个参数甚至可能无效? uuid 存在,如果我使用带有蓝牙加密狗的 BlueNRG GUI,我可以读取设备名称。
update3
有没有人使用过此功能或以某种方式设法从中央设备读取特征?我非常感谢任何帮助或提示。
给你,The BlueNRG-MS Bluetooth® LE stack application command interface (ACI) - User manual
页数 75 - 4.6.25 Aci_Gatt_Read_Charac_Using_UUID()
并确保您已致电 Aci_Gatt_Init()
用户手册最后修订于 2019 年 7 月,您 link 的文档是 2018 年的,不知道这是为什么?
start_handle
和 end_handle
是您服务中的句柄范围,如图所示 -
这是discussion与您的问题最接近的答案。
事实证明,BlueNRG 中存在两个错误 API。
在 bluenrg_aci_const.h
文件中,OCF 代码 OCF_GATT_READ_USING_CHARAC_UUID
应为 0x119
而不是 0x109
。
而在 aci_gatt_read_using_charac_uuid() 函数的实现中,缺少对事件的设置:
rq.event = EVT_CMD_STATUS;
给它们打补丁解决了这个问题。
我在外围设备上使用 STM BlueNRG-MS 芯片,连接后我想读取连接的中央设备的名称 (android phone)。
我想我可以直接在注册为 hci 回调的 user_notify
例程中执行此操作
/* Initialize the Host-Controller Interface */
hci_init(user_notify, NULL);
因此,在 EVT_LE_CONN_COMPLETE
事件中,我为中央设备获取提供的句柄,并使用 aci_gatt_read_using_charac_uuid()
读取我认为具有设备名称 (uuid 0x2a00) 的特征。
case EVT_LE_META_EVENT:
{
evt_le_meta_event *evt = (void *)event_pckt->data;
switch(evt->subevent){
case EVT_LE_CONN_COMPLETE:
{
evt_le_connection_complete *cc = (void *)evt->data;
GAP_ConnectionComplete_CB(cc->peer_bdaddr, cc->handle);
uint16_t uuid = 0x2a00;
resp = aci_gatt_read_using_charac_uuid(cc->handle, 0, 1, UUID_TYPE_16, (uint8_t*)&uuid);
LOG("GATT read status: %d", resp);
enqueEvent(EVENT_BLE_CONNECTED);
}
break;
}
}
长话短说,它不起作用。我不确定的第一件事是,aci_gatt_read_using_charac_uuid()
的 start_handle
和 end_handle
参数是什么,它是 returns ERR_INVALID_HCI_CMD_PARAMS
.
有人可以在这里阐明一下吗?
更新
让我感到困惑的是 BlueNRG-MS Programming Guidelines.
aci_gatt_read_using_charac_uuid()
更新2
我将函数调用更改为 aci_gatt_read_using_charac_uuid(cc->handle, 0x0001, 0xffff, UUID_TYPE_16, (uint8_t*)&uuid);
,但我仍然得到 ERR_INVALID_HCI_CMD_PARAMS
。哪个参数甚至可能无效? uuid 存在,如果我使用带有蓝牙加密狗的 BlueNRG GUI,我可以读取设备名称。
update3
有没有人使用过此功能或以某种方式设法从中央设备读取特征?我非常感谢任何帮助或提示。
给你,The BlueNRG-MS Bluetooth® LE stack application command interface (ACI) - User manual
页数 75 - 4.6.25 Aci_Gatt_Read_Charac_Using_UUID()
并确保您已致电 Aci_Gatt_Init()
用户手册最后修订于 2019 年 7 月,您 link 的文档是 2018 年的,不知道这是为什么?
start_handle
和 end_handle
是您服务中的句柄范围,如图所示 -
这是discussion与您的问题最接近的答案。
事实证明,BlueNRG 中存在两个错误 API。
在 bluenrg_aci_const.h
文件中,OCF 代码 OCF_GATT_READ_USING_CHARAC_UUID
应为 0x119
而不是 0x109
。
而在 aci_gatt_read_using_charac_uuid() 函数的实现中,缺少对事件的设置:
rq.event = EVT_CMD_STATUS;
给它们打补丁解决了这个问题。