既然你在寻求建议,我会建议这个:
不要重新发明。尽可能重复使用。您可以使用 SSH 执行隧道,因此通过智能设备上的 GPRS 建立 SSH 连接(例如,PuTTY 或 plink 的端口,在循环内);将远程端口转发到本地端口,绑定到 SSH 服务器的本地地址 (127.0.0.1 (sshd):4567 => localhost (smart_device_01):4567)。您的客户端连接到您的 SSH 服务器并访问为每个设备分配的端口。
话虽如此,这可能不是您要寻找的答案。下面 - 您可能正在寻找的答案。
根据我对 LogMeIn 工作原理的分析,您需要创建一个 HTTPS 或 TLS 服务器,您的智能设备将在其中推送数据。我们称它为您的隧道服务器。
您可能希望生成一个新线程,该线程反复尝试与隧道服务器建立连接(根据您指定的要求,从智能设备到服务器的出站连接)。使用像 BEEP/BXXP 这样的协议,您可以封装和多路复用面向消息或面向流的会话。将 BXXP/BEEP 封装到 TLS 中,并通过隧道连接到您的隧道服务器。BEEP 允许您将流多路复用到一个连接上——如果您想要内部 LogMeIn 解决方案的全部功能,您将需要使用类似的东西。
建立连接后,进行新的 BEEP 会话。使用新会话,告诉隧道服务器您的系统标识信息(设备名称、设备身份验证签名)。将心跳数据(定期时间戳)写入此新会话。
设置与您的 BEEP 控制会话接口的回调(或另一个线程)。注意请求服务的消息。当这样的请求进来时,产生所需的线程来从您的自定义远程显示协议中复制数据,并通过同一通道将这些数据推回。
这为您的智能设备程序奠定了基本前提。您可以根据需要为此添加功能,例如,匹配 LMI 的 IT Reach 订阅提供的功能(远程注册表、安全隧道 Telnet、远程文件系统、远程打印、远程声音......你明白了)
我会假设您知道如何正确保护所有这些东西,以便为您的客户端进行身份验证和授权(是否允许用户 foo 访问智能设备栏?)。
在您的隧道服务器上,启动一个服务器套接字(侦听入站连接,或从智能设备的角度来看,智能设备出站连接)来解复用连接和会话。打开连接后,启动 BEEP 并注册回调/启动线程以等待身份验证/心跳会话。对智能设备执行 AAA 所需的检查——这些设备是否被允许、是否已知、费用多少等。 您的隧道服务器代表您的智能设备转发数据。 对于每个 BEEP 会话,在 AAA 过程成功后,为 BEEP 会话附加一个名称(设备名称);失败时,关闭连接并让 AAA 机制知道(以阻止攻击者)。您的隧道服务器还应该设置与前端交互所需的内容——也就是说,它应该具有与 BEEP 交互的代码,以解复用远程显示数据的流。
在您的前端服务器(可以是与隧道服务器相同的框)上,安装 AAA 例程——检查用户是否已知、是否允许用户、应向用户收取多少费用等。一旦所有检查通过,建立从前端服务器到隧道服务器的安全连接。获取隧道服务器知道允许用户访问的设备名称。此时,您应该能够从隧道服务器获取基于设备名称的“纯文本”流。将此流转发回用户(例如,通过 TLS,或再次通过 TLS 上的 BEEP),或发送远程显示客户端所需的配置,以使用所需参数连接到隧道服务器,以访问远程显示协议的流。