BLE Mesh蓝牙组网技术详细解析之Model Layer模型层(八)

目录

一、什么是BLE Mesh Model Layer模型层?

二、SIG Model

2.1 模型概念

2.2 消息格式 

2.3 开关模型

四、资料获取


一、什么是BLE Mesh Model Layer模型层?

Models Layer的作用是定义了一些通用的或特定的模型,用于实现网络节点设备的基本功能和控制行为。每个模型都包含了一些状态、消息和规程,用于描述设备的属性、功能和行为。模型可以分为基础模型和SIG模型两类。基础模型负责实现与Mesh网络配置和管理相关的功能,如Configuration Server/Client model和Health Server/Client model。SIG模型负责实现与Mesh网络应用相关的功能,如Generic OnOff Server/Client model、Sensor Server/Client model和Lighting Server/Client model等。 

二、SIG Model

2.1 模型概念

Model Layer中的SIG model是一些标准的模型,用于实现典型的用户场景功能,如开关、传感器、灯光等。SIG model的实现主要包括以下几个方面:

  • 定义一组相关的状态,用于表示模型的当前属性或目标属性
  • 定义一组消息,用于查询或更改状态的值,或者通知状态的变化
  • 定义一组行为,用于响应消息的请求,或者执行状态的转换
  • 定义一组绑定关系,用于描述不同状态之间的联动效果
  • 定义一个唯一的模型识别码,用于区分不同的模型

下图展示了设备的一种元素模型结构,该设备具体实现了一个服务器模型(标记为设备C),具备相应的状态,并支持以下消息:R、S、T、X、Y、Z。同时,该设备还包含两个实现客户端模型的设备,其中设备a主要支持消息X、Y和Z,而设备B则主要支持消息R、S、T和Z。

2.2 消息格式 

Model Layer的消息格式是由Access Layer定义的,主要包括两个部分:Opcode和Parameters。Opcode是一个1到3字节的字段,用于标识消息的类型和用途。Parameters是一个可选的字段,用于携带消息的具体内容,比如状态的值,目标的地址,操作的码等。不同的模型定义了不同的Opcode和Parameters,以实现各自的功能和状态。例如,Generic OnOff Server模型定义了以下三种消息:

  • Generic OnOff Get:用于查询开关状态,Opcode为0x8201,无Parameters。
  • Generic OnOff Set:用于设置开关状态,Opcode为0x8202,Parameters为OnOff(1字节),TID(1字节),Optional Fields(5字节)。
  • Generic OnOff Status:用于响应开关状态,Opcode为0x8203,Parameters为Present OnOff(1字节),Optional Fields(3字节)。

2.3 开关模型

Model Layer开关模型消息通信的过程是这样的:

  • 开关模型包括Generic OnOff Server模型和Generic OnOff Client模型,它们分别定义了一个布尔类型的状态Generic OnOff State,以及三种消息Generic OnOff Get,Generic OnOff Set,Generic OnOff Status。
  • Generic OnOff Client模型可以向Generic OnOff Server模型发送Generic OnOff Get消息,用于查询开关状态,也可以发送Generic OnOff Set消息,用于设置开关状态。
  • Generic OnOff Server模型可以向Generic OnOff Client模型发送Generic OnOff Status消息,用于响应开关状态,也可以向订阅了该模型的其他节点发送Generic OnOff Status消息,用于通知开关状态的变化。
  • Generic OnOff Set消息有两种类型:Acknowledged和Unacknowledged,前者要求服务器回复一个Generic OnOff Status消息,后者不要求回复。
  • Generic OnOff Status消息包含一个字节的Present OnOff值,表示当前的开关状态,以及可选的三个字节的Target OnOff值,Transition Time值和Remaining Time值,表示目标的开关状态,状态转换的时间和剩余的时间。
  • Generic OnOff Server模型和Generic OnOff Client模型之间的消息通信是通过Access Layer承载的,Access Layer负责对消息进行格式化,加密,解密,认证和验证。
  • Access Layer的消息是通过Upper Transport Layer和Lower Transport Layer传输的,Upper Transport Layer负责对消息进行加密,解密和认证,Lower Transport Layer负责对消息进行分段和重组。
  • Lower Transport Layer的消息是通过Network Layer传输的,Network Layer负责对消息进行加密,解密,混淆,反混淆,中继和代理。
  • Network Layer的消息是通过Bearer Layer传输的,Bearer Layer负责对消息进行封装,解封,广播和接收。
  • Bearer Layer可以有两种类型:Advertising Bearer和GATT Bearer,前者基于BLE的广播机制,后者基于BLE的连接机制。

/*源自开源协议栈NimBLE*/
static int gen_onoff_status(struct bt_mesh_model *model,
			     struct bt_mesh_msg_ctx *ctx)
{
	int err;
	struct bt_mesh_gen_onoff_srv *cb = model->user_data;
	struct os_mbuf *msg = NET_BUF_SIMPLE(3);
	uint8_t *state;

	bt_mesh_model_msg_init(msg, OP_GEN_ONOFF_STATUS);
	state = net_buf_simple_add(msg, 1);
	if (cb && cb->get) {
		cb->get(model, state);
	}

