【蓝牙mesh】access层(接入层)协议介绍
【蓝牙mesh】access层(接入层)协议介绍
Access层简介

Access层定义了应用层如何使用upper协议层的接口,它不仅定义了应用层的格式,还定义了应用数据在upper层的加密和解密。当收到下层的数据包时,它会检查数据的netkey(网络密钥)和appkey(应用密钥)是否正确,如果数据正确则将数据提供给应用层处理。
总的来说,Access层从数据流的角度来讲,并不属于某一个单独的协议层, 它只是制定了一系列的网络传输规范的,这点很类似于BLE中的GAP层。
概念介绍
Model ID
Model ID 是一个16Bit 或者32Bit的一个数值。用来表示设备的某个功能模块,比如onoff model, lightness model。
那16Bit的Model ID 和 32Bit的Model ID有什么区别呢?
16Bit的Model ID 是有蓝牙技术联盟分配的。 如下图是Sig制定的几个Model ID

32Bit的Model ID是由各个厂商自定义的Model ID。32Bit的Model ID分为两个部分, 前16Bit是蓝牙技术联盟给各个厂商分配的Company ID, 后16Bit是才是厂商自定义的Model ID。格式如下:

至于各个厂商的Company ID, 可以再蓝牙技术联盟官网查询,链接:https://www.bluetooth.com/specifications/assigned-numbers/
下图就是根据文档搜到的杭州涂鸦智能的Company ID 为 0X07DO, 其他公司的Company ID可以自行搜索。

Access层payload数据
Access层数据每包长度为12个字节,如果超过则底层会进行分包,最多分包32包,所以Access层能够传输的最大数据是384个字节。当然这是包含了TransMIC的长度,如果TransMIC长度为4个字节,则Access层Payload最大380个字节。其次,还要减去对应的Opcode的长度。 如果Opcode长度为1,则Payload为379个字节;pcode长度为2,则Payload为378个字节;pcode长度为3,则Payload为377个字节,厂商自定义的Opcode都是3个字节。
Access层的数据包格式如下图:

那什么是Opcode?
Opcode(操作码)
Opcode可以是1、2、3个字节。第一个字节的最高两位表示Opcode的长度。如下图:

