Скрипты, запущенные из API-интерфейса Mininet Python, перестают работать через некоторое время - PullRequest
0 голосов
/ 09 февраля 2019

Я пытаюсь написать несколько автоматических тестов в 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)

Я уже давно бьюсь над этой проблемой и не могу найти решение.Я что-то упустил?

...