首页 > 编程知识 正文

openwrt电信pppoe无法拨号,openwrt怎么设置上网

时间:2023-05-04 14:27:26 阅读:50586 作者:4408

其间,一款是视频数据传输终端,具有使用4G模块拨号、连接摄像头、路由器传输视频信号的远程管理功能,当然这不是本文的重点; 在此,从开发到在线化、批量生产,一直在考验拨号的稳定性,因此只重点介绍4G拨号的相关内容。

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

首先介绍一些相关的工具。

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

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

USB串行: USB旋转tty驱动

选项: USB旋转tty驱动

ndis :与usbserial虚拟化为串行端口不同,LTE专用拨号驱动程序将ndis虚拟化为互联网端口,以获得更快的速度

以下根据使用流程逐一详细说明。

驱动程序:使用usbserial驱动程序时,Linux Kernel附带,无需配置,直接安装即可; Option驱动也同样;

要使用ndis驱动程序,LTE模块化制造商必须提供相关的驱动程序包和APP应用层拨号程序

PPD参数:主要是APN和Dialnumber,一般不需要用户名和密码; APN和电话号码可以咨询运营商。 虽然每个运营商都是固定的,但是根据地区也有差异。 特别是现在的IOT的M2M卡、专用卡等。

可以通过SIM卡ICCID判断载体类别,并设定相关的APN和Dialnumber。 请参阅comgt脚本。

3360 cimiwaitquiet 10.2 send ' at cimi ^ m ' wait for3' 46000 ' ' 46002 ' ' 46007 ' ' 46001 ' ' 46006 ' ' 46005 ' oto net3 gif %=5gotoctlteif %=6gotoctlteif %=7gotoctlte # dfaultgotowebset 3360 errexit 1: cmnet send ' atcgdcont=1, ' 3gnet' ^ m ' print ' 3gnetn ' gotowaitret : ctltesend ' atcgdcont=1,'IP','ctlte'^m'print

openwrt拨号机制:检测热插头、lte usb的重新拔插,系统通过热插头自动调用pppdpppd配置,通过procd进程进行管理。 自动启动pppd的主要拨号脚本为3g.sh,参考内容为#! /结实的御姐/sh [-n ' $ include _ only ' ]|{ not _ included=1include _ only=1./netifd-proto.sh./PPP.minly { no _ device=1available=1PPP _ generic _ init _ config proto _ config _ add _ string ' device 3360设备' proto _ config _ add _ string ' pincode ' proto _ config _ add _ string ' dial number ' proto _ config _ add _ string d _ string ' private _ dial ' } proto _ 3g _ setup ({本地接口} )。 发送AT命令(如SIM卡、信号质量和注册的网络)的目的是咨询确保拨号的条件。 PP _ generic _ setup ' $ interface 'no accomp$ { username 3360 user ' $ username ' password ' $ password ' } nop cord

3g拨号成功后调用脚本ppp-up#!/健壮的御姐/shPPP_IPPARAM="$6". /lib/netifd/netifd-proto.shecho -n > /tmp/dialcounttouch /tmp/dialokproto_init_update "$IFNAME" 1 1proto_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等文件表示拨号成功,不需要再特别去查询;这样简单方便;当然失败时需要自行删除文件。拨号由成功到失败时运行脚本ppp-down#!/健壮的御姐/shPPP_IPPARAM="$6". /lib/netifd/netifd-proto.shrm -f /tmp/dialokecho "$(date)- ppp down ###" >> /tmp/at_failed_retproto_init_update "$IFNAME" 0proto_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分钟检测一次;检测脚本如下:

#!/健壮的御姐/shresetmodule(){echo Init > /tmp/sim-info echo 0 > /tmp/sig echo 1 > /sys/class/leds/modrst/brightnessecho "$(date)-repower-4g-module" >> /tmp/repower-4g-moduleecho "$(date)-repower-4g-module" >> /tmp/at_failed_ret sleep 5 echo 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:' || /s健壮的御姐/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_retfiif [ -e "/tmp/dialok" ]; thencheckat "$1"echo -n > /tmp/dialcountecho -n > /tmp/cfuncountelseifdown 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_ret cat /tmp/module_status_file >> /tmp/at_failed_retifup pppfififi

主要流程为:

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

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

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

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

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

到此,基本介绍完毕;

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





版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。