嵌入式安防监控项目——html框架分析和环境信息刷新到网页

news2024/11/24 0:50:05

目录

一、html控制LED

二、模拟数据上传到html


一、html控制LED

简单来说就是html给boa服务器发了一个控制指令信息,然后boa转发给cgi进程,cgi通过消息队列和主进程通信。主进程再去启动LED子线程。

这是老师给的工程。

以前学32都有这工具那工具来管理,现在就是自己建文件夹,然后写makefile来管理

先来看看makefile

KERNELDIR :=/home/book/Linux_4412/kernel/linux-3.14
PWD  :=$(shell pwd)

CROSS_COMPILE=arm-none-linux-gnueabi-
#CROSS_COMPILE=
CC=$(CROSS_COMPILE)gcc
CP=cp

ARM_DRVDIR=~/nfs_rootfs/drv/
NFS_BOA_WWWDIR=~/nfs_rootfs/boa/www/
NFS_BOA_CGIDIR=~/nfs_rootfs/boa/cgi-bin/

obj-m +=demo.o 

all:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
    $(CC) -o cgi_led.cgi -static cgi_led.c
    mv *.o *.mod.c *.order *.symvers obj

install:
    sudo cp demo.ko  $(ARM_DRVDIR)
    sudo cp *.mp3 *.jpg led.html $(NFS_BOA_WWWDIR)
    sudo cp cgi_led.cgi  $(NFS_BOA_CGIDIR)

clean:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) clean
    rm -rf cgi_led.cgi

主要就是调用内核的makefile来编译我们的驱动程序,然后编译我们的LED的C文件生成cgi。

为了方便加上clean和install命令

/*************************************************************************
	#	 FileName	: test.c
	#	 Author		: fengjunhui 
	#	 Email		: 18883765905@163.com 
	#	 Created	: 2017年07月03日 星期一 15时48分02秒
 ************************************************************************/

#include<stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
 #include <sys/ioctl.h>
#include <linux/limits.h>
#include <errno.h>
#include "chardev.h"


#define LED_DEVICE "/dev/chrdev0"
#define MAX_BUFFER_SIZE PIPE_BUF

int main(int argc, const char *argv[])
{
	int i = 0,j = 3;
	int nread;
	int led_control,led_state;
	int led_fd,fifo_fd;
	led_desc_t led;
	char *data;

	led_fd = open(LED_DEVICE,O_RDWR);
	if(led_fd < 0){
		printf("open failed !\n");
	}
	printf("open device success! led_fd: %d\n",led_fd);

    printf("Content-type: text/html;charset=utf-8\n\n");
    printf("<html>\n");
    printf("<head><title>cgi control led web</title></head>\n");
    printf("<body>\n");
    printf("<p>led is setted successful! you can watch the led's change</p>\n");
    //printf("<p><a herf=http://192.168.1.100/led.html>go back</a></p>\n");
	printf("<a href=\"/led.html\">go back led control page </a>");
	printf("</body>\n");

    data = getenv("QUERY_STRING");   //getenv()读取环境变量的当前值的函数 

    if(sscanf(data,"led_control=%d&led_state=%d",&led_control,&led_state)!=2)
    {   //利用sscnaf()函数的特点将环境变量分别提取出led_control和led_state这两个值
        printf("<p>please input right"); 
        printf("</p>");
    } 
    printf("<p>led_control = %d,led_state =  %d</p>", led_control, led_state);
    if(led_control < 2 || led_control > 5) { 
        printf("<p>Please input 2<=led_control<=5!"); 
        printf("</p>");
    } 
    if(led_state>1) {
        printf("<p>Please input 0<=led_state<=1!"); 
        printf("</p>"); 
    }

	led.led_num   = led_control;
	led.led_state = led_state;
	
	if(led.led_state == 0){
		ioctl(led_fd,FS_LED_OFF,&led);
	}else if(led.led_state == 1){
		ioctl(led_fd,FS_LED_ON,&led);
	}else if(led.led_state == 2){
		while(j --){
			for(i = 2; i <= 5; i ++ ){
				led.led_num = i;
				led.led_state = 0;
				ioctl(led_fd,FS_LED_OFF,&led);
				usleep(500000);
				led.led_state = 1;
				ioctl(led_fd,FS_LED_ON,&led);
				usleep(500000);
			}
		}
	}

	close(led_fd);
    printf("</html>\n");

	return 0;
}