第一个字节的最高位为0表示Opcode是一个字节,
第一个字节的最高两位是10表示Opcode是两个字节
第一个字节的最高两位是11表示Opcode是三个字节。
1个字节的Opcode和2个字节的Opcode是蓝牙技术联盟定义的,用作网络信息配网的数据包和应用传输的数据包中。
3个字节的Opcode是厂商可以自行定义的,但是也不是三个字节都可以自定义。 Opcode中的第二和第三个字节表示的是厂商的Company ID, 只有第一个字节的低6个Bit可以由厂商自定义,也就是说一个厂商可以自定义64个字节的Opcode。
Acces层的功能
发送数据
发送的源地址必须是一个单播地址,即发送方只能是某一个设备。 发送的目的地址可以是单播地址、群组地址或者虚拟地址。
如果发送方发送了一个带回复的数据包到一个单播地址,即数据发给某一个设备,则接收方在收到数据后,应该延时20-50ms后,回复数据包。
如果发送方发送了一个待回复的数据包到一个群组地址,即一对多,则接收方在收到数据后,应该延时20-500ms后,回复数据包,这样是为了避免多个接收方同时回复数据,导致回复数据的网络干扰,减少丢包率。
通常设备节点在状态发生变化的时候,会立即上报状态给订阅的节点。但是如果设备是刚上电的时候上报状态,则应该延时20-500ms,以防止多个设备同时上电导致的上报数据干扰。
由于蓝牙Mesh网络的带宽较小,所以应该注意节点发送数据的频率,一个节点在10秒内发送的数据包最好不要超过100包。
接收数据
当节点收到一包蓝牙Mesh数据后,应该经过下面几步判断,如果条件都满足才进行处理:
- 通过Opcode判断到该数据包是当前设备model使用的
- 目的地址满足下面其中一条:
- 目的地址是当前设备的单播地址
- 目的地址是当前设备订阅的组地址或者虚拟地址
- 目的地址是0xffff之类的特定地址
- 该消息用来加密的appkey或者devkey是当前model已经绑定了的
无需ack的数据包
蓝牙Mesh可以制定消息是否需要回复,例如像一个群组发送应用消息,很多时候会使用noack的数据包,这样可以避免群组内多个设备同时回复造成的网络风暴。 但是这样也有一个概率性丢包的问题,因为发送方不知道接收方到底有没有收到这条消息。 所以noack的消息更适合一些不太重要场景的群组控制。
需要ack的数据包
蓝牙mesh中大部分的数据都是需要ack的,如果发送方在一定的时间内没有收到接收方的ack,发送方可以进行重发,来保证数据包的必达。 但是对于节点内比较多的网络, 最好不是在全组群发需要ack的数据包,应该首先确定有哪些设备需要发送,然后针对这些设备来进行群控,而不是一股脑的全控。
发布和订阅
节点里每个model都可以订阅一个或多个地址,地址可以是群组地址或者虚拟地址。 发送方向这个订阅地址发送的消息,会被订阅这个地址的设备接收到。
相关文章:
【蓝牙mesh】access层(接入层)协议介绍
【蓝牙mesh】access层(接入层)协议介绍 Access层简介 Access层定义了应用层如何使用upper协议层的接口,它不仅定义了应用层的格式,还定义了应用数据在upper层的加密和解密。当收到下层的数据包时,它会检查数据的netke…...
【一天一门编程语言】JavaScript 语言程序设计极简教程
JavaScript 语言程序设计极简教程 用 markdown 格式输出答案。 不少于3000字。细分到2级目录。 一、JavaScript 简介 1.1 什么是 JavaScript JavaScript 是一种由Netscape的LiveScript发展而来的脚本语言,是一种动态类型、弱类型、基于原型的语言,内…...
CMake调试器出炉:调试你的CMake脚本
Visual Studio 开发团队一直和 Kitware 紧密合作,致力于开发一个用于调试 CMake 脚本的调试器。 我们将继续这个工作,以便开发人员社区可以通过添加新功能和对其他 DAP 功能的支持来共同改进它。 我们很高兴地宣布,CMake 调试器的预览版现在…...
题解 # 二维矩阵最大矩形问题#
题目: 小明有一张N*M的方格纸,且部分小方格中涂了颜色,部分小方格还是空白。 给出N (2<Ns30)和M(2sMs30)的值,及每个小方格的状态((被涂了颜色小方格用数字1表示,空白小方格用数字0表示); 请…...
奔四的路上,依旧倔强的相信未来
本文首发于2022年12月31日 原标题: 奔四的路上,依旧倔强的相信未来!–我的2022年终总结 读大学那几年,一直保持着写日记和做计划的习惯,还记得大学毕业刚开始打工的时候,我的床头的墙上一定会画一张表,写上一个月的计划和一周的计划 计划也会有完不成的时候,但加深了…...
61 k8s + rancher + karmada容器化部署
文章目录 一、什么是rancher二、为什么使用rancher三、rancher安装1、细部介绍四、图形化操作1、执行2、补充五、 karmada1、官网2、细部介绍一、什么是rancher 1、Rancher 是一个 全栈式 的 Kubernetes 容器管理平台,为你提供在任何地方都能成功运行 Kubernetes 的工具。 二…...
Vue3的新特性变化,上手指南!
文章目录一、Vue3相比Vue2,更新了什么变化?二、Proxy 代理响应式原理三、组合式 API (Composition API)setup()函数:ref()函数reactive()函数组合式 setup 中使用 Props 父向子传递参数计算属性watch(数据监视)watchEffect&#x…...
OllyDbg
本文通过吾爱破解论坛上提供的OllyDbg版本为例,讲解该软件的使用方法 F2对鼠标所处的位置打下断点,一般表现为鼠标所属地址位置背景变红F3加载一个可执行程序,进行调试分析,表现为弹出打开文件框F4执行程序到光标处F5缩小还原当前…...
记一次键盘维修,最终修复
我的笔记本是华硕的K45VD,是我亲人在高二那年买的,之后就一直给我用,距今2023年已经差不多13年,它承载了太多记忆。在大学期间也给它升级,重要的零部件基本没问题。只在大学时加了8G内存和一个240G固态,换了…...
LeetCode 155.最小栈
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。实现 MinStack 类:MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元素。int getMin(…...
C++学习笔记-重载运算符和重载函数
重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。 C 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重…...
Java —— JDBC
引入mysql链接 创建表格 Navicat查看建表代码双击要打开的表,右侧顶端点击ddl小方框 CREATE TABLE s (id int(6) NOT NULL,name varchar(20) COLLATE utf8_bin DEFAULT NULL,age int(11) DEFAULT NULL,gender varchar(2) COLLATE utf8_bin DEFAULT NULL,dept var…...
备战金三银四,熬夜半个月汇集大厂 Java 岗 1600 页面试真题
如果你不停地加班。却很少冒险,也很少学习,那你极大可能会陷入到内卷中。 为什么这么说呢?我们先来捋清楚「内卷」的概念: 「内卷化」简而言之就是:日复一日,越混越掉坑里。 所谓内卷化,指一种…...
9、面向对象、泛型与反射
目录一、构造函数二、继承与重写三、泛型四、反射1 - 反射的基本概念2 - 反射的基础数据类型3 - 反射APIa - 获取Type类型b - 获取struct成员变量的信息c - 获取struct成员方法的信息d - 获取函数的信息e - 判断类型是否实现了某接口五、reflect.Valuea - 空value判断b - 获取V…...
Python使用百度通用API进行翻译
想汉化StarUML这个软件,感觉工作量太大,想要用Python自动翻译。 结果网上找的一个个用不了,或者用一会儿就断。 于是自己手写了一个简单的,只有两个类:APIConfig和Translater 使用 demo my_api_config APIConfig(…...
JavaScript 弹窗
文章目录JavaScript 弹窗警告框确认框提示框换行JavaScript 弹窗 可以在 JavaScript 中创建三种消息框:警告框、确认框、提示框。 警告框 警告框经常用于确保用户可以得到某些信息。 当警告框出现后,用户需要点击确定按钮才能继续进行操作。 语法 wi…...
408复试day1
文章目录数据结构计算机组成原理操作系统计算机网络数据结构 深度优先遍历DFS: 首先访问图中起始顶点v,然后由v出发,访问与v邻接且未被访问的顶点v1,再访问与v1相邻的且未被访问的顶点v2……重复上述过程。当不能再继续向下访问时…...
gdb openocd jlink arm-a9调试
连接关系是这样的:gdb —> openocd —>(这里需要两个xx.cfg配置文件) jlink —> arm-a9板子 具体流程是这样的: 给jlink(硬件调试器)安装驱动,用USB Driver Tool这个软件,…...
Leetcode Solutions - Part 2
1. Two Sum 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按…...
外盘国际期货:围观那些奇葩的国际节日?
围观那些奇葩的国际节日? 2月24日:世界讨厌香菜日,号召全世界所以讨厌香菜的人一起抵制香菜,2016年世界反香菜联盟 3月21日:世界睡眠日,唤起全民对睡眠重要性的认识,2001年国际精神卫生组织 …...
C++中显示与隐式加载dll的使用与区别
一、什么是 DLL?DLL(Dynamic Link Library) 是 Windows 下的动态链接库,包含可被多个程序共享的函数、资源或类。使用 DLL 可以实现代码复用、模块化设计和插件机制。在 C 中,调用 DLL 中的函数有两种主要方式…...
Sentinel-3B OLCI 3 级全球分箱地球观测降分辨率(ERR)叶绿素(CHL)数据,版本 2022.0
Sentinel-3B OLCI Level-3 Global Binned Earth-observation Reduced Resolution (ERR) Chlorophyll (CHL) Data, version 2022.0 简介 叶绿素 a 数据集提供全球网格化的表层叶绿素 a 浓度(浮游植物生物量的替代指标)合成数据。CHL 支持时间序列和气候…...
Windows Cleaner深度解析:5大核心模块彻底解决系统空间不足问题
Windows Cleaner深度解析:5大核心模块彻底解决系统空间不足问题 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner Windows Cleaner是一款完全免费开源的…...
OpenRASP原理与实战:Java应用层实时防护技术详解
1. 为什么我宁愿花三天部署OpenRASP,也不愿再写第五个自定义WAF过滤器去年冬天,我在给一家做在线教育SaaS平台做安全加固时,连续踩了三个坑:第一次用NginxLua写了套SQL注入规则,结果学生提交的“SELECT * FROM courses…...
3个实用场景教你轻松解锁网易云音乐NCM加密文件:ncmdumpGUI完整指南
3个实用场景教你轻松解锁网易云音乐NCM加密文件:ncmdumpGUI完整指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经下载了网易云音乐的…...
【C++】零基础入门 · 第 5 节:函数基础
前面四节我们写的代码都集中在 main 函数里。随着程序变复杂,所有逻辑堆在一起会越来越难维护。函数就是用来解决这个问题的——它把一段代码「打包」起来,取个名字,需要的时候调用就行。 1. 为什么需要函数 假设你需要在程序的不同地方打印一行分隔线: cout << &…...
数字合成器d-FORMANT:从模拟经典到数字复刻的工程实践
1. 项目概述:从模拟经典到数字复刻如果你对合成器稍有了解,或者对电子音乐制作背后的硬件感兴趣,那么“FORMANT”这个名字你一定不陌生。它最初是上世纪70年代由《Elektor》杂志发布的一款模拟单音合成器,以其清晰的模块化设计和出…...
PDF差异对比神器diff-pdf:告别文档核对烦恼,提升工作效率的智能解决方案
PDF差异对比神器diff-pdf:告别文档核对烦恼,提升工作效率的智能解决方案 【免费下载链接】diff-pdf A simple tool for visually comparing two PDF files 项目地址: https://gitcode.com/gh_mirrors/di/diff-pdf 你是否曾在核对PDF文档时感到头疼…...
WaveTools鸣潮工具箱:3步完成游戏性能优化与配置调校的完整指南
WaveTools鸣潮工具箱:3步完成游戏性能优化与配置调校的完整指南 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools WaveTools鸣潮工具箱是一款专为《鸣潮》玩家设计的开源性能优化工具,…...
【独家披露】DeepSeek灰度发布SLI/SLO基线标准:99.95%可用性背后的4层验证漏斗
更多请点击: https://codechina.net 第一章:DeepSeek灰度发布策略全景图 DeepSeek模型服务的灰度发布并非简单的流量切分,而是一套融合可观测性、渐进式验证与多维熔断机制的工程化闭环体系。其核心目标是在保障线上推理稳定性的同时&#x…...
