EC20 AT指令

EC20 AT指令

https://www.cnblogs.com/fw-qql/p/14917303.html

参考 https://blog.csdn.net/O_MMMM_O/article/details/98501735  EC20模块AT命令讲解

参考 https://blog.csdn.net/qq_22946477/article/details/105863960  4G模块配置、概念、调试记录

 

由文档Quectel_WCDMA&LTE_Linux_USB_Driver_User_Guide_V1.8.pdf

   由上可知,ttyUSB2是用来发送AT指令的,ttyUSB3是用来发送ppp的

 

cat /dev/ttyUSB2 &

echo -e "AT+QCCID\r\n" >/dev/ttyUSB2    //查询SIM卡

echo -e "AT+CFUN=1,1\r\n" >/dev/ttyUSB2   //重启模块

echo -e "AT+QSIMDET=1\r\n" >/dev/ttyUSB2   //开启SIM卡热插拔状态报告

echo -e "AT+QSIMDET=1,1\r\n" >/dev/ttyUSB2  //开启SIM卡检测功能

echo -e "AT+CSQ\r\n" >/dev/ttyUSB2  //查询信号强度

echo -e "AT+QNWINFO\r\n" >/dev/ttyUSB2 //查询网络状态

echo -e "AT+QCFG=\"NWSCANMODE\",3,1\r\n" >/dev/ttyUSB2 //设置4G LTE only

echo -e "AT+QCFG=\"NWSCANMODE\",2,1\r\n" >/dev/ttyUSB2 //设置3G WCDMA only

echo -e "AT+QCFG=\"NWSCANMODE\",1,1\r\n" >/dev/ttyUSB2 //设置2G GSM only

echo -e "AT+QCFG=\"NWSCANMODE\",0,1\r\n" >/dev/ttyUSB2 //设置自动搜索网络

 AT+QSPN   注册网络的名称

AT+QSIMDET=1,1或AT+QSIMDET=1,0开启     可以设置高电平  或者低电平有效//SIM卡热拔插,同一个电路 肯定不可以设置两种sim卡检测状态   要么高电平有效  要么低电平有效

AT+QSIMDET=0  关闭热拔插功能

通过AT命令开启SIM卡检查功能

举例:

AT+QSIMSTAT=1          //开启SIM卡热拔插状态报告

AT+QSIMDET=1,1或AT+QSIMDET=1,0//开启 SIM卡检测功能

当SIM卡拔出或者插上的时候,模块会有相应的提示:

+CPIN:NOT READY

AT+QSIMSTAT=1,1或AT+QSIMSTAT=1,0

Call Ready


核心提示:AT指令语法  使用AT指令与串口通信,是一种“礼尚往来”的通信方式,即当控制端输入一个AT指令后,与之通信的外部设备将会回复一个结果,就这样一对一的进行。以最简单的AT指令为例,当串口连接好以后,使用busybox microcom -s 115200 ttyUSB2当然,4G模块接入树莓派后会模拟出多个模块,如果选择的ttyUSB不对可多尝试记下;进入串口通信模式,当我输入一个AT后,设备将会回复一个OK每输入一次AT设备都会回复一个OK,就可以利用不同的指令,结合设备的返回码来与设备通信

 

文章目录

  • 一. AT指令语法
    • 基本原理
    • AT指令和响应类型
  • 二. AT指令集中的几个重要术语
  • 三. 一般命令
    • ATI 显示产品标识信息
    • AT+GMI , AT+CGMI 获取制造商
    • AT+GMM , AT+CGMM 申请TA模型识别
    • AT+GMR , AT+CGMR 请求软件版本的TA修订标识
    • AT+GSN , AT+CGSN 获取模块IMEI号
    • AT&F 将所有当前参数设置为制造商默认值
    • AT&V 显示当前配置
    • AT&W 保存设置
    • AT&Z 将所有当前参数设置为用户定义的配置文件
    • ATQ 设置结果代码演示模式
    • ATV TA响应格式
    • ATE 设置命令回显模式
    • A/
    • ATS3 设置命令行终止符
    • ATS4 设置响应格式字符
    • ATS5 设置命令行编辑字符
    • AT+CFUN 设置电话功能
    • AT+CMEE 错误讯息格式
    • AT+CSCS 选择字符集
  • 四. 串口控制命令
    • AT&C 设置数据载波检测模式
    • AT&D 设置DTR功能模式
    • AT+IFC 设置TE-TA本地数据流控制
    • AT+ICF 设置TE-TA控制字符框
    • AT+IPR 设置波特率
  • 五. 状态控制命令
    • AT+CPAS 移动设备活动状态
  • 六. EC20 4G模块SIM卡相关命令
    • AT+CIMI 获取国际移动用户识别码
    • AT+CPIN 查询SIM卡状态
    • AT+CLCK 设备锁
    • AT+CPWD 修改密码
    • AT+CCID , AT+QCCID 显示SIM的CCID号
  • 七. 网络服务命令
    • AT+COPS 操作员选择
    • AT+CREG 网络注册状态
    • AT+CSQ 查看信号强度

 

一. AT指令语法

基本原理

 使用AT指令与串口通信,是一种“礼尚往来”的通信方式,即当控制端输入一个AT指令后,与之通信的外部设备将会回复一个结果,就这样一对一的进行。
以最简单的AT指令为例,当串口连接好以后,使用

busybox microcom -s 115200 ttyUSB2

当然,4G模块接入树莓派后会模拟出多个模块,如果选择的ttyUSB不对可多尝试记下;进入串口通信模式,当我输入一个AT后,设备将会回复一个OK

每输入一次AT设备都会回复一个OK,就可以利用不同的指令,结合设备的返回码来与设备通信。

其实,当我敲下AT 回车后,发送给设备的指令实际是

AT<CR>

也就是 “AT\r”
“\r” 是指回到行首,但不会换到下一行,而当我们收到OK时,实际上是收到了

<CR><LF><OK><CR><LF>

也就是 “\r\nOK\r\n
" /r/n " 合起来才是Windows下的Enter,即回到行首并新建一行。从上面的图中可以看到,OK的确换到了新的一行,当我们在敲AT时,又是在新的一行。

  • 基本语法
    这些AT命令的格式为“ AT<x><n> ”或 “AT&<x><n>,其中以"<x>”为命令,并且“ <n>"是该命令的参数。 例如“ ATE <n>”,它告诉DCE是否应根据“ <n>”的值将收到的字符回显到DTE。 “ <n>”是可选,如果缺少默认值,将使用默认值。
  • S参数语法
    这些AT命令的格式为“ ATS <n> = <m>”,其中“ <n>”是要设置的S寄存器的索引,“ <m>”是要分配给它的值。S参数语法这些AT命令的格式为“ ATS <n> = <m>”,其中“ <n>”是要设置的S寄存器的索引,“ <m>”是要分配给它的值。

AT指令和响应类型

Test CommandAT+<x>=?此命令返回参数和值范围的列表由相应的写命令或内部进程设置
Read Command AT+<x>? 命令返回参数的当前设置值或参数
Write Command AT+<x>=<…> 此命令设置用户可定义的参数值。
Execution Command AT+<x> 取受UE内部流程影响的被变量参数

二. AT指令集中的几个重要术语

TE (Terminal Equipment):
终端设备,比如一台计算机,一部手机,与DTE等价.它是和信息网络的一端相接的可提供必要功能的设备,这些功能使得用户可以通过接入协议接入网络。发送信息,接收信息。

TA(Terminal Adapter)
终端适配器,提供终端适配功能的物理实体,是一种接口设备,与DCE等价。比如SIM300模块

DCE(Data Communications Equipment)
数据通信设备,它在DTE和传输线路之间提供信号变换和编码功能,并负责建立、保持和释放链路的连接,如Modem。DCE设备通常是与DTE对接,因此针脚的分配相反。其实对于标准的串行端口,通常从外观就能判断是DTE还是DCE,DTE是针头(俗称公头),DCE是孔头(俗称母头),这样两种接口才能接在一起。

DTE(Data Terminal Equipment)
数据终端设备,具有一定的数据处理能力和数据收发能力的设备。DTE提供或接收数据,例连接到调制解调器上的计算机就是一种DTE。DTE提供或接收数据,连接到网络中的用户端机器,主要是计算机和终端设备。与此相对的,在网络端的连接设备称为 DCE ( Date Circuit - terminating Equipment )。DTE与进行信令处理的DCE相连。 它是用户—网络接口的用户端设备,可作为数据源、目的地或两者兼而有之。 DTE通过DCE设备(例如,调制解调器)连接到数据网络,且一般使用DCE产生的时钟信号。DTE包括像计算机、协议转换器和多路复用器这样的设备。

ME Mobile Equipment : 移动设备,比如手机,就属于ME

MS Mobile Station : 移动台,在移动中使用的通信站或者手持台。

三. 一般命令

ATI 显示产品标识信息

ATI命令用来返回模块的产品标识信息:

可以看到,我的模块式移远的EC20F.,Revision是修订标识
最大响应时间:300ms

AT+GMI , AT+CGMI 获取制造商


最大响应时间:300ms

AT+GMM , AT+CGMM 申请TA模型识别

和查型号差不多

AT+GMR , AT+CGMR 请求软件版本的TA修订标识


可以发现,最上面的命令包含了这3个命令。
最大响应时间:300ms

AT+GSN , AT+CGSN 获取模块IMEI号


IMEI号,即国际移动设备识别码(International Mobile Equipment Identity,IMEI),通常所说的手机序列号,移动通信设备都会有一个IMEI号,就像身份证。
最大响应时间:300ms

AT&F 将所有当前参数设置为制造商默认值

例如

AT&F0

最大响应时间:300ms

AT&V 显示当前配置


最大响应时间:300ms

AT&W 保存设置

将当前参数存储到用户定义的配置文件。
下面不标明最大响应时间的,默认300ms

AT&Z 将所有当前参数设置为用户定义的配置文件

该命令以非易失性方式将当前AT命令设置恢复到用户定义的配置文件内存(如果之前已将它们存储在AT&W中)。 同一命令行上的任何其他AT命令,可能会被忽略。

