您现在的位置: 首页 环境保护 > > 正文
世界消息!安卓蓝牙开发 Android低功耗蓝牙总结
发布时间:2023-06-27 01:06:09 来源:

hello大家好,我是城乡经济网小晟来为大家解答以上问题,安卓蓝牙开发,Android低功耗蓝牙总结很多人还不知道,现在让我们一起来看看吧!

首先要搞清楚一点,我们在 Android 中通过 SDK 获得的蓝牙广播包是经过底层的 SDK 给我们处理过的,是一个长度为 62 的字节数组。这个长度为 62 的字节数组是怎么来的呢?


(资料图片仅供参考)

想要搞清楚这个问题,首先我们要明白 iBeacon 向外发送的最原始的广播包是什么样的?

首先我们要搞清楚一点,蓝牙在向外发送数据的时候是分成两个部分的一个就是普通的广播包还有一个叫做应答包。这是蓝牙协议的规定内容,针对于所有的蓝牙设备(iBeacon 只是蓝牙设备的一种)

需要注意的是,发送数据是从低位到高位一次发送,所以接收到的数据要返回来按字节拼接,例如接收到的MAC为 8b 03 00 b0 01 c2,那么实际的MAC为 c2:01:b0:00:03:8b

首先我们来看一下第一个蓝牙广播包(来自 iBeacon 设备),一共 59 个字节

04 3e 38 0d 01 13 00 01 8b 03 00 b0 01 c2 01 00 ff 7f af 00 00 00 00 00 00 00 00 00 1e 29个字节 02 01 06 1a ff 4c 00 02 15 fd a5 06 93 a4 e2 4f b1 af cf c6 eb 07 64 78 25 27 11 4c b9 c5 30个字节

第一行的内容可以认为是蓝牙广播包中的附带信息,通过 Android SDK 是没法看到的,第二行是对应我们 Android SDK 中收到的广播包中的前一部分。

第一个字节是HCI Packet Type,04表示这是HCI Event;剩下的58bytes则是HCI Event的具体内容第二个字节是EventCode,3e是此事件的代码;第三个字节是Parameter Length,0x38(十进制56)表示后面数据长度56bytes第四个字节是SubEvent,0d表示这是LE Extended Advertising Report;第五个字节是Num Reports,数值为011b 00这两个字节代表Event Type,由于发送数据都是按字节发送以及从低位向高位发送,因此真实值是 001b01 表示这是随机设备地址8b 03 00 b0 01 c2 是此设备的MAC,根据从低向高的发送规则,所以真实MAC是 c2:01:b0:00:03:8b01 代表首要广播信道的带宽00 代表次要广播信道的带宽,此处表示不使用次要信道ff 表示广播SID7f 代表Tx Power的大小,此处是127dbmaf 代表RSSI的大小,此处是-81dbm00 00 代表周期广播间隔00 代表直接地址类型,次数是公共设备地址00 00 00 00 00 00 代表直接BD_ADDR1e 代表接下的的数据的字节数(长度),以下数据就是最重要的广播数据了

上面的内容就是对应第一行的解释了,其实 Android SDK 已经帮我们把这些数据中的部分内容解析出来,我们可以直接通过对应的 SDK 的方法来直接获取。

下面我们再来看 真正意义上的广播包

格式是这样的:

一个广播包是由若干个广播单元 AD Structure 构成的。每个 AD Structure 的组成是:第一个字节表示长度值 length,表示接下来的 length 个字节是数据部分,数据部分的第一个字节表示数据的类型 AD Type,AD Type 决定了下面的数据代表了什么,关于每个数值代表的数据类型见官方文档,剩下的 length - 1 个字节表示真正的数据

02 01 06 02 表示接下来的数据有两个字节 01 表示数据类型,此处类型是 Flags 06 就是具体的数值了 0x06 = 0000 0110 每一位都有不同的含义,见官方文档

1a ff 4c 00 02 15 fd a5 06 93 a4 e2 4f b1 af cf c6 eb 07 64 78 25 27 11 4c b9 c51a 表示接下来的数据有 26 字节FF 表示数据类型,此处类型是 厂商自定义数据类型(这里的厂商指的是苹果公司,因为 iBeacon 是苹果公司提出的)4C 00 表示公司的 ID,此处的 004C 代表苹果公司02 15 Beacon 的标识位,必须是这样的fd a5 06 93 a4 e2 4f b1 af cf c6 eb 07 64 78 25表示 Beacon UUID 27 11 是 major 的值4C b9 是 minor 的值C5 表示 Measured Power 表示的是此设备在 1 米处的 RSSI 值,用于距离测算

这段内容其实主要是苹果公司在蓝牙协议的基础上定义的。

如果符合 1AFF4C000215 则说明此设备是 iBeacon 设备