这是老师再17年写的老代码了,主要就是接收html的指令然后发给A9主进程,但是由于这只是个测试所以没用主进程,直接再这个cgi进程中操作LED了。

昨天发烧没看清,录视频讲错了。

#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/device.h>
#include <asm/uaccess.h>
#include <asm/io.h>

#include "chardev.h"

const char *name = "chrdev";
unsigned int  major ;
struct class *cls;
struct device *dev;

#define GPX2CON 0x11000c40
#define GPX2DAT 0x11000c44
#define GPX1CON 0x11000c20
#define GPX1DAT 0x11000c24
#define GPF3CON 0x114001e0
#define GPF3DAT 0x114001e4

void __iomem * gpx2con_vir;
void __iomem * gpx2dat_vir;
void __iomem * gpx1con_vir;
void __iomem * gpx1dat_vir;
void __iomem * gpf3con_vir;
void __iomem * gpf3dat_vir;


char kbuf[] = {'1','2','3','4'};

loff_t demo_llseek(struct file *filp, loff_t offset, int cnt)
{

	printk("---->%s--->%d\n",__func__,__LINE__);
	return 0;
}

ssize_t demo_read(struct file *filp, char __user *usrbuf, size_t count, loff_t *offset)
{
	int bytes = 0;
	printk("---->%s--->%d\n",__func__,__LINE__);

	bytes =	copy_to_user(usrbuf,kbuf,4);
	if(bytes > 0){
		printk("copy_to_user failed!\n");
	}

	return 0;
}

ssize_t demo_write(struct file *filp, const char __user *usrbuf, size_t size, loff_t *offset)
{
	int bytes = 0;
	printk("---->%s--->%d\n",__func__,__LINE__);

	bytes = copy_from_user(kbuf,usrbuf,4);
	if(bytes > 0){
		printk("copy_from_user failed\n");
		return -1;
	}
	printk("copy_from_user usrbuf:%c\n",kbuf[0]);
	return 0;
}


long demo_ioctl(struct file *filp, unsigned int cmd, unsigned long args)
{
	int i;
	led_desc_t *led = (led_desc_t *)args;
	printk("---->%s--->%d\n",__func__,__LINE__);

	switch(cmd){
		case FS_LED_ON:
		i = led->led_num;
		printk("i= %d\n",i);
			if(i == 2){
				writel(readl(gpx2dat_vir) | (0x1 << 7),gpx2dat_vir);
			}
			else if(i == 3){
				writel(readl(gpx1dat_vir) | (0x1 << 0),gpx1dat_vir);
			}else if(i == 4){
				writel(readl(gpf3dat_vir) | (0x1 << 4),gpf3dat_vir);
			}else if(i == 5){
				writel(readl(gpf3dat_vir) | (0x1 << 5),gpf3dat_vir);
			}
			printk("FS_LED_ON. \n");
			break;
		case FS_LED_OFF:
		i = led->led_num;
		printk("i= %d\n",i);
			if(i == 2){
				writel(readl(gpx2dat_vir)&~(0x1 << 7),gpx2dat_vir);
			}else if(i == 3){
				writel(readl(gpx1dat_vir)&~(0x1 << 0),gpx1dat_vir);
			}else if(i == 4){
				writel(readl(gpf3dat_vir)&~(0x1 << 4),gpf3dat_vir);
			}else if(i == 5){
				writel(readl(gpf3dat_vir)&~(0x1 << 5),gpf3dat_vir);
			}
			printk("FS_LED_OFF. \n");
			break;
		default:
			printk("default :....\n");
			break;
	}

	return 0;
}


int demo_open(struct inode *inode, struct file *filp)
{
	//硬件的初始化工作--收发数据的初始化
	printk("---->%s--->%d\n",__func__,__LINE__);
	return 0;
}

