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

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

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

  • 23
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芯航路IOT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值