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

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

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


圖1-3

圖1-4

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

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

圖2-2

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

圖3-1

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

圖3-2

圖3-3

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