基于W55MH32Q-EVB 实现 HTTP 服务器配置 OLED 滚动显示信息

目录

1 前言

2 项目环境

2.1 硬件准备

2.2 软件环境

3.硬件连接和方案

3.1 硬件连接

3.2 方案图示

4.例程修改


1 前言

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

W55MH32Q-EVB 是基于 W55MH32L 芯片开发的一款开发板,主频为 216MHz,1MB 的闪存以及 96KB 的 SRAM,同时还具有一个完整的硬件 TCP/IP 卸载引擎,只需要简单的 socket 编程即可实现以太网应用。 具有以下特点:

  • 增强型、真随机数、硬件加密算法单元
  • 32 位 Arm® Cortex®-M3 核心的片上
  • 1024K 字节闪存的微控制器
  • 10/100M 以太网 MAC 和 PHY、集成完整的全硬件 TCP/IP 协议栈引擎
  • USB、CAN、17 个定时器
  • 3 个 ADC、2 个 DAC、12 个通信接口

产品链接:商品详情

2 项目环境

2.1 硬件准备

  • W55MH32Q-EVB 模块
  • 杜邦线若干
  • 交换机或路由器
  • oled 模块
  • 一根网线

2.2 软件环境

  • 例程链接:https://www.w5500.com/w55mh32.html
  • 飞思创串口助手
  • Keil5

3.硬件连接和方案

3.1 硬件连接

1.W55MH32Q-EVB_3.3V ---> OLED_VCC
2.W55MH32Q-EVB_GND ---> OLED_GND
3.W55MH32Q-EVB_SCL ---> OLED_SCL
4.W55MH32Q-EVB_SDA ---> OLED_SDA

3.2 方案图示

4.例程修改

本次以 HTTP_Server 为例:

找到 Webpage.h 将文件内容替换成以下内容

#ifndef _WEBPAGE_H_
#define _WEBPAGE_H_/************************************************************************************** HTML Pages (web pages)*************************************************************************************/#define index_page "<html>\n"\
"<head>\n"\
"    <title>W55MH32 SMTP Configuration</title>\n"\
"    <style>\n"\
"        body {\n"\
"            font-family: Arial, sans-serif;\n"\
"            margin: 20px;\n"\
"            padding: 20px;\n"\
"            background-color: #f4f4f9;\n"\
"        }\n"\
"        h1 {\n"\
"            text-align: center;\n"\
"            color: #333;\n"\
"        }\n"\
"        form {\n"\
"            max-width: 400px;\n"\
"            margin: auto;\n"\
"            background: #ffffff;\n"\
"            padding: 20px;\n"\
"            border-radius: 8px;\n"\
"            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);\n"\
"        }\n"\
"        label {\n"\
"            display: block;\n"\
"            margin-bottom: 8px;\n"\
"            font-weight: bold;\n"\
"        }\n"\
"        input[type=text],\n"\
"        input[type=submit] {\n"\
"            width: 400px;\n"\
"            padding: 8px;\n"\
"            margin-bottom: 12px;\n"\
"            border: 1px solid #ccc;\n"\
"            border-radius: 4px;\n"\
"        }\n"\
"        input[type=submit] {\n"\
"            background-color: #4CAF50;\n"\
"            color: white;\n"\
"            border: none;\n"\
"            cursor: pointer;\n"\
"            margin-top: 20px;\n"\
"        }\n"\
"        input[type=submit]:hover {\n"\
"            background-color: #45a049;\n"\
"        }\n"\
"        textarea {\n"\
"            width: 400px;\n"\
"            height: 100px;\n"\
"            resize: none;\n"\
"            margin-bottom: 20px;\n"\
"        }\n"\
"    </style>\n"\
"    <script>\n"\
"    </script>\n"\
"</head>\n"\
"<body>\n"\
"    <h1>W55MH32 OLED DISPLAY Configuration</h1>\n"\
"    <form method=\"post\" action=\"config.cgi\" >\n"\
"        <label>text: </label><textarea name=\"text\">%s</textarea><br>\n"\
"        <label>\n"\
"            <input type=\"checkbox\" id=\"vehicle1\" name=\"is_Rolling\" value=\"Rolling\"> Rolling\n"\
"        </label>\n"\
"        <input type=\"submit\" value=\"OK\">\n"\
"    </form>\n"\
"</body>\n"\
"</html>\n"\#define CONFIG_SUCCESS_PAGE "<html lang=en>\n"\
"<head>\n"\
"    <meta charset=UTF-8>\n"\
"    <meta name=viewport content=width=device-width, initial-scale=1.0>\n"\
"    <title>Configuration Modification Succeeded</title>\n"\
"    <style>\n"\
"        body {\n"\
"            font-family: Arial, sans-serif;\n"\
"            text-align: center;\n"\
"            padding-top: 100px;\n"\
"            background-color: #f0f0f0;\n"\
"        }\n"\
"        h1 {\n"\
"            color: skyblue;\n"\
"            animation: fadeInOut 2s infinite;\n"\
"        }\n"\
"    </style>\n"\
"</head>\n"\
"<body>\n"\
"    <h1>The device has received the message!</h1>\n"\
"    <h1>OLED will be displayed soon!</h1>\n"\
"<script>\n"\
"</script>\n"\
"</body>\n"\
"</html>\n"\#endif

