Python TCP / IP Communication - PullRequest
       46

Python TCP / IP Communication

0 голосов
/ 25 октября 2018

Это мой код связи Python Modbus TCP, и он ждет на этой линии, а затем останавливается для соединения, где моя ошибка:

sock.connect((TCP_IP, TCP_PORT))

(если я использую ведомую программу, также не работает) Намоя сторона клиента я использую этот код:

TCP_IP='10.0.2.15'
TCP_PORT=502
BUFFER_SIZE=39
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

sock.connect((TCP_IP,TCP_PORT))

Это основная сторона:

# Create a TCP/IP socket
TCP_IP = '10.0.2.2'
TCP_PORT = 502
BUFFER_SIZE = 39
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((TCP_IP, TCP_PORT))



try:

    unitId = 16  # Plug Socket11
    functionCode = 3  # Write coil

    print("\nSwitching Plug ON...")
    coilId = 1
    req = struct.pack('12B', 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, int(unitId), 0x03, 0xff, 0xc0, 0x00,
                  0x00)
    sock.send(req)
    print("TX: (%s)" % req)
    rec = sock.recv(BUFFER_SIZE)
    print("RX: (%s)" % rec)
    time.sleep(2)

    print("\nSwitching Plug OFF...")
    coilId = 2
    req = struct.pack('12B', 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, int(unitId), 0x03, 0xff, 0xc0, 0x00,
                  0x00)
    sock.send(req)
    print("TX: (%s)" % req)
    rec = sock.recv(BUFFER_SIZE)
    print("RX: (%s)" % rec)
    time.sleep(2)

finally:
    print('\nCLOSING SOCKET')
    sock.close()

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Я думаю, что ваш вопрос «Почему зависает вызов sock.connect ()?».Это потому, что по умолчанию он ждет подключения в течение неопределенного времени.Другими словами, вызов по умолчанию является «блокирующим».Если вы хотите подождать до 500 миллисекунд для соединения, вам нужно указать это:

sock.connect(.5) #wait 500 milliseconds for a connection attempt

Также см. Таймаут подключения сокета Python

0 голосов
/ 25 октября 2018

Я думаю, что ваша проблема в IP-адресе: 10.0.2.2, как указано здесь [ Время ожидания подключения к LocalHost / 10.0.2.2 из эмулятора Android .Вы можете заменить '10.0.2.2' на 'localhost' или попытаться найти свой IPv4 адрес.

. Для этого введите ifconfig в командной строке, если вы используете Linux, или введите ipconfig в Windows и найдите * 1009.* address.

Я использовал простой пример клиент-сервер для запуска вашего кода и заменил '10.0.2.2' на 'localhost', и все прошло нормально.

на стороне сервера:

import socket
import struct
import time

TCP_IP = 'localhost'                 
TCP_PORT = 502
BUFFER_SIZE = 39

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(1)
sock, addr = s.accept()
print 'Connected by', addr
try:
    unitId = 16  # Plug Socket11
    functionCode = 3  # Write coil

    print("\nSwitching Plug ON...")
    coilId = 1
    req = struct.pack('12B', 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 
    int(unitId), 0x03, 0xff, 0xc0, 0x00,
    0x00)
    while 1:
        sock.send(req)
        print("TX: (%s)" % repr(req))
        rec = sock.recv(BUFFER_SIZE)
        print("RX: (%s)" % repr(rec))
        time.sleep(2)
        break

    print("\nSwitching Plug OFF...")
    coilId = 2
    req = struct.pack('12B', 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 
    int(unitId), 
    0x03, 0xff, 0xc0, 0x00,
    0x00)
    while 1:
        sock.send(req)
        print("TX: (%s)" % repr(req))
        rec = sock.recv(BUFFER_SIZE)
        print("RX: (%s)" % repr(rec))
        time.sleep(2)
        break
finally:
    sock.close()

на стороне клиента:

import socket

TCP_IP = 'localhost'    
TCP_PORT = 502            
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((TCP_IP, TCP_PORT))

data = sock.recv(1024)
print  repr(data)
while 1:
    sock.send(data)
    print("send back to server: (%s)" % repr(data))
    break

data = sock.recv(1024)
print  repr(data)
while 1:
    sock.send(data)
    print("send back to server: (%s)" % repr(data))
    break
sock.close()

убедитесь, что вы запускаете сервер и клиент в отдельных файлах / терминалах

...