def _do_run(self): """main function of the server""" try: # check the status of every socket request = utils.to_data('') if self._block_on_first_byte: # do a blocking read for first byte self._serial.timeout = None try: read_bytes = self._serial.read(1) request += read_bytes except Exception as e: self._serial.close() self._serial.open() self._serial.timeout = self._timeout # Read rest of the request while True: try: read_bytes = self._serial.read(128) if not read_bytes: break except Exception as e: self._serial.close() self._serial.open() break request += read_bytes # parse the request if request: retval = call_hooks("modbus_rtu.RtuServer.after_read", (self, request)) if retval is not None: request = retval response = self._handle(request) # send back the response retval = call_hooks("modbus_rtu.RtuServer.before_write", (self, response)) if retval is not None: response = retval if response: if self._serial.in_waiting > 0: # Most likely master timed out on this request and started a new one # for which we already received atleast 1 byte LOGGER.warning("Not sending response because there is new request pending") else: self._serial.write(response) self._serial.flush() time.sleep(self.get_timeout()) call_hooks("modbus_rtu.RtuServer.after_write", (self, response)) except Exception as excpt: LOGGER.error("Error while handling request, Exception occurred: %s", excpt) call_hooks("modbus_rtu.RtuServer.on_error", (self, excpt))
def _do_exit(self): """clean the server tasks""" #close the sockets for sock in self._sockets: try: sock.close() self._sockets.remove(sock) except Exception as msg: LOGGER.warning("Error while closing socket, Exception occurred: %s", msg) self._sock.close() self._sock = None
def _do_run(self): """called in a almost-for-ever loop by the server""" # check the status of every socket inputready = select.select(self._sockets, [], [], 1.0)[0] #print(inputready) # handle data on each a socket for sock in inputready: try: if sock == self._sock: #print (self._sock) # handle the server socket #print ("Receiveeeeeeeeeeeeeeeeeeeee") client, address = self._sock.accept() client.setblocking(0) LOGGER.debug("%s is connected with socket %d...", str(address), client.fileno()) self._sockets.append(client) call_hooks("modbus_tcp.TcpServer.on_connect", (self, client, address)) return else: if len(sock.recv(1, socket.MSG_PEEK)) == 0: # socket is disconnected LOGGER.debug("%d is disconnected" % (sock.fileno())) call_hooks("modbus_tcp.TcpServer.on_disconnect", (self, sock)) sock.close() self._sockets.remove(sock) break # handle all other sockets sock.settimeout(1.0) request = to_data("") is_ok = True # read the 7 bytes of the mbap while (len(request) < 7) and is_ok: new_byte = sock.recv(1) if len(new_byte) == 0: is_ok = False else: request += new_byte retval = call_hooks("modbus_tcp.TcpServer.after_recv", (self, sock, request)) if retval is not None: request = retval if is_ok: # read the rest of the request length = self._get_request_length(request) while (len(request) < (length + 6)) and is_ok: new_byte = sock.recv(1) if len(new_byte) == 0: is_ok = False else: request += new_byte if is_ok: response = "" # parse the request try: response = self._handle(request) except Exception as msg: LOGGER.error( "Error while handling a request, Exception occurred: %s", msg) # send back the response if response: try: retval = call_hooks( "modbus_tcp.TcpServer.before_send", (self, sock, response)) if retval is not None: response = retval sock.send(response) call_hooks("modbus_tcp.TcpServer.after_send", (self, sock, response)) except Exception as msg: is_ok = False LOGGER.error( "Error while sending on socket %d, Exception occurred: %s", sock.fileno(), msg) except Exception as excpt: LOGGER.warning("Error while processing data on socket %d: %s", sock.fileno(), excpt) call_hooks("modbus_tcp.TcpServer.on_error", (self, sock, excpt)) sock.close() self._sockets.remove(sock)
def _do_run(self): """called in a almost-for-ever loop by the server""" # check the status of every socket inputready = select.select(self._sockets, [], [], 1.0)[0] # handle data on each a socket for sock in inputready: try: if sock == self._sock: # handle the server socket client, address = self._sock.accept() client.setblocking(0) LOGGER.info("%s is connected with socket %d...", str(address), client.fileno()) self._sockets.append(client) call_hooks("modbus_tcp.TcpServer.on_connect", (self, client, address)) else: if len(sock.recv(1, socket.MSG_PEEK)) == 0: # socket is disconnected LOGGER.info("%d is disconnected" % (sock.fileno())) call_hooks("modbus_tcp.TcpServer.on_disconnect", (self, sock)) sock.close() self._sockets.remove(sock) break # handle all other sockets sock.settimeout(1.0) request = to_data("") is_ok = True # read the 7 bytes of the mbap while (len(request) < 7) and is_ok: new_byte = sock.recv(1) if len(new_byte) == 0: is_ok = False else: request += new_byte retval = call_hooks("modbus_tcp.TcpServer.after_recv", (self, sock, request)) if retval is not None: request = retval if is_ok: # read the rest of the request length = self._get_request_length(request) while (len(request) < (length + 6)) and is_ok: new_byte = sock.recv(1) if len(new_byte) == 0: is_ok = False else: request += new_byte if is_ok: response = "" # parse the request try: response = self._handle(request) except Exception as msg: LOGGER.error("Error while handling a request, Exception occurred: %s", msg) # send back the response if response: try: retval = call_hooks("modbus_tcp.TcpServer.before_send", (self, sock, response)) if retval is not None: response = retval sock.send(response) call_hooks("modbus_tcp.TcpServer.after_send", (self, sock, response)) except Exception as msg: is_ok = False LOGGER.error( "Error while sending on socket %d, Exception occurred: %s", sock.fileno(), msg ) except Exception as excpt: LOGGER.warning("Error while processing data on socket %d: %s", sock.fileno(), excpt) call_hooks("modbus_tcp.TcpServer.on_error", (self, sock, excpt)) sock.close() self._sockets.remove(sock)