嵌入式Linux利用ppp实现4G模块联网

本文介绍了如何在嵌入式Linux系统中使用ppp2.4.5实现4G模块联网。通过编译ppp、配置内核、安装ppp软件、创建及配置脚本,详细阐述了拨号流程,包括pppd、chat脚本、ip-up和ip-down脚本的作用,以及如何处理默认网关和DNS问题。同时提供了调试信息和不同运营商的拨号设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前做项目时需要用到SIM7100模块,便快速了解下ppp拨号,实现了功能,但是功能虽然实现了,却依然有许多疑问,这段时间有点时间,打算更加详细的研究下。

编译ppp2.4.5

  • 下载:官方地址
  • 编译:
    #1.解压ppp程序包
    tar -xzvf ppp-2.4.5.tar.gz
    #2.进入并生成Makefile
    cd ./ppp-2.4.5
    ./config
    #3.指定交差编译工具make
    make CC=arm-linux-gcc
    

配置内核

Device Drivers --->Network device support---> <*>   PPP (point-to-point protocol) support 

menuconfig

ppp安装

以上编译过程将会生成pppd、pppdump、pppstats、chat四个运行程序,将他们复制到开发平台下的/usr/sbin/中。

chat:调制解调器的自动对话脚本,Chat程序定义了一个计算机和调制解调器之间对话交流,其主要目的是用来在本地PPPD和远端PPPD程序之间建立连接(简单说就是与4G模块进行AT命令交互的流程表,最终实现与ISP运营商的连接)。

pppd:点对点协议守护进程,其功能为实现ppp策略性的内容,包括所有鉴权、压缩/解压和加密/解密等扩展功能的控制协议。

pppdump:将使用pppd记录选项编写的文件转换为人类可读的格式。

pppstats:显示PPP连线状态。pppstats(point to point protocol status)。

拨号流程简图

menuconfig

脚本配置

在开发平台上建立两个文件夹,并拷贝ppp.2.4.5文件夹中的chap-secrets、pap-secrets脚本至/etc/ppp文件夹。

