您的位置:首页 > 移动开发 > Android开发

android蓝牙开发————实现服务端客户端通信

2017-04-17 19:10 776 查看
蓝牙开发——客户端服务端通信

(本文demo下载地址:http://download.csdn.net/detail/gywuhengy/9816902

一.新建一个工程作为服务端,里面大致要实现的功能有这几个:

(1)权限 android.permission.BLUETOOTH

(2)蓝牙适配器 BluetoothAdapter

(3)输入输出流

(4)客户端,服务端Socket

// 蓝牙服务端socket
private BluetoothServerSocket mServerSocket;
// 蓝牙客户端socket
private BluetoothSocket mSocket;


(5)两个线程类

// 线程类
private ServerThread mServerThread;
private ReadThread mReadThread;


(6)服务端线程代码

// 开启服务器
private class ServerThread extends Thread {
public void run() {
try {
// 创建一个蓝牙服务器 参数分别:服务器名称、UUID
mServerSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(PROTOCOL_SCHEME_RFCOMM,
UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));

Message msg = new Message();
msg.obj = "请稍候,正在等待客户端的连接...";
msg.what = STATUS_CONNECTING;
mHandler.sendMessage(msg);
//服务端接受
mSocket = mServerSocket.accept();

msg = new Message();
msg.obj = "客户端已经连接上!可以发送指令。";
msg.what = STATUS_CONNECT;
mHandler.sendMessage(msg);
// 启动接受数据
mReadThread = new ReadThread();
mReadThread.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}


(7)读写线程主要代码

/**
* 读取数据
*/
private class ReadThread extends Thread {
public void run() {
byte[] buffer = new byte[1024];
int bytes;
InputStream is = null;
try {
is = mSocket.getInputStream();
while (true) {
if ((bytes = is.read(buffer)) > 0) {
byte[] buf_data = new byte[bytes];
for (int i = 0; i < bytes; i++) {
buf_data[i] = buffer[i];
}
String s = new String(buf_data);
Message msg = new Message();
msg.obj = s;
msg.what = STATUS_ACCEPT;
mHandler.sendMessage(msg);
//同样  子线程不能刷新UI
//tv_accept.setText(s);
}
}
} catch (IOException e1) {
e1.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}

}
}


(8)Handler消息处理

/**
* 信息处理
*/
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
String info = (String) msg.obj;
switch (msg.what) {
case STATUS_CONNECT:
//吐司出 连接状态
showToast(info);
break;
case STATUS_CONNECTING:
//吐司出 连接状态
showToast(info);
break;
case STATUS_ACCEPT:
//吐司出 连接状态
tv_accept.setText(info);
break;
}
}


二.创建客户端需要的大致内容:

(1)权限

android.permission.BLUETOOTH

android.permission.BLUETOOTH_ADMIN

(2)Spinner来加载配对设备

(3)

private BluetoothAdapter mBluetoothAdapter;
private BluetoothDevice mDevice;
//Spinner适配器
private MySpinnerAdapter mySpinnerAdapter;
//线程类
private ClientThread mClientThread;
private ReadThread mReadThread;
// 蓝牙客户端socket
private BluetoothSocket mSocket;


(4)客户端线程

/**
* 客户端线程
*/

private class ClientThread extends Thread {
public void run() {
try {
mSocket = mDevice.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));

Message msg = new Message();
msg.obj = "请稍候,正在连接服务器:" + serverAdress;
msg.what = STATUS_CONNECTING;
mHandler.sendMessage(msg);

mSocket.connect();

msg = new Message();
msg.obj = "已经连接上服务端!可以发送信息。";
msg.what = STATUS_CONNECT;
mHandler.sendMessage(msg);
//TODO 启动接受数据  服务端返回数据(暂时用途不大)
mReadThread = new ReadThread();
mReadThread.start();

//注意子线程不能刷新
//UIViewRootImpl$CalledFromWrongThreadException:
//ll_bluetooth.setVisibility(View.VISIBLE);

} catch (IOException e) {
Message msg = new Message();
msg.obj = "连接服务端异常!";
msg.what = STATUS_ERROR;
mHandler.sendMessage(msg);
showToast("失去连接");
}
}
}


(5)读写线程与服务端一样这里就不再赘述。。

三、注意当运行demo时需要先开启服务端。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 蓝牙 通信
相关文章推荐