目录
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等。?
Model Layer中的SIG model是一些标准的模型,用于实现典型的用户场景功能,如开关、传感器、灯光等。SIG model的实现主要包括以下几个方面:
下图展示了设备的一种元素模型结构,该设备具体实现了一个服务器模型(标记为设备C),具备相应的状态,并支持以下消息:R、S、T、X、Y、Z。同时,该设备还包含两个实现客户端模型的设备,其中设备a主要支持消息X、Y和Z,而设备B则主要支持消息R、S、T和Z。
Model Layer的消息格式是由Access Layer定义的,主要包括两个部分:Opcode和Parameters。Opcode是一个1到3字节的字段,用于标识消息的类型和用途。Parameters是一个可选的字段,用于携带消息的具体内容,比如状态的值,目标的地址,操作的码等。不同的模型定义了不同的Opcode和Parameters,以实现各自的功能和状态。例如,Generic OnOff Server模型定义了以下三种消息:
Model Layer开关模型消息通信的过程是这样的:
/*源自开源协议栈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)https://x.jlc.com/platform/detail/001d23cba7b64b0d9df5b9b69720fadb
感谢各位用户点赞、分享、在看,这些行为让知识得以更加广泛地传播,从而让更多人受益。
请在转载作品时注明出处,严禁抄袭行为。