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

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

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


圖1-3

圖1-4

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

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

圖2-2

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

圖3-1

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

圖3-2

圖3-3

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