ATQ 设置结果代码演示模式

此参数设置确定TA是否将任何结果代码发送到TE。 信息文字以响应方式传输不受此设置影响.

if \<n>=0:
OK
if\<n>=1:
none

<n> :
0 —— TA发送结果代码
1 —— 结果代码被禁止而不发送

ATV TA响应格式

该命令确定与AT命令结果代码一起发送的标题和尾部的内容和信息回复。
结果代码,它们的数字等效形式以及每种用法的简要说明在列表中列出。
例如:

各响应结果对应的数字:

ATV1ATV0
OK 0
CONNECT 1
RING 2
NO CARRIER 3
ERROR 4
NO DIALTONE 6
BUSY 7
NO ANSWER 8

ATE 设置命令回显模式

输入的命令是否能在屏幕打印
例如 ATE0,ATE1

A/

该命令重复上一个AT命令行,“ /”充当行终止符。

ATS3 设置命令行终止符

该命令确定模块识别的字符以终止传入的命令行。 它还为结果代码和信息文本以及通过ATS4设置的字符值生成。

ATS4 设置响应格式字符

该命令确定模块为结果代码和信息文本生成的字符,以及通过ATS3设置的命令行终止字符。

ATS5 设置命令行编辑字符

该命令确定模块用来删除紧靠其前的字符值,AT命令行中的字符(即等于退格键)。

AT+CFUN 设置电话功能

  1. AT+CFUN=?
    列出所有功能对应序号
  2. AT+CFUN?
    查询当前设置的电话功能,返回的是fun的值
  3. AT+CFUN=<fun>[,<rst>]
    设置电话功能

<fun>
0 —— 最低功能
1 —— 完整功能(默认)
4 —— 禁止ME发送和接收RF信号

\rst>
0 —— 将ME设置为功能级别之前,请勿重置ME。当未给出时,这是默认设置。
1 —— 重置ME。 复位后,该设备可以正常使用。 该值仅用于 = 1

AT+CMEE 错误讯息格式

  1. AT+CMEE=?
    列出支持的功能
  2. AT+CMEE?
    查看当前设置
  3. AT+CMEE=<n>
    设置错误讯息格式

<n>
0 —— 禁用结果代码
1 —— 启用结果代码并使用数值
2 —— 启用结果代码并使用详细值
这个设置比较有必要,当发生错误时如果光知道错误号还要去查询,具体看下图:

AT+CSCS 选择字符集

AT指令集支持三种字符集,分别是GSM,IPA与UCS2字符集.

AT+CSCS=<cheset>

四. 串口控制命令

AT&C 设置数据载波检测模式


1 表示总是开启数据载波检测功能
0 表示仅在有数据载体的情况下才打开

AT&D 设置DTR功能模式

该命令确定在数据模式期间,如果DTR线路从低电平更改为高电平,UE将如何响应。

AT&D[\value>]

<value>
0 —— TA忽略DTR上的状态
1 —— DTR上的低→高:在保持连接的呼叫的同时切换到命令模式。
2 —— DTR上的低→高:断开数据调用,然后更改为命令模式。 当DTR处于高级别时,自动应答功能已禁用。

AT+IFC 设置TE-TA本地数据流控制

  1. AT+IFC=?
    列出支持的设置
  2. AT+IFC?
    查看当前设置
  3. AT+IFC=<dce_by_dte>,<dte_by_dce>
    设置

<dce_by_dte> 指定TE从TA接收数据时将使用的方法
0 —— 无
2 —— RTS流量控制

<dte_by_dce> 指定TA从TE接收数据时将使用的方法
0 —— 无
2 —— CTS流量控制

AT+ICF 设置TE-TA控制字符框

该命令确定TA从TE接收到的串行接口字符成帧格式和奇偶校验。

  1. AT+ICF=?
    查询支持的设置
  2. AT+ICF?
    查看当前设置
  3. AT+ICF=[<format>,[<parity>]]
    设置

<format>
3 —— 8 数据 0 奇偶校验 1 停止

<parity>
0 —— 奇数
1 —— 偶数

AT+IPR 设置波特率

我前面关于串口通信的文章有提到过波特率,具体就不在解释了

五. 状态控制命令

AT+CPAS 移动设备活动状态

  1. AT+CPAS=?
    查看支持的状态
  2. AT+CPAS
    TA返回ME的活动状态<pa>

<pa>
0 —— 准备
3 —— 响
4 —— 正在通话或保持通话


AT+CLCC是列出当前呼叫列表

更多状态控制命令请参考ET20的dataeet,后面会给出下载地址。

六. EC20 4G模块SIM卡相关命令

AT+CIMI 获取国际移动用户识别码

AT+CPIN 查询SIM卡状态

  1. AT+CPIN?
    回复 +CPIN: <code>
  2. AT+CPIN=<pin>[,<new pin>]
    TA存储密码,例如(U)SIM PIN,(U)SIM PUK等,在操作之前这是必需的。 如果PIN码是输入两次,TA将自动重复PIN。 如果没有PIN请求待处理,未执行任何操作且发生了错误消息+ CME ERROR返回给TE。
    如果所需的PIN是(U)SIM PUK或(U)SIM PUK2,则第二针是必需的。 第二个销钉用于更换(U)SIM中的旧针脚。

<code>
READY MT —— 不需要任何密码
SIM PIN MT —— 正在等待提供(U)SIM PIN
SIM PUK MT —— 正在等待(U)SIM PUK
SIM PIN2 MT —— 正在等待提供(U)SIM PIN2
SIM PUK2 MT —— 正在等待(U)SIM PUK2被给予
PH-NET PIN MT —— 正在等待提供网络个性化密码
PH-NET PUK MT —— 正在等待提供网络个性化解锁密码
PH-NETSUB PIN MT —— 正在等待提供网络子集个性化密码
PH-NETSUB PUK MT —— 正在等待提供网络子集个性化解锁密码
PH-SP PIN MT —— 正在等待提供服务提供商的个性化密码
PH-SP PUK MT —— 正在等待提供服务提供商个性化解锁密码
PH-CORP PIN MT —— 正在等待提供公司个性化密码
PH-CORP PUK MT —— 正在等待公司个性化解锁密码

<pin>
字符串类型。 密码。 如果请求的密码是PUK,例如(U)SIM PUK1,
PH-FSIM PUK或其他密码,然后必须在后跟。
<new pin>
字符串类型。 如果请求的代码是PUK,则需要新密码

AT+CLCK 设备锁

详细用法见datasheet第61页。

AT+CPWD 修改密码

AT+CCID , AT+QCCID 显示SIM的CCID号


因为其他命令基本上用不上,所以就不一一列举

七. 网络服务命令

AT+COPS 操作员选择

该命令可用于查看运营商的FDD-LTE网络,可用于查看SIM的注册情况

  1. AT+COPS=?
    返回支持的stat,运营商的长名称,短名称,FDD-LTE以及Act
  2. AT+COPS?
    返回当前SIM卡的相关信息
    格式如下:
    +COPS: <mode>[,<format>[,<oper>][,<Act>]]
    下面来看这些参数都对应了什么内容:

<stat>
0 —— 未知
1 —— 位操作员可用
2 —— 当前操作员
3 —— 禁止操作员

<oper>
符合<mode>格式的运算符

<mode>
0 —— 自动模式。 <oper>字段被忽略
1 —— 手动操作员选择。 <oper>字段应存在,并且可选
2 —— 手动从网络注销
3 —— 仅设置<format>(对于AT + COPS?Read Command),不要尝试注册/取消注册(<oper>和<Act>字段将被忽略)。 该值在读取命令的响应中无效。
4 —— 手动/自动选择。 将显示|字段。 如果手动选择失败,进入自动模式(<mode> = 0)

<format>
0 —— 长格式字母数字<oper>,最长16个字符
1 —— 短格式字母数字<oper>
2 —— 数字<oper>。 GSM位置区域识别号码

<Act>
选择了访问技术。 值3、4、5、6仅在读取响应中出现
MS处于数据服务状态且不适用于AT + COPS写入时的命令
0 —— GSM
2 —— UTRAN
3 —— GSM W/EGPRS
4 —— UTRAN W/HSDPA
5 —— UTRAN W/HSUPA
6 —— UTRAN W/HSDPA and HSUPA
7 —— E-UTRAN
100 ——CDMA

AT+CREG 网络注册状态

该命令返回两个参数
+CREG: <n>,<stat>

<n>
0禁 —— 用未经请求的网络注册结果代码
1 —— 启用未经请求的网络注册结果代码+ CREG:<stat>
2 —— 启用带有位置信息的网络注册未经请求的结果代码

<stat>
0 —— 未注册。 我目前不在搜索新的运营商来注册
1 —— 已注册,本地网络
2 —— 未注册,但ME当前正在搜索新的运营商以注册
3 —— 注册被拒绝
4 —— 未知
5 —— 已注册,漫游网络(外地网络)
stat为1,5 SIM都可用。

AT+CSQ 查看信号强度


第一个返回值为信号强度,9 ~ 31 以内越高则信号越强,第二个参数为通道误码率(百分比),99表示位置,如果返回99,99则表示SIM不可用,应该检查下天线。
插EC20 4G模块的天线时,要注意天线的位置,一个是main口,一个是div口,main主要负责就收发送,而div口只能接受,应将天线插到main口。

这就是一些AT较为重要的命令,还有收拨电话与收发短信的指令将在下一篇博客总结。

下载链接:https://pan.baidu.com/s/1M6itx4z-Sd8Xjg0WDXmbIQ
提取码:8gd6

 

 

