3 种方式玩转网络继电器!W55MH32 实现网页 + 阿里云 + 本地控制互通

目录

1 前言

2 项目环境

2.1 硬件准备

2.2 软件准备

2.3 方案图示

3 例程修改

4 功能验证

5. 总结


1 前言

HTTP(超文本传输协议,HyperText Transfer Protocol)是一种用于分布式、协作式、超媒体信息系统的应用层协议, 基于 TCP/IP 通信协议来传递数据,是万维网(WWW)的数据通信的基础。设计 HTTP 最初的目的是为了提供一种发布和接收 HTML 页面的方法,通过 HTTP 或者 HTTPS 协议请求的资源由统一资源标识符(Uniform Resource Identifiers,URI)来标识。 以上是HTTP协议的简介,如想深入了解该协议,请参考mozilla网站上的介绍: HTTP 概述 - HTTP | MDN

MQTT是一种轻量级通信协议,基于TCP/IP,采用发布-订阅模式,广泛应用于物联网领域。

MQTT的工作原理围绕着三个核心部分:发布者(Publishers)、代理(Broker,也称服务器)和订阅者(Subscribers)。发布者负责发送消息到特定的主题(Topic),代理则接收这些消息并将其转发给所有订阅了该主题的订阅者。这种模式允许设备间异步通信,且设备不需要直接了解彼此的存在,从而降低了系统的复杂性。

W55MH32 是 WIZnet 新推出的高性能以太网单片机。它采用高性能 Arm® Cortex-M3 内核,主频最高达 216MHz,内置 1024KB FLASH、96KB SRAM 。尤为突出的是,其搭载 WIZnet TCP/IP offload 引擎(TOE),集成全硬件 TCP/IP 协议栈、MAC 及 PHY ,还配备 32KB 独立以太网收发缓存,供 8 个硬件 socket 使用,是真正的All-in-One解决方案。

2 项目环境

2.1 硬件准备

  1. W55MH32L-EVB
  2. 一根网线
  3. USB Type-C

2.2 软件准备

  1. 例程链接:w5500.com/w55mh32.html
  2. 开发环境:keil uvision 5
  3. 飞思创串口助手
  4. 浏览器
  5. 阿里云

2.3 方案图示

3 例程修改

1.我们HTTP_Server例程MQTT&Aliyun例程下载下来我们先对HTTP_Server例程进行修改我们创建一个web_server.c和web_server.h,并在web_server.c添加头文件以及全局变量和初始化

#include "user_main.h"
#include "web_server.h"
#include <stdio.h>
#include <string.h>
// 全局变量
uint8_t txBuff[2048] = {0};  // 发送缓冲区
uint8_t rxBuff[2048] = {0};  // 接收缓冲区
uint8_t socketCount = 8;      // 支持的Socket数量
uint8_t socketList[] = {0,1}; // Socket列表// LED状态管理
uint8_t led_status = 0;       // 0:关灯 1:开灯
uint8_t status_content[2] = "0"; // 状态页内容

2.创建HTML用户界面,主要包含开/关控制按钮(JavaScript事件),实时调试信息面板,状态轮询机制(每2秒更新),时间戳日志功能

