在物联网技术快速发展的今天,智能家居系统已经成为提升生活品质的重要工具。基于树莓派4B设计的智能家居控制系统结合华为云物联网平台,实现了对家庭环境的实时监测和远程控制,为开发者提供了一个完整的物联网项目实践案例。本文将详细介绍从硬件选型、环境搭建到软件开发的完整流程,帮助读者掌握智能家居系统的核心技术。

1. 项目概述与系统架构

1.1 智能家居系统需求分析

智能家居控制系统主要实现对家庭环境的全面监测和智能控制。系统需要具备以下核心功能:

  • 环境监测 :实时采集温度、湿度、烟雾浓度、光照强度等环境数据
  • 安全报警 :检测火焰、烟雾等安全隐患并触发报警
  • 设备控制 :远程控制灯光、电器等设备
  • 数据可视化 :通过Web界面或手机APP展示实时数据
  • 云端存储 :将采集的数据上传到云平台进行存储和分析

1.2 系统整体架构设计

整个系统采用三层架构设计:

硬件层(树莓派4B + 传感器) → 通信层(MQTT协议) → 云平台层(华为云IoT) → 应用层(Web/APP)

硬件组成

  • 树莓派4B作为主控制器
  • DHT11温湿度传感器
  • MQ-2烟雾传感器
  • 火焰检测传感器
  • 光敏电阻
  • 雨滴检测模块
  • LED灯模块
  • 蜂鸣器报警模块
  • 继电器控制模块

通信协议

  • MQTT协议用于设备与云平台通信
  • HTTP协议用于应用层与云平台API交互

2. 硬件选型与连接

2.1 树莓派4B开发板介绍

树莓派4B是一款功能强大的单板计算机,具有以下特点:

  • 四核64位ARM Cortex-A72处理器
  • 2GB/4GB/8GB LPDDR4内存可选
  • 双频802.11ac无线网络
  • 蓝牙5.0
  • 千兆以太网接口
  • 2个USB 3.0和2个USB 2.0接口
  • 2个micro-HDMI接口支持4K显示

2.2 传感器模块选型与参数

DHT11温湿度传感器

  • 温度测量范围:0-50℃
  • 湿度测量范围:20-90%RH
  • 精度:温度±2℃,湿度±5%
  • 数字信号输出

MQ-2烟雾传感器

  • 检测气体:液化气、丙烷、氢气等
  • 工作电压:5V
  • 具有数字和模拟双输出
  • 灵敏度可调

其他传感器

  • 火焰传感器:检测火焰或波长在760nm-1100nm的光源
  • 光敏电阻:检测环境光照强度
  • 雨滴检测模块:检测是否下雨

2.3 硬件连接方案

传感器与树莓派GPIO引脚连接对应关系:

传感器模块 树莓派GPIO引脚 功能说明
DHT11温湿度传感器 GPIO17 数据采集
MQ2烟雾传感器 GPIO4 数字输出
火焰检测传感器 GPIO18 数字输出
光敏电阻 GPIO27 模拟输入
蜂鸣器 GPIO22 报警输出
LED1 GPIO23 灯光控制
LED2 GPIO24 灯光控制
LED3 GPIO25 灯光控制
雨滴检测传感器 GPIO5 数字输出
继电器模块 GPIO6 设备控制

3. 树莓派环境搭建

3.1 系统烧写与初始化

准备工作

  • 树莓派4B开发板
  • 32GB以上TF卡
  • TF卡读卡器
  • 5V/3A Type-C电源
  • 网线或WiFi连接

系统烧写步骤

  1. 下载树莓派官方系统镜像(Raspberry Pi OS)
  2. 使用balenaEtcher等工具将镜像烧写到TF卡
  3. 在boot分区创建空文件 ssh 启用SSH服务
  4. 创建 wpa_supplicant.conf 文件配置WiFi(可选)
# wpa_supplicant.conf 示例
country=CN
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
    ssid="你的WiFi名称"
    psk="你的WiFi密码"
}

