蓝牙mesh系统开发二 mesh节点开发

前言

在开发蓝牙mesh系统中,使用泰凌微8258的蓝牙作为节点方案,本章讲解通过8258搭建普通mesh节点,ble mesh基础可以点这里

SDK获取
下载SIG MESH SDK

在这里插入图片描述

mesh项目工程

在vendor中存在多个应用实例,这里采用的工程是 mesh,支持代理与友谊节点,可直接编译
蓝牙mesh系统开发二 mesh节点开发_第1张图片

广播

烧录mesh编译后的镜像,默认处于未配网状态,会进行周期性广播用于被网关(配网器)发现,mesh工程支持ble直连与adv广播两种配网方式

PB-GATT
  • BLE直连后进行配网,使用GATT服务
    蓝牙mesh系统开发二 mesh节点开发_第2张图片

  • 连接后可以看到代理配网服务
    蓝牙mesh系统开发二 mesh节点开发_第3张图片

PB-ADV
  • 使用广播信道配网
    蓝牙mesh系统开发二 mesh节点开发_第4张图片
工程配置
使能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
}
模型配置

模型分为通用模型与厂家模型
蓝牙mesh系统开发二 mesh节点开发_第5张图片

通用模型 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功能,一般不用
      蓝牙mesh系统开发二 mesh节点开发_第6张图片
收包流程
  • adv_bear接收数据会在app_event_handler中处理;att表在my_Attributes中定义
    蓝牙mesh系统开发二 mesh节点开发_第7张图片
新增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)进行通信测验

  • 扫描到设备
    蓝牙mesh系统开发二 mesh节点开发_第8张图片

  • 配网
    蓝牙mesh系统开发二 mesh节点开发_第9张图片

  • 发送测试
    蓝牙mesh系统开发二 mesh节点开发_第10张图片

蓝牙mesh系统开发二 mesh节点开发_第11张图片

  • PS:在调试过程中,对工程进行了比较多的裁剪和修改,有源码诉求的同学可以私信索要哦

你可能感兴趣的:(ble,mesh,8258,ble,mesh,ble,mesh系统)