打印
[GPRS]

求教问题:关于自己写PPP协议驱动GPRS上网相关问题。

[复制链接]
2359|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 MakeBetter 于 2013-10-31 23:48 编辑

前面用MG2639做过一个dtu,但是不甚满意,用单片机操作模块,命令来命令去,模块容易出现很多问题,要一个一个定义来解决又麻烦,所以想直接自己拔号上网,自己实现以太网协议栈,这样来的更直接。
前面一直没空,也就没理这个问题,最近子有些空,加上之前查过ppp相关资料,资料也收集的差不多了,估摸着可以做出来了。可惜差一步就是没法寸进,特来求教各位老师。
现在描述问题如下:
以下是通信数据(转义后的)(绿色为接收到模块的,红色为对模块发送的)
7E FF 7D 23 C0 21 7D 21 7D 21 7D 20 7D 32 7D 22 7D 26 7D 20 7D 2A 7D 20 7D 20 7D 23 7D 24 C0 23 7D 27 7D 22 7D 28 7D 22 55 83 7E
7E FF 7D 23 C0 21 7D 24 7D 21 7D 20 7D 28 7D 27 7D 22 7D 28 7D 22 F8 44 7E
7E FF 7D 23 C0 21 7D 21 7D 22 7D 20 7D 2E 7D 22 7D 26 7D 20 7D 2A 7D 20 7D 20 7D 23 7D 24 C0 23 7D 24 43 7E
7E FF 7D 23 C0 21 7D 22 7D 22 7D 20 7D 2E 7D 22 7D 26 7D 20 7D 2A 7D 20 7D 20 7D 23 7D 24 C0 23 3A C0 7E
7E FF 7D 23 C0 23 7D 21 7D 21 7D 20 7D 26 7D 20 7D 20 81 29 7E
7E FF 7D 23 C0 23 7D 22 7D 21 7D 20 7D 25 7D 20 8B 3B 7E
7E FF 7D 23 80 21 7D 21 7D 21 7D 20 7D 2A 7D 23 7D 26 7D 2A 7D 20 7D 20 7D 21 34 E5 7E
7E FF 7D 23 80 21 7D 22 7D 21 7D 20 7D 2A 7D 23 7D 26 7D 2A 7D 20 7D 20 7D 21 5D 91 7E
7E FF 7D 23 80 21 7D 21 7D 21 7D 20 7D 36 7D 23 7D 26 7D 20 7D 20 7D 20 7D 20 81 7D 26 7D 20 7D 20 7D 20 7D 20 83 7D 26 7D 20 7D 20 7D 20 7D 20 6E DB 7E
7E FF 7D 23 80 21 7D 21 7D 21 7D 20 7D 2A 7D 23 7D 26 7D 2A 7D 20 7D 20 7D 21 34 E5 7E
7E FF 7D 23 80 21 7D 22 7D 21 7D 20 7D 2A 7D 23 7D 26 7D 2A 7D 20 7D 20 7D 21 5D 91 7E
7E FF 7D 23 80 21 7D 21 7D 21 7D 20 7D 36 7D 23 7D 26 7D 20 7D 20 7D 20 7D 20 81 7D 26 7D 20 7D 20 7D 20 7D 20 83 7D 26 7D 20 7D 20 7D 20 7D 20 6E DB 7E
7E FF 7D 23 80 21 7D 21 7D 21 7D 20 7D 2A 7D 23 7D 26 7D 2A 7D 20 7D 20 7D 21 34 E5 7E
7E FF 7D 23 80 21 7D 22 7D 21 7D 20 7D 2A 7D 23 7D 26 7D 2A 7D 20 7D 20 7D 21 5D 91 7E
7E FF 7D 23 80 21 7D 21 7D 21 7D 20 7D 36 7D 23 7D 26 7D 20 7D 20 7D 20 7D 20 81 7D 26 7D 20 7D 20 7D 20 7D 20 83 7D 26 7D 20 7D 20 7D 20 7D 20 6E DB 7E
7E FF 7D 23 80 21 7D 21 7D 21 7D 20 7D 2A 7D 23 7D 26 7D 2A 7D 20 7D 20 7D 21 34 E5 7E
7E FF 7D 23 80 21 7D 22 7D 21 7D 20 7D 2A 7D 23 7D 26 7D 2A 7D 20 7D 20 7D 21 5D 91 7E
7E FF 7D 23 80 21 7D 21 7D 21 7D 20 7D 36 7D 23 7D 26 7D 20 7D 20 7D 20 7D 20 81 7D 26 7D 20 7D 20 7D 20 7D 20 83 7D 26 7D 20 7D 20 7D 20 7D 20 6E DB 7E
7E FF 7D 23 80 21 7D 21 7D 21 7D 20 7D 2A 7D 23 7D 26 7D 2A 7D 20 7D 20 7D 21 34 E5 7E
7E FF 7D 23 80 21 7D 22 7D 21 7D 20 7D 2A 7D 23 7D 26 7D 2A 7D 20 7D 20 7D 21 5D 91 7E
7E FF 7D 23 80 21 7D 21 7D 21 7D 20 7D 36 7D 23 7D 26 7D 20 7D 20 7D 20 7D 20 81 7D 26 7D 20 7D 20 7D 20 7D 20 83 7D 26 7D 20 7D 20 7D 20 7D 20 6E DB 7E


