0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

英創(chuàng)信息技術(shù)Android雙應(yīng)用進(jìn)程Demo程序設(shè)計(jì)

英創(chuàng)信息技術(shù) ? 來(lái)源:英創(chuàng)信息技術(shù) ? 作者:英創(chuàng)信息技術(shù) ? 2020-02-06 11:27 ? 次閱讀

Android是移動(dòng)設(shè)備的主流操作系統(tǒng),近年來(lái)越來(lái)越多的工業(yè)領(lǐng)域的客戶(hù)開(kāi)始關(guān)注基于Android操作系統(tǒng)的設(shè)備在工控領(lǐng)域的應(yīng)用。鑒于Android是基于Linux內(nèi)核的事實(shí),我們發(fā)展了一種以雙應(yīng)用進(jìn)程為特色的Android工控應(yīng)用方案,并在ESM6802工控主板上加以實(shí)現(xiàn)。具體說(shuō)來(lái),就是在Linux平臺(tái)上運(yùn)行一個(gè)直接操作硬件接口的控制通訊管理進(jìn)程,為保證運(yùn)行效率,該進(jìn)程采用C/C++語(yǔ)言編寫(xiě)(以下簡(jiǎn)稱(chēng)C進(jìn)程或控制進(jìn)程);另一方面在Android平臺(tái)采用標(biāo)準(zhǔn)Java語(yǔ)言編寫(xiě)一個(gè)人機(jī)界面進(jìn)程(以下簡(jiǎn)稱(chēng)Java進(jìn)程)。底層的控制進(jìn)程并不依賴(lài)與上層的Java進(jìn)程而獨(dú)立運(yùn)行,兩個(gè)進(jìn)程之間通過(guò)本地IP進(jìn)行通訊,控制進(jìn)程處于服務(wù)器偵聽(tīng)模式,Java進(jìn)程則為客戶(hù)端模式。本方案的主要優(yōu)點(diǎn)是客戶(hù)可以直接繼承已有的現(xiàn)成應(yīng)用程序作為底層控制進(jìn)程的基礎(chǔ),僅僅增加標(biāo)準(zhǔn)的Socket偵聽(tīng)功能,即可快速完成新的底層應(yīng)用程序的設(shè)計(jì)。而界面的Java程序,由于不再涉及具體的工控硬件接口,屬于單純的Android程序,編程難度也大大降低。

設(shè)計(jì)Android雙應(yīng)用進(jìn)程Demo程序的目的就是驗(yàn)證“雙應(yīng)用進(jìn)程”Android工控應(yīng)用方案的可行性,同時(shí)起到一個(gè)拋磚引玉的作用。本設(shè)計(jì)文檔將具體講解設(shè)計(jì)思路,約束通信協(xié)議和接口。

本文PDF下載:Android雙應(yīng)用進(jìn)程工控方案(二)——Android雙應(yīng)用進(jìn)程Demo程序設(shè)計(jì)

1、總體描述

總體要求如下:

●采用C/S(客戶(hù)端/服務(wù)端)模式,通過(guò)socket連接,通信需要自定義通信協(xié)議

●客戶(hù)端使用Java語(yǔ)言開(kāi)發(fā),主要是人機(jī)交互,查詢(xún)以及簡(jiǎn)單的設(shè)置功能

●服務(wù)端使用C/C++語(yǔ)言開(kāi)發(fā),主要是各個(gè)功能模塊的業(yè)務(wù)邏輯正常運(yùn)行,以及接收處理客戶(hù)端的人機(jī)交互請(qǐng)求

●服務(wù)端各個(gè)功能模塊的業(yè)務(wù)邏輯部分始終正常運(yùn)行,客戶(hù)端連接與否,不影響各個(gè)模塊的工作

●客戶(hù)端接入后,固定周期向服務(wù)端發(fā)出刷新數(shù)據(jù)請(qǐng)求,服務(wù)端響應(yīng)后,客戶(hù)端僅刷新有改變的UI部件

圖1C/S工作模式示意圖

