前言
到目前为止我也做个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];
uint8_t type;
------------->crc ...加密算法 <--------------
float temperature;
float humidity;
float light;
float tempMIN;
float tempMAX;
float humidityMIN;
float humidityMAX;
float lightMIN;
float lightMAX;
uint32_t reserved[2];
};
struct makeru_a9_info
{
uint8_t head[3];
uint8_t type;
uint32_t adc;
uint32_t reserved[2];
};
struct makeru_env_data
{
struct makeru_a9_info a9_info;
struct makeru_zigbee_info zigbee_info;
};
??数据的下发:(采用消息队列的方式下发数据到下位机上)
#define QUEUE_MSG_LEN 32
struct msg
{
long type;
long msgtype;
unsigned char text[QUEUE_MSG_LEN];
};
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、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无线传输的原理。
可能还有很多东西还要讲,但博主本人知识有限,无法讲的很全面,这里只是总结了一下从我做项目到现在的总结与感悟。我认为最重要的还是多去参与项目制作、多动手实践,这样才有一套自己的项目制作流程经验,感谢您能看到这里。
|