2017-05-29 32 views
4

我有一个网页来控制树莓派上的恒温器,并且在尝试从远程客户端获取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端口是否被阻塞?

+1

两种思想访问:你_sure_的WS连接使用外部腹腔? (比如它在你的html中没有被硬编码并且没有被更新?)更有用 - 尝试使用443端口可能是值得的,因为它通常比其他端口更“开放”(但是假设8010正在工作,那可能是伸展)。 – GregHNZ

+0

对不起,我已经离开了几天,很慢回到这个。这些都是有效的点。 js代码使用'ws_uri + =“//”+ window.location.host.replace(/\:.*$/,'')+“:9000”;'作为uri,我打印出来正确显示。我尝试了443,但它具有相同的行为(作品来自lan,而不是来自wan ...) – user2766918

回答

1

尝试使用该工具来确定端口是无法访问(使用自定义端口):http://www.whatsmyip.org/port-scanner/

其他的一切看起来不错。作为一个完整的检查,我会尝试将ws端口设置为8010,以查看是否可行。我还建议使用像Advanced Web Client这样的工具来隔离网络问题。

0

这很有趣。我曾经有过类似的问题。我设置了一个WebSocket(我使用的是nodejs ws),并且一旦我尝试从远程客户端访问它,我无法通过ws://yourip:port访问它,但我不得不使用http://yourip:port。我不知道你是否有同样的问题,我的是由于我正在使用的代理。

我仍然有一个建议,你可能会如何解决你的问题。我不知道你对安全有多担心,但据我了解你的想法,你基本上通过WebSocket连接到你的树莓派,并告诉它改变温度。
回来的时候做了一个类似的项目,我发现它很难保证我的WebSocket连接。我基本上是通过WebSocket发送密码加命令到我的服务器,然后检查密码是否正确。否则,互联网上的每个人都会为你的房子加热不爽...
但是,因此,我不得不通过https隧道连接来防止中间件攻击。
我很快扔了毛巾,并决定采用完全不同的解决方案。基本上我建立了一个nodejs express服务器(可以很容易地配置一个自签名证书来使用https或在一个nginx/apache https服务器后面使用)并使用用户名和密码进行身份验证。当有人通过温度请求向/ api/thermostats?id = 0发出POST请求时,服务器会检查用户是否已通过身份验证,然后从节点内执行终端命令。
也许这个想法也符合你的要求。

+0

是的,这是我计划继续前进的内容。该网页将通过https/wss提供,用户将默认能够查看状态,但为了更改温度,js应用程序将不得不发送其凭证。凭据可以生成密码验证,或者可以将它们存储/加载到设备上的cookie中。 – user2766918

2

将您的apache服务器绑定到0.0.0。0地址,使其从远程计算机

+0

它可以从其他机器(即任何通过LAN连接的计算机)访问,但不能通过路由器。理论上,路由器应该NAT外部访问,所以它看起来像请求来到192.168.1.134,所以Apache应该不能看到差异... – user2766918

0

我认为你需要配置Apache服务器允许外部访问

相关问题