`

android系统学习笔记九

阅读更多

蓝牙部分

蓝牙协议栈1.11.22.02.13.0

异步数据和语音传输采用的协议:

逻辑链路控制和适配协议(L2CAP)、服务发现协议(SDP)、串口模拟协议(RFCOMM)

主要控制接口由主机控制接口层体现,他是蓝牙协议里软硬件之间的接口

HCI之上的是蓝牙的上层应用框架,每个应用模式为一个profile,如无线立体声耳机A2DP

(AdvancedAudioDistributionProfile)

 

蓝牙的基本架构

自上而下包括以下内容:

Linux内核的蓝牙驱动程序

Linux内核的蓝牙协议层

Bluez蓝牙在用户空间的库

Bluez适配层

Android.bluetooth包中的各个类(蓝牙在框架层的内容)

蓝牙相关的应用程序

 

蓝牙部分的结构图:

 

 

蓝牙的用户空间库bluez

空间库bluezlinux平台上的一套完整的蓝牙协议栈,通过D-BUSIPC机制来提供应用层接口

它的底层协议实现在kernel代码中

D-BUS是一套应用广泛的进程间通信(IPC)机制,是相对比较底层的(类似socket)它更加复杂

 

 

 

 

 

代码位于kernl目录下的net/bluetooth

底层协议方面;

HCI:主机控制协议,完成与蓝牙硬件的交互

SDP:服务发现协议,访问其他服务的基础协议

RFCOMM:类似于串口的通信协议为上层服务的实现提供传输接口

L2CAP:逻辑链路和控制协议,RFCOMM.SDP等协议的基础

SCO:同步数据交换协议

 

上图中左侧部分为HCI具体功能实现;

Adapter一个adapter对应一个蓝牙设备,管理设备相关信息

Manager管理主机上的蓝牙设备

Service服务

Security安全相关功能模块

Database管理组织服务列表

 

右侧是各种服务

Audio语音A2DP普通语音同步

Input输入服务

Transfer文件交换服务

Network网络服务

 

 

各种协议之间的关系

 

 

 

 

 

 

 

 

 

android系统中,bluez的源码在以下的目录中:\external\bluetooth\bluez

会生成若干个动态库和可执行程序

动态库

Libbluetooth:公共库被各部分应用使用,

Libhcid:主机接口的实现

Audio:音频服务

Input:输入服务

Liba2dp:蓝牙立体声服务

 

可执行程序

Hcid:直接封装libhcid主机接口的实现守护进程,提供对外的D-BUS接口

Hciconfighcitoolhciattach主机接口辅助工具

Dund提供dun服务

Pand提供pan服务

Sdptool提供sdp服务相关接口

Rfcommrfcomm配置工具

 

 

 

Bluez的适配层

代码路径为:\system\bluetoot

封装了蓝牙的开关功能和射频开关

 

蓝牙的JNI部分和java部分

JNI部分的代码路径为:\frameworks\base\core\jni

最终生成libandroid_runtime.so

 

Jvav部分代码路径

蓝牙的服务部分代码路径\frameworks\base\core\java\android\server

支持耳机(headset)免提(handsfree)立体声(a2dp)

核心组成android.bluetooth包中以IBluetoothDevice.aidl为接口的IBinder服务端BluetoothDeviceService

客户端 BluetoothDevice以及android.service包中的BluetothEventLoop

 

bluetoothdeviceService主要是用于蓝牙的开启和关闭,设备的发现和配对,服务的发现和邦定

开关功能是直接调用底层的bluezr接口来实现

Java部分和底层的关系

 

客户端bluetoothDevice.getRemoteServiceChannel调用服务端的bluetoothDeviceService.getRemoteServiceChannel然后调用JNIgetRemoteServiceChannelNative

 

Android_bluetooth_common.h的部分代码如下;

 

dbus_bool_tdbus_func_args_async(JNIEnv*env,

DBusConnection*conn,

inttimeout_ms,

void(*reply)(DBusMessage*,void*,void*),

void*user,

void*nat,

constchar*path,

constchar*ifc,

constchar*func,

intfirst_arg_type,

...);

最后调用;dbus_func_args_async_valist

staticdbus_bool_tdbus_func_args_async_valist(JNIEnv*env,

DBusConnection*conn,

inttimeout_ms,

void(*user_cb)(DBusMessage*,

void*,

void*),

void*user,

void*nat,

constchar*path,

constchar*ifc,

constchar*func,

intfirst_arg_type,

va_listargs){

DBusMessage*msg=NULL;

constchar*name;

dbus_async_call_t*pending;

dbus_bool_treply=FALSE;

 

/*Composethecommand*/

//组成命令(创建一个消息结构)

msg=dbus_message_new_method_call(BLUEZ_DBUS_BASE_IFC,path,ifc,func);

 

if(msg==NULL){

LOGE("CouldnotallocateD-Busmessageobject!");

gotodone;

}

 

/*appendarguments*/

//附加参数

if(!dbus_message_append_args_valist(msg,first_arg_type,args)){

LOGE("Couldnotappendargumenttomethodcall!");

gotodone;

}

 

/*Makethecall.*/

//通过D-BUS调用接口

pending=(dbus_async_call_t*)malloc(sizeof(dbus_async_call_t));

if(pending){

DBusPendingCall*call;

 

pending->env=env;//设置参数中的内容

pending->user_cb=user_cb;

pending->user=user;

pending->nat=nat;

//pending->method=msg;

//发送命令返回信息

reply=dbus_connection_send_with_reply(conn,msg,

&call,

timeout_ms);

if(reply==TRUE){

dbus_pending_call_set_notify(call,

dbus_func_args_async_callback,

pending,

NULL);

}

}

 

done:

if(msg)dbus_message_unref(msg);

returnreply;

}

//本机的首个蓝牙设备

#defineBLUEZ_ADAPTER_OBJECT_NAMEBLUEZ_DBUS_BASE_PATH"/hci0"

IfcDBUS_CLASS_NAME指向org.bluez.adapter直接访问HCI部分的adapter

 

android2.3之后有采用level11,支持了测试蓝牙链接状态的函数

 

//链接spp类的设备

BluetoothAdapteradapter=BluetoothAdapter.getDefaultAdapter();
BluetoothDevicebd=adapter.getRemoteDevice(addr);
Methodm=bd.getClass().getMethod("createRfcommSocket",newClass[]{int.class});
BluetoothSocketbs=(BluetoothSocket)m.invoke(bd,Integer.valueOf(1));

分享到:
评论

相关推荐

    Android 系统相关学习笔记.zip

    Android 系统相关学习笔记.zip

    android系统模块之Contacts的学习笔记

    android系统模块之Contacts的学习笔记

    android开发学习笔记

    本人做android也有两年了,主要做智能机系统级开发,期间也承包了一些项目,对于如何学好android,以及学好android后如何开启自己的致富之门也能起到抛砖引玉的作用,欢迎大家加入,积极发言讨论,积极解决他人的...

    Android学习笔记.doc Android学习笔记.doc

    Android platform是一个用于开发移动程序的软件包,它包括了操作系统、中间件及一些关键应用。开发者能使用android SDK为Android platform开发应用,这些应用使用JAVA语言书写,运行在虚拟机Dalvik(一个专为手机程序...

    Pro Android学习:Menu

    是Pro Android学习笔记Menu系统的例子代码

    android入门学习笔记-永远不变的helloworld、初识activity

    本资源是上课时的笔记,系统的讲述了android。想学习andorid的新手可以载下来供参考使用

    Android知识系统总结+最佳学习线路图+实例+全程开发笔记

    Android知识系统总结+最佳学习线路图+实例+全程开发笔记Android知识系统总结+最佳学习线路图+实例+全程开发笔记

    Android学习笔记.doc

    Android platform是一个用于开发移动程序的软件包,它包括了操作系统、中间件及一些关键应用。开发者能使用android SDK为Android platform开发应用,这些应用使用JAVA语言书写,运行在虚拟机Dalvik(一个专为手机程序...

    android 系统笔记.zip

    操作系统:LInux、IOS、树莓派、安卓开发、微机操作系统、网络操作系统、分布式操作系统等。此外,还有嵌入式操作系统、智能操作系统等。 网络与通信:数据传输、信号处理、网络协议、网络与通信硬件、网络安全网络...

    android 学习笔记

    使用系统自带意图对象完成: Intent intent=new Intent(); intent.setAction("android.intent.action.Call"); intent.setData(Uri.parse("tel:"+i)); startActivity(Intent); 权限: <uses-permission ...

    黑马程序员之android学习笔记--用户界面 View(一).docx

    黑马程序员之android学习笔记--用户界面 View(一).docx

    Android Map开发基础知识学习笔记

    本教程适用于Android Map学习的初学者,这是一本很平易近人的Android入门书籍,也是开发者及非开发者两相宜的实务书籍,它能陪伴你顺利入门,并驰骋于无限宽广的Android系统和应用领域

    Android知识系统总结

    里面包含7个常见android应用程序源代码,android学习笔记,开发入门实践,入门书籍等很有用的资料。

    第一行代码—Android第二版学习笔记

    Android 第一行代码学习笔记第一章 概述1.1安卓系统架构1.2Android四大组件1.3项目结构1.4app目录结构1.5 项目运行原理1.6 res目录详解1.7日志工具的使用第二章 活动2.1 创建基本活动2.2 使用Intent在活动之间跳转...

    Android学习笔记之——Content Providers

    之前博文《 Android学习笔记之——Android Studio的安装(3.6版本)、Java的基本语法及Android的概述 》曾经介绍过android有四大组件。本博文学习一下Content Providers(内容提供器) 目录 Android运行时 ...

    2021-学习相关-Android 局域网简易云端笔记系统源码.zip

    2021-学习相关-Android 局域网简易云端笔记系统源码.zip

    AOSP Android系统定制裁剪笔记.zip

    操作系统:LInux、IOS、树莓派、安卓开发、微机操作系统、网络操作系统、分布式操作系统等。此外,还有嵌入式操作系统、智能操作系统等。 网络与通信:数据传输、信号处理、网络协议、网络与通信硬件、网络安全网络...

    android移植到特定平台学习笔记

    android移植到Cortex-A8平台,手把手开发步骤,从安装编译器,配置环境变量,编译uboot,kernel,android文件系统详细步骤和修改的文件。最后是将镜像烧入SD卡等详细步骤!好东西不容错过

    Android代码-Android_Learning_Notes

    这是我的安卓学习笔记。 开始时间:2016-9-11 计划:一个半月 文章目录: 基础知识 1、Android01--搭建Android开发环境 2、Android02--认识Activity 3、Android03--Context和Application 4、Android04--Android服务 ...

Global site tag (gtag.js) - Google Analytics