66import json
77import cgi
88import nacl .signing
9+ import copy
910
1011from stations import IStation , StationData , Measurement , STATION_VERSION
11- #from collections import deque
1212from http .server import BaseHTTPRequestHandler , HTTPServer
1313
14- #q = deque()
1514
1615thlock = threading .RLock ()
1716sessions = dict ()
1817
18+ def _generate_pubkey () -> str :
19+ signing_key = nacl .signing .SigningKey .generate ()
20+ verify_key = signing_key .verify_key
21+ verify_key_hex = bytes (verify_key ).hex ()
22+ return str (verify_key_hex )
23+
24+
1925class RequestHandler (BaseHTTPRequestHandler ):
2026
2127 def _set_headers (self ):
@@ -29,19 +35,14 @@ def do_HEAD(self):
2935 def do_GET (self ):
3036 self ._set_headers ()
3137
32- def _generate_pubkey (self ) -> str :
33- signing_key = nacl .signing .SigningKey .generate ()
34- verify_key = signing_key .verify_key
35- verify_key_hex = bytes (verify_key ).hex ()
36- return str (verify_key_hex )
3738
38- def parser (self , data ) -> Measurement :
39+ def _parser (self , data : dict ) -> Measurement :
3940 global sessions
4041 global thlock
4142 #rospy.loginfo(f"parser data: {data}")
4243 try :
4344 if data ["esp8266id" ]:
44- self .client_id = data ["esp8266id" ]
45+ self .client_id = int ( data ["esp8266id" ])
4546 for d in data ["sensordatavalues" ]:
4647 if d ["value_type" ] == "SDS_P1" :
4748 pm10 = float (d ["value" ])
@@ -57,7 +58,7 @@ def parser(self, data) -> Measurement:
5758 with thlock :
5859 if self .client_id not in sessions :
5960 #rospy.loginfo(f"There is no such address: {self.client_address}")
60- public = self . _generate_pubkey ()
61+ public = _generate_pubkey ()
6162 else :
6263 #rospy.loginfo(f"Found such address: {self.client_address}")
6364 public = sessions [self .client_id ].public
@@ -84,7 +85,7 @@ def do_POST(self):
8485 length = int (self .headers .get ("content-length" ))
8586 self .data = json .loads (self .rfile .read (length ))
8687 rospy .loginfo (self .data )
87- meas = self .parser (self .data )
88+ meas = self ._parser (self .data )
8889 rospy .loginfo (meas )
8990 with thlock :
9091 if meas :
@@ -116,7 +117,7 @@ def __init__(self, config: dict):
116117 self .version = f"airalab-http-{ STATION_VERSION } "
117118 self .DEAD_SENSOR_TIME = 60 * 60 # 1 hour
118119
119- def get_data (self ):
120+ def get_data (self ) -> StationData :
120121 global sessions
121122 rospy .loginfo (sessions )
122123
@@ -138,9 +139,12 @@ def _drop_dead_sensors(self) -> dict:
138139 stripped = dict ()
139140 current_time = int (time .time ())
140141 with thlock :
141- for k , v in sessions .items ():
142+ sessions_copy = copy .deepcopy (sessions )
143+ for k , v in sessions_copy .items ():
142144 if (current_time - v .timestamp ) < self .DEAD_SENSOR_TIME :
143145 stripped [k ] = v
146+ else :
147+ del sessions [k ]
144148
145149 return stripped
146150
0 commit comments