sim.lua 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. --- 模块功能 :查询sim卡状态、iccid、imsi、mcc、mnc
  2. -- @module sim
  3. -- @author 小强、稀饭放姜
  4. -- @license MIT
  5. -- @copyright openLuat
  6. -- @release 2017.02.13
  7. local string = require "string"
  8. local ril = require "ril"
  9. local sys = require "sys"
  10. local base = _G
  11. local os = require "os"
  12. module(...)
  13. --加载常用的全局函数至本地
  14. local tonumber = base.tonumber
  15. local tostring = base.tostring
  16. --sim卡的imsi、sim卡的iccid
  17. local imsi, iccid, status
  18. --- 获取sim卡的iccid
  19. -- @return string ,返回iccid,如果还没有读取出来,则返回nil
  20. -- @usage 注意:开机lua脚本运行之后,会发送at命令去查询iccid,所以需要一定时间才能获取到iccid。开机后立即调用此接口,基本上返回nil
  21. -- @usage sim.geticcid()
  22. function geticcid()
  23. return iccid
  24. end
  25. --- 获取sim卡的imsi
  26. -- @return string ,返回imsi,如果还没有读取出来,则返回nil
  27. -- @usage 开机lua脚本运行之后,会发送at命令去查询imsi,所以需要一定时间才能获取到imsi。开机后立即调用此接口,基本上返回nil
  28. -- @usage sim.getimsi()
  29. function getimsi()
  30. return imsi
  31. end
  32. --- 获取sim卡的mcc
  33. -- @return string ,返回值:mcc,如果还没有读取出来,则返回""
  34. -- @usage 注意:开机lua脚本运行之后,会发送at命令去查询imsi,所以需要一定时间才能获取到imsi。开机后立即调用此接口,基本上返回""
  35. -- @usage sim.getMcc()
  36. function getMcc()
  37. return (imsi ~= nil and imsi ~= "") and string.sub(imsi, 1, 3) or ""
  38. end
  39. --- 获取sim卡的getmnc
  40. -- @return string ,返回mnc,如果还没有读取出来,则返回""
  41. -- @usage 注意:开机lua脚本运行之后,会发送at命令去查询imsi,所以需要一定时间才能获取到imsi。开机后立即调用此接口,基本上返回""
  42. -- @usage sim.getMnc()
  43. function getMnc()
  44. return (imsi ~= nil and imsi ~= "") and string.sub(imsi, 4, 5) or ""
  45. end
  46. --- 获取sim卡的状态
  47. -- @return bool ,true表示sim卡正常,false或者nil表示未检测到卡或者卡异常
  48. -- @usage 开机lua脚本运行之后,会发送at命令去查询状态,所以需要一定时间才能获取到状态。开机后立即调用此接口,基本上返回nil
  49. -- @usage sim.getstatus()
  50. function getstatus()
  51. return status
  52. end
  53. --[[
  54. 函数名:rsp
  55. 功能 :本功能模块内“通过虚拟串口发送到底层core软件的AT命令”的应答处理
  56. 参数 :
  57. cmd:此应答对应的AT命令
  58. success:AT命令执行结果,true或者false
  59. response:AT命令的应答中的执行结果字符串
  60. intermediate:AT命令的应答中的中间信息
  61. 返回值:无
  62. ]]
  63. local function rsp(cmd, success, response, intermediate)
  64. if cmd == "AT+CCID" then
  65. iccid = intermediate
  66. elseif cmd == "AT+CIMI" then
  67. imsi = intermediate
  68. --产生一个内部消息IMSI_READY,通知已经读取imsi
  69. sys.publish("IMSI_READY")
  70. end
  71. end
  72. --[[
  73. 函数名:urc
  74. 功能 :本功能模块内“注册的底层core通过虚拟串口主动上报的通知”的处理
  75. 参数 :
  76. data:通知的完整字符串信息
  77. prefix:通知的前缀
  78. 返回值:无
  79. ]]
  80. local function urc(data, prefix)
  81. --sim卡状态通知
  82. if prefix == "+CPIN" then
  83. status = false
  84. --sim卡正常
  85. if data == "+CPIN: READY" then
  86. status = true
  87. ril.request("AT+CCID")
  88. ril.request("AT+CIMI")
  89. sys.publish("SIM_IND", "RDY")
  90. --未检测到sim卡
  91. elseif data == "+CPIN: NOT INSERTED" then
  92. sys.publish("SIM_IND", "NIST")
  93. else
  94. --sim卡pin开启
  95. if data == "+CPIN: SIM PIN" then
  96. sys.publish("SIM_IND_SIM_PIN")
  97. end
  98. sys.publish("SIM_IND", "NORDY")
  99. end
  100. end
  101. end
  102. --注册AT+CCID命令的应答处理函数
  103. ril.regrsp("+CCID", rsp)
  104. --注册AT+CIMI命令的应答处理函数
  105. ril.regrsp("+CIMI", rsp)
  106. --注册+CPIN通知的处理函数
  107. ril.regurc("+CPIN", urc)