易语言开发从入门到精通:补充篇·物联网+嵌入式开发深度实战·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温湿度传感器):
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技术提高物联网设备的通信速度和可靠性;
🎉 易语言开发从入门到精通的物联网+嵌入式开发补充篇·本地→远程→云端通信全链路实战·工业监测/智能家居高频场景全覆盖,至此结束!愿你在易语言的世界里,不断学习,不断进步,开发出更多"高效、稳定、智能"的物联网项目!
