From 11712ad527cbbf696a81af3be06e13bd24b0d1d9 Mon Sep 17 00:00:00 2001 From: samson0v Date: Fri, 24 Mar 2023 11:24:37 +0200 Subject: [PATCH] Added TLS support for Modbus TCP Connection --- .../connectors/modbus/modbus_connector.py | 18 ++++++++++++++---- thingsboard_gateway/connectors/modbus/slave.py | 1 + 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/thingsboard_gateway/connectors/modbus/modbus_connector.py b/thingsboard_gateway/connectors/modbus/modbus_connector.py index 8a343b41..1c196bf1 100644 --- a/thingsboard_gateway/connectors/modbus/modbus_connector.py +++ b/thingsboard_gateway/connectors/modbus/modbus_connector.py @@ -48,12 +48,12 @@ from pymodbus.bit_write_message import WriteSingleCoilResponse, WriteMultipleCoi from pymodbus.register_write_message import WriteMultipleRegistersResponse, WriteSingleRegisterResponse from pymodbus.register_read_message import ReadRegistersResponseBase from pymodbus.bit_read_message import ReadBitsResponseBase -from pymodbus.client import ModbusTcpClient, ModbusUdpClient, ModbusSerialClient +from pymodbus.client import ModbusTcpClient, ModbusTlsClient, ModbusUdpClient, ModbusSerialClient from pymodbus.framer.rtu_framer import ModbusRtuFramer from pymodbus.framer.socket_framer import ModbusSocketFramer from pymodbus.framer.ascii_framer import ModbusAsciiFramer from pymodbus.exceptions import ConnectionException, ModbusIOException -from pymodbus.server import StartTcpServer, StartUdpServer, StartSerialServer, ServerStop +from pymodbus.server import StartTcpServer, StartTlsServer, StartUdpServer, StartSerialServer, ServerStop from pymodbus.device import ModbusDeviceIdentification from pymodbus.version import version from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext @@ -74,6 +74,7 @@ FRAMER_TYPE = { } SLAVE_TYPE = { 'tcp': StartTcpServer, + 'tls': StartTlsServer, 'udp': StartUdpServer, 'serial': StartSerialServer } @@ -187,7 +188,7 @@ class ModbusConnector(Connector, Thread): address=(config.get('host'), config.get('port')) if ( config['type'] == 'tcp' or 'udp') else None, port=config.get('port') if config['type'] == 'serial' else None, - framer=FRAMER_TYPE[config['method']]) + framer=FRAMER_TYPE[config['method']], **config.get('security', {})) def __modify_main_config(self): config = self.__config['slave'] @@ -410,7 +411,16 @@ class ModbusConnector(Connector, Thread): current_config = config current_config["rtu"] = FRAMER_TYPE[current_config['method']] - if current_config.get('type') == 'tcp': + if current_config.get('type') == 'tcp' and current_config.get('tls'): + master = ModbusTlsClient(current_config["host"], + current_config["port"], + current_config["rtu"], + timeout=current_config["timeout"], + retry_on_empty=current_config["retry_on_empty"], + retry_on_invalid=current_config["retry_on_invalid"], + retries=current_config["retries"], + **current_config['tls']) + elif current_config.get('type') == 'tcp': master = ModbusTcpClient(current_config["host"], current_config["port"], current_config["rtu"], diff --git a/thingsboard_gateway/connectors/modbus/slave.py b/thingsboard_gateway/connectors/modbus/slave.py index 9c48018a..43ff0b26 100644 --- a/thingsboard_gateway/connectors/modbus/slave.py +++ b/thingsboard_gateway/connectors/modbus/slave.py @@ -41,6 +41,7 @@ class Slave(Thread): 'port': kwargs['port'], 'byteOrder': kwargs['byteOrder'], 'wordOrder': kwargs['wordOrder'], + 'tls': kwargs.get('tls'), 'timeout': kwargs.get('timeout', 35), 'stopbits': kwargs.get('stopbits', Defaults.Stopbits), 'bytesize': kwargs.get('bytesize', Defaults.Bytesize),