本文介绍如何使用行空板 M10 与 SIoT 通信,并分别用 Mind+ 的 Python 积木模式 和 Python 代码模式 完成两个项目:
- 行空板 M10 上传温度数据到 SIoT。
- SIoT 发送控制指令,让行空板 M10 控制 LED 灯打开或关闭。
为了便于学习,本文将两种编程方式分开编写。建议初学者先完成 Python 积木模式,再对照学习 Python 代码模式。
1. 准备工作
1.1 硬件准备
本教程以外接 DHT11 温湿度传感器和外接 LED 模块为例。
| 硬件 | 用途 | 示例连接 |
|---|---|---|
| 行空板 M10 | 运行程序、连接 SIoT、控制硬件 | 通过 USB 或 Wi-Fi 连接电脑 |
| DHT11 温湿度传感器 | 采集温度(本教程主要上传温度数据) | 数据线接 P21 |
| LED 模块 | 接收 SIoT 指令后亮灭 | 信号线接 P22 |
| 电脑 | 运行 Mind+、访问 SIoT 页面 | 与行空板在同一局域网 |

如果使用的是其他传感器、其他 LED 模块或其他引脚,请根据实际硬件连接修改程序中的引脚号。
1.2 软件准备
开始前请确认:
- 已安装 Mind+。
- 行空板 M10 可以正常连接电脑。
- SIoT 服务已经启动。
- 电脑和行空板 M10 处在同一局域网内。
- 浏览器可以打开 SIoT Web 管理页面。
常用连接参数如下:
| 参数 | 示例值 |
|---|---|
| SIoT 服务器地址 | 10.1.2.3 或行空板的局域网 IP |
| MQTT 端口 | 1883 |
| 用户名 | siot |
| 密码 | dfrobot |
如果 SIoT 运行在行空板 M10 上, USB 连接时常用服务器地址为:10.1.2.3。
如果行空板通过 Wi-Fi 接入网络,也可以填写行空板在当前局域网中的 IP,例如:192.168.1.46。
1.3 本教程使用的 Topic
| Topic | 通信方向 | 用途 |
|---|---|---|
siot/m10_temp |
行空板 M10 -> SIoT | 上传温度数据 |
siot/m10_led |
SIoT -> 行空板 M10 | 接收 LED 控制指令 |
在 SIoT V2 中,可以在 Web 页面中创建 m10_temp、m10_led 两个主题。创建后,程序中使用完整 Topic:
siot/m10_temp
siot/m10_led
2. Python 积木模式
Python 积木模式适合初学者理解流程。它不需要一开始手写完整代码,只需要通过积木完成“连接 SIoT、上传数据、接收指令、控制 LED”这几步。
2.1 进入 Python 积木模式
打开 Mind+ 后,按下面步骤操作:
- 点击
新建项目。 - 进入
程序设计。 - 选择
Python 积木模式。 - 点击
扩展。 - 加载以下扩展库:
| 扩展库 | 用途 |
|---|---|
| 行空板 M10 | 控制行空板屏幕和引脚 |
| MQTT | 连接 SIoT 并收发消息 |
| DHT11 | 读取温湿度传感器数据 |

2.2 设置 SIoT 连接
在程序开始后,先完成 MQTT 初始化和连接。
初始化 MQTT 积木参数建议如下:
| 设置项 | 填写内容 |
|---|---|
| 平台 | SIoT V2 |
| 服务器地址 | 10.1.2.3 或实际 SIoT IP |
| 端口 | 1883 |
| 用户名 | siot |
| 密码 | dfrobot |

积木程序如下:

连接成功后,Mind+ 终端一般会出现类似“连接成功”的提示。

