BluetoothServerSocket 在接受时挂起
BluetoothServerSocket hangs on accept
我看过许多关于这个特定问题的其他帖子,所有结果都对我没有帮助或与我的案例相关。
这是我的问题,我正在尝试设置一个蓝牙微微网,其中一个节点作为服务器,7 个作为客户端,每个节点都有一个数字作为位置代表,从 0(服务器)开始到 7 (客户)。目前我正试图让它只适用于两个设备,服务器和一个客户端。我假设他们已经配对。在下面的代码中uuid是
private UUID uuid=UUID.fromString("0000111f-0000-1000-8000-00805f9b34fb");
这是我的接受传入连接的线程,广告只是蓝牙适配器
private class BTServerThread implements Runnable{
@Override
public void run() {
try {
if (ad != null) {
if (ad.isEnabled()) {
BluetoothServerSocket btss=ad.listenUsingInsecureRfcommWithServiceRecord("MyApp",uuid);
Location=0;
Integer loc=1;
Log.wtf("Server","Searching");
while(loc<=7){
Thread t=new Thread(new BTServerHandler(btss.accept(),loc));
t.start();
Log.wtf("BTS","Found");
loc++;
}
} else {
Log.e("error", "Bluetooth is disabled.");
}
}
}catch(Exception e){
e.printStackTrace();
}
}
}
这是我尝试连接的客户端线程
private class BTClientThread implements Runnable{
@Override
public void run() {
try {
if (ad != null) {
if (ad.isEnabled()) {
Set<BluetoothDevice> bondedDevices = ad.getBondedDevices();
if (bondedDevices.size() > 0) {
Iterator<BluetoothDevice> iter = bondedDevices.iterator();
BluetoothDevice device = iter.next();
Log.wtf("dev", device.getName());
BluetoothSocket clientsocket = device.createInsecureRfcommSocketToServiceRecord(uuid);
clientsocket.connect();
Log.wtf("Connected",device.getName());
}
Log.e("error", "No appropriate paired devices.");
} else {
Log.e("error", "Bluetooth is disabled.");
}
}
}catch(Exception e){
e.printStackTrace();
}
}
}
屏住呼吸,奇怪的部分来了,调用 btss.accept() 永远挂起(甚至 return 一次都没有),同时客户端设备以某种方式连接.当我打电话给
BluetoothSocket clientsocket = device.createInsecureRfcommSocketToServiceRecord(uuid);
clientsocket.connect()
这会弹出 phone 上的吐司,它挂在接受说 "DeviceName connected" 上,然后过了一会儿它会弹出另一个吐司,它自己说 "DeviceName disconnected",而我什么都不做,同时服务器 phone 仍然挂在接受上。
这是我的问题,为什么当 toast 弹出说连接时它挂在接受上?当另一个 phone 仍在侦听连接时,它怎么可能连接?
感谢您的帮助。
事实证明,使用那个特定的 UUID 导致了一些我仍然不明白的原因?在尝试了很多随机的事情之后,我最终决定尝试另一个随机的 UUID,这神奇地让它起作用了。
这是我的新 UUID
private UUID uuid = UUID.fromString("56e8a14a-80b3-11e5-8bcf-feff819cdc9f");
我看过许多关于这个特定问题的其他帖子,所有结果都对我没有帮助或与我的案例相关。
这是我的问题,我正在尝试设置一个蓝牙微微网,其中一个节点作为服务器,7 个作为客户端,每个节点都有一个数字作为位置代表,从 0(服务器)开始到 7 (客户)。目前我正试图让它只适用于两个设备,服务器和一个客户端。我假设他们已经配对。在下面的代码中uuid是
private UUID uuid=UUID.fromString("0000111f-0000-1000-8000-00805f9b34fb");
这是我的接受传入连接的线程,广告只是蓝牙适配器
private class BTServerThread implements Runnable{
@Override
public void run() {
try {
if (ad != null) {
if (ad.isEnabled()) {
BluetoothServerSocket btss=ad.listenUsingInsecureRfcommWithServiceRecord("MyApp",uuid);
Location=0;
Integer loc=1;
Log.wtf("Server","Searching");
while(loc<=7){
Thread t=new Thread(new BTServerHandler(btss.accept(),loc));
t.start();
Log.wtf("BTS","Found");
loc++;
}
} else {
Log.e("error", "Bluetooth is disabled.");
}
}
}catch(Exception e){
e.printStackTrace();
}
}
}
这是我尝试连接的客户端线程
private class BTClientThread implements Runnable{
@Override
public void run() {
try {
if (ad != null) {
if (ad.isEnabled()) {
Set<BluetoothDevice> bondedDevices = ad.getBondedDevices();
if (bondedDevices.size() > 0) {
Iterator<BluetoothDevice> iter = bondedDevices.iterator();
BluetoothDevice device = iter.next();
Log.wtf("dev", device.getName());
BluetoothSocket clientsocket = device.createInsecureRfcommSocketToServiceRecord(uuid);
clientsocket.connect();
Log.wtf("Connected",device.getName());
}
Log.e("error", "No appropriate paired devices.");
} else {
Log.e("error", "Bluetooth is disabled.");
}
}
}catch(Exception e){
e.printStackTrace();
}
}
}
屏住呼吸,奇怪的部分来了,调用 btss.accept() 永远挂起(甚至 return 一次都没有),同时客户端设备以某种方式连接.当我打电话给
BluetoothSocket clientsocket = device.createInsecureRfcommSocketToServiceRecord(uuid);
clientsocket.connect()
这会弹出 phone 上的吐司,它挂在接受说 "DeviceName connected" 上,然后过了一会儿它会弹出另一个吐司,它自己说 "DeviceName disconnected",而我什么都不做,同时服务器 phone 仍然挂在接受上。
这是我的问题,为什么当 toast 弹出说连接时它挂在接受上?当另一个 phone 仍在侦听连接时,它怎么可能连接?
感谢您的帮助。
事实证明,使用那个特定的 UUID 导致了一些我仍然不明白的原因?在尝试了很多随机的事情之后,我最终决定尝试另一个随机的 UUID,这神奇地让它起作用了。 这是我的新 UUID
private UUID uuid = UUID.fromString("56e8a14a-80b3-11e5-8bcf-feff819cdc9f");