Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 19 additions & 8 deletions pymodbus/server/async_io.py
Original file line number Diff line number Diff line change
Expand Up @@ -817,6 +817,7 @@ def __init__(

self.protocol = None
self.transport = None
self.server = None
self.control = ModbusControlBlock()
identity = kwargs.get("identity")
if isinstance(identity, ModbusDeviceIdentification):
Expand All @@ -826,10 +827,6 @@ async def start(self):
"""Start connecting."""
await self._connect()

def _protocol_factory(self):
"""Return protocol factory."""
return self.handler(self)

async def _delayed_connect(self):
"""Delay connect."""
await asyncio.sleep(self.reconnect_delay)
Expand All @@ -839,10 +836,12 @@ async def _connect(self):
"""Connect."""
if self.reconnecting_task is not None:
self.reconnecting_task = None
if self.device.startswith("socket:"):
return
try:
self.transport, self.protocol = await create_serial_connection(
asyncio.get_event_loop(),
self._protocol_factory,
self.handler(self),
self.device,
baudrate=self.baudrate,
bytesize=self.bytesize,
Expand Down Expand Up @@ -887,12 +886,24 @@ def _check_reconnect(self):

async def serve_forever(self):
"""Start endless loop."""
if self.device.startswith("socket:"):
# Socket server means listen so start a socket server
parts = self.device[7:].split(':')
host_port = ('', int(parts[1]))
self.server = await asyncio.get_event_loop().create_server(
lambda: self.handler(self),
*host_port,
reuse_address=True,
reuse_port=True,
start_serving=True,
backlog=20,
)
await self.server.serve_forever()
return

while True:
await asyncio.sleep(360)

self.protocol = None
self.transport = None


# --------------------------------------------------------------------------- #
# Creation Factories
Expand Down
19 changes: 9 additions & 10 deletions test/test_examples.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,16 +27,15 @@

_logger = logging.getLogger()
_logger.setLevel("DEBUG")

TEST_COMMS_FRAMER = [
("tcp", ModbusSocketFramer, 5021),
("tcp", ModbusRtuFramer, 5022),
("tls", ModbusTlsFramer, 5023),
("udp", ModbusSocketFramer, 5024),
("udp", ModbusRtuFramer, 5025),
("serial", ModbusRtuFramer, "dummy"),
("serial", ModbusAsciiFramer, "dummy"),
("serial", ModbusBinaryFramer, "dummy"),
("serial", ModbusRtuFramer, "socket://127.0.0.1:5026"),
("serial", ModbusAsciiFramer, "socket://127.0.0.1:5027"),
("serial", ModbusBinaryFramer, "socket://127.0.0.1:5028"),
]


Expand All @@ -59,13 +58,12 @@ async def _helper_server(
test_port,
):
"""Run server."""
if test_comm in ("serial"):
yield
return
args = Commandline
args.comm = test_comm
args.framer = test_framer
args.port = test_port + test_port_offset
args.port = test_port
if isinstance(test_port, int):
args.port += test_port_offset
asyncio.create_task(run_async_server(args))
await asyncio.sleep(0.1)
yield
Expand Down Expand Up @@ -121,7 +119,6 @@ def test_exp_sync_simple(
thread.start()
sleep(1)
ServerStop()
_logger.error("jan igen")


@pytest.mark.parametrize("test_port_offset", [30])
Expand Down Expand Up @@ -151,5 +148,7 @@ async def test_exp_async_framer( # pylint: disable=unused-argument
args = Commandline
args.framer = test_framer
args.comm = test_comm
args.port = test_port + test_port_offset
args.port = test_port
if isinstance(test_port, int):
args.port += test_port_offset
await run_client(test_comm, test_type, args=args)