Setting Up UDP Multicast on W55RP20-EVB-PICO !
Setting Up UDP Multicast on W55RP20-EVB-PICO
0
Project description
UDP Multicast is a communication method that sends a single data packet to multiple receivers in a multicast group, using the network more efficiently than unicast or broadcast.
- Key Features:
- Efficient data distribution to multiple receivers.
- No acknowledgment or retransmission (best effort).
- Common Use Cases:
- Streaming Media: Live video or audio broadcasting (e.g., IPTV).
- Gaming: Real-time multiplayer game updates.
- Financial Systems: Market data distribution.
- IoT Systems: Device synchronization or firmware updates.
- Disaster Alert Systems: Emergency notifications to multiple devices
- IPv4 Multicast Address Range : 224.0.0.0 ~ 239.255.255.255
This range is reserved for multicast communication and can be divided as follows:
- 224.0.0.0 ~ 224.0.0.255: Local Network Multicast
Limited to the same subnet and does not traverse routers. - 239.0.0.0 ~ 239.255.255.255: Organization-specific Multicast
Used within private networks and can be configured like unicast addresses.
Set up
In this WCC, the W55RP20-EVB-Pico will function as the UDP multicast sender, so several socket configurations will be made.
The receivers used include the W5500-EVB-Pico, W5100S-EVB-Pico, W5500-EVB-Pico2, and a smartphone.
Additionally, since the multicast will be performed within the local network, the TTL is set to 1,
setSn_TTL(SOCKET_ID, 1); // set TTL (1 : local)and the address is configured in the 224.0.0.1 range.
static uint8_t multicast_ip[4] = {224, 0, 0, 6}; // multicast ip address
static uint16_t multicast_port = 29999; // multicast port
The multicast IP and port configured are set as the destination as follows.
setSn_DIPR(SOCKET_ID, multicast_ip); // destination IP 설정
setSn_DPORT(SOCKET_ID, multicast_port); // destination port 설정Multicast differs from standard ARP(Address Resolution Protocol) usage in that a specific IP address is shared by multiple receivers. Since multicast IP addresses are directly converted to MAC addresses, ARP is not required.
Therefore, the MAC address is converted as follows
uint8_t multicast_mac[6] = {
0x01, 0x00, 0x5e, // First 3 bytes of the multicast MAC address
multicast_ip[2] & 0x7f, // Last 23 bits of the IP address(first 7 bits of 224~239 : 1)
multicast_ip[3], // Last 2 bytes of the IP address
0x00 // Remaining byte is set to 0
};and configured accordingly.
// Set the MAC address (DHAR: Socket n Destination Hardware Address Register)
setSn_DHAR(SOCKET_ID, multicast_mac);
// Skip ARP (Address Resolution Protocol) and directly set the MAC address
setSn_CR(SOCKET_ID, Sn_CR_SEND_MAC);
The execution screen of the sender is as follows. When a rising edge is detected on a specific GPIO, the message is sent.

The UDP multicast receiver was implemented with reference to the code below, and the smartphone was connected to the same Wi-Fi network, using the tester app for testing.
The following screen shows the receiver's display.

The video showing both the sender and receivers together is as follows.
// UDP multicast sender
#include <stdio.h>
#include "port_common.h"
#include "wizchip_conf.h"
#include "w5x00_spi.h"
#include "w5x00_gpio_irq.h"
#include "socket.h"
#include "loopback.h"
#include "multicast.h"
#include "timer.h"
/* Clock */
#define PLL_SYS_KHZ (133 * 1000)
/* Buffer */
#define SOCKET_ID 1 // Socket number
#define ETHERNET_BUF_MAX_SIZE (1024 * 2) // Send and receive cache size
/* GPIO */
static void gpio_callback(void);
/* Timer */
static void repeating_timer_callback(void);
static time_t millis(void);
wiz_NetInfo net_info = {
.mac = {0x00, 0x08, 0xdc, 0x16, 0xed, 0x2e}, // Define MAC variables
.ip = {192, 168, 11, 21}, // Define IP variables
.sn = {255, 255, 255, 0}, // Define subnet variables
.gw = {192, 168, 11, 1}, // Define gateway variables
.dns = {168, 126, 63, 1}, // Define DNS variables
.dhcp = NETINFO_STATIC}; // Define the DNCP mode
static uint8_t ethernet_buf[ETHERNET_BUF_MAX_SIZE] = {
0,
};
uint8_t data[] = "Warning! GPIO14 state is HIGH!";
static uint8_t multicast_ip[4] = {224, 0, 0, 6}; // multicast ip address
static uint16_t multicast_port = 29999; // multicast port
int flag = 0;
volatile uint32_t prev_state = 0;
volatile uint32_t current_state = 0;
uint32_t start_ms = 0;
static volatile uint32_t g_msec_cnt = 0;
static void set_clock_khz(void);
int main()
{
uint16_t local_port = 5000;
uint8_t multicast_mac[6] = {
0x01, 0x00, 0x5e, // First 3 bytes of the multicast MAC address
multicast_ip[2] & 0x7f, // Last 23 bits of the IP address(first 7 bits of 224~239 : 1)
multicast_ip[3], // Last 2 bytes of the IP address
0x00 // Remaining byte is set to 0
};
gpio_init(14);
gpio_init(15);
gpio_set_dir(14, false);
gpio_set_dir(15, true);
gpio_put(15, 1);
set_clock_khz();
/*mcu init*/
stdio_init_all(); // Initialize the main control peripheral.
wizchip_spi_initialize();
wizchip_cris_initialize();
wizchip_reset();
wizchip_initialize(); // spi initialization
wizchip_check();
wizchip_1ms_timer_initialize(repeating_timer_callback);
wizchip_gpio_interrupt_initialize(SOCKET_ID, gpio_callback);
network_initialize(net_info);
print_network_information(net_info); // Read back the configuration information and print it
setSn_DIPR(SOCKET_ID, multicast_ip); // Set destination IP
setSn_DPORT(SOCKET_ID, multicast_port); // Set destination port
setSn_DHAR(SOCKET_ID, multicast_mac); // Set the MAC address (DHAR: Socket n Destination Hardware Address Register)
setSn_CR(SOCKET_ID, Sn_CR_SEND_MAC); // Skip ARP (Address Resolution Protocol) and directly set the MAC address
setSn_TTL(SOCKET_ID, 1); // Set TTL (1 : local)
// 소켓 초기화
if (socket(SOCKET_ID, Sn_MR_UDP, local_port, SF_MULTI_ENABLE) != SOCKET_ID)
{
printf("Failed to open socket\n");
}
printf("Sends a message when GPIO14 detects a rising edge!\n");
while (1)
{ }
}
}
static void set_clock_khz(void)
{
// set a system clock frequency in khz
set_sys_clock_khz(PLL_SYS_KHZ, true);
// configure the specified clock
clock_configure(
clk_peri,
0, // No glitchless mux
CLOCKS_CLK_PERI_CTRL_AUXSRC_VALUE_CLKSRC_PLL_SYS, // System PLL on AUX mux
PLL_SYS_KHZ * 1000, // Input frequency
PLL_SYS_KHZ * 1000 // Output (must be same as no divider)
);
}
/* GPIO */
static void gpio_callback(void)
{
current_state = millis();
if((current_state - prev_state) > 500) {
sendto(SOCKET_ID, data, sizeof(data), multicast_ip, multicast_port);
printf("send!\n");
prev_state = current_state;
}
}
/* Timer */
static void repeating_timer_callback(void)
{
g_msec_cnt++;
}
static time_t millis(void)
{
return g_msec_cnt;
}