	BT_DBG("state: %d", *state);

	err = bt_mesh_model_send(model, ctx, msg, NULL, NULL);
	if (err) {
		BT_ERR("Send status failed");
	}

	os_mbuf_free_chain(msg);

	return err;
}

static int gen_onoff_get(struct bt_mesh_model *model,
			  struct bt_mesh_msg_ctx *ctx,
			  struct os_mbuf *buf)
{
	BT_DBG("");

	return gen_onoff_status(model, ctx);
}

static int gen_onoff_set_unack(struct bt_mesh_model *model,
				struct bt_mesh_msg_ctx *ctx,
				struct os_mbuf *buf)
{
	struct bt_mesh_gen_onoff_srv *cb = model->user_data;
	uint8_t state;

	state = buf->om_data[0];

	BT_DBG("state: %d", state);

	if (cb && cb->set) {
		return cb->set(model, state);
	}

	return 0;
}

static int gen_onoff_set(struct bt_mesh_model *model,
			  struct bt_mesh_msg_ctx *ctx,
			  struct os_mbuf *buf)
{
	BT_DBG("");

	gen_onoff_set_unack(model, ctx, buf);
	return gen_onoff_status(model, ctx);
}

static int gen_level_status(struct bt_mesh_model *model,
			     struct bt_mesh_msg_ctx *ctx)
{
	int err;
	struct bt_mesh_gen_level_srv *cb = model->user_data;
	struct os_mbuf *msg = NET_BUF_SIMPLE(4);
	int16_t *level;

	bt_mesh_model_msg_init(msg, OP_GEN_LEVEL_STATUS);
	level = net_buf_simple_add(msg, 2);
	if (cb && cb->get) {
		cb->get(model, level);
	}

	BT_DBG("level: %d", *level);

	err = bt_mesh_model_send(model, ctx, msg, NULL, NULL);
	if (err) {
		BT_ERR("Send status failed");
	}

	os_mbuf_free_chain(msg);
	return err;
}

四、资料获取

通过点击以下链接,您可以获取BLE Mesh模块原理图、源代码以及开发资料。链接地址将为您提供详细的文件资料,以供您进行参考和使用。

如果您在使用过程中遇到任何问题或疑虑,欢迎加我QQ ,一起探讨技术问题,我的QQ号是986571840,加的时候请注明CSDN。

BLE Mesh蓝牙组网模块 - 硬创社 (jlc.com)icon-default.png?t=N7T8https://x.jlc.com/platform/detail/001d23cba7b64b0d9df5b9b69720fadb

感谢各位用户点赞、分享、在看,这些行为让知识得以更加广泛地传播,从而让更多人受益。

请在转载作品时注明出处,严禁抄袭行为。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/297260.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UE5 VR版增强输入初体验 官方模板学习

问题 我们传统的输入方式,是通过编辑器设置输入操作映射,然后BindAction和BindAxis绑定 这边插播一条增强输入知识点,参考知乎大佬文章 和增强输入的VR模板教学:如何使用VR模板在UE5中使用增强输入系统_哔哩哔哩_bilibili 实践操…

Agilent安捷伦E4407B频谱分析仪26.5GHz

E4407B是安捷伦ESA-E系列频谱分析仪,它是一款能够适应未来需要的中性能频谱分析仪解决方案。该系列在测量速度、动态范围、精度和功率分辨能力上,都为类似价位的产品建立了性能标准。其灵活的平台设计使得研发、制造和现场服务工程师能够自定义产品&…

输电线路分布式故障诊断装置的应用-深圳鼎信

