통합 예제 - Tcp/Server
client는 제어기 IP = 192,168,137.100, port = 20002로 접속을 하고
수신한 패킷을 그대로 server 에게 전송하는 동작(mirroring)을 한다고 가정합니다.
예제 1 : 기본 Tcp Server예제
g_sock = server_socket_open(20002)
tp_popup("connect O.K!",DR_PM_MESSAGE)
while 1:
server_socket_write(g_sock, b"abcd") # byte형으로 스트링 “abcd” 전송
wait(0.1)
res, rx_data = server_socket_read(g_sock) #server로부터 수신 대기
tp_popup("res={0}, rx_data ={1}".format(res, rx_data), DR_PM_MESSAGE)
wait(0.1)
port = 20002를 열고 client가 접속할 때까지 기다립니다.
접속된 client에 접속하고 byte형 “abcd”를 전송합니다.
client로 부터 수신된 메시지를 TP에 출력합니다.
client는 수신된 데이터를 그대로 송신하므로 res = 4, rx_data=b”abcd” 가 됩니다.
예제 2 : 다양한 패킷 전송 예제
송신 패킷 : “MEAS_START" +data1[4byte]+data2[4byte]
data1: integer를 4byte로 변환 ex) 1 → 00000001
data2: integer를 4byte로 변환 ex) 2 → 00000002
ex) data1=1, data2=2 인 경우: “MEAS_START"+00000001+00000002
실제 패킷: 4D4541535F53544152540000000100000002
수신 패킷 : res=18, rx_data=“MEAS_START"+00000001+00000002
rxd1 추출 : 10~14번째 byte를 interger로 변환
rxd2 추출 : 14~18번째 byte를 interger로 변환
g_sock = server_socket_open(20002)
tp_popup("connect O.K!",DR_PM_MESSAGE)
send_data = b"MEAS_START"
data1 =1
data2 =2
send_data += (data1).to_bytes(4, byteorder='big')
send_data += (data2).to_bytes(4, byteorder='big')
server_socket_write(g_sock, send_data)
wait(0.1)
res, rx_data = server_socket_read(g_sock)
tp_popup("res={0}, rx_data ={1}".format(res, rx_data), DR_PM_MESSAGE)
rxd1 = int.from_bytes(rx_data[10:10+4], byteorder='big', signed=True)
rxd2 = int.from_bytes(rx_data[14:14+4], byteorder='big', signed=True)
tp_popup("res={0}, rxd1={1}, rxd2={2}".format(res, rxd1, rxd2), DR_PM_MESSAGE)
server_socket_close(g_sock)
client에 byte형 send_data를 전송합니다.
client는 수신된 데이터를 그대로 송신하므로 res = 18, rx_data는 send_data와 같은 패킷을 가집니다.
rxd1 추출 : 10~14번째 byte를 interger로 변환
rxd2 추출 : 14~18번째 byte를 interger로 변환
최종 결과는 res=18, rxd1=1, rxd2=2 가 됩니다.
예제 3 : 재 접속
def fn_reopen():
global g_sock
server_socket_close(g_sock)
g_sock = server_socket_open(20002)
return
g_sock = server_socket_open(20002)
tp_popup("connect O.K!",DR_PM_MESSAGE)
server_socket_write(g_sock, b"abcd")
wait(0.1)
while 1:
res, rx_data = server_socket_read(g_sock)
if res < 0:
fn_reopen()
else:
tp_popup("res={0}, rx_data ={1}".format(res, rx_data), DR_PM_MESSAGE)
wait(0.1)
server_socket_read() 명령어의 리턴값을 체크합니다.
client 와 접속이 끊어지거나, 통신 문제가 발생하면 음수 값이 리턴됩니다.
음수값이 리턴된 경우 reopen() 함수를 호출하여 client 접속을 기다립니다.
재 접속 open 시, 기존에 open된 소켓을 닫는 것에 유의 바랍니다.