int demo_close(struct inode *inode, struct file *filp)
{
	
	printk("---->%s--->%d\n",__func__,__LINE__);
	return 0;
}

const struct file_operations fops = {
	.open=demo_open,
	.llseek=demo_llseek,
	.read=demo_read,
	.write=demo_write,
	.unlocked_ioctl=demo_ioctl,
	.release=demo_close,
};


void gpio_ioremap(void)
{
	gpx2con_vir = ioremap(GPX2CON,8);
	gpx2dat_vir = gpx2con_vir + 4;
	
	gpx1con_vir = ioremap(GPX1CON,8);
	gpx1dat_vir = gpx1con_vir + 4;
	
	gpf3con_vir = ioremap(GPF3CON,8);
	gpf3dat_vir = gpf3con_vir + 4;
	
	writel((readl(gpx2con_vir) & ~(0XF<< 28))| (0x1 << 28),gpx2con_vir);
	writel((readl(gpx1con_vir) & ~(0XF<< 0))| (0x1 << 0),gpx1con_vir);
	writel((readl(gpf3con_vir) & ~(0XF<< 16 ))| (0x1 << 16),gpf3con_vir);
	writel((readl(gpf3con_vir) & ~(0XF<< 20 ))| (0x1 << 20),gpf3con_vir);
	
}


static int __init demo_init(void)
{
	printk("---->%s--->%d\n",__func__,__LINE__);
	
	major = register_chrdev(0,name,&fops); 
	if(major <= 0){
		printk("register_chrdev failed!\n");
	}
	printk("register_chrdev success .major: %d\n",major);
	

	cls = class_create(THIS_MODULE,name);
	if(cls == NULL){
		printk("class_create failed!\n");
	}
	dev = device_create(cls, NULL,MKDEV(major,0),NULL,"chrdev0");
	if(dev == NULL){	
		printk("device_create failed!\n");
	}

	gpio_ioremap();
	return 0;
}

void viraddr_iounmap(void)
{
	iounmap(gpx2con_vir);
	iounmap(gpx1con_vir);
	iounmap(gpf3con_vir);
}

static void __exit demo_exit(void)
{
	printk("---->%s--->%d\n",__func__,__LINE__);
	viraddr_iounmap();
	device_destroy(cls,MKDEV(major,0));
	class_destroy(cls);
	unregister_chrdev(major,name);
}


module_init(demo_init);
module_exit(demo_exit);
MODULE_LICENSE("GPL");

这就是一个LED的驱动程序

<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />    
	<title>web控制A9开发板led</title>
	</head>
	
	<body background="./makeru-desktop.jpg">
	<br/>
	<embed src="./meiyanfang.mp3" autostart="true" loop="true" hidden="true"> 
	<h1 align="center">基于Cortex-A9的web控制LED灯</h1>
		<!--新建一个表单,动作链接到开发板的/cgi-bin/cgi_led.cgi,采用的方法为GET-->	
		<form action="/cgi-bin/cgi_led.cgi" method="get">  
			<p align="center">Web端的led的控制测试</p>
			<p align="center">请输入需要控制的led:<input type="text" name="led_control"/></p>
			<p align="center">请输入LED控制命令  :<input type="text" name="led_state"/></p>
			<h2 align="center"> (0熄灭-1点亮-2流水)</h2>   
			<p align="center"><input type="submit" value="sure"/>        
							  <input type="reset" value="back"/>
			</p>
		</form>
	</body>
</html>

LED的前端程序,和搞web的差远了哈,这个不用精通会点就行,这部分工作以后公司有专人做的。

 嵌入式安防监控项目——LED控制_哔哩哔哩_bilibili

二、模拟数据上传到html

#include "data_global.h"
#include "sem.h"

#define N 1024  //for share memory

extern int shmid;
extern int msgid;
extern int semid;

