歡迎您光臨本站 註冊首頁

北京電力貓在Linux/Unix 下上網的解決方案

←手機掃碼閱讀     火星人 @ 2014-03-29 , reply:0

北京中電飛華電力貓在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:下載地址

[火星人 ] 北京電力貓在Linux/Unix 下上網的解決方案已經有296次圍觀

http://coctec.com/docs/linux/show-post-204530.html