嵌入式安防监控项目——exynos4412主框架搭建
目录
一、模块化编程思维
二、安防监控项目主框架搭建
一、模块化编程思维
其实我们以前学习32使用keil的时候就是再用模块化的思维。每个硬件都单独有一个实现功能的C文件和声明函数,进行宏定义以及引用需要使用头文件的h文件。
比如简单的加减乘除取余操作我们把他们每个都封装一个文件

但是他们每个文件里功能很少所以可以共用一个h文件common
二、安防监控项目主框架搭建

这是我们的整个架构的代码
buzzer和led都是板子上的外设,
transfer:是进行数据转换的
sqlite就是数据库之前学过的
refresh是刷新,我们上传的数据需要刷新到网页上
client request是客户端请求,从上往下发来的命令都由我们主机上的服务器处理
sms就是GPRS线程的程序可以打电话和发短信
#include <stdio.h> #include <pthread.h> #include <errno.h> #include <signal.h> #include <unistd.h> #include <sys/shm.h> #include <sys/sem.h> #include <sys/ipc.h> #include "data_global.h"void release_pthread_resource(int signo);extern pthread_mutex_t mutex_client_request,mutex_refresh,mutex_sqlite,mutex_transfer,mutex_sms,mutex_buzzer,mutex_led;extern pthread_cond_t cond_client_request,cond_refresh,cond_sqlite,cond_transfer,cond_transfer,cond_sms,cond_buzzer,cond_led;extern int msgid; extern int shmid; extern int semid;pthread_t id_client_request,id_refresh,id_sqlite,id_transfer,id_sms,id_buzzer,id_led; int main(int argc, const char *argv[]) {//pthread_mutex_init(&mutex_client_request,NULL);pthread_mutex_init(&mutex_refresh,NULL);pthread_mutex_init(&mutex_sqlite,NULL);pthread_mutex_init(&mutex_transfer,NULL);pthread_mutex_init(&mutex_sms,NULL);pthread_mutex_init(&mutex_buzzer,NULL);pthread_mutex_init(&mutex_led,NULL);signal (SIGINT, release_pthread_resource);pthread_cond_init(&cond_client_request,NULL);pthread_cond_init(&cond_refresh,NULL);pthread_cond_init(&cond_sqlite,NULL);pthread_cond_init(&cond_transfer,NULL);pthread_cond_init(&cond_sms,NULL);pthread_cond_init(&cond_buzzer,NULL);pthread_cond_init(&cond_led,NULL);pthread_create(&id_client_request, NULL,pthread_client_request,NULL); pthread_create(&id_refresh, NULL,pthread_refresh,NULL); pthread_create(&id_sqlite, NULL,pthread_sqlite,NULL); pthread_create(&id_transfer, NULL,pthread_transfer,NULL); pthread_create(&id_sms, NULL,pthread_sms,NULL); pthread_create(&id_buzzer, NULL,pthread_buzzer,NULL); pthread_create(&id_led, NULL,pthread_led,NULL); //pthread_join(id_client_request,NULL); printf ("pthread1\n");pthread_join(id_refresh,NULL); printf ("pthread2\n");pthread_join(id_sqlite,NULL); printf ("pthread3\n");pthread_join(id_transfer,NULL); printf ("pthread4\n");pthread_join(id_sms,NULL); printf ("pthread5\n");pthread_join(id_buzzer,NULL); printf ("pthread6\n");pthread_join(id_led,NULL); printf ("pthread7\n");return 0; }void release_pthread_resource(int signo) {pthread_mutex_destroy (&mutex_client_request); pthread_mutex_destroy (&mutex_refresh); pthread_mutex_destroy (&mutex_sqlite); pthread_mutex_destroy (&mutex_transfer); pthread_mutex_destroy (&mutex_sms); pthread_mutex_destroy (&mutex_buzzer); pthread_mutex_destroy (&mutex_led); pthread_cond_destroy (&cond_client_request);pthread_cond_destroy (&cond_refresh);pthread_cond_destroy (&cond_sqlite);pthread_cond_destroy (&cond_transfer);pthread_cond_destroy (&cond_sms);pthread_cond_destroy (&cond_buzzer);pthread_cond_destroy (&cond_led);pthread_detach(id_client_request);pthread_detach(id_refresh);pthread_detach(id_sqlite);pthread_detach(id_transfer);pthread_detach(id_sms);pthread_detach(id_buzzer);pthread_detach(id_led);printf("all pthread is detached\n");msgctl (msgid, IPC_RMID, NULL);shmctl (shmid, IPC_RMID, NULL);semctl (semid, 1, IPC_RMID, NULL);exit(0); }这是主函数,主函数其实就是一个进程,它创建了一堆线程来实现这些功能。
#include "data_global.h"//½ԊԚigBeeµŊɼ¯µÁ9ƽ̨µĴ«¸ц뽾void *pthread_transfer(void *arg) {printf("pthread_analysis\n");}transfer里面就是打印了一句话具体的功能还都没有实现。
#include "data_global.h"//:A9LED模块线程.
void *pthread_led(void *arg)
{printf("pthread_led\n");
#if 05. open(dev_led, )6. pthread_cond_wait (cond_led, );7. 获取dev_led_mask(控制标志)8. 通过ioctl()控制led
#endif
}
#include "data_global.h"//:A9·儹Ƿ¿ٖǏ߳ʮ
void *pthread_buzzer(void *arg)
{printf("pthread_buzzer\n");#if 0 1. open(dev_buzzer, )2. pthread_cond_wait (cond_buzzer, );3. »ev_buzzer_mask(¿ٖƱ떾)4. ͨ¹£¨£©¿ٖŢuzzer
#endif
}
#include "data_global.h"extern int msgid;
extern key_t key;extern pthread_mutex_t mutex_client_request,mutex_refresh,mutex_sqlite,mutex_transfer,mutex_analysis,mutex_sms,mutex_buzzer,mutex_led,mutex_camera;extern pthread_cond_t cond_client_request,cond_refresh,cond_sqlite,cond_transfer,cond_analysis,cond_sms,cond_buzzer,cond_led,cond_camera;extern char recive_phone[12] ;
extern char center_phone[12] ;struct msg msgbuf;//:处理消息队列里请求的线程.
void *pthread_client_request(void *arg)
{if((key = ftok("/tmp",'g')) < 0){perror("ftok failed .\n");exit(-1);}msgid = msgget(key,IPC_CREAT|IPC_EXCL|0666);if(msgid == -1) {if(errno == EEXIST){msgid = msgget(key,0777);}else{perror("fail to msgget");exit(1);}}printf("pthread_client_request\n");while(1){bzero(&msgbuf,sizeof(msgbuf));printf("wait form client request...\n");msgrcv (msgid, &msgbuf, sizeof (msgbuf) - sizeof (long), 1L, 0);printf ("Get %ldL msg\n", msgbuf.msgtype);printf ("text[0] = %#x\n", msgbuf.text[0]);switch(msgbuf.msgtype){case 1L:printf("hello led\n");break;case 2L:printf("hello beep\n");break;case 3L:printf("hello seg\n");break;case 4L:printf("hello fan\n");break;case 5L:printf("set env data\n");printf("temMAX: %d\n",*((int *)&msgbuf.text[1]));printf("temMIN: %d\n",*((int *)&msgbuf.text[5]));printf("humMAX: %d\n",*((int *)&msgbuf.text[9]));printf("humMAX: %d\n",*((int *)&msgbuf.text[13]));printf("illMAX: %d\n",*((int *)&msgbuf.text[17]));printf("illMAX: %d\n",*((int *)&msgbuf.text[21]));break;case 6L:case 7L:case 8L:case 9L:printf("ţ¿ʒԽ«֢ЩطΪ)չ4ѧϰ£¬¼ԓˮ\n");break;case 10L:{int i = 0 , j = 0 ;for(i = 0 ; i < 11; i++){recive_phone[i] = msgbuf.text[i]; }recive_phone[i] = '\0';printf("recive:%s\n",recive_phone);for(j = 0 ;msgbuf.text[i] != '\0' && j < 12; i++, j++){center_phone[j] = msgbuf.text[i];}center_phone[j] = '\0';printf("center:%s\n",center_phone);#if 0pthread_mutex_lock (&mutex_slinklist);sqlite_InsertLinknode (ENV_UPDATE, all_info_RT, sto_no, 0);//0,0分别是仓库号和货物种类号pthread_mutex_unlock (&mutex_slinklist);pthread_cond_signal (&cond_sqlite);#endif }break;default:break;}}}#if 0long msgtype;//¾ࠌ嶄лϢ`элϢ`эµķׅ䣺1L: LED¿ٖ 2L: ·儹Ƿ¿ٖ 3L: ̄·LEDµDŽ£ŢµŊ4L: ·芈5L: ςʪ¶ɗʨ׃6L-7L-8L-9L,ԃԚ¸ŀ©չ10L: 3Gͨхģ¿笇PRS switch(msgbuf.msgtype){case 1L: ... break;....default .... break;}
#endif
这些线程都还没有具体实现功能这就是一个框架
两种意识:1、分层意识2、数据流*****************************************************
分层分析:
##################
web网页端显示部分: 环境信息 === 实时刷新环境数据摄像头采集图像 === 采集监控信息硬件控制 === 下发要去控制的命令
A9数据处理部分创建进程、线程每条线程做自己的事情涉及到进程间通信数据处理===>分发(上行数据 or 下行数据)
A9-ZigBee数据采集部分A9采集部分ZigBee采集部分(STM32平台(可以自己扩展))
*****************************************************
数据流分析:
##################数据上传:数据下发:制定通信的协议(结构体):数据要怎么上传,上传的目的是为了什么?数据要怎么下发,下发的目的又是为了什么?数据的上传: ====> 共享内存上传数据 ====> 显示并交给用户查看环境信息数据的下发用于控制硬件:====> 消息队列下发数据 ===> 控制硬件改变环境**************************************************************************分层分析:
web网页端显示部分: 环境信息: adc电压数据mpu6050的六轴数据温度湿度摄像头采集图像:硬件控制: 风扇LED灯蜂鸣器GPRS ==== 发短信或打电话A9数据处理部分数据流向分析:1、ZigBee(采集终端)-->A9(处理平台)2、A9(处理平台)-->网页(显示平台)3、网页(显示平台)-->A9(处理平台)4、A9(处理平台)--->ZigBee(采集终端)A9-ZigBee采集部分外设驱动 --------在应用层去获取外设的状态或数据
A9--------- 蜂鸣器 ------------------蜂鸣器报警LED灯 ------------------卧室-厕所-楼道-公共照明 --------LED2-LED3-LED4-LED5按键 ------------------按键触发中断---控制卧室和厕所灯-----LED2-LED3 ADC -----------------获取ADC的采样数据mpu6050 ------------------获取MPU6050的六轴数据zigbee------adc ------主---协调器风扇 ------从---终端节点 下发命令控制风扇温湿度 ------从---终端节点 上传温湿度数据(光敏)小结: | | | || ZigBee | A9 | web || | | || adc | 蜂鸣器 | 环境信息:-----------------adc电压数据| 风扇 | LED灯 | 摄像头采集:-----usb摄像头 mpu6050的六轴数据| 温湿度 | 按键 | 硬件控制: |------风扇 温度| (光敏) | ADC | | LED灯 湿度mpu6050 蜂鸣器四路led灯模拟数码管 GPRS四路led灯模拟数码管 数据流分析:数据上传: ZigBee | 温湿度数据 |A9 |ADC采集 |-----------上传这些数据加速计数据 |陀螺仪数据 |摄像头 |视频流图像 |数据下发: ZigBee: |风扇 |A9: |蜂鸣器 |-----打开设备节点控制硬件LED灯 |四路LED灯模拟的数码管 |GPRS: |3G通信模块 |#define GPRS_DEV "/dev/ttyUSB0"#define ZIGBEE_DEV "/dev/ttyUSB1"#define BEEPER_DEV "/dev/fsbeeper0"#define LED_DEV "/dev/fsled0"制定通信的结构体:数据的上传: 数据类型定义: typedef uint8_t unsigned char; =======参考:typedef uint16_t unsigned short;typedef uint32_t unsigned int;//考虑到内存对齐的问题struct makeru_zigbee_info{uint8_t head[3]; //标识位: 'm' 's' 'm' makeru-security-monitor uint8_t type; //数据类型 'z'---zigbee 'a'---a9------------->crc ...加密算法 <--------------float temperature; //温度float humidity; //湿度float tempMIN;//温度下限float tempMAX;//温度上限 float humidityMIN; //湿度下限float humidityMAX; //湿度上限uint32_t reserved[2]; //保留扩展位,默认填充0//void *data; 内核预留的扩展接口 参考版};struct makeru_a9_info{uint8_t head[3]; //标识位: 'm' 's' 'm' makeru-security-monitor uint8_t type; //数据类型 'z'---zigbee 'a'---a9uint32_t adc;short gyrox; //陀螺仪数据short gyroy;short gyroz;short aacx; //加速计数据short aacy;short aacz;uint32_t reserved[2]; //保留扩展位,默认填充0//void *data; 内核预留的扩展接口 参考版};struct makeru_env_data{struct makeru_a9_info a9_info; struct makeru_zigbee_info zigbee_info;};//所有监控区域的信息结构体struct env_info_client_addr{struct makeru_env_data monitor_no[MONITOR_NUM]; //数组 老家---新家};数据的下发:(采用消息队列的方式下发数据到下位机上) 数据的下发用于控制硬件: man msgsnd #include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);消息队列用于通信的结构体: 包括数据类型和数据将消息队列封装成函数,直接通过参数传递的方式来发送信息: int send_msg_queue(long type,unsigned char text){struct msg msgbuf;msgbuf.type = 1L;msgbuf.msgtype = type; //具体的消息类型msgbuf.text[0] = text; //控制命令字 if(msgsnd(msgid,&msgbuf,sizeof(msgbuf) - sizeof(long),0) == -1){perror("fail to msgsnd type2");exit(1);}return 0;}struct msgbuf {long mtype; /* message type, must be > 0 */char mtext[1]; /* message data */};//消息队列结构体#define QUEUE_MSG_LEN 32 struct msg{long type; //从消息队列接收消息时用于判断的消息类型 ==== 暂时不用 1L===home1 2L===home2 ... long msgtype;//具体的消息类型 === 指代控制的设备,是什么类型的设备unsigned char text[QUEUE_MSG_LEN];//消息正文 ====> CMD 控制指定的设备};long msgtype;//具体的消息类型消息类型的分配:1L: LED控制2L: 蜂鸣器控制3L: 四路LED灯模拟的数码管4L: 风扇5L: 温湿度最值设置6L-7L-8L-9L,用于个人的扩展10L: 3G通信模块-GPRS switch(msgbuf.msgtype){case 1L: ... break;....default .... break;}控制命令的制定:消息队列接收消息:msgrcv (msgid, &msgbuf, sizeof (msgbuf) - sizeof (long), 1L, 0);解析buf中的数据:printf ("Get %ldL msg\n", msgbuf.msgtype);printf ("text[0] = %#x\n", msgbuf.text[0]);A9-ZIGBEE通用指令命令格式:一个字节,unsigned char 对应消息队列中正文的类型: unsigned int 8位----------------------------------------7 6 | 5 4 | 3 2 1 0平台编号| 设备编号 | 操作设备----------------------------------------0 00 1 1 01 1平台编号 0x00 0号-ZigBee平台 0x40 1号-A9/A53平台0x80 2号-STM32平台(可以自己扩展)0xc0 3号-avr arduino....保留(如果平台继续增多的话可以采用2个字节或多个字节来对设备进行唯一的编号,比如A9类下的1号平台,2号平台,先分类,然后再具体标识设备)---------------------------------------- 设备编号 操作掩码 0x00 LED 0x00 全部关闭0x01 全部打开0x02 打开LED20x03 打开LED30X04 打开LED40x05 打开LED50X10 打开流水灯----------------------------------------0x10 蜂鸣器 0x00 关闭0x01 打开0x02 自动报警关闭0x03 自动报警打开----------------------------------------0x20 风扇 0x00 关闭风扇0x01 打开风扇---------------------------------------- 0x30 数码管 0x0~0xF 显示0~F数字(四盏灯,对应0000-表示0,0001-表示1....1110-表示14)0x0f 关闭数码管 led2-3-4-5----------------------------------------控制命令: 平台编号 + 设备编号 + 操作掩码 = 命令 (命令的封装)例如:0x00 + 0x20 + 0x01 = 0x21 风扇打开0x40 + 0x10 + 0x01 = 0x51 蜂鸣器打开0x40 + 0x30 + 0x08 = 0x78 数码管显示80x40 + 0x30 + 0x0f = 0x7f 关闭数码管a 高位数据,b代表低位数据short cunsigned char a ,b;c = a | b;c = a + b;上行:封装的结构体====共享内存和信号量 ===>交给CGI(C语言和HTML语言之间的转化接口)===>交给HTML下行:封装的命令字====消息队列 ====>msgbuf msgsnd===>控制命令字封装在msgsnd的msgbuf中 ===>A9端解析==>向下控制硬件
这是之前定义好的结构体,id和key值,一定要严格按照定好的来,不然就会造成无法通信的后果,再团队合作中有想法要在做前提,这样可以提前修改。

现在线程都启动成功了
CROSS_COMPILE=arm-linux-
CC=$(CROSS_COMPILE)gcc
CFLAGS= -c -g
#LDFLAGS= -lpthread -L ./lib -lsqlite3
LDFLAGS= -lpthreadOBJS=main.o data_global.o pthread_transfer.o \
pthread_client_request.o pthread_buzzer.o pthread_led.o\
pthread_sqlite.o \
pthread_refresh.o pthread_sms.omonitor_obj :$(OBJS)
$(CC) -o $@ $^ $(LDFLAGS)
mv *o ./obj
$(OBJS):%.o:%.c
$(CC) $(CFLAGS) $< -o $@install:
sudo cp monitor_obj ~/nfs_rootfs/.PHONY:clean
clean:
rm *.o monitor_obj -rf
上面是makefile的内容
相关文章:
嵌入式安防监控项目——exynos4412主框架搭建
目录 一、模块化编程思维 二、安防监控项目主框架搭建 一、模块化编程思维 其实我们以前学习32使用keil的时候就是再用模块化的思维。每个硬件都单独有一个实现功能的C文件和声明函数,进行宏定义以及引用需要使用头文件的h文件。 比如简单的加减乘除取余操作我们…...
YOLOv5s网络模型讲解(一看就会)
文章目录前言1、YOLOv5s-6.0组成2、YOLOv5s网络介绍2.1、参数解析2.2、YOLOv5s.yaml2.3、YOLOv5s网络结构图3、附件3.1、yolov5s.yaml 解析表3.2、 yolov5l.yaml 解析表总结前言 最近在重构YOLOv5代码,本章主要介绍YOLOv5s的网络结构 1、YOLOv5s-6.0组成 我们熟知YO…...
kkfileView linux 离线安装
文章目录前言一、安装 LiberOffice二、安装kkfileView1.下载安装包2.启动总结前言 一、安装 LiberOffice 下载https://kkfileview.keking.cn/LibreOffice_7.1.4_Linux_x86-64_rpm.tar.gz 安装 tar -zxvf LibreOffice_7.1.4_Linux_x86-64_rpm.tar.gz cd LibreOffice_7.1.4.2_L…...
如何编写BI项目之ETL文档
XXXXBI项目之ETL文档 xxx项目组 ------------------------------------------------1---------------------------------------------------------------------- 目录 一 、ETL之概述 1、ETL是数据仓库建构/应用中的核心…...
【LeetCode】剑指 Offer 24. 反转链表 p142 -- Java Version
题目链接:https://leetcode.cn/problems/fan-zhuan-lian-biao-lcof/submissions/ 1. 题目介绍(24. 反转链表) 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 【测试用例】: 示…...
LAY-EXCEL导出excel并实现单元格合并
通过lay-excel插件实现Excel导出,并实现单元格合并,样式设置等功能。更详细描述,请去lay-excel插件文档查看,地址:http://excel.wj2015.com/_book/docs/%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B.html一、安装这里使用Vue…...
配置VM虚拟机Centos7网络
配置VM虚拟机Centos7网络 第一步,进入虚拟机设置选中【网络适配器】选择【NAT模式】 第二步,进入windows【控制面板\网络和 Internet\网络连接】设置网络状态。 我们选择【VMnet8】 点击【属性】查看它的网络配置 2 .我们找到【Internet 协议版本 4(TCP…...
Kafka 位移主题
Kafka 位移主题位移格式创建位移提交位移删除位移Kafka 的内部主题 (Internal Topic) : __consumer_offsets (位移主题,Offsets Topic) 老 Consumer 会将位移消息提交到 ZK 中保存 当 Consumer 重启后,能自动从 ZK 中读取位移数据,继续消费…...
详细讲解零拷贝机制的进化过程
一、传统拷贝方式(一)操作系统经过4次拷贝CPU 负责将数据从磁盘搬运到内核空间的 Page Cache 中;CPU 负责将数据从内核空间的 Page Cache 搬运到用户空间的缓冲区;CPU 负责将数据从用户空间的缓冲区搬运到内核空间的 Socket 缓冲区…...
2023年场外个股期权研究报告
第一章 概况 场外个股期权(Over-the-Counter Equity Option),是指由交易双方根据自己的需求和意愿,通过协商确定行权价格、行权日期等条款的股票期权。与交易所交易的标准化期权不同,场外个股期权的合同内容可以根据交…...
k8s pod,ns,pvc 强制删除
一、强制删除pod$ kubectl delete pod <your-pod-name> -n <name-space> --force --grace-period0解决方法:加参数 --force --grace-period0,grace-period表示过渡存活期,默认30s,在删除POD之前允许POD慢慢终止其上的…...
力扣第99场双周赛题目记录(复盘)
第一题 2578.最小和分割 给你一个正整数 num ,请你将它分割成两个非负整数 num1 和 num2 ,满足: num1 和 num2 直接连起来,得到 num 各数位的一个排列。 换句话说,num1 和 num2 中所有数字出现的次数之和等于 num 中所…...
spring事务失效原因
一.抛出事务不支持的异常 原理: Spring事务默认支持RuntimeException异常,抛出的异常为RuntimeException异常及其子类异常事务均可生效,而我们日常常见的异常基本都继承自RuntimeException,所以无需指定异常类型事务也能生效。 但…...
pikachu靶场CSRF之TOKEN绕过
简介 Pikachu靶场中的CSRF漏洞环节里面有一关CSRF TOKEN,这个关卡和其余关卡稍微有点不一样,因为表单里面存在一个刷新就会变化的token,那么这个token是否能绕过呢?接下来我们来仔细分析分析 实战过程 简单尝试 先利用任意一个…...
Windows中配置docker没有hyper-v功能解决方案
👨 作者简介:大家好,我是Taro,前端领域创作者 ✒️ 个人主页:唐璜Taro 🚀 支持我:点赞👍📝 评论 ⭐️收藏 文章目录前言解决步骤:1.新建文档2. 另存为3. 功能…...
电子台账:模板制作之五——二级过滤与多条件组合
1 前言工作中,经常会遇到很复杂的数据,比如内销产品和出口产品、正常产品和报废产品都混在一块儿。电子台账中,需要把这些数据都区分开,分别汇总。这种情况,可以用台账软件的二级过滤功能来处理,实际上就是…...
Kaldi Data preparation
链接:GitHub - nessessence/Kaldi_ASR_Tutorial: speech recognition using Kaldi framework Lets start with formatting data. We will randomly split wave files into test and train dataset(set the ratio as you want). Create a directory data and,then t…...
libevent 学习笔记
一、参考 libevent Libevent深入浅出 - 《Libevent 深入浅出》 - 书栈网 BookStack libevent 之 event config的相关函数介绍_event_config_new_yldfree的博客-CSDN博客 Libevent之evbuffer详解_有时需要偏执狂的博客-CSDN博客 二、libevent概述 libevent 就是将网络、I…...
jupyter的使用
1.安装 安装过程看这篇记录。 安装 2.如何启动 环境搭建好后,本机输⼊jupyter notebook命令,会⾃动弹出浏览器窗⼝打开 Jupyter Notebook # 进⼊虚拟环境 workon ai(这个是虚拟环境的名称) # 输⼊命令 jupyter notebook本地notebook的默认URL为&…...
中级数据开发工程师养成计
目标 工作之后就很少时间用来沉淀知识了,难得用空闲时间沉淀一下自己。 成为一名中级数据开发工程师。偏向于数据仓库,数据治理方向。 整体排期 1 hive 2 hadoop 3 flink 4 spark 5 闲杂工具 kafka maxwell cancal 6 数据建模(偏向于kimbo…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...
Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
