CS機器人運行中socket通訊斷開自動重連
1.簡介
本篇文章介紹CS機器人作客戶端在使用腳本與服務器做socket通訊時怎么樣循環判斷連接,通訊斷開后怎么樣自動連接,以下內容要求機器人應用2.12及以上
2.操作流程
- 建立 TCP/IP 網絡通信
1.當我們單純使用 socket_open()建立 TCP/IP 網絡通信指令時,如果服務器還未打開時,機器人端戶端未連接到服務器,程序依然往下運行,運行到發送/接收時機器人就會報錯如圖1-1所示,這樣機器人就必須初始化重新運行。

圖1-1
2.為了避免圖1-1的情況發生我們可以利用socket_open()建立 TCP/IP 網絡通信時的返回值做條件判斷循環連接直到連接成功后程序才繼續往下運行。如圖1-2所示如果服務器未打開時機器人會一直與服務器建立連接并打印“連接失敗”到EliRobot 的日志欄中。

圖1-2
3 當服務器打開時機器人客戶端連接成功后會打印到“連接成功“EliRobot 的日志欄中如圖1-3所示,可以用下面代碼1-1配合圖1-4的圖形化編程直接調用df腳本實現此操作。


圖1-3

圖1-4

代碼1-1
2.向服務器發送數據
1.我們單純的使用發送指令例如:socket_send_string(str, socket_name="socket_0")未判斷發送是否成功時,如果當機器人客戶端當時已經與服務器斷開連接了或發送失敗后程序依然往下繼續運行,如圖2-1所示。

圖2-1
2.為了避免圖2-1的情況發生,我們可以利用發送指令的返回時作為判斷是否發送成功,發送失敗時一直發送直到發送成功為止,發送失敗的情況一般都是機器人客戶端與服務器斷開連接時出現的,所以我們可以在發送前和發送失敗后通過“socket_is_connected()”判斷與服務器連接的狀態如果斷開重新連接再次發送,如圖2-2所示,可以用下面代碼2-1配合圖2-3的圖形化編程直接調用df腳本實現此操作。

圖2-2

代碼2-1
3.從服務器接收數據
1.當我們單純的使用接收指令例如“socket_read_string(timeout=2)”接收服務器的數據時:
a:如果當機器人與服務器未連接時就接收數據就會如圖3-1所示報錯,此時程序已經停止需要重新初始化程序。
b:如果我們機器人客戶端未接收到數據程序依然會往下繼續運行,這樣就會影響我們的程序流程,如圖3-2所示(未接收到數據,程序依然往下運行,當運行到索引字符串轉換時沒有數據程序就會報錯,這時程序已經停止需要重新初始化程序)。

圖3-1

圖3-2
2.為了避免以上a.b兩種情況發生,我們可以在接收數據之前通過“socket_is_connected()”判斷與服務器連接的狀態如果斷開重新連接,并通過再次接收接收指令例如“socket_read_string(timeout=2)”的返回值判斷是否接收到數據,返回值為0時,再次接收數據,如圖3-3所示,以用下面代碼3-1配合圖3-3的圖形化編程直接調用df腳本實現此操作。

圖3-2

圖3-3

代碼3-1
3.常見問題解答
- 機器人應用版本必須是2.12及以上
- 以上代碼是以發送字符串和讀取字符串為例,如果想發送/讀取其他數據類型,只需要更換代碼中的socket_send_string/socket_read_string即可,具體指令參考CS機器人腳本手冊下載中心_機器人技術-艾利特機器人
腳本文件:socket.script