Я пытаюсь написать несколько автоматических тестов в mininet , цель которых:
- Чтобы создать простую топологию
- Чтобы выполнить некоторое взаимодействие между сервероми клиент
- Для сбора некоторых данных и остановки через некоторое время
Я могу запустить этот тест, запустив конфигурацию miniedit и вручную запустив сценарии сервера и клиента на двух терминалах, подключенных кхосты, этот сценарий работает нормально.
Однако я пытаюсь сделать это с помощью API Python, но скрипты, которые я запускаю на хостах, перестают работать правильно после обмена несколькими пакетами.Как я уже говорил, эти два скрипта работают нормально, если я запускаю их вручную на двух терминалах, поэтому я думаю, что может быть другая проблема.Первоначально я думал, что это может быть ошибка в модулях, которые я использую для реализации серверных и клиентских скриптов ( pyModbus и pyModbusTCP ), но тот факт, что они работают без проблем при запуске вручнуюзаставляет меня думать, что я могу делать что-то не так, когда запускаю скрипты через API Python.
Это скрипт, который запускает симуляцию:
#!/usr/bin/python
from mininet.topo import Topo
from mininet.net import Mininet
from mininet.util import dumpNodeConnections
from mininet.log import setLogLevel
# The first argument is the project path
clientPath = sys.argv[1] + 'test/integration/test_training/client.py'
serverPath = sys.argv[1] + 'test/integration/test_training/server.py'
class SingleSwitchTopo(Topo):
def build(self, n=2):
switch = self.addSwitch('s1')
for h in range(n):
host = self.addHost('h%s' % (h + 1))
self.addLink(host, switch)
def test():
topo = SingleSwitchTopo(n=2)
net = Mininet(topo)
net.start()
hosts = net.hosts
server = hosts[0]
client = hosts[1]
# Start the server process in the background
server.sendCmd('python3 ' + serverPath)
# Start the client and print the output
client.cmdPrint('python3 ' + clientPath)
# Here there would be the rest of the test
if __name__ == '__main__':
setLogLevel('info')
test()
Когда этот скриптзапускается логи, показывающие, что ответы правильно получены клиентом в течение некоторого времени.Однако в определенный момент сервер всегда начинает отправлять пустые ответы, этого никогда не происходит, когда я запускаю сценарии вручную в конфигурации miniedit.
Это сценарии сервера и клиента (это простые pyModbus и pyModbusTCPсценарии, которые приведены в качестве примеров по умолчанию):
Сервер
Этот сервер в основном периодически обновляет некоторые значения и прослушивает запросы.
#!/usr/bin/python3
from pymodbus.server.async import StartTcpServer
from pymodbus.device import ModbusDeviceIdentification
from pymodbus.datastore import ModbusSequentialDataBlock
from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext
from twisted.internet.task import LoopingCall
server_ip = '10.0.0.1'
server_port = 502
start_address = 1
final_address = [1]*100
#LOG
import logging
logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)
init_val = 0
# updating server function
def updating_server(a):
log.debug("updating PLC registers..")
context = a[0]
register = 4
slave_id = 0x00
address = 0
values = context[slave_id].getValues(register, address, count=5)
values = [v + 1 for v in values]
log.debug("new values: " + str(values))
context[slave_id].setValues(register, address, values)
store = ModbusSlaveContext(
di = ModbusSequentialDataBlock(0, [1]*100),
co = ModbusSequentialDataBlock(0, [2]*100),
hr = ModbusSequentialDataBlock(0, [3]*100),
ir = ModbusSequentialDataBlock(0, [init_val]*100))
context = ModbusServerContext(slaves=store, single=True)
identity = ModbusDeviceIdentification()
identity.VendorName = 'Pymodbus'
identity.ProductCode = 'PM'
identity.VendorUrl = 'http://github.com/bashwork/pymodbus/'
identity.ProductName = 'Pymodbus Server'
identity.ModelName = 'Pymodbus Server'
identity.MajorMinorRevision = '1.0'
#server run and update
time = 0.5
loop = LoopingCall(f=updating_server, a=(context,))
loop.start(time, now=False)
StartTcpServer(context, identity=identity, address=(server_ip, server_port))
Клиент
Этот клиент подключается к серверу и периодически отправляет запросы.
#!/usr/bin/python3
from pyModbusTCP.client import ModbusClient
import time
server_ip = '10.0.0.1'
server_port = 502
c = ModbusClient(host=server_ip, port=server_port, auto_open=True)
c.debug(True)
while True:
if c.is_open():
# read 5 input registers starting at address 0
values = c.read_input_registers(0, 5)
print(values)
time.sleep(0.1)
else:
c.open()
time.sleep(0.5)
Я уже давно бьюсь над этой проблемой и не могу найти решение.Я что-то упустил?