热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

蓝牙Mesh开发六ESP32蓝牙MeshWifi共存(浅析)

背景上一章节用到了低功耗的Ble蓝牙来开发mesh低功耗的应用,但是需要接入网络还需要一个网关。ESP32已经支持了蓝牙Mesh和WIFI协议栈,但是

背景

上一章节用到了低功耗的Ble蓝牙来开发mesh低功耗的应用,但是需要接入网络还需要一个网关。ESP32已经支持了蓝牙Mesh和WIFI协议栈,但是其硬件基础上仅单天线,并且受限其有限的资源;而令人叫喜的是,IDF4.2版本已经很好的支持共存,虽然目前仅只有Wi-Fi STA模式下支持共存,但是通过增加PSRAM可有效提高了BLE WIFI共存模式的数据吞吐率(1Mbps),作为BLE MESH的网关就在好不过
如有异议,欢迎留言指正


功能设计

网关发现未配网设备广播后,网关使能配网器功能将其配置到mesh网络中,并建立友谊连接,通过mqtt协议与云端进行交互
在这里插入图片描述


工程实例

共存的工程实例可以参考esp-idf\examples\bluetooth\esp_ble_mesh\ble_mesh_wifi_coexist


配置器配置


使能PSRAM

需要通过idf.py menuconfig配置器配置PSRAM(主要是提高吞吐率),可以参考上一篇博文
允许LWIP的内存在PSRAM中分配(给应用释放资源)
在这里插入图片描述


使能WIFI蓝牙共存

在这里插入图片描述


BLE扫描全窗

在这里插入图片描述


BLE使用动态内存

在这里插入图片描述


使能友谊功能

可以配置友谊功能节点的接收窗口、队列、支持的节点等相关参数
在这里插入图片描述


初始化BLE Mesh


配网功能

移植配网器的例程 examples\bluetooth\esp_ble_mesh\ble_mesh_provisioner,针对匹配的UUID未配网设备进行配网
这里也可以直接使用普通节点功能代码,后续通过代理来进行配网

uint8_t match[2] = {0xdd, 0xdd}; //uuid
.... //省略
err = esp_ble_mesh_provisioner_set_dev_uuid_match(match, sizeof(match), 0x0, false);//匹配uuid
if (err != ESP_OK) {ESP_LOGE(TAG, "Failed to set matching device uuid (err %d)", err);return err;
}

配置元素与模型

参考vendor_model例程,添加服务模型;(也可以使用客户端模型例程 )

static esp_ble_mesh_model_t root_models[] = {//根模型即配置模型ESP_BLE_MESH_MODEL_CFG_SRV(&config_server),
};
static esp_ble_mesh_model_op_t vnd_op[] = { //opcode 命令码ESP_BLE_MESH_MODEL_OP(ESP_BLE_MESH_VND_MODEL_OP_SEND, 2),ESP_BLE_MESH_MODEL_OP_END,
};
static esp_ble_mesh_model_t vnd_models[] = {//厂家模型(02E5 0001)ESP_BLE_MESH_VENDOR_MODEL(CID_ESP, ESP_BLE_MESH_VND_MODEL_ID_SERVER,vnd_op, NULL, NULL),
};
static esp_ble_mesh_elem_t elements[] = { //元素【根模型 + 厂家模型】ESP_BLE_MESH_ELEMENT(0, root_models, vnd_models),//仅一个主元素
};
static esp_ble_mesh_comp_t composition = { //填充数据.cid = CID_ESP,.elements = elements,.element_count = ARRAY_SIZE(elements),
};

乐鑫从SIG申请的厂家ID为0x02E5

#define CID_ESP 0x02E5

mesh通信数据

接收消息回调,需要在mesh初始化时注册回调

static void example_ble_mesh_custom_model_cb(esp_ble_mesh_model_cb_event_t event,esp_ble_mesh_model_cb_param_t *param)
{switch (event) {case ESP_BLE_MESH_MODEL_OPERATION_EVT: //收到节点消息事件if (param->model_operation.opcode == ESP_BLE_MESH_VND_MODEL_OP_SEND) {//匹配命令码//uint16_t tid = *(uint16_t *)param->model_operation.msg; nodeBuf[param->model_operation.length] = '\0'; memcpy(nodeBuf, param->model_operation.msg, param->model_operation.length);//备份数据ESP_LOGI(TAG, "recv = %s \n",nodeBuf);//打印消息
/* esp_err_t err = esp_ble_mesh_server_model_send_msg(&vnd_models[0],param->model_operation.ctx, ESP_BLE_MESH_VND_MODEL_OP_STATUS,sizeof(tid), (uint8_t *)&tid);//返回消息if (err) {ESP_LOGE(TAG, "Failed to send message 0x%06x", ESP_BLE_MESH_VND_MODEL_OP_STATUS);}
*/
}break;case ESP_BLE_MESH_MODEL_SEND_COMP_EVT://发送完成事件if (param->model_send_comp.err_code) {ESP_LOGE(TAG, "Failed to send message 0x%06x", param->model_send_comp.opcode);break;}ESP_LOGI(TAG, "Send 0x%06x", param->model_send_comp.opcode);break;default:break;}
}

