标签: rfcomm

Android:蓝牙UUID如何工作?

我不明白蓝牙UUID是什么意思.UUID是否表示协议(例如RFCOMM)?如果是这样,为什么这些createRfcommSocketToServiceRecord()方法需要UUID,当他们在名字中指定rfcomm时?为什么BluetoothChat示例代码有一个看似随意的,硬编码的UUID?

我的问题出现了,因为,根据这个问题,当运行4.0.4的设备尝试使用反射连接(到外部的,非Android设备)时,我得到一个空指针异常.但是,该问题的解决方案对我不起作用.UUID muuid = device.getUuids()[0].getUuid();提出异常.

编辑:我已经通过根据此答案(使用UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");)硬编码串行端口服务的UUID解决了这个问题.

我更加困惑的是为什么我需要提供一个UUID来创建一个不安全的rfcomm套接字,createInsecureRfcommSocketToServiceRecord(),但不使用反射方法.

任何人都可以理顺我吗?

uuid android bluetooth rfcomm

74
推荐指数
4
解决办法
9万
查看次数

在.connect()之后如何防止Android蓝牙RFCOMM连接立即死亡?

这个问题已经解决了!非常感谢布拉德,丹尼斯和瘾君子!你是英雄!:)

这是工作代码.它连接到Zeemote并从中读取数据.

=====代码=====

