欢迎光临
我们一直在努力

易语言开发从入门到精通:补充篇·物联网+嵌入式开发深度实战·Arduino/树莓派通信·MQTT协议·阿里云接入·智能硬件控制


易语言开发从入门到精通:补充篇·物联网+嵌入式开发深度实战·Arduino/树莓派通信·MQTT协议·阿里云接入·智能硬件控制 ⚙️🌐📱

在这里插入图片描述

1.37.1 学习目标 🎯
作为《易语言开发从入门到精通》的物联网+嵌入式开发补充篇·本地→远程→云端通信全链路实战·工业监测/智能家居高频场景全覆盖,本章将帮你构建完整的物联网思维体系,完成3个跨平台、跨设备的高实用价值项目,掌握本地串口、远程网络、云端MQTT/HTTP通信技能,达成以下5重可落地的明确目标:

  • 构建物联网全链路思维框架:掌握“感知层(传感器/执行器)→网络层(本地串口/Wi-Fi/Bluetooth)→平台层(阿里云/腾讯云/百度云)→应用层(易语言软件/手机APP/微信小程序)→安全层(数据加密/设备认证)”的五层标准化开发模式;
  • 掌握核心通信协议与技术:精通常用的本地串口通信(RS232/RS485/TTL)、远程HTTP通信、MQTT协议(发布/订阅模式);
  • 开发3个高实用价值的联合项目:完成本地Arduino智能温湿度监测系统(LCD1602显示+蜂鸣器报警)、阿里云IoT平台温湿度数据上传与钉钉告警系统、树莓派远程控制LED与环境监测系统;
  • 掌握云平台接入与设备管理:学会阿里云IoT平台的设备创建、物模型定义、数据流转、规则引擎配置;
  • 掌握物联网项目的性能与稳定性优化:学习传感器数据滤波、网络重连机制、数据加密传输、设备心跳包的方法;

  • 1.37.2 物联网全链路的核心思维框架——五层标准化开发模式 🧠

    物联网的本质是通过感知层获取环境/设备数据,经过网络层传输到平台层存储和分析,最后通过应用层展示和控制,五层标准化开发模式可以帮助你快速解决90%以上的物联网项目需求。

    1.37.2.1 第一层:感知层
    • 功能:负责获取环境/设备数据(传感器)和执行操作(执行器);
    • 常用设备:
      • 传感器:DHT11/DHT22温湿度传感器、DS18B20数字温度传感器、HC-SR501人体红外传感器、MQ-2烟雾传感器;
      • 执行器:LED灯、蜂鸣器、继电器、直流电机;
    • 开发工具:Arduino IDE(开发Arduino程序)、Raspberry Pi OS(树莓派操作系统)、WiringPi库(树莓派GPIO控制);
    • 注意事项:传感器和执行器的接线要正确,要使用合适的电阻和电压;
    1.37.2.2 第二层:网络层
    • 功能:负责将感知层的数据传输到平台层,或者将平台层的控制指令传输到感知层;
    • 常用通信方式:
      • 本地通信:RS232/RS485串口通信(工业场景)、TTL串口通信(Arduino与树莓派通信)、I²C通信(传感器之间通信)、SPI通信(高速数据传输);
      • 远程通信:Wi-Fi通信(ESP8266/ESP32模块)、Bluetooth通信(BLE低功耗蓝牙模块)、NB-IoT通信(窄带物联网模块,适用于低功耗、远距离场景);
    • 开发工具:精易串口模块(易语言串口通信)、Arduino ESP8266/ESP32库(Wi-Fi通信)、Python paho-mqtt库(树莓派MQTT通信);
    • 注意事项:使用远程通信时要注意网络稳定性,要设置合理的网络重连机制;
    1.37.2.3 第三层:平台层
    • 功能:负责存储感知层的数据,分析数据,管理设备;
    • 常用云平台:阿里云IoT平台、腾讯云IoT平台、百度云IoT平台;
    • 开发工具:阿里云IoT平台控制台、腾讯云IoT平台控制台、百度云IoT平台控制台;
    • 注意事项:云平台的设备认证要正确,要设置合理的数据存储和分析规则;
    1.37.2.4 第四层:应用层
    • 功能:负责展示感知层的数据,控制设备;
    • 常用开发方式:易语言Windows程序(本地/远程控制)、微信小程序(移动控制)、Android/iOS APP(原生移动应用);
    • 开发工具:易语言官方IDE、微信开发者工具、Android Studio、Xcode;
    • 注意事项:应用层的界面要友好,要支持数据的实时更新和设备的远程控制;
    1.37.2.5 第五层:安全层
    • 功能:负责保护数据的安全传输和设备的安全管理;
    • 常用安全措施:数据加密传输(HTTPS/MQTT TLS)、设备认证(三元组认证/Token认证)、访问控制(ACL);
    • 开发工具:阿里云IoT平台控制台、OpenSSL工具;
    • 注意事项:安全层的设置要严格,防止数据被泄露和设备被攻击;

    1.37.3 核心通信协议与技术详解——本地串口/MQTT/HTTP云通信 🔌

    1.37.3.1 本地串口通信(Arduino与易语言通信)

    核心操作:
    ✅ Arduino端代码:使用SoftwareSerial或HardwareSerial库读取传感器数据,通过串口发送数据;
    ✅ 易语言端代码:使用精易串口模块初始化串口,读取串口数据,发送控制指令;
    ✅ 数据格式:使用JSON格式或自定义协议(如“温度:湿度:状态|”)发送数据,便于解析;

    Arduino端代码(DHT11温湿度传感器):

    #include <DHT.h>
    #include <DHT_U.h>

    #define DHTPIN 2
    #define DHTTYPE DHT11

    DHT dht(DHTPIN, DHTTYPE);

    void setup() {
    Serial.begin(9600);
    dht.begin();
    }

    void loop() {
    delay(2000);

    float temperature = dht.readTemperature();
    float humidity = dht.readHumidity();

    if (isnan(temperature) || isnan(humidity)) {
    Serial.println("Failed to read sensor data!");
    return;
    }

    Serial.print("{\\"temperature\\":");
    Serial.print(temperature);
    Serial.print(",\\"humidity\\":");
    Serial.print(humidity);
    Serial.println("}");
    }

    易语言端代码(精易串口模块):

    .版本 2
    .支持库 spec
    .支持库 iext
    .支持库 com
    .支持库 json

    .程序集 窗口程序集_启动窗口
    .程序集变量 串口模块句柄, 整数型
    .程序集变量 串口数据缓冲区, 文本型

    .子程序 _启动窗口_创建完毕
    ' 初始化精易串口模块
    串口模块句柄 = 精易模块.串口_初始化 ()

    ' 打开串口
    .局部变量 打开串口结果, 逻辑型
    打开串口结果 = 精易模块.串口_打开 (串口模块句柄, 1, 9600, 8, 1, 0)

    ' 检查打开串口结果是否成功
    .如果真 (打开串口结果 = 假)
    信息框 (“打开串口失败!”, #错误图标, “物联网智能温湿度监测系统”)
    返回 ()
    .如果真结束

    ' 开启串口数据接收
    精易模块.串口_开启数据接收 (串口模块句柄, &串口数据接收事件)

    .子程序 _启动窗口_将被销毁
    ' 关闭串口
    精易模块.串口_关闭 (串口模块句柄)

    ' 销毁精易串口模块
    精易模块.串口_销毁 (串口模块句柄)

    .子程序 _按钮_关闭串口_被单击
    ' 关闭串口
    精易模块.串口_关闭 (串口模块句柄)

    ' 销毁精易串口模块
    精易模块.串口_销毁 (串口模块句柄)

    _编辑框_串口状态.内容 = “串口已关闭”
    _按钮_打开串口.禁止 = 假
    _按钮_关闭串口.禁止 = 真

    .子程序 串口数据接收事件, , , 参数:接收到的数据
    .参数 接收到的数据, 文本型

    ' 将接收到的数据添加到缓冲区
    串口数据缓冲区 = 串口数据缓冲区 + 接收到的数据

    ' 检查缓冲区是否包含完整的JSON数据
    .局部变量 JSON数据开始位置, 整数型
    JSON数据开始位置 = 寻找文本 (串口数据缓冲区, “{”, , 真)

    .局部变量 JSON数据结束位置, 整数型
    JSON数据结束位置 = 倒找文本 (串口数据缓冲区, “}”, , 真)

    .如果真 (JSON数据开始位置 = -1 或 JSON数据结束位置 = -1 或 JSON数据开始位置 > JSON数据结束位置)
    返回 ()
    .如果真结束

    ' 提取完整的JSON数据
    .局部变量 完整JSON数据, 文本型
    完整JSON数据 = 取文本中间 (串口数据缓冲区, JSON数据开始位置 + 1, JSON数据结束位置 – JSON数据开始位置)

    ' 解析JSON数据
    .局部变量 解析对象, JSON对象
    解析对象.解析 (完整JSON数据)

    ' 显示温湿度数据
    _编辑框_温度.内容 = 到文本 (解析对象.取成员数值 (“temperature”)) + “℃”
    _编辑框_湿度.内容 = 到文本 (解析对象.取成员数值 (“humidity”)) + “%”

    ' 清空缓冲区
    串口数据缓冲区 = 取文本右边 (串口数据缓冲区, 取文本长度 (串口数据缓冲区) – JSON数据结束位置 – 1)

    测试调试和优化经验:
    ① 测试调试:

    • 使用USB转TTL串口调试助手测试Arduino端是否正常发送数据;
    • 测试易语言端是否正常接收和解析数据;
    • 测试串口数据缓冲区的清空是否正常;
      ② 优化经验:
    • 使用固定长度的数据格式,便于解析;
    • 开启串口数据接收的超时机制,防止数据缓冲区溢出;
    • 使用传感器数据滤波算法,提高数据的准确性;

    1.37.3.2 MQTT协议通信(阿里云IoT平台数据上传)

    核心操作:
    ✅ 创建阿里云IoT平台设备:在阿里云IoT平台控制台创建产品和设备,获取设备的三元组(ProductKey、DeviceName、DeviceSecret);
    ✅ Arduino端代码:使用ESP8266/ESP32模块连接Wi-Fi,使用AliyunIoTSDK库上传数据;
    ✅ 易语言端代码:使用精易模块的“MQTT_初始化”“MQTT_连接”“MQTT_发布消息”“MQTT_订阅主题”等函数;

    Arduino端代码(ESP8266+DHT11上传阿里云IoT平台):

    #include <ESP8266WiFi.h>
    #include <PubSubClient.h>
    #include <DHT.h>
    #include <DHT_U.h>
    #include <ArduinoJson.h>

    #define DHTPIN 2
    #define DHTTYPE DHT11

    DHT dht(DHTPIN, DHTTYPE);

    // 阿里云IoT平台设备三元组
    #define PRODUCT_KEY "你的ProductKey"
    #define DEVICE_NAME "你的DeviceName"
    #define DEVICE_SECRET "你的DeviceSecret"

    // Wi-Fi信息
    #define WIFI_SSID "你的Wi-Fi SSID"
    #define WIFI_PASSWORD "你的Wi-Fi密码"

    // MQTT服务器地址
    #define MQTT_SERVER PRODUCT_KEY ".iot-as-mqtt.cn-shanghai.aliyuncs.com"
    #define MQTT_PORT 1883

    // MQTT主题
    #define MQTT_PUBLISH_TOPIC "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post"

    WiFiClient espClient;
    PubSubClient client(espClient);

    unsigned long lastMsg = 0;
    #define MSG_BUFFER_SIZE (500)
    char msg[MSG_BUFFER_SIZE];

    void setup() {
    Serial.begin(115200);
    dht.begin();

    setupWiFi();
    setupMQTT();
    }

    void loop() {
    if (!client.connected()) {
    reconnect();
    }
    client.loop();

    unsigned long now = millis();
    if (now lastMsg > 2000) {
    lastMsg = now;

    float temperature = dht.readTemperature();
    float humidity = dht.readHumidity();

    if (isnan(temperature) || isnan(humidity)) {
    Serial.println("Failed to read sensor data!");
    return;
    }

    publishProperty(temperature, humidity);
    }
    }

    void setupWiFi() {
    delay(10);

    Serial.println();
    Serial.print("Connecting to ");
    Serial.println(WIFI_SSID);

    WiFi.mode(WIFI_STA);
    WiFi.begin(WIFI_SSID, WIFI_PASSWORD);

    while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    }

    Serial.println("");
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
    }

    void setupMQTT() {
    client.setServer(MQTT_SERVER, MQTT_PORT);
    client.setCallback(callback);
    }

    void callback(char* topic, byte* payload, unsigned int length) {
    Serial.print("Message arrived [");
    Serial.print(topic);
    Serial.print("] ");

    for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
    }
    Serial.println();
    }

    void reconnect() {
    while (!client.connected()) {
    Serial.print("Attempting MQTT connection…");

    String clientId = "ESP8266Client-" + String(random(0xffff), HEX);

    if (client.connect(clientId.c_str(), DEVICE_NAME "@" PRODUCT_KEY, DEVICE_SECRET)) {
    Serial.println("connected");
    } else {
    Serial.print("failed, rc=");
    Serial.print(client.state());
    Serial.println(" try again in 5 seconds");
    delay(5000);
    }
    }
    }

    void publishProperty(float temperature, float humidity) {
    StaticJsonDocument<256> root;
    StaticJsonDocument<128> data;

    data["Temperature"] = temperature;
    data["Humidity"] = humidity;

    root["method"] = "thing.event.property.post";
    root["id"] = "12345";
    root["version"] = "1.0";
    root["params"] = data;

    serializeJson(root, msg, MSG_BUFFER_SIZE);

    Serial.print("Publish message: ");
    Serial.println(msg);

    if (client.publish(MQTT_PUBLISH_TOPIC, msg)) {
    Serial.println("Publish succeeded");
    } else {
    Serial.println("Publish failed");
    }
    }

    易语言端代码(精易模块连接阿里云IoT平台):

    .版本 2
    .支持库 spec
    .支持库 iext
    .支持库 json
    .支持库 anim

    .程序集 窗口程序集_启动窗口
    .程序集变量 MQTT客户端句柄, 整数型
    .程序集变量 MQTT连接状态, 逻辑型 ' 连接状态:真为已连接,假为未连接

    .子程序 _启动窗口_创建完毕
    ' 初始化组件属性
    _编辑框_ProductKey.内容 = “你的ProductKey”
    _编辑框_DeviceName.内容 = “你的DeviceName”
    _编辑框_DeviceSecret.内容 = “你的DeviceSecret”
    _编辑框_WiFiSSID.内容 = “你的Wi-Fi SSID”
    _编辑框_WiFiPassword.内容 = “你的Wi-Fi密码”

    ' 初始化精易MQTT模块
    MQTT客户端句柄 = 精易模块.MQTT_初始化 ()

    ' 开启MQTT连接状态监听
    精易模块.MQTT_开启连接状态监听 (MQTT客户端句柄, &MQTT连接状态监听事件)

    ' 开启MQTT消息接收监听
    精易模块.MQTT_开启消息接收监听 (MQTT客户端句柄, &MQTT消息接收监听事件)

    .子程序 _启动窗口_将被销毁
    ' 关闭MQTT连接
    精易模块.MQTT_关闭 (MQTT客户端句柄)

    ' 销毁精易MQTT模块
    精易模块.MQTT_销毁 (MQTT客户端句柄)

    .子程序 _按钮_连接阿里云IoT平台_被单击
    ' 检查输入框是否为空
    .如果真 (_编辑框_ProductKey.内容 = “” 或 _编辑框_DeviceName.内容 = “” 或 _编辑框_DeviceSecret.内容 = “”)
    信息框 (“请输入设备三元组!”, #错误图标, “物联网智能温湿度监测系统”)
    返回 ()
    .如果真结束

    ' 构造MQTT服务器地址和端口号
    .局部变量 MQTT服务器地址, 文本型
    MQTT服务器地址 = _编辑框_ProductKey.内容 + “.iot-as-mqtt.cn-shanghai.aliyuncs.com”

    .局部变量 MQTT服务器端口号, 整数型
    MQTT服务器端口号 = 1883

    ' 构造MQTT客户端ID和用户名密码
    .局部变量 MQTT客户端ID, 文本型
    MQTT客户端ID = “EasyLanguageClient-” + 到文本 (取随机数 (0, 0xffff))

    .局部变量 MQTT用户名, 文本型
    MQTT用户名 = _编辑框_DeviceName.内容 + “@” + _编辑框_ProductKey.内容

    .局部变量 MQTT密码, 文本型
    MQTT密码 = _编辑框_DeviceSecret.内容

    ' 连接阿里云IoT平台
    .局部变量 连接结果, 逻辑型
    连接结果 = 精易模块.MQTT_连接 (MQTT客户端句柄, MQTT服务器地址, MQTT服务器端口号, MQTT客户端ID, MQTT用户名, MQTT密码)

    ' 检查连接结果是否成功
    .如果真 (连接结果 = 假)
    信息框 (“连接阿里云IoT平台失败!”, #错误图标, “物联网智能温湿度监测系统”)
    return ()
    .如果真结束

    MQTT连接状态 = 真
    _编辑框_MQTT连接状态.内容 = “已连接”
    _按钮_连接阿里云IoT平台.禁止 = 真
    _按钮_关闭阿里云IoT平台连接.禁止 = 假

    ' 订阅主题(设备属性设置主题)
    .局部变量 属性设置主题, 文本型
    属性设置主题 = “/sys/” + _编辑框_ProductKey.内容 + “/” + _编辑框_DeviceName.内容 + “/thing/service/property/set”

    精易模块.MQTT_订阅主题 (MQTT客户端句柄, 属性设置主题)

    测试调试和优化经验:
    ① 测试调试:

    • 使用串口调试助手测试ESP8266端是否正常连接Wi-Fi和MQTT服务器;
    • 使用阿里云IoT平台控制台的“设备日志”功能查看数据上传是否正常;
    • 测试易语言端是否正常接收和解析数据;
      ② 优化经验:
    • 使用MQTT TLS加密传输,提高数据的安全性;
    • 设置合理的心跳包间隔,防止连接断开;
    • 使用传感器数据滤波算法,提高数据的准确性;

    1.37.4 物联网深度实战——3个跨平台、跨设备的高实用价值项目 📱

    1.37.4.1 项目1:本地Arduino智能温湿度监测系统(LCD1602显示+蜂鸣器报警)

    项目需求分析:
    ✅ 功能需求:

    • 基础功能:实时读取DHT11温湿度传感器数据,在LCD1602显示屏上显示,当温度超过35℃或湿度超过80%时,蜂鸣器报警;
    • 辅助功能:支持设置温度和湿度的报警阈值;
      ✅ 非功能需求:
    • 界面设计:使用Arduino IDE的Serial Monitor作为调试界面;
    • 响应时间:传感器数据更新间隔不超过2秒;
    • 可靠性:蜂鸣器报警时要持续响,直到温度或湿度低于报警阈值;

    硬件接线:

    组件Arduino引脚
    DHT11 2
    LCD1602 RS→7, RW→GND, E→6, D4→5, D5→4, D6→3, D7→2
    蜂鸣器 9
    10KΩ电位器 中间脚→LCD1602 V0, 其他脚→5V和GND

    Arduino端代码:

    #include <DHT.h>
    #include <DHT_U.h>
    #include <LiquidCrystal.h>

    #define DHTPIN 2
    #define DHTTYPE DHT11

    DHT dht(DHTPIN, DHTTYPE);

    LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

    #define BUZZER_PIN 9

    int temperatureThreshold = 35;
    int humidityThreshold = 80;

    void setup() {
    Serial.begin(9600);
    dht.begin();
    lcd.begin(16, 2);
    pinMode(BUZZER_PIN, OUTPUT);
    }

    void loop() {
    delay(2000);

    float temperature = dht.readTemperature();
    float humidity = dht.readHumidity();

    if (isnan(temperature) || isnan(humidity)) {
    Serial.println("Failed to read sensor data!");
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Sensor Error!");
    return;
    }

    Serial.print("Temperature: ");
    Serial.print(temperature);
    Serial.print("℃, Humidity: ");
    Serial.print(humidity);
    Serial.println("%");

    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Temp: ");
    lcd.print(temperature);
    lcd.print("℃");
    lcd.setCursor(0, 1);
    lcd.print("Hum: ");
    lcd.print(humidity);
    lcd.print("%");

    if (temperature > temperatureThreshold || humidity > humidityThreshold) {
    digitalWrite(BUZZER_PIN, HIGH);
    Serial.println("Alarm triggered!");
    } else {
    digitalWrite(BUZZER_PIN, LOW);
    }
    }

    测试调试和优化经验:
    ① 测试调试:

    • 使用串口调试助手测试传感器数据是否正常;
    • 测试LCD1602显示屏是否正常显示;
    • 测试蜂鸣器报警是否正常;
      ② 优化经验:
    • 使用传感器数据滤波算法,提高数据的准确性;
    • 蜂鸣器报警时使用频率变化的声音,提高警示效果;

    1.37.4.2 项目2:阿里云IoT平台温湿度数据上传与钉钉告警系统

    项目需求分析:
    ✅ 功能需求:

    • 基础功能:实时读取DHT11温湿度传感器数据,上传到阿里云IoT平台,当温度超过35℃或湿度超过80%时,发送钉钉群机器人告警;
    • 辅助功能:支持设置温度和湿度的报警阈值,支持查看设备的在线状态;
      ✅ 非功能需求:
    • 界面设计:符合现代审美(扁平化风格、蓝色主题),功能分区明确(设备设置区、数据显示区、报警设置区);
    • 响应时间:传感器数据更新间隔不超过2秒;
    • 可靠性:网络断开时要自动重连,钉钉告警要发送成功;

    界面设计(组件箱拖拽+属性表配置):
    与系统底层与硬件交互的项目类似,只需要修改组件的类型和位置即可。

    代码实现(核心公共函数代码):

    .版本 2
    .支持库 spec
    .支持库 iext
    .支持库 com
    .支持库 json
    .支持库 anim

    .子程序 发送钉钉群机器人告警, 逻辑型 ' 参数:温度,湿度,返回:发送结果
    .参数 温度, 小数型
    .参数 湿度, 小数型

    ' 构造钉钉群机器人WebHook地址
    .局部变量 钉钉群机器人WebHook地址, 文本型
    钉钉群机器人WebHook地址 = “https://oapi.dingtalk.com/robot/send?access_token=你的钉钉群机器人access_token”

    ' 构造钉钉群机器人消息内容(文本消息)
    .局部变量 钉钉群机器人消息内容, JSON对象
    钉钉群机器人消息内容.解析 (“{”“msgtype”“:”“text”“, ”“text”“:{”“content”“:”“【设备告警】\\n设备名称:” + _编辑框_DeviceName.内容 + “\\n当前温度:” + 到文本 (温度) + “℃\\n当前湿度:” + 到文本 (湿度) + “%\\n报警阈值:温度>” + _编辑框_温度报警阈值.内容 + “℃或湿度>” + _编辑框_湿度报警阈值.内容 + “%\\n时间:” + 取现行时间 ().格式化 (“YYYY-MM-DD HH:MM:SS”)“}}”)

    ' 发送HTTP POST请求
    .局部变量 响应数据, 文本型
    响应数据 = 精易模块.HTTP_访问 (钉钉群机器人WebHook地址, #POST, 钉钉群机器人消息内容.到JSON文本 (), “Content-Type: application/json”, )

    ' 检查响应数据是否成功
    .局部变量 响应数据对象, JSON对象
    响应数据对象.解析 (响应数据)

    .如果真 (响应数据对象.取成员文本 (“errcode”) ≠ “0”)
    返回 (假)
    .如果真结束

    返回 (真)

    测试调试和优化经验:
    ① 测试调试:

    • 使用阿里云IoT平台控制台的“设备日志”功能查看数据上传是否正常;
    • 测试钉钉群机器人告警是否正常;
    • 测试网络断开时是否自动重连;
      ② 优化经验:
    • 使用MQTT TLS加密传输,提高数据的安全性;
    • 设置合理的心跳包间隔,防止连接断开;
    • 使用传感器数据滤波算法,提高数据的准确性;

    1.37.4.3 项目3:树莓派远程控制LED与环境监测系统

    项目需求分析:
    ✅ 功能需求:

    • 基础功能:树莓派读取DS18B20数字温度传感器数据,上传到阿里云IoT平台,易语言程序通过阿里云IoT平台远程控制树莓派上的LED灯;
    • 辅助功能:支持设置LED灯的开关状态,支持查看设备的在线状态;
      ✅ 非功能需求:
    • 界面设计:符合现代审美(扁平化风格、蓝色主题),功能分区明确(设备设置区、数据显示区、LED控制区);
    • 响应时间:LED灯开关状态更新间隔不超过1秒;
    • 可靠性:网络断开时要自动重连;

    硬件接线:

    组件树莓派引脚
    DS18B20 GPIO4 (Pin 7)
    LED灯 GPIO17 (Pin 11), 串联220Ω电阻

    树莓派端代码(Python):

    import time
    import json
    import random
    import paho.mqtt.client as mqtt
    import os

    # 阿里云IoT平台设备三元组
    PRODUCT_KEY = "你的ProductKey"
    DEVICE_NAME = "你的DeviceName"
    DEVICE_SECRET = "你的DeviceSecret"

    # Wi-Fi信息
    WIFI_SSID = "你的Wi-Fi SSID"
    WIFI_PASSWORD = "你的Wi-Fi密码"

    # MQTT服务器地址
    MQTT_SERVER = PRODUCT_KEY + ".iot-as-mqtt.cn-shanghai.aliyuncs.com"
    MQTT_PORT = 1883

    # MQTT主题
    MQTT_PUBLISH_TOPIC = "/sys/" + PRODUCT_KEY + "/" + DEVICE_NAME + "/thing/event/property/post"
    MQTT_SUBSCRIBE_TOPIC = "/sys/" + PRODUCT_KEY + "/" + DEVICE_NAME + "/thing/service/property/set"

    # DS18B20传感器路径
    DS18B20_PATH = "/sys/bus/w1/devices/28-*/w1_slave"

    # LED引脚
    LED_PIN = 17

    # 初始化GPIO
    import RPi.GPIO as GPIO
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(LED_PIN, GPIO.OUT)
    GPIO.output(LED_PIN, GPIO.LOW)

    # MQTT客户端
    client = mqtt.Client(client_id="RaspberryPiClient-" + str(random.randint(0, 0xffff)), clean_session=True)

    def on_connect(client, userdata, flags, rc):
    print("Connected with result code " + str(rc))
    client.subscribe(MQTT_SUBSCRIBE_TOPIC)

    def on_message(client, userdata, msg):
    print("Topic: " + msg.topic + ", Payload: " + str(msg.payload))

    try:
    payload = json.loads(msg.payload)
    params = payload.get("params", {})
    ledState = params.get("LedState", False)

    if ledState:
    GPIO.output(LED_PIN, GPIO.HIGH)
    print("LED turned on")
    else:
    GPIO.output(LED_PIN, GPIO.LOW)
    print("LED turned off")
    except Exception as e:
    print("Error parsing message: " + str(e))

    def setupMQTT():
    client.username_pw_set(DEVICE_NAME + "@" + PRODUCT_KEY, DEVICE_SECRET)
    client.on_connect = on_connect
    client.on_message = on_message
    client.connect(MQTT_SERVER, MQTT_PORT, 60)

    def readDS18B20():
    try:
    for dirname in os.listdir("/sys/bus/w1/devices"):
    if dirname.startswith("28-"):
    filename = "/sys/bus/w1/devices/" + dirname + "/w1_slave"
    with open(filename, "r") as f:
    lines = f.readlines()

    if lines[0].strip()[3:] != "YES":
    return None

    equals_pos = lines[1].find("t=")
    if equals_pos != 1:
    temp_string = lines[1][equals_pos + 2:]
    temp_celsius = float(temp_string) / 1000.0
    return temp_celsius
    except Exception as e:
    print("Error reading DS18B20 sensor: " + str(e))
    return None

    def publishProperty():
    temperature = readDS18B20()

    if temperature is None:
    print("Failed to read sensor data!")
    return False

    payload = {
    "method": "thing.event.property.post",
    "id": "12345",
    "version": "1.0",
    "params": {
    "Temperature": temperature
    }
    }

    try:
    client.publish(MQTT_PUBLISH_TOPIC, json.dumps(payload))
    print("Published message: " + json.dumps(payload))
    return True
    except Exception as e:
    print("Error publishing message: " + str(e))
    return False

    def main():
    setupMQTT()

    lastMsg = time.time()
    while True:
    client.loop()

    now = time.time()
    if now lastMsg > 2:
    lastMsg = now
    publishProperty()

    if __name__ == "__main__":
    try:
    main()
    except KeyboardInterrupt:
    print("Program stopped by user")
    finally:
    GPIO.cleanup()

    易语言端代码(LED控制部分):

    .版本 2
    .支持库 spec
    .支持库 iext
    .支持库 com
    .支持库 json
    .支持库 anim

    .程序集 窗口程序集_启动窗口
    .程序集变量 MQTT客户端句柄, 整数型
    .程序集变量 MQTT连接状态, 逻辑型 ' 连接状态:真为已连接,假为未连接

    .子程序 _按钮_控制LED_被单击, , , 选中
    .参数 选中, 逻辑型

    ' 检查MQTT连接状态
    .如果真 (MQTT连接状态 = 假)
    信息框 (“请先连接阿里云IoT平台!”, #错误图标, “物联网智能LED控制系统”)
    返回 ()
    .如果真结束

    ' 构造设备属性设置主题
    .局部变量 属性设置主题, 文本型
    属性设置主题 = “/sys/” + _编辑框_ProductKey.内容 + “/” + _编辑框_DeviceName.内容 + “/thing/service/property/set”

    ' 构造设备属性设置消息
    .局部变量 属性设置消息, JSON对象
    属性设置消息.解析 (“{”“method”“:”“thing.service.property.set”“, ”“id”“:”“12345”“, ”“version”“:”“1.0”“, ”“params”“:{”“LedState”“:” + 到文本 (选中) + “}}”)

    ' 发布设备属性设置消息
    .局部变量 发布消息结果, 逻辑型
    发布消息结果 = 精易模块.MQTT_发布消息 (MQTT客户端句柄, 属性设置主题, 属性设置消息.到JSON文本 ())

    ' 检查发布消息结果是否成功
    .如果真 (发布消息结果 = 假)
    信息框 (“控制LED失败!”, #错误图标, “物联网智能LED控制系统”)
    return ()
    .如果真结束

    测试调试和优化经验:
    ① 测试调试:

    • 使用树莓派的Serial Monitor测试传感器数据是否正常;
    • 使用阿里云IoT平台控制台的“设备日志”功能查看数据上传和消息接收是否正常;
    • 测试LED灯的开关状态是否正常;
      ② 优化经验:
    • 使用MQTT TLS加密传输,提高数据的安全性;
    • 设置合理的心跳包间隔,防止连接断开;
    • 使用传感器数据滤波算法,提高数据的准确性;

    1.37.5 物联网项目的性能与稳定性优化——提升数据准确性与设备可靠性 🛠️

    1.37.5.1 性能优化 🚀

    ✅ 使用传感器数据滤波算法:使用平均滤波算法、中位值滤波算法、加权平均滤波算法,提高传感器数据的准确性;
    ✅ 使用异步操作:使用异步操作代替同步操作,提高程序的响应时间;
    ✅ 使用分块处理:处理大量数据时,将数据分为多个小块,逐块处理,避免内存不足;
    ✅ 使用CDN加速:使用CDN加速请求,减少请求时间;

    1.37.5.2 稳定性优化 🛡️

    ✅ 使用异常处理机制:使用try-catch异常处理机制,处理操作失败的情况;
    ✅ 使用网络重连机制:网络断开时要自动重连;
    ✅ 使用设备心跳包:定期发送设备心跳包,确保设备在线;
    ✅ 使用资源释放机制:及时释放资源,避免资源泄漏;


    1.37.6 物联网常见问题排查手册 🚨

    1.37.6.1 本地串口通信问题(3个)
    问题1:Arduino端发送数据失败

    问题现象:Arduino端发送数据失败,串口调试助手没有显示数据。
    原因分析:

    • 传感器接线不正确;
    • 传感器故障;
    • 串口通信参数不正确;
      解决方案:
    • 检查传感器接线是否正确;
    • 检查传感器是否故障;
    • 检查串口通信参数是否正确;
    问题2:易语言端接收数据失败

    问题现象:易语言端接收数据失败,串口数据缓冲区为空。
    原因分析:

    • 串口通信参数不正确;
    • 串口未打开;
    • 串口数据接收事件未开启;
      解决方案:
    • 检查串口通信参数是否正确;
    • 检查串口是否打开;
    • 检查串口数据接收事件是否开启;
    问题3:串口数据解析失败

    问题现象:易语言端接收到数据,但解析失败。
    原因分析:

    • 数据格式不正确;
    • 数据缓冲区溢出;
      解决方案:
    • 检查数据格式是否正确;
    • 检查数据缓冲区是否溢出;

    1.37.7 补充篇总结与物联网未来发展方向 📜

    1.37.7.1 本章核心收获
    • ✅ 构建物联网全链路思维框架:掌握“感知层→网络层→平台层→应用层→安全层”的五层标准化开发模式;
    • ✅ 掌握核心通信协议与技术:精通常用的本地串口通信、远程HTTP通信、MQTT协议;
    • ✅ 开发3个高实用价值的联合项目:完成本地Arduino智能温湿度监测系统、阿里云IoT平台温湿度数据上传与钉钉告警系统、树莓派远程控制LED与环境监测系统;
    • ✅ 掌握云平台接入与设备管理:学会阿里云IoT平台的设备创建、物模型定义、数据流转、规则引擎配置;
    • ✅ 掌握物联网项目的性能与稳定性优化:学习传感器数据滤波、网络重连机制、数据加密传输、设备心跳包的方法;
    1.37.7.2 物联网未来发展方向

    物联网的未来发展方向主要有以下5个:
    💡 AI辅助传感器数据处理:进一步优化AI辅助传感器数据处理工具,根据传感器数据自动识别异常;
    💡 低代码/无代码物联网开发:进一步完善低代码/无代码物联网开发平台,让用户通过拖拽和配置的方式开发物联网项目;
    💡 边缘计算:将数据处理和分析从云端移到边缘设备,提高数据处理效率,减少网络传输;
    💡 区块链技术在物联网中的应用:使用区块链技术确保数据的安全性和不可篡改性;
    💡 5G物联网:使用5G技术提高物联网设备的通信速度和可靠性;


    🎉 易语言开发从入门到精通的物联网+嵌入式开发补充篇·本地→远程→云端通信全链路实战·工业监测/智能家居高频场景全覆盖,至此结束!愿你在易语言的世界里,不断学习,不断进步,开发出更多“高效、稳定、智能”的物联网项目!

    赞(0)
    未经允许不得转载:171主机测评 » 易语言开发从入门到精通:补充篇·物联网+嵌入式开发深度实战·Arduino/树莓派通信·MQTT协议·阿里云接入·智能硬件控制
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址