蓝牙通信

来源:互联网 发布:linux 效率 编辑:程序博客网 时间:2024/05/17 03:39

这是一个蓝牙通信的程序,实现了手机利用蓝牙进行通信的功能,特分享出来。照例先上图:

因为两个手机的分辨率不一样,所以上面的图的大小也不一样。


这个程序中,主要需要对蓝牙的API要熟悉,比如打开、关闭蓝牙,获取已连接设备,搜索设备等。接下来就是线程的问题了。


作为服务端的那个手机要先开启服务作为服务端:

private class serverThread extends Thread {public void run() {try {// 创建一个蓝牙服务器 参数分别:服务器名称、UUIDmserverSocket = 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 exceptione.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 exceptionMessage 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 exceptiontry {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>};
主要代码就是这些了。

0 0
原创粉丝点击