600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 实现 EC20 4G模块PPP拨号上网

实现 EC20 4G模块PPP拨号上网

时间:2020-12-23 20:34:03

相关推荐

实现 EC20 4G模块PPP拨号上网

目录

前言一、ppp/pppd/chat关系及数据收发1、协议相关介绍1.1 什么是PPPPPP认证1.2 什么是PPPD1.3 什么是chat1.4 他们之间的联系应用关系数据收发流程发送数据流程接收数据流程二、拨号上网流程2.1 硬件准备2.2 软件准备3.3拨号脚本开始拨号

前言

在学习4G拨号前,我们要先把ppp/pppd/chat关系及数据收发给捋清楚了。为了加深映像,特此写下这篇博客


提示:以下是本篇文章正文内容,下面案例可供参考

一、ppp/pppd/chat关系及数据收发

1、协议相关介绍

1.1 什么是PPP

PPP(Point- to-Point Protocol点到点协议)是为在同等单元之间传输数据包这样的简单链路设计的链路层 协议。这种链路提供全双工操作,并按照顺序传递数据包。设计目的主要是用来通 过拨号或专线方式建立点对点连接发送数据,使其成为各种主机、网桥和路由器之间简单连接的一种共通的解决方案。

链路控制协议 LCP(Link Control Protocol);网络控制协议 NCP(NetworkControlProtocol);认证协议:口令验证协议PAP(PasswordAuthenticationProtocol)和挑战握手验证协议CHAP(Challenge-HandshakeAuthentication Protocol)。

PPP认证

LCP协商,协商内容包 括除1661中所定义的选项之外,还要考虑OA和OE中规定的内容。LCP协商过后就到了Establish阶段,开始PAP或CHAP认证。PAP为两次握手认证,口令为明文。PAP认证过程如下:发送用户名同口令到认证方,认证方查看是否有此用户,口令是否正确,然后发送相应的响应。CHAP为三次握手认证,口令为密文(密钥)CHAP认证由认证方发送一些随机产生的报文,交给被认证,被认证方用自己的口令字用MD5算法进行加密,传回密文,认证方用自己保存的口令字及随机报文用MD5算法加密,比较二者的密文,根据比较结果返回响应的响应。认证成功即进行Network阶段协商(NCP),在IP接入中主要是IPCP协商(如IP地址和地址的协商等)。任何阶段的协商失败都将导致链路的拆除。协商成功,则链路建立成功,可以开始传输网络层数据报文。

1.2 什么是PPPD

pppd是一个后台服务进程(daemon),是一个用户空间的进程,所以把策略性的内容从内核的PPP协议处理模块移到pppd中是很自然的事了。pppd实现了所有鉴权、压缩/解压和加密/解密等扩展功能的控制协议。

在pppd里,每种协议实现 都在独立的C文件中,它们通常要实现protent接口,该接口主要用于处理数据包,和fsm_callbacks接口,该接口主要用于状态机的状态切 换。数据包的接收是由main.c: get_input统一处理的,然后根据协议类型分发到具体的协议实现上。而数据包的发送则是协议实现者根据需要调用output函数完成的

1.3 什么是chat

chat 程序是一个自动聊天程序,程序非常简单,chat根据配置的信息主动向stderr 输出信息,同时,从stdin获得期望输入。chat程序输入端口为stdin,输入端口为stderr。所以,如果使用本程序进行拨号上网时,必需将stdin与stderr映射到对应的串口。

1.4 他们之间的联系

应用关系

PPP协议(PPPD协助) PPP

pppd是一个普通的用户进程,pppd 与内核中的PPP协议处理模块之间采用最传统的内核空间与用户空间之间通信方式:设备文件;设备文件名是/dev /ppp。通过read系统调用,pppd可以读取PPP协议处理模块的数据包,当然,PPP协议处理模块只会把应该由pppd处理的数据包发给 pppd。通过write系统调用,pppd可以把要发送的数据包传递给PPP协议处理模块。通过ioctrl系统调用,pppd可以设置PPP协议的参 数,可以建立/关闭连接。

chat是pppd所带一个辅助工具。 chat用来与GSM模组建立会话。它的实现比较简单,它向串口发送AT命令,建立与GSM模组的会话,以便让PPP协议可以在串口上传输数据包。

数据收发流程

应用程序通过socket接 口发送TCP/IP数据包,这些TCP/IP数据包如何流经PPP协议处理模块,然后通过串口发送出去呢?pppd在make_ppp_unit函数中调 用ioctrl(PPPIOCNEWUNIT)创建一个网络接口(如ppp0),内核中的PPP协议模块在处理PPPIOCNEWUNIT时,调用 register_netdev向内核注册ppp的网络接口,该网络接口的传输函数指向ppp_start_xmit。

发送数据流程

当应用程序发送数据时,内核根据IP地址和路由表,找到ppp网络接口,然后调用ppp_start_xmit函数,此时控制就转移到PPP协议处理模块了。 ppp_start_xmit调用函数ppp_xmit_process去发送队列中的所有数据包,ppp_xmit_process又调用 ppp_send_frame去发送单个数据包,ppp_send_frame根据设置,调用压缩等扩展处理之后,又经ppp_push调用 pch->chan->ops->start_xmit发送数据包。

