Elite机器人支持TCP/UDP的服务器和客户端,本章将介绍TCP客户端的实现。在实际应用场景中,若机器人与相机进行通讯,通常情况下,相机会作为一个服务器,并且已经规定客户段请求的数据内容,机器人按照指定的数据内容向相机请求数据,相机接受到指定的请求数据后经过处理返回指定格式的数据。
int connect_tcp_server (std ::string IP , int port)
功能: 连接指定 IP 和 port 的 TCP 服务器
参数: IP:客户端 IP 地址;
port:端口号
返回: 0 未连接,1 连接成功
示例:
connect_tcp_server ("192.168.1.100" ,7777)
int,string client_recv_data (std ::string IP ,std :: double recv_timeout , int hex ,std :: int port)
功能: 客户端接收指定 IP 和端口号的服务器发送来的数据
参数: IP:IP 地址;
recv_timeout: timeout 时间 (秒);
hex:是否为 16 进制数,1 的接收数据为 16 进制字符格式(默认为 0)
port: 可选参数,端口号 (可接收多个端口号)
返回: string 返回从服务器发送来的数据,int 返回 recv 的数量,-1 表示接受失败需要重新连接
示例:
ret ,recv= client_recv_data ("192.168.1.100",0.1 ,0 ,7777) 注: recv_timeout 参 数 可 不 写, 而 用 下 文 函 数 设 置 超 时 时 间
注意:本命令适用于 v2.9.4 及以上版本。 port 参数仅适用于 v2.15.2 及以上版本。
int client_set_recv_timeout (std ::string IP ,std :: double recv_timeout)
功能: 整体设置 recv_timeout 时间与上文中的 recv 组合使用
参数: IP:IP 地址; recv_timeout: timeout 时间 (秒)
返回: 1 表示设置成功,-1 表示失败。
示例:
client_set_recv_timeout ("192.168.1.100",0.1)
int client_send_data (std ::string ip ,std ::string msg ,int hex ,std :: int port)
功能: 客户端向指定 IP 和端口号的服务器发送数据 msg
参数: IP:IP 地址;
msg:向服务器发送的数据返回: string;
hex: 是否为 16 进制数,1 发送数据为 16 进制字符格式(默认为 0)
port: 可选参数,端口号
返回: send 的数量, -1 表示发送失败需要重新连
示例:
client_send_data ("127.0.0.1","OK" ,0 ,7777)
注意:本命令适用于 v2.9.4 及以上版本。 port 参数仅适用于 v2.15.2 及以上版本。
void disconnect_tcp_server (string ip ,std :: int port)
功能: 断开客户端与服务器的连接
参数: IP:IP 地址
port: 可选参数,端口号(不写则默认断开所有 TCP 连接)
返回: 无
示例:
disconnect_tcp_server ("192.168.1.200" ,7777)
注意:port 参数仅适用于 v2.15.2 及以上版本。
以下示例展示了一个客户端与服务器交互的示例代码,该代码在实现TCP客户端通讯的同时,与jbi程序进行交互,可以实现编写jbi程序时,通过变量的方式控制脚本向指定的服务器请求数据,并且将接受到的数据存储至指定变量。用户可以通过此示例进行扩展,可以很快的实现机器人作为客户端,相机作为服务器的通讯案例。
ip = '192.168.1.10' -- 目标服务器端IP地址 port = 7777 -- 目标服务器端口 ---------------------------------------------------------------------------------------------- sleep(2) script_state = 'D0' send_state = 'D1' send_cmd = 'D2' recv_x = 'D10' recv_y = 'D11' recv_z = 'D12' recv_rx = 'D13' recv_ry = 'D14' recv_rz = 'D15' ---------------------------------------------------------------------------------------------- function var_init() -- 脚本启动,变量复位 set_global_variable(script_state, 0) set_global_variable(send_state, 0) set_global_variable(send_cmd, 0) end ---------------------------------------------------------------------------------------------- function get_msgs(i) -- 规定发送指令 -- 根据需要填写对应的命令 local msgs = {} msgs[1] = "This is msg" -- msgs[2] = "Please modify as required" -- msgs[3] = "设置数据发送的内容" -- msgs[4] = "根据实际需求更改对应的命令内容" -- msgs[5] = "" -- msgs[6] = "" -- msgs[7] = "" -- msgs[8] = "" -- msgs[9] = "" -- return msgs[i] end ---------------------------------------------------------------------------------------------- function Tcp_client_init(ip, port) -- 连接服务器,设置超时时间 local ret = connect_tcp_server(ip, port) local RECV_TIME_OUT = 0.1 -- 接收超时时间,根据实际使用情况进行修改 client_set_recv_timeout(ip, RECV_TIME_OUT) if ret == 1 then elite_print("client connect "..ip.." success") else elite_print("connect error") end end ---------------------------------------------------------------------------------------------- function send_msg(data) -- 发送数据 if #data <= 0 then elite_print("data length error") end local ret = client_send_data(ip, data)-- 发送信息 if ret == -1 then elite_print("send data error") end end ---------------------------------------------------------------------------------------------- function repeat_B(i) -- 循环判断变量是否为0 repeat elite_print("Wait "..(i).." ~= 0") sleep(0.5) until(get_global_variable(i) ~= 0) end --------------------------------------------------------------------------------------------- function recv_msg() -- 接收数据 while (1) do local ret, recv = client_recv_data(ip) -- 接收服务器端返回的信息 if ret <= 0 then elite_print("client recv data error") else elite_print(recv) local temp = string.split(data,",") return temp end end end --------------------------------------------------------------------------------------------- function Example1(data) -- 示例数据处理1 for i,v in ipairs(data) do elite_print(v) end end -------------------------------------------main---------------------------------------------- var_init() repeat_B(script_state) -- 等待 B0 为0,连接服务器 elite_print("Script running starts") Tcp_client_init(ip, port) while(get_global_variable(script_state) ~= 0) do is_send = get_global_variable(send_state) if is_send ~= 0 then cmd = get_global_variable(send_cmd) if cmd == 1 then send_msg(get_msgs(cmd)) recv_table = recv_spilt(recv_msg()) -- 数据处理1 -- Example1(recv_table) elseif cmd == 2 then send_msg(get_msgs(cmd)) recv_table = recv_spilt(recv_msg()) -- 数据处理 -- elseif cmd == 3 then send_msg(get_msgs(cmd)) recv_table = recv_spilt(recv_msg()) -- 数据处理 -- end set_global_variable(send_state, 0) set_global_variable(send_cmd, 0) end sleep(0.001) end disconnect_tcp_server(ip) elite_print("Script execution ends")