$ strings /bin/usr_lte 
signal intensity:%s
normal
signal intensity:%s(%s)
ifconfig eth1 | grep 'inet addr:'
ifconfig eth2 | grep 'inet addr:'
inet addr
ifconfig 3g-wan_ct | grep 'inet addr'
ifconfig ppp0 | grep 'inet addr'
N710/N720 get ip=%s
[%s @ %s : %d]: ******sim1*******usr_lte:402 get ip=%s
usr_lte.c
4G_LOG
[%s @ %s : %d]: ******sim1*******usr_lte:403 get ip=%s
[%s @ %s : %d]: 301c get ip=%s
************get_ip*********=%d
NoService
Network Mode:%s
AMPS Mode
CDMA Mode
HDR Mode
CDMA/HDR HYBRID Mode
2G Mode
Unicom 3G Mode
GPS Mode
GSM/WCDMA/LTE Mode
Mobile 3G Mode
4G Mode
READY
Check ME password:%s
SIM PIN
PIN Password request
SIM PUK
PUK Password request
SIM PIN2
PIN2 Password request
SIM PUK2
PUK2 Password request
******AT+CREG?**1111111111****%s
register
CREG:%s
unregistered
No registration, MS is now searching for new operators to be registered
GPRS Network registration status:%s
GPRS  Network registration status:%s
No registration, but MS is searching for new operators to be registered
Registration is rejected
Already registered, roaming
Short message service center number:%s
User number:%s
system information:4G Mode
system information:2G Mode
system information:3G Mode
system information:NoService
################### [%d , %d] ###################
MOBILE
CHINA-MOBILE
Operator information:%s
UNICOM
CHINA-UNICOM
CHINA-TELECOM
PDP protocol:%s
Software version number:%s
**simcom*****network mode**rev_buffer*********%s
system information:%s
CTNET 3G Mode
QNWINFO
system information:%s
*************************pfind buf = %s****************
GPRS
EDGE
HSDPA
HSUPA
HSPA+
HDR-EHRPD
CDMA1X
CDMA1XANDHDR
WCDMA
TDSCDMA
Mobile  3G Mode
FDDLTE
TDDLTE
result_num_Net=========%s
Network Service:%s
base station information:%s
base station information:%s
"0","0"
base station information:"%s,%s
*****get base station information*******src******===%s
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%s 
 SSSSSSSSSSSSSSSSSSSSS
