main.lua 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. --[[
  2. IPv6客户端演示, 仅EC618系列支持, 例如Air780E/Air600E/Air780UG/Air700E
  3. ]]
  4. -- LuaTools需要PROJECT和VERSION这两个信息
  5. PROJECT = "ipv6_client"
  6. VERSION = "1.0.0"
  7. log.info("main", PROJECT, VERSION)
  8. -- 一定要添加sys.lua !!!!
  9. sys = require("sys")
  10. sysplus = require("sysplus")
  11. libnet = require "libnet"
  12. -- Air780E的AT固件默认会为开机键防抖, 导致部分用户刷机很麻烦
  13. if rtos.bsp() == "EC618" and pm and pm.PWK_MODE then
  14. pm.power(pm.PWK_MODE, false)
  15. end
  16. -- 处理未识别的网络消息
  17. local function netCB(msg)
  18. log.info("未处理消息", msg[1], msg[2], msg[3], msg[4])
  19. end
  20. -- 演示task
  21. function ipv6test()
  22. -- 4G模组均支持, 简单判断一下完事
  23. if mobile == nil then
  24. while 1 do
  25. log.info("ipv6", "当前仅4G模组的4G网络支持ipv6功能")
  26. sys.wait(1000)
  27. end
  28. end
  29. -- 启用IPv6, 默认关闭状态,必须在驻网前开启
  30. -- 注意, 启用IPv6, 联网速度会慢2~3秒
  31. mobile.ipv6(true)
  32. log.info("ipv6", "等待联网")
  33. sys.waitUntil("IP_READY")
  34. log.info("ipv6", "联网完成")
  35. sys.wait(100)
  36. socket.setDNS(nil, 1, "119.29.29.29")
  37. socket.setDNS(nil, 2, "114.114.114.114")
  38. -- 开始正在的逻辑, 发起socket链接,等待数据/上报心跳
  39. local taskName = "ipv6client"
  40. local topic = taskName .. "_txrx"
  41. local txqueue = {}
  42. sysplus.taskInitEx(ipv6task, taskName, netCB, taskName, txqueue, topic)
  43. while 1 do
  44. local result, tp, data = sys.waitUntil(topic, 30000)
  45. if not result then
  46. -- 等很久了,没数据上传/下发, 发个日期心跳包吧
  47. table.insert(txqueue, string.char(0))
  48. sys_send(taskName, socket.EVENT, 0)
  49. elseif tp == "uplink" then
  50. -- 上行数据, 主动上报的数据,那就发送呀
  51. table.insert(txqueue, data)
  52. sys_send(taskName, socket.EVENT, 0)
  53. elseif tp == "downlink" then
  54. -- 下行数据,接收的数据, 从ipv6task来的
  55. -- 其他代码可以通过 sys.publish()
  56. log.info("socket", "收到下发的数据了", #data)
  57. end
  58. end
  59. end
  60. function ipv6task(d1Name, txqueue, rxtopic)
  61. -- 测试方式1, 连netlab外网版,带ipv6
  62. -- 注意, 这里需要登录外网的netlab才有ipv6
  63. -- 网站链接: https://netlab.luatos.org/
  64. -- local host = "2603:c023:1:5fcc:c028:8ed:49a7:6e08"
  65. -- local port = 55389 -- 页面点击"打开TCP" 后获取实际端口
  66. -- 测试方式2, 连另外一个780e设备
  67. local host = "864040064024194.dyndns.u8g2.com"
  68. -- local host = "mirrors6.tuna.tsinghua.edu.cn"
  69. -- local host = "2408:8456:e37:95d8::1"
  70. local port = 14000
  71. local rx_buff = zbuff.create(1024)
  72. local netc = socket.create(nil, d1Name)
  73. socket.config(netc)
  74. log.info("任务id", d1Name)
  75. while true do
  76. log.info("socket", "开始连接服务器")
  77. local result = libnet.connect(d1Name, 15000, netc, host, port, true)
  78. if result then
  79. log.info("socket", "服务器连上了")
  80. libnet.tx(d1Name, 0, netc, "helloworld")
  81. else
  82. log.info("socket", "服务器没连上了!!!")
  83. end
  84. while result do
  85. -- log.info("socket", "调用rx接收数据")
  86. local succ, param = socket.rx(netc, rx_buff)
  87. if not succ then
  88. log.info("服务器断开了", succ, param, ip, port)
  89. break
  90. end
  91. if rx_buff:used() > 0 then
  92. log.info("socket", "收到服务器数据,长度", rx_buff:used())
  93. local data = rx_buff:query() -- 获取数据
  94. sys.publish(rxtopic, "downlink", data)
  95. rx_buff:del()
  96. end
  97. -- log.info("libnet", "调用wait开始等待消息")
  98. result, param, param2 = libnet.wait(d1Name, 15000, netc)
  99. log.info("libnet", "wait", result, param, param2)
  100. if not result then
  101. -- 网络异常了
  102. log.info("socket", "服务器断开了", result, param)
  103. break
  104. elseif #txqueue > 0 then
  105. while #txqueue > 0 do
  106. local data = table.remove(txqueue, 1)
  107. if not data then
  108. break
  109. end
  110. result,param = libnet.tx(d1Name, 15000, netc,data)
  111. log.info("libnet", "发送数据的结果", result, param)
  112. if not result then
  113. log.info("socket", "数据发送异常", result, param)
  114. break
  115. end
  116. end
  117. end
  118. end
  119. libnet.close(d1Name, 5000, netc)
  120. -- log.info(rtos.meminfo("sys"))
  121. sys.wait(5000)
  122. end
  123. end
  124. sys.taskInit(ipv6test)
  125. -- 用户代码已结束---------------------------------------------
  126. -- 结尾总是这一句
  127. sys.run()
  128. -- sys.run()之后后面不要加任何语句!!!!!