蓝牙mesh组网的概念
相关概念和术语参考文献:
https://www.bluetooth.com/learn-about-bluetooth/feature-enhancements/mesh/mesh-glossary/
建议先学习下相关理论,了解蓝牙组网的模式以及和其他组网方式的区别,以及蓝牙组网的发展历史有助于理解蓝牙mesh组网的技术。
BL618蓝牙mesh样例
在工程example中btble中有ble_mesh_cli的样例就是使用bl618蓝牙mesh组网样例,该样例是将bl618蓝牙作为从机接入网络,而手机的APP作为节点来连接各个从机设备,在这个样例中可以多个bl618烧写这个程序进行组网。在工程目录下有个README文件,该文件中介绍了如何设置手机APP进行蓝牙组网。中文版的配网过程在网页中:
https://bl-mcu-sdk.readthedocs.io/zh-cn/latest/samples/btble/blemesh.html
按照教程可以通过手机发送设置命令到bl618
多个BL618蓝牙mesh组网,BL618之间发送控制命令
在工程example中vmg0中有样例blemesh_simple,该样例可以进行蓝牙组网,组网方式类似与上面的ble_mesh_cli,区别地方在于该样例中各个BL618节点都可以发送控制指令到指定的节点地址(一对一),也可以指定组地址(一对多)。下面介绍下如何使用。
1、下载代码到BL618
进入example\vmg0\blemesh_simple,编译代码后下载程序到开发板,这里以两块BL618组网为例。将两块BL618下载好程序后,使用xshell连接开发板对应的串口,复位后,不需要输入命令就可以显示:
说明下载完成并启动成功了。如果不是第一次下载,之前配置过组网,会出现下面的界面
如果希望重新配置网络,不希望用之前的配置数据,那么在下载之前需要修改工程里面flash_prog_cfg.ini文件中erase = 2,这样下载时候会擦除全部的flash内容,就会将之前配置信息全部擦除重新来,由于会全部擦除flash,下载的速度会慢了一点。如果配网信息不用改变,那么可以直接在手机上连接BL618了。启动两块BL618(可以多个)。
2、手机连接BL618组网
在工程目录下有Bouffalo_Mesh_v1.0_20211118.apk,使用安卓手机安装该软件。打开软件后
点击添加节点:
点击其中一个进入,选择鉴定,下一步 点击规定,点击好:
另一个设备也是这样添加。这样在网络中就有两个设备了。
选择其中一个进行配置,另一个也是一样的操作。
进入后,点击分子下的小箭头,展开
框中的两项分别点开做同样的操作,首先点开Generic On Off Server:
选择绑定密钥,选择第一个密钥。同样点开Generic On Off Client进行密钥绑定。
同样的操作在另一个BL618进行操作。
这样两个BL618和手机就组成了一个网络。还可以将两个BL618组在一个组中,这样可以群发控制信息给组里面的BL618。只需要在刚刚Generic On Off Server设置界面中,点击订阅就可以将BL618加入到一个组中:
组好网络后可以进行控制了。
3、设备控制
在手机端可以在组成的组中对组内的BL618进行控制,也可以单独对设备控制,这部分在https://bl-mcu-sdk.readthedocs.io/zh_CN/latest/samples/components/ble_mesh.html网页中有演示。
如何使用BL618对另一个BL618进行控制呢?例如现在的网络里面有两个BL618设备,两个的地址分别是2和3如图:
我们在xshell中打印的信息中也可以看到对应的地址,如图:
现在我想使用地址为2的设备向地址为3的设备发送控制信号,那么只需要在地址2号的窗口中输入命令:
gen_cli_send 3 命令名称为gen_cli_send 参数是发送的地址,找个地址可以是设备地址,发送到设备,也可以是组地址,发送控制到组设备中,所有设备可以收到控制命令。
如果发送控制到组的地址中。那么组里面所有的设备都会被控制:
点击组,点开组后会有组的地址:
这里组地址为0xC000,发送到该地址:
组里面的设备就会收到控制信息。多个BL618就更明显了。这里就不作演示了。
代码解释
在工程中其中发送的命令gen_cli_send在工程的gen_onoff.c中,可以参照这部分代码实现发送。
void cmd_gen_cli_send(int argc, char **argv)
{
int err;
if(argc != 2){
printf("Number of Parameters is not correct\r\n");
return;
}
struct bt_mesh_model *p_mdl = NULL;
struct bt_mesh_msg_ctx ctx = {
.app_idx = 0,
.net_idx = 0,
.addr = 0,
.send_ttl = 3,
};
get_uint16_from_string(&argv[1], &ctx.addr);
printf("Destination addr 0x%04x\r\n", ctx.addr);
static bt_mesh_generic_client_set_state_t gen_client_set;
gen_client_set.onoff_set.tid++;
gen_client_set.onoff_set.onoff = (gen_client_set.onoff_set.onoff+1)&0x01;
p_mdl = bt_mesh_model_find(bt_mesh_elem_find(0),
BT_MESH_MODEL_ID_GEN_ONOFF_CLI);
err = bt_mesh_gen_cli_set_state(p_mdl, &ctx, BLE_MESH_MODEL_OP_GEN_ONOFF_SET_UNACK, &gen_client_set);
if(err){
printf("Set error [%d].", err);
}
}
接收部分的代码在mesh.c中,代码在186行注册了回调函数model_gen_cb,
mesh_gen_srv_callback_register(model_gen_cb);
这个函数会在收到控制信息时会打印value的值:
void model_gen_cb(uint8_t value)
{
printf("value=%d\r\n",value);
}
至此BL618之间,手机和BL618就可以进行控制。