当试图读取长字符时断开

⚠️
大家好. .谢谢你来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台,它将提供更好的功能,包含在主对话网站中。所有岗位和账户都已迁移。我们现在只接受新论坛的流量-请在上面发布任何新帖子https://www.dialog-seminile.com/support.。我们将在未来几天修复错误/优化搜索和标记。
6个职位/ 0个新职位
最后一篇
Daleonpz2.
离线
最后一次露面:7个月2周前
加入:2020-11-13 17:39
当试图读取长字符时断开

我正在作为基于BLE_Central代码的中央的应用程序。

我正在扫描蓝牙设备(也是对话框微控制器DA14681),连接到其中一个并读取具有值的特定特性大于20字节。该值最多可达50个字节。

我知道通常ble可以读取最多20bytes并写入最多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_read_completed_t *)hdr);

这是为什么?我想我正确地设置了MTU,以便能够阅读更多的20个字节。

外围代码也使用ble_gap_mtu_size_set(512)。

此外,我在Python中用了来自我的电脑的Bluepy在Python中进行了一个简单的“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(假);

#if(!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(false);
如果(!HDR){
goto no_event;
}

if(!ble_service_handle_event(HDR)){
开关(HDR-> EVT_CODE){
case 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_adg_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_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);
}
}

}
}

```

我阅读特征的代码

```

静态蓝色giga_return_code_t _bluegiga_read_out_char(const uint8_t *输入)
{
uint8_t connection =输入[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; i 长度; i ++)

{
printf(“%02hhx”,EVT-> Value [I]);
}
printf(“\ r \ n”);

}

关键词:
设备:
PM_DIALOG.
离线
最后一次露面:3天1小时前
职员
加入:2018-02-08 11:03
嗨daleonpz2。

嗨daleonpz2。

谢谢你在网上提出的问题。由于这种情况有时会发生,我建议首先检查断开的原因,这样我们就可以了解什么是错误的。

如果检查ble_evt_gap_disconnected_t,则“原因”项保存断开连接的原因。所以,当发生这种情况时,请您可以将断点添加到断开功能并阅读原因吗?您还可以打印到串行终端的断开连接的原因。它的价值是多少?

谢谢,PM_DIALOG.

Daleonpz2.
离线
最后一次露面:7个月2周前
加入: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]尝试从设备中读出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]尝试从设备中读出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);

PM_DIALOG.
离线
最后一次露面:3天1小时前
职员
加入:2018-02-08 11:03
嗨daleonpz2,

嗨daleonpz2,

谢谢你回来。

>>>但是我可以建立连接。

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

是否有可能使用BLE Sniffer工具并共享嗅探器捕获,以便我们可以检查空中发生的情况吗?

由于这种情况时有发生,这将是非常有帮助的下唐什么信息交换的空中。否则就很难理解哪里出了问题。

谢谢,PM_DIALOG.

Daleonpz2.
离线
最后一次露面:7个月2周前
加入:2020-11-13 17:39
>>>所以,你的意思是

>>>所以,你的意思是在断开连接后,设备仍然宣传,你能够连接?

是的

我们发现了这个问题。有一件干扰的iPhone。我们关闭并工作了。

PM_DIALOG.
离线
最后一次露面:3天1小时前
职员
加入:2018-02-08 11:03
嗨daleonpz2,

嗨daleonpz2,

很高兴你让它工作并感谢征兆。

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

谢谢,PM_DIALOG.