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

发布时间:2024年01月05日

目录

一、什么是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

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

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

文章来源:https://blog.csdn.net/LONGSHEN1/article/details/135407617
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。