
android蓝牙分析
文章平均质量分 85
gordon1986
微软总部,资深软件工程师,有多年前后端,分布式系统开发经验。
展开
-
Android4.0中Bluetooth的代码结构
也许在看了上一篇的《Android中bluetooth的架构》一文后,你已经有了强烈的想去动手看看源代码的冲动了吧?没错,看源码绝对是一个很好的理解方法,但是涉及到Bluetooth的源代码究竟在哪里呢?也许,有人很快就能够找到一些内容,但也许有同学还比较茫然,不知道究竟该去哪里阅读,没关系,这篇文章就由晓东来给您详细说一下在Android中Bluetooth的代码有哪些。原创 2013-09-05 14:01:25 · 6535 阅读 · 2 评论 -
[Android源码分析]bluez internal event的处理
在上面2.1中是hci dev的注册和up,2.3中有bluez的初始化,这两者是有一个交集的,那就是说bluez初始化后会监听hci dev的一些event,主要有HCI_DEV_REG和HCI_DEV_UP两个比较重要,那本集就是主要分析这两个event带来的影响。 从上面的分析中,我们已经知道,这两个event的处理函数是io_stack_event:stat原创 2013-11-19 09:21:23 · 3196 阅读 · 0 评论 -
[Android源码分析]bluez中adapter初始化分析
作为一个程序员,咋废话就不多说了,直接看代码吧,哈哈~~ 2)adapter的初始化gboolean adapter_init(struct btd_adapter *adapter){ int err; /* adapter_ops makes sure that newly registered adapters always * start off as p原创 2013-11-20 09:42:37 · 3849 阅读 · 0 评论 -
[Android源码分析]蓝牙打开分析--苦尽甘来之再次回到jni之上
第三章,苦尽甘来之再次回到jni之上 经过了上面两章的分析,我们基本已经对一次的“下乡活动”了解清楚了,下面我们就要详细分析再次回到jni之上的一些操作了。再这之前,我们先来看看这次下乡活动从乡下都带来了什么? 其实很少蛮清晰的,就是带回来了几个property change的event,他们分别是UUIDs,pairable=false,power原创 2013-11-22 09:43:44 · 5577 阅读 · 8 评论 -
[Android 源码解析]bluez中几个重要plugin的初始化--audio,input,network,health
本来只想分析一下hciops的初始化就不再管了,后来发现别的plugin的初始化在后面还是会有涉及,心中想,既然已经分析了这么多,咋就索性都分析了算了,反正也不差这一点代码,其它的plugin还有audio,input,network,health。我们只看两个函数init或者setup。所以看起来应该会比较简单一点。 2.3.7.1 audio的init分析 audio 这个插件的分原创 2013-11-10 10:56:38 · 3440 阅读 · 2 评论 -
[Android源码解析]Property之十月怀胎到茁壮成长所涉及的方方面面
其实在网上讲Property的文章还是蛮多的,不过源码级分析的倒是不多,晓东正好做好了一个项目,其中涉及到了Property的一些内容,折腾了一段时间,心想不如来读读源码,看看究竟是怎么回事。1、property内存区域的申请 在网上通常都是这样开始讲的“属性服务运行于init进程中。init进程首先创建一个共享内存区域,并保存一个指向该区域的描述符fd。”[1]这一段从代原创 2013-11-29 09:19:43 · 4777 阅读 · 3 评论 -
[Android源码分析]从spec角度来详细分析inquiry command带来的影响
上文我们详细介绍了Android是如何通过ui操作到最终发出inquiry command来实现蓝牙的扫描功能的。本文晓东将会和大家一起来看看inquiry command的格式,以及发出这个command后会产生哪些影响。4、inquiry cmd的格式分析。 在蓝牙core spec中明确定义了inquirycmd的格式已经返回的event。我们来具体看看:原创 2013-12-09 09:21:47 · 4268 阅读 · 1 评论 -
[Android源码解析]蓝牙扫描结果反馈的分析
在前面两篇文章中,晓东和大家一起分析了android是如何向蓝牙发送扫描命令的,这篇文章我们将继续来看,蓝牙在收到扫描命令之后是如何向android上层反馈搜索到的设备以及上层对这些搜索到的设备是如何进行进一步处理的。7、inquiry result event的分析 Inquiry result的意思大概就是在收到inquiryresponse的时候会从contro原创 2013-12-11 09:43:11 · 7022 阅读 · 0 评论 -
[Android源码分析]蓝牙搜索过程分析
在完成打开蓝牙的分析之后,我们就正式进入到蓝牙使用的阶段了。毫无疑问,我们第一个对蓝牙的操作当然就是扫描设备了。那就是这样一个点击“扫描设备”究竟干了些什么,晓东和大家来仔细分析一下。 1、扫描设备按键的处理 代码的实现看起来很清晰, @Override public boolean onOptions原创 2013-12-06 09:37:30 · 3234 阅读 · 3 评论 -
[Android源码分析]inquiry result引起的上层变化分析
在上一篇文章中,我们详细分析了android是如何解析蓝牙反馈上来的搜索到的设备信息,本文将会继续分析这些信息到了上层之后是如何处理。8、inquiry result引起的上层变化 我们知道inquiry result引起的上层变化是通过向上层回报device found的signal来实现的。在jni层收到这个signal之后,会调用java层的onDev原创 2013-12-13 09:22:30 · 2477 阅读 · 0 评论 -
[Android源码分析]蓝牙搜索过程中你所不知道的小细节
在上文中,我们说到蓝牙搜索并没有在收到inquiry complete的命令后就立即结束,而是会继续发送remote name request的command去得到对方的名字,本文就来和大家一起详细分析一下这些操作的流程。10、remote name request command的发送 Remote name request从名字上我们就可以很清晰地看到,它的主原创 2013-12-16 09:43:09 · 3733 阅读 · 5 评论 -
[Android源码分析]蓝牙配对之jni之上的点点滴滴
在之前晓东已经和大家分析完成了蓝牙打开和蓝牙搜索的过程了,在搜索到设备的下一步我们要做的就是蓝牙的配对了。本文晓东将和大家一起来看看蓝牙配对究竟涉及到了哪些内容。 1、UI上的点击设备开始 在android中,对设备的点击都是在onclicked函数中实现的,所以我们就从这个函数开始分析了://对对应设备点击之后的操作原创 2013-12-18 09:50:14 · 4063 阅读 · 2 评论 -
[Android源码分析]jni层之下的配对分析
4、createPairedDeviceNative 按照惯例,我们看一下jni层,这次也没有什么特别的,唯一需要注意的就是一个android的iocapability的设置。static jboolean createPairedDeviceNative(JNIEnv *env, jobject object,原创 2013-12-23 09:35:52 · 2794 阅读 · 3 评论 -
[Android源码分析]L2CAP的创建过程分析
L2CAP层的实现在整个蓝牙的使用过程中尤为关键和复杂的,它涉及的方方面面比较多,晓东可能会要花几篇文章才能讲个大概,这篇文章先介绍L2CAP的初始化,这还是没有和controller交互的部分,要先建立整个L2CAP,还需要实现很多,后面的文章会慢慢道来。5.5, L2CAPsocket的创建 上层调用的函数就是这个:sock = socket(PF_原创 2013-12-25 09:32:15 · 3850 阅读 · 2 评论 -
[Android源码分析]L2CAP的bind分析以及psm和cid的介绍和实现
继续上文的socke的创建之后,我们自然而然就会想到下面的工作了,没错就是bind。5.6 l2cap的bind分析 按照国际惯例,在建了socket之后,必然会有bind,哈哈~~if (l2cap_bind(sock, &opts->src, server ? opts->psm : 0,原创 2013-12-27 09:25:45 · 6161 阅读 · 6 评论 -
[Android源码解析]Eventloop在jni层的分析
3 eventloop在jni层的详细分析 Eventloop在整个bluetooth的jni层和bluez之间的交互,以及jni和framework层之间的交互过程中有着举足轻重的作用。所以,本文仍然需要花费一定的笔墨来分析它,当然由于它更像是一个桥梁,我们的分析有可能就不是那么的深入了,会从比较宏观地角度来看待这个东西的作用。 当然,一切的一切还是要原创 2013-11-21 09:05:05 · 3760 阅读 · 5 评论 -
蓝牙基础知识进阶——Link Manager通用规则介绍
Link Manager Protocol(简称LMP)是用来建立和控制link的。它在整个蓝牙的架构中所处的位置如图0-1中红色矩形所示。图0-1 Link Manager在蓝牙架构中所处的位置 一、通用的规则Q1:LMP的msg是如何进行传输的一般而言,我们认为LMP的msg是通过ACL-C来进原创 2014-02-10 09:28:40 · 4526 阅读 · 2 评论 -
[Android源码分析]蓝牙文件传输过程解析之UI实现
蓝牙文件的传输是蓝牙中的一个很重要的应用,本文就来分析一下这个流程中涉及的一些UI操作。1、 蓝牙图标的出现我们在发送文件的时候第一步就是点击分享按钮后跳出一个如图1所示的对话框。这里就可以选择我们通过什么进行分享。原创 2014-02-20 09:10:55 · 7790 阅读 · 3 评论 -
[android源码分析]sdp Server的启动分析
SDP server是蓝牙启动过程中的一个非常重要部分。本文简单介绍一下这个函数的实现。int start_sdp_server(uint16_t mtu, const char *did, uint32_t flags){ //这里传入的flags是SDP_SERVER_COMPAT//所以compat值是有效的,master应该是0 int compat = flags & SDP原创 2013-10-28 09:23:27 · 3075 阅读 · 2 评论 -
[Android源码分析]蓝牙打开流程分析——jni层之上的方方面面
在前面的UI分析的文章中我们已经发现,其实不管是设置中的开关和fragment之后的开关最终都是关联到BluetoothEnabler中去的,所以,我们直接去看这个里面对于开关的处理,开关的处理当然就是onCheckedChanged这个函数了,哈哈~~直接分析。。1、蓝牙打开的按键处理public void onCheckedChanged(CompoundButton buttonVi原创 2013-10-15 09:30:10 · 5320 阅读 · 8 评论 -
眼花缭乱的UI,蓝牙位于何方
我们在前面已经分析了Android启动中涉及蓝牙的各个方面,今天我们着重来看看,在蓝牙打开之前,我们能看到的蓝牙UI有哪些,这些UI又是如何实现的。1,settings中UI的分析 首先,最常见的也是我们通常情况下最新看到的,它就是Settings中蓝牙的显示代码,具体的图片如下: 图1,默认settings中的界面这个界面的实现是在这个文件中:/p原创 2013-10-11 10:28:53 · 4550 阅读 · 2 评论 -
Kernel中rfcomm层的初始化
篇文章《kernel中bluetooth的初始化》一文中晓东和大家分享了HCI层,L2CAP层以及SCO层的初始化流程,今天晓东继续和大家一起来看rfcomm层的初始化流程。 在正式开始之前,我们先来看一下rfcomm层是什么,百度百科是这样介绍rfcomm的:“一个基于欧洲电信标准协会ETSI07.10规程的串行线性仿真协议。此协议提供RS232控制和状态信号,如基带上的原创 2013-09-10 15:46:20 · 3229 阅读 · 1 评论 -
Android4.0中蓝牙适配器state machine(状态机)的分析
今天晓东和大家来一起看一下Android4.0中蓝牙适配器(Bluetooth Adapter)的状态机变化的过程。首先,我们需要了解一下,蓝牙适配器究竟有哪些状态,从代码可以清晰地看到(frameworks/base/core/java/android/server/bluetoothadapterstatemachine.java): BluetoothAdapterStateMac原创 2013-09-22 17:40:53 · 4688 阅读 · 1 评论 -
Kernel中uart接口的bluetooth driver初始化分析
在前面几篇文章中,我们把kernel中bluetooth stack相关的初始化分析完成,今天晓东带大家来一起分析uart接口的bluetooth driver的初始化。首先,我们来到kernel/drivers/bluetooth目录,看hci_ldisc.c文件。又见到我们熟悉的module_init:module_init(hci_uart_init);好吧,动手来看吧:stat原创 2013-09-13 16:47:56 · 3902 阅读 · 0 评论 -
Kernel中bluetooth相关的config选项
有了前几篇对bluetooth的初步了解,今天晓东就和大家正式开始bluetooth的代码阅读了。在开写这篇文章之前,晓东也很纠结,究竟该从哪里开始着手写相关的内容。最初的打算是准备从蓝牙的开关开始着手的,这是一条大家很好理解也很容易上手的路线。但后来好好想想,还是放弃了这样的想法,因为,我们的这次的系列文章准备稍微讲得深入一点,协议层是肯定要涉及的,而不是简单的浮在JNI之上去分析。所以,今天我原创 2013-09-06 13:59:28 · 5083 阅读 · 0 评论 -
Kernel中Hid和Bnep的初始化
有了前面的L2CAP,RFCOMM的初始化分析,再来分析Hid和Bnep的代码就轻松很多了。基本来说,这两个protol没有太多的新意,直接看代码就可以看出来了。static int __init hidp_init(void){ int ret; BT_INFO("HIDP (Human Interface Emulation) ver %s", VERSION);//注册了原创 2013-09-12 13:31:17 · 2793 阅读 · 0 评论 -
kernel中bluetooth的初始化
我们大家都知道,Android其实是基于linux之上进行运行的。在Android系统的运行之初,首先是kernel层的一系列的初始化。今天晓东就先和大家来简单分析一下在开机之后,kernel中和bluetooth的初始化相关的内容有哪些。 我们仍然还是才kernel/net/bluetooth下面的代码开始查看,搜索一下initcall相关的内容也就只有在af_bluet原创 2013-09-09 15:04:07 · 5752 阅读 · 0 评论 -
Android中bluetooth的架构
既然我们想要系统地进行分析一下Android的bluetooth,那么就有必要首先来从总体架构上看一下bluetooth在Android中是处于哪些层次,做到手中有枪,心里不慌。Bluetooth从总体来看,基本的架构图如下: 这张图是我拷贝的网上的一份介绍bluetooth的ppt上,他应该也是出于某一份大牛之手,可惜的是我并没有能够找到具体的出处,若有人看到可以告诉我一下。原创 2013-09-04 10:50:03 · 5130 阅读 · 1 评论 -
晓东的android bluetooth记录的开始
最近发现网上关于Android的资料很多,然而关于bluetooth的资料却很少。一方面,bluetooth算不上大热的模块,真正去深入研究的人不会很多。另一方面,也许是因为在Android模拟器上无法实现bluetooth的功能,很多大牛们不屑去研究这一块的代码。从个人的感觉来看,bluetooth这个模块老实说有点鸡肋,用的不多,但好像现在大多数的Android手机中都会存在,在偶现的兴致所致原创 2013-09-04 09:47:54 · 3957 阅读 · 12 评论 -
[android源码分析]bluez启动过程中的各种plugin的初始化(一)--__bluetooth_builtin数组所耍的花样
在bluez启动过程中,各种插件的初始化尤为重要,没有这些插件,很多功能将无法实现。2.3.5 plugin的初始化插件的初始化,是什么的干活,其实还是很重要的,我们来看看吧。gboolean plugin_init(GKeyFile *config, const char *enable, const char *disable){ GSList *list; GDir *di原创 2013-10-31 11:23:17 · 3450 阅读 · 2 评论 -
[Android源码分析]从蓝牙界面看设置中fragment的实现
本文和上一篇博文的关联性较大,基本属于后续分析篇。上一篇博文地址:http://blog.youkuaiyun.com/u011960402/article/details/126121732. Settings中蓝牙的fragment 其实在开机情况下,我们还会看到另外一个界面,就是点击一下蓝牙的那个header,会显示如图2所示的界面。这个界面是如何实现的呢,我们来着重分析原创 2013-10-12 09:10:35 · 5376 阅读 · 3 评论 -
[android源码解析]bluetoothd默认初始化中main.conf的解析
上文我们从总体上把握了bluetoothd启动的流程,下面我们就具体的细节来详细分析一下,首先要看到的就是init_defaults,在它里面最重要也是最有意义的就是main.conf的解析了。我们通常需要修改某个配置就去修改main.conf中的内容,那么这些内容又是如何真正被配置呢?本文就来和你一一说来。2.2.1 默认的初始化简介这个函数会初始化一些默认的配置,在main.conf中原创 2013-10-24 09:21:14 · 5331 阅读 · 3 评论 -
[android源码分析]enable_native中的hci dev注册和up
2、enableNative的分析 enable Native是真正的蓝牙使能的函数,蓝牙打开的一系列操作都是通过他来真正实现的。可以认为,这个函数蓝牙使能的主干,其余几个方面都可以认为是旁枝末节而已,因此,无论如何,我们必须了解到这个函数真正的精髓所在。 先来看jni层究竟是如何实现这个函数的:static jint enableNative(JN原创 2013-10-21 09:15:04 · 3531 阅读 · 0 评论 -
[Android源码分析]蓝牙打开流程分析——jni层之下的偷偷摸摸(Service Record的创建)
为什么取名为偷偷摸摸,因为从这里往下在互联网上就基本找不到任何资料了,大家都是凭借函数的名字去猜测一下做了一些什么,然后继续回到jni之上去分析了。然而仅了解那些明面上的东西对我们分析蓝牙来说显然是不够的,我们必须要一探究竟,看看jni之下都偷偷摸摸做了些什么。原创 2013-10-17 09:04:19 · 4117 阅读 · 0 评论 -
[Android源码分析]hciops的初始化
凡是真正分析过bluez代码或者debug过相关bug的童鞋,一定对hciops非常熟悉吧,是的,它是各个event的处理中心,承接着controller到上层host的各个方面的交互,本文就来详细分析一下它的初始化过程。2.3.5.2 add_plugin分析add_plugin只是单纯地把plugin加入到系统里面,或者就是plugin的初始化,来看看吧static gboolea原创 2013-11-04 09:18:05 · 2070 阅读 · 0 评论 -
[android源码分析]bluetoothd service的启动的总体流程分析
本篇文章将会从总体流程上解释一下每一个函数的意义,具体的每一个函数的解释将是一个很长的过程,后面的文章中我将会针对每一个有意义的函数来具体分析。在具体分析bluetoothdservice的启动之前,我们先来看一下bluetoothd service究竟是什么,他同样定义在init.rc中:servicebluetoothd /system/bin/bluetoothd -n原创 2013-10-23 09:20:30 · 5881 阅读 · 3 评论 -
[android源码分析]hci_init_req中的各种command和event的交互
在蓝牙中,host和controller之间的command和event的交互是底层各种工作开展的基础,在初始化的过程中必然也存在着类似的操作。本章会详细分析在hci_init_req过程中所涉及到的所有command和event的交互。至于command和event的格式意义,请参见bluetooth的core spec,这里不做详细介绍,若想详细了解,spec的研读是必不可少的。stati原创 2013-10-22 09:21:25 · 4080 阅读 · 5 评论 -
蓝牙文件传输之obex层之上的分析【Android源码解析】
在上节中我们仔细分析了蓝牙文件传输过程中涉及到的UI界面,最终定格在蓝牙设备扫描的界面,我们只要选择自己想要传输的蓝牙设备就可以进行蓝牙文件的传输了。那就是这样一个简单的设备选择的点击会引发哪些连锁的操作呢?本节就来详细进行分析。1.1.设备点击的action和响应 我们先来回顾一下,最后蓝牙设备的扫描界面是在DevicePickerF原创 2014-03-06 09:07:53 · 6124 阅读 · 11 评论