Пример #1
0
 def _udp_thread(self):
     while True:
         try:
             data, src = self.sock.recvfrom(1024)
             _token = data[1:3]
             _type = data[3]
             if _type == PUSH_ACK:
                 print("Push ack")
             elif _type == PULL_ACK:
                 print("Pull ack")
             elif _type == PULL_RESP:
                 self.dwnb += 1
                 ack_error = TX_ERR_NONE
                 tx_pk = json.loads(data[4:])
                 tmst = tx_pk["txpk"]["tmst"]
                 t_us = tmst - time.ticks_us() - 5000
                 if t_us < 0:
                     t_us += 0xFFFFFFFF
                 if t_us < 20000000:
                     self.uplink_alarm = Timer.Alarm(handler=lambda x: self._send_down_link(binascii.a2b_base64(tx_pk["txpk"]["data"]),
                                                                                            tx_pk["txpk"]["tmst"] - 10, tx_pk["txpk"]["datr"],
                                                                                            int(tx_pk["txpk"]["freq"] * 1000000)), us=t_us)
                     print("Downlink")
                 else:
                     ack_error = TX_ERR_TOO_LATE
                     print("Downlink timestamp error!, t_us:", t_us)
                 self._ack_pull_rsp(_token, ack_error)
                 print("Pull rsp")
         except socket.timeout:
             pass
         except OSError as e:
             if e.errno == errno.EAGAIN:
                 pass
             else:
                 print("UDP recv OSError Exception")
         except Exception:
             print("UDP recv Exception")
         # Wait before trying to receive again
         time.sleep(0.025)