关键词:android, 蓝牙,中间件,驱动
应用层API
Android中为蓝牙的使用提供了一整套API:
- 搜索其他蓝牙设备。
- 查询适配设备。
- 建立RFCOMM通道。
- 通过发现服务连接其他蓝牙设备。
- 交换数据。
- 管理多项连接。
开启蓝牙(SettingUp Bluetooth)
1. 获得BluetoothAdapter
2. 开启蓝牙. 使用ACTION_REQUEST_ENABLE的Intent,并调用startActivityForResult()方法。
查找设备
设备搜索(Device Discovery)是一个扫描的过程,用来搜索本地开启蓝牙的设备。
查询配对设备
调用getBondedDevices()方法。该方法返回一个BluetoothDevice的集合来代表配对设备。
发现设备
执行startDiscovery()方法。该过程是异步的,该方法将会立刻返回一个布尔值表明搜索是否已经开始。应用程序必须使用ACTION_FOUNDd的Intent注册一个BroadastReceiver。该Intent用来接受每一个查找到设备的信息。对于每一个设备,系统将会广播ACTION_FOUND。
连接设备
一个设备一定会开启服务器Socket,而另一个进行连接(使用作为服务器端的MAC地址进行连接)。当客户端和服务器端彼此拥有一个在同一个RFCOMM通道已连接的BluetoothSocket时便可以进行数据的交换。如果两个设备之前并没有配对过,那么Android的框架将会自动进行配对的请求通知。
管理连接
当成功进行设备间的连接时,每一个设备都持有一个已连接的BluetoothSocket。这时终于可以进行数据的传输了。使用BluetoothSocket,数据的传输非常简单。通过getInputStream()以及getOutputStream()分别获得输入输出流。通过read(byte[]) 和 write(byte[]) 读写数据。架构
Android蓝牙框架
Bluez verystrong in Linux world. Bluedroid strong in Android world.
Profiles → collection ofServices
HAL接口
Android系统硬件抽象层(HardwareAbstraction Layer,HAL)是连接Android Framework与内核设备驱动的重要桥梁。其主要设计意图是向下屏蔽设备以及其驱动的实现细节,向上为系统服务以及Framework提供提供统一的设备访问接口。同时Google基于保护硬件厂商知识产权的考量,选择Apache开源许可证以避开GPL开源协议的约束,允许硬件厂商不公开源码,将设备相关的实现放在HAL层中实现并以共享库(.so)的形式提供。
WifiHAL框架
HAL存在的原因
1. 并不是所有的硬件设备都有标准的linuxkernel接口
2. Kernel driver涉及到GPL的版权,某些设备制造商不愿意公开硬件驱动。
3. 对某些硬件,android有一些特殊的需求。
Android HAL软件设计中有两个概念(Module,Device)。Module代表整个HAL实现,是HAL模块类别、功能的封装,是外部程序能看到的唯一视角;Deivce代表着一个实际的硬件设备,是设备属性、设备操作的封装,设备提供的所有操作在Device结构中体现,Device由Module的open方法创建。
HAL开发规范hardware/libhardware/include/hardware/hardware.h
其中详细的介绍了HAL的开发规范以及核心的数据结构
1. 定义Module的数据结构
2. 定义Device的数据结构
3. 实现open方法
4. 实现device的具体操作接口
参考
http://blog.csdn.net/column/details/fang1021.html
Android经典蓝牙开发简介
http://www.jianshu.com/p/fc46c154eb77
Android Bluetooth(蓝牙)实例
http://www.yiibai.com/android/android_bluetooth.html
AndroidBluetooth Architecture: Overview