在 httpUtil.c 中修改 predefined_set_cgi_processor 函数,这个是处理浏览器提交过来的数据的函数,代码如下:

uint8_t predefined_set_cgi_processor(uint8_t *uri_name, uint8_t *uri, uint8_t *buf, uint16_t *len)
{if (strcmp((const char *)uri_name, "config.cgi") == 0)
    {uint8_t *param;param = get_http_param_value((char *)uri, "text");set_data(param);param = get_http_param_value((char *)uri, "is_Rolling");if (!strcmp(param, "Rolling"))
        {set_rolling_flag(1);
        }else
        {set_rolling_flag(0);
        }set_dispaly_flag(1);*len = sprintf((char *)buf, (char *)CONFIG_SUCCESS_PAGE);return 1;
    }return 0;
}

添加 oled.c 函数,用于控制 oled通过oled相应寄存器赋值即可实现oled滚动代码如下

#include "oled.h"
#include "delay.h"
#include "flash.h"
#include "oledfont.h"
#include "stdint.h"
#include "string.h"
#include "w55mh32.h"unsigned char data[64] = "";
unsigned char is_rolling_flag = 0;
unsigned char display_flag = 0;
unsigned char startup_flag = 1;void IIC_Start()
{OLED_SCLK_Set();OLED_SDIN_Set();OLED_SDIN_Clr();OLED_SCLK_Clr();
}/**********************************************
//IIC Stop
**********************************************/
void IIC_Stop()
{OLED_SCLK_Set();//	OLED_SCLK_Clr();OLED_SDIN_Clr();OLED_SDIN_Set();
}void IIC_Wait_Ack()
{// GPIOB->CRH &= 0XFFF0FFFF;// GPIOB->CRH |= 0x00080000;//	OLED_SDA = 1;//	delay_us(1);// OLED_SCL = 1;// delay_us(50000);/*	while(1)
        {if(!OLED_SDA)
            {//GPIOB->CRH &= 0XFFF0FFFF;//GPIOB->CRH |= 0x00030000;return;
            }
        }*/OLED_SCLK_Set();OLED_SCLK_Clr();
}
/**********************************************
// IIC Write byte
**********************************************/void Write_IIC_Byte(unsigned char IIC_Byte)
{unsigned char i;unsigned char m, da;da = IIC_Byte;OLED_SCLK_Clr();for (i = 0; i < 8; i++)
    {m = da;//	OLED_SCLK_Clr();m = m & 0x80;if (m == 0x80)
        {OLED_SDIN_Set();
        }elseOLED_SDIN_Clr();da = da << 1;OLED_SCLK_Set();OLED_SCLK_Clr();
    }
}
/**********************************************
// IIC Write Command
**********************************************/
void Write_IIC_Command(unsigned char IIC_Command)
{IIC_Start();Write_IIC_Byte(0x78); // Slave address,SA0=0IIC_Wait_Ack();Write_IIC_Byte(0x00); // write commandIIC_Wait_Ack();Write_IIC_Byte(IIC_Command);IIC_Wait_Ack();IIC_Stop();
}
/**********************************************
// IIC Write Data
**********************************************/
void Write_IIC_Data(unsigned char IIC_Data)
{IIC_Start();Write_IIC_Byte(0x78); // D/C#=0; R/W#=0IIC_Wait_Ack();Write_IIC_Byte(0x40); // write dataIIC_Wait_Ack();Write_IIC_Byte(IIC_Data);IIC_Wait_Ack();IIC_Stop();
}
void OLED_WR_Byte(unsigned dat, unsigned cmd)
{if (cmd)Write_IIC_Data(dat);elseWrite_IIC_Command(dat);
}void OLED_Set_Pos(unsigned char x, unsigned char y)
{OLED_WR_Byte(0xb0 + y, OLED_CMD);OLED_WR_Byte(((x & 0xf0) >> 4) | 0x10, OLED_CMD);OLED_WR_Byte((x & 0x0f), OLED_CMD);
}void OLED_Display_On(void)
{OLED_WR_Byte(0X8D, OLED_CMD);OLED_WR_Byte(0X14, OLED_CMD); // DCDC ONOLED_WR_Byte(0XAF, OLED_CMD); // DISPLAY ON
}void OLED_Display_Off(void)
{OLED_WR_Byte(0X8D, OLED_CMD);OLED_WR_Byte(0X10, OLED_CMD); // DCDC OFFOLED_WR_Byte(0XAE, OLED_CMD); // DISPLAY OFF
}void OLED_Clear(void)
{unsigned char i, n;for (i = 0; i < 8; i++)
    {OLED_WR_Byte(0xb0 + i, OLED_CMD);OLED_WR_Byte(0x00, OLED_CMD);OLED_WR_Byte(0x10, OLED_CMD);for (n = 0; n < 128; n++)OLED_WR_Byte(0, OLED_DATA);
    }
}
void OLED_On(void)
{unsigned char i, n;for (i = 0; i < 8; i++)
    {OLED_WR_Byte(0xb0 + i, OLED_CMD);OLED_WR_Byte(0x00, OLED_CMD);OLED_WR_Byte(0x10, OLED_CMD);for (n = 0; n < 128; n++)OLED_WR_Byte(1, OLED_DATA);
    }
}void OLED_ShowChar(unsigned char x, unsigned char y, unsigned char chr, unsigned char Char_Size)
{unsigned char c = 0, i = 0;c = chr - ' ';if (x > Max_Column - 1)
    {x = 0;y = y + 2;
    }if (Char_Size == 16)
    {OLED_Set_Pos(x, y);for (i = 0; i < 8; i++)OLED_WR_Byte(F8X16[c * 16 + i], OLED_DATA);OLED_Set_Pos(x, y + 1);for (i = 0; i < 8; i++)OLED_WR_Byte(F8X16[c * 16 + i + 8], OLED_DATA);
    }else
    {OLED_Set_Pos(x, y);for (i = 0; i < 6; i++)OLED_WR_Byte(F6x8[c][i], OLED_DATA);
    }
}unsigned int oled_pow(unsigned char m, unsigned char n)
{unsigned int result = 1;while (n--)result *= m;return result;
}void OLED_ShowString(unsigned char x, unsigned char y, char *chr, unsigned char Char_Size)
{unsigned char j = 0;while (chr[j] != '\0')
    {OLED_ShowChar(x, y, chr[j], Char_Size);x += 8;if (x > 120)
        {x = 0;y += 2;
        }j++;
    }
}void OLED_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB, GPIO_Pin_5 | GPIO_Pin_6);delay_ms(800);OLED_WR_Byte(0xAE, OLED_CMD);OLED_WR_Byte(0x00, OLED_CMD);OLED_WR_Byte(0x10, OLED_CMD);OLED_WR_Byte(0xB0, OLED_CMD);OLED_WR_Byte(0x40, OLED_CMD);OLED_WR_Byte(0x81, OLED_CMD);OLED_WR_Byte(0xFF, OLED_CMD);OLED_WR_Byte(0xA1, OLED_CMD);OLED_WR_Byte(0xA6, OLED_CMD);OLED_WR_Byte(0xA8, OLED_CMD);OLED_WR_Byte(0x3F, OLED_CMD);OLED_WR_Byte(0xC8, OLED_CMD);OLED_WR_Byte(0xD3, OLED_CMD);OLED_WR_Byte(0x00, OLED_CMD);OLED_WR_Byte(0xD5, OLED_CMD);OLED_WR_Byte(0x80, OLED_CMD);OLED_WR_Byte(0xD9, OLED_CMD);OLED_WR_Byte(0xF1, OLED_CMD);OLED_WR_Byte(0xDA, OLED_CMD);OLED_WR_Byte(0x12, OLED_CMD);OLED_WR_Byte(0xDB, OLED_CMD);OLED_WR_Byte(0x30, OLED_CMD);OLED_WR_Byte(0x8D, OLED_CMD);OLED_WR_Byte(0x14, OLED_CMD);OLED_WR_Byte(0xAF, OLED_CMD);OLED_Clear();
}void set_data(unsigned char *dat)
{memset(data, 0, sizeof(data));strcpy(data, dat);
}void set_rolling_flag(unsigned char flag)
{is_rolling_flag = flag;
}void set_dispaly_flag(unsigned char flag)
{display_flag = flag;
}unsigned char get_dispaly_flag()
{return display_flag;
}// 添加滚动控制函数
void OLED_StartHorizontalScroll(unsigned char direction, unsigned char start_page,unsigned char end_page, unsigned char interval)
{OLED_WR_Byte(0x2E, OLED_CMD); // 关闭滚动// 设置滚动方向OLED_WR_Byte(direction, OLED_CMD);  // 0x26=右滚, 0x27=左滚OLED_WR_Byte(0x00, OLED_CMD);       // 虚拟字节OLED_WR_Byte(start_page, OLED_CMD); // 起始页 (0-7)OLED_WR_Byte(interval, OLED_CMD);   // 滚动间隔 (0-7, 数值越大越慢)OLED_WR_Byte(end_page, OLED_CMD);   // 终止页 (0-7)OLED_WR_Byte(0x00, OLED_CMD);       // 虚拟字节OLED_WR_Byte(0xFF, OLED_CMD);       // 虚拟字节OLED_WR_Byte(0x2F, OLED_CMD); // 启动滚动
}// 停止滚动
void OLED_StopScroll(void)
{OLED_WR_Byte(0x2E, OLED_CMD);
}void oled_display()
{unsigned char len = strlen(data);unsigned char *point = data;char buff[17] = {0};OLED_StopScroll();OLED_Clear();// clear bufffor (unsigned char i = 0; i < 4; i++)
    {memset(buff, 0, 16);if (len > 16)
        {strncpy(buff, (char *)point, 16);OLED_ShowString(0, i * 2, buff, 16);point += 16;len -= 16;
        }else
        {strcpy(buff, (char *)point);OLED_ShowString(0, i * 2, buff, 16);break;
        }
    }if (startup_flag)
    {startup_flag = 0;
    }else
    {Flash_Write(data, is_rolling_flag);
    }// 启动滚动 (从第0页到第7页,向左滚动,速度中等)if (is_rolling_flag)OLED_StartHorizontalScroll(0x27, 0, 7, 7);
}