去掉转义字符后如下:

7E FF 03 C0 21 01 01 00 12 02 06 00 0A 00 00 03 04 C0 23 07 02 08 02 55 83 7E       //LCP协商请求:转义字符表、PAP认证方式、压缩头部、压缩协议
7E FF 03 C0 21 04 01 00 08 07 02 08 02 F8 44 7E                                         //我:回应Reject,拒绝头部压缩和协议域压缩。(因为实现协议方便一些,所以就拒绝掉这些)
7E FF 03 C0 21 01 02 00 0E 02 06 00 0A 00 00 03 04 C0 23 04 43 7E                     //模块再次请求LCP协商:只需要字符表转义和PAP认证了
7E FF 03 C0 21 02 02 00 0E 02 06 00 0A 00 00 03 04 C0 23 3A C0 7E                     //我:协商确认  --完成LCP链路协商
7E FF 03 C0 23 01 01 00 06 00 00 81 29 7E                                                //我:接着发送PAP认证请求:用户名和密码都置空。
7E FF 03 C0 23 02 01 00 05 00 8B 3B 7E                                                   //模块回复PAP认证通过
7E FF 03 80 21 01 01 00 0A 03 06 0A 00 00 01 34 E5 7E                                    //模块同时立该发送IPCP协商请求,主机ip是:10.0.0.1
7E FF 03 80 21 02 01 00 0A 03 06 0A 00 00 01 5D 91 7E                                     //我:接受,回复确认。   -------问题出在这里,这条确认怎么检查也没有问题,模块就是不认,如下面的数据全部是重复。
7E FF 03 80 21 01 01 00 16 03 06 00 00 00 00 81 06 00 00 00 00 83 06 00 00 00 00 6E DB 7E //我:发送完IPCP确认后,继续发送IPCP请求:包括本机IP、主DNS IP、备用DNS IP,因为不知道,全置0
7E FF 03 80 21 01 01 00 0A 03 06 0A 00 00 01 34 E5 7E
7E FF 03 80 21 02 01 00 0A 03 06 0A 00 00 01 5D 91 7E
7E FF 03 80 21 01 01 00 16 03 06 00 00 00 00 81 06 00 00 00 00 83 06 00 00 00 00 6E DB 7E
7E FF 03 80 21 01 01 00 0A 03 06 0A 00 00 01 34 E5 7E
7E FF 03 80 21 02 01 00 0A 03 06 0A 00 00 01 5D 91 7E
7E FF 03 80 21 01 01 00 16 03 06 00 00 00 00 81 06 00 00 00 00 83 06 00 00 00 00 6E DB 7E
7E FF 03 80 21 01 01 00 0A 03 06 0A 00 00 01 34 E5 7E
7E FF 03 80 21 02 01 00 0A 03 06 0A 00 00 01 5D 91 7E
7E FF 03 80 21 01 01 00 16 03 06 00 00 00 00 81 06 00 00 00 00 83 06 00 00 00 00 6E DB 7E
7E FF 03 80 21 01 01 00 0A 03 06 0A 00 00 01 34 E5 7E
7E FF 03 80 21 02 01 00 0A 03 06 0A 00 00 01 5D 91 7E
7E FF 03 80 21 01 01 00 16 03 06 00 00 00 00 81 06 00 00 00 00 83 06 00 00 00 00 6E DB 7E
..... 重复,直到挂断


如上数据,分析过程正常往下走:
【模块】LCP请求 --> 【我】拒绝协议域压缩和头压缩 --> 【模块】LCP请求 --> 【我】确认请求 --> 【我】发送PAP认证 --> 【模块】确认 --> 【模块】发送IPCP协商请求 --> 【我】确认 --> 【我】发送IPCP请求 ....
如上所示,绿色标示过程走的很顺畅,一直到红色过程模块就再也不回复我,而是重复向我发送IPCP请求(说明我的回复无效),
其中,我曾试过许多其他它的情况,如:在确认IPCP协议时,采用前面协调的转义方案来发送、发送确认时,不带数据等,都无效。