04 3e 38 0d 01 1b 00 01 8b 03 00 b0 01 c2 01 00 ff 7f af 00 00 00 00 00 00 00 00 00 1e 29个字节02 0a 00 08 16 f0 ff 64 27 11 4c b9 11 09 4d 69 6e 69 42 65 61 63 6f 6e 5f 30 30 39 30 37 30个字节

其中第一行与上面一样,这里不再介绍02 0a 00 02 表示接下来的数据长度 2 个字节0a 表示数据类型 这里表示 Tx Power Level 取值范围是 -127 到 127 dBm00 表示 0 dBm08 16 f0 ff 64 27 11 4c b908 表示数据长度 16 表示 Service Data 由 Service UUID 和 service 数据组成 前两个字节是 UUID 后面是数据f0ff 是 Service UUID 64 27 11 4c b9 是数据11 09 4d 69 6e 69 42 65 61 63 6f 6e11 表示数据长度09 表示设备完整的名字4d 69 6e 69 42 65 61 63 6f 6e 就是设备名字的 ASSIC 码了 对应 MiniBeaconM i n i B e a c o n 5f 30 30 39 30 37这几个数据就是 Beacon 开发者随便乱加入的数据了,不符合协议内容

上面我们分别分析了蓝牙原始数据包中的广播包和应答包,其实对于 iBeacon 来说广播包中的大多数内容其确定的,只有 UUID Major Minor 会有变化。而且每个位置所代表的作用都已经被 苹果公司 定义好了。如果想要 iBeacon 发出的数据包有更多的内容,那么我们就可以在应答包中做文章了,应答包是有 32 个字节的。我们只需要按照协议的内容向应答包中添加数据就可以了。

对于 Android 客户端,通过 Scanresult.getScanRecord().getBytes() 获得的广播包是 62 个字节,它把上面原始数据包中的内容提取出来了,只保留了第二行内容。就是 蓝牙广播包第二行(30 byte) 蓝牙应答包第二行(最多 32 byte,数目不确定),如果位数不够的话就用 0 补充。

所以我们现在就可以很好根据获得的 byte[] 数组来解析广播包了。

// 现在就获得广播包了byte[] result = ScanResult.getScanRecord().getBytes();// UUID 包含 result[9] 和 result[24]result[9]---result[24];// Majorresult[25] result[26]// Minorresult[27] result[28] // Measured Powerresult[29] // 一般我们都是直接会先把 广播包转成 16 进制的格式然后来截取String uuid = broadcast.substring(18, 50); // 至于后面应答包的内容就要根据具体的广播包格式来进行解析了,比如你们公司的硬件开发人员把电池电量放入了里面,那么你们就约定好放在什么位置,到时候你直接取就可以了。

这几个方法所获得内容都不是直接从 Android 中收到的广播(ScanResult.getScanRecord().getBytes())中解析出来的,而是从原始数据包中解析的。

getTxPower 获取传输功率,如果这个 iBeacon 不支持的话,那么结果就是 127

后面这几个方法作用不大,关键看设备是否支持

关键方法

ScanRecord 中的这几个方法就很重要的,这几个方法都和我们收到的广播包有关系。

比如:如果应答包中对 Tx Power Level 进行了设置我们就可以通过 getTxPowerLevel() 来直接获取。比如上面例子中的广播包,通过调用方法 getTxPowerLevel() 就可以得到 0

其他方法类似,只要你的应答包中数据的格式正确,就可以解析出来。

举例说明:

比如 Android 端收到的广播包是:

0201061AFF4C0002150123456789ABCDEF0123456789ABCDEF00000007C5 广播包020A00 0303F1FF 0E16F1FF6400000007AC233F66C401 070965526F7574650000 应答包

getTxPowerLevel() 返回 0 因为在应答包中有正确的格式数据 020A00

getServiceData() 也会返回值,因为在应答包中有对应的数据 0E16F1FF6400000007AC233F66C401

0E 表示数据长度16 表示类型 此处表示 Service Data - 16-bit UUID (不仅仅是 UUID 还带有数据) 前两个字节表示 UUID 后面是数据F1FF 表示 UUID6400000007AC233F66C401 表示数据 Map getServiceData() 返回的值就是用 UUID 和 数据作为键值对的形式此处返回的 Map 集合中的内容是 注意:变化的 UUID 其余位数不会变化,如果广播包中 UUID 不是 F1FF,那么只需要对应替换就可以了ParcelUuid = ParcelUuid.fromString("0000fff1-0000-1000-8000-00805f9b34fb");byte[] 就是数据部分对应的字节数值

List getServiceUuids() 方法对应的就是应答包中的数据 0303F1FF 由于只出现一次,所以 list 的 size就只有一个就是 F1FF 对应的 ParcelUuid 就是 ParcelUuid.fromString("0000fff1-0000-1000-8000-00805f9b34fb");

