歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux資訊 >> Linux文化 >> 北京電力貓在Linux/Unix 下上網的解決方案(原創)

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

日期:2017/2/27 12:10:55   编辑:Linux文化

關鍵詞: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,那時候他還是高中生)提供的幫助和思路.


Copyright © Linux教程網 All Rights Reserved