一、网状网络,即Mesh Network,有以下特点:
a.所有节点都可与拓扑中所有节点进行连线而形成一个“局域网路”
b.所有节点可以透过多次跳跃进行数据通信
c.即使在拓扑中有节点无法服务或过于忙碌,网络还是可以正常运作
在乐鑫开发的ESP-MESH协议中,mesh网络节点之间可以组成网络并转发数据包,这样不需要每个模块都接入路由器,就可以达到大量节点连接网络的效果,思路如下图:
在mesh网络中,esp8266相当于开启了AP热点,让它下面的小分支去连接,也可以同时连接其他节点,相当于AP+STA模式。
对于mesh中的细节,比如说,两点的连接最大距离、最高支持多少设备、多少级网络等,大家可自行百度。。。。。。。
二、mesh组网demo
既然mesh网络在智能家居中应用广泛,我们写一个demo试一下。
1、自动开灯,比如说家里开门后,客厅灯自动亮起来,无需人手动开灯
这里我们需要两块esp8266,光电开关或者红外感应模块,小灯(led或者rgd、二极管都行),最主要看自己有啥吧
程序如下:
程序一:esp8266+rgb灯部分
#include <painlessMesh.h>
#define MESH_PREFIX "xiaoqiu" //设置mesh信息,名字密码随意,一样就行
#define MESH_PASSWORD "bangbangda"
#define MESH_PORT 5555
#define ledr 5 //我用的是rgb共阳极灯,大家灯不一样的话,点灯部分百度一下或者问我
#define ledg 4
#define ledb 2
Scheduler userScheduler;
painlessMesh mesh;
void receivedCallback( uint32_t from, String &msg ) {//收消息
String message = msg.c_str();
Serial.println(message);
if (message == "hello") {//8266收到另一块发来的消息后,开灯红色,这里我写了5s关灯
digitalWrite(ledr, 0);
digitalWrite(ledg, 255);
digitalWrite(ledb, 255);
delay(5000);
digitalWrite(ledr, 255);
digitalWrite(ledg, 255);
digitalWrite(ledb, 255);
delay(300);
message="";
}
}
void setup() {
Serial.begin(115200);
pinMode(ledr, OUTPUT);//rgb初始化
pinMode(ledg, OUTPUT);
pinMode(ledb, OUTPUT);
digitalWrite(ledr, 255);//此处是关灯
digitalWrite(ledg, 255);
digitalWrite(ledb, 255);
mesh.setDebugMsgTypes( ERROR | STARTUP );
//只接收不发送
mesh.init( MESH_PREFIX, MESH_PASSWORD, &userScheduler, MESH_PORT );
mesh.onReceive(&receivedCallback);
}
void loop() {
mesh.update();
}
程序二:esp8266+光电开关、红外感应模块(需要自己调一下程序),我用的是光电开关如图:
这种红外感应模块我也有,就是用起来不太准,换成了光电开关
#include <painlessMesh.h>
#define MESH_PREFIX "xiaoqiu" //设置mesh信息,名字密码随意,一样就行
#define MESH_PASSWORD "bangbangda"
#define MESH_PORT 5555
Scheduler userScheduler;
painlessMesh mesh;
void sendMessage() ;
Task taskSendMessage( TASK_SECOND * 1 , TASK_FOREVER, &sendMessage );
//只发送不接收
void sendMessage() {
String msg = "hello";//发送消息,不一定是hello,随便一个,两端要写一样呀
// msg += mesh.getNodeId();
mesh.sendBroadcast( msg );
taskSendMessage.setInterval( random( TASK_SECOND * 1, TASK_SECOND * 5 ));
}
void setup() {
Serial.begin(115200);
pinMode(5, INPUT);
mesh.setDebugMsgTypes( ERROR | STARTUP );
mesh.init( MESH_PREFIX, MESH_PASSWORD, &userScheduler, MESH_PORT );
}
void loop() {
if (digitalRead(5) == LOW) {//如果来人,发一个消息告诉另一块8266,来人了,开灯吧
delay(2000);//这里我加了延时,太家可以不加试试看,加延时的目的一是稳定光电开关,二是不想人以来立即开灯,吓死了
userScheduler.addTask( taskSendMessage );
taskSendMessage.enable();
}
mesh.update();
delay(300);
}
把两成程序分别上传,在连接对应传感器及灯。