同样的下面几个方法也是对 Android 端收到的 62 byte 的广播包中数据的解析所得

String getDeviceName() 获得是名字 需要广播包中有对应的数据 070965526F7574650000

SpareArray getManufacturerSpecificaData() 获取的制造商的数据,对应 4C000215

byte[] getManufacturerSpecificData(int manufacture) 根据制造商代码(4c 对应的十进制)获得byte[] (0215)

还是有一些字段翻译过来不够精细,详细见官方文档:www.bluetooth.com/specificati…

Android核心知识点笔记github:https://github.com/AndroidCot/Android

本文就为大家讲解到这里,希望对大家有所帮助。

标签:

新兴食品现身市场 “植物肉”产品能否“俘获”消费者的胃?

最近一段时间,部分超市和电商平台售卖的植物肉纷纷推出促销优惠活动,销量看涨。不过也有消费者表示,...

绍兴招才引智云对话活动举行 诚邀天下英才“会盟”绍兴

懂人才是大学问,聚人才是大本事,用人才是大智慧。近年来,绍兴市大力实施人才强市战略,持续深化人才...

江苏省自然资源厅出台指导意见 推进老旧小区改造工作

省自然资源厅近日出台《关于大力推进城镇老旧小区改造工作的指导意见》,针对城镇老旧小区改造中规划和...

2021年中国心血管健康指数排名:江苏位列前五

进行了排名,江苏位列前五。北京、上海、江苏等地居民心血管更健康这项发表在《中国疾病预防控制中心周...

科研人员揭示5种豆科植物的核型数据及亲缘关系

近日,四川农业大学林学院副教授罗小梅团队在遗传学领域期刊《基因》(Genes),在线发表了题为《基于5S ...

“烟火气”十足的“江苏味道” 河西CBD顶流商圈开街迎客

开街啦!5月18日上午,在河西CBD金融城融媒路上,2022江苏省新能源汽车&信息消费创新产品推广系列活动启...

首个锌金属的伴侣蛋白诞生 有助于解决缺锌公共卫生问题

据17日发表在《细胞》与《细胞报告》杂志上的两篇论文,美国研究人员发现了第一个锌金属的伴侣蛋白,并...

科学家首次揭示糖尿病卵母细胞起源 有助于减少生育缺陷

5月19日,记者从浙江大学获悉,浙大医学院附属妇产科医院黄荷凤院士团队与中国科学院徐国良院士团队合作...

前4月河北省电信网络诈骗案件发案数连续4个月同比下降

记者从省政府新闻办5月18日举行的河北省打击治理电信网络诈骗犯罪工作新闻发布会上获悉,今年1至4月,全...

重庆:到2025年25个重点领域企业能效全部达到基准水平

3月18日,重庆日报记者从市发展改革委获悉,日前,市发展改革委、市经济信息委、市生态环境局、市市场监...

重磅!2021“发现重庆之美”获奖名单揭晓

3月19日,2021发现重庆之美颁奖典礼在线上举行,最美城市管理人、最美坡坎崖、最美街头绿地、垃圾分类时...

去年重庆回收废弃农膜1.4万吨 农膜回收率达89.31%

3月16日,市五届人大常委会第六十九次主任会议听取了市政府关于《重庆市人大常委会对市人民政府农业面源...

申报分两批!今年国家级博士后科研工作站新设站工作启动

3月19日,重庆日报记者从市人力社保局获悉,为推动产学研深度融合,加强博士后工作平台建设,我市将开展...

浙江鄞州:“水、电、气、数”通办专窗实现城乡公共服务均等化

近日,在宁波市鄞州区邱隘镇公共事务服务中心,66岁的邱隘镇沈家新村居民邱秀月在一个窗口相继办理了不...

打开“浙里办” 浙江1000家农贸市场农产品可线上比价

今天哪个菜场的五花肉最便宜?食品安全抽检结果怎么样?这些问题,浙江居民只需打开浙里办APP上的浙里市场...

浙江鉴湖国家湿地公园规划发布 打造乡村数字旅游

19日上午,鉴湖国家湿地公园规划发布暨东鉴湖农旅观光体验启动仪式在绍兴市越城区陶堰街道举行。当天,...

总投资超10亿元!6个石化装备运维项目在岱山签约

日前,总投资超10亿元的6个石化装备运维项目在岱山经济开发区集中签约。此次签约的项目占地106亩,规划...

如何避免成为“买而不做”的“装备党”祝 杰

自恋是人的天性,人们总是希望自己是更好的,那么自己拥有的事物,也就相应地被自我赋予了更高的价值,...

山西临汾:率先在全省建起农村集体经济开发区

