ESP32/8266使用painlessMesh库实现mesh

ESP32/8266使用painlessMesh库实现mesh

测试了esp的mesh通信,使用的平台是PIO,基于Arduino。
最终实现的结果是设置相同的ssid和pwd之后,可以互相传输数据,但存在问题:通信速率不高、存在中断的问题

  1. 使用VScode 的PIO平台,搜索painlessMesh的lib进行下载。

可以发现代码的原理还是很简单的,用的库也是简单,猜测其原理就是AP+不连接的通信

  1. 发射端代码:也不叫发射端,两个代码完全可以一样
#include "painlessMesh.h"

#define   MESH_PREFIX     "esp8266"
#define   MESH_PASSWORD   "12345678"
#define   MESH_PORT       5555

Scheduler userScheduler; // to control your personal task
painlessMesh  mesh;

// User stub
void sendMessage() ; // Prototype so PlatformIO doesn't complain

Task taskSendMessage( TASK_SECOND * 1 , TASK_FOREVER, &sendMessage );

char c[] = {'1', '2','3','4','5', '6', '7', '8', '9', '0'};
int i =0;

void sendMessage() {
  String msg = "Hello from node ";
  // msg += mesh.getNodeId();
  msg += c[(i++)%10];
  mesh.sendBroadcast( msg );
  // taskSendMessage.setInterval( random( TASK_SECOND * 1, TASK_SECOND * 5 ));
  taskSendMessage.setInterval(100);
}

// Needed for painless library
void receivedCallback( uint32_t from, String &msg ) {
  Serial.printf("startHere: Received from %u msg=%s\n", from, msg.c_str());
}

void newConnectionCallback(uint32_t nodeId) {
    Serial.printf("--> startHere: New Connection, nodeId = %u\n", nodeId);
}

void changedConnectionCallback() {
  Serial.printf("Changed connections\n");
}

void nodeTimeAdjustedCallback(int32_t offset) {
    Serial.printf("Adjusted time %u. Offset = %d\n", mesh.getNodeTime(),offset);
}

void setup() {
  Serial.begin(9600);

//mesh.setDebugMsgTypes( ERROR | MESH_STATUS | CONNECTION | SYNC | COMMUNICATION | GENERAL | MSG_TYPES | REMOTE ); // all types on
  mesh.setDebugMsgTypes( ERROR | STARTUP );  // set before init() so that you can see startup messages

  mesh.init( MESH_PREFIX, MESH_PASSWORD, &userScheduler, MESH_PORT );
  mesh.onReceive(&receivedCallback);
  mesh.onNewConnection(&newConnectionCallback);
  mesh.onChangedConnections(&changedConnectionCallback);
  mesh.onNodeTimeAdjusted(&nodeTimeAdjustedCallback);

  userScheduler.addTask( taskSendMessage );
  taskSendMessage.enable();
}

void loop() {
  // it will run the user scheduler as well
  mesh.update();
}
  1. 接收端代码
#include "painlessMesh.h"

#define   MESH_PREFIX     "esp8266"
#define   MESH_PASSWORD   "12345678"
#define   MESH_PORT       5555

Scheduler userScheduler; // to control your personal task
painlessMesh  mesh;

// User stub
void sendMessage() ; // Prototype so PlatformIO doesn't complain

Task taskSendMessage( TASK_SECOND * 1 , TASK_FOREVER, &sendMessage );

void sendMessage() {
  String msg = "Hello from node ";
  msg += mesh.getNodeId();
  mesh.sendBroadcast( msg );
  taskSendMessage.setInterval( random( TASK_SECOND * 1, TASK_SECOND * 5 ));
}

// Needed for painless library
void receivedCallback( uint32_t from, String &msg ) {
  Serial.printf("startHere: Received from %u msg=%s\n", from, msg.c_str());
}

void newConnectionCallback(uint32_t nodeId) {
    Serial.printf("--> startHere: New Connection, nodeId = %u\n", nodeId);
}

void changedConnectionCallback() {
  Serial.printf("Changed connections\n");
}

void nodeTimeAdjustedCallback(int32_t offset) {
    Serial.printf("Adjusted time %u. Offset = %d\n", mesh.getNodeTime(),offset);
}

void setup() {
  Serial.begin(115200);

//mesh.setDebugMsgTypes( ERROR | MESH_STATUS | CONNECTION | SYNC | COMMUNICATION | GENERAL | MSG_TYPES | REMOTE ); // all types on
  mesh.setDebugMsgTypes( ERROR | STARTUP );  // set before init() so that you can see startup messages

  mesh.init( MESH_PREFIX, MESH_PASSWORD, &userScheduler, MESH_PORT );
  mesh.onReceive(&receivedCallback);
  mesh.onNewConnection(&newConnectionCallback);
  mesh.onChangedConnections(&changedConnectionCallback);
  mesh.onNodeTimeAdjusted(&nodeTimeAdjustedCallback);

  userScheduler.addTask( taskSendMessage );
  taskSendMessage.enable();
}

void loop() {
  // it will run the user scheduler as well
  mesh.update();
}
  1. 一些bug

最气人的是,esp8266、esp32各种报错,这里的最重要的问题就是,使用好的usb线。换了线之后,一切都正常了。
通信的时候,即使设置成休眠100ms的通信方式,根本达不到10Hz的通信频率,并且偶尔会出现通信中断的问题。
图中会出现改变里连接的问题,不清楚是发射端的问题,还是接收端的问题。即使放的很近也是。当然放在远处也是差不多的(10m测试仍通信正常)。
既然是mesh,当然是多个也可以。三个的时候仍然正常通信,接收的频率也是差不多的,看来接收限制会不是很高。但是出现了接收着就卡住了。
多个的时候,接收端一个近一个远可以同时接收两个,但是两个都很远的时候,会出现同一时刻只能接收到一个。
还是会存在着,接收着就卡住了,哎~
bug图

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ESP8266UPnP是一个专门用于实现UPnP协议栈的Arduino,可以在ESP8266上方便地实现UPnP的各种功能,包括发现设备、解析设备描述文档、调用设备服务等。 下面是一个使用ESP8266UPnP实现发现设备功能的示例代码: ``` #include <ESP8266WiFi.h> #include <ESP8266UPnP.h> WiFiClient client; UPnPDevice device; void setup() { Serial.begin(115200); WiFi.begin("ssid", "password"); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.println("Connected to WiFi"); device.begin(client); device.searchRootDevice(); } void loop() { if (device.isSearching()) { device.loop(); } else { int n = device.getDeviceCount(); if (n > 0) { Serial.print("Found "); Serial.print(n); Serial.println(" devices"); for (int i = 0; i < n; i++) { Serial.println(device.getDeviceType(i)); Serial.println(device.getFriendlyName(i)); Serial.println(device.getLocation(i)); } } device.searchRootDevice(); } delay(1000); } ``` 该代码中,首先连接WiFi网络,然后创建一个UPnPDevice对象。在setup函数中,调用device.searchRootDevice()方法发送搜索请求。在loop函数中,如果设备正在搜索,调用device.loop()方法解析设备描述文档,获取搜索到的设备信息;否则,调用device.searchRootDevice()方法重新发送搜索请求。 需要注意的是,ESP8266UPnP需要在Arduino IDE中下载安装,并在代码中引入ESP8266UPnP.h头文件。同时,搜索请求需要发送到多播地址239.255.255.250,端口号为1900。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值