如圖1所示,Android開(kāi)機(jī)后,服務(wù)端C/C++程序自動(dòng)運(yùn)行,此時(shí)整個(gè)控制系統(tǒng)已經(jīng)運(yùn)轉(zhuǎn)起來(lái),各個(gè)功能模塊下的設(shè)備都已進(jìn)入正常工作模式。這里以GPIO和串口設(shè)備作為示例,其中GPIO模擬開(kāi)關(guān)狀態(tài)變量,串口模擬通信設(shè)備。server模塊監(jiān)聽(tīng)client的連接,當(dāng)有client接入后,響應(yīng)client的請(qǐng)求,將GPIO狀態(tài)、串口的數(shù)據(jù)統(tǒng)計(jì)信息,按照自定義的通信協(xié)議封裝成協(xié)議包,通過(guò)socket發(fā)送給client。如果沒(méi)有client接入,或者client接入斷開(kāi),各個(gè)功能模塊依然正常工作。也就是說(shuō),服務(wù)端C/C++程序完全可以在沒(méi)有客戶(hù)端的情況下,自動(dòng)運(yùn)轉(zhuǎn)各個(gè)功能模塊;客戶(hù)端的接入,主要是為了方便人為監(jiān)控。

2、模擬業(yè)務(wù)描述

在上一節(jié)的描述下,我們模擬某個(gè)控制系統(tǒng)(控制進(jìn)程)的實(shí)際控制設(shè)備如下:

●設(shè)備1:兩個(gè)GPIO,其中GPIO0作為警報(bào)輸入,GPIO1作為消防輸出。控制進(jìn)程啟動(dòng)后一直監(jiān)聽(tīng)GPIO0,當(dāng)GPIO0輸入高電平時(shí),控制進(jìn)程設(shè)置GPIO1輸出低電平;當(dāng)GPIO0輸入低電平時(shí),GPIO1輸出高電平

●設(shè)備2:1個(gè)串口設(shè)備,控制進(jìn)程開(kāi)啟后,串口設(shè)備周期性自動(dòng)發(fā)送固定字符串,接收線程一直開(kāi)啟

在Android的人機(jī)界面進(jìn)程(Java進(jìn)程)中,需要做的有:

●查詢(xún)并顯示GPIO0和GPIO1的狀態(tài)

●查詢(xún)并顯示串口設(shè)備的發(fā)送/接收計(jì)數(shù)值、底層串口的自動(dòng)發(fā)送周期值

●設(shè)置底層串口的自動(dòng)發(fā)送周期

●清零底層串口的發(fā)送/接收計(jì)數(shù)值

3、自定義通信協(xié)議

客戶(hù)端與服務(wù)端之間通過(guò)socket連接通信,由于socket流傳輸是沒(méi)有邊界概念的,可能存在“分包”或“黏包”的情況,這就要求用戶(hù)自定義通信協(xié)議,用以從socket字節(jié)流中提取出完整的通信包,解析此通信包,完成通信。

根據(jù)模擬業(yè)務(wù)描述,在此Demo程序中,采用下圖所示的通信包結(jié)構(gòu):

圖2自定義通信協(xié)議包

Head:包頭,2字節(jié),固定0xFF0x02

Len:包剩余(ID+Type+Data+Csum)長(zhǎng)度,4字節(jié),范圍0~1018(1024-2-4)

ID:設(shè)備標(biāo)號(hào),1字節(jié),表明此包來(lái)自于客戶(hù)端還是服務(wù)端(可以不用)

‘S’-- 服務(wù)端

‘C’-- 客戶(hù)端

Type:數(shù)據(jù)類(lèi)型,1字節(jié),表明此包的具體指令目的

‘q’-- 來(lái)自客戶(hù)端,查詢(xún)所有參數(shù)(gpio狀態(tài)、串口發(fā)送/接收字節(jié)數(shù)、自動(dòng)發(fā)送周期)

‘r’-- 來(lái)自服務(wù)端,應(yīng)答客戶(hù)端‘q’查詢(xún)

‘s’-- 來(lái)自客戶(hù)端,設(shè)置底層串口自動(dòng)發(fā)送的周期

