【开源】嵌入式Linux(IMX6U)应用层综合项目(2)--智能家居APP

news2024/9/25 3:26:57

目录

1.简介

1.1功能介绍

1.2技术栈介绍

1.3演示视频

1.4硬件介绍

2.软件设计

2.1智能家居UI设计

2.2.main函数

3.结尾(附网盘链接)


1.简介

此文章并不是教程,只能当作笔者的学习分享,只会做一些简单的介绍,其他的各位结合着代码和运行现象自己分析吧,相信通过函数名和注释,基本上是不难看懂代码的,其中涉及到的一些技术栈,也请各位学习到的时候多查阅资料。

本篇的内容为嵌入式Linux应用层的一个综合性比较强的项目,结尾会将源码放在网盘中开源出来,笔者能力有限,只是简单的把功能实现了,代码开源供大家一起交流学习,有什么好的建议,请各位一定不吝赐教!!!

1.1功能介绍

项目包括了四个app:

1.云平台的调试窗口,用于查看订阅主题所下发的数据,另一个为输入Json格式的数据来控制STM32单片机上的外设。

2.智能家居的界面,有4个图片按钮用于控制STM32板子上的LED灯、门(舵机)、蜂鸣器,量计分别为温度、湿度和亮度的值,同样是STM32获取发布到云平台的。

3.通过一个摄像头模块做的一个相机功能,可以拍照、录像,以及查看拍摄的照片,和播放录制视频的回放。

4.简易的音乐播放器:能够切换歌曲,以及暂停播放音乐。

1.2技术栈介绍

虽然项目简单,但是所涉及到的技术栈还是比较杂,我简单在此列出:

 1.LVGL库用于绘制UI。

2.MQTT协议,连接阿里云平台与STM32通讯。

3.alsa库用于音频处理。

4.LED、BEEP

5.V4L2 摄像头应用编程

1.3演示视频

【开源】嵌入式Linux应用层物联网小项目|通过MQTT协议与STM32通讯_哔哩哔哩_bilibili

1.4硬件介绍

硬件使用的是正点原子的阿尔法开发板,芯片是IMX6U,类似开发板应该都可以运行。

2.软件设计

2.1智能家居UI设计

主要的内容就是创建了4个开关按键分别对应STM32的LED、舵机、蜂鸣器的控制,第4个空调的按键还没有去完善它。以及3个度量针,用于显示STM32上传传感器数据,对应温度、湿度和光度。

#include "ui_app_smarthome.h"

lv_anim_t temp_anim, light_anim, humi_anim;
lv_obj_t *temp_bar = NULL, *light_bar = NULL, *humi_arc = NULL;
lv_obj_t *temp_bar_label, *light_bar_label, *humi_arc_label;
g_sensor_t g_sensor;

extern void *mqtt_handle;
extern char *pub_topic;

void ui_draw_contrl_bar(lv_coord_t x, lv_coord_t y, const char *t_lab, const char *b_lab, const lv_img_dsc_t *img, const lv_color_t value)
{
    ui_draw_backgroud_bar(x, y, 170, 180, value);

    lv_obj_t *top_lab = lv_label_create(lv_scr_act());
    lv_label_set_text(top_lab, t_lab);
    static lv_style_t top_lab_style;
    lv_style_init(&top_lab_style);
    lv_style_set_text_font(&top_lab_style, &lv_font_montserrat_16);          // 设置字体
    lv_style_set_text_color(&top_lab_style, lv_color_hex(MY_UI_COLOR_BLUE)); // 设置字体颜色
    lv_obj_add_style(top_lab, &top_lab_style, LV_PART_MAIN);
    lv_obj_align(top_lab, LV_ALIGN_TOP_LEFT, x + 30, y + 20);

    lv_obj_t *img_light_obj = lv_img_create(lv_scr_act());
    lv_img_set_src(img_light_obj, img);
    lv_obj_set_size(img_light_obj, 64, 64);
    lv_obj_align(img_light_obj, LV_ALIGN_TOP_LEFT, x + 15, y + 55);

    lv_obj_t *button_lab = lv_label_create(lv_scr_act());
    lv_label_set_text(button_lab, b_lab);
    static lv_style_t button_lab_style;
    lv_style_init(&button_lab_style);
    lv_style_set_text_font(&button_lab_style, &lv_font_montserrat_16);           // 设置字体
    lv_style_set_text_color(&button_lab_style, lv_color_hex(MY_UI_COLOR_BLACK)); // 设置字体颜色
    lv_obj_add_style(button_lab, &button_lab_style, LV_PART_MAIN);
    lv_obj_align(button_lab, LV_ALIGN_TOP_LEFT, x + 30, y + 140);
}