添加 oled.h 头文件,代码如下,可以修改对应的宏定义为自己的引脚

#ifndef __OLED_H
#define __OLED_H
#include "delay.h"
#include "stdlib.h"#define OLED_MODE 0
#define SIZE 8
#define XLevelL 0x00
#define XLevelH 0x10
#define Max_Column 128
#define Max_Row 64
#define Brightness 0xFF
#define X_WIDTH 128
#define Y_WIDTH 64#define OLED_SCLK_Clr() GPIO_ResetBits(GPIOB, GPIO_Pin_5) // SCL
#define OLED_SCLK_Set() GPIO_SetBits(GPIOB, GPIO_Pin_5)#define OLED_SDIN_Clr() GPIO_ResetBits(GPIOB, GPIO_Pin_6) // SDA
#define OLED_SDIN_Set() GPIO_SetBits(GPIOB, GPIO_Pin_6)#define OLED_CMD 0
#define OLED_DATA 1void OLED_WR_Byte(unsigned dat, unsigned cmd);
void OLED_Display_On(void);
void OLED_Display_Off(void);
void OLED_Init(void);
void OLED_Clear(void);
void OLED_DrawPoint(unsigned char x, unsigned char y, unsigned char t);
void OLED_Fill(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, unsigned char dot);
void OLED_ShowChar(unsigned char x, unsigned char y, unsigned char chr, unsigned char Char_Size);
void OLED_ShowNum(unsigned char x, unsigned char y, unsigned int num, unsigned char len, unsigned char size);
void OLED_ShowString(unsigned char x, unsigned char y, char *p, unsigned char Char_Size);
void OLED_Set_Pos(unsigned char x, unsigned char y);
void OLED_ShowCHinese(unsigned char x, unsigned char y, unsigned char no);
void OLED_DrawBMP(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, unsigned char BMP[]);
void Delay_50ms(unsigned int Del_50ms);
void Delay_1ms(unsigned int Del_1ms);
void fill_picture(unsigned char fill_Data);
void Picture(void);
void IIC_Start(void);
void IIC_Stop(void);
void Write_IIC_Command(unsigned char IIC_Command);
void Write_IIC_Data(unsigned char IIC_Data);
void Write_IIC_Byte(unsigned char IIC_Byte);
void OLED_ShowDecimal(unsigned char x, unsigned char y, float num);void IIC_Wait_Ack(void);
void OLED_ShowNumber(unsigned char x, unsigned char y, short num);void set_data(unsigned char *dat);
void set_rolling_flag(unsigned char flag);
void set_dispaly_flag(unsigned char flag);
unsigned char get_dispaly_flag(void);
void oled_display(void);
#endif

