Files

185 lines
6.5 KiB
Lua
Raw Permalink Normal View History

2026-03-31 15:46:04 +08:00
--- 模块功能查询sim卡状态、iccid、imsi、mcc、mnc
-- @module sim
-- @author openLuat
-- @license MIT
-- @copyright openLuat
-- @release 2017.02.13
require "ril"
require "sys"
module(..., package.seeall)
local req = ril.request
--sim卡的imsi、sim卡的iccid
local imsi, iccid, status
local sNumber,bQueryNumber = ""
local simCross,setSimCrossCbFnc
--- 获取sim卡的iccid
-- @return string ,返回iccid如果还没有读取出来则返回nil
-- @usage 注意开机lua脚本运行之后会发送at命令去查询iccid所以需要一定时间才能获取到iccid。开机后立即调用此接口基本上返回nil
-- @usage sim.getIccid()
function getIccid()
return iccid
end
--- 获取sim卡的imsi
-- @return string ,返回imsi如果还没有读取出来则返回nil
-- @usage 开机lua脚本运行之后会发送at命令去查询imsi所以需要一定时间才能获取到imsi。开机后立即调用此接口基本上返回nil
-- @usage sim.getImsi()
function getImsi()
return imsi
end
--- 获取sim卡的mcc
-- @return string ,返回值mcc如果还没有读取出来则返回""
-- @usage 注意开机lua脚本运行之后会发送at命令去查询imsi所以需要一定时间才能获取到imsi。开机后立即调用此接口基本上返回""
-- @usage sim.getMcc()
function getMcc()
return (imsi ~= nil and imsi ~= "") and string.sub(imsi, 1, 3) or ""
end
--- 获取sim卡的getmnc
-- @return string ,返回mnc如果还没有读取出来则返回""
-- @usage 注意开机lua脚本运行之后会发送at命令去查询imsi所以需要一定时间才能获取到imsi。开机后立即调用此接口基本上返回""
-- @usage sim.getMnc()
function getMnc()
return (imsi ~= nil and imsi ~= "") and string.sub(imsi, 4, 5) or ""
end
--- 获取sim卡的状态
-- @return bool ,true表示sim卡正常false或者nil表示未检测到卡或者卡异常
-- @usage 开机lua脚本运行之后会发送at命令去查询状态所以需要一定时间才能获取到状态。开机后立即调用此接口基本上返回nil
-- @usage sim.getStatus()
function getStatus()
return status
end
--- 设置“是否打开查询本机号码”的功能
-- @bool flag 开启或者关闭查询功能的标志false或者nil为关闭其余为开启
-- @return nil
-- @usage sim.setQueryNumber(true)
function setQueryNumber(flag)
bQueryNumber = flag
end
--- 获取sim卡的本机号码
-- @return string ,返回值sNumber如果还没有读取出来或者读取失败则返回""
-- @usage 注意开机lua脚本运行之后会发送at命令去查询本机号码所以需要一定时间才能获取到本机号码。开机后立即调用此接口基本上返回""
-- @usage 注意此功能需要卡商支持卡商必须把卡写到sim卡中模块才能从卡中读出号码目前市场上的很多卡没有写入号码是无法读取得
-- @usage sim.getNumber()
function getNumber()
return sNumber or ""
end
--[[
rsp
core软件的AT命令
cmdAT命令
successAT命令执行结果true或者false
responseAT命令的应答中的执行结果字符串
intermediateAT命令的应答中的中间信息
]]
local function rsp(cmd, success, response, intermediate)
if cmd == "AT+ICCID" then
if intermediate then
iccid = string.match(intermediate, "%+ICCID: (.+)")
end
elseif cmd == "AT+SIMCROSS?" then
if success then
simCross = tonumber(intermediate:match("%+SIMCROSS:%s*(%d)"))
end
if setSimCrossCbFnc then setSimCrossCbFnc(success) end
elseif cmd:match("AT%+SIMCROSS=") then
if success then
req("AT+SIMCROSS?")
else
if setSimCrossCbFnc then setSimCrossCbFnc(false) end
end
elseif cmd == "AT+CIMI" then
imsi = intermediate
--产生一个内部消息IMSI_READY通知已经读取imsi
sys.publish("IMSI_READY")
elseif cmd == "AT+CNUM" then
if success then
if intermediate then sNumber = intermediate:match("%+CNUM:%s*\".-\",\"[%+]*(%d+)\",") end
else
sys.timerStart(ril.request,5000,"AT+CNUM")
end
end
end
--[[
urc
-- 功能 本功能模块内“注册的底层core通过虚拟串口主动上报的通知”的处理
data
prefix
]]
local function urc(data, prefix)
--sim卡状态通知
if prefix == "+CPIN" then
status = false
--sim卡正常
if data == "+CPIN: READY" then
status = true
ril.request("AT+ICCID")
ril.request("AT+CIMI")
if bQueryNumber then ril.request("AT+CNUM") end
sys.publish("SIM_IND", "RDY")
--未检测到sim卡
elseif data == "+CPIN: NOT INSERTED" then
sys.publish("SIM_IND", "NIST")
else
--sim卡pin开启
if data == "+CPIN: SIM PIN" then
sys.publish("SIM_IND","SIM_PIN")
end
sys.publish("SIM_IND", "NORDY")
end
end
end
function set2gSim()
ril.request("AT+MEDCR=0,8,1")
ril.request("AT+MEDCR=0,17,240")
ril.request("AT+MEDCR=0,19,1")
end
--- 设置双卡单待sim id
-- @number id 双卡单待的simid仅支持0和1
-- @function[opt=nil] cbFnc 设置结果回调函数,回调函数的调用形式为:
-- cnFnc(result)result为true表示成功false或者nil为失败
-- @return nil
-- @usage
-- sim.setId(0)
-- sim.setId(1,cbFnc)
function setId(id,cbFnc)
if id ~= simCross then
setSimCrossCbFnc = cbFnc
ril.request("AT+SIMCROSS="..id)
else
if cbFnc then cbFnc(true) end
end
end
--- 获取目前设置的双卡单待id
-- @return number ,返回id(0或者1)如果还没有读取出来则返回nil
-- @usage 注意开机lua脚本运行之后会发送at命令去查询id所以需要一定时间才能获取到id。开机后立即调用此接口基本上返回nil
-- @usage sim.getId()
function getId()
return simCross
end
--注册AT+CCID命令的应答处理函数
ril.regRsp("+ICCID", rsp)
--注册AT+CIMI命令的应答处理函数
ril.regRsp("+CIMI", rsp)
ril.regRsp("+CNUM", rsp)
ril.regRsp("+SIMCROSS", rsp)
--注册+CPIN通知的处理函数
ril.regUrc("+CPIN", urc)
ril.request("AT+SIMCROSS?")