day4-项目软硬件环境分析和通讯结构体

news2024/12/25 9:16:11

硬件部分

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\n", msgbuf.msgtype);
			printf ("text[0] = %#x\n", 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端解析==>向下控制硬件

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

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

相关文章

【LeetCode中等】二进制矩阵中的最短路径

给你一个 n x n 的二进制矩阵 grid 中&#xff0c;返回矩阵中最短 畅通路径 的长度。如果不存在这样的路径&#xff0c;返回 -1 。 二进制矩阵中的 畅通路径 是一条从 左上角 单元格&#xff08;即&#xff0c;(0, 0)&#xff09;到 右下角 单元格&#xff08;即&#xff0c;(…

在TP6.0引入Bootstrap4分页样式

1. TP6.0 默认分页 默认分页驱动类文件 vendor/topthink/think-orm/src/paginator/driver/Bootstrap.php 默认分页代码 <ul class"pagination"> <li><a href"?page1">&laquo;</a></li> <li><a hre…

​Win10更新清理怎么做?

“我有一台华硕二合一笔记本电脑&#xff0c;发现它开始运行缓慢。有时&#xff0c;屏幕会卡在加载界面上&#xff0c;不得不重新启动。为了让电脑更加流畅&#xff0c;我已经将其更新到Windows 10版本&#xff0c;现在希望通过Win10更新清理来进一步提升性能。请问如何进行Win…

电脑重装win11系统好还是win10好

随着Windows 11的发布&#xff0c;许多用户开始思考&#xff0c;是应该升级到Windows 11还是继续使用Windows 10&#xff1f;本文将为您比较Windows 11和Windows 10的优势与劣势&#xff0c;帮助您选择适合自己的操作系统。 工具/原料&#xff1a; 系统版本&#xff1a;window…

Windows Copilot,来了!

公众号关注 “GitHubDaily” 设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01; 5 月 23 日&#xff0c;微软 2023 Build 开发者大会正式开幕&#xff0c;跟 Google I/O 和 Apple WWDC 一样&#xff0c;每年微软都会在 Build 大会上发布各种新产品。 由于最近几个月 Cha…

CNNs和视觉Transformer:分析与比较

探索视觉Transformer和卷积神经网络&#xff08;CNNs&#xff09;在图像分类任务中的有效性。 图像分类是计算机视觉中的关键任务&#xff0c;在工业、医学影像和农业等各个领域得到广泛应用。卷积神经网络&#xff08;CNNs&#xff09;是该领域的一项重大突破&#xff0c;被广…

软考网工计算题总结(一):总共33类题型,进来复习啦!

题型一&#xff1a; 1.地址编号从80000H到BFFFFH且按字节编址的内存容量为&#xff08;5&#xff09;KB,若用16KX4bit的存储芯片够成该内存&#xff0c;共需&#xff08;6&#xff09;片。 (5)A.128 B.256 C.512 D.1024 (6)A.8 B.16 C.32 D.64 【答案】B C 【解析】本题…

springboot入门简单使用

springboot入门简单使用 1、SpringBoot项目创建并配置mysql数据库创建项目编写Controller测试配置数据库 2、SpringBoot集成mybatis-plus初始化数据库安装mybatis-plus通过mybatis-plus将数据库数据通过接口显示 3、SpringBoot三层架构Controller、Service、Dao4、SpringBoot集…

【鲁棒、状态估计】用于电力系统动态状态估计的鲁棒迭代扩展卡尔曼滤波器研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

自动化测试技术相结合的测试方法

自动化测试技术相结合的测试方法 随着软件开发的不断进步和变革&#xff0c;测试也越来越重要。为了提高测试效率和质量&#xff0c;自动化测试技术相结合的测试方法得到了广泛应用。 自动化测试是一种利用工具和脚本自动执行测试任务的测试方法。通过自动化测试&#xff0c;可…

【产品设计】工具类产品,带一些社交元素

工具类产品要加入社交元素&#xff0c;关键在于找到工具与社交的结合点。 一、工具类的产品&#xff0c;可以这样加入社交元素 1、分开来看&#xff1a;工具类产品和社交类产品 工具类产品&#xff0c;顾名思义&#xff0c;以工具属性为主&#xff0c;核心突出的是一个“用”…

UE5.1.1C++从0开始(11.AI与行为树)

怕有些朋友不知道教程指的是哪一个&#xff0c;我在这里把教程的网址贴出来&#xff1a;https://www.bilibili.com/video/BV1nU4y1X7iQ?p1 这一章开始进入电脑玩家逻辑的编写&#xff0c;因为是第一次接触&#xff0c;所以老师也没有讲什么很难的问题&#xff0c;这里还是老样…

React学习笔记七-事件处理

此文章是本人在学习React的时候&#xff0c;写下的学习笔记&#xff0c;在此纪录和分享。此为第七篇&#xff0c;主要介绍react中的事件处理。 事件处理 &#xff08;1&#xff09;通过onXxx属性指定事件处理函数&#xff08;注意大小写&#xff09; 1.react使用的是自定义(合…

01_JVM快速入门

从面试开始&#xff1a; 请谈谈你对JVM 的理解&#xff1f;java8 的虚拟机有什么更新&#xff1f; 什么是OOM &#xff1f;什么是StackOverflowError&#xff1f;有哪些方法分析&#xff1f; JVM 的常用参数调优你知道哪些&#xff1f; 内存快照抓取和MAT分析DUMP文件知道吗…

2023年第十五届电工杯选题浅析

本次电工杯作为2023年上半年度数学建模赛事的收官之战&#xff0c;报名队伍最后截止统计已经达到12000支队伍&#xff0c;同时免费的报名费也让这个收官之战&#xff0c;被很多建模小白当作第一次练手赛。为了帮助大家选题&#xff0c;下面为大家带来AB两题的思路浅析&#xff…

凌恩生物文献分享 | 癌症领域新曙光——肿瘤内微生物

上一期我们给大家介绍了肿瘤胞内菌在癌症转移中发挥的作用。2022年12月&#xff0c;蔡尚老师团队在Cell子刊-Trends in Cell Biology上又发表了一篇总结肿瘤内菌群在癌症转移中最新发现的综述&#xff0c;其中讨论了癌症治疗遇到的新挑战。 研究亮点 1&#xff09;癌症转移是…

Leetcode 1679. K 和数对的最大数目 双指针法

https://leetcode.cn/problems/max-number-of-k-sum-pairs/ 给你一个整数数组 nums 和一个整数 k 。 每一步操作中&#xff0c;你需要从数组中选出和为 k 的两个整数&#xff0c;并将它们移出数组。 返回你可以对数组执行的最大操作数。 示例 1&#xff1a; 输入&#xff1…

【JS】1693- 重学 JavaScript API - Web Storage API

❝ 前期回顾&#xff1a; 1. Page Visibility API 2. Broadcast Channel API 3. Beacon API 4. Resize Observer API 5. Clipboard API 6. Fetch API 7. Performance API ❞ 在 Web 开发中经常需要在客户端保存和获取数据&#xff0c;Web Storage API 提供了一种在浏览器中存储…

【sop】含储能及sop的多时段配网优化模型

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 之前分享了含sop的配电网优化模型&#xff0c;链接含sop的配电网优化,很多同学在咨询如何增加储能约束&#xff0c;并进行多时段的优化&#xff0c;本次拓展该部分功能&#xff0c;在原代码的基础上增加储能模…

Paragon NTFS2023最新mac免费实用工具磁盘工具

mac虽然系统稳定&#xff0c;但在使用过程中也有一些瑕疵&#xff0c;如当mac连接到ntfs格式移动磁盘时&#xff0c;可能会出现移动磁盘无法在mac被正常读写的状况。遇到移动磁盘无法正常读写的状况&#xff0c;我们可以在mac中使用磁盘工具&#xff0c;以使mac获得对ntfs格式移…