为具有现有应用程序的设备发现特定的蓝牙设备

时间:2014-06-30 21:12:06

标签: android

我正在构建一个应用程序X,这个应用程序需要通过蓝牙连接到具有相同应用程序(X)的其他设备,所以我想列出可用的设备,但我需要列出那些有的设备应用程序X,有没有办法获得那些安装了应用程序X的特定设备?

1 个答案:

答案 0 :(得分:1)

简而言之:通过蓝牙连接应用实例需要实现客户端和服务器端,两者都使用相同的服务记录uuid。

在连接之前,您需要执行蓝牙扫描以查找附近的所有BT可用设备。

详情:

执行发现

// get adapter
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

// create discovery listener
discoveryReceiver = new BroadcastReceiver() {
    @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
        if (BluetoothDevice.ACTION_FOUND.equals(action)) {
              BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
          allDiscoveredDevices.add(device);
        }   
    };

// and register it 
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
filter.addAction(BluetoothDevice.ACTION_FOUND);
return context.registerReceiver(discoveryReceiver, filter);  

// start discovert
boolean started = bluetoothAdapter.startDiscovery(); //async call!
if (!started) {
   // log error
}

一旦您知道您所在地区的BT设备,请尝试使用您应用的UUID连接:

客户端连接

BluetoothSocket sock = device.createRfcommSocketToServiceRecord(MY_APP_UUID);
try {
      sock.connect(context);
      // if here: two peers of your app are now connected <--------------------
} catch (Exception e) {
     // no peer app found
}        

BT服务器逻辑:

服务器循环

BluetoothServerSocket ssocket = bluetoothAdapter.listenUsingRfcommWithServiceRecord(name, MY_APP_UUID);

while (serverIsRunning) {
     try {
           clientSocket = btServerSocket.accept(); // returns a connected socket
     } catch (IOException e) {
           // log error
     }
}

应该明确的是,上面是天真的编码。现实生活中的BT连接要复杂得多。它处理可能依赖于每个对等操作系统版本的边缘条件。它可能要求您访问隐藏的API,例如通过反思。

BTWiz,一个由您自己开发的开源Android BT库,处理大部分复杂性 为您而且还公开了一个异步IO接口,使BT通信变得更加简单。

随意使用它。但即使不是 - 您可能希望浏览其代码并查看其处理方式 与发现有关的常见BT问题&amp;连接。