Android 蓝牙通信开发

  • Receiver的设置
    • 一、Receiver1(蓝牙状态的改变通过广播接收)
    • 二、Receiver2(蓝牙搜索到设备、绑定设备(配对)通过广播接收)
  • 服务端代码
  • 客户端代码
  • 共同通讯处理类
  • 蓝牙通信的步骤如下:

Receiver的设置

一、Receiver1(蓝牙状态的改变通过广播接收)

public class MyReceiver1 extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {int status = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,-1);switch (status) {case BluetoothAdapter.STATE_OFF:Log.d(TAG, "蓝牙已关闭");break;case BluetoothAdapter.STATE_ON:Log.d(TAG, "蓝牙已打开");break;case BluetoothAdapter.STATE_TURNING_OFF:Log.d(TAG, "蓝牙关闭中...");break;case BluetoothAdapter.STATE_TURNING_ON:Log.d(TAG, "蓝牙打开中...");break;default:break;}}}
};

二、Receiver2(蓝牙搜索到设备、绑定设备(配对)通过广播接收)

        // 注册蓝牙device接收广播IntentFilter intentFilterDevice = new IntentFilter();// 开始查找intentFilterDevice.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);// 结束查找intentFilterDevice.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);// 查找设备(查找到设备)intentFilterDevice.addAction(BluetoothDevice.ACTION_FOUND);// 设备扫描模式改变 (自己状态的改变action,当设置可见或者不见时都会发送此广播)intentFilterDevice.addAction(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED);// 绑定状态intentFilterDevice.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);registerReceiver(mReceiverDeceiver,intentFilterDevice);
