当前位置: 首页 > news >正文

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

目录

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的分享

相关文章:

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

目录 1.简介 1.1功能介绍 1.2技术栈介绍 1.3演示视频 1.4硬件介绍 2.软件设计 2.1智能家居UI设计 2.2.main函数 3.结尾&#xff08;附网盘链接&#xff09; 1.简介 此文章并不是教程&#xff0c;只能当作笔者的学习分享&#xff0c;只会做一些简单的介绍&#xff0c;其…...

CUDA常见编译器配置问题一览

CUDA常见编译器配置问题一览 关注TechLead&#xff0c;复旦博士&#xff0c;分享云服务领域全维度开发技术。拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff0c;复旦机器人智能实验室成员&#xff0c;国家级大学生赛事评审专家&#xff0c;发表多篇SCI核心期刊…...

【Android】系统级应用升级后的安装位置

系统级应用的安装位置一般在codePath/system 下面&#xff0c; 如果手动的去进行adb install覆盖安装&#xff0c;通过dumpsys package可以发现是安装在/data/app/里&#xff0c; 如果是通过标准的系统升级方式呢&#xff1f; 这里我们来通过升级查看一下&#xff0c; 升级…...

uniapp 使用renderjs通信

一、 server层向renderjs传值&#xff0c;并初始化renderjs prop&#xff1a;可以随便定义 renderTaskDetail&#xff1a;是传往renderjs的数据 change:prop&#xff1a;prop和必须上面prop字段一样 renderScript.initAmap&#xff1a;【 renderScript】需要renderjs 中scr…...

PostgreSQL 15

一、安装前的准备 1、版本信息 操作系统CentOS 7.9.2009PostgreSQL 版本PostgreSQL 15-15.7 2、下载安装包 RPM Chart - PostgreSQL YUM Repositoryhttps://yum.postgresql.org/rpmchart/进入官网&#xff0c;找到相应版本 点击框选内容 依次进入下载页面&#xff0c;下载相…...

给本地设备搭建一个云端语音助手

概述 本语音助手实现了从关键词唤醒 (KWS) 到语音识别 (ASR) 再到自然语言理解 (NLU) 的完整流程。该系统可以通过监听用户的音频输入,检测指定的关键词,并将用户的语音转换为文本,最后与预设的命令进行匹配,执行相应的操作(具体实现请参考main.py),为你的设备配置远程…...

yolov5车辆类型识别TXT数据集

YOLOV5训练车辆类型识别TXT数据集&#xff0c; 一共1400张图片&#xff0c;共分7个类別&#xff0c; 分别为Bus&#xff0c;Car&#xff0c;SportsCar&#xff0c;MicroBus&#xff0c;Truck&#xff0c;SUV&#xff0c;Jeep是TXT格式的数据集&#xff0c;用LabelImg工具进行标…...

day22(mysql数据库主从搭建)

上午&#xff1a; 1、为mysql添加开机启动chkconfig 2、编辑配置文件my.cnf 3、修改环境变量 4、mysql角色授权 角色不生效 在配置文件中不添加activate_all_roles_on_loginon glibc安装&#xff0c;my.cnf在项目目录之下 rpm安装&#xff0c;my.cnf文件在/etc/my.cnf 5、自…...

返璞归真:通过简化用例来简化用户界面01

Larry Constantine 著harvey 译 我们常被问及精简那些最简化、抽象和通用窗体用例的重要性。到底有多重要呢&#xff1f;在以用户为 中心的设计中&#xff0c;简化那些重要窗体的用例是获得成功的关键。它能够为开发者设计优秀的用户界面 助一臂之力。通过消除不必要的或技术驱…...

书生大模型学习笔记2 - Python

Python实现wordcount 请实现一个wordcount函数&#xff0c;统计英文字符串中每个单词出现的次数。返回一个字典&#xff0c;key为单词&#xff0c;value为对应单词出现的次数。 解题思路&#xff1a;首先把字母转小写>然后把单词取出来去除标点>循环单词列表>key已存…...

JavaScript三级联动jQuery写法

HTML结构 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>三级联动</title><!-- <style…...

无人机挂载抓捕网

一、技术原理与机制 无人机挂载抓捕网装置的技术原理是通过无人机平台的飞行能力和灵活性&#xff0c;结合特制的抓捕网装置&#xff0c;实现对目标的快速、准确抓捕。抓捕网装置在接收到指令后&#xff0c;通过特定机制快速展开并包围目标&#xff0c;从而实现抓捕任务。 二…...

174.地下城游戏——LeetCode

题目 恶魔们抓住了公主并将她关在了地下城 dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里&#xff0c;他必须穿过地下城并通过对抗恶魔来拯救公主。 骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻…...

登录相关功能的优化【JWT令牌+拦截器+跨域】

登录相关功能的优化 登录后显示当前登录用户el-dropdown: Element - The worlds most popular Vue UI framework <el-dropdown style"float: right; height: 60px; line-height: 60px"><span class"el-dropdown-link" style"color: white;…...

向日葵没有显示器会卡住

前言 有一台机器【ubuntu20】&#xff0c;用于远程开发&#xff0c;使用向日葵时候&#xff0c;如果不接显示器是会卡住的。。。 显示屏是有限的&#xff0c;所以现在解决一下这个问题。 卡在登录界面 双击启动 由于Ubuntu默认显示管理器是gdm&#xff0c;而向日葵使用的是l…...

【机器学习西瓜书学习笔记——聚类】

机器学习西瓜书学习笔记【第九章】 第九章 聚类9.1 聚类任务9.2 性能度量两类指标 9.3距离计算基本性质属性有序属性无序属性 混合距离加权距离 9.4 原型聚类K-MEANS聚类算法步骤优势劣势 学习向量量化高斯混合聚类步骤难点例子EM思想的体现小结 9.5 密度聚类9.6 层次聚类 第九…...

MATLAB(8)深度变化模型

一、前言 在MATLAB中模拟深度变化模型通常依赖于具体的应用场景&#xff0c;比如海洋深度、地下水深度、地形高度变化等。由于“深度变化”可以涉及多种物理过程和数学模型&#xff0c;我将提供一个简化的示例&#xff0c;该示例模拟了一个基于时间变化的深度变化模型&#xff…...

mp3格式转换器哪个好用?汇总七款音频格式转换方法(无损转换)

音乐已经成为我们生活中不可或缺的一部分。但是在播放的时候&#xff0c;可能会遇到音频格式不兼容的情况。特别是在一些下载站或音乐平台获取的音频&#xff0c;有些特殊格式在播放器上无法正常播放&#xff0c;一般这种情况我们需要借助mp3转换器解决。 mp3是一种常见的数字音…...

移行前的复盘:CodeCommit 的重要地位分析

前言 截至7月28日&#xff0c;关于AWS CodeCommit的现状如下&#xff1a; 现有账号的现有存储库可以继续使用CodeCommit&#xff0c;不受限制。之前未使用过CodeCommit的账号&#xff08;或没有现有存储库的账号&#xff09;无法创建新的存储库。 这并不意味着CodeCommit的服…...

Java中等题-括号生成(力扣)

数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;["((()))","(()())","(())()","()(())","()()(…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...