Сброс соединения по пиру при отправке с аппаратного обеспечения (модуль GPRS), но нормально при отправке с ПК - PullRequest
0 голосов
/ 16 апреля 2019

tl; dr

  • Отправка одних и тех же данных с ПК и модуля GPRS Quectel
  • При отправке из Quectel сервер выдает исключение Connection reset by peer
  • Но Quectel работает в производственной среде, в которой есть тот же экземпляр EC2-micro и балансировщик нагрузки.
  • Кроме Quectel, другой модуль GPRS - Neoway M680 - работает с этим экземпляром EC2.

Настройка

Локальная - Настройка У меня есть Quectel M66 , модуль GPRS, который я использую для подключения к серверу ( AWS EC2 ) и передачи некоторых данных.У меня также есть python script, который я сделал для подключения и отправки тех же данных с помощью ПК.Ниже приведен скрипт Python

import socket
import sys
from io import open
from time import sleep

'''
Python script to send data to remote server
'''
#replace address with the remote server address
HOST, PORT = '127.0.0.1', 3000 

if len(sys.argv) < 2:
    error = "Error:"
    print("{} {}".format(error, "Pass in the file to be send"))
    exit(1)

filename = sys.argv[1]

with open(filename, "r", newline="\r") as f:
    lines = f.readlines()

data = "".join(lines)

# Create a socket (SOCK_STREAM means a TCP socket)
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
    # Connect to server and send data
    sock.connect((HOST, PORT))
    sock.sendall(bytes(data, "utf-8"))

    # Receive data from the server and shut down
    received = r"{}".format(sock.recv(1024))
    sock.close()

print("Received: {}".format(received))

Remote - Setup Я использую экземпляр EC2-micro, который запускает скрипт Python, который просто прослушивает порт и печатает полученные данные, а также отправляет ответ, который жестко запрограммирован.Вот сценарий

#!/usr/bin/env python3

'''
Python code running on EC2-micro
'''

import socket
import errno
from datetime import datetime

print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'))

HOST = '0.0.0.0'  # Standard loopback interface address (localhost)
PORT = 3000       # Port to listen on (non-privileged ports are > 1023)

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()
    with conn:
        print('Connected by', addr)
        while True:
            try:
                data = r"{}".format(conn.recv(1024))
                print("Received: {}".format(data))
                #respond back with $E0A0
                conn.sendall(bytes("$E0A0:8B\r$E0FF\r", "utf-8"))
                conn.close()
                s.close()
                break
            except socket.error as e:
                if e.errno != errno.ECONNRESET:
                    raise
                if e.errno == errno.ECONNRESET:
                    printf("Connection reset by peer error again")
                    raise #it is failing here
                pass

Тестирование

Модуль GPRS Quectel

Когда я пытаюсь отправить данные с помощью модуля Quectel, используя AT Commands, то, что я вижу со стороны аппаратного обеспечения (quectel), это то, что соединение было CLOSED

17:29:05.652 [Tx] AT+QIOPEN="TCP","127.0.0.1",3000\r
17:29:05.672 [Rx] \r\nOK\r\n\r\nCONNECT OK\r\n
17:29:07.699 [Tx] AT+SEND=1\r
17:29:07.718 [Rx] >
17:29:08.603 [Tx] A
17:29:08.647 [Rx] \r\nSEND OK\r\n
17:29:09.446 [Rx] CLOSED

, и код, работающий на EC2, падает с:

Connection reset by peer error again
Traceback (most recent call last):
  File "./server.py", line 22, in <module>
    data = r"{}".format(conn.recv(1024))
ConnectionResetError: [Errno 104] Connection reset by peer

Но этого не происходит, когда я тестирую с использованием скрипта python (первый код приведен выше)

Запуск скрипта python с ПК

$ python client.py data
Received: b'$E0A0:8B\r$E0FF\r'

Еще несколько замечаний:

  • Это оборудование (quectel) используется в производственной среде и работает там, как и ожидалось.Только в этом новом независимом экземпляре (без load balancing) происходит сбой с Connection reset by peer
  • Я узнал, что это может быть из-за (от здесь )
    • ресурсаограничение на стороне сервера
    • Высокий трафик
  • Но этот новый экземпляр больше ничего не делает.Я также проверил CloudWatch и никакого скачка загрузки процессора не было замечено .

Вопрос

  1. Как вы думаете, это проблема насерверная сторона?
    • Поскольку модуль Quectel ответил SEND OK, из документации мы можем быть уверены, что данные покинули модуль.И TCP обещает доставку данных
    • Но ясно, прежде чем данные могут быть получены / прочитаны, мы получаем Connection reset by peer
  2. Это проблема производительности / инфраструктуры?
    • Все, что я мог найти, это звучало разумно, так это то, что серверу может быть меньше памяти или других ресурсов

1 Ответ

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

Это была проблема с бэкэндом.Проблема белого списка портов.

...