udpsrv.lua 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. --[[
  2. @module udpsrv
  3. @summary UDP服务器
  4. @version 1.0
  5. @date 2023.7.28
  6. @author wendal
  7. @demo socket
  8. @tag LUAT_USE_NETWORK
  9. @usage
  10. -- 具体用法请查
  11. 阅demo
  12. ]]
  13. local sys = require "sys"
  14. local udpsrv = {}
  15. local srvs = {}
  16. --[[
  17. 创建UDP服务器
  18. @api udpsrv.create(port, topic, adapter)
  19. @int 端口号, 必填, 必须大于0小于65525
  20. @string 收取UDP数据的topic,必填
  21. @int 网络适配编号, 默认为nil,可选
  22. @return table UDP服务的实体, 若创建失败会返回nil
  23. ]]
  24. function udpsrv.create(port, topic, adapter)
  25. local srv = {}
  26. -- udpsrv.port = port
  27. -- srv.topic = topic
  28. srv.rxbuff = zbuff.create(1500)
  29. local sc = socket.create(adapter, function(sc, event)
  30. -- log.info("udpsrv", sc, event, "EVENT", socket.EVENT, "CLOSED", socket.CLOSED)
  31. if event == socket.EVENT then
  32. local rxbuff = srv.rxbuff
  33. while 1 do
  34. local succ, data_len, remote_ip, remote_port = socket.rx(sc, rxbuff)
  35. -- log.info("udpsrv", "???", succ, data_len, remote_ip, remote_port)
  36. if succ and data_len and data_len > 0 then
  37. local resp = rxbuff:toStr(0, rxbuff:used())
  38. rxbuff:del()
  39. if remote_ip and #remote_ip == 5 then
  40. local ip1,ip2,ip3,ip4 = remote_ip:byte(2),remote_ip:byte(3),remote_ip:byte(4),remote_ip:byte(5)
  41. remote_ip = string.format("%d.%d.%d.%d", ip1, ip2, ip3, ip4)
  42. else
  43. remote_ip = nil
  44. end
  45. sys.publish(topic, resp, remote_ip, remote_port)
  46. else
  47. if not succ then
  48. socket.close(sc)
  49. socket.connect(sc, "255.255.255.255", 0)
  50. end
  51. break
  52. end
  53. end
  54. elseif event == socket.CLOSED then
  55. log.info("dhcpsrv", "网络中断,执行关闭流程")
  56. socket.close(self.sc)
  57. end
  58. end)
  59. if sc == nil then
  60. return
  61. end
  62. srv.sc = sc
  63. -- socket.debug(sc, true)
  64. socket.config(sc, port, true)
  65. if socket.connect(sc, "255.255.255.255", 0) then
  66. srv.send = function(self, data, ip, port)
  67. if self.sc and data then
  68. -- log.info("why?", self.sc, data, ip, port)
  69. return socket.tx(self.sc, data, ip, port)
  70. end
  71. end
  72. srv.close = function(self)
  73. socket.close(self.sc)
  74. -- sys.wait(200)
  75. socket.release(self.sc)
  76. srvs[self.sc] = nil
  77. self.sc = nil
  78. end
  79. srvs[srv.sc] = true
  80. -- log.info("udpsrv", "监听开始")
  81. return srv
  82. end
  83. socket.close(sc)
  84. -- sys.wait(200)
  85. socket.release(sc)
  86. -- log.info("udpsrv", "监听失败")
  87. end
  88. sys.subscribe("IP_READY", function()
  89. for sc, value in pairs(srvs) do
  90. log.info("udpsrv", "自动重连udpsrv", sc)
  91. if sc then
  92. socket.connect(sc, "255.255.255.255", 0)
  93. end
  94. end
  95. end)
  96. return udpsrv