android - 物联网应用程序如何检测设备是否在本地?

标签 android network-programming iot

在其他设备中,我有一个 Belkin WeMo 开关和一个 3M WiFi 恒温器。两者都带有 Android 应用程序。当我在家里(手机与设备位于同一 WiFi 子网上)打开应用程序时,应用程序说设备是“本地的”,或者应用程序“直接”连接到设备。我所做的任何更改都会直接反射(reflect)在设备上。

如果我从我家外面的任何地方连接,它会以某种方式“知道”该设备不是本地的。如果我理解正确的话,它会在某处更新自己的服务器,最终家里的设备会得到更新。

应用程序如何做到这一点?我想复制该功能。

基本上,我有一个 Raspberry Pi,假设它通过 GPIO 执行某些操作,我可以通过访问网页来触发该操作。在我的家庭网络中,该网页可通过 http://192.168.10.25/do_something 访问...在我的家庭网络之外,该网页可通过 http://my_custom_name 访问。 some_free_dynamic_dns.com:8080/do_something。我已将路由器设置为将 WAN 上的端口转发 8080 转发到 LAN 上的 192.168.10.25:80。这行得通。

如何避免有 2 个页面?我想编写一个应用程序,它可以有效地向我显示 192.168.10.25/do_something URL。当我在家时,它应该“自动”检测到手机与 URL 在同一网络上,然后直接打开 192.168.10.25/do_something ......而当我在外面时,它也应该“自动”检测到并启动 http://my_custom_name.some_Free_dynamaic_dns.com:8080/do_something

这里的关键部分是,在家里时,即使我的 ISP 关闭并且主机名无法解析,也没关系,因为一切都是本地的。

我该怎么做?

最佳答案

让您的应用首先尝试连接到位于 192.168.10.25(或您选择的任何本地地址)的 Web 服务器。如果在合理的时间内(5 秒应该足够)没有回答,则连接到外部网络服务器。

为了安全起见,您可能需要确保位于 192.168.10.25 的网络服务器实际上是您的网络服务器。您可以通过使用质询和响应以及公钥加密来做到这一点。如果您愿意,我可以提供更多详细信息。

您可以通过查看手机的 IP 地址来尝试避免等待(不存在的)本地网络服务器。如果不是192.168.x.y,你可以假设你不在本地,直接访问外部网站。

如果您将 192.168.10.25 直接嵌入到您的应用中,则无需查找主机。

关于android - 物联网应用程序如何检测设备是否在本地?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26622342/

相关文章:

javascript - Jquery $.ChangePage 回调 Android

java - 在服务器关闭连接之前,客户端不会收到响应消息(Java)

安卓 AllJoyn : Connection with second machine gives error of BusAttachement

android - Iotivity scons 构建错误(cbor)

java - Protocol buffer 无法解析具有多个大尺寸消息的单个 codeInputStream

android - 替代 AbsoluteLayout

c - 通过 TCP-IPv6 连接进行数据传输

network-programming - 当站点(服务器)再次在线时通知我

spring-boot - 支持 MQTT 的 API 网关 (IOT)

android - 当 Android 应用程序进入后台时捕获