2.3 项目一:上传温度数据到 SIoT
项目效果
行空板 M10 每隔 5 秒读取一次 DHT11 传感器,并把温度数据发送到 SIoT:
| 数据 | Topic |
|---|---|
| 温度 | siot/m10_temp |
积木编写步骤
- 在
Python 主程序开始下初始化 MQTT,并连接 SIoT。 - 初始化 DHT11 传感器,型号选择
DHT11,引脚选择P21。 - 创建变量
temp。 - 在循环中读取温度,把结果赋值给
temp。 - 将
temp发布到siot/m10_temp,建议使用带SIoT V2或“保存到数据库”说明的发布积木。 - 在行空板屏幕上显示当前温度。
- 等待 5 秒后继续循环。
参考程序如下:

查看上传结果
程序运行后,打开 SIoT Web 页面,进入 siot/m10_temp 的数据管理页面。如果可以看到不断更新的数据,说明温度上传成功。

2.4 项目二:通过 SIoT 控制 LED 灯
项目效果
在 SIoT Web 页面中向 siot/m10_led 发送指令,行空板 M10 根据指令控制 LED。
| 发送内容 | LED 状态 |
|---|---|
ON |
打开 |
OFF |
关闭 |
也可以使用中文指令:
| 发送内容 | LED 状态 |
|---|---|
开 |
打开 |
关 |
关闭 |
初学阶段建议先使用 ON 和 OFF,方便排错。
积木编写步骤
- 在 MQTT 连接成功后,订阅主题
siot/m10_led。 - 设置 LED 所接引脚
P22为输出。 - 添加“当 MQTT 接收到消息”事件。
- 在事件中判断接收到的主题是否为
siot/m10_led。 - 如果接收到的消息是
ON,设置P22输出高电平。 - 如果接收到的消息是
OFF,设置P22输出低电平。
参考程序如下:

发送控制指令
打开 SIoT Web 页面,进入 siot/m10_led 主题的数据管理页面。在消息内容中输入 ON,点击发送后,LED 应点亮。再发送 OFF,LED 应熄灭。

2.5 积木模式综合效果
完成以上两个项目后,可以将它们合并到同一个积木程序中。这样,一个程序就能同时完成“数据上传”和“远程控制”两个方向的通信。
程序运行效果:

3. Python 代码模式
除了使用 Mind+ 图形化积木外,如果设备支持 Python 编程(例如行空板、树莓派等),也可以直接通过 Python 代码连接 SIoT,实现数据上传、消息订阅与远程控制。
3.1 Python 连接 SIoT 的基本流程
使用 Python 连接 SIoT 时,通常需要完成以下几个步骤,如果需要与前面的 Web 管理页面配合测试,建议继续使用 项目名/设备名 格式作为 Topic,例如:siot/m10_led and siot/m10_temp,这样更方便后续的数据管理与设备区分。

3.2 最小连接示例
下面代码只完成连接 SIoT,用于检查服务器地址、账号、密码是否正确。
import siot
SERVER = "10.1.2.3" # 请改成实际运行 SIoT 的设备 IP
CLIENT_ID = "" # 在 SIoT 上,CLIENT_ID 可以留空
IOT_USERNAME = 'siot' # 用户名
IOT_PASSWORD = 'dfrobot' # 密码
siot.init(CLIENT_ID, SERVER, user=IOT_USERNAME, password=IOT_PASSWORD)
siot.connect()
siot.loop()
当运行成功后,在终端区域会出现“连接成功”的提示。

