当前位置: 首页 > 面试题库 >

Android蓝牙串行RFCOMM低波特率/传输缓慢

萧伟兆
2023-03-14
问题内容

我正在开发一个 Android蓝牙 项目,用于从定制硬件发送和接收数据。我使用SDK中的 Bluetooth Chat Sample 作为基础。

我意识到,有没有办法改变 波特率客户端(Android手机)和波特率取决于硬件。我尝试在硬件上设置不同的 波特率 ,但没有一个符合我们的期望。

我获得的最快速度是91Kbps(当波特率设置为2.7Mbps〜910Kbps时)。使用最低波特率(115Kbps),我得到43Kbps。我尝试使用不同的电话,这是相同的。我需要每秒将170KB数据传输到硬件。

规格
协议 :同步或生成的数据使用最大520字节大小的包发送到硬件。硬件在收到并批准每个程序包后发送验证命令,然后电话发送下一个数据包。
客户端 :Android 2.3.3,三星galaxy w i8150,蓝牙v3.0,RFCOMM
硬件 :自定义,蓝牙v2.1 BlueGiga WT11i

我完全感到困惑。这可能是手机上的Android或蓝牙设备引起的问题吗?我想知道最大波特率是多少?有没有一种方法可以加快传输速度(例如增加最大软件包大小,或发送所有软件包而无需等待硬件验证命令)。

编辑
将包大小更改为4160字节后,吞吐量已提高到254Kbps。我正在尝试找出达到1.5Mbps的最佳封装大小。我感谢任何建议


问题答案:

首先,更改蓝牙 RFCOMM* /串行端口协议的 波特率 应该没有什么不同,因为它不是 真正的 串行端口,而只是一种 仿真
。(特定的制造商可能对此有特殊的要求,但通常蓝牙或Android不会使用该参数来控制空中比特率)
*

影响 SPP上 数据速率的因素将是 数据包大小, 可以通过蓝牙获得的 实际
大数据速率,接收器读取的速度/发送者发送的频率。对于数据包大小,您可以查看内部文档,也可以尝试使用不同的大小以达到应用程序的最佳数量。我也建议发送
多个数据包 (或全部),直到流可以连续发送数据,类似地连续读取。

对您来说,这里的主要问题似乎是可以通过蓝牙实现的实用 吞吐量 。如果您使用的是非 EDR
版本(如您在问题中所述),则理论速度在非常低的水平上为 720Kbps ,加上头顶的协议和应用程序以及 RFCOMM 协议开销,则最高可达到
450-500 Kbps

如果您可以访问两个+ EDR的 设备,即蓝牙版本2.0或更高版本+ EDR,则可以期望应用程序 吞吐量 为1.2到1.5
Mbps(空中比特率理论上为2.0或3.0 Mbps)



 类似资料:
  • 最近,我买了一台iBeacon设备,打算创建Android应用程序,以便识别和使用它。我是一个在Android应用程序中使用蓝牙的新手,有很多事情我还不知道。在互联网和本论坛中,我找到了使用Radius Networks的Android IBeacon库的建议,但是,唉,现在它不再可用了: https://github.com/RadiusNetworks/android-ibeacon-serv

  • jd.readBLECharacteristicValue(Object object) 读取低功耗蓝牙设备的特征值的二进制数据值。注意:必须设备的特征值支持 read 才可以成功调用。 参数名 类型 默认值 必填 说明 deviceId string 是 蓝牙设备 id serviceId string 是 蓝牙特征值对应服务的 uuid characteristicId string 是 蓝牙

  • 连接和断开蓝牙设备在Windows Phone/Desktop 8.1上产生了各种结果。我一直在使用命名空间和我尝试连接具有不同蓝牙版本/类的几个设备。 版本1.2(1级和2级) 每当我尝试连接到2.0或2.1设备时,都会出现问题。第一次尝试连接到每个设备时,一切都会顺利,连接也会打开。当我随后关闭连接并重新连接设备时,问题就开始了。在重新连接期间,连接将永远不会打开,调试器将抛出一个系统。例外:

  • 我正在使用下面的代码片段每秒一次通过com端口发送gps数据: 这一切都很好,但是当使用以下方法写入串行端口时: 我的读取程序,使用: 将只从该写入状态读取254字节的数据。油灰也是如此。 我尝试过将写状态分成254个字节大小的块并写两次,但是第二次写操作,尽管被确认为由我的写入程序运行,却从未被读取程序读取。 我知道我的写缓冲区是4096字节,读缓冲区是2048字节。 我的字符串是这样的: 当我

  • 问题内容: 我正在编写一个Android BLE应用程序,并且试图获得某个特性的权限。我已经设法通过character.getProperties()获取特征属性,并且它返回非零值,但是,即使我确定特征具有PERMISSION_WRITE_ENCRYPTED_MITM(0x00000040,当我使用getPermission()方法时,它也会返回0。 )。 这是一个代码片段 难道我做错了什么?是否

  • 每当设备断开连接时,我确保对BluetoothGatt对象调用close()并将其设置为null。有什么见解吗? 编辑: 日志转储:对于这些日志,我将我的电话根目录化,并提高了/etc/bluetooth/bt_stack.conf中相关项的跟踪级别 成功连接-重新启动手机并安装应用程序后的第一次尝试。我能够连接,发现所有的服务/特性,并读/写。