uint8_t *contentName = "index.html";
uint8_t content[] = 
"<!doctype html>\n"
"<html lang=\"en\">\n"
"<head>\n"
"    <meta charset=\"GBK\">\n"
"    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n"
"    <title>LED Control</title>\n"
"    <style>\n"
"        #light {\n"
"            width: 100px; height: 100px; border-radius: 50%;\n"
"            margin: 20px auto; border: 2px solid #333;\n"
"            transition: background-color 0.5s;\n"
"        }\n"
"        .light-on { background-color: yellow; box-shadow: 0 0 20px yellow; }\n"
"        .light-off { background-color: #ccc; }\n"
"        .btn { padding: 10px 20px; margin: 5px; }\n"
"        #debug { margin-top: 20px; padding: 10px; border: 1px solid #ccc; font-family: monospace; max-height: 200px; overflow-y: auto; }\n"
"    </style>\n"
"</head>\n"
"<body>\n"
"    <h1>LED Control Panel</h1>\n"
"    <button class=\"btn\" onclick=\"controlLED(1)\">开灯</button>\n"
"    <button class=\"btn\" onclick=\"controlLED(0)\">关灯</button>\n"
"    <div id=\"debug\">Debug information will appear here...</div>\n"
"    <script>\n"
"        const light = document.getElementById('light');\n"
"        const debugDiv = document.getElementById('debug');\n"
"        \n"
"        // 调试函数 - 在页面上显示调试信息\n"
"        function log(message) {\n"
"            console.log(message);\n"
"            debugDiv.innerHTML += '<p>' + new Date().toLocaleTimeString() + ': ' + message + '</p>';\n"
"            debugDiv.scrollTop = debugDiv.scrollHeight; // 自动滚动到底部\n"
"        }\n"
"        \n"
"        // 初始加载时获取状态\n"
"        fetchStatus();\n"
"        \n"
"        function controlLED(state) {\n"
"            log('Sending control: ' + state);\n"
"            fetch(`/control?action=${state ? '1' : '0'}&t=${Date.now()}`)\n"
"                .then(response => {\n"
"                    log(`Control response: ${response.status}`);\n"
"                    if (response.ok) {\n"
"                        log('Control command successful');\n"
"                        fetchStatus();\n"
"                    } else {\n"
"                        log('Control command failed');\n"
"                    }\n"
"                })\n"
"                .catch(error => {\n"
"                    log('Control error: ' + error);\n"
"                });\n"
"        }\n"
"        \n"
"        function fetchStatus() {\n"
"            const url = '/status?t=' + Date.now();\n"
"            log('Fetching status: ' + url);\n"
"            \n"
"            fetch(url)\n"
"                .then(response => {\n"
"                    log(`Status response: ${response.status}`);\n"
"                    if (!response.ok) {\n"
"                        throw new Error('Bad status: ' + response.status);\n"
"                    }\n"
"                    return response.text();\n"
"                })\n"
"                .then(status => {\n"
"                    log('Received status: ' + status);\n"
"                    updateLight(status.trim()); // 确保去除空白字符\n"
"                })\n"
"                .catch(error => {\n"
"                    log('Status error: ' + error);\n"
"                });\n"
"        }\n"
"        \n"
"        function updateLight(status) {\n"
"            if (status === '1') {\n"
"                light.className = 'light-on';\n"
"                log('Light ON - UI updated');\n"
"            } else if (status === '0') {\n"
"                light.className = 'light-off';\n"
"                log('Light OFF - UI updated');\n"
"            } else {\n"
"                log('Invalid status: ' + status);\n"
"            }\n"
"        }\n"
"        \n"
"        // 每2秒轮询一次状态\n"
"        setInterval(fetchStatus, 2000);\n"
"        \n"
"        // 初始日志\n"
"        log('Control panel initialized');\n"
"        log('Waiting for status updates...');\n"
"    </script>\n"
"</body>\n"
"</html>";

3.添加URL解析与控制逻辑

static uint8_t parse_url_action(uint8_t *url) {// 从URL中提取action参数uint8_t *pAction = (uint8_t *)strstr((char *)url, "action=");return *(pAction + 7); // 返回action值
}
// 根据action执行LED操作
static void do_led_action(uint8_t action)
{if (action == '1')  // 开灯{printf("[LED] Turning ON\n");
       led_status = 1;
       status_content[0] = '1';}else if (action == '0')  // 关灯{printf("[LED] Turning OFF\n");
        led_status = 0;
        status_content[0] = '0';}else{printf("[LED] Unknown action: %c\n", action);}// 打印当前状态printf("[STATUS] Current LED status: %d\n", led_status);
}

4.添加初始化WEB服务器函数

