/
dvr-alarm-server.py
140 lines (98 loc) · 4.04 KB
/
dvr-alarm-server.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
import socketserver
import json
import datetime
import os
import sys
import paho.mqtt.publish as mqtt
class Log:
is_debug = False
def log_event(self, message, message_kind=''):
pass
def log_info(self, message):
self.log_event(message, "INFO")
def log_error(self, message):
self.log_event(message, "ERROR")
def log_debug(self, message):
if self.is_debug:
self.log_event(message, "DEBUG")
class ConsoleLog(Log):
def log_event(self, message, message_kind=''):
if message_kind == '':
print('{}\t{}'.format(datetime.datetime.now().isoformat(), message))
else:
print('{}\t{}\t{}'.format(datetime.datetime.now().isoformat(), message_kind, message))
class MQTTPublisher:
mqttHost = ''
mqttPort = 1883
mqttUser = ''
mqttPass = ''
def __init__ (self, host, port, user, passwd):
self.mqttHost = host
self.mqttPort = port
self.mqttUser = user
self.mqttPass = passwd
def publish(self, serialID, event):
#log = ConsoleLog()
LOG.log_info('Publish MQTT')
LOG.log_debug("MQTT_HOST=[{}] MQTT_PORT=[{}] MQTT_USER=[{}]".format(self.mqttHost, self.mqttPort, self.mqttUser))
auth_data = None
if (self.mqttUser and self.mqttPass) :
LOG.log_debug('Set credentials ({})'.format(self.mqttUser))
auth_data = {'username':self.mqttUser, 'password':self.mqttPass }
LOG.log_info('Connecting to {}:{}'.format(self.mqttHost, self.mqttPort))
topic = 'camalarm/{}/event'.format(serialID)
LOG.log_info('Publish topic {}:{}'.format(topic,event))
mqtt.single(topic = topic, payload = event, retain = False, hostname = self.mqttHost, port = self.mqttPort, auth = auth_data, tls = None)
class AlarmServerHandler(socketserver.BaseRequestHandler):
def handle(self):
#log = ConsoleLog()
LOG.log_info('Client connected from {}'.format(self.client_address[0]))
header = self.request.recv(8)
self.data = self.request.recv(1024).strip()
data = bytes(self.data)[12:]
# print( 'BIN data: {}'.format(data) )
# payload = str(self.data, 'ascii', 'ignore').strip()
payload = data.decode('ascii')
LOG.log_info ("Payload: {}".format(payload))
json_data = json.loads(payload)
event_type = json_data.get('Type')
event = json_data.get('Event')
serialID = json_data.get('SerialID')
LOG.log_info ("{} Serial: {}; Event: {}".format(event_type, serialID, event))
if event_type == 'Alarm' :
#LOG.log_event("Publish MQTT")
#m = MQTTPublisher('192.168.2.80',1883,'broker', 'BrokerUserMQTT')
#LOG.log_debug("MQTT_HOST=[{}] MQTT_PORT=[{}] MQTT_USER=[{}]".format(MQTT_HOST, MQTT_PORT, MQTT_USER))
#m = MQTTPublisher(MQTT_HOST, MQTT_PORT, MQTT_USER, MQTT_PASSWD)
#m.publish(serialID, event)
publisher.publish(serialID, event)
LOG = ConsoleLog()
#LOG.is_debug = True
publisher = None
#MQTT_HOST = ''
#MQTT_PORT = 1883
#MQTT_USER = ''
#MQTT_PASSWD = ''
version = '0.1'
def main():
HOST, PORT = '0.0.0.0', 15002
global publisher
# global MQTT_HOST
# global MQTT_PORT
# global MQTT_USER
# global MQTT_PASSWD
LOG.log_event('****** dvr-alaram-server (Python) v.{} ******'.format(version))
MQTT_HOST = os.environ.setdefault('MQTT_HOST', '')
MQTT_PORT = int(os.environ.setdefault('MQTT_PORT', '1883'))
MQTT_USER = os.environ.setdefault('MQTT_USER', '')
MQTT_PASSWD = os.environ.setdefault('MQTT_PASSWD', '')
LOG.log_debug("MQTT_HOST=[{}] MQTT_PORT=[{}] MQTT_USER=[{}]".format(MQTT_HOST, MQTT_PORT, MQTT_USER))
if MQTT_HOST == '':
LOG.log_error("No MQTT_HOST is specified.")
sys.exit(1)
publisher = MQTTPublisher(MQTT_HOST, MQTT_PORT, MQTT_USER, MQTT_PASSWD)
server = socketserver.TCPServer((HOST, PORT), AlarmServerHandler)
server.serve_forever()
server.server_close()
if __name__ == "__main__":
main()