2024-05-13 15:29:18 +08:00

926 lines
25 KiB
Lua

-- Copyright 2024 Siriling <siriling@qq.com>
module("luci.controller.modem", package.seeall)
local http = require "luci.http"
local fs = require "nixio.fs"
local json = require("luci.jsonc")
uci = luci.model.uci.cursor()
local script_path="/usr/share/modem/"
local run_path="/tmp/run/modem/"
function index()
if not nixio.fs.access("/etc/config/modem") then
return
end
entry({"admin", "network", "modem"}, alias("admin", "network", "modem", "modem_info"), translate("Modem"), 100).dependent = true
--模块信息
entry({"admin", "network", "modem", "modem_info"}, template("modem/modem_info"), translate("Modem Information"),10).leaf = true
entry({"admin", "network", "modem", "get_at_port"}, call("getATPort"), nil).leaf = true
entry({"admin", "network", "modem", "get_modem_info"}, call("getModemInfo")).leaf = true
--拨号配置
entry({"admin", "network", "modem", "dial_overview"},cbi("modem/dial_overview"),translate("Dial Overview"),20).leaf = true
entry({"admin", "network", "modem", "dial_config"}, cbi("modem/dial_config")).leaf = true
entry({"admin", "network", "modem", "get_modems"}, call("getModems"), nil).leaf = true
entry({"admin", "network", "modem", "get_dial_log_info"}, call("getDialLogInfo"), nil).leaf = true
entry({"admin", "network", "modem", "clean_dial_log"}, call("cleanDialLog"), nil).leaf = true
entry({"admin", "network", "modem", "status"}, call("act_status")).leaf = true
--模块调试
entry({"admin", "network", "modem", "modem_debug"},template("modem/modem_debug"),translate("Modem Debug"),30).leaf = true
entry({"admin", "network", "modem", "quick_commands_config"}, cbi("modem/quick_commands_config")).leaf = true
entry({"admin", "network", "modem", "get_mode_info"}, call("getModeInfo"), nil).leaf = true
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", "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
-- entry({"admin", "network", "modem", "get_modem_debug_info"}, call("getModemDebugInfo"), nil).leaf = true
--插件设置
entry({"admin", "network", "modem", "plugin_config"},cbi("modem/plugin_config"),translate("Plugin Config"),40).leaf = true
entry({"admin", "network", "modem", "modem_config"}, cbi("modem/modem_config")).leaf = true
entry({"admin", "network", "modem", "modem_scan"}, call("modemScan"), nil).leaf = true
--插件信息
entry({"admin", "network", "modem", "plugin_info"},template("modem/plugin_info"),translate("Plugin Info"),50).leaf = true
entry({"admin", "network", "modem", "get_plugin_info"}, call("getPluginInfo"), nil).leaf = true
--AT命令旧界面
entry({"admin", "network", "modem", "at_command_old"},template("modem/at_command_old")).leaf = true
end
--[[
@Description 判断字符串是否含有字母
@Params
str 字符串
]]
function hasLetters(str)
local pattern = "%a" -- 匹配字母的正则表达式
return string.find(str, pattern) ~= nil
end
--[[
@Description 执行Shell脚本
@Params
command sh命令
]]
function shell(command)
local odpall = io.popen(command)
local odp = odpall:read("*a")
odpall:close()
return odp
end
--[[
@Description 执行AT命令
@Params
at_port AT串口
at_command AT命令
]]
function at(at_port,at_command)
local command="source "..script_path.."modem_debug.sh && at "..at_port.." "..at_command
local result=shell(command)
result=string.gsub(result, "\r", "")
return result
end
--[[
@Description 获取制造商
@Params
at_port AT串口
]]
function getManufacturer(at_port)
local manufacturer
uci:foreach("modem", "modem-device", function (modem_device)
if at_port == modem_device["at_port"] then
manufacturer=modem_device["manufacturer"]
return true --跳出循环
end
end)
return manufacturer
end
--[[
@Description 获取模组拨号模式
@Params
at_port AT串口
manufacturer 制造商
platform 平台
]]
function getMode(at_port,manufacturer,platform)
local mode="unknown"
if at_port and manufacturer~="unknown" then
local command="source "..script_path..manufacturer..".sh && "..manufacturer.."_get_mode "..at_port.." "..platform
local result=shell(command)
mode=string.gsub(result, "\n", "")
end
return mode
end
--[[
@Description 获取模组支持的拨号模式
@Params
at_port AT串口
]]
function getModes(at_port)
local modes
uci:foreach("modem", "modem-device", function (modem_device)
if at_port == modem_device["at_port"] then
modes=modem_device["modes"]
return true --跳出循环
end
end)
return modes
end
--[[
@Description 获取模组连接状态
@Params
at_port AT串口
manufacturer 制造商
define_connect 连接定义
]]
function getModemConnectStatus(at_port,manufacturer,define_connect)
local connect_status="unknown"
if at_port and manufacturer~="unknown" then
local command="source "..script_path..manufacturer..".sh && "..manufacturer.."_get_connect_status "..at_port.." "..define_connect
local result=shell(command)
connect_status=string.gsub(result, "\n", "")
end
return connect_status
end
--[[
@Description 获取模组设备信息
@Params
at_port AT串口
]]
function getModemDeviceInfo(at_port)
local modem_device_info={}
uci:foreach("modem", "modem-device", function (modem_device)
if at_port == modem_device["at_port"] then
--获取数据接口
local data_interface=modem_device["data_interface"]:upper()
--获取连接状态
local connect_status=getModemConnectStatus(modem_device["at_port"],modem_device["manufacturer"],modem_device["define_connect"])
--设置值
modem_device_info=modem_device
modem_device_info["data_interface"]=data_interface
modem_device_info["connect_status"]=connect_status
return true
end
end)
return modem_device_info
end
--[[
@Description 获取模组更多信息
@Params
at_port AT串口
manufacturer 制造商
]]
function getModemMoreInfo(at_port,manufacturer,platform,define_connect)
--获取模组信息
local command="sh "..script_path.."modem_info.sh".." "..at_port.." "..manufacturer.." "..platform.." "..define_connect
local result=shell(command)
--设置值
local modem_more_info=json.parse(result)
return modem_more_info
end
--[[
@Description 模块状态获取
]]
function getModemInfo()
--获取AT串口
local at_port = http.formvalue("port")
--获取信息
local modem_device_info
local modem_more_info
if at_port then
modem_device_info=getModemDeviceInfo(at_port)
modem_more_info=getModemMoreInfo(at_port,modem_device_info["manufacturer"],modem_device_info["platform"],modem_device_info["define_connect"])
end
--设置信息
local modem_info={}
modem_info["device_info"]=modem_device_info
modem_info["more_info"]=modem_more_info
--设置翻译
local translation={}
--设备信息翻译
-- if modem_device_info then
-- local name=modem_device_info["name"]
-- translation[name]=luci.i18n.translate(name)
-- local manufacturer=modem_device_info["manufacturer"]
-- translation[manufacturer]=luci.i18n.translate(manufacturer)
-- local mode=modem_device_info["mode"]
-- translation[mode]=luci.i18n.translate(mode)
-- local data_interface=modem_device_info["data_interface"]
-- translation[data_interface]=luci.i18n.translate(data_interface)
-- local network=modem_device_info["network"]
-- translation[network]=luci.i18n.translate(network)
-- end
--基本信息翻译
-- if modem_more_info["base_info"] then
-- for key in pairs(modem_more_info["base_info"]) do
-- local value=modem_more_info["base_info"][key]
-- --翻译值
-- translation[value]=luci.i18n.translate(value)
-- end
-- end
--SIM卡信息翻译
if modem_more_info["sim_info"] then
local sim_info=modem_more_info["sim_info"]
for i = 1, #sim_info do
local info = sim_info[i]
for key in pairs(info) do
--翻译键
translation[key]=luci.i18n.translate(key)
-- local value=info[key]
-- if hasLetters(value) then
-- --翻译值
-- translation[value]=luci.i18n.translate(value)
-- end
end
end
end
--网络信息翻译
if modem_more_info["network_info"] then
local network_info=modem_more_info["network_info"]
for i = 1, #network_info do
local info = network_info[i]
for key in pairs(info) do
--翻译键
translation[key]=luci.i18n.translate(key)
-- local value=info[key]
-- if hasLetters(value) then
-- --翻译值
-- translation[value]=luci.i18n.translate(value)
-- end
end
end
end
--小区信息翻译
if modem_more_info["cell_info"] then
for network_mode_key in pairs(modem_more_info["cell_info"]) do
--翻译网络模式
translation[network_mode_key]=luci.i18n.translate(network_mode_key)
if network_mode_key == "EN-DC Mode" then
local network_mode=modem_more_info["cell_info"][network_mode_key]
for i = 1, #network_mode do
for key in pairs(network_mode[i]) do
--获取每个网络类型信息
local network_type=network_mode[i][key]
for j = 1, #network_type do
local info = network_type[j]
for key in pairs(info) do
translation[key]=luci.i18n.translate(key)
end
end
end
end
else
--获取网络类型信息
local network_type=modem_more_info["cell_info"][network_mode_key]
for i = 1, #network_type do
local info = network_type[i]
for key in pairs(info) do
translation[key]=luci.i18n.translate(key)
end
end
end
end
end
--添加额外翻译
translation["Unknown"]=luci.i18n.translate("Unknown")
translation["Excellent"]=luci.i18n.translate("Excellent")
translation["Good"]=luci.i18n.translate("Good")
translation["Fair"]=luci.i18n.translate("Fair")
translation["Bad"]=luci.i18n.translate("Bad")
--整合数据
local data={}
data["modem_info"]=modem_info
data["translation"]=translation
-- 写入Web界面
luci.http.prepare_content("application/json")
luci.http.write_json(data)
end
--[[
@Description 获取模组信息
]]
function getModems()
-- 获取所有模组
local modems={}
local translation={}
uci:foreach("modem", "modem-device", function (modem_device)
-- 获取连接状态
local connect_status=getModemConnectStatus(modem_device["at_port"],modem_device["manufacturer"],modem_device["define_connect"])
-- 获取拨号模式
local mode=getMode(modem_device["at_port"],modem_device["manufacturer"],modem_device["platform"])
-- 获取翻译
translation[connect_status]=luci.i18n.translate(connect_status)
if modem_device["name"] then
translation[modem_device["name"]]=luci.i18n.translate(modem_device["name"])
end
translation[mode]=luci.i18n.translate(mode)
-- 设置值
local modem=modem_device
modem["connect_status"]=connect_status
modem["mode"]=mode
local modem_tmp={}
modem_tmp[modem_device[".name"]]=modem
table.insert(modems,modem_tmp)
end)
-- 设置值
local data={}
data["modems"]=modems
data["translation"]=translation
-- 写入Web界面
luci.http.prepare_content("application/json")
luci.http.write_json(data)
end
--[[
@Description 获取拨号日志信息
]]
function getDialLogInfo()
local command="find "..run_path.." -name \"modem*_dial.cache\""
local result=shell(command)
local log_paths=string.split(result, "\n")
table.sort(log_paths)
local logs={}
local names={}
local translation={}
for key in pairs(log_paths) do
local log_path=log_paths[key]
if log_path ~= "" then
-- 获取模组
local tmp=string.gsub(log_path, run_path, "")
local modem=string.gsub(tmp, "_dial.cache", "")
local modem_name=uci:get("modem", modem, "name")
-- 获取日志内容
local command="cat "..log_path
log=shell(command)
-- 排序插入
modem_log={}
modem_log[modem]=log
table.insert(logs, modem_log)
--设置模组名
names[modem]=modem_name
-- 设置翻译
translation[modem_name]=luci.i18n.translate(modem_name)
end
end
-- 设置值
local data={}
data["dial_log_info"]=logs
data["modem_name_info"]=names
data["translation"]=translation
-- 写入Web界面
luci.http.prepare_content("application/json")
luci.http.write_json(data)
end
--[[
@Description 清空拨号日志
]]
function cleanDialLog()
-- 获取拨号日志路径
local dial_log_path = http.formvalue("path")
-- 清空拨号日志
local command=": > "..dial_log_path
shell(command)
-- 设置值
local data={}
data["clean_result"]="clean dial log"
-- 写入Web界面
luci.http.prepare_content("application/json")
luci.http.write_json(data)
end
--[[
@Description 模块列表状态函数
]]
function act_status()
local e = {}
e.index = luci.http.formvalue("index")
e.status = luci.sys.call(string.format("busybox ps -w | grep -v 'grep' | grep '/var/etc/socat/%s' >/dev/null", luci.http.formvalue("id"))) == 0
luci.http.prepare_content("application/json")
luci.http.write_json(e)
end
--[[
@Description 获取模组的备注
@Params
network 移动网络
]]
function getModemRemarks(network)
local remarks=""
uci:foreach("modem", "dial-config", function (config)
---配置启用,且备注存在
if network == config["network"] and config["enable"] == "1" then
if config["remarks"] then
remarks=" ("..config["remarks"]..")" --" (备注)"
return true --跳出循环
end
end
end)
return remarks
end
--[[
@Description 获取AT串口
]]
function getATPort()
local at_ports={}
local translation={}
uci:foreach("modem", "modem-device", function (modem_device)
--获取模组的备注
local network=modem_device["network"]
local remarks=getModemRemarks(network)
--设置模组AT串口
if modem_device["name"] and modem_device["at_port"] then
local name=modem_device["name"]:upper()..remarks
if modem_device["name"] == "unknown" then
translation[modem_device["name"]]=luci.i18n.translate(modem_device["name"])
name=modem_device["name"]..remarks
end
local at_port = modem_device["at_port"]
--排序插入
at_port_tmp={}
at_port_tmp[at_port]=name
table.insert(at_ports, at_port_tmp)
end
end)
-- 设置值
local data={}
data["at_ports"]=at_ports
data["translation"]=translation
-- 写入Web界面
luci.http.prepare_content("application/json")
luci.http.write_json(data)
end
--[[
@Description 获取拨号模式信息
]]
function getModeInfo()
local at_port = http.formvalue("port")
--获取值
local mode_info={}
uci:foreach("modem", "modem-device", function (modem_device)
if at_port == modem_device["at_port"] then
--获取制造商
local manufacturer=modem_device["manufacturer"]
if manufacturer=="unknown" then
return true --跳出循环
end
--获取支持的拨号模式
local modes=modem_device["modes"]
--获取模组拨号模式
local mode=getMode(at_port,manufacturer,modem_device["platform"])
--设置模式信息
mode_info["mode"]=mode
mode_info["modes"]=modes
return true --跳出循环
end
end)
--设置值
local modem_debug_info={}
modem_debug_info["mode_info"]=mode_info
-- 写入Web界面
luci.http.prepare_content("application/json")
luci.http.write_json(modem_debug_info)
end
--[[
@Description 设置拨号模式
]]
function setMode()
local at_port = http.formvalue("port")
local mode_config = http.formvalue("mode_config")
--获取制造商
local manufacturer=getManufacturer(at_port)
--设置模组拨号模式
local command="source "..script_path..manufacturer..".sh && "..manufacturer.."_set_mode "..at_port.." "..mode_config
shell(command)
--获取设置好后的模组拨号模式
local mode
if at_port and manufacturer and manufacturer~="unknown" then
local command="source "..script_path..manufacturer..".sh && "..manufacturer.."_get_mode "..at_port
local result=shell(command)
mode=string.gsub(result, "\n", "")
end
-- 写入Web界面
luci.http.prepare_content("application/json")
luci.http.write_json(mode)
end
--[[
@Description 获取网络偏好信息
]]
function getNetworkPreferInfo()
local at_port = http.formvalue("port")
--获取制造商
local manufacturer=getManufacturer(at_port)
--获取值
local network_prefer_info
if manufacturer~="unknown" then
--获取模组网络偏好
local command="source "..script_path..manufacturer..".sh && "..manufacturer.."_get_network_prefer "..at_port
local result=shell(command)
network_prefer_info=json.parse(result)
end
--设置值
local modem_debug_info={}
modem_debug_info["network_prefer_info"]=network_prefer_info
-- 写入Web界面
luci.http.prepare_content("application/json")
luci.http.write_json(modem_debug_info)
end
--[[
@Description 设置网络偏好
]]
function setNetworkPrefer()
local at_port = http.formvalue("port")
local network_prefer_config = json.stringify(http.formvalue("prefer_config"))
--获取制造商
local manufacturer=getManufacturer(at_port)
--设置模组网络偏好
local command="source "..script_path..manufacturer..".sh && "..manufacturer.."_set_network_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
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 getSelfTestInfo()
local at_port = http.formvalue("port")
--获取制造商
local manufacturer=getManufacturer(at_port)
--获取值
local self_test_info={}
if manufacturer~="unknown" then
--获取模组电压
local command="source "..script_path..manufacturer..".sh && "..manufacturer.."_get_voltage "..at_port
local result=shell(command)
self_test_info["voltage"]=json.parse(result)
--获取模组温度
command="source "..script_path..manufacturer..".sh && "..manufacturer.."_get_temperature "..at_port
result=shell(command)
self_test_info["temperature"]=json.parse(result)
end
--设置值
local modem_debug_info={}
modem_debug_info["self_test_info"]=self_test_info
-- 写入Web界面
luci.http.prepare_content("application/json")
luci.http.write_json(modem_debug_info)
end
--[[
@Description 获取快捷命令
]]
function getQuickCommands()
--获取快捷命令选项
local quick_option = http.formvalue("option")
--获取AT串口
local at_port = http.formvalue("port")
local manufacturer
local platform
uci:foreach("modem", "modem-device", function (modem_device)
if at_port == modem_device["at_port"] then
--获取制造商
manufacturer=modem_device["manufacturer"]
--获取平台
platform=modem_device["platform"]
return true --跳出循环
end
end)
--未适配模组时,快捷命令选项为自定义
if manufacturer=="unknown" or manufacturer=="unknown" then
quick_option="custom"
end
local quick_commands={}
local commands={}
if quick_option=="auto" then
--获取通用模组AT命令
local command="jq '.quick_commands.general' \""..script_path.."at_commands.json\""
local result=shell(command)
local general_commands=json.parse(result)
--获取特殊模组AT命令
command="jq '.quick_commands."..manufacturer.."."..platform.."' \""..script_path.."at_commands.json\""
result=shell(command)
local special_commands=json.parse(result)
--把通用命令和特殊命令整合到一起
for i = 1, #special_commands do
local special_command = special_commands[i]
table.insert(general_commands,special_command)
end
quick_commands["quick_commands"]=general_commands
else
uci:foreach("custom_at_commands", "custom-commands", function (custom_commands)
local command={}
command[custom_commands["description"]]=custom_commands["command"]
table.insert(commands,command)
end)
quick_commands["quick_commands"]=commands
end
-- 写入Web界面
luci.http.prepare_content("application/json")
luci.http.write_json(quick_commands)
end
--[[
@Description 发送AT命令
]]
function sendATCommand()
local at_port = http.formvalue("port")
local at_command = http.formvalue("command")
local response={}
if at_port and at_command then
response["response"]=at(at_port,at_command)
response["time"]=os.date("%Y-%m-%d %H:%M:%S")
end
-- 写入Web界面
luci.http.prepare_content("application/json")
luci.http.write_json(response)
end
--[[
@Description 获取模组调试信息
]]
-- function getModemDebugInfo()
-- local at_port = http.formvalue("port")
-- --获取制造商
-- local manufacturer=getManufacturer(at_port)
-- --获取值
-- local mode_info={}
-- local network_prefer_info={}
-- local self_test_info={}
-- if manufacturer~="unknown" then
-- mode_info=getModeInfo(at_port,manufacturer)
-- network_prefer_info=getNetworkPreferInfo(at_port,manufacturer)
-- self_test_info=getSelfTestInfo(at_port,manufacturer)
-- end
-- -- 设置值
-- local modem_debug_info={}
-- modem_debug_info["mode_info"]=mode_info
-- modem_debug_info["network_prefer_info"]=network_prefer_info
-- modem_debug_info["self_test_info"]=self_test_info
-- -- 写入Web界面
-- luci.http.prepare_content("application/json")
-- luci.http.write_json(modem_debug_info)
-- end
--[[
@Description 模组扫描
]]
function modemScan()
local command="source "..script_path.."modem_scan.sh && modem_scan"
local result=shell(command)
-- 写入Web界面
luci.http.prepare_content("application/json")
luci.http.write_json(result)
end
--[[
@Description 设置插件版本信息
@Params
info 信息
]]
function setPluginVersionInfo(info)
-- 正则表达式
local version_regular_expression="[0-9]+.[0-9]+.[0-9]+"
for key in pairs(info) do
-- 获取插件版本
local command="opkg list-installed | grep -oE '"..key.." - "..version_regular_expression.."' | awk -F' ' '{print $3}' | tr -d '\n'"
local plugin_version=shell(command)
if plugin_version~="" then
info[key]=plugin_version
end
end
end
--[[
@Description 获取内核模块状态
@Params
result 命令返回值
]]
function getModelStatus(result)
local model_status="Not loaded"
if result~="" then
model_status="Loaded"
end
return model_status
end
--[[
@Description 设置内核模块状态
@Params
info 信息
]]
function setModelStatus(info)
for key in pairs(info) do
-- 获取内核模块名
local model_name=key:gsub(".ko","")
local command="lsmod | grep -oE '"..model_name.." '"
local result=shell(command)
local model_status=getModelStatus(result)
-- 修改信息表
info[key]=model_status
end
end
--[[
@Description 获取插件信息
]]
function getPluginInfo()
-- 设置翻译
translation={}
translation["Unknown"]=luci.i18n.translate("Unknown")
translation["Not installed"]=luci.i18n.translate("Not installed")
translation["Loaded"]=luci.i18n.translate("Loaded")
translation["Not loaded"]=luci.i18n.translate("Not loaded")
-- 获取插件信息
local plugin_info={}
plugin_info["luci-app-modem"]="Unknown"
setPluginVersionInfo(plugin_info)
-- 获取拨号工具信息
local dial_tool_info={}
dial_tool_info["modemmanager"]="Not installed"
dial_tool_info["quectel-CM-5G"]="Not installed"
dial_tool_info["fibocom-dial"]="Not installed"
dial_tool_info["meig-cm"]="Not installed"
setPluginVersionInfo(dial_tool_info)
-- 获取通用驱动信息
local general_driver_info={}
general_driver_info["usbnet.ko"]="Not loaded"
general_driver_info["option.ko"]="Not loaded"
-- general_driver_info["qcserial.ko"]="Not loaded"
setModelStatus(general_driver_info)
-- 获取模组USB驱动信息
local usb_driver_info={}
--通用驱动
usb_driver_info["qmi_wwan.ko"]="Not loaded"
usb_driver_info["GobiNet.ko"]="Not loaded"
usb_driver_info["cdc_ether.ko"]="Not loaded"
usb_driver_info["cdc_mbim.ko"]="Not loaded"
usb_driver_info["rndis_host.ko"]="Not loaded"
usb_driver_info["cdc_ncm.ko"]="Not loaded"
--制造商私有驱动
usb_driver_info["qmi_wwan_q.ko"]="Not loaded"
usb_driver_info["qmi_wwan_f.ko"]="Not loaded"
usb_driver_info["meig_cdc_driver.ko"]="Not loaded"
setModelStatus(usb_driver_info)
-- 获取模组PCIE驱动信息
local pcie_driver_info={}
--通用驱动
pcie_driver_info["mhi_net.ko"]="Not loaded"
pcie_driver_info["qrtr_mhi.ko"]="Not loaded"
pcie_driver_info["mhi_pci_generic.ko"]="Not loaded"
pcie_driver_info["mhi_wwan_mbim.ko"]="Not loaded"
pcie_driver_info["mhi_wwan_ctrl.ko"]="Not loaded"
--制造商私有驱动
pcie_driver_info["pcie_mhi.ko"]="Not loaded"
pcie_driver_info["mtk_pcie_wwan_m80.ko"]="Not loaded"
setModelStatus(pcie_driver_info)
-- 设置值
local data={}
data["translation"]=translation
data["plugin_info"]=plugin_info
data["dial_tool_info"]=dial_tool_info
data["general_driver_info"]=general_driver_info
data["usb_driver_info"]=usb_driver_info
data["pcie_driver_info"]=pcie_driver_info
-- 写入Web界面
luci.http.prepare_content("application/json")
luci.http.write_json(data)
end