Socat для имитации шумной последовательной линииPython

Программы на Python
Anonymous
Socat для имитации шумной последовательной линии

Сообщение Anonymous »

В образовательных целях у меня есть несколько сценариев.

Основной из них — симуляция зашумленной последовательной линии с помощью socat (сейчас у меня есть версия 1.7.4)
Я уточню:

У меня есть программное обеспечение, которое связано с протоколами через последовательный порт. Мне нужно проверить его надежность и производительность на наличие ошибок и проблем со связью, короче говоря, на наличие зашумленных каналов.

С помощью socat я могу создать «чистый» виртуальный канал:

Код: Выделить всё

socat -d -d -v -x pty,raw,echo=0,link=/tmp/ttyV1 pty,raw,echo=0,link=/tmp/ttyV2
Я ищу способ «повреждать» данные между ttyV1 и ttyV2 (и наоборот).

Я думал о скрипте Python, который каким-то образом получает данные, отправленные в ttyV1, обрабатывает их, а затем передает в ttyV2.

Я попробовал это, запустив 3 экземпляра socat:
  • socatX: это то, что создает pty с помощью socat -d - d -v -x pty,raw,echo=0,link=/tmp/ttyV1 pty,raw,echo=0,link=/tmp/ttyV2
  • socat1: is socat -d -d -v -x /tmp/ttyV1,raw,echo=0 EXEC: "python3 беспокой_script.py",pty,raw,echo=0
    socat2: is socat -d -d -v -x /tmp/ttyV2,raw,echo=0 EXEC: "python3 беспокоить_script.py",pty,raw, echo=0
в данном случае путем отправки данных в /tmp/ttyV1, например с помощью cat >/tmp/ ttyV1, я вижу, что данные передаются без изменений. Я вижу трассировку данных (благодаря параметрам -x -v socat) только в сеансе socatX.

Я попробовал завершить socat1 и socat2, не трогая socatX, и данные продолжаются течь. Поэтому я подумал, что отправка данных в /tmp/ttyV1 включает только socatX.
затем я кое-что изменил:
  • socat1: создайте первый pty с помощью socat -d -d -v -x pty,raw,echo=0,link=/tmp/ttyV1 EXEC: "python3 беспокой_script.py", pty,raw,echo=0
  • socat2: создайте второй pty с помощью socat -d -d -v -x pty,raw,echo =0,link=/tmp/ttyV2 EXEC: "python3 беспокой_script.py",pty,raw,echo=0
  • socatX: I хотелось бы связать два pty с помощью socat -d -d -v -x /tmp/ttyV1,raw,echo=0 /tmp/ttyV2,raw,echo=0
в этом случае данные, всегда отправляемые с помощью cat >/tmp/ttyV1, не передаются в /tmp/ttyV2. И я вижу трассировки данных только на socat1.
скрипт Python такой:

Код: Выделить всё

import sys
import random
import os

def disturb(data):
""" Disturb data by altering or deleting characters. """
result = bytearray()
for byte in data:
if random.random() < 0.1:  # 10% chance to change a bit in a byte
byte ^= 1  0.05:  # 95% chance to keep the byte
result.append(byte)
return bytes(result)

def main():
while True:
data = sys.stdin.buffer.read(128)
if not data:
break
print(f"Received data: {data}")  # Debug print
disturbed_data = disturb(data)
print(f"Sending data: {disturbed_data}")  # Debug print
sys.stdout.buffer.write(disturbed_data)
sys.stdout.buffer.flush()

if __name__ == '__main__':
main()
Как мне достичь своей цели?
PS:

В начале я рассказал вам о других сценариях.

Другой сценарий — это тот, где у меня есть настоящий серийный номер; Я должен создать виртуальный последовательный порт, подключенный к нему, и между ними поместить скрипт, который обрабатывает (шифрует/расшифровывает) данные

Подробнее здесь: https://stackoverflow.com/questions/784 ... erial-line

Вернуться в «Python»