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

嵌入式安防监控项目——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= -lpthread

OBJS=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.o

monitor_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文件和声明函数&#xff0c;进行宏定义以及引用需要使用头文件的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代码&#xff0c;本章主要介绍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

题目链接&#xff1a;https://leetcode.cn/problems/fan-zhuan-lian-biao-lcof/submissions/ 1. 题目介绍&#xff08;24. 反转链表&#xff09; 定义一个函数&#xff0c;输入一个链表的头节点&#xff0c;反转该链表并输出反转后链表的头节点。 【测试用例】&#xff1a; 示…...

LAY-EXCEL导出excel并实现单元格合并

通过lay-excel插件实现Excel导出&#xff0c;并实现单元格合并&#xff0c;样式设置等功能。更详细描述&#xff0c;请去lay-excel插件文档查看&#xff0c;地址&#xff1a;http://excel.wj2015.com/_book/docs/%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B.html一、安装这里使用Vue…...

配置VM虚拟机Centos7网络

配置VM虚拟机Centos7网络 第一步&#xff0c;进入虚拟机设置选中【网络适配器】选择【NAT模式】 第二步&#xff0c;进入windows【控制面板\网络和 Internet\网络连接】设置网络状态。 我们选择【VMnet8】 点击【属性】查看它的网络配置 2 .我们找到【Internet 协议版本 4(TCP…...

Kafka 位移主题

