实现 EC20 4G模块PPP拨号上网
目录
- 前言
- 一、ppp/pppd/chat关系及数据收发
- 1、协议相关介绍
- 1.1 什么是PPP
- PPP认证
- 1.2 什么是PPPD
- 1.3 什么是chat
- 1.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拨号脚本
脚本的编写可简单可复杂,为了清晰明了,下面就介绍简单版本的。(没有通过传参配置会导致我们每次想修改配置的时候都要改脚本)
脚本出处:https://blog.csdn.net/weixin_45121946/article/details/107284629?spm=1001.2014.3001.5501
初始化脚本
rasppp
# /etc/ppp/peers/rasppp# Usage: sudo pppd call rasppp# 连接调试时隐藏密码
hide-password# 该手机不需要身份验证4
noauth# 用于呼叫控制脚本
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# 不指定默认IP
noipdefault# 不使用PPP压缩
novj
novjccomp
noccp
ipcp-accept-local
ipcp-accept-remote
local# 最好锁定串行总线
lock
dump# 保持pppd连接到终端
nodetach# 用户名 密码
# user
# password
#移动,联通拨号不需要用户名密码,文末给出不同运营商的配置# 硬件控制流
crtscts
remotename 3gppp
ipparam 3gppp# 请求最多两个DNS服务器地址
usepeerdns
rasppp-chat-connect
# 连续15秒,收到以下字符,则退出执行
TIMEOUT 15
ABORT "BUSY"
ABORT "ERROR"
ABORT "NO ANSWER"
ABORT "NO CARRTER"
ABORT "NO DIALTONE"# 40秒内没有收到指定字符,则退出
# 例如 OK \rATZ,发送ATZ,希望收到的是OK
""AT
OK \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上进行处理。现在就可以使用该网卡上网了。
参考资料:
https://blog.csdn.net/eydwyz/article/details/54602459
https://blog.csdn.net/weixin_45121946/article/details/107284629?spm=1001.2014.3001.5501
实现 EC20 4G模块PPP拨号上网相关推荐
- linux 串口4g ppp,在ARM-linux上实现4G模块PPP拨号上网
原标题:在ARM-linux上实现4G模块PPP拨号上网 在ARM平台上实现 的 ,参考网上的资料和自己的理解,从一无所知到开发完成花了一周多.最后看到ARM板ping通www.baidu.com时甚 ...
- linux怎么使用4g模块的网络,在ARM-linux上实现4G模块PPP拨号上网(示例代码)
在ARM平台上实现4G模块的PPP拨号上网,参考网上的资料和自己的理解,从一无所知到开发完成花了一周多.最后看到ARM板ping通www.baidu.com时甚是高兴,现将此过程整理如下.当然,除此之 ...
- 怎么在Linux内核模块加打印,在ARM-linux上实现4G模块PPP拨号上网
在ARM平台上实现4G模块的PPP拨号上网,参考网上的资料和自己的理解,从一无所知到开发完成花了一周多.最后看到ARM板ping通www.baidu.com时甚是高兴,现将此过程整理如下.当然,除此之 ...
- 在ARM-linux上实现4G模块PPP拨号上网
搞了3.4天4G模块,从毫无头绪到可以ping通外网,着实不轻松.用的是一不知名品牌EC20, 技术支持很少,资料很乱,然后自己搜集资料,一步一步调试,才搞通. 环境: ubuntu12.04.02 ...
- sim900芯片—GPRS模块ppp拨号上网
--------------------------------------- 主机操作系统:Centos 6.7 交叉编译器环境:arm-linux-gcc-4.5.4 开发板平台: FL2440 ...
- 驱动程序开发:基于EC20 4G模块自动拨号联网的两种方式(GobiNet工具拨号和PPP工具拨号)
目录 一.EC20 4G模块简介 二.根据移远官方文档修改EC20 4G模组驱动 1.因为EC20 4G模组min-pice接口其实就是usb接口,因此需要修改Linux内核源码drivers/u ...
- Centos 7.6 下使用美格SLM750(4G模块)拨号上网
文章目录 概述 准备 编译内核源码 添加串口的ID 删除NDIS和ADB端口 开始编译 编译NDIS驱动 编译Gobinet拨号工具 服务化拨号工具 概述 想要实现4G上网有两种方式,要么加多一个 ...
- 树莓派 4G模块 PPP 拨号 NDIS 拨号
资料参考:树莓派使用4G模块(华为ME909s-821)亲身尝试的可行方法(上) 转载于:https://www.cnblogs.com/suozhang/p/8488008.html
- linux下GPRS模块ppp拨号上网
交叉编译器:arm-linux-gcc-4.5.4 Linux内核版本:Linux-3.0 主机操作系统:Centos 6.5 开发板:FL2440 GPRS:SIM900A 在开发SIM900 ...
- 实现4G模块EC20在树莓派系统下的PPP拨号上网
目录 PPP协议 PPP通信建立 PPP认证方式 ppp协议栈 pppd数据传输 Pppd 控制协议数据流程 Linux中的PPP实现 安装PPP 方法一:源码安装 方法二: 直接安装 PPP拨号上网 ...
最新文章
- 5地图组件 uni_uni-app学习笔记(一)-- uni-app简介
- MySQL REGEXP:正则表达式查询
- OpenStack Liberty 连接vCenter
- ora-12528 : message 12528 not found; product=RDBMS ; facility=ora
- js小案例:定时轮播图
- codevs 1043 方格取数 2000年NOIP全国联赛提高组
- shp与json互转(转载)
- C语言数字3转变字符 3 程序,大学c语言知识点总结
- ClickedOnce部署方法
- 43个热门Flex和ActionScript 3.0 APIs,技巧和工具
- php .net mvc,总是觉得asp.net MVC 写着很别扭,对比PHP的mvc,asp.net 麻烦很多?
- flutter的PDF阅读器
- android逆向去广告,教程]安卓逆向去广告教程送给大家(
- 影子系统 重启蓝屏 开机蓝屏 安全模式蓝屏 进PE蓝屏 解决方案
- gini指数与cart 决策树
- Java音频格式转换,支持amr、aud、slk、silk转成mp3
- 蛋白质中二硫键特征的质谱分析技术及其应用
- IOS 应用安全测试内容
- 电机速度曲线规划1:梯形速度曲线设计与实现
- TCP扫描增强器实现65000端口,10S完成,快准狠(Go语言编程)