前段时间做完一个是视频数据传输终端,使用4G模块拨号,接上摄像头,当一个路由器来传输视频信号;以及本身会带一些远程管理功能;当然这不是本文的重点;在此仅重点介绍4G拨号相关的内容,因为从开发到上线到量产过程中,拨号稳定性一直是一个考验;

设备使用的是openwrt系统,Ulong9300 LTE模块,MiniPcie接口,其实就是usb;

首先介绍几个相关的工具:

comgt:主要是发送AT指令以及读取结果,非常轻量级,一个.c文件,支持多种语法,可以自行编写配置脚本

pppd:3g ppp 协议拨号 工具,使用配置文件配置拨号参数:如APN,用户名,断线检测周期等等

usbserial: usb转tty驱动

option: usb转tty驱动

Ndis: LTE拨号专有驱动,与usbserial虚拟成串口不同,ndis虚拟成网口,可以获得更高的速率

下面根据使用流程一个一个做相关详细介绍:

驱动:如果使用usbserial驱动,Linux Kernel自带,无需配置,直接install即可;Option驱动同样;

使用ndis驱动,需要LTE模块厂家提供相关的驱动包,以及应用层拨号程序

pppd参数:主要是APN和Dialnumber,用户名和密码一般不需要;APN及Dialnumber 可以咨询运营商,每个运营商固定的,不过地区不同也可能存在差别,尤其是现在IOT的M2M卡,专用卡等等。

可以通过SIM卡ICCID来判断运营商类别,然后设定相关的APN和Dialnumber。参考comgt脚本如下:

:cimiwaitquiet 1 0.2send "AT+CIMI^m"waitfor 3 "46000" "46002" "46007" "46001" "46006" "46003" "46005" "46011"if % = -1 goto errif % = 0 goto cmnetif % = 1 goto cmnetif % = 2 goto cmnetif % = 3 goto net3gif % = 4 goto net3gif % = 5 goto ctlteif % = 6 goto ctlteif % = 7 goto ctlte# defaultgoto webset
:errexit 1
:cmnetsend "AT+CGDCONT=1,\"IP\",\"CMNET\"^m"print "CMNET\n"goto waitret
:net3gsend "AT+CGDCONT=1,\"IP\",\"3GNET\"^m"print "3GNET\n"goto waitret
:ctltesend "AT+CGDCONT=1,\"IP\",\"CTLTE\"^m"print "CTLTE\n"
:waitret

