如何在Andoid中的蓝牙BroadcastReceiver内创建蓝牙服务器套接字连接?

时间:2018-01-19 17:22:56

标签: android sockets bluetooth android-bluetooth bluetooth-socket

上下文如下,我有一个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可能是因为设备处于主模式。

我希望有人可以帮助我解决这个我无法找到它的背景。

0 个答案:

没有答案