diff --git a/applications/luci-app-modem/Makefile b/applications/luci-app-modem/Makefile index f043f76..a5ec719 100644 --- a/applications/luci-app-modem/Makefile +++ b/applications/luci-app-modem/Makefile @@ -11,22 +11,11 @@ PKG_LICENSE:=GPLv3 PKG_LINCESE_FILES:=LICENSE PKF_MAINTAINER:=Siriling LUCI_DEPENDS:=+luci-compat \ - +kmod-usb2 +kmod-usb3 \ - +kmod-usb-net-sierrawireless +kmod-usb-ohci \ - +kmod-usb-serial-option +kmod-usb-serial +kmod-usb-serial-qualcomm \ - +kmod-usb-net +kmod-usb-acm \ - +kmod-usb-wdm +kmod-usb-net-qmi-wwan \ - +kmod-usb-net-cdc-ether \ - +kmod-usb-net-cdc-mbim \ - +kmod-usb-net-rndis \ - +kmod-usb-net-cdc-ncm +kmod-usb-net-huawei-cdc-ncm \ +usbutils \ +pciutils \ +quectel-CM-5G \ - +modemmanager \ - +luci-proto-modemmanager \ +sms-tool \ - +jq + +bc +jq define Package/luci-app-modem/conffiles /etc/config/modem diff --git a/applications/luci-app-modem/README.md b/applications/luci-app-modem/README.md index 52ba500..e75c283 100644 --- a/applications/luci-app-modem/README.md +++ b/applications/luci-app-modem/README.md @@ -26,6 +26,7 @@ | 厂家名称 | 模组名称 | 平台 | 数据传输模式 | 端口模式 | | -------- | -------------------------------------------------- | -------- | ------------ | ---------------------------- | +| 华为 | MH5000-31 | 华为 | USB | ECM,NCM | | 移远通信 | RG200U-CN(DONGLE版) | 紫光展锐 | USB | ECM,MBIM,RNDIS,NCM | | 移远通信 | RM500U-CN | 紫光展锐 | USB | ECM,MBIM,RNDIS,NCM | | 移远通信 | RM500U-EA | 紫光展锐 | USB | ECM,MBIM,RNDIS,NCM | diff --git a/applications/luci-app-modem/luasrc/controller/modem.lua b/applications/luci-app-modem/luasrc/controller/modem.lua index c7dcb06..ad83083 100644 --- a/applications/luci-app-modem/luasrc/controller/modem.lua +++ b/applications/luci-app-modem/luasrc/controller/modem.lua @@ -34,6 +34,7 @@ function index() entry({"admin", "network", "modem", "set_mode"}, call("setMode"), nil).leaf = true entry({"admin", "network", "modem", "get_network_prefer_info"}, call("getNetworkPreferInfo"), nil).leaf = true entry({"admin", "network", "modem", "set_network_prefer"}, call("setNetworkPrefer"), nil).leaf = true + entry({"admin", "network", "modem", "set_band_prefer"}, call("setBandPrefer"), nil).leaf = true entry({"admin", "network", "modem", "get_self_test_info"}, call("getSelfTestInfo"), nil).leaf = true entry({"admin", "network", "modem", "get_quick_commands"}, call("getQuickCommands"), nil).leaf = true entry({"admin", "network", "modem", "send_at_command"}, call("sendATCommand"), nil).leaf = true @@ -587,14 +588,24 @@ end function getNetworkPreferInfo() local at_port = http.formvalue("port") - --获取制造商 - local manufacturer=getManufacturer(at_port) + --获取制造商,数据接口,模组名称 + local manufacturer + local data_interface + local name + uci:foreach("modem", "modem-device", function (modem_device) + if at_port == modem_device["at_port"] then + manufacturer=modem_device["manufacturer"] + data_interface=modem_device["data_interface"] + name=modem_device["name"] + return true --跳出循环 + end + end) --获取值 local network_prefer_info if manufacturer~="unknown" then --获取模组网络偏好 - local command="source "..script_path..manufacturer..".sh && "..manufacturer.."_get_network_prefer "..at_port + local command="source "..script_path..manufacturer..".sh && "..manufacturer.."_get_network_prefer "..at_port.." "..data_interface.." "..name local result=shell(command) network_prefer_info=json.parse(result) end @@ -615,8 +626,18 @@ function setNetworkPrefer() local at_port = http.formvalue("port") local network_prefer_config = json.stringify(http.formvalue("prefer_config")) - --获取制造商 - local manufacturer=getManufacturer(at_port) + --获取制造商,数据接口,模组名称 + local manufacturer + local data_interface + local name + uci:foreach("modem", "modem-device", function (modem_device) + if at_port == modem_device["at_port"] then + manufacturer=modem_device["manufacturer"] + data_interface=modem_device["data_interface"] + name=modem_device["name"] + return true --跳出循环 + end + end) --设置模组网络偏好 local command="source "..script_path..manufacturer..".sh && "..manufacturer.."_set_network_prefer "..at_port.." "..network_prefer_config @@ -624,11 +645,48 @@ function setNetworkPrefer() --获取设置好后的模组网络偏好 local network_prefer={} - if at_port and manufacturer and manufacturer~="unknown" then - local command="source "..script_path..manufacturer..".sh && "..manufacturer.."_get_network_prefer "..at_port - local result=shell(command) - network_prefer=json.parse(result) - end + -- if at_port and manufacturer and manufacturer~="unknown" then + -- local command="source "..script_path..manufacturer..".sh && "..manufacturer.."_get_network_prefer "..at_port.." "..data_interface.." "..name + -- local result=shell(command) + -- network_prefer=json.parse(result) + -- end + + -- 写入Web界面 + luci.http.prepare_content("application/json") + luci.http.write_json(network_prefer) +end + +--[[ +@Description 设置频段偏好 +]] +function setBandPrefer() + local at_port = http.formvalue("port") + local network_prefer_config = json.stringify(http.formvalue("prefer_config")) + + --获取制造商,数据接口,模组名称 + local manufacturer + local data_interface + local name + uci:foreach("modem", "modem-device", function (modem_device) + if at_port == modem_device["at_port"] then + manufacturer=modem_device["manufacturer"] + data_interface=modem_device["data_interface"] + name=modem_device["name"] + return true --跳出循环 + end + end) + + --设置模组网络偏好 + local command="source "..script_path..manufacturer..".sh && "..manufacturer.."_set_band_prefer "..at_port.." "..network_prefer_config + shell(command) + + --获取设置好后的模组网络偏好 + local network_prefer={} + -- if at_port and manufacturer and manufacturer~="unknown" then + -- local command="source "..script_path..manufacturer..".sh && "..manufacturer.."_get_network_prefer "..at_port.." "..data_interface.." "..name + -- local result=shell(command) + -- network_prefer=json.parse(result) + -- end -- 写入Web界面 luci.http.prepare_content("application/json") diff --git a/applications/luci-app-modem/luasrc/view/modem/modem_debug.htm b/applications/luci-app-modem/luasrc/view/modem/modem_debug.htm index ebb9119..6f51810 100644 --- a/applications/luci-app-modem/luasrc/view/modem/modem_debug.htm +++ b/applications/luci-app-modem/luasrc/view/modem/modem_debug.htm @@ -46,6 +46,39 @@ copy_to_input(); }); + // 设置网络偏好事件 + set_network_prefer_event(); + } + + // 设置频段偏好事件 + function set_band_prefer_event(network_type) + { + //获取网络偏好选项元素 + var prefer_option_auto = document.getElementById(network_type+'_prefer_option_auto'); + var prefer_option_custom = document.getElementById(network_type+'_prefer_option_custom'); + //网络偏好选项为自动时触发 + prefer_option_auto.addEventListener('change', function() { + if (prefer_option_auto.checked) + { + //禁用偏好复选框 + disabled_prefer_custom_config(network_type+"_",true); + //全选偏好复选框 + all_choose_prefer_custom_config(network_type+"_",true); + } + }); + //网络偏好选项为自定义时触发 + prefer_option_custom.addEventListener('change', function() { + if (prefer_option_custom.checked) + { + //禁用偏好复选框 + disabled_prefer_custom_config(network_type+"_",false); + } + }); + } + + // 设置网络偏好事件 + function set_network_prefer_event() + { //获取网络偏好选项元素 var prefer_option_auto = document.getElementById('prefer_option_auto'); var prefer_option_custom = document.getElementById('prefer_option_custom'); @@ -54,9 +87,9 @@ if (prefer_option_auto.checked) { //禁用偏好复选框 - disabled_prefer_custom_config(true); + disabled_prefer_custom_config("",true); //全选偏好复选框 - all_choose_prefer_custom_config(true); + all_choose_prefer_custom_config("",true); } }); //网络偏好选项为自定义时触发 @@ -64,9 +97,15 @@ if (prefer_option_custom.checked) { //禁用偏好复选框 - disabled_prefer_custom_config(false); + disabled_prefer_custom_config("",false); } }); + + //设置频段偏好事件 + set_band_prefer_event("5g"); + set_band_prefer_event("4g"); + set_band_prefer_event("3g"); + set_band_prefer_event("2g"); } //设置标签菜单事件 @@ -412,9 +451,9 @@ } // 全选网络偏好复选框 - function all_choose_prefer_custom_config(status) + function all_choose_prefer_custom_config(id_prefix,status) { - var checkboxes=document.getElementById('prefer_custom_config').querySelectorAll('input[type="checkbox"]'); + var checkboxes=document.getElementById(id_prefix+'prefer_custom_config').querySelectorAll('input[type="checkbox"]'); for(checkbox of checkboxes) { //设置网络偏好复选框状态 @@ -423,9 +462,9 @@ } // 禁用网络偏好复选框 - function disabled_prefer_custom_config(status) + function disabled_prefer_custom_config(id_prefix,status) { - var checkboxes=document.getElementById('prefer_custom_config').querySelectorAll('input[type="checkbox"]'); + var checkboxes=document.getElementById(id_prefix+'prefer_custom_config').querySelectorAll('input[type="checkbox"]'); for(checkbox of checkboxes) { //禁用 @@ -433,6 +472,25 @@ } } + // 禁用网络偏好功能 + function disabled_network_prefer_function(id_prefix,status) + { + //偏好选项 + var prefer_option_auto = document.getElementById('prefer_option_auto'); + prefer_option_auto.disabled=status; + document.getElementById('prefer_option_custom').disabled=status; + + //网络偏好为自动则不启用 + if (!prefer_option_auto.checked) + { + //偏好复选框 + disabled_prefer_custom_config("",status); + } + + //偏好按钮 + document.getElementById(id_prefix+'_prefer_button').disabled=status; + } + // 禁用功能 function disabled_function(function_name,status) { @@ -454,20 +512,10 @@ //网络偏好 else if (function_name=="network_prefer") { - //偏好选项 - document.getElementById('prefer_option_auto').disabled=status; - document.getElementById('prefer_option_custom').disabled=status; - - //网络偏好为自动则不启用 - var prefer_option_auto = document.getElementById('prefer_option_auto'); - if (!prefer_option_auto.checked) - { - //偏好复选框 - disabled_prefer_custom_config(status); - } - - //偏好按钮 - document.getElementById('network_prefer_button').disabled=status; + // 网络类型 + disabled_network_prefer_function("network",status); + // 频段 + disabled_network_prefer_function("band",status); } } @@ -549,29 +597,131 @@ ); } - // 获取当前网络视图 - function get_current_prefer_view(network_prefer) + // 设置网络偏好视图 + function set_network_prefer_view(network_prefer) { - var current_prefer_view=""; + var current_prefer_view=""; //当前网络偏好 + var prefer_check_view=""; //网络偏好复选框 + var network_type_count=0; //统计已启用的网络类型 - //自动状态判断(全部选中为自动) - if (network_prefer["3G"]&&network_prefer["4G"]&&network_prefer["5G"]) + for(var keys of network_prefer) { - //更新当前偏好 - current_prefer_view="AUTO"; - } - else - { - //更新当前偏好 - for(key in network_prefer) + for(var key in keys) { - if (network_prefer[key]) { + var band_info_display="none"; //频段偏好显示 + var is_check=""; //是否选中(启用) + var network_type=key.toLowerCase(); //转小写 + + //已启动的网络类型 + if (keys[key]["enable"]) + { + //设置偏好视图 current_prefer_view+=key+" "; + if (keys[key]["band"].length!=0) { + band_info_display="block"; + } + is_check="checked"; + network_type_count++; } + //设置偏好复选框视图 + prefer_check_view+=''+key+'  '; + + //频段偏好 + var current_prefer_band_view=""; //当前频段偏好 + var band_prefer_check_view=""; //频段偏好复选框 + var band_count=0; //统计已启用的频段 + + for(var bands of keys[key]["band"]) + { + for(var band in bands) + { + var band_is_check=""; //是否选中(启用) + var band_name=band.toLowerCase(); //转小写 + + //已启动的频段 + if (bands[band]) + { + //设置偏好视图 + current_prefer_band_view+=band+" "; + band_is_check="checked"; + band_count++; + } + //设置频段偏好复选框视图 + band_prefer_check_view+=''+band+'  '; + } + } + + //设置当前频段偏好(全未启用则为空) + if (band_count==0) + { + current_prefer_band_view="NONE"; + } + document.getElementById(network_type+'_current_prefer').innerHTML=current_prefer_band_view; + + var first_cache=document.getElementById("first_cache"); + if (first_cache.checked) + { + //设置频段偏好复选框 + document.getElementById(network_type+'_band_check').innerHTML=band_prefer_check_view; + + //自动状态判断(全部启用为自动) + if (band_count==Object.keys(keys[key]["band"]).length) + { + //设置偏好选项 + document.getElementById(network_type+'_prefer_option_auto').checked=true; + //更新偏好配置 + all_choose_prefer_custom_config(network_type+"_",true); + //禁用用偏好复选框 + disabled_prefer_custom_config(network_type+"_",true); + } + else + { + //设置偏好选项 + document.getElementById(network_type+'_prefer_option_custom').checked=true; + //启用偏好复选框 + disabled_prefer_custom_config(network_type+"_",false); + } + } + + //设置频段偏好显示 + document.getElementById("cbi-"+network_type+"_band_info").style.display=band_info_display; } } + + //设置当前网络偏好(全部启用为自动) + if (network_type_count==Object.keys(network_prefer).length) { + current_prefer_view="AUTO"; + } + document.getElementById('current_prefer').innerHTML=current_prefer_view; + + var first_cache=document.getElementById("first_cache"); + if (first_cache.checked) + { + //设置网络偏好复选框 + document.getElementById('network_type_check').innerHTML=prefer_check_view; + + //自动状态判断(全部启用为自动) + if (network_type_count==Object.keys(network_prefer).length) + { + //设置偏好选项 + document.getElementById('prefer_option_auto').checked=true; + //更新偏好配置 + all_choose_prefer_custom_config("",true); + //禁用用偏好复选框 + disabled_prefer_custom_config("",true); + } + else + { + //设置偏好选项 + document.getElementById('prefer_option_custom').checked=true; + //启用偏好复选框 + disabled_prefer_custom_config("",false); + } + + //设置第一次获取数据标志 + first_cache.checked=false; + } - return current_prefer_view; } // 设置网络偏好信息 @@ -580,45 +730,57 @@ //获取模组网络偏好 var network_prefer=network_prefer_info["network_prefer"]; - //获取偏好视图 - var current_prefer_view=get_current_prefer_view(network_prefer); + //设置网络偏好视图 + set_network_prefer_view(network_prefer); - //设置当前网络偏好 - document.getElementById('current_prefer').innerHTML=current_prefer_view; + // //设置当前网络偏好 + // document.getElementById('current_prefer').innerHTML=current_prefer_view; - //设置偏好选项和复选框 - var first_cache=document.getElementById("first_cache"); - if (first_cache.checked) - { - if (network_prefer["3G"]&&network_prefer["4G"]&&network_prefer["5G"]) - { - //设置偏好选项 - document.getElementById('prefer_option_auto').checked=true; - //更新偏好配置 - all_choose_prefer_custom_config(true); - //禁用用偏好复选框 - disabled_prefer_custom_config(true); - } - else - { - //设置偏好选项 - document.getElementById('prefer_option_custom').checked=true; - //更新偏好配置 - for (key in network_prefer) - { - //设置偏好配置 - var prefer_config_element=document.getElementById('prefer_config_'+key.toLowerCase()); - if (prefer_config_element!=null) { - prefer_config_element.checked=network_prefer[key]; - } - } - //启用偏好复选框 - disabled_prefer_custom_config(false); - } + // //设置偏好选项和复选框 + // var first_cache=document.getElementById("first_cache"); + // if (first_cache.checked) + // { + // var count=0; //统计启用 + // var prefer_check_view=""; + // for(var keys of network_prefer) + // { + // for(var key in keys) + // { + // var network_type=key.toLowerCase(); //转小写 + // var is_check=""; //是否选中(启用) + // if (keys[key]["enable"]) + // { + // is_check="checked"; + // count++; + // } + // //设置偏好复选框视图 + // prefer_check_view+=''+key+'  '; + // } + // } - //设置第一次获取数据标志 - first_cache.checked=false; - } + // //设置网络偏好复现框 + // document.getElementById('network_type_check').innerHTML=prefer_check_view; + + // //自动状态判断(全部启用为自动) + // if (count==Object.keys(network_prefer).length) { + // //设置偏好选项 + // document.getElementById('prefer_option_auto').checked=true; + // //更新偏好配置 + // all_choose_prefer_custom_config("",true); + // //禁用用偏好复选框 + // disabled_prefer_custom_config("",true); + // } + // else + // { + // //设置偏好选项 + // document.getElementById('prefer_option_custom').checked=true; + // //启用偏好复选框 + // disabled_prefer_custom_config("",false); + // } + + // //设置第一次获取数据标志 + // first_cache.checked=false; + // } } // 设置模组自检信息 @@ -708,33 +870,30 @@ //获取偏好配置 var network_prefer_config={}; - if (prefer_option=="auto") + + var checkboxes=document.getElementById('prefer_custom_config').querySelectorAll('input[type="checkbox"]'); + for(checkbox of checkboxes) { - network_prefer_config["3G"]=1; - network_prefer_config["4G"]=1; - network_prefer_config["5G"]=1; - } - else - { - var checkboxes=document.getElementById('prefer_custom_config').querySelectorAll('input[type="checkbox"]'); - for(checkbox of checkboxes) - { - network_prefer_config[checkbox.value.toUpperCase()]=Number(checkbox.checked); - } + //获取网络类型配置 + var network_prefer={}; + network_prefer["enable"]=Number(checkbox.checked); + + var network_type=checkbox.value; + network_prefer_config[network_type.toUpperCase()]=network_prefer; } //设置偏好 XHR.get('<%=luci.dispatcher.build_url("admin", "network", "modem", "set_network_prefer")%>', {"port":at_port,"prefer_config":network_prefer_config}, function(x, data) { - //获取模组网络偏好 - var network_prefer=data["network_prefer"]; + // //获取模组网络偏好 + // var network_prefer=data["network_prefer"]; - //获取当前偏好视图 - var current_prefer_view=get_current_prefer_view(network_prefer); + // //获取当前偏好视图 + // var current_prefer_view=get_current_prefer_view(network_prefer); - //设置模组当前网络偏好 - document.getElementById('current_prefer').innerHTML=current_prefer_view; + // //设置模组当前网络偏好 + // document.getElementById('current_prefer').innerHTML=current_prefer_view; //启用功能 disabled_function("network_prefer",false); @@ -742,6 +901,118 @@ ); } + // 设置频段偏好 + function set_band_prefer() + { + //禁用功能 + disabled_function("network_prefer",true); + + //获取偏好选项 + var prefer_option = document.querySelector('input[name="prefer_option"]:checked').value; + //获取选中的模组 + var at_port = document.getElementById("modem_select").value; + + //获取偏好配置 + var network_prefer_config={}; + + var checkboxes=document.getElementById('prefer_custom_config').querySelectorAll('input[type="checkbox"]'); + for(checkbox of checkboxes) + { + //获取网络类型配置 + var network_prefer={}; + network_prefer["enable"]=Number(checkbox.checked); + + //获取频段配置 + network_prefer["band"]=[]; + if (checkbox.checked) + { + var network_type=checkbox.value; + var band_check_element=document.getElementById(network_type+"_band_check"); + var bands=band_check_element.querySelectorAll('input[type="checkbox"]'); + for(band of bands) + { + var band_config={}; + band_config[band.value.toUpperCase().replace("-","_")]=Number(band.checked); + network_prefer["band"].push(band_config); + } + } + + network_prefer_config[network_type.toUpperCase()]=network_prefer; + } + + //设置偏好 + XHR.get('<%=luci.dispatcher.build_url("admin", "network", "modem", "set_band_prefer")%>', {"port":at_port,"prefer_config":network_prefer_config}, + function(x, data) + { + // //获取模组网络偏好 + // var network_prefer=data["network_prefer"]; + + // //获取当前偏好视图 + // var current_prefer_view=get_current_prefer_view(network_prefer); + + // //设置模组当前网络偏好 + // document.getElementById('current_prefer').innerHTML=current_prefer_view; + + //启用功能 + disabled_function("network_prefer",false); + } + ); + } + + // 设置网络偏好 + // function set_band_prefer() + // { + // //禁用功能 + // disabled_function("network_prefer",true); + + // //获取偏好选项 + // var prefer_option = document.querySelector('input[name="prefer_option"]:checked').value; + // //获取选中的模组 + // var at_port = document.getElementById("modem_select").value; + + // //获取偏好配置 + // var network_prefer_config={}; + // //获取网络类型配置 + // var checkboxes=document.getElementById('prefer_custom_config').querySelectorAll('input[type="checkbox"]'); + // for(checkbox of checkboxes) + // { + // network_prefer_config[checkbox.value.toUpperCase()]["enable"]=Number(checkbox.checked); + + // if (checkbox.checked) + // { + // //获取频段配置 + // var band_checkboxes=document.getElementById(checkbox.value+'prefer_custom_config').querySelectorAll('input[type="checkbox"]'); + // for(band_checkbox of band_checkboxes) + // { + // network_prefer_config[checkbox.value.toUpperCase()]["band"]=Number(band_checkbox.checked); + // } + // } + // else + // { + // network_prefer_config[checkbox.value.toUpperCase()]["band"]="[]"; + // } + + // } + + // //设置偏好 + // XHR.get('<%=luci.dispatcher.build_url("admin", "network", "modem", "set_network_prefer")%>', {"port":at_port,"prefer_config":network_prefer_config}, + // function(x, data) + // { + // //获取模组网络偏好 + // var network_prefer=data["network_prefer"]; + + // //获取当前偏好视图 + // var current_prefer_view=get_current_prefer_view(network_prefer); + + // //设置模组当前网络偏好 + // document.getElementById('current_prefer').innerHTML=current_prefer_view; + + // //启用功能 + // disabled_function("network_prefer",false); + // } + // ); + // } + // 获取模组调试信息 function get_modem_debug_info() { @@ -1066,6 +1337,7 @@ <%:Option%> <%:Config%> + @@ -1082,8 +1354,8 @@ -
- +
+
+
+ +
+ +
+ @@ -1187,6 +1465,146 @@
+ + + + + + + + <%+footer%> diff --git a/applications/luci-app-modem/root/etc/config/custom_at_commands b/applications/luci-app-modem/root/etc/config/custom_at_commands index 8612106..60ed35c 100644 --- a/applications/luci-app-modem/root/etc/config/custom_at_commands +++ b/applications/luci-app-modem/root/etc/config/custom_at_commands @@ -329,4 +329,64 @@ config custom-commands config custom-commands option description '重启模组 > AT+RESET' - option command 'AT+RESET' \ No newline at end of file + option command 'AT+RESET' + +config custom-commands + option description '****************华为****************' + option command 'ATI' + +config custom-commands + option description '获取SIM卡卡槽状态 > AT^SIMSLOT?' + option command 'AT^SIMSLOT?' + +config custom-commands + option description '设置当前使用的为卡1 > AT^SIMSWITCH=1' + option command 'AT^SIMSWITCH=1' + +config custom-commands + option description '设置当前使用的为卡2 > AT^SIMSWITCH=0' + option command 'AT^SIMSWITCH=0' + +config custom-commands + option description '查询网络信息 > AT^SYSINFOEX' + option command 'AT^SYSINFOEX' + +config custom-commands + option description '查询当前拨号模式 > AT^SETMODE?' + option command 'AT^SETMODE?' + +config custom-commands + option description 'ECM拨号模式(Linux) > AT^SETMODE=0' + option command 'AT^SETMODE=0' + +config custom-commands + option description 'NCM拨号模式(Windows) > AT^SETMODE=1' + option command 'AT^SETMODE=1' + +config custom-commands + option description 'ECM拨号模式(Linux,Debug) > AT^SETMODE=2' + option command 'AT^SETMODE=2' + +config custom-commands + option description 'NCM拨号模式(Windows,Debug) > AT^SETMODE=3' + option command 'AT^SETMODE=3' + +config custom-commands + option description '锁4G > AT^SYSCFGEX="03",40000000,1,2,7FFFFFFFFFFFFFFF,,' + option command 'AT^SYSCFGEX="03",40000000,1,2,7FFFFFFFFFFFFFFF,,' + +config custom-commands + option description '锁5G > AT^SYSCFGEX="08",40000000,1,2,7FFFFFFFFFFFFFFF,,' + option command 'AT^SYSCFGEX="08",40000000,1,2,7FFFFFFFFFFFFFFF,,' + +config custom-commands + option description '恢复自动搜索网络 > AT^SYSCFGEX="00",3FFFFFFF,1,2,7FFFFFFFFFFFFFFF,,' + option command 'AT^SYSCFGEX="00",3FFFFFFF,1,2,7FFFFFFFFFFFFFFF,,' + +config custom-commands + option description '获取模组温度 > AT^CHIPTEMP?' + option command 'AT^CHIPTEMP?' + +config custom-commands + option description '重启模组 > AT^RESET' + option command 'AT^RESET' \ No newline at end of file diff --git a/applications/luci-app-modem/root/etc/init.d/modem b/applications/luci-app-modem/root/etc/init.d/modem index edf82a9..3edd093 100755 --- a/applications/luci-app-modem/root/etc/init.d/modem +++ b/applications/luci-app-modem/root/etc/init.d/modem @@ -445,6 +445,8 @@ stop_ecm() fi elif [ "$manufacturer" = "meig" ]; then at_command="AT^NDISDUP=${define_connect},0" + elif [ "$manufacturer" = "huawei" ]; then + at_command="AT^NDISDUP=${define_connect},0" else at_command='ATI' fi @@ -633,13 +635,12 @@ dial() [ -z "${modem_no}" ] && return 0 #获取模组的拨号模式 - local time=0 + local time=20 local mode - while [ $time -lt 10 ]; do + for i in $(seq 1 ${time}); do mode=$(get_mode ${modem_no}) [ -n "$mode" ] && [ "$mode" != "unknown" ] && break sleep 5s - time=$((time+1)) done #获取不到拨号模式 diff --git a/applications/luci-app-modem/root/usr/share/modem/at_commands.json b/applications/luci-app-modem/root/usr/share/modem/at_commands.json index 03ba7e7..023e5cf 100644 --- a/applications/luci-app-modem/root/usr/share/modem/at_commands.json +++ b/applications/luci-app-modem/root/usr/share/modem/at_commands.json @@ -159,6 +159,23 @@ {"获取模组温度 > AT+TEMP":"AT+TEMP"}, {"重启模组 > AT+RESET":"AT+RESET"} ] + }, + "huawei":{ + "hisilicon":[ + {"设置当前使用的为卡1 > AT^SIMSWITCH=1":"AT^SIMSWITCH=1"}, + {"设置当前使用的为卡2 > AT^SIMSWITCH=0":"AT^SIMSWITCH=0"}, + {"查询网络信息 > AT^SYSINFOEX":"AT^SYSINFOEX"}, + {"查询当前拨号模式 > AT^SETMODE?":"AT^SETMODE?"}, + {"ECM拨号模式(Linux) > AT^SETMODE=0":"AT^SETMODE=0"}, + {"NCM拨号模式(Windows) > AT^SETMODE=1":"AT^SETMODE=1"}, + {"ECM拨号模式(Linux,Debug) > AT^SETMODE=2":"AT^SETMODE=2"}, + {"NCM拨号模式(Windows,Debug) > AT^SETMODE=3":"AT^SETMODE=3"}, + {"锁4G > AT^SYSCFGEX=\"03\",40000000,1,2,7FFFFFFFFFFFFFFF,,":"AT^SYSCFGEX=\"03\",40000000,1,2,7FFFFFFFFFFFFFFF,,"}, + {"锁5G > AT^SYSCFGEX=\"08\",40000000,1,2,7FFFFFFFFFFFFFFF,,":"AT^SYSCFGEX=\"08\",40000000,1,2,7FFFFFFFFFFFFFFF,,"}, + {"恢复自动搜索网络 > AT^SYSCFGEX=\"00\",3FFFFFFF,1,2,7FFFFFFFFFFFFFFF,,":"AT^SYSCFGEX=\"00\",3FFFFFFF,1,2,7FFFFFFFFFFFFFFF,,"}, + {"获取模组温度 > AT^CHIPTEMP?":"AT^CHIPTEMP?"}, + {"重启模组 > AT^RESET":"AT^RESET"} + ] } } } \ No newline at end of file diff --git a/applications/luci-app-modem/root/usr/share/modem/fibocom.sh b/applications/luci-app-modem/root/usr/share/modem/fibocom.sh index 57e678b..4008eb0 100755 --- a/applications/luci-app-modem/root/usr/share/modem/fibocom.sh +++ b/applications/luci-app-modem/root/usr/share/modem/fibocom.sh @@ -43,7 +43,7 @@ fibocom_get_dns() #获取DNS地址 at_command="AT+GTDNS=${define_connect}" - local response=$(at ${at_port} ${at_command} | grep "+GTDNS: " | grep -E '[0-9]+.[0-9]+.[0-9]+.[0-9]+' | sed -n '1p') + local response=$(sh ${SCRIPT_DIR}/modem_at.sh ${at_port} ${at_command} | grep "+GTDNS: " | grep -E '[0-9]+.[0-9]+.[0-9]+.[0-9]+' | sed -n '1p') local ipv4_dns1=$(echo "${response}" | awk -F'"' '{print $2}' | awk -F',' '{print $1}') [ -z "$ipv4_dns1" ] && { @@ -203,29 +203,32 @@ fibocom_set_mode() #获取网络偏好 # $1:AT串口 +# $2:数据接口 +# $3:模组名称 fibocom_get_network_prefer() { local at_port="$1" - at_command="AT+GTACT?" - local network_prefer_num=$(sh ${SCRIPT_DIR}/modem_at.sh $at_port $at_command | grep "+GTACT:" | awk -F',' '{print $1}' | sed 's/+GTACT: //g') + local data_interface="$2" + local modem_name="$3" + at_command="AT+GTACT?" + local response=$(sh ${SCRIPT_DIR}/modem_at.sh ${at_port} ${at_command} | grep "+GTACT:" | sed 's/+GTACT: //g') + local network_type_num=$(echo "$response" | awk -F',' '{print $1}') + + #获取网络类型 + # local network_prefer_2g="0"; local network_prefer_3g="0"; local network_prefer_4g="0"; local network_prefer_5g="0"; #匹配不同的网络类型 - case "$network_prefer_num" in + case "$network_type_num" in "1") network_prefer_3g="1" ;; "2") network_prefer_4g="1" ;; "4") network_prefer_3g="1" network_prefer_4g="1" ;; - "10") - network_prefer_3g="1" - network_prefer_4g="1" - network_prefer_5g="1" - ;; "14") network_prefer_5g="1" ;; "16") network_prefer_3g="1" @@ -235,26 +238,37 @@ fibocom_get_network_prefer() network_prefer_4g="1" network_prefer_5g="1" ;; - "20") - network_prefer_3g="1" - network_prefer_4g="1" - network_prefer_5g="1" - ;; - *) + "10"|"20"|*) network_prefer_3g="1" network_prefer_4g="1" network_prefer_5g="1" ;; esac + #获取频段信息 + # local band_2g_info="[]" + local band_3g_info="[]" + local band_4g_info="[]" + local band_5g_info="[]" + + #生成网络偏好 local network_prefer="{ - \"network_prefer\":{ - \"3G\":$network_prefer_3g, - \"4G\":$network_prefer_4g, - \"5G\":$network_prefer_5g - } + \"network_prefer\":[ + {\"3G\":{ + \"enable\":$network_prefer_3g, + \"band\":$band_3g_info + }}, + {\"4G\":{ + \"enable\":$network_prefer_4g, + \"band\":$band_4g_info + }}, + {\"5G\":{ + \"enable\":$network_prefer_5g, + \"band\":$band_5g_info + }} + ] }" - echo "$network_prefer" + echo "${network_prefer}" } #设置网络偏好 @@ -265,41 +279,41 @@ fibocom_set_network_prefer() local at_port="$1" local network_prefer="$2" - #获取网络偏好数字 - local network_prefer_num + #获取网络偏好配置 + local network_prefer_config #获取选中的数量 local count=$(echo "$network_prefer" | grep -o "1" | wc -l) - #获取每个偏好的值 - local network_prefer_3g=$(echo "$network_prefer" | jq -r '.["3G"]') - local network_prefer_4g=$(echo "$network_prefer" | jq -r '.["4G"]') - local network_prefer_5g=$(echo "$network_prefer" | jq -r '.["5G"]') + #获取启用的网络偏好 + local enable_5g=$(echo "$network_prefer" | jq -r '.["5G"].enable') + local enable_4g=$(echo "$network_prefer" | jq -r '.["4G"].enable') + local enable_3g=$(echo "$network_prefer" | jq -r '.["3G"].enable') case "$count" in "1") - if [ "$network_prefer_3g" = "1" ]; then - network_prefer_num="1" - elif [ "$network_prefer_4g" = "1" ]; then - network_prefer_num="2" - elif [ "$network_prefer_5g" = "1" ]; then - network_prefer_num="14" + if [ "$enable_3g" = "1" ]; then + network_prefer_config="1" + elif [ "$enable_4g" = "1" ]; then + network_prefer_config="2" + elif [ "$enable_5g" = "1" ]; then + network_prefer_config="14" fi ;; "2") - if [ "$network_prefer_3g" = "1" ] && [ "$network_prefer_4g" = "1" ]; then - network_prefer_num="4" - elif [ "$network_prefer_3g" = "1" ] && [ "$network_prefer_5g" = "1" ]; then - network_prefer_num="16" - elif [ "$network_prefer_4g" = "1" ] && [ "$network_prefer_5g" = "1" ]; then - network_prefer_num="17" + if [ "$enable_3g" = "1" ] && [ "$enable_4g" = "1" ]; then + network_prefer_config="4" + elif [ "$enable_3g" = "1" ] && [ "$enable_5g" = "1" ]; then + network_prefer_config="16" + elif [ "$enable_4g" = "1" ] && [ "$enable_5g" = "1" ]; then + network_prefer_config="17" fi ;; - "3") network_prefer_num="20" ;; - *) network_prefer_num="10" ;; + "3") network_prefer_config="20" ;; + *) network_prefer_config="10" ;; esac - +echo "$network_prefer_config" >> /root/a #设置模组 - at_command="AT+GTACT=$network_prefer_num" + at_command="AT+GTACT=${network_prefer_config}" sh ${SCRIPT_DIR}/modem_at.sh $at_port "$at_command" } diff --git a/applications/luci-app-modem/root/usr/share/modem/huawei.sh b/applications/luci-app-modem/root/usr/share/modem/huawei.sh new file mode 100644 index 0000000..92dcb0b --- /dev/null +++ b/applications/luci-app-modem/root/usr/share/modem/huawei.sh @@ -0,0 +1,915 @@ +#!/bin/sh +# Copyright (C) 2023 Siriling + +#脚本目录 +SCRIPT_DIR="/usr/share/modem" + +#预设 +huawei_presets() +{ + #关闭模组主动上报 + at_command='AT^CURC=0' + sh "${SCRIPT_DIR}/modem_at.sh" "$at_port" "$at_command" + + #开启5G NA NSA接入 + at_command='AT^C5GOPTION=1,3,3' + sh "${SCRIPT_DIR}/modem_at.sh" "$at_port" "$at_command" +} + +#获取DNS +# $1:AT串口 +# $2:连接定义 +huawei_get_dns() +{ + local at_port="$1" + local define_connect="$2" + + [ -z "$define_connect" ] && { + define_connect="1" + } + + local public_dns1_ipv4="223.5.5.5" + local public_dns2_ipv4="119.29.29.29" + local public_dns1_ipv6="2400:3200::1" #下一代互联网北京研究中心:240C::6666,阿里:2400:3200::1,腾讯:2402:4e00:: + local public_dns2_ipv6="2402:4e00::" + + #获取DNS地址(IPv4) + at_command="AT^DHCP=${define_connect}" + local response=$(sh ${SCRIPT_DIR}/modem_at.sh ${at_port} ${at_command} | grep "\^DHCP:" | sed -n '1p') + + local ipv4_dns1=$(echo "${response}" | awk -F',' '{print $5}') + if [ -z "$ipv4_dns1" ]; then + ipv4_dns1="${public_dns1_ipv4}" + else + #按字节(byte)将十六进制拆分并转换为对应的十进制表示 + ipv4_dns1=$(echo "$ipv4_dns1" | awk '{ + for (i = length; i >= 1; i -= 2) { + printf "%d.", "0x" substr($0, i-1, 2) + } + }') + ipv4_dns1="${ipv4_dns1%?}" + fi + + local ipv4_dns2=$(echo "${response}" | awk -F',' '{print $6}') + if [ -z "$ipv4_dns2" ]; then + ipv4_dns2="${public_dns1_ipv4}" + else + #按字节(byte)将十六进制拆分并转换为对应的十进制表示 + ipv4_dns2=$(echo "$ipv4_dns2" | awk '{ + for (i = length; i >= 1; i -= 2) { + printf "%d.", "0x" substr($0, i-1, 2) + } + }') + ipv4_dns2="${ipv4_dns2%?}" + fi + + #获取DNS地址(IPv6) + at_command="AT^DHCPV6=${define_connect}" + local response=$(sh ${SCRIPT_DIR}/modem_at.sh ${at_port} ${at_command} | grep "\^DHCPV6:" | sed -n '1p') + + local ipv6_dns1=$(echo "${response}" | awk -F',' '{print $5}') + [ -z "$ipv6_dns1" ] && { + ipv6_dns1="${public_dns1_ipv6}" + } + + local ipv6_dns2=$(echo "${response}" | awk -F',' '{print $6}') + [ -z "$ipv6_dns2" ] && { + ipv6_dns2="${public_dns2_ipv6}" + } + + dns="{ + \"dns\":{ + \"ipv4_dns1\":\"$ipv4_dns1\", + \"ipv4_dns2\":\"$ipv4_dns2\", + \"ipv6_dns1\":\"$ipv6_dns1\", + \"ipv6_dns2\":\"$ipv6_dns2\" + } + }" + + echo "$dns" +} + +#获取拨号模式 +# $1:AT串口 +# $2:平台 +huawei_get_mode() +{ + local at_port="$1" + local platform="$2" + + at_command="AT^SETMODE?" + local mode_num=$(sh ${SCRIPT_DIR}/modem_at.sh ${at_port} ${at_command} | grep "\^SETMODE:" | awk -F': ' '{print $2}' | sed 's/\r//g') + + if [ -z "$mode_num" ]; then + echo "unknown" + return + fi + + #获取芯片平台 + if [ -z "$platform" ]; then + local modem_number=$(uci -q get modem.@global[0].modem_number) + for i in $(seq 0 $((modem_number-1))); do + local at_port_tmp=$(uci -q get modem.modem$i.at_port) + if [ "$at_port" = "$at_port_tmp" ]; then + platform=$(uci -q get modem.modem$i.platform) + break + fi + done + fi + + local mode + case "$platform" in + "hisilicon") + case "$mode_num" in + "0"|"2") mode="ecm" ;; + "1"|"3") mode="ncm" ;; + "4") mode="unknown" ;; + *) mode="$mode_num" ;; + esac + ;; + *) + mode="$mode_num" + ;; + esac + echo "${mode}" +} + +#设置拨号模式 +# $1:AT串口 +# $2:拨号模式配置 +huawei_set_mode() +{ + local at_port="$1" + local mode_config="$2" + + #获取芯片平台 + local platform + local modem_number=$(uci -q get modem.@global[0].modem_number) + for i in $(seq 0 $((modem_number-1))); do + local at_port_tmp=$(uci -q get modem.modem$i.at_port) + if [ "$at_port" = "$at_port_tmp" ]; then + platform=$(uci -q get modem.modem$i.platform) + break + fi + done + + #获取拨号模式配置 + local mode_num + case "$platform" in + "hisilicon") + case "$mode_config" in + "ecm") mode_num="0" ;; + *) mode_num="0" ;; + esac + ;; + *) + mode_num="0" + ;; + esac + + #设置模组 + at_command="AT^SETMODE=${mode_num}" + sh ${SCRIPT_DIR}/modem_at.sh ${at_port} "${at_command}" +} + +#获取位 +# $1:频段名称 +huawei_get_bit() +{ + local band_name="$1" + + local bit + case "$band_name" in + "DCS_1800") bit="8" ;; + "E-GSM_900"|"E_GSM_900") bit="9" ;; + "P-GSM_900"|"P_GSM_900") bit="10" ;; + "GSM_450") bit="17" ;; + "GSM_480") bit="18" ;; + "GSM_750") bit="19" ;; + "GSM_850") bit="20" ;; + "R-GSM_900"|"R_GSM_900") bit="21" ;; + "PCS_1900") bit="22" ;; + esac + + echo "${bit}" +} + +#获取频段信息 +# $1:频段二进制数 +# $2:支持的频段 +# $3:频段类型(2G,3G,4G,5G) +huawei_get_band_info() +{ + local band_bin="$1" + local support_band="$2" + local band_type="$3" + + local band_info="" + local support_band=$(echo "$support_band" | sed 's/,/ /g') + if [ "$band_type" = "2G" ]; then + + for band in $support_band; do + #获取bit位 + local bit=$(huawei_get_bit ${band}) + #获取值 + local enable="${band_bin: $((-bit)):1}" + [ -z "$enable" ] && enable="0" + #设置频段信息 + # band_info=$(echo ${band_info} | jq '. += [{"'$band'":'$enable'}]') + band_info="${band_info},{\"$band\":$enable}" + done + else + #频段频段起始,前缀位置 + local start_bit + local band_prefix + case "$band_type" in + "3G") + start_bit="23" + band_prefix="WCDMA_B" + ;; + "4G") + start_bit="1" + band_prefix="LTE_BC" + ;; + "5G") + start_bit="1" + band_prefix="NR5G_N" + ;; + esac + + for band in $support_band; do + #获取值(从start_bit位开始) + local enable="${band_bin: $((-band-start_bit+1)):1}" + [ -z "$enable" ] && enable="0" + #设置频段信息 + # band_info=$(echo ${band_info} | jq '. += [{'$band_prefix$band':'$enable'}]') + band_info="${band_info},{\"$band_prefix$band\":$enable}" + done + fi + #去掉第一个, + band_info="["${band_info/,/}"]" + # band_info="[${band_info%?}]" + + echo "${band_info}" +} + +#获取网络偏好 +# $1:AT串口 +# $2:数据接口 +# $3:模组名称 +huawei_get_network_prefer() +{ + local at_port="$1" + local data_interface="$2" + local modem_name="$3" + + at_command="AT^SYSCFGEX?" + local response=$(sh ${SCRIPT_DIR}/modem_at.sh ${at_port} ${at_command} | grep "\^SYSCFGEX:" | sed 's/\^SYSCFGEX://g') + local network_type_num=$(echo "$response" | awk -F'"' '{print $2}') + + #获取网络类型 + local network_prefer_2g="0"; + local network_prefer_3g="0"; + local network_prefer_4g="0"; + local network_prefer_5g="0"; + + #匹配不同的网络类型 + local auto=$(echo "${network_type_num}" | grep "00") + if [ -n "$auto" ]; then + network_prefer_2g="1" + network_prefer_3g="1" + network_prefer_4g="1" + network_prefer_5g="1" + else + local gsm=$(echo "${network_type_num}" | grep "01") + local wcdma=$(echo "${network_type_num}" | grep "02") + local lte=$(echo "${network_type_num}" | grep "03") + local nr=$(echo "${network_type_num}" | grep "08") + if [ -n "$gsm" ]; then + network_prefer_2g="1" + fi + if [ -n "$wcdma" ]; then + network_prefer_3g="1" + fi + if [ -n "$lte" ]; then + network_prefer_4g="1" + fi + if [ -n "$nr" ]; then + network_prefer_5g="1" + fi + fi + + #获取模组信息 + local modem_info=$(jq '.modem_support.'$data_interface'."'$modem_name'"' ${SCRIPT_DIR}/modem_support.json) + + #获取模组支持的频段 + local support_2g_band=$(echo "$modem_info" | jq -r '.band_2g') + local support_3g_band=$(echo "$modem_info" | jq -r '.band_3g') + local support_4g_band=$(echo "$modem_info" | jq -r '.band_4g') + local support_5g_band=$(echo "$modem_info" | jq -r '.band_5g') + + #获取频段信息 + local band_hex_2g_3g=$(echo "$response" | awk -F',' '{print $2}') + #十六进制转二进制 + local bin_2g_3g=$(echo "obase=2; ibase=16; $band_hex_2g_3g" | bc) + local band_2g_info=$(huawei_get_band_info "${bin_2g_3g}" "${support_2g_band}" "2G") + local band_3g_info=$(huawei_get_band_info "${bin_2g_3g}" "${support_3g_band}" "3G") + + local band_hex_4g_5g=$(echo "$response" | awk -F',' '{print $5}' | sed 's/\r//g') + #十六进制转二进制 + local bin_4g_5g=$(echo "obase=2; ibase=16; $band_hex_4g_5g" | bc) + local band_4g_info=$(huawei_get_band_info "${bin_4g_5g}" "${support_4g_band}" "4G") + local band_5g_info=$(huawei_get_band_info "${bin_4g_5g}" "${support_5g_band}" "5G") + + #生成网络偏好 + local network_prefer="{ + \"network_prefer\":[ + {\"2G\":{ + \"enable\":$network_prefer_2g, + \"band\":$band_2g_info + }}, + {\"3G\":{ + \"enable\":$network_prefer_3g, + \"band\":$band_3g_info + }}, + {\"4G\":{ + \"enable\":$network_prefer_4g, + \"band\":$band_4g_info + }}, + {\"5G\":{ + \"enable\":$network_prefer_5g, + \"band\":$band_5g_info + }} + ] + }" + echo "${network_prefer}" +} + +#设置网络偏好 +# $1:AT串口 +# $2:网络偏好配置 +huawei_set_network_prefer() +{ + local at_port="$1" + local network_prefer="$2" + + #获取启用的网络偏好 + local enable_5g=$(echo "$network_prefer" | jq -r '.["5G"].enable') + local enable_4g=$(echo "$network_prefer" | jq -r '.["4G"].enable') + local enable_3g=$(echo "$network_prefer" | jq -r '.["3G"].enable') + local enable_2g=$(echo "$network_prefer" | jq -r '.["2G"].enable') + + #获取网络偏好配置 + local network_prefer_config + [ "$enable_5g" = "1" ] && network_prefer_config="${network_prefer_config}08" + [ "$enable_4g" = "1" ] && network_prefer_config="${network_prefer_config}03" + [ "$enable_3g" = "1" ] && network_prefer_config="${network_prefer_config}02" + [ "$enable_2g" = "1" ] && network_prefer_config="${network_prefer_config}01" + + [ -z "$network_prefer_config" ] && network_prefer_config="99" + + #设置模组 + at_command='AT^SYSCFGEX="'${network_prefer_config}'",40000000,1,2,40000000,,' + sh ${SCRIPT_DIR}/modem_at.sh "${at_port}" "${at_command}" +} + +#设置频段 +# $1:AT串口 +# $2:频段偏好配置 +huawei_set_band_prefer() +{ + local at_port="$1" + local network_prefer="$2" + + #获取选中的数量 + local count=$(echo "$network_prefer" | grep -o "1" | wc -l) + #获取每个偏好的值 + local network_prefer_5g=$(echo "$network_prefer" | jq -r '.["5G"]') + local network_prefer_4g=$(echo "$network_prefer" | jq -r '.["4G"]') + local network_prefer_3g=$(echo "$network_prefer" | jq -r '.["3G"]') + local network_prefer_2g=$(echo "$network_prefer" | jq -r '.["2G"]') + + #获取启用的网络偏好 + local enable_5g=$(echo "$network_prefer_5g" | jq -r '.enable') + local enable_4g=$(echo "$network_prefer_4g" | jq -r '.enable') + local enable_3g=$(echo "$network_prefer_3g" | jq -r '.enable') + local enable_2g=$(echo "$network_prefer_2g" | jq -r '.enable') + + #获取网络偏好配置和频段偏好配置 + local network_prefer_config + local band_hex_2g_3g=0 + local band_hex_4g_5g=0 + + [ "$enable_5g" = "1" ] && { + network_prefer_config="${network_prefer_config}08" + local band_tmp=$(echo "$network_prefer_5g" | jq -r '.band[]') + + local i=0 + local bands=$(echo "$band_tmp" | jq -r 'to_entries | .[] | .key') + #遍历band的值 + for band in $bands; do + local value=$(echo "$network_prefer_5g" | jq -r '.band'"[$i].$band") + [ "$value" = "1" ] && { + #获取bit位 + local bit=$(echo "$band" | sed 's/NR5G_N//g') + #获取值 + local result=$(echo "obase=16; ibase=10; 2^($bit-1)" | bc) + band_hex_4g_5g=$(echo "obase=16; ibase=16; $band_hex_4g_5g + $result" | bc) + } + i=$((i+1)) + done + } + + [ "$enable_4g" = "1" ] && { + network_prefer_config="${network_prefer_config}03" + local band_tmp=$(echo "$network_prefer_4g" | jq -r '.band[]') + + local i=0 + local bands=$(echo "$band_tmp" | jq -r 'to_entries | .[] | .key') + #遍历band的值 + for band in $bands; do + local value=$(echo "$network_prefer_4g" | jq -r '.band'"[$i].$band") + [ "$value" = "1" ] && { + #获取bit位 + local bit=$(echo "$band" | sed 's/LTE_BC//g') + #获取值 + local result=$(echo "obase=16; ibase=10; 2^($bit-1)" | bc) + band_hex_4g_5g=$(echo "obase=16; ibase=16; $band_hex_4g_5g + $result" | bc) + } + i=$((i+1)) + done + } + + [ "$enable_3g" = "1" ] && { + network_prefer_config="${network_prefer_config}02" + local band_tmp=$(echo "$network_prefer_3g" | jq -r '.band[]') + + local i=0 + local bands=$(echo "$band_tmp" | jq -r 'to_entries | .[] | .key') + #遍历band的值 + for band in $bands; do + local value=$(echo "$network_prefer_3g" | jq -r '.band'"[$i].$band") + [ "$value" = "1" ] && { + #获取bit位 + local bit=$(echo "$band" | sed 's/WCDMA_B//g') + #获取值 + local result=$(echo "obase=16; ibase=10; 2^($bit+22-1)" | bc) + band_hex_2g_3g=$(echo "obase=16; ibase=16; $band_hex_2g_3g + $result" | bc) + } + i=$((i+1)) + done + } + + [ "$enable_2g" = "1" ] && { + network_prefer_config="${network_prefer_config}01" + local band_tmp=$(echo "$network_prefer_2g" | jq -r '.band[]') + + local i=0 + local bands=$(echo "$band_tmp" | jq -r 'to_entries | .[] | .key') + #遍历band的值 + for band in $bands; do + # band_format=$(echo "$band" | sed 's/-/_/g') + local value=$(echo "$network_prefer_2g" | jq -r '.band'"[$i].$band") + [ "$value" = "1" ] && { + #获取bit位 + local bit=$(huawei_get_bit ${band}) + #获取值 + local result=$(echo "obase=16; ibase=10; 2^($bit-1)" | bc) + band_hex_2g_3g=$(echo "obase=16; ibase=16; $band_hex_2g_3g + $result" | bc) + } + i=$((i+1)) + done + } + + [ -z "$network_prefer_config" ] && network_prefer_config="99" + + #设置模组 + at_command='AT^SYSCFGEX="'${network_prefer_config}'",'"${band_hex_2g_3g},1,2,${band_hex_4g_5g},," + sh ${SCRIPT_DIR}/modem_at.sh "${at_port}" "${at_command}" +} + +#获取电压 +# $1:AT串口 +huawei_get_voltage() +{ + local at_port="$1" + + # #Voltage(电压) + # at_command="AT+ADCREAD=0" + # local voltage=$(sh ${SCRIPT_DIR}/modem_at.sh $at_port $at_command | grep "+ADCREAD:" | awk -F' ' '{print $2}' | sed 's/\r//g') + # voltage=$(awk "BEGIN{ printf \"%.2f\", $voltage / 1000000 }" | sed 's/\.*0*$//') + # echo "${voltage}" +} + +#获取温度 +# $1:AT串口 +huawei_get_temperature() +{ + local at_port="$1" + + #Temperature(温度) + at_command="AT^CHIPTEMP?" + response=$(sh ${SCRIPT_DIR}/modem_at.sh $at_port $at_command | grep "\^CHIPTEMP" | awk -F',' '{print $6}' | sed 's/\r//g') + + local temperature + if [ -n "$response" ]; then + response=$(awk "BEGIN{ printf \"%.2f\", $response / 10 }" | sed 's/\.*0*$//') + temperature="${response}$(printf "\xc2\xb0")C" + else + temperature="NaN $(printf "\xc2\xb0")C" + fi + + echo "${temperature}" +} + +#获取连接状态 +# $1:AT串口 +# $2:连接定义 +huawei_get_connect_status() +{ + local at_port="$1" + local define_connect="$2" + + #默认值为1 + [ -z "$define_connect" ] && { + define_connect="1" + } + + at_command="AT+CGPADDR=${define_connect}" + local ipv4=$(sh ${SCRIPT_DIR}/modem_at.sh ${at_port} ${at_command} | grep "+CGPADDR: " | awk -F'"' '{print $2}') + local not_ip="0.0.0.0" + + #设置连接状态 + local connect_status + if [ -z "$ipv4" ] || [[ "$ipv4" = *"$not_ip"* ]]; then + connect_status="disconnect" + else + connect_status="connect" + fi + + echo "${connect_status}" +} + +#基本信息 +huawei_base_info() +{ + debug "Huawei base info" + + #Name(名称) + at_command="AT+CGMM" + name=$(sh ${SCRIPT_DIR}/modem_at.sh $at_port $at_command | grep "+CGMM: " | awk -F': ' '{print $2}' | sed 's/\r//g') + #Manufacturer(制造商) + at_command="AT+CGMI" + manufacturer=$(sh ${SCRIPT_DIR}/modem_at.sh $at_port $at_command | sed -n '2p' | sed 's/\r//g') + #Revision(固件版本) + at_command="AT+CGMR" + revision=$(sh ${SCRIPT_DIR}/modem_at.sh $at_port $at_command | sed -n '2p' | sed 's/\r//g') + + #Mode(拨号模式) + mode=$(huawei_get_mode ${at_port} ${platform} | tr 'a-z' 'A-Z') + + #Temperature(温度) + temperature=$(huawei_get_temperature ${at_port}) +} + +#获取SIM卡状态 +# $1:SIM卡状态标志 +huawei_get_sim_status() +{ + local sim_status + case $1 in + "") sim_status="miss" ;; + *"ERROR"*) sim_status="miss" ;; + *"READY"*) sim_status="ready" ;; + *"SIM PIN"*) sim_status="MT is waiting SIM PIN to be given" ;; + *"SIM PUK"*) sim_status="MT is waiting SIM PUK to be given" ;; + *"PH-FSIM PIN"*) sim_status="MT is waiting phone-to-SIM card password to be given" ;; + *"PH-FSIM PIN"*) sim_status="MT is waiting phone-to-very first SIM card password to be given" ;; + *"PH-FSIM PUK"*) sim_status="MT is waiting phone-to-very first SIM card unblocking password to be given" ;; + *"SIM PIN2"*) sim_status="MT is waiting SIM PIN2 to be given" ;; + *"SIM PUK2"*) sim_status="MT is waiting SIM PUK2 to be given" ;; + *"PH-NET PIN"*) sim_status="MT is waiting network personalization password to be given" ;; + *"PH-NET PUK"*) sim_status="MT is waiting network personalization unblocking password to be given" ;; + *"PH-NETSUB PIN"*) sim_status="MT is waiting network subset personalization password to be given" ;; + *"PH-NETSUB PUK"*) sim_status="MT is waiting network subset personalization unblocking password to be given" ;; + *"PH-SP PIN"*) sim_status="MT is waiting service provider personalization password to be given" ;; + *"PH-SP PUK"*) sim_status="MT is waiting service provider personalization unblocking password to be given" ;; + *"PH-CORP PIN"*) sim_status="MT is waiting corporate personalization password to be given" ;; + *"PH-CORP PUK"*) sim_status="MT is waiting corporate personalization unblocking password to be given" ;; + *) sim_status="unknown" ;; + esac + echo "${sim_status}" +} + +#SIM卡信息 +huawei_sim_info() +{ + debug "Huawei sim info" + + #SIM Slot(SIM卡卡槽) + # at_command="AT^SIMSLOT?" + # response=$(sh ${SCRIPT_DIR}/modem_at.sh ${at_port} ${at_command} | grep "\^SIMSLOT:" | awk -F': ' '{print $2}' | awk -F',' '{print $2}') + + # if [ "$response" != "0" ]; then + # sim_slot="1" + # else + # sim_slot="2" + # fi + sim_slot="1" + + #IMEI(国际移动设备识别码) + at_command="AT+CGSN" + imei=$(sh ${SCRIPT_DIR}/modem_at.sh ${at_port} ${at_command} | sed -n '2p' | sed 's/\r//g') + + #SIM Status(SIM状态) + at_command="AT+CPIN?" + sim_status_flag=$(sh ${SCRIPT_DIR}/modem_at.sh ${at_port} ${at_command} | grep "+CPIN: ") + sim_status=$(huawei_get_sim_status "$sim_status_flag") + + if [ "$sim_status" != "ready" ]; then + return + fi + + #ISP(互联网服务提供商) + at_command="AT+COPS?" + isp=$(sh ${SCRIPT_DIR}/modem_at.sh ${at_port} ${at_command} | grep "+COPS" | awk -F'"' '{print $2}') + # if [ "$isp" = "CHN-CMCC" ] || [ "$isp" = "CMCC" ]|| [ "$isp" = "46000" ]; then + # isp="中国移动" + # elif [ "$isp" = "CHN-UNICOM" ] || [ "$isp" = "UNICOM" ] || [ "$isp" = "46001" ]; then + # isp="中国联通" + # elif [ "$isp" = "CHN-CT" ] || [ "$isp" = "CT" ] || [ "$isp" = "46011" ]; then + # isp="中国电信" + # fi + + #SIM Number(SIM卡号码,手机号) + at_command="AT+CNUM" + sim_number=$(sh ${SCRIPT_DIR}/modem_at.sh ${at_port} ${at_command} | grep "+CNUM: " | awk -F'"' '{print $2}') + [ -z "$sim_number" ] && { + sim_number=$(sh ${SCRIPT_DIR}/modem_at.sh ${at_port} ${at_command} | grep "+CNUM: " | awk -F'"' '{print $4}') + } + + #IMSI(国际移动用户识别码) + at_command="AT+CIMI" + imsi=$(sh ${SCRIPT_DIR}/modem_at.sh $at_port $at_command | sed -n '2p' | sed 's/\r//g') + + #ICCID(集成电路卡识别码) + at_command="AT+ICCID" + iccid=$(sh ${SCRIPT_DIR}/modem_at.sh ${at_port} ${at_command} | grep -o "+ICCID:[ ]*[-0-9]\+" | grep -o "[-0-9]\{1,4\}") +} + +#获取网络类型 +# $1:网络类型数字 +huawei_get_rat() +{ + local rat + case $1 in + "0"|"1"|"3"|"8") rat="GSM" ;; + "2"|"4"|"5"|"6"|"9"|"10") rat="WCDMA" ;; + "7") rat="LTE" ;; + "11"|"12") rat="NR" ;; + esac + echo "${rat}" +} + +#获取信号强度指示(4G) +# $1:信号强度指示数字 +huawei_get_rssi() +{ + local rssi + case $1 in + "99") rssi="unknown" ;; + * ) rssi=$((2 * $1 - 113)) ;; + esac + echo "$rssi" +} + +#网络信息 +huawei_network_info() +{ + debug "Huawei network info" + + #Connect Status(连接状态) + connect_status=$(huawei_get_connect_status ${at_port} ${define_connect}) + if [ "$connect_status" != "connect" ]; then + return + fi + + #Network Type(网络类型) + at_command="AT^SYSINFOEX" + network_type=$(sh ${SCRIPT_DIR}/modem_at.sh ${at_port} ${at_command} | grep "\^SYSINFOEX:" | awk -F'"' '{print $4}') + + [ -z "$network_type" ] && { + at_command='AT+COPS?' + local rat_num=$(sh ${SCRIPT_DIR}/modem_at.sh ${at_port} ${at_command} | grep "+COPS:" | awk -F',' '{print $4}' | sed 's/\r//g') + network_type=$(huawei_get_rat ${rat_num}) + } + + #设置网络类型为5G时,信号强度指示用RSRP代替 + # at_command="AT+GTCSQNREN=1" + # sh ${SCRIPT_DIR}/modem_at.sh $at_port $at_command + + #CSQ(信号强度) + at_command="AT+CSQ" + response=$(sh ${SCRIPT_DIR}/modem_at.sh $at_port $at_command | grep "+CSQ:" | sed 's/+CSQ: //g' | sed 's/\r//g') + + #RSSI(4G信号强度指示) + # rssi_num=$(echo $response | awk -F',' '{print $1}') + # rssi=$(huawei_get_rssi $rssi_num) + #BER(4G信道误码率) + # ber=$(echo $response | awk -F',' '{print $2}') + + # #PER(信号强度) + # if [ -n "$csq" ]; then + # per=$(($csq * 100/31))"%" + # fi + + #AMBR(最大比特率) + at_command="AT^DHCP?" + response=$(sh ${SCRIPT_DIR}/modem_at.sh $at_port $at_command | grep "\^DHCP:" | sed 's/\^DHCP: //g' | sed 's/\r//g') + ambr_ul_tmp=$(echo "$response" | awk -F',' '{print $8}') + ambr_dl_tmp=$(echo "$response" | awk -F',' '{print $7}') + + [ -z "$ambr_ul_tmp" ] && { + at_command="AT^DHCPV6?" + response=$(sh ${SCRIPT_DIR}/modem_at.sh $at_port $at_command | grep "\^DHCPV6:" | sed 's/\^DHCPV6: //g' | sed 's/\r//g') + ambr_ul_tmp=$(echo "$response" | awk -F',' '{print $8}') + ambr_dl_tmp=$(echo "$response" | awk -F',' '{print $7}') + } + + #AMBR UL(上行签约速率,单位,Mbps) + ambr_ul=$(awk "BEGIN{ printf \"%.2f\", $ambr_ul_tmp / 1000000 }" | sed 's/\.*0*$//') + #AMBR DL(下行签约速率,单位,Mbps) + ambr_dl=$(awk "BEGIN{ printf \"%.2f\", $ambr_dl_tmp / 1000000 }" | sed 's/\.*0*$//') + + # #速率统计 + # at_command='AT^DSFLOWQRY' + # response=$(sh ${SCRIPT_DIR}/modem_at.sh $at_port $at_command | grep "\^DSFLOWRPT:" | sed 's/\^DSFLOWRPT: //g' | sed 's/\r//g') + + # #当前上传速率(单位,Byte/s) + # tx_rate=$(echo $response | awk -F',' '{print $1}') + + # #当前下载速率(单位,Byte/s) + # rx_rate=$(echo $response | awk -F',' '{print $2}') +} + +#获取NR子载波间隔 +# $1:NR子载波间隔数字 +huawei_get_scs() +{ + local scs + case $1 in + "0") scs="15" ;; + "1") scs="30" ;; + "2") scs="60" ;; + "3") scs="120" ;; + "4") scs="240" ;; + *) scs=$(awk "BEGIN{ print 2^$1 * 15 }") ;; + esac + echo "$scs" +} + +#获取频段 +# $1:网络类型 +# $2:频段数字 +huawei_get_band() +{ + local band + case $1 in + "GSM") + case $2 in + "0") band="850" ;; + "1") band="900" ;; + "2") band="1800" ;; + "3") band="1900" ;; + esac + ;; + "WCDMA") band="$2" ;; + "LTE") band="$(($2-100))" ;; + "NR") band="$2" band="${band#*50}" ;; + esac + echo "$band" +} + +#小区信息 +huawei_cell_info() +{ + debug "Huawei cell info" + + at_command="AT^MONSC" + response=$(sh ${SCRIPT_DIR}/modem_at.sh $at_port $at_command | grep "\^MONSC:" | sed 's/\^MONSC: //') + + local rat=$(echo "$response" | awk -F',' '{print $1}') + + case $rat in + "NR") + network_mode="NR5G-SA Mode" + nr_mcc=$(echo "$response" | awk -F',' '{print $2}') + nr_mnc=$(echo "$response" | awk -F',' '{print $3}') + nr_arfcn=$(echo "$response" | awk -F',' '{print $4}') + nr_scs_num=$(echo "$response" | awk -F',' '{print $5}') + nr_scs=$(huawei_get_scs ${nr_scs_num}) + nr_cell_id=$(echo "$response" | awk -F',' '{print $6}') + nr_physical_cell_id=$(echo "$response" | awk -F',' '{print $7}') + nr_tac=$(echo "$response" | awk -F',' '{print $8}') + nr_rsrp=$(echo "$response" | awk -F',' '{print $9}') + nr_rsrq=$(echo "$response" | awk -F',' '{print $10}') + nr_sinr=$(echo "$response" | awk -F',' '{print $11}' | sed 's/\r//g') + ;; + "LTE-NR") + network_mode="EN-DC Mode" + #LTE + endc_lte_mcc=$(echo "$response" | awk -F',' '{print $2}') + endc_lte_mnc=$(echo "$response" | awk -F',' '{print $3}') + endc_lte_earfcn=$(echo "$response" | awk -F',' '{print $4}') + endc_lte_cell_id=$(echo "$response" | awk -F',' '{print $5}') + endc_lte_physical_cell_id=$(echo "$response" | awk -F',' '{print $6}') + endc_lte_tac=$(echo "$response" | awk -F',' '{print $7}') + endc_lte_rsrp=$(echo "$response" | awk -F',' '{print $8}') + endc_lte_rsrq=$(echo "$response" | awk -F',' '{print $9}') + endc_lte_rxlev=$(echo "$response" | awk -F',' '{print $10}' | sed 's/\r//g') + #NR5G-NSA + endc_nr_mcc=$(echo "$response" | awk -F',' '{print $2}') + endc_nr_mnc=$(echo "$response" | awk -F',' '{print $3}') + endc_nr_arfcn=$(echo "$response" | awk -F',' '{print $4}') + endc_nr_scs_num=$(echo "$response" | awk -F',' '{print $5}') + endc_nr_scs=$(huawei_get_scs ${nr_scs_num}) + endc_nr_cell_id=$(echo "$response" | awk -F',' '{print $6}') + endc_nr_physical_cell_id=$(echo "$response" | awk -F',' '{print $7}') + endc_nr_tac=$(echo "$response" | awk -F',' '{print $8}') + endc_nr_rsrp=$(echo "$response" | awk -F',' '{print $9}') + endc_nr_rsrq=$(echo "$response" | awk -F',' '{print $10}') + endc_nr_sinr=$(echo "$response" | awk -F',' '{print $11}' | sed 's/\r//g') + ;; + "LTE"|"eMTC"|"NB-IoT") + network_mode="LTE Mode" + lte_mcc=$(echo "$response" | awk -F',' '{print $2}') + lte_mnc=$(echo "$response" | awk -F',' '{print $3}') + lte_earfcn=$(echo "$response" | awk -F',' '{print $4}') + lte_cell_id=$(echo "$response" | awk -F',' '{print $5}') + lte_physical_cell_id=$(echo "$response" | awk -F',' '{print $6}') + lte_tac=$(echo "$response" | awk -F',' '{print $7}') + lte_rsrp=$(echo "$response" | awk -F',' '{print $8}') + lte_rsrq=$(echo "$response" | awk -F',' '{print $9}') + lte_rxlev=$(echo "$response" | awk -F',' '{print $10}' | sed 's/\r//g') + ;; + "WCDMA"|"TD-SCDMA"|"UMTS") + network_mode="WCDMA Mode" + wcdma_mcc=$(echo "$response" | awk -F',' '{print $2}') + wcdma_mnc=$(echo "$response" | awk -F',' '{print $3}') + wcdma_arfcn=$(echo "$response" | awk -F',' '{print $4}') + wcdma_psc=$(echo "$response" | awk -F',' '{print $5}') + wcdma_cell_id=$(echo "$response" | awk -F',' '{print $6}') + wcdma_lac=$(echo "$response" | awk -F',' '{print $7}') + wcdma_rscp=$(echo "$response" | awk -F',' '{print $8}') + wcdma_rxlev=$(echo "$response" | awk -F',' '{print $9}') + wcdma_ecn0=$(echo "$response" | awk -F',' '{print $10}') + wcdma_drx=$(echo "$response" | awk -F',' '{print $11}') + wcdma_ura=$(echo "$response" | awk -F',' '{print $12}' | sed 's/\r//g') + ;; + "GSM") + network_mode="GSM Mode" + gsm_mcc=$(echo "$response" | awk -F',' '{print $2}') + gsm_mnc=$(echo "$response" | awk -F',' '{print $3}') + gsm_band_num=$(echo "$response" | awk -F',' '{print $4}') + gsm_band=$(huawei_get_band "GSM" ${gsm_band_num}) + gsm_arfcn=$(echo "$response" | awk -F',' '{print $5}') + gsm_bsic=$(echo "$response" | awk -F',' '{print $6}') + gsm_cell_id=$(echo "$response" | awk -F',' '{print $7}') + gsm_lac=$(echo "$response" | awk -F',' '{print $8}') + gsm_rxlev=$(echo "$response" | awk -F',' '{print $9}') + gsm_rx_quality=$(echo "$response" | awk -F',' '{print $10}') + gsm_ta=$(echo "$response" | awk -F',' '{print $11}' | sed 's/\r//g') + ;; + esac +} + +#获取华为模组信息 +# $1:AT串口 +# $2:平台 +# $3:连接定义 +get_huawei_info() +{ + debug "get huawei info" + #设置AT串口 + at_port="$1" + platform="$2" + define_connect="$3" + + #基本信息 + huawei_base_info + + #SIM卡信息 + huawei_sim_info + if [ "$sim_status" != "ready" ]; then + return + fi + + #网络信息 + huawei_network_info + if [ "$connect_status" != "connect" ]; then + return + fi + + #小区信息 + huawei_cell_info +} \ No newline at end of file diff --git a/applications/luci-app-modem/root/usr/share/modem/meig.sh b/applications/luci-app-modem/root/usr/share/modem/meig.sh index f832eb5..adb73cb 100755 --- a/applications/luci-app-modem/root/usr/share/modem/meig.sh +++ b/applications/luci-app-modem/root/usr/share/modem/meig.sh @@ -35,7 +35,7 @@ meig_get_dns() #获取DNS地址 at_command="AT+CGCONTRDP=${define_connect}" - local response=$(at ${at_port} ${at_command} | grep "+CGCONTRDP: " | grep -E '[0-9]+.[0-9]+.[0-9]+.[0-9]+' | sed -n '1p') + local response=$(sh ${SCRIPT_DIR}/modem_at.sh ${at_port} ${at_command} | grep "+CGCONTRDP: " | grep -E '[0-9]+.[0-9]+.[0-9]+.[0-9]+' | sed -n '1p') local ipv4_dns1=$(echo "${response}" | awk -F',' '{print $7}' | awk -F' ' '{print $1}') [ -z "$ipv4_dns1" ] && { @@ -161,28 +161,122 @@ meig_set_mode() sh ${SCRIPT_DIR}/modem_at.sh ${at_port} "${at_command}" } +#获取位 +# $1:频段名称 +meig_get_bit() +{ + local band_name="$1" + + local bit + case "$band_name" in + "DCS_1800") bit="8" ;; + "E-GSM_900") bit="9" ;; + "P-GSM_900") bit="10" ;; + "GSM_450") bit="17" ;; + "GSM_480") bit="18" ;; + "GSM_750") bit="19" ;; + "GSM_850") bit="20" ;; + "R-GSM_900") bit="21" ;; + "PCS_1900") bit="22" ;; + esac + + echo "${bit}" +} + +#获取频段信息 +# $1:频段二进制数 +# $2:支持的频段 +# $3:频段类型(2G,3G,4G,5G) +meig_get_band_info() +{ + local band_bin="$1" + local support_band="$2" + local band_type="$3" + + local band_info="" + local support_band=$(echo "$support_band" | sed 's/,/ /g') + if [ "$band_type" = "2G" ]; then + + for band in $support_band; do + #获取bit位 + local bit=$(meig_get_bit ${band}) + #获取值 + local enable="${band_bin: $((-bit)):1}" + [ -z "$enable" ] && enable="0" + #设置频段信息 + # band_info=$(echo ${band_info} | jq '. += [{"'$band'":'$enable'}]') + band_info="${band_info},{\"$band\":$enable}" + done + else + #频段频段起始,前缀位置 + local start_bit + local band_prefix + case "$band_type" in + "3G") + start_bit="23" + band_prefix="WCDMA_B" + ;; + "4G") + start_bit="1" + band_prefix="LTE_BC" + ;; + "5G") + start_bit="1" + band_prefix="NR5G_N" + ;; + esac + + for band in $support_band; do + #获取值(从start_bit位开始) + local enable="${band_bin: $((-band-start_bit+1)):1}" + [ -z "$enable" ] && enable="0" + #设置频段信息 + # band_info=$(echo ${band_info} | jq '. += [{'$band_prefix$band':'$enable'}]') + band_info="${band_info},{\"$band_prefix$band\":$enable}" + done + fi + #去掉第一个, + band_info="["${band_info/,/}"]" + # band_info="[${band_info%?}]" + + echo "${band_info}" +} + #获取网络偏好 # $1:AT串口 +# $2:数据接口 +# $3:模组名称 meig_get_network_prefer() { local at_port="$1" + local data_interface="$2" + local modem_name="$3" + at_command="AT^SYSCFGEX?" - local response=$(sh ${SCRIPT_DIR}/modem_at.sh ${at_port} ${at_command} | grep "\^SYSCFGEX:" | awk -F'"' '{print $2}') - + local response=$(sh ${SCRIPT_DIR}/modem_at.sh ${at_port} ${at_command} | grep "\^SYSCFGEX:" | sed 's/\^SYSCFGEX://g') + local network_type_num=$(echo "$response" | awk -F'"' '{print $2}') + + #获取网络类型 + local network_prefer_2g="0"; local network_prefer_3g="0"; local network_prefer_4g="0"; local network_prefer_5g="0"; #匹配不同的网络类型 - local auto=$(echo "${response}" | grep "00") + local auto=$(echo "${network_type_num}" | grep "00") if [ -n "$auto" ]; then + network_prefer_2g="1" network_prefer_3g="1" network_prefer_4g="1" network_prefer_5g="1" else - local wcdma=$(echo "${response}" | grep "02") - local lte=$(echo "${response}" | grep "03") - local nr=$(echo "${response}" | grep "04") + local gsm=$(echo "${network_type_num}" | grep "01") + local wcdma=$(echo "${network_type_num}" | grep "02") + local lte=$(echo "${network_type_num}" | grep "03") + local nr=$(echo "${network_type_num}" | grep "04") + if [ -n "$gsm" ]; then + network_prefer_2g="1" + fi if [ -n "$wcdma" ]; then network_prefer_3g="1" fi @@ -194,14 +288,58 @@ meig_get_network_prefer() fi fi + #获取模组信息 + local modem_info=$(jq '.modem_support.'$data_interface'."'$modem_name'"' ${SCRIPT_DIR}/modem_support.json) + + #获取模组支持的频段 + local support_2g_band=$(echo "$modem_info" | jq -r '.band_2g') + local support_3g_band=$(echo "$modem_info" | jq -r '.band_3g') + local support_4g_band=$(echo "$modem_info" | jq -r '.band_4g') + local support_5g_band=$(echo "$modem_info" | jq -r '.band_5g') + + #获取2G,3G频段信息 + local band_hex_2g_3g=$(echo "$response" | awk -F',' '{print $2}') + #十六进制转二进制 + local bin_2g_3g=$(echo "obase=2; ibase=16; $band_hex_2g_3g" | bc) + local band_2g_info=$(meig_get_band_info "${bin_2g_3g}" "${support_2g_band}" "2G") + local band_3g_info=$(meig_get_band_info "${bin_2g_3g}" "${support_3g_band}" "3G") + + #获取4G频段信息 + local band_hex_4g_1=$(echo "$response" | awk -F',' '{print $5}' | sed 's/\r//g') + local band_hex_4g_2=$(echo "$response" | awk -F',' '{print $7}' | sed 's/\r//g') + #十六进制转二进制 + local bin_4g=$(echo "obase=2; ibase=16; $band_hex_4g_1 + $band_hex_4g_2" | bc) + local band_4g_info=$(meig_get_band_info "${bin_4g}" "${support_4g_band}" "4G") + + #获取5G频段信息 + local band_hex_5g_1=$(echo "$response" | awk -F',' '{print $8}' | sed 's/\r//g') + local band_hex_5g_2=$(echo "$response" | awk -F',' '{print $9}' | sed 's/\r//g') + #十六进制转二进制 + local bin_5g=$(echo "obase=2; ibase=16; $band_hex_5g_1 + $band_hex_5g_2" | bc) + local band_5g_info=$(meig_get_band_info "${bin_5g}" "${support_5g_band}" "5G") + + #生成网络偏好 local network_prefer="{ - \"network_prefer\":{ - \"3G\":$network_prefer_3g, - \"4G\":$network_prefer_4g, - \"5G\":$network_prefer_5g - } + \"network_prefer\":[ + {\"2G\":{ + \"enable\":$network_prefer_2g, + \"band\":$band_2g_info + }}, + {\"3G\":{ + \"enable\":$network_prefer_3g, + \"band\":$band_3g_info + }}, + {\"4G\":{ + \"enable\":$network_prefer_4g, + \"band\":$band_4g_info + }}, + {\"5G\":{ + \"enable\":$network_prefer_5g, + \"band\":$band_5g_info + }} + ] }" - echo "$network_prefer" + echo "${network_prefer}" } #设置网络偏好 @@ -215,35 +353,18 @@ meig_set_network_prefer() #获取网络偏好配置 local network_prefer_config - #获取选中的数量 - local count=$(echo "$network_prefer" | grep -o "1" | wc -l) - #获取每个偏好的值 - local network_prefer_3g=$(echo "$network_prefer" | jq -r '.["3G"]') - local network_prefer_4g=$(echo "$network_prefer" | jq -r '.["4G"]') - local network_prefer_5g=$(echo "$network_prefer" | jq -r '.["5G"]') + #获取启用的网络偏好 + local enable_5g=$(echo "$network_prefer" | jq -r '.["5G"].enable') + local enable_4g=$(echo "$network_prefer" | jq -r '.["4G"].enable') + local enable_3g=$(echo "$network_prefer" | jq -r '.["3G"].enable') - case "$count" in - "1") - if [ "$network_prefer_3g" = "1" ]; then - network_prefer_config="02" - elif [ "$network_prefer_4g" = "1" ]; then - network_prefer_config="03" - elif [ "$network_prefer_5g" = "1" ]; then - network_prefer_config="04" - fi - ;; - "2") - if [ "$network_prefer_3g" = "1" ] && [ "$network_prefer_4g" = "1" ]; then - network_prefer_config="0302" - elif [ "$network_prefer_3g" = "1" ] && [ "$network_prefer_5g" = "1" ]; then - network_prefer_config="0402" - elif [ "$network_prefer_4g" = "1" ] && [ "$network_prefer_5g" = "1" ]; then - network_prefer_config="0403" - fi - ;; - "3") network_prefer_config="00" ;; - *) network_prefer_config="00" ;; - esac + #获取网络偏好配置 + local network_prefer_config + [ "$enable_5g" = "1" ] && network_prefer_config="${network_prefer_config}04" + [ "$enable_4g" = "1" ] && network_prefer_config="${network_prefer_config}03" + [ "$enable_3g" = "1" ] && network_prefer_config="${network_prefer_config}02" + + [ -z "$network_prefer_config" ] && network_prefer_config="00" #设置模组 at_command='AT^SYSCFGEX="'${network_prefer_config}'",all,0,2,all,all,all,all,1' @@ -314,7 +435,7 @@ meig_get_connect_status() #基本信息 meig_base_info() { - debug "meig base info" + debug "Meig base info" #Name(名称) at_command="AT+CGMM" @@ -365,7 +486,7 @@ meig_get_sim_status() #SIM卡信息 meig_sim_info() { - debug "meig sim info" + debug "Meig sim info" #SIM Slot(SIM卡卡槽) at_command="AT^SIMSLOT?" @@ -517,7 +638,7 @@ meig_get_lte_ambr() #网络信息 meig_network_info() { - debug "meig network info" + debug "Meig network info" #Connect Status(连接状态) connect_status=$(meig_get_connect_status ${at_port} ${define_connect}) diff --git a/applications/luci-app-modem/root/usr/share/modem/modem_band.sh b/applications/luci-app-modem/root/usr/share/modem/modem_band.sh new file mode 100644 index 0000000..7972b7f --- /dev/null +++ b/applications/luci-app-modem/root/usr/share/modem/modem_band.sh @@ -0,0 +1,94 @@ +#!/bin/sh +# Copyright (C) 2023 Siriling + +#脚本目录 +SCRIPT_DIR="/usr/share/modem" +source "${SCRIPT_DIR}/modem_debug.sh" + +#初始化模组频段 +init_modem_band() +{ + #2G + DCS_1800="-" + E-GSM_900="-" + P-GSM_900="-" + GSM_450="-" + GSM_480="-" + GSM_750="-" + GSM_850="-" + R-GSM_900="-" + PCS_1900="-" + + #3G + + #4G + B1="-" + B2="-" + B3="-" + B4="-" + B5="-" + B6="-" + B7="-" + B8="-" + B9="-" + B10="-" + B11="-" + B12="-" + B13="-" + B14="-" + B17="-" + B18="-" + B19="-" + B20="-" + B21="-" + B25="-" + B26="-" + B28="-" + B29="-" + B30="-" + B32="-" + B34="-" + B38="-" + B39="-" + B40="-" + B41="-" + B42="-" + B66="-" + B71="-" + + #5G + N1="-" + N2="-" + N3="-" + N5="-" + N7="-" + N8="-" + N12="-" + N20="-" + N25="-" + N28="-" + N38="-" + N40="-" + N41="-" + N48="-" + N66="-" + N71="-" + N77="-" + N78="-" + N79="-" +} + +#获取模组数据信息 +# $1:AT串口 +# $2:制造商 +# $3:平台 +# $4:连接定义 +modem_band() +{ + #初始化模组频段 + debug "初始化模组频段" + init_modem_band + debug "初始化模组频段完成" +} + +modem_band "$1" "$2" "$3" "$4" \ No newline at end of file diff --git a/applications/luci-app-modem/root/usr/share/modem/modem_debug.sh b/applications/luci-app-modem/root/usr/share/modem/modem_debug.sh index 44b6b46..eec9cf4 100755 --- a/applications/luci-app-modem/root/usr/share/modem/modem_debug.sh +++ b/applications/luci-app-modem/root/usr/share/modem/modem_debug.sh @@ -7,6 +7,7 @@ SCRIPT_DIR="/usr/share/modem" source "${SCRIPT_DIR}/quectel.sh" source "${SCRIPT_DIR}/fibocom.sh" source "${SCRIPT_DIR}/meig.sh" +source "${SCRIPT_DIR}/huawei.sh" # source "${SCRIPT_DIR}/simcom.sh" #调试开关 diff --git a/applications/luci-app-modem/root/usr/share/modem/modem_info.sh b/applications/luci-app-modem/root/usr/share/modem/modem_info.sh index 0028d11..d27fc4f 100755 --- a/applications/luci-app-modem/root/usr/share/modem/modem_info.sh +++ b/applications/luci-app-modem/root/usr/share/modem/modem_info.sh @@ -371,6 +371,7 @@ get_modem_info() "fibocom") get_fibocom_info "${at_port}" "${platform}" "${define_connect}" ;; "meig") get_meig_info "${at_port}" "${platform}" "${define_connect}" ;; "simcom") get_simcom_info "${at_port}" "${platform}" "${define_connect}" ;; + "huawei") get_huawei_info "${at_port}" "${platform}" "${define_connect}" ;; *) debug "未适配该模组" ;; esac diff --git a/applications/luci-app-modem/root/usr/share/modem/modem_network_task.sh b/applications/luci-app-modem/root/usr/share/modem/modem_network_task.sh index e9ebafe..1570187 100755 --- a/applications/luci-app-modem/root/usr/share/modem/modem_network_task.sh +++ b/applications/luci-app-modem/root/usr/share/modem/modem_network_task.sh @@ -24,13 +24,13 @@ reset_network_interface() local interface_name_ipv6="wwan6_5g_${modem_no}" #获取IPv4地址 - at_command="AT+CGPADDR=${define_connect}" - local ipv4=$(at ${at_port} ${at_command} | grep "+CGPADDR: " | awk -F',' '{print $2}' | sed 's/"//g') + local at_command="AT+CGPADDR=${define_connect}" + local ipv4=$(at ${at_port} ${at_command} | grep "+CGPADDR: " | sed -n '1p' | awk -F',' '{print $2}' | sed 's/"//g') #输出日志 # echo "[$(date +"%Y-%m-%d %H:%M:%S")] Get Modem new IPv4 address : ${ipv4}" >> "${MODEM_RUNDIR}/modem${modem_no}_dial.cache" #获取DNS地址 - dns=$(fibocom_get_dns ${at_port} ${define_connect}) + local dns=$(fibocom_get_dns ${at_port} ${define_connect}) local ipv4_dns1=$(echo "${dns}" | jq -r '.dns.ipv4_dns1') local ipv4_dns2=$(echo "${dns}" | jq -r '.dns.ipv4_dns2') #输出日志 @@ -117,13 +117,15 @@ ecm_dial() # at "${at_port}" "${at_command}" #拨号 - at_command + local at_command if [ "$manufacturer" = "quectel" ]; then at_command="AT+QNETDEVCTL=${define_connect},3,1" elif [ "$manufacturer" = "fibocom" ]; then at_command="AT+GTRNDIS=1,${define_connect}" elif [ "$manufacturer" = "meig" ]; then at_command="AT^NDISDUP=${define_connect},1" + elif [ "$manufacturer" = "huawei" ]; then + at_command="AT^NDISDUP=${define_connect},1" else at_command='ATI' fi @@ -150,10 +152,10 @@ rndis_dial() local define_connect="$4" local modem_no="$5" - #手动设置IP(广和通FM350-GL) + #手动拨号(广和通FM350-GL) if [ "$manufacturer" = "fibocom" ] && [ "$platform" = "mediatek" ]; then - at_command="AT+CGACT=1,${define_connect}" + local at_command="AT+CGACT=1,${define_connect}" #打印日志 dial_log "${at_command}" "${MODEM_RUNDIR}/modem${modem_no}_dial.cache" #激活并拨号 @@ -228,7 +230,7 @@ modem_network_task() #网络连接检查 local at_command="AT+CGPADDR=${define_connect}" - local ipv4=$(at ${at_port} ${at_command} | grep "+CGPADDR: " | awk -F',' '{print $2}' | sed 's/"//g') + local ipv4=$(at ${at_port} ${at_command} | grep "+CGPADDR: " | sed -n '1p' | awk -F',' '{print $2}' | sed 's/"//g') if [ -z "$ipv4" ]; then diff --git a/applications/luci-app-modem/root/usr/share/modem/modem_support.json b/applications/luci-app-modem/root/usr/share/modem/modem_support.json index 0df9465..aaa85f3 100644 --- a/applications/luci-app-modem/root/usr/share/modem/modem_support.json +++ b/applications/luci-app-modem/root/usr/share/modem/modem_support.json @@ -55,7 +55,8 @@ "platform":"qualcomm", "data_interface":"usb", "define_connect":"1", - "modes":["qmi","gobinet","ecm","mbim","rndis","ncm"] + "modes":["qmi","gobinet","ecm","mbim","rndis","ncm"], + "band_5g":"1,2,3,5,7,8,12,20,25,28,38,40,41,48,66,71,77,78,79,257,258,260,261" }, "rm502q-ae":{ "manufacturer_id":"2c7c", @@ -152,6 +153,18 @@ "data_interface":"usb", "define_connect":"1", "modes":["qmi","gobinet","ecm","rndis","ncm"] + }, + "mh5000-31":{ + "manufacturer_id":"12d1", + "manufacturer":"huawei", + "platform":"hisilicon", + "data_interface":"usb", + "define_connect":"1", + "modes":["ecm","ncm"], + "band_2g":"DCS_1800,E-GSM_900,P-GSM_900,GSM_850,R-GSM_900,PCS_1900", + "band_3g":"1,2,5,6,8,9,19", + "band_4g":"1,2,3,4,5,6,7,8,9,10,11,12,13,14,17,18,19,20,21,25,26,28,33,34,35,36,37,38,39,40,41,42,43", + "band_5g":"1,2,3,5,7,8,12,20,25,28,38,40,41,78,79" } }, "pcie":{ @@ -258,6 +271,12 @@ "vendor_id":["2dee"], "product_id":["4d57","4d58","4d59"] } + }, + "huawei":{ + "hisilicon":{ + "vendor_id":["12d1"], + "product_id":["15c3"] + } } } } diff --git a/applications/luci-app-modem/root/usr/share/modem/modem_util.sh b/applications/luci-app-modem/root/usr/share/modem/modem_util.sh index 9e54552..4b08eac 100755 --- a/applications/luci-app-modem/root/usr/share/modem/modem_util.sh +++ b/applications/luci-app-modem/root/usr/share/modem/modem_util.sh @@ -83,6 +83,7 @@ m_modem_presets() "fibocom") fibocom_presets ;; "meig") meig_presets ;; "simcom") simcom_presets ;; + "huawei") huawei_presets ;; esac } diff --git a/applications/luci-app-modem/root/usr/share/modem/quectel.sh b/applications/luci-app-modem/root/usr/share/modem/quectel.sh index fa54fdd..d937dae 100755 --- a/applications/luci-app-modem/root/usr/share/modem/quectel.sh +++ b/applications/luci-app-modem/root/usr/share/modem/quectel.sh @@ -30,7 +30,7 @@ quectel_get_dns() #获取DNS地址 at_command="AT+GTDNS=${define_connect}" - local response=$(at ${at_port} ${at_command} | grep "+GTDNS: ") + local response=$(sh ${SCRIPT_DIR}/modem_at.sh ${at_port} ${at_command} | grep "+GTDNS: ") local ipv4_dns1=$(echo "${response}" | awk -F'"' '{print $2}' | awk -F',' '{print $1}') [ -z "$ipv4_dns1" ] && { @@ -174,12 +174,20 @@ quectel_set_mode() #获取网络偏好 # $1:AT串口 +# $2:数据接口 +# $3:模组名称 quectel_get_network_prefer() { local at_port="$1" + local data_interface="$2" + local modem_name="$3" + at_command='AT+QNWPREFCFG="mode_pref"' - local response=$(sh ${SCRIPT_DIR}/modem_at.sh ${at_port} ${at_command} | grep "+QNWPREFCFG:" | awk -F',' '{print $2}' | sed 's/\r//g') - + local response=$(sh ${SCRIPT_DIR}/modem_at.sh ${at_port} ${at_command} | grep "+QNWPREFCFG:" | sed 's/\r//g') + local network_type_num=$(echo "$response" | awk -F',' '{print $2}') + + #获取网络类型 + # local network_prefer_2g="0"; local network_prefer_3g="0"; local network_prefer_4g="0"; local network_prefer_5g="0"; @@ -205,14 +213,30 @@ quectel_get_network_prefer() fi fi + #获取频段信息 + # local band_2g_info="[]" + local band_3g_info="[]" + local band_4g_info="[]" + local band_5g_info="[]" + + #生成网络偏好 local network_prefer="{ - \"network_prefer\":{ - \"3G\":$network_prefer_3g, - \"4G\":$network_prefer_4g, - \"5G\":$network_prefer_5g - } + \"network_prefer\":[ + {\"3G\":{ + \"enable\":$network_prefer_3g, + \"band\":$band_3g_info + }}, + {\"4G\":{ + \"enable\":$network_prefer_4g, + \"band\":$band_4g_info + }}, + {\"5G\":{ + \"enable\":$network_prefer_5g, + \"band\":$band_5g_info + }} + ] }" - echo "$network_prefer" + echo "${network_prefer}" } #设置网络偏好 @@ -223,32 +247,32 @@ quectel_set_network_prefer() local at_port="$1" local network_prefer="$2" - #获取网络偏好配置 + #获取网络偏好配置 local network_prefer_config #获取选中的数量 local count=$(echo "$network_prefer" | grep -o "1" | wc -l) - #获取每个偏好的值 - local network_prefer_3g=$(echo "$network_prefer" | jq -r '.["3G"]') - local network_prefer_4g=$(echo "$network_prefer" | jq -r '.["4G"]') - local network_prefer_5g=$(echo "$network_prefer" | jq -r '.["5G"]') + #获取启用的网络偏好 + local enable_5g=$(echo "$network_prefer" | jq -r '.["5G"].enable') + local enable_4g=$(echo "$network_prefer" | jq -r '.["4G"].enable') + local enable_3g=$(echo "$network_prefer" | jq -r '.["3G"].enable') case "$count" in "1") - if [ "$network_prefer_3g" = "1" ]; then + if [ "$enable_3g" = "1" ]; then network_prefer_config="WCDMA" - elif [ "$network_prefer_4g" = "1" ]; then + elif [ "$enable_4g" = "1" ]; then network_prefer_config="LTE" - elif [ "$network_prefer_5g" = "1" ]; then + elif [ "$enable_5g" = "1" ]; then network_prefer_config="NR5G" fi ;; "2") - if [ "$network_prefer_3g" = "1" ] && [ "$network_prefer_4g" = "1" ]; then + if [ "$enable_3g" = "1" ] && [ "$enable_4g" = "1" ]; then network_prefer_config="WCDMA:LTE" - elif [ "$network_prefer_3g" = "1" ] && [ "$network_prefer_5g" = "1" ]; then + elif [ "$enable_3g" = "1" ] && [ "$enable_5g" = "1" ]; then network_prefer_config="WCDMA:NR5G" - elif [ "$network_prefer_4g" = "1" ] && [ "$network_prefer_5g" = "1" ]; then + elif [ "$enable_4g" = "1" ] && [ "$enable_5g" = "1" ]; then network_prefer_config="LTE:NR5G" fi ;; @@ -934,7 +958,7 @@ quectel_cell_info() esac } -# SIMCOM获取基站信息 +# Quectel获取基站信息 Quectel_Cellinfo() { # return