如何使用AT命令

时间:2016-05-07 12:50:29

标签: sockets networking tcp at-command 3g

我有一个问题,我觉得我几乎已经解决了,但我被困在最后一段"。 我已经在这几天工作了,虽然有突破,但感觉我 我仍然是一个可行的解决方案 - 由于一些盲点。

我有一个嵌入式移动固件应用程序(我无法直接编辑),但是遇到了麻烦 通过TCP / IP / UMTS / GSM重新连接到我们的服务器。固件仅使用AT命令来启动和 通过调制解调器控制连接。我们产品的原始版本已经 在生产中工作了大约10年,然而这是一个新的"硬件的版本是 经历间歇性问题。

有许多变数,但我排除了除了一个之外的所有变量:调制解调器芯片。

  • 我们有新版本的固件,有各种更改,但广泛的A / B. 测试显示所有固件遇到同样的问题,所以我已经排除了它。
  • 我们有一个使用Winsock的传统VB6服务器。我最近写了一个更简单的Node.js 版本也几乎完全相同地展示了同样的问题(令人惊讶的是)。
  • 我们使用各种电信公司:Optus,Vodafone,Telstra。他们似乎又与这个问题无关。
  • 我们使用直接电信公司或经销商拥有自己的专用网络(APN)。再次被证明无关紧要。
  • 我们有不同的托管/网络安装,但我再次测试了许多配置 包括我们的企业网络,生产托管,AWS dev EC2s以及它们都在执行 几乎一样。
  • 我们还使用模拟/模拟版本的硬件/固件进行自动化测试 这表明各种服务器和网络似乎运行良好且类似。
  • 显示重要的最终变体 - 实际上绝对 - 差异在于 Telit UC864调制解调器和HE910。前者,旧的调制解调器工作得很好,但是较新的HE910 总是遇到问题。我已经测试了所有可能的排列和问题 跟随HE910。

当然,我无休止地阅读了Telit文档(特别是" Easy IP"和 AT命令和软件参考)但看不出太多广告的差异 两种产品之间。 HE910是Glynn的物理包装,但我不相信 这影响了它的行为。

问题:

我们的固件应用程序通过特定端口/地址连接到我们的服务器。服务器 启动固件必须响应的出站应用程序协议。 (真的 固件是"服务器"但这并不重要。)它非常轻巧简单, 每个命令/响应的字节数为10。

当固件由于事件重新连接而出现问题时,"在#34;之上现有的 套接字连接。固件始终遵循相同的过程:拆卸,配置, 连接 - 无论是否存在现有连接(这是由于 模糊性"连接"在TCP和3G上,最好是"尝试发送数据",或 重新连接以确保连接)。正如我所说,我无法在F / W中改变这种行为。

连接步骤为:

  1. a)Socket Tardown AT#SH b)等待1s
  2. 配置PDP上下文AT + CGDCONT
  3. 配置TCP / IP堆栈:AT#SCFG
  4. 激活PDP上下文:AT#SGACT
  5. 将TCP / IP连接到服务器:AT#SD
  6. (您可能会问为什么每次连接都会完成配置步骤2,3,4:因为 它们可以通过我们的应用程序协议更新。但通常设置是不变的。)

    我们遇到的问题有时是设备连接但无法通信。 这些联系似乎已经被困住了#34; - 有时几个字节通过,有时整整 命令/响应周期,但通常没有。在连接上通常是10个命令 服务,如果它们失败,服务器就会断开连接。

    到目前为止我发现了什么:

    我使用协议分析器来确定出错的地方:它是因为TCP AT#SH的FIN进程与下一个连接的TCP SYN握手重叠 以AT#SD发起。这似乎是由于延迟的最终FIN-ACK数据包到达 迟到 - 在下一个连接开始之后。

    在下面的曲目中你可以看到第8799帧迟到,作为对8788的ACK,但它来了 在下一次SYN-ACK握手中间失序!

    在这种情况发生后,调制解调器基本上就会被打破"。所有后续连接 遇到有效载荷丢包,有很多ReTransmits,双方都重新发送 有效负载数据包就好像它们没有收到有效负载ACK一样。

    在步骤1(AT#SH)之后,F / W暂停1秒。我们因问题添加了这个 我们第一次安装HE910时重新连接,(我知道它是一个kludge,但它更多 在我们的服务器状态中容纳数据库延迟而不是TCP / IP。但似乎 这1s延迟甚至不会影响TPC流量,您可以从下面的曲线中看到。 ATSH"导致"框架8786在17:16:51.585,ATSD"导致"第8792帧的SYN 在17:16:51.595,但他们之间只有10毫秒。我研究了固件,可以 确认1s延迟代码看起来正确,并在终端中观看固件 - 有IS 这些步骤的调试输出之间有1秒的延迟 - 但TCP讲的是另一个故事。

    我可以以有限的方式在固件中发送AT命令 - 每五个命令只有一个命令 秒,这显然会使手动测试偏向好又慢。如果我发送+++,AT#SH期间 连接A,然后触发连接事件,设备将成功连接。 这很有趣,因为连接的第1步无论如何都要执行AT#SH。 所以我可以得出以下两点之一:要么我们需要发送一个AT#SH"早期" (即 在连接AT#SD之前等待更长时间,或发送其中两个(不太可能)。

    据我所知,这是应用程序中常见问题的一个方面。甚至在维基百科中 在TCP / IP上,它提到了应用程序破坏OSI模型和下降的风险 如果用于应用程序级会话终止,TCP拆卸握手的错误。 我喜欢添加一个好的"再见"我们的应用程序协议,但不是 中期可行的选择...我想得到我们的两个调制解调器' TCP堆栈已对齐。

    服务器在同一IP /端口上为传入连接打开一个新套接字 组合。 Node和VB都从侦听父节点创建新的套接字资源 端口,所以我很确定在服务器端没有任何东西正在被重用" (这是一种怀疑)。 不幸的是,我对调制解调器的TCP堆栈的看法有限,仅使用AT#SI和SO 它提供了基本的和看似非实时的信息。例如当插座关闭时 服务器端,AT#SO仍然显示调制解调器本地的IP /端口,就像它没有收到 FIN拆解。

    通过全新启动,设备可以重新连接"成功约四次,直到 " jam"发生。对于4 + -1连接,这是非常可靠的。它也可以重置" 等了几个小时。所以,(对不起)感觉就像调制解调器一样慌乱。 (同样,我确实怀疑我们的电信公司是"限制"我们的连接,但跨电信测试是 太相似了。在生产中考虑我们有数以千计的这些设备 其中一个可以触发此行为。它在统计上不太可能 "通知"其他数百个连接中的四个连接?)

    最后一种行为是当连接被“堵塞”时#34;即不传播 数据,服务器在30-60秒后收到RST(节点中的ECONNRESET,只是VB中的错误)。 (只有当我们禁用更快的应用程序级别连接终止时,才会这样做 很久没被注意到了)。在此重置之后,AT#SO仍然将其显示为已连接 (使用IP),所以一开始我觉得有些3G / AP /网关丢失连接 在中间,但没有告诉客户。但是由于问题的一致性  跨越电信公司和网络,我现在发现这很难相信,只想到AT  回复不是最新的"与现实。

    这种典型的TCP跟踪显示(到目前为止,我的解释可能不正确)

    • 连接A,Syn / Ack确定
    • 我们的应用协议在第8197帧17:16:01
    • 开始并完成
    • 然后发生一个事件,启动另一个连接B
    • 第一步1.尝试拆解,第8786帧启动FIN握手
    • 拆解到框架8788 17:16:51.58
    • 然后下一个连接B从第8792 17:16:51.59
    • 开始
    • 直到第8799帧连接A的最终Fin Ack中断为止 (也许这被忽略了?)
    • 应用程序协议尝试重新开始,但第一个13字节消息不是 得到确认并且多次重新传输......
    • 我们的服务器重新发送第一个命令,将帧8978的缓冲区大小加倍
    • 我们的服务器因超时而丢弃了在9016发送Fin的连接

    微量

    Frame   TIME                REL TIME    SOURCE          DEST    SEQ ACK     FLAGS       WINDOW  PAYLOAD BYTES       
    
    8003    17:15:55.9409634    703.7329764 CLIENT_IP   SERVER_IP   0   0 (0x0) ......S.    65000   0   Flags=......S., SrcPort=17790, DstPort=50008, PayloadLen=0, Seq=316432024, Ack=0, Win=65000 (  ) = 65000    vb6.exe
    8004    17:15:55.9410316    0.0000682   SERVER_IP   CLIENT_IP   0   1       ...A..S.    8192    0   Flags=...A..S., SrcPort=50008, DstPort=17790, PayloadLen=0, Seq=319387462, Ack=316432025, Win=8192 ( Scale factor not supported ) = 8192    vb6.exe
    8016    17:15:58.5707216    2.6296900   CLIENT_IP   SERVER_IP   1   1       ...A....    65000   0   Flags=...A...., SrcPort=17790, DstPort=50008, PayloadLen=0, Seq=316432025, Ack=319387463, Win=65000 (scale factor 0x0) = 65000  vb6.exe
    8037    17:15:58.8632583    0.2925367   SERVER_IP   CLIENT_IP   1 - 14  1   ...AP...    65000   13  Flags=...AP..., SrcPort=50008, DstPort=17790, PayloadLen=13, Seq=319387463 - 319387476, Ack=316432025, Win=65000 (scale factor 0x0) = 65000 vb6.exe
    8039    17:15:59.0105830    0.1473247   CLIENT_IP   SERVER_IP   1   14      ...A....    65000   0   Flags=...A...., SrcPort=17790, DstPort=50008, PayloadLen=0, Seq=316432025, Ack=319387476, Win=65000 (scale factor 0x0) = 65000  vb6.exe
    8041    17:15:59.1006112    0.0900282   CLIENT_IP   SERVER_IP   1 - 7   14  ...AP...    65000   6   Flags=...AP..., SrcPort=17790, DstPort=50008, PayloadLen=6, Seq=316432025 - 316432031, Ack=319387476, Win=65000 (scale factor 0x0) = 65000  vb6.exe
    8068    17:15:59.2997681    0.1991569   SERVER_IP   CLIENT_IP   14  7       ...A....    64994   0   Flags=...A...., SrcPort=50008, DstPort=17790, PayloadLen=0, Seq=319387476, Ack=316432031, Win=64994 (scale factor 0x0) = 64994  vb6.exe
    8071    17:15:59.3590861    0.0593180   SERVER_IP   CLIENT_IP   14 - 19 7   ...AP...    64994   5   Flags=...AP..., SrcPort=50008, DstPort=17790, PayloadLen=5, Seq=319387476 - 319387481, Ack=316432031, Win=64994 (scale factor 0x0) = 64994  vb6.exe
    8076    17:15:59.5106103    0.1515242   CLIENT_IP   SERVER_IP   7   19      ...A....    65000   0   Flags=...A...., SrcPort=17790, DstPort=50008, PayloadLen=0, Seq=316432031, Ack=319387481, Win=65000 (scale factor 0x0) = 65000  vb6.exe
    8078    17:15:59.6005478    0.0899375   CLIENT_IP   SERVER_IP   7 - 28  19  ...AP...    65000   21  Flags=...AP..., SrcPort=17790, DstPort=50008, PayloadLen=21, Seq=316432031 - 316432052, Ack=319387481, Win=65000 (scale factor 0x0) = 65000 vb6.exe
    8100    17:15:59.7989459    0.1983981   SERVER_IP   CLIENT_IP   19  28      ...A....    64973   0   Flags=...A...., SrcPort=50008, DstPort=17790, PayloadLen=0, Seq=319387481, Ack=316432052, Win=64973 (scale factor 0x0) = 64973  vb6.exe
    8110    17:15:59.9164691    0.1175232   SERVER_IP   CLIENT_IP   19 - 37 28  ...AP...    64973   18  Flags=...AP..., SrcPort=50008, DstPort=17790, PayloadLen=18, Seq=319387481 - 319387499, Ack=316432052, Win=64973 (scale factor 0x0) = 64973 vb6.exe
    8114    17:16:00.0005725    0.0841034   CLIENT_IP   SERVER_IP   28  37      ...A....    65000   0   Flags=...A...., SrcPort=17790, DstPort=50008, PayloadLen=0, Seq=316432052, Ack=319387499, Win=65000 (scale factor 0x0) = 65000  vb6.exe
    8120    17:16:00.2005077    0.1999352   CLIENT_IP   SERVER_IP   28 - 34 37  ...AP...    65000   6   Flags=...AP..., SrcPort=17790, DstPort=50008, PayloadLen=6, Seq=316432052 - 316432058, Ack=319387499, Win=65000 (scale factor 0x0) = 65000  vb6.exe
    8127    17:16:00.2509607    0.0504530   SERVER_IP   CLIENT_IP   37 - 42 34  ...AP...    64967   5   Flags=...AP..., SrcPort=50008, DstPort=17790, PayloadLen=5, Seq=319387499 - 319387504, Ack=316432058, Win=64967 (scale factor 0x0) = 64967  vb6.exe
    8131    17:16:00.5004721    0.2495114   CLIENT_IP   SERVER_IP   34  42      ...A....    65000   0   Flags=...A...., SrcPort=17790, DstPort=50008, PayloadLen=0, Seq=316432058, Ack=319387504, Win=65000 (scale factor 0x0) = 65000  vb6.exe
    8132    17:16:00.5004721    0.0000000   CLIENT_IP   SERVER_IP   34 - 43 42  ...AP...    65000   9   Flags=...AP..., SrcPort=17790, DstPort=50008, PayloadLen=9, Seq=316432058 - 316432067, Ack=319387504, Win=65000 (scale factor 0x0) = 65000  vb6.exe
    8160    17:16:00.6603237    0.1598516   SERVER_IP   CLIENT_IP   42 - 49 43  ...AP...    64958   7   Flags=...AP..., SrcPort=50008, DstPort=17790, PayloadLen=7, Seq=319387504 - 319387511, Ack=316432067, Win=64958 (scale factor 0x0) = 64958  vb6.exe
    8162    17:16:00.7505392    0.0902155   CLIENT_IP   SERVER_IP   43  49      ...A....    65000   0   Flags=...A...., SrcPort=17790, DstPort=50008, PayloadLen=0, Seq=316432067, Ack=319387511, Win=65000 (scale factor 0x0) = 65000  vb6.exe
    8168    17:16:00.9005226    0.1499834   CLIENT_IP   SERVER_IP   43 - 55 49  ...AP...    65000   12  Flags=...AP..., SrcPort=17790, DstPort=50008, PayloadLen=12, Seq=316432067 - 316432079, Ack=319387511, Win=65000 (scale factor 0x0) = 65000 vb6.exe
    8197    17:16:01.1093181    0.2087955   SERVER_IP   CLIENT_IP   49  55      ...A....    64946   0   Flags=...A...., SrcPort=50008, DstPort=17790, PayloadLen=0, Seq=319387511, Ack=316432079, Win=64946 (scale factor 0x0) = 64946  vb6.exe
    8786    17:16:51.5853712    50.4760531  CLIENT_IP   SERVER_IP   55  49      ...A...F    65000   0   Flags=...A...F, SrcPort=17790, DstPort=50008, PayloadLen=0, Seq=316432079, Ack=319387511, Win=65000 (scale factor 0x0) = 65000  vb6.exe
    8787    17:16:51.5854172    0.0000460   SERVER_IP   CLIENT_IP   49  56      ...A....    64946   0   Flags=...A...., SrcPort=50008, DstPort=17790, PayloadLen=0, Seq=319387511, Ack=316432080, Win=64946 (scale factor 0x0) = 64946  vb6.exe
    8788    17:16:51.5860033    0.0005861   SERVER_IP   CLIENT_IP   49  56      ...A...F    64946   0   Flags=...A...F, SrcPort=50008, DstPort=17790, PayloadLen=0, Seq=319387511, Ack=316432080, Win=64946 (scale factor 0x0) = 64946  vb6.exe
    8792    17:16:51.5954781    0.0094748   CLIENT_IP   SERVER_IP   0   0 (0x0) ......S.    65000   0   Flags=......S., SrcPort=39522, DstPort=50008, PayloadLen=0, Seq=1817440308, Ack=0, Win=65000 (  ) = 65000   vb6.exe
    8793    17:16:51.5955252    0.0000471   SERVER_IP   CLIENT_IP   0   1       ...A..S.    8192    0   Flags=...A..S., SrcPort=50008, DstPort=39522, PayloadLen=0, Seq=4287314964, Ack=1817440309, Win=8192 ( Scale factor not supported ) = 8192  vb6.exe
    8799    17:16:51.7152606    0.1197354   CLIENT_IP   SERVER_IP   56  50      ...A....    64999   0   Flags=...A...., SrcPort=17790, DstPort=50008, PayloadLen=0, Seq=316432080, Ack=319387512, Win=64999 (scale factor 0x0) = 64999  vb6.exe
    8801    17:16:51.7351969    0.0199363   CLIENT_IP   SERVER_IP   1   1       ...A....    65000   0   Flags=...A...., SrcPort=39522, DstPort=50008, PayloadLen=0, Seq=1817440309, Ack=4287314965, Win=65000 (scale factor 0x0) = 65000    vb6.exe
    8821    17:16:52.0333514    0.2981545   SERVER_IP   CLIENT_IP   1 - 14  1   ...AP...    65000   13  Flags=...AP..., SrcPort=50008, DstPort=39522, PayloadLen=13, Seq=4287314965 - 4287314978, Ack=1817440309, Win=65000 (scale factor 0x0) = 65000  vb6.exe
    8846    17:16:52.4579548    0.4246034   SERVER_IP   CLIENT_IP   1 - 14  1   ...AP...    65000   13  [ReTransmit #8821]Flags=...AP..., SrcPort=50008, DstPort=39522, PayloadLen=13, Seq=4287314965 - 4287314978, Ack=1817440309, Win=65000 (scale factor 0x0) = 65000    vb6.exe
    8855    17:16:53.3003681    0.8424133   SERVER_IP   CLIENT_IP   1 - 14  1   ...AP...    65000   13  [ReTransmit #8821]Flags=...AP..., SrcPort=50008, DstPort=39522, PayloadLen=13, Seq=4287314965 - 4287314978, Ack=1817440309, Win=65000 (scale factor 0x0) = 65000    vb6.exe
    8875    17:16:54.9852348    1.6848667   SERVER_IP   CLIENT_IP   1 - 14  1   ...AP...    65000   13  [ReTransmit #8821]Flags=...AP..., SrcPort=50008, DstPort=39522, PayloadLen=13, Seq=4287314965 - 4287314978, Ack=1817440309, Win=65000 (scale factor 0x0) = 65000    vb6.exe
    8890    17:16:56.6729734    1.6877386   SERVER_IP   CLIENT_IP   1 - 14  1   ...AP...    65000   13  [ReTransmit #8821]Flags=...AP..., SrcPort=50008, DstPort=39522, PayloadLen=13, Seq=4287314965 - 4287314978, Ack=1817440309, Win=65000 (scale factor 0x0) = 65000    vb6.exe
    8909    17:16:58.3734032    1.7004298   SERVER_IP   CLIENT_IP   1 - 14  1   ...AP...    65000   13  [ReTransmit #8821]Flags=...AP..., SrcPort=50008, DstPort=39522, PayloadLen=13, Seq=4287314965 - 4287314978, Ack=1817440309, Win=65000 (scale factor 0x0) = 65000    vb6.exe
    8921    17:17:01.7429692    3.3695660   SERVER_IP   CLIENT_IP   1 - 14  1   ...AP...    65000   13  [ReTransmit #8821]Flags=...AP..., SrcPort=50008, DstPort=39522, PayloadLen=13, Seq=4287314965 - 4287314978, Ack=1817440309, Win=65000 (scale factor 0x0) = 65000    vb6.exe
    8978    17:17:08.4665817    6.7236125   SERVER_IP   CLIENT_IP   1 - 27  1   ...AP...    65000   26  [ReTransmit #8821]Flags=...AP..., SrcPort=50008, DstPort=39522, PayloadLen=26, Seq=4287314965 - 4287314991, Ack=1817440309, Win=65000 (scale factor 0x0) = 65000    vb6.exe
    9016    17:17:12.2738575    3.8072758   SERVER_IP   CLIENT_IP   27  1       ...A...F    65000   0   Flags=...A...F, SrcPort=50008, DstPort=39522, PayloadLen=0, Seq=4287314991, Ack=1817440309, Win=65000 (scale factor 0x0) = 65000    vb6.exe
    

    观察(具有有限的TCP知识)

    • 所有数据和Fin数据包都设置了Ack位 - 这看起来很不寻常。
    • 鳍握手是一个四方面,但看起来服务器正在尝试三通 包括在客户端的Ack中的Fin。也许这是由于上述原因, 但也许这会导致一个问题,即调制解调器正在进行四路拆卸 但服务器正试图做三路拆解?但它也发送了一个独立的Ack。
    • 我不明白ReTransmit如何快速发生? 帧8846 17:16:52.45仅在原始位置后420ms发送。当然这不是 是否足以超时接收ACK?我可能错过了潜在的IP错误 响应数据包,因为我只跟踪TCP级别?否则它怎么知道重新传输?

    最后 - 我的问题。

    我如何,纯粹使用AT命令,可靠地拆除TCP / IP套接字并建立 新套接字上的新连接到同一个端口/ IP,没有延迟拆卸的可能性 数据包不按顺序到达。

    或者更具体地说,我怎样才能使HE910调制解调器像UC864一样成功。

2 个答案:

答案 0 :(得分:1)

为了回答我自己的问题,我设法解决了这个问题,但未必回答基本问题。

我设法在拆卸和重新连接之间添加2s延迟添加到固件(替换所描述的1s延迟),因为这是一个简单的更改。

这完全解决了这种行为,使我能够对20多次重新连接的时间进行进一步的分析。

事实证明,HE-910调制解调器具有两个网络延迟级别的周期性循环。它每隔几分钟交替出现900毫秒和1200毫秒。这意味着前几个连接(我可以每30秒执行一次)将在代码中延迟1秒,但是当它达到1.2秒延迟时,FIN-ACK数据包会溢出到下一个连接中。

FIN ACK latency graph

此图显示"距离"当ATSH命令和ATSD命令之间存在2s延迟时,在FIN / ACK序列和下一个SYN / ACK握手之间的时间间隔。它显然具有周期性变化,偶尔会在1s暂停的边缘进行。

事实证明,我以前的1s延迟时间只是工作。一年前进行更长时间的测试就可以证明这一点。

因此虽然2s延迟只是一个更长的时间,但似乎有足够的空间来保证安全。我正在进行进一步的基准测试,看看我们是否有可能接近2s延迟。

这可能是"延迟确认"一些TCP / IP堆栈的功能,但1.2s似乎非常长。调制解调器没有控制TCP_NODELAY选项的命令,因此我无法对其进行测试。

似乎AT#SH命令是异步的,因为在拆卸甚至启动之前返回OK。否则,初始FIN将始终偏移1s或2s,而在上图中,FIN和ACK都延迟了0.8ms加上它们之间的时间。

我还将使用2s固件对UC864进行基准测试,以获得相同的图表,这将有助于更深入了解其根本原因。

答案 1 :(得分:0)

这个问题实际上是Telit HE910固件v12.00.04中的一个错误。

Glyn说他们有信心升级会修复这个问题,而且更改日志中有很多看起来相关的错误修正。

升级到v12.00.06后,所有问题都消失了。