在尝试读取长时间的特征时断开连接

⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程//www.wsdof.com/support.我们将在未来几天修复bug /优化搜索和标记。
6个帖子/ 0新
最后发表
daleonpz2
离线
最后看到:6个月,3个星期前
加入:2020-11-13 17:39
在尝试读取长时间的特征时断开连接

我正在做一个应用程序作为基于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,然后我的应用程序工作了。

我的中心任务是:

' ' ' '

void ble_cleal_task(void * params)

int8_t wdog_id;
ble_central_task_handle = OS_GET_CURRENT_TASK ();

/ *寄存器通过看门狗监视BLE_Central任务* /
wdog_id = sys_watchdog_register(false);

#如果(CFG_USE_BROWSE_API !)
queue_init(与服务);
queue_init(特征);
#万一

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);

/ *在OS_TASK_NOTIFY_WAIT()屏蔽时暂停看门狗* /
sys_watchdog_suspend(wdog_id);

/ *
*等待任何通知位,然后清除它们所有
* /
RET = OS_TASK_NOTIFY_WAIT(0,OS_TASK_NOTIFY_ALL_BITS,&NOTIF,OS_TASK_NOTIFY_FOREVER);
/*阻塞永远等待任务通知。返回值必须为OS_OK */
OS_ASSERT(RET == OS_OK);

/ *简历看门狗* /
sys_watchdog_notify_and_resume(wdog_id);

/ *从BLE经理通知,可以获得活动* /
if(notf&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:
//如果在队列中有更多的事件来再次通知
if(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(“无法读取char。设备未连接\ 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 ");

关键词:
设备:
PM_Dialog
离线
最后看到:2天15小时前
工作人员
加入:2018-02-08 11:03
嗨daleonpz2。

嗨daleonpz2。

谢谢你的问题在线。由于有时发生这种情况,我建议首先检查断开连接的原因,以便我们可以理解出错了。

如果您检查ble_evt_gap_disconnected_t,“reason”项保存断开连接的原因。因此,当这种情况发生时,能否在断开连接函数中添加一个断点并读取其原因?您也可以打印断开串口终端的原因。它的价值是什么?

谢谢,PM_Dialog

daleonpz2
离线
最后看到:6个月,3个星期前
加入:2020-11-13 17:39
你好,

你好,

我得到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> 7DEBB6BEAC79B93300100000000000000000
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);

PM_Dialog
离线
最后看到:2天15小时前
工作人员
加入:2018-02-08 11:03
嗨Daleonpz2,

嗨Daleonpz2,

谢谢你回来。

>>>但我可以建立联系。

所以,你的意思是在断开连接后,设备仍然是通告,而且你能够连接?

是否有可能使用BLE嗅探器工具和共享嗅探器捕获,以便我们可以检查正在发生的空气?

由于这种情况发生了有时,它会在唐在空中交换的信息非常有帮助。否则,明白什么是弄错的。

谢谢,PM_Dialog

daleonpz2
离线
最后看到:6个月,3个星期前
加入:2020-11-13 17:39
那么,你是那个意思吗

那么,你的意思是在断开连接后,设备仍然发布广告,你还能连接吗?

是的

我们发现了问题。有一部iphone在干扰我们。我们把它关掉,开始工作。

PM_Dialog
离线
最后看到:2天15小时前
工作人员
加入:2018-02-08 11:03
嗨Daleonpz2,

嗨Daleonpz2,

很高兴你让它工作了,谢谢你的指示。

如果您有任何其他问题,请随时提高新的论坛帖子。

谢谢,PM_Dialog