Module socket

模块功能:数据链路激活、SOCKET管理(创建、连接、数据收发、状态维护)

Info:

  • Copyright: openLuat
  • Release: 2017.9.25
  • License: MIT
  • Author: openLuat

Functions

tcp ([ssl=nil][, cert=nil]) 创建基于TCP的socket对象
udp () 创建基于UDP的socket对象
mt:connect (address, port, timeout) 连接服务器
mt:asyncSelect (keepAlive, pingreq) 异步收发选择器
mt:asyncSend (data) 异步发送数据
mt:asyncRecv () 异步接收数据
mt:send (data) 发送数据
mt:recv ([timeout=0][, msg=nil][, msgNoResume=nil]) 接收数据
mt:close (slow) 销毁一个socket
setTcpResendPara ([retryCnt=4][, retryMaxTimeout=16]) 设置TCP层自动重传的参数
setDnsParser ([parserFnc=nil]) 设置用户自定义的DNS解析器.
setSendMode ([mode=0]) 设置数据发送模式(在网络准备就绪之前调用此接口设置).

Fields

isReady SOCKET 是否有可用


Functions

tcp ([ssl=nil][, cert=nil])
创建基于TCP的socket对象

Parameters:

  • ssl bool [此参数可选,默认值为: nil]
    是否为ssl连接,true表示是,其余表示否
  • cert table [此参数可选,默认值为: nil]
    ssl连接需要的证书配置,只有ssl参数为true时,才参数才有意义,cert格式如下:
     {
         caCert = "ca.crt", --CA证书文件(Base64编码 X.509格式),如果存在此参数,则表示客户端会对服务器的证书进行校验;不存在则不校验
         clientCert = "client.crt", --客户端证书文件(Base64编码 X.509格式),服务器对客户端的证书进行校验时会用到此参数
         clientKey = "client.key", --客户端私钥文件(Base64编码 X.509格式)
         clientPassword = "123456", --客户端证书文件密码[可选]
     }

Returns:

  • client,创建成功返回socket客户端对象;创建失败返回nil

Usage:

  • c = socket.tcp()
    c = socket.tcp(true)
    c = socket.tcp(true, {caCert="ca.crt"})
    c = socket.tcp(true, {caCert="ca.crt", clientCert="client.crt", clientKey="client.key"})
    c = socket.tcp(true, {caCert="ca.crt", clientCert="client.crt", clientKey="client.key", clientPassword="123456"})
udp ()
创建基于UDP的socket对象

Returns:

  • client,创建成功返回socket客户端对象;创建失败返回nil

Usage:

  • c = socket.udp()
mt:connect (address, port, timeout)
连接服务器

Parameters:

  • address string
     服务器地址,支持ip和域名
  • port
     string或者number类型,服务器端口
  • timeout number
     链接服务器最长超时时间

Returns:

  • bool result true - 成功,false - 失败

Usage:

  • c = socket.tcp(); c:connect("www.baidu.com",80,5);
mt:asyncSelect (keepAlive, pingreq)
异步收发选择器

Parameters:

  • keepAlive number
    服务器和客户端最大通信间隔时间,也叫心跳包最大时间,单位秒
  • pingreq string
    心跳包的字符串

Returns:

  • boole,false 失败,true 表示成功
mt:asyncSend (data)
异步发送数据

Parameters:

Returns:

  • result true - 成功,false - 失败

Usage:

  • c = socket.tcp(); c:connect(); c:asyncSend("12345678");
mt:asyncRecv ()
异步接收数据

Returns:

  1. nil, 表示没有收到数据
  2. data 如果是UDP协议,返回新的数据包,如果是TCP,返回所有收到的数据,没有数据返回长度为0的空串

Usage:

  • c = socket.tcp(); c:connect()
  • data = c:asyncRecv()
mt:send (data)
发送数据

Parameters:

Returns:

  • result true - 成功,false - 失败

Usage:

  • c = socket.tcp(); c:connect(); c:send("12345678");
mt:recv ([timeout=0][, msg=nil][, msgNoResume=nil])
接收数据

Parameters:

  • timeout number [此参数可选,默认值为: 0]
     可选参数,接收超时时间,单位毫秒
  • msg string [此参数可选,默认值为: nil]
     可选参数,控制socket所在的线程退出recv阻塞状态
  • msgNoResume bool [此参数可选,默认值为: nil]
     可选参数,控制socket所在的线程退出recv阻塞状态,false或者nil表示“在recv阻塞状态,收到msg消息,可以退出阻塞状态”,true表示不退出

Returns:

  1. result 数据接收结果,true表示成功,false表示失败
  2. data 如果成功的话,返回接收到的数据;超时时返回错误为"timeout";msg控制退出时返回msg的字符串
  3. param 如果是msg返回的false,则data的值是msg,param的值是msg的参数