重要代码说明:
SERVER:指的是开启 SIoT 服务用以连接的服务器的 IP 地址。CLIENT_ID:指的是客户端标识符,它是客户端到服务器的唯一标识,这里我们可以不输入内容。user:指的是物联网平台账户的用户名。password:指账号对应的密码。siot.init():初始化连接参数。siot.connect():连接 SIoT 平台。siot.loop():保持消息循环。
3.3 项目一:上传温度数据到 SIoT
如果需要向 SIoT 上传数据,可以使用 publish_save() 方法。下面示例会每隔 2 秒向平台发送一次行空板 M10 读取到的温度数据:
import siot # 导入 SIoT MQTT 客户端库,用于物联网通信
import time # 导入时间库,用于控制延时与主循环频率
from unihiker import GUI # 导入行空板 GUI 库,用于屏幕显示与交互
from pinpong.board import Board # 导入 PinPong 库的 Board 类,用于初始化主控
from pinpong.board import DHT11 # 导入 PinPong 库的 DHT11 传感器类
from pinpong.board import Board, Pin # 导入 Pin 引脚类(与 Board 类合并导入)
from pinpong.extension.unihiker import * # 导入行空板专属拓展库
# --- 硬件驱动与界面初始化 ---
Board().begin() # 初始化行空板
u_gui = GUI() # 实例化 GUI 引擎,用于屏幕绘制
# --- 物联网连接配置 ---
SERVER = "10.1.2.3" # SIoT 服务器 IP(若运行在行空板本地,USB连接时为10.1.2.3)
CLIENT_ID = "" # MQTT 客户端唯一标识 ID,一般留空即可
IOT_USERNAME = 'siot' # 默认 SIoT 登录用户名
IOT_PASSWORD = 'dfrobot' # 默认 SIoT 登录密码
PUB_TOPIC = "siot/m10_temp" # 发布消息的 MQTT 温度主题,格式为“项目名/设备名”
# --- 启动 MQTT 物联网连接 ---
siot.init(CLIENT_ID, SERVER, user=IOT_USERNAME, password=IOT_PASSWORD) # 载入 MQTT 配置参数
siot.connect() # 发起与服务器的连接
siot.loop() # 开启后台非阻塞消息循环,保持与服务器持续通信
# --- 硬件与显示初始化 ---
dht11 = DHT11(Pin((Pin.P21))) # 初始化 DHT11 传感器,数据引脚连接至 P21 数字口
# 在屏幕坐标 (0,0) 处绘制初始温度文本,通过外部只创建一次,防图层重叠
temp1 = u_gui.draw_text(text="实时温度:", x=0, y=0, font_size=20, color="#0000FF")
# --- 主循环:持续读取温度并上传 ---
while True:
temp = dht11.temp_c() # 读取外接 DHT11 传感器测得的摄氏温度值
temp1.config(text="实时温度:" + str(temp)) # 使用 .config 方法动态更新屏幕文字,实时显示温度
siot.publish_save(PUB_TOPIC, temp) # 向指定 Topic 发布数据并同步存入 SIoT 数据库
print(temp) # 在终端/控制台中打印当前温度,便于本地调试
time.sleep(2) # 延时 2 秒,避免数据发送过快,降低 CPU 占用
运行后,在 SIoT Web 页面中查看数据,如果页面中出现持续更新的温度数据,说明上传成功。

