前言
在开发蓝牙mesh系统中,使用泰凌微8258的蓝牙作为节点方案,本章讲解通过8258搭建普通mesh节点,ble mesh基础可以点这里
SDK获取
下载SIG MESH SDK
mesh项目工程
在vendor中存在多个应用实例,这里采用的工程是 mesh,支持代理与友谊节点,可直接编译
广播
烧录mesh编译后的镜像,默认处于未配网状态,会进行周期性广播用于被网关(配网器)发现,mesh工程支持ble直连与adv广播两种配网方式
PB-GATT
-
BLE直连后进行配网,使用GATT服务
-
连接后可以看到代理配网服务
PB-ADV
- 使用广播信道配网
工程配置
使能log打印
- 系统默认是关系打印调试的,在
app_config_8258.h
使能宏HCI_LOG_FW_EN后通过接口LOG_USER_MSG_INFO进行打印
#define HCI_LOG_FW_EN
#ifndef HCI_LOG_FW_EN
#define HCI_LOG_FW_EN (0 || DEBUG_LOG_SETTING_DEVELOP_MODE_EN)
#if HCI_LOG_FW_EN
#if (MESH_USER_DEFINE_MODE == MESH_IRONMAN_MENLO_ENABLE)
#define DEBUG_INFO_TX_PIN (PCBA_8258_SEL == PCBA_8258_C1T140A3_V1_1 ? GPIO_PB6 : GPIO_PD7)
#else
#define DEBUG_INFO_TX_PIN GPIO_PB2
#endif
#define PRINT_DEBUG_INFO 1
#endif
#endif
app_mesh.h
中可以设置TL_LOG_LEVEL选择打印等级
#if (TL_LOG_LEVEL >= TL_LOG_LEVEL_ERROR)
#define LOG_MSG_ERR(module,pbuf,len,format,...) do{int val; val = (LOG_MSG_FUNC_EN(1,module) && tl_log_msg(LOG_GET_LEVEL_MODULE(TL_LOG_LEVEL_ERROR,module),pbuf,len,format,__VA_ARGS__));}while(0)
#else
#define LOG_MSG_ERR(module,pbuf,len,format,...)
#endif
#if (TL_LOG_LEVEL >= TL_LOG_LEVEL_WARNING)
#define LOG_MSG_WARN(module,pbuf,len,format,...) do{int val; val = (LOG_MSG_FUNC_EN(0,module) && tl_log_msg(LOG_GET_LEVEL_MODULE(TL_LOG_LEVEL_WARNING,module),pbuf,len,format,__VA_ARGS__));}while(0)
#else
#define LOG_MSG_WARN(module,pbuf,len,format,...)
#endif
#if (TL_LOG_LEVEL >= TL_LOG_LEVEL_INFO)
#define LOG_MSG_INFO(module,pbuf,len,format,...) do{int val; val = (LOG_MSG_FUNC_EN(0,module) && tl_log_msg(LOG_GET_LEVEL_MODULE(TL_LOG_LEVEL_INFO,module),pbuf,len,format,__VA_ARGS__));}while(0)
#else
#define LOG_MSG_INFO(module,pbuf,len,format,...)
#endif
#if (TL_LOG_LEVEL >= TL_LOG_LEVEL_DEBUG)
#define LOG_MSG_DBG(module,pbuf,len,format,...) do{int val; val = (LOG_MSG_FUNC_EN(0,module) && tl_log_msg(LOG_GET_LEVEL_MODULE(TL_LOG_LEVEL_DEBUG,module),pbuf,len,format,__VA_ARGS__));}while(0)
#else
#define LOG_MSG_DBG(module,pbuf,len,format,...)
#endif
识别码Device UUID
- 前期开发为了能让网关识别到指定设备,并自动对其进行配网,可将device uuid中加入特定编码方式;这里在UUID中加入mac信息,具体策略可以自己拟定
void uuid_create_by_mac(u8 *mac,u8 *uuid)
{
// test md5 function part
/*
static char name_string[]="www.widgets.com";
uuid_create_md5_from_name((uuid_mesh_t *)uuid, NameSpace_DNS, name_string, 15);
*/
uuid_mesh_t NameSpace_DNS = { /* 6ba7b810-9dad-11d1-80b4-00c04fd430c8 */
0x6ba7b810,
0x9dad,
0x11d1,
0x80, 0xb4,
{0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8}
};
char name_string[16] = {0};
memcpy(name_string,mac,6);
uuid_create_md5_from_name((uuid_mesh_t *)uuid, NameSpace_DNS, name_string, 15);
//special proc to set the mac address into the uuid part
#if 1//MD_REMOTE_PROV
uuid_mesh_t * p_uuid = (uuid_mesh_t * )uuid; //加入mac信息到uuid部分中
memcpy(p_uuid->node,mac,6);
printf("set mac into uuid part!\n");
#endif
}
模型配置
模型分为通用模型与厂家模型
通用模型 generic model
- 在文件
vendor/common/generic_model.c
中,通过SIG cmd判断是否进入mesh_cmd_sig_func对应的回调;参照收包流程图中,如G_ONOFF_SET则执行mesh_cmd_sig_g_onoff_set(),在用户上层通过light_transition_proc实现灯光渐变效果
厂家模型 vendor model
- 接口在文件
vendor/common/vendor_model.c
中,同理通过SIG cmd来判断进入mesh_cmd_vd_func相对应的回调; 用户可以自己添加opcode,并添加回调函数 - Vendor model的op code总共有64个,留给用户开发的从
0xE0~0xFF
发包流程与函数
- 发送接口
- mesh_tx_cmd2normal_primary():符合SIG mesh协议,节点间进行通信发包
- bls_att_pushNotifyData():直连节点发给master,无mesh功能,一般不用
收包流程
- adv_bear接收数据会在app_event_handler中处理;att表在my_Attributes中定义
新增Vendor model
在vendor/common/vendor_model.c
厂家模型中新增opcode,并添加回调函数,暂不进行数据处理
#define VD_SENSOR_SET 0xF0// opcode 0xE0 ~ 0xFF(op code)
//回调数据打印
int cb_vd_sensor_set(u8 *par, int ac_len, mesh_cb_fun_par_t *cb_par)
{
printf("srcadr = %X dstadr = %X modelId = %X\n",cb_par->adr_src, cb_par->adr_dst, cb_par->model_idx);
uint8_t dataBuf[32];
for(int i = 0; i < ac_len; i++)
{
sprintf(&dataBuf[i*2], "%02X", par[i]);
}
printf("length[%d]:%s \n",ac_len,dataBuf);
}
mesh_cmd_sig_func_t mesh_cmd_vd_func[] = {
CMD_NO_STR{VD_SENSOR_SET, 0, VENDOR_MD_LIGHT_C, VENDOR_MD_LIGHT_S, cb_vd_sensor_set, STATUS_NONE},//新增opcode
CMD_NO_STR(VD_RC_KEY_REPORT, 0, VENDOR_MD_LIGHT_C, VENDOR_MD_LIGHT_S, cb_vd_key_report, STATUS_NONE),
CMD_NO_STR(VD_GROUP_G_SET, 0, VENDOR_MD_LIGHT_C, VENDOR_MD_LIGHT_S, cb_vd_group_g_set, VD_GROUP_G_STATUS),
CMD_NO_STR(VD_GROUP_G_GET, 0, VENDOR_MD_LIGHT_C, VENDOR_MD_LIGHT_S, cb_vd_group_g_get, VD_GROUP_G_STATUS),
CMD_NO_STR(VD_GROUP_G_SET_NOACK, 0, VENDOR_MD_LIGHT_C, VENDOR_MD_LIGHT_S, cb_vd_group_g_set, STATUS_NONE),
CMD_NO_STR(VD_GROUP_G_STATUS, 1, VENDOR_MD_LIGHT_S, VENDOR_MD_LIGHT_C, cb_vd_group_g_status, STATUS_NONE),
USER_MESH_CMD_VD_ARRAY
};
测试验证
mesh工程支持BLE代理功能,可以使用APP(nRF Mesh)进行通信测验
-
扫描到设备
-
配网
-
发送测试
- PS:在调试过程中,对工程进行了比较多的裁剪和修改,有源码诉求的同学可以私信索要哦