蓝牙连接传输消息和文件的时候,需要uuid来建立通信,经过测试,发现每一次连接客户端uuid需要和服务端uuid相同,但uuid可以根据生成规则随意更改。
简单说明见下:
client:
private String client = "00001101-0000-1000-8000-00805F9B34FB";//
//开启客户端
private class clientThread extends Thread {
public void run() {
try {
//创建一个Socket连接:只需要服务器在注册时的UUID号
// socket = device.createRfcommSocketToServiceRecord(BluetoothProtocols.OBEX_OBJECT_PUSH_PROTOCOL_UUID);
socket = device.createRfcommSocketToServiceRecord(UUID.fromString(client));
//连接
Message msg2 = new Message();
msg2.obj = "请稍候,正在连接服务器:"+Bluetooth.BlueToothAddress;
msg2.what = 0;
LinkDetectedHandler.sendMessage(msg2);
socket.connect();
Message msg = new Message();
msg.obj = "已经连接上服务端!可以发送信息。";
msg.what = 0;
LinkDetectedHandler.sendMessage(msg);
//启动接受数据
mreadThread = new readThread();
mreadThread.start();
}
catch (IOException e)
{
Log.e("connect", "", e);
Message msg = new Message();
msg.obj = "连接服务端异常!断开连接重新试一试。";
msg.what = 0;
LinkDetectedHandler.sendMessage(msg);
}
}
};
server:
private String server = "00001101-0000-1000-8000-00805F9B34FB";
//开启服务器
private class ServerThread extends Thread {
public void run() {
try {
/* 创建一个蓝牙服务器
* 参数分别:服务器名称、UUID */
mserverSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(PROTOCOL_SCHEME_RFCOMM,
UUID.fromString(server));
Log.d("server", "wait cilent connect...");
Message msg = new Message();
msg.obj = "请稍候,正在等待客户端的连接...";
msg.what = 0;
LinkDetectedHandler.sendMessage(msg);
/* 接受客户端的连接请求 */
socket = mserverSocket.accept();
Log.d("server", "accept success !");
Message msg2 = new Message();
String info = "客户端已经连接上!可以发送信息。";
msg2.obj = info;
msg.what = 0;
LinkDetectedHandler.sendMessage(msg2);
//启动接受数据
mreadThread = new readThread();
mreadThread.start();
} catch (IOException e) {
Message m = Message.obtain();
m.what = 0;
m.obj = "server.........." + e.toString();
toastHandler.sendMessage(m);
e.printStackTrace();
}
}
};
这里需要注意的是:uuid并不局限于上面的值,可以根据规则随意改变,但一次通信建立过程中需要保证通信双方uuid一致即可。
uuid的生成可以使用java.util.UUID
UUID uuid = UUID.randomUUID();
String s = UUID.randomUUID().toString();
关于uuid的说明:
UUID(Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。由以下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得),UUID的唯一缺陷在于生成的结果串会比较长。
然后通信完成之后双方都需要关闭连接,比如服务端关闭:
if(startServerThread != null)
{
startServerThread.interrupt();
startServerThread = null;
}
if(mreadThread != null)
{
mreadThread.interrupt();
mreadThread = null;
}
try {
if(socket != null)
{
socket.close();
socket = null;
}
if (mserverSocket != null)
{
mserverSocket.close();/* 关闭服务器 */
mserverSocket = null;
}
} catch (IOException e) {
Log.e("server", "mserverSocket.close()", e);
}
};
客户端关闭:
if(clientConnectThread!=null)
{
clientConnectThread.interrupt();
clientConnectThread= null;
}
if(mreadThread != null)
{
mreadThread.interrupt();
mreadThread = null;
}
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
socket = null;
}
权限:
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />