我试图提出一种解决方案,支持嵌入式设备(基于xMega128(C))和Android应用之间的数据交换。问题是数据交换必须通过互联网进行,嵌入式设备和运行应用程序的移动设备都可以在不同的NAT后面,使用不同的ISP,3G,LTE等进行连接。
我尝试过UDP打孔,但它不适用于对称NAT。具有预测的多孔冲孔也不保证100%可靠性。我也考虑过使用ICE,但ICE C库(pjnath,libnice)与所选硬件(libs require os)不兼容。现在我正在考虑实施或使用(如果存在)流量中继服务器,但这对我来说似乎是个黑客攻击。
还有其他选择我没有考虑过吗?任何帮助将不胜感激。
理想情况下,通讯方案是:
100%可靠
相对较低的延迟(3秒绝对最大值)
可扩展(将来最多可达500k设备)
可以通过应用和设备进行初始化
多用户 - 一台设备将连接到许多Android应用程序
此外,如果这有帮助,设备和应用程序之间的数据交换不是很高 - 大约每小时1个会话,每个会话大约50个消息,它们之间有10-20秒,每个消息大约100个字节
答案 0 :(得分:0)
只要两个端点都落后于您无法控制的不同NAT,它就无法可靠地工作。没门。你需要一个接力。
答案 1 :(得分:0)
您所描述的实际上是点对点或其子集,并使其可靠地工作是很多工作。在点对点失败的情况下,您通常会回到中继服务器。它可以完成但是工作量非常大。您的要求清单也非常陡峭......
100%可靠
没有可靠的连接。您需要为应用程序构建容错功能,以使其可靠。
相对低延迟(3秒绝对最大值)
很多时候你会被物理学限制,即光速。低延迟很难。
可扩展(未来最多可提供500k设备)
我不知道这意味着什么,即这是并发连接?
来自维基百科的NAT Traversal
存在许多技术,但没有一种方法适用于所有情况 因为NAT行为不规范。许多NAT遍历技术 需要来自可公共路由IP地址的服务器的帮助。 有些方法仅在建立连接时使用服务器, 而其他人则基于通过它传递所有数据,这增加了 带宽成本和延迟增加,对实时语音不利 和视频通信。
即它有时会起作用,即它不可靠,因此您需要使用多种方法使其可靠。