Приемник Python Socket TCP не ACK правильно отправителя NoOS LWIP - PullRequest
0 голосов
/ 21 апреля 2019

Я пытаюсь установить связь TCP между моим ПК и LWIP MCU. LWIP UDP и ICMP, кажется, работают правильно. Обратите внимание, что LWIP работает как отправитель TCP, а сценарий на основе сокетов PC-Python - как получатель. Принятие соединения первого цикла, кажется, подтверждено правильно. Однако во время отправки TCP-пакета кажется, что ACK ПК неверен - LWIP повторно передает пакет.

Сторона отправителя кода LWIP выглядит следующим образом (очевидная функция LWIP_Process для обработки принятых пакетов и времени обновления, инициализация MCU не показано ....)

static char first_pld[32] = {"Thank you people"};
/* -----------Set network id ----------*/
IP4_ADDR(&ipaddr, 192u, 168u, 100u, 2u);
IP4_ADDR(&ipaddr_pc, 192u, 168u, 100u, 10u);
/* -----------Force ARP discover routine ----------*/
LWIP_arp_query(&ipaddr_pc);
LWIP_Process();
/* -----------Start TCP communication ----------*/
MyTCP = tcp_new();
LWIP_Process(); 
tcp_bind(MyTCP, &ipaddr, 504);
LWIP_Process();
tcp_connect(MyTCP, &ipaddr_pc, 504, MyConnectedFn);
LWIP_Process();
tcp_sent(MyTCP, MySentFn);
LWIP_Process();
printf("TCP available to send: %04d\r\n", tcp_sndbuf(MyTCP));
LWIP_Process();
tcp_write(MyTCP, first_pld, strlen(first_pld), 0);
LWIP_Process();
tcp_output(MyTCP);
LWIP_Process();
while (1) {
    LWIP_Process();
    }
}

Приемник Python:

import socket
import sys
import time


buff_size = 128

# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Bind the socket to the port
modbus_port = 504
this_addres = (b'192.168.100.10', modbus_port)
sock.bind(this_addres)


# Listen for incoming connections
sock.listen(1)

connection_status = 0
while connection_status == 0:
        # Wait for a connection
        print('waiting for a connection')
        connection, client_address = sock.accept()
        connection_status =  1
print("Connected to", client_address)

while 1:
        payload = connection.recv(buff_size)
        print(payload)

Журнал Wireshark показывает сеанс ARP, принимая связь TCP, но Отправка TCP-пакета выглядит некорректно - LWIP повторно отправляет ..

Изображение журнала Wireshark https://ibb.co/Q9fbxZ9

Любой полезный совет, пожалуйста? В настоящее время я пытаюсь найти похожие решенные проблемы ..

1 Ответ

0 голосов
/ 01 мая 2019

Я нашел решение, как это исправить:

Будьте осторожны при создании файлов LWIP netinterface.c / h.

Потому что я хотел omptimize длина переданных буферов (из кадры) Я создал функцию для сокращения массивов, в том числе (иногда) огромное количество символов \ 0 Я сделал это, потому что мое устройство MAC PHY в режиме приема не может вернуть массив пакетов размером менее 60 байт, так, например, кадр ARP (обычно длина 42) заполнен нулями в конце.

Однако, '\ 0' также может быть значением пакета в конце (особенно когда TCP ACK). Я автоматически выкинул этот нуль и LWIP не смог обрабатывать это как действительный пакет. Итак, теперь я передаю целый массив пакетов и пусть LWIP справится с этим самостоятельно ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...