将 Philips Hue 与端口转发结合使用
Using Philips Hue with Port Forwarding
我正在从事 Android 项目,该项目利用了 Philips Hue SDK。
我已经实现了一些功能,以便我可以成功地控制灯光,但我也试图让应用程序在用户不在家时控制灯光。
我已经设置了端口转发,这样我就可以通过端口 80 连接到我的 public IP 地址并将它转发到网桥。
这个想法是用户连接到网桥并在其本地 IP 地址上通过网桥进行身份验证。然后用户可以输入外部地址。
我有一个功能,当连接到网桥时,我会检查用户是否连接了 Wifi,他们是否在自己家里的 wifi 上,然后我设置用户本地网桥网桥地址的 PHAccessPoint 的 IP 地址。
如果用户不在 wifi 上,或者他们在家庭 wifi 上,则 PHAccessPoint IP 地址将更新为用户输入的外部地址。
当我执行此操作时,我不断收到 Bridge 未响应、未连接或 Bridge 已连接的情况,而且这种情况一直在快速发生。即使在错误处理程序中,如果我的网桥没有响应或未连接,我也会确保断开 PHAccessPoint 并尝试再次重新连接。
我试过禁用或增加心跳间隔,但没有任何区别。
但是,如果我在使用 wifi,但仍然通过我的 public IP 地址连接,它就可以工作,我只有在通过移动数据时才会遇到这个问题。
是否有任何技巧可以使这项工作发挥作用?我看到其他应用程序也在做类似的事情,但它不是开源的,所以看不到他们是如何实现的。
我已经注册了 Philips Hue Remote API,但我没有收到他们的回复。
经过大量试验和错误后,Android Studio 能够反编译 SDK,因此我可以看到一些代码,我认为这是对官方 SDK 实施方式的限制。
基本上我认为问题在于您创建了一个 PHAccessPoint 对象并设置了您的外部 IP,例如86.85.84.83,当你连接到网桥时,你成功连接并获取网桥详细信息,并将网桥配置存储为PHBridge对象。该对象包含网桥的本地网络 IP,例如192.168.x.x。当您随后执行任何其他操作时,连接的桥对象和 PHAccessPoint 对象不匹配,因此在尝试处理并重新连接时返回无连接错误,因为 SDK 已将桥设置为已连接SDK returns 您已经连接并且最终陷入循环。
我认为解决这个问题的唯一方法是拥有一个通过端口转发公开的服务器,并将消息从服务器传递到本地网桥,然后通过服务器返回(因此实际的网桥保持本地)或使用 RESTful API
滚动您自己的 SDK 实现
我正在从事 Android 项目,该项目利用了 Philips Hue SDK。
我已经实现了一些功能,以便我可以成功地控制灯光,但我也试图让应用程序在用户不在家时控制灯光。
我已经设置了端口转发,这样我就可以通过端口 80 连接到我的 public IP 地址并将它转发到网桥。
这个想法是用户连接到网桥并在其本地 IP 地址上通过网桥进行身份验证。然后用户可以输入外部地址。
我有一个功能,当连接到网桥时,我会检查用户是否连接了 Wifi,他们是否在自己家里的 wifi 上,然后我设置用户本地网桥网桥地址的 PHAccessPoint 的 IP 地址。
如果用户不在 wifi 上,或者他们在家庭 wifi 上,则 PHAccessPoint IP 地址将更新为用户输入的外部地址。
当我执行此操作时,我不断收到 Bridge 未响应、未连接或 Bridge 已连接的情况,而且这种情况一直在快速发生。即使在错误处理程序中,如果我的网桥没有响应或未连接,我也会确保断开 PHAccessPoint 并尝试再次重新连接。
我试过禁用或增加心跳间隔,但没有任何区别。
但是,如果我在使用 wifi,但仍然通过我的 public IP 地址连接,它就可以工作,我只有在通过移动数据时才会遇到这个问题。
是否有任何技巧可以使这项工作发挥作用?我看到其他应用程序也在做类似的事情,但它不是开源的,所以看不到他们是如何实现的。
我已经注册了 Philips Hue Remote API,但我没有收到他们的回复。
经过大量试验和错误后,Android Studio 能够反编译 SDK,因此我可以看到一些代码,我认为这是对官方 SDK 实施方式的限制。
基本上我认为问题在于您创建了一个 PHAccessPoint 对象并设置了您的外部 IP,例如86.85.84.83,当你连接到网桥时,你成功连接并获取网桥详细信息,并将网桥配置存储为PHBridge对象。该对象包含网桥的本地网络 IP,例如192.168.x.x。当您随后执行任何其他操作时,连接的桥对象和 PHAccessPoint 对象不匹配,因此在尝试处理并重新连接时返回无连接错误,因为 SDK 已将桥设置为已连接SDK returns 您已经连接并且最终陷入循环。
我认为解决这个问题的唯一方法是拥有一个通过端口转发公开的服务器,并将消息从服务器传递到本地网桥,然后通过服务器返回(因此实际的网桥保持本地)或使用 RESTful API
滚动您自己的 SDK 实现