mkdir /etc/ppp
mkdir /etc/ppp/peers
cp ./chap-secrets ./pap-secrets /etc/ppp
# 顺便创建一下ip-up、ip-down脚本

  • pppd配置文件介绍

    pppd的参数略多啊,具体可以自己man一下或者点击这里查看。
    这里我介绍下我用的,配置文件名称暂定为“gprs”

    # /etc/ppp/peers/gprs
    # This is pppd script for China Mobile, used SIMCOM SIM7100C Module
    # Usage: root>pppd call gprs
    # Interface should be used is the interface which connects physics interface of SIM7100C Module
    
    # ttyname 串口端口,若非以”/“开头,则会自动补充”/dev/“
    /dev/ttyUSB3
    
    # speed 串口波特率
    115200
    
    #硬件流控
    crtscts
    
    # 调制解调器模式
    modem
    
    # 无需身份验证
    noauth
    
    # 不要求使用chap授权
    refuse-chap
    
    # 不要求使用mschap授权
    refuse-mschap
    
    # 不要求使用mschap-v2授权
    refuse-mschap-v2
    
    # 调试模式 pppd将以可读形式记录发送或接收的所有控制数据包的内容
    debug
    
    # 前台运行
    nodetach
    #hide-password
    
    # 向ISP请求2个dns服务器地址。这两个地址将以DNS1与DNS2两个环境变量传送到/etc/ppp/ip-up脚本中,并且将环境变USEPEERDNS量置为1
    usepeerdns
    
    # 禁用本地ip,由ISP提供
    noipdefault
    
    # 添加ISP网关至路由表,作为默认路由
    defaultroute
    
    # 用户名
    user "cmnet"
    
    0.0.0.0:0.0.0.0
    
    #ipcp-accept-local
    #ipcp-accept-remote
    
    # 使能一下两个选项可以实现ppp掉线自动重播
    # lcp连接失败尝试次数
    lcp-echo-failure 6
    
    # lcp echo发送间隔
    lcp-echo-interval 10
    
    # 禁用压缩控制协议ccp
    #noccp
    
    # 禁用Van  Jacobson格式的tcp/ip报头
    #novj
    
    
    #novjccomp
    
    # 连接终止后不要退出,而是重新尝试连接,连接次数收到maxfail限制
    persist
    
    # 连接最大尝试次数,0无限制
    #maxfail
    
    # 启动ppp协议前,进行硬件拨号
    connect '/usr/sbin/chat -s -v -f /etc/ppp/gprs-connect-chat'
    
  • chat脚本

    chat脚本主要用来通过AT命令完成4G模块的拨号过程,关于其选项含义可以man一下或者点击这里查看,下面先介绍下其语法:
    chat最主要语法就是“期望-发送”,直白点说就是,我期望收到[某某AT响应],若收到,则发送[某某AT命令]。

    chat还有个常用的关键词为ABORT,这个关键词用于判断何时终止脚本,在AT交互过程中,模块发生错误,并且输出一些错误信息时,ABORT可根据设定的词,停止当前脚本。

    以下脚本命名为“gprs-connect-chat”

    #Chat script for China Mobile, used SIMCOM sim7100 TD module.
    
    # 设置响应超时
    TIMEOUT 15
    
    # 若接收到“DELAYED”、“BUSY”、“ERROR”、“NO DIALTONE”、“NO CARRIER”,则退出脚本
    ABORT "DELAYED"
    ABORT "BUSY"
    ABORT "ERROR"
    ABORT "NO DIALTONE"
    ABORT "NO CARRIER"
    
    # 无期望,直接发送AT字符串
    '' AT
    
    # 以下内容可以根据自己模块提供的AT命令手册查询含义
    OK ATS0=0
    OK ATE0V1
    
    # 设置APN,移动、联通、电信各不相同,见文末表格
    OK AT+CGDCONT=1,"IP","CMNET" 
    # 拨号开启GPRS服务,号码移动、联通、电信各不相同,见文末表格
    OK ATD*99***1#
    
    #期望收到CONNECT
    CONNECT
    
  • ip-up脚本

    之前的脚本如果没有问题,正常的话运行 pppd call gprs 就可以拨号成功,并且ifconfig后可以查看到ppp0这个网卡。但是如果你在拨号之前已经启用了以太网eth0,此时指定使用ppp0网卡ping指定ip或域名ping -I ppp0 www.baidu.com 并不能成功,原因有两个,一个是路由表中的默认网关是之前eth0生成的,一个是默认的dns服务器地址有问题。

  • 解决默认网关问题

在pppd脚本中使能了defaultroute后,pppd会在拨号成功后向路由表中添加一条默认网关信息,但是因为之前已经有一条默认网关了,于是添加失败,默认网关依然是之前eth设置的,因此在pppd call gprs之前我们应该先route del default来删除默认路由(最好写个脚本来实现删除默认路由–拨号等一系列操作)。

  • 解决dns问题

在pppd脚本中使能了usepeerdns后,pppd会在拨号成功后,在/etc/ppp下生成resolv.conf,这是ISP运营商提供的dns,我们应该将拷贝或者连接到/etc目录下,当然这件事就可以交给ip-up来做。

ip-up脚本:

#!/bin/bash
#ip-up
dns_file="/etc/resolv.conf"

rm "$dns_file"
ln /etc/ppp/resolv.conf "$dns_file"
  • ip-down脚本

    按照ppp拨号过程中打印信息可以发现,在退出pppd进程时,会调用/etc/ppp/ip-down。因此删除默认网关,恢复dns就交由ip-down脚本做了。

#!/bin/bash
#ip-down
#set -vx
dns_file="/etc/resolv.conf"

rm $dns_file

cat > "$dns_file" <<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值