最近项目中使用到蓝牙打印机,通过蓝牙连接蓝牙打印机进行打印功能。在此对蓝牙知识进行归纳输出一波,达到巩固之效果。
正文内容
- 蓝牙的基本介绍
- 蓝牙开发API的基本使用
什么是蓝牙?
也可以说是蓝牙技术。所谓蓝牙(Bluetooth)技术,实际上是一种短距离无线电技术,是由爱立信公司公司发明的。
蓝牙版本的介绍
蓝牙发展至今经历了8个版本的更新。1.1、1.2、2.0、2.1、3.0、4.0、4.1、4.2、5.0。当然5.0的蓝牙模块目前Google虽已发布,但是市场上还未见到5.0的蓝牙设备。那么我们就尽请期待5.0蓝牙设备的到来!
蓝牙有几种?
Android的蓝牙分为经典蓝牙和低功耗蓝牙(Bluetooth Low Energy 缩写BLE)。那么在1.x~3.0之间的我们称之为传统蓝牙,4.x开始的蓝牙我们称之为低功耗蓝牙也就是蓝牙BLE,当然4.x版本的蓝牙也是向下兼容的。android手机必须系统版本4.3及以上才支持BLE API。
经典蓝牙和低功耗蓝牙两者之间有很大的区别
经典蓝牙:顾名思义就是旧版的蓝牙,是Android4.2(API17)版本及以下所使用的蓝牙。
低功耗蓝牙:也称BLE,是Android4.3(API18)版本及以上所使用的蓝牙,据说相对于经典蓝牙有许多的优势,Google为其提供了新的API。
什么时候选择使用经典蓝牙还是使用BLE蓝牙
- BLE蓝牙:使用频率低、低功耗、输入数据量少、传输速度快等。
- 经典蓝牙:传输大量数据、不考虑功耗、速度、耗电等。
现在主流是4.0BLE蓝牙
- 蓝牙低功耗是使用频率低,传输少量数据的。所以功耗低,不适合传大量数据。但是有双模式,即普通模式* 和低功耗模式。普通模式和以前蓝牙(传统蓝牙)一样,可以快速传输较大数据,功耗大。
- 低功耗蓝牙比传统蓝牙,传输速度更快,覆盖范围更广,安全性更高,延迟更短,耗电极低等等优点。
- 传统的一般通过socket方式,而低功耗蓝牙是通过Gatt协议来实现。
使用蓝牙API,安卓程序能:
扫描其他蓝牙设备
为可配对蓝牙设备查询蓝牙适配器。
建立RFCOMM通道
通过服务搜索来连接其他设备。
与其他设备进行数据传输。
管理多个连接。
用蓝牙开发的目的?
蓝牙开发的目的并不是为了建立两个设备的配对。我们的重点应该放在两个设备的连接上,因为连接的过程可以看作两个设备通信的过程,建立了通信我们才可以传输数据。
怎样使用蓝牙API完成建立蓝牙连接?
一、建立蓝牙主要有四个步骤
打开蓝牙。
查找附近已配对或可用的设备。
连接设备。
设备间数据交换。
二、配对和连接是一回事?
配对是指两个设备之间首次建立连接后,系统会自动向用户显示的配对请求,当配对成功后,会自动存储已经配对的设备的信息。
连接就是使用设备存储的MAC地址,即客户端用向存储的MAC地址发起建立 RFCOMM通道的询问,服务端同意后两者的连接就建立起来了。而且利用远程设备的已知MAC地址可以随时向其发起连接(如果在范围内的话),而无需执行发现操作。所以我们可以得到这几个结论:
配对了不一定连接着。
连接一定要知道对方的蓝牙的MAC地址。
配对只是第一次连接系统为确认安全所做的准备,因此大多数情况下只有一次。
三、所有蓝牙API都在android.bluetooth 包下。下面有一些类和接口的摘要,可能需要它们来建立蓝牙连接:
-
BluetoothAdapter
代表本地蓝牙适配器(蓝牙无线电)。BluetoothAdapter是所有蓝牙交互的入口。使用这个你可以发现其他蓝牙设备,查询已配对的设备列表,使用一个已知的MAC地址来实例化一个BluetoothDevice,以及创建一个BluetoothServerSocket来为监听与其他设备的通信。
常用的方法有以下几个
cancelDiscovery() 根据字面意思,是取消发现,也就是说当我们正在搜索设备的时候调用这个方法将不再继续搜索
disable()关闭蓝牙
enable()打开蓝牙,这个方法打开蓝牙不会弹出提示,更多的时候我们需要问下用户是否打开,一下这两行代码同样是打开蓝牙,不过会提示用户:
Intemtenabler=new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enabler,reCode);//同startActivity(enabler);
getAddress()获取本地蓝牙地址
getDefaultAdapter()获取默认BluetoothAdapter,实际上,也只有这一种方法获取BluetoothAdapter
getName()获取本地蓝牙名称
getRemoteDevice(String address)根据蓝牙地址获取远程蓝牙设备
getState()获取本地蓝牙适配器当前状态(感觉可能调试的时候更需要)
isDiscovering()判断当前是否正在查找设备,是返回true
isEnabled()判断蓝牙是否打开,已打开返回true,否则,返回false
listenUsingRfcommWithServiceRecord(String name,UUID uuid)根据名称,UUID创建并返回BluetoothServerSocket,这是创建BluetoothSocket服务器端的第一步
startDiscovery()开始搜索,这是搜索的第一步
-
BluetoothDevice
代表一个远程蓝牙设备,使用这个来请求一个与远程设备的BluetoothSocket连接,或者查询关于设备名称、地址、类和连接状态等设备信息。
createRfcommSocketToServiceRecord(UUIDuuid)根据UUID创建并返回一个BluetoothSocket。
getState() 蓝牙状态这里要说一下,只有在 BluetoothAdapter.STATE_ON 状态下才可以监听,具体可以看andrid api。
createRfcommSocketToServiceRecord方法也是我们获取BluetoothDevice的目的——创建BluetoothSocket。
这个类其他的方法,如getAddress(),getName(),同BluetoothAdapter
-
BluetoothSocket
代表一个蓝牙socket的接口(和TCP Socket类似)。这是一个连接点,它允许一个应用与其他蓝牙设备通过InputStream和OutputStream交换数据。
跟BluetoothServerSocket相对,是客户端一共5个方法,不出意外,都会用到:
close(),关闭
connect()连接
getInptuStream()获取输入流
getOutputStream()获取输出流
getRemoteDevice()获取远程设备,这里指的是获取bluetoothSocket指定连接的那个远程蓝牙设备
-
BluetoothServerSocket
代表一个开放的服务器socket,它监听接受的请求(与TCP ServerSocket类似)。为了连接两台Android设备,一个设备必须使用这个类开启一个服务器socket。当一个远程蓝牙设备开始一个和该设备的连接请求,BluetoothServerSocket将会返回一个已连接的BluetoothSocket,接受该连接。
-
BluetoothClass
描述一个蓝牙设备的基本特性和性能。这是一个只读的属性集合,它定义了设备的主要和次要的设备类以及它的服务。但是,它没有描述所有的蓝牙配置和设备支持的服务,它只是暗示了设备的类型。
-
BluetoothProfile
一个表示蓝牙配置文件的接口。一个Bluetooth profile是一个基于蓝牙的通信无线接口定义。一个例子是Hands-Free profile。更多的讨论请见Working with Profiles。
-
BluetoothHeadset
提供对移动手机使用的蓝牙耳机的支持。它包含了Headset and Hands-Free (v1.5)配置文件。
-
BluetoothA2dp
定义高品质的音频如何通过蓝牙连接从一个设备传输到另一个设备。”A2DP“是Advanced Audio Distribution Profile的缩写。
-
BluetoothHealth
表示一个Health Device Profile代理,它控制蓝牙服务。
-
BluetoothHealthCallback
一个抽象类,你可以使用它来实现BluetoothHealth的回调函数。你必须扩展这个类并实现回调函数方法来接收应用程序的注册状态改变以及蓝牙串口状态的更新。
-
BluetoothHealthAppConfiguration
表示一个应用程序配置,Bluetooth Health第三方应用程序注册和一个远程Bluetooth Health设备通信。
-
BluetoothProfile.ServiceListener
一个接口,当BluetoothProfile IPC客户端从服务器上建立连接或断开连接时,它负责通知它们(也就是,运行在特性配置的内部服务)。
四、蓝牙所需要的权限
- 为了在你的应用中使用蓝牙特性,你需要至少声明一种蓝牙权限:BLUETOOTH 和BLUETOOTH_ADMIN。
- 为了执行任何蓝牙通信,例如请求一个连接、接受一个连接以及传输数据,你必须请求BLUETOOTH 权限。
- 为了初始化设备查找或控制蓝牙设置,你必须请求BLUETOOTH_ADMIN权限。大多数应用需要这个权限,仅仅是为了可以发现本地蓝牙设备。这个权限授权的其他功能不应该被使用,除非该应用是一个“强大的控制器”,来通过用户请求修改蓝牙设置。注意:如果你使用BLUETOOTH_ADMIN权限,那么必须拥有BLUETOOTH权限。
在你的应用程序清单文件中声明蓝牙权限。例如:
<manifest ... >
<uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permissionandroid:name="android.permission.BLUETOOTH" />
...
</manifest>