ZT eoe android4.2 Bluetooth记录01-结构和代码分布
android4.2 Bluetooth记录01-结构和代码分布
作者:cnhua5更新于 08月21日访问(697)评论(2)
在android4.2中,Google更换了android的蓝牙协议栈,从Bluez换成Bluedroid,我也是初涉这个方面,顺便记录一下。
http://source.android.com/devices/bluetooth.html
android development对于4.3蓝牙的介绍:
android提供BlueDroid作为默认的协议栈,BlueDroid分为两个部分:
1、Bluetooth Embedded System(BTE),它实现了BT的核心功能。
2、Bluetooth Application Layer (BTA),用于和android framework层交互。
BT 系统服务通过JNI与BT stack交互,并且通过Binder IPC通信与应用交互。这个系统服务同时也提供给RD获取不同的BT profiles;下面的图标展示BT stack的一个大体的结构:
一、application Framework
这个层的代码主要是利用android.bluetooth APIS 和 bluetooth hardware进行交互。 也就是通过Binder IPC机制调用bluetooth 进程;
代码位于framework/base/core/java/android.bluetooth/下。
比如A2DP的连接:framework/base/core/java/android.bluetooth/BluetoothA2dp.java中的connect(Bluetoothevice)方法。
1 |
public boolean connect(BluetoothDevice device) { |
通过Binder IPC 通信机制,调用到packages/apps/Bluetooth/src/com.android.bluetooth.a2dp/A2dpService.java下一个内部私有类
A2dpService是一个继承于ProfileService,而ProfileService是继承于Service的。
private static class BluetoothA2dpBinder extends IBluetoothA2dp.Stub{}的connect(BluetoothDevice)方法。
1 |
public boolean connect(BluetoothDevice device) { |
然后调用到A2dpService的connect(BluetoothDevice)方法。
1 |
public boolean connect(BluetoothDevice device) { |
这个过程就是Bluetooth Application Framework与Bluetooth Process的调用过程。
二、Bluetooth System service
Bluetooth System service位于packages/apps/Bluetooth下,它打包成一个android app包,并且在android framework 层实现BT service
和各种profile。BT app会通过JNI调用到HAL层。
A2dpService的connect方法会发送一个
StateMachine.sendMessage(A2dpStateMachine.CONNECT,
device)的message,这个message会被A2dpStateMachine对象的processMessage(Message)方法接
收到:
1 |
case CONNECT: |
最重要的一句:connectA2dpNative(getByteAddress(device);
即会通过JNI调用到Native;
private native boolean connectA2dpNative(byte[] address);
三、JNI
与android.bluetooth有关的JNI代码位于packages/apps/bluetooth/jni下,JNI 的代码会调用到HAL层,并且在确信一些BT操作被触发时,会从HAL
获取一些回调。比如当BT设备被发现时。
再回到A2dp连接的例子中来,BT System Service通过JNI会调用到com_android_bluetooth_a2dp.cpp中:
1 |
static jboolean connectA2dpNative(JNIEnv *env, jobject object, jbyteArray address) { |
重点代码是:status = sBluetoothA2dpInterface->connect((bt_bdaddr_t *)addr);
这个sBluetoothA2dpInterface结构体对象是在initNative(JNIEnv *env, jobject object)方法时得到的。
1 |
if ( (sBluetoothA2dpInterface = (btav_interface_t *) |
四、HAL
硬件抽象层定义android.bluetooth APIs和BT process调用的标准接口,并且你必须实现这些接口来让你的BT hardware功能运行正常。BT HAL的
的头文件位于hardware/libhardware/include/hardware/bluetooth.h和hardware/libhardware/include/hardware/bt_*.h 文件中。
JNI中sBluetoothA2dpInterface是一个btav_interface_t结构体,位于hardware/libhardware/include/hardware/bt_av.h中,定义为:
1 |
typedef struct { /** set to sizeof(btav_interface_t) */ |
五、BT stack
作为默认的BT stack,(4.2之前是bluez作为协议栈的)
代码位于external/bluetooth/bluedroid下,这个stack实现了通用的BT HAL并且也可以通过扩展和改变配置来自定义。
A2dp的连接会调用到external/bluetooth/bluedroid/btif/src/btif_av.c的connect方法。
1 |
static bt_status_t connect(bt_bdaddr_t *bd_addr) |
六、Vendor extension
为了追踪添加自定义拓展和一个HCI层,你可以创建一个libbt-vendor模块并且指定这些组件。
下一篇BT enable/disable
http://my.eoe.cn/cnhua5/archive/10667.html
最新文章
- spider RPC插件化体系
- 。【自学总结 2】------3ds Max 菜单
- Maven常用命令(转)
- HTML新特性之一----canvas
- Android Https相关完全解析 当OkHttp遇到Https
- [ZOJ1610]Count the Colors(线段树,区间染色,单点查询)
- Android之自定义画图文字动画
- 离线安装Cloudera Manager5.3.4与CDH5.3.4(二)
- oracle解析xml完成版第二次修改
- 【转】C++动态创建二维数组,二维数组指针
- 浏览器UA汇总
- 1002: [FJOI2007]轮状病毒
- redis 系列11 列表对象
- selenium span[contains]中使用变量
- 对于SQL注入的理解
- prometheus相关文章
- mysql创建新用户出现错误处理
- 给大家一些改善 Python 程序的 91 个建议
- Python加密保护解决方案
- Git应用--04遇到冲突解决办法git stash(转载)