extern key_t shm_key;
extern key_t sem_key;
extern key_t key; //msg_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 struct env_info_client_addr  sm_all_env_info;

 struct shm_addr
 {
    char shm_status;   //shm_status���Ե���home_id���������ֹ����ڴ�����
    struct env_info_client_addr  sm_all_env_info;
};
struct shm_addr *shm_buf;

int file_env_info_struct(struct env_info_client_addr  *rt_status,int home_id);

void *pthread_refresh(void *arg)
{
	//semaphore for access to resource limits
	if((sem_key = ftok("/tmp",'i')) < 0){
		perror("ftok failed .\n");
		exit(-1);
	}

	semid = semget(sem_key,1,IPC_CREAT|IPC_EXCL|0666);
	if(semid == -1)	{
		if(errno == EEXIST){
			semid = semget(sem_key,1,0777);
		}else{
			perror("fail to semget");
			exit(1);
		}
	}else{
		init_sem (semid, 0, 1);
	}

	//share memory for env_info refresh config
	if((shm_key = ftok("/tmp",'i')) < 0){
		perror("ftok failed .\n");
		exit(-1);
	}

	shmid = shmget(shm_key,N,IPC_CREAT|IPC_EXCL|0666);
	if(shmid == -1)	{
		if(errno == EEXIST){
			shmid = shmget(key,N,0777);
		}else{
			perror("fail to shmget");
			exit(1);
		}
	}

	//share memap
	if((shm_buf = (struct shm_addr *)shmat(shmid,NULL,0)) == (void *)-1)
	{
		perror("fail to shmat");
		exit(1);
	}

	printf("pthread_refresh ......>>>>>>>\n");
	
#if 1
	bzero (shm_buf, sizeof (struct shm_addr));
	while(1){
		sem_p(semid,0);
		shm_buf->shm_status = 1;
		file_env_info_struct(&shm_buf->sm_all_env_info,shm_buf->shm_status);
		sleep(1);
		sem_v(semid,0);
	}
#endif 

	
}



int file_env_info_struct(struct env_info_client_addr *rt_status,int home_id)
{
	int  env_info_size = sizeof(struct env_info_client_addr);
	printf("env_info_size = %d.\n",env_info_size);

	rt_status->monitor_no[home_id].zigbee_info.temperature = 10.0;
	rt_status->monitor_no[home_id].zigbee_info.tempMIN = 2.0;
	rt_status->monitor_no[home_id].zigbee_info.tempMAX = 20.0;
	rt_status->monitor_no[home_id].zigbee_info.humidity  = 20.0;
	rt_status->monitor_no[home_id].zigbee_info.humidityMIN  = 10.0;
	rt_status->monitor_no[home_id].zigbee_info.humidityMAX  = 30.0;
	rt_status->monitor_no[home_id].zigbee_info.reserved[0]  = 0.01;
	rt_status->monitor_no[home_id].zigbee_info.reserved[1]  = -0.01;


	rt_status->monitor_no[home_id].a9_info.adc  = 9.0;
	rt_status->monitor_no[home_id].a9_info.gyrox  = -14.0;
	rt_status->monitor_no[home_id].a9_info.gyroy  = 20.0;
	rt_status->monitor_no[home_id].a9_info.gyroz  = 40.0;
	rt_status->monitor_no[home_id].a9_info.aacx  = 642.0;
	rt_status->monitor_no[home_id].a9_info.aacy  = -34.0;
	rt_status->monitor_no[home_id].a9_info.aacz  = 5002.0;
	rt_status->monitor_no[home_id].a9_info.reserved[0]  = 0.01;
	rt_status->monitor_no[home_id].a9_info.reserved[1]  = -0.01;
	
	return 0;
}

这是A9刷新的线程程序

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
#include <errno.h>
#include <sys/sem.h>
#include <unistd.h>
#include "sem.h"
#include "cgic.h"
#include "data_global.h"

#define N 32

#define MONITOR_NUM 1

char status[2][6] = {"Close", "Open"};
char fan_status[4][6] = {"Close", "One", "Two", "Three"};

 struct shm_addr
 {
    char shm_status;
    struct env_info_client_addr  sm_all_env_info;
};