@Overridepublic void onReceive(Context context,Intent intent) {String action = intent.getAction();ArraySet<Object> mList = null;Policy mAdapter = null;if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) {// 开始搜索        ——接收广播Log.d(TAG,"开始搜索");mList.clear();mAdapter.refresh(mList);} else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {// 查找到设备完成   —— 接收广播Log.d(TAG,"查找到设备完成");} else if (BluetoothDevice.ACTION_FOUND.equals(action)) {// 搜索到设备       —— 接收广播Log.d(TAG,"搜索到设备");BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);mList.add(device);mAdapter.refresh(mList);} else if (BluetoothAdapter.ACTION_SCAN_MODE_CHANGED.equals(action)) {// 当自己设备设置蓝牙可见时或者不可见时 —— 接收广播int scanMode = intent.getIntExtra(BluetoothAdapter.EXTRA_SCAN_MODE,0);// 可见时if (scanMode == BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {Log.d(TAG,"设备可见监听");} else {Log.d(TAG,"设备不可见监听");}} else if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) {// 绑定状态改变回调BluetoothDevice remoteDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);if (remoteDevice == null) {Log.d(TAG,"没有绑定设备");return;}int status = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE,0);if (status == BluetoothDevice.BOND_BONDED) {Log.d(TAG,"绑定设备完成: " + remoteDevice.getName());} else if (status == BluetoothDevice.BOND_BONDING) {Log.d(TAG,"绑定设备中: " + remoteDevice.getName());} else if (status == BluetoothDevice.BOND_NONE) {Log.d(TAG,"取消绑定: ");}}

服务端代码

/*** <p>Title: AccepThread</p >* <p>Description: 服务端Socket通过accept()一直监听客户端连接的线程</p >* <p>Company: ihaveu</p >** @author kenan* @date 2021/12/12*/
public class AccepThread extends Thread {/** 连接的名称*/private static final String NAME = "BluetoothClass";/** UUID*/private static final UUID MY_UUID = UUID.fromString(Constant.CONNECTTION_UUID);/** 服务端蓝牙Sokcet*/private final BluetoothServerSocket mmServerSocket;private final BluetoothAdapter mBluetoothAdapter;/** 线程中通信的更新UI的Handler*/private final Handler mHandler;/** 监听到有客户端连接,新建一个线程单独处理,不然在此线程中会堵塞*/private ConnectedThread mConnectedThread;public AccepThread(BluetoothAdapter adapter, Handler handler) throws IOException {mBluetoothAdapter = adapter;this.mHandler = handler;// 获取服务端蓝牙socketmmServerSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);}@Overridepublic void run() {super.run();// 连接的客户端soacketBluetoothSocket socket = null;// 服务端是不退出的,要一直监听连接进来的客户端,所以是死循环while (true){// 通知主线程更新UI,客户端开始监听mHandler.sendEmptyMessage(Constant.MSG_START_LISTENING);try {// 获取连接的客户端socketsocket =  mmServerSocket.accept();} catch (IOException e) {// 通知主线程更新UI, 获取异常mHandler.sendEmptyMessage(Constant.MSG_ERROR);e.printStackTrace();// 服务端退出一直监听线程break;}if(socket != null) {// 管理连接的客户端socketmanageConnectSocket(socket);}}}/*** 管理连接的客户端socket* @param socket*/private void manageConnectSocket(BluetoothSocket socket) {// 只支持同时处理一个连接// mConnectedThread不为空,踢掉之前的客户端if(mConnectedThread != null) {mConnectedThread.cancle();}// 主线程更新UI,连接到了一个客户端mHandler.sendEmptyMessage(Constant.MSG_GOT_A_CLINET);// 新建一个线程,处理客户端发来的数据mConnectedThread = new ConnectedThread(socket, mHandler);mConnectedThread.start();}/*** 断开服务端,结束监听*/public void cancle() {try {mmServerSocket.close();mHandler.sendEmptyMessage(Constant.MSG_FINISH_LISTENING);} catch (IOException e) {e.printStackTrace();}}/*** 发送数据* @param data*/public void sendData(byte[] data){if(mConnectedThread != null) {mConnectedThread.write(data);}}
}

客户端代码

/*** <p>Title: ConnectThread</p >* <p>Description: 客户端逻辑: 客户端的线程,处理客户端socket</p >* <p>Company: ihaveu</p >** @author kenan* @date 2021/12/12*/
public class ConnectThread extends Thread{private static final UUID MY_UUID = UUID.fromString(Constant.CONNECTTION_UUID);/** 客户端socket*/private final BluetoothSocket mmSoket;/** 要连接的设备*/private final BluetoothDevice mmDevice;private BluetoothAdapter mBluetoothAdapter;/** 主线程通信的Handler*/private final Handler mHandler;/** 发送和接收数据的处理类*/private ConnectedThread mConnectedThread;public ConnectThread(BluetoothDevice device, BluetoothAdapter bluetoothAdapter, Handler mUIhandler) {mmDevice = device;mBluetoothAdapter = bluetoothAdapter;mHandler = mUIhandler;BluetoothSocket tmp = null;try {// 创建客户端Sockettmp = device.createRfcommSocketToServiceRecord(MY_UUID);} catch (IOException e) {e.printStackTrace();}mmSoket = tmp;}@Overridepublic void run() {super.run();// 关闭正在发现设备.(如果此时又在查找设备,又在发送数据,会有冲突,影响传输效率)mBluetoothAdapter.cancelDiscovery();try {// 连接服务器mmSoket.connect();} catch (IOException e) {// 连接异常就关闭try {mmSoket.close();} catch (IOException e1) {}return;}manageConnectedSocket(mmSoket);}private void manageConnectedSocket(BluetoothSocket mmSoket) {// 通知主线程连接上了服务端socket,更新UImHandler.sendEmptyMessage(Constant.MSG_CONNECTED_TO_SERVER);// 新建一个线程进行通讯,不然会发现线程堵塞mConnectedThread = new ConnectedThread(mmSoket,mHandler);mConnectedThread.start();}/*** 关闭当前客户端*/public void cancle() {try {mmSoket.close();} catch (IOException e) {e.printStackTrace();}}/*** 发送数据* @param data*/public void sendData(byte[] data) {if(mConnectedThread != null) {mConnectedThread.write(data);}}
}

共同通讯处理类

/*** <p>Title: ConnectedThread</p >* <p>Description: 客户端和服务端 处理 发送数据 和获取数据</p >* <p>Company: ihaveu</p >** @author kenna* @date 2021/12/12*/
public class ConnectedThread extends Thread{/** 当前连接的客户端BluetoothSocket*/private final BluetoothSocket mmSokcet;/** 读取数据流*/private final InputStream mmInputStream;/** 发送数据流*/private final OutputStream mmOutputStream;/** 与主线程通信Handler*/private Handler mHandler;private String TAG = "ConnectedThread";public ConnectedThread(BluetoothSocket socket,Handler handler) {mmSokcet = socket;mHandler = handler;InputStream tmpIn = null;OutputStream tmpOut = null;try {tmpIn = socket.getInputStream();tmpOut = socket.getOutputStream();} catch (IOException e) {e.printStackTrace();}mmInputStream = tmpIn;mmOutputStream = tmpOut;}@Overridepublic void run() {super.run();byte[] buffer = new byte[1024];while (true) {try {// 读取数据int bytes = mmInputStream.read(buffer);if(bytes > 0) {String data = new String(buffer,0,bytes,"utf-8");// 把数据发送到主线程, 此处还可以用广播Message message = mHandler.obtainMessage(Constant.MSG_GOT_DATA,data);mHandler.sendMessage(message);}Log.d(TAG, "messge size :" + bytes);} catch (IOException e) {e.printStackTrace();}}}// 踢掉当前客户端public void cancle() {try {mmSokcet.close();} catch (IOException e) {e.printStackTrace();}}/*** 服务端发送数据* @param data*/public void write(byte[] data) {try {mmOutputStream.write(data);} catch (IOException e) {e.printStackTrace();}}
}

蓝牙通信的步骤如下:

1,开启蓝牙

2,搜索可用设备

3,创建蓝牙socket,获取输入输出流

4,读取和写入数据

5,断开连接关闭蓝牙

Android 蓝牙通信开发相关推荐

  1. Qt on Android 蓝牙通信开发

    版权声明:本文为MULTIBEANS ORG研发跟随文章,未经MLT ORG允许不得转载. 最近做项目,需要开发安卓应用,实现串口的收发,目测CH340G在安卓手机上非常麻烦,而且驱动都是Java版本 ...

  2. android蓝牙通讯方法,Android蓝牙通信开发教程(详解版)

    Android 系统提供蓝牙 API 包 android.bluetooth,允许手机设备通过蓝牙与其他设备进行无线连接. Android 的蓝牙 API 可提供以下功能: 需要说明的是,Androi ...

  3. Android 蓝牙通信

    Android 蓝牙通信 一.现在的无线通信方案及差别 二.蓝牙传输功能开发 1.准备阶段 1)权限 2)蓝牙的开启/关闭/状态 判断设备是支持蓝牙 获取蓝牙状态 启动/关闭 2.查找设备 1) 让设 ...

  4. Android 蓝牙BLE开发详解

    Android 蓝牙BLE开发详解 由于年初接手了个有关蓝牙BLE的项目,开始了对蓝牙ble的学习,经过长时间的慢慢学习(学得太慢,太拖了),终于了解了该怎么写蓝牙BLE,现在就给大家分享一下. 一. ...

  5. Android蓝牙通信

    Android蓝牙串口通讯 闲着无聊玩起了Android蓝牙模块与单片机蓝牙模块的通信,简单思路就是要手机通过蓝牙发送控制指令给单片机,并作简单的控制应用.单片机的蓝牙模块连接与程序暂且略过,此文主要 ...

  6. android 蓝牙通信编程

    http://blog.csdn.net/yudajun/article/details/8362916 公司项目涉及蓝牙通信,所以就简单的学了学,下面是自己参考了一些资料后的总结,希望对大家有帮助. ...

  7. Android蓝牙BLE开发(一)-基本原理

    公司有需求要做蓝牙BLE传输,经查阅后发现关于BLE开发的知识还真不多.对于BLE开发的同学来说,我的建议是先快速了解一下BLE的基本原理,磨刀不误砍柴工. 什么是BLE BLE全称Bluetooth ...

  8. Android蓝牙BLE开发

    最近正在研究Android的蓝牙BLE开发学习,以下是自己做的个人总结 1.1何为BLE? 首先得说明什么是低功耗蓝牙BLE,BLE的全称为Bluetooth low energy(或称Blooth ...

  9. Android蓝牙通信具体解释

    蓝牙通信的大概过程例如以下: 1.首先开启蓝牙 2,搜索可用设备 3,创建蓝牙socket.获取输入输出流 4,读取和写入数据 5.断开连接关闭蓝牙 还要发送配对码发送进行推断! 以下是全部的源码:不 ...

最新文章

  1. Manning大神牵头,斯坦福开源Python版NLP库Stanza:涵盖66种语言
  2. 爱说说技术原理方案的定选思考过程(一)
  3. 如何做自己的服务监控?spring boot 2.x服务监控揭秘
  4. 网页全终端视频流媒体视频直播/点播播放器EasyPlayer.js实现WEB播放H265/HEVC视频方案介绍
  5. Codeforces Round #383 D
  6. 委托 匿名类 var隐式类型 匿名方法
  7. JVM性能调优监控工具总结
  8. Android蓝牙开发
  9. 记一次 .NET 某HIS系统后端服务 内存泄漏分析
  10. 再有人问你MySql 的隔离级别是什么,就把这篇文章发给他!
  11. 习题:编写一个程序,请输入两个数字,并判断两个数字的大小。
  12. php有ssm框架吗,SSM框架-企业门户网站-1-工程构建
  13. html脚本怎么触发,在HTML中使用“onkeypress”触发视频,但是只有脚本中的最后一个代码会触发视频并且不确定为什么...
  14. 大数据Hadoop之——Hadoop图形化管理系统Hue(Hue环境部署)
  15. Quartus-II 三种方式进行D触发器仿真
  16. 电脑连手机热点DNS服务器无响应,电脑连接手机热点无法上网解决方法有哪些
  17. 数学机器证明与机器验证
  18. PX4 ---- Mixer
  19. 学习日记——Quartus工程创建与运行
  20. 理解Spring Security中permitAll()和anonymous()的区别

热门文章

  1. 基于Quartus II软件的FPGA综合实验——多功能数字钟
  2. xwiki开发者指南-XWiki API 参考文档
  3. 微星b450迫机炮主板,省电
  4. 支持天合化工上市,中国的世界的。全球股市欺诈案慢慢减少
  5. MIT-BIH心律失常数据库详解
  6. 快速上手@Aspect+@Pointcut
  7. BetaFlight深入传感设计之五:MahonyAHRS 方向余弦矩阵理论
  8. 智慧社区系统、智能社区、智能照明、楼控系统、web端管理系统+智慧楼宇管理系统、可视化大屏园区数据
  9. 奥的斯3100电气图纸_奥的斯otis 3200电气原理图代号说明
  10. PMP考试内容有哪些?如何学?