这是一个蓝牙通信的程序,实现了手机利用蓝牙进行通信的功能,特分享出来。照例先上图:
因为两个手机的分辨率不一样,所以上面的图的大小也不一样。
这个程序中,主要需要对蓝牙的API要熟悉,比如打开、关闭蓝牙,获取已连接设备,搜索设备等。接下来就是线程的问题了。
作为服务端的那个手机要先开启服务作为服务端:
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 = 0;
LinkDetectedHandler.sendMessage(msg);
// 接受客户端的连接请求
socket = mserverSocket.accept();
Message msg2 = new Message();
String info = "客户端已经连接上,可以发送信息。";
msg2.obj = info;
msg2.what = 0;
LinkDetectedHandler.sendMessage(msg2);
// 启动接收线程接收数据
mreadThread = new readThread();
mreadThread.start();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
其中,UUID是用来作为客户端和服务端进行配对的标识。
然后,作为客户端的手机要开一个线程去连接服务端:
<pre name="code" class="java">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("00001101-0000-1000-8000-00805F9B34FB"));
// 连接
Message msg2 = new Message();
msg2.obj = "请稍候,正在连接至" + MainActivity.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 (Exception e) {
// TODO: handle exception
Message msg = new Message();
msg.obj = "连接服务端异常!断开连接重新试一试。";
msg.what = 0;
LinkDetectedHandler.sendMessage(msg);
}
}
}
这里的UUID和服务端的那个UUID是一样的。
最后,客户端和服务端都开启一个线程来读消息:
<pre name="code" class="java">private class readThread extends Thread {
public void run() {
byte[] buffer = new byte[1024];
int bytes;
InputStream in = null;
try {
in = socket.getInputStream();
} catch (Exception e) {
// TODO: handle exception
}
while (true) {
try {
if ((bytes = in.read(buffer)) > 0) {
byte[] buf = new byte[bytes];
for (int i = 0; i < bytes; i++) {
buf[i] = buffer[i];
}
String s = new String(buf);
Message msg = new Message();
msg.obj = s;
msg.what = 1;
LinkDetectedHandler.sendMessage(msg);
}
} catch (Exception e) {
// TODO: handle exception
try {
in.close();
} catch (Exception e2) {
// TODO: handle exception
}
break;
}
}
}
}
另外,搜索设备时,如果搜索到了新设备,系统是会发广播的,去接收这个广播就能实现搜索到的设备的列表的刷新:
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
<span style="white-space:pre"> </span>@Override
<span style="white-space:pre"> </span>public void onReceive(Context context, Intent intent) {
<span style="white-space:pre"> </span>String action = intent.getAction();
<span style="white-space:pre"> </span>// When discovery finds a device
<span style="white-space:pre"> </span>if (BluetoothDevice.ACTION_FOUND.equals(action)) {
<span style="white-space:pre"> </span>// Get the BluetoothDevice object from the Intent
<span style="white-space:pre"> </span>BluetoothDevice device = intent
<span style="white-space:pre"> </span>.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
<span style="white-space:pre"> </span>// If it's already paired, skip it, because it's been listed
<span style="white-space:pre"> </span>// already
<span style="white-space:pre"> </span>if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
<span style="white-space:pre"> </span>list.add(new MyListItem(device.getName() + "\n"
<span style="white-space:pre"> </span>+ device.getAddress(), false));
<span style="white-space:pre"> </span>mAdapter.notifyDataSetChanged();
<span style="white-space:pre"> </span>mListView.setSelection(list.size() - 1);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>// When discovery is finished, change the Activity title
<span style="white-space:pre"> </span>} else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED
<span style="white-space:pre"> </span>.equals(action)) {
<span style="white-space:pre"> </span>setProgressBarIndeterminateVisibility(false);
<span style="white-space:pre"> </span>if (mListView.getCount() == 0) {
<span style="white-space:pre"> </span>list.add(new MyListItem("没有发现蓝牙设备", false));
<span style="white-space:pre"> </span>mAdapter.notifyDataSetChanged();
<span style="white-space:pre"> </span>mListView.setSelection(list.size() - 1);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>seachButton.setText("重新搜索");
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>};
主要代码就是这些了。