‘c’-- 來(lái)自客戶(hù)端,底層串口發(fā)送接收計(jì)數(shù)清零

Data:數(shù)據(jù)內(nèi)容,長(zhǎng)度不定字節(jié),長(zhǎng)度范圍0~1015字節(jié)

Type=‘q’時(shí),data沒(méi)有意義,長(zhǎng)度可以為0

Type=‘r’時(shí),data長(zhǎng)度14字節(jié),gpio0狀態(tài)(1字節(jié))+gpio1狀態(tài)(1字節(jié))+串口rx計(jì)數(shù)(4字節(jié))+ 串口tx計(jì)數(shù)(4字節(jié))+串口自動(dòng)發(fā)送周期(4字節(jié))

Type=‘s’時(shí),data長(zhǎng)度4字節(jié),表示設(shè)置底層串口自動(dòng)發(fā)送的周期

Type=‘c’時(shí),data沒(méi)有意義,長(zhǎng)度可以為0

Csum:校驗(yàn)和,1字節(jié),從ID到Data結(jié)束的校驗(yàn)和(反碼),接收端ID+Type+data+Csum=0即為正確接收

4、服務(wù)端C/C++程序

服務(wù)端C/C++程序是“雙應(yīng)用進(jìn)程”模式中的控制進(jìn)程,其主要功能有兩個(gè)方面:一是能夠自動(dòng)運(yùn)轉(zhuǎn)各個(gè)功能模塊,控制完成主要的業(yè)務(wù)邏輯;二是監(jiān)聽(tīng)客戶(hù)端連接,解析響應(yīng)客戶(hù)端請(qǐng)求。

4.1自動(dòng)運(yùn)轉(zhuǎn)各個(gè)功能模塊

在此demo程序中,功能模塊主要是gpio和串口,gpio模擬開(kāi)關(guān)量,串口模擬通信設(shè)備。因此,創(chuàng)建MyGPIO和MySerial兩個(gè)類(lèi)。下面簡(jiǎn)單介紹下這兩個(gè)類(lèi)的public接口。

圖3MyGPIO類(lèi)

MyGPIO的init接口主要是打開(kāi)/dev/esm6800_gpio這個(gè)設(shè)備節(jié)點(diǎn)。run接口主要是新建線程開(kāi)啟GPIO相關(guān)的業(yè)務(wù)工作,這里假設(shè)GPIO0作為輸入,GPIO1作為輸出,當(dāng)檢測(cè)到GPIO0為低電平狀態(tài)時(shí),GPIO1輸出高電平;反之,當(dāng)GPIO0位高電平時(shí),GPIO1輸出低電平。stop接口為停止GPIO業(yè)務(wù),退出GPIO業(yè)務(wù)線程。getGPIOStateByIndex接口可以讀取gpio-index的輸入/輸出電平狀態(tài)。

同樣,對(duì)于MySerial類(lèi),也提供init、run、stop接口,另外提供了getCountInfo接口,讀取傳送計(jì)數(shù)信息,clearCount接口對(duì)計(jì)數(shù)清零。run接口開(kāi)啟串口業(yè)務(wù)線程,這里模擬業(yè)務(wù)為周期性的向串口發(fā)送數(shù)據(jù)(接收線程一直接收串口數(shù)據(jù)),因此還提供了一個(gè)設(shè)置周期的公共接口setPeriod和查詢(xún)接口getPeriod。

圖4MySerial類(lèi)部分公共接口

4.2監(jiān)聽(tīng)客戶(hù)端連接,解析響應(yīng)客戶(hù)端請(qǐng)求

此部分主要對(duì)應(yīng)圖1中的Server模塊,為此創(chuàng)建一個(gè)MyServer類(lèi),其頭文件如圖5所示。其中,registerDev接口用于向MyServer類(lèi)注冊(cè)設(shè)備,主要是將設(shè)備類(lèi)(MyGPIO、MySerial)的指針傳遞給MyServer類(lèi),當(dāng)MyServer類(lèi)解析通信包后,可以通過(guò)設(shè)備類(lèi)的指針調(diào)用其公共接口,查詢(xún)/設(shè)置相關(guān)參數(shù)。run函數(shù)開(kāi)啟服務(wù)器,監(jiān)聽(tīng)本地網(wǎng)絡(luò)(127.0.0.1)的默認(rèn)端口9733,進(jìn)入accept等待連接狀態(tài)。