static lv_obj_t *slider_label;
static void slider_event_cb(lv_event_t *e)
{
    lv_obj_t *slider = lv_event_get_target(e);
    char buf[8];
    lv_snprintf(buf, sizeof(buf), "%d°C", (int)lv_slider_get_value(slider));
    lv_label_set_text(slider_label, buf);
    lv_obj_align_to(slider_label, slider, LV_ALIGN_OUT_TOP_MID, 25, 65);
}

static void smarthome_light_btn_cb(lv_event_t *e)
{
    int res;
    char *pub_payload = "{\"LED\":1}";

    lv_event_code_t code = lv_event_get_code(e);
    lv_obj_t *obj = lv_event_get_target(e);
    if (code == LV_EVENT_VALUE_CHANGED)
    {
        LV_UNUSED(obj);
        LV_LOG_USER("State: %s\n", lv_obj_has_state(obj, LV_STATE_CHECKED) ? "On" : "Off");
        res = aiot_mqtt_pub(mqtt_handle, pub_topic, (uint8_t *)pub_payload, (uint32_t)strlen(pub_payload), 0);
        if (res < 0)
        {
            printf("aiot_mqtt_sub failed, res: -0x%04X\n", -res);
            return -1;
        }
    }
}

static void smarthome_door_btn_cb(lv_event_t *e)
{
    int res;
    char *pub_payload = "{\"door\":2}";

    lv_event_code_t code = lv_event_get_code(e);
    lv_obj_t *obj = lv_event_get_target(e);
    if (code == LV_EVENT_VALUE_CHANGED)
    {
        LV_UNUSED(obj);
        LV_LOG_USER("State: %s\n", lv_obj_has_state(obj, LV_STATE_CHECKED) ? "On" : "Off");
        res = aiot_mqtt_pub(mqtt_handle, pub_topic, (uint8_t *)pub_payload, (uint32_t)strlen(pub_payload), 0);
        if (res < 0)
        {
            printf("aiot_mqtt_sub failed, res: -0x%04X\n", -res);
            return -1;
        }
    }
}

static void smarthome_beep_btn_cb(lv_event_t *e)
{
    int res;
    char *pub_payload = "{\"beep\":3}";

    lv_event_code_t code = lv_event_get_code(e);
    lv_obj_t *obj = lv_event_get_target(e);
    if (code == LV_EVENT_VALUE_CHANGED)
    {
        LV_UNUSED(obj);
        LV_LOG_USER("State: %s\n", lv_obj_has_state(obj, LV_STATE_CHECKED) ? "On" : "Off");
        res = aiot_mqtt_pub(mqtt_handle, pub_topic, (uint8_t *)pub_payload, (uint32_t)strlen(pub_payload), 0);
        if (res < 0)
        {
            printf("aiot_mqtt_sub failed, res: -0x%04X\n", -res);
            return -1;
        }
    }
}

void ui_smarthome_create_contrl_switch(void)
{
    lv_obj_t *light_sw;
    light_sw = lv_switch_create(lv_scr_act());
    lv_obj_set_size(light_sw, 60, 40);
    lv_obj_align(light_sw, LV_ALIGN_TOP_LEFT, 240, 80);
    lv_obj_add_event_cb(light_sw, smarthome_light_btn_cb, LV_EVENT_ALL, NULL);

    lv_obj_t *door_sw;
    door_sw = lv_switch_create(lv_scr_act());
    lv_obj_set_size(door_sw, 60, 40);
    lv_obj_align(door_sw, LV_ALIGN_TOP_LEFT, 430, 80);
    lv_obj_add_event_cb(door_sw, smarthome_door_btn_cb, LV_EVENT_ALL, NULL);

    lv_obj_t *beep_sw;
    beep_sw = lv_switch_create(lv_scr_act());
    lv_obj_set_size(beep_sw, 60, 40);
    lv_obj_align(beep_sw, LV_ALIGN_TOP_LEFT, 240, 280);
    lv_obj_add_event_cb(beep_sw, smarthome_beep_btn_cb, LV_EVENT_ALL, NULL);

    lv_obj_t *air_slider = lv_slider_create(lv_scr_act());
    lv_bar_set_range(air_slider, 16, 30);
    lv_obj_set_size(air_slider, 10, 120);
    lv_obj_align(air_slider, LV_ALIGN_TOP_LEFT, 450, 290);
    lv_obj_add_event_cb(air_slider, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL);

    slider_label = lv_label_create(lv_scr_act());
    lv_label_set_text(slider_label, "16°C");
    lv_obj_align_to(slider_label, air_slider, LV_ALIGN_OUT_TOP_MID, 25, 65);
}

