initial
This commit is contained in:
commit
3fcf6fe486
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
*.pyc
|
19
AbstractNextStage.py
Normal file
19
AbstractNextStage.py
Normal file
@ -0,0 +1,19 @@
|
||||
from logger import Logger
|
||||
|
||||
|
||||
class AbstractNextStage(object):
|
||||
def __init__(self):
|
||||
self.nextStage = None
|
||||
|
||||
def setNextStage(self, nextStage):
|
||||
self.nextStage = nextStage
|
||||
|
||||
def executeNextStage(self, data):
|
||||
if self.nextStage is not None:
|
||||
self.nextStage.execute(data)
|
||||
else:
|
||||
Logger.log("no nextStage set")
|
||||
|
||||
def execute(self, data):
|
||||
raise Exception("Not yet implemented")
|
||||
# last step is to execute nextStage
|
16
AbstractParser.py
Normal file
16
AbstractParser.py
Normal file
@ -0,0 +1,16 @@
|
||||
from logger import Logger
|
||||
|
||||
|
||||
class AbstractParser(object):
|
||||
def __init__(self):
|
||||
self.topic = None
|
||||
self.nextStage = None
|
||||
|
||||
def getTopic(self):
|
||||
return self.topic
|
||||
|
||||
def setNextStage(self, nextStage):
|
||||
self.nextStage = nextStage
|
||||
|
||||
def execute(self, data):
|
||||
raise Exception("Not yet implemented")
|
12
MBusParser.py
Normal file
12
MBusParser.py
Normal file
@ -0,0 +1,12 @@
|
||||
from logger import Logger
|
||||
from AbstractParser import AbstractParser
|
||||
from AbstractNextStage import AbstractNextStage
|
||||
|
||||
class MBusParser(AbstractParser, AbstractNextStage):
|
||||
def __init__(self):
|
||||
super(MBusParser, self).__init__()
|
||||
self.topic = "IoT/Measurement/MeterbusHub"
|
||||
|
||||
def execute(self, data):
|
||||
Logger.log("MBusParser %s" % (str(data)))
|
||||
self.executeNextStage(data)
|
12
ModbusParser.py
Normal file
12
ModbusParser.py
Normal file
@ -0,0 +1,12 @@
|
||||
from logger import Logger
|
||||
from AbstractParser import AbstractParser
|
||||
from AbstractNextStage import AbstractNextStage
|
||||
|
||||
class ModbusParser(AbstractParser, AbstractNextStage):
|
||||
def __init__(self):
|
||||
super(ModbusParser, self).__init__()
|
||||
self.topic = "IoT/Measurement/ModbusHub"
|
||||
|
||||
def execute(self, data):
|
||||
Logger.log("ModbusParser %s" % (str(data)))
|
||||
self.executeNextStage(data)
|
67
MqttDispatcher.py
Normal file
67
MqttDispatcher.py
Normal file
@ -0,0 +1,67 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
from MqttReceiver import MqttReceiver
|
||||
import os
|
||||
import sys
|
||||
from logger import Logger
|
||||
import time
|
||||
|
||||
from MBusParser import MBusParser
|
||||
from ModbusParser import ModbusParser
|
||||
from PersistentQueue import PersistentQueue
|
||||
|
||||
|
||||
DEBUG = True
|
||||
DEBUG_TO_STDOUT = True
|
||||
BACKGROUND = False
|
||||
PID_FILE = "/tmp/MqttDispatcher.pid"
|
||||
LOG_FILE = "/tmp/MqttDispatcher.log"
|
||||
MQTT_BROKER = "172.16.2.15"
|
||||
|
||||
|
||||
if BACKGROUND:
|
||||
pid = os.fork()
|
||||
else:
|
||||
pid = 0
|
||||
|
||||
if pid:
|
||||
pidFile = file(PID_FILE , mode='w')
|
||||
pidFile.write("%i\n" % pid)
|
||||
pidFile.close()
|
||||
sys.exit(0)
|
||||
|
||||
Logger.openlog(LOG_FILE)
|
||||
|
||||
if DEBUG:
|
||||
Logger.debugEnable()
|
||||
|
||||
if DEBUG_TO_STDOUT:
|
||||
Logger.debugToStdoutEnable()
|
||||
|
||||
|
||||
Logger.log("MqttDispatcher starting")
|
||||
|
||||
|
||||
|
||||
try:
|
||||
mqttReader = MqttReceiver.create(MQTT_BROKER)
|
||||
mqttReader.start()
|
||||
Logger.log("MqttReader started ...")
|
||||
|
||||
mbusParser = MBusParser()
|
||||
mqttReader.registerParser(mbusParser)
|
||||
|
||||
modbusParser = ModbusParser()
|
||||
mqttReader.registerParser(modbusParser)
|
||||
|
||||
persistentQueue = PersistentQueue()
|
||||
mbusParser.setNextStage(persistentQueue)
|
||||
|
||||
Logger.log("MqttDispatcher running")
|
||||
|
||||
while (True):
|
||||
time.sleep(10)
|
||||
except Exception, e:
|
||||
Logger.log("MqttDispatcher dying from %s" % (str(e)))
|
||||
finally:
|
||||
Logger.log("MqttDispatcher terminating ...")
|
45
MqttReceiver.py
Normal file
45
MqttReceiver.py
Normal file
@ -0,0 +1,45 @@
|
||||
import threading
|
||||
from logger import Logger
|
||||
import paho.mqtt.client as mqtt
|
||||
import json
|
||||
import datetime
|
||||
|
||||
_parsers = {}
|
||||
|
||||
|
||||
def on_message(client, userdata, msg):
|
||||
try:
|
||||
j = {'payload':msg.payload, 'topic':msg.topic, 'timestamp':datetime.datetime.now()}
|
||||
|
||||
Logger.debug("MqttReceiver receives: %s" % j)
|
||||
|
||||
global _parsers
|
||||
_parsers[msg.topic].execute(j)
|
||||
except ValueError, e:
|
||||
Logger.log("Exception %s in MqttReceiver, on_message" % (str(e)))
|
||||
|
||||
|
||||
class MqttReceiver(threading.Thread):
|
||||
singleton = None
|
||||
|
||||
@classmethod
|
||||
def create(cls, broker):
|
||||
if cls.singleton is None:
|
||||
cls.singleton = MqttReceiver(broker)
|
||||
return cls.singleton
|
||||
|
||||
def __init__(self, broker):
|
||||
threading.Thread.__init__(self)
|
||||
self.client = mqtt.Client()
|
||||
self.client.on_message = on_message
|
||||
self.client.connect(broker, 1883, 60)
|
||||
self.setDaemon(True)
|
||||
|
||||
def registerParser(self, parser):
|
||||
Logger.log("registering %s for topic %s" % (parser.__class__.__name__, parser.getTopic()))
|
||||
self.client.subscribe(parser.getTopic())
|
||||
global _parsers
|
||||
_parsers[parser.getTopic()] = parser
|
||||
|
||||
def run(self):
|
||||
self.client.loop_forever()
|
8
PersistentQueue.py
Normal file
8
PersistentQueue.py
Normal file
@ -0,0 +1,8 @@
|
||||
from logger import Logger
|
||||
|
||||
class PersistentQueue(object):
|
||||
def __init__(self):
|
||||
super(PersistentQueue, self).__init__()
|
||||
|
||||
def execute(self, data):
|
||||
Logger.log("PersistentQueue %s" % (str(data)))
|
36
logger.py
Normal file
36
logger.py
Normal file
@ -0,0 +1,36 @@
|
||||
from time import gmtime, strftime
|
||||
|
||||
class Logger(object):
|
||||
debugFlag = False
|
||||
debugToStdoutFlag = False
|
||||
|
||||
@classmethod
|
||||
def log(cls, data):
|
||||
t = strftime("%d %b %Y %H:%M:%S", gmtime())
|
||||
with open(cls.logfile, 'a') as f:
|
||||
f.write("%s %s\n" % (t, data))
|
||||
if cls.debugFlag and cls.debugToStdoutFlag:
|
||||
print data
|
||||
|
||||
@classmethod
|
||||
def debug(cls, data):
|
||||
if cls.debugFlag:
|
||||
cls.log(data)
|
||||
|
||||
@classmethod
|
||||
def debugEnable(cls):
|
||||
cls.debugFlag = True
|
||||
|
||||
@classmethod
|
||||
def debugToStdoutEnable(cls):
|
||||
cls.debugToStdoutFlag = True
|
||||
|
||||
@classmethod
|
||||
def debugDisable(cls):
|
||||
cls.debugFlag = False
|
||||
|
||||
@classmethod
|
||||
def openlog(cls, logfile):
|
||||
cls.logfile = logfile
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user