base station information:%s,%s
latitude:
----latitude---%f--
longitude:
----longitude---%f--
base station information:%3.4f,%3.4f
*****get base station information*******out******===%s
bm_rat src:%s
+BMRAT
bm_rat:%s
echo %s > /tmp/bm_rat
bm_rat value:%s
nl668_rat src:%s
+PSRAT
nl668_rat:%s
+CGSN:
+GSN:
^HWVER:
+ZGMR:
+GMR:
+CGMR:
+BMSWVER:
EC20
+CIMI:
4600
+ZICCID:
ZICCID:
^GETICCID:
+QCCID:
+CCID:
+CSQ:
+CCSQ:
^SYSINFO:
+CPIN:
+CREG:
+COPS:
+CEREG:
+CGREG:
+CSCA:
+CNUM:
+CGDCONT:
+CSPN:
^PREFMODE:
+NETMODE:
+BMRAT:
+PSRAT:
/tmp/usrlte_info_imsi
tmp/usrlte_info_imsi open fail 
ReadIMSI============%s
46000
46002
46004
46007
46008
46001
46006
46003
46005
46011
46009
/tmp/usrlte_info_Iccid
tmp/usrlte_info open fail 
====Sim1===ICCID============%s
SIM Card number:
8986
NOT FIND 0!!!!
890141
Cingular
NOT FIND 8986 890141........
NOT FIND ICCID
**====Sim1===****P_Iiccid_Two=======%s
Please check the SIM card whether is true!!!
cmnet
3gnet
ctlte
01020304
0504030201
0402030501
/etc/ltedial
gpio s 32 1;gpio s 33 0
gpio s 33 1;gpio s 32 0
gpio s 32 1;gpio s 33 1
gpio s 32 0;gpio s 33 0
gpio s 35 1;gpio s 34 0;gpio s 30 0;gpio s 31 0;
gpio s 35 1;gpio s 34 1;gpio s 30 0;gpio s 31 0;
gpio s 35 1;gpio s 34 1;gpio s 30 1;gpio s 31 0;
gpio s 35 1;gpio s 34 1;gpio s 30 1;gpio s 31 1;
gpio s 35 0;gpio s 34 0;gpio s 30 0;gpio s 31 0;
********sim1*****************get Signal num =%d****************
SYSINFO:
**************sim1***********pfind buf = %s****************
***************sim1**********get Signal mode = %d****************
ctnet
send: %d, %s -->>
get valid ack: len:%d, %s
AT+ZEACT=0
AT+BMBANDLOCK=2
AT+QCFG="band",0,1E200000000,0,1
AT+LTEMODELOCK=2
AT+ZEACT=3
AT+BMBANDLOCK=0
AT+QCFG="band",0,0,0,1
AT+LTEMODELOCK=0
AT+ZBAND?
AT+BMRAT
AT+QNWINFO
asdfghj
AT+ZEACT?
[%s @ %s : %d]: get valid string: len:%d, %s
[%s @ %s : %d]: get timeout: len:%d, %s
***1111111111**rev_buffer*********%s
***222222**rev_buffer*********%s
CNSMOD
**simcom*****network mode**rev_buffer*********====get_lte_mode==%d=====%s
BMTCELLINFO
/tmp/cellinfo
/tmp/cellinfo open fail 
SCELLINFO
*******sim1**********p2=%s
SYSINFO
AT+CGSN
IMEI Number:%s
$$$$$$$$p_IMEI============%s
AT+GSN
===sim1===$$$$$$$$p_IMEI============%s
AT+CIMI
******add Check SIM IMSI @zgz-170803****42****%s
SIM Card CIMI number:%s
******add Check SIM IMSI @zgz-170803****43***%s
********sim1*********SIM_DisplayProcess=%s
not found
tcsetattr fd1
SetupSerial 1
Unsupported data size
Unsupported parity
SetupSerial 3
%02X 
find r: %sxx
find n: %sxx
%s - 
ret=`uci show apnset.@apnset[0].mode`;echo ${ret#*=}
ret=`uci show apnset.@apnset[0].acqorder`;echo ${ret#*=}
********apn_param.mode=========%s
********apn_param.acqorder=========%s
ret=`uci show apnset.@apnset[0].apnaddr`;echo ${ret#*=}
apnaddr: %sxx
ret=`uci show apnset.@apnset[0].pdptype`;echo ${ret#*=}
pdptype: %sxx
ret=`uci show apnset.@apnset[0].authtype`;echo ${ret#*=}
authtype: %sxx
retx=`uci show apnset | grep -w authusername`; echo ${retx#*=}
find r: %sxx
authusername: %sxx
retx=`uci show apnset | grep -w authpwd`; echo ${retx#*=}
authpwd: %sxx
retx=`uci show apnset | grep -w pinenable`; echo ${retx#*=}
find r: %s--
find r: %s--
simpin enable status: %s--
retx=`uci show apnset | grep -w authpin`; echo ${retx#*=}
simpin: %s--
retx=`uci show network | grep -w priority`; echo ${retx#*=}
prio: %s--
retx=`uci show apnset | grep -w redial_t`; echo ${retx#*=}
redial_t: %s, set = %d --
retx=`uci show apnset | grep remote_monitor`; echo ${retx#*=}
remote_monitor: %sxx
retx=`uci show apnset | grep -w bandlock`; echo ${retx#*=}
*************sim1 start!!!!**************
[%s @ %s : %d]: *************sim1 start!!!!**************
gpio s 30 0;gpio s 31 0;gpio s 32 0;gpio s 33 0;gpio s 34 0;gpio s 35 0;
**********sim1*******usr_lte***start*****************
env -i /sbin/ifup wan_4g1 >/dev/null 2>/dev/null
[ -e /dev/ttyUSB0 ] && (ls /dev/ttyUSB* | cut -d: -f2|awk '{print $1}' | wc -l) || (echo 0)
[ -d /sys/devices/platform/ehci-platform/usb1/1-1/1-1.1 ] && echo ok || echo fail 
fail
[%s @ %s : %d]: *****sim1*********usr: no ttyUSB found !
gpio s 24 1; sleep 2; gpio s 24 0;
rm -rf /tmp/SIM1_Info
rm -rf /tmp/usrlte_info_Check
rm -rf /tmp/usr_sim_mode1
/etc/init.d/LteMange_Mode1.sh &
while [ true ];do [ -e /tmp/usr_sim_mode1 ] && break || /etc/init.d/LteMange_Mode1.sh; sleep 3;done
lsusb | sed -n '4p'
lsusb | grep -E "2020:2040|2020:2060|1508:1001|12d1:15c1|19d2:0199|19d2:0536|19d2:0579|2c7c:0125|05c6:9215|05c6:6000|05c6:8080|05c6:9091					|05c6:9008|2949:8241|2949:8243|2949:8247|1e0e:9001" |sed -n '1p' 
-----sim1------lsusb--------buffer=%s
[%s @ %s : %d]: *************sim1***lsusb*****buffer*************=%s
Device
19d2:0579
19d2:0199
19d2:0536
2c7c:0125
05c6:9215
1e0e:9001
2020:2040
2020:2060
1508:1001
***********sim1**************Find G402tf/G401t/G405tf Model!****************
***********sim1**************Find G402tf/G401t/G405tf Model!****************
ls /sys/devices/platform/ehci-platform/usb1/1-1/1-1.1/1-1.1:1.0/net
eth2
[%s @ %s : %d]: *************sim1***fp_eth1_flag*************=%s
gpio s 24 1; sleep 5; gpio s 24 0;
uci rename network.wan_ct='wan_4g1';uci set network.wan_4g1.ifname='eth2';uci set network.wan_4g2.ifname='eth1';uci set network.wan_4g1.proto='dhcp';uci set network.wan_4g1.hostname='4GRouter'; uci delete network.wan_4g1.dialnumber; uci delete network.wan_4g1.device; uci delete network.wan_4g1.service; uci delete network.wan_4g1.apn; uci delete network.wan_4g1.username; uci delete network.wan_4g1.password; uci commit;
eth1
uci rename network.wan_ct='wan_4g1';uci set network.wan_4g1.ifname='eth1';uci set network.wan_4g2.ifname='eth2';uci set network.wan_4g1.proto='dhcp';uci set network.wan_4g1.hostname='4GRouter'; uci delete network.wan_4g1.dialnumber; uci delete network.wan_4g1.device; uci delete network.wan_4g1.service; uci delete network.wan_4g1.apn; uci delete network.wan_4g1.username; uci delete network.wan_4g1.password; uci commit;
***********sim1**************Find 403 Model!****************
*************sim1************Find 403 Model!****************
ls /sys/devices/platform/ehci-platform/usb1/1-1/1-1.1/1-1.1:1.4/net
***********sim1*********===========eth2==========****************
***********sim1*********===========eth1==========****************
*************************Find Simcom Model!****************
*************************not support Simcom Model,continue!****************
[%s @ %s : %d]: *************sim1**BM*fp_eth1_flag*************=%s
*************************Find FIBOCOM NL668 Model!****************
[%s @ %s : %d]: *************sim1**NL668*fp_eth1_flag*************=%s
*************************Not Find Model!****************
****************sim1*********Not Find Model!****************
uci set network.wan_4g1.ifname='eth1';uci set network.wan_4g1.proto='dhcp';uci set network.wan_4g1.hostname='4GRouter'; uci delete network.wan_4g1.dialnumber; uci delete network.wan_4g1.device; uci delete network.wan_4g1.service; uci delete network.wan_4g1.apn; uci commit;
[%s @ %s : %d]: *******SIM1********usr_lte: check lsusb type %d
*******sim1********usr_lte: no ttyUSB found !
***********sim1**************ttyUSB pcheck****************
ls /dev/ttyUSB*
/dev/ttyUSB
***********sim1**************ttyUSB pcheck*%s***************
[%s @ %s : %d]: *****sim1*********usr_lte: no ttyUSB found !
cat /tmp/usr_sim_mode1 | awk '{print $1}' | tail -1
[%s @ %s : %d]: ***sim1*ttyUSBx***%ssssssssssssssss
cat /tmp/usr_sim_mode1 | awk '{print $1}' | sed -n "2p"
[%s @ %s : %d]: ***sim1*ttyUSBx***%s**************
[%s @ %s : %d]: ***sim1****%s open fail: %d
%s open success: %d!...*****sim1****
[%s @ %s : %d]: *****sim1****%s open success: %d!...
usr_lte: AT failure over 100times
ATE0
AT+CPIN="%s"
CIMI
AT+QCFG="EHRPD",4
sleep 2
****BM817c*AT+CPIN****==%s
AT+CIMI
AT+CNMI=2,1,0,0,0
AT+CMGF=1
AT+CSCS="GSM"
AT+CSMP=17,167,0,241
autocheck
-------sim1------------AUTO-ANPADDR=%s-------------------
[%s @ %s : %d]: -------sim1------AUTO-ANPADDR=%s-------
--------sim1-----------ANPADDR=%s-------------------
====--====setTDDFDD auto = %d ,[0 ok  -1 fail] 
====--====setTDDFDD = %d ,[0 ok  -1 fail] 
[%s @ %s : %d]: -----------not get CIMI ---------------
AT+ZNCARD?
+ZNCARD: 1
+ZNCARD:1
AT+ZNCARD=1
usr_lte: reset because of seting zncard
AT+ZSET="UMM_15CAUSEPROC_FLAG",0
AT+COPS=3,0
AT+QCFG="LEDMODE",0
******Sim1****403***mode****%s
AT+QCFG="nwscanmode",%s,1
AT+QCFG="NWSCANMODE"
AT+QCFG="NWSCANSEQ",0504030201
******Sim1****403***acqorder***=%s
AT+QCFG="nwscanseq",%s
ctnet@mycdma.cn
vnet.mobi
at+qctpwdcfg="%s","%s"
[%s @ %s : %d]: *********403***apn_param.authtype*****%s
NoAuth
quectel-CM -s %s %s %s %s -f /tmp/gobinet_log.txt -i eth2 &
quectel-CM -s %s %s %s %s -f /tmp/gobinet_log.txt -i eth1 &
********Sim1*********gobinet start====%s
[%s @ %s : %d]: **sim1**CM***=%s
********Sim1**********gobinet end 
inet addr:
grep inet addr succes!!!
AT+QCFG=%s,8,1
nwscanmode
/tmp/usrlte_info
AT+QNWINFO
+QNWINFO:
AT+CGREG=2
AT+CGREG?
+CGREG: 
[%s @ %s : %d]: usr_lte: gobinet go~~%s 
gobinet end 
%s open fail: %d
usr_lte: ttyUSB open failed
%s open success: %d!...
uci get apnset.@apnset[0].EHRPDEnable
get EHRPD_EN is: %s
***send**AT+EHRPDENABLE=1 AT+BMHDRSCPCFG=4***
AT+EHRPDENABLE=1
AT+BMHDRSCPCFG=4
***send**AT+EHRPDENABLE=0 AT+BMHDRSCPCFG=1***
AT+EHRPDENABLE=0
AT+BMHDRSCPCFG=1
AT+BMMODODR=%s
*********BroadMoBi****Mode*****%s
AT+BMMODODR?
user mode = %s 
*********BM817C***apn_param.authtype*****%s
AT^SYSINFO
AT+CGDCONT=1,"%s","%s"
IPV4V6
*********BM817C**AT+CGDCONT*****%s
BROADMOBI_BM817C(ctnet(4G)/cmnet/3gnet)nomal quectel_CM_str==%s
AT+BM3GPP2CGDCONT=0,3,"%s","%s","%s",2,3,0
*********BM817C**AT+BM3GPP2CGDCONT**111**%s
AT$QCPDPP=1,%s,%s,%s
*********BM817C**AT$QCPDPP****%s
AT+BM3GPP2CGDCONT=0,%s,%s,%s,%s,2,3,0
*********BM817C**AT+BM3GPP2CGDCONT****%s
AT+CEREG=2
AT^SYSINFO
AT+CCSQ
AT+CSQ
AT+CREG=2
AT+CREG?
AT+CEREG?
AT+COPS?
AT+BMSWVER
AT+ICCID
AT+CPIN?
AT+CSCA?
AT+CNUM
AT+CGDCONT?
*****start simcom at**********
AT+CPIN?
+CPIN: READY
+CPIN:READY
AT+CSQ
AT+NETMODE=1
AT+CNMP=%s
*********simcom*****Network Mode Set*****%s
AT+NETMODE=2
AT+SIMEI?
+SIMEI:
AT+CICCID
+ICCID:
AT+CNSMOD?
+CNSMOD:
AT$QCRMCALL=1,1,,,,,,"ctnet@mycdma.cn","vnet.mobi"
$QCRMCALL: 
AT$QCRMCALL=1,1,,,,,"%s","%s","%s",%s
*************SIMCOM****AT$QCRMCALL******===%s
***send**AT+EHRPDEN=1***
AT+EHRPDEN=1
***send**AT+EHRPDEN=0***
AT+EHRPDEN=0
*********NL668***apn_param.authtype*****%s
AT+GTRAT=3
AT+GTRAT=7
AT+GTRAT=2
AT+GTRAT=12,4,5
AT+GTRAT=0
AT+GTRAT=11
AT+GTRAT=10,3,4
AT+GTRAT=6,1,3
AT+GTRAT=6,2,3
AT+GTRAT=6,0,3
PAP_CHAP
*********NL668**AT+CGDCONT*****%s
quectel-CM -s %s %s %s %d -f /tmp/gobinet_log.txt -i eth2 &
quectel-CM -s %s %s %s %d -f /tmp/gobinet_log.txt -i eth1 &
NL668 3GPP quectel_CM_str==%s
AT^PPPCFG="ctnet@mycdma.cn","vnet.mobi"
*********NL668**AT^PPPCFG*****%s
NL668 3GPP2 quectel_CM_str==%s
usr_lte: gobinet go~~end---------------0001---------------------------- 
AT+EHRPDCFG=1,100,"%s","%s","%s","%s",%d
*********NL668**AT+EHRPDCFG*****%s
AT$QCPDPP=1,%d,"%s","%s"
NL668 AT$QCPDPP == %s
AT^PPPCFG="%s","%s"
NL668 AT^PPPCFG == %s
NL668 quectel_CM_str==%s
usr_lte: gobinet go~~end------------------------------------------- 
[%s @ %s : %d]: **********sim1*********usr_lte: usrlte_info first open ok-------
AT+CGMR?
AT+CCID
CCID:
[%s @ %s : %d]: **********sim1*********usr_lte: usrlte_info first write log  ok-------
AT+ZGPCOAUTH?
+CGDCONT: 1,"%s","%s"
+CGDCONT:1,"%s","%s"
AT+CGDCONT?
AT+CFUN=0
AT+ZGPCOAUTH=1,"%s","%s",1
AT^SYSCONFIG=%s,%s,1,2
sim1 402==22===========%s
+++++++++++++++SYSCONFIG--OK++++++++++++
usr_lte: Set Mode over 2 times
+++++++++++++++SYSCONFIG--fail++++++++
AT+CFUN=1
[%s @ %s : %d]: **zgz****G402tf/WH-G405tf***simpin=%s
---sim1---402==22===========%s
+++++++++++++++++++err_cnt  %d ++++++++
--------------leave---------------
Local time is %s
AT+CGMR
AT^HVER
^HVER:
AT+ZICCID?
AT+CREG?
+CREG:1,1
+CREG:1,5
+CREG:1,4
[%s @ %s : %d]: **********sim1*********usr_lte: AT+CREG? = %d
delay_max=%d
**********sim1*********usr_lte*****err_cnt===%d, delay_max====%d
[%s @ %s : %d]: **********sim1*********usr_lte: AT+CREG? err_cnt exceed: %d, redial... 
AT+CGATT?
+CGATT:0
+CGATT: 0
AT+CGATT=1
AT+CGACT=1,1
+ZGIPDNS:
usr_lte: waiting for AT+CGACT=1,1 over 5 times, jumpout
AT+ZGACT=1,1
+ZCONSTAT:
---sim1---dial result: %d
**********sim1*********usr_lte: ZGACT OK, connected successfully ...
****111******sim1*********start log*****
[%s @ %s : %d]: **********sim1*********usr_lte: second-while(1
------
usr_lte: state connected but dial_machine>1000, restart
cp -a /tmp/usrlte_info /tmp/usrlte_info_Check
usr_lte: have ip ,not restart 
[%s @ %s : %d]: ****sim1********Set Signal strength = %d,%d*****
usr_lte: first dial_machine==1000, not restart module
usr_lte: first dial_machine==1000, not restart module
[%s @ %s : %d]: usr_lte: ifconfig ethx
ifconfig 3g-wan_ct | grep 'inet addr:'
ifconfig 3g-wan_4g | grep 'inet addr:'
ifconfig ppp0 | grep 'inet addr:'
ifconfig wwan0 | grep 'inet addr:'
****sim1**get ip**111**buffer===%s
Local time is %s(loop)
****2222******sim1*********start log*****
AT+QCCID
AT+BMRAT
AT+BMTCELLINFO
+BMTCELLINFO:
AT+CGSN?
AT+CIMI?
AT+PSRAT?
AT+SCELLINFO
+SCELLINFO:
^SYSINFO:2
AT+CGREG?
+CGREG:2,1
+CGREG:2,5
+CGREG:2,4
+CGREG:1,1
+CGREG:1,5
+CGREG:1,4
+CGREG:0,1
+CGREG:0,5
+CGREG:0,4
usr_lte: cgregerr_cnt = %d 
usr_lte: state connected but CGREG not OK
[%s @ %s : %d]: usr_lte: state connected but CGREG not OK
[%s @ %s : %d]: ******sim1*******Set Signal strength = %d,%d*****
grep inet addr failed
[%s @ %s : %d]: ****sim1*****Set Signal strength = %d,%d********
**********sim1**************Set Signal strength = %d,%d****************
====--====getTDDFDDInfo start 
====--====getTDDFDDInfo end 
cp -a /tmp/usrlte_info /tmp/SIM1_Info
dd if=/dev/mtdblock3 of=/tmp/1
/tmp/1 open fail 
yr_mac_hex =%02X%02X%02X%02X%02X%02X
yr_mac_hex_enc =%02X%02X%02X%02X%02X%02X
yr_mac_hex(encrypted) =%02X%02X%02X%02X%02X%02X
usr_lte: mac encrypted success!
echo 111111 > /tmp/mactest
mac encrypted success!
usr_lte: mac encrypted fail!
mac encrypted fail!
killall logd crond uhttpd xl2tpd btnd remotemanager dnsmasq
atdial_get_ignorespace
Sim1_thread_ltedial
get_wan_ip
SIM Card CIMI number:
+CIMI:
vnet.mobi
ctnet@mycdma.cn
SIM Card number:
ICCID:
SIM Card number:
+CCID:
SIM Card number:
+QCCID:
SIM Card number:
^GETICCID:
SIM Card number:
ZICCID:
SIM Card number:
+ZICCID:
SIM Card CIMI number:4600
4600
SIM Card CIMI number:
+CIMI:
Software version number:EC20
EC20
Software version number:
+GMR:
Software version number:
+ZGMR:
Hardware version:
^HWVER:
Hardware version:USR
IMEI Number:
+GSN:
IMEI Number:
+CGSN:

 

$ cat etc/ltedial 
#!/bin/sh

#LOGG_STYLE="tty"
#LOGG_STYLE="file"
LOGG_STYLE="logger"
#LOGG_STYLE="tty+logger"
# RemoteLog=`uci get system.@system[0].remote_log_ip`
# if [ "$RemoteLog" != "0.0.0.0" ];then
	# LOGG_STYLE="file+logger"
# fi


logg()
{
	if [ $LOGG_STYLE == "file" ];then
		echo "$*" >> /tmp/ltedial_log
	elif [ $LOGG_STYLE == "logger" ];then
		echo "$*" | logger -s -p user.debug
	elif [ $LOGG_STYLE == "tty+logger" ];then
		echo "$*" > /dev/ttyS1
		echo "$*" | logger -s -p user.debug
	elif [ $LOGG_STYLE == "file+logger" ];then
		echo "$*" >> /tmp/ltedial_log
		echo "$*" | logger -s -p user.debug
	else
		echo "$*" > /dev/ttyS1
	fi
}

logg_notice()
{
	if [ $LOGG_STYLE == "file" ];then
		echo "$*" >> /tmp/ltedial_log
	elif [ $LOGG_STYLE == "logger" ];then
		echo "$*" | logger -s -p user.notice
	elif [ $LOGG_STYLE == "tty+logger" ];then
		echo "$*" > /dev/ttyS1
		echo "$*" | logger -s -p user.notice
	elif [ $LOGG_STYLE == "file+logger" ];then
		echo "$*" >> /tmp/ltedial_log
		echo "$*" | logger -s -p user.notice
	else
		echo "$*" > /dev/ttyS1
	fi
}


_ckIPaddr() 
{
	ckStep1=`echo $1 | awk -F"." '{print NF}'`
	if [ $ckStep1 -eq 4 ] || [ $ckStep1 -eq 6 ]
	then
		ckStep2=`echo $1 | awk -F"." '{if ($1!=0 && $NF!=0) split ($0,IPNUM,".")} END \
			{ for (k in IPNUM) if (IPNUM[k]==0) print IPNUM[k]; else if (IPNUM[k]!=0 && IPNUM[k]!~/[a-z|A-Z]/ && length(IPNUM[k])<=3 &&
			IPNUM[k]<255 && IPNUM[k]!~/^0/) print IPNUM[k]}'| wc -l`
		if [ $ckStep2 -eq $ckStep1 ]
		then
			echo 0
		else
			echo 1
		fi
	else
		echo 1
	fi
}


CURTIME=`date +'%y-%m-%d %H:%M:%S'`
logg "ltedial -- $CURTIME"

#4G进程守护
# usr_lte_info=`ps | grep /bin/usr_lte | grep -v grep`
# usr_backuplte_info=`ps | grep /bin/usr_backuplte | grep -v grep`

# if [ "$usr_lte_info" == "" ];then
	# logg "ltedial -- usr_lte restar" > /dev/ttyS1
	# /etc/init.d/usr_lte restart > /dev/null &
# fi

# if [[ "$usr_backuplte_info" == "" -a "$Sim_Work_Mode" != "ColdMode" ]];then
	# logg "ltedial -- sr_backuplte restart" > /dev/ttyS1
	# /etc/init.d/usr_backuplte restart > /dev/null &
# fi

metric_4g1=$(uci get network.wan_4g1.metric)
metric_4g2=$(uci get network.wan_4g2.metric)

[ "$metric_4g1" != "" ] || ( metric_4g1=40 )
[ "$metric_4g2" != "" ] || ( metric_4g2=41 )

#解决ppoe网卡不能切网问题,不能写死eth0.2,而是需要获取wan_wired的网卡的名字
wan_phy=`ifstatus wan_wired | grep l3_device | awk -F '\"' '{print $4}'`

#wan_pro默认wanfirst
wan_pro=$(uci get apnset.@apnset[0].wanprio)
if [ "$wan_pro" == "none" ]
then 
	logg no wan prio, exiting~~~~
	exit 0;
fi

#*********add SIM Work Mode Configuration************
Sim_Work_Mode=$(uci get apnset.@apnset[0].Work_Mode)
logg "*****Word Mode*******$Sim_Work_Mode*************"

if [ "$Sim_Work_Mode" == "LoadBalancing" ]
then 
	logg "****Word Mode***$Sim_Work_Mode***exit******"
	exit 0;
fi

#获取wan口网关地址,如果没有此网卡,值为空
wan1gw=`ifstatus wan_wired | grep nexthop | awk -F '\"' '{print $4}'| tail -n 1`
wan2gw_Sim1=`ifstatus wan_4g1 | grep nexthop | awk -F '\"' '{print $4}'| tail -n 1`
wan2gw_Sim2=`ifstatus wan_4g2 | grep nexthop | awk -F '\"' '{print $4}'| tail -n 1`
#4G网卡的名字
dev4g_Sim1=`uci get network.wan_4g1.ifname`
dev4g_Sim2=`uci get network.wan_4g2.ifname`
if [ "$dev4g_Sim1" == "ppp0" ];then
	dev4g_Sim1 = "3g-wan_4g1"
fi

if [ ! $wan2gw_Sim1 ]; then
	wan2gw_Sim1=`ifconfig ppp0 | grep P-t-P | awk -F : '{print $3}' | awk '{print $1}'`
	dev4g_Sim1 = "wan_4g1"
fi

if [ ! $wan2gw_Sim1 ]; then
	wan2gw_Sim1=`ifconfig ppp0 | grep P-t-P | awk -F : '{print $3}' | awk '{print $1}'`
	dev4g_Sim1 = "wan_4g1"
fi

if [ ! $wan2gw_Sim1 ]; then
	wan2gw_Sim1=`ifstatus wan_ct | grep nexthop | awk -F '\"' '{print $4}'`
	dev4g_Sim1 = "3g-wan_ct1"
fi

wan1gwtemp=$wan1gw
wan2gwtemp_Sim1=$wan2gw_Sim1
wan2gwtemp_Sim2=$wan2gw_Sim2
#获取默认路由下一跳地址
defaultroute=`route -n | grep 0.0.0.0.*0.0.0.0 |  awk '{print $2}' | sed -n '1p'`

#if default route is wan1_gw && wan1_gw is accessable

refermode=$(uci get apnset.@apnset[0].refermode)
if [ "$refermode" == "custom" ]
then
	referip=$(uci get apnset.@apnset[0].referip)
	if [ "$referip" != "" ];then
		#支持域名
		for ip in $(resolveip -t 5 "$referip"); do
			referip=$ip
			break;
		done
	fi
	
	CK_IPADDR=`_ckIPaddr $referip`
	if [[ $CK_IPADDR -eq 1 ]];then
		VER=`cat /etc/ver | grep EN`
		if [ "$VER" == "" ] ;then
			referip=114.114.114.114 
		else
			referip=8.8.8.8
		fi
	fi
	
	wan2gw_Sim1=$referip;
	wan1gw=$referip;
	referip_Sim2=$(uci get apnset.@apnset[0].referip_Sim2)
	if [ "$referip_Sim2" != "" ];then
		#支持域名
		for ip in $(resolveip -t 5 "$referip_Sim2"); do
			referip_Sim2=$ip
			break;
		done
	fi
	
	CK_IPADDR=`_ckIPaddr $referip_Sim2`
	if [[ $CK_IPADDR -eq 1 ]];then
		VER=`cat /etc/ver | grep EN`
		if [ "$VER" == "" ] ;then
			referip_Sim2=114.114.114.114 
		else
			referip_Sim2=8.8.8.8
		fi
	fi
	wan2gw_Sim2=$referip_Sim2;
fi

#打印ping参考地址,网关地址
logg wan1gw: $wan1gw 
logg wan2gw_Sim1: $wan2gw_Sim1
logg wan2gw_Sim2: $wan2gw_Sim2  
logg devwan: $wan_phy
logg dev4g_Sim1: $dev4g_Sim1
logg dev4g_Sim2: $dev4g_Sim2
logg wan1gwtemp: $wan1gwtemp 
logg wan2gwtemp_Sim1: $wan2gwtemp_Sim1
logg wan2gwtemp_Sim2: $wan2gwtemp_Sim2

Public_check_ip1=114.114.114.114
Public_check_ip2=119.29.29.29
Public_check_ip3=180.76.76.76
Public_check_ip4=8.8.8.8
Public_check_ip5=8.8.4.4

if [ "$wan_pro" == "wanfirst" ]
then 
	logg "==========wanfirst============="
	#参考地址存在,网关存在
	if [[ "$wan1gw" != "" -a "$wan1gwtemp" != "" ]]
	then 
		if [[ "$wan2gwtemp_Sim1" != "" -o "$wan2gwtemp_Sim2" != ""  ]]
		then
			#开始ping测试
			for ip in $wan1gw $Public_check_ip1 $Public_check_ip2 $Public_check_ip3 $Public_check_ip4 $Public_check_ip5
			do
				route add -host $ip gw $wan1gwtemp dev $wan_phy
				wan1gw_ok=`ping $ip -w 2 -I $wan_phy | grep "bytes from"`
				logg ping wan1: $wan1gw_ok
				if [ -z "$wan1gw_ok" ]
				then 
					wan1gw_ok=""
					route del -host $ip gw $wan1gwtemp dev $wan_phy
					logg_notice "==========wan1 ping $ip fail_============="
					if [ $ip == $Public_check_ip5 ];then
						#确认网络不通,切换到4G或其他网络
						logg "$wan_phy can not used , continue ...  "
					fi
				else
					logg "fixing route to wan1 ... " 
					defaultroute=`route -n | grep 0.0.0.0.*0.0.0.0 |  awk '{print $2}' | sed -n '1p'`
					defaultphy=`route -n | grep 0.0.0.0.*0.0.0.0 |  awk '{print $8}' | sed -n '1p'`
					[ "$defaultroute" == "$wan1gwtemp" -a "$defaultphy" == "$wan_phy" ] || ( route del default dev $wan_phy; route add default gw $wan1gwtemp metric 0 dev $wan_phy; logg_notice "wan1 tobe defroute" )
					route del -host $ip gw $wan1gwtemp dev $wan_phy
					logg "fixing ...  OK" 
					#杀掉usr_backuplte
					if [ "$Sim_Work_Mode" == "ColdMode" ]
					then
						logg "***********Cold Mode****close SIM2**************"
						#gpio s 25 1
						gpio s 71 0;gpio s 70 0
						gpio s 66 0;gpio s 67 0;gpio s 68 0;gpio s 69 0;
						env -i /sbin/ifdown wan_4g2 >/dev/null 2>/dev/null
						ps | grep usr_backuplte | grep -v grep | awk '{print $1}' | xargs kill -s 9
						ps | grep quectel-CM  | grep  sim2 | awk '{print $1}' | xargs kill -s 9
					fi
				
					exit 0;
				fi
			done
		else
			#无4G,还是用有线,退出
			logg "no 4G-1,4G-2 , change wired ... "
			defaultroute=`route -n | grep 0.0.0.0.*0.0.0.0 |  awk '{print $2}' | sed -n '1p'`
			logg "now defaultroute = $defaultroute ... "
			[ "$defaultroute" == "$wan1gwtemp" ] || ( route del default; route add default gw $wan1gwtemp; logg_notice "wan1 tobe defroute" )
			logg "fixing ...  OK" 
			exit 0;
		fi
	fi

	#无有线,或者有线不通
	if [[ "$wan2gw_Sim1" != "" -a "$wan2gwtemp_Sim1" != "" ]]
	then 
		#开始ping测试
		for ip in $wan2gw_Sim1 $Public_check_ip1 $Public_check_ip2 $Public_check_ip3 $Public_check_ip4 $Public_check_ip5
		do
			route add -host $ip gw $wan2gwtemp_Sim1 dev $dev4g_Sim1
			wan2gw_ok_Sim1=`ping $ip -w 2 -I $dev4g_Sim1 | grep "bytes from"`
			logg ping wan2_Sim1: $wan2gw_ok_Sim1
			if [[ "$wan2gw_ok_Sim1" == "" ]]
			then 
				#ping失败
				wan2gw_ok_Sim1=""
				route del -host $ip gw $wan2gwtemp_Sim1 dev $dev4g_Sim1
				logg_notice "==========4G-1 ping $ip fail_============="
				if [ $ip == $Public_check_ip5 ];then
					#确认网络不通,切换到4G或其他网络
					logg "$wan_phy and Sim1 can not used , continue ...  "
				fi
			else
			
				defaultroute=`route -n | grep 0.0.0.0.*0.0.0.0 |  awk '{print $2}' | sed -n '1p'`
				defaultphy=`route -n | grep 0.0.0.0.*0.0.0.0 |  awk '{print $8}' | sed -n '1p'`
				logg "fixing route to wan2_Sim1 ... " 
				[ "$defaultroute" == "$wan2gwtemp_Sim1" -a "$defaultphy" == "$dev4g_Sim1" ] || ( route del default dev $wan_phy; 
					defaultroute=`route -n | grep 0.0.0.0.*0.0.0.0 |  awk '{print $2}' | sed -n '1p'`
					defaultphy=`route -n | grep 0.0.0.0.*0.0.0.0 |  awk '{print $8}' | sed -n '1p'`
					[ "$defaultroute" == "$wan2gwtemp_Sim1" -a "$defaultphy" == "$dev4g_Sim1" ] || ( ip route add default via $wan2gwtemp_Sim1 dev $dev4g_Sim1 metric $metric_4g1 ; logg_notice "wan2_Sim1 tobe defroute" )
				)
				route del -host $ip gw $wan2gwtemp_Sim1 dev $dev4g_Sim1
				logg "fixing ...  OK" 
				
				if [ "$Sim_Work_Mode" == "ColdMode" ]
				then
					logg "***********Cold Mode****close SIM2**************"
					#gpio s 25 1
					gpio s 71 0;gpio s 70 0
					gpio s 66 0;gpio s 67 0;gpio s 68 0;gpio s 69 0;
					env -i /sbin/ifdown wan_4g2 >/dev/null 2>/dev/null
					ps | grep usr_backuplte | grep -v grep | awk '{print $1}' | xargs kill -s 9
					ps | grep quectel-CM  | grep  sim2 | awk '{print $1}' | xargs kill -s 9
				fi
				
				exit 0;
			fi
		done
	fi

	#无有线或者有线不通,并且SIM1也不通	
	#不管现在是热模式还是冷模式,先判断sim2网卡是否可用,如果不可用且在冷模式下,启动usr_backuplte
	if [[ "$wan2gw_Sim2" != "" -a "$wan2gwtemp_Sim2" != "" ]]
	then 
		#开始ping测试
		for ip in $wan2gw_Sim2 $Public_check_ip1 $Public_check_ip2 $Public_check_ip3 $Public_check_ip4 $Public_check_ip5
		do
			route add -host $ip gw $wan2gwtemp_Sim2 dev $dev4g_Sim2
			wan2gw_ok_Sim2=`ping $ip -w 2 -I $dev4g_Sim2 | grep "bytes from"`
			logg ping wan2_Sim2: $wan2gw_ok_Sim2
			if [[ "$wan2gw_ok_Sim2" == "" ]]
			then 
				#ping失败
				wan2gw_ok_Sim2=""
				route del -host $ip gw $wan2gwtemp_Sim2 dev $dev4g_Sim2
				logg_notice "==========4G-2 ping $ip fail_============="
				if [ $ip == $Public_check_ip5 ];then
					#确认网络不通
					#本次切网不做任何改动
					logg "NOT changes"
				fi
			else
				defaultroute=`route -n | grep 0.0.0.0.*0.0.0.0 |  awk '{print $2}' | sed -n '1p'`
				defaultphy=`route -n | grep 0.0.0.0.*0.0.0.0 |  awk '{print $8}' | sed -n '1p'`
				logg "fixing route to wan2_Sim2 ... " 
				[ "$defaultroute" == "$wan2gwtemp_Sim2" -a "$defaultphy" == "$dev4g_Sim2" ] || ( route del default dev $wan_phy; route del default dev $dev4g_Sim1;
					defaultroute=`route -n | grep 0.0.0.0.*0.0.0.0 |  awk '{print $2}' | sed -n '1p'`
					defaultphy=`route -n | grep 0.0.0.0.*0.0.0.0 |  awk '{print $8}' | sed -n '1p'`
					[ "$defaultroute" == "$wan2gwtemp_Sim2" -a "$defaultphy" == "$dev4g_Sim2" ] || ( ip route add default via $wan2gwtemp_Sim2 dev $dev4g_Sim2 metric $metric_4g2 ; logg_notice "wan2_Sim2 tobe defroute" )
				)
				route del -host $ip gw $wan2gwtemp_Sim2 dev $dev4g_Sim2
				logg "fixing ...  OK" 
				exit 0;
			fi
		done
	else
		if [ "$Sim_Work_Mode" == "ColdMode" ]
		then
			#由于ltedial执行时间较短,usr_backuplte不可能很快能拨号成功
			eixt=`ps | grep usr_backuplte | grep -v grep` 
			if [ "$eixt" == "" ];then
				logg "$wan_phy and Sim1 can not used , sim2 not start, usr_lte_backup**start!!!!"
				/bin/usr_backuplte &
			fi
		fi
	fi

fi


if [ "$wan_pro" == "4gfirst"  ]
then 
	logg "==========4gfirst============="
	if [[ "$wan2gw_Sim1" != "" -a "$wan2gwtemp_Sim1" != "" ]]
	then 
		#开始ping测试
		for ip in $wan2gw_Sim1 $Public_check_ip1 $Public_check_ip2 $Public_check_ip3 $Public_check_ip4 $Public_check_ip5
		do
			route add -host $ip gw $wan2gwtemp_Sim1 dev $dev4g_Sim1
			wan2gw_ok_Sim1=`ping $ip -w 2 -I $dev4g_Sim1 | grep "bytes from"`
			logg ping wan2_Sim1: $wan2gw_ok_Sim1
			if [[ "$wan2gw_ok_Sim1" == "" ]]
			then 
				#ping失败
				wan2gw_ok_Sim1=""
				route del -host $ip gw $wan2gwtemp_Sim1 dev $dev4g_Sim1
				logg_notice "==========4G-1 ping $ip fail_============="
				if [ $ip == $Public_check_ip5 ];then
					#确认4g1网络不通,切换到4G2或其他网络
					logg "Sim1 can not used , continue ...  "
				fi
			else
				if [ "$Sim_Work_Mode" == "ColdMode" ]
				then
					logg "***********Cold Mode****close SIM2**************"
					#gpio s 25 1
					gpio s 71 0;gpio s 70 0
					gpio s 66 0;gpio s 67 0;gpio s 68 0;gpio s 69 0;
					env -i /sbin/ifdown wan_4g2 >/dev/null 2>/dev/null
					ps | grep /bin/usr_backuplte | grep -v grep | awk '{print $1}' | xargs kill -s 9
					ps | grep quectel-CM  | grep  sim2 | awk '{print $1}' | xargs kill -s 9
				fi
				
				defaultroute=`route -n | grep 0.0.0.0.*0.0.0.0 |  awk '{print $2}' | sed -n '1p'`
				defaultphy=`route -n | grep 0.0.0.0.*0.0.0.0 |  awk '{print $8}' | sed -n '1p'`
				logg "fixing route to wan2_Sim1 ... " 
				[ "$defaultroute" == "$wan2gwtemp_Sim1" -a "$defaultphy" == "$dev4g_Sim1" ] || ( ip route add default via $wan2gwtemp_Sim1 dev $dev4g_Sim1 metric $metric_4g1 ; logg_notice "wan2_Sim1 tobe defroute" )
				route del -host $ip gw $wan2gwtemp_Sim1 dev $dev4g_Sim1
				logg "fixing ...  OK" 
				exit 0;
			fi
		done
	fi

	#无SIM1,或者SIM1不通,
	#不管现在是热模式还是冷模式,先判断sim2网卡是否可用,如果不可用且在冷模式下,启动usr_backuplte
	if [[ "$wan2gw_Sim2" != "" -a "$wan2gwtemp_Sim2" != "" ]]
	then 
		#开始ping测试
		for ip in $wan2gw_Sim2 $Public_check_ip1 $Public_check_ip2 $Public_check_ip3 $Public_check_ip4 $Public_check_ip5
		do
			route add -host $ip gw $wan2gwtemp_Sim2 dev $dev4g_Sim2
			wan2gw_ok_Sim2=`ping $ip -w 2 -I $dev4g_Sim2 | grep "bytes from"`
			logg ping wan2_Sim2: $wan2gw_ok_Sim2
			if [[ "$wan2gw_ok_Sim2" == "" ]]
			then 
				#ping失败
				wan2gw_ok_Sim2=""
				route del -host $ip gw $wan2gwtemp_Sim2 dev $dev4g_Sim2
				logg_notice "==========4G-2 ping $ip fail_============="
				if [ $ip == $Public_check_ip5 ];then
					#确认网络不通
					logg "Sim1 and Sim1 can not used , continue ...  "
				fi
			else
				defaultroute=`route -n | grep 0.0.0.0.*0.0.0.0 |  awk '{print $2}' | sed -n '1p'`
				defaultphy=`route -n | grep 0.0.0.0.*0.0.0.0 |  awk '{print $8}' | sed -n '1p'`
				logg "fixing route to wan2_Sim2 ... " 
				[ "$defaultroute" == "$wan2gwtemp_Sim2" -a "$defaultphy" == "$dev4g_Sim2" ] || (  route del default dev $dev4g_Sim1;
					defaultroute=`route -n | grep 0.0.0.0.*0.0.0.0 |  awk '{print $2}' | sed -n '1p'`
					defaultphy=`route -n | grep 0.0.0.0.*0.0.0.0 |  awk '{print $8}' | sed -n '1p'`
					[ "$defaultroute" == "$wan2gwtemp_Sim2" -a "$defaultphy" == "$dev4g_Sim2" ] || ( ip route add default via $wan2gwtemp_Sim2 dev $dev4g_Sim2 metric $metric_4g2; logg_notice "wan2_Sim2 tobe defroute" )
				)
				route del -host $ip gw $wan2gwtemp_Sim2 dev $dev4g_Sim2
				logg "fixing ...  OK" 
				exit 0;
			fi
		done
	else
		if [ "$Sim_Work_Mode" == "ColdMode" ]
		then
			#由于ltedial执行时间较短,usr_backuplte不可能很快能拨号成功
			eixt=`ps | grep usr_backuplte | grep -v grep` 
			if [ "$eixt" == "" ];then
				logg "$wan_phy and Sim1 can not used , sim2 not start, usr_lte_backup**start!!!!"
				/bin/usr_backuplte &
			fi
		fi
	fi
	
	#无4G1,4g2 或者不通
	if [[ "$wan1gw" != "" -a "$wan1gwtemp" != "" ]]
	then 
		#开始ping测试
		for ip in $wan1gw $Public_check_ip1 $Public_check_ip2 $Public_check_ip3 $Public_check_ip4 $Public_check_ip5
		do
			route add -host $ip gw $wan1gwtemp dev $wan_phy
			wan1gw_ok=`ping $ip -w 2 -I $wan_phy | grep "bytes from"`
			logg ping wan1: $wan1gw_ok
			if [ -z "$wan1gw_ok" ]
			then 
				wan1gw_ok=""
				route del -host $ip gw $wan1gwtemp dev $wan_phy
				logg_notice "==========wan1 ping $ip fail_============="
				if [ $ip == $Public_check_ip5 ];then
					#确认网络不通
					logg "NOT changes"
				fi
			else					
				logg "fixing route to wan1 ... " 
				defaultroute=`route -n | grep 0.0.0.0.*0.0.0.0 |  awk '{print $2}' | sed -n '1p'`
				defaultphy=`route -n | grep 0.0.0.0.*0.0.0.0 |  awk '{print $8}' | sed -n '1p'`
				[ "$defaultroute" == "$wan1gwtemp" -a "$defaultphy" == "$wan_phy"  ] || ( route del default dev $dev4g_Sim1;route del default dev $dev4g_Sim2;
					defaultroute=`route -n | grep 0.0.0.0.*0.0.0.0 |  awk '{print $2}' | sed -n '1p'`
					defaultphy=`route -n | grep 0.0.0.0.*0.0.0.0 |  awk '{print $8}' | sed -n '1p'`
					[ "$defaultroute" == "$wan1gwtemp" -a "$defaultphy" == "$wan_phy"  ] || ( ip route add default via $wan1gwtemp dev $wan_phy metric 100; logg_notice "wan1 tobe defroute" )
				)
				route del -host $ip gw $wan1gwtemp dev $wan_phy
				logg "fixing ...  OK" 
			

				exit 0;
			fi
		done

	fi

fi


exit 0
$ 
$ cat etc/init.d/Net_4G_Check.sh 
#!/bin/sh

#change by mxw
#check ip creg NetMode_Status 
#
#
#

#LOGG_STYLE="tty"
#LOGG_STYLE="file"
LOGG_STYLE="logger"
#LOGG_STYLE="tty+logger"
# RemoteLog=`uci get system.@system[0].remote_log_ip`
# if [ "$RemoteLog" != "0.0.0.0" ];then
	# LOGG_STYLE="file+logger"
# fi


logg()
{
	if [ $LOGG_STYLE == "file" ];then
		echo "$*" >> /tmp/ltedial_log
	elif [ $LOGG_STYLE == "logger" ];then
		echo "$*" | logger -s -p user.notice
	elif [ $LOGG_STYLE == "tty+logger" ];then
		echo "$*" > /dev/ttyS1
		echo "$*" | logger -s -p user.notice
	elif [ $LOGG_STYLE == "file+logger" ];then
		echo "$*" >> /tmp/ltedial_log
		echo "$*" | logger -s -p user.notice
	else
		echo "$*" > /dev/ttyS1
	fi
}
fc_soft_ver="19006.1000.00"
SIM1_Fail_4G_Num=0
SIM2_Fail_4G_Num=0
Sim_Work_Mode=$(uci get apnset.@apnset[0].Work_Mode)

for x in one two
do
	#4G1
	Creg_Status_4G1=`cat /tmp/usrlte_info_Check | grep "unregistered"`
	NetMode_Status_4G1=`cat /tmp/usrlte_info_Check | grep "NoService"` 
	lte_soft_version_4G1=`cat /tmp/usrlte_info_Check | grep "Software version number" | cut -d \" -f2 | cut -d . -f 1-3`
	#4G2
	Creg_Status_4G2=`cat /tmp/usrlte_info_Check_Sim2 | grep "unregistered"`
	NetMode_Status_4G2=`cat /tmp/usrlte_info_Check_Sim2 | grep "NoService" `
	lte_soft_version_4G2=`cat /tmp/usrlte_info_Check_Sim2 | grep "Software version number" | cut -d \" -f2 | cut -d . -f 1-3`

	#如果文件存在,说明拨号ok,才去检查
	#if [[ -f "/tmp/usrlte_info_Check" ]];then
	if [[ $x ]];then

		DEVICE_4G1=`ifstatus wan_4g1 | grep device -w | awk -F '\"' '{print $4}'`
		Ip_4G1=`ifconfig $DEVICE_4G1 | grep "inet addr"`
			
		logg "4G1 $DEVICE_4G1 = $Ip_4G1" 
		logg "Creg_Status_4G1 = $Creg_Status_4G1" 
		logg "NetMode_Status_4G1 = $NetMode_Status_4G1" 
		
		#如果ip为空或者creg未注册 && NetMode无服务
		if [[ "$Ip_4G1" == "" -o "$Creg_Status_4G1" != "" -a "$NetMode_Status_4G1" != "" \
				-o "$NetMode_Status_4G1" != "" -a "$lte_soft_version_4G1" == "$fc_soft_ver" ]]; then
			
			let SIM1_Fail_4G_Num+=1
					
			if [[ $SIM1_Fail_4G_Num -ge 2 ]];then
				logg "*******restart usr_lte*****"  
				ps | grep usr_lte | grep -v grep | awk '{print $1}' | xargs kill -s 9
				gpio s 24 1; sleep 5; gpio s 24 0;
				/bin/usr_lte &
				rm -rf /tmp/usrlte_info_Check
			fi
		else
			#IP有且creg注册且有网络服务,才会执行到此
			SIM1_Fail_4G_Num=0
		fi
		
	fi
	
	sleep 5
	#如果文件存在,说明拨号ok,才去检查
	#if [[ -f "/tmp/usrlte_info_Check_Sim2" ]];then
	if [[ $x ]];then

		DEVICE_4G2=`ifstatus wan_4g2 | grep device -w | awk -F '\"' '{print $4}'`
		Ip_4G2=`ifconfig $DEVICE_4G2 | grep "inet addr"`
			
		logg "4G2 $DEVICE_4G2 = $Ip_4G2" 
		logg "Creg_Status = $Creg_Status_4G2" 
		logg "NetMode_Status = $NetMode_Status_4G2" 
		
		#如果ip为空或者creg未注册或者NetMode无服务
		if [[ "$Ip_4G2" == "" -o "$Creg_Status_4G2" != "" -a "$NetMode_Status_4G2" != "" \
				-o "$NetMode_Status_4G2" != "" -a "$lte_soft_version_4G2" == "$fc_soft_ver" ]]; then
			
			let SIM2_Fail_4G_Num+=1
					
			if [[ $SIM2_Fail_4G_Num -ge 2 ]];then
				#热模式 开启
				#热模式 未开启
				#冷模式 开启
				#冷模式 未开启 -->不检测
				eixt=`ps | grep usr_backuplte | grep -v grep`
				if [[ "$Sim_Work_Mode" == "ColdMode" -a "$eixt" == ""  ]];then
					rm -rf /tmp/usrlte_info_Check_Sim2
					logg "*******ColdMode and no start usr_backuplte, not check *****"  
				else
					logg "*******restart usr_backuplte*****"  
					ps | grep usr_backuplte | grep -v grep | awk '{print $1}' | xargs kill -s 9
					gpio s 25 1; sleep 5; gpio s 25 0;
					/bin/usr_backuplte &
					rm -rf /tmp/usrlte_info_Check_Sim2
				fi
			fi
		else
			#IP有且creg注册且有网络服务,才会执行到此
			SIM2_Fail_4G_Num=0
		fi
		
	fi
	
	logg "Net_4G_Check.sh $x" 

	sleep 50
done

$ 
$ cat etc/init.d/limit_ip_rate 
#!/bin/sh /etc/rc.common

#  定义进出设备(IDEV 内网接口
IDEV="br-lan"
ODEV=`route -n |sed -n 3p|awk -F ' ' '{print $8}'`
 j=256;
 
init_limit()
{
# 清除 网卡所有队列规则
tc qdisc del dev $IDEV root
tc qdisc del dev $ODEV root
tc qdisc del dev $IDEV root 2>/dev/null
tc qdisc del dev $ODEV root 2>/dev/null

iptables -t mangle -F POSTROUTING 
iptables -t mangle -F PREROUTING 

# 定义最顶层(根)队列规则,并指定 default 类别编号
tc qdisc add dev $IDEV root handle 10: htb default 2254
tc qdisc add dev $ODEV root handle 20: htb default 2254

# 定义第一层的 10:1 类别 (总频宽)
tc class add dev $IDEV parent 10:  classid 10:1 htb rate 102400kbps ceil 102400kbps
tc class add dev $ODEV parent 20:  classid 20:1 htb rate 102400kbps ceil 102400kbps


#定义default 类别编的上行 (上面没定义带宽的IP上行速度)
 tc class add dev $ODEV parent 20:1 classid 20:2254 htb rate 10kbps ceil 102400kbps prio 1
 tc qdisc add dev $ODEV parent 20:2254 handle 100254: pfifo
 tc filter add dev $ODEV parent 20: protocol ip prio 100 handle 2254 fw classid 20:2254
 #定义default 类别编的下行 (上面没定义带宽的IP下行速度)
 tc class add dev $IDEV parent 10:1 classid 10:2254 htb rate 10kbps ceil 102400kbps prio 1
 tc qdisc add dev $IDEV parent 10:2254 handle 100254: pfifo
 tc filter add dev $IDEV parent 10: protocol ip prio 100 handle 2254 fw classid 10:2254
}


ip_rate_limit()
{

	local  rate_ip
	local  downstream
	local  upstrean
	local  startip 
	local  endip

	config_get downstream $1 downstream
	config_get upstream $1 upstream
	config_get startip $1 startip
	
	config_get endip $1 endip

	#取startip的前十位
	INET=${startip:0:10}
	# 受限IP范围,IPS 起始IP,IPE 结束IP。
	#IPS="100"
	#IPE="145"
	#取startip的前10-13位
	IPS=${startip:10:13}
	IPE=${endip:10:13}
	Download=$downstream
	Upload=$upstream
    echo "rate:"$Download
	echo "rate:"$Upload
	echo $INET
	echo $IPS
	echo $IPE
    echo $IDEV
	# 限速循环
	i=$IPS;
	touch /root/$IPS;
	while [ $i -le $IPE ]
	do
	# 定义第二层叶类别
	# rate 保证频宽,ceil 最大频宽,prio 优先权
	tc class add dev $IDEV parent 10:1 classid 10:${i} htb rate 10kbps ceil ${Download}kbps prio 1
	tc class add dev $ODEV parent 20:1 classid 20:2${i} htb rate 10kbps ceil ${Upload}kbps prio 1

	# 定义各叶类别的队列规则
	# parent 类别编号,handle 叶类别队列规则编号
	tc qdisc add dev $IDEV parent 10:${i} handle ${i}: pfifo
	tc qdisc add dev $ODEV parent 20:2${i} handle 2${i}: pfifo

	# 设定过滤器
	tc filter add dev $IDEV parent 10: protocol ip prio 100 handle ${i} fw  classid 10:${i}
	tc filter add dev $ODEV parent 20: protocol ip prio 100 handle 2${i} fw  classid 20:2${i}

	iptables -t mangle -A POSTROUTING -d ${INET}${i} -j MARK --set-mark ${i}
	iptables -t mangle -A PREROUTING -s ${INET}${i} -j MARK --set-mark 2${i}
	#iptables -t mangle -A POSTROUTING -s ${INET}${i} -j MARK --set-mark ${i}
	
	
	 i=`expr ${i} + 1`
	done
	
}

mac_rate_limit()
{
   
	local  mac
	local  downstream_mac
	local  upstream_mac

	config_get mac $1 mac
	config_get downstream_mac $1 downstream_mac
	config_get upstream_mac $1 upstream_mac
	 ip=`arp -n|grep -i $mac |cut -d '(' -f2|cut -d ')' -f1`
	# 定义第二层叶类别
	# rate 保证频宽,ceil 最大频宽,prio 优先权
	
	tc class add dev $IDEV parent 10:1 classid 10:${j} htb rate 10kbps ceil ${downstream_mac}kbps prio 1
	tc class add dev $ODEV parent 20:1 classid 20:2${j} htb rate 10kbps ceil ${upstream_mac}kbps prio 1

	# 定义各叶类别的队列规则
	# parent 类别编号,handle 叶类别队列规则编号

	tc qdisc add dev $IDEV parent 10:${j} handle ${j}: pfifo
	tc qdisc add dev $ODEV parent 20:2${j} handle 2${j}: pfifo

	# 设定过滤器
		
	tc filter add dev $IDEV parent 10: protocol ip prio 100 handle ${j} fw  classid 10:${j}
	tc filter add dev $ODEV parent 20: protocol ip prio 100 handle 2${j} fw  classid 20:2${j}

	iptables -t mangle -A POSTROUTING -d $ip -j MARK --set-mark ${j}
	iptables -t mangle -A PREROUTING -s $ip -j MARK --set-mark 2${j}
	
	echo ${j}
	
	
	 j=`expr ${j} + 1`
		
}

start()
{  	
    #touch /root/aaa.sh
   	# /etc/init.d/firewall restart
	config_load ratelimit
	init_limit
	config_foreach ip_rate_limit domain
	config_foreach mac_rate_limit domain_mac
	#default_limit
	
}

$ 

 

============ End

 

posted @ 2022-04-26 12:50  lsgxeva  阅读(2945)  评论(0编辑  收藏  举报