网易首页 > 网易号 > 正文 申请入驻

聊一聊蓝牙名字和地址的来龙去脉

0
分享至

蓝牙名字和地址

蓝牙设备作为一种短距离无线连接的载体,由于其体积小、操作方便等优点,在耳机、车载和电脑键鼠等应用方面被越来越多的消费者所青睐,渐渐走入大众视野中。

作为蓝牙设备的使用者,我们的第一想法往往是这个蓝牙设备的名字是什么,这样才知道去连接哪个蓝牙设备,而一个蓝牙名字又对应着全球唯一的蓝牙地址,这其实才是蓝牙设备的关键。本篇文章我们就来聊聊蓝牙名字和地址的这些事。

  1. 1. 蓝牙名字:蓝牙设备的名称,代表这个蓝牙设备,类似于我们的姓名

  2. 2. 蓝牙地址:一组由48位(6字节)二进制表示的数据,是蓝牙设备的唯一标识。每一个蓝牙设备的地址都是不一致的(就好比世上没有两片相同的落叶),类似于我们的基因

所以市面上众多的蓝牙设备尽管名字是有可能相同的,但蓝牙地址基本上是不一致的。但也有另外,因为从上图可以知道LAP部分虽然有24位二进制来进行分配,但如果这家厂商的设备数量太多,超过了2的24次方(哈哈,概率极小),就会出现蓝牙地址重复的现象。

现在我们大概了解了蓝牙Name和Address的关系,那在安卓源码中我们一般是如何获取这两个值的呢?这就随我接着往下看。

获取这两个值需要分情况来讨论,因为蓝牙设备首次开机和重启开机的获取流程有差异,所以接下来分别作出分析。

1、首次开机(fastboot刷机完成后首次开机)

这种情况下,应用获取到蓝牙名字和地址一般是从蓝牙协议栈bluedroid获取来的,详情可以参照如下时序图来分析:

从上图可以明显得知,底层bluedroid上报的蓝牙名字和地址最终都会存储于全局变量Settings的xml文件中:/data/system/users/0/settings_secure.xml,索引名分别为bluetooth_name和bluetooth_address。

第三方应用通过蓝牙适配器BluetoothAdapter对外提供的接口getName()和getAddress()就可以获取到存储于BluetoothManagerService中的蓝牙名字和地址。

但是这里还有如下几个问题需要解答:

问题1:首次开机,上述时序图中BluetoothManagerService.handleOnBootPhase()的处理中为什么是打开蓝牙的操作而不是主动去获取蓝牙的Name和Address ?

解答:系统开机会根据关机前的蓝牙状态来决定开机后是否自动打开蓝牙。

但是重新刷机后的首次开机会根据配置文件的值来决定是否默认打开蓝牙。

配置文件路径:frameworks/base/packages/SettingsProvider/res/values/defaults.xml

该文件中的name="def_bluetooth_on"的值会在刷机后的首次开机创建安卓数据库时写入Setting中的settings_global.xml文件中,索引值为name=“bluetooth_on”。

执行写入数据的处理函数为:

frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java中的loadBooleanSetting(stmt,Settings.Global.BLUETOOTH_ON,R.bool.def_bluetooth_on)。

其他情况下的系统重启后,根据settings_global.xml文件中存储的关机前的蓝牙状态来做处理。

因此刷完系统首次开机后,程序会根据配置文件中的默认值来决定是否打开蓝牙,如果默认不打开蓝牙,则程序也会主动读取Name和Address,这个操作其实是bind蓝牙服务及初始化底层的蓝牙模块,等获取到这两个值后再执行unbind蓝牙服务的动作。

问题2:蓝牙名字的原始定义在哪?

解答:上面时序图中获取到的蓝牙名字也只是从蓝牙协议栈的内存里获取到的值,那这个值是从哪儿来的呢?

分析协议栈的代码,有这几个地方可以获取到Name

  1. 1. 步骤A:cfg2prop()->btif_config_get_str()查找/data/misc/bluedroid/bt_config.conf文件中[Adapter]是否包含Name,该文件是协议栈初始化时创建的,保存相关变量

  2. 2. 步骤B:如果步骤A没有获取到Name,则会从处理函数btif_dm_get_adapter_property()中通过btif_get_default_local_name()获取到宏定义的变量BTM_DEF_LOCAL_NAME的值作为蓝牙名字,该宏定义的路径为:device\generic\common\bluetooth\bdroid_buildcfg.h

所以获取蓝牙名字的流程图大概如下所示:

问题3:蓝牙地址从哪儿获取的?

解答:类似于蓝牙名字是从协议栈相关的配置文件中获取的,蓝牙地址则是从蓝牙芯片获取上来的。

btif_storage_get_adapter_property()函数中通过接口controller_get_interface()->get_address() 获取地址值。

而controller.c中的address赋值于:

HCI交互为:

第三方应用需要获取蓝牙地址的话,该应用除了“LOCAL_MAC_ADDRESS”的权限外,还需具备系统权限,否则获取到的地址为默认的错误值:"02:00:00:00:00:00"。

2、重启开机

从以上分析可以知道,系统重启前会将蓝牙状态、名字和地址等参数存储于Setting的xml文件中,所以系统重启后,会首先从这些xml文件中读取参数,进而BluetoothManagerService在初始化时就已经获取了这些参数值。

现在我们已经分析完成了两种场景下的蓝牙名字和地址的获取流程,至此安卓系统中的蓝牙Name和Adress就会一直存储于Settings的xml文件中。

使用蓝牙设备过程中,蓝牙地址一经固件写入基本上是不可更改的。但蓝牙名字却是可以修改的,第三方应用使用BluetoothAdapter对外提供的接口setName()将新名字写入蓝牙协议栈,存储于bt_config.conf中,这样保证后续主动读取名字时先读取出更改后的名字。同时协议栈也会将最新的Name上报给服务层,通过广播通知BluetoothManagerService更改Settings中的Name值。