3.2 远程访问配置

SSH远程登录

# 查找树莓派IP地址
ssh pi@树莓派IP地址
# 默认密码:raspberry

安装必要软件包

sudo apt update
sudo apt upgrade -y
sudo apt install wiringpi python3-pip -y

3.3 GPIO库安装与测试

安装WiringPi库

# 如果系统未预装,手动安装
git clone https://github.com/WiringPi/WiringPi
cd WiringPi
./build

测试GPIO控制

#!/usr/bin/python3
import RPi.GPIO as GPIO
import time

# 设置GPIO模式为BCM编号
GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)

try:
    while True:
        GPIO.output(18, GPIO.HIGH)  # 点亮LED
        time.sleep(1)
        GPIO.output(18, GPIO.LOW)   # 熄灭LED
        time.sleep(1)
except KeyboardInterrupt:
    GPIO.cleanup()

4. 华为云物联网平台配置

4.1 物联网平台开通

  1. 访问华为云官网(https://www.huaweicloud.com/)
  2. 注册账号并完成实名认证
  3. 进入控制台,搜索"设备接入IoTDA"
  4. 开通物联网平台服务

4.2 产品与设备创建

创建产品

  • 产品名称:智能家居控制系统
  • 协议类型:MQTT
  • 数据格式:JSON
  • 设备类型:自定义类型

添加设备

{
    "device_id": "smart_home_device_001",
    "secret": "your_device_secret"
}

4.3 物模型定义

定义设备属性模型,包含以下字段:

属性名称 数据类型 描述
DHT11_T int 环境温度
DHT11_H int 环境湿度
MQ2 int 烟雾浓度
water int 雨滴检测
flame int 火焰检测
light int 光照强度
LED1 int LED1状态
LED2 int LED2状态
LED3 int LED3状态

4.4 MQTT连接配置

MQTT连接参数

  • 服务器地址:华为云IoT平台接入地址
  • 端口:1883(非加密)或8883(加密)
  • ClientID:设备唯一标识
  • Username:设备ID
  • Password:加密密码

主题定义

  • 发布主题: $oc/devices/{device_id}/sys/properties/report
  • 订阅主题: $oc/devices/{device_id}/sys/messages/down

5. 传感器数据采集程序

5.1 DHT11温湿度传感器驱动

#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>

typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned long uint32;

#define HIGH_TIME 32
int pinNumber = 17;
uint32 databuf;

uint8 readSensorData(void) {
    uint8 crc;
    uint8 i;
    
    pinMode(pinNumber, OUTPUT);
    digitalWrite(pinNumber, 0);
    delay(25);
    digitalWrite(pinNumber, 1);
    
    pinMode(pinNumber, INPUT);
    pullUpDnControl(pinNumber, PUD_UP);
    delayMicroseconds(27);
    
    if (digitalRead(pinNumber) == 0) {
        while (!digitalRead(pinNumber));
        
        for (i = 0; i < 32; i++) {
            while (digitalRead(pinNumber));
            while (!digitalRead(pinNumber));
            delayMicroseconds(HIGH_TIME);
            
            databuf *= 2;
            if (digitalRead(pinNumber) == 1) {
                databuf++;
            }
        }
        
        for (i = 0; i < 8; i++) {
            while (digitalRead(pinNumber));
            while (!digitalRead(pinNumber));
            delayMicroseconds(HIGH_TIME);
            
            crc *= 2;
            if (digitalRead(pinNumber) == 1) {
                crc++;
            }
        }
        return 1;
    } else {
        return 0;
    }
}

int main(void) {
    if (-1 == wiringPiSetupGpio()) {
        printf("Setup wiringPi failed!");
        return 1;
    }
    
    pinMode(pinNumber, OUTPUT);
    digitalWrite(pinNumber, 1);
    
    while (1) {
        pinMode(pinNumber, OUTPUT);
        digitalWrite(pinNumber, 1);
        delay(3000);
        
        if (readSensorData()) {
            printf("温度: %d℃, 湿度: %d%%\n", 
                   (databuf >> 24) & 0xff, (databuf >> 8) & 0xff);
            databuf = 0;
        } else {
            printf("传感器无响应\n");
            databuf = 0;
        }
    }
    return 0;
}

5.2 多传感器数据采集整合

#include <wiringPi.h>
#include <stdio.h>
#include <string.h>

// 传感器引脚定义
#define DHT11_PIN 17
#define MQ2_PIN 4
#define FLAME_PIN 18
#define LIGHT_PIN 27
#define RAIN_PIN 5

// 执行器引脚定义
#define BUZZER_PIN 22
#define LED1_PIN 23
#define LED2_PIN 24
#define LED3_PIN 25
#define RELAY_PIN 6

typedef struct {
    int temperature;
    int humidity;
    int smoke;
    int flame;
    int light;
    int rain;
    int led1;
    int led2;
    int led3;
} SensorData;

void initGPIO() {
    wiringPiSetupGpio();
    
    // 设置输入引脚
    pinMode(MQ2_PIN, INPUT);
    pinMode(FLAME_PIN, INPUT);
    pinMode(LIGHT_PIN, INPUT);
    pinMode(RAIN_PIN, INPUT);
    
    // 设置输出引脚
    pinMode(BUZZER_PIN, OUTPUT);
    pinMode(LED1_PIN, OUTPUT);
    pinMode(LED2_PIN, OUTPUT);
    pinMode(LED3_PIN, OUTPUT);
    pinMode(RELAY_PIN, OUTPUT);
    
    // 初始化状态
    digitalWrite(BUZZER_PIN, LOW);
    digitalWrite(LED1_PIN, LOW);
    digitalWrite(LED2_PIN, LOW);
    digitalWrite(LED3_PIN, LOW);
    digitalWrite(RELAY_PIN, LOW);
}

SensorData readAllSensors() {
    SensorData data;
    
    // 读取数字传感器
    data.smoke = digitalRead(MQ2_PIN);
    data.flame = digitalRead(FLAME_PIN);
    data.rain = digitalRead(RAIN_PIN);
    data.light = digitalRead(LIGHT_PIN);
    
    // 读取LED状态
    data.led1 = digitalRead(LED1_PIN);
    data.led2 = digitalRead(LED2_PIN);
    data.led3 = digitalRead(LED3_PIN);
    
    // DHT11读取需要单独实现
    // 这里使用模拟数据
    data.temperature = 25;
    data.humidity = 60;
    
    return data;
}

void safetyCheck(SensorData data) {
    // 烟雾报警
    if (data.smoke == 0) {
        digitalWrite(BUZZER_PIN, HIGH);
        printf("烟雾报警!\n");
    } else {
        digitalWrite(BUZZER_PIN, LOW);
    }
    
    // 火焰报警
    if (data.flame == 0) {
        digitalWrite(BUZZER_PIN, HIGH);
        printf("火焰报警!\n");
    }
    
    // 下雨自动关窗
    if (data.rain == 0) {
        digitalWrite(RELAY_PIN, HIGH);
        printf("检测到下雨,自动关窗\n");
    } else {
        digitalWrite(RELAY_PIN, LOW);
    }
}

int main() {
    initGPIO();
    
    while (1) {
        SensorData data = readAllSensors();
        safetyCheck(data);
        
        printf("温度: %d℃, 湿度: %d%%, 烟雾: %d, 火焰: %d, 光照: %d, 雨滴: %d\n",
               data.temperature, data.humidity, data.smoke, 
               data.flame, data.light, data.rain);
        
        delay(2000); // 2秒采集一次
    }
    
    return 0;
}

6. MQTT通信实现

6.1 MQTT客户端封装

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>

#define MQTT_HOST "117.78.5.125"
#define MQTT_PORT 1883
#define CLIENT_ID "smart_home_device_001"
#define USERNAME "smart_home_device_001"
#define PASSWORD "your_encrypted_password"

typedef struct {
    int sockfd;
    char client_id[64];
    char username[64];
    char password[64];
} MQTTClient;

int mqtt_connect(MQTTClient *client) {
    struct sockaddr_in server_addr;
    
    // 创建socket
    client->sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (client->sockfd < 0) {
        perror("Socket creation failed");
        return -1;
    }
    
    // 设置服务器地址
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(MQTT_PORT);
    server_addr.sin_addr.s_addr = inet_addr(MQTT_HOST);
    
    // 连接服务器
    if (connect(client->sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
        perror("Connection failed");
        return -1;
    }
    
    // 发送MQTT连接报文
    // 这里需要实现完整的MQTT协议握手
    printf("MQTT连接成功\n");
    return 0;
}

int mqtt_publish(MQTTClient *client, const char *topic, const char *message) {
    // 实现MQTT发布消息逻辑
    printf("发布消息到主题: %s\n", topic);
    printf("消息内容: %s\n", message);
    return 0;
}

int mqtt_subscribe(MQTTClient *client, const char *topic) {
    // 实现MQTT订阅逻辑
    printf("订阅主题: %s\n", topic);
    return 0;
}

6.2 数据上报与命令接收

#include "mqtt_client.h"
#include "sensors.h"
#include <json-c/json.h>

void report_sensor_data(MQTTClient *client, SensorData data) {
    struct json_object *jobj = json_object_new_object();
    struct json_object *services = json_object_new_array();
    struct json_object *service = json_object_new_object();
    struct json_object *properties = json_object_new_object();
    
    // 构建属性JSON
    json_object_object_add(properties, "DHT11_T", 
                          json_object_new_int(data.temperature));
    json_object_object_add(properties, "DHT11_H", 
                          json_object_new_int(data.humidity));
    json_object_object_add(properties, "MQ2", 
                          json_object_new_int(data.smoke));
    json_object_object_add(properties, "water", 
                          json_object_new_int(data.rain));
    json_object_object_add(properties, "flame", 
                          json_object_new_int(data.flame));
    json_object_object_add(properties, "light", 
                          json_object_new_int(data.light));
    json_object_object_add(properties, "LED1", 
                          json_object_new_int(data.led1));
    json_object_object_add(properties, "LED2", 
                          json_object_new_int(data.led2));
    json_object_object_add(properties, "LED3", 
                          json_object_new_int(data.led3));
    
    // 构建服务JSON
    json_object_object_add(service, "service_id", 
                          json_object_new_string("smart_home"));
    json_object_object_add(service, "properties", properties);
    
    // 构建完整消息
    json_object_array_add(services, service);
    json_object_object_add(jobj, "services", services);
    
    const char *json_str = json_object_to_json_string(jobj);
    mqtt_publish(client, "$oc/devices/smart_home_device_001/sys/properties/report", json_str);
    
    json_object_put(jobj);
}

void handle_control_command(const char *message) {
    // 解析控制命令
    struct json_object *jobj = json_tokener_parse(message);
    struct json_object *services;
    
    if (json_object_object_get_ex(jobj, "services", &services)) {
        int array_len = json_object_array_length(services);
        for (int i = 0; i < array_len; i++) {
            struct json_object *service = json_object_array_get_idx(services, i);
            struct json_object *properties;
            
            if (json_object_object_get_ex(service, "properties", &properties)) {
                // 解析LED控制命令
                struct json_object *led1, *led2, *led3;
                if (json_object_object_get_ex(properties, "LED1", &led1)) {
                    int value = json_object_get_int(led1);
                    digitalWrite(LED1_PIN, value);
                    printf("控制LED1: %d\n", value);
                }
                if (json_object_object_get_ex(properties, "LED2", &led2)) {
                    int value = json_object_get_int(led2);
                    digitalWrite(LED2_PIN, value);
                    printf("控制LED2: %d\n", value);
                }
                if (json_object_object_get_ex(properties, "LED3", &led3)) {
                    int value = json_object_get_int(led3);
                    digitalWrite(LED3_PIN, value);
                    printf("控制LED3: %d\n", value);
                }
            }
        }
    }
    
    json_object_put(jobj);
}

7. 上位机软件开发

7.1 Qt开发环境搭建

安装Qt Creator

  1. 下载Qt 5.12.6或更高版本
  2. 安装时选择MinGW编译器
  3. 配置Android开发环境(可选)

项目配置

QT += core gui network widgets

TARGET = SmartHomeMonitor
TEMPLATE = app

SOURCES += main.cpp \
           mainwindow.cpp

HEADERS += mainwindow.h

FORMS += mainwindow.ui

7.2 界面设计与数据展示

// mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QTimer>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void updateSensorData();
    void controlLED(int ledNumber, bool state);
    void onNetworkReply(QNetworkReply *reply);

private:
    Ui::MainWindow *ui;
    QNetworkAccessManager *networkManager;
    QTimer *updateTimer;
    QString authToken;
};

#endif // MAINWINDOW_H
// mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QNetworkRequest>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QMessageBox>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    
    networkManager = new QNetworkAccessManager(this);
    updateTimer = new QTimer(this);
    
    connect(updateTimer, &QTimer::timeout, this, &MainWindow::updateSensorData);
    connect(networkManager, &QNetworkAccessManager::finished, 
            this, &MainWindow::onNetworkReply);
    
    // 每5秒更新一次数据
    updateTimer->start(5000);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::updateSensorData()
{
    if (authToken.isEmpty()) {
        // 先获取认证token
        return;
    }
    
    QNetworkRequest request;
    request.setUrl(QUrl("https://iotda.cn-north-4.myhuaweicloud.com/v5/iot/device-shadows"));
    request.setRawHeader("X-Auth-Token", authToken.toUtf8());
    
    networkManager->get(request);
}

void MainWindow::onNetworkReply(QNetworkReply *reply)
{
    if (reply->error() != QNetworkReply::NoError) {
        QMessageBox::warning(this, "网络错误", reply->errorString());
        reply->deleteLater();
        return;
    }
    
    QByteArray response = reply->readAll();
    QJsonDocument doc = QJsonDocument::fromJson(response);
    QJsonObject obj = doc.object();
    
    if (obj.contains("shadow")) {
        QJsonArray shadowArray = obj["shadow"].toArray();
        if (!shadowArray.isEmpty()) {
            QJsonObject shadow = shadowArray[0].toObject();
            if (shadow.contains("reported")) {
                QJsonObject reported = shadow["reported"].toObject();
                if (reported.contains("properties")) {
                    QJsonObject properties = reported["properties"].toObject();
                    
                    // 更新界面显示
                    int temperature = properties["DHT11_T"].toInt();
                    int humidity = properties["DHT11_H"].toInt();
                    int smoke = properties["MQ2"].toInt();
                    int flame = properties["flame"].toInt();
                    int light = properties["light"].toInt();
                    int rain = properties["water"].toInt();
                    
                    ui->tempLabel->setText(QString::number(temperature) + "℃");
                    ui->humidityLabel->setText(QString::number(humidity) + "%");
                    
                    // 更新报警状态
                    if (smoke == 0) {
                        ui->smokeLabel->setText("烟雾报警");
                        ui->smokeLabel->setStyleSheet("color: red;");
                    } else {
                        ui->smokeLabel->setText("正常");
                        ui->smokeLabel->setStyleSheet("color: green;");
                    }
                }
            }
        }
    }
    
    reply->deleteLater();
}

void MainWindow::controlLED(int ledNumber, bool state)
{
    QJsonObject command;
    command.insert("service_id", "smart_home");
    
    QJsonObject properties;
    properties.insert(QString("LED%1").arg(ledNumber), state ? 1 : 0);
    command.insert("properties", properties);
    
    QJsonDocument doc(command);
    QByteArray data = doc.toJson();
    
    QNetworkRequest request;
    request.setUrl(QUrl("https://iotda.cn-north-4.myhuaweicloud.com/v5/iot/device-commands"));
    request.setRawHeader("X-Auth-Token", authToken.toUtf8());
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
    
    networkManager->post(request, data);
}

8. 系统集成与测试

8.1 完整系统流程

  1. 硬件初始化 :树莓派启动,初始化所有GPIO引脚
  2. 网络连接 :连接WiFi或有线网络
  3. MQTT连接 :连接到华为云物联网平台
  4. 数据采集 :周期性读取传感器数据
  5. 数据上报 :将采集的数据通过MQTT发布到云平台
  6. 命令监听 :订阅控制主题,等待控制命令
  7. 命令执行 :收到控制命令后执行相应操作
  8. 异常处理 :检测异常情况并触发报警

8.2 功能测试方案

传感器测试

# 测试DHT11温湿度传感器
./dht11_test

# 测试烟雾传感器
echo "17" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio17/direction
cat /sys/class/gpio/gpio17/value

MQTT通信测试

# 使用mosquitto客户端测试
mosquitto_sub -h 117.78.5.125 -t "smart_home/control" -u "username" -P "password"
mosquitto_pub -h 117.78.5.125 -t "smart_home/data" -m "test message"

8.3 性能优化建议

  1. 数据采集频率 :根据实际需求调整采集频率,避免频繁上报
  2. 网络重连机制 :实现网络异常时的自动重连
  3. 数据缓存 :在网络异常时缓存数据,恢复后批量上传
  4. 功耗优化 :合理设置传感器采样频率,降低系统功耗
  5. 安全加固 :使用TLS加密通信,定期更新认证凭证

9. 常见问题与解决方案

9.1 硬件连接问题

问题1:传感器无响应

  • 检查电源连接是否正确
  • 确认GPIO引脚编号是否正确
  • 检查传感器是否损坏

问题2:数据读取不稳定

  • 增加去抖动处理
  • 检查电源稳定性
  • 优化采样时序

9.2 网络通信问题

问题1:MQTT连接失败

// 实现重连机制
void mqtt_reconnect(MQTTClient *client) {
    while (mqtt_connect(client) != 0) {
        printf("连接失败,5秒后重试...\n");
        sleep(5);
    }
}

问题2:数据上报超时

  • 检查网络连接状态
  • 验证MQTT服务器地址和端口
  • 检查防火墙设置

9.3 软件调试技巧

日志记录

void debug_log(const char *format, ...) {
    va_list args;
    va_start(args, format);
    vprintf(format, args);
    va_end(args);
    
    // 同时写入文件
    FILE *log_file = fopen("/var/log/smart_home.log", "a");
    if (log_file) {
        va_start(args, format);
        vfprintf(log_file, format, args);
        va_end(args);
        fclose(log_file);
    }
}

远程调试

# 通过SSH远程调试
ssh pi@树莓派IP地址
tail -f /var/log/smart_home.log

10. 项目扩展与优化

10.1 功能扩展建议

  1. 语音控制 :集成语音识别模块,支持语音控制
  2. 人脸识别 :添加摄像头模块,实现人脸识别门禁
  3. 能源管理 :监测家电能耗,优化用电策略
  4. 场景模式 :预设多种场景模式(回家、离家、睡眠等)

10.2 技术优化方向

  1. 边缘计算 :在树莓派上实现简单的AI推理
  2. 容器化部署 :使用Docker容器管理应用
  3. 多云支持 :支持多个云平台接入
  4. 移动端优化 :开发更友好的移动端界面

10.3 生产环境部署

安全考虑

  • 使用HTTPS加密通信
  • 定期更新系统补丁
  • 设置防火墙规则
  • 备份重要数据

监控维护

  • 实现系统健康监测
  • 设置自动告警机制
  • 定期检查硬件状态
  • 维护日志分析系统

本项目提供了一个完整的智能家居控制系统实现方案,从硬件选型到软件开发,从本地控制到云端管理,涵盖了物联网项目的核心技术要点。开发者可以根据实际需求进行调整和扩展,构建更加智能、高效的家居控制系统。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