131 lines
4.1 KiB
Python
131 lines
4.1 KiB
Python
|
|
import logging
|
||
|
|
import time
|
||
|
|
|
||
|
|
import requests
|
||
|
|
import zmq
|
||
|
|
import subprocess
|
||
|
|
|
||
|
|
from config import LIVE_REP_SOCKET, LIVE_SOCKET_IP, LIVE_REP_SOCKET_PORT, CONFIG
|
||
|
|
from nodes.Node import Node
|
||
|
|
from utils.Msg import ImageArgMsg, KillMsg, SeqMetaMsg, SetDeviceConnectedMsg, SetDeviceEnabledMsg, DeviceEnabledMsg, \
|
||
|
|
DeviceConnectedMsg, SetDeviceConfigMsg, DeviceOnlineMsg, DeviceConfigListMsg
|
||
|
|
from utils.RfFile import RfSequenceMeta
|
||
|
|
import socket
|
||
|
|
|
||
|
|
logger = logging.getLogger(__name__)
|
||
|
|
|
||
|
|
|
||
|
|
class Device(Node):
|
||
|
|
topics = [SetDeviceConnectedMsg, SetDeviceEnabledMsg, SetDeviceConfigMsg]
|
||
|
|
|
||
|
|
def __init__(self):
|
||
|
|
super(Device, self).__init__()
|
||
|
|
self.arg = ImageArgMsg('', v1=1499)
|
||
|
|
self.seq_meta = None
|
||
|
|
self.device_rep_socket = None
|
||
|
|
self.ok = b'ok\x00'
|
||
|
|
|
||
|
|
def connect(self):
|
||
|
|
self.device_rep_socket.send(b'connect')
|
||
|
|
rb = self.device_rep_socket.recv()
|
||
|
|
if rb == self.ok:
|
||
|
|
self.send(DeviceConnectedMsg(True))
|
||
|
|
else:
|
||
|
|
logger.error(f"Device msg: {rb}")
|
||
|
|
|
||
|
|
def disconnect(self):
|
||
|
|
self.device_rep_socket.send(b'disconnect')
|
||
|
|
rb = self.device_rep_socket.recv()
|
||
|
|
if rb == self.ok:
|
||
|
|
self.send(DeviceConnectedMsg(False))
|
||
|
|
else:
|
||
|
|
logger.error(f"Device msg: {rb}")
|
||
|
|
|
||
|
|
def enable(self):
|
||
|
|
self.device_rep_socket.send(b'enable')
|
||
|
|
rb = self.device_rep_socket.recv()
|
||
|
|
if rb == self.ok:
|
||
|
|
self.send(DeviceEnabledMsg(True))
|
||
|
|
else:
|
||
|
|
logger.error(f"Device msg: {rb}")
|
||
|
|
|
||
|
|
def disable(self):
|
||
|
|
self.device_rep_socket.send(b'disable')
|
||
|
|
rb = self.device_rep_socket.recv()
|
||
|
|
if rb == self.ok:
|
||
|
|
self.send(DeviceEnabledMsg(False))
|
||
|
|
else:
|
||
|
|
logger.error(f"Device msg: {rb}")
|
||
|
|
|
||
|
|
def online(self):
|
||
|
|
code = subprocess.run(['curl', '-m', '1', 'http://11.6.1.66:22'], stderr=subprocess.DEVNULL,
|
||
|
|
stdout=subprocess.DEVNULL).returncode
|
||
|
|
if code == 28:
|
||
|
|
self.send(DeviceOnlineMsg(False))
|
||
|
|
return False
|
||
|
|
else:
|
||
|
|
self.send(DeviceOnlineMsg(True))
|
||
|
|
return True
|
||
|
|
|
||
|
|
def enabled(self):
|
||
|
|
self.device_rep_socket.send(b'enabled')
|
||
|
|
rb = self.device_rep_socket.recv()
|
||
|
|
match rb:
|
||
|
|
case b'true':
|
||
|
|
self.send(DeviceEnabledMsg(True))
|
||
|
|
case b'false':
|
||
|
|
self.send(DeviceEnabledMsg(False))
|
||
|
|
case _:
|
||
|
|
logger.error(f"Device msg: {rb}")
|
||
|
|
|
||
|
|
def connected(self):
|
||
|
|
self.device_rep_socket.send(b'connected')
|
||
|
|
rb = self.device_rep_socket.recv()
|
||
|
|
match rb:
|
||
|
|
case b'true':
|
||
|
|
self.send(DeviceConnectedMsg(True))
|
||
|
|
case b'false':
|
||
|
|
self.send(DeviceConnectedMsg(False))
|
||
|
|
case _:
|
||
|
|
logger.error(f"Device msg: {rb}")
|
||
|
|
|
||
|
|
def setfile(self, s: str):
|
||
|
|
self.device_rep_socket.send(b'file' + s.encode())
|
||
|
|
rb = self.device_rep_socket.recv()
|
||
|
|
if rb == self.ok:
|
||
|
|
pass
|
||
|
|
# self.send(DeviceConnectedMsg(True))
|
||
|
|
else:
|
||
|
|
logger.error(f"Device msg: {rb}")
|
||
|
|
|
||
|
|
def loop(self):
|
||
|
|
arr = []
|
||
|
|
self.device_rep_socket = self.context.socket(zmq.REQ)
|
||
|
|
self.device_rep_socket.connect(f"tcp://{LIVE_REP_SOCKET}")
|
||
|
|
time.sleep(1)
|
||
|
|
if self.online():
|
||
|
|
self.connected()
|
||
|
|
self.enabled()
|
||
|
|
for f in CONFIG.glob('*.txt'):
|
||
|
|
arr.append((f.stem, f.read_text()))
|
||
|
|
self.send(DeviceConfigListMsg(arr))
|
||
|
|
if arr.__len__() > 0:
|
||
|
|
self.setfile(arr[0][1])
|
||
|
|
while True:
|
||
|
|
msg = self.recv()
|
||
|
|
if isinstance(msg, KillMsg):
|
||
|
|
if msg.name == '':
|
||
|
|
return
|
||
|
|
elif isinstance(msg, SetDeviceEnabledMsg):
|
||
|
|
if msg.value:
|
||
|
|
self.enable()
|
||
|
|
else:
|
||
|
|
self.disable()
|
||
|
|
elif isinstance(msg, SetDeviceConnectedMsg):
|
||
|
|
if msg.value:
|
||
|
|
self.connect()
|
||
|
|
else:
|
||
|
|
self.disconnect()
|
||
|
|
elif isinstance(msg, SetDeviceConfigMsg):
|
||
|
|
self.setfile(msg.value)
|