linux pppd脚本配置


摘要
    本文主要介绍了嵌入式Linux系统下使用pppd  2.4.4来进行PPP拨号需要使用的脚本是如何配置的,配置项的含义,同时也说明了如何来配置参数,实现ppp拨号上网。

一.问题提出
    嵌入式Linux操作系统下,如果要进行PPP连接,就需要配置拨号要使用的连接脚本。这些脚本参数就决定了PPPD的行为,会对PPP连接产生很大的影响。所以需要对这些脚本的参数以及具体含义有所了解。

二.解决思路
和PPP连接关系密切的有两个脚本是chat和options两个脚本。其中,chat脚本是用来进行AT呼叫和控制的脚本,而options脚本就影响PPP连接的。

1.   CHAT脚本
   一个简单的chat脚本有下面的结构:
""              AT
OK              ATDT  dialnumber
CONNECT      ""
一个chat脚本都是由字符串对来组成的。前面的字符串都是期望获取的串,紧跟的是发送的字符串。这个脚本每一项的具体含义是这样的:
1)     MODEM期望空字符串。这句话的意思直接理解就是MODEM不管收到什么字符串,先发出字符串AT;
2)     期望收到“OK”字符串,然后发送字符串“ATDT dialnumber”
3)     如果收到“CONNECT”,就不再发送,认为数据链路已建立连接。
  这样的chat脚本是最简单的,如果需要进行超时控制,就可以加入如下字段:
TIMEOUT  10
如果要增加对特殊情况的处理,就加入下面字段:
        ABORT           BUSY          
        ABORT           NO ANSWER
        ABORT            RINGING
这三行语句的意思是:如果收到字符串“BUSY”、“NO  ANSWER”、“RINGING”就退出执行。
所以在考虑到各种特殊情况下,配置一个PPP连接的CHAT脚本就可以像下面这样:
TIMEOUT          30
ABORT           BUSY         
    ABORT           NO ANSWER
     ABORT           RINGING
""                 AT
OK                ATDT  dialnumber
CONNECT         ""

2.OPTIONS脚本
OPTIONS脚本的内容,为PPP连接指定了连接使用的设备、使用的控制字符传输速率、指定了硬件加速、溢出控制等。
例如下面的options脚本:
ttyS0 ---- 指定连接使用的设备,例如:ttyS0、ttyS1等
57600 ---- 设置连接使用的控制字符传输速率,可以设置为57600、115200等
debug ---- 如果需要加入调试信息,就加入参数debug
logfile /var/ ppplog ---- 将连接过程中的信息输入到某个文件中
mtu 1500
-detach
noipdefault ---- 不使用默认IP就可以加入参数noipdefault
defaultroute
usepeerdns ---- 使用服务器端协商的DNS就可以设置参数usepeerdns
lcp-echo-failure 4 ---- 当连续4次没有收到发出的LCP回声请求时,就认为服务器端已不再响应,就退出执行。这里的失败次数可以灵活来决定。
-ccp ---- 不使用压缩控制协议
-vj ---- 关掉式IP头压缩
-chap ---- 不使用chap鉴权
-mschap-v2 ---- 不使用mschap鉴权
user
hide-password
connect  "/usr/bin/chat -v -t6 -f /var/ chat" ---- 制定了要使用的chat脚本的位置。加上参数-v 告诉 chat命令将其所有的输出/入拷贝到系统记录里(通常是 /var/log/messages)。-t 6 指定了执行chat该命令的时间为6s。chat脚本的位置可以位于/etc/目录下,也可以位于/var下,这个可以更加需要灵活设置。
persist --- 永久链接(自动重拨)
crtscts --- 告诉ppp使用modem的硬件流量控制
modem --- 使ppp使用DCD信号来判断连接是否正常,有无掉线现象
deflate --- 使pppd使用defalte压缩方式
idle --- 设置了一个时间限制,当在300秒的时间内没有数据传送,就断开连接
lock --- 则创建一个锁定文件,其他程序在发现存在这个文件后,就能得知相应的串口已经被使用。
demond --- 参数告诉pppd停留在后台,监视网络数据,一旦有要求就立即进行连网,超时后就断开连接,但pppd仍然停留在后台等待下次数据传送