圖5MyServer類(lèi)

4.3main函數(shù)工作流程

在main函數(shù)中,首先將GPIO設(shè)備和串口設(shè)備注冊(cè)到Server模塊中;然后初始化并運(yùn)行GPIO和串口的具體工作任務(wù);最后運(yùn)行Server模塊,開(kāi)始監(jiān)聽(tīng)本地端口9733,如果有連接到來(lái),就建立新連接,解析來(lái)自客戶(hù)端的協(xié)議幀,根據(jù)協(xié)議棧中的信息,調(diào)用GPIO、串口設(shè)備的公共接口得到響應(yīng)信息,響應(yīng)客戶(hù)端請(qǐng)求。main函數(shù)的流程如下圖所示:

圖6main函數(shù)

5、客戶(hù)端Android Java程序

圖7客戶(hù)端初始化

圖8客戶(hù)端連接本地端口

客戶(hù)端啟動(dòng)后,新建socket連接本地IP地址的默認(rèn)端口(127.0.0.1:9733),如圖7和圖8所示。建立連接后,以固定周期向服務(wù)器發(fā)送查詢(xún)請(qǐng)求,然后刷新界面。

圖9客戶(hù)端界面(正常狀態(tài))

圖10客戶(hù)端界面(報(bào)警狀態(tài))

如圖9和圖10所示,“警報(bào)輸入狀態(tài)”和“消防栓輸出狀態(tài)”分別讀取的GPIO0和GPIO1的狀態(tài),當(dāng)GPIO0輸入高電平時(shí)(報(bào)警輸入狀態(tài)OFF),服務(wù)端自動(dòng)控制GPIO1輸出低電平(消防栓輸出狀態(tài)OFF);反之,當(dāng)GPIO0輸入低電平時(shí)(報(bào)警輸入狀態(tài)ON),服務(wù)端控制GPIO1輸出高電平(消防栓輸出狀態(tài)ON)。

“串口設(shè)備”模擬通信設(shè)備,這里僅獲取了發(fā)送和接收計(jì)數(shù)值。為了模擬通信設(shè)備的自動(dòng)獨(dú)立運(yùn)行,我們讓串口周期自動(dòng)發(fā)送字符串,而這個(gè)周期值可以在點(diǎn)擊“串口設(shè)備”彈出的對(duì)話框中的設(shè)置。如圖11所示,在彈出的對(duì)話框中,還可以選擇清零底層串口的發(fā)送/接收計(jì)數(shù)值。這樣就加入了人為的控制。

最后,“設(shè)置”項(xiàng)主要設(shè)置UI進(jìn)程相關(guān)的屬性,比如訪問(wèn)服務(wù)器獲取信息的“刷新周期”等。

圖11串口設(shè)置對(duì)話框

6、總結(jié)

“雙應(yīng)用進(jìn)程”方案設(shè)計(jì)的應(yīng)用程序,在原來(lái)的C/C++程序基礎(chǔ)上,添加一個(gè)server模塊,將工作設(shè)備(GPIO、串口)的運(yùn)轉(zhuǎn)信息通過(guò)本地網(wǎng)絡(luò)(127.0.0.1)的socket傳送給了Android UI端顯示;同時(shí),server模塊又能接收UI端的人機(jī)交互命令,并設(shè)置到對(duì)應(yīng)工作設(shè)備。這其中,主要工作是抽象出server與各工作設(shè)備間的通信方式,以及server與UI端的自定義通信協(xié)議及解析。此方案充分利用了原有的C/C++程序,加快了底層業(yè)務(wù)邏輯的開(kāi)發(fā)進(jìn)度;同時(shí),也降低了Java端界面開(kāi)發(fā)的難度。

