websocket将无法连接远程服务器
我有一个网页来控制树莓派上的恒温器,并且在尝试从远程客户端获取websockets时遇到了困难。但是在局域网上看起来工作正常。我明显错过了一些东西(可能是基本的东西),但我似乎无法弄清楚它是什么。websocket将无法连接远程服务器
该pi的本地ip是192.168.1.134
。该网页(由Apache服务器提供)具有URL http://192.168.1.134:8010/thermostat.html
。该页面启动一些JavaScript,然后尝试通过ws://192.168.1.134:9000
使用websockets连接到pi的主程序。 (pi上的服务器正在运行libwebsockets)。 websocket出现了,它似乎工作正常。然后,我尝试通过远程客户端(一个手机,其中WiFi关闭)从http:\\23.239.99.99:8010\thermostat.html
进行连接。 html/js文件加载正常,但Web套接字尝试连接到uri ws:\\23.239.99.99:9000
和这个样本。
据我所知道的,NAT似乎是正确配置:
name ext ext protocol int int ip addr interface
port port port port
start end start end
Thermostat3 8010 8010 TCP 8010 8010 192.168.1.134 eth3.1
Thermostat5 8000 8000 TCP/UDP 80 80 192.168.1.134 eth3.1
Thermostat_ws 9000 9000 TCP/UDP 9000 9000 192.168.1.134 eth3.1
我检查,路由器没有设置任何防火墙,同样没有我的调制解调器。我没有在pi上安装防火墙(我查了一下,没有奇怪的iptables规则)。有谁知道我错过了什么?
---编辑---
我仍然停留在此。我打电话给我的ISP,他们向我保证他们的服务器上没有防火墙。有没有什么办法可以判断9000端口是否被阻塞?
尝试使用该工具来确定端口是无法访问(使用自定义端口):http://www.whatsmyip.org/port-scanner/
其他的一切看起来不错。作为一个完整的检查,我会尝试将ws端口设置为8010,以查看是否可行。我还建议使用像Advanced Web Client这样的工具来隔离网络问题。
这很有趣。我曾经有过类似的问题。我设置了一个WebSocket(我使用的是nodejs ws),并且一旦我尝试从远程客户端访问它,我无法通过ws://yourip:port
访问它,但我不得不使用http://yourip:port
。我不知道你是否有同样的问题,我的是由于我正在使用的代理。
我仍然有一个建议,你可能会如何解决你的问题。我不知道你对安全有多担心,但据我了解你的想法,你基本上通过WebSocket连接到你的树莓派,并告诉它改变温度。
回来的时候做了一个类似的项目,我发现它很难保证我的WebSocket连接。我基本上是通过WebSocket发送密码加命令到我的服务器,然后检查密码是否正确。否则,互联网上的每个人都会为你的房子加热不爽...
但是,因此,我不得不通过https隧道连接来防止中间件攻击。
我很快扔了毛巾,并决定采用完全不同的解决方案。基本上我建立了一个nodejs express服务器(可以很容易地配置一个自签名证书来使用https或在一个nginx/apache https服务器后面使用)并使用用户名和密码进行身份验证。当有人通过温度请求向/ api/thermostats?id = 0发出POST请求时,服务器会检查用户是否已通过身份验证,然后从节点内执行终端命令。
也许这个想法也符合你的要求。
是的,这是我计划继续前进的内容。该网页将通过https/wss提供,用户将默认能够查看状态,但为了更改温度,js应用程序将不得不发送其凭证。凭据可以生成密码验证,或者可以将它们存储/加载到设备上的cookie中。 – user2766918
将您的apache服务器绑定到0.0.0。0地址,使其从远程计算机
它可以从其他机器(即任何通过LAN连接的计算机)访问,但不能通过路由器。理论上,路由器应该NAT外部访问,所以它看起来像请求来到192.168.1.134,所以Apache应该不能看到差异... – user2766918
我认为你需要配置Apache服务器允许外部访问
两种思想访问:你_sure_的WS连接使用外部腹腔? (比如它在你的html中没有被硬编码并且没有被更新?)更有用 - 尝试使用443端口可能是值得的,因为它通常比其他端口更“开放”(但是假设8010正在工作,那可能是伸展)。 – GregHNZ
对不起,我已经离开了几天,很慢回到这个。这些都是有效的点。 js代码使用'ws_uri + =“//”+ window.location.host.replace(/\:.*$/,'')+“:9000”;'作为uri,我打印出来正确显示。我尝试了443,但它具有相同的行为(作品来自lan,而不是来自wan ...) – user2766918