添加 flash.c 文件,用于保存显示内容到 flash,这样即使电源断开后,再次通电也能显示之前保存的显示内容。代码如下

#include "Flash.h"
#include "w55mh32_flash.h"unsigned char Flash_Write(char *data1, unsigned char data2)
{unsigned char status = 0;unsigned int address = startAddress;unsigned int rolling = data2;char str[100] = "";strcpy(str, data1);FLASH_Unlock();status = FLASH_ErasePage(startAddress);if (FLASH_COMPLETE != status)return status;status = FLASH_ProgramWord(address, rolling);address += 4;if (FLASH_COMPLETE != status)return status;unsigned char i;for (i = 0; i < strlen(str) && (status == FLASH_COMPLETE); i++)
    {status = FLASH_ProgramWord(address, str[i]);address += 4;
    }FLASH_ProgramWord(address, '\0');FLASH_Lock();return 0;
}void Flash_Read(char *str, unsigned char *rolling)
{unsigned int address = startAddress;char temp = ' ';*rolling = (unsigned char)*(__IO uint32_t *)address;address += 4;for (unsigned char i = 0; i < 64; i++)
    {temp = (char)*(__IO uint32_t *)address;if (temp == 0)
        {str[i] = '\0';return;
        }str[i] = temp;address += 4;
    }
}

