Mosaic-x5 HAT not working with Raspberry Pi 4B

Hi community folks,
This is a mirror of the message that I have in the Raspberry Pi forum. I was just trying to maximize visibility for my issue, so I apologize for the duplication.

I just purchased the Mosaic-x5 HAT and connected it to a RPi 4B running (Linux raspberrypi 6.12.34+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.12.34-1+rpt1~bookworm (2025-06-26) aarch64 GNU/Linux). I cannot for the life of me get the RPi and the Mosaic-X5 HAT to work together. I have connected the USB-C port from the Mosaic-x5 to the USB-A port on the RPi and I have connected a Sparkfun Helical tri-band antenna that does L1/L2/L5 to the HAT.

My RPi can resolve the NTRIP caster address (truertk.pointonenav.com:2101), but no matter what I do I cannot get the Mosaic-x5 to connect successfully to the NTRIP caster. Here is the nslookup output:

nslookup truertk.pointonenav.com
Server: 172.20.10.1
Address: 172.20.10.1#53

Non-authoritative answer:
Name: truertk.pointonenav.com
Address: 52.10.142.25
Name: truertk.pointonenav.com
Address: 52.35.22.190

This all worked with a Sparkfun LG290P breakout board. I could connect to the NTRIP caster successfully using a Waveshare SIM7670G cellular HAT with an EIOT Club data only SIM card or with my phone’s WiFi hotspot)). Nothing works with the Mosaic-x5 HAT, so I have removed the cellular HAT and just have the RPi with the Mosaic-x5 HAT connected to my home WiFi (or my phone’s WiFi hotspot when outside).

Here is my ifconfig output for the RPi:

eth0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether d8:3a:dd:e1:48:59 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 240 bytes 19468 (19.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 240 bytes 19468 (19.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

usb0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.3.214 netmask 255.255.255.0 broadcast 192.168.3.255
inet6 fe80::1c68:c294:f21d:ad97 prefixlen 64 scopeid 0x20<link>
ether 1a:32:02:99:15:45 txqueuelen 1000 (Ethernet)
RX packets 27234 bytes 5850009 (5.5 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 26735 bytes 3461113 (3.3 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.20.10.9 netmask 255.255.255.240 broadcast 172.20.10.15
inet6 2600:382:3207:fc99:6a4:f52f:dabc:a1c7 prefixlen 64 scopeid 0x0<global>
inet6 fe80::5138:e5dc:d9d8:6c19 prefixlen 64 scopeid 0x20<link>
ether d8:3a:dd:e1:48:5a txqueuelen 1000 (Ethernet)
RX packets 18439 bytes 16727380 (15.9 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 11864 bytes 4851005 (4.6 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

I have set up IP forwarding and NAT rules on the RPi to/from wlan0 to usb0 ports. Here are the rules:

table inet filter {
chain forward {
type filter hook forward priority filter; policy accept;
iif "usb0" oif "wlan0" accept
iif "wlan0" oif "usb0" ct state established,related accept
}
}
table ip nat {
chain POSTROUTING {
type nat hook postrouting priority srcnat; policy accept;
oifname "wlan0" masquerade
}
}

Here is the IP route on my RPi:

default via 172.20.10.1 dev wlan0 proto dhcp src 172.20.10.9 metric 600
172.20.10.0/28 dev wlan0 proto kernel scope link src 172.20.10.9 metric 600
192.168.3.0/24 dev usb0 proto kernel scope link src 192.168.3.214 metric 100

I have setup the Communication → Ethernet on the Mosaic-x5 Web UI and enabled Outgoing Internet over USB. Here is my IP Parameters info from the Web UI:

<ipparameters>
<interface name="br0" type="" hostname="mosaic-x5-3878973">
<hardware addr="56:1D:69:EA:93:F1"/>
<inet addr="192.168.3.1" mask="255.255.255.0" gateway="" mode="dhcp"/>
<statistics txbytes="4277169" rxbytes="1360552" internet="Not Available"/>
</interface>
<interface name="eth0" type="Ethernet" hostname="mosaic-x5-3878973">
<hardware addr="8C:1C:DA:53:DE:74"/>
<inet addr="" mask="" gateway="" mode="static"/>
<statistics txbytes="0" rxbytes="0" internet="Not Available"/>
</interface>
<resolv>
<nameserver addr="192.168.3.214"/>
</resolv>
</ipparameters>

I have also setup the NTRIP client in the Web UI with the truertk.pointonenav.com:2101 and correct username/pswd.

At present it doesn’t even resolve the NTRIP caster’s address in the Web UI.

Any help in this matter is appreciated.

Cheers,
-atin

I realized that the br0 (bridge interface) in the Mosaic-x5 HAT does not have a Gateway and its mode is “DHCP”, even though I have the Ethernet set to Static and I have provided the Gateway. I used the “sips” command in its Expert Console:

sips, Static, 192.168.3.1, 255.255.255.0, 192.168.3.214, , 192.168.3.214, 192.168.3.214, 1500

So my question is how do I set the br0 to have a Gateway and Static instead of DHCP?

Any help is appreciated.

Instead of Static IPs, I switched the Mosaic-x5 to use DHCP and modified the Raspberry Pi to use DHCP too by modifying the dnsmasq.conf with the following entries:

interface=usb0
bind-interfaces

‘# limit the range of available addresses to 11 and for 12 hours, after which Mosaic-x5 has to either renew the lease or get a new address’
dhcp-range=192.168.3.10,192.168.3.20,12h

‘# set the gateway - option 3’
dhcp-option=3,192.168.3.214

‘# set the DNS - option 6’
dhcp-option=6,192.168.3.214

Then restart the dnsmasq process using systemctl. Finally, connect the browser to the new addr after finding it in the dhhcp.leases file:

cat /var/lib/misc/dnsmasq.leases

YEA! So now the NTRIP caster can be connected to!!!

Finaly step is going to be to use the Waveshare SIM7670G HAT with the Mosaic-x5 HAT outside and see if that works as expected! I’ll update this thread after I test that.

1 Like

Thanks for the updates Atin - glad you got it working!

Best,
Paul

Even after that last update, I ran into other issues, which I have now resolved. I’ll do a little writeup and maybe a video and share it with the community, once I get it working with minimal issues.