通过 Wi-Fi 使用 TCP 将 Android 应用程序连接到 IoT 设备
Posted
技术标签:
【中文标题】通过 Wi-Fi 使用 TCP 将 Android 应用程序连接到 IoT 设备【英文标题】:Connect Android App to IoT device using TCP through Wi-Fi 【发布时间】:2021-05-25 10:57:02 【问题描述】:我有一个 android 应用程序和一个 IoT 设备,它们的连接和通信将通过 Wi-Fi 进行。物联网设备将提供一个热点(没有互联网),以便我们可以将我们的移动 Wi-Fi 与该设备热点连接。将手机与Wi-Fi连接后,当我们打开应用程序时,应用程序会尝试使用TCP套接字连接查找设备,与物联网设备进行连接和通信。
应用程序运行良好,并与设备成功通信。但这里的问题是,如果打开移动数据,连接和通信就不会发生。该应用仅适用于关闭移动数据的情况。
我猜该应用程序正在通过移动数据搜索物联网设备,因为移动数据具有有效的互联网连接而 Wi-Fi 没有。我希望应用程序仅通过 Wi-Fi 查找物联网设备,即使移动数据已开启。
我在 React Native 中有一个类似的应用程序,它具有相同的功能并且遇到了相同的问题。我使用react-native-tcp-socket
包修复了它,该包可以选择通过特定的interface
(具有选项wifi
、ethernet
和cellular
)进行应用搜索。
两个应用程序都有一个硬编码的 IP 地址,用于连接到 IoT 设备。这仅在移动数据关闭时有效。在 React Native 应用程序中,我通过从 WifiManager 获取它,使用前面提到的带有动态 IP 地址的包来修复它。当我尝试使用 Android 应用程序时,它没有工作。
我查看了包的本机代码并尝试复制相同的内容,但收到以下错误:
java.net.ConnectException: failed to connect to /192.168.1.2 (port 6378) from /:: (port 39495): connect failed: ECONNREFUSED (Connection refused)
Caused by: android.system.ErrnoException: connect failed: ECONNREFUSED (Connection refused)
有什么建议吗?
是否有其他实现方式可以实现输出?
【问题讨论】:
1) Android 设备是否已植根和/或受设备管理控制? 2) 你见过this answer to enabling and disabling mobile data programmatically @MorrisonChang,Android 设备既不是 root 也不是由设备管理控制。您建议的答案与我的问题无关。即使移动数据处于开启状态,我也需要让移动应用找到并连接到 IoT 设备。 那么您应该显示您尝试过的哪些更改不起作用的代码。如果您想链接到使用了react-native-tcp-socket
的哪个部分可能会很有用。
感觉这里添加代码会太大。所以我用更多信息更新了这个问题。
【参考方案1】:
解决方法是将socket绑定到Wi-Fi网络。我们必须创建一个监听器并从监听器的结果中获取Network
。
因此,每当我们打开或重新打开一个套接字时,我们必须将该套接字绑定到 Wi-Fi 网络。这就是我所缺少的。添加后,它工作正常。
network.bindSocket(socket);
而且,在我的情况下,另一个更新是,动态 IP 地址不起作用,但预定义的硬编码 IP 地址起作用,我无法找到原因,这与我之前的情况不同,反之亦然。
【讨论】:
以上是关于通过 Wi-Fi 使用 TCP 将 Android 应用程序连接到 IoT 设备的主要内容,如果未能解决你的问题,请参考以下文章
ESA2GJK1DH1K基础篇: APP使用SmartConfig绑定Wi-Fi 设备并通过MQTT控制设备(V1.0)(AT+TCP非透传指令)
ESA2GJK1DH1K基础篇: APP使用SmartConfig绑定Wi-Fi 设备并通过MQTT控制设备(V1.0)(AT+TCP非透传指令)