V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
McVander
V2EX  ›  程序员

Android BLE(低功耗蓝牙)相关的问题

  •  
  •   McVander · 2023-03-10 16:32:46 +08:00 · 2069 次点击
    这是一个创建于 651 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Android BLE 相关问题

    前言

    最近工作中接到 BLE 相关的需求,遇到一个数据传输的问题,需要各位大佬相助。

    场景

    1.通过 Android APP 与 USB 内置的 BLE 蓝牙模块,进行通信数据交互,基于 BLE(低功耗) 2.由于蓝牙交互一定涉及到服务端、客户端,所以在调试之前,我本地已经通过两个手机能够完全模拟数据传输,已经调通

    问题

    当正式联调时,约定先尝试模拟通信( APP 端发一条消息、USB 蓝牙回一条消息)

    然后问题就来了

    在 Android 端连接时,请求 mtu 为 247 ,也收到成功指令

    然后发消息时,目前与 USB 约定是定长式交互,每次固定 128 长度,我发现我发一条,USB 回复的那条一直无法收到

    而当发送 3 4 条时,USB 蓝牙才将之前的数据一起返回。

    因为之前 BLE 的经验比较少,到这里有点判断不出来,到底是哪方面的问题,我尝试打印 onCharacteristicChanged 也发现确实没收到消息

    各位大佬有遇到过相关的情况吗?

    第 1 条附言  ·  2023-03-11 08:17:22 +08:00
    最后,我找到了一种方案,根据 9 楼的冷知识,我了解到手机通过“开发者模式”可以捕捉“蓝牙包”的通信,然后根据日志在 Wireshark 上发现,USB 蓝牙模块返回的数据就是存在问题的。下周到时候再和硬件同事沟通下。谢谢各位

    https://it.cha138.com/javascript/show-81690.html
    25 条回复    2023-03-11 08:20:48 +08:00
    McVander
        1
    McVander  
    OP
       2023-03-10 16:34:39 +08:00
    [Android] 这边 BLE 的实现是基于 Android_BLE_Library 这个框架,目前来看和框架无关
    https://github.com/NordicSemiconductor/Android-BLE-Library
    zhoucan007
        2
    zhoucan007  
       2023-03-10 16:42:48 +08:00 via iPhone
    先直接抓包啊,看有没有实际发送出去
    McVander
        3
    McVander  
    OP
       2023-03-10 17:02:55 +08:00
    @zhoucan007 老哥,我经验比较少,我应该如何捕获蓝牙的交互报文。(目前硬件测提供的一个 C 语言写的可执行程序,我执行之后自动捕获 USB 蓝牙的信息,然后通信)
    McVander
        4
    McVander  
    OP
       2023-03-10 17:03:41 +08:00
    @zhoucan007 目前开发环境是在 Ubuntu 上
    zhoucan007
        5
    zhoucan007  
       2023-03-10 17:16:04 +08:00 via iPhone
    用 nordic 的开发板子啊
    McVander
        6
    McVander  
    OP
       2023-03-10 17:22:05 +08:00
    @zhoucan007 是的、蓝牙模块我看是 nrf52840 模块
    codefu
        7
    codefu  
       2023-03-10 17:23:38 +08:00
    你这个 usb 的 ble 蓝牙是不是要给个回车才行?
    zhoucan007
        8
    zhoucan007  
       2023-03-10 17:24:25 +08:00 via iPhone
    @McVander 我的意思是用他们的 52840 DK 然后用 Sniffer 之类的,Wireshark
    402645707
        9
    402645707  
       2023-03-10 17:28:05 +08:00
    冷知识 Wireshark 可以通过 ADB 抓手机收到的蓝牙报文,安装的时候勾上这个支持或者直接选完整安装
    McVander
        10
    McVander  
    OP
       2023-03-10 17:32:41 +08:00
    @zhoucan007 谢了,老哥,我去和硬件同事沟通一下
    McVander
        11
    McVander  
    OP
       2023-03-10 17:33:50 +08:00
    @codefu 实际测试,发现发送数据量较小时,是能够发送一条 接收一条的 ,数据量较大时,就一块回来。
    初步怀疑和 mtu 的设置相关
    bruce0
        12
    bruce0  
       2023-03-10 17:34:16 +08:00
    winshark 我记得就支持抓蓝牙吧
    McVander
        13
    McVander  
    OP
       2023-03-10 17:34:43 +08:00
    @402645707 我研究研究看看,我刚刚一直在研究怎么捕获 USB 的蓝牙数据模块,从手机这侧的蓝牙入手也可以
    McVander
        14
    McVander  
    OP
       2023-03-10 17:36:28 +08:00
    @bruce0 USB 模块,提供读写节点那种,插上好像电脑没有蓝牙功能
    bruce0
        15
    bruce0  
       2023-03-10 18:07:38 +08:00
    @McVander app 能跑在电脑上吗 在电脑上抓
    string2020
        16
    string2020  
       2023-03-10 18:18:08 +08:00
    这几条之间 间隔多少 ms
    string2020
        17
    string2020  
       2023-03-10 18:21:15 +08:00
    这几条之间 间隔多少 ms 。所谓发消息手机和 USB 是怎么实现。
    zhoucan007
        18
    zhoucan007  
       2023-03-10 19:25:39 +08:00 via iPhone
    @402645707 额,还是得空中包吧,怕硬件不认啊……手机抓的是空中包么?
    sunmker
        19
    sunmker  
       2023-03-10 19:40:44 +08:00
    McVander
        20
    McVander  
    OP
       2023-03-11 00:05:41 +08:00
    @bruce0 不行,电脑操作不了,不过我后来找到方案了,感谢
    McVander
        21
    McVander  
    OP
       2023-03-11 00:07:28 +08:00
    @string2020 USB 蓝牙模块,为了方便测试(每条间隔是固定的 3s ),手机端是根据原生的低功耗蓝牙的 Gatt 实现的。USB 蓝牙模块在 Linux 上提供对应的读写端口来进行通信
    McVander
        22
    McVander  
    OP
       2023-03-11 00:08:04 +08:00
    @sunmker 感谢,目前就是用这一类调试助手测试得到的结果
    McVander
        23
    McVander  
    OP
       2023-03-11 00:10:57 +08:00
    最后,我找到了一种方案,根据 9 楼的冷知识,我了解到手机通过“开发者模式”可以捕捉“蓝牙包”的通信,然后根据日志在 Wireshark 上发现,USB 蓝牙模块返回的数据就是存在问题的。下周到时候再和硬件同事沟通下。谢谢各位
    Jabin
        24
    Jabin  
       2023-03-11 07:02:31 +08:00 via Android
    分包试试,每次不超过 20 字节
    McVander
        25
    McVander  
    OP
       2023-03-11 08:20:48 +08:00
    @Jabin 我们使用的场景,交互可能比较频繁,并且数据量一般情况都在 200 字节。分包感觉传输效率太低。最后能抓到蓝牙日志,问题似乎明确了一些
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   966 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 20:22 · PVG 04:22 · LAX 12:22 · JFK 15:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.