最近工作中接到 BLE 相关的需求,遇到一个数据传输的问题,需要各位大佬相助。
1.通过 Android APP 与 USB 内置的 BLE 蓝牙模块,进行通信数据交互,基于 BLE(低功耗) 2.由于蓝牙交互一定涉及到服务端、客户端,所以在调试之前,我本地已经通过两个手机能够完全模拟数据传输,已经调通
当正式联调时,约定先尝试模拟通信( APP 端发一条消息、USB 蓝牙回一条消息)
然后问题就来了
在 Android 端连接时,请求 mtu 为 247 ,也收到成功指令
然后发消息时,目前与 USB 约定是定长式交互,每次固定 128 长度,我发现我发一条,USB 回复的那条一直无法收到
而当发送 3 4 条时,USB 蓝牙才将之前的数据一起返回。
因为之前 BLE 的经验比较少,到这里有点判断不出来,到底是哪方面的问题,我尝试打印 onCharacteristicChanged 也发现确实没收到消息
各位大佬有遇到过相关的情况吗?
1
McVander OP [Android] 这边 BLE 的实现是基于 Android_BLE_Library 这个框架,目前来看和框架无关
https://github.com/NordicSemiconductor/Android-BLE-Library |
2
zhoucan007 2023-03-10 16:42:48 +08:00 via iPhone
先直接抓包啊,看有没有实际发送出去
|
3
McVander OP @zhoucan007 老哥,我经验比较少,我应该如何捕获蓝牙的交互报文。(目前硬件测提供的一个 C 语言写的可执行程序,我执行之后自动捕获 USB 蓝牙的信息,然后通信)
|
4
McVander OP @zhoucan007 目前开发环境是在 Ubuntu 上
|
5
zhoucan007 2023-03-10 17:16:04 +08:00 via iPhone
用 nordic 的开发板子啊
|
6
McVander OP @zhoucan007 是的、蓝牙模块我看是 nrf52840 模块
|
7
codefu 2023-03-10 17:23:38 +08:00
你这个 usb 的 ble 蓝牙是不是要给个回车才行?
|
8
zhoucan007 2023-03-10 17:24:25 +08:00 via iPhone
@McVander 我的意思是用他们的 52840 DK 然后用 Sniffer 之类的,Wireshark
|
9
402645707 2023-03-10 17:28:05 +08:00
冷知识 Wireshark 可以通过 ADB 抓手机收到的蓝牙报文,安装的时候勾上这个支持或者直接选完整安装
|
10
McVander OP @zhoucan007 谢了,老哥,我去和硬件同事沟通一下
|
11
McVander OP @codefu 实际测试,发现发送数据量较小时,是能够发送一条 接收一条的 ,数据量较大时,就一块回来。
初步怀疑和 mtu 的设置相关 |
12
bruce0 2023-03-10 17:34:16 +08:00
winshark 我记得就支持抓蓝牙吧
|
16
string2020 2023-03-10 18:18:08 +08:00
这几条之间 间隔多少 ms
|
17
string2020 2023-03-10 18:21:15 +08:00
这几条之间 间隔多少 ms 。所谓发消息手机和 USB 是怎么实现。
|
18
zhoucan007 2023-03-10 19:25:39 +08:00 via iPhone
@402645707 额,还是得空中包吧,怕硬件不认啊……手机抓的是空中包么?
|
19
sunmker 2023-03-10 19:40:44 +08:00
先用[这个软件]( https://play.google.com/store/apps/details?id=no.nordicsemi.android.nrftoolbox&hl=zh)把你的数据帧尝试发送给单片机试试看?这个软件可以设置 mtu 的,可以确定是你的 app 问题还是硬件的问题。
|
21
McVander OP @string2020 USB 蓝牙模块,为了方便测试(每条间隔是固定的 3s ),手机端是根据原生的低功耗蓝牙的 Gatt 实现的。USB 蓝牙模块在 Linux 上提供对应的读写端口来进行通信
|
23
McVander OP 最后,我找到了一种方案,根据 9 楼的冷知识,我了解到手机通过“开发者模式”可以捕捉“蓝牙包”的通信,然后根据日志在 Wireshark 上发现,USB 蓝牙模块返回的数据就是存在问题的。下周到时候再和硬件同事沟通下。谢谢各位
|
24
Jabin 2023-03-11 07:02:31 +08:00 via Android
分包试试,每次不超过 20 字节
|