其他的参数具体含义可以参照参考PPPD2.4.4 中options.c中注释:

/*
* Option variables and default values.
*/
int debug = 0;  /* Debug flag */
int kdebugflag = 0;  /*  Tell kernel to print debug messages */
int default_device  = 1; /* Using /dev/tty or equivalent */
char devnam[MAXPATHLEN]; /*  Device name */
bool nodetach = 0;  /* Don't detach from  controlling tty */
bool updetach = 0;  /* Detach once link is up  */
int maxconnect = 0;  /* Maximum connect time  */
char user[MAXNAMELEN]; /* Username for PAP */
char passwd[MAXSECRETLEN]; /* Password for PAP  */
bool persist = 0;  /* Reopen link after it goes down */
char our_name[MAXNAMELEN]; /* Our name for authentication purposes  */
bool demand = 0;  /* do dial-on-demand */
char *ipparam = NULL; /* Extra parameter for ip up/down scripts  */
int idle_time_limit = 0; /* Disconnect if idle for this many  seconds */
int holdoff = 30;  /* # seconds to pause  before reconnecting */
bool holdoff_specified; /* true if a holdoff  value has been given */
int log_to_fd = 1;  /* send log  messages to this fd too */
bool log_default = 1; /* log_to_fd is  default (stdout) */
int maxfail = 10;  /* max # of  unsuccessful connection attempts */
char linkname[MAXPATHLEN]; /*  logical name for link */
bool tune_kernel;  /* may alter  kernel settings */
int connect_delay = 1000; /* wait this many ms  after connect script */
int req_unit = -1;  /* requested  interface unit */
bool multilink = 0;  /* Enable multilink operation  */
char *bundle_name = NULL; /* bundle name for multilink  */
bool dump_options;  /* print out option values */
bool dryrun;   /* print out option values and exit  */
char *domain;  /* domain name set by domain option */
int child_wait = 5;  /* # seconds to wait for children at exit  */

3. 鉴权脚本
    一般情况下,PPP连接是需要进行身份认证的。签权方式有两种,一种是PAP鉴权,另一种是CHAP鉴权。鉴权需要的用户名和密码是存放在PAP-secrets和chap-secrets脚本中,以如下方式存放:
Username  * password
    需要进行鉴权时,通过在options脚本中指定鉴权方式为PAP或CHAP,PPP模块就会从PAP-secrets和chap-secrets脚本中读出用户名和密码,附加到PPP的鉴权包中,发送到服务器端进行身份认证。


4. PPP拨号过程与脚本之间的关系
  脚本设置成功以后,怎么和pppd2.4.4一起工作呢?这个需要从pppd程序的主函数入手。
这个过程是这样的:
  Pppd程序启动以后,就会按照pathname.h中所指定的文家位置去寻找options脚本文件。这个可以按照需要指定文件的位置,确保pppd能够准确找到该文件。
  Pppd找到options文件后,按顺序读入参数行。在这里,就可以获取系统要使用的是哪个设备来进行联网、设备的速率是多少。
  Pppd 将配置的参数解析为程序当中的全局变量标识符,进行pppd连接控制。


三.实践情况
下面是FT282 上的PPP连接使用的OPTIONS、 CHAT和PAP-SECRETS脚本。
OPTIONS:
connect "/usr/bin/chat -v -t6 -f  /var/ppp/td-scdma_chat"
ttyUSB0
115200
debug
logfile  /var/log/ppplog
mtu  1500
-detach
noauth
noipdefault
defaultroute
usepeerdns
crtscts
lock
lcp-echo-failure  4
-ccp
-vj
-chap
-mschap-v2
user
hide-password
CHAT:
     "" AT
OK ATDT*98*1#
CONNECT ""
PAP-SECRETS:
   wap  *wap
经过在FT282上进行测试,发现能够顺利进行PPP连接。

以上流程成功后,会由移动或联通的基站分配一个IP地址作为自己的客户端地址,接下来按照如下流程建立客户端与服务端的连接。

