上下文如下,我有一个Android应用程序,当特定设备连接到它时发起活动,并发送代码消息。该设备不是另一个Android应用程序,在这种情况下,问题会容易得多。该设备是物联网设备,HC05。所以这个设备处于主模式,它尝试连接Android应用程序,在这种情况下是奴隶。简而言之,Android应用程序必须是作为服务器的从属设备,因此它可以接收连接,而另一个设备处于主模式,同样,Android应用程序必须在广播接收器中检测设备,所以我不能直接使用{ {1}}使用BluetoothServerSocket
方法,因为我无法运行线程。
我得到的最远的是实现此功能连接和断开蓝牙设备两次。因此,我的应用首次启动广播接收器并检测到accept()
,并在BluetoothDevice
中阻止。然后,第二次当我断开并重新连接蓝牙设备时,我的应用程序成功返回一个连接的套接字,我可以传输数据......是的!
这是我的代码
serverSocket.accept()
问题是我需要使用来自设备的唯一连接来执行此操作,而无需连接和断开设备。类似于从设备创建连接套接字(如public class BluetoothConnectionReceiver extends BroadcastReceiver {
private ConnectedThread mConnectedThread;
private BluetoothSocket btSocket = null;
public BluetoothConnectionReceiver(){}
@Override
public void onReceive(Context context, Intent intent) {
//First time I connect the bluetooth device, this method is launched
String action = intent.getAction();
switch (action){
case BluetoothDevice.ACTION_ACL_CONNECTED:
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
BluetoothSocket socket = null;
try{
BluetoothServerSocket serverSocket = adapter.listenUsingInsecureRfcommWithServiceRecord("MyApp", MY_UUID_SECURE);
socket = serverSocket.accept(); //The first launch blocks
//The second time, when I disconnect and connect again the device, the code continues properly and I can correctly transmit the data
serverSocket.close();
try{
mConnectedThread = new ConnectedThread(socket);
mConnectedThread.start();
}catch (IOException ex){
ex.printStackTrace();
}
} catch (IOException ex){
ex.printStackTrace();
}
public class ConnectedThread extends Thread {
private InputStream mmInStream;
private OutputStream mmOutStream;
private BluetoothSocket mSocket;
public ConnectedThread(BluetoothSocket socket) throws IOException{
InputStream tmpIn = null;
OutputStream tmpOut = null;
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
mmInStream = tmpIn;
mmOutStream = tmpOut;
mSocket = socket;
}
// Other methods to receive and trasnmit data with the connected socket-
}
使用BluetoothServerSocket
方法)但使用广播接收器为我提供的accept()
。
作为补充,我可以独立启动与应用程序的连接,设备设置为从属模式
BluetoothDevice
但是当我使用BroadcastReceiver给我的de object BluetoothSocket socket = device.createInsecureRfcommSocketToServiceRecord(BTMODULEUUID);
socket.connect();
时,这对我不起作用。抛出device
可能是因为设备处于主模式。
我希望有人可以帮助我解决这个我无法找到它的背景。