北京中電飛華電力貓在Linux/Unix 下上網的解決方案
作者:馬路遙 maluyao at 163.com
關鍵詞:Linux Unix plc 電力貓 中電飛華
本文的內容和程序均以GPL 方式發布。
中電飛華在北京推出了電力貓上網的業務,費用相當低廉。筆者選用的一款是400元包半年的套餐。標稱速度是10M 實際下載可以達到60K以上,在北方網通的地盤上速度也算馬馬虎虎了。
中電飛華提供了兩種類型的"電力貓",一種用」網線型號「的,用網線直接接入電腦。相當於一個hub或交換機。不需要驅動程序都可以在任何操作系統上使用。另一種為usb接入。沒有驅動不能在Linux下使用。但www.intellon.com以GPL的方式開放了windows下驅動程序的源代碼。原則上也可以移植到linux/unix上。如果不願做這個移植工作。建議使用linux/unix 的朋友一定要選擇網線型號的電力貓。
北京地區的中電飛華在Windows 下採用的認證方式據說是華為認證。以IE + ActiveX的方式進行,無法移植到Linux/Unix上,其原理如下:
1.在某個web伺服器的cgi程序上進行認證,認證通過後你會得到一個sessionid 的變數。此變數實際使用中最大為31000,應該不會超過32767。這在Linux 下很容易做到。
2.每分鐘發送一個udp包到伺服器的8090埠,其中包括上述的sessionid 數據。但伺服器並不回應。這樣連接會一直保持。
通過ethereal 抓包分析出udp數據如下:
數據長度為10個位元組,以下以16進位表示:
05 05 00 00 00 00 00 00 61 54
第一個數據似乎一直不變。
第二個數字從零開始,每次會加一,由於兩個16進位的長度最多能發256分鐘,暫時還部知道256分鐘以後此欄位如何變化。事實上電力貓連接不甚穩定,也不容易達到這個數字。
中間的6個欄位總是0。
最後兩個欄位的組合是sessionid 的值。
比如你得到的sessionid 是29615 ,那麼后兩個就是73 AF
29615=0x73AF.
註銷時也是發一個udp包,內容和剛才相似,但頭兩位數據是
03 0A
我是包半年的用戶。不用考慮註銷的問題。
知道這些,就很容易實現Linux Unix下的認證了
先用寫了個腳本(在同一行里)
curl -s -d "username=MY_USER_NAME&password=MYPASSWORD&serviceID=0&webserviceID=0&tempID=0"http://211.160.92.162/login.cgi grep SessionID |grep VALUE |awk -F '=' '{print $3}' |awk -F '>' '{print $1}'
我把這個腳本命名為feihua.sh ,加上755 的許可權,放到/usr/local/bin 里。當然要把MY_USER_NAME和MYPASSWORD換成自己的用戶名和密碼。
這個腳本的返回結果就是sessionid.
用C語言寫了下列程序。本人的C 語言比較菜。僅僅是對付能用.(程序名稱為plc.c ,放在最後)
gcc plc.c -o /usr/local/bin/plc
程序在Redhat AS4 上編譯和運行都沒問題,希望使用其他版本Linux 、FreeBSD以及其他Unix 的朋友們也幫我測試一下。
執行:
feihua.sh |plc
這樣就可以成功認證了。
後記:
05末年裝了個電力貓,這也是我所在小區寬頻的唯一選擇。因為多數用linux工作。很不爽。
剛開始用crontab 調用curl 每分鐘進行一次web 驗證,雖然也能對付,但實在是不舒服。
因為懷疑所謂的華為認證是比較複雜的機制。也許還涉及到加密解密(現在想想,基本不可能實現)和其他的底層問題。
決定從C語言入手,搞定這個問題。
筆者的編程經驗雖然可以追溯到18年前使用Fortran語言,java/perl/php/vb/shell 等都會,但都是業餘水平。
以前也自學過C,除了指針之外,基本都懂了。有點象只能使用機槍而不能使用大炮的坦克手。
在06年春節其間,為了學習C,從譚浩強到 K&R 的書都看了幾遍。算是基本理順了指針。
但隨後發現,為了徹底弄清楚C,先得看看數據結構。
又發現理解數據結構,還要研究離散數學。反正又大把的時間。索性就這麼看下去。
又弄了幾本Unix下C編程的書。這些該死的作者都把Socket編程放到最後。我還沒看到呢。
拿出sniffer 抓一下包,才發現這麼簡單。早知道抄個java或perl程序,也許半個鐘頭就搞定了.
既然已經看了這麼多C,下一步想把我本本上Ti 的讀卡器、1394、pcmcia卡三合一晶元的Linux驅動搞定。這對我來說,估計是個複雜的工作了,希望在筆記本報廢之前,能夠完成這個工作。
暫時靠講授Linux課程吃飯。勉強也能養家糊口,十年磨一劍,又如何.
感謝南京的新夢網友在兩年前(2004,那時候他還是高中生)提供的幫助和思路.
***********************************
06年3月17日。最新更新,見附件。
0.5版本之Release Note :
- 支持用make 和make install 命令安裝。
- 添加個命令行方式指定伺服器地址和埠的功能。
- 命令改為plcc,含義為PLC Connector.
- 自動在/usr/share/doc/plcc-0.5 下安裝說明文檔。
- 可以在命令行上用-v 參數顯示版本和-h 參數顯示幫助信息。
- 製作了man page,可以使用man plcc 獲得幫助信息。
- 增加了支持操作系統的兼容列表。但在openBSD 3.8 , gcc version 3.3.5 環境下編譯失敗,原因暫時不明。
已知問題:
- 暫時只能可靠的連接256分鐘。
- 尚未測試FreeBSD 下的兼容性。
計劃中的任務:
- 解決256分鐘的問題
- 實現對FreeBSD至少一個版本的兼容性測試。
- 為Linux 製作rpm 包和為BSD系統製作port
*************************************************
plcc-0.5.tar.gz:下載地址
plcc-0.6.tar.gz:下載地址