三、通信结构体的定义

通信结构体包含了我们要传递的数据内容,比如本项目中,那些数据是用来表示采集到的环境信息的,那些数据是用来控制控制硬件的;项目前期合理的设计通讯结构体,避免项目设计后期修改的麻烦;

1、分层分析

  • web网页显示环境信息、控制硬件

    • 环境信息——数据刷新线程
      • mpu6050数据采集
      • ADC数据采集
      • 温湿度
    • 摄像头采集
    • 硬件控制
      • LED——LED线程 pthread_led
      • 蜂鸣器——蜂鸣器线程 pthread_buzzer
      • 风扇——串口线程 串口下发至协调器进行控制
  • A9数据处理部分

    • 创建进程、线程
    • 进程间通信——同步与互斥
    • 对接收到的数据进行处理
      • 环境信息——上传
      • 控制信息——下发
  • 数据采集,控制硬件

    • A9采集
    • zigbee采集
    • A9控制
    • zigbee控制

2、数据流分析

  • 数据上传
    • 通过共享内存上传数据——shm(共享内存)+sem(信号量)
  • 数据下发
    • 通过消息队列下发数据——msg

3、通信结构体

3.1、需要上传的数据

对数据类型定义
typedef uint8_t  unsigned char;     
typedef uint16_t unsigned short;
typedef uint32_t unsigned int;

zigbee端采集部分
struct makeru_zigbee_info{
		uint8_t head[3]; 		//标识位: 'm' 's' 'm'  makeru-security-mon;itor  
		uint8_t type;	 		//数据类型  'z'---zigbee  'a'---a9
		float temperature; 		//温度
		float humidity;  		//湿度
		float tempMIN;			//温度下限
		float tempMAX;			//温度上限 
		float humidityMIN;  	//湿度下限
		float humidityMAX;  	//湿度上限
		uint32_t reserved[2];	//保留扩展位,默认填充0
		//void *data;  内核预留的扩展接口  参考版
};
A9端采集部分
struct makeru_a9_info{
		uint8_t head[3]; 		//标识位: 'm' 's' 'm'  makeru-security-monitor  
		uint8_t type;	 		//数据类型  'z'---zigbee  'a'---a9
		uint32_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];	//数组  老家---新家
};

3.2、需要下发的数据

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

相关API
#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,用于个人的扩展
	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]);

3.3、控制命令字的制定

命令格式:一个字节,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 + 0x00 + 0x00 = 0x40   led关
		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;
风扇;4L  开--0x21 
         关--0x20
seg: 3L  0--0x70  1--0x71 2--0x72 3--0x73 4--0x74 5--0x75 6--0x76 7--0x77
         8--0x78 9--0x79 10--0x7a 11--0x7b 12--0x7c 13--0x7d 14--0x7e 15--0x7f 
beep: 2L 关--0x50
         开--0x51
led:  1L 关--0x40
         开--0x41
sqlite: 6L 查询:0x60

上行:封装的结构体====共享内存和信号量 ===>交给CGI(C语言和HTML语言之间的转化接口)===>交给HTML
下行:封装的命令字====消息队列 ====>msgbuf msgsnd===>控制命令字封装在msgsnd的msgbuf中 ===>A9端解析==>向下控制硬件
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值