openwrt拨号机制:

  1. hotplug,探测到lte usb拔插,系统通过hotplug自动调用pppd
  2. pppd设定配置,由procd进程来管理,自动启动
  3. pppd主要拨号脚本为3g.sh,参考内容为:
    #!/bin/sh[ -n "$INCLUDE_ONLY" ] || {NOT_INCLUDED=1INCLUDE_ONLY=1. ../netifd-proto.sh. ./ppp.shinit_proto "$@"
    }proto_3g_init_config() {no_device=1available=1ppp_generic_init_configproto_config_add_string "device:device"proto_config_add_string "apn"proto_config_add_string "service"proto_config_add_string "pincode"proto_config_add_string "dialnumber"proto_config_add_string "username"proto_config_add_string "password"proto_config_add_string "at_port"proto_config_add_string "private_dial"
    }proto_3g_setup() {local interface="$1"local chatcfg
    。。。发送一些AT指令,如查询SIM卡,信号质量,注册的网络等等,反正目的是为了查询保证拨号的条件 。。。
    ppp_generic_setup "$interface" \noaccomp \${username:+user "$username" password "$password"} \nopcomp \novj \nobsdcomp \noauth \lock \modem \crtscts \115200 "$device"return 0
    }proto_3g_teardown() {proto_kill_command "$interface"
    }[ -z "NOT_INCLUDED" ] || add_protocol 3g
    
  4. 拨号成功后调用脚本ppp-up
    #!/bin/sh
    PPP_IPPARAM="$6". /lib/netifd/netifd-proto.shecho -n > /tmp/dialcount
    touch /tmp/dialokproto_init_update "$IFNAME" 1 1
    proto_set_keep 1
    [ -n "$PPP_IPPARAM" ] && {[ -n "$IPLOCAL" ] && proto_add_ipv4_address "$IPLOCAL" 32 "" "${IPREMOTE:-2.2.2.2}"[ -n "$IPREMOTE" ] && proto_add_ipv4_route 0.0.0.0 0 "$IPREMOTE"[ -n "$LLLOCAL" ] && proto_add_ipv6_address "$LLLOCAL" 128[ -n "$DNS1" ] && proto_add_dns_server "$DNS1"[ -n "$DNS2" -a "$DNS1" != "$DNS2" ] && proto_add_dns_server "$DNS2"
    }
    proto_send_update "$PPP_IPPARAM"[ -d /etc/ppp/ip-up.d ] && {for SCRIPT in /etc/ppp/ip-up.d/*do[ -x "$SCRIPT" ] && "$SCRIPT" "$@"done
    }if [ -n "$AUTOIPV6" ]; thenjson_initjson_add_string name "${PPP_IPPARAM}_6"json_add_string ifname "@$PPP_IPPARAM"json_add_string proto "dhcpv6"json_close_objectubus call network add_dynamic "$(json_dump)"
    fi
    

    主要是设定主路由表并通知相关模块;可以自行创建dialok等文件表示拨号成功,不需要再特别去查询;这样简单方便;当然失败时需要自行删除文件。

  5. 拨号由成功到失败时运行脚本ppp-down
    #!/bin/sh
    PPP_IPPARAM="$6". /lib/netifd/netifd-proto.shrm -f /tmp/dialok
    echo "$(date)- ppp down ###" >> /tmp/at_failed_retproto_init_update "$IFNAME" 0
    proto_send_update "$PPP_IPPARAM"[ -d /etc/ppp/ip-down.d ] && {for SCRIPT in /etc/ppp/ip-down.d/*do[ -x "$SCRIPT" ] && "$SCRIPT" "$@"done
    }
    

以上为一次拨号流程;那么如何保证24小时在线?就需要另外一套机制来保证;最简单的就是轮询了

openwrt 自带crond,PC上使用广泛的任务轮询调度模块,可以配置在几点几分周几,间隔多久运行什么程序,非常灵活;

本文设定每5分钟检测一次;检测脚本如下:

#!/bin/shresetmodule()
{echo Init > /tmp/sim-infoecho 0 > /tmp/sigecho 1 > /sys/class/leds/modrst/brightnessecho "$(date)-repower-4g-module" >> /tmp/repower-4g-moduleecho "$(date)-repower-4g-module" >> /tmp/at_failed_retsleep 5echo 0 > /sys/class/leds/modrst/brightness
}checkat()
{# other process has do at-cmdlocal num="$(ps |grep /etc/gcom |wc -l)"[ $num -gt 1 ] && return 1gcom -d "$1" -s /etc/gcom/checkpin.gcom > /tmp/sim-infonum="$(ps |grep /etc/gcom |wc -l)"[ $num -gt 1 ] && return 1gcom -d "$1" -s /etc/gcom/getstrength.gcom > /tmp/signum="$(ps |grep /etc/gcom |wc -l)"[ $num -gt 1 ] && return 1gcom -d "$1" -s /etc/gcom/check_status.gcom > /tmp/module_status_fileif cat /tmp/sim-info | grep -qi 'Ready'; then[ ! -e "/tmp/sim_ready" ] && touch /tmp/sim_ready# no dialing ; no 3g-ppp; sim-card okifconfig 3g-ppp | grep -qi 'inet addr:' || /sbin/ifup pppelif ifconfig 3g-ppp | grep -qi 'inet addr:'; then# no dialing; 3g-ppp ok' ; sim-card error;  detecting errorecho Ready > /tmp/sim-info[ ! -e "/tmp/sim_ready" ] && touch /tmp/sim_readyelselogger -t ltecheck "Check:SIM-error and ppp failed"echo "$(date)-SIM-error and ppp dial failed" >> /tmp/at_failed_retcat /tmp/module_status_file >> /tmp/at_failed_retrm -f /tmp/dialokfi
}rm -rf /tmp/gcom*
# ttyUSBx is not exist
[ ! -e "$1" ] && return 1
[ ! -e "/tmp/cfuncount" ] && echo -n > /tmp/cfuncount
[ ! -e "/tmp/dialcount" ] && echo -n > /tmp/dialcount
[ ! -e "/tmp/at_failed_ret" ] && echo -n > /tmp/at_failed_retnum="$(cat /tmp/at_failed_ret | wc -l)"
if [ $num -ge 800 ]; thenecho -n > /tmp/at_failed_ret
fiif [ -e "/tmp/dialok" ]; thencheckat "$1"echo -n > /tmp/dialcountecho -n > /tmp/cfuncount
elseifdown pppsleep 5num="$(cat /tmp/cfuncount | wc -l)"if [ $num -ge 3 ]; thenlogger -t ltecheck "cfuncount>3,to reset module"#cfun=0gcom -d "$1" -s /etc/gcom/clearcfun.gcomecho -n > /tmp/dialcountecho -n > /tmp/cfuncountresetmodulesleep 20ifup pppelsenum="$(cat /tmp/dialcount | wc -l)"if [ $num -ge 5 ]; thenlogger -t ltecheck "dialcount>5,to reset cfun"gcom -d "$1" -s /etc/gcom/clearcfun.gcomgcom -d "$1" -s /etc/gcom/setcfun.gcomecho "$(date)-cfun-reset" >> /tmp/cfuncountecho "$(date)-cfun-reset" >> /tmp/at_failed_retecho -n > /tmp/dialcountifup pppelselogger -t ltecheck "$(date) ppp redial"echo "$(date) ppp redial" >> /tmp/at_failed_retcat /tmp/module_status_file >> /tmp/at_failed_retifup pppfifi
fi

主要流程为:

首先检测dialok文件(由ppp-up创建)在不在,再继续查询AT,当然AT有可能查询失败,AT结果写入tmp文件

然后判断文件或文件内容,此处文件不一定可靠,因为是人为创建的,如果考虑的不全,文件该清除的时候没清楚,该创建的时候没创建的情况也是有的;因此文件不对时,再查询一次系统实际情况,如ifconfig等,然后比较,即可判断出实际情况;

关于resetmodule,为什么要reset模块,因此模块里面也是系统也有程序,也是人写的;而且网络环境非常复杂,尤其在中国,因此模块也有一定几率出错,表现情况就是:AT一直失败,拨号一直不成功等;此时,就需要reset模块;一般来说有两种方法,软复位:设置CFUN,所有模块通用;硬复位:通过控制模块复位脚,需要硬件预先设计;

复位之后,模块重启,openwrt会自动检测到模块接入,然后执行拨号流程,如果没有,那么crond轮询程序在超时后也会主动检测一次;

理论上,crond可以保证永远拨号;crond自身做的工作很少,其稳定性可以保证;

到此,基本介绍完毕;

后续可能的优化:不使用hotplug机制,不使用procd自动调用机制,纯粹依靠crond来轮询执行;虽然拨号过程慢一些,但稳定性更加的得到提升;

Openwrt中ppp拨号总结相关推荐

  1. 4G转wifi方案研究:openwrt与ppp拨号与rt3070(三)自动重新拨号脚本

    前言 一段时间没有写了,忙其他的任务去了.关于ppp拨号在我测试过程中发现有时候网络会断开,而且openwrt出现断线的几率比Ubuntu高了很多,因此我优先研究如何进行重播 脚本编写 参考了一篇其他 ...

  2. 完整适配LUCI界面的Openwrt中EC20的QMI拨号

    目前4G模块应用已经非常普及,跟之前的3G不同,3G基本使用ppp拨号,usbserial驱动,Linux内核自带支持,此应用非常简单. 4G模块由于速率较高,usbserial驱动性能满足不了,因此 ...

  3. linux ppp拨号 USB,Linux中实现ppp拨号连接

    以SIM7600 3G/4G模块.联通sim卡为例实现ppp拨号连接,具体过程如下: 1)安装pppd拨号软件,下载源码ppp-2.4.5.tar.gz,编译并安装(如是嵌入式环境,需交叉编译),编译 ...

  4. 树莓派中SIM7600G-H 4G DONGLE模块使用记录(一)PPP拨号上网/4G上网

    项目场景: 如何使用SIM7600系列的4G通信模块进行PPP网上拨号以实现4G通信,在讲解前,未搭建好树莓派远程连接桌面的读者可以先转向树莓派4B环境搭建+电脑远程连接+打开文件管理闪退(上). 模 ...

  5. MT7628 OpenWRT21 SIM8202驱动ppp拨号rndis拨号

    1.模块USB设备概述 使用MT7628通过USB连接SIM8202.SIM8202的VID是0x1e0e,PID9011.添加驱动后USB描述如下: 2.驱动调试使用场景 1.PPP拨号:只需要配置 ...

  6. Openwrt pppoe demand拨号问题

    最近在使用openwrt开发,使用自带的pppoe功能 拨号配置很简单,只要修改/etc/config/network文件的配置如下即可 /etc/config/network config inte ...

  7. OpenWrt 4G网卡拨号配置

    基础知识 MiniPCI-e, 接口其实就是USB接口, 采用的USB协议. USB协议中有product id, vendor id. 4G网卡的拨号方式有三种: PPP (PPP over EV- ...

  8. 0710 mux协议的作用(ppp拨号时如何和gprs进行at指令交互)

    ppp拨号使gprs上网的同时如何和gprs模块进行at指令的交互,这是一个问题. 在linux中,ppp拨号上网是内核中支持的,只需要在内核配置中选上. ppp拨号的方式使gprs进行上网与at指令 ...

  9. linux ppp漏洞,Linux下ppp拨号的实现(Arm)

    Linux发行版自带PPP拨号需要的pppd和chat命令,以2.6.18内核的Linux虚拟机为例,在/usr/sbin目录下,/etc/ppp目录也已自动创建.参考模权创建拨号脚本ppp-on,p ...

最新文章

  1. html5标记汇总,HTML标记汇总(1)_HTML教程
  2. js中为什么你不敢用 “==”
  3. 思科模拟器。计算机网络实验之四:RIPv2配置
  4. ASP.NET Core 基于JWT的认证(二)
  5. iOS Application Security
  6. VC6 + OpenCV1.0实现图片缩放显示
  7. tohexstring方法_Java Long类toHexString()方法的示例
  8. 外贸建站前必做的SEO优化?
  9. linux统计多个文件大小总和
  10. 优化器——梯度下降优化算法综述
  11. ad中pcb双面板怎么设置_html中表格tr的td单元格怎么设置宽度属性
  12. 语言输出奇树有多少总方法_新手如何快速学习一门编程语言?了解 TA,三周学好C语言...
  13. Oracle redo解析之-1、oracle redo log结构计算
  14. 博途v14电脑要求_Win10运行不了博途V14怎么办?
  15. 关于准系统,镭波,地球人等等其他牌子的机器介绍和外星人的比较
  16. echarts柱状图参数详解
  17. xvid编码器的弹出窗口解决方法
  18. Oracle开发专题之:OLAP 函数 (rows 2 preceding / unbounded preceding)
  19. 13-zinx-Golang-MMO游戏Proto3协议
  20. 《偏生要鲜花着景,应这急景流年》

热门文章

  1. MS CRM 2011中,对于多实体数据文件的导入
  2. tensorflow实现原理
  3. android10分区镜像,分区和映像  |  Android 开源项目  |  Android Open Source Project
  4. reactjs antd(ant-design)安装、基本使用及css样式的按需引入
  5. 【收藏】最详细的cmder配置
  6. 详解Scala与Java的互动
  7. golang变量使用细节
  8. spring MVC请求处理类注解属性详解
  9. IDEA配置SVN并实现代码版本控制
  10. 基于 abp vNext 和 .NET Core 开发博客项目 - 定时任务最佳实战(三)