Android 读取蓝牙设备信息开发
2015-12-08 12:26
477 查看
(1)Android手机一般以客户端的角色主动连接SPP协议设备(接上蓝牙模块的数字传感器),连接流程是:
1.使用registerReceiver注册BroadcastReceiver来获取蓝牙状态、搜索设备等消息;
2.使用BlueAdatper的搜索;
3.在BroadcastReceiver的onReceive()里取得搜索所得的蓝牙设备信息(如名称,MAC,RSSI);
4.通过设备的MAC地址来建立一个BluetoothDevice对象;
5.由BluetoothDevice衍生出BluetoothSocket,准备SOCKET来读写设备;
6.通过BluetoothSocket的createRfcommSocketToServiceRecord()方法来选择连接的协议/服务,这里用的是SPP(UUID:00001101-0000-1000-8000-00805F9B34FB);
7.Connect之后(如果还没配对则系统自动提示),使用BluetoothSocket的getInputStream()和getOutputStream()来读写蓝牙设备。
****************注意:对于UUID,必须使用Android的SSP(协议栈默认)的UUID:00001101-0000-1000-8000-00805F9B34FB才能正常和外部的,也是SSP串口的蓝牙设备去连接。
(2)添加权限:
(3)BluetoothAdapter类:
BluetoothAdapter类简单点来说就是代表了本设备(手机、电脑等)的蓝牙适配器对象,通过它我们可以蓝牙设备进行基本开发了。
主要有如下功能:
1、开关蓝牙设备
2、扫描蓝牙设备
3、设置/获取蓝牙状态信息,例如:蓝牙状态值、蓝牙Name、蓝牙Mac地址等;
BluetoothAdapter初始化并提示打开蓝牙使用:
创建监听蓝牙状态的广播:
注册广播监听蓝牙状态:
开启和关闭蓝牙扫描:
点击扫描到的列表,传递点击项的BluetoothDevice通过putExtra给蓝牙数据显示界面。
(4)进行BluetoothSocket socket 和 BluetoothDevice mBluetoothDevice 进行操作。
(5)通过BluetoothSocket socket 蓝牙数据读取:
参考:
关于用到BluetoothServerSocket和BluetoothSocket两个类来建立Server端和Client端,还需要使用到一些关于流(Stream)的知识。
BluetoothServerSocket——服务端(监听端、监听器、接受请求的一端)
Accept()——阻塞宿主线程,直至收到客户端请求。返回BluetoothSocket对象。由于这个
Accept(int timeout)——阻塞宿主线程,直至收到客户端请求或等待时间超过timeout。返回BluetoothSocket对象。
Close()——关闭BluetoothServerSocket监听器。
可以看到,Accept方法是一个阻塞方法,所以在进行开发的时候,一般都需要用到多线程的知识。JAVA的多线程知识。
BluetoothSocket——客户端(请求端)
Close()——关闭BluetoothSocket请求端。
Connect()——主动向服务端(监听端)发起连接请求。
可使用BluetoothAdapter类的listenUsingRfcommWithServiceRecord方法来新建一个ServerSocket。
可以使用web上的任何一款UUID产生器为你的程序获取一个UUID,然后使用fromString(String)初始化一个UUID。
使用ServerSocket实例的accept方法进行监听,当监听到带有我们初始化的UUID参数的连接请求后作出响应,连接成功后返回一个BluetoothSocket对象。连接完成后,调用close方法关闭该Socket监听。
使用BluetoothDevice的实例的createRfcommSocketToServiceRecord方法来创建一个BluetoothSocket实例。
传入我们服务端的UUID值。
然后使用BluetoothSocket实例的Connect方法对Server端进行连接请求,当连接成功后,Client端和Server端的传输通道就被打开。
参考链接:
Android中连接蓝牙设备时遇到createRfcommSocketToServiceRecord的UUID问题和BluetoothSocket的connect失败
/article/5758098.html
1.使用registerReceiver注册BroadcastReceiver来获取蓝牙状态、搜索设备等消息;
2.使用BlueAdatper的搜索;
3.在BroadcastReceiver的onReceive()里取得搜索所得的蓝牙设备信息(如名称,MAC,RSSI);
4.通过设备的MAC地址来建立一个BluetoothDevice对象;
5.由BluetoothDevice衍生出BluetoothSocket,准备SOCKET来读写设备;
6.通过BluetoothSocket的createRfcommSocketToServiceRecord()方法来选择连接的协议/服务,这里用的是SPP(UUID:00001101-0000-1000-8000-00805F9B34FB);
7.Connect之后(如果还没配对则系统自动提示),使用BluetoothSocket的getInputStream()和getOutputStream()来读写蓝牙设备。
****************注意:对于UUID,必须使用Android的SSP(协议栈默认)的UUID:00001101-0000-1000-8000-00805F9B34FB才能正常和外部的,也是SSP串口的蓝牙设备去连接。
(2)添加权限:
<uses-permission android:name="android.permission.BLUETOOTH"></uses-permission> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission>
(3)BluetoothAdapter类:
BluetoothAdapter类简单点来说就是代表了本设备(手机、电脑等)的蓝牙适配器对象,通过它我们可以蓝牙设备进行基本开发了。
主要有如下功能:
1、开关蓝牙设备
2、扫描蓝牙设备
3、设置/获取蓝牙状态信息,例如:蓝牙状态值、蓝牙Name、蓝牙Mac地址等;
BluetoothAdapter初始化并提示打开蓝牙使用:
private BluetoothAdapter mBluetoothAdapter; mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (!mBluetoothAdapter.isEnabled()) { //弹出对话框提示用户是后打开 Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivity(intent); // startActivityForResult(intent, REQUEST_ENABLE); //不做提示,强行打开 // mBluetoothAdapter.enable(); }
创建监听蓝牙状态的广播:
BroadcastReceiver mFoundReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); //找到设备 if (BluetoothDevice.ACTION_FOUND.equals(action)) { BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); // 添加进一个设备列表,进行显示。 if (device.getBondState() != BluetoothDevice.BOND_BONDED) { Log.v(TAG, "find device:" + device.getName() + device.getAddress()); } } //搜索完成 else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { cancelDiscovery(); } } };
注册广播监听蓝牙状态:
private void startDiscovery() { IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);//开启搜索 registerReceiver(mFoundReceiver, filter); filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);//搜索完成 registerReceiver(mFoundReceiver, filter); mBluetoothAdapter.startDiscovery(); }
开启和关闭蓝牙扫描:
// 开启 mBluetoothAdapter.startDiscovery(); // 关闭 mBluetoothAdapter.cancelDiscovery();
点击扫描到的列表,传递点击项的BluetoothDevice通过putExtra给蓝牙数据显示界面。
(4)进行BluetoothSocket socket 和 BluetoothDevice mBluetoothDevice 进行操作。
private class ConnectThread extends Thread { public ConnectThread(BluetoothDevice device) { try { socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")); } catch (IOException e) { e.printStackTrace(); } } public void run() { while (mAutoConnectInterruptTime < 5) { try { socket.connect(); runOnUiThread(new Runnable() { @Override public void run() { // TODO 显示连接成功 } }); isConnect = true; mAutoConnectInterruptTime = 0; manageConnectedSocket(socket); // 创建新的线程对蓝牙进行数据读取。 break; } catch (Exception e) { e.printStackTrace(); mAutoConnectInterruptTime++; try { Thread.sleep(2000); } catch (InterruptedException e1) { e1.printStackTrace(); } runOnUiThread(new Runnable() { @Override public void run() { // TODO 显示连接失败 } }); // TODO 进行对 inputStream outputStream socket 进行关闭 置空. return; } } } public void cancel() { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } }
(5)通过BluetoothSocket socket 蓝牙数据读取:
public class Receive extends Thread { // 变量 略过 // 构造方法 public Receive(BluetoothSocket socket) { // 获取输入流 try { inputStream = socket.getInputStream(); outputStream = socket.getOutputStream(); } catch (IOException e) { e.printStackTrace(); } } @Override public void run() { final byte[] bytes = new byte[1024];// 缓冲数据流 int count;// 返回读取到的数据 // 监听输入流 try { while (inputStream != null && (count = inputStream.read(bytes)) != -1) { //获取有效部分 final byte[] contents = new byte[count]; for (int i = 0; i < contents.length; i++) { contents[i] = bytes[i]; } parse(contents); // TODO 对读取到数据进行转换 } } catch (Exception e) { e.printStackTrace(); } ConnectThread connectBtThread = new ConnectThread(mBluetoothDevice); connectBtThread.start(); // TODO 进行对 inputStream outputStream socket 进行关闭 置空。 runOnUiThread(new Runnable() { @Override public void run() { // TODO 关闭蓝牙连接 } }); // TODO inputStream outputStream socket 进行关闭 置空 } }
参考:
关于用到BluetoothServerSocket和BluetoothSocket两个类来建立Server端和Client端,还需要使用到一些关于流(Stream)的知识。
BluetoothServerSocket——服务端(监听端、监听器、接受请求的一端)
Accept()——阻塞宿主线程,直至收到客户端请求。返回BluetoothSocket对象。由于这个
Accept(int timeout)——阻塞宿主线程,直至收到客户端请求或等待时间超过timeout。返回BluetoothSocket对象。
Close()——关闭BluetoothServerSocket监听器。
可以看到,Accept方法是一个阻塞方法,所以在进行开发的时候,一般都需要用到多线程的知识。JAVA的多线程知识。
BluetoothSocket——客户端(请求端)
Close()——关闭BluetoothSocket请求端。
Connect()——主动向服务端(监听端)发起连接请求。
可使用BluetoothAdapter类的listenUsingRfcommWithServiceRecord方法来新建一个ServerSocket。
可以使用web上的任何一款UUID产生器为你的程序获取一个UUID,然后使用fromString(String)初始化一个UUID。
使用ServerSocket实例的accept方法进行监听,当监听到带有我们初始化的UUID参数的连接请求后作出响应,连接成功后返回一个BluetoothSocket对象。连接完成后,调用close方法关闭该Socket监听。
使用BluetoothDevice的实例的createRfcommSocketToServiceRecord方法来创建一个BluetoothSocket实例。
传入我们服务端的UUID值。
然后使用BluetoothSocket实例的Connect方法对Server端进行连接请求,当连接成功后,Client端和Server端的传输通道就被打开。
参考链接:
Android中连接蓝牙设备时遇到createRfcommSocketToServiceRecord的UUID问题和BluetoothSocket的connect失败
/article/5758098.html
相关文章推荐
- AndroidStudio学习笔记一:了解Activity
- 从源码角度分析android事件分发处理机制
- Android Studio 简单介绍和使用问题小结
- Android ListView 设置选中item高亮状态
- Android Studio编码问题
- Jenkins构建Android项目持续集成之Jenkins的安装篇
- Android编译环境初始化浅析
- Android国外学习资源汇总(转)
- android轻量数据库SQLite的使用
- Android RecyclerView 使用完全解析 体验艺术般的控件
- android(cm11)状态栏源码分析(一)
- 分享Android开发自学笔记之AndroidStudio常用功能
- Android Studio 快捷键中英文对译
- Android ADB常用命令总结
- 我的工具太少了之Android无限轮播图片,最后一张过度动画很重要
- Android - 文件读写操作 总结
- Android:Layout_weight的深刻理解(转载于51CTO)
- android 触摸事件、点击事件的区别,执行流程
- Android BroadcastReceiver
- android Instrumentation剖析