蓝牙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_PROVuuid_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},//新增opcodeCMD_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:在调试过程中,对工程进行了比较多的裁剪和修改,有源码诉求的同学可以私信索要哦
蓝牙mesh系统开发二 mesh节点开发相关推荐
- Android 10.0 关机对话框UI定制化开发(二)
1.概述 在10.0的定制化开发中,需要对关机对话框的UI界面进行定制化开发,需要对话框全屏,去掉多余项保留关机 重启 飞行模式 静音模式等选项 现在开始定制化二的开发 实现关机 重启 飞行模式 静音 ...
- 【Android系统蓝牙开发】蓝牙基础知识-蓝牙核心系统架构
什么是蓝牙? 在开启基于蓝牙Spec v5.2的学习前,我们先了解下什么是蓝牙?蓝牙在我们日常生活中又存在哪些实际应用呢? 蓝牙无线技术是一种短距离无线通信系统,其核心特性主要是以下三点: robus ...
- 在 Kubernetes 实施混沌工程—— Chaos Mesh® 原理分析与控制面开发
Chaos Mesh® 是由 TiDB 背后的 PingCAP 公司开发,运行在 Kubernetes 上的混沌工程(Chaos Engineering)系统.简而言之,Chaos Mesh® 通过运 ...
- nRF52 Mesh开发 (3) MESH Sensor Server/Client Models详解与实现
MESH Sensor Model 实现 MESH Spec规定的 Sensor Model 标准 传感器状态 传感器描述 传感器参数设置 传感器cadence 传感器数据 传感器可发送和接收的消息 ...
- linux服务器开发二(系统编程)--线程相关
线程概念 什么是线程 LWP:Light Weight Process,轻量级的进程,本质仍是进程(在Linux环境下). 进程:独立地址空间,拥有PCB. 线程:也有PCB,但没有独立的地址空间(共 ...
- wincc报表日报表实例_工作系统二次开发二Python加工原膜切割日报表数据实例
#工作系统二次开发二Python加工原膜切割日报表数据实例 #当查询一个或多个工作令后在表格展示数据前按要求对数据进行二次处理,处理要求看如下 #1.加工单号和母卷物料编号相同则把除第一行外的领料有关 ...
- EBS系统扫二维码登录开发
EBS系统扫二维码登录开发 INTRODUCTION介绍 二维码扫码登录的逻辑 INTRODUCTION介绍 目前对ERP系统的安全性提了很高的要求,其中一块就是要保证ERP用户登录系统的安全性. 之 ...
- erp二次开发与java web_什么是erp系统的二次开发?
不少erp供应商在客户咨询的时候都将能提供二次开发作为自己软件的优势之一进行介绍,那么到底什么是erp系统的二次开发呢?又是哪些原因导致了erp系统需要进行二次开发? 一.erp系统二次开发的含义 具 ...
- 开源系统_二次开发(转)
转自http://www.phpchina.com/portal.php?mod=view&aid=40204, 更多详细资料请参看原文 最好最实用的二次开发教程 ◆二次开发 什么是二次开发? ...
最新文章
- ucosii事件控制块------消息邮箱与消息队列
- BootStrap的下载及使用方法
- 电子书下载|2020 年云原生年货小红书来啦!
- FFmpeg中实现对多媒体信息的获取与打印av_dump_format
- Html5音乐可视化之音乐的获取和播放
- 域名怎么绑定ip_服务器怎么绑定域名?
- BZOJ2818-莫比乌斯反演/欧拉函数
- java hash取余_为什么Java的hash表的长度一直是2的指数次幂?为什么这个(hash(h-1)=hash%h)位运算公式等价于取余运算?...
- Linux: terminal 终端生存指南
- 12月25日服务器例行维护公告,12月25日维护公告 技能修改测试
- NodeJS开源项目
- Picasso,Glide,Fresco对比分析
- 没学过JavaScript也能看懂的闭包解释
- 《机器学习》周志华,勘误修订(带公式显示)
- SublimeText 3 高亮 MATLAB语法
- Python(六)基于 TCP/UDP 协议通信的简单套接字编程
- ZIP RAR文件密码破解软件ARCHPR Pro4.54(绿色中文破解版)
- 你的程序员是在努力工作还是在偷懒?
- 企业网站网络营销的第一印象
- 网考英语和计算机范围,中考英语听说机考周六首考,考生要依据计算机提示作答...
热门文章
- 基于龙伯格观测器的永磁同步电机仿真与实现
- SpringBoot项目实现图片上传,并可以在浏览器上显示
- Java基础篇(标识符、关键字、数据类型、运算符、类型转换、注释方法、扫描器)
- 涵盖网站基本使用的正则表达式的验证方法.cs
- vue列表拖拽组件 vue-dragging
- Spark 2.3.0 用户自定义聚合函数UserDefinedAggregateFunction和Aggregator
- postman断言示例:Response body:Contains string
- 响应式编程(一)什么是响应式编程
- 从历次升级看以太坊协议的演化
- Keras指定使用GPU运算