Skip to content

Commit

Permalink
Update udp_multicast.rst
Browse files Browse the repository at this point in the history
Signed-off-by: IhorNehrutsa <[email protected]>
  • Loading branch information
IhorNehrutsa authored and IhorNehrutsa committed Dec 21, 2023
1 parent bc15dce commit 43d2e6a
Showing 1 changed file with 6 additions and 121 deletions.
127 changes: 6 additions & 121 deletions docs/esp32/tutorial/udp_multicast.rst
100755 → 100644
Original file line number Diff line number Diff line change
Expand Up @@ -3,70 +3,11 @@
UDP MULTICAST
=============

Use UDP MULTICAST connections to communicate between different networks.
Use UDP MULTICAST connections to communicate between two devices in different networks
with IP-addresses 172.16.55.55 and 192.168.44.44.

* udp_multicast_client.py::

import network, socket, errno, struct, time

# connect to AP
SSID = 'SSID'
PASSWORD = 'PASSWORD'

wlan = network.WLAN(network.STA_IF)
wlan.ifconfig(('172.16.55.55', '255.255.255.0', '172.16.55.1', '172.16.55.1')) # class B network
wlan.active(True)
wlan.connect(SSID, PASSWORD)
while not wlan.isconnected():
pass

print("udp_multicast_client.py")
print("client send GET and receive ACK from the server")

def inet_aton(str_addr):
return bytes(map(int, str_addr.split(".")))

#TIMEOUT = None # block
#TIMEOUT = 5 # s
TIMEOUT = 0 # non blocking

MULTICAST_IP = '224.0.0.111'
PORT = 5555
sockaddr = (MULTICAST_IP, PORT)

wlan = network.WLAN(network.STA_IF)
client_ip = wlan.ifconfig()[0]

skt = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
skt.settimeout(None)
skt.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
skt.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, struct.pack(">4s4s", inet_aton(MULTICAST_IP), inet_aton(client_ip))) # join to the multicast address
skt.bind(sockaddr) # not skt.connect(sockaddr)
skt.settimeout(TIMEOUT)

t = 0
while True:
try:
if time.time() - t >= 3:
t = time.time()

mac = wlan.config('mac')
str_to_send = f"client_ip:{client_ip}\t mac:{'-'.join(map('{:02x}'.format, mac))}"
skt.sendto(str_to_send, sockaddr)
print(f'GET to {sockaddr}\t sent "{str_to_send}"')

received, addr = skt.recvfrom(1024)
if received:
print(f'ACK from {addr}\t received "{received.decode()}"')
except OSError as e:
if e.args[0] in (errno.EAGAIN, errno.ETIMEDOUT):
pass
else:
try:
skt.close()
except:
pass
raise(e)
Run `udp_multicast_client.py <https://github.com/micropython/micropython/blob/master/examples/network/udp_multicast_client.py>`_ on another device.
Client send GET and receive ACK from the server.

Output is::

Expand All @@ -76,64 +17,8 @@ Use UDP MULTICAST connections to communicate between different networks.
ACK from ('192.168.44.44', 5555) received "server_ip:192.168.44.44 mac:24-6f-28-7a-f3-9c"
...

* udp_multicast_server.py::

import network, socket, errno, struct, time

# connect to AP
SSID = 'SSID'
PASSWORD = 'PASSWORD'

wlan = network.WLAN(network.STA_IF)
wlan.ifconfig(('192.168.44.44', '255.255.255.0', '192.168.44.1', '192.168.44.1')) # class C network
wlan.active(True)
wlan.connect(SSID, PASSWORD)
while not wlan.isconnected():
pass

print("udp_multicast_server.py")
print("server receive GET and send ACK to the client")

def inet_aton(str_addr):
return bytes(map(int, str_addr.split(".")))

#TIMEOUT = None # block
#TIMEOUT = 5 # s
TIMEOUT = 0 # non blocking

MULTICAST_IP = '224.0.0.111'
PORT = 5555
sockaddr = (MULTICAST_IP, PORT)

wlan = network.WLAN(network.STA_IF)
server_ip = wlan.ifconfig()[0]

skt = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
skt.settimeout(None)
skt.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
skt.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, struct.pack(">4s4s", inet_aton(MULTICAST_IP), inet_aton(server_ip))) # join to the multicast address
skt.bind(sockaddr)
skt.settimeout(TIMEOUT)

while True:
try:
received, addr = skt.recvfrom(1024)
if received:
print(f'GET from {addr}\t received "{received.decode()}"')

mac = wlan.config('mac')
str_to_send = f"server_ip:{server_ip}\t mac:{'-'.join(map('{:02x}'.format, mac))}"
skt.sendto(str_to_send, sockaddr)
print(f'ACK to {sockaddr}\t sent "{str_to_send}"')
except OSError as e:
if e.args[0] in (errno.EAGAIN, errno.ETIMEDOUT):
pass
else:
try:
skt.close()
except:
pass
raise(e)
Run `udp_multicast_server.py <https://github.com/micropython/micropython/blob/master/examples/network/udp_multicast_server.py>`_ on one device.
Server receive GET and send ACK to the client.

Output is::

Expand Down

0 comments on commit 43d2e6a

Please sign in to comment.