diff --git a/platformio.ini b/platformio.ini index 2ebb608..c8231b5 100644 --- a/platformio.ini +++ b/platformio.ini @@ -55,6 +55,7 @@ lib_deps = ${common.lib_deps} painlessMesh ESP8266mDNS ArduinoOTA +upload_port = 192.168.1.247 [env:meshMqttBridge] src_filter = +<*> - + diff --git a/src/MeshNet.cpp b/src/MeshNet.cpp index 5da7068..2c35f0c 100644 --- a/src/MeshNet.cpp +++ b/src/MeshNet.cpp @@ -15,13 +15,14 @@ Network* MeshNet::init(){ mesh.onChangedConnections(bind(&MeshNet::changedConnectionCallback, this)); mesh.onNodeTimeAdjusted(bind(&MeshNet::nodeTimeAdjustedCallback, this, _1)); - connectStation(); + connectStation(config.stationMode); return this; } -Network* MeshNet::connectStation() { - if(config.stationMode){ - Serial.println("connect station"); +Network* MeshNet::connectStation(int doConnect) { + Serial.println("connect station?"); + if(doConnect){ + Serial.println("connect station!"); mesh.stationManual(config.stationSSID, config.stationPassword); mesh.setHostname(config.hostname); } diff --git a/src/MeshNet.h b/src/MeshNet.h index 0110575..97ce245 100644 --- a/src/MeshNet.h +++ b/src/MeshNet.h @@ -34,7 +34,7 @@ class MeshNet : public Network { MeshNet(MeshConfig cfg); Network* init(); - Network* connectStation(); + Network* connectStation(int); void update(); void newConnectionCallback(uint32_t nodeId); diff --git a/src/base/MeshMessage.h b/src/base/MeshMessage.h index 6eb8240..8d5b080 100644 --- a/src/base/MeshMessage.h +++ b/src/base/MeshMessage.h @@ -8,24 +8,26 @@ #define JSON_FROM "from" #define JSON_TO "target" #define JSON_MSG "msg" +#define JSON_TYPE "type" struct MeshMessage { String domain; String to; String from; String msg; - enum MeshMessageType { NONE, SYSTEM, OTA } type; + enum MeshMessageType { NONE, SYSTEM, APP, OTA } type; int valid = 0; // ------------------------------------------------------------------------------------------ - void init() { - //from = reinterpret_cast(ESP.getChipId()); - } + //void init() { + // from = reinterpret_cast(ESP.getChipId()); + //} int verifyJsonObject(JsonObject& json){ - return json.success() + return json.success(); //&& json.containsKey(JSON_DOMAIN) //&& json.containsKey(JSON_TO) //&& json.containsKey(JSON_FROM) - && json.containsKey(JSON_MSG); + //&& json.containsKey(JSON_TYPE) + // && json.containsKey(JSON_MSG); // msg is only tx'ed from mqtt }; String toJsonString(){ //StaticJsonBuffer<200> jsonBuffer; @@ -35,6 +37,7 @@ struct MeshMessage { root[JSON_TO] = to; root[JSON_FROM] = from; root[JSON_MSG] = msg; + root[JSON_TYPE] = type; String jsonString; root.printTo(jsonString); return jsonString; @@ -52,25 +55,26 @@ struct MeshMessage { return 0; } // Map a json object to this struct. - void fromJsonObject(JsonObject& json){ + int fromJsonObject(JsonObject& json){ if(!verifyJsonObject(json)){ Serial.println("ERROR: cannot parse MeshMessage JSON object"); valid = 0; - //return; + return valid; } domain = getAttrFromJson(json, JSON_DOMAIN); to = getAttrFromJson(json, JSON_TO); from = getAttrFromJson(json, JSON_FROM); msg = getAttrFromJson(json, JSON_MSG); - type = (MeshMessageType) getIntAttrFromJson(json, "type"); + type = (MeshMessageType) getIntAttrFromJson(json, JSON_TYPE); valid = 1; + return valid; }; // Parse a json string and map parsed object - void fromJsonString(String& str){ + int fromJsonString(String& str){ //StaticJsonBuffer<200> jsonBuffer; DynamicJsonBuffer jsonBuffer(JSON_ARRAY_SIZE(300)); JsonObject& json = jsonBuffer.parseObject(str); - fromJsonObject(json); + return fromJsonObject(json); }; }; diff --git a/src/base/MeshSprocket.h b/src/base/MeshSprocket.h index 9bed0ab..790323d 100644 --- a/src/base/MeshSprocket.h +++ b/src/base/MeshSprocket.h @@ -34,8 +34,8 @@ class MeshSprocket : public Sprocket { } void dispatchMessageToPlugins(MeshMessage msg){ - for(Plugin* p : plugins){ - if(msg.type != MeshMessage::NONE){ + if(msg.type != MeshMessage::NONE){ // baaaa + for(Plugin* p : plugins){ Serial.println("dispatch to plugins"); p->onMessage(msg); } @@ -55,10 +55,8 @@ class MeshSprocket : public Sprocket { }; void dispatch( uint32_t from, String &msg ) { - // TODO handle OTA before passing to onMessage MeshMessage mMsg; - mMsg.fromJsonString(msg); - if(mMsg.valid){ + if(mMsg.fromJsonString(msg)){ dispatchMessageToPlugins(mMsg); } onMessage(from, msg); diff --git a/src/examples/mesh/MeshApp.cpp b/src/examples/mesh/MeshApp.cpp index cb44b72..e738a7f 100644 --- a/src/examples/mesh/MeshApp.cpp +++ b/src/examples/mesh/MeshApp.cpp @@ -32,9 +32,9 @@ class MeshApp : public MeshSprocket { msg.domain = "wirelos"; msg.to = "broadcast"; msg.msg = "alive"; + msg.type = MeshMessage::APP; String msgStr = msg.toJsonString(); - //String msg = "{ \"domain\": \"wirelos\",\"from\": \"0\",\"target\": \"broadcast\", \"msg \": \"alive\" }"; - network->mesh.sendBroadcast(msgStr, true); + network->mesh.sendBroadcast(msgStr/* , true */); } void onMessage( uint32_t from, String &msg ) { Serial.printf("MeshApp onMessage: received from %u msg=%s\n", from, msg.c_str()); diff --git a/src/examples/mesh/README.md b/src/examples/mesh/README.md new file mode 100644 index 0000000..53e7306 --- /dev/null +++ b/src/examples/mesh/README.md @@ -0,0 +1,7 @@ +# Mesh Sprocket Example + +## OTA +mosquitto_sub -h citadel.lan -p 1883 -v -t '#' + +Enable OTA: +mosquitto_pub -h citadel.lan -p 1883 -t '/down/wirelos/gateway' -m '{"target":"broadcast", "domain": "wirelos", "msg": {"target":"broadcast", "type": 3, msg: "OTA"} }' diff --git a/src/examples/mesh/config.h b/src/examples/mesh/config.h index f958da0..7f87652 100644 --- a/src/examples/mesh/config.h +++ b/src/examples/mesh/config.h @@ -10,7 +10,7 @@ #define STARTUP_DELAY 3000 // Mesh config -#define STATION_MODE 1 +#define SPROCKET_MODE 0 #define WIFI_CHANNEL 11 #define MESH_PORT 5555 #define MESH_PREFIX "whateverYouLike" diff --git a/src/examples/mesh/main.cpp b/src/examples/mesh/main.cpp index 4361b38..b8b8749 100644 --- a/src/examples/mesh/main.cpp +++ b/src/examples/mesh/main.cpp @@ -3,7 +3,7 @@ #include "MeshApp.cpp" MeshNet net({ - STATION_MODE, WIFI_CHANNEL, + SPROCKET_MODE, WIFI_CHANNEL, MESH_PORT, MESH_PREFIX, MESH_PASSWORD, STATION_SSID, STATION_PASSWORD, HOSTNAME, MESH_DEBUG_TYPES diff --git a/src/plugins/OtaTcpPlugin.cpp b/src/plugins/OtaTcpPlugin.cpp index 4f2d73f..25cc569 100644 --- a/src/plugins/OtaTcpPlugin.cpp +++ b/src/plugins/OtaTcpPlugin.cpp @@ -18,29 +18,33 @@ class OtaTcpPlugin : public Plugin { private: OtaConfig config; Task otaTask; - MeshNet* network; + MeshNet* net; public: OtaTcpPlugin(OtaConfig cfg){ config = cfg; } - void connectUpdateNetwork(Network* network) { - // if(!network->isConnected()){ - // static_cast(network)->config.stationMode = 1; - // } - network->connectStation(); + void connectUpdateNetwork() { + Serial.println("OTA connect to update-network"); + net->connectStation(1); } void enable() { + Serial.println("OTA enable"); ArduinoOTA.begin(); otaTask.enable(); } void onMessage(MeshMessage msg) { - //enable(); - Serial.println("OTA msg received"); + if(msg.type == MeshMessage::OTA){ + Serial.println("OTA msg received"); + connectUpdateNetwork(); + enable(); + //net->mesh.sendBroadcast("my ip:" + WiFi.localIP().toString(), true); + } } void setup(Scheduler* userScheduler, Network* network){ - // connect done in network class + // connect done in network class? //connectUpdateNetwork(network); + net = static_cast(network); // setup task scheduler = userScheduler; otaTask.set(TASK_MILLISECOND * 100, TASK_FOREVER, [](){ @@ -72,7 +76,6 @@ class OtaTcpPlugin : public Plugin { else if (error == OTA_RECEIVE_ERROR) Serial.println("OTA: Receive Failed"); else if (error == OTA_END_ERROR) Serial.println("OTA: End Failed"); }); - enable(); } void disable(){ otaTask.disable();