本文將說明如何在Linux下用CDMA modem完成撥接的工作。首先,讀者需要對PPP協議有初步的瞭解,比如,讀者至少應該知道LCP和NCP是什麼,以及PAP和CHAP是做什麼的;其次,讀者可能需要安裝pppd和chat兩個工具,通常系統中預設都是安裝了這兩個程式的。如果沒有安裝pppd,可以到http://ppp.samba.org/下載最新版本。本文中作者所用的pppd版本為2.4.1,chat版本為1.22。
本文所使用的是聯通掌中寬頻包月2G流量CDMA上網卡。串連所需的撥號號碼為#777,使用者名稱為card,口令也為card。聯通的伺服器名為pdsn。
在Linux下,所有與ppp相關的設定檔都在/etc/ppp/目錄下。其中/etc/ppp/pap-secrets檔案儲存的是PAP認證協議所需的使用者名稱和口令,而/etc/ppp/chap-secrets檔案儲存著CHAP認證協議所需的使用者名稱和口令。根據上面的說明,這兩個檔案的內容分別如下所示:
檔案/etc/ppp/pap-secrets的內容(最後一行是作者手動添加的):
# /etc/ppp/pap-secrets
# Secrets for authentication using PAP
# client
server
secret
IP addresses
####### redhat-config-network will overwrite this part!!! (begin) ##########
####### redhat-config-network will overwrite this part!!! (end) ############
card
pdsn
card
檔案/etc/ppp/chap-secrets的內容(最後一行是作者手動添加的):
# /etc/ppp/chap-secrets
# Secrets for authentication using CHAP
# client
server
secret
IP addresses
####### redhat-config-network will overwrite this part!!! (begin) ##########
####### redhat-config-network will overwrite this part!!! (end) ############
card
pdsn
card
當伺服器要求pppd給出使用者身份認證資訊的時候,如果協商採用PAP認證方式,pppd將到/etc/ppp/pap-secrets檔案中取得使用者口令;如果協商採用CHAP認證方式,則pppd將到/etc/ppp/chap-secrets檔案中取得使用者口令。
在/etc/ppp/peers/目錄下,是每個pppd串連所需的選項檔案,每個檔案對應一個串連,互不干涉。本文中,在/etc/ppp/peers/目錄下建立了一個unicom檔案,其內容如下:
# /etc/ppp/peers/unicom
# this is ppp script for use chinaunicom's CDMA data service
#
ttyS0
115200
crtscts
connect '/usr/sbin/chat -v -f /etc/ppp/chat/unicom'
debug
nodetach
ipcp-accept-local
ipcp-accept-remote
defaultroute
user card
解釋一下這裡的pppd選項:
l
ttyS0
表示CDMA modem串連到串口/dev/ttyS0上;
l
115200
表示串口傳輸速率;
l
crtscts
表示採用modem的rts和cts訊號線用於流控;
l
connect '/usr/sbin/chat -v -f /etc/ppp/chat/unicom'
表示用chat程式完成串連建立的會話過程,會話過程通過/etc/ppp/chat/unicom檔案控制
l
debug
表示令pppd工作在偵錯模式
l
nodetach
表示不要讓pppd啟動之後轉為後台進程
l
ipcp-accept-local
表示接受伺服器分配的本機IP地址
l
ipcp-accept-remote
表示接受伺服器指定的伺服器IP地址
l
defaultroute
表示把伺服器指定的伺服器IP地址作為預設路由
l
user card
表示認證時的使用者為card,pppd據此從/etc/ppp/pap-secrets或者/etc/ppp/chap-secrets檔案中取得card使用者對應的口令
以上就是對/etc/ppp/peers/unicom的說明。另外,最後還需要的一個檔案是/etc/ppp/chat/unicom,這個檔案用於告訴chat程式如何完成串連建立過程。該檔案內容如下:
# /etc/ppp/chat/unicom
# this is the chat script for unicom
ABORT "NO CARRIER"
ABORT "NO DIALTONE"
ABORT "ERROR"
ABORT "NO ANSWER"
ABORT "BUSY"
TIMEOUT 120
"" at
OK atdt#777
CONNECT
幾個ABORT行的意思是如果modem返回諸如BUSY之類的資訊,則取消chat過程,串連失敗;TIMEOUT 120表示串連的逾時值為120秒。首先發出一個at命令,期待modem返回一個OK,然後撥號#777,期待modem返回CONNECT,如果modem返回了CONNECT,則表明串連建立成功。
以上就是撥號所需要的四個檔案的情況。通過下列命令撥號:
# pppd call unicom
如果撥號成功,將產生一個新的網路介面ppp0。伺服器將自動為ppp0分配一個IP地址。然後,就可以通過這個串連上網了。
後記:作者試圖通過Multilink PPP獲得更大的頻寬,但是似乎聯通並不支援這一功能。
參考文檔
[1] man pppd(8)
[2] man chat(8)
原文地址http://blog.chinaunix.net/u/270/showart_227618.html
另一個參考設計
3 軟體設計
3.1 Linux核心編譯
嵌入式系統資源有限,因此不可能在嵌入式系統之上進行程式的編譯,需要在PC機上將程式編譯成嵌入式系統識別的二進位代碼,然後再移植到其上。交叉編譯環境就是用來在PC機上編譯嵌入式系統可識別代碼的工具。這裡用到的交叉編譯環境是ARM-Linux。把對PPP的支援編譯進Linux核心的方法為:在kernel目錄,終端下輸入make menuconfig,選擇Network device support,[*]選擇所有關於PPP的選項,然後儲存退出編譯即可。
3.2 PPP移植[1]
PPP(Point- to-Point Protocol)點到點,是為在點對點連接上傳輸多協議資料包提供了一個標準方法。本文用到的CDMA無線連網方法,就需要PPP協議的支援,這裡用的版本是PPP-2.4.1和rp-PPPoE-3.7。其編譯方法就是在建立的交叉編譯環境下編譯,產生pppd和chat等可執行檔,並寫入檔案系統 ramdisk的/bin目錄中。編寫三個撥號指令檔放在檔案系統/ppp目錄下。
第一個指令檔為chap-secrets:
“card” * “card”
其中card分別為使用者名稱和密碼,*表示對伺服器沒有限制。
第二個指令檔為cdma1:
ttyS0 #CDMA Modem串連到串口1上
19200 #CDMA傳輸速率
nocrtscts #不採用modem的rts和cts訊號線流控
connect ‘/bin/chat –v –f /etc/ppp/chat/cdma2’ #用chat程式完成串連建立的會話過程,會話要通過/etc/ppp/chat/cdma2檔案控制
debuf #表示pppd工作在偵錯模式
nodetach #表示不讓pppd轉入後台工作
ipcp-accept-local #表示接受伺服器分配的本機IP地址
ipcp-accept-remote #表示接受伺服器指定的伺服器IP地址
defaultroute #表示把伺服器指定的IP地址設定為預設的路由
user card #表示認證時使用者名稱card,pppd根據該使用者名稱,從chat-secrets檔案中取得密碼
第三個指令檔為cdma2:
ABORT “NO CARRIER”
ABORT “NO DIALTONE”
ABORT “ERROR”
ABORT “NO ANSWER”
ABORT “BUSY”
TIMEOUT 120
“”at
OK atdt#777
connect
以上幾行代碼的意思是如果modem撥號過程中出現了例如NO CARRIER之類的返回資訊,則取消chat過程,串連失敗,TIMEOUT 120則表示為連線逾時,atdt#777表示撥號至#777。
設定好後,在開發板環境下輸入pppd,如果出現亂碼,則說明ppp移植正確。鍵入撥號命令pppd call cdma1,產生一個新的網路介面ppp0,伺服器自動分配一個IP地址。此時PPP的移植及設定結束,也就是說現在已經創造好了一個可以上網的嵌入式系統。
3.3 Email發送程式設計[2]
圖片採集終端採集的圖片要發送到Email中,需要以附件的形式發送。郵件發送過程中,需要對郵件地址、使用者密碼和附件內容進行加密處理,這裡採用了 Base64加密法。Base64演算法就是以3個位元組為單位,當剩下的字元數量不足3個位元組時,則應使用0進行填充,依次取6位元據並在前面補上兩個0形成新的8位編碼,由於3*8=4*6,這樣3個位元組的輸入會變成4個位元組的輸出,長度上增加了1/3。相應地,輸出字元則使用‘=’佔位,因此編碼後輸出的文本末尾可能會出現1至2個‘=’。
郵件發送程式經過了以下幾個過程[3]:
(1)socket(int domain,int type,int protocol);
該函數建立新的socket,以建立一個新的通訊連接埠並獲得檔案描述符。函數中的參數domain確定一個協議族,這裡定義為AF_INET,type指定通訊端類型,該處使用SOCK_STREAM,protocol一般為0,使用預設協議。
(2)connect(int sockfd,struct sockaddr *address,size_t address_len);
當調用socket建立傳輸連接埠後,調用connect函數建立與遠程伺服器相連的連接線路。
(3) recv(int sockfd,void *buf,int len,unsigned int flags);
該函數用於接收從套介面傳來的資訊,socket用connect串連的套介面,buf是指向記憶體塊的指標,用於儲存接受的訊息,len指明記憶體塊的大小,flags是一個操作標誌。
(4)Base64_Code();//對登陸資訊或附件內容進行加密
(5)send(int sockfd,const void *msg,int len,unsigned int flags);
該函數是用來通過套介面向其它程式傳遞資料的。sockfd是用來傳輸資料的socked描述符,msg是一個指向要發送資料的指標,len是以位元組為單位的資料的長度,flags一般情況下設定為0。
其中對附件檔案的發送需要預先設定每次讀取的位元組數和每次發送的位元組數,將附件分批讀取編碼發送。程式執行過程3:
圖3 資料轉送流程
4 總結
實驗證明用CDMA無線網路發送資料,速度比較穩定,有時會由於網路原因發送失敗,但是成功率較高,收到的圖片資料丟幀現象不明顯。該方法可用於工業現場的監視以及家庭監控系統以及遠端資料擷取。由於圖片是發送到Email中的,因此運行成本較低,有較大的推廣空間。
本文創新點:目前基於GPRS的無線資料轉送方法研究的較多,而CDMA網路的高效能特性,逐漸引起了研究者的注意,本文就結合CDMA網路設計了一套與嵌入式相結合的系統,,將採集的現場圖片,以附件的形式發送到Email中。
本文來自: (www.91linux.com) 詳細出處參考:http://www.91linux.com/html/article/network/pppoe/2010/1008/20881.html