本文通过BluetoothSocket类建立有关蓝牙通讯的套接字。从Android 2.0开始支持这一特性,蓝牙和LAN一样通过MAC地址来识别远程设备,建立完通讯连接RFCOMM通道后以输入、输出流方式通讯。
一、连接设备
蓝牙通讯分为server服务器端和client客户端,它们之间使用BluetoothSocket 类的不同方法来获取数据,
1. 作为服务器
如果一个设备需要和两个或多个设备连接时,就需要作为一个server来传输,在Android中提供了BluetoothServerSocket类来处理用户发来的信息,服务器端套接字在接受(accepted) 一个客户发来的BluetoothSocket时作出相应的响应。示例代码如下:
private class AcceptThread extends Thread {
private final BluetoothServerSocket cwjServerSocket;
public AcceptThread() {
BluetoothServerSocket tmp = null; //使用一个临时对象代替,因为cwjServerSocket定义为final
try {
tmp = myAdapter.listenUsingRfcommWithServiceRecord(NAME, CWJ_UUID); //服务仅监听
} catch (IOException e) { }
cwjServerSocket = tmp;
}
public void run() {
BluetoothSocket socket = null;
while (true) { //保持连接直到异常发生或套接字返回
try {
socket = cwjServerSocket.accept(); //如果一个连接同意
} catch (IOException e) {
break;
}
if (socket != null) {
manageConnectedSocket(socket); //管理一个已经连接的RFCOMM通道在单独的线程。
cwjServerSocket.close();
break;
}
}
}
public void cancel() { //取消套接字连接,然后线程返回
try {
cwjServerSocket.close();
} catch (IOException e) { }
}
}
在这里Android开发网提醒大家需要注意的是服务器一般处理多个任务不嫩阻塞,必须使用异步的方法这里我们开了一个线程,目前Android的虚拟机上层没有提供I/O模型,这里我们以后会讲解高负载情况下性能优化解决方案。