java - 通过 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
和)。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)
有什么建议么?
是否有任何其他实现方式可以实现输出?
解决方案
解决方案是将套接字绑定到 Wi-Fi 网络。我们必须创建一个侦听器并Network
从侦听器的结果中获取。
因此,每当我们打开或重新打开一个套接字时,我们必须将该套接字绑定到 Wi-Fi 网络。这就是我所缺少的。添加后,它工作正常。
network.bindSocket(socket);
而且,在我的情况下,另一个更新是,动态 IP 地址不起作用,但预定义的硬编码 IP 地址起作用,我无法找到原因,这与我之前的情况不同,反之亦然。
推荐阅读
- elisp - 如何从文件内部获取 elisp 程序文件的路径?
- node.js - 如何将 Word scriptlab 中创建的片段部署到 word 存储以进行单独测试?
- css - 如何将道具值分配给样式
- javascript - 从 URL 解析图像像素坐标
- c# - 如何在 C# 中干净地从唯一项目列表中按顺序执行多个正则表达式替换
- javascript - 反应原生视频播放器错误大小错误
- cakephp - CakePHP 验证后访问上传的文件
- c - 计算二进制中相邻对的数量
- android - 错误:提供的字符串模块符号“androidx.cardview.widget.CardView”无效
- c - 删除链接地址中的第一个节点并在函数返回时获取非法地址