添加 flash.h 头文件,代码如下

#ifndef _FLASH_H
#define _FLASH_H#include "string.h"#define startAddress ((uint32_t)0x08020000)unsigned char Flash_Write(char *data1, unsigned char data2);
void Flash_Read(char *str, unsigned char *rolling);#endif

修改主函数 main.c,代码如下:

#include "bsp_rcc.h"
#include "bsp_tim.h"
#include "bsp_uart.h"
#include "delay.h"
#include "flash.h"
#include "httpServer.h"
#include "oled.h"
#include "webpage.h"
#include "wiz_interface.h"
#include "wizchip_conf.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define SOCKET_ID 0
#define ETHERNET_BUF_MAX_SIZE (1024 * 2)/* network information */
wiz_NetInfo default_net_info = {
    .mac = {0x00, 0x10, 0xdc, 0x12, 0x22, 0x12},
    .ip = {192, 168, 1, 30},
    .gw = {192, 168, 1, 1},
    .sn = {255, 255, 255, 0},
    .dns = {8, 8, 8, 8},
    .dhcp = NETINFO_DHCP};static uint8_t ethernet_buf[ETHERNET_BUF_MAX_SIZE] = {0};
static uint8_t http_tx_ethernet_buf[ETHERNET_BUF_MAX_SIZE] = {0};
static uint8_t http_rx_ethernet_buf[ETHERNET_BUF_MAX_SIZE] = {0};
static uint8_t socknumlist[1] = {SOCKET_ID};
int main(void)
{
    char page[2048];
    char str[64] = "asdasdasd";
    unsigned char flag = 0;    wiz_NetInfo net_info;
    /* hardware initialization */
    rcc_clk_config();
    delay_init();
    console_usart_init(115200);    tim3_init();    OLED_Init();    printf("%s HTTP Server example\r\n", _WIZCHIP_ID_);    /* wiztoe init */
    wiz_toe_init();    wiz_phy_link_check();    network_init(ethernet_buf, &default_net_info);    wizchip_getnetinfo(&net_info);
    printf("Please enter% d.% d.% d.% d in your browser to access the %s HTTP server\r\n", net_info.ip[0], net_info.ip[1], net_info.ip[2], net_info.ip[3], _WIZCHIP_ID_);    // 查询flash
    Flash_Read(str, &flag);
    if (str != NULL)
    {
        set_data(str);
        set_rolling_flag(flag);
        set_dispaly_flag(1);
    }    sprintf(page, (char *)index_page, "");    reg_httpServer_webContent((uint8_t *)"index.html", (uint8_t *)page);         // Build HTTP server web pages
    httpServer_init(http_tx_ethernet_buf, http_rx_ethernet_buf, 1, socknumlist); // Initializing the HTTP server
    while (1)
    {
        httpServer_run(SOCKET_ID);        if (get_dispaly_flag())
        {
            oled_display();            set_dispaly_flag(0);
        }
    }
}

