基于OrangePi Zero2的智能家居项目(开发阶段)
智能家居项目的软件实现
紧接上文 基于OrangePi Zero2的智能家居项目(准备阶段)-CSDN博客
目录
一、项目整体设计
1.1项目整体设计
1.2具体划分
二、开发工作的前期准备
1、进行分类,并用Makefile文件进行管理
参考:自己创建Makefile文件管理项目工程-CSDN博客
三、具体开发项目
1、添加语音监听接口
1.1 消息队列的实现
1.2语音控制模块的实现
编辑
1.3 消息队列函数的继续实现(在main函数里面实现)
1.4 放到香橙派上面进交叉编译
2、添加网络监听接口
2.1增加文件
2.2整理框架
2.3 优化细节,注意改动
2.4、编译好传送过去执行找问题
2.5 网络调试助手启动!
上面这张图的结果其实是错误的!!!
3、添加烟雾监听的接口
3.1 增加相应的文件
额外补充
3.2 补全smoke_interface.c
3.3 编译并发送
3.4 具体演示(见后续安装)
ps:优化之前写的代码(语音,socket,火灾)
4、添加消息接收监听接口
4.1 添加相应的文件
4.2 补全一部分代码,初始化消息,关闭消息
4.3 receive_get函数的实现
4.4 实现控制 设备(灯、风扇)线程的功能函数
4.5 编译测试成功
5、添加设备类结点接口(用消息接收监听队列去控制设备)
5.1 创建被控设备的链表结点编辑
5.2 添加相应的文件(毕竟是个被控设备链表)
5.3 具体实现控制的设备要怎么控制
6、添加各类的被控设备结点
6.1 添加被控设备----客厅灯
ps:对oled显示做一个处理
编译测试.....(待补充)
6.2 添加卧室灯控制代码
编译测试.....(待补充)
6.3 添加风扇控制代码
编译测试.....(待补充)
6.4添加火灾报警(烟雾报警)检测功能
添加对应的文件
修改一下smoke_interface.c里面的值
增加蜂鸣器的报警
编译测试.....(待补充)
6.5 增加OLED显示功能
编译测试.....(待补充)
7 添加人脸识别开锁
7.1 添加对应的文件
7.2判断人脸的数据才能开门
7.3 开门之后也要关门
7.4 配置摄像头
7.5 报错
7.6 编译测试
四、ini文件解析本次项目
前言
1、什么是 ini文件配置格式
2、下载源码和解析文件
3、在项目中运用ini文件
3.1 编译运行
3.2 项目优化
4、用ini配置文件去优化本次项目的代码
4.1 先把以前的设备文件删除
4.2 添加新的代码
4.3 更改配置文件的路径
一、项目整体设计
1.1项目整体设计
1.2具体划分
定义两个统一特征的结构体(控制与被控),都是通过链表进行连接
控制设备
被控设备
二、开发工作的前期准备
1、进行分类,并用Makefile文件进行管理
参考:自己创建Makefile文件管理项目工程-CSDN博客
三、具体开发项目
1、添加语音监听接口
1.1 消息队列的实现
1.2语音控制模块的实现
.
头插法的实现,串成一个一个的设备节点
main.c
1.3 消息队列函数的继续实现(在main函数里面实现)
main.c里面继续封装消息队列的实现
终于知道voice_get里面的mqd怎么传参了
编译通过
1.4 放到香橙派上面进交叉编译
再用mqtest传到香橙派进行测试
2、添加网络监听接口
2.1增加文件
2.2整理框架
2.3 优化细节,注意改动
2.4、编译好传送过去执行找问题
2.5 网络调试助手启动!
上面这张图的结果其实是错误的!!!
3、添加烟雾监听的接口
3.1 增加相应的文件
smoke.h
补全一部分的smoke_interface.c
额外补充
3.2 补全smoke_interface.c
3.3 编译并发送
3.4 具体演示(见后续安装)
ps:优化之前写的代码(语音,socket,火灾)
4、添加消息接收监听接口
4.1 添加相应的文件
4.2 补全一部分代码,初始化消息,关闭消息
4.3 receive_get函数的实现
4.4 实现控制 设备(灯、风扇)线程的功能函数
4.5 编译测试成功
5、添加设备类结点接口(用消息接收监听队列去控制设备)
5.1 创建被控设备的链表结点
5.2 添加相应的文件(毕竟是个被控设备链表)
5.3 具体实现控制的设备要怎么控制
6、添加各类的被控设备结点
6.1 添加被控设备----客厅灯
往消息接收线程函数里面,声明客厅灯的初始化
ps:对oled显示做一个处理
编译测试.....(待补充)
6.2 添加卧室灯控制代码
编译测试.....(待补充)
6.3 添加风扇控制代码
编译测试.....(待补充)
6.4添加火灾报警(烟雾报警)检测功能
这里补充一下,蜂鸣器报警的流程:先是烟雾传感器检测到有烟雾时,将数据发送给板子,板子接收到发过来的数据之后,再去触发蜂鸣器
添加对应的文件
这里的.voice_set_status 其实是“1” 要设置的
修改一下smoke_interface.c里面的值
增加蜂鸣器的报警
pthread_create就这样就行了,不用在添加其他的东西
编译测试.....(待补充)
6.5 增加OLED显示功能
编译测试.....(待补充)
7 添加人脸识别开锁
7.1 添加对应的文件
7.2判断人脸的数据才能开门
7.3 开门之后也要关门
7.4 配置摄像头
参考文章:
基于OrangePi的智能垃圾桶(全程可实现)-CSDN博客
7.5 报错
记录关于智能家居的路程的一个bug___Segmentation fault(段错误)-CSDN博客
7.6 编译测试
四、ini文件解析本次项目
前言
上述的项目的基本功能都已实现,但是存在值得优化的地方
解决办法:写一个固定的配置文件,直接添加设备就行了
所以就引入了 ini文件配置格式
1、什么是 ini文件配置格式
关键就是 键值对
2、下载源码和解析文件
apt-cache search libinih
一个简单的ini文件的一个解析
sudo apt source libinih-dev
安装源码包(此时可以尝试使用root权限来安装)
进入文件夹
查看 示例代码
3、在项目中运用ini文件
3.1 编译运行
这里补充一点:代码中没有循环语句,说明这个handle是多次调用的
3.2 项目优化
把文件添加到ini文件夹进行测试
ini_test.c
/* Example: parse a simple configuration file */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "ini.h"
#include "gdevice.h"#ifndef OUTPUT
#define OUTPUT 1
#define INPUT 0
#endif#ifndef LOW
#define LOW 0
#define HIGH 1
#endif //像receive文件里面那样添加被控设备链表
static struct gdevice *pdevhead = NULL;#define MATCH(s, n) strcmp(section, s) == 0 && strcmp(name, n) == 0// if (MATCH("protocol", "version"))static int handler_gdevice(void* user, const char* section, const char* name,const char* value)
{//创建被控设备的临时的指针struct gdevice *pgdev = NULL;//找设备的逻辑就是:如果section都是一个字段,那么其他的东西(name value)肯定都是一个设备的//所以,我们只要找到一个section,那么这个section下面的所有name value就是同一个设备的//先找到section,再找name value,或者创建一个结构体,存放name value这些值if(NULL == pdevhead){pdevhead = (struct gdevice *)malloc(sizeof(struct gdevice));pdevhead->next = NULL;memset(pdevhead, 0, sizeof(struct gdevice));strcpy(pdevhead->dev_name, section); //把section赋值给当前设备的名字}//第一个添加结点是没错这样,但是第二个结点添加进来的时候就有空间了else if (0 != strcmp(pdevhead->dev_name, section)){pgdev = (struct gdevice *)malloc(sizeof(struct gdevice));memset(pgdev, 0, sizeof(struct gdevice));strcpy(pgdev->dev_name, section);//头插法pgdev->next = pdevhead;pdevhead = pgdev;}if(NULL != pdevhead){if(MATCH(pdevhead->dev_name, "key")) //假如第一个进来的是lock,就是挨着挨揍去比对他的key、gpio_pin、gpio_mode、gpio_status、check_face_status、voice_set_status这些值{sscanf(value , "%x" , &pdevhead->key); //value是一个作为输入的值,想让其输出为16进制变成指令,所以%xprintf("%d | pdevhead->key = %x\n" , __LINE__,pdevhead->key);}else if (MATCH(pdevhead->dev_name, "gpio_pin")){pdevhead->gpio_pin = atoi(value); //把字符串转换成整数}else if(MATCH(pdevhead->dev_name, "gpio_mode")){if(strcmp(value, "OUTPUT") == 0){pdevhead->gpio_mode = OUTPUT; //OUTPUT}else if(strcmp(value, "INPUT") == 0){pdevhead->gpio_mode = INPUT; //INPUT}}else if(MATCH(pdevhead->dev_name, "gpio_status")){if(strcmp(value, "LOW") == 0){pdevhead->gpio_mode = LOW; }else if(strcmp(value, "HIGH") == 0){pdevhead->gpio_mode = HIGH; }}else if(MATCH(pdevhead->dev_name, "check_face_status")){pdevhead->check_face_status = atoi(value); //把字符串转换成整数}else if(MATCH(pdevhead->dev_name, "voice_set_status")){pdevhead->voice_set_status = atoi(value); //把字符串转换成整数}}//打印有多少个ini文件里面的设备printf("---secition: %s, name: %s, value: %s\n", section, name, value);return 1;
}int main(int argc, char* argv[])
{if (ini_parse("gdevice.ini", handler_gdevice, NULL) < 0) {printf("Can't load 'gdevice.ini'\n");return 1;}//测试struct gdevice *pdev = pdevhead;while(pdev){printf("pdev->dev_name = %s\n", pdev->dev_name);printf("pdev->key = %x\n", pdev->key);printf("pdev->gpio_pin = %d\n", pdev->gpio_pin);printf("pdev->gpio_mode = %d\n", pdev->gpio_mode);printf("pdev->gpio_status = %d\n", pdev->gpio_status);printf("pdev->check_face_status = %d\n", pdev->check_face_status);printf("pdev->voice_set_status = %d\n", pdev->voice_set_status);pdev = pdev->next;}return 0;
}
编译运行:
4、用ini配置文件去优化本次项目的代码
4.1 先把以前的设备文件删除
4.2 添加新的代码
4.3 更改配置文件的路径
相关文章:
基于OrangePi Zero2的智能家居项目(开发阶段)
智能家居项目的软件实现 紧接上文 基于OrangePi Zero2的智能家居项目(准备阶段)-CSDN博客 目录 一、项目整体设计 1.1项目整体设计 1.2具体划分 二、开发工作的前期准备 1、进行分类,并用Makefile文件进行管理 参考:自己创…...
数据结构记录
之前记录的数据结构笔记,不过图片显示不了了 数据结构与算法(C版) 1、绪论 1.1、数据结构的研究内容 一般应用步骤:分析问题,提取操作对象,分析操作对象之间的关系,建立数学模型。 1.2、基本概念和术语 数据&…...
从零到一:基于 K3s 快速搭建本地化 kubeflow AI 机器学习平台
背景 Kubeflow 是一种开源的 Kubernetes 原生框架,可用于开发、管理和运行机器学习工作负载,支持诸如 PyTorch、TensorFlow 等众多优秀的机器学习框架,本文介绍如何在 Mac 上搭建本地化的 kubeflow 机器学习平台。 注意:本文以 …...
kettle使用MD5加密增量获取接口数据
kettle使用MD5加密增量获取接口数据 场景介绍: 使用JavaScript组件进行MD5加密得到Http header,调用API接口增量获取接口数据,使用json input组件解析数据入库 案例适用范围: MD5加密可参考、增量过程可参考、调用API接口获取…...
PS入门|黑白色的图标怎么抠成透明背景
前言 抠图可以算是PS的入门必备操作,开始学习PS的小伙伴可以根据本帖子推荐一步步学习哦!但切勿心急~ 今天给小伙伴们带来:黑白色的图标抠图教程 抠图有很多种方法,但根据类型的不同,使用适当的方法很重…...
android 14 apexd分析(2)apexd 启动
1. class main进程一起启动, apexservice是他提供的binderservice,这也第二阶段的最主要的作用 /system/apex/apexd/apexd.rc?r3c8e8603c640fc41e0406ddcf981381803447cfb#1 1 service apexd /system/bin/apexd 2 interface aidl apexservice …...
微信小程序怎么制作?制作一个微信小程序需要多少钱?
随着移动互联网的快速发展,微信小程序已成为连接用户与服务的重要桥梁。它以其便捷性和易用性,为各类企业和个人提供了一个全新的展示和交易平台。那么,如何制作一个微信小程序?又需要投入多少资金呢?本文将为您提供全…...
WPS二次开发专题:如何获取应用签名SHA256值
作者持续关注WPS二次开发专题系列,持续为大家带来更多有价值的WPS开发技术细节,如果能够帮助到您,请帮忙来个一键三连,更多问题请联系我(QQ:250325397) 在申请WPS SDK授权版时候需要开发者提供应用包名和签…...
Flink SQL系列之:基于Flink SQL查询Topic中序列化的Debezium数据格式字段
Flink SQL系列之:基于Flink SQL查询Topic中序列化的Debezium数据格式字段 一、表结构二、查询Topic中表的数据三、反序列化字段一、表结构 CREATE TABLE IF NOT EXISTS record_rt (id decimal(20,0) COMMENT "主键",follow_entity_type <...
【WPF应用30】WPF中的ListBox控件详解
WPF(Windows Presentation Foundation)是.NET框架的一个组成部分,用于构建桌面应用程序的用户界面。ListBox是WPF中一个非常常用的控件,用于显示一系列的项,用户可以选择单个或多个项。 1.ListBox的基本概念 ListBox…...
Chatgpt掘金之旅—有爱AI商业实战篇(二)
演示站点: https://ai.uaai.cn 对话模块 官方论坛: www.jingyuai.com 京娱AI 一、前言: 成为一名商业作者是一个蕴含着无限可能的职业选择。在当下数字化的时代,作家们有着众多的平台可以展示和推广自己的作品。无论您是对写书、文…...
AGI时代,LLM可以在AutoML哪些环节进行增强?
当下大模型技术发展如火如荼,颇有改变各行业和各领域的架势。那么对于AutoML来讲,LLM对其有哪些助力?对于这个问题,我们来问一问kimi chat,看看它怎么回答? 大型语言模型(LLM)可以在…...
算法练习—day1
title: 算法练习—day1 date: 2024-04-03 21:49:55 tags: 算法 categories:LeetCode typora-root-url: 算法练习—day1 网址:https://red568.github.io 704. 二分查找 题目: 题目分析: 左右指针分别为[left,right],每次都取中…...
关于ansible的模块 ③
转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 接《关于Ansible的模块①》和《关于Ansible的模块②》,继续学习ansible的user模块。 user模块可以增、删、改linux远…...
Spring Boot--文件上传和下载
文件上传和下载 前言文件上传1、以MultipartFile 接口流文件,流的名称需要和前台传过来的名称对应上2、获取到文件名称截取后缀3、为了放置文件名重复使用uuid来随机生成id后缀4、判断转存路径中是否有这个文件夹如果没有就创建5、将文件存储到转存的目录中 文件下载…...
hexo博客7:构建简单的多层安全防御体系
【hexo博客7】构建简单的多层安全防御体系 写在最前面理解全面安全策略的重要性防御常见的网络攻击1. SQL注入攻击2. 文件上传漏洞3. 跨站脚本攻击(XSS)4. 跨站请求伪造(CSRF)5. 目录遍历/本地文件包含(LFI/RFI&#x…...
《捕鱼_ue4-5输出带技能的透明通道素材到AE步骤》
《捕鱼_ue4-5输出带技能的透明通道素材到AE步骤》 2022-05-17 11:06 先看下带透明的特效素材效果1、首先在项目设置里搜索alpha,在后期处理标签设置最后一项allow through tonemapper2、在插件管理器中,搜索movie render ,加载movie render q…...
(免费分享)基于微信小程序自助停取车收费系统
本项目的开发和制作主要采用Java语言编写,SpringBoot作为项目的后端开发框架,vue作为前端的快速开发框架,主要基于ES5的语法,客户端采用微信小程序作为开发。Mysql8.0作为数据库的持久化存储。 获取完整源码: 大家点赞…...
Vue3_2024_7天【回顾上篇watch常见的后两种场景】___续
Vue3中监听多条数据的两种使用 1.watch【使用上一章写法,监听两个属性,然后执行相应操作…】 2.watchEffect【相对于使用watch,watchEffect默认页面初始加载,有点类似加配置:立即执行 immediate】 代码: …...
Gemini即将收费,GPT无需注册?GPT3.5白嫖和升级教程
🌐Gemini 即将开始收费 开发者“白嫖”的好日子到头了 - Gemini将开始收费,影响使用Google AI for Developers提供的Gemini API的用户。 - Gemini API将引入按量付费定价,需要注意新的服务条款。 - 用户需在5月2日之前停止使用Gemini API和Go…...
【协议篇:Http与Https】
1. Http 1.1 Http的定义 超文本传输协议(Hypertext Transfer Protocol,HTTP)是用于分布式、协作式和超媒体信息系统的应用层协议。它是互联网上最广泛应用的数据通信协议之一,尤其对于万维网(WWW)服务而言…...
WPS二次开发系列:WPS SDK初始化
作者持续关注WPS二次开发专题系列,持续为大家带来更多有价值的WPS开发技术细节,如果能够帮助到您,请帮忙来个一键三连,更多问题请联系我(QQ:250325397) 本文将详细介绍WPS SDK初始化,帮您能够更…...
EXCEL地理数据处理工具(地图任务)
版本号 作者 修订内容 发布日期 1.0 小O 更新至0705版 2022-4-28 1.1 小O 更新至0772版 2024年4月3日 一、概述 小O地图EXCEL插件版提供基于EXCEL表格进行地理数据处理、地图可视化、地图绘图等功能,地理工具是用户使用频率很高的功能模块。地理工具能…...
软件设计原则:迪米特法则
定义 迪米特法则(Law of Demeter, LoD),又称最少知识原则,它指导我们在设计软件时,应当尽量减少对象之间的交互,一个对象应该对其他对象有尽可能少的了解。具体来说,一个对象应该只调用属于以下…...
MongoDB聚合运算符:$max
文章目录 语法使用空值和缺失值的处理数组操作数的处理 举例在$group阶段使用在$setWindowFields阶段使用在$project阶段使用 $max聚合运算符用于返回最大值。 $max对于不同的类型的值使用BSON的比较顺序。 $max可以用于下面的这些阶段: $addFields$bucket$bucket…...
神经网络学习笔记10——RNN、ELMo、Transformer、GPT、BERT
系列文章目录 参考博客1 参考博客2 文章目录 系列文章目录前言一、RNN1、简介2、模型结构3、RNN公式分析4、RNN的优缺点及优化1)LSTM是RNN的优化结构2)GRU是LSTM的简化结构 二、ELMo1、简介2、模型结构1)输入2)左右双向上下文信…...
Java23种设计模式
本文主要是对Java中一些常用的设计模式进行讲解 后期会进行不断的更新,欢迎浏览 23种设计模式 创建型模式,共五种:工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式。结构型模式,共七种:适配器模式、桥接…...
pieces of cake concerning torchtorchvision
1. version match torchvision的版本对应关系 2. utilize tqdm to present process bar lay a pbar from tqdm import tqdm pbar tqdm(unit"batch", filesys.stdout,totallen(self.training_dataloader)) #处理单位为batch pbar2 tqdm(range(20), descIt\s a t…...
如何在Python中处理JSON数据?
如何在Python中处理JSON数据? 在Python中处理JSON数据是一个常见的任务,因为JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它易于人阅读和编写,同时也易于机器解析和生成。Python的内置库…...
站群服务器如何提高搜索引擎排名
站群服务器是一种专门为多个相关联的网站提供支持的服务器,旨在通过网站集合的形式提高搜索引擎排名和曝光度。那么站群服务器如何提高搜索引擎排名呢?Rak部落小编为您整理发布。 站群服务器提高搜索引擎排名的原理主要在于以下几个方面: - **提高网站…...
电子商务网站建设影响因素/新品上市的营销方案
apache flinkApache flink是下一代大数据工具,也称为4G大数据。 这是真正的流处理框架(不会将流切成小批)。 Flink的内核(核心)是流式运行时,它还提供分布式处理,容错等功能。Flink以一致的高速…...
wap网站 开发/百度用户服务中心
Python for 循环语句 Python for循环可以遍历任何序列的项目,如一个列表或者一个字符串。 语法:...
东莞常平建网站公司/百度引擎提交入口
Kubernetes创建初期,其本身在业界地位并不占优,前有长期占有主流市场的Mesos和基于Mesos的DCOS围追堵截,后有Docker Swarm依托自己的容器事实标准异军突起,反倒是Kubernetes只有谷歌的品牌。Kubernetes为什么能最后胜出࿰…...
门户网站开发是什么/google登录入口
基于Matlab的湘江水质重金属污染预测模型研究 安徽农业科学 。 J o arn a l o f A n h u i A g fi .S c i . 2 0 1 2。 4 0 ( 9) : 5 4 9 6— 5 4 9 8 责任编辑杨莹莹责任校对况玲玲 基于 Ma t l a b的湘江水质重金属污染预测模型研究 宁 可 …...
wordpress设置固定链接后/线下营销推广方式都有哪些
一、前言 今天是三月八号,祝各位女神节日快乐,虽然看到可能都是大老爷们,言归正传一月二十二号,在外地工作的我,准备从上海回到湖北老家,前几天就听同事说当时肺炎有点严重,但是当时其实并没有…...
怎么找网站的后台地址/网络推广如何收费
年年岁岁花相似,岁岁年年各不同,当气温渐暖时,又即将迎来新一届毕业生大军进入社会,而这新的大军里的面孔已焕然一新,也许你就是其中的一员。 初出校园,毕竟学校不同于社会,学习不同于工作。每个…...