static void set_temp(void *bar, int32_t temp)
{
    lv_bar_set_value(bar, temp, LV_ANIM_ON);

    // 更新温度标签的文本
    if (temp_bar_label != NULL)
    {
        char temp_str[32];
        snprintf(temp_str, sizeof(temp_str), "%d°C", temp);
        lv_label_set_text(temp_bar_label, temp_str);
    }
}

static void set_light(void *bar, int32_t light)
{
    lv_bar_set_value(bar, light, LV_ANIM_ON);

    // 更新温度标签的文本
    if (light_bar_label != NULL)
    {
        char light_str[32];
        snprintf(light_str, sizeof(light_str), "%dlux", light);
        lv_label_set_text(light_bar_label, light_str);
    }
}

static void set_humi(void *arc, int32_t humi)
{
    lv_arc_set_value(arc, humi);

    // 更新温度标签的文本
    if (humi_arc_label != NULL)
    {
        char humi_str[32];
        snprintf(humi_str, sizeof(humi_str), "%d%%", humi);
        lv_label_set_text(humi_arc_label, humi_str);
    }
}

static void temp_update_callback(lv_timer_t *timer)
{
    // 读取新的温度值
    int32_t new_temp = (int32_t)g_sensor.temp_value;
    // printf("new_temp = %d\n", new_temp);
    int32_t cur_temp = lv_bar_get_value(temp_bar);
    // printf("cur_temp = %d\n", cur_temp);

    // 更新动画的目标值
    lv_anim_set_values(&temp_anim, cur_temp, new_temp);

    // 启动动画
    lv_anim_start(&temp_anim);
}

static void light_update_callback(lv_timer_t *timer)
{
    int32_t new_light = (int32_t)g_sensor.light_value;
    // printf("new_light = %d\n", new_light);
    // // 检查light_bar对象是否有效
    // if (light_bar == NULL) {
    //     printf("Error: light_bar is NULL\n");
    //     return;
    // }

    int32_t cur_light = lv_bar_get_value(light_bar);
    // printf("cur_light = %d\n", cur_light);

    // 更新动画的目标值
    lv_anim_set_values(&light_anim, cur_light, new_light);

    // 启动动画
    lv_anim_start(&light_anim);
}

static void humi_update_callback(lv_timer_t *timer)
{
    int32_t new_humi = (int32_t)g_sensor.humi_value;
    printf("new_humi = %d\r\n", new_humi);
    if (humi_arc == NULL)
    {
        printf("Error: humi_arc is NULL\n");
        return;
    }
    int32_t cur_humi = lv_arc_get_value(humi_arc);
    printf("cur_humi = %d\r\n", cur_humi);

    // 更新动画的目标值
    lv_anim_set_values(&humi_anim, cur_humi, new_humi);
    lv_anim_start(&humi_anim);
}

void create_temp_update_timer(void)
{
    lv_timer_create(temp_update_callback, 5000, NULL); // 每5秒更新一次
}

void create_light_update_timer(void)
{
    lv_timer_create(light_update_callback, 5000, NULL); // 每5秒更新一次
}

void create_humi_update_timer(void)
{
    lv_timer_create(humi_update_callback, 5000, NULL); // 每5秒更新一次
}