int cgiMain()
{
	key_t key;
	int shmid,semid;
	struct shm_addr *shm_buf;
	
	
	if((key = ftok("/tmp",'i')) <0)
	{
		perror("ftok");
		exit(1);
	}
	printf("key = %x\n",key);

	if((semid  = semget(key, 1, 0666)) < 0)
	{
		perror("semget");
		exit(1);
	}

	if((shmid = shmget(key, N, 0666 )) == -1)
	{
			perror("shmget");
			exit(1);
	}

	if((shm_buf = (struct shm_addr*)shmat(shmid, NULL, 0)) == (void*)-1 )
	{
		perror("shmat");
		exit(1);
	}

	sem_p(semid,0);

	cgiHeaderContentType("text/html");
	fprintf(cgiOut, "<head><meta http-equiv=\"refresh\" content=\"1\"><style><!--body{line-height:50%}--></style> </head>");
	fprintf(cgiOut, "<HTML>\n");
	fprintf(cgiOut, "<BODY bgcolor=\"#666666\">\n");
//fprintf(cgiOut, "<h1><font color=\"#FF0000\">HOME_ID #%d:</font></H2>\n ", shm_buf->shm_status);
	if (shm_buf->shm_status == 1)
	{
		fprintf(cgiOut, "<script>function show(){var date =new Date(); var now = \"\"; now = date.getFullYear()+\"年\"; now = now + (date.getMonth()+1)+\"月\"; \ now = now + date.getDate()+\"日\"; now = now + date.getHours()+\"时\"; now = now + date.getMinutes()+\"分\";now = now + date.getSeconds()+\"秒\"; document.getElementById(\"nowDiv\").innerHTML = now; setTimeout(\"show()\",1000);} </script> \n ");	
		fprintf(cgiOut, "<h2><font face=\"Broadway\"><font color=\"#00FAF0\">Home1 Real-time Environment Info:</font></font></H2>\n ");
		fprintf(cgiOut, "<h2 align=center><font color=\"#cc0033\"><body onload=\"show()\"> <div id=\"nowDiv\"></div></font></h2> \n "); 	
	
		fprintf(cgiOut, "<h4>ZIGBEE数据显示部分</H4>\n ");
		fprintf(cgiOut, "<h4>Temperature:\t%0.2f</H4>\n ", shm_buf->sm_all_env_info.monitor_no[shm_buf->shm_status].zigbee_info.temperature );
		fprintf(cgiOut, "<h4>Humidity:\t%0.2f</H4>\n ", shm_buf->sm_all_env_info.monitor_no[shm_buf->shm_status].zigbee_info.humidity);
		
		fprintf(cgiOut, "<h4>A9数据显示部分</H4>\n ");
		fprintf(cgiOut, "<h4>Adc:\t%0.2f</H4>\n ", shm_buf->sm_all_env_info.monitor_no[shm_buf->shm_status].a9_info.adc);
		fprintf(cgiOut, "<h4>GYROX:\t%d</H4>\n ", shm_buf->sm_all_env_info.monitor_no[shm_buf->shm_status].a9_info.gyrox);
		fprintf(cgiOut, "<h4>GYROY:\t%d</H4>\n ", shm_buf->sm_all_env_info.monitor_no[shm_buf->shm_status].a9_info.gyroy);
		fprintf(cgiOut, "<h4>GYROZ:\t%d</H4>\n ", shm_buf->sm_all_env_info.monitor_no[shm_buf->shm_status].a9_info.gyroz);
		fprintf(cgiOut, "<h4>AACX :\t%d</H4>\n ", shm_buf->sm_all_env_info.monitor_no[shm_buf->shm_status].a9_info.aacx);
		fprintf(cgiOut, "<h4>AACY :\t%d</H4>\n ", shm_buf->sm_all_env_info.monitor_no[shm_buf->shm_status].a9_info.aacy);
		fprintf(cgiOut, "<h4>AACZ :\t%d</H4>\n ", shm_buf->sm_all_env_info.monitor_no[shm_buf->shm_status].a9_info.aacz);
		fprintf(cgiOut, "<h4>A9-RESERVED[0]:\t%d</H4>\n ", shm_buf->sm_all_env_info.monitor_no[shm_buf->shm_status].a9_info.reserved[0]);
		fprintf(cgiOut, "<h4>A9-RESERVED[1]:\t%d</H4>\n ", shm_buf->sm_all_env_info.monitor_no[shm_buf->shm_status].a9_info.reserved[1]);
		
		fprintf(cgiOut, "<h4>STM32数据显示部分</H4>\n ");
		fprintf(cgiOut, "<h4>......</H4>\n ");
	}
	else
	{
		fprintf(cgiOut, "<h2><font face=\"Broadway\"><font color=\"#FFFAF0\">Close!</font></font></H2>\n ");	
	}
//	fprintf(cgiOut, "<h3>:</H3>\n ");	
	fprintf(cgiOut, "</BODY></HTML>\n");	
	sem_v (semid, 0);
	return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
#include <errno.h>
#include "cgic.h"
#include "data_global.h"
 
 
 
#define home_id 1
 
 struct shm_addr
 {
    char shm_status;   //shm_status可以等于home_id,用来区分共享内存数据
    struct env_info_client_addr  sm_all_env_info;
};
struct shm_addr *shm_buf;

#if 0
struct setEnv
{
	int temMAX;
	int temMIN;
	int humMAX;
	int humMIN;
	int illMAX;
	int illMIN;
};
#endif 

int cgiMain()
{
	key_t  key;
	char sto_no[2];
	char buf[20];
	struct shm_addr new;
	int msgid;
	struct msg msg_buf;
	
	memset(&msg_buf,0,sizeof(msg_buf));
	cgiFormString("store", sto_no, 2);

	cgiFormString("temMAX", buf, 20);
	new.sm_all_env_info.monitor_no[home_id].zigbee_info.tempMAX = atoi(buf);
	cgiFormString("temMIN", buf, 20);
	new.sm_all_env_info.monitor_no[home_id].zigbee_info.tempMIN = atoi(buf);
	cgiFormString("humMAX", buf, 20);
	new.sm_all_env_info.monitor_no[home_id].zigbee_info.humidityMAX = atoi(buf);
	cgiFormString("humMIN", buf, 20);
	new.sm_all_env_info.monitor_no[home_id].zigbee_info.humidityMIN = atoi(buf);
	
	//cgiFormString("illMAX", buf, 20);
	//new.illMAX = atoi (buf);
	//cgiFormString("illMIN", buf, 20);
	//new.illMIN = atoi (buf);

	if((key = ftok("/tmp", 'g')) < 0)
	{
		perror("ftok");
		exit(1);
	}

	if((msgid = msgget(key, 0666)) < 0)
	{
		perror("msgget");
		exit(1);
	}
	
	memcpy (msg_buf.text+1, &new, 24);
	
	msg_buf.type = 1L;
	msg_buf.msgtype = 5L;
	msg_buf.text[0] = sto_no[0];
	
	msgsnd(msgid, &msg_buf,sizeof(msg_buf)-sizeof(long),0);

	sto_no[0] -= 48;
	
	cgiHeaderContentType("text/html\n\n"); 
	fprintf(cgiOut, "<HTML><HEAD>\n"); 
	fprintf(cgiOut, "<TITLE>My CGI</TITLE></HEAD>\n"); 
	fprintf(cgiOut, "<BODY>"); 

	fprintf(cgiOut, "<H2>send sucess</H2>");

	//fprintf(cgiOut, "<a href='.html'>返回</a>"); 
	fprintf(cgiOut, "<meta http-equiv=\"refresh\" content=\"1;url=../home%d.html\">", sto_no[0]);
	fprintf(cgiOut, "</BODY>\n"); 
	fprintf(cgiOut, "</HTML>\n"); 


	return 0; 

}

这俩是CGI相关的程序都是为了完成数据的刷新

 录了讲解视频,后面发评论区

 

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

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

相关文章

导航技术调研(CSDN_0023_20221217)

文章编号&#xff1a;CSDN_0023_20221217 目录 1. 惯性导航 2. 组合导航技术 3. 卡尔曼滤波 1. 惯性导航 惯性导航系统(INS-Inertial Navigation System)是上个世纪初发展起来的。惯性导航是一种先进的导航方法&#xff0c;但实现导航定位的原理却非常简单&#xff0c;它是…

RHCSA-用户和组管理和文件系统权限(3.11)

目录 用户&#xff08;UID&#xff09; 用户类别&#xff08;UID&#xff09;&#xff1a; 用户的增删改查&#xff1a; 修改用户密码&#xff1a; 查看用户是否存在&#xff1a; 组&#xff08;GID&#xff09; 组的增删改查&#xff1a; 设置组密码&#xff1a; 用户…

idea集成GitHub

设置 GitHub 账号绑定账号有两种方式&#xff1a;1. 通过授权登录2.如果上述登录不成功&#xff0c;用Token口令的方式登录&#xff0c;口令在github账号哪里生成&#xff0c;点击settings --->Developer settings --->pwrsonal access tokens ----> 复制口令到idea 口…

设置cpp-httplib 服务器模式模式下的线程池大小 以及如何增加默认处理函数 以便能够实现http请求转发

先说说默认的创建的线程池数量 原因是某天调试在gdb调试下 一启动程序发现 开启了好多线程 如下图 因为我们程序 没几个线程 数了下 居然有60多个线程 不需要那么多 所以看下 httplib的源码 构造函数的时候 设置了最大线程池数量 看下这个宏 然后打印了下 发现 居然那么大 …

FusionCompute安装和配置步骤

1. 先去华为官网下载FusionCompute的镜像 下载地址&#xff1a;https://support.huawei.com/enterprise/zh/distributed-storage/fusioncompute-pid-8576912/software/251713663?idAbsPathfixnode01%7C22658044%7C7919788%7C9856606%7C21462752%7C8576912 下载后放在D盘中&am…

【rabbitmq 实现延迟消息-插件版本安装(docker环境)】

一&#xff1a;插件简介 在rabbitmq 3.5.7及以上的版本提供了一个插件&#xff08;rabbitmq-delayed-message-exchange&#xff09;来实现延迟队列功能。同时插件依赖Erlang/OPT 18.0及以上。 二&#xff1a;插件安装 1&#xff1a;选择适合自己安装mq 版本的插件&#xff1…

设计模式---抽象工厂模式

目录 1 介绍 2 优缺点 3 实现 1 介绍 抽象工厂模式(Abstract Factory Pattern) 是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 在抽象工厂模式中&#xff0c;接口是负…

ROC和AUC

目录 ROC AUC ROC ROC曲线是Receiver Operating Characteristic Curve的简称&#xff0c;中文名为"受试者工作特征曲线"。ROC曲线的横坐标为假阳性率(False Postive Rate, FPR)&#xff1b;纵坐标为真阳性率(True Positive Rate, TPR).FPR和TPR的计算方法分别为 F…

Spring——案例-业务层接口执行效率和AOP通知获取数据+AOP总结

执行时间获取:记录开始时间和结束时间&#xff0c;取差值。 这里使用环绕通知来实现。 环境准备: 项目文件结构: 业务层接口和实现类: 数据层: 采用mybatis注解开发&#xff0c;这里没有实现类&#xff0c;直接在接口方法里面实现映射。 domain层: 实现了数据库里面每一个…

Altium designer--软件简介及安装教程(Altium designer16)

一、软件介绍&#xff08;完整安装包资源见文末链接&#xff0c;含破解license&#xff09; Altium Designer 是一款简单易用、原生3D设计增强的一体化设计环境&#xff0c;结合了原理图、ECAD库、规则和限制条件、BoM、供应链管理、ECO流程和世界一流的PCB设计工具。通过原理…

Baumer工业相机中曝光与增益两种功能的优点和作用以及使用方法

项目场景 Baumer工业相机堡盟相机是一种高性能、高质量的工业相机&#xff0c;可用于各种应用场景&#xff0c;如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能&#xff0c;可以实时传输高分辨率图像。此外&#xff0c;该相机还具有…

[NOIP2009 提高组] 最优贸易(C++,tarjan,topo,DP)

题目描述 $C 国有国有国有 n 个大城市和个大城市和个大城市和 m$ 条道路&#xff0c;每条道路连接这 nnn个城市中的某两个城市。任意两个城市之间最多只有一条道路直接相连。这 mmm 条道路中有一部分为单向通行的道路&#xff0c;一部分为双向通行的道路&#xff0c;双向通行的…

OpenHarmony通过MQTT连接 “改版后的华为IoT平台”

一、前言 本篇文章我们使用的是BearPi-HM_Nano开发板:小熊派的主板+E53_IA1扩展板 源码用的是D6_iot_cloud_oc,点击下载BearPi-HM_Nano全量源码 那么为什么要写这篇呢? 前段时间看到OpenHarmony群里,经常有小伙伴问接入华为IoT平台的问题,他们无法正常连接到华为IoT平台等…

【数据结构】二叉树相关OJ题

文章目录一、单值二叉树二、检查两颗树是否相同三、判断一棵树是否为另一颗树的子树四、对称二叉树五、二叉树的前序遍历六、二叉树中序遍历七、二叉树的后序遍历八、二叉树的构建及遍历一、单值二叉树 单值二叉树 题目描述 如果二叉树每个节点都具有相同的值&#xff0c;那…

【互联网架构】聊一聊所谓的“跨语言、跨平台“

文章目录序跨语言跨平台【饭后杂谈】为什么有人说Java的跨平台很鸡肋&#xff1f;序 很多技术都具有跨语言、跨平台的特点 比如JSON是跨语言的、Java是跨平台的、UniAPP、Electron是跨平台的 跨语言和跨平台&#xff0c;是比较重要的一个特性。这些特性经常能够决定开发者是否…

软件测试项目实战,一比一还原可以写进简历的

项目一&#xff1a;ShopNC商城 项目概况&#xff1a; ShopNC商城是一个电子商务B2C电商平台系统&#xff0c;功能强大&#xff0c;安全便捷。适合企业及个人快速构建个性化网上商城。 包含PCIOS客户端Adroid客户端微商城&#xff0c;系统PC后台是基于ThinkPHP MVC构架开发的跨…

ubuntu-22.04.2网络配置和root登录和root远程ssh登录

配置网络&#xff1a; 1.查看网卡名称 ip addr(ifconfig 无法使用&#xff0c;需要后期安装) 2. 配置静态IP &#xff08;1&#xff09;进入网络配置文件&#xff1a; vim /etc/netplan/00-installer-config.yaml &#xff08;2&#xff09;按一下 i ,进入插入模式&#…

网络 | 数据链路层讲解 | MAC帧与APR协议

最大以太网帧大小指的是以太网帧从目的地址到冗余校验的总字节数。在802.3标准里&#xff0c;规定了一个以太网帧的数据部分(Payload)的最大长度是1500个字节&#xff0c;这个数也是MTU。在这个限制之下&#xff0c;最长的以太网帧包括6字节的目的地址(DMAC)、6字节的源地址(SM…

【C++】list的模拟实现

文章目录1.list 底层2. list的模拟实现1. list_node 类设计2. list类如何调用类型3 .push_back(正常实现)4. 迭代器的实现第一个模板参数Tconst迭代器第二个模板参数Ref第三个模板参数Ptr对list封装的理解5. insert6.push_back与 push_front(复用)7. erase8. pop_back与pop_fro…

[c++]list模拟实现

目录 前言&#xff1a; 学习类的方式&#xff1a; 1 类成员变量 1.1 list成员变量 1.2 结点结构体变量 1.3 迭代器成员变量 2 默认函数——构造 2.1 结点结构体构造函数 2.2 list构造函数 2.3 迭代器构造函数 3 迭代器实现 3.1 list部分 3.2 迭代器结构体部分 3.2…