UDP 服务端

UIFLOW2 应用示例

回显服务器

在 UiFlow2 中打开 cores3_udp_server_example.m5f2 项目。

此示例创建一个回显接收数据的 UDP 服务器。

UiFlow2 代码块:

cores3_udp_server_example.png

示例输出:

None

MicroPython 应用示例

回显服务器

此示例创建一个回显接收数据的 UDP 服务器。

MicroPython 代码块:

  1# SPDX-FileCopyrightText: 2025 M5Stack Technology CO LTD
  2#
  3# SPDX-License-Identifier: MIT
  4
  5import os, sys, io
  6import M5
  7from M5 import *
  8import network
  9import socket
 10
 11
 12title0 = None
 13label0 = None
 14label1 = None
 15label2 = None
 16label3 = None
 17label4 = None
 18label5 = None
 19label6 = None
 20label7 = None
 21label8 = None
 22label9 = None
 23wlan = None
 24udps = None
 25
 26
 27recv_data = None
 28
 29
 30def setup():
 31    global \
 32        title0, \
 33        label0, \
 34        label1, \
 35        label2, \
 36        label3, \
 37        label4, \
 38        label5, \
 39        label6, \
 40        label7, \
 41        label8, \
 42        label9, \
 43        wlan, \
 44        udps, \
 45        recv_data
 46
 47    M5.begin()
 48    Widgets.fillScreen(0x222222)
 49    title0 = Widgets.Title("UDP Server", 3, 0xFFFFFF, 0x0000FF, Widgets.FONTS.DejaVu24)
 50    label0 = Widgets.Label("Local IP:", 4, 32, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 51    label1 = Widgets.Label("Local Port:", 4, 60, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 52    label2 = Widgets.Label("Remote IP:", 4, 88, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 53    label3 = Widgets.Label("Remote Port:", 4, 116, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 54    label4 = Widgets.Label("Recv Data:", 4, 144, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 55    label5 = Widgets.Label("label5", 136, 32, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 56    label6 = Widgets.Label("label6", 136, 60, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 57    label7 = Widgets.Label("label7", 136, 88, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 58    label8 = Widgets.Label("label8", 136, 116, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 59    label9 = Widgets.Label("label9", 136, 144, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 60
 61    wlan = network.WLAN(network.STA_IF)
 62    wlan.active(True)
 63    udps = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
 64    udps.bind(("0.0.0.0", 8000))
 65    udps.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
 66    label5.setText(str(wlan.ifconfig()[0]))
 67    label6.setText(str("8000"))
 68
 69
 70def loop():
 71    global \
 72        title0, \
 73        label0, \
 74        label1, \
 75        label2, \
 76        label3, \
 77        label4, \
 78        label5, \
 79        label6, \
 80        label7, \
 81        label8, \
 82        label9, \
 83        wlan, \
 84        udps, \
 85        recv_data
 86    M5.update()
 87    recv_data = udps.recvfrom(1024)
 88    label7.setText(str(recv_data[1][0]))
 89    label8.setText(str(recv_data[1][1]))
 90    label9.setText(str(recv_data[0]))
 91    udps.sendto(recv_data[0], recv_data[1])
 92
 93
 94if __name__ == "__main__":
 95    try:
 96        setup()
 97        while True:
 98            loop()
 99    except (Exception, KeyboardInterrupt) as e:
100        try:
101            from utility import print_error_msg
102
103            print_error_msg(e)
104        except ImportError:
105            print("please update to latest firmware")

示例输出:

None

API参考

socket.socket()
socket.bind(address)

创建一个套接字对象并将其绑定到一个地址。

参数:

address (tuple) – 包含服务器 IP 地址和端口号的元组。

返回:

一个套接字对象。

返回类型:

socket.socket

UiFlow2 代码块:

init.png

MicroPython 代码块:

import socket

udps = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udps.bind(('0.0.0.0', 8000))
socket.close()

关闭套接字连接。

UiFlow2 代码块:

close.png

MicroPython 代码块:

udps.close()
socket.recv(bufsize)

从套接字接收数据。

参数:

bufsize (int) – 一次可接收的最大数据量。

返回:

接收到的数据。

返回类型:

bytes

UiFlow2 代码块:

recv.png

MicroPython 代码块:

data = udps.recv(1024)
print(data)
socket.recvfrom(bufsize)

从套接字接收数据。返回值是一对 (bytes, address),其中 bytes 是表示接收数据的字节对象,address 是发送数据的套接字的地址。

参数:

bufsize (int) – 一次可接收的最大数据量。

返回:

接收到的数据。

返回类型:

tuple

UiFlow2 代码块:

recvfrom.png

MicroPython 代码块:

data, address = udps.recvfrom(1024)
print(data)
socket.read()

从套接字读取数据。

返回:

接收到的数据。

返回类型:

bytes

UiFlow2 代码块:

read.png

MicroPython 代码块:

data = udps.read()
print(data)
socket.send(data)

向套接字发送数据。该套接字必须连接到远程套接字。

参数:

data (bytes | str) – 要发送的数据。

返回:

已发送的字节数。

返回类型:

int

UiFlow2 代码块:

send.png

MicroPython 代码块:

udps.send(b'Hello, World!')
udps.send('Hello, World!')
socket.sendto(data, address)

将数据发送到套接字。套接字不应连接到远程套接字,因为目标套接字由地址指定。

参数:
  • data (bytes | str) – 要发送的数据。

  • address (tuple) – 包含目标 IP 地址和端口号的元组。

返回:

已发送的字节数。

返回类型:

int

UiFlow2 代码块:

sendto.png

MicroPython 代码块:

udps.sendto("hello", ("192.168.8.8", 8000))
socket.write(data)

将字节缓冲区写入套接字。此函数将尝试将所有数据写入套接字(无“短写入”)。不过,对于非阻塞套接字,这可能无法实现,并且返回的值将小于 buf 的长度。

参数:

data (bytes | str) – 要发送的数据。

返回:

已发送的字节数。

返回类型:

int

UiFlow2 代码块:

write.png

MicroPython 代码块:

udps.write(b'Hello, World!')
udps.write('Hello, World!')
socket.setsockopt(level, optname, value)

设置给定套接字选项的值。所需的符号常量在套接字模块中定义(SO_* 等)。该值可以是整数或表示缓冲区的字节类对象。

参数:
  • level (int) – 定义选项的级别。

  • optname (int) – 要设置的选项的名称。

  • value – 为选项设置的值。

UiFlow2 代码块:

setsockopt.png

MicroPython 代码块:

udps.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 0)
udps.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)