免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 22811 | 回复: 71
打印 上一主题 下一主题

[网络管理] 北京电力猫在Linux/Unix 下上网的解决方案(原创) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-03-02 20:03 |只看该作者 |倒序浏览
2006年4月13日最新下载0.7版本(66K):
ftp://202.96.64.144/plcc-0.7.tar.gz
支持Linux FreeBSD NetBSD Solarisx86
安装说明请看README 和INSTALL 文件
感谢fei 网友提供空间。

北京中电飞华电力猫在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


*************************************************

[ 本帖最后由 maluyao 于 2006-4-13 17:04 编辑 ]

plcc-0.5.tar.gz

9.36 KB, 下载次数: 122

plcc-0.6.tar.gz

8.09 KB, 下载次数: 148

论坛徽章:
0
2 [报告]
发表于 2006-03-03 09:07 |只看该作者
虽然我看不懂,但是支持下。

楼主兄,辛苦了。^_^谢谢您的分享

论坛徽章:
0
3 [报告]
发表于 2006-03-03 09:46 |只看该作者
支持一下思路分析,相信能帮助到不少北京的朋友的

btw: 只是简单地伪造发包,linux下有不少现成的工具可用的比如hping3,ICMPUSH,nemesis . 配合个小shell丢到crontab里就可以工作地很好了.

论坛徽章:
0
4 [报告]
发表于 2006-03-03 10:44 |只看该作者
我也是用电猫的。。。谢谢了。。

论坛徽章:
0
5 [报告]
发表于 2006-03-03 11:29 |只看该作者
太谢谢了,我一直在找这方面的资料,楼主真是强啊!1

论坛徽章:
0
6 [报告]
发表于 2006-03-03 17:09 |只看该作者

强!

搂主烈害!讲的很透彻!

没想到的是电力上网这么普及了!!
呵呵!

论坛徽章:
0
7 [报告]
发表于 2006-03-03 22:19 |只看该作者

自己进行了更新,请使用新的代码。

更新内容:
1.不需要修改/etc/services 文件了。
2.修正了在SessionID过大的时候不能更正的问题(把char 改成 unsigned char,业余就是业余)
3.去掉了很多不必要的代码。

已知的问题:
只能连接256分钟,要等我哪次能连续上4个小时以上,才知道数据的表示方法。

#include        <sys/socket.h>
#include        <netinet/in.h>
#include        <netdb.h>
#include        <stdio.h>
#include        <unistd.h>
#define                UDPMSGLEN 10
#define                SERVERPORT 8090
int main(){
        void setdata(const int ,unsigned char *);
        char *host;
        int sockfd;
        int len,sid,i;
        struct sockaddr_in address;
        struct hostent *hostinfo;
        unsigned char buffer[10];
        scanf("%d",&sid);
        printf("sessionID is %d\n",sid);
        host="211.160.92.162";
//        host="127.0.0.1"; //for testing only
        hostinfo=gethostbyname(host);
        sockfd=socket(AF_INET,SOCK_DGRAM,0);
        address.sin_family=AF_INET;
        address.sin_port=htons(SERVERPORT);
        address.sin_addr=*(struct in_addr *)*hostinfo->h_addr_list;
        len=sizeof(address);
        setdata(sid,buffer);
        for(i=0;i<256;i++){ //256 minutes  only
                buffer[1]=i;
                sendto(sockfd,buffer,UDPMSGLEN,0,(struct sockaddr *)&address,len);
                sleep(60);
                printf("sleeping 60 seconds and resend packet ...\n");
        }
        close(sockfd);
        return 0;
}//end of main

void setdata(const int sid,unsigned char *buffer)
{
        int i;
        buffer[0]=5;
        for (i=5;i<8;i++) buffer[i]=0;
        buffer[8]=(sid&65280)>>8;
        buffer[9]=(sid&255);
}

plc.c.gz

605 Bytes, 下载次数: 101

论坛徽章:
0
8 [报告]
发表于 2006-03-03 22:20 |只看该作者
楼主,我的好像出错了!

[root@ycg wtu]# ./feihua.sh |plc
awk: cmd. line:1: {print $1}
' in expression1:           ^ invalid char '
: command not found:
sessionID is 5177332
sleeping 60 seconds and resend packet ...
sleeping 60 seconds and resend packet ...
sleeping 60 seconds and resend packet ...
sleeping 60 seconds and resend packet ...


另:
好像电力的登陆IP也不是所有的地方都是211.160.92.162 我的就是http://125.98.5.18/login.cgi

[ 本帖最后由 gowto 于 2006-3-3 22:35 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2006-03-03 22:42 |只看该作者
楼上的:
可能你的页面和我的不一样。
curl -s -d "username=MY_USER_NAME&password=MYPASSWORD&serviceID=0&webserviceID=0&tempID=0"http://211.160.92.162/login.cgi grep -i SessionID
看看是什么样子的页面。写个适当的东西让它只返回sessionID吧。
如果你写不出shell,就用眼睛看好那个sessionID的值,比如说是3456,然后执行:
echo 3456 | plc 这样也可以,但最好手快点.执行慢了不知道行不行。
既然楼上说认证服务器还可能不相同,计划以后改成可以用命令行指定服务器以及其他参数。或者用配置文件的方式。计划直接使用libcurl库来做这工作,但暂时水平有限,做不到.

论坛徽章:
0
10 [报告]
发表于 2006-03-04 00:53 |只看该作者
lz我在www.intellon.com上找不到你说的“以GPL的方式开放了windows下驱动程序的源代码”,能直接给个url吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP