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"})
- ssl
bool
[此参数可选,默认值为: nil]
- 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);
- address
string
- mt:asyncSelect (keepAlive, pingreq)
-
异步收发选择器
Parameters:
- keepAlive
number
服务器和客户端最大通信间隔时间,也叫心跳包最大时间,单位秒
- pingreq
string
心跳包的字符串
Returns:
-
boole,false 失败,true 表示成功
- keepAlive
number
- mt:asyncSend (data)
-
异步发送数据
Parameters:
- data
string
数据
Returns:
-
result true - 成功,false - 失败
Usage:
c = socket.tcp(); c:connect(); c:asyncSend("12345678");
- data
string
- mt:asyncRecv ()
-
异步接收数据
Returns:
-
nil, 表示没有收到数据
-
data 如果是UDP协议,返回新的数据包,如果是TCP,返回所有收到的数据,没有数据返回长度为0的空串
Usage:
c = socket.tcp(); c:connect()
data = c:asyncRecv()
-
- mt:send (data)
-
发送数据
Parameters:
- data
string
数据
Returns:
-
result true - 成功,false - 失败
Usage:
c = socket.tcp(); c:connect(); c:send("12345678");
- data
string
- 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:
-
result 数据接收结果,true表示成功,false表示失败
-
data 如果成功的话,返回接收到的数据;超时时返回错误为"timeout";msg控制退出时返回msg的字符串
-
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")
- timeout
number
[此参数可选,默认值为: 0]
- 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)
- retryCnt
number
[此参数可选,默认值为: 4]
- 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)
- parserFnc
function
[此参数可选,默认值为: nil]
- 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)
- mode
number
[此参数可选,默认值为: 0]