在开发蓝牙mesh系统中,使用泰凌微8258的蓝牙作为节点方案,本章讲解通过8258搭建普通mesh节点,ble mesh基础可以点这里
在vendor中存在多个应用实例,这里采用的工程是 mesh,支持代理与友谊节点,可直接编译
烧录mesh编译后的镜像,默认处于未配网状态,会进行周期性广播用于被网关(配网器)发现,mesh工程支持ble直连与adv广播两种配网方式
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
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
}
vendor/common/generic_model.c
中,通过SIG cmd判断是否进入mesh_cmd_sig_func对应的回调;参照收包流程图中,如G_ONOFF_SET则执行mesh_cmd_sig_g_onoff_set(),在用户上层通过light_transition_proc实现灯光渐变效果vendor/common/vendor_model.c
中,同理通过SIG cmd来判断进入mesh_cmd_vd_func相对应的回调; 用户可以自己添加opcode,并添加回调函数0xE0~0xFF
在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)进行通信测验