(1)socket(int domain,int type,int protocol);
该函数建立新的socket,以建立一个新的通信端口并获得文件描述符。函数中的参数domain确定一个协议族,这里定义为AF_INET,type指定套接字类型,该处使用SOCK_STREAM,protocol一般为0,使用默认协议。
(2)connect(int sockfd,struct sockaddr *address,size_t address_len);
当调用socket建立传输端口后,调用connect函数建立与远程服务器相连的连接线路。
(3) recv(int sockfd,void *buf,int len,unsigned int flags);
该函数用于接收从套接口传来的信息,socket用connect连接的套接口,buf是指向内存块的指针,用于存储接受的消息,len指明内存块的大小,flags是一个操作标志。
(4)Base64_Code();//对登陆信息或附件内容进行加密
(5)send(int sockfd,const void *msg,int len,unsigned int flags);
该函数是用来通过套接口向其它程序传递数据的。sockfd是用来传输数据的socked描述符,msg是一个指向要发送数据的指针,len是以字节为单位的数据的长度,flags一般情况下设置为0。
其中对附件文件的发送需要预先设定每次读取的字节数和每次发送的字节数,将附件分批读取编码发送。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405354.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React面试题目录汇总

总29 2021年11月10日(更12) [react] 什么时候使用状态管理器? [react] render函数中return如果没有使用()会有什么问题? [react] componentWillUpdate可以直接修改state的值吗 [react] 什么渲染劫持? [react] 说…

Linux运行可执行文件

原先以为linux下运行可执行文件在文件名前加"./"是执行命令,今天才搞明白是指当前目录转载于:https://www.cnblogs.com/dpc525/archive/2011/04/25/2028715.html

Linux下如何定位Java进程CPU利用率过高原因

首先通过Top命令查看占用CPU较高的进程PID,执行Top之后按1可以查看每个核占用比例 1 top这里由于我是用的虚拟机,即使我的Java进程占用CPU很高也只是占的虚拟机的,而对整个机器的CPU来说占的并不高。这里我们找到了pid7957 然后我们在根据pi…

在用户态下使用uint64_t

#include <stdio.h> #include <stdint.h>typedef struct {unsigned short msg_type;unsigned short msg_len;//msg body len }st_msg_h;typedef struct{char audio_name[64];uint64_t time_stamp;//输入的要播放的时间戳绝对时间int dec_ch;}st_msg_start;typedef …

【iOS开发】企业版证书($299)In-House方式发布指南

一、明确几个概念 1、企业版IDP&#xff1a;即iOS Development Enterprise Program。注意是$299&#xff0f;Year那种&#xff0c;并不是$99/Year的那种。 2、In House&#xff1a;是只企业内部发布&#xff0c;仅限企业内部人员使用。 二、In-House方式特点 1、不能发布到Appl…

[react] 说说你对windowing的了解

[react] 说说你对windowing的了解 展示长列表 如果你的应用会渲染大量的列表数据&#xff0c;我们建议使用一种称为‘windowing’的技术&#xff0c;这种技术下在任何给定的时间内只会渲染一小部分数据列表&#xff0c;并可以减少列表项的重复渲染&#xff08;即再次渲染已经渲…

ARM 移植 PPPD

&#xfeff;&#xfeff;1&#xff0e; 下载编译ppp-2.4.1 a) 解压 b) 进入chat目录&#xff0c;修改Makefile.Linux, 添加CCarm-linux-gcc c) 编译chat: make –f Makefile.linux,生成chat d) 进入pppd目录&#xff0c;修改Makefile.linux, 将CCgcc…

回车(CR)与换行(LF), '\r'和'\n'的区别

一&#xff1a;回车”&#xff08;Carriage Return&#xff09;和“换行”&#xff08;Line Feed&#xff09;起源 首先&#xff0c;弄清两个概念&#xff1a; 回车CR-将光标移动到当前行的开头。 换行LF-将光标“垂直”移动到下一行。&#xff08;而并不移…

Linux shell逐行读取文件的方法-比较

From: http://www.embeddedlinux.org.cn/html/jishuzixun/201211/19-2387.html 在linux中有很多方法逐行读取一个文件的方法&#xff0c;其中最常用的就是下面的脚本里的方法&#xff0c;而且是效率最高&#xff0c;使用最多的方法。为了给大家一个直观的感受&#xff0c;我们…

