首页 > 解决方案 > 通过 Wi-Fi 使用 TCP 将 Android 应用程序连接到 IoT 设备

问题描述

我有一个 Android 应用程序和一个 IoT 设备,其中的连接和通信将通过 Wi-Fi。物联网设备将提供一个热点(没有互联网),以便我们可以将我们的移动 Wi-Fi 与该设备热点连接。将手机与 Wi-Fi 连接后,当我们打开应用程序时,应用程序会尝试使用 TCP 套接字连接来查找设备,从而与物联网设备进行连接和通信。

该应用程序工作正常并与设备成功通信。但这里的问题是,如果打开移动数据,连接和通信就不会发生。该应用程序仅适用于关闭移动数据。

我猜该应用程序正在通过移动数据搜索物联网设备,因为移动数据具有有效的互联网连接而 Wi-Fi 没有。我希望应用程序仅通过 Wi-Fi 查找物联网设备,即使移动数据已打开。

我在 React Native 中有一个类似的应用程序,它具有相同的功能并且有相同的问题。我使用react-native-tcp-socket包修复了它,该包有一个选项可以使应用程序搜索特定的(interface具有选项wifi和)。ethernetcellular

这两个应用程序都有一个硬编码的 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)

有什么建议么?

是否有任何其他实现方式可以实现输出?

标签: javaandroidreact-nativetcpwifi

解决方案


解决方案是将套接字绑定到 Wi-Fi 网络。我们必须创建一个侦听器并Network从侦听器的结果中获取。

因此,每当我们打开或重新打开一个套接字时,我们必须将该套接字绑定到 Wi-Fi 网络。这就是我所缺少的。添加后,它工作正常。

network.bindSocket(socket);

而且,在我的情况下,另一个更新是,动态 IP 地址不起作用,但预定义的硬编码 IP 地址起作用,我无法找到原因,这与我之前的情况不同,反之亦然。


推荐阅读