// 初始化Web服务器
void WebServer_Init(void)
{// 初始化http服务器httpServer_init(txBuff, rxBuff, socketCount, socketList);// 注册html页面reg_httpServer_webContent(contentName, content);// 注册状态页面 - 关键修复:确保状态页正确注册reg_httpServer_webContent("status", status_content);// 注册控制端点reg_httpServer_webContent("control", (uint8_t *)"OK");printf("[WEB] Server initialized\n");printf("[STATUS] Initial LED status: %d\n", led_status);
}

5. 添加web服务器

// 启动Web服务器
void WebServer_Start(void)
{for (uint8_t i = 0; i < sizeof(socketList); i++){httpServer_run(i);} 
}

6. 添加处理核心函数

void handler_user_function(uint8_t *url)
{printf("[HTTP] Request received: %s\n", url);// 检查是否为控制请求if (strstr((char *)url, "control") != NULL) {// 1. 从URL里提取出action的值uint8_t action = parse_url_action(url);// 2. 根据action的值,执行相应的LED操作do_led_action(action);// 调试输出printf("[CONTROL] Processed action: %c\n", action);}// 检查是否为状态请求else if (strstr((char *)url, "status") != NULL){// 确保返回最新的状态值printf("[STATUS] Request received. Returning: %s\n", status_content);// 更新状态页内容 - 确保返回最新值reg_httpServer_webContent("status", status_content);}
}
// 状态获取函数 
uint8_t* get_led_status(void)
{return status_content;
}// 状态更新通知 
void update_led_status(void)
{// 当LED状态改变时调用此函数reg_httpServer_webContent("status", status_content);printf("[STATUS] Updated status page to: %s\n", status_content);
}

 7.添加web_server.函数

#ifndef __WEB_SERVER_H
#define __WEB_SERVER_H
#include "httpServer.h"
#include <string.h>
// 初始化Web服务器
void WebServer_Init(void);
// 启动Web服务器
void WebServer_Start(void);
extern uint8_t led_status; // 0:关灯 1:开灯
extern uint8_t status_content[2]; // 状态页内容
#endif

8. 接下来我们MQTT&Aliyun函数添加HTTP_Server如图所示需要文件添加进来

9. 在do_mqtt.c函数中clientidpasswd以及username修改为自己参数post主题set主题产品名称以及设备名称修改为自己

mqttconn mqtt_params = {
    .mqttHostUrl = "iot-06z00h54zbdynx7.mqtt.iothub.aliyuncs.com",
    .server_ip = {
        0,
    },                                                                   /*Define the Connection Server IP*/
    .port = 1883,                                                   /*Define the connection service port number*/
    .clientid = "k18mmode=2,signmethod=hmacsha256,timestamp=1751966302834|", /*Define the client ID*/
    .username = "zhao&k18maZe3w1u",                                         /*Define the user name*/
    .passwd = "1f0069321cb554e432ad893177919fc65579c227a65a9a420b303b7bf8301778", /*Define user passwords*/
    .pubtopic = "/sys/k18maZe3w1u/zhao/thing/event/property/post",           /*Define the publication message*/
    .subtopic = "/sys/k18maZe3w1u/zhao/thing/service/property/set",          /*Define subscription messages*/
    .pubQoS = QOS0,                                 /*Defines the class of service for publishing messages*/
};

10. 修改函数使数据定时上传平台PUB_MESSAGERECV进行更改

#define PUBLISH_COUNTER_MAX 500  // 10秒间隔(假设主循环周期为10ms)
static uint32_t publish_counter = 0;
    case PUB_MESSAGE:
    {
        pubmessage.qos = QOS0;
        char buffer[128]; // 确保缓冲区足够大
        snprintf(buffer, sizeof(buffer), 
     "{\"id\":\"123\",\"version\":\"1.0\",\"params\":{\"LEDSwitch\":%d},\"method\":\"thing.event.property.post\"}", 
                led_status);
        pubmessage.payload = buffer;
        pubmessage.payloadlen = strlen(pubmessage.payload);        ret = MQTTPublish(&c, (char *)&(mqtt_params.pubtopic), &pubmessage); /* Publish message */
        if (ret != SUCCESSS) {
            run_status = ERR;
        } else {
            printf("publish:%s,%s\r\n\r\n", mqtt_params.pubtopic, (char *)pubmessage.payload);
            publish_counter = 0;  // 重置计数器
            run_status = RECV;  // 转到接收/心跳状态
        }
        break;
    }
    case RECV:  // 合并心跳和接收处理
    {
        // 保持MQTT连接活跃
        if (MQTTYield(&c, 30) != SUCCESSS) {
            run_status = ERR;
            break;
        }
        // 处理接收到的消息
        if (mqtt_recv_flag) {
            mqtt_recv_flag = 0;
            json_decode(mqtt_recv_msg);
        }
        // 计数器方案:检查是否到达发布间隔
        publish_counter++;
        if(publish_counter >= PUBLISH_COUNTER_MAX) {
            run_status = PUB_MESSAGE;  // 重新进入发布状态
        }
        break;
    }