pch->chan->ops->start_xmit 是什么?它就是具体的传输方式了,比如说对于串口发送方式,则是ppp_async.c: ppp_asynctty_open中注册的ppp_async_send函数,ppp_async_send经ppp_async_push函数调用 tty->driver->write把数据发送串口。

用程序 pppd| || |socket /dev/ppp| || |PPP协议模块||tty||GSM模组

pppd的控制协议数据发送过程:

pppd --Pap/chap/eap(etc)–> /dev/ppp --> PPP协议模块 --> tty --> GSM模组

接收数据流程

ppp_async.c在初始化时(ppp_async_init),调用tty_register_ldisc向tty注册了行规程处理接口,也就是一组回调函数,当串口tty收到数据时,它就会回调ppp_ldisc的ppp_asynctty_receive函数接收数据。ppp_asynctty_receive调用ppp_async_input把 数据buffer转换成sk_buff,并放入接收队列ap->rqueue中。

ppp_async另外有一个tasklet(ppp_async_process)专门处理接收队列ap->rqueue中的数据包,ppp_async_process一直挂在接收队列ap->rqueue上,一旦被唤醒,它就调用ppp_input函数让PPP协议处理模块处理该数据包。

在ppp_input函数中,数据被分成两路,一路是控制协议数据包,放入pch->file.rqb队列,交给pppd处 理。另外一路是用户数据包,经ppp_do_recv/ppp_receive_frame进行PPP处理之后,再由netif_rx提交给上层协议处理,最后经socket传递到应用程序。

应用程序 pppd| || |socket /dev/ppp| || |PPP协议模块||tty||GSM模组

二、拨号上网流程

2.1 硬件准备

树莓派3B

EC20 4G模块

嵌入式开发板

模块天线

联通电话卡

(由于东西还没准备好,后期更新放上来)

2.2 软件准备

因为树莓派上已经支持了4G模块的驱动,插上之后能自动检测出来,需要准备的只有应用层的pppd程序,两种方式,网上下载源码到树莓派上编译安装,另一种 sudo apt-get install ppp都可,在安装好ppp相关驱动后,就可以开始写我们的拨号脚本了。

3.3拨号脚本

脚本的编写可简单可复杂,为了清晰明了,下面就介绍简单版本的。(没有通过传参配置会导致我们每次想修改配置的时候都要改脚本)

脚本出处:/weixin_45121946/article/details/107284629?spm=1001..3001.5501

初始化脚本

rasppp

# /etc/ppp/peers/rasppp# Usage: sudo pppd call rasppp# 连接调试时隐藏密码hide-password# 该手机不需要身份验证4noauth# 用于呼叫控制脚本connect '/usr/sbin/chat -s -v -f /etc/ppp/peers/rasppp-chat-connect'# 断开连接脚本disconnect '/usr/sbin/chat -s -v -f /etc/ppp/peers/rasppp-chat-disconnect'# 调试信息debug# 4G模块/dev/ttyUSB2# 串口波特率115200# 使用默认路由defaultroute# 不指定默认IPnoipdefault# 不使用PPP压缩novjnovjccompnoccpipcp-accept-localipcp-accept-remotelocal# 最好锁定串行总线lockdump# 保持pppd连接到终端nodetach# 用户名 密码# user# password#移动,联通拨号不需要用户名密码,文末给出不同运营商的配置# 硬件控制流crtsctsremotename 3gpppipparam 3gppp# 请求最多两个DNS服务器地址usepeerdns

rasppp-chat-connect

# 连续15秒,收到以下字符,则退出执行TIMEOUT 15ABORT "BUSY"ABORT "ERROR"ABORT "NO ANSWER"ABORT "NO CARRTER"ABORT "NO DIALTONE"# 40秒内没有收到指定字符,则退出# 例如 OK \rATZ,发送ATZ,希望收到的是OK""ATOK \rATZ# 建立连接,联通为3gnet,文末给出各运营商配置OK \rAT+CGDCONT=1,"IP","3gnet"# 拨号,*99#是联通的拨号号码OK-AT-OK ATDT*99#CONNECT \d\c

rasppp-chat-disconnect

ABORT "ERROR"ABORT "NO DIALTONE"SAY "\NSending break to the modem\n"""\k"""+++ATH"SAY "\nGood bye !\n"

开始拨号

(这里所用的PPP拨号脚本与上面的不同)

拨号成功后,会返回两个DNS域名,如果拨号失败,要注意不同运营商的拨号方式是不一样的,比如电信需要填写用户名和密码,而移动和联通则不需要,拨号号码也不相同联通是 *99# ,电信是 #777,这些都需要注意.

现在,使用ifconfig查看网卡。可以看到多了一个网卡ppp10,这其实是pppd模拟出来的一个虚拟网卡,其数据最终仍然是发送到usb3上进行处理。现在就可以使用该网卡上网了。


参考资料:

/eydwyz/article/details/54602459

/weixin_45121946/article/details/107284629?spm=1001..3001.5501

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。