5.运行结果

如图为 http 网页,用户可以输入内容,并且可以选择是否滚动显示

如图为提交后的页面

如图为 OLED 显示结果

6.总结

本文详细介绍了如何利用 W55MH32Q-EVB 的 HTTP 功能,通过使用 HTTP 服务器来获取 oled 显示内容,然后将内容显示在 oled 上。感谢大家的耐心阅读!如果您在阅读过程中有任何疑问,或者希望进一步了解这款产品及其应用,欢迎随时通过私信或评论区留言。我们会尽快回复您的消息,为您提供更详细的解答和帮助!

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

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

相关文章

YggJS RLogin暗黑霓虹主题登录注册页面 版本:v0.1.1

项目介绍 yggjs_rlogin 是一个专注于 React 登录/注册页面的组件库。本文档介绍“暗黑霓虹”主题&#xff1a;#111 暗色背景 青蓝霓虹描边输入框 赛博朋克光效按钮。 安装说明 安装&#xff1a;pnpm add yggjs_rlogin react react-dom使用&#xff1a;从 yggjs_rlogin 引入组…

大数据毕业设计选题推荐:护肤品店铺运营数据可视化分析系统详解

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

【github-action 如何为github action设置secrets/environment】

Using secrets in GitHub Actions 在 GitHub Actions 中使用密钥 Learn how to create secrets at the repository, environment, and organization levels for GitHub Actions workflows. 学习如何在仓库、环境和组织级别为 GitHub Actions 工作流创建密钥。 Creating secre…

