TCPIP常见问题
为什么连接服务器会失败?
- 服务器必须是公网地址
- 使用PC上的TCP UDP测试工具客户端、或者mqtt.fx,连接服务器确认一下是否可以连接成功,排除服务器故障
- 如果连接ssl服务器,确认下core文件是否支持ssl功能(例如2G模块的某些core文件不支持ssl功能)
- 2G网络不要使用中国联通卡
- 检查下模块信号、网络注册、网络附着、PDP激活状态
- 检查下SIM卡是否欠费【4G模块有一种欠费表现:无法注册4G网络,可以注册2G网络】
TCP有自动重连功能吗?
底层没有自动重连,重连机制在应用层处理。
TCP连接会自动发送ping包吗?
可以设置usocket.TCP_KEEPALIVE保活时间,建议自行编写定时发送ping包功能。
QuecPython MQTT支持的QoS有哪些?
目前不支持QoS2,支持QoS0、QoS1
DNS解析失败怎么排查原因?
检查SIM卡是否注网成功以及检查该地址的有效性再次进行尝试。
SIM卡进行插拔后网络请求失败是什么原因?
检查SIM卡是否注网成功以及检查该地址的有效性再次进行尝试。
自己搭建的MQTT客户端,有什么MQTT服务器调试工具吗
可以通过MQTT.fx工具来测试mqtt运行状况。
如何设置APN信息?
如果是公网SIM卡,不需要用户主动设置APN,软件自动去网络端查询APN进行设置。
如果是专网SIM卡,首先咨询SIM卡提供商APN参数,然后在TCP发起连接倩尽可能靠前的位置设置。
同样的设备在一个地方可以上网,在另一个地方不能上网
首选确认是不是卡的问题,或者是当地网络影响导致。
为什么4G模块专网卡连接服务器失败?
- 检查APN参数是否设置正确
- 如果有其他厂家的模块,对比测试下是否连接正常
- 如果无法百分百保证服务器配置没问题,最好在服务器端用wireshark抓包,或者在服务器上安装一个第三方工具,开启一个服务器端口来对比测试
- 用定向Ip的物联网卡,需要把域名或IP加入白名单才能使用
同种模块,不同的卡联网速度不同是什么问题?
确认卡有无限制,需要考虑网络制式的因素。
各系列模组最多可同时创建多少路socket?
- EC200A系列模组最多可同时创建 64 路socket。
- ECxxxG/ECxxxU系列模组最多可同时创建 15 路socket。
- BG95系列模组最多可同时创建 20 路socket。
各系列模组创建socket时返回的句柄fd的编号规则是什么?
- ECxxxA/ECxxxM/ECxxxN系列的模组模组创建socket时返回的句柄fd从 3 开始累加,0、1、2 三个fd为内部保留用。
- ECxxxG/ECxxxU/BG95系列的模组模组创建socket时返回的句柄fd从 0 开始累加。
数据收发延迟大、速度慢、经常失败、掉线断开
检查下是否存在代码逻辑错误,导致异常
检查下是否不断重启,导致异常
检查下服务器网络是否稳定,不要用内网穿透方式搭建服务器
检查下使用环境是否网络覆盖不好,例如车库、地下、电梯、山区等
检查下模块信号、网络注册、网络附着、PDP激活状态
排查是否为设备天线问题:发出来设备的天线调试指标参数给我司技术支持人员
如果经常出现连接被动断开:
如果直接使用的是tcp udp socket连接,检查下心跳包的频率,基站策略会关闭长时间没有数据传输的连接,建议心跳包的频率不要超过4分钟,一般都是建议使用2分钟
如果使用的是mqtt连接,检查下mqtt keep alive的时间,基站策略会关闭长时间没有数据传输的连接,建议心跳包的频率不要超过4分钟,一般都是建议使用2分钟
如果使用的是mqtt连接,检查下是否在1.5倍的mqtt keep alive的时间,没有成功发送数据到服务器,就会被被服务器主动断开,这种情况一般都是发送数据超时引起的
排查是否为网络问题:如果同一地点的所有设备都有问题,可能和网络环境有关系;使用手机设置为同样的网络模式,对比测试确认下;或者把设备移动到其他距离此地点比较远的地方对比测试。
排查是否设备单体问题:如果同一地点,某些设备正常,某些设备异常,按照如下几种情况分析
分析正常设备和异常设备的使用环境是否相同:
如果不同,例如异常设备固定在钢制墙壁上,正常设备放置在桌子上,钢制墙壁可能对天线射频有干扰,将异常设备和正常设备放置在同样的使用环境中,再对比测试
如果相同,参考下面的步骤
分析正常和异常的设备,驻留的小区是否相同:
如果相同,重点排查异常设备的天线射频部分,分析不出结果的话,异常设备寄给我司分析
如同不同,多测试几次,确认下,是不是在异常小区内很容易出问题,如果异常小区很容易出问题,可能就是小区拥堵造成的
提供日志给QuecPython技术支持人员
如何统计流量
运营商按照ip包来统计流量,ip包包含:ip包头+tcp包头+用户数据,以IPv4为例:
- ip包头包含固定的20字节+可选的4字节,至少20字节
- tcp包头包含固定的20字节+可选的4字节,至少20字节
用户数据就是用户能够感知到的数据内容了,如果直接使用socket,就是用户感知的数据;如果使用http、mqtt、ssl,这部分数据就不是用户能够感知的原始数据了,http会加上http包头,mqtt会加入mqtt的包裹部分,ssl会加密数据
tcp数据收发时,有ack确认机制,例如设备发数据给服务器后,还会收到服务器返回的tcp ack包,这个tcp ack包(至少40字节)也是计算在流量之内的。接收到服务器下发的数据时,设备也会回复一个tcp ack包,同样这个ack包仍然计算在流量之内
另外,socket连接以及断开连接,都有多次数据收发,这部分也会消耗流量
例如有一个tcp socket连接,连接成功后,每分钟设备发送2字节的心跳数据到服务器,服务器收到数据后,再回复2字节的心跳应答数据。这个过程中,每分钟消耗的流量至少有42(设备发送)+40(服务器回复ack)+42(服务器发送)+40(设备回复ack)=164字节,实际处理中,服务器回复ack和服务器发送可能合并成一个IP包42字节,这样的话,至少也要42+42+40 = 124字节。这是最简单的算法,实际应用中,还要考虑到重传、包头中的可选字节,应该会比这里计算的流量多一些。如果要准确计算,建议在服务器端用wireshark抓包分析
另外一个常见的例子是,为什么通过http下载一个文件,实际消耗的流量比文件本身要多呢?跟上个例子类似,文件本身大小仅仅是用户数据,除了用户数据外,还有如下几部分的流量消耗:
- 连接服务器消耗流量
- http请求时有http头,服务器下发数据时也有http头
- 每包数据都有tcp头和ip头
- 重传也会消耗流量
- 与服务器断开连接也需要消耗流量
4g模块可以同时作为服务器和客户端使用吗?
对于IPv4协议来说,一般不能作为服务器使用, 模块能获取的是运营商分配的内网IP;对于专网卡,运营商分配的IP地址可以在专网内进行通信,因此可以作为服务器使用。
对于IPv6协议来说,其全局链路地址就是公网IP地址,因为可以作为服务器使用。
为什么我一包数据只有不到50B,一天消耗的流量要远远大于实际传输值
如果使用的是TCP协议,需要三次握手四次挥手才算完成了一次数据交互,原始数据不多但是由于TCP协议决定的一包数据必须要加包头包尾帧校验等,所以实际消耗的流量不止50B,部分运营商有限制每一包数据必须1KB起发,不足1KB也会加各种校验凑足1KB。
如果KeepAlive设置的时间长,会不会被基站断开?
会,一般建议使用2分钟,不建议超过4分钟,基站策略会关闭长时间没有数据传输的连接,太长时间可能会导致连接被基站关闭
如果有很多个mqtt设备连接到服务器,收发数据是怎样区分设备的
通过clientid确保设备唯一性,可以设置IMEI为clientid