Usage:

  • c = socket.tcp(); c:connect()
  • result, data = c:recv()
  • false,msg,param = c:recv(60000,"publish_msg")
mt:close (slow)
销毁一个socket

Parameters:

  • slow
    
            

Returns:

  • nil

Usage:

  • c = socket.tcp(); c:connect(); c:send("123"); c:close()
setTcpResendPara ([retryCnt=4][, retryMaxTimeout=16])
设置TCP层自动重传的参数

Parameters:

  • retryCnt number [此参数可选,默认值为: 4]
    重传次数;取值范围0到12
  • retryMaxTimeout number [此参数可选,默认值为: 16]
    限制每次重传允许的最大超时时间(单位秒),取值范围1到16

Returns:

  • nil

Usage:

  • setTcpResendPara(3,8)
    setTcpResendPara(4,16)
setDnsParser ([parserFnc=nil])
设置用户自定义的DNS解析器.
 通过域名连接服务器时,DNS解析的过程如下:
 1、使用core中提供的方式,连接运营商DNS服务器解析,如果解析成功,则结束;如果解析失败,走第2步
 2、使用脚本lib中提供的免费腾讯云HttpDns解析,如果解析成功,则结束;如果解析失败,走第3步
 3、如果存在用户自定义的DNS解析器,则使用此处用户自定义的DNS解析器去解析

Parameters:

  • parserFnc function [此参数可选,默认值为: nil]
    用户自定义的DNS解析器函数,函数的调用形式为:
          parserFnc(domainName,token),调用接口后会等待解析结果的消息通知或者40秒超时失败
              domainName:string类型,表示域名,例如"www.baidu.com"
              token:string类型,此次DNS解析请求的token,例如"1"
          解析结束后,要publish一个消息来通知解析结果,消息参数中的ip地址最多返回一个,sys.publish("USER_DNS_PARSE_RESULT_"..token,ip),例如:
              sys.publish("USER_DNS_PARSE_RESULT_1","115.239.211.112")
                  表示解析成功,解析到1个IP地址115.239.211.112
              sys.publish("USER_DNS_PARSE_RESULT_1")
                  表示解析失败

Returns:

  • nil

Usage:

  • socket.setDnsParser(parserFnc)
setSendMode ([mode=0])
设置数据发送模式(在网络准备就绪之前调用此接口设置).
 如果设置为快发模式,注意如下两点:
 1、通过send接口发送的数据,如果成功发送到服务器,设备端无法获取到这个成功状态
 2、通过send接口发送的数据,如果发送失败,设备端可以获取到这个失败状态
 慢发模式可以获取到send接口发送的成功或者失败

**************************************************************************************************************************************************************** TCP协议发送数据时,数据发送出去之后,必须等到服务器返回TCP ACK包,才认为数据发送成功,在网络较差的情况下,这种ACK确认就会导致发送过程很慢。 从而导致用户程序后续的AT处理逻辑一直处于等待状态。例如执行AT+CIPSEND动作发送一包数据后,接下来要执行AT+QTTS播放TTS,但是CIPSEND一直等了1分钟才返回SEND OK, 这时AT+QTTS就会一直等待1分钟,可能不是程序中想看到的。 此时就可以设置为快发模式,AT+CIPSEND可以立即返回一个结果,此结果表示“数据是否被缓冲区所保存”,从而不影响后续其他AT指令的及时执行 AT版本可以通过AT+CIPQSEND指令、Luat版本可以通过socket.setSendMode接口设置发送模式为快发或者慢发 快发模式下,在core中有一个1460*7=10220字节的缓冲区,要发送的数据首先存储到此缓冲区,然后在core中自动循环发送。 如果此缓冲区已满,则AT+CIPSEND会直接返回ERROR,socket:send接口也会直接返回失败 同时满足如下几种条件,适合使用快发模式: 1. 发送的数据量小,并且发送频率低,数据发送速度远远不会超过core中的10220字节大小; 没有精确地判断标准,可以简单的按照3分钟不超过10220字节来判断;曾经有一个不适合快发模式的例子如下: 用户使用Luat版本的http上传一个几十K的文件,设置了快发模式,导致一直发送失败,因为循环的向core中的缓冲区插入数据, 插入数据的速度远远超过发送数据到服务器的速度,所以很快就导致缓冲区慢,再插入数据时,就直接返回失败 2. 对每次发送的数据,不需要确认发送结果 3. 数据发送功能不能影响其他功能的及时响应 ****************************************************************************************************************************************************************

Parameters:

  • mode number [此参数可选,默认值为: 0]
    数据发送模式,0表示慢发,1表示快发

Returns:

  • nil

Usage:

  • socket.setSendMode(1)

Fields

isReady
SOCKET 是否有可用
generated by LDoc 1.4.6 Last updated 2019-11-19 10:46:53