当前位置:   article > 正文

【Linux】实际项目应该如何完成?--安防监控系统项目的总结_嵌入式安防监控项目实战,华清远见

嵌入式安防监控项目实战,华清远见

前言

到目前为止我也做个5、6个嵌入式项目,但以往都是从零开始自己做,也就是毫无计划,想到那里做那里,有想法就会去实现,就这样导致我碰到了很多坑,也消耗了我许多时间,当然,不是说这样不好,因为在其中我也得到了一个很好的锻炼与练习,但是这不适用于在工作中去这样做。

首先,在这里感谢华清远见的老师提供的安防监控系统项目的教学视频;它让我知道如何从零完成一个实际开发中的项目制作,它帮我理清了项目制作的思路,也让我明白了一个好的计划与协议对于一个项目有多么重要。


一、个人感悟

  1、分层体系框架的设计思想

在设计嵌入式项目时,尽量在之前设计并绘制好项目的分层体系框架图

对于几乎大部分的嵌入式项目所涉及的都是多平台、多任务的开发;

以本项目来说,涉及到

  • HTML、CGI之间的数据通讯,它们是通过boa服务器进行通讯;
  • A9服务器与CGI之间的通讯;
  • zigbee与A9之间的通讯;
  • 平台自身的工作与多平台之间的相互访问

那么就需要将整个项目分层设计,将每一个平台分为一个成单独处理(可考虑多进程与多线程),在制定通信协议与选择通信方式可以让不同平台相互连接,当一个项目出现问题时,可以很快的定位到哪一层、哪一个任务出现了问题,不仅如此也方便了多数人的分工合作。

已本项目的分层设计为例:
在这里插入图片描述


  2、数据流向的考虑

嵌入式设计的最终目的是完成数据的正确传输,对于传输方式可以有多种,例如:蓝牙、wifi、3G/4G、串口等;

了解项目的数据流向,可以帮助我们正确的去绘制软件的体系框架、制定合理的通信内容、选择合适的通信方式。

以本项目为例:
在这里插入图片描述
本项目中的数据流向为

  • 上行数据: ZigBee–>A9–>网页(获得环境信息)
  • 下行数据:网页–>A9—>ZigBee(下发命令)

通信方式:

  • 数据的上传: ZigBee----> 共享内存+信号量上传数据 ----> 显示并交给用户
  • 数据的下发: 用于控制硬件:----> 消息队列下发数据 ----> 控制硬件

  3、通信内容统一的必要性

通信内容,即通讯结构体包含了我们要传递的数据内容

这样让整个项目中的信息都以相同的信息方式进行传输,方便于我们统一整个整个线程或者进程的通信

比如在本次项目中
  数据上传部分:

数据类型定义 	
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 light;     //光强
		float tempMIN;  //温度下限
		float tempMAX;  //温度上限 
		float humidityMIN;   //湿度下限
		float humidityMAX;   //湿度上限
		float lightMIN; //光强下限
		float lightMAX; //光强上限  
		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'---a9
	uint32_t adc;    //adc电压
	uint32_t reserved[2]; //保留扩展位,默认填充0
	//void *data;  内核预留的扩展接口  参考版
};
		
struct makeru_env_data
{
	struct makeru_a9_info a9_info;       //a9上传数据    
	struct makeru_zigbee_info zigbee_info;   //zigbee上传数据
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

  数据的下发:(采用消息队列的方式下发数据到下位机上)

//消息队列结构体
#define QUEUE_MSG_LEN 32                 
struct msg
{
	long type;   //从消息队列接收消息时用于判断的消息类型   
	long msgtype;//具体的消息类型 === 设备类型
	unsigned char text[QUEUE_MSG_LEN]; //消息正文  ====> CMD 控制指定的设备
};
long msgtype;//具体的消息类型
消息类型的分配:
	1L: 		LED控制
	2L:			蜂鸣器控制
	3L:			风扇
	4L:			温湿度、光强最值设置
	5L-6L-7L-8L,用于个人的扩展
	9L: 		3G通信模块-GPRS 
switch(msgbuf.msgtype){
	case 1L: ...  break;
	....
	default ....  break;
}
A9-ZIGBEE通用指令
命令格式: 一个字节,  unsigned char 对应消息队列中正文的类型: 

8----------------------------------------
7	6	|  5	4	|	3	2	1	0
平台编号 |  设备编号  |	操作设备
----------------------------------------
		 
平台编号	
0x00		00-0-ZigBee平台 
0x40		01-1-A9平台
0x80		10-2-STM32平台(扩展)
0xc0		11-3-保留(扩展)
		
----------------------------------------		
设备编号		操作掩码	
0x00	LED		0x00	全部关闭       0x40
				0x01	全部打开       0x41
				0x02	打开LED2       0x42
				0x03	打开LED3       0x43
				0X04	打开LED4       0x44
				0x05	打开LED5       0x45
				0x06    关闭LED2       0x46
				0x07    关闭LED3       0x47
				0x08    关闭LED4       0x48
				0x09    关闭LED5       0x49
----------------------------------------
0x10	蜂鸣器	0x00	关闭           0x50 
				0x01	打开           0x51 
				0x02	自动报警关闭   0x52 
				0x03	自动报警打开   0x53
----------------------------------------
0x20	风扇	0x00	关闭风扇       0x20
				0x01	打开风扇       0x21
----------------------------------------			
0x30	扩展	
----------------------------------------
		
控制命令:		
	平台编号 + 设备编号 + 操作掩码 = 命令 (命令的封装)
	例如:
			0x00 + 0x20 + 0x01 = 0x21   风扇打开
			0x40 + 0x10 + 0x01 = 0x51   蜂鸣器打开		
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65

二、项目知识点总结

  1、HTML网页设计与CGI

本次项目的设计中,采用HTML的方式进行web网页绘制,采用CGI对网页数据进行处理,使用boa服务器实现不同语言之间的通信,HTML与cgi之间的通讯使用form表单来实现的;这便是用户层的开发。


  2、HTML网页与A9的通信

  从网页发送消息到A9,通过CGI将网页的数据进行转化,并将数据添加到消息队列,这里便用到了消息队列的知识点,包括消息队列的创建(msgget)、接收消息(msgrcv)、发送消息(msgsnd);

  从A9刷新数据到网页是通过共享内存来实现的,CGI得到共享内存的数据并发送到网页上。这里就用到了共享内存的知识点,包括共享内存的创建(shmget)、映射(shmat)、撤销映射(shmdt);同时要加上信号量进行临界资源同步操作;


  3、多线程的设计思想

  A9平台是作为项目的核心平台,它使用多线程将多个任务分开处理与运行,并采用互斥锁、信号量、条件变量完成线程间的同步与互斥。

  A9平台通过串口向下控制ZigBee协调器,向上通过网线与PC端网页进行数据交互,这其中都需要线程分开进行处理。


  4、zigbee环境采集

  环境采集需要考虑到采集的内容,然后选择相应的传感器将要采集的环境信息数字化,这需要知道单片机开发的相关知识,要读懂芯片手册;以及了解传感器的用法以及数据处理的方法;并且掌握ZigBee无线传输的原理。


可能还有很多东西还要讲,但博主本人知识有限,无法讲的很全面,这里只是总结了一下从我做项目到现在的总结与感悟。我认为最重要的还是多去参与项目制作、多动手实践,这样才有一套自己的项目制作流程经验,感谢您能看到这里。
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/280110
推荐阅读
相关标签
  

闽ICP备14008679号