ESP32/8266使用painlessMesh库实现mesh
测试了esp的mesh通信,使用的平台是PIO,基于Arduino。
最终实现的结果是设置相同的ssid和pwd之后,可以互相传输数据,但存在问题:通信速率不高、存在中断的问题
- 使用VScode 的PIO平台,搜索painlessMesh的lib进行下载。
可以发现代码的原理还是很简单的,用的库也是简单,猜测其原理就是AP+不连接的通信
- 发射端代码:也不叫发射端,两个代码完全可以一样
#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();
}
- 接收端代码
#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();
}
- 一些bug
最气人的是,esp8266、esp32各种报错,这里的最重要的问题就是,使用好的usb线。换了线之后,一切都正常了。
通信的时候,即使设置成休眠100ms的通信方式,根本达不到10Hz的通信频率,并且偶尔会出现通信中断的问题。
图中会出现改变里连接的问题,不清楚是发射端的问题,还是接收端的问题。即使放的很近也是。当然放在远处也是差不多的(10m测试仍通信正常)。
既然是mesh,当然是多个也可以。三个的时候仍然正常通信,接收的频率也是差不多的,看来接收限制会不是很高。但是出现了接收着就卡住了。
多个的时候,接收端一个近一个远可以同时接收两个,但是两个都很远的时候,会出现同一时刻只能接收到一个。
还是会存在着,接收着就卡住了,哎~