微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过蓝牙从 Wear OS 发送 UDP 消息

如何解决通过蓝牙从 Wear OS 发送 UDP 消息

我的目标是从 SmartWatch(运行 Wear os 2)向同一网络上的 Arduino 发送 UDP 消息(小于 100 字节)。只要 SmartWatch 保持连接到 wifi(手表的 IP 地址:145.167.189.23),这很好用。 但是当我打开蓝牙时,SmartWatch 会禁用 wifi 并通过蓝牙连接的手机切换到互联网连接。 SmartWatch 从移动设备获取互联网连接子网中的 IP 地址(如果移动设备的 IP 地址为 145.167.189.105,则获取 145.167.177.4)。 TCP 请求,如“stackoverflow.com”工作正常。

如果我现在尝试发送 UDP 消息,则没有任何内容到达 Arduino。 我已经尝试向 255.255.255.255、145.255.255.255、145.167.255.255、145.167.189.255 发送 UDP 消息,但没有任何消息到达 Arduino(由 Wireshark 验证)。 六年前有同样的问题(Simple UDP Broadcast not working on Android Wear),当时wear os 2 不可用。唯一提出的解决方案是“磨损数据层”。我也已经尝试过这个,但观察到非常大的延迟(大约 3 秒)。因此,这些根本不代表我的解决方案。

用于在wear os 上访问网络的documentation 仅表示

可以使用HTTP、TCP、UDP等协议

也许有人可以给我一个提示,为什么不从电话转发 UDP 消息。

解决方法

只有 DNS udp 包可以转发到手机。

  1. 它设置了一些 iptable 规则来将 udp 包转发到 TPROXY。看下面的规则(iptables -t mangle -L)。它不会将 udp 包转发到 Reserved IP addresses
Chain oem_CW_PROXY_UDP (22 references)
target     prot opt source               destination
RETURN     all  --  anywhere             0.0.0.0/8
RETURN     all  --  anywhere             loaclhost/8
RETURN     all  --  anywhere             100.64.0.0/10
RETURN     all  --  anywhere             127.0.0.0/8
RETURN     all  --  anywhere             169.254.0.0/16
RETURN     all  --  anywhere             172.16.0.0/12
RETURN     all  --  anywhere             192.0.0.0/29
RETURN     all  --  anywhere             192.0.2.0/24
RETURN     all  --  anywhere             192.168.0.0/16
RETURN     all  --  anywhere             198.18.0.0/15
RETURN     all  --  anywhere             198.51.100.0/24
RETURN     all  --  anywhere             203.0.113.0/24
RETURN     all  --  anywhere             224.0.0.0/4
RETURN     all  --  anywhere             240.0.0.0/4
RETURN     all  --  anywhere             255.255.255.255
TPROXY     udp  --  anywhere             anywhere             TPROXY redirect 0.0.0.0:35070 mark 0x1/0x1
  1. TPROXY 将通过蓝牙插座将收到的 udp 包转发到手机。但它只会转发DNS包,这可以从手表的logcat中看到。 Wear OS 似乎决定在某个时候只转发 DNS 包。
05-20 12:20:31.269806  1263  5866 D HOME    : [ClockworkProxyUdp]Got packet with 47 bytes,from: /192.168.167.239:36215 original dst: /8.8.8.8:53
05-20 12:21:05.264492  1263  5866 D HOME    : [ClockworkProxyUdp]Got packet with 47 bytes,from: /192.168.167.239:63348 original dst: /8.8.8.8:53
05-20 12:21:05.272685  1263  5866 D HOME    : [ClockworkProxyUdp]Got packet with 32 bytes,from: /192.168.167.239:34219 original dst: /8.8.8.8:53
05-20 12:21:38.282089  1263  5866 D HOME    : [ClockworkProxyUdp]Got packet with 47 bytes,from: /192.168.167.239:54529 original dst: /8.8.8.8:53
05-20 12:21:38.287255  1263  5866 D HOME    : [ClockworkProxyUdp]Got packet with 32 bytes,from: /192.168.167.239:58688 original dst: /8.8.8.8:53

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?