link.lua 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. --- 数据链路激活(创建、连接、状态维护)
  2. -- @module link
  3. -- @author 稀饭放姜、小强
  4. -- @license MIT
  5. -- @copyright openLuat.com
  6. -- @release 2017.9.20
  7. module(..., package.seeall)
  8. local publish = sys.publish
  9. local request = ril.request
  10. local ready = false
  11. function isReady() return ready end
  12. -- apn,用户名,密码
  13. local apnname, username, password
  14. function setAPN(apn, user, pwd)
  15. apnname, username, password = apn, user, pwd
  16. end
  17. -- SIM卡 IMSI READY以后自动设置APN
  18. sys.subscribe("IMSI_READY", function()
  19. if not apnname then -- 如果未设置APN设置默认APN
  20. local mcc, mnc = tonumber(sim.getMcc(), 16), tonumber(sim.getMnc(), 16)
  21. apnname, username, password = apn and apn.get_default_apn(mcc, mnc) -- 如果存在APN库自动获取运营商的APN
  22. if not apnname or apnname == '' then -- 默认情况,如果联通卡设置为联通APN 其他都默认为CMNET
  23. apnname = (mcc == 0x460 and (mnc == 0x01 or mnc == 0x06)) and 'UNINET' or 'CMNET'
  24. end
  25. end
  26. username = username or ''
  27. password = password or ''
  28. end)
  29. local function queryStatus() request("AT+CIPSTATUS") end
  30. ril.regrsp('+CGATT', function(a, b, c, intermediate)
  31. if intermediate == "+CGATT: 1" then
  32. request("AT+CIPSTATUS")
  33. elseif net.getState() == 'REGISTERED' then
  34. sys.timer_start(request, 2000, "AT+CGATT?")
  35. end
  36. end)
  37. ril.regrsp('+CIPSHUT', function(cmd, success)
  38. if success then
  39. ready = false
  40. sys.publish("IP_SHUT_IND")
  41. end
  42. if net.getState() ~= 'REGISTERED' then return end
  43. request('AT+CGATT?')
  44. end)
  45. ril.regurc("STATE", function(data)
  46. local status = data:sub(8, -1)
  47. log.info("link.STATE", "IP STATUS", status)
  48. ready = status == "IP PROCESSING" or status == "IP STATUS"
  49. if status == 'PDP DEACT' then
  50. sys.timer_stop(queryStatus)
  51. request('AT+CIPSHUT') -- 执行CIPSHUT将状态恢复至IP INITIAL
  52. return
  53. elseif status == "IP INITIAL" then
  54. if net.getState() ~= 'REGISTERED' then return end
  55. request(string.format('AT+CSTT="%s","%s","%s"', apnname, username, password))
  56. request("AT+CIICR")
  57. elseif status == "IP START" then
  58. request("AT+CIICR")
  59. elseif status == "IP CONFIG" then
  60. -- nothing to do
  61. elseif status == "IP GPRSACT" then
  62. request("AT+CIFSR")
  63. request("AT+CIPSTATUS")
  64. return
  65. elseif status == "IP PROCESSING" or status == "IP STATUS" then
  66. sys.timer_stop(queryStatus)
  67. publish("IP_READY_IND")
  68. return
  69. end
  70. sys.timer_start(queryStatus, 2000)
  71. end)
  72. ril.regurc("+PDP", function() -- 这个URC只有PDP DEACT
  73. ready = false
  74. sys.publish('IP_ERROR_IND')
  75. sys.timer_start(queryStatus, 2000) -- 2秒后再查询CIPSTATUS 根据IP状态来做下一步动作
  76. end)
  77. -- initial 只能初始化1次,这里是初始化完成标志位
  78. local inited = false
  79. local function initial()
  80. if not inited then
  81. inited = true
  82. request("AT+CIICRMODE=2") --ciicr异步
  83. request("AT+CIPMUX=1") --多链接
  84. request("AT+CIPHEAD=1")
  85. request("AT+CIPQSEND=0") --发送模式
  86. end
  87. end
  88. -- 网络注册成功 发起GPRS附着状态查询
  89. sys.subscribe("NET_STATE_REGISTERED", function()
  90. initial()
  91. request('AT+CGATT?')
  92. end)