SPP蓝牙总结.docx_第1页
SPP蓝牙总结.docx_第2页
SPP蓝牙总结.docx_第3页
SPP蓝牙总结.docx_第4页
SPP蓝牙总结.docx_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

SPP蓝牙总结一、 SPP蓝牙使用 1、 添加权限2、 蓝牙搜索IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);filter.addAction(BluetoothDevice.ACTION_NAME_CHANGED);mContext.registerReceiver(mReceiver, filter);a) 注册广播mBtAdapter.startDiscovery();b) 开始扫描外围设备c) 退出,停止搜索,注销广播 mBtAdapter.cancelDiscovery(); private void unregisterReceiver() if (mReceiverRegisted & mContext != null) mContext.unregisterReceiver(mReceiver); mReceiverRegisted = false; 3、 蓝牙连接 mConnectThread = new ConnectThread(device, secure);mConnectThread.start();a) 新建连接线程并启动 private class ConnectThread extends Thread private final BluetoothSocket mmSocket; private final BluetoothDevice mmDevice; private String mSocketType; public ConnectThread(BluetoothDevice device, boolean secure) mmDevice = device; BluetoothSocket tmp = null; mSocketType = secure ? Secure : Insecure; try if (secure) tmp = device.createRfcommSocketToServiceRecord(SPP_UUID); else tmp = device .createInsecureRfcommSocketToServiceRecord(SPP_UUID); catch (IOException e) mmSocket = tmp; public void run() setName(ConnectThread + mSocketType); if (mmSocket != null) try mmSocket.connect(); catch (IOException e) try mmSocket.close(); catch (IOException e2) connectionFailed(mmDevice); return; synchronized (BluetoothConnectClient.this) mConnectThread = null; mCount = 0; connected(mmSocket, mmDevice, mSocketType); b)创建BluetoothSocket, 并建立Socket连接 public void cancel() try if (null != mmSocket) mmSocket.close(); catch (IOException e) Logger.e(TAG + connect cancle:, e); public synchronized void connected(BluetoothSocket socket, BluetoothDevice device, final String socketType) ReadWriterBuffer buffer = new ReadWriterBuffer(); mWriteThread = new WriteThread(device, socket, socketType, buffer); mWriteThread.start(); OutputStream tmpOut = null; try tmpOut = socket.getOutputStream(); catch (IOException e) Logger.e(TAG + connect, e); mRunnable = new Thread(new WriteRunnable(device, buffer, tmpOut); mRunnable.start(); mReadThread = new ReadThread(device, socket, socketType); mReadThread.start(); c)创建读线程,创建写线程d) 写线程WriteRunnable,写入本地缓冲区域ReadWriterBuffer;写WriteThread,写入输出流。class WriteRunnable implements Runnable private final BluetoothDevice mmDevice; private ReadWriterBuffer mBuffer; private OutputStream mOut; private WriteRunnable(BluetoothDevice device, ReadWriterBuffer buffer, OutputStream out) this.mmDevice = device; this.mBuffer = buffer; this.mOut = out; Override public void run() while (mFlag) mBuffer.write(mOut); try Thread.sleep(Constants.INTERVEL_TIME); catch (InterruptedException e) Logger.e(TAG + mFlag: + mFlag, e); private class WriteThread extends HandlerThread private Handler mmWriteHandler; private ReadWriterBuffer mBuffer; public WriteThread(BluetoothDevice device, BluetoothSocket socket, String socketType, ReadWriterBuffer buffer) super(WriteThread); this.mBuffer = buffer; public void start() super.start(); mmWriteHandler = new Handler(this.getLooper() Override public void handleMessage(Message msg) if (msg.what = MESSAGE_DATA_WRITHE) byte data = (byte) msg.obj; int len = data.length; mBuffer.read(data, len); ; public void write(byte data) if (mmWriteHandler != null) Message.obtain(mmWriteHandler, MESSAGE_DATA_WRITHE, data) .sendToTarget(); public void cancel() this.quit(); public class ReadWriterBuffer private String TAG = ReadWriterBuffer; private int mPos; private byte mBuffer = new byte1024; private ReadWriteLock lock; public ReadWriterBuffer() lock = new ReentrantReadWriteLock(); public void read(byte res, int len) lock.readLock().lock(); System.arraycopy(res, 0, mBuffer, mPos, len); mPos = mPos + len; lock.readLock().unlock(); public void write(OutputStream outStream) lock.writeLock().lock(); if (mPos != 0) try outStream.write(mBuffer, 0, mPos); outStream.flush(); catch (IOException e) Logger.d(TAG + write); mPos = 0; lock.writeLock().unlock(); e) 自定义缓冲Bufferf) 创建读线程 private class ReadThread extends Thread private final BluetoothDevice mmDevice; private final BluetoothSocket mmSocket; private final InputStream mmInStream; public ReadThread(BluetoothDevice device, BluetoothSocket socket, String socketType) mmDevice = device; mmSocket = socket; InputStream tmpIn = null; try tmpIn = socket.getInputStream(); catch (IOException e) mmInStream = tmpIn; public void run() byte buffer = new byte1024; int bytes; while (true) try bytes = mmInStream.read(buffer); dataReceived(buffer, bytes); catch (IOException e) connectionLost(mmDevice); break; public void cancel() try if (null != mmSocket) mmSocket.close(); catch (IOException e) g) 使用Handler把数据抛给主线程 private void sendDataReceivedMessage(byte data) if (mMainHandler != null) Message msg = mMainHandler.obtainMessage(MESSAGE_DATA_RECEIVED); msg.obj = data; mMainHandler.sendMessage(msg); private Handler mMainHandler = new Handler(Looper.getMainLooper() Override public void handleMessage(Message msg) if (mConnectClientListener = null) return; switch (msg.what) case MESSAGE_DATA_RECEIVED: byte data = (byte) msg.obj; mDataDecoder.parseKeyEvent(data, data.length); break; default: break; ;h) 解析数据 void parseKeyEvent(byte data, int len) StringBuffer sb = new StringBuffer(); for (int i = 0; i len; i+) sb.append(datai + |); if (len = 1024) Lo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论