Android蓝牙协议栈fluoride(七) - 设备管理(bt stack)

前面几篇文章介绍了设备管理对上层的接口和bt profile层的实现,其中涉及到蓝牙开关(初始化)、设备扫描、服务发现、安全管理、功耗管理等等模块,本文将挑选几个模块介绍bt stack层的实现,其他模块(如安全管理)将在后续专门讲述。

使能蓝牙

协议栈中使能蓝牙的入口是BTM_DeviceReset,即打开蓝牙时会复位controller,复位之后会获取controller中的信息,然后将状态上报到上层。

其中,controller模块和HCI的内容在HCI相关的文章中介绍。

从上至下完整梳理使能蓝牙的流程如下:


设备扫描

在上层介绍设备管理时包含了设备扫描和服务发现,本文介绍设备扫描,服务发现使用的SDP,在后续介绍。
在stack层中对上提供设备扫描相关的API如下:

// inquiry/inquiry scan/page/page scan设置
tBTM_STATUS BTM_SetInquiryMode(uint8_t mode);
tBTM_STATUS BTM_SetInquiryScanType(uint16_t scan_type);
tBTM_STATUS BTM_SetPageScanType(uint16_t scan_type);
extern void BTM_WritePageTimeout(uint16_t timeout);

// 设置/获取本机可被发现及参数(inquiry scan)
tBTM_STATUS BTM_SetDiscoverability(uint16_t inq_mode, uint16_t window, uint16_t interval);
uint16_t BTM_ReadDiscoverability(uint16_t* p_window, uint16_t* p_interval);
// 设置/获取本机可被连接及参数(page scan)
tBTM_STATUS BTM_SetConnectability(uint16_t page_mode, uint16_t window, uint16_t interval);
uint16_t BTM_ReadConnectability(uint16_t* p_window, uint16_t* p_interval);

// 扫描周围设备相关(inquiry)
tBTM_STATUS BTM_StartInquiry(tBTM_INQ_PARMS* p_inqparms, tBTM_INQ_RESULTS_CB* p_results_cb, tBTM_CMPL_CB* p_cmpl_cb);
uint16_t BTM_IsInquiryActive(void);
tBTM_STATUS BTM_CancelInquiry(void);
tBTM_STATUS BTM_CancelPeriodicInquiry(void);

// EIR相关
tBTM_STATUS BTM_WriteEIR(BT_HDR* p_buff);
bool BTM_HasEirService(const uint32_t* p_eir_uuid, uint16_t uuid16);
void BTM_AddEirService(uint32_t* p_eir_uuid, uint16_t uuid16);
void BTM_RemoveEirService(uint32_t* p_eir_uuid, uint16_t uuid16);
uint8_t BTM_GetEirSupportedServices(uint32_t* p_eir_uuid, uint8_t** p, uint8_t max_num_uuid16, uint8_t* p_num_uuid16);
uint8_t BTM_GetEirUuidList(uint8_t* p_eir, size_t eir_len, uint8_t uuid_size, uint8_t* p_num_uuid, uint8_t* p_uuid_list, uint8_t max_num_uuid);

inquiry和inquiry scan

蓝牙通过inquiry发现周围的设备,进入可[被]发现的设备会一直inquiry scan,它们在特殊的物理信道发起请求和回复响应。
以手机和蓝牙耳机为例:手机扫描周围设备时会一直特定信道发送inquiry,耳机进入配对模式时会一直在特定信道扫描(监听)inquiry,当扫描到inquiry之后会回复inquiry response,手机收到response后就知道扫描到了这台设备。inquiry类型和方式如下:

// 类型
#define BTM_INQ_RESULT_STANDARD 0  // 标准inquiry格式返回结果
#define BTM_INQ_RESULT_WITH_RSSI 1 // 带RSSI的格式
#define BTM_INQ_RESULT_EXTENDED 2 // 带RSSI的结果或扩展查询格式

// 方式
#define BTM_GENERAL_INQUIRY 0x01  //通用inquiry,即发现所有可发现的设备
#define BTM_LIMITED_INQUIRY 0x02  // 有限inquiry,即发现一定范围内设置了有限inquiry代码的设备

通用inquiry的交互如下:


有限inquiry的交互如下:


EIR

EIR是Extended Inquiry Response的缩写,EIR是基本inquiry response外还可以携带更多的信息,即可以在不需要更多通信的情况下获得更多信息,如设备名称、支持的服务等。EIR数据格式如下:


page和page scan

当获取到另一台蓝牙设备的蓝牙地址后可以发起连接,此时发起连接的设备将在特殊通道发生连接请求包(page),另一台设备处于可连接状态即可监听(page scan)到连接请求,进行后续的通信。

inquiry scan和page scan的类型如下:

#define BTM_SCAN_TYPE_STANDARD 0  //标准扫描,一直扫描窗口内一直处于扫描状态
#define BTM_SCAN_TYPE_INTERLACED 1 //隔行扫描,在扫描窗口内进行两次背靠背扫描,要求扫描间隔必须大于等于扫描窗口的两倍

在标准扫描的情况下,如果相关器在页面扫描期间超过触发阈值,设备应进入第 8.3.3.1 节所述的外设响应子状态。扫描设备也可使用通用隔行扫描。在这种情况下,如果相关器在第一次扫描时未超过触发阈值,则应使用 [CLKN 16-12 + interlace_offset] mod 32 所确定的序列中的相位进行第二次扫描。如果在第二次扫描中相关器超过触发阈值,则设备应进入外设响应子状态,在 Xprp 的计算中使用 [CLKN 16-12 + interlace_offset] mod 32 作为冻结 CLKN*(详见第 2.6.4.3 节)。如果相关器在正常模式下的一次扫描或隔行扫描模式下的第二次扫描中未超过触发阈值,则应返回待机或连接状态。
隔行扫描偏移值范围为 0 至 31。除非不可扫描的插槽模式意味着应使用不同的值,否则应使用 16 值。

状态转化如下:


从上至下完整梳理使能蓝牙的流程如下:
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,290评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,107评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,872评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,415评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,453评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,784评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,927评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,691评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,137评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,472评论 2 326
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,622评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,289评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,887评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,741评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,316评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,490评论 2 348

推荐阅读更多精彩内容