输电线路分布式故障诊断装置是一种利用分布式行波法实现故障定位的设备,它的应用场景、类型和功能特点如下: 一、应用场景 分布式故障定位装置适用于各种复杂环境的高压输电线路,例如三跨线路(跨越铁路、一级及以上公路和重要输…

利用注解和反射处理方法级别的逻辑

1. 定义自定义注解 首先,我们定义一个自定义注解 MyAnnotation,用于标记需要特殊处理的方法。该注解具有一个 value 属性,表示方法的标识。 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java…

Cannot resolve property ‘driverClassName‘

已解决 Cannot resolve property 错误 最近在学习spring时遇到了下面的问题: spring读取不到property的name属性,报红,编译不通过,上网查到了两种解决方案,如下: 1、重新加载spring文件就可以解决问题了&a…

机器学习-基于attention机制来实现对Image Caption图像描述实验

机器学习-基于attention机制来实现对Image Caption图像描述实验 实验目的 基于attention机制来实现对Image Caption图像描述 实验内容 1.了解一下RNN的Encoder-Decoder结构 在最原始的RNN结构中,输入序列和输出序列必须是严格等长的。但在机器翻译等任务中&…

计算机毕业设计-----SSM宠物商城带后台管理系统

项目介绍 该项目为前后台项目,分为普通用户与管理员两种角色,前台普通用户登录,后台管理员登录; 用户角色包含以下功能: 加入购物车,发表留言,提交订单,查看订单信息,会员注册,登录页面等功能。 管理员角色包含以下…

python爬虫,简单的requests的get请求,百度搜索实例

1、百度搜索实例 import requests url = https://www.baidu.com/s? # key_word = 迪丽热巴 key_word = input(输入搜索内容:) headers = {User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36 } …

DS|静态查找

题目一:DS静态查找 -- 顺序查找 题目描述: 给出一个队列和要查找的数值,找出数值在队列中的位置,队列位置从1开始 要求使用带哨兵的顺序查找算法 输入要求: 第一行输入n,表示队列有n个数据 第二行输入…

PySimpleGUI图形界面实例|PDF表格转换Excel文件

实例要求: 使用PySimpleGUI做一个把单位考勤系统导出的pdf文件合并输出Excel的应用,故事出自:https://hannyang.blog.csdn.net/article/details/135395946 当时时间紧,没有好好做界面且输出csv文件了事。今天趁周六休息&#xf…

linux中最常用的用户信息命令

文章目录 linux中最常用的用户信息命令还有谁 last语法一般使用方法查看最近登陆的三个用户省略hostname显示最后一列显示主机IP地址 我是谁 whoami谁?who默认使用系统的运行时间显示表头信息显示登录的人员及总数 什么?谁?w (who & what…

Demo:基于elementplus的弹窗嵌套表单进行二次封装

基于elementplus的弹窗嵌套表单进行二次封装 所见即所得&#xff1a;简单封装方便工作 ProForm.vue代码&#xff1a; <!--* Author: 忆往昔* LastEditTime: 2024-01-6 14:36:00* email: 15871856064163.com --> <template><div class"penk-form-contain…

【SpringBoot实战专题】「开发实战系列」全方位攻克你的技术盲区之Spring定义Jackson转换Null的方法和实现案例

Spring自动定义Jackson转换Null得方法 背景MessageConverter 使用Jackson原生方式处理空字段&#xff08;次重点方案&#xff09;ObjectMapper的配置选项通过使用注解的方式 MappingJackson2HttpMessageConverter&#xff08;重点方案&#xff09;创建MappingJackson2HttpMessa…

WebStorm 创建一个Vue项目

一、下载并安装WebStorm 步骤一 步骤二 选择激活方式 激活码&#xff1a; I2A0QUY8VU-eyJsaWNlbnNlSWQiOiJJMkEwUVVZOFZVIiwibGljZW5zZWVOYW1lIjoiVU5JVkVSU0lEQURFIEVTVEFEVUFMIERFIENBTVBJTkFTIiwiYXNzaWduZWVOYW1lIjoiVGFvYmFv77yaSkVU5YWo5a625qG25rAIOa0uW3peS9nOWup…

Easycode模板,基于官方提供的Mybatis-plus模板改造

目录结构 模板亮点 1、接口类默认继承实体类 实体类不做任何修改保证类与表统一 2、实体类涵盖多种注解 日期格式编码、Long类型转String、字段自动填充 3、自带insertOrUpdateBatch方法 导入方式 {"author" : "Wsong","version" : "1.2.8…

SpringBoot+RocketMQ集群(dledger)部署完整学习笔记

文章目录 前言一、单台集群部署二、多台集群部署1.修改配置2.dashboard修改 三、整合springboot1.引入pom和修改yml2.编写消费者3.编写生产者4.测试效果 总结 前言 RocketMQ集群方式有好几种 官网地址 https://rocketmq.apache.org/zh/docs/4.x/deployment/01deploy 2m-2s-asy…

ATTCK视角下的信息收集:主机发现

目录 1、利用协议主动探测主机存活 利用ICMP发现主机 利用ARP发现主机 利用NetBIOS协议发现主机 利用TCP/UDP发现主机 利用DNS协议发现主机 利用PRC协议发现主机程序 2、被动主机存活检测 利用Browser主机探测存活主机 利用ip段探测主机存活 利用net命令探测主机存活…

unity C# 中通俗易懂LINQ使用案例

文章目录 1. 从数组或列表中查询元素**&#xff1a;2. **排序与分组**&#xff1a;3. **连接多个数据源**&#xff1a;4. **聚合操作**&#xff1a;5. **分页查询**&#xff1a;6. **多条件查询**&#xff1a;7. **转换和投影&#xff08;Select&#xff09;**&#xff1a;8. *…

jdbc源码研究

JDBC介绍 JDBC&#xff08;Java Data Base Connectivity,java数据库连接&#xff09;是一种用于执行SQL语句的Java API&#xff0c;可以为多种关系数据库提供统一访问&#xff0c;它由一组用Java语言编写的类和接口组成。 开发者不必为每家数据通信协议的不同而疲于奔命&#…

竞赛保研 基于深度学习的人脸专注度检测计算系统 - opencv python cnn

文章目录 1 前言2 相关技术2.1CNN简介2.2 人脸识别算法2.3专注检测原理2.4 OpenCV 3 功能介绍3.1人脸录入功能3.2 人脸识别3.3 人脸专注度检测3.4 识别记录 4 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度学习的人脸专注度…