本示例实现的功能是:基于TCP的socket透传demo项目,uart1透传数据到指定服务器。
功能描述:
1、数据网络准备就绪后,连接后台
2、连接成功后,循环“读取mcu通过串口发送过来的数据,每次最多发送1K字节”
3、与后台保持长连接,断开后主动再去重连,连接成功仍然按照第2条发送数据
4、收到后台的数据时,在rcv函数中打印出来,并且通过串口透传给mcu
测试时请搭建自己的服务器,并且修改下面的PROT,ADDR,PORT,支持域名和IP地址
此例子为长连接,只要是软件上能够检测到的网络异常,可以自动去重新连接
1.本功能需要socket和uart两个模块,所以分为两个文件来实现。实现sockt功能,在编辑工具建立一个sck.lua的文件(不一定叫这个名字,用户可以自己随便取名)
2.设置本文件被全体可见。也就意味着,一旦test被某一文件加载,则test在任何文件中均可被看见,即test中全局变量和函数均可被任何文件调用。
module(...,package.seeall)
3.test文件头需要 require "xxx" 模块。加载后,就可以调用xxx.lua库文件中的全局变量和函数了
require"socket"
4.定义print函数,调试用
local function print(...)
_G.print("sck",...)
end
5.定义相关参数
local ssub,schar,smatch,sbyte,slen = string.sub,string.char,string.match,string.byte,string.len
--测试时请搭建自己的服务器
local SCK_IDX,PROT,ADDR,PORT = 1,"TCP","120.26.196.195",9999
--linksta:与后台的socket连接状态
local linksta
--一个连接周期内的动作:如果连接后台失败,会尝试重连,重连间隔为RECONN_PERIOD秒,最多重连RECONN_MAX_CNT次
--如果一个连接周期内都没有连接成功,则等待RECONN_CYCLE_PERIOD秒后,重新发起一个连接周期
--如果连续RECONN_CYCLE_MAX_CNT次的连接周期都没有连接成功,则重启软件
local RECONN_MAX_CNT,RECONN_PERIOD,RECONN_CYCLE_MAX_CNT,RECONN_CYCLE_PERIOD = 3,5,3,20
--reconncnt:当前连接周期内,已经重连的次数
--reconncyclecnt:连续多少个连接周期,都没有连接成功
--一旦连接成功,都会复位这两个标记
--conning:是否在尝试连接
local reconncnt,reconncyclecnt,conning = 0,0
--正在发送的数据
local sndingdata = ""
6.创建到后台服务器的连接
--[[创建到后台服务器的连接;
如果数据网络已经准备好,会理解连接后台;否则,连接请求会被挂起,等数据网络准备就绪后,自动去连接后台 ntfy:socket状态的处理函数
rcv:socket接收数据的处理函数]]--
function connect()
socket.connect(SCK_IDX,PROT,ADDR,PORT,ntfy,rcv)
conning = true
end
7.socket状态的处理函数
--[[
函数名:ntfy
功能 :socket状态的处理函数
参数 :
idx:number类型,socket.lua