--- 获取GSM网络注册状态 -- @return string state,GSM网络注册状态, -- "INIT"表示正在初始化 -- "REGISTERED"表示已注册 -- "UNREGISTER"表示未注册 -- @usage net.getState() function getState() return state end
那么state这个变量哪来的呢?继续看代码:
--GSM网络状态: --INIT:开机初始化中的状态 --REGISTERED:注册上GSM网络 --UNREGISTER:未注册上GSM网络 local state = "INIT"
可以看出,初始化的时候state就是INIT;那么是谁让state改变了值呢?继续看代码:
-- 处理SIM卡状态消息,SIM卡工作不正常时更新网络状态为未注册 sys.subscribe("SIM_IND", function(para) log.info("SIM.subscribe", simerrsta, para) if simerrsta ~= (para ~= "RDY") then simerrsta = (para ~= "RDY") end --sim卡工作不正常 if para ~= "RDY" then --更新GSM网络状态 state = "UNREGISTER" --产生内部消息NET_STATE_CHANGED,表示网络状态发生变化 publish("NET_STATE_UNREGISTER") else state = "INIT" end end)
&&
--[[ 函数名:creg 功能 :解析CREG信息 参数 :data:CREG信息字符串,例如+CREG: 2、+CREG: 1,"18be","93e1"、+CREG: 5,"18a7","cb51" 返回值:无 ]] --已注册 if p1 == "1" or p1 == "5" then s = "REGISTERED" --未注册 else --[[ if p1 == "3" then creg3 = true checkCRSM() end ]] s = "UNREGISTER" end --注册状态发生了改变 if s ~= state then --临近小区查询处理 if s == "REGISTERED" then --产生一个内部消息NET_STATE_CHANGED,表示GSM网络注册状态发生变化 publish("NET_STATE_REGISTERED") cengQueryPoll(60 * 1000) else cengQueryPoll() end state = s
通过阅读代码,可以了解,即使有小区信息,如果SIM卡状态不正常,也是不会变为 REGISTERED 的。通常情况下,上电后需要等几十秒,SIM卡的状态和网络状态才会正常。net.getState()的返回值也正确;
但是有一种情况例外:没有检测到卡,或者卡错误(不识别,电信卡等等),也会有小区信息,也会有信号,但是net.getState()不会改变。
所以应该配合 sim.getStatus() 一起判断。