void ui_smarthome_create_rec_data(void)
{
    /* 1.温度计UI */
    static lv_style_t temp_scr_act;
    lv_style_init(&temp_scr_act);
    lv_style_set_bg_opa(&temp_scr_act, LV_OPA_COVER);
    lv_style_set_bg_color(&temp_scr_act, lv_palette_main(LV_PALETTE_RED));

    temp_bar = lv_bar_create(lv_scr_act());
    lv_obj_add_style(temp_bar, &temp_scr_act, LV_PART_INDICATOR);
    lv_obj_set_size(temp_bar, 20, 150);
    lv_obj_align(temp_bar, LV_ALIGN_TOP_LEFT, 600, 90);
    lv_bar_set_range(temp_bar, 0, 40);

    // 动画设置
    lv_anim_init(&temp_anim);
    lv_anim_set_exec_cb(&temp_anim, (lv_anim_exec_xcb_t)set_temp);
    lv_anim_set_time(&temp_anim, 1000); // 动画时间1秒
    lv_anim_set_var(&temp_anim, temp_bar);
    lv_anim_set_repeat_count(&temp_anim, 0); // 只执行一次

    LV_IMG_DECLARE(img_temp_48);
    lv_obj_t *temp_img = lv_img_create(lv_scr_act());
    lv_img_set_src(temp_img, &img_temp_48);
    lv_obj_align_to(temp_img, temp_bar, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
    lv_obj_set_size(temp_img, 48, 48);

    temp_bar_label = lv_label_create(lv_scr_act());
    lv_label_set_text(temp_bar_label, "0°C");
    // 创建一个样式并设置字体大小
    static lv_style_t temp_label_style;
    lv_style_init(&temp_label_style);
    lv_style_set_text_font(&temp_label_style, &lv_font_montserrat_24); // 设置字体
    // 将样式应用到标签
    lv_obj_add_style(temp_bar_label, &temp_label_style, LV_PART_MAIN);
    // 对齐标签到温度条
    lv_obj_align_to(temp_bar_label, temp_bar, LV_ALIGN_OUT_TOP_MID, 0, 0);
    // 创建定时器更新温度
    create_temp_update_timer();

    /* 2.亮度计UI */
    static lv_style_t light_scr_act;
    lv_style_init(&light_scr_act);
    lv_style_set_bg_opa(&light_scr_act, LV_OPA_COVER);
    lv_style_set_bg_color(&light_scr_act, lv_palette_main(LV_PALETTE_YELLOW));

    light_bar = lv_bar_create(lv_scr_act());
    lv_obj_add_style(light_bar, &light_scr_act, LV_PART_INDICATOR);
    lv_obj_set_size(light_bar, 20, 150);
    lv_obj_align(light_bar, LV_ALIGN_TOP_LEFT, 680, 90);
    lv_bar_set_range(light_bar, 0, 200);

    lv_anim_init(&light_anim);
    lv_anim_set_exec_cb(&light_anim, (lv_anim_exec_xcb_t)set_light);
    lv_anim_set_time(&light_anim, 1000); // 动画时间1秒
    lv_anim_set_var(&light_anim, light_bar);
    lv_anim_set_repeat_count(&light_anim, 0); // 只执行一次

    LV_IMG_DECLARE(img_light_48);
    lv_obj_t *light_img = lv_img_create(lv_scr_act());
    lv_img_set_src(light_img, &img_light_48);
    lv_obj_align_to(light_img, light_bar, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
    lv_obj_set_size(light_img, 48, 48);

    light_bar_label = lv_label_create(lv_scr_act());
    lv_label_set_text(light_bar_label, "0lux");
    // 创建一个样式并设置字体大小
    static lv_style_t light_label_style;
    lv_style_init(&light_label_style);
    lv_style_set_text_font(&light_label_style, &lv_font_montserrat_24); // 设置字体
    // 将样式应用到标签
    lv_obj_add_style(light_bar_label, &light_label_style, LV_PART_MAIN);
    // 对齐标签到温度条
    lv_obj_align_to(light_bar_label, light_bar, LV_ALIGN_OUT_TOP_MID, 0, 0);
    create_light_update_timer();

    /* 3.湿度计UI */
    static lv_style_t humi_scr_act;
    lv_style_init(&humi_scr_act);

    // 创建一个圆弧对象
    humi_arc = lv_arc_create(lv_scr_act());
    lv_obj_add_style(humi_arc, &humi_scr_act, LV_PART_MAIN);
    lv_obj_set_size(humi_arc, 150, 150);                 // 设置圆弧的尺寸
    lv_obj_align(humi_arc, LV_ALIGN_TOP_LEFT, 580, 320); // 设置圆弧的位置
    lv_arc_set_range(humi_arc, 0, 100);                  // 设置圆弧的范围,比如0到100的亮度值
    lv_arc_set_bg_angles(humi_arc, 135, 45);             // 设置背景圆弧的角度范围
    lv_arc_set_angles(humi_arc, 0, 0);                   // 设置当前值的圆弧角度
    lv_arc_set_value(humi_arc, 0);
    lv_obj_remove_style(humi_arc, NULL, LV_PART_KNOB); /*Be sure the knob is not displayed*/

    // 设置指示器样式
    static lv_style_t arc_indicator_style;
    lv_style_init(&arc_indicator_style);
    lv_style_set_line_color(&arc_indicator_style, lv_palette_main(LV_PALETTE_YELLOW)); // 设置线条颜色为黄色
    lv_style_set_line_width(&arc_indicator_style, 8);                                  // 设置线条宽度
    lv_obj_add_style(humi_arc, &arc_indicator_style, LV_PART_INDICATOR);               // 将指示器样式应用到圆弧

    LV_IMG_DECLARE(img_humi_48);
    lv_obj_t *humi_img = lv_img_create(lv_scr_act());
    lv_img_set_src(humi_img, &img_humi_48);
    lv_obj_align_to(humi_img, humi_arc, LV_ALIGN_OUT_BOTTOM_MID, 0, -40);
    lv_obj_set_size(humi_img, 48, 48);

    humi_arc_label = lv_label_create(lv_scr_act());
    lv_label_set_text(humi_arc_label, "0%");
    static lv_style_t humi_label_style;
    lv_style_init(&humi_label_style);
    lv_style_set_text_font(&humi_label_style, &lv_font_montserrat_24); // 设置字体
    lv_obj_add_style(humi_arc_label, &humi_label_style, LV_PART_MAIN);
    lv_obj_align_to(humi_arc_label, humi_arc, LV_ALIGN_OUT_TOP_MID, 0, 75);

    // 设置动画
    lv_anim_init(&humi_anim);
    lv_anim_set_var(&humi_anim, humi_arc);
    lv_anim_set_exec_cb(&humi_anim, (lv_anim_exec_xcb_t)set_humi);
    lv_anim_set_time(&humi_anim, 1000);      // 动画时间1秒
    lv_anim_set_repeat_count(&humi_anim, 0); // 只执行一次
    create_humi_update_timer();
    printf("humi_arc created successfully: %p\n", (void *)humi_arc);
}

void ui_app_smarthome(void)
{
    // ui_app_clear_area();
    clear_area(0, 0, 800, 480, lv_color_hex(MY_UI_COLOR_DEEP_WHITE));
    ui_left_app_bar(20, 70);

    lv_obj_t *img = lv_img_create(lv_scr_act());
    lv_img_set_src(img, &img_smarthome_on);
    lv_obj_align(img, LV_ALIGN_TOP_LEFT, 32, 180);

    lv_obj_t *mid_label = lv_label_create(lv_scr_act());
    lv_label_set_text(mid_label, "SmartHome");
    static lv_style_t mid_label_style;
    lv_style_init(&mid_label_style);
    lv_style_set_text_font(&mid_label_style, &lv_font_montserrat_24);           // 设置字体
    lv_style_set_text_color(&mid_label_style, lv_color_hex(MY_UI_COLOR_BLACK)); // 设置字体颜色
    lv_obj_add_style(mid_label, &mid_label_style, LV_PART_MAIN);
    lv_obj_align(mid_label, LV_ALIGN_TOP_MID, 0, 20);

    ui_draw_contrl_bar(160, 70, "off", "light", &img_light, lv_color_hex(MY_UI_COLOR_WHITE));
    ui_draw_contrl_bar(350, 70, "off", "door", &img_door, lv_color_hex(MY_UI_COLOR_WHITE));
    ui_draw_contrl_bar(160, 270, "off", "beep", &img_beep, lv_color_hex(MY_UI_COLOR_WHITE));
    ui_draw_contrl_bar(350, 270, "off", "air", &img_kongtiao, lv_color_hex(MY_UI_COLOR_WHITE));

    ui_smarthome_create_contrl_switch();
    ui_smarthome_create_rec_data();
}

2.2.main函数

ui_app_smarthome()函数在ui_main.c中被调用,当用户点击其图片按钮,才会切换到此app下。

void ui_page_main(void)
{
    destroy_previous_objects();
    lv_obj_set_style_bg_color(lv_scr_act(), lv_color_hex(MY_UI_COLOR_DEEP_WHITE), LV_PART_MAIN);
    ui_left_app_bar(20, 70);
    if (app_index == UI_APP_YUNPINTAI)
    {
        ui_app_yunpintai();
    }
    else if (app_index == UI_APP_SMARTHOME)
    {
        ui_app_smarthome();
    }
    else if (app_index == UI_APP_CAMERA)
    {
        ui_app_camera();
    }
    else if (app_index == UI_APP_MUSIC)
    {
        ui_app_music();
    }
}

void *ds_ui_page_thread(void *args)
{
    ui_page_main();
    // setup_time_update();
    while (1)
    {
        lv_task_handler();
        usleep(5000);
    }
    return NULL;
}

3.结尾(附网盘链接)

链接:百度网盘 请输入提取码

提取码:2jia

--来自百度网盘超级会员V5的分享

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

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

相关文章

【电路笔记】-放大器失真

放大器失真 文章目录 放大器失真1、概述2、放大器因幅度失真而产生失真3、削波导致的幅度失真4、谐波引起的频率失真5、相位失真导致的放大器失真放大器失真可以采取许多形式,例如幅度、频率和相位失真,由于剪裁引起。 1、概述 放大器要正确运行且不产生输出信号失真,需要在…

跨境电商做独立站你需要考虑的几个问题

跨境电商卖家无论是做B2B还是B2C的&#xff0c;大部分卖家都是从平台开始做起&#xff0c;后面可能会都接触到独立站&#xff0c;但是说到独立站&#xff0c;相信很大部分的人都不了解&#xff0c;就拿最简单的问题来说&#xff0c;经常有人问&#xff0c;独立站和平台有什么区…

MATLAB(11)智能算法+BP神经网络

一、前言 在MATLAB中实现智能算法与BP神经网络的结合&#xff0c;需要分别编写智能算法的代码和BP神经网络的训练代码&#xff0c;并将两者整合起来。由于篇幅限制&#xff0c;我将提供一个简化的示例&#xff0c;使用遗传算法&#xff08;Genetic Algorithm, GA&#xff09;来…

《学会 SpringMVC 系列 · 返回值处理器》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

微调(二)

Selective类方法中的BitFit 它的核心思想是仅更新模型中的偏置项&#xff08;bias terms&#xff09;或部分偏置项&#xff0c;从而实现参数的稀疏更新。这种方法在小到中等规模的训练数据上表现出色&#xff0c;有时甚至能够超越全模型微调的性能。对于BERT模型&#xff0c;B…

【PGCCC】PostgreSQL 14 小版本分析,有那个版本不建议使用#PG中级

以下是对 PostgreSQL 14 各个小版本的详细分析&#xff0c;包括每个版本的主要变化、修复的 bug 和潜在的问题&#xff1a; PostgreSQL 14.0 发布日期&#xff1a;2021 年 9 月 30 日 主要变化&#xff1a; 增加了并行查询的改进&#xff0c;提升了性能。增强了 JSON 数据类…

美团2024年春招第一场笔试[测开方向],编程题+选择题详解,ACM式C++解法

编程题&选择题 编程题小美的平衡矩阵思路代码 小美的数组询问思路代码 验证工号思路代码 选择题1.在计算机网络中&#xff0c;端口号的作用是什么2.HTTPS协议通过使用哪些机制来确保通信的安全性3.Etag用于标识资源的唯一标识符&#xff0c;他可以用于4.在一个单道系统中&a…

乱弹篇(40)人类追求长寿

不要认为只有中国的老龄化才严重&#xff0c;实际上全球都面临老龄化&#xff0c;其中日本最为严重。 这是随着人类生活和医学水平的不断提高&#xff0c;寿命才会比过去数十年有了大幅度的提升。据资料显示&#xff0c;目前全球平均预期寿命估计为73岁。与百年之前相比&#…

DNS在架构中的使用

1 介绍 DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;是一种服务&#xff0c;它是域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使人更方便的访问互联网&#xff0c;而不用去记住能够被机器直接读取的IP地址数串。简单来说&#xff0c;DNS就是…

dpdk实现udp协议栈

使用DPDK实现UDP用户态协议栈&#xff0c;实现流程中包括&#xff1a; 三类线程 1、收发包线程 2、用户态协议栈线程 3、udp服务端线程 两类缓冲区&#xff1a; 1、协议栈收包缓冲区和协议栈发包缓冲区 2、udp收包缓冲区和udp发包缓冲区 协议栈缓冲区中存储的数据是str…

在线考试系统产品分析与技术实现的深度融合

在当今数字化教育浪潮中&#xff0c;在线考试系统作为教育信息化的重要组成部分&#xff0c;正以前所未有的速度改变着传统教育模式。它不仅打破了地域和时间的限制&#xff0c;提高了考试效率与公平性&#xff0c;还通过数据分析为教育决策提供了科学依据。本文旨在探讨在线考…

集装箱排柜系统介绍

1.功能介绍 用户导入产品基本信息表&#xff0c;每个货号代表一种货物&#xff0c;它放一个立方体中&#xff0c;此立方体称为托。 之后&#xff0c;用户导入订单表&#xff0c;其中的货号是顾客订购的货物。 用户选好目的港、集装箱类型等信息&#xff0c;集装箱排柜系统开始计…

解锁AI潜能,引领智能新时代——《深度强化学习》

在人工智能的浪潮中&#xff0c;深度强化学习如同一股不可忽视的强流&#xff0c;正以前所未有的速度推动着科技的边界&#xff0c;引领我们进入一个充满无限可能的新时代。这本《深度强化学习》不仅是一部技术宝典&#xff0c;更是一场关于智能探索与梦想实现的深度对话&#…

太阳能光伏气象站:绿色能源与气象科技

在追求可持续发展的道路上&#xff0c;太阳能光伏气象站以其独特的创新设计&#xff0c;成为了绿色能源与气象科技融合的典范。这款设备不仅利用太阳能作为清洁能源供电&#xff0c;还集成了先进的气象监测技术&#xff0c;为光伏发电提供了精准的环境数据支持。 太阳能光伏气象…

无缝融入,即刻智能[1]:MaxKB知识库问答系统,零编码嵌入第三方业务系统,定制专属智能方案,用户满意度飙升

无缝融入,即刻智能[1]:MaxKB知识库问答系统,零编码嵌入第三方业务系统,定制专属智能方案,用户满意度飙升 1.简介 MaxKB(Max Knowledge Base)是一款基于 LLM 大语言模型的开源知识库问答系统, 官方网址:https://maxkb.cn/ GitHub:https://github.com/1Panel-dev/MaxKB…

pycharm如何查看git历史版本变更信息

通过名字查看不同版本 查看版本不同地方

Django REST Framework(十五)路由Routes

如何在Django REST framework中利用SimpleRouter和DefaultRouter来高效生成视图集的路由信息,并详细解释如何使用action装饰器为视图集中的自定义方法生成路由 1.路由的定义规则 路由称为URL(Uniform Resource Locator,统一资源定位符),也可以称为URLconf,是对可以从互联…

【xss-labs-master】靶场通关详解!-----持续更新

XSS基础概念&#xff1a; 跨站脚本攻击XSS(Cross Site Scripting)&#xff0c;为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆&#xff0c;故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码&#xff0c;当用户浏览该页之时&#xff0c;嵌入其…

在线考试系统产品源码功能架构与技术解析

首先&#xff0c;它极大地提升了考试的便捷性和效率&#xff0c;使得教育机构、企业乃至个人能够随时随地组织考试&#xff0c;打破了传统考试在时间和空间上的限制。其次&#xff0c;通过自动化的评分和数据分析功能&#xff0c;在线考试系统能够迅速反馈考试结果&#xff0c;…

vim列编辑模式

在编辑文本时&#xff0c;经常会有这样的需求&#xff0c;对特定列进行进行批量编辑。比如批量注释一段代码&#xff0c;或者删除待定字符&#xff08;如一列空格&#xff09;。幸运的是VIM支持列编辑模式。 假设文本内容&#xff1a; Maximum length of a custom vocabulary…