不知我的IPCP协议过程错在哪里,网上的资料太片面,IPCP协议详细格式并未完全说清楚,不知大家有没有这样实现过,给我一些指导或是示例。在此感谢!

相关帖子

沙发
MakeBetter|  楼主 | 2013-11-1 00:47 | 只看该作者
自己顶一次睡觉,希望明天和位高手醒的早,手一抖就点进来了。

使用特权

评论回复
板凳
kmcfly| | 2013-11-1 09:19 | 只看该作者
不知道你对RFC1661 PPP文档里 画黄色颜色的字 如何理解。。。。。

222.bmp (707.28 KB )

222.bmp

使用特权

评论回复
地板
MakeBetter|  楼主 | 2013-11-1 09:31 | 只看该作者
好**啊,兄弟可否发份给我?

使用特权

评论回复
5
kmcfly| | 2013-11-1 09:34 | 只看该作者
你自己下一份就行  百度文库  RFC1661  多得是。

使用特权

评论回复
6
MakeBetter|  楼主 | 2013-11-4 10:14 | 只看该作者
谢谢楼上。
您所说资料我已下到。

使用特权

评论回复
7
MakeBetter|  楼主 | 2013-11-4 10:26 | 只看该作者
本帖最后由 MakeBetter 于 2013-11-4 10:28 编辑

顺便问一下,有谁用过中兴的MG2639没?
真心不看好这模块,使用其内置协议栈时,TCP收发数据存在Bug,经过反馈后修正,现在使用其ppp协议自行封装tcp/ip协议也存在bug,就连使用电脑拔号都不能正常完成拔号过程。
目前bug找到,也找到了避开的方法。上面我的问题即是其bug引起。

有中兴的人员吗?我不是抵毁你们哦,
模块型号是:MG2639,软件版本号是:+CGMR: MG2639_GB_BFFF007  你们自己去测吧。
内置协议栈问题我跟你们反馈过,这个我就不说了,刚才的ppp协议问题我前面帖子里有数据分析,你们去试试就是了。
另外,使用电脑拔号时,出问题的情况是:
模块前面阶段都正常,最后一步PC已获了到了ip及服务器ip等信息,但模块发的IPCP请求包却是这个,PC机一直不认这数据包:
7E 80 21 01 01 00 0D 03 06 0D 00 00 01 4A 0B 7E
这里面FSC校验是错误的,我进一步核验过,当把以上的两个0x0D改为0x0A后,校验就正常了,且数据包就是对的。嘿嘿,明显是模块发送的数据包有问题。

使用特权

评论回复
8
kmcfly| | 2013-11-4 10:41 | 只看该作者
LZ你好  我也在用一3G模块,用的龙尚的,用其本身的协议栈发送数据,想用其命令例如AT+MIPSEND=1,"123" ,
发送十六进制为0x00 或是 大于0x80的数据,如何发送,因为这部分数据是ASCII扩展字符集或是空字符

使用特权

评论回复
9
MakeBetter|  楼主 | 2013-11-4 16:04 | 只看该作者
这个我就不了解了,使用本身携带的协议栈你要看他自己的指令。

使用特权

评论回复
10
kmcfly| | 2013-11-4 16:10 | 只看该作者
MakeBetter 发表于 2013-11-4 16:04
这个我就不了解了,使用本身携带的协议栈你要看他自己的指令。

假如自己去编写 PPP TCP/IP协议栈,工作量有多大,以LZ的才华 大约需要多久  ,因为实在不行就得自己来写协议栈了。。。

使用特权

评论回复
11
MakeBetter|  楼主 | 2013-11-6 14:38 | 只看该作者
花了大概3天吧,但前期的资料收集以及在这过程中的资料收集很重要。
只要对协议理解完整了,实现并不难。
tcp/ip协议栈的话,我以前实现过,只是移槙过来。当然,也可以直接使用别人写好的协议,如LWIP,里面就有ppp协议了,但对于我这种不好钻研的人且对那些不同于自己的编程习惯看的很不爽的人来说,看起来头疼,所以就干脆自己写了。你要有兴趣,可以自己去移植LWIP。

使用特权

评论回复
12
kmcfly| | 2013-11-6 15:16 | 只看该作者
MakeBetter 发表于 2013-11-6 14:38
花了大概3天吧,但前期的资料收集以及在这过程中的资料收集很重要。
只要对协议理解完整了,实现并不难。
t ...

楼主这么牛啊,花3天就搞定了,前一段时间整了整PPP,协议走到一半的时候出了问题,未果,只好用其自身的协议栈,发现模块只能发送字符格式的数据,现在也只好自己去实现这协议栈了,楼主能否把整理的资料打包发到我的邮箱作个参考  kmcfly@126.com     不胜感激啊。。。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

61

主题

506

帖子

0

粉丝