【开源】嵌入式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.结尾(附网盘链接) 1.简介 此文章并不是教程,只能当作笔者的学习分享,只会做一些简单的介绍,其…...
百日筑基第四十二天-JDK版本梳理
百日筑基第四十二天-JDK版本梳理 JDK 10 JDK 10 是 Java SE 10 平台的开源参考实现,由 Java Community Process 中的 JSR 383 定义。 JDK 10 于 2018 年 3 月 20 日全面上市。Oracle 提供 GPL 下的生产就绪二进制文件;其他供应商的二进制文件也将很快…...
JS-04.基础语法-数据类型
JS中分为:原始类型和引用类型 1.原始类型: number:数字(整数、小数、NaN(Not a Number) string:字符串,单双引皆可 boolean:布尔。true,false null:对象为空 undefined&a…...
4658. 质因数个数、197. 阶乘分解、模板题【线性筛求积性函数】(数论练习题)
目录 4658. 质因数个数 题目描述 运行代码 代码思路 197. 阶乘分解 题目描述 运行代码 代码思路 其他代码 代码思路 模板题【线性筛求积性函数】 题目描述 编辑 运行代码 代码思路 4658. 质因数个数 题目描述 4658. 质因数个数 - AcWing题库 运行代码 #in…...
git项目关联多个远程仓库的使用
在实际项目中我们会有遇到一个项目关联多个远程仓库的情况,下面给大家简单说明下如何关联、使用。 一、使用git remote -v 查看项目的远程关联情况 如果只有一个的话 默认是origin git remote -v二、添加远程仓库关联 // test1 则是你自定义的名称 git remote ad…...
茂睿芯比较火的一款DCDC电源选型参考4.5V~100V的MK9019,3A峰值输出
DCDC电源的工作原理主要涉及到直流电到直流电的转换,其核心在于通过开关模式将输入的直流电压转换为所需的输出电压。这种转换通常通过脉冲宽度调制(PWM)技术实现,通过控制开关管的导通和截止时间,从而调节…...
尚硅谷谷粒商城项目笔记——三、安装docker【电脑CPU:AMD】
三、安装docker 注意: 因为电脑是AMD芯片,自己知识储备不够,无法保证和课程中用到的环境一样,所以环境都是自己根据适应硬件软件环境重新配置的,这里的虚拟机使用的是VMware。 首先关闭防火墙和安全策略 systemctl…...
6.C基础_输入输出函数
putchar 功能:输出一个字符 函数声明: int putchar(int c);返回值:参数c的ASCLL码值 c:要输出的字符,可以为字符常量、字符变量或表达式 注意点:输出的结果不带\n getchar 功能:从键盘读…...
【OpenHarmony4.1 之 U-Boot 2024.07源码深度解析】017 - init_sequence_f 各函数源码分析(一)
【OpenHarmony4.1 之 U-Boot 2024.07源码深度解析】017 - init_sequence_f 各函数源码分析(一) 一、setup_mon_len():配置 gd->mon_len 监控长度二、fdtdec_setup() :设备树初始化,配置 gd->fdt_blob 指向uboot镜像末尾的 device tree三、【RK3568未跑】trace_early…...
LeetCode 每日一题 2024/7/29-2024/8/4
记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录 7/29 682. 棒球比赛7/30 2961. 双模幂运算7/31 3111. 覆盖所有点的最少矩形数目8/1 LCP 40. 心算挑战8/2 3128. 直角三角形8/3 3143. 正方形中的最多点数8/4 572. 另一棵树…...
从C++看C#托管内存与非托管内存
进程的内存 一个exe文件,在没有运行时,其磁盘存储空间格式为函数代码段全局变量段。加载为内存后,其进程内存模式增加为函数代码段全局变量段函数调用栈堆区。我们重点讨论堆区。 托管堆与非托管堆 C# int a10这种代码申请的内存空间位于函…...
DjangoRF-14-创建request子应用
注意,本应该是requests模块,为了区分,避免错误,用request 1、进入apps,创建request django-admin startapp request 2、因为只发送请求,没有数据库相关,不需要model。 3、进行序列化 from rest_framework …...
数据结构: 单向链表
目录 一、链表的概念及结构 二、单链表的实现 2.1 头文件 2.2 各个功能的实现 2.2.1 内存申请 2.2.2 头插,尾插,头删,尾删 头插 尾插 头删 尾删 2.2.3 查找数据 2.2.4 指定位置前中后的数据增删 指定位置之前插入数据 指定位置之后插…...
【网络安全入门】学习网络安全必须知道的100 个网络基础知识_网络安全知识入门基础
什么是链接? 链接是指两个设备之间的连接。它包括用于一个设备能够与另一个设备通信的电缆类型和协议。 2 OSI 参考模型的层次是什么? 有 7 个 OSI 层:物理层,数据链路层,网络层,传输层,会话层,表示层…...
Android笔试面试题AI答之Activity(9)
文章目录 1.如何在Application中获取当前Activity实例 ?方法一:使用全局变量或单例方法二:使用LocalBroadcastManager或EventBus方法三:通过Fragment方法四:使用Service和Intent注意事项 2.Activity A跳转Activity B&a…...
系统大小写及Git大小写规则造成的问题
背景描述 项目在公司内部测试服务器上的运行一切顺利。然而,当将项目部署到客户现场时,部分功能突然出现了“文件未找到”的错误。这些错误并不是一开始就显现,而是在特定操作时才出现。经过排查,这些问题与操作系统的文件系统特…...
供应商管理:尽职调查的5步清单
在选择和引入新供应商的过程中,无论是对于初创企业还是成熟企业而言,都是一个关键的决策时刻,需要仔细尽职调查。然而,应当从供应商处收集哪些关键信息?如何确保这些信息的准确性和可靠性? 为此࿰…...
jvm方法返回相关指令ireturn,areturn,return等分析
正文 看图: 做的事情如下: 1:弹出当前的方法栈帧 2:获取上一个方法 3:从当前方法的操作数栈中获取执行结果,并推送到上一个方法的操作数栈中对应的伪代码: Override public void execute(Frame frame) {Thread thread frame.thread();Frame curren…...
OLAP知识地图思考(附地图)
OLAP知识地图思考(附地图) OLAP技术在当今数据驱动的时代具有举足轻重的地位。它的核心技术模块包括数据存储、计算引擎和查询语言等,这些模块的有效协同是实现高效数据分析的基础。然而,OLAP在运维方面面临着诸多挑战,…...
简单的docker学习 第3章 docker镜像
第3章 Docker 镜像 3.1镜像基础 3.1.1 镜像简介 镜像是一种轻量级、可执行的独立软件包,也可以说是一个精简的操作系统。镜像中包含应用软件及应用软件的运行环境。具体来说镜像包含运行某个软件所需的所有内容,包括代码、库、环境变量和配置文件等…...
怎么写进修总结汇报ppt?有这3个AI软件做PPT再也没烦恼!
在当今瞬息万变的职场环境中,持续学习和自我提升已不再是一种选择,而是生存和发展的必需。作为一种系统化的学习方式,进修为职场人士提供了宝贵的机会来更新知识储备、提升专业技能,并拓展职业视野。当然,进修的价值不…...
json-c mips 移植
1.下载 源码 json-c-json-c-0.13-20171207.zip 2. 解压交叉编译工具比如到/disk2 3. 编辑脚本文件setupevn.sh,内容如下: export TPATH_US/disk2/rtk-ms-2.0.0-linux-mips-3.18-4.8.5-u0.9.33-toolchain/bin export PATH$PATH:$TPATH_US 保存。 4. 执行命令 s…...
判断用户是否在pwa环境中打开运行?(已安装的 PWA 与未安装的 PWA 网站之间有什么区别?)以及pwa安装成功/失败的回调
前言: 👉vue3tsvite项目中使用vite-plugin-pwa搭建 PWA 项目,以及如何处理pwa安装图标的显示隐藏 👉pwa在iframe下能否显示,以及在iframe下相关问题解析 如何判断用户是否在pwa环境中运行? 根据pwa配置的display-mo…...
汇编语言入门基础(概述)
目录 概述: 1.1 汇编语言与汇编指令 1.2 汇编语言编写程序的工作过程 1.3 数据的表示 1.4 计算机中的存储单元 1.5 计算机中的总线 1.5.1 三种总线 1.5.2 x86CPU性能一览 1.6 内存的读写与地址空间 1.6.1 CPU对存储器的读写 1.6.2 内存地址空间 1.6.3 内存地址空间…...
Sun Frame:基于 SpringBoot 的轻量级开发框架(个人开源项目)
文章目录 🌞 Sun Frame:基于 SpringBoot 的轻量级开发框架(个人开源项目)🚀 欢迎使用 Sun Frame🌟 项目亮点📦 模块结构🌐 Sun-Cloud📦 Sun-Common 💡 示例与…...
JVM知识总结(垃圾收集算法)
文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 垃圾收集算法 分代收集理论 分代思想就是将堆分为新生代和老年代…...
Visual Studio 2022社区版、专业版、企业版功能对比表
https://visualstudio.microsoft.com/zh-hans/vs/compare/...
机器学习用python还是R,哪个更好?
1. 简介 1.1. 概述 机器学习是一种人工智能的分支,它允许计算机系统通过对大量数据进行学习来改进性能,而无需显式地进行编程。机器学习的目标是让计算机模拟人类学习过程,从而实现自主学习和预测。 机器学习主要分为三种类型:监督学习、无监督学习和强化学习。 监督学习…...
【计算机方向】五本计算机SCI神刊!“又好又水”,国人占比高,妥妥毕业宝刊!
本期将为您带来五本计算机SCI 妥妥毕业神刊! Journal of Mechanisms and Robotics-Transactions of the ASME Swarm Intelligence International Journal of Advanced Robotic Systems ROBOTICA Industrial Robot-The International Journal…...
【Java题解】杨辉三角—力扣
🎉欢迎大家收看,请多多支持🌹 🥰关注小哇,和我一起成长🚀个人主页🚀 ⭐目前主更 专栏Java ⭐数据结构 ⭐已更专栏有C语言、计算机网络⭐ 题目链接:杨辉三角 目录👑 ⭐题…...
sed 简易使用指南
sed 简易使用指南 1 sed 介绍2 查找3 替换4 反向引用5 删除6 cai(菜) 导言: 笔者之前花了较多时间学习并整理了sed命令相关的内容,以及一些进阶内容。但是,到后来使用也就只记得那么几个简单的选项,再高级的…...
VSCode在windows系统下使用conda虚拟环境配置
如何解决CondaError: Run ‘conda init‘ before ‘conda activate‘_condaerror: run conda init before conda activat-CSDN博客 首先检查自己的anaconda是否是添加到整个的环境变量里了 打开cmd如果conda和python都能够识别那么就是配置成功了 然后看插件是否安装…...
【C++】—— 类与对象(三)
【C】—— 类与对象(三) 4、拷贝构造函数4.1、初识拷贝构造4.1.1、为什么要传引用4.1.2、引用尽量加上 const 4.2、深入拷贝构造4.2.1、为什么要自己实现拷贝构造4.2.2、传值返回先调用拷贝构造的原因4.2.3、躺赢的 MyQueue4.2.4、传值返回与引用返回 4.…...
使用Variadic Templates(可变参数模板)实现max以及min
最近学习了C2.0版本的一些新的特性,利用Variadic Templates(可变参数模板)实现支持多个参数的max函数。 语言环境 Dev-C 5.11 并需要自己的环境是支持C11的,例如:Dev-C 5.11可以通过以下步骤进行修改: 源码 #inc…...
科技云报道:大模型引领技术浪潮,AI安全治理面临“大考”
科技云报道原创。 从文生文到文生图,再到文生视频,近年来,以ChatGPT、Sora等为代表的大模型引领了全球人工智能技术与产业的新一轮浪潮。2024年更是被业内称为大模型应用爆发元年。 年初,Sora横空出世验证了Scalling Law在视频生…...
分享一个基于微信小程序的旅游自助拼团系统(源码、调试、LW、开题、PPT)
💕💕作者:计算机源码社 💕💕个人简介:本人 八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流&…...
21 mysql绿色安装版
2024/8/5 MySQL绿色安装版 #清空/etc目录下的my.confls -l /etc/my.cnf rm -rf /etc/my.cnfyum -y remove mariadb find / -name "*mysql*" -exec rm -rf {} \; 将MySQL压缩包拉拽到机器里tar -xvf mysql-8.0.33-linux-glibc2.12-x86_64.tartar -xf mysql-8.0.33-…...
Java 常用API基础
目录 Java 编程基础:字符串与集合的使用 1. 字符串的比较 1.1 使用运算符 1.2 使用equals方法 1.3 总结 2. 使用集合存储对象 2.1 定义电影类 2.2 使用ArrayList存储电影对象 2.3 总结 String类示例 ArrayList类示例 Java 编程基础:字符串与集合的使…...
Python pygame 游戏开发 系列文章 七
Pygame是一个开源的跨平台的Python多媒体库,用于开发2D游戏和多媒体应用程序。它基于Simple DirectMedia Layer(SDL)库,提供了一系列用于图形、音频和输入处理的函数和类。Pygame能够使用硬件加速,使得游戏开发更加高效…...
微信小程序教程011-:2:京西购物商城实战之TabBar实现
2、tabBar 2.0 创建tabBar分支 运行如下命令,基于master分支,创建本地tabBar子分支,用来开发和tabBar相关的功能 git checkout -b tabbar2.1 创建tabBar页面 在pages目录中,创建首页(home)、分类(cate)、购物车(cart)、我的(my)这4个tabBar页面,在HBuilderX中…...
html实现好看的塔罗牌、十二星座运势网站源码
文章目录 1.设计来源1.1 十二星座1.2 所有界面效果图 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板,程序开发,在线开发,在线沟通 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/deta…...
华清IOday7 24-8-5
文章目录 使用有名管道实现,一个进程用于给另一个进程发消息,另一个进程收到消息后,展示到终端上,并且将消息保存到文件上一份使用有名管道实现两个进程间相互通信 使用有名管道实现,一个进程用于给另一个进程发消息&a…...
【Linux】网络基础_3
文章目录 十、网络基础5. socket编程socket 常见APIsockaddr结构简单的UDP网络程序 未完待续 十、网络基础 5. socket编程 socket 常见API // 创建 socket 文件描述符 (TCP/UDP, 客户端 服务器) int socket(int domain, int type, int protocol);// 绑定端口号 (TCP/UDP, 服…...
低代码: 系统开发准备之确定一般开发流程,需求分析,复杂度分析,标准开发流程
概述 低代码系统开发之前,我们首先要进行一些准备我们首先知道我们软件开发的一般流程同时,我们还要知道,我们整个系统平台的需求如何之后,我们要基于需求进行设计,包含UI设计与系统架构设计 一般开发流程 系统开发…...
Java常见面试题-01-java基础
文章目录 面向对象的特征Java 的基本数据类型有哪些JDK、JRE、JVM 的区别重载和重写的区别Java 中和 equals 的区别String、StringBuffer、StringBuilder 三者之间的区别接口和抽象类的区别是什么string 常用的方法有哪些什么是单例模式?有几种?什么是反…...
白骑士的PyCharm教学进阶篇 2.2 高级调试技术
系列目录 上一篇:白骑士的PyCharm教学进阶篇 2.1 高效编码技巧 在Python开发中,调试是一个非常重要的环节。PyCharm作为一款功能强大的IDE,不仅提供了基本的调试功能,还包含了许多高级调试工具与技巧。本篇将详细介绍这些高级调试…...
【隐私计算篇】混淆电路之深入浅出
入门隐私计算的阶段,一般都会涉及对于混淆电路的学习,这是因为混淆电路是多方安全计算中的基础密码原语,也是隐私保护中重要的技术。为了帮助更好地理解混淆电路的原理,今天对其进行原理以及相关优化手段进行解析和分享。 1. 混淆…...
ubuntu下Xsens_MTi_300传感器的python驱动安装
这里写自定义目录标题 安装python的Xsens_MTi传感器驱动配置序列号修改传感器权限永久修改传感器权限 运行传感器示例安装IMU上位机 安装python的Xsens_MTi传感器驱动 Xsens_MTi_Serial_Readergithub #安装驱动 git clone https://github.com/xsens/xsens_mt.git cd ~/xsens_…...
基于Java和Mysql的多人命题系统
你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。 开发语言:Java 数据库:MySQL 技术:B/S架构、SSM框架 工具:Eclipse开发工具 系统展示 首页 管理员界面 教师管理界面 学生…...
去中心化社交:探讨Facebook在区块链平台上的实践
随着区块链技术的崛起,社交平台也面临着前所未有的变革。作为全球最大的社交平台之一,Facebook(现名Meta Platforms)正在积极探索如何将区块链技术融入其平台,以引领去中心化社交的新时代。本文将从不同角度探讨Facebo…...