Android蓝牙通讯(三)————蓝牙通讯的实现
来源:互联网 发布:java项目学生管理系统 编辑:程序博客网 时间:2024/06/05 05:54
在前两篇博客中大致介绍了蓝牙相关的基础知识,不了解的朋友可以查看前两篇博客:
Android蓝牙通讯(一)————蓝牙功能的相关权限
Android蓝牙通讯(二)————蓝牙的相关操作
在本篇博客中我将介绍如何实现两个蓝牙设备之间的通讯,蓝牙的通讯类似于socket的通讯,在蓝牙通讯中没有绝对的设备充当server角色,基本上就是发送连接请求的设备充当client角色,而server一般会在开辟一个子线程,在子线程中不断循环监测是否有client的请求连接,代码如下:
private class AcceptListener extends Thread { private BluetoothServerSocket mServerSocket; private BluetoothAdapter mAdapter; private BluetoothSocket mSocket; public AcceptListener() { mAdapter = BluetoothAdapter.getDefaultAdapter(); } @Override public void run() { try { setState(STATE_LISTEN); mServerSocket = mAdapter.listenUsingInsecureRfcommWithServiceRecord("bluetooth",UUID_INSECURE); while (mState != STATE_CONNECTED && mState != STATE_CONNECTING){ mSocket = mServerSocket.accept(); if(mSocket != null){ setState(STATE_CONNECTING); synchronized (BluetoothService.this){ connected(mSocket); } } } } catch (IOException e) { } } }
这是server在监听client的连接请求,在代码中一个AcceptListener 线程只会监听一个请求连接,只要连接成功,server将不再监听client的连接请求,代码也不接简洁,就不介绍了!
下面来看客户端的连接请求,代码如下:
private class ConnectThread extends Thread { private BluetoothSocket mClientSocket; private BluetoothDevice mDevice; public ConnectThread(BluetoothDevice device) { this.mDevice = device; try { mClientSocket = mDevice.createInsecureRfcommSocketToServiceRecord(UUID_INSECURE); } catch (IOException e) { e.printStackTrace(); } } @Override public void run() { boolean connected = false; int i = 0; do{ try { mClientSocket.connect(); } catch (IOException e) { connected = true; } i++; try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } }while(connected && i<10); connected(mClientSocket); } }
我们通过BluetootDevice获取一个BluetoothSocket,通过这个Socket发送连接请求,在代码中,我们尝试10次连接,如果十次连接都没有连接成功,也就不再连接了!连接成功之后,那么这个Socket我们就可以正常使用了,通过socket与服务器端进行通讯!!
信息发送代码:
private class DataThread extends Thread { private BluetoothSocket mDataSocket; private OutputStream mOut; private InputStream mIn; public DataThread(BluetoothSocket socket) { this.mDataSocket = socket; try { mIn = mDataSocket.getInputStream(); mOut = mDataSocket.getOutputStream(); } catch (IOException e) { e.printStackTrace(); } setState(STATE_CONNECTED); } @Override public void run() { super.run(); android.util.Log.e("zyq","read message ...."); byte[] buffer = new byte[1024]; int bytes; while (true) { try { StringBuffer sb = new StringBuffer(); while((bytes = mIn.read(buffer)) != -1){ sb.append(new String(buffer,0,bytes)); } Bundle data = new Bundle(); data.putString("bluetooth_message",sb.toString()); Message m = Message.obtain(); m.setData(data); m.what = MainActivity.UPDATE_BLUETOOTH_MESSAGE; mHandler.sendMessage(m); } catch (IOException e) { android.util.Log.e("zyq","DataThread : e = "+e.getMessage()); setState(STATE_NONE); BluetoothService.this.startListener(); break; } } } public void write(byte[] buffer) { try { mOut.write(buffer); mOut.flush(); } catch (IOException e) { } } public void close(){ try { if (mDataSocket != null) { mDataSocket.close(); } if(mOut != null){ mOut.close(); } if(mIn != null){ mIn.close(); } } catch (IOException e) { e.printStackTrace(); } } }
通过Socket获取OutputStream和InputStream,通过使用输入/输出流进行消息的传递!在使用read方法时,没有有效的数据时会阻塞线程!!
实际测试可以进行简单的通讯,完整代码可以在GitHub上获取,有兴趣的朋友可以关注我一下,有什么问题大家相互讨论一下!!!
代码地址:Bluetooth Demo
阅读全文
0 0
- Android蓝牙通讯(三)————蓝牙通讯的实现
- Android蓝牙开发教程(三)——蓝牙设备相互通讯
- Android蓝牙通讯(一)————蓝牙功能的相关权限
- Android蓝牙通讯(二)————蓝牙的相关操作
- 蓝牙开发经验小结——蓝牙通讯
- Android蓝牙——自定义通讯框架FreeBlue
- Android蓝牙聊天,蓝牙通讯
- Android蓝牙通讯/蓝牙聊天的实现(一)_含demo下载
- Android蓝牙通讯/蓝牙聊天的实现(二)_含demo下载
- android 蓝牙通讯实现手机蓝牙的开启,并扫描附近可见的蓝牙设备
- android蓝牙通讯
- Android蓝牙通讯
- android蓝牙通讯
- android蓝牙通讯
- Android蓝牙通讯模块
- Android蓝牙通讯
- Android蓝牙串口通讯
- 蓝牙通讯的开发
- 1033. 旧键盘打字(20)--Python
- LeetCode题目:String to Integer (atoi)
- javaweb连接池总结
- explicit & implicit
- HBase1.2.x安装部署(win8+jdk1.8+hadoop2.8.1 无需cygwin)
- Android蓝牙通讯(三)————蓝牙通讯的实现
- 基础练习 字母图形
- 任正非对话Fellow:华为如何迎接智能时代的挑战?
- 摩尔定律或在2021终结,这会是半导体厂商的噩梦?
- h5斗地主房卡源码下载斗地主游戏的示例代码分析
- 数据结构---C语言顺序栈基本操作
- pl/sql developer 怎么导入sql文件
- RXjava 使用
- FLYPRO飞豹荣膺第五届中国财经峰会双重大奖