start integration of mqtt
This commit is contained in:
parent
472b9628c4
commit
558711bb2b
@ -27,6 +27,7 @@
|
|||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/NetMeterBusMaster2/Streaming}""/>
|
<listOptionValue builtIn="false" value=""${workspace_loc:/NetMeterBusMaster2/Streaming}""/>
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/NetMeterBusMaster2/MQTT}""/>
|
<listOptionValue builtIn="false" value=""${workspace_loc:/NetMeterBusMaster2/MQTT}""/>
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/NetMeterBusMaster2/PString}""/>
|
<listOptionValue builtIn="false" value=""${workspace_loc:/NetMeterBusMaster2/PString}""/>
|
||||||
|
<listOptionValue builtIn="false" value=""${workspace_loc:/NetMeterBusMaster2/Metro}""/>
|
||||||
</option>
|
</option>
|
||||||
<inputType id="it.baeyens.arduino.compiler.cpp.sketch.input.1988694850" name="CPP source files" superClass="it.baeyens.arduino.compiler.cpp.sketch.input"/>
|
<inputType id="it.baeyens.arduino.compiler.cpp.sketch.input.1988694850" name="CPP source files" superClass="it.baeyens.arduino.compiler.cpp.sketch.input"/>
|
||||||
</tool>
|
</tool>
|
||||||
@ -45,10 +46,11 @@
|
|||||||
</toolChain>
|
</toolChain>
|
||||||
</folderInfo>
|
</folderInfo>
|
||||||
<sourceEntries>
|
<sourceEntries>
|
||||||
<entry excluding="PString|MQTT|EEPROM|Streaming|SPI|Ethernet|Libraries/*/?xamples" flags="VALUE_WORKSPACE_PATH" kind="sourcePath" name=""/>
|
<entry excluding="Metro|PString|MQTT|EEPROM|Streaming|SPI|Ethernet|Libraries/*/?xamples" flags="VALUE_WORKSPACE_PATH" kind="sourcePath" name=""/>
|
||||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="EEPROM"/>
|
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="EEPROM"/>
|
||||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Ethernet"/>
|
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Ethernet"/>
|
||||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="MQTT"/>
|
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="MQTT"/>
|
||||||
|
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Metro"/>
|
||||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="PString"/>
|
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="PString"/>
|
||||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="SPI"/>
|
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="SPI"/>
|
||||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Streaming"/>
|
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Streaming"/>
|
||||||
|
73
Metro/Metro.cpp
Normal file
73
Metro/Metro.cpp
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
|
||||||
|
#if defined(ARDUINO) && ARDUINO >= 100
|
||||||
|
#include "Arduino.h"
|
||||||
|
#else
|
||||||
|
#include "WProgram.h"
|
||||||
|
#endif
|
||||||
|
#include "Metro.h"
|
||||||
|
|
||||||
|
|
||||||
|
Metro::Metro(unsigned long interval_millis)
|
||||||
|
{
|
||||||
|
this->autoreset = 0;
|
||||||
|
interval(interval_millis);
|
||||||
|
reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
// New creator so I can use either the original check behavior or benjamin.soelberg's
|
||||||
|
// suggested one (see below).
|
||||||
|
// autoreset = 0 is benjamin.soelberg's check behavior
|
||||||
|
// autoreset != 0 is the original behavior
|
||||||
|
|
||||||
|
Metro::Metro(unsigned long interval_millis, uint8_t autoreset)
|
||||||
|
{
|
||||||
|
this->autoreset = autoreset; // Fix by Paul Bouchier
|
||||||
|
interval(interval_millis);
|
||||||
|
reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Metro::interval(unsigned long interval_millis)
|
||||||
|
{
|
||||||
|
this->interval_millis = interval_millis;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Benjamin.soelberg's check behavior:
|
||||||
|
// When a check is true, add the interval to the internal counter.
|
||||||
|
// This should guarantee a better overall stability.
|
||||||
|
|
||||||
|
// Original check behavior:
|
||||||
|
// When a check is true, add the interval to the current millis() counter.
|
||||||
|
// This method can add a certain offset over time.
|
||||||
|
|
||||||
|
char Metro::check()
|
||||||
|
{
|
||||||
|
if (millis() - this->previous_millis >= this->interval_millis) {
|
||||||
|
// As suggested by benjamin.soelberg@gmail.com, the following line
|
||||||
|
// this->previous_millis = millis();
|
||||||
|
// was changed to
|
||||||
|
// this->previous_millis += this->interval_millis;
|
||||||
|
|
||||||
|
// If the interval is set to 0 we revert to the original behavior
|
||||||
|
if (this->interval_millis <= 0 || this->autoreset ) {
|
||||||
|
this->previous_millis = millis();
|
||||||
|
} else {
|
||||||
|
this->previous_millis += this->interval_millis;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void Metro::reset()
|
||||||
|
{
|
||||||
|
|
||||||
|
this->previous_millis = millis();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
26
Metro/Metro.h
Normal file
26
Metro/Metro.h
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
|
||||||
|
|
||||||
|
#ifndef Metro_h
|
||||||
|
#define Metro_h
|
||||||
|
|
||||||
|
#include <inttypes.h>
|
||||||
|
|
||||||
|
class Metro
|
||||||
|
{
|
||||||
|
|
||||||
|
public:
|
||||||
|
Metro(unsigned long interval_millis);
|
||||||
|
Metro(unsigned long interval_millis, uint8_t autoreset);
|
||||||
|
void interval(unsigned long interval_millis);
|
||||||
|
char check();
|
||||||
|
void reset();
|
||||||
|
|
||||||
|
private:
|
||||||
|
uint8_t autoreset;
|
||||||
|
unsigned long previous_millis, interval_millis;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
@ -10,6 +10,7 @@
|
|||||||
#include <PubSubClient.h>
|
#include <PubSubClient.h>
|
||||||
#include <PString.h>
|
#include <PString.h>
|
||||||
#include <Streaming.h>
|
#include <Streaming.h>
|
||||||
|
#include <Metro.h>
|
||||||
|
|
||||||
|
|
||||||
byte MQTT_BROKER[] = { 192, 168, 75, 1 };
|
byte MQTT_BROKER[] = { 192, 168, 75, 1 };
|
||||||
@ -26,10 +27,22 @@ void callback(char* topic, byte* payload, unsigned int length) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Metro secondTick = Metro(1000);
|
||||||
|
|
||||||
|
|
||||||
MqttClient::MqttClient(RequestSender *meterBusMaster) :
|
MqttClient::MqttClient(RequestSender *meterBusMaster) :
|
||||||
m_client(), m_meterBusMaster(meterBusMaster), m_mqttClient(MQTT_BROKER, MQTT_PORT, callback, m_client),
|
m_client(), m_meterBusMaster(meterBusMaster), m_mqttClient(MQTT_BROKER, MQTT_PORT, callback, m_client),
|
||||||
m_disconnectState(3), m_disconnectTime(millis())
|
m_disconnectState(3), m_disconnectTime(millis())
|
||||||
{
|
{
|
||||||
|
for (uint8_t i = 0; i < NUM_OF_DEVICES; i++) {
|
||||||
|
m_mbusDevTuple[i].address = 0;
|
||||||
|
m_mbusDevTuple[i].queryPeriod = 0;
|
||||||
|
m_mbusDevTuple[i].timer = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_mbusDevTuple[0].address = 0x53;
|
||||||
|
m_mbusDevTuple[0].queryPeriod = 60;
|
||||||
|
m_mbusDevTuple[0].timer = m_mbusDevTuple[0].queryPeriod;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MqttClient::sendResponse(uint8_t *responseBuffer, uint16_t responseBufferLength) {
|
void MqttClient::sendResponse(uint8_t *responseBuffer, uint16_t responseBufferLength) {
|
||||||
@ -92,6 +105,18 @@ void MqttClient::exec() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (secondTick.check() == 1) {
|
||||||
|
for (uint8_t i = 0; i < NUM_OF_DEVICES; i++) {
|
||||||
|
m_mbusDevTuple[i].timer -= 1;
|
||||||
|
if (m_mbusDevTuple[i].timer == 0) {
|
||||||
|
m_mbusDevTuple[i].timer = m_mbusDevTuple[i].queryPeriod;
|
||||||
|
Serial << "Issue request for device " << m_mbusDevTuple[i].address << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// m_client = m_server.available();
|
// m_client = m_server.available();
|
||||||
// if (m_client) {
|
// if (m_client) {
|
||||||
// uint16_t sendBufLen = 0;
|
// uint16_t sendBufLen = 0;
|
||||||
|
10
MqttClient.h
10
MqttClient.h
@ -11,8 +11,16 @@
|
|||||||
#include <Ethernet.h>
|
#include <Ethernet.h>
|
||||||
#include <PubSubClient.h>
|
#include <PubSubClient.h>
|
||||||
#include "mBusDialog.h"
|
#include "mBusDialog.h"
|
||||||
|
#include <Metro.h>
|
||||||
|
|
||||||
|
|
||||||
|
#define NUM_OF_DEVICES 10
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint8_t address;
|
||||||
|
uint16_t queryPeriod;
|
||||||
|
uint16_t timer;
|
||||||
|
} mbusDevTuple_t;
|
||||||
|
|
||||||
class MqttClient : public ResponseCallback {
|
class MqttClient : public ResponseCallback {
|
||||||
public:
|
public:
|
||||||
@ -27,7 +35,7 @@ private:
|
|||||||
PubSubClient m_mqttClient;
|
PubSubClient m_mqttClient;
|
||||||
uint8_t m_disconnectState;
|
uint8_t m_disconnectState;
|
||||||
uint32_t m_disconnectTime;
|
uint32_t m_disconnectTime;
|
||||||
|
mbusDevTuple_t m_mbusDevTuple[NUM_OF_DEVICES];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user