lua脚本实现TCP客户端通信及交互示例
  • Socket
  • TCPIP
  • 客户端
  • 服务器
  • 网络通讯
Elite
Always Easier Than Before

Elite机器人支持TCP/UDP的服务器和客户端,本章将介绍TCP客户端的实现。在实际应用场景中,若机器人与相机进行通讯,通常情况下,相机会作为一个服务器,并且已经规定客户段请求的数据内容,机器人按照指定的数据内容向相机请求数据,相机接受到指定的请求数据后经过处理返回指定格式的数据。

接口详解

1. 连接服务器

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)

2. 接收服务器数据

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 及以上版本。

3. 设置整体超时时间

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)

4. 向服务器发送数据

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 及以上版本。

5. 断开TCP连接

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")


点击显示全文
赞同1
发表评论
分享

手机扫码分享
0
1.652K
收藏
举报
收起
登录
  • 密码登录
  • 验证码登录
还没有账号,立即注册
还没有账号,立即注册
注册
已有账号,立即登录
选择发帖板块
举报
请选择举报理由
举报
举报说明