wifi配置

使用共存例程里面的wifi station配置

void config_wifi_station(void)
{wifi_config_t wifi_config ={.sta = {.ssid = EXAMPLE_ESP_WIFI_SSID,//.password = EXAMPLE_ESP_WIFI_PASS,//.pmf_cfg = {.capable = true,.required = false},},};ESP_ERROR_CHECK(esp_netif_init());ESP_ERROR_CHECK(esp_event_loop_create_default());esp_netif_t *sta_netif = esp_netif_create_default_wifi_sta();ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler, NULL));ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &ip_event_handler, NULL));wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();ESP_ERROR_CHECK( esp_wifi_init(&cfg) );ESP_ERROR_CHECK( esp_wifi_set_ps(WIFI_PS_MIN_MODEM) ); //必须配置 must call this;ESP_ERROR_CHECK( esp_wifi_set_storage(WIFI_STORAGE_RAM) );ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_STA) );ESP_ERROR_CHECK( esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config) );ESP_ERROR_CHECK( esp_wifi_start() );ESP_ERROR_CHECK( esp_wifi_connect() );
}

云端上传

移植的mqtt的例程

msg_id = esp_mqtt_client_publish(client, "/gwedYwAc0FA/meshDevice001/user/temp_value", nodeBuf, 0, 1, 0);
ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id);

总结


  1. 测试中两个低功耗节点每定时发送一次环境温度的消息到网关,再由网关在上报到某里云上,测试数据量不大,未有数据丢失的情况
    在这里插入图片描述

  2. ESP32使用代理配网时,如果此时在进行wifi数据通信,配网时间相对时间会变长


推荐阅读
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 【工具篇】抓包中的王牌工具—Fiddler (1环境搭建)
    本文介绍了抓包工具Fiddler的概述,包括其功能、选择原因和安装方法。Fiddler是一款免费且功能强大的抓包工具,可用于网络代理、接口测试、安全测试和WEB调试等。安装配置简单,上手快速,适合新手使用。详细的安装地址为https://www.telerik.com/download/fiddl。 ... [详细]
  • Linux配置IP地址大全
    IP地址配置方法一:编辑配置文件#编辑网卡参数[roottest~]#vimetcsysconfignetwork-scriptsifcfg-ens331TYPEE ... [详细]
  • 视图分区_组复制常规操作网络分区amp;混合使用IPV6与IPV4 | 全方位认识 MySQL 8.0 Group Replication...
    网络分区对于常规事务而言,每当组内有事务数据需要被复制时,组内的成员需要达成共识(要么都提交,要么都回滚)。对于组成员资格的变更也和保持组 ... [详细]
  • 跑虚拟机的服务器要求:宿主机的BIOS开启VT支持,这样宿主机才能运行64位虚拟机。安装VmwarePlayer或者Workstation,或者vmwareESX。虚拟机要求(建议使用vmware ... [详细]
  • 从零开始的ESP8266探索(15)WiFi其他方法和WiFi事件响应
    文章目录目的WiFi其他方法WiFi事件响应事件列表注册事件使用示例总结目的WiFi在使用过程中并非会一直如希望般稳定运行的,为了应对这些情况就需要能够了解WiFi ... [详细]
  • 最近公司网络变更。原来的主机所在的网段也换成统一的了。svn服务主机地址对应也要修改。一直不喜欢用svn客户端,但是很少接触到更换地址的场景。今天刚好遇到了,顺带做个总结。(mac版 ... [详细]
  • 在我们第一次启动MongoDB的时候,仅仅是制定了data数据目录和log日志目录,并没有指定--auth选项,也就是并不需要认证。[root@VM-0-14-centosmongo_27017]#mongoMongoDBshellversio ... [详细]
  • android获取wifi列表_如何获取设备唯一识别码IMEI和Mac地址
    下面这个工具类提供了一些方法,可以获取设备AndroidID、IMEI、序列号、以及由他们组成的唯一识别码、网卡的MAC地址、蓝牙MAC地址。代码如下: ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了MySQL安装(windows版本)相关的知识,希望对你有一定的参考价值。1.下载.MyS ... [详细]
  • 基于Redis实现分布式锁剖析
    之前的文章《分布式锁详解-分别利用Zookeeper和数据库实现分布式锁》,由于篇幅太长,又碰上加班时间不够充裕,所以没有把Redis的实 ... [详细]
author-avatar
Bd专业8楼nv
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有