3月17日,临汾市农村集体经济发展(集团)有限公司在临汾经济开发区揭牌。以此为标志,临汾率先在全省建起...

一线工作近22年的缉毒警:我知道坏的是毒品不是人性

  “影子”般的缉毒警:一线工作22年,我知道坏的是毒品不是人性  如果我不继续干,别人也要干,缉...

广东肇庆“毒驾连撞5车致1死”肇事司机被批捕

  1月5日14时30分许,广东肇庆市端州区一男子赵某毒驾连撞5车,致一人死亡。  1月10日,澎湃新闻(ww...

江西最大文物倒卖案宣判:倒卖国家二级文物 9人获刑

  中新网南昌1月10日电 (冷峥嵘 张一怡)江西省共青城市人民法院10日发布消息称,近日,该院依法审结...

青海保障门源地震后生活必需品应急物资

  中新网西宁1月10日电 (记者 孙睿)记者10日从青海省商务厅获悉,青海海北州门源县6 9级地震灾害发...

广西东兴口岸恢复通关 入境需网上预约

  中新社防城港1月10日电 (翟李强)自2022年1月10日零时起,广西东兴口岸和边民互市贸易区恢复人员、...

呼和浩特:寒假期间有条件的学校要开展校内托管服务

  中新网呼和浩特1月10日电 (记者 张林虎)10日,记者从呼和浩特市教育局获悉,在暑假校内托管试点的...

“中国最后一个原始部落”翁丁老寨火灾原因公布

北京市十五届人大五次会议胜利闭幕

天津市委市政府致全市父老乡亲的慰问信:我们一定能够打赢

天津米面油存量由20天提高至30天 超市菜市场进货量翻倍

兰州名师话“美育”:“尚乐立人”分层培优 以“美”润教

子夜直击,天津寒天战“疫”

重庆姐弟被生父扔下坠亡案上诉期结束 一审法院暂未收到两被告人上诉状

天津:划定封控区 全市开展全员核酸检测

江歌母亲江秋莲:尊重法院判决,法律认定在我意料之中

中国边疆“北方第一所”:9名民警守护“生命禁区”

辟谣!网传“封控区管控区相继解封”通知并非西安

河南安阳9日12时至24时新增11例本土确诊病例

老人5折环卫工8折生活困难免费 这家面馆背后有个暖心事

铁路公安以110幅优秀书画作品庆祝人民警察节

本周中东部冷空气频繁 东北等地有降雪

河南新增本土确诊病例60例

“打拐”民警眼里的百态人生:见证一份份不愿放弃的爱

迎腊八北京晴天上线 阵风6至7级体感冻人

多省份倡议春节“非必要不离开”,这地补贴1000元

伪造国家机关证件典型案例发布 有力打击制假贩假行为

15年照顾170多个新生儿 金牌月嫂“漂”到海外去看娃

江歌母亲江秋莲诉刘鑫案一审将于今日宣判

河南省安阳市两地划为高风险地区 一地划为中风险地区

员工迟到一次罚一千引争议 单位惩戒员工法律边界何在?

以体育人 秀出“青年范儿”

保安、厨师曾被竞业限制 企业滥用竞业限制让员工很苦恼

反诈老陈破圈:人民群众在哪 就把反诈宣传开展到哪

一所中职学校的育人实践

各地严惩恶意欠薪 保障农民工及时拿到工资

中学生成剧本杀行业潜在消费人群 多方助推行业“净化”

“这就是我最好的选择”

对餐饮浪费说“不”(百姓关注)

校园“直通车” 服务“零距离”

琉璃河遗址 两段铭文共证北京三千年建城史

千元修复个人征信报告?银行:“征信修复”都是骗局

琉璃河遗址 两段铭文共证北京三千年建城史

北京公交将开展无人驾驶道路测试

河南郑州调整五地为中风险区域 公路入郑需核酸检测阴性证明

“共享法庭”让金融消费者畅享“智慧司法”便利

《传奇2》网游著作权纠纷案峰回路转 最高法五份裁决四份改判一份发回重审

三代警察:从未放弃的28年

“胡叔叔”的寻亲工作室

天津津南本轮本土疫情第3—20例阳性感染者活动轨迹公布

“团圆”行动刑侦专家吕游 每一个案例都有单独的技术方案

河南“战疫”直面五重考验

开考古书店日均两三个顾客 流量时代她决心仍是只卖书

冬奥开幕在即 “双减”催热冰雪课堂

“不得以任何借口拒收患者”彰显生命至上

天津多站进京车票暂停发售

冷空气来袭广州气温骤降 广东多地发布寒冷预警

x 广告
x 广告

Copyright ©  2015-2022 大西洋自然网版权所有  备案号:沪ICP备2020036824号-2   联系邮箱: 562 66 29@qq.com