宝塔面板Docker安装n8n汉化中文

一、Docker安装N8N 安装配置默认即可&#xff0c;如果端口已被使用&#xff0c;可以自行更改 当状态为运行中时&#xff0c;就可以点击端口&#xff1a;访问N8N 填写完信息后&#xff0c;点击下一步&#xff08;邮箱要能接收邮件&#xff1a;接收密钥&#xff09; 点开始 点击发…

F003疫情传染病数据可视化vue+flask+mysql

编号:F003 文章结尾有CSDN官方提供的学长的联系方式&#xff01;&#xff01; 欢迎关注B站 ✅ vue flask 前后端分离架构 ✅ 实现中国地图、柱状图、折线图、水地图、环图等多种图形的echarts可视化分析 视频 vueflask爬虫 新冠疫情大屏实现 python 可视化分析项目源码1 系统…

plantsimulation知识点25.8.19 工件不在RGV中心怎么办?

如果出现这种情况&#xff0c;工件不在RGV的中心该怎么处理。首先说一下出现这种情况的原因。因为模拟的是两台RGV共同托举一个工件移动&#xff0c;实际上RGV控制的代码还是写在一条轨道的传感器控制代码中。另一台RGV只是从动的&#xff0c;工件也是在其中任意一台RGV上&…

redis-sentinel基础概念及部署

一. 引言&#xff1a;Redis Sentinel 是 redis 官方提供的高可用解决方案&#xff0c;主要用于监控 Redis 主从集群&#xff0c;在主节点故障时自动完成故障转移&#xff0c;确保服务持续可用。二. 核心功能1. 监控&#xff08;monitoring&#xff09;&#xff1a;持续检查主节…

LangChain RAG 简述

在 LangChain 中实现 RAG&#xff08;检索增强生成&#xff0c;Retrieval-Augmented Generation&#xff09;的核心思路是&#xff1a;让大模型在生成回答前&#xff0c;先从外部知识库&#xff08;如文档、数据库等&#xff09;中检索相关信息&#xff0c;再基于检索到的内容生…

GEO 优化专家孟庆涛:技术破壁者重构 AI 时代搜索逻辑

在生成式 AI 重塑全球搜索生态的浪潮中&#xff0c;中国 GEO&#xff08;生成式引擎优化&#xff09;领域的开拓者孟庆涛以 "智能决策革命" 的技术框架&#xff0c;颠覆了传统 "发发文章" 的简单认知。作为辽宁粤穗网络科技有限公司总经理兼 GEO 实验室主任…

用relation-graph构建关系图谱 vue版

用relation-graph构建关系图谱 vue版vue文件和Json数据vue文件和Json数据 <template><div><div style"margin-top:0px;width: calc(100% - 10px);height:calc(100vh);"><RelationGraph ref"graphRef" :options"graphOptions&qu…

Python基础-控制结构

控制结构是编程语言中用来控制程序执行流程的语句。Python提供了条件语句、循环语句等控制结构&#xff0c;让程序能够根据不同条件执行不同的代码块。 程序执行流程图&#xff1a; ┌───────────────────────────────────────────…