public class ZeeTest extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        try {
            for (int i = 0; i < 3; i++) {
                test();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private boolean connected = false;
    private BluetoothSocket sock;
    private InputStream in;
    public void test() throws Exception {
        if (connected) {
            return;
        }
        BluetoothDevice zee = BluetoothAdapter.getDefaultAdapter().
            getRemoteDevice("00:1C:4D:02:A6:55");
        Method m = zee.getClass().getMethod("createRfcommSocket",
            new Class[] { int.class });
        sock = (BluetoothSocket)m.invoke(zee, Integer.valueOf(1));
        Log.d("ZeeTest", …

android bluetooth motorola rfcomm

48
推荐指数
3
解决办法
6万
查看次数

如何在没有用户输入的情况下创建Android RFCOMM套接字?

这是场景:

我需要编写一个Android应用程序来创建一个带有蓝牙适配器的PC的RFCOMM插槽(我也要编写服务器).

我的要求是用户不必手动配对设备.

实际上,有一个大黑客,我正在使用createInsecureRfcommSocket.

一个小场景:我有一个Android应用程序,它与一个打开了RFCOMM套接字的Linux盒子交换信息.我可以在设备上手动设置PIN(硬编码是一种选择)

我正在寻找不同的道路:

编写JNI包装器

如已完成在这里的最大凯勒曼,我可以写一个JNI层,使所有配对阶段.这应该是一个不错的选择,但是有一个问题:

NDK 4b不提供libbluetooth库,因此-lbluetooth失败,以及NDK v.3.

选项:

  1. 找到NDK 1.5(包括lib bluetooth).经过几天的网络搜索,我一直无法找到答案.有人知道我能在哪里找到它吗?
  2. 自己编译libbluetooth for Android并将它们用于-lbluetooth.没有幸运,我无法建造它们.任何提示?

使用API​​公开的内容

任何人都知道如何使用createRfcommSocketToServiceRecord并让用户不要手动配对设备?可能吗?我应该怎么写服务器?

我不知道的东西

也许(肯定!)有一些我不知道的东西.也许我可以用别的东西?不是RFCOMM?SDP?

也许我可以手动配对Android API?

我希望已经足够清楚,如果不是只是问.再次,因为这不是第一次,我在你的手中:)

感谢所有支持人员!

java-native-interface android bluetooth android-ndk rfcomm

30
推荐指数
1
解决办法
9289
查看次数

在Android中通过蓝牙接收音频

我想创建一个能够接收音频流的Android应用程序.我想过使用A2DP配置文件,但似乎Android不支持A2DP接收器.看起来有很多人在寻找这个问题的解决方案.但接收普通比特流,然后将数据转换为应用程序中的音频呢?我想通过RFCOMM(SPP蓝牙配置文件)接收PCM或Mp3数据流,然后使用AudioTrack播放它.

首先,如何通过RFCOMM在我的Android手机上接收比特流?是否可以通过RFCOMM作为PCM或Mp3流接收比特流?

其次,如果不能通过RFCOMM接收比特流作为PCM或Mp3流,我如何将接收的比特流转换为音频?

第三,如何将接收的数据转换为音频并同时"实时"播放音频?我可以使用onDataReceived吗?

要清楚,我对使用A2DP配置文件不感兴趣!我想通过RFCOMM(SPP蓝牙配置文件)传输数据.接收的数据流将采用PCM或Mp3.我想写自己的应用程序,但如果有人知道一个应用程序来解决这个问题,我很高兴听到它!我正在使用Android 2.3 Gingerbread.

/约翰尼

streaming android bluetooth audio-streaming rfcomm

30
推荐指数
1
解决办法
8万
查看次数

在Linux上设置蓝牙自动配对

我想使用任何手机通过蓝牙Classic与串行端口协议(SPP)连接到物联网设备.物联网设备没有屏幕,没有键盘,只要连接电话知道一个秘密密码,就应该自动接受连接(即,我不想强​​迫每次都进入物联网设备进行配对一部新手机试图连接).

这些是我到目前为止在物联网设备上运行的命令:

# Make the device discoverable:
hciconfig hci0 piscan

# Register SPP:
sdptool add --channel=22 SP

# Start rfcomm:
rfcomm -r watch /dev/rfcomm0 22
Run Code Online (Sandbox Code Playgroud)

不幸的是,我找不到任何设置PIN的方法,当我尝试连接手机时,配对失败了.此外,该设备只能在短时间内被发现.

如何配置物联网设备的蓝牙堆栈(运行最近的Bluez)以与任何知道给定PIN的电话自动配对,以及如何使发现期间永恒?

bluetooth rfcomm bluez

24
推荐指数
1
解决办法
3284
查看次数

蓝牙RFCOMM/SDP连接到Android中的RS232适配器

我正在尝试使用谷歌提供的蓝牙聊天示例API应用程序连接到连接到另一台设备的蓝牙RS232适配器.这是应用程序供参考:

http://developer.android.com/resources/samples/BluetoothChat/index.html

以下是RS232连接器的规格表,仅供参考:

http://serialio.com/download/Docs/BlueSnap-guide-4.77_Commands.pdf

那么问题是,当我连接到设备时:

mmSocket.connect(); (BluetoothSocket::connect())
Run Code Online (Sandbox Code Playgroud)

我总是得到IOExceptionconnect()方法抛出的错误.当我toString对异常进行处理时,我得到"服务发现失败".我的问题主要是什么导致IOException在连接方法中被抛出的情况?我知道那些是在某个地方的源代码,但我不确切知道你编写应用程序的java层和包含实际堆栈接口的C/C++层.我知道它使用的是用C/C++编写的bluez蓝牙堆栈,但不确定它是如何与java层绑定的,这就是我认为抛出异常的东西.指点我可以尝试解剖这个问题的任何帮助都是不可思议的.

还要注意我能够与RS232适配器配对,但我永远无法实际连接.以下是logcat输出以获取更多参考:

I/ActivityManager( 1018): Displayed activity com.example.android.BluetoothChat/.DeviceListActivity: 326 ms (total 326 ms)
E/BluetoothService.cpp( 1018): stopDiscoveryNative: D-Bus error in StopDiscovery: org.bluez.Error.Failed (Invalid discovery session)
D/BluetoothChat( 1729): onActivityResult -1
D/BluetoothChatService( 1729): connect to: 00:06:66:03:0C:51
D/BluetoothChatService( 1729): setState() STATE_LISTEN -> STATE_CONNECTING
E/BluetoothChat( 1729): + ON RESUME +
I/BluetoothChat( 1729): MESSAGE_STATE_CHANGE: STATE_CONNECTING
I/BluetoothChatService( 1729): BEGIN mConnectThread
E/BluetoothService.cpp( 1018): stopDiscoveryNative: D-Bus error in StopDiscovery: org.bluez.Error.Failed (Invalid discovery session)
E/BluetoothEventLoop.cpp( 1018): …

android bluetooth rfcomm

20
推荐指数
1
解决办法
5万
查看次数

Android检测蓝牙立即断开最多2秒

我正在寻找一种方法来检测蓝牙设备发生后立即断开(最多2秒),通常在"设备太远"的情况下或设备电池耗尽.目前我可以BroadcastReceiver通过获取a 来检测它BluetoothDevice.ACTION_ACL_DISCONNECTED,但需要大约16到20秒才能触发.

  1. 有没有办法在2秒内收到通知.
  2. 我使用的是BroadcatReceiver,但速度不足以在2秒内获得警报Max,所以还有其他任何一种方法可以快速获得蓝牙断开连接的通知.
  3. 我用这个createRfcommSocketToServiceRecord(UUID); 连接配对设备,我必须使用UUID使用它.

我已经访问了很多关于这个问题的链接,但是没有人符合我的需求.这就是为什么任何帮助都会受到赞赏的原因.

谢谢.

android bluetooth broadcastreceiver rfcomm

16
推荐指数
1
解决办法
6993
查看次数

RFCOMM没有在Debian上使用PyBluez配对?

我正在尝试使用Python创建一个RFCOMM服务器进程,无需配对即可使用.最初,我从PyBluez文档中抓取了两个示例脚本:

服务器:

# file: rfcomm-server.py

# auth: Albert Huang <albert@csail.mit.edu>
# desc: simple demonstration of a server application that uses RFCOMM sockets
#
# $Id: rfcomm-server.py 518 2007-08-10 07:20:07Z albert $

from bluetooth import *

server_sock=BluetoothSocket( RFCOMM )
server_sock.bind(("",PORT_ANY))
server_sock.listen(1)

port = server_sock.getsockname()[1]

uuid = "94f39d29-7d6d-437d-973b-fba39e49d4ee"

advertise_service( server_sock, "SampleServer",
                   service_id = uuid,
                   service_classes = [ uuid, SERIAL_PORT_CLASS ],
                   profiles = [ SERIAL_PORT_PROFILE ], 
#                   protocols = [ OBEX_UUID ] 
                    )

print "Waiting for connection on RFCOMM channel %d" % port …
Run Code Online (Sandbox Code Playgroud)

python bluetooth rfcomm bluez

15
推荐指数
1
解决办法
1万
查看次数

蓝牙协议(RFCOMM,L2CAP和ACL)

从我从Bluetooth Essentials for Programmers中读到的内容,这本书提到了一些我不太了解的观点.

RFCOMM是一种可靠的基于流的协议.L2CAP是一种基于数据包的协议,可配置不同级别的可靠性.

L2CAP实际上充当RFCOMM的传输协议,因此每个RFCOMM连接实际上封装在L2CAP连接中.

这真的让我困惑,因为这两个协议是不同类型的协议(一个是基于流的,而另一个是基于分组的).所以基于它的解释,我在下面有一些问题.

  1. 由于RFCOMM连接是封装的,那么串口配置文件(SPP)如何使用RFCOMM连接?它也应该使用L2CAP.

  2. A2DP使用L2CAP连接.这对我来说意味着相同,因为L2CAP和RFCOMM封装在ACL连接中,这是否意味着A2DP使用ACL连接?我知道这是不正确的但是如何解释这里.

谢谢你的解释.

bluetooth l2cap rfcomm android-bluetooth

15
推荐指数
1
解决办法
2万
查看次数

当使用不安全的RFCOMM蓝牙套接字时,android何时显示配对对话框?

我试图通过蓝牙连接两个不成对的Android设备用于P2P网络.不需要MitM保护.Android拥有createInsecureRfcommSocketToServiceRecord并且listenUsingInsecureRfcommWithServiceRecord为此(从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版本,那将极大地帮助我.

此外,我正在寻找一种方法来轻松排除这些设备.

android bluetooth rfcomm

12
推荐指数
1
解决办法
4393
查看次数