androidproxyudpwear-osandroid-wear-2.0

send UDP messages from Wear OS via Bluetooth


My goal is to send a UDP message (smaller than 100 bytes) from a SmartWatch (running wear os 2) to an Arduino on the same network. As long as the SmartWatch stays connected to the wifi (ip address of the watch: 145.167.189.23) this works great. But when I turn on bluetooth, the SmartWatch disables wifi and switches to an internet connection via the bluetooth connected phone. The SmartWatch gets an ip address in a subnet of the internet connection from the mobile (if the mobile has the ip address 145.167.189.105, it gets 145.167.177.4). TCP requests, like 'stackoverflow.com' work fine.

If I now try to send a UDP message nothing arrives at the Arduino. I already tried to send a UDP message to 255.255.255.255, 145.255.255.255, 145.167.255.255, 145.167.189.255, but nothing ever arrived at the Arduino ( verified by Wireshark). Over six years ago there was the same problem (Simple UDP Broadcast not working on Android Wear), at that time wear os 2 was not available. The only proposed solution was the 'Wear Data Layer'. I already tried this as well, but observed very large latencies (about 3 seconds). Therefore, these do not represent a solution for me at all.

The documentation for network access on wear os only says

You can use protocols such as HTTP, TCP, and UDP

Maybe someone could give me a hint why the UDP messages are not forwarded from the phone.


Solution

  • Only DNS udp packages can be forwarded to the phone.

    1. It setup some iptable rules to forward udp packages to the TPROXY. Look at the following rules (iptables -t mangle -L). It does't forward udp packges to 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. The TPROXY will forward the reveived udp packcages to the phone throught bluetooth socket. But it will only forwoard DNS packages, which can be seen from the watch's logcat. It seems that Wear OS decided to only forwoard DNS packages at some time.
    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