-
Notifications
You must be signed in to change notification settings - Fork 4
/
rss_client.py
159 lines (135 loc) · 5.84 KB
/
rss_client.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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#!/usr/bin/env python
# -*- coding:utf-8, indent=tab, tabstop=4 -*-
#
# See 'LICENSE' for copying
#
# This file contains the code for the client module of 'accel.py'
#
# Revision history
# Date Author Version Details
# ----------------------------------------------------------------------------------
# 2018-01-18 Massimo Di Primio 0.06 1st file implementation
"""Client thread worker - This is a simple client code example for 'accel'.py' program"""
import logging
import time
import datetime
import socket
import json
import rss_client_messages as climsg
import rss_cli_config as ccfg
import raspidata
#def cli_connect(params):
def cli_connect():
"""Open connection to the server"""
server_address = (str(ccfg.serveraddress), int(ccfg.servertcpport))
logging.debug('Trying to connect to server ' + str(server_address))
# Create a TCP/IP socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
# Connect the socket to the port where the server is listening
s.connect(server_address)
logging.debug('Connection Established to server ' + str(server_address))
except:
logging.debug(
"Failed to open connection: " + str(ccfg.serverprotocol) +
", to IP: " + str(ccfg.serveraddress) +
", on port: " + str(ccfg.servertcpport)
)
return(-1)
return(s)
def cli_close(s):
"""Close the server connection"""
if s > -1:
s.close()
# def cli_worker(stopEvent, config, accelBuffer):
def cli_worker(stopEvent, accelBuffer):
"""A client worker as thread"""
logging.debug('Thread Starting')
s = cli_connect() # s = cli_connect(config)
send_client_hello(s)
time.sleep(0.5)
send_config_affirm_message(s)
ts = int(time.time())
te = ts
while not stopEvent.wait(0.3):
if len(accelBuffer) > 0:
send_accel_data(s, accelBuffer)
te = int(time.time())
if (te - ts) > 10:
send_client_heartbit(s)
ts = int(time.time())
time.sleep(0.5)
send_zap_message(s)
cli_close(s)
logging.debug("Thread cliWorker is terminating as per your request.")
def send_accel_data(s, accelBuffer):
"""Send acceleration data to the server"""
#msg = dict(cmd='ADM', timestamp=str(datetime.datetime.now()), clid=raspidata.get_serial())
#a = 123 #str(datetime.datetime.now())
pbuf = parse_accel_data(accelBuffer)
msg = dict(cmd = 'ADM', timestamp = str(datetime.datetime.now()), clid = raspidata.get_serial(), data = pbuf)
# if len(pbuf) > 0: # this sometimes returns error (when buf is empty, it has None type)
if (pbuf is not None) and (len(pbuf) > 0):
#str = climsg.accel_data_message(pbuf)
try:
logging.debug("Sending Acceleration data to the server")
s.sendall(str(json.dumps(msg)) + "\n") #s.sendall(json.dumps(str) + "\n")
except:
logging.debug("Failed to send Acceleration-Data to the server")
def send_client_hello(s):
"""Send Hello message to the server"""
msg = dict(cmd = 'CHM', timestamp = str(datetime.datetime.now()), clid = raspidata.get_serial())
try:
logging.debug("Sending Hello to the server")
s.sendall(str(json.dumps(msg)) + "\n") #s.sendall(json.dumps(climsg.hello_message()) + "\n")
except:
logging.debug("Failed to send Hello to the server")
def send_zap_message(s):
"""Send Zap message to the server"""
msg = dict(cmd = 'CZM', timestamp = str(datetime.datetime.now()), clid = raspidata.get_serial())
try:
logging.debug("Sending Zap to the server")
s.sendall(str(json.dumps(msg)) + "\n") #s.sendall(json.dumps(climsg.zap_message()) + "\n")
except:
logging.debug("Failed to send Zap to the server")
def send_config_affirm_message(s): #def send_config_affirm_message(s, config):
msg_data = dict(city = ccfg.cityname, latitude = ccfg.latitude,longitude = ccfg.longitude)
msg = dict(cmd = 'CCA', timestamp = str(datetime.datetime.now()), clid = raspidata.get_serial(), config = msg_data)
try:
logging.debug("Sending client configuration to the server")
s.sendall(str(json.dumps(msg)) + "\n") #s.sendall(climsg.config_affirm_message(cfg_data))
except:
logging.debug("Failed to send client configuration to the server")
def send_client_heartbit(s):
"""Send Heartbit to the server"""
msg = dict(cmd = 'CHB', timestamp = str(datetime.datetime.now()), clid=raspidata.get_serial())
try:
logging.debug("Sending Heartbit to the server")
s.sendall(str(json.dumps(msg)) + "\n") #s.sendall(json.dumps(climsg.heart_bit()) + "\n")
except:
logging.debug("Failed to send Heartbit to the server")
def parse_accel_data(b):
"""Parse acceleration data to make sure we only send meaningfull data to the server"""
tsh = 10
tbuf = []
# tbuf.append([0, 0, 0, 0, 0])
# bLength = len(b)
# logging.debug("parseAccelData(b) # of elements = " + str(len(b)))
if len(b) > 1:
logging.debug("parseAccelData: In AccelData/BufLen: " + str(len(b)) + "/" +str(len(tbuf)))
firstTime = 1
prow = None
for row in b:
crow = b.pop(0) # Get the oldest record
if firstTime == 1:
prow = crow
firstTime = 0
if ( (abs(abs(int(crow[1])) - abs(int(prow[1]))) > tsh) or
(abs(abs(int(crow[2])) - abs(int(prow[2]))) > tsh) or
(abs(abs(int(crow[3])) - abs(int(prow[3]))) > tsh)
):
tbuf.append(crow)
prow = crow
print ("Again PROW/CROW/TBUFLEN:" + str(prow) + " / " + str(crow) + " / " + str(len(tbuf)))
logging.debug("parseAccelData: Out AccelData/BufLen: " + str(len(b)) + "/" +str(len(tbuf)))
return(tbuf)