Java算法之排序

下面我们将讲述七大基于比较的排序算法的基本原理及实现。并从稳定性、时间复杂度、空间复杂度3种性能对每种排序进行分析。 重点&#xff1a;快速排序和堆排序&#xff1b;难点&#xff1a;快速排序和归并排序 目录 一、排序概念 二、常见排序算法的实现 2.1 插入排序 2.…

RabbitMQ:SpringAMQP 多消费者绑定同一队列

目录一、案例需求二、代码实现三、总结生产者源码 消费者源码 一、案例需求 模拟WorkQueue&#xff0c;实现一个队列绑定多个消费者。 在RabbitMQ的控制台创建一个队列&#xff0c;命名为work.queue。在生产者服务中定义测试方法&#xff0c;在1s内产生50条消息&#xff0c;…

Java技术总监的成长之路(技术干货分享)

以下是针对 ​Java技术总监​ 在 Linux 环境下搭建企业级开发环境的完整指南&#xff0c;涵盖 JDK 配置、工程工具链、协作平台及性能优化方案&#xff1a; 本文章仅提供学习&#xff0c;切勿将其用于不法手段&#xff01; 一、核心环境搭建 1. ​JDK 安装与调优​ ​版本选择…

C++代码解释:实现一个 mystring 类,用于表示字符串,实现构造函数,默认构造长度为 10 的空间,提供打印字符串,获取空间大小,修改内容的成员函数

题目代码#include <cstring> // 包含字符串处理函数库&#xff0c;如strlen、strncpy等 #include <iostream> // 包含输入输出流库&#xff0c;用于cout等操作 using namespace std; // 使用标准命名空间&#xff0c;避免重复书写std::class mystring { // 定…

如何解决IDEA/Datagrip无法连接数据库的问题:解决方法为添加参数-Djava.net.preferIPv4Stack=true

如何解决IDEA/Datagrip无法连接数据库的问题&#xff1a;解决方法为添加参数-Djava.net.preferIPv4Stacktrue 引言 在开发过程中&#xff0c;我们常常使用集成开发环境&#xff08;IDE&#xff09;如 IntelliJ IDEA 或 JetBrains DataGrip 来与数据库进行交互。然而&#xff…

走进数字时代,融入数字生活,构建数字生态

一、准备在IT行业深耕十七年&#xff0c;始终专注于企业生产经营中的实际应用问题&#xff0c;历经开发、测试、运维、实施、架构设计等多个技术岗位&#xff0c;并参与肉制品的生产与销售业务&#xff0c;推进了企业主业的市场管理落地&#xff0c;积累了业务与信息技术融合的…

【Vue开发】在Vite+Vue3项目中实现离线Iconify图标方案

在ViteVue3项目中实现离线Iconify图标方案 项目背景 当前项目需要部署到无网络连接的离线环境&#xff0c;因此需要将Iconify图标集打包到项目构建结果中&#xff0c;实现完全离线使用。 技术环境 框架: Vue 3构建工具: Vite核心依赖:"iconify/json": "^2.2…

Kotlin 协程之Channel

前言 在之前的文章中&#xff0c;我们已经知道了协程的启动、挂起、取消、异常以及常用的协程作用域等基础应用。 这些基础应用适合的场景是一次性任务&#xff0c;执行完就结束了的场景。 launch / async 适合的场景 网络请求数据库查询文件读写并行计算任务等等 Channel …

linux系统装google chrome,amd64

google chrome官网最下边其他平台&#xff0c;linux 查看自己的系统架构&#xff08;用下边这行代码查看&#xff09;&#xff0c;看看是amd还是 &#xff0c;我的显示amd64&#xff0c;amd对应.deb,rpm对应x86 &#xff0c;选择下载 dpkg --print-architecture 然后 sudo…