main.lua 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. -- LuaTools需要PROJECT和VERSION这两个信息
  2. PROJECT = "udpsrvdemo"
  3. VERSION = "1.0.0"
  4. -- sys库是标配
  5. _G.sys = require("sys")
  6. sysplus = require("sysplus")
  7. libnet = require "libnet"
  8. -- =============================================================
  9. -- 测试网站 https://netlab.luatos.com/ 点击 打开UDP 获取测试端口号
  10. -- 要按实际情况修改
  11. local host = "netlab.luatos.com" -- 服务器ip或者域名, 都可以的
  12. local port = 47966 -- 服务器端口号
  13. local is_udp = true -- 如果是UDP, 要改成true, false就是TCP
  14. local is_tls = false -- 加密与否, 要看服务器的实际情况
  15. -- =============================================================
  16. -- 设置灯的输出模式
  17. gpio.setup(27, 0, gpio.PULLUP)
  18. sys.taskInit(function()
  19. while 1 do
  20. local result, rx_data = sys.waitUntil("sc_txrx", 30000)
  21. if result then
  22. log.info("sys.waitUntil接收到数据")
  23. --[[在接收的数据rx_data中,寻找ledon出现的位置,如果找到
  24. 会返回第一次出现的位置和最后出现的位置。
  25. ]]
  26. local s, e = string.find(rx_data, "ledon")
  27. if s == 1 and e == 5 then
  28. gpio.set(27, 1)
  29. log.info("开灯")
  30. end
  31. local s2, e2 = string.find(rx_data, "ledoff")
  32. if s2 == 1 and e2 == 6 then
  33. gpio.set(27, 0)
  34. log.info("关灯")
  35. end
  36. else
  37. log.info("发布keepalive,waitUntil的返回值为: ", result)
  38. -- 发送心跳
  39. sys.publish("keepalive")
  40. end
  41. end
  42. end)
  43. -- 连接函数
  44. -- function socketTask(rxtopic)
  45. sys.taskInit(function()
  46. sys.waitUntil("IP_READY")
  47. -- 创建一个用于接收UDP服务器下发数据的数组
  48. local rx_buff = zbuff.create(1024)
  49. -- 申请一个socket_ctrl
  50. local netc = socket.create(nil)
  51. --[[配置network一些信息
  52. @param1 socket_ctrl
  53. @param2 本地端口号,不写会自动分配一个
  54. @parma3 是否是UDP
  55. @param4 是否是加密传输
  56. ]]
  57. local config_succ = socket.config(netc, nil, is_udp, false)
  58. if not config_succ then
  59. log.info("socket.config", "服务器配置失败")
  60. end
  61. -- 订阅心跳消息
  62. sys.subscribe("keepalive", function()
  63. succ, full, result = socket.tx(netc, "keepalive" .. os.date())
  64. log.info("socket", "心跳包发送数据的结果", succ, full, result)
  65. end)
  66. while config_succ do
  67. --[[连接服务器,超时时间15秒
  68. @param1 任务id
  69. @param2 连接超时时间
  70. @param3 socket_ctrl
  71. @param4 ip地址或域名
  72. @param5 服务器端口号
  73. @param6 域名解析是否要IPV6,默认false,只有支持IPV6的协议栈才有效果
  74. return 失败或超时返回false,成功返回true
  75. ]]
  76. local succ,result = socket.connect(netc, host, port)
  77. if succ then
  78. log.info("socket", "服务器连接成功")
  79. sys.wait(1000)
  80. --[[发一个数据试试是否连接成功
  81. @param1 socket.create()创建的socket_ctrl
  82. @param2 要发送的数据
  83. ]]
  84. socket.tx(netc, "hello world!!!")
  85. end
  86. -- 连接服务器成功后,开始进行接收服务器数据操作
  87. while succ do
  88. --[[先接收一次数据包,数据已经缓存在底层,使用本函数只是提取出来
  89. @param1 socket_ctrl
  90. @param2 存放接收数据的zbuff
  91. ]]
  92. local succ, rx_len = socket.rx(netc, rx_buff)
  93. --[[对接收到的数据进行处理
  94. rx_buff:used()代表rx_buff内的数据长度
  95. ]]
  96. if rx_buff:used() > 0 then
  97. local rx_data = rx_buff:query()
  98. log.info("socket", "接收到的数据为:", rx_data)
  99. sys.publish("sc_txrx", rx_data)
  100. rx_buff:del()
  101. end
  102. -- 等待接收数据处理完成
  103. sys.wait(500)
  104. end
  105. sys.wait(2000)
  106. end
  107. socket.close(netc)
  108. end)
  109. -- 用户代码已结束---------------------------------------------
  110. -- 结尾总是这一句
  111. sys.run()