#!/bin/sh /etc/rc.common # Copyright (C) 2006-2014 OpenWrt.org START=94 STOP=13 USE_PROCD=1 #设置拨号模式 # $1:拨号模式 set_mode() { #获取AT串口、制造商、模块名 local at_port=$(uci -q get modem.modem$modem_no.at_port) local manufacturer=$(uci -q get modem.modem$modem_no.manufacturer) local name=$(uci -q get modem.modem$modem_no.name) #分制造商设置不同的AT命令 local command if [ "$manufacturer" = "quectel" ]; then local mode_num case $1 in "qmi") mode_num='0' ;; "gobinet") mode_num='0' ;; "ecm") mode_num='1' ;; "mbim") mode_num='2' ;; "rndis") mode_num='3' ;; "ncm") mode_num='5' ;; "*") mode_num='0' ;; esac #查询当前拨号模式 command='AT+QCFG="usbnet"' local at_result=$(sh /usr/share/modem/modem_at.sh $at_port $command) if [[ "$at_result" != *"$mode_num"* ]]; then #切换到指定的拨号模式 case $1 in "qmi") command='AT+QCFG="usbnet",0' ;; "gobinet") command='AT+QCFG="usbnet",0' ;; "ecm") command='AT+QCFG="usbnet",1' ;; "mbim") command='AT+QCFG="usbnet",2' ;; "rndis") command='AT+QCFG="usbnet",3' ;; "ncm") command='AT+QCFG="usbnet",5' ;; "*") command='AT+QCFG="usbnet",0' ;; esac sh /usr/share/modem/modem_at.sh $at_port $command #移远切换模式后,还需要重启模块,待测试 fi elif [ "$manufacturer" = "fibocom" ]; then if [ "$name" = "fm150-ae" ]; then local mode_num case $1 in "qmi") mode_num='32' ;; "gobinet") mode_num='32' ;; "ecm") mode_num='23' ;; "mbim") mode_num='29' ;; "rndis") mode_num='24' ;; "ncm") mode_num='23' ;; "*") mode_num='32' ;; esac #查询当前拨号模式 command='AT+GTUSBMODE?' local at_result=$(sh /usr/share/modem/modem_at.sh $at_port $command) if [[ "$at_result" != *"$mode_num"* ]]; then #切换到指定的拨号模式 case $1 in "qmi") command='AT+GTUSBMODE=32' ;; "gobinet") command='AT+GTUSBMODE=32' ;; "ecm") command='AT+GTUSBMODE=23' ;; "mbim") command='AT+GTUSBMODE=29' ;; "rndis") command='AT+GTUSBMODE=24' ;; "ncm") command='AT+GTUSBMODE=23' ;; "*") command='AT+GTUSBMODE=32' ;; esac sh /usr/share/modem/modem_at.sh $at_port $command fi elif [ "$name" = "fm650" ]; then #待处理 echo "fm650" fi else #没有匹配到制造商,需要手动切换模块的拨号模式 echo "请手动切换模块的拨号模式" fi } #设置防火墙 set_firewall() { local num=`uci show firewall | grep "name='wan'" | wc -l` local wwan_num=`uci -q get firewall.@zone[$num].network | grep -w "$1" | wc -l` if [ "$wwan_num" = "0" ]; then uci add_list firewall.@zone[$num].network="$1" fi uci commit firewall } #设置IPv4网络接口 # $1:网络接口名称 # $2:网络接口 set_ipv4_interface() { [ "$(uci -q get network.$1.ifname)" != "$2" ] && { uci set network.$1='interface' uci set network.$1.ifname="$2" uci set network.$1.proto='dhcp' uci commit network #加入WAN防火墙 set_firewall $1 #启动网络接口 ifup $1 } } #设置IPv6网络接口 # $1:网络接口名称 # $2:网络接口 set_ipv6_interface() { if [ "$(uci -q get network.$1.ifname)" != "$2" ]; then uci set network.$1='interface' uci set network.$1.ifname="$2" uci set network.$1.proto='dhcpv6' uci set network.$1.extendprefix='1' uci commit network #加入WAN防火墙 set_firewall $1 #启动网络接口 ifup $1 else uci set network.$1.extendprefix='1' uci commit network fi } #设置网络接口 # $1:模块序号 # $2:网络接口 set_interface() { case $pdp_type in "ipv4") set_ipv4_interface wwan_5g_$1 $2 ;; "ipv6") set_ipv6_interface wwan6_5g_$1 $2 ;; "ipv4_ipv6") set_ipv4_interface wwan_5g_$1 $2 set_ipv6_interface wwan6_5g_$1 $2 ;; "*") set_ipv4_interface wwan_5g_$1 $2 set_ipv6_interface wwan6_5g_$1 $2 ;; esac } qmi() { #设置拨号模式 set_mode qmi #设置网络接口 local net_interface=$(uci -q get modem.modem$modem_no.net_interface) set_interface $modem_no $net_interface #拨号 procd_open_instance if [ "$dial_tool" = "quectel-CM" ]; then procd_set_param command quectel-CM elif [[ -z "$dial_tool" ]]; then procd_set_param command quectel-CM else procd_set_param command $dial_tool fi case $pdp_type in "ipv4") procd_append_param command -4 ;; "ipv6") procd_append_param command -6 ;; "ipv4_ipv6") procd_append_param command -4 -6 ;; "*") procd_append_param command -4 -6 ;; esac if [ "$apn" != "" ]; then procd_append_param command -s $apn fi if [ "$user" != "" ]; then procd_append_param command $user fi if [ "$password" != "" ]; then procd_append_param command $password fi if [ "$auth" != "" ]; then procd_append_param command $auth fi if [ "$moblie_net" != "" ]; then procd_append_param command -i $moblie_net fi procd_set_param respawn procd_set_param procd_pid /var/run/modem/modem$modem_no.pid procd_close_instance } gobinet() { qmi } ecm() { #设置拨号模式 set_mode ecm #获取网络接口、AT串口、制造商 local net_interface=$(uci -q get modem.modem$modem_no.net_interface) local at_port=$(uci -q get modem.modem$modem_no.at_port) local manufacturer=$(uci -q get modem.modem$modem_no.manufacturer) #设置网络接口 set_interface $modem_no $net_interface #拨号 procd_open_instance procd_set_param command sh /usr/share/modem/modem_at.sh $at_port if [ "$manufacturer" = "quectel" ]; then procd_append_param command 'ATI' elif [ "$manufacturer" = "fibocom" ]; then procd_append_param command 'AT+GTRNDIS=1,1' fi procd_set_param respawn procd_close_instance } mbim() { qmi } rndis() { ecm #广和通的rndis和ecm不同,后续再测试 } ncm() { ecm } #实例运行状态 instance_status() { #获取modem的实例信息 local response=$(ubus call service list '{"name": "modem"}') local instance_number=$(echo "$response" | jq -r '.modem.instances | length') for i in $(seq 1 $((instance_number))); do #获取运行状态和拨号命令 local running_status=$(echo "$response" | jq -r '.modem.instances.$i.running') local command=$(echo "$response" | jq -r '.modem.instances.instance$i.command') if [ "$running_status" = "$true" ] && [[ "$command" = *"$moblie_net"* ]]; then return 1 fi done } dial() { config_get enable $1 enable [ "$enable" = "0" ] && return 0 local remarks #备注 local moblie_net #移动网络 local mode #拨号模式 local dial_tool #拨号工具 local pdp_type #网络类型 local apn local user local password local auth config_get remarks $1 remarks config_get moblie_net $1 moblie_net config_get mode $1 mode config_get dial_tool $1 dial_tool config_get pdp_type $1 pdp_type config_get apn $1 apn config_get user $1 user config_get password $1 password config_get auth $1 auth #查看移动网络是否已经有实例在运行 instance_status [ $? = "1" ] && return 0 #获取模块序号 local modem_number=$(uci -q get modem.@global[0].option.modem_number) for i in $(seq 0 $((modem_number-1))); do local net=$(uci -q get modem.modem$i.net) if [ "$net" = "$moblie_net" ]; then #模块序号 modem_no=$i fi done #根据不同的拨号模式拨号 if [ "$mode" = "qmi" ]; then qmi elif [ "$mode" = "gobinet" ]; then gobinet #暂无,同qmi elif [ "$mode" = "ecm" ]; then ecm elif [ "$mode" = "mbim" ]; then mbim elif [ "$mode" = "rndis" ]; then rndis elif [ "$mode" = "ncm" ]; then ncm fi # sleep 15 } stop_dial() { #停止所有拨号 config_get enable $1 enable [ "$enable" = "0" ] && { killall quectel-CM >/dev/null 2>&1 return 0 } #停止单个拨号 local moblie_net #移动网络 config_get moblie_net $1 moblie_net #获取modem的实例信息 local response=$(ubus call service list '{"name": "modem"}') local instance_number=$(echo "$response" | jq -r '.modem.instances | length') for i in $(seq 1 $((instance_number))); do #获取拨号命令 local command=$(echo "$response" | jq -r '.modem.instances.instance$i.command') if [ "$command" = *"$moblie_net"* ]; then local pid=$(echo "$response" | jq -r '.modem.instances.$i.pid') kill $pid >/dev/null 2>&1 fi done } service_triggers() { procd_add_reload_trigger "modem" } start_service() { enable=$(uci -q get modem.@global[0].enable) if [ "$enable" = "0" ];then stop_service else config_load modem config_foreach dial "config" fi } stop_service() { config_load modem config_foreach stop_dial "config" }