1、概述
MESH组网技术在IOT领域具有非常大的作用,应用非常广泛,主流的无线技术从最开始的Zigbee,到蓝牙,到这里的WIFI都实现了MESH组网技术。在这里使用零知开源平台演示WIFI WESH组网的使用。
2、软件和硬件
硬件使用零知-ESP8266开发板;
软件使用零知开发工具,自带示例:
3、方法步骤
(1)先在零知开发工具中打开HelloMesh示例,或者复制下面的代码到零知开发工具中:
- /**********************************************************
- * 文件: x.ino by 零知实验室
- * -^^- 零知开源,让电子制作变得更简单! -^^-
- * 时间: 2019/05/28 12:22
- * 说明:
- ************************************************************/
- #include <ESP8266WiFi.h>
- #include <ESP8266WiFiMesh.h>
- #include <TypeConversionFunctions.h>
- #include <assert.h>
-
- const char exampleMeshName[] PROGMEM = "MeshNode_";
- const char exampleWiFiPassword[] PROGMEM = "123456789";
-
- unsigned int requestNumber = 0;
- unsigned int responseNumber = 0;
-
- String manageRequest(const String &request, ESP8266WiFiMesh &meshInstance);
- transmission_status_t manageResponse(const String &response, ESP8266WiFiMesh &meshInstance);
- void networkFilter(int numberOfNetworks, ESP8266WiFiMesh &meshInstance);
-
-
- ESP8266WiFiMesh meshNode = ESP8266WiFiMesh(manageRequest, manageResponse, networkFilter, FPSTR(exampleWiFiPassword), FPSTR(exampleMeshName), "", true);
-
- /**
- Callback for when other nodes send you a request
-
- @param request The request string received from another node in the mesh
- @param meshInstance The ESP8266WiFiMesh instance that called the function.
- @returns The string to send back to the other node
- */
- String manageRequest(const String &request, ESP8266WiFiMesh &meshInstance) {
-
-
-
-
-
-
- Serial.print("Request received: ");
- Serial.println(request);
-
-
- return ("Hello world response #" + String(responseNumber++) + " from " + meshInstance.getMeshName() + meshInstance.getNodeID() + ".");
- }
-
- /**
- Callback for when you get a response from other nodes
-
- @param response The response string received from another node in the mesh
- @param meshInstance The ESP8266WiFiMesh instance that called the function.
- @returns The status code resulting from the response, as an int
- */
- transmission_status_t manageResponse(const String &response, ESP8266WiFiMesh &meshInstance) {
- transmission_status_t statusCode = TS_TRANSMISSION_COMPLETE;
-
-
- Serial.print(F("Request sent: "));
- Serial.println(meshInstance.getMessage());
- Serial.print(F("Response received: "));
- Serial.println(response);
-
-
- meshInstance.setMessage(String(F("Hello world request #")) + String(++requestNumber) + String(F(" from "))
- + meshInstance.getMeshName() + meshInstance.getNodeID() + String(F(".")));
-
-
- return statusCode;
- }
-
- /**
- Callback used to decide which networks to connect to once a WiFi scan has been completed.
-
- @param numberOfNetworks The number of networks found in the WiFi scan.
- @param meshInstance The ESP8266WiFiMesh instance that called the function.
- */
- void networkFilter(int numberOfNetworks, ESP8266WiFiMesh &meshInstance) {
- for (int networkIndex = 0; networkIndex < numberOfNetworks; ++networkIndex) {
- String currentSSID = WiFi.SSID(networkIndex);
- int meshNameIndex = currentSSID.indexOf(meshInstance.getMeshName());
-
-
- if (meshNameIndex >= 0) {
- uint64_t targetNodeID = stringToUint64(currentSSID.substring(meshNameIndex + meshInstance.getMeshName().length()));
-
- if (targetNodeID < stringToUint64(meshInstance.getNodeID())) {
- ESP8266WiFiMesh::connectionQueue.push_back(NetworkInfo(networkIndex));
- }
- }
- }
- }
-
- void setup() {
-
-
- WiFi.persistent(false);
-
- Serial.begin(115200);
- delay(50);
-
-
-
-
-
- WiFi.disconnect();
-
- Serial.println();
- Serial.println();
-
- Serial.println(F("Note that this library can use static IP:s for the nodes to speed up connection times.\n"
- "Use the setStaticIP method as shown in this example to enable this.\n"
- "Ensure that nodes connecting to the same AP have distinct static IP:s.\n"
- "Also, remember to change the default mesh network password!\n\n"));
-
- Serial.println(F("Setting up mesh node..."));
-
-
- meshNode.begin();
- meshNode.activateAP();
-
- }
-
- int32_t timeOfLastScan = -10000;
- void loop() {
- if (millis() - timeOfLastScan > 3000
- || (WiFi.status() != WL_CONNECTED && millis() - timeOfLastScan > 2000)) {
- String request = String(F("Hello world request #")) + String(requestNumber) + String(F(" from ")) + meshNode.getMeshName() + meshNode.getNodeID() + String(F("."));
- meshNode.attemptTransmission(request, false);
- timeOfLastScan = millis();
-
-
- if (ESP8266WiFiMesh::latestTransmissionSuccessful()) {
- Serial.println(F("Transmission successful."));
- }
-
-
- if (ESP8266WiFiMesh::latestTransmissionOutcomes.empty()) {
- Serial.println(F("No mesh AP found."));
- } else {
- for (TransmissionResult &transmissionResult : ESP8266WiFiMesh::latestTransmissionOutcomes) {
- if (transmissionResult.transmissionStatus == TS_TRANSMISSION_FAILED) {
- Serial.println(String(F("Transmission failed to mesh AP ")) + transmissionResult.SSID);
- } else if (transmissionResult.transmissionStatus == TS_CONNECTION_FAILED) {
- Serial.println(String(F("Connection failed to mesh AP ")) + transmissionResult.SSID);
- } else if (transmissionResult.transmissionStatus == TS_TRANSMISSION_COMPLETE) {
-
- } else {
- Serial.println(String(F("Invalid transmission status for ")) + transmissionResult.SSID + String(F("!")));
- assert(F("Invalid transmission status returned from responseHandler!") && false);
- }
- }
- }
- Serial.println();
- } else {
-
- meshNode.acceptRequest();
- }
- }
(2)验证并上传上述代码到零知-ESP8266开发板;
(3)测试:分别把上述代码上传到两个零知-ESP8266开发板,然后分别连接两个板子的串口调试窗口,然后就可以看到两个节点数据传输信息了:
更多详细资料可到零知实验室官网免费获取。
此内容由EEWORLD论坛网友roc2原创,如需转载或用于商业用途需征得作者同意并注明出处