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


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

1.37.1 学习目标 🎯

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

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

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温湿度传感器)

cpp 复制代码
#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("}");
}

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

e 复制代码
.版本 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平台)

cpp 复制代码
#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平台)

e 复制代码
.版本 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端代码

cpp 复制代码
#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秒;
  • 可靠性:网络断开时要自动重连,钉钉告警要发送成功;

界面设计 (组件箱拖拽+属性表配置):

与系统底层与硬件交互的项目类似,只需要修改组件的类型和位置即可。

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

e 复制代码
.版本 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)

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控制部分)

e 复制代码
.版本 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技术提高物联网设备的通信速度和可靠性;


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

相关推荐
寻寻觅觅☆10 小时前
东华OJ-基础题-106-大整数相加(C++)
开发语言·c++·算法
l1t11 小时前
在wsl的python 3.14.3容器中使用databend包
开发语言·数据库·python·databend
赶路人儿11 小时前
Jsoniter(java版本)使用介绍
java·开发语言
ceclar12312 小时前
C++使用format
开发语言·c++·算法
码说AI12 小时前
python快速绘制走势图对比曲线
开发语言·python
Gofarlic_OMS12 小时前
科学计算领域MATLAB许可证管理工具对比推荐
运维·开发语言·算法·matlab·自动化
星空下的月光影子13 小时前
易语言开发从入门到精通:补充篇·网络爬虫与自动化采集分析系统深度实战·HTTP/HTTPS请求·HTML/JSON解析·反爬策略·电商价格监控·新闻资讯采集
开发语言
老约家的可汗13 小时前
初识C++
开发语言·c++
wait_luky13 小时前
python作业3
开发语言·python
消失的旧时光-194313 小时前
第十九课:为什么要引入消息队列?——异步系统设计思想
java·开发语言