Android是移動設備的主流操作系統,近年來越來越多的工業領域的客戶開始關注基于Android操作系統的設備在工控領域的應用。鑒于Android是基于Linux內核的事實,我們發展了一種以雙應用進程為特色的Android工控應用方案,并在ESM6802工控主板上加以實現。具體說來,就是在Linux平臺上運行一個直接操作硬件接口的控制通訊管理進程,為保證運行效率,該進程采用C/C++語言編寫(以下簡稱C進程或控制進程);另一方面在Android平臺采用標準Java語言編寫一個人機界面進程(以下簡稱Java進程)。底層的控制進程并不依賴與上層的Java進程而獨立運行,兩個進程之間通過本地IP進行通訊,控制進程處于服務器偵聽模式,Java進程則為客戶端模式。本方案的主要優點是客戶可以直接繼承已有的現成應用程序作為底層控制進程的基礎,僅僅增加標準的Socket偵聽功能,即可快速完成新的底層應用程序的設計。而界面的Java程序,由于不再涉及具體的工控硬件接口,屬于單純的Android程序,編程難度也大大降低。
設計Android雙應用進程Demo程序的目的就是驗證“雙應用進程”Android工控應用方案的可行性,同時起到一個拋磚引玉的作用。本設計文檔將具體講解設計思路,約束通信協議和接口。
本文PDF下載:Android雙應用進程工控方案(二)——Android雙應用進程Demo程序設計
1、總體描述
總體要求如下:
● 采用C/S(客戶端/服務端)模式,通過socket連接,通信需要自定義通信協議
● 客戶端使用Java語言開發,主要是人機交互,查詢以及簡單的設置功能
● 服務端使用C/C++語言開發,主要是各個功能模塊的業務邏輯正常運行,以及接收處理客戶端的人機交互請求
● 服務端各個功能模塊的業務邏輯部分始終正常運行,客戶端連接與否,不影響各個模塊的工作
● 客戶端接入后,固定周期向服務端發出刷新數據請求,服務端響應后,客戶端僅刷新有改變的UI部件
圖1 C/S工作模式示意圖
如圖1所示,Android開機后,服務端C/C++程序自動運行,此時整個控制系統已經運轉起來,各個功能模塊下的設備都已進入正常工作模式。這里以GPIO和串口設備作為示例,其中GPIO模擬開關狀態變量,串口模擬通信設備。server模塊監聽client的連接,當有client接入后,響應client的請求,將GPIO狀態、串口的數據統計信息,按照自定義的通信協議封裝成協議包,通過socket發送給client。如果沒有client接入,或者client接入斷開,各個功能模塊依然正常工作。也就是說,服務端C/C++程序完全可以在沒有客戶端的情況下,自動運轉各個功能模塊;客戶端的接入,主要是為了方便人為監控。
2、模擬業務描述
在上一節的描述下,我們模擬某個控制系統(控制進程)的實際控制設備如下:
● 設備1:兩個GPIO,其中GPIO0作為警報輸入,GPIO1作為消防輸出??刂七M程啟動后一直監聽GPIO0,當GPIO0輸入高電平時,控制進程設置GPIO1輸出低電平;當GPIO0輸入低電平時,GPIO1輸出高電平
● 設備2:1個串口設備,控制進程開啟后,串口設備周期性自動發送固定字符串,接收線程一直開啟
在Android的人機界面進程(Java進程)中,需要做的有:
● 查詢并顯示GPIO0和GPIO1的狀態
● 查詢并顯示串口設備的發送/接收計數值、底層串口的自動發送周期值
● 設置底層串口的自動發送周期
● 清零底層串口的發送/接收計數值
3、自定義通信協議
客戶端與服務端之間通過socket連接通信,由于socket流傳輸是沒有邊界概念的,可能存在“分包”或“黏包”的情況,這就要求用戶自定義通信協議,用以從socket字節流中提取出完整的通信包,解析此通信包,完成通信。
根據模擬業務描述,在此Demo程序中,采用下圖所示的通信包結構:
圖2 自定義通信協議包
Head:包頭,2字節,固定0xFF0x02
Len:包剩余(ID+Type+Data+Csum)長度,4字節,范圍0~1018(1024-2-4)
ID:設備標號,1字節,表明此包來自于客戶端還是服務端(可以不用)
‘S’-- 服務端
‘C’-- 客戶端
Type:數據類型,1字節,表明此包的具體指令目的
‘q’-- 來自客戶端,查詢所有參數(gpio狀態、串口發送/接收字節數、自動發送周期)
‘r’-- 來自服務端,應答客戶端‘q’查詢
‘s’-- 來自客戶端,設置底層串口自動發送的周期
‘c’-- 來自客戶端,底層串口發送接收計數清零
Data:數據內容,長度不定字節,長度范圍0~1015字節
Type=‘q’時,data沒有意義,長度可以為0
Type=‘r’時,data長度14字節,gpio0狀態(1字節)+gpio1狀態(1字節)+串口rx計數(4字節)+ 串口tx計數(4字節)+串口自動發送周期(4字節)
Type=‘s’時,data長度4字節,表示設置底層串口自動發送的周期
Type=‘c’時,data沒有意義,長度可以為0
Csum:校驗和,1字節,從ID到Data結束的校驗和(反碼),接收端ID+Type+data+Csum=0即為正確接收
4、服務端C/C++程序
服務端C/C++程序是“雙應用進程”模式中的控制進程,其主要功能有兩個方面:一是能夠自動運轉各個功能模塊,控制完成主要的業務邏輯;二是監聽客戶端連接,解析響應客戶端請求。
4.1 自動運轉各個功能模塊
在此demo程序中,功能模塊主要是gpio和串口,gpio模擬開關量,串口模擬通信設備。因此,創建MyGPIO和MySerial兩個類。下面簡單介紹下這兩個類的public接口。
圖3 MyGPIO類
MyGPIO的init接口主要是打開/dev/esm6800_gpio這個設備節點。run接口主要是新建線程開啟GPIO相關的業務工作,這里假設GPIO0作為輸入,GPIO1作為輸出,當檢測到GPIO0為低電平狀態時,GPIO1輸出高電平;反之,當GPIO0位高電平時,GPIO1輸出低電平。stop接口為停止GPIO業務,退出GPIO業務線程。getGPIOStateByIndex接口可以讀取gpio-index的輸入/輸出電平狀態。
同樣,對于MySerial類,也提供init、run、stop接口,另外提供了getCountInfo接口,讀取傳送計數信息,clearCount接口對計數清零。run接口開啟串口業務線程,這里模擬業務為周期性的向串口發送數據(接收線程一直接收串口數據),因此還提供了一個設置周期的公共接口setPeriod和查詢接口getPeriod。
圖4 MySerial類部分公共接口
4.2 監聽客戶端連接,解析響應客戶端請求
此部分主要對應圖1中的Server模塊,為此創建一個MyServer類,其頭文件如圖5所示。其中,registerDev接口用于向MyServer類注冊設備,主要是將設備類(MyGPIO、MySerial)的指針傳遞給MyServer類,當MyServer類解析通信包后,可以通過設備類的指針調用其公共接口,查詢/設置相關參數。run函數開啟服務器,監聽本地網絡(127.0.0.1)的默認端口9733,進入accept等待連接狀態。
圖5 MyServer類
4.3 main函數工作流程
在main函數中,首先將GPIO設備和串口設備注冊到Server模塊中;然后初始化并運行GPIO和串口的具體工作任務;最后運行Server模塊,開始監聽本地端口9733,如果有連接到來,就建立新連接,解析來自客戶端的協議幀,根據協議棧中的信息,調用GPIO、串口設備的公共接口得到響應信息,響應客戶端請求。main函數的流程如下圖所示:
圖6 main函數
5、客戶端Android Java程序
圖7 客戶端初始化
圖8 客戶端連接本地端口
客戶端啟動后,新建socket連接本地IP地址的默認端口(127.0.0.1:9733),如圖7和圖8所示。建立連接后,以固定周期向服務器發送查詢請求,然后刷新界面。
圖9 客戶端界面(正常狀態)
圖10 客戶端界面(報警狀態)
如圖9和圖10所示,“警報輸入狀態”和“消防栓輸出狀態”分別讀取的GPIO0和GPIO1的狀態,當GPIO0輸入高電平時(報警輸入狀態OFF),服務端自動控制GPIO1輸出低電平(消防栓輸出狀態OFF);反之,當GPIO0輸入低電平時(報警輸入狀態ON),服務端控制GPIO1輸出高電平(消防栓輸出狀態ON)。
“串口設備”模擬通信設備,這里僅獲取了發送和接收計數值。為了模擬通信設備的自動獨立運行,我們讓串口周期自動發送字符串,而這個周期值可以在點擊“串口設備”彈出的對話框中的設置。如圖11所示,在彈出的對話框中,還可以選擇清零底層串口的發送/接收計數值。這樣就加入了人為的控制。
最后,“設置”項主要設置UI進程相關的屬性,比如訪問服務器獲取信息的“刷新周期”等。
圖11 串口設置對話框
6、總結
“雙應用進程”方案設計的應用程序,在原來的C/C++程序基礎上,添加一個server模塊,將工作設備(GPIO、串口)的運轉信息通過本地網絡(127.0.0.1)的socket傳送給了Android UI端顯示;同時,server模塊又能接收UI端的人機交互命令,并設置到對應工作設備。這其中,主要工作是抽象出server與各工作設備間的通信方式,以及server與UI端的自定義通信協議及解析。此方案充分利用了原有的C/C++程序,加快了底層業務邏輯的開發進度;同時,也降低了Java端界面開發的難度。
本文在server與各工作設備間的通信方式,以及server與UI端的自定義通信協議及解析方面只是針對第二節中簡單模擬業務而設定的,其目的在于驗證方案的可行性,起到拋磚引玉的作用。如果用戶對此方案感興趣,英創會提供此demo程序的源碼,供客戶參考。
成都英創信息技術有限公司 028-8618 0660