问题标签 [rfcomm]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - RFCOMM 接收缺少 1 个 L2CAP 数据包的数据
我使用蓝牙的 RFCOMM 编写了 android 应用程序。我通过相同的 RFCOMM UUID 向 android 应用程序发送 1 MB 数据。
我注意到我的应用程序中丢失了 1 个 L2CAP 数据包数据。有关详细信息,请参阅以下信息。
我的 android 移动蓝牙支持最大 RFCOMM 有效负载为 990 字节,因此远程设备正在发送每个有效负载为 990 字节的 L2CAP 数据包。每当我从远程设备发送 1K 的数据时,它都被分成 2 个 L2CAP 数据包,每个数据包 990 和 34 字节。
在我的 android 应用程序中接收到数据后,我检查了每个 1K 数据,我注意到 1 个 L2CAP 数据包,即 android 中跳过了 990 个字节。
我使用分析仪检查了从远程设备发送的所有数据。它完美地发送 1 MB 数据而没有任何失败。
但仅在我的 android 应用程序中,我无法接收。这不是我的应用程序的问题,因为我在这里使用了蓝牙聊天示例代码。
我对此进行了多次测试,每次运行测试时丢失的 990 字节数据在 1MB 数据中的索引不同。
我用 3 部 android 2.2、2.3.3 和 2.3.6 版本的手机对此进行了测试,每部手机都面临同样的问题
但是在从 RFCOMM 套接字的 InputStream 接收数据时,我也没有遇到任何异常。
如果有人遇到并解决了我的问题,请帮助我。
android - 蓝牙 Android RFCOMM/SPP 错误处理建议
我计划在 Android 设备和使用商业蓝牙模块的自定义传感器之间使用通信协议。我会使用 SPP 配置文件,据说它“为用户提供简单可靠的数据流,类似于 TCP”。
我对蓝牙技术不是很熟悉,对设计这样的协议有一些疑问。
首先,我不清楚我是否必须担心损坏的数据是否被传输。底层协议栈能否保证我从InputStream
Android 读取的字节与 UART 在传感器端接收的字节相同?我是否必须定义我自己的受 CRC 或其他东西保护的数据包,还是会有点矫枉过正?
从 Android 蓝牙文档中我不清楚如果信号很弱并且丢失了一段时间,我的应用程序会发生什么。我IOException
是立即获得,还是平台为我提供了一些隐藏的错误处理和恢复,使我看不到如此短暂的中断?
感谢您的任何建议。
java - Android蓝牙串口RFCOMM低波特率/慢速传输
我正在开发一个Android 蓝牙项目,以从定制硬件发送和接收数据。我使用SDK 中的蓝牙聊天示例作为基础。
我意识到无法更改客户端(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 的最佳封装大小。我很感激任何建议
python - RFCOMM 没有在 Debian 上使用 PyBluez 配对?
我正在尝试使用 Python 创建一个无需配对即可使用的 RFCOMM 服务器进程。最初,我从 PyBluez 文档中获取了两个示例脚本:
服务器:
客户:
当我在 Windows 上运行服务器脚本时,一切都如我所愿——无需配对。在这个阶段,一切看起来都非常有希望。
但是,我需要在 Debian Squeeze 下运行服务器进程。当我在 Debian 上测试时,客户端连接被拒绝。在 syslog 中有来自 bluetoothd 的消息,显示链接密钥请求和 PIN 请求失败。
版本信息:
- PyBluez 0.18
- 蟒蛇2.6
- 蓝兹 4.66
- 连接两端的蓝牙 v2.0 硬件
这个讨论似乎表明,如果我可以调整服务器套接字的安全级别,那么配对将被禁用,一切都会按预期工作。不过,我不清楚如何使用 PyBluez 来做到这一点,或者即使有可能。
我已经尝试使用各种 BT_SECURITY* 常量调用 setsockopt(),以及获取最后一个 PyBluez 并调用 setl2capsecurity(),但未能取得任何进展。
这可以通过 PyBluez 实现吗?
android - createInsecureRfcommSocketToServiceRecord 中频繁出现随机故障(服务发现失败)
我正在尝试在两个 Android 设备之间建立不安全的蓝牙套接字连接。我控制两端的软件。一端用于listenUsingInsecureRfcommWithServiceRecord
监听连接,另一端用于createInsecureRfcommSocketToServiceRecord
连接。这行得通。有时。
“有时”是我的问题。在大约 20% 的尝试中,它失败并抛出以下异常:
两台设备都在屏幕开启时处于唤醒状态。设备之间的距离约为 1m(10 cm 和 3m 没有区别)。两个设备都没有执行发现。两个设备都是可发现的(使两者都不可发现也不会改变任何东西)。
由于无线接口,我是否必须假设它是正常的,然后在失败时重试,还是我能做些什么?鉴于我处于非常舒适的距离,它不应该更可靠地工作吗?
注意:我发现了很多类似的问题,但我发现的问题要么是关于“根本不起作用”,要么是连接到非 Android 设备,或者两者兼而有之。
android - 使用不安全的 RFCOMM 蓝牙套接字时,android 何时显示配对对话框?
我正在尝试通过蓝牙连接两个未配对的 android 设备以实现 P2P 网络目的。不需要中间人保护。Android 有createInsecureRfcommSocketToServiceRecord
andlistenUsingInsecureRfcommWithServiceRecord
为此(从 API 级别 10 开始),它可以在现代设备上完美运行。但是,在 Galaxy Ace(Android 2.3.3 = API 级别 10,与 Galaxy Nexus 连接)上,它会创建一个配对对话框。这发生在传入和传出连接上。(更新:将 Galaxy Ace 更新到 Android 2.3.6 显然可以解决问题。是否有特定的 Android 版本总是/从不这样做?)
接受配对后,连接工作。出于这个原因,我认为这与问题 40101 无关:createInsecureRfcommSocketToServiceRecord 导致 Android 4.2 上的配对对话框只有在服务记录不存在时才会发生。
我认为在出现此对话框的设备上无法避免此对话框(如果可以,解释如何执行此操作是一个有效的答案)。出于这个原因,我想知道什么时候会出现这样的对话框。我在 Android Java 源代码中没有找到任何东西(它很快就变成了原生的)。我怀疑它与蓝牙版本有什么关系,因为 Ace 有蓝牙 2.1,它应该支持所需的“正常工作”连接。
如果有什么可以让我在不弹出对话框的情况下检测设备是否支持连接,或者它是否明确固定到某个 android 版本,那将极大地帮助我。
另外,我正在寻找一种轻松排除此类设备的方法。
linux - 无需 GUI 的蓝牙配对
我需要在 Linux 服务器上使用 USB 蓝牙加密狗。实际上它可以工作,我可以发现其他蓝牙设备,但如果我尝试连接其中一个设备(使用rfcomm
),它会显示Can't connect RFCOMM socket: Connection refused
。
我认为问题在于配对,因为当我在桌面系统上键入相同的命令时,它会在对话框窗口(而不是终端)中向我询问密码。所以问题是:如何在没有桌面环境的情况下配对设备?谢谢指教。
c++ - 检查蓝牙套接字中缓冲区的状态
我创建了一个套接字来从蓝牙中的 rfcomm 套接字接收数据。
一件包裹收到的包裹有 10 个号码,但有时我会收到单独的部分。这取决于我选择获取数据的频率。例如,如果我选择1000Hz
我会得到所有信息。我正在使用 a QTimer
,因为它得到一个 int ,因为间隔 1000 ms / 1000 Hz 等于一个 int,这没关系。但是,如果除法不是 int,那么 QTimer
它将对其进行舍入,并且它不会及时重新启动函数以获取所有包,因为它不同步。
我用这个,
如果 numb 等于 10,则包没问题,所以我处理它。如果没有,则只收到一部分。然后那部分就丢失了。
有没有办法只检查缓冲区是否已满而不是已经读取它?即如果状态已满,则读取它,如果没有,则将其留给下一次迭代。
我不是这方面的专家,但国旗会MSG_EOR
帮助我吗?我的数据是打包的。
我应该read
改成recv
? recv
获取一个套接字作为参数。
任何帮助将不胜感激。
java - 无法将蓝牙键盘连接到安卓设备
我正在尝试以编程方式将 Android 手机连接到蓝牙设备(已配对)。我在线程中使用createRfcommSocketToServiceRecord(UUID)方法。
我知道蓝牙键盘是 HID 设备,所以我使用 UUID 作为
00001124-0000-1000-8000-00805f9b34fb
上述方法返回一个 BluetoothSocket 对象,但在调用 bluetoothSocket.connect() 时无法连接到 HID 设备。它给出IOException:发现失败
我对此进行了很多搜索,但不知道如何解决此问题。
是否只能在 Android 中使用这种方法连接 Rfcomm 而不是 HID 设备?如果是这样,那么我应该使用什么替代方法呢?我在此应用程序中使用带有 Android 4.1 的三星 Galaxy S3,配对后(从设置)我可以在一些内置应用程序(如短信、电子邮件等)中使用蓝牙键盘打字。在我看来,连接到它应该是可能的,但我不确定我是否使用了正确的方法。我想在我的应用程序中读取按键串行数据。
这是我正在使用的代码:
java - 蓝牙插座冻结电话
我正在为 Android 开发一个应用程序。此应用程序应与蓝牙 (BT) 设备通信(发送一些字节)。我在我的设备(Samsung Galaxy mini)上调试/运行此应用程序时遇到问题。当我创建一个 BT 插座并停止调试时,手机死机,我必须通过取出电池重新启动它。如果运行这个应用程序(从 Eclipse)一切正常,但是当我再次尝试运行它时,手机冻结并且应用程序没有安装。如果我在第二次运行之前尝试手动卸载此应用程序,手机会再次冻结。这是一个有问题的代码:
这是线程的构造函数。当我评论该行时
电话不会冻结,所以问题在于创建套接字(未连接)。每次调试或运行后重新启动手机非常烦人,我还需要做很多工作。
如果我从手机(从 Eclipse 断开)运行这个应用程序,它可以正常工作。任何想法可能是一个问题或如何解决它?谢谢你。