Kafka 位移主题位移格式创建位移提交位移删除位移Kafka 的内部主题 (Internal Topic) : __consumer_offsets (位移主题&#xff0c;Offsets Topic) 老 Consumer 会将位移消息提交到 ZK 中保存 当 Consumer 重启后&#xff0c;能自动从 ZK 中读取位移数据&#xff0c;继续消费…...

详细讲解零拷贝机制的进化过程

一、传统拷贝方式&#xff08;一&#xff09;操作系统经过4次拷贝CPU 负责将数据从磁盘搬运到内核空间的 Page Cache 中&#xff1b;CPU 负责将数据从内核空间的 Page Cache 搬运到用户空间的缓冲区&#xff1b;CPU 负责将数据从用户空间的缓冲区搬运到内核空间的 Socket 缓冲区…...

2023年场外个股期权研究报告

第一章 概况 场外个股期权&#xff08;Over-the-Counter Equity Option&#xff09;&#xff0c;是指由交易双方根据自己的需求和意愿&#xff0c;通过协商确定行权价格、行权日期等条款的股票期权。与交易所交易的标准化期权不同&#xff0c;场外个股期权的合同内容可以根据交…...

k8s pod,ns,pvc 强制删除

一、强制删除pod$ kubectl delete pod <your-pod-name> -n <name-space> --force --grace-period0解决方法&#xff1a;加参数 --force --grace-period0&#xff0c;grace-period表示过渡存活期&#xff0c;默认30s&#xff0c;在删除POD之前允许POD慢慢终止其上的…...

力扣第99场双周赛题目记录(复盘)

第一题 2578.最小和分割 给你一个正整数 num &#xff0c;请你将它分割成两个非负整数 num1 和 num2 &#xff0c;满足&#xff1a; num1 和 num2 直接连起来&#xff0c;得到 num 各数位的一个排列。 换句话说&#xff0c;num1 和 num2 中所有数字出现的次数之和等于 num 中所…...

spring事务失效原因

一.抛出事务不支持的异常 原理&#xff1a; Spring事务默认支持RuntimeException异常&#xff0c;抛出的异常为RuntimeException异常及其子类异常事务均可生效&#xff0c;而我们日常常见的异常基本都继承自RuntimeException&#xff0c;所以无需指定异常类型事务也能生效。 但…...

pikachu靶场CSRF之TOKEN绕过

简介 Pikachu靶场中的CSRF漏洞环节里面有一关CSRF TOKEN&#xff0c;这个关卡和其余关卡稍微有点不一样&#xff0c;因为表单里面存在一个刷新就会变化的token&#xff0c;那么这个token是否能绕过呢&#xff1f;接下来我们来仔细分析分析 实战过程 简单尝试 先利用任意一个…...

Windows中配置docker没有hyper-v功能解决方案

&#x1f468; 作者简介&#xff1a;大家好&#xff0c;我是Taro&#xff0c;前端领域创作者 ✒️ 个人主页&#xff1a;唐璜Taro &#x1f680; 支持我&#xff1a;点赞&#x1f44d;&#x1f4dd; 评论 ⭐️收藏 文章目录前言解决步骤&#xff1a;1.新建文档2. 另存为3. 功能…...

电子台账:模板制作之五——二级过滤与多条件组合

1 前言工作中&#xff0c;经常会遇到很复杂的数据&#xff0c;比如内销产品和出口产品、正常产品和报废产品都混在一块儿。电子台账中&#xff0c;需要把这些数据都区分开&#xff0c;分别汇总。这种情况&#xff0c;可以用台账软件的二级过滤功能来处理&#xff0c;实际上就是…...

Kaldi Data preparation

链接&#xff1a;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.如何启动 环境搭建好后&#xff0c;本机输⼊jupyter notebook命令&#xff0c;会⾃动弹出浏览器窗⼝打开 Jupyter Notebook # 进⼊虚拟环境 workon ai(这个是虚拟环境的名称) # 输⼊命令 jupyter notebook本地notebook的默认URL为&…...

中级数据开发工程师养成计

目标 工作之后就很少时间用来沉淀知识了&#xff0c;难得用空闲时间沉淀一下自己。 成为一名中级数据开发工程师。偏向于数据仓库&#xff0c;数据治理方向。 整体排期 1 hive 2 hadoop 3 flink 4 spark 5 闲杂工具 kafka maxwell cancal 6 数据建模&#xff08;偏向于kimbo…...

fastjson 返回 $ref 数据

文章目录问题描述&#xff1a;1、重复引用&#xff1a;2、循环引用&#xff1a;原因分析&#xff1a;1、重复引用&#xff1a;2、循环引用&#xff1a;反序列化&#xff1a;1、开启引用检测&#xff1a;2、关闭引用检测&#xff1a;小结&#xff1a;问题描述&#xff1a; 问题…...

Zookeeper特性和节点数据类型详解

什么是ZK&#xff1f; zk,分布式应用协调框架&#xff0c;Apache Hadoop的一个子项目&#xff0c;解决分布式应用中遇到的数据管理问题。 可以理解为存储少量数据基于内存的数据库。两大核心&#xff1a;文件系统存储结构 和 监听通知机制。 文件系统存储结构 文件目录以 / …...

Java代码是如何被CPU狂飙起来的?

无论是刚刚入门Java的新手还是已经工作了的老司机&#xff0c;恐怕都不容易把Java代码如何一步步被CPU执行起来这个问题完全讲清楚。但是对于一个Java程序员来说写了那么久的代码&#xff0c;我们总要搞清楚自己写的Java代码到底是怎么运行起来的。另外在求职面试的时候这个问题…...

Dynamics365安装失败解决及注册编写

一、修改错误昨天登录报错今天开始返回我之前设置的断点开始重新配置&#xff0c;Reporing Services配置完成后发现dynamics365还是下载失败之后下载了一上午dynamics365就一直卡在最后的界面进度条不动索性我直接把所有环境都卸载了 连同虚拟机卸载重装终于在下午的时候dynami…...

Kafka 集群参数

Kafka 集群参数Broker 端参数存储配置ZooKeeper 配置Broker 连接配置Topic 管理配置数据留存配置Topic 级别参数JVM 参数操作系统参数重要的配置 : Broker 端参数&#xff0c;主题级别的参数、JVM 端参数、操作系统级别的参数 Broker 端参数 存储配置 log.dirs&#xff1a;指…...

等保2.0与1.0 测评要求的变化

No.1标准内容增加了 标准内容上最大的变化就是将安全要求分为了安全通用要求和扩展要求。首先&#xff0c;安全通用要求部分已对1.0标准的内容进行了优化&#xff0c;删除或修订了过时的要求项&#xff0c;新增了对新型网络攻击行为防护和个人信息保护等方面的新要求。其次&am…...

nodejs学习巩固笔记-nodejs基础,Node.js 高级编程(核心模块、模块加载机制)

目录Nodejs 基础大前端开发过程中的必备技能nodejs 的架构为什么是 NodejsNodejs 异步 IONodejs 事件驱动架构全局对象全局变量之 process核心模块核心模块 - path全局变量之 Buffer创建 bufferBuffer 实例方法Buffer 静态方法Buffer-split 实现核心模块之FS模块文件操作 APImd…...

2023年春【移动计算技术】文献精读(二)-3 || 附:创新点、创新思想和技术路线总结

榜样的力量是无穷的! 🎯作者主页:追光者♂ 🌸个人简介:2022年CSDN博客之星人工智能领域TOP4🌟、阿里云社区专家博主🏅 CSDN-人工智能领域新星创作者🏆 【无限进步,一起追光!】 🍎欢迎点赞👍 收藏⭐ 留言📝 🌿本篇,仅接着上两篇,为【移动计算技术】…...

企业新闻稿的格式和要求是什么?如何写好新闻稿?

新闻稿是企业自己撰写给媒体的新闻素材&#xff0c;媒体采纳你的稿件后就可以传播到更多的大众面前。 所以企业新闻稿的撰写一方面要让媒体认可&#xff0c;另外一方面是让用户认可你的品牌或是产品。 企业新闻稿的格式和要求是什么&#xff1f;如何写好新闻稿&#xff1f;今…...

String类的底层原理和版本演变

1 String类的底层演变&#xff08;1&#xff09; JDK8以及之前版本 &#xff08;2&#xff09;JDK9以及之后版本 javaJDK8的字符串存储在char类型的数组里面&#xff0c;在java中&#xff0c;一个char类型占两个字节。但是很多时候&#xff0c;一个字符只需要一个字节就可存储&…...