Files
BR_YKC/4G/tools/_temp/script/temp_script/net.lua

788 lines
13 KiB
Lua
Raw Normal View History

2026-04-03 12:14:43 +08:00
require "sys"
require "ril"
require "pio"
require "sim"
require "log"
require "utils"
module(..., package.seeall)
local publish = sys.publish
NetMode_noNet= 0
NetMode_GSM= 1
NetMode_EDGE= 2
NetMode_TD= 3
NetMode_LTE= 4
NetMode_WCDMA= 5
local netMode = NetMode_noNet
local state = "INIT"
local simerrsta
flyMode = false
local lac, ci, rssi, rsrp, band = "", "", 0, 0, ""
local cellinfo, multicellcb = {}
local curCellSeted
local function cops(data)
local fmt,oper = data:match('COPS:%s*%d+%s*,(%d+)%s*,"(%d+)"')
log.info("cops",fmt,oper,curCellSeted)
if fmt=="2" and not curCellSeted then
cellinfo[1].mcc = tonumber(oper:sub(1,3),16)
cellinfo[1].mnc = tonumber(oper:sub(4,5),16)
end
end
local function creg(data)
local p1, s,act
local prefix = (netMode == NetMode_LTE) and "+CEREG: " or (netMode == NetMode_noNet and "+CREG: " or "+CGREG: ")
log.info("net.creg1",netMode,prefix)
if not data:match(prefix) then
if prefix=="+CREG: " then
prefix = "+CGREG: "
if not data:match("+CGREG: ") then
log.warn("net.creg1","no match",data)
return
end
elseif prefix=="+CGREG: " then
prefix = "+CREG: "
if not data:match("+CREG: ") then
log.warn("net.creg2","no match",data)
return
end
end
end
_, _, p1 = data:find(prefix .. "%d,(%d+)")
if p1 == nil then
_, _, p1 = data:find(prefix .. "(%d+)")
if p1 == nil then return end
act = data:match(prefix .. "%d+,.-,.-,(%d+)")
else
act = data:match(prefix .. "%d,%d+,.-,.-,(%d+)")
end
log.info("net.creg7",p1,act)
s = (p1=="1" or p1=="5") and "REGISTERED" or "UNREGISTER"
if prefix=="+CGREG: " and s=="UNREGISTER" then
log.info("net.creg9 ignore!!!")
return
end
if s ~= state then
if s == "REGISTERED" then
publish("NET_STATE_REGISTERED")
cengQueryPoll()
end
state = s
end
if state == "REGISTERED" then
p2, p3 = data:match("\"(%x+)\",\"(%x+)\"")
if p2 and p3 and (lac ~= p2 or ci ~= p3) then
lac = p2
ci = p3
publish("NET_CELL_CHANGED")
cellinfo[1].lac = tonumber(lac,16)
cellinfo[1].ci = tonumber(ci,16)
cellinfo[1].rssi = 28
end
if act then
if act=="0" then
UpdNetMode("^MODE: 3,1")
elseif act=="1" then
UpdNetMode("^MODE: 3,2")
elseif act=="3" then
UpdNetMode("^MODE: 3,3")
elseif act=="7" then
UpdNetMode("^MODE: 17,17")
else
UpdNetMode("^MODE: 5,7")
end
end
end
end
local function resetCellInfo()
local i
cellinfo.cnt = 11
for i = 1, cellinfo.cnt do
cellinfo[i] = {}
cellinfo[i].mcc, cellinfo[i].mnc = nil
cellinfo[i].lac = 0
cellinfo[i].ci = 0
cellinfo[i].rssi = 0
cellinfo[i].ta = 0
end
end
local function eemLteSvc(data)
local mcc,mnc,lac,ci,rssi,svcData
if data:match("%+EEMLTESVC:%s*%d+,%s*%d+,%s*%d+,%s*.+") then
svcData = string.match(data, "%+EEMLTESVC:(.+)")
if svcData then
svcDataT = string.split(svcData, ', ')
if not(svcDataT[1] and svcDataT[3] and svcDataT[4] and svcDataT[10] and svcDataT[15]) then
svcDataT = string.split(svcData, ',')
log.info("eemLteSvc2",svcDataT[1],svcDataT[3],svcDataT[4],svcDataT[10],svcDataT[15])
end
mcc = svcDataT[1]
mnc = svcDataT[3]
lac = svcDataT[4]
ci = svcDataT[10]
band = svcDataT[8]
rssi = (tonumber(svcDataT[15])-(tonumber(svcDataT[15])%3))/3
if rssi>31 then rssi=31 end
if rssi<0 then rssi=0 end
end
log.info("eemLteSvc1",lac,ci,mcc,mnc)
if lac and lac~="0" and ci and ci ~= "0" and mcc and mnc then
resetCellInfo()
curCellSeted = true
cellinfo[1].mcc = mcc
cellinfo[1].mnc = mnc
cellinfo[1].lac = tonumber(lac)
cellinfo[1].ci = tonumber(ci)
cellinfo[1].rssi = tonumber(rssi)
if multicellcb then multicellcb(cellinfo) end
publish("CELL_INFO_IND", cellinfo)
end
elseif data:match("%+EEMLTEINTER") or data:match("%+EEMLTEINTRA") or data:match("%+EEMLTEINTERRAT") then
data = data:gsub(" ","")
if data:match("%+EEMLTEINTERRAT") then
mcc,mnc,lac,ci,rssi = data:match("[-]*%d+,[-]*%d+,([-]*%d+),([-]*%d+),([-]*%d+),([-]*%d+),[-]*%d+,[-]*%d+,([-]*%d+)")
else
rssi,mcc,mnc,lac,ci = data:match("[-]*%d+,[-]*%d+,[-]*%d+,([-]*%d+),[-]*%d+,([-]*%d+),([-]*%d+),([-]*%d+),([-]*%d+)")
end
if rssi then
rssi = (rssi-(rssi%3))/3
if rssi>31 then rssi=31 end
if rssi<0 then rssi=0 end
end
if lac~="0" and lac~="-1" and ci~="0" and ci~="-1" then
for i = 1, cellinfo.cnt do
if cellinfo[i].lac==0 then
cellinfo[i] =
{
mcc = mcc,
mnc = mnc,
lac = tonumber(lac),
ci = tonumber(ci),
rssi = tonumber(rssi)
}
break
end
end
end
end
end
local function eemGsmInfoSvc(data)
if string.find(data, "%+EEMGINFOSVC:%s*%d+,%s*%d+,%s*%d+,%s*.+") then
local mcc,mnc,lac,ci,ta,rssi
local svcData = string.match(data, "%+EEMGINFOSVC:(.+)")
if svcData then
svcDataT = string.split(svcData, ', ')
mcc = svcDataT[1]
mnc = svcDataT[2]
lac = svcDataT[3]
ci = svcDataT[4]
ta = svcDataT[10]
rssi = svcDataT[12]
if tonumber(rssi) >31
then rssi = 31
end
if tonumber(rssi) < 0
then rssi = 0
end
end
if lac and lac~="0" and ci and ci ~= "0" and mcc and mnc then
resetCellInfo()
curCellSeted = true
cellinfo[1].mcc = mcc
cellinfo[1].mnc = mnc
cellinfo[1].lac = tonumber(lac)
cellinfo[1].ci = tonumber(ci)
cellinfo[1].rssi = (tonumber(rssi) == 99) and 0 or tonumber(rssi)
cellinfo[1].ta = tonumber(ta or "0")
if multicellcb then multicellcb(cellinfo) end
publish("CELL_INFO_IND", cellinfo)
end
end
end
local function eemGsmNCInfoSvc(data)
if string.find(data, "%+EEMGINFONC: %d+, %d+, %d+, .+") then
local mcc,mnc,lac,ci,ta,rssi,id
local svcData = string.match(data, "%+EEMGINFONC:(.+)")
if svcData then
svcDataT = string.split(svcData, ', ')
id = svcDataT[1]
mcc = svcDataT[2]
mnc = svcDataT[3]
lac = svcDataT[4]
ci = svcDataT[6]
rssi = svcDataT[7]
if tonumber(rssi) >31
then rssi = 31
end
if tonumber(rssi) < 0
then rssi = 0
end
end
if lac and ci and mcc and mnc then
cellinfo[id + 2].mcc = mcc
cellinfo[id + 2].mnc = mnc
cellinfo[id + 2].lac = tonumber(lac)
cellinfo[id + 2].ci = tonumber(ci)
cellinfo[id + 2].rssi = (tonumber(rssi) == 99) and 0 or tonumber(rssi)
end
end
end
local function eemUMTSInfoSvc(data)
if string.find(data, "%+EEMUMTSSVC: %d+, %d+, %d+, .+") then
local mcc,mnc,lac,ci,rssi
local svcData = string.match(data, "%+EEMUMTSSVC:(.+)")
local cellMeasureFlag, cellParamFlag = string.match(data, "%+EEMUMTSSVC:%d+, (%d+), (%d+), .+")
local svcDataT = string.split(svcData, ', ')
local offset = 4
if svcData and svcDataT then
if tonumber(cellMeasureFlag) ~= 0 then
offset = offset + 2
rssi = svcDataT[offset]
offset = offset + 4
else
offset = offset + 2
rssi = svcDataT[offset]
offset = offset + 2
end
if tonumber(cellParamFlag) ~= 0 then
offset = offset + 3
mcc = svcDataT[offset]
mnc = svcDataT[offset + 1]
lac = svcDataT[offset + 2]
ci = svcDataT[offset + 3]
offset = offset + 3
end
end
if lac and lac~="0" and ci and ci ~= "0" and mcc and mnc and rssi then
resetCellInfo()
curCellSeted = true
cellinfo[1].mcc = mcc
cellinfo[1].mnc = mnc
cellinfo[1].lac = tonumber(lac)
cellinfo[1].ci = tonumber(ci)
cellinfo[1].rssi = tonumber(rssi)
if multicellcb then multicellcb(cellinfo) end
publish("CELL_INFO_IND", cellinfo)
end
end
end
function UpdNetMode(data)
local _, _, SysMainMode,SysMode = string.find(data, "(%d+),(%d+)")
local netMode_cur
log.info("net.UpdNetMode",netMode_cur,netMode, SysMainMode,SysMode)
if SysMainMode and SysMode then
if SysMainMode=="3" then
netMode_cur = NetMode_GSM
elseif SysMainMode=="5" then
netMode_cur = NetMode_WCDMA
elseif SysMainMode=="15" then
netMode_cur = NetMode_TD
elseif SysMainMode=="17" then
netMode_cur = NetMode_LTE
else
netMode_cur = NetMode_noNet
end
if SysMode=="3" then
netMode_cur = NetMode_EDGE
end
end
if netMode ~= netMode_cur then
netMode = netMode_cur
publish("NET_UPD_NET_MODE",netMode)
log.info("net.NET_UPD_NET_MODE",netMode)
ril.request("AT+COPS?")
if netMode == NetMode_LTE then
ril.request("AT+CEREG?")
elseif netMode == NetMode_noNet then
ril.request("AT+CREG?")
else
ril.request("AT+CGREG?")
end
end
end
local function neturc(data, prefix)
if prefix=="+COPS" then
cops(data)
elseif prefix == "+CREG" or prefix == "+CGREG" or prefix == "+CEREG" then
csqQueryPoll()
creg(data)
elseif prefix == "+EEMLTESVC" or prefix == "+EEMLTEINTRA" or prefix == "+EEMLTEINTER" or prefix=="+EEMLTEINTERRAT" then
eemLteSvc(data)
elseif prefix == "+EEMUMTSSVC" then
eemUMTSInfoSvc(data)
elseif prefix == "+EEMGINFOSVC" then
eemGsmInfoSvc(data)
elseif prefix == "+EEMGINFONC" then
eemGsmNCInfoSvc(data)
elseif prefix == "^MODE" then
UpdNetMode(data)
end
end
function switchFly(mode)
if flyMode == mode then return end
flyMode = mode
if mode then
ril.request("AT+CFUN=0")
else
ril.request("AT+CFUN=1")
csqQueryPoll()
cengQueryPoll()
neturc("2", "+CREG")
end
end
function getNetMode()
return netMode
end
function getState()
return state
end
function getMcc()
return cellinfo[1].mcc and string.format("%x",cellinfo[1].mcc) or sim.getMcc()
end
function getMnc()
return cellinfo[1].mnc and string.format("%x",cellinfo[1].mnc) or sim.getMnc()
end
function getLac()
return lac
end
function getBand()
return band
end
function getCi()
return ci
end
function getRssi()
return rssi
end
function getRsrp()
return rsrp
end
function getCell()
local i,ret = 1,""
for i=1,cellinfo.cnt do
if cellinfo[i] and cellinfo[i].lac and cellinfo[i].lac ~= 0 and cellinfo[i].ci and cellinfo[i].ci ~= 0 then
ret = ret..cellinfo[i].ci.."."..cellinfo[i].rssi.."."
end
end
return ret
end
function getCellInfo()
local i, ret = 1, ""
for i = 1, cellinfo.cnt do
if cellinfo[i] and cellinfo[i].lac and cellinfo[i].lac ~= 0 and cellinfo[i].ci and cellinfo[i].ci ~= 0 then
ret = ret .. cellinfo[i].lac .. "." .. cellinfo[i].ci .. "." .. cellinfo[i].rssi .. ";"
end
end
return ret
end
function getCellInfoExt(rssi)
local i, ret = 1, ""
for i = 1, cellinfo.cnt do
if cellinfo[i] and cellinfo[i].mcc and cellinfo[i].mnc and cellinfo[i].lac and cellinfo[i].lac ~= 0 and cellinfo[i].ci and cellinfo[i].ci ~= 0 then
ret = ret .. string.format("%x",cellinfo[i].mcc) .. "." .. string.format("%x",cellinfo[i].mnc) .. "." .. cellinfo[i].lac .. "." .. cellinfo[i].ci .. "." .. (rssi and (cellinfo[i].rssi*2-113) or cellinfo[i].rssi) .. ";"
end
end
return ret
end
function getTa()
return cellinfo[1].ta
end
local function rsp(cmd, success, response, intermediate)
local prefix = string.match(cmd, "AT(%+%u+)")
if intermediate ~= nil then
if prefix == "+CSQ" then
local s = string.match(intermediate, "+CSQ:%s*(%d+)")
if s ~= nil then
rssi = tonumber(s)
rssi = rssi == 99 and 0 or rssi
publish("GSM_SIGNAL_REPORT_IND", success, rssi)
end
elseif prefix == "+CESQ" then
local s = string.match(intermediate, "+CESQ: %d+,%d+,%d+,%d+,%d+,(%d+)")
if s ~= nil then
rsrp = tonumber(s)
end
elseif prefix == "+CENG" then end
end
if prefix == "+CFUN" then
if success then publish("FLYMODE", flyMode) end
end
end
function getMultiCell(cbFnc)
multicellcb = cbFnc
ril.request("AT+EEMGINFO?")
end
function cengQueryPoll(period)
if not flyMode then
ril.request("AT+EEMGINFO?")
else
log.warn("net.cengQueryPoll", "flymode:", flyMode)
end
if nil ~= period then
sys.timerStopAll(cengQueryPoll)
sys.timerStart(cengQueryPoll, period, period)
end
return not flyMode
end
function csqQueryPoll(period)
if not flyMode then
ril.request("AT+CSQ")
ril.request("AT+CESQ")
else
log.warn("net.csqQueryPoll", "flymode:", flyMode)
end
if nil ~= period then
sys.timerStopAll(csqQueryPoll)
sys.timerStart(csqQueryPoll, period, period)
end
return not flyMode
end
function startQueryAll(...)
local arg = { ... }
csqQueryPoll(arg[1])
cengQueryPoll(arg[2])
if flyMode then
log.info("sim.startQuerAll", "flyMode:", flyMode)
end
return true
end
function stopQueryAll()
sys.timerStopAll(csqQueryPoll)
sys.timerStopAll(cengQueryPoll)
end
local sEngMode
function setEngMode(mode)
sEngMode = mode or 1
ril.request("AT+EEMOPT="..sEngMode,nil,function(cmd,success)
function retrySetEngMode()
setEngMode(sEngMode)
end
if success then
sys.timerStop(retrySetEngMode)
else
sys.timerStart(retrySetEngMode,3000)
end
end)
end
sys.subscribe("SIM_IND", function(para)
log.info("SIM.subscribe", simerrsta, para)
if simerrsta ~= (para ~= "RDY") then
simerrsta = (para ~= "RDY")
end
if para ~= "RDY" then
state = "UNREGISTER"
publish("NET_STATE_UNREGISTER")
else
end
end)
ril.regUrc("+COPS", neturc)
ril.regUrc("+CREG", neturc)
ril.regUrc("+CGREG", neturc)
ril.regUrc("+CEREG", neturc)
ril.regUrc("+EEMLTESVC", neturc)
ril.regUrc("+EEMLTEINTER", neturc)
ril.regUrc("+EEMLTEINTRA", neturc)
ril.regUrc("+EEMLTEINTERRAT", neturc)
ril.regUrc("+EEMGINFOSVC", neturc)
ril.regUrc("+EEMGINFONC", neturc)
ril.regUrc("+EEMUMTSSVC", neturc)
ril.regUrc("^MODE", neturc)
ril.regRsp("+CSQ", rsp)
ril.regRsp("+CESQ",rsp)
ril.regRsp("+CFUN", rsp)
ril.request("AT+COPS?")
ril.request("AT+CREG=2")
ril.request("AT+CGREG=2")
ril.request("AT+CEREG=2")
ril.request("AT+CREG?")
ril.request("AT+CGREG?")
ril.request("AT+CEREG?")
ril.request("AT+CALIBINFO?")
ril.request("AT*BAND?")
setEngMode(1)
resetCellInfo()