本文在server與各工作設(shè)備間的通信方式,以及server與UI端的自定義通信協(xié)議及解析方面只是針對(duì)第二節(jié)中簡(jiǎn)單模擬業(yè)務(wù)而設(shè)定的,其目的在于驗(yàn)證方案的可行性,起到拋磚引玉的作用。如果用戶(hù)對(duì)此方案感興趣,英創(chuàng)會(huì)提供此demo程序的源碼,供客戶(hù)參考。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式主板
    +關(guān)注

    關(guān)注

    7

    文章

    6085

    瀏覽量

    35415
  • 安卓
    +關(guān)注

    關(guān)注

    5

    文章

    2133

    瀏覽量

    57288
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    飛騰助力首屆教育信息技術(shù)應(yīng)用創(chuàng)新大賽圓滿(mǎn)落幕

    近日,由中國(guó)教育技術(shù)協(xié)會(huì)主辦,教育部教育管理信息中心教育信創(chuàng)實(shí)驗(yàn)室、公安部第三研究所、中國(guó)電子工業(yè)標(biāo)準(zhǔn)化技術(shù)協(xié)會(huì)信創(chuàng)工委會(huì)支持,北京航空航天
    的頭像 發(fā)表于 12-24 09:57 ?142次閱讀

    有方科技參編的信息技術(shù)團(tuán)體標(biāo)準(zhǔn)發(fā)布

    近日,有方科技參編的《信息技術(shù)產(chǎn)品供應(yīng)鏈成熟度 共性指標(biāo) 第1部分:企業(yè)背景評(píng)價(jià)》《信息技術(shù)產(chǎn)品供應(yīng)鏈成熟度 共性指標(biāo) 第2部分:技術(shù)掌控評(píng)價(jià)》《信息技術(shù)產(chǎn)品供應(yīng)鏈成熟度 共性指標(biāo) 第
    的頭像 發(fā)表于 12-23 10:44 ?162次閱讀

    龍芯中科助力2024首屆教育信息技術(shù)應(yīng)用創(chuàng)新大賽成功舉辦

    近日,2024首屆教育信息技術(shù)應(yīng)用創(chuàng)新大賽在北京航空航天大學(xué)成功舉辦。本次大賽由中國(guó)教育技術(shù)協(xié)會(huì)主辦,教育信創(chuàng)實(shí)驗(yàn)室、公安部第三研究所、中國(guó)電子工業(yè)標(biāo)準(zhǔn)化技術(shù)協(xié)會(huì)信
    的頭像 發(fā)表于 12-19 17:02 ?246次閱讀

    深入解析Linux程序進(jìn)程

    什么是程序 一組計(jì)算機(jī)能識(shí)別和執(zhí)行的指令,用于指導(dǎo)計(jì)算機(jī)執(zhí)行特定任務(wù)或解決特定問(wèn)題。程序通常由代碼、數(shù)據(jù)和資源文件組成,涉及語(yǔ)法、算法和數(shù)據(jù)結(jié)構(gòu)。為二進(jìn)制文件 什么是進(jìn)程 是一個(gè)具有獨(dú)立功能的
    的頭像 發(fā)表于 12-18 11:01 ?101次閱讀
    深入解析Linux<b class='flag-5'>程序</b>與<b class='flag-5'>進(jìn)程</b>

    程序進(jìn)程的區(qū)別

    比如: 開(kāi)發(fā)寫(xiě)的代碼我們稱(chēng)為程序,那么將開(kāi)發(fā)的代碼運(yùn)行起來(lái)。我們稱(chēng)為進(jìn)程
    的頭像 發(fā)表于 11-25 16:03 ?361次閱讀
    <b class='flag-5'>程序</b>和<b class='flag-5'>進(jìn)程</b>的區(qū)別

    中科創(chuàng)達(dá)榮獲2024年軟件和信息技術(shù)服務(wù)優(yōu)秀企業(yè)

    及前百家企業(yè)”名單。中科創(chuàng)達(dá)憑借非凡的技術(shù)實(shí)力與持續(xù)的創(chuàng)新能力,成功入選“2024年度軟件和信息技術(shù)服務(wù)競(jìng)爭(zhēng)力百?gòu)?qiáng)企業(yè)”以及“2024年軟件和信息技術(shù)服務(wù)優(yōu)秀企業(yè)”。
    的頭像 發(fā)表于 10-30 11:44 ?501次閱讀

    第5章 MATLAB程序設(shè)計(jì).ppt

    第5章 MATLAB程序設(shè)計(jì)
    發(fā)表于 10-24 16:40 ?0次下載

    android系統(tǒng)使用appe播放audio資源,相關(guān)進(jìn)程被kill之后appe無(wú)法再次打開(kāi)的原因?

    android系統(tǒng)使用appe播放audio資源,相關(guān)進(jìn)程被kill之后appe無(wú)法再次打開(kāi),原因是appe資源被占用。 在Ti提供的demo中,通過(guò) signal(SIGKILL
    發(fā)表于 10-23 07:56

    【軟件干貨】Android應(yīng)用進(jìn)程如何保活?

    Android應(yīng)用程序中,為了保證應(yīng)用的正常運(yùn)行和穩(wěn)定性,有時(shí)需要對(duì)應(yīng)用進(jìn)程進(jìn)行?;?。以下是一些實(shí)現(xiàn)進(jìn)程?;畹姆椒ǎ?/div>
    的頭像 發(fā)表于 10-15 17:05 ?467次閱讀
    【軟件干貨】<b class='flag-5'>Android</b>應(yīng)用<b class='flag-5'>進(jìn)程</b>如何?;??

    梯度科技入選2023年信息技術(shù)應(yīng)用創(chuàng)新解決方案名單

    日前,工業(yè)和信息化部網(wǎng)絡(luò)安全產(chǎn)業(yè)發(fā)展中心(工業(yè)和信息化部信息中心)在天津舉辦2024信息技術(shù)應(yīng)用創(chuàng)新發(fā)展大會(huì)暨解決方案應(yīng)用推廣大會(huì)。會(huì)上正式公布了2023年
    的頭像 發(fā)表于 09-09 16:29 ?441次閱讀

    最簡(jiǎn)單的C程序設(shè)計(jì)

    電子發(fā)燒友網(wǎng)站提供《最簡(jiǎn)單的C程序設(shè)計(jì).pptx》資料免費(fèi)下載
    發(fā)表于 05-28 16:41 ?10次下載

    算法-程序設(shè)計(jì)的靈魂

    電子發(fā)燒友網(wǎng)站提供《算法-程序設(shè)計(jì)的靈魂.pptx》資料免費(fèi)下載
    發(fā)表于 05-28 16:39 ?3次下載

    程序設(shè)計(jì)基礎(chǔ)教程

    電子發(fā)燒友網(wǎng)站提供《程序設(shè)計(jì)基礎(chǔ)教程.pptx》資料免費(fèi)下載
    發(fā)表于 05-28 16:37 ?1次下載

    龍芯中科三項(xiàng)信創(chuàng)方案入圍工信部2023年信息技術(shù)應(yīng)用創(chuàng)新應(yīng)用示范案例名單

    近日,工業(yè)和信息化部通報(bào)了2023年信息技術(shù)應(yīng)用創(chuàng)新解決方案征集遴選結(jié)果,本次共評(píng)選出典型解決方案173個(gè)、應(yīng)用示范案例83個(gè)、單項(xiàng)創(chuàng)新案例64個(gè)。
    的頭像 發(fā)表于 03-07 16:45 ?956次閱讀
    龍芯中科三項(xiàng)信<b class='flag-5'>創(chuàng)</b>方案入圍工信部2023年<b class='flag-5'>信息技術(shù)</b>應(yīng)用創(chuàng)新應(yīng)用示范案例名單

    RX78M組 EtherCAT ETG.5003示例程序固件信息技術(shù)

    電子發(fā)燒友網(wǎng)站提供《RX78M組 EtherCAT ETG.5003示例程序固件信息技術(shù).pdf》資料免費(fèi)下載
    發(fā)表于 02-21 14:22 ?1次下載
    RX78M組  EtherCAT ETG.5003示例<b class='flag-5'>程序</b>固件<b class='flag-5'>信息技術(shù)</b>