sim.lua 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. --- 模块功能:查询sim卡状态、iccid、imsi、mcc、mnc
  2. -- @module sim
  3. -- @author openLuat
  4. -- @license MIT
  5. -- @copyright openLuat
  6. -- @release 2017.02.13
  7. require "ril"
  8. require "sys"
  9. module(..., package.seeall)
  10. --sim卡的imsi、sim卡的iccid
  11. local imsi, iccid, status
  12. local sNumber,bQueryNumber = ""
  13. --- 获取sim卡的iccid
  14. -- @return string ,返回iccid,如果还没有读取出来,则返回nil
  15. -- @usage 注意:开机lua脚本运行之后,会发送at命令去查询iccid,所以需要一定时间才能获取到iccid。开机后立即调用此接口,基本上返回nil
  16. -- @usage sim.getIccid()
  17. function getIccid()
  18. return iccid
  19. end
  20. --- 获取sim卡的imsi
  21. -- @return string ,返回imsi,如果还没有读取出来,则返回nil
  22. -- @usage 开机lua脚本运行之后,会发送at命令去查询imsi,所以需要一定时间才能获取到imsi。开机后立即调用此接口,基本上返回nil
  23. -- @usage sim.getImsi()
  24. function getImsi()
  25. return imsi
  26. end
  27. --- 获取sim卡的mcc
  28. -- @return string ,返回值:mcc,如果还没有读取出来,则返回""
  29. -- @usage 注意:开机lua脚本运行之后,会发送at命令去查询imsi,所以需要一定时间才能获取到imsi。开机后立即调用此接口,基本上返回""
  30. -- @usage sim.getMcc()
  31. function getMcc()
  32. return (imsi ~= nil and imsi ~= "") and string.sub(imsi, 1, 3) or ""
  33. end
  34. --- 获取sim卡的getmnc
  35. -- @return string ,返回mnc,如果还没有读取出来,则返回""
  36. -- @usage 注意:开机lua脚本运行之后,会发送at命令去查询imsi,所以需要一定时间才能获取到imsi。开机后立即调用此接口,基本上返回""
  37. -- @usage sim.getMnc()
  38. function getMnc()
  39. return (imsi ~= nil and imsi ~= "") and string.sub(imsi, 4, 5) or ""
  40. end
  41. --- 获取sim卡的状态
  42. -- @return bool ,true表示sim卡正常,false或者nil表示未检测到卡或者卡异常
  43. -- @usage 开机lua脚本运行之后,会发送at命令去查询状态,所以需要一定时间才能获取到状态。开机后立即调用此接口,基本上返回nil
  44. -- @usage sim.getStatus()
  45. function getStatus()
  46. return status
  47. end
  48. --- 获取sim卡类型
  49. -- @return string ,"UNSUPPORT"表示core软件不支持此功能,"NO_RDY_SIM"表示SIM卡未就绪;"VSIM"表示虚拟SIM卡,"REAL_SIM"表示实体SIM卡
  50. -- @usage sim.getType()
  51. function getType()
  52. if type(rtos.is_vsim)=="function" then
  53. return status and (rtos.is_vsim() and "VSIM" or "REAL_SIM") or "NO_RDY_SIM"
  54. else
  55. return "UNSUPPORT"
  56. end
  57. end
  58. --- 设置“是否打开查询本机号码”的功能
  59. -- @bool flag,开启或者关闭查询功能的标志,false或者nil为关闭,其余为开启
  60. -- @return nil
  61. -- @usage sim.setQueryNumber(true)
  62. function setQueryNumber(flag)
  63. bQueryNumber = flag
  64. end
  65. --- 获取sim卡的本机号码
  66. -- @return string ,返回值:sNumber,如果还没有读取出来或者读取失败,则返回""
  67. -- @usage 注意:开机lua脚本运行之后,会发送at命令去查询本机号码,所以需要一定时间才能获取到本机号码。开机后立即调用此接口,基本上返回""
  68. -- @usage 注意:此功能需要卡商支持,卡商必须把卡写到sim卡中,模块才能从卡中读出号码;目前市场上的很多卡,没有写入号码,是无法读取得
  69. -- @usage sim.getMcc()
  70. function getNumber()
  71. return sNumber or ""
  72. end
  73. --[[
  74. 函数名:rsp
  75. 功能 :本功能模块内“通过虚拟串口发送到底层core软件的AT命令”的应答处理
  76. 参数 :
  77. cmd:此应答对应的AT命令
  78. success:AT命令执行结果,true或者false
  79. response:AT命令的应答中的执行结果字符串
  80. intermediate:AT命令的应答中的中间信息
  81. 返回值:无
  82. ]]
  83. local function rsp(cmd, success, response, intermediate)
  84. if cmd == "AT+CCID" then
  85. iccid = intermediate
  86. elseif cmd == "AT+CIMI" then
  87. imsi = intermediate
  88. --产生一个内部消息IMSI_READY,通知已经读取imsi
  89. sys.publish("IMSI_READY")
  90. elseif cmd == "AT+CNUM" then
  91. if success then
  92. if intermediate then sNumber = intermediate:match("%+CNUM:%s*\".-\",\"[%+]*(%d+)\",") end
  93. else
  94. sys.timerStart(ril.request,5000,"AT+CNUM")
  95. end
  96. end
  97. end
  98. --[[
  99. 函数名:urc
  100. 功能 :本功能模块内“注册的底层core通过虚拟串口主动上报的通知”的处理
  101. 参数 :
  102. data:通知的完整字符串信息
  103. prefix:通知的前缀
  104. 返回值:无
  105. ]]
  106. local function urc(data, prefix)
  107. --sim卡状态通知
  108. if prefix == "+CPIN" then
  109. status = false
  110. --sim卡正常
  111. if data == "+CPIN: READY" then
  112. status = true
  113. ril.request("AT+CCID")
  114. ril.request("AT+CIMI")
  115. if bQueryNumber then ril.request("AT+CNUM") end
  116. sys.publish("SIM_IND", "RDY")
  117. --未检测到sim卡
  118. elseif data == "+CPIN: NOT INSERTED" then
  119. sys.publish("SIM_IND", "NIST")
  120. else
  121. --sim卡pin开启
  122. if data == "+CPIN: SIM PIN" then
  123. sys.publish("SIM_IND_SIM_PIN")
  124. end
  125. sys.publish("SIM_IND", "NORDY")
  126. end
  127. end
  128. end
  129. --注册AT+CCID命令的应答处理函数
  130. ril.regRsp("+CCID", rsp)
  131. --注册AT+CIMI命令的应答处理函数
  132. ril.regRsp("+CIMI", rsp)
  133. ril.regRsp("+CNUM", rsp)
  134. --注册+CPIN通知的处理函数
  135. ril.regUrc("+CPIN", urc)
  136. --关闭sim卡的STK功能,有的sim卡STK功能开机会不断的发送短信,影响数据业务的稳定工作
  137. ril.request("AT+STON=0")