11. 接收函数打印LED状态时候要改变led_status数值1722进行添加此目的为了云平台数据网页数据进行统一

void json_decode(char *msg)
{
    cJSON *jsondata = NULL;
    cJSON *params = NULL;
    cJSON *LED = NULL;
    jsondata = cJSON_Parse(msg);
    if (jsondata == NULL)
    {
        printf("json parse fail.\r\n");
        return;
    }
    params = cJSON_GetObjectItem(jsondata, "params");
    LED = cJSON_GetObjectItem(params, "LEDSwitch");
    if (LED->valueint == 1)
    {printf("LED ON\r\n");led_status=1; status_content[0] = '1';
    }
    else
    {
        printf("LED OFF\r\n");led_status=0; status_content[0] = '0';
    }
    cJSON_Delete(jsondata);}

12. 在主函数MQTT定义分配一路socket然后添加一段PG6外部中断代码PG6作为本地控制继电器开关

#define SOCKET_ID4             4
void EXTI_Configuration(void)
{
    EXTI_InitTypeDef EXTI_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;// 1. 使能GPIOG时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);// 2. 配置PG6为浮空输入
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOG, &GPIO_InitStructure);// 3. 使能AFIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);// 4. 映射PG6到EXTI6GPIO_EXTILineConfig(GPIO_PortSourceGPIOG, GPIO_PinSource6);// 5. 配置EXTI6中断线
    EXTI_InitStructure.EXTI_Line = EXTI_Line6;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  // 上升沿触发
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);// 6. 配置NVIC
    NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;  // EXTI5~9共享中断通道
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}
// EXTI9_5中断服务函数
void EXTI9_5_IRQHandler(void)
{// 检查EXTI6中断标志if (EXTI_GetITStatus(EXTI_Line6) != RESET){// 清除中断标志EXTI_ClearITPendingBit(EXTI_Line6);// 执行中断处理
        led_status = !led_status;
        status_content[0] = (status_content[0] == '0') ? '1' : '0'; if(led_status==0){printf("LED_OFF");}else{ printf("LED_ON");}}    }
}

13. 把do_mqtt()函数添加循环中然后main.c添加#include "do_mqtt.h"头文件.

4 功能验证

1.硬件连接完毕,烧录程序上电打印如下信息:在浏览器输入192.168.2.22来进入html页面

 2.我们同时打开串口助手阿里云物联网平台以及HTML网页控制来进行观察我们先使用网页控制查看现象进行打开

3.关闭LED

4. 我们再来使用阿里云进行控制首先设置开启LED

5. 关闭LED

6. 本地按键控制查看阿里云物联网平台状态以及html网页变化我们测试打开

7. 我们进行本地按键关闭测试

由上述可知功能完好阿里云html网页按键控制继电器开关三种模式互通这三种模式都可以查看继电器状态

5. 总结

本项目通过 W55MH32成功实现了 Web 网页以及云平台对继电器的远程控制,验证了基于以太网的嵌入式 Web 服务器方案云平台控制的可行性。感谢大家的耐心阅读!如果您在阅读过程中有任何疑问,或者希望进一步了解这款产品及其应用,欢迎随时通过私信或评论区留言。我们会尽快回复您的消息,为您提供更详细的解答和帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/93677.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/93677.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第四篇:科技封锁与文化渗透篇——T-501 与 M-208 双引擎布局(节奏增强版)

