在 Android 中断开蓝牙套接字
我正在开发一个程序,在该程序中,我必须从 Android 手机作为客户端连接到蓝牙医疗传感器。我使用的是官方蓝牙 API,连接期间没有问题(SPP 配置文件),但是当我结束套接字时,传感器仍然连接到我的手机(尽管我已关闭连接)。
有什么办法可以让蓝牙断开连接吗?我认为有一个名为 ACTION_ACL_CONNECTED 的意图可以做到这一点。谁能解释一下如何使用这个?
提前致谢。
编辑:这是代码,如果有人需要其他信息,它是 Nonin 4100 医疗传感器。
Set<BluetoothDevice> pairedDevices = Activa.myBluetoothAdapter.getBondedDevices();
// If there are paired devices
if (pairedDevices.size() > 0) {
// Loop through paired devices
for (BluetoothDevice device : pairedDevices) {
// Add the name and address to an array adapter to show in a ListView
String name = device.getName();
if (name.contains("Nonin")) {
try {
found = true;
// socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
// handler.sendEmptyMessage(5);
// Activa.myBluetoothAdapter.cancelDiscovery();
// socket.connect();
BluetoothDevice hxm = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(device.getAddress());
Method m;
try {
m = hxm.getClass().getMethod("createRfcommSocket", new Class[]{int.class});
socket = (BluetoothSocket)m.invoke(hxm, Integer.valueOf(1));
handler.sendEmptyMessage(5);
socket.connect();
} catch (Exception e) {
handler.sendEmptyMessage(7);
e.printStackTrace();
break;
}
handler.sendEmptyMessage(6);
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
byte[] retrieve = { 0x44, 0x31};
out.write(retrieve);
byte [] ack = new byte [1];
in.read(ack);
if (ack[0] == 0x15) {
cancelMeasurement();
return;
}
byte [] data = new byte [3];
long timeStart = System.currentTimeMillis();
this.timePassed = System.currentTimeMillis() - timeStart;
while ((this.timePassed < (this.time))&&(this.finished)) {
try {
in.read(data);
processData(data);
Thread.sleep(1000);
this.timePassed = System.currentTimeMillis() - timeStart;
} catch (Exception e) {
e.printStackTrace();
}
}
in.close();
out.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
I'm developing a program in which, from an Android Phone, I have to connect as a client to a Bluetooth medical sensor. I'm using the official Bluetooth API and no problem during connection (SPP profile), but when I end the socket, the sensor is still connected to my phone (although I have close the connection).
Are there any way to make a Bluetooth disconnection? I think there is an intent called ACTION_ACL_CONNECTED, which does that. Can anyone explain me how to use this?
Thanks in advance.
EDITED: Here is the code, if anyone needs additional info, it's a Nonin 4100 medical sensor.
Set<BluetoothDevice> pairedDevices = Activa.myBluetoothAdapter.getBondedDevices();
// If there are paired devices
if (pairedDevices.size() > 0) {
// Loop through paired devices
for (BluetoothDevice device : pairedDevices) {
// Add the name and address to an array adapter to show in a ListView
String name = device.getName();
if (name.contains("Nonin")) {
try {
found = true;
// socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
// handler.sendEmptyMessage(5);
// Activa.myBluetoothAdapter.cancelDiscovery();
// socket.connect();
BluetoothDevice hxm = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(device.getAddress());
Method m;
try {
m = hxm.getClass().getMethod("createRfcommSocket", new Class[]{int.class});
socket = (BluetoothSocket)m.invoke(hxm, Integer.valueOf(1));
handler.sendEmptyMessage(5);
socket.connect();
} catch (Exception e) {
handler.sendEmptyMessage(7);
e.printStackTrace();
break;
}
handler.sendEmptyMessage(6);
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
byte[] retrieve = { 0x44, 0x31};
out.write(retrieve);
byte [] ack = new byte [1];
in.read(ack);
if (ack[0] == 0x15) {
cancelMeasurement();
return;
}
byte [] data = new byte [3];
long timeStart = System.currentTimeMillis();
this.timePassed = System.currentTimeMillis() - timeStart;
while ((this.timePassed < (this.time))&&(this.finished)) {
try {
in.read(data);
processData(data);
Thread.sleep(1000);
this.timePassed = System.currentTimeMillis() - timeStart;
} catch (Exception e) {
e.printStackTrace();
}
}
in.close();
out.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
请记住先关闭输入/输出流,然后关闭套接字。
通过关闭流,您可以启动断开连接过程。关闭套接字后,连接应该完全断开。
如果在流之前关闭套接字,则可能会绕过某些关闭步骤,例如(正确)关闭物理层连接。
这是我在断开连接时使用的方法。
编辑:添加 connect() 代码:
Please remember to close your Input/output streams first, then close the socket.
By closing the streams, you kick off the disconnect process. After you close the socket, the connection should be fully broken down.
If you close the socket before the streams, you may be bypassing certain shutdown steps, such as the (proper) closing of the physical layer connection.
Here's the method I use when its time to breakdown the connection.
EDIT: Adding code for connect():
我发现如果我在最近通过 OutputStream 进行通信后过早调用 socket.close() ,则关闭失败并且我无法重新连接。我在调用 close() 之前添加了 Thread.sleep(1000) ,这似乎解决了这个问题。
I found that if I call socket.close() too soon after a recent communication via the OutputStream, then the close fails and I cannot reconnect. I added a Thread.sleep(1000) just prior to the call to close() and this seems to solve it.
嗨,
我看到了完全相同的问题(HTC Desire)。
尽管按照书本关闭了套接字(正如 Brad 建议的那样),下一个 connect() 会永远阻塞 - 直到另一个线程通过 close() 结束。
我通过在连接之前始终调用 BluetoothAdapter.disable()/.enable() 来避免这个问题。可怕的、不友好的黑客攻击,我知道...
我怀疑目前的一些 BT 问题是制造商特定的,因为一些应用程序实现者似乎很高兴地使用 createRfcommSocketToServiceRecord(),这在我的 HTC Desire(Android 2.1 更新 1)上肯定失败了。
我已经看到迹象(抱歉,没有参考资料)表明 HTC Desire 的 BT 堆栈与 Nexus One 不同,尽管它们似乎是非常相似的设备...
BR
每
(添加)
这是一个非常简单的活动来重现该问题(无需我禁用/启用“治愈”):
如果有人可以发现我是否做错了,请随时发表评论:)
(添加2)
我想我现在可以使用它了:
如果有人能解释这一点,我会很乐意学习。
/每
(加3)
终于得到了我的 Desire 的 Froyo (2.2) 更新,据我所知,SPP 现在可以工作了:)
/每
HI,
I've seen the exact same problem (HTC Desire).
Despite closing the socket by the book (as Brad suggests), the next connect() blocks forever - until ended by close() by another thread.
I circumvented the problem by always calling BluetoothAdapter.disable()/.enable() before connecting. Awful, unfriendly hack, I know...
I suspect that some of the present BT issues are manufacturer specific, as some app implementors seem to live happily with createRfcommSocketToServiceRecord(), which definitely fails on my HTC Desire (Android 2.1 update 1).
I have seen indications (sorry, don't have references) that HTC Desire's BT stack differs from the Nexus One, although they seem to be very similar devices...
BR
Per
(addition)
Here's a very simple activity to reproduce the problem (without my disable/enable 'cure'):
If anyone can spot if I'm doing it wrongly, feel free to comment :)
(addition 2)
I think I got it to work now:
If anyone can explain this, I'll happily learn.
/Per
(addition 3)
Finally got the Froyo (2.2) update for my Desire, and as far as I can see, SPP now works :)
/Per
我正在开发一个连接到 BT 设备的应用程序。您的代码在我的 HTC Wildfire 中运行良好,但在 Samsung Galaxy I5700 中不起作用。两个操作系统都是 2.1 更新,但是......
例外是“InitationTargetException”
我唯一需要修改的是disconnect()。
I was developing an app that conects to a BT device. Your code works fine in my HTC Wildfire but with a Samsung Galaxy I5700 doen't work. Both os are 2.1 update but.....
The exception was 'InvocationTargetException'
The only thing I had to modify is the disconnect().
嘿,我一直在使用 Android 开发网站上的蓝牙聊天应用程序,他们在 BluetoothChatService 类中提供了
stop()
方法。因此,我只是在主类中创建了它的一个实例,并从断开连接按钮调用了停止函数。这是我在主类中的调用方式
// 聊天服务的成员对象
BluetoothChatService 中的 stop() 方法
Hey so I have been using the Bluetooth Chat application from The Android Development site and they provide a
stop()
method in BluetoothChatService class. So I simply created an instance of it in my main class and and called the stop function from my disconnect button.Here is how I call it in my main class
// Member object for the chat services
The stop() method in BluetoothChatService
我有同样的问题。
这是蓝牙模块 CSR BC417 的问题,该模块作为具有 SPP 配置文件的串行蓝牙适配器存在于许多设备中。
与另一个蓝牙模块Android设备工作良好,并且蓝牙在套接字关闭后释放连接,
但对于具有此 CSR 核心的设备则不然。
在基于 CSR BC417 的 SPP 蓝牙转串行适配器和 Actisys 的蓝牙模块上进行了测试。
两者均配备 Android 4.0 设备。
我不知道为什么,但这是硬件之间的兼容性问题,请尝试将串行适配器更改为具有不同核心的另一个。
我尝试以编程方式找到解决方案,甚至禁用蓝牙,但这是不可能的,问题源于 CSR 模块。
I have the same Issue.
This is the trouble with the Bluetooth Module CSR BC417, present in many devices as serial to bluetooth adapter with SPP profile.
With another Bluetooth module android device works well, and the bluetooth release the conection after the socket is closed,
but with devices with this CSR core not.
Tested on SPP Bluetooth to Serial Adaptor based on CSR BC417, and Bluetooth module from Actisys.
Both with Android 4.0 devices.
I dont know why but is a compatibility issue between harwares, try to change the serial adaptor for another with a different Core.
I tryout programatically to find a solution, even disabling a bluetooth, but is impossible, the trouble is originated on the CSR module.