,, ,
(1.中國船舶重工集團公司第723研究所,江蘇 揚州 225001;2.江蘇科技大學(xué) 電子信息學(xué)院,江蘇 鎮(zhèn)江 212003)
航標(biāo)是航道的基礎(chǔ)助航設(shè)施,直接影響船舶的航行安全。但航標(biāo)的傳統(tǒng)管理模式落后,已經(jīng)無法適應(yīng)日益繁忙的航道運輸所提出的高質(zhì)量安全航行的需求。這里結(jié)合內(nèi)河航道航標(biāo)管理現(xiàn)狀,設(shè)計出一種經(jīng)濟、可靠的航標(biāo)無線監(jiān)控系統(tǒng)。
由于本系統(tǒng)是用于航標(biāo)的實時監(jiān)控,所以要求采集終端所在的位置定位信息以及各種電壓電流量等模擬信號通過GPRS[1]網(wǎng)絡(luò)經(jīng)由Internet傳送到遠方的監(jiān)控中心,系統(tǒng)的組成見圖1。
圖1 系統(tǒng)組成框
圖中嵌入式處理器采用s3c44b0,片外擴展4 Mb的FLASH存儲器,用于存儲啟動代碼bootloader、uClinux操作系統(tǒng)內(nèi)核和文件系統(tǒng)、編譯通過的應(yīng)用程序等需要斷電后保存的數(shù)據(jù)[3]。而16 Mb的sdram存儲器也就是針對PC機上所說的內(nèi)存,操作系統(tǒng)運行于其上。終端有兩個串口,串口1(對應(yīng)uClinux的設(shè)備“ttyS0”)接收GPS(global positioning system)全球定位系統(tǒng)模塊接收到的定位數(shù)據(jù),串口2(對應(yīng)uClinux的設(shè)備“ttyS1”)接siemens公司生產(chǎn)的GPRS modem MC35。系統(tǒng)把采集到的位置信息以及A/D控制器采集到的模擬量經(jīng)過處理,通過串口2的GPRS MODEM發(fā)送至接于互聯(lián)網(wǎng)的監(jiān)控中心。發(fā)送過程采用TCP/IP協(xié)議,而在數(shù)據(jù)鏈路層,相對于以太網(wǎng)的HDLC協(xié)議,GPRS采用PPP(pointer to pointer protocol)協(xié)議。
GPRS采用分組交換的形式,可提供最大170 kb/s 的數(shù)據(jù)傳輸速率。
1) 永遠在線。不同的網(wǎng)絡(luò)用戶共享同一組GPRS通信信道,但只有某一用戶需要發(fā)送和接收數(shù)據(jù)時才會占用信道資源,沒有數(shù)據(jù)傳輸時還與網(wǎng)絡(luò)保持虛連接。這種信道復(fù)用的特點,特別適用于突發(fā)的、頻繁的、小量的數(shù)據(jù)傳輸。
2) 計費方式靈活。采用按流量計費,收費相對較便宜。
3) 動態(tài)分配IP地址。通過GPRS撥號ISP后,系統(tǒng)每次分配給終端的都是動態(tài)IP地址因此移動終端每次都必須先向internet主機發(fā)起主動連接。
uClinux系統(tǒng)是由標(biāo)準(zhǔn)的linux系統(tǒng)簡化而來,專門應(yīng)用于沒有MMU(內(nèi)存管理單元)的CPU上,對內(nèi)存的訪問是直接的,對內(nèi)存空間沒有保護,不像標(biāo)準(zhǔn)linux那樣采用虛擬內(nèi)存的方法。大多數(shù)uClinux采用romfs作為文件系統(tǒng),它是一種只讀的文件系統(tǒng),相對于標(biāo)準(zhǔn)linux占用的內(nèi)存更少。另外uClinux精簡了linux的函數(shù)庫,采用uClibc作為標(biāo)準(zhǔn)的函數(shù)庫,所有這些措施都使uClinux更加適用于如arm7這類內(nèi)存較小的CPU上[2]。
在GPRS無線數(shù)據(jù)傳輸終端中要實現(xiàn)無線數(shù)據(jù)傳輸,要用到兩個協(xié)議TCP/IP(或UDP/IP)和PPP協(xié)議,其中TCP/IP是事實上的互聯(lián)網(wǎng)標(biāo)準(zhǔn)協(xié)議,LINUX系統(tǒng)在網(wǎng)絡(luò)應(yīng)用方面是其一大特色,已經(jīng)包含了對TCP/IP的支持,只需在編譯內(nèi)核中選中即可。GPRS MODEM要實現(xiàn)連接互聯(lián)網(wǎng),必須先登錄到中國移動的網(wǎng)關(guān)支持節(jié)點GGSN,GGSN把獲得的動態(tài)IP地址分配給終端。MODEM與網(wǎng)關(guān)GGSN的通訊必須采用PPP協(xié)議。PPP協(xié)議位于ISO/OSI七層協(xié)議的數(shù)據(jù)鏈路層,是網(wǎng)絡(luò)層和物理層的接口。它是一種在串行鏈路上傳輸數(shù)據(jù)報的協(xié)議。一般的撥號上網(wǎng)都采用這個協(xié)議,通過串口實現(xiàn),由3部分組成[4]:
1) 一種在串行線路上封裝數(shù)據(jù)報的方法。
2) 一個用于建立、配置和測試數(shù)據(jù)鏈路連接的鏈路控制協(xié)議LCP(link control protocol)。
3) 一套用來建立和配置不同網(wǎng)絡(luò)層協(xié)議的網(wǎng)絡(luò)控制協(xié)議NCP(network control protocol)。
GPRS MODEM在撥號后首先要與GPRS網(wǎng)關(guān)進行通信鏈路的協(xié)商,即協(xié)商點到點的各種鏈路參數(shù)配置。協(xié)商過程遵守LCP,采用 PAP/CHAT認證。IPCP協(xié)議用于設(shè)置網(wǎng)絡(luò)協(xié)議環(huán)境,并分配IP地址。一旦協(xié)商完成,鏈路已經(jīng)創(chuàng)建,IP地址也將分配,然后兩者就按照協(xié)商的標(biāo)準(zhǔn)進行IP報文的傳輸。
PPP撥號在uClinux操作系統(tǒng)中分兩部分處理,一部分在內(nèi)核中完成,主要完成PPP消息的封包、拆包,所以在編譯操作系統(tǒng)內(nèi)核時需選中對PPP協(xié)議的支持。另一部分稱之為PPP守護進程pppd, PPP守護進程提供基本的LCP協(xié)議,完成PPP鏈路的建立、斷開、帳戶認證和IP地址的設(shè)定等工作,如果內(nèi)核源代碼中沒有包含PPP源碼包,需要從網(wǎng)上下載ppp-2.4.1(或ppp-2.3.8)源碼包,然后交叉編譯,生成能在目標(biāo)系統(tǒng)運行的pppd和chat程序。本項目系統(tǒng)內(nèi)核中包含ppp包,所以編譯時只要選中即可。pppd 和chat兩者調(diào)用的關(guān)系是:
1) 由pppd程序調(diào)用chat會話程序。
2) chat會話程序負責(zé)撥號,啟動服務(wù)器端的pppd程序,然后chat會話程序結(jié)束。
3) 由pppd程序繼續(xù)chat會話程序的工作,驗證身份,與服務(wù)器端的pppd程序進行握手,建立PPP連接。
本項目撥號上網(wǎng)實現(xiàn)過程中需要用到兩個撥號腳本文件:ppp-on和ppp-on-dialer。在這2個腳本中,分別調(diào)用pppd和chat程序,但由于uClinux默認的shell是使用一種叫sash的簡單shell,功能不夠強,無法執(zhí)行腳本文件,所以在編譯內(nèi)核過程中,需先將默認的sash替換成msh——種在uClinux下可以運行的、功能更強的shell。下面是本項目撥號過程中所用到的腳本:
1) ppp-on
#!/bin/sh
TELEPHONE=*99***1# # 中國移動的撥號號碼
ACCOUNT= # 撥號帳號,GPRS撥號為空
PASSWORD= # 密碼為空
LOCAL_IP=0.0.0.0
REMOTE_IP=0.0.0.0
NETMASK=255.255.255.0
export TELEPHONE ACCOUNT PASSWORD
DIALER_SCRIPT=/etc/ppp/ppp-on-dialer
exec /usr/bin/pppd debug lock nocrtscts modem /dev/ttyS1 115200
asyncmap 20A0000 escape FF kdebug 0 $LOCAL_IP:$REMOTE_IP
noipdefault netmask $NETMASK defaultroute connect $DIALER_SCRIPT
其中比較重要的參數(shù)是nocrtscts,表示串口沒有硬件握手,因為設(shè)計的開發(fā)板串口/dev/ttyS1不帶硬件握手功能。串口和GPRS MODEM的通訊波特率是115 200 b/s。
2) ppp-on-dialer
#!/bin/sh
exec /usr/bin/chat-v
TIMEOUT 200
ECHO ON
ABORT ‘ BUSY ’
ABORT ‘ NO ANSWER ’
ABORT ‘ NO CARRIER ’
ABORT ‘ RINGING RINGING ’
SAY “Press CTRL+C to close the connection at any stage ”
SAY “ defining PDP context ”
‘’ AT
‘OK’ AT+CGDCONT=1,“IP”,“CMNET”,“”,0,0’
‘OK’ ‘AT+CGACT=1,1’
TIMEOUT 30
‘OK’ ‘ATD *99***1#’
CONNECT ‘’
其中值得注意的是撥號初始化指令各個MODEM可能不同,本終端采用SIEMENS公司的MC35,所以文件中的AT指令都按照它的來寫。腳本文件的格式要嚴(yán)格遵循腳本的標(biāo)準(zhǔn)例如不能用空格鍵,須用tab鍵等,否則可能會造成撥號失敗。另外還要配置中國移動DNS服務(wù)器。撥號成功后會由GGSN服務(wù)器動態(tài)分配一個IP地址,至此GPRS 終5端就連接到互聯(lián)網(wǎng)上。
有多種方式實現(xiàn)撥號上網(wǎng),可在命令行下執(zhí)行撥號命令,但嵌入式系統(tǒng)一般都要在無人干預(yù)下運行撥號程序,為此,可在uClinux啟動腳本/etc/rc文件里加上撥號的命令,這樣,系統(tǒng)一啟動就將自動運行撥號上網(wǎng)程序,實現(xiàn)上網(wǎng)。本項目采用的方式是在程序里調(diào)用system()函數(shù),執(zhí)行撥號上網(wǎng)腳本。
在終端應(yīng)用程序設(shè)計中,考慮到程序需要并發(fā)執(zhí)行,采用多線程來處理。不采用多進程是基于以下兩個原因:
1) uClinux操作系統(tǒng)是用vfork調(diào)用來代替?zhèn)鹘y(tǒng)unix系統(tǒng)的fork調(diào)用[3],父進程創(chuàng)建子進程后阻塞,子進程一般情況下調(diào)用exec()函數(shù)以加載可執(zhí)行程序并運行,這時父進程恢復(fù)運行。本項目中主程序要求父子進程之間能通訊,但是vfork()調(diào)用中子進程執(zhí)行的是可執(zhí)行程序,所以無法實現(xiàn)父子進程通訊,故本工程不適合用多進程。
2) 父子進程由于是使用獨立的代碼段、數(shù)據(jù)段和堆棧等,進程間直接通訊幾乎不可能,只能借助于進程間通訊來完成互相之間的數(shù)據(jù)共享,無疑增加了程序的復(fù)雜性。主程序流程圖如圖2所示。
圖2 應(yīng)用程序流程圖
航標(biāo)遙測遙控系統(tǒng)可保證科學(xué)地、有計劃地對航標(biāo)進行日常管理、維護以及遇損時及時修復(fù),大大降低維修人員勞動強度及費用開支,為航標(biāo)的管理從粗放型向技術(shù)型、集約型的轉(zhuǎn)變提供了必要的技術(shù)支持。目前該系統(tǒng)已在漢江航道局航標(biāo)管理系統(tǒng)中應(yīng)用,通過一段時間的應(yīng)用,對系統(tǒng)整體的實時性、準(zhǔn)確性、安全性、可靠性、穩(wěn)定性進行了驗證,基本實現(xiàn)了預(yù)期的目標(biāo)。
[1] 鐘章隊,蔣文怡,李紅君,等.GPRS通用分組無線業(yè)務(wù)[M].北京:人民郵電出版社,2001.
[2] 李 巖,容盤符.基于S3C44B0X嵌入式uClinux系統(tǒng)原理及應(yīng)用[M].北京:清華大學(xué)出版社,2005.
[3] 朱瑋瑋,楊建明.uClinux——一種嵌入式Linux系統(tǒng)[J].艦船電子工程,2003(4):47-50.