Android蓝牙
文章平均质量分 77
风语
这个作者很懒,什么都没留下…
展开
-
Android蓝牙源码分析——Gatt连接(一)
本文将重点描述Android蓝牙GATT连接的大致流程,不会过多地纠缠代码细节,只为了从架构上梳理清楚,为接下来深入研究底层机制奠定一个宏观认识。 首先建立GATT连接前,我们通常要扫描蓝牙设备,获得设备的BluetoothDevice对象,然后调用connectGatt去建立GATT连接并等待连接状态回调,接下来我们就开始分析这一过程,首先看看connectGatt的实现:public Bl原创 2016-08-21 19:32:33 · 15003 阅读 · 5 评论 -
Android蓝牙源码分析——StateMachine状态机
StateMachine有自己单独的工作线程,protected StateMachine(String name) { mSmThread = new HandlerThread(name); mSmThread.start(); Looper looper = mSmThread.getLooper(); initStateMachine(name, looper)原创 2016-08-18 10:19:46 · 4032 阅读 · 0 评论 -
Android蓝牙源码分析——关于GKI
首先以gki模块的初始化为入口,在gki_ulinux.c中,如下: void GKI_init(void){ pthread_mutexattr_t attr; tGKI_OS *p_os; memset (&gki_cb, 0, sizeof (gki_cb)); gki_buffer_init(); gki_timers_init原创 2016-08-19 09:13:23 · 5954 阅读 · 0 评论 -
Android蓝牙源码分析——Gatt写设备
BluetoothGatt中的writeCharacteristic的实现在GattService中,如下:void writeCharacteristic(int clientIf, String address, int handle, int writeType, int authReq, byte[] value) { gattClientWriteCharacteristicNat原创 2016-09-03 18:36:43 · 5362 阅读 · 0 评论 -
Android蓝牙之Gatt Hook
许多人可能对Hook技术有些陌生,其实从字面意思上理解这就类似一个钩子,挂在了系统中的某些地方,然后当执行流程经过该处时会被勾住,可以选择放行或截获,或做点手脚偷偷改改参数,或记录日志,或检查权限,或post到别的上下文去执行,应用场景还挺多。本文会重点讨论蓝牙相关的Hook,要全局监测所有BLE蓝牙设备的操作,对于不那么活跃的设备我们会断开连接并释放资源,毕竟蓝牙通信信道是有限的。那么如何全局监测原创 2016-08-27 16:32:04 · 3514 阅读 · 1 评论 -
Android蓝牙源码分析——Gatt的Connection ID
我们注意到GattService中的所有GATT操作都会带两个参数,一个是clientIf,另一个是address,拿到这两个参数后,都会调用Integer connId = mClientMap.connIdByAddress(clientIf, address);获取对应的connId,然后之后的操作都是以这个connId为Key。我们来看看这个connId的生成过程,在ContextMap中,原创 2016-09-04 17:21:48 · 3080 阅读 · 0 评论 -
Android蓝牙源码分析——GKI定时器
GKI定时器初始化在gki_ulinux.c中的GKI_init中,如下:void GKI_init(void){ ...... struct sigevent sigevent; memset(&sigevent, 0, sizeof(sigevent)); sigevent.sigev_notify = SIGEV_THREAD; sigevent.sig原创 2016-09-08 13:02:33 · 2589 阅读 · 1 评论 -
智能家居Android技术系列之——蓝牙那些事
一、蓝牙能做些什么近距离通信:收发数据,指令控制蓝牙设备通常是穿戴式,便携式,室内或车内等,正是因为蓝牙适用于近距离通信的特点。如果要做远距离通信,则可借助于Wifi,用手机或网关做中转。广播消息、通知蓝牙可以以一定的周期发送广播,手机端接收到广播后,解析广播包,可做设备识别、配对,事件通知以及指令控制等。低精度定位根据设备的信号强度,可以估算出大概方位和距离。二、Android平台的蓝牙A原创 2015-10-19 20:26:14 · 9806 阅读 · 1 评论 -
Android蓝牙源码分析——BTA层消息分发
这里BTA是Bluetooth Application的缩写,从上层下来的请求都要经过这个BTA层,通过发送消息的方式将请求丢到BTA层中处理。这个发送消息的函数定义在bta_sys_main.c中,如下:void bta_sys_sendmsg(void *p_msg){ GKI_send_msg(bta_sys_cb.task_id, p_bta_sys_cfg->mbox, p_ms原创 2016-09-03 18:15:46 · 5932 阅读 · 0 评论 -
智能家庭蓝牙框架优化的思考
蓝牙可以分为两大块,扫描和连接。其实没有别的,直接调用系统接口就可以了,然而为什么要形成一套框架,主要原因还是为了适应业务的变化。比如蓝牙扫描,如果要同时扫经典蓝牙和ble,该采用什么策略,如果有一天策略调整了怎么办,能否快速适应。还有ble广播的扫描策略是独立于设备扫描的,极端点需要高频扫描(扫30次,每次1s),而设备扫描可能是扫30s,一次就够了。如果扫描正在进行中,又来了新的扫描任务该怎么办原创 2015-09-23 12:00:48 · 2042 阅读 · 2 评论 -
Android BLE Gatt Error
经常碰到各种各样的gatt error,可通过以下两种方式查询具体含义:https://android.googlesource.com/platform/external/bluetooth/bluedroid/+/android-4.4.4_r2.0.1/stack/include/gatt_api.h或者查看android内核代码中的gatt_api.h原创 2016-01-14 16:44:46 · 3523 阅读 · 0 评论 -
将模块service化的好处
蓝牙的所有操作最好都封装成一个service,好处是相对独立,作为一个service组件,可以指定所运行的进程,所有实现彻底和外部解耦,不管是同进程还是跨进程调用对外接口是不变的。因为APP中可能拆分成多个进程,这些进程对service的访问是统一的,不管和service是不是在同一个进程。另外放在一个service里可以保持数据只有一个操作对象,调用方来自多个进程,但是最后操作数据的只有servi原创 2016-03-09 08:04:38 · 1842 阅读 · 0 评论 -
Android BLE设备蓝牙通信框架BluetoothKit
这个框架源于目前一个智能家居APP项目,是蓝牙部分基础模块,用于蓝牙设备扫描、连接、通知等。由于目前接入的蓝牙设备大多为低功耗蓝牙设备,所以本框架暂不支持经典蓝牙的连接。项目地址: https://github.com/dingjikerbo/BluetoothKit先介绍本框架的特点: 一、支持经典蓝牙和BLE蓝牙混合扫描,支持自定义扫描策略 作为智能家居平台,接入的设备包括经典蓝牙和BLE,原创 2016-08-29 11:49:17 · 26954 阅读 · 64 评论