diff --git a/MqttClient.cpp b/MqttClient.cpp index 9977058..6c09e99 100644 --- a/MqttClient.cpp +++ b/MqttClient.cpp @@ -35,7 +35,7 @@ String MqttConfig::exec(String params) { *out << "broker ... set the broker's address" << endl; *out << " followed by a restart, you need to" << endl; *out << " about a minute" << endl; - *out << "add ...... add an mbus client, params: token address period" << endl; + *out << "add ...... add an mbus client, params: token name address period" << endl; *out << "del ...... delete an mbus client, params: index" << endl; *out << "reset .... reset configuration" << endl; *out << " followed by a restart, you need to" << endl; @@ -49,7 +49,8 @@ String MqttConfig::exec(String params) { for (uint8_t i = 0; i < NUM_OF_DEVICES; i++) { *out << i << ": " << mc->m_mbusDevTuple[i].token << ", " << mc->m_mbusDevTuple[i].address << ", " << - mc->m_mbusDevTuple[i].queryPeriod << endl; + mc->m_mbusDevTuple[i].queryPeriod << ", " << + mc->m_mbusDevTuple[i].name << endl; } *out << "Broker: " << mc->m_mqttBroker << endl; *out << "Watchdog resets: " << WDOG_RSTCNT << endl; @@ -74,6 +75,7 @@ String MqttConfig::exec(String params) { strncpy(paramBuf, params.c_str(), sizeof(paramBuf)); paramPtr = paramBuf; char *tokenStr = 0; + char *nameStr = 0; char *addressStr = 0; char *periodStr = 0; if ((paramPtr != 0) && (*paramPtr != 0)){ @@ -83,6 +85,9 @@ String MqttConfig::exec(String params) { if ((paramPtr != 0) && (*paramPtr != 0)){ tokenStr = strsep(¶mPtr, " "); } + if ((paramPtr != 0) && (*paramPtr != 0)){ + nameStr = strsep(¶mPtr, " "); + } if ((paramPtr != 0) && (*paramPtr != 0)){ addressStr = strsep(¶mPtr, " "); } @@ -92,20 +97,25 @@ String MqttConfig::exec(String params) { if ((tokenStr != 0) && (*tokenStr != 0) && (addressStr != 0) && (*addressStr != 0) && - (periodStr != 0) && (*periodStr != 0)) { + (periodStr != 0) && (*periodStr != 0) && + (nameStr != 0) && (*nameStr != 0)) { int token = atoi(tokenStr); bool validToken = ! ((token <= 0) || (token > 250)); + bool validName = strlen(nameStr) < MAX_LEN_OF_NAME; int address = atoi(addressStr); bool validAddress = ! ((address <= 0) || (address > 250)); int period = atoi(periodStr); bool validPeriod = ! ((period < 10) || (period > 3600)); - if (validToken && validAddress && validPeriod) { + if (validToken && validAddress && validPeriod && validName) { uint8_t i = 0; while (mc->m_mbusDevTuple[i].address != 0) { i++; } - mc->m_mbusDevTuple[i] = { (uint8_t)token, (uint8_t)address, (uint16_t)period }; + mc->m_mbusDevTuple[i].token = (uint8_t)token; + mc->m_mbusDevTuple[i].address = (uint8_t)address; + mc->m_mbusDevTuple[i].queryPeriod = (uint16_t)period; + strcpy(mc->m_mbusDevTuple[i].name, nameStr); configWrite(CONFIG_DEVICES, sizeof(mc->m_mbusDevTuple), (char*)mc->m_mbusDevTuple); res = "done"; } else { @@ -118,6 +128,9 @@ String MqttConfig::exec(String params) { if (! validPeriod) { *out << "Invalid period " << periodStr << endl; } + if (! validName) { + *out << "Invalid name " << nameStr << endl; + } res = "failure"; } } else { @@ -138,7 +151,11 @@ String MqttConfig::exec(String params) { res = "illegal index"; } else { *out << "Index " << arg0 << " (" << idx << ") to be deleted" << endl; - mc->m_mbusDevTuple[idx] = {0, 0, 0, 0}; + mc->m_mbusDevTuple[idx].token = 0; + strcpy(mc->m_mbusDevTuple[idx].name, "-"); + mc->m_mbusDevTuple[idx].address = 0; + mc->m_mbusDevTuple[idx].queryPeriod = 0; + mc->m_mbusDevTuple[idx].timer = 0; configWrite(CONFIG_DEVICES, sizeof(mc->m_mbusDevTuple), (char*)mc->m_mbusDevTuple); res = "done"; } @@ -167,14 +184,15 @@ MqttClient::MqttClient(RequestSender *meterBusMaster) : m_mqttConfig(this), { } -void MqttClient::sendResponse(uint8_t *responseBuffer, uint16_t responseBufferLength, uint8_t token) { +void MqttClient::sendResponse(uint8_t *responseBuffer, uint16_t responseBufferLength, uint8_t token, char *name) { char strbuf[1024]; memset(strbuf, sizeof(strbuf), 0); PString buf = PString(strbuf, sizeof(strbuf)); buf << "{ \"metadata\": { \"device\": \"MeterbusHub\", " << - "\"token\": " << token << + "\"token\": " << token << ", " << + "\"name\": \"" << String(name) << "\"" "}, " << "\"data\": {" << "\"uptime\": " << m_uptime << ", " << @@ -205,9 +223,9 @@ void MqttClient::sendResponse(uint8_t *responseBuffer, uint16_t responseBufferLe } } -void MqttClient::sendError(uint8_t code, uint8_t token) { +void MqttClient::sendError(uint8_t code, uint8_t token, char *name) { String msg = String("{ \"metadata\": { \"device\": \"MeterbusHub\", \"error\": ") - + code + String(", \"token\": ") + token + String(" }, \"data\": { \"uptime\": ") + m_uptime + String("}}"); + + code + String(", \"token\": ") + token + String(", \"name\": ") + String(name) + String(" }, \"data\": { \"uptime\": ") + m_uptime + String("}}"); if (m_disconnectState == 0) { //Serial << "publishing " << msg << endl; //Serial << "length: " << msg.length() << endl; @@ -222,10 +240,12 @@ void MqttClient::begin(CmdServer *cmdServer) { if (! configIsValid()) { for (uint8_t i = 0; i < NUM_OF_DEVICES; i++) { - m_mbusDevTuple[i] = { 0, 0, 0, 0 }; + m_mbusDevTuple[i].token = 0; + strcpy(m_mbusDevTuple[i].name, "-"); + m_mbusDevTuple[i].address = 0; + m_mbusDevTuple[i].queryPeriod = 0; + m_mbusDevTuple[i].timer = 0; } - m_mbusDevTuple[0] = { 1, 0x53, 10, 0 }; // light meter - m_mbusDevTuple[1] = { 2, 32, 10, 0 }; // electrity configWrite(CONFIG_DEVICES, sizeof(m_mbusDevTuple), (char*)m_mbusDevTuple); strcpy(m_mqttBroker, MQTT_BROKER_DEFAULT); @@ -318,7 +338,7 @@ void MqttClient::exec() { sendBuffer[2] = m_mbusDevTuple[m_deviceIdx].address; sendBuffer[3] = (uint8_t)(sendBuffer[1] + sendBuffer[2]); sendBuffer[4] = 0x16; - m_meterBusMaster->sendBufferReady(5, m_mbusDevTuple[m_deviceIdx].token, this); + m_meterBusMaster->sendBufferReady(5, m_mbusDevTuple[m_deviceIdx].token, m_mbusDevTuple[m_deviceIdx].name, this); } else { Serial << "no send buffer ready" << endl; } diff --git a/MqttClient.h b/MqttClient.h index f2b8029..14d3c17 100644 --- a/MqttClient.h +++ b/MqttClient.h @@ -16,9 +16,10 @@ #define NUM_OF_DEVICES 10 - +#define MAX_LEN_OF_NAME 16 typedef struct { uint8_t token; + char name[MAX_LEN_OF_NAME+1]; uint8_t address; uint16_t queryPeriod; uint16_t timer; @@ -43,8 +44,8 @@ public: MqttClient(RequestSender *meterBusMaster); void begin(CmdServer *cmdServer); void exec(); - virtual void sendResponse(uint8_t *responseBuffer, uint16_t responseBufferLength, uint8_t token); - virtual void sendError(uint8_t code, uint8_t token); + virtual void sendResponse(uint8_t *responseBuffer, uint16_t responseBufferLength, uint8_t token, char *name); + virtual void sendError(uint8_t code, uint8_t token, char *name); friend class MqttConfig; private: MqttConfig m_mqttConfig; diff --git a/config.cpp b/config.cpp index c136775..3261300 100644 --- a/config.cpp +++ b/config.cpp @@ -10,15 +10,17 @@ #include "config.h" static bool __configIsValid = false; +const uint32_t CONFIG_MAGIC_TOKEN = 0xAffe0003; + void configInit() { uint32_t magic; configRead(CONFIG_MAGIC, 4, (char*)&magic); - __configIsValid = (magic != 0xdeadbeef); + __configIsValid = (magic != CONFIG_MAGIC_TOKEN); if (! __configIsValid) { Serial << "Initialize config" << endl; - uint32_t setMagic = 0xdeadbeef; + uint32_t setMagic = CONFIG_MAGIC_TOKEN; configWrite(CONFIG_MAGIC, 4, (char*)&setMagic); } else { Serial << "Config valid" << endl; diff --git a/config.h b/config.h index 744f90a..75d07d0 100644 --- a/config.h +++ b/config.h @@ -16,9 +16,10 @@ void configReset(); void configRead(int addr, uint8_t len, char *buffer); void configWrite(int addr, uint8_t len, char *buffer); + + #define CONFIG_MAGIC 0 // 4 -#define CONFIG_DEVICES 4 // 64 -#define CONFIG_BROKER 68 // 64 -#define CONFIG_NEXT 132 +#define CONFIG_BROKER 4 // 64 +#define CONFIG_DEVICES 68 // 64 #endif /* CONFIG_H_ */ diff --git a/mBusDialog.h b/mBusDialog.h index bcdaa29..510fd6d 100644 --- a/mBusDialog.h +++ b/mBusDialog.h @@ -6,14 +6,14 @@ class ResponseCallback { public: - virtual void sendResponse(uint8_t *responseBuffer, uint16_t responseBufferLength, uint8_t token) =0; - virtual void sendError(uint8_t code, uint8_t token) = 0; + virtual void sendResponse(uint8_t *responseBuffer, uint16_t responseBufferLength, uint8_t token, char *name) =0; + virtual void sendError(uint8_t code, uint8_t token, char *name) = 0; }; class RequestSender { public: virtual uint8_t *getSendBuffer() =0; - virtual void sendBufferReady(uint16_t bufLen, uint8_t token, ResponseCallback *responseCallback) =0; + virtual void sendBufferReady(uint16_t bufLen, uint8_t token, char *name, ResponseCallback *responseCallback) =0; }; diff --git a/meterBusMaster.cpp b/meterBusMaster.cpp index 317db06..540ebfc 100644 --- a/meterBusMaster.cpp +++ b/meterBusMaster.cpp @@ -99,12 +99,12 @@ String SendOctets::exec(String params) { if (err) { return "error"; } else { - m_meterBusMaster->sendBufferReady(sendBufLen, 1, this); + m_meterBusMaster->sendBufferReady(sendBufLen, 1, 0, this); return "success"; } } -void SendOctets::sendResponse(uint8_t *responseBuffer, uint16_t responseBufferLength, uint8_t token) { +void SendOctets::sendResponse(uint8_t *responseBuffer, uint16_t responseBufferLength, uint8_t token, char *name) { Print *out = m_server; out->print("SO RESP: "); uint16_t i = 0; @@ -122,7 +122,7 @@ void SendOctets::sendResponse(uint8_t *responseBuffer, uint16_t responseBufferLe out->println(""); } -void SendOctets::sendError(uint8_t code, uint8_t token) { +void SendOctets::sendError(uint8_t code, uint8_t token, char *name) { switch (code) { case 1: m_server->println("SO RESP: no resp."); @@ -160,12 +160,13 @@ uint8_t *MeterBusMaster::getSendBuffer() { return m_expectResponse ? 0 : m_sendBuffer; } -void MeterBusMaster::sendBufferReady(uint16_t sendBufLen, uint8_t token, ResponseCallback *responseCallback) { +void MeterBusMaster::sendBufferReady(uint16_t sendBufLen, uint8_t token, char *name, ResponseCallback *responseCallback) { m_cmdReadyToSend = true; m_retransmitCount = 0; m_sendBufLen = sendBufLen; m_responseCallback = responseCallback; m_token = token; + m_name = name; } void MeterBusMaster::prepareResponse(bool err, uint8_t in) { @@ -177,7 +178,7 @@ void MeterBusMaster::prepareResponse(bool err, uint8_t in) { if (err) { //Serial << "r1" << endl; if (m_responseCallback != 0) { - m_responseCallback->sendError(1, m_token); + m_responseCallback->sendError(1, m_token, m_name); } expectedChars = 0; state = 0; @@ -225,7 +226,7 @@ void MeterBusMaster::prepareResponse(bool err, uint8_t in) { if (expectedChars == 0) { //Serial << "r9" << endl; if (m_responseCallback != 0) { - m_responseCallback->sendResponse(m_recvBuffer, m_recvBufLen, m_token); + m_responseCallback->sendResponse(m_recvBuffer, m_recvBufLen, m_token, m_name); } m_expectResponse = false; m_token = 0; diff --git a/meterBusMaster.h b/meterBusMaster.h index 11b1ff5..372f1ad 100644 --- a/meterBusMaster.h +++ b/meterBusMaster.h @@ -24,8 +24,8 @@ public: virtual String getCmdName() { return "SO"; } virtual String getHelp() { return "Send octets"; } virtual String exec(String params); - virtual void sendResponse(uint8_t *responseBuffer, uint16_t responseBufferLength, uint8_t token); - virtual void sendError(uint8_t code, uint8_t token); + virtual void sendResponse(uint8_t *responseBuffer, uint16_t responseBufferLength, uint8_t token, char *name); + virtual void sendError(uint8_t code, uint8_t token, char *name); private: RequestSender *m_meterBusMaster; }; @@ -62,7 +62,7 @@ public: void begin(CmdServer *cmdServer); void exec(); uint8_t *getSendBuffer(); - void sendBufferReady(uint16_t bufLen, uint8_t token, ResponseCallback *responseCallback); + void sendBufferReady(uint16_t bufLen, uint8_t token, char *name, ResponseCallback *responseCallback); friend class CalibrationSupport; private: SendOctets m_sendOctets; @@ -75,6 +75,7 @@ private: uint16_t m_recvBufLen; uint8_t m_retransmitCount; uint8_t m_token; + char *m_name; ResponseCallback *m_responseCallback; uint8_t m_sendBuffer[SEND_BUFFER_SIZE]; uint8_t m_recvBuffer[RECEIVE_BUFFER_SIZE]; diff --git a/meterBusServer.cpp b/meterBusServer.cpp index 26d4463..af5035e 100644 --- a/meterBusServer.cpp +++ b/meterBusServer.cpp @@ -7,11 +7,11 @@ MeterBusServer::MeterBusServer(uint16_t port, RequestSender *meterBusMaster) : m_server(port), m_client(255), m_meterBusMaster(meterBusMaster) { } -void MeterBusServer::sendResponse(uint8_t *responseBuffer, uint16_t responseBufferLength, uint8_t token) { +void MeterBusServer::sendResponse(uint8_t *responseBuffer, uint16_t responseBufferLength, uint8_t token, char *name) { m_server.write(responseBuffer, responseBufferLength); } -void MeterBusServer::sendError(uint8_t code) { +void MeterBusServer::sendError(uint8_t code, uint8_t token, char *name) { } @@ -31,7 +31,7 @@ void MeterBusServer::exec() { *(sendBuffer + sendBufLen) = ch; sendBufLen++; } - m_meterBusMaster->sendBufferReady(sendBufLen, 1, this); + m_meterBusMaster->sendBufferReady(sendBufLen, 1, 0, this); } } } diff --git a/meterBusServer.h b/meterBusServer.h index 297e22f..ceb0212 100644 --- a/meterBusServer.h +++ b/meterBusServer.h @@ -18,8 +18,8 @@ public: MeterBusServer(uint16_t port, RequestSender *meterBusMaster); void begin(); void exec(); - virtual void sendResponse(uint8_t *responseBuffer, uint16_t responseBufferLength, uint8_t token); - virtual void sendError(uint8_t code); + virtual void sendResponse(uint8_t *responseBuffer, uint16_t responseBufferLength, uint8_t token, char *name); + virtual void sendError(uint8_t code, uint8_t token, char *name); private: EthernetServer m_server; EthernetClient m_client;