RMSE、MAPE、准确率、召回率、F1、ROC、AUC总结

RMSE(root mean square error)均方根误差 单纯统计误差的值。 MAPE(mean absolute percentage error) 平均百分比误差 存在一个和原始数据相比较的过程。 准确率&#xff08;precision&#xff09;P&#xff1a; PTP/(TPFP) TP(true positive) FP(false positive) P是代表预…

移植PPP2.4.5到ARM上实现拨号

&#xfeff;&#xfeff;1、内核编译的时候&#xff0c;看到以下关于PPP的全部要选择如下&#xff1a; Device Drivers--->Network device support ---> │ │ <*> PPP (point-to-point protocol) support │ │ │ │ [*] …

hdu 5317 RGCDQ (2015多校第三场第2题)素数打表+前缀和相减求后缀(DP)

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid5317 题意&#xff1a;F(x) 表示x的不同质因子的个数结果是求L&#xff0c;R区间中最大的gcd( F(i) , F(j) )&#xff0c;i、j在L&#xff0c;R区间内。 思路&#xff1a;因为2<L < R<1000000&#xf…

[react] 举例说明React的插槽有哪些运用场景

[react] 举例说明React的插槽有哪些运用场景 我觉得这里的插槽&#xff0c;指的应该是组合组件&#xff0c;而不是portal(传送门)&#xff0c;因为对比vue中的插槽&#xff0c;只是父组件在子组件中间加入一系列的内容&#xff0c;然后子组件可以自己判断显示逻辑&#xff0c;…

C#中的事件和委托(续)

引言 如果你看过了 C#中的委托和事件 一文&#xff0c;我想你对委托和事件已经有了一个基本的认识。但那些远不是委托和事件的全部内容&#xff0c;还有很多的地方没有涉及。本文将讨论委托和事件一些更为细节的问题&#xff0c;包括一些大家常问到的问题&#xff0c;以及事件访…

linux中追踪函数backtrace调用堆栈

From: http://www.embeddedlinux.org.cn/html/jishuzixun/201211/19-2388.html 一般察看函数运行时堆栈的方法是使用GDB之类的外部调试器,但是,有些时候为了分析程序的BUG,(主要针对长时间运行程序的分析),在程序出错时打印出函数的调用堆栈是非常有用的。 在头文件"exe…

MATLAB 中RMSE和MAPE的计算方法

RMSE&#xff1a;均方根误差 matlab计算方法&#xff1a; rmse sqrt(mean((YPred-Obverval).^2)); MAPE&#xff1a;平均百分比误差 matlab计算方法&#xff1a; meap mean(abs((observed - predicted)./observed))*100;

Linux SPI总线和设备驱动架构

http://blog.csdn.net/droidphone/article/details/24353293

[react] React15和16别支持IE几以上?

[react] React15和16别支持IE几以上&#xff1f; React15 版本不直接支持IE8 浏览器的&#xff0c;官方文档中说React16 中依赖于集合类型Map 和 Set 因此不再支持IE 11 以下的浏览器&#xff0c;如果想要支持&#xff0c;需要使用全局的 polyfill 个人简介 我是歌谣&#x…

ubuntu11.04正式版下载地址

ubuntu11.04正式版下载地址&#xff1a; 下載點列表&#xff1a; http://ftp.cs.pu.edu.tw/Linux/Ubuntu/ubuntu-cd/11.04/ubuntu-11.04-desktop-amd64.iso http://ftp.cse.yzu.edu.tw/pub/Linux/Ubuntu/ubuntu-cd/11.04/ubuntu-11.04-desktop-amd64.iso http://ftp.cs.pu.edu.…

hdu 3074 线段树 OR 树状数组

比较基础的线段树&#xff0c;1A。 线段树&#xff1a; 1 #include <iostream>2 #include <cstring>3 #include <cstdio>4 using namespace std;5 6 typedef long long ll;7 const int N 50001;8 const int MOD 1000000007;9 int a[N];10 11 struct Node12…