Device.py
4.63 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
from django.conf import settings
import socket
import configparser
import abc
import select
import utils.Logger as L
DEBUG_FILE = False
'''
Generic object for the communication with all the devices
'''
class DeviceController():
__metaclass__ = abc.ABCMeta
logger = L.setupLogger("DeviceLogger", "Devices")
name = ""
config_file = "../config/socket_config.ini"
config = None
connected = False
sock = None
ip = None
port = None
def __init__(self, device_name):
self.name = device_name
self.getConfig()
self.getConnection(device_name)
self.connect()
@abc.abstractmethod
def set(self, command: str, *args):
return
@abc.abstractmethod
def do(self, command: str, *args):
return
@abc.abstractmethod
def get(self, command: str, *args):
return
@abc.abstractmethod
def getStatus(self):
return
def sendMessage(self, message: str) -> int:
if (not self.isConnected()):
# (EP) NON, return 0 !!!
#return (1)
return False
try:
readable, writable, exceptional = select.select([], [self.sock], [self.sock], 0)
if not (writable or exceptional):
raise (Exception("Socket not writable"))
self.sock.send(bytes(message, "UTF-8"))
except Exception as e:
if (settings.DEBUG):
self.log(self.name, "Could not send message on socket : " + message + " -> " + str(e))
return (1)
return (0)
def isError(self, message: str):
if (message == "FAILED" or message == "NOT_SET" or message == "DISCONNECTED"):
return (True)
return (False)
def isConnected(self):
if (not self.sock or not self.connected):
# (EP) NON, c'est totalement illisible !!! on n'est plus en 1970
#if (self.connect()): return (False)
if not self.connect(): return (False)
self.connected = True
return (True)
def readBytes(self, size) -> str:
if (not self.isConnected()):
return ("NOT_SET")
try:
readable, writable, exceptional = select.select([self.sock], [], [self.sock], 0)
if not (readable or exceptional):
raise (Exception("Socket not readable"))
ret = self.sock.recv(size).decode()
if (not ret):
if (settings.DEBUG):
self.log(self.name, "Connection has been killed")
self.connected = False
return ("DISCONNECTED")
except Exception as e:
if (settings.DEBUG):
self.log(self.name, "Socket not readable : " + str(e))
return ("FAILED")
return (ret)
def blockAndReadBytes(self, size) -> str:
self.sock.setblocking(1)
return (self.readBytes(size))
def blockAndReadMessage(self) -> str:
return (self.blockAndReadBytes(1024))
def setBlocking(self, flag):
if (not self.sock):
return (1)
self.sock.setblocking(flag)
return (0)
# TODO maybe read more than 1024 bytes ?????
def readMessage(self) -> str:
return self.readBytes(1024)
def getConnection(self, device_name):
self.ip = self.config.get(device_name, "ip")
self.port = int(self.config.get(device_name, "port"))
return (0)
def getConfig(self):
self.config = configparser.ConfigParser()
self.config.read(self.config_file)
return (0)
def log(self, device_name: str, message: str):
if DEBUG_FILE and settings.DEBUG:
self.logger.info("From device : " + device_name + " -> " + message)
return (0)
def connect(self):
if (self.ip is None or self.port is None):
self.log(self.name, "Ip or Port not initialized")
# (EP) It's a serious bug, so raise exception !!!
#return (1)
raise (Exception("PLC has no ip or port"))
try:
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.connect((self.ip, self.port))
self.sock.setblocking(0) # Default : socket non blocking
except Exception as e:
print("FAILED TO CONNECT")
if (settings.DEBUG):
self.log(self.name, "Failed to connect to " + str(self.ip) + ":" + str(self.port) + " -> " + str(e))
# (EP) return TRUE??? (for python, 1=true !!!)
#return (1)
return False
self.connected = True
# (EP) return FALSE ??? (for python, 0=false !!!)
#return (0)
return True