科技封锁与文化渗透篇——T-501 与 M-208 双引擎布局&#xff08;节奏增强版&#xff09; 引子 在全球竞争中&#xff0c;光有资本和市场远远不够。 • 科技封锁&#xff08;T-501&#xff09;&#xff1a;通过技术标准、专利网络、供应链控制&#xff0c;让对手进入成本极高的…

python实现梅尔频率倒谱系数(MFCC) 除了傅里叶变换和离散余弦变换

语音识别第4讲&#xff1a;语音特征参数MFCC https://zhuanlan.zhihu.com/p/88625876/ Speech Processing for Machine Learning: Filter banks, Mel-Frequency Cepstral Coefficients (MFCCs) and What’s In-Between https://haythamfayek.com/2016/04/21/speech-processing-…

springBoot+knife4j+openapi3依赖问题参考

pom文件附带版本<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.12</version></parent><dependencies><!-- SpringDoc starter --><d…

XML DOM 高级

XML DOM 高级 引言 XML DOM(Document Object Model)是用于解析和操作XML文档的一种标准,它允许开发者通过编程方式访问和修改XML文档的内容。本文将深入探讨XML DOM的高级特性,包括XML解析、节点操作、事件处理以及性能优化等,帮助读者全面理解并掌握XML DOM的高级应用。…

「第18讲 内容生成应用场景与多语言支持」AI Agent开发与应用:基于大模型的智能体构建

第18讲核心内容概述内容生成应用场景营销文案生成&#xff1a;基于产品特征自动生成广告语、社交媒体文案&#xff0c;支持个性化推荐和A/B测试优化。新闻报道辅助&#xff1a;快速生成财经、体育等领域的结构化新闻摘要&#xff0c;结合实时数据更新内容。教育内容定制&#x…

金融业务安全增强方案:国密SM4/SM3加密+硬件加密机HSM+动态密钥管理+ShardingSphere加密

国密SM4/SM3 SM4&#xff1a;对称加密算法&#xff0c;分组长度128位&#xff0c;密钥长度128位&#xff0c;适用于数据加密&#xff08;如数据库字段、通信报文&#xff09;】 加密存储&#xff1a;用户身份证号、银行卡号等敏感字段&#xff08;配合ShardingSphere等中间件自…

Chaos Vantage 2.8.1 发布:实时探索与材质工作流的全新突破

作为行业领先的实时光线追踪渲染器&#xff0c;Chaos Vantage再添利器。2.8.1版本更新聚焦材质工作流、硬件效率与API拓展&#xff0c;为建筑可视化、动画制作等领域带来更流畅的操作体验与更深层的定制化可能。 一、核心功能更新&#xff1a;让创作更顺畅 完整V-Ray材质节点支…

【集合框架List接口】

&#x1f449; 用 ArrayList 存数据&#xff0c;结果插入时卡住了&#xff1f; &#x1f449; 想删除某个元素&#xff0c;却发现索引错乱了&#xff1f; &#x1f449; 不知道该用 ArrayList 还是 LinkedList&#xff0c;选错了导致性能瓶颈&#xff1f;一、List 是什么&#…

《棒球百科》奥运会取消了棒球·野球1号位

⚾️ 奥运会棒球消失&复活之谜&#xff01;深度揭秘全球体育权力游戏 ⚾️❌ 2008年为何被踢出奥运&#xff1f;(Why Removed in 2008?)MLB的致命抵制➤ 奥运赛期撞车MLB常规赛白热化阶段&#xff01;➤ 球队老板拒放巨星&#xff1a;2000年悉尼奥运美国队仅剩"替补阵…

基于js和html的点名应用

分享一个在课堂或者是公司团建上需要点名的应用程序&#xff0c;开箱即用。1、双击打开后先选择人员名单&#xff08;可以随时更改的&#xff09;2、下面的滚动速度可以根据需求调整<!DOCTYPE html> <html lang"zh"> <head> <meta charset"…