重要代码说明:
siot.publish_save():将指定 Topic 发布的数据存入数据库。
3.4 项目二:通过 SIoT 控制 LED 灯
如果需要从 SIoT 接收控制指令,可以使用 subscribe() 订阅 Topic。下面示例演示通过 SIoT 平台向指定 Topic 发送 ON 或 OFF 控制指令,从而实现对 LED 灯的远程开关控制。
import time # 导入时间库,用于控制主循环运行频率
import siot # 导入 SIoT MQTT 客户端库,用于物联网通信
from pinpong.board import Board # 导入 PinPong 库的 Board 类,用于初始化主控
from pinpong.board import Board, Pin # 导入 Pin 类(用于控制引脚,Board 重复导入不影响运行)
from pinpong.extension.unihiker import * # 导入行空板专属扩展库
from unihiker import GUI # 导入行空板 GUI 库,用于控制屏幕显示
# --- 物联网连接配置 ---
SERVER = "10.1.2.3" # SIoT 服务器 IP(若运行在行空板本地,USB连接时为10.1.2.3)
CLIENT_ID = "" # MQTT 客户端唯一标识 ID,一般留空即可
IOT_USERNAME = "siot" # 默认 SIoT 登录用户名
IOT_PASSWORD = "dfrobot" # 默认 SIoT 登录密码
u_gui = GUI() # 实例化 GUI 引擎,用于屏幕绘制
LED_TOPIC = "siot/m10_led" # 订阅的 MQTT 控制主题
# --- 硬件驱动配置 ---
Board().begin() # 初始化行空板
led = Pin(Pin.P22, Pin.OUT) # 将行空板的 P22 引脚配置为数字输出模式,用于控制 LED
# --- 定义 MQTT 消息监听回调函数 ---
def on_message(client, userdata, msg):
topic = msg.topic # 获取接收消息的主题
payload = msg.payload.decode().strip() # 解码消息内容,并使用 .strip() 过滤多余的空格或换行
print("收到消息:", topic, payload)
# 校验接收的消息主题是否为 LED 控制主题
if topic != LED_TOPIC:
return
# 根据不同的控制指令切换 LED 亮灭并更新屏幕显示
if payload in ["ON", "on", "1", "开"]: # 接收到开启指令
led.write_digital(1) # 往 P22 引脚写入高电平点亮 LED
print("LED 已打开")
LED.config(text="LED灯状态:打开") # 使用 .config 方法动态更新屏幕文字,避免图层重叠模糊
elif payload in ["OFF", "off", "0", "关"]: # 接收到关闭指令
led.write_digital(0) # 往 P22 引脚写入低电平熄灭 LED
print("LED 已关闭")
LED.config(text="LED灯状态:关闭") # 动态更新屏幕文字
# --- 启动 MQTT 物联网连接 ---
siot.init(CLIENT_ID, SERVER, user=IOT_USERNAME, password=IOT_PASSWORD) # 载入 MQTT 配置参数
siot.connect() # 发起与服务器的连接
siot.subscribe(LED_TOPIC, on_message) # 订阅 LED 控制主题,并绑定消息接收的回调函数
siot.loop() # 开启后台非阻塞消息循环,保持 MQTT 在后台持续运行
# --- 屏幕界面初始化 ---
# 必须放置在循环体外只创建一次,通过 config 动态刷新的方式可以彻底解决“文字覆盖堆叠”的问题
LED = u_gui.draw_text(text="LED灯状态:", x=0, y=40, font_size=20, color="#0000FF")
# --- 主循环维持运行 ---
while True:
time.sleep(0.1) # 保持微小延时,维持程序运行,降低 CPU 占用
当运行成功后,在 SIoT Web 页面向 siot/m10_led 发送 ON 或 OFF 控制指令,你就能远程控制行空板 M10 上的 LED 灯。

