Repository navigation
Expand file tree
/
Copy pathstationServer.py
More file actions
executable file
·151 lines (118 loc) · 5.13 KB
/
Copy pathstationServer.py
File metadata and controls
executable file
·151 lines (118 loc) · 5.13 KB
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
141
142
143
144
145
146
147
148
149
150
151
import decimal
import json
import socket
import os
import sys
from threading import Timer
import logging
# ----------------------------------------------------------------------------------------------------------------------
# Logging
# ----------------------------------------------------------------------------------------------------------------------
logging.basicConfig(format='%(asctime)s %(name)s %(message)s', level=logging.DEBUG)
Logger = logging.getLogger(__name__)
# ----------------------------------------------------------------------------------------------------------------------
# Timer Class
# ----------------------------------------------------------------------------------------------------------------------
class GlobalTimer(object):
def __init__(self, interval=1.0):
self._registered = set()
self._interval = interval
self._timer = None
self._start_timer()
def register_callback(self, callback):
self._registered.add(callback)
def unregister_callback(self, callback):
self._registered.remove(callback)
def _start_timer(self):
self._timer = Timer(self._interval, self._callback)
self._timer.start()
def _callback(self):
for callback in self._registered:
callback()
self._start_timer()
# ----------------------------------------------------------------------------------------------------------------------
# Global timer
# ----------------------------------------------------------------------------------------------------------------------
Scheduler = GlobalTimer(0.5)
# ----------------------------------------------------------------------------------------------------------------------
# Server
# ----------------------------------------------------------------------------------------------------------------------
class Server():
def __init__(self, serverAddr):
self.Logger = logging.getLogger("StationServer")
self.Logger.debug("Init StationServer")
self.cMessage = {'a': 0, 'b': 0, 'c': 0}
self.Connection = None
# Test Timer
Scheduler.register_callback(self.getLiveData)
# Create a UDS socket
self.Sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
# Bind the socket to the port
self.Logger.debug("starting up on %s" % serverAddr)
self.Sock.bind(serverAddr)
# Listen for incoming connections
self.Sock.listen(1)
self.serverStack = dict()
self.errorStack = []
if 'info' not in self.serverStack:
self.serverStack['info'] = dict()
if 'type' not in self.serverStack['info']:
self.serverStack['info']['type'] = 'standby'
if 'liveMeasurement' not in self.serverStack:
self.serverStack['liveMeasurement'] = []
def getLiveData(self):
self.Logger.debug("get LiveData cMessage %s" % self.cMessage)
self.cMessage['a'] += 1
self.cMessage['b'] += 1
self.cMessage['c'] += 1
def dataAnalyse(self, data):
self.cMessage['a'] = data['a']
self.cMessage['b'] = data['b']
self.cMessage['c'] = data['c']
self.Logger.debug("dataAnalyse cMessage %s" % self.cMessage)
self.getLiveData()
jsd = json.dumps(self.cMessage).encode("utf-8")
self.Connection.sendall(jsd)
#return data
def serveForever(self):
while True:
# Wait for a connection
self.Logger.debug('waiting for a connection')
self.Connection, client_address = self.Sock.accept()
try:
self.Logger.debug('connection from {}'.format(client_address))
# Receive the data in small chunks and retransmit it
while True:
data = self.Connection.recv(4096)
self.Logger.debug("received \"{}\"".format(data))
# if data received handle them
if data:
js_data = json.loads(data.decode('utf-8').strip())
#self.dataAnalyse(js_data)
#jsd = json.dumps(self.cMessage).encode("utf-8")
#connection.sendall(jsd)
else:
self.Logger.debug("no more data from {}".format(client_address))
break
finally:
# Clean up the connection
self.Connection.close()
# ----------------------------------------------------------------------------------------------------------------------
# Main loop
# ----------------------------------------------------------------------------------------------------------------------
if __name__ == "__main__":
server_address = './uds_socket'
# Make sure the socket does not already exist
try:
os.unlink(server_address)
except OSError:
if os.path.exists(server_address):
raise
server = Server(server_address)
try:
server.serveForever()
except KeyboardInterrupt:
Scheduler.unregister_callback(server.getLiveData)
finally:
Logger.debug("Server died smoothly")
sys.exit(0)