【深度学习-基础知识】单机多卡和多机多卡训练

1. 单机多卡训练&#xff08;Single Machine, Multi-GPU&#xff09; 概念 在同一台服务器上&#xff0c;有多块 GPU。一个训练任务利用所有 GPU 并行加速训练。数据集存放在本地硬盘或共享存储上。 核心原理数据并行&#xff08;Data Parallelism&#xff09; 将一个 batch 划…

数据库原理及应用_数据库基础_第2章关系数据库标准语言SQL_SQL语言介绍数据库的定义和删除

前言 "<数据库原理及应用>(MySQL版)".以下称为"本书"中2.1节和2.2节第一部分内容 引入 本书P40:SQL(Structure Query Language结构化查询语言)是一种在关系数据库中定义和操纵数据的标准语言,是用户和数据库之间进行交流的接口. ---SQL是一种语言,是…

实变函数中集合E的边界与其补集的边界是否相等

在实变函数&#xff08;或一般拓扑学&#xff09;中&#xff0c;给定一个集合 E \subseteq \mathbb{R}^n &#xff08;或更一般的拓扑空间&#xff09;&#xff0c;集合 E 的边界&#xff08;boundary&#xff09;与 E 的补集 E^c 的边界是否相等&#xff1f; 即&#x…

# C++ 中的 `string_view` 和 `span`:现代安全视图指南

C 中的 string_view 和 span&#xff1a;现代安全视图指南 文章目录C 中的 string_view 和 span&#xff1a;现代安全视图指南目录1. 原始指针的痛点1.1 安全问题1.2 所有权不明确1.3 接口笨拙1.4 生命周期问题2. string_view 深入解析2.1 基本特性2.2 高效解析示例2.3 防止常见…

Linux学习-多任务(线程)

定义轻量级进程&#xff0c;实现多任务并发&#xff0c;是操作系统任务调度最小单位&#xff08;进程是资源分配最小单位 &#xff09;。创建由进程创建&#xff0c;属于进程内执行单元。- 独立&#xff1a;线程有8M 独立栈区 。 - 共享&#xff1a;与所属进程及进程内其他线程…

高级堆结构

一、二项堆&#xff08;Binomial Heap&#xff09;&#xff1a;理解「合并操作」的优化二项堆的核心优势是高效合并&#xff0c;类似 “二进制加法”。我们通过「合并两个二项堆」的伪代码和步骤来理解&#xff1a;核心结构伪代码&#xff1a;class BinomialTreeNode:def __ini…

系统学习算法 专题十七 栈

题目一&#xff1a;算法思路&#xff1a;一开始还是暴力解法&#xff0c;即遍历字符串&#xff0c;如果出现当前位置的字符等于后面的字符&#xff0c;则删除这两个字符&#xff0c;然后再从头遍历&#xff0c;如此循环即可但是这样时间复杂度很高&#xff0c;每删除一次就从头…

深入解析函数指针及其数组、typedef关键字应用技巧

目录 一、函数指针变量的创建 1、什么是函数指针变量&#xff1f; 2、函数是否有地址&#xff1f; 3、创建函数指针变量 4、函数指针类型解析 二、函数指针变量的使用 三、两段有趣的代码 1、解释 (*(void (*)())0)(); 2、解释 void (*signal(int, void(*)(int)))(int…

k8s集群搭建一主多从的jenkins集群

方案 --------------------- | Jenkins Master | | - 持久化配置 |<---(hostpath 存储) | - 自动容灾 | --------------------|| Jenkins JNLP 通信| ----------v---------- ------------------- | Jenkins Agent | | Kubernetes Pl…

重温k8s基础概念知识系列三(工作负载)

文章目录1、工作负载简述2、Deployment1.1、创建 Deployment1.2、检查 Deployment上线状态3、StatefulSet4、DaemonSet3.1、创建 DaemonSet3.2、运行DaemonSet5、Job5.1、运行示例 Job5.2、检查 Job 的状态6、CronJob上一节&#xff0c;我们复习了Pod相关知识&#xff0c;大多情…