分类: 嵌入式
2014-12-23 15:20:44
原文地址:Android 蓝牙设备 作者:txgc_wm
通常情况下,对蓝牙的操作主要有:开启和关闭蓝牙、搜索周边设备、能被周边设备所发现、获取配对设备、蓝牙设备间的数据传输。
1、打开蓝牙(当然首先要确保你的手机是有蓝牙设备的)蓝牙设备主要分为两部分,一部分为本地设备,另一部分为远程设备。
它所包含的方法和BluetoothAdapter一样,不再累述。
点击(此处)折叠或打开
对于Android查找发现蓝牙设备使用BluetoothAdapter类的startDiscovery()方法就可以执行一个异步方式获 取周边的蓝牙设备,因为是一个异步的方法所以我们不需要考虑线程被阻塞问题,整个过程大约需要12秒时间,这时我们可以注册一个 BroadcastReceiver 对象来接收查找到的蓝牙设备信息,我们通过Filter来过滤ACTION_FOUND这个 Intent动作以获取每个远程设备的详细信息,通过Intent字段EXTRA_DEVICE 和 EXTRA_CLASS可以获得包含了每个BluetoothDevice 对象和对象的该设备类型 BluetoothClass。
实现一个自己的BroadCastReceiver类,并注册这个类。
点击(此处)折叠或打开
点击(此处)折叠或打开
点击(此处)折叠或打开
如果需要用户确认操作,不需要获取底层蓝牙服务实例,可以通过一个Intent来传递ACTION_REQUEST_DISCOVERABLE参数, 这里通过startActivity来请求开启。
点击(此处)折叠或打开
配对操作呢,一般都是发现设备后,由我们人工来进行选择后系统自动去配对。我们可以通过下面的方法来获得配对的设备:
点击(此处)折叠或打开
在看过前面的启动、发现/搜索、配对这些操作后,下面来说说数据传输的问题。在Android系统中,蓝牙设备间的数据传输问题和在PC上的网络编程颇为类似,有一端作为Server端监听Client端的连接请 求,在二者建立了连接后,就可以使用普通的数据传输方式进行数据交换操作了。在这个过程中,需要使用到BluetoothServerSocket和 BluetoothSocket两个类来建立Server端和Client端,还需要使用到一些关于流(Stream)的知识。
可以看到,Accept方法是一个阻塞方法,所以在进行开发的时候,一般都需要用到多线程的知识。JAVA的多线程知识,可以在JAVA的JDK帮助文档中查看,就单纯的应用来说还是比较简单的。
在了解了这两个类后,可以着手来建立我们自己的Server端和Client端了。如果一个设备需要和两个或多个设备连接时,就需要作为一个server来传输,服务器端套接字在接受(accepted) 一个客户发来的BluetoothSocket连接请求时作出相应的响应。服务器socket将监听进入的连接请求,一旦连接被接受,将产生一个 BluetoothSocket。
使用BluetoothAdapter类的listenUsingRfcommWithServiceRecord方法来新建一个 ServerSocket。在listenUsingRfcommWithServiceRecord中有一个参数叫做 UUID,UUID(Universally Unique Identifier)是一个128位的字符串ID,被用于唯一标识我们的蓝牙服务。你可以使用web上的任何一款UUID产生器为你的程序获取一个 UUID,然后使用fromString(String)初始化一个UUID。
使用ServerSocket实例的accept方法进行监听,当监听到带有我们初始化的UUID参数的连接请求后作出响应,连接成功后返回一个BluetoothSocket对象。连接完成后,调用close方法关闭该Socket监听。
点击(此处)折叠或打开
创建一个Client端,首先需要我们使用BluetoothDevice的实例的 createRfcommSocketToServiceRecord方法来创建一个BluetoothSocket实例。在创建的时候,需要给 createRfcommSocketToServiceRecord方法传入我们服务端的UUID值。然后使用BluetoothSocket实例的 Connect方法对Server端进行连接请求,当连接成功后,Client端和Server端的传输通道就被打开。最后在连接完成后使用该实例的 close方法来关闭这个连接。
点击(此处)折叠或打开
getOutputStrem()——获得一个可写的流,该流在连接不成功的情况下依旧可以获得,但是对其操作的话就会报IOException的异常。需要往外部传输的数据都可以写到该流中传输出去。
数据传输的大致流程如下:
还要补充一点,由于蓝牙设备是系统设备,所以需要有相应的权限支持。在AndroidManifest.xml文件中添加上权限。
点击(此处)折叠或打开