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

前言

在开发蓝牙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:在调试过程中,对工程进行了比较多的裁剪和修改,有源码诉求的同学可以私信索要哦
  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
iOS蓝牙Mesh开发是指在iOS系统中使用蓝牙Mesh技术进行开发蓝牙Mesh是一种用于无线网络通信的技术,它基于蓝牙低功耗(Bluetooth Low Energy,BLE)标准,并支持多对多的网络连接。通过使用蓝牙Mesh,可以实现设备间的直接通信,而无需通过传统的中心设备来中转数据。 在iOS蓝牙Mesh开发中,开发者可以利用iOS系统提供的CoreBluetooth框架来实现蓝牙Mesh的功能。CoreBluetooth框架提供了一系列API,可以用于扫描、连接和通信等操作。开发者可以使用这些API与蓝牙Mesh设备进行通信,并实现各种功能,如设备发现、数据传输、网络配置等。 在进行iOS蓝牙Mesh开发时,需要特别注意以下几点: 1. 版本要求:要使用蓝牙Mesh功能,需要iOS 11及以上的版本。 2. 硬件支持:要使用蓝牙Mesh功能,需要确保设备支持蓝牙4.0及以上版本。 3. 学习Mesh协议:蓝牙Mesh开发需要了解蓝牙Mesh协议的相关知识,如网络拓扑结构、节点之间的通信方式等。 4. 设备兼容性:不同厂商的设备对蓝牙Mesh的支持程度可能有所不同,需要考虑设备的兼容性。 总体来说,iOS蓝牙Mesh开发可以用于构建无线传感器网络、智能家居和物联网等应用。开发者可以根据具体需求,利用iOS系统提供的CoreBluetooth框架实现各种功能,并通过蓝牙Mesh技术实现设备间的直接通信。这将为用户带来更好的体验和更广泛的应用场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值