好了,本篇的蓝牙名字和地址的分析就到这里,感兴趣的小伙伴欢迎私信留言一起讨论。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
体检报告中,若3个指标都正常,基本可以排除很多疾病

体检报告中,若3个指标都正常,基本可以排除很多疾病

芹姐说生活
2026-05-08 19:06:29
钱学森夫人蒋英的罕见照片,美的不可方物

钱学森夫人蒋英的罕见照片,美的不可方物

黎庶文史
2026-04-25 22:56:52
“计划有变,准备夺冠!”张雪机车从“昙花一现”到“实力使然”

“计划有变,准备夺冠!”张雪机车从“昙花一现”到“实力使然”

大象新闻
2026-05-18 20:51:07
吃花椒为什么会嘴麻?这竟是一场 50 赫兹的生物学骗局

吃花椒为什么会嘴麻?这竟是一场 50 赫兹的生物学骗局

中科院物理所
2026-05-18 12:36:32
马斯克曾突然变脸,扯下美国遮羞布:没中国,谁敢想造出电动车?

马斯克曾突然变脸,扯下美国遮羞布:没中国,谁敢想造出电动车?

纵拥千千晚星
2026-04-04 19:34:36
中方欢迎仪式还没开始,73岁普京抢先打破常规,美欧谣言不攻自破

中方欢迎仪式还没开始,73岁普京抢先打破常规,美欧谣言不攻自破

靓仔情感
2026-05-19 18:42:35
毒杨梅后续!记者遭死亡威胁,果农卖一斤亏一斤,1.2亿收成浪费

毒杨梅后续!记者遭死亡威胁,果农卖一斤亏一斤,1.2亿收成浪费

奇思妙想草叶君
2026-05-18 23:09:30
养到80斤的大德牧居然是个娘炮!

养到80斤的大德牧居然是个娘炮!

爱宠物
2026-05-10 21:51:28
比没朋友更可怕的,是这9类“毒友谊”

比没朋友更可怕的,是这9类“毒友谊”

蓁蓁心理抚养
2026-05-19 07:20:03
LG搞了个1000Hz显示器,但你的显卡可能先哭了

LG搞了个1000Hz显示器,但你的显卡可能先哭了

渡川5
2026-05-19 18:24:12
埃迪·豪:纽卡斯尔今夏或迎巨变,球员可能离队

埃迪·豪:纽卡斯尔今夏或迎巨变,球员可能离队

竞技风云录
2026-05-20 02:26:30
马斯克花 100 亿想清楚一件事,不做 coding agent 就是等死

马斯克花 100 亿想清楚一件事,不做 coding agent 就是等死

爱范儿
2026-05-18 22:19:15
56岁男子因苯磺酸氨氯地平入院走了,医生劝告:6用药细节别忽视

56岁男子因苯磺酸氨氯地平入院走了,医生劝告:6用药细节别忽视

荆医生科普
2026-05-18 17:37:39
加速高血脂恶化的行为:米饭排第5,第1名很多人都没意识到

加速高血脂恶化的行为:米饭排第5,第1名很多人都没意识到

岐黄传人孙大夫
2026-05-19 22:30:03
家庭存款8大等级曝光,多数家庭无法跨越第四层,你在哪一层?

家庭存款8大等级曝光,多数家庭无法跨越第四层,你在哪一层?

趣味萌宠的日常
2026-05-19 00:51:19
特朗普、普京相继访华,美媒痛批冯德莱恩,欧盟正把自己逼上绝路

特朗普、普京相继访华,美媒痛批冯德莱恩,欧盟正把自己逼上绝路

刘振起观点
2026-05-19 09:14:31
【星耀美加墨】这支竞争力处于历史巅峰的葡萄牙,能否让C罗圆梦呢?

【星耀美加墨】这支竞争力处于历史巅峰的葡萄牙,能否让C罗圆梦呢?

五星体育
2026-05-19 21:45:51
重大突破!中国东北发现“更好挖”的新稀土矿

重大突破!中国东北发现“更好挖”的新稀土矿

观察者网
2026-05-19 15:52:07
特朗普称或将再次打击伊朗

特朗普称或将再次打击伊朗

新京报
2026-05-19 23:08:16
国际米兰和耐克联合发布2026/27赛季全新主场球衣

国际米兰和耐克联合发布2026/27赛季全新主场球衣

国际米兰足球俱乐部
2026-05-19 16:18:14
2026-05-20 03:39:00
无线通讯技术
无线通讯技术
互联互通,创造美好生活
54文章数 26关注度
往期回顾 全部

数码要闻

谷歌发布Wear OS 7:续航最高提升10%

头条要闻

媒体:特朗普为何抛涉台"四不"说法 鲁比奥解释清楚了

头条要闻

媒体:特朗普为何抛涉台"四不"说法 鲁比奥解释清楚了

体育要闻

文班亚马:没拿到MVP,就证明自己是MVP

娱乐要闻

姚晨删博难平众怒,为什么她还能蹦哒

财经要闻

洁丽雅硬刚豪门内斗传言

科技要闻

马斯克败诉,法院判他起诉OpenAI太晚了

汽车要闻

焕新极氪009上市41.38万起 齐家版让MPV回归家庭

态度原创

本地
健康
亲子
公开课
军事航空

本地新闻

别搜晋江小说了,去看真的晋江

专家揭秘干细胞回输的安全风险

亲子要闻

小汽车吃冰淇淋 #大型挖掘机挖土玩具

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

特朗普暂缓打击伊朗 称系应中东三国请求

无障碍浏览 进入关怀版