我不明白蓝牙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(),
但不使用反射方法.
任何人都可以理顺我吗?
这个问题已经解决了!非常感谢布拉德,丹尼斯和瘾君子!你是英雄!:)
这是工作代码.它连接到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应用程序来创建一个带有蓝牙适配器的PC的RFCOMM插槽(我也要编写服务器).
我的要求是用户不必手动配对设备.
实际上,有一个大黑客,我正在使用createInsecureRfcommSocket.
一个小场景:我有一个Android应用程序,它与一个打开了RFCOMM套接字的Linux盒子交换信息.我可以在设备上手动设置PIN(硬编码是一种选择)
我正在寻找不同的道路:
编写JNI包装器
如已完成在这里的最大凯勒曼,我可以写一个JNI层,使所有配对阶段.这应该是一个不错的选择,但是有一个问题:
NDK 4b不提供libbluetooth库,因此-lbluetooth失败,以及NDK v.3.
选项:
使用API公开的内容
任何人都知道如何使用createRfcommSocketToServiceRecord并让用户不要手动配对设备?可能吗?我应该怎么写服务器?
我不知道的东西
也许(肯定!)有一些我不知道的东西.也许我可以用别的东西?不是RFCOMM?SDP?
也许我可以手动配对Android API?
我希望已经足够清楚,如果不是只是问.再次,因为这不是第一次,我在你的手中:)
感谢所有支持人员!
我想创建一个能够接收音频流的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.
/约翰尼
我想使用任何手机通过蓝牙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的电话自动配对,以及如何使发现期间永恒?
我正在尝试使用谷歌提供的蓝牙聊天示例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)
我总是得到IOException
该connect()
方法抛出的错误.当我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): …
我正在寻找一种方法来检测蓝牙设备发生后立即断开(最多2秒),通常在"设备太远"的情况下或设备电池耗尽.目前我可以BroadcastReceiver
通过获取a 来检测它BluetoothDevice.ACTION_ACL_DISCONNECTED
,但需要大约16到20秒才能触发.
我已经访问了很多关于这个问题的链接,但是没有人符合我的需求.这就是为什么任何帮助都会受到赞赏的原因.
谢谢.
我正在尝试使用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) 从我从Bluetooth Essentials for Programmers中读到的内容,这本书提到了一些我不太了解的观点.
RFCOMM是一种可靠的基于流的协议.L2CAP是一种基于数据包的协议,可配置不同级别的可靠性.
L2CAP实际上充当RFCOMM的传输协议,因此每个RFCOMM连接实际上封装在L2CAP连接中.
这真的让我困惑,因为这两个协议是不同类型的协议(一个是基于流的,而另一个是基于分组的).所以基于它的解释,我在下面有一些问题.
由于RFCOMM连接是封装的,那么串口配置文件(SPP)如何使用RFCOMM连接?它也应该使用L2CAP.
A2DP使用L2CAP连接.这对我来说意味着相同,因为L2CAP和RFCOMM封装在ACL连接中,这是否意味着A2DP使用ACL连接?我知道这是不正确的但是如何解释这里.
谢谢你的解释.
我试图通过蓝牙连接两个不成对的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版本,那将极大地帮助我.
此外,我正在寻找一种方法来轻松排除这些设备.