---
title: "Raspberry Pi Pico + W5500 + GPS TCP API Server"
url: "https://maker.wiznet.io/jakelee/projects/raspberry-pi-pico-w5500-gps-tcp-api-server/"
markdown_url: "https://maker.wiznet.io/jakelee/projects/raspberry-pi-pico-w5500-gps-tcp-api-server/md"
type: "UCC: User Created Content"
author: "zinntikumugai"
author_url: "https://github.com/zinntikumugai/raspberrypi-pico-ntp_server_rs"
editor: "WIZnet"
editor_url: "https://maker.wiznet.io/"
original_author: "zinntikumugai"
original_url: "https://github.com/zinntikumugai/raspberrypi-pico-ntp_server_rs"
published: "2026-01-06"
language: "en"
hardware: ["WIZnet W5500-EVB-Pico-PoE", "WIZnet WIZPoE-P1", "Waveshare L76K GNSS module"]
likes: 0
views: 370
comments: 0
source: "WIZnet Makers (https://maker.wiznet.io/)"
---

# Raspberry Pi Pico + W5500 + GPS TCP API Server

> Rust-based embedded project for RP2040, W5500, and Pico-GPS-L76K GPS module to create TCP API server that can respond to HTTP request/provide GPS data in JSON.

Original author: zinntikumugai (source: https://github.com/zinntikumugai/raspberrypi-pico-ntp_server_rs)

## Components

- **WIZnet W5500-EVB-Pico-PoE** x 1 ([docs](https://docs.wiznet.io/Product/Chip/Ethernet/W5500/W5500-EVB-Pico-PoE))
- **WIZnet WIZPoE-P1** x 1 ([docs](https://docs.wiznet.io/Product/Open-Source-Hardware/PoE/WIZPoE-P1))
- **Waveshare L76K GNSS module** x 1

## Article

This is a **Rust-based embedded project** for the **Raspberry Pi Pico (RP2040)** that uses:

**W5500 Ethernet module** for network connectivity

**Pico-GPS-L76K GPS module** for GPS data

**Embassy asynchronous framework** and **embedded networking**
to create a **TCP API server** on the Pico that can respond to HTTP requests and provide GPS data in JSON.

---

### 🧠 **Key Features**

The device supports:

✅ Ethernet via **W5500** (SPI)
✅ **Automatic DHCP IP address**
✅ **ICMP Ping responses**
✅ **TCP API server** on port **8080**
✅ **JSON formatted responses**
✅ GPS module support with **NMEA 0183 parsing**
✅ Provides **GPS location & time** over network API

---

### 🔌 **Hardware SetupMCU:** Raspberry Pi Pico (RP2040)

**Ethernet:** W5500 connected via SPI

**GPS:** Pico-GPS-L76K connected via UART (9600 bps)

Detailed pin wiring for both modules is described in the README.

---

### 🧩 **Network API Endpoints**

Here’s how you can interact with the server:

| Endpoint | Method | Returns |
| --- | --- | --- |
| `/` or `/status` | GET | `{ "status":"ok", ... }` |
| `/ping` | GET | `{ "message":"pong" }` |
| `/api/info` | GET | List of available endpoints |
| `/api/gps` | GET | GPS data (JSON) |
| `/api/gps/mode/{...}` | GET | Change GPS output mode |

GPS output modes:

**log** – Only logs data

**tcp** – Only outputs via TCP

**both** – Logs + TCP (default)

**none** – No output

---

### 🛰️ **GPS Data ExampleExample JSON from **`**/api/gps**`**:**

{
"gps": {
"valid": true,
"position": {
"latitude": 35.681236,
"longitude": 139.767125
},
"time": {
"utc": "12:34:56",
"date": "2024-01-15"
},
"satellites": 8,
"altitude": 45.5,
"speed_knots": 0.0
}
}
``` :contentReference[oaicite:6]{index=6}

---

### ⚙️ **Tech Stack**
- **Language:** Rust (no_std)
- **Async framework:** Embassy
- **Network stack:** embassy-net (smoltcp based)
- **W5500 driver:** embassy-net-wiznet
- **Logging:** defmt + RTT :contentReference[oaicite:7]{index=7}

---

### 🚀 **Build & Flash Instructions**
Typical steps to compile and run:

1. Add Rust target:
```bash
rustup target add thumbv6m-none-eabi

**Install probe tools:**

`cargo install probe-rs-tools --locked`

**Build and flash using cargo commands:**

cargo build --release
cargo run --release
``` :contentReference[oaicite:8]{index=8}

---

### 🧪 **Usage & Testing**

You can test the device with:

**Ping:**

`ping <PICO_IP_ADDRESS>`

**HTTP (cURL):**

curl http://&lt;IP>:8080/status
curl http://&lt;IP>:8080/api/gps
``` :contentReference[oaicite:9]{index=9}

---

### ⚙️ **Configuration Options**

You can modify **MAC address / TCP port / GPS baud rate / Static IP instead of DHCP**
via the source code configuration.

---

### 🧰 **Project Structure**

The main components in the source code:

src/
├── main.rs // init & HW setup
├── network.rs // network stack & DHCP
├── tcp_server.rs // API server logic
└── gps.rs // GPS parsing + UART
``` :contentReference[oaicite:11]{index=11}

---

### 📄 **License**
MIT License. :contentReference[oaicite:12]{index=12}

### 🔑 **Key Benefits1. Deterministic & Stable Networking**

The **W5500 hardware TCP/IP offload** removes the need for a heavy software TCP/IP stack on the MCU.

Results in **predictable latency, lower CPU usage, and higher reliability**, especially valuable for industrial or long-running deployments.

**2. Clean Separation of Concerns**

Networking, GPS parsing, and application logic are clearly separated.

Makes the project easy to **extend with additional sensors**, protocols, or endpoints.

**3. Modern Embedded Rust Architecture**

Uses **Rust + Embassy async**, showing how to write:

Non-blocking UART (GPS)

Concurrent network services

Safe, memory-efficient embedded code

Serves as a **real-world learning reference** for embedded Rust beyond simple demos.

**4. Ethernet as a Strong Alternative to Wi-Fi**

Ethernet provides:

Better stability

Lower jitter

Easier IT integration (DHCP, fixed ports, predictable behavior)

Ideal for **industrial IoT, gateways, lab equipment, and infrastructure devices** where Wi-Fi is undesirable.

**5. Ready-to-Use Network API**

The HTTP/TCP API makes GPS data immediately consumable by:

- **Servers / Dashboards / Data loggers / Cloud ingestion pipelines**

- **Minimal integration effort for system-level developers.6. Excellent Reference for RP2040 + Ethernet Designs**

Shows practical wiring, SPI usage, DHCP handling, and TCP server design.

Can be reused as a **template for other Ethernet-based RP2040 projects** such as:

- **Industrial sensors**

- **Time-sync devices**

- **Asset-tracking nodes**

- **Network-attached controllers**

---

### 🎯**Conclusion**

This project demonstrates a **clean, modern reference design** for building an **Ethernet-enabled embedded edge device** using Raspberry Pi Pico, W5500, and Rust. By combining hardware-offloaded TCP/IP with an asynchronous software stack, it shows how even a resource-constrained MCU can reliably expose network APIs and real-world sensor data.

---

Source: https://maker.wiznet.io/jakelee/projects/raspberry-pi-pico-w5500-gps-tcp-api-server/