本教程使用外接 LED,示例引脚为
P22。如果你想控制板载 LED,可根据实际板载 LED 引脚把Pin.P22改为对应引脚,例如使用Pin.P25。
重要代码说明:
on_message:是定义的接收到平台消息后所要执行的功能函数。msg.payload.decode():表示把收到的消息内容转换成字符串,便于做 ON、OFF 之类的判断。siot.subscribe():是用来订阅平台发送来的消息。
3.5 综合示例:温度上传 + LED 控制
下面代码把两个项目合并到同一个程序中。行空板 M10 会持续上传温度,同时接收 SIoT 发来的 LED 控制指令。
import siot # 导入 SIoT MQTT 客户端库,用于物联网通信
import time # 导入时间库,用于控制延时与主循环频率
from unihiker import GUI # 导入行空板 GUI 库,用于屏幕显示与交互
from pinpong.board import Board, Pin, DHT11 # 导入 PinPong 库的 Board、Pin 和 DHT11 传感器类
from pinpong.extension.unihiker import * # 导入行空板专属拓展库
# --- 硬件驱动与界面初始化 ---
Board().begin() # 初始化行空板
u_gui = GUI() # 实例化 GUI 引擎,用于屏幕绘制
# --- 物联网连接配置 ---
SERVER = "10.1.2.3" # SIoT 服务器 IP(若运行在行空板本地,USB连接时为10.1.2.3)
CLIENT_ID = "" # MQTT 客户端唯一标识 ID,一般留空即可
IOT_USERNAME = 'siot' # 默认 SIoT 登录用户名
IOT_PASSWORD = 'dfrobot' # 默认 SIoT 登录密码
TEMP_TOPIC = "siot/m10_temp" # 上传温度数据的 MQTT 主题
LED_TOPIC = "siot/m10_led" # 订阅 LED 控制指令的 MQTT 主题
# --- 定义 MQTT 消息监听回调函数 ---
def on_message(client, userdata, msg):
topic = msg.topic # 获取接收消息的主题
payload = msg.payload.decode().strip() # 解码消息内容,并去除两端的空格与换行
print("收到消息:", topic, payload)
# 校验接收的消息主题是否为 LED 控制主题
if topic != LED_TOPIC:
return
# 根据不同的控制指令切换 LED 亮灭并更新屏幕显示
if payload in ["ON", "on", "1", "开"]:
led.write_digital(1) # 往 P22 引脚写入高电平,点亮 LED
print("LED 已打开")
led_txt.config(text="LED灯状态:打开") # 动态更新屏幕文字,避免图层重叠模糊
elif payload in ["OFF", "off", "0", "关"]:
led.write_digital(0) # 往 P22 引脚写入低电平,熄灭 LED
print("LED 已关闭")
led_txt.config(text="LED灯状态:关闭") # 动态更新屏幕文字
# --- 启动 MQTT 物联网连接 ---
siot.init(CLIENT_ID, SERVER, user=IOT_USERNAME, password=IOT_PASSWORD) # 载入 MQTT 配置参数
siot.connect() # 发起与服务器的连接
siot.subscribe(LED_TOPIC, on_message) # 订阅 LED 控制主题,并绑定消息接收的回调函数
siot.loop() # 开启后台非阻塞消息循环,保持 MQTT 在后台持续运行
# --- 硬件与显示图层初始化 ---
dht11 = DHT11(Pin(Pin.P21)) # 初始化 DHT11 传感器,数据引脚连接至 P21 数字口
led = Pin(Pin.P22, Pin.OUT) # 将 P22 引脚配置为数字输出模式,用于控制 LED
# 在屏幕上创建文本显示对象(在循环外部绘制一次,防重叠)
temp_txt = u_gui.draw_text(text="实时温度:", x=0, y=0, font_size=20, color="#0000FF")
led_txt = u_gui.draw_text(text="LED灯状态:", x=0, y=40, font_size=20, color="#0000FF")
# --- 主循环:持续读取温度并上传 ---
while True:
temp = dht11.temp_c() # 读取外接 DHT11 传感器测得的摄氏温度值
temp_txt.config(text="实时温度:" + str(temp)) # 动态更新屏幕显示的实时温度值
siot.publish_save(TEMP_TOPIC, temp) # 向温度主题发布数据并同步存入 SIoT 数据库
print("已上传温度:", temp) # 在终端打印当前温度
time.sleep(2) # 延时 2 秒,避免数据发送过快,降低 CPU 占用
如果程序运行正常,可以在 SIoT 中看到温度数据,同时也可以通过发送 ON、OFF 控制 LED。

提示: 以上这一类示例尤其适合行空板这类既能运行 Python 程序、又能直接访问 SIoT 服务的设备。相比图形化积木,Python 方式更加灵活,适合开发更复杂的物联网项目。
例如:
- 多线程数据处理
- 本地界面开发
- AI 数据联动
- 自动化控制系统
- 数据分析与存储
对于教学来说,它也能帮助学生建立:“图形化编程 → 代码编程 → 真实物联网开发”之间的完整认知链路。