link.lua 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. --- 模块功能:数据链路激活(创建、连接、状态维护)
  2. -- @module link
  3. -- @author openLuat
  4. -- @license MIT
  5. -- @copyright openLuat
  6. -- @release 2017.9.20
  7. require"net"
  8. module(..., package.seeall)
  9. local publish = sys.publish
  10. local request = ril.request
  11. local ready = false
  12. local gprsAttached
  13. function isReady() return ready end
  14. -- apn,用户名,密码
  15. local apnname, username, password
  16. local dnsIP
  17. --发送模式
  18. --0:慢发
  19. --1:快发
  20. local sendMode = 0
  21. function setAPN(apn, user, pwd)
  22. apnname, username, password = apn, user, pwd
  23. end
  24. function setDnsIP(ip1,ip2)
  25. dnsIP = "\""..(ip1 or "").."\",\""..(ip2 or "").."\""
  26. end
  27. function shut()
  28. request('AT+CIPSHUT')
  29. end
  30. -- SIM卡 IMSI READY以后自动设置APN
  31. sys.subscribe("IMSI_READY", function()
  32. if not apnname then -- 如果未设置APN设置默认APN
  33. local mcc, mnc = tonumber(sim.getMcc(), 16), tonumber(sim.getMnc(), 16)
  34. apnname, username, password = apn and apn.get_default_apn(mcc, mnc) -- 如果存在APN库自动获取运营商的APN
  35. if not apnname or apnname == '' or apnname=="CMNET" then -- 默认情况,如果联通卡设置为联通APN 其他都默认为CMIOT
  36. apnname = (mcc == 0x460 and (mnc == 0x01 or mnc == 0x06)) and 'UNINET' or 'CMIOT'
  37. end
  38. end
  39. username = username or ''
  40. password = password or ''
  41. end)
  42. local function queryStatus() request("AT+CIPSTATUS") end
  43. ril.regRsp('+CGATT', function(a, b, c, intermediate)
  44. local attached = (intermediate=="+CGATT: 1")
  45. if gprsAttached ~= attached then
  46. gprsAttached = attached
  47. sys.publish("GPRS_ATTACH",attached)
  48. end
  49. if attached then
  50. request("AT+CIPSTATUS")
  51. elseif net.getState() == 'REGISTERED' then
  52. sys.timerStart(request, 2000, "AT+CGATT?")
  53. end
  54. end)
  55. ril.regRsp('+CIPSHUT', function(cmd, success)
  56. if success then
  57. ready = false
  58. sys.publish("IP_SHUT_IND")
  59. end
  60. if net.getState() ~= 'REGISTERED' then return end
  61. request('AT+CGATT?')
  62. end)
  63. ril.regUrc("STATE", function(data)
  64. local status = data:sub(8, -1)
  65. log.info("link.STATE", "IP STATUS", status)
  66. ready = status == "IP PROCESSING" or status == "IP STATUS"
  67. if status == 'PDP DEACT' then
  68. sys.timerStop(queryStatus)
  69. request('AT+CIPSHUT') -- 执行CIPSHUT将状态恢复至IP INITIAL
  70. return
  71. elseif status == "IP INITIAL" then
  72. if net.getState() ~= 'REGISTERED' then return end
  73. request(string.format('AT+CSTT="%s","%s","%s"', apnname, username or "", password or ""))
  74. request("AT+CIICR")
  75. elseif status == "IP START" then
  76. request("AT+CIICR")
  77. elseif status == "IP CONFIG" then
  78. -- nothing to do
  79. elseif status == "IP GPRSACT" then
  80. request("AT+CIFSR")
  81. request("AT+CIPSTATUS")
  82. if dnsIP then request("AT+CDNSCFG="..dnsIP) end
  83. request("AT+CDNSCFG?")
  84. return
  85. elseif status == "IP PROCESSING" or status == "IP STATUS" then
  86. sys.timerStop(queryStatus)
  87. publish("IP_READY_IND")
  88. return
  89. end
  90. sys.timerStart(queryStatus, 2000)
  91. end)
  92. ril.regUrc("+PDP", function() publish('PDP_DEACT_IND') end)
  93. -- PDP去激活的提示可能出现在URC 也可能在CIP命令发送的时候收到
  94. sys.subscribe('PDP_DEACT_IND', function()
  95. ready = false
  96. sys.publish('IP_ERROR_IND')
  97. sys.timerStart(queryStatus, 2000) -- 2秒后再查询CIPSTATUS 根据IP状态来做下一步动作
  98. end)
  99. -- initial 只能初始化1次,这里是初始化完成标志位
  100. local inited = false
  101. local function initial()
  102. if not inited then
  103. inited = true
  104. request("AT+CIICRMODE=2") --ciicr异步
  105. request("AT+CIPMUX=1") --多链接
  106. request("AT+CIPHEAD=1")
  107. request("AT+CIPQSEND="..sendMode) --发送模式
  108. end
  109. end
  110. function setSendMode(mode)
  111. sendMode = mode or 0
  112. end
  113. -- 网络注册成功 发起GPRS附着状态查询
  114. sys.subscribe("NET_STATE_REGISTERED", function()
  115. initial()
  116. request('AT+CGATT?')
  117. end)