socket.lua 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. --- 模块功能:数据链路激活、SOCKET管理(创建、连接、数据收发、状态维护)
  2. -- @module socket
  3. -- @author openLuat
  4. -- @license MIT
  5. -- @copyright openLuat
  6. -- @release 2017.9.25
  7. require "socket4G"
  8. module(..., package.seeall)
  9. --- SOCKET 是否有可用
  10. -- @return 可用true,不可用false
  11. socket.isReady = link.isReady
  12. local tSocketModule = nil
  13. local function init()
  14. tSocketModule = tSocketModule or {
  15. [link.CELLULAR] = socket4G,
  16. [link.CH395] = socketCh395,
  17. [link.W5500] = socketW5500,
  18. [link.ESP8266] = socketESP8266
  19. }
  20. end
  21. --- 创建基于TCP的socket对象
  22. -- @bool[opt=nil] ssl 是否为ssl连接,true表示是,其余表示否
  23. -- @table[opt=nil] cert ssl连接需要的证书配置,只有ssl参数为true时,此参数才有意义,cert格式如下:
  24. -- {
  25. -- caCert = "ca.crt", --CA证书文件(Base64编码 X.509格式),如果存在此参数,则表示客户端会对服务器的证书进行校验;不存在则不校验
  26. -- clientCert = "client.crt", --客户端证书文件(Base64编码 X.509格式),服务器对客户端的证书进行校验时会用到此参数
  27. -- clientKey = "client.key", --客户端私钥文件(Base64编码 X.509格式)
  28. -- clientPassword = "123456", --客户端证书文件密码[可选]
  29. -- }
  30. -- @table[opt=nil] tCoreExtPara 建立链接扩展参数,4G链接和ch395链接所需扩展参数不一样
  31. -- @return client,创建成功返回socket客户端对象;创建失败返回nil
  32. -- @usage
  33. -- c = socket.tcp()
  34. -- c = socket.tcp(true)
  35. -- c = socket.tcp(true, {caCert="ca.crt"})
  36. -- c = socket.tcp(true, {caCert="ca.crt", clientCert="client.crt", clientKey="client.key"})
  37. -- c = socket.tcp(true, {caCert="ca.crt", clientCert="client.crt", clientKey="client.key", clientPassword="123456"})
  38. function tcp(ssl, cert, tCoreExtPara)
  39. init()
  40. return tSocketModule[link.getNetwork()].tcp(ssl, cert, tCoreExtPara)
  41. end
  42. --- 创建基于UDP的socket对象
  43. -- @return client,创建成功返回socket客户端对象;创建失败返回nil
  44. -- @usage c = socket.udp()
  45. function udp()
  46. init()
  47. return tSocketModule[link.getNetwork()].udp()
  48. end
  49. --- 设置TCP层自动重传的参数
  50. -- @number[opt=4] retryCnt 重传次数;取值范围0到12
  51. -- @number[opt=16] retryMaxTimeout 限制每次重传允许的最大超时时间(单位秒),取值范围1到16
  52. -- @return nil
  53. -- @usage
  54. -- setTcpResendPara(3,8)
  55. -- setTcpResendPara(4,16)
  56. function setTcpResendPara(retryCnt, retryMaxTimeout)
  57. init()
  58. return tSocketModule[link.getNetwork()].setTcpResendPara(retryCnt, retryMaxTimeout)
  59. end
  60. --- 设置域名解析参数
  61. -- 注意:0027以及之后的core版本才支持此功能
  62. -- @number[opt=4] retryCnt 重传次数;取值范围1到8
  63. -- @number[opt=4] retryTimeoutMulti 重传超时时间倍数,取值范围1到5
  64. -- 第n次重传超时时间的计算方式为:第n次的重传超时基数*retryTimeoutMulti,单位为秒
  65. -- 重传超时基数表为{1, 1, 2, 4, 4, 4, 4, 4}
  66. -- 第1次重传超时时间为:1*retryTimeoutMulti 秒
  67. -- 第2次重传超时时间为:1*retryTimeoutMulti 秒
  68. -- 第3次重传超时时间为:2*retryTimeoutMulti 秒
  69. -- ...........................................
  70. -- 第8次重传超时时间为:8*retryTimeoutMulti 秒
  71. -- @return nil
  72. -- @usage
  73. -- socket.setDnsParsePara(8,5)
  74. function setDnsParsePara(retryCnt, retryTimeoutMulti)
  75. init()
  76. return tSocketModule[link.getNetwork()].setDnsParsePara(retryCnt, retryTimeoutMulti)
  77. end
  78. --- 打印所有socket的状态
  79. -- @return 无
  80. -- @usage socket.printStatus()
  81. function printStatus()
  82. init()
  83. return tSocketModule[link.getNetwork()].printStatus()
  84. end
  85. --- 设置数据传输后,允许进入休眠状态的延时时长
  86. -- 3024版本以及之后的版本才支持此功能
  87. -- 此功能设置的参数,设置成功后,掉电会自动保存
  88. -- @number tm 数据传输后,允许进入休眠状态的延时时长,单位为秒,取值范围1到20
  89. -- 注意:此时间越短,允许进入休眠状态越快,功耗越低;但是在某些网络环境中,此时间越短,可能会造成数据传输不稳定
  90. -- 建议在可以接受的功耗范围内,此值设置的越大越好
  91. -- 如果没有设置此参数,此延时时长是和基站的配置有关,一般来说是10秒左右
  92. -- @return nil
  93. -- @usage
  94. -- socket.setLowPower(5)
  95. function setLowPower(tm)
  96. init()
  97. return tSocketModule[link.getNetwork()].setLowPower(tm)
  98. end
  99. --- 设置IP数据流量统计上报间隔
  100. -- 此功能设置的参数,设置成功后,掉电不会保存,每次开机,应用脚本需要重新设置
  101. -- @number interval IP数据流量统计上报间隔,单位为秒,建议取值不要小于60秒;0表示关闭此功能,默认为0
  102. -- @return nil
  103. -- @usage
  104. -- socket.setIpStatis(60)
  105. -- 每隔60秒会通过sys.publish("LIB_IP_STATIS_RPT", dataFlow)
  106. -- 应用脚本通过sys.subscribe("LIB_IP_STATIS_RPT", function(dataFlow)
  107. -- --自行处理interval间隔内,新增的数据流量dataFlow,单位字节
  108. -- end)
  109. function setIpStatis(interval)
  110. init()
  111. return tSocketModule[link.getNetwork()].setIpStatis(interval or 0)
  112. end