Saya mencoba mengirim perintah ke perangkat jarak jauh: E5071C ENA Vector Network Analyzer

Ini adalah masalah saya:

  • Ketika saya mencoba mengirim dan menerima data dari soket, itu "hang".

  • Saya tidak yakin jenis soket mana yang harus saya gunakan.

Untuk perintah lainnya, saya menggunakan s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM), tetapi saya hanya perlu mengirim data dalam kasus tersebut. Di sini saya perlu mengirim dan menerima data. Saya telah mencoba menggunakan loop while Trueseperti ini:

while True:
    s.settimeout(1)
    print(sys.stderr, 'waiting for a connection')
    connection, client_address = s.accept()
    try:
        print(sys.stderr, 'client connected:', client_address)
        while True:
            data = connection.recv(1024)
            print(sys.stderr, 'received "%s"') % data
            if data:
                connection.sendall(data)
            else:
                break
    finally:
        connection.close()

Saya juga tidak bisa mendapatkan hasil yang saya inginkan dengan loop sementara, jadi inilah yang saya miliki sejauh ini:

## import modules
## for loop iterations
## commands sent to remote device using UDP socket

def is_hanging(host, port):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((host,port))
    min_msg = ':CALCulate:SELected:MARKer:FUNCtion:TYPE MINimum'
    s.send(min_msg.encode())
    s.settimeout(1)
    try:
        s.recv(1024)
        print("Received data!")
        return True
    except socket.timeout as e:
        print(e)
        return False
    finally:
        s.close()

if is_hanging('10.5.33.16',5025) is True:
    pass
else:
    raise Exception("Could not receive data.")

Saya tidak sepenuhnya yakin bagaimana s.recv bekerja, tetapi yang saya harapkan/harapkan adalah bahwa data yang saya kirim ke perangkat jarak jauh menghasilkan respons yang dikirimkan kembali kepada saya. Saat ini hanya menggantung.

-1
jhcwinters 7 Agustus 2019, 00:00

1 menjawab

Jawaban Terbaik

socket.accept() hanya relevan dalam konteks soket berbasis streaming yang telah dikonfigurasi sebagai soket pendengar. Tidak masuk akal untuk digunakan pada soket datagram, terutama yang sudah dikaitkan dengan host jarak jauh.

(Apakah Anda yakin SOCK_DGRAM -- yaitu UDP -- benar di sini? Sebagian besar perangkat SCPI yang pernah saya gunakan menggunakan TCP, yaitu SOCK_STREAM.)

Jika Anda yakin menggunakan protokol yang benar, hapus panggilan ke s.accept(), dan panggil .recv() pada soket yang ada s.

1
duskwuff -inactive- 6 Agustus 2019, 22:37