合宙Luat | Cat.1 Socket数据收不到?学会两招不掉线

1
服务器收不到Socket数据的原因
Socket是大家使用Cat.1模块常用的功能之一,但Cat.1模块不是直接跟服务器连接,而是通过NAT(即网络地址转换)与服务器连接。
一个会话建立后会在NAT设备上建立一个关联表,在会话静默的这段时间,NAT网关会进行老化操作。
这是任何一个NAT网关必须做的事情,因为IP和端口资源有限,通信的需求无限,所以必须在会话结束后回收资源。
NAT会维护一个映射表,这个映射表会定时检查:
如果10分钟内这路Socket跟服务器没任何数据往来,就会回收这路的地址,10分钟后应用上再发数据就找不到路由地址了。——这个就是发送数据提示成功,服务器却收不到任何数据的原因。
如果10分钟内有数据更新,计时器会重置为10分钟。
2
两种方法轻松解决
接下来我们着重讲解,合宙Lua版本Cat.1模块维持Socket连接不掉线的两种方法。
方法一:在应用层发心跳包数据
这种方式模块会在应用层发送明文数据,以维持Socket连接不掉线。
合宙提供的上层软件中的:
\demo\socket\sync\sendWaitRecv\longConnection 示例,支持应用层心跳包的发送(见socketOutMsg.lua脚本)。
最新版上层软件下载地址详见:
第一步:建立socket客户端
socketClient=socket.tcp()
第二步:连接服务器
socketClient:connect(“mydomain.aa.bbb”,“12345”)
注:mydomain.aa.bbb为服务器地址和12345为端口号, 因为仅为示例,所以皆为虚构.
第三步:发送数据
socketClient:send(data)
详细内容参见上层软件示例。
方法二:采用保活探针方式
这种方式是TCP协议层实现的,只适用于TCP连接。也就是说,这种实现方式不会对应用层的数据流产生任何影响,应用层也看不到心跳包的内容。
这种实现方式叫做——TCP保活探针(TCP Keep-Alive Probe)。
该方式是用socket的属性参数设置socketcore.sock_setopt()这个API来实现的。示例如下:
if socket.isReady() then
--创建一个socket tcp客户端
local socketClient = socket.tcp()
--阻塞执行socket connect动作,直至成功
local result,id = socketClient:connect("mydomain.aa.bbb","12345")
if result then
log.info("socketClient.id = ",id)
--开启保活功能
socketcore.sock\_setopt(id,socketcore.SOL\_SOCKET, socketcore.SO\_KEEPALIVE,1)
--在300秒内,链接上无任何数据交互,则发送初始保活探针
socketcore.sock\_setopt(id,socketcore.IPPROTO\_TCP, socketcore.TCP\_KEEPIDLE,300)
--如果保活探针发送失败,60s再次重传
socketcore.sock\_setopt(id,socketcore.IPPROTO\_TCP, socketcore.TCP\_KEEPINTVL,60)
--保活探针的最大重传数量为3
socketcore.sock\_setopt(id,socketcore.IPPROTO\_TCP, socketcore.TCP\_KEEPCNT,3)
end
end
做完这些设置后,TCP Socket连接就能一直保持不掉线。
合宙Luat | Cat.1 Socket数据收不到?学会两招不掉线的更多相关文章
- 合宙Luat | 一文读懂LuaTask延时,看我如何从《射雕英雄传》角度分析。
武侠小说中,主人公之所以能纵横江湖,常常离不开一样可遇不可求的绝世法宝--武功秘籍.如今勇于尝试的开发者,笃定地告诉后来者:选Luat二次开发,就如同拥有了物联网开发的武功秘籍. 本期让我们通过< ...
- 合宙Luat直播间即将开启,你揭开行业奥秘,让你快人一步。
嗨~刚陪你们过儿童节 和你们一起成长的合宙Luat 又有新计划 -- 合宙Luat官方直播即将开启 - 敬请关注 - - 官方直播什么内容 - 可能是合宙研发动态 可能是新品发布资讯 可能是行业大咖分 ...
- 合宙Luat | 电源设计——模块应用必看的2个要点
在模块应用设计中,电源设计是很重要的一部分. 由于射频发射时,会在短时间有一个较大电流的突发脉冲.在突发脉冲阶段内,电源必须能够提供高的峰值电流,不然有可能会引起供电电压的跌落. 而很多初学的朋友 ...
- 合宙模块LUA相关资料汇总
1. 目录 1. 目录 [2. LUA二次开发](#2. LUA二次开发) 2.1 [新手教程](#2.1 新手教程) 2.2 [进阶教程](#2.2 进阶教程) 2.3 [LUA开发环境](#2.3 ...
- 合宙模块AT相关资料汇总
1. 目录 1. 目录 [2. 新手教程](#2. 新手教程) [3. 产品资料](#3. 产品资料) 3.1 [2G模块(GPRS / GPRS+GNSS)](#3.1 2G模块(GPRS / GP ...
- C# Socket Server 收不到数据
#/usr/bin/env python # -*- coding: utf- -*- # C# Socket Server 收不到数据 # 说明: # 最近在调Python通过Socket Clie ...
- AS3: Socket 数据包 收 发
AS3.0中使用Socket使用tcp服务器协议,它是一种流协议,不停的将分片传输给客户端,P作为流,发包是不会整包到达的,而是源源不断的. 它不同于UDP服务器协议,UDP作为数据包协议,整包到达. ...
- C# 实现的多线程异步Socket数据包接收器框架
转载自Csdn : http://blog.csdn.net/jubao_liang/article/details/4005438 几天前在博问中看到一个C# Socket问题,就想到笔者2004年 ...
- 合宙AIR105(四): SPI, MAX7219 8x8LED驱动
目录 合宙AIR105(一): Keil MDK开发环境, DAP-Link 烧录和调试 合宙AIR105(二): 时钟设置和延迟函数 合宙AIR105(三): 定时器, 定时器中断和PWM输出 合宙 ...
随机推荐
- 求曲线y=lnx在区间(2,6)内的一条切线,使得该切线与直线x=2,x=6及曲线y=lnx所围成的图形的面积最小。
求曲线y=lnx在区间(2,6)内的一条切线,使得该切线与直线x=2,x=6及曲线y=lnx所围成的图形的面积最小. 1.先画图. 2.设切点为(a,lna) (2<a<6) 3.切线方程 ...
- phpstorm 实现分屏显示
- aspnetcore 应用 接入Keycloak快速上手指南
登录及身份认证是现代web应用最基本的功能之一,对于企业内部的系统,多个系统往往希望有一套SSO服务对企业用户的登录及身份认证进行统一的管理,提升用户同时使用多个系统的体验,Keycloak正是为此种 ...
- MFC Object 与 Windows Object
MFC Object 和 Windows Object的含义 Window Object(Window对象)是Win32下用句柄表示的Windows操作系统对象.MFC Object(MFC对象)是C ...
- SE_Work4_软件案例分析
项目 内容 课程:北航-2020-春-软件工程 博客园班级博客 要求:分析软件案例 个人博客作业-软件案例分析 班级 005 这个作业在哪个具体方面帮助我实现目标 分析对比一类软件,学会规划分析软件的 ...
- margin (子元素远离父元素边框)
如果父盒子没有设置border框着,那么他的子元素无法利用margin-top 来远离父元素的上边框 如果使用了margin-top会使子元素和父元素一起往下移 (子想离,父不设置border边框 则 ...
- [bug] Mysql 对实体 "characterEncoding" 的引用必须以 ';' 分隔符结尾。
参考 https://blog.csdn.net/cherrycheng_/article/details/51251441?
- zabbix screen 图片以邮件形式发送
zabbix screen 图片以邮件形式发送 #! /usr/bin/env python #coding=utf-8 # Andy_f import time,os import urllib i ...
- 源码安装Apache(httpd)
[RHEL8] !!!测试环境我们首关闭防火墙和selinux [root@localhost ~]# systemctl stop firewalld [root@localhost ~]# sys ...
- python基础之变量类型和数据运算
一.变量的类型 程序中,为了更充分的利用内存空间以及更有效率的管理内存,变量是有不同的类型的. 怎样知道一个变量的类型呢? 在python中,只要定义了一个变量,而且它有数据,那么它的类型就已经确定了 ...