我正在做一个应用程序作为基于ble_central的代码。
我正在扫描蓝牙设备(也对话微控制器DA14681),连接到其中一个,并读取一个值大于20字节的特定特征。最大长度为50字节。
我知道通常BLE可以读20个字节,写18个字节。但是如果一个设置MTU的值
Ble_gap_mtu_size_set(512),可以读/写更多字节。
然而,有时我的应用程序调用
handle_evt_gap_disconnected ((ble_evt_gap_scan_completed_t *) hdr);
当阅读的特点而不是
handle_evt_gattc_read_completed ((ble_evt_gattc_read_completed_t *) hdr);
这是为什么呢?我认为我正确地设置了MTU,能够读取超过20个字节。
外围代码还使用ble_gap_mtu_size_set(512)。
此外,我在我的计算机上用python和bluepy做了一个简单的“ble central”示例,我看到了类似的行为。读取特性时断开。然后我将python中的MTU更改为512,然后我的应用程序工作了。
我的中心任务是:
' ' ' '
空白ble_central_task (void * params)
{
int8_t wdog_id;
ble_central_task_handle = OS_GET_CURRENT_TASK ();
/ /将ble_central任务注册为watchdog
wdog_id = sys_watchdog_register(假);
#如果(CFG_USE_BROWSE_API !)
queue_init(与服务);
queue_init(特征);
# endif
ble_central_start ();
ble_gap_mtu_size_set (512);
ble_register_app ();
printf("BLE中心应用程序启动\r\n");
OS_TASK_CREATE(“com_gateway”,
com_gateway_rx_task,
空,
1024年,
COM_GATEWAY_TASK_PRIORITY,
com_gateway_h);
OS_ASSERT (com_gateway_h);
(,)
{
OS_BASE_TYPE ret;
uint32_t notif;
/*通知看门狗在每个循环*/
sys_watchdog_notify (wdog_id);
/*暂停watchdog,同时阻塞OS_TASK_NOTIFY_WAIT() */
sys_watchdog_suspend (wdog_id);
/*
*等待任何通知位,然后清除它们所有
*/
ret = OS_TASK_NOTIFY_WAIT(0, OS_TASK_NOTIFY_ALL_BITS, ¬if, OS_TASK_NOTIFY_FOREVER);
/*阻塞永远等待任务通知。返回值必须为OS_OK */
OS_ASSERT (ret = = OS_OK);
/*恢复看门狗*/
sys_watchdog_notify_and_resume (wdog_id);
/*从BLE manager得到通知,可以获得事件*/
if (notif & BLE_APP_NOTIFY_MASK)
{
ble_evt_hdr_t * hdr;
hdr = ble_get_event(假);
如果(hdr) {
goto no_event;
}
如果(! ble_service_handle_event (hdr)) {
开关(hdr - > evt_code) {
案例BLE_EVT_GAP_CONNECTED:
handle_evt_gap_connected ((ble_evt_gap_connected_t *) hdr);
打破;
案例BLE_EVT_GAP_DISCONNECTED:
handle_evt_gap_disconnected ((ble_evt_gap_disconnected_t *) hdr);
打破;
案例BLE_EVT_GAP_SECURITY_REQUEST:
handle_evt_gap_security_request ((ble_evt_gap_security_request_t *) hdr);
打破;
案例BLE_EVT_GAP_PAIR_COMPLETED:
handle_evt_gap_pair_completed ((ble_evt_gap_pair_completed_t *) hdr);
打破;
案例BLE_EVT_GAP_ADV_REPORT:
handle_evt_gap_adv_report ((ble_evt_gap_adv_report_t *) hdr);
打破;
案例BLE_EVT_GAP_SCAN_COMPLETED:
handle_evt_gap_scan_completed ((ble_evt_gap_scan_completed_t *) hdr);
打破;
案例BLE_EVT_GATTC_DISCOVER_SVC:
handle_evt_gattc_discover_svc ((ble_evt_gattc_discover_svc_t *) hdr);
打破;
案例BLE_EVT_GATTC_DISCOVER_CHAR:
handle_evt_gattc_discover_char ((ble_evt_gattc_discover_char_t *) hdr);
打破;
案例BLE_EVT_GATTC_READ_COMPLETED:
handle_evt_gattc_read_completed ((ble_evt_gattc_read_completed_t *) hdr);
打破;
案例BLE_EVT_GATTC_WRITE_COMPLETED:
handle_evt_gattc_write_completed ((ble_evt_gattc_write_completed_t *) hdr);
打破;
案例BLE_EVT_GATTC_NOTIFICATION:
handle_evt_gattc_notification ((ble_evt_gattc_notification_t *) hdr);
打破;
案例BLE_EVT_GATTC_INDICATION:
handle_evt_gattc_indication ((ble_evt_gattc_indication_t *) hdr);
打破;
默认值:
ble_handle_event_default (hdr);
打破;
}
}
OS_FREE (hdr);
no_event:
//如果队列中有更多的事件需要处理,则再次通知
如果(ble_has_event ())
{
OS_TASK_NOTIFY (OS_GET_CURRENT_TASK()、BLE_APP_NOTIFY_MASK eSetBits);
}
}
}
}
```
我读取特性的代码
```
static bluegiga_return_code_t _bluegiga_read_OUT_char(const uint8_t* input)
{
Uint8_t connection = input[4];
printf("阅读特点\ r \ n”);
if(BLUEGIGA_STATE_CONNECTING != bluegiga_state_g)
{
printf(“不能读取字符。设备未连接\ r \ n”);
返回BLUEGIGA_ERROR;
}
ble_gattc_read(连接、bluegiga_out_char_handle_g 0);
返回BLUEGIGA_READ_OUT_CHAR;
}
```
阅读活动
void handle_evt_gattc_read_completed(ble_evt_gattc_read_completed_t *evt)
{
printf("——读完整\ r \ n”);
For (uint16_t I =0;我< evt - >长度;我+ +)
{
printf (" % 02 hhx”,evt - >值[我]);
}
printf (" \ r \ n ");
}
嗨daleonpz2。
谢谢你在网上提出的问题。由于这种情况有时会发生,我建议首先检查断开的原因,这样我们就可以了解什么是错误的。
如果您检查ble_evt_gap_disconnected_t,“reason”项保存断开连接的原因。因此,当这种情况发生时,能否在断开连接函数中添加一个断点并读取其原因?您也可以打印断开串口终端的原因。它的价值是什么?
谢谢,PM_Dialog
你好,
我得到0x3E: BLE_HCI_ERROR_CONN_FAILED_TO_BE_EST。
但我可以建立联系。
handle_evt_gap_connected连接句柄
00> [handle_evt_gap_connected]连接句柄
00> [handle_evt_gap_connection_completed]连接完成句柄
00> [handle_evt_gap_connection_completed]连接状态0x00
00> [devicepool_task]试图从设备读取OUT char
00> [handle_evt_gap_disconnected]断开连接句柄
00> [handle_evt_gap_disconnected]断开原因0x3E
当我能读取时,输出是这样的:
00> [handle_evt_gap_connected]连接句柄
00> [handle_evt_gap_connection_completed]连接完成句柄
00> [handle_evt_gap_connection_completed]连接状态0x00
00> [devicepool_task]试图从设备读取OUT char
00> [handle_evt_gattc_read_completed]——读取完成
00> [devicepool_task]数据读取:
00 > 7 debb6beac79b933001000000000000000
00> [devicepool_task]我们完成了…断开
00> [handle_evt_gap_disconnected]断开连接句柄
00> [handle_evt_gap_disconnected]断开原因0x1F
以下是连接参数:
Static const gap_conn_params_t cp = {
.interval_min = BLE_CONN_INTERVAL_FROM_MS (10),
.interval_max = BLE_CONN_INTERVAL_FROM_MS (20),
.slave_latency = 0,
.sup_timeout = BLE_SUPERVISION_TMO_FROM_MS (300),
};
Status = ble_gap_connect(&(dev->地址),&cp);
嗨daleonpz2,
谢谢你回来。
>>>但是我可以建立连接。
那么,你的意思是在断开连接之后,设备仍然会发布广告,你还能连接吗?
是否有可能使用BLE嗅探器工具和共享嗅探器捕获,以便我们可以检查正在发生的空气?
由于这种情况时有发生,这将是非常有帮助的下唐什么信息交换的空中。否则就很难理解哪里出了问题。
谢谢,PM_Dialog
那么,你的意思是在断开连接后,设备仍然发布广告,你还能连接吗?
是的
我们发现了问题。有一部iphone在干扰我们。我们把它关掉,开始工作。
嗨daleonpz2,
很高兴你让它工作了,谢谢你的指示。
如果您有任何其他问题,请随意提出一个新的论坛帖子。
谢谢,PM_Dialog