您现在的位置是:首页 >技术交流 >day4-项目软硬件环境分析和通讯结构体网站首页技术交流
day4-项目软硬件环境分析和通讯结构体
硬件部分
fs4412开发板
3*zigbee模块
摄像头
gprs(用于通讯)
fs4412部分
3个USB接口分别用于zigbee协调器、usb摄像头、gprs模块
陀螺仪与加速计作为数据采集端,发送到HTML
USB-OTG用于安卓下载
电位器用于测量电压
蜂鸣器基于PWM来做
(A9主要处理数据和采集数据)
zigbee部分
主要负责采集数据
分层意识
数据显示部分(HTML)
数据处理和采集部分(A9)
数据采集部分(zigbee)
数据流
数据上行
zigbee->A9->html
数据下行
html->A9->zigbee
软件框架部分
通讯协议制定
两种意识:
1.分层意识
web网页端
1.环境信息--实时刷新
2.摄像头信息--采集监控信息
3.硬件控制命令
A9数据处理部分
1.创建进程线程
2.每条线程做自己的工作
3.设计进程间通信
4.数据处理-->分发(上行数据or下行数据)
A9-Zigbee数据采集部分
1.A9采集部分
2.zigbee数据采集部分
3.STM32平台(可以自己拓展)
2.数据流
数据上传、数据下发
制定通讯的协议(结构体):
数据怎么上传,上传的目的? 数据怎么下发,下发的目的?
数据上传->共享内存上传数据->显示并交给用户查看环境信息
数据下发->消息队列下发数据->控制硬件改变环境
********************************************************************
具体框架
分层分析:
web网页端显示分析
环境信息:(1)adc电压数据 (2)mpu6050的六轴数据 (3)温度 (4)湿度
摄像头采集图像
硬件控制:(1)风扇 (2)LED灯 (3)蜂鸣器 (4)GPRS->发短信或者打电话
A9数据处理部分
数据流向分析:
1.zigbee(采集终端)->A9(处理平台)
2.A9(处理平台)->网页(显示平台)
3.网页(显示平台)->A9(处理平台)
4.A9(处理平台)->zigbee(采集终端)
A9-Zigbee采集部分
外设驱动----在应用层去获取外设的状态或数据
A9------蜂鸣器---------蜂鸣器报警
----------LED灯---------卧室-厨房-公共照明
----------按键------------按键触发中断---控制灯
----------ADC------------获取ADC的采样数据
---------mpu6050--------获取MPU6050的六轴数据
zigbee-------adc------主---协调器
----------------风扇-----从---终端节点---下发命令控制风扇
----------------温湿度--从---终端节点---上传温湿度数据
--------------(光敏)
数据流分析:
数据上传
zigbee:温湿度数据
A9:ADC采集 加速计数器 陀螺仪数据
摄像头:视频流图像
数据下发
zigbee:风扇
A9:蜂鸣器 LED灯 四路LED灯模拟数码管
GPRS:3G通信模块
制定通信的结构体
数据的上传:
//考虑内存对齐的问题
structc makeru_zigbee_info{
uint8_t head[3]; //标识位:'m' 's' 'm' makeru-security-monitor
//若一个包的包头不是msm,则丢弃
uint8_t type; //数据类型 'z'--zigbee 'a'--a9
//加密算法
float tempreature; //温度
float humidity; //湿度
float tempMIN; //温度下限
float tempMAX; //温度上限
float humidityMIN; //湿度下限
float humidityMAX; //湿度上限
unit32_t reserved[2]; //保留拓展位,默认填充0
//void *data 内核预留的拓展接口
};
//考虑内存对齐的问题
structc makeru_a9_info{
uint8_t head[3]; //标识位:'m' 's' 'm' makeru-security-monitor
//若一个包的包头不是msm,则丢弃
uint8_t type; //数据类型 'z'--zigbee 'a'--a9
unit32_t adc;
short gyrox; //陀螺仪数据
short gyroy;
short gyroz;
short aacx; //加速计数据
short aacy;
short aacz;
unit32_t reserved[2]; //保留拓展位,默认填充0
//void *data 内核预留的拓展接口
};
struct makeru_env_data{
struct make_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
", msgbuf.msgtype);
printf ("text[0] = %#x
", msgbuf.text[0]);
A9-ZIGBEE通用指令
命令格式:一个字节,unsigned char 对应消息队列中正文的类型:
unsigned int
8位
----------------------------------------
7 6 | 5 4 | 3 2 1 0
平台编号| 设备编号 | 操作设备
----------------------------------------
0 0
0 1
1 0
1 1
平台编号
0x00 0号-ZigBee平台
0x40 1号-A9/A53平台
0x80 2号-STM32平台(可以自己扩展)
0xc0 3号-avr arduino....保留(如果平台继续增多的话可以采用2个字节或多个字节来对设备进行
唯一的编号,比如A9类下的1号平台,2号平台,先分类,然后再具体标识设备)
----------------------------------------
设备编号 操作掩码
0x00 LED 0x00 全部关闭
0x01 全部打开
0x02 打开LED2
0x03 打开LED3
0X04 打开LED4
0x05 打开LED5
0X10 打开流水灯
----------------------------------------
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 数码管显示8
0x40 + 0x30 + 0x0f = 0x7f 关闭数码管
a 高位数据,b代表低位数据
short c
unsigned char a ,b;
c = a | b;
c = a + b;
上行:封装的结构体====共享内存和信号量 ===>交给CGI(C语言和HTML语言之间的转化接口)===>交给HTML
下行:封装的命令字====消息队列 ====>msgbuf msgsnd===>控制命令字封装在msgsnd的msgbuf中 ===>A9端解析==>向下控制硬件