智能家居

项目流程

在智能家具项目中,会对之前学过的知识进行一个整合,并且采用内核式的代码设计模式,让代码阅读起来更加清醒明了。

代码设计模式

设计模式是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。让代码更容易被他人理解、保证代码可靠性、程序的稳定性。

是从建筑设计域引入到计算机科学来的。

设计模式一共有23种,我们学习工厂模式

设计模式通常描述了一组相互紧密作用的类与对象

类和对象

类:是一种用户自定义的数据类型,也称类类型(在c语言种就是结构体)。

例如

struct Animal
{
	int age;
	int sex;
	void (*peat)();
	void (*pbeat)();
};

//这就是一个类

对象:类的一种具象

例如

struct Aniaml dog;
struct Aniaml cat;
struct Aniaml person;

//启动 dog cat person 就是类的一个对象

结构体赋值的几种方式

在原先的代码种,我们要对结构体变量进行赋值,采用的方式通常是这种方式

struct Animal
{
	int age;
	int sex;
	void (*peat)();
	void (*pbeat)();
};

struct Animal dog = {1,2,dogEat,dogBeat};

这种方式的确定是,有些结构体成员,我们不需要,也要给他附上值。
我们要对自己需要的结构体成员进行赋值
可以这样赋值!!!对仅需要的成员进行赋值

struct Animal dog = {
	.peat = dogEat,
	.pbeat = dogBeat
}

工厂模式的引入

工厂模式(Factory Pattern)是最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

  1 #include <stdio.h>
  2 
  3 struct Animal
  4 {
  5     int age;
  6     int sex;
  7     void (*peat)();
  8     void (*pbeat)();
  9 };
 10 
 11 void dogEat()
 12 {
 13     printf("dog eat\n");
 14 }
 15 
 16 void catEat()
 17 {
 18     printf("cat eat\n");
 19 }
 20 
 21 void personEat()
 22 {
 23     printf("person eat\n");
 24 }
 25 
 26 int main()
 27 {
 28     struct Animal dog;
 29     struct Animal cat;
 30     struct Animal person;
 31 
 32     dog.peat = dogEat;
 33     cat.peat = catEat;
 34     person.peat = personEat;
 35 
 36     dog.peat();
 37     cat.peat();
 38     person.peat();
 39 
 40     return 0;
 41 }
                         

例如,在上述的代码中,我们创建了多个对象,在main函数中,我们暴露的对象的创建逻辑

但是引入工厂模式以后,对象的创建逻辑在main函数中不可见,用户只管调用就可以。

工厂模式的实现

例如上图所示,所谓工厂模式,就是将所有的设备分开编写,每一个设备都是一个独立的文件,将一个设备所有的功能(函数)写到一个结构体里面,并通过链表,将这些设备链接在一起。

image-20230620161758288

工程模式添加设备,首先在cat.c中定义一个结构体,cat.c中包含了cat的所用功能实现代码,putCatInLink是给用户添加cat设备的接口,用户调用这个函数,就可以将cat设别添加进链表,用户就可以通过链表访问到cat设备的功能。

用户调用

image-20230620162204821

树莓派安装摄像头

树莓派监控的实现,使用的是一个库,叫做mjpeg-streamer

● mjpg‐streamer是一个开源软件,用于从摄像头采集图像,它将JPEG帧从一个或多个输入插件复制到多个输出插件。它可用于通过基于IP的网络将JPEG文件从网络摄像头流式传输到各种类型的查看器,如Chrome,Firefox,Cambozola,VLC,mplayer和其他能接收MJPG流的软件。

● 树莓派基于摄像头模块,通过mjpg-streamer软件获取视频,通过手机端或电脑端浏览实时视频。

mjpg-streamer相关配置

下载该软件所需要的环境及所需要的编译工具

sudo apt-get install libjpeg8-dev  //JPEG支持库
sudo apt-get install imagemagick
sudo apt-get install libv4l-dev   //“4l”是小写"L"
sudo apt-get install cmake  //下载编译工具

下载mjpg-streamer

git clone https://github.com/jacksonliam/mjpg-streamer.git

进入下载目录的路径

cd mjpg-streamer/mjpg-streamer-experimental

输入编译指令

make all

安装指令

sudo make install

在安装好的目录下打开脚本文件并修改

vi start.sh

image-20230705181504320

image-20230705181535875

其中,input_uvc.so 用的是树莓派上的usb摄像头

树莓派摄象头相关配置

sudo raspi-config

image-20230705181842869

选择Interface Options

image-20230705181927114

选择 Legacy Camera

image-20230705182002922

点击yes即可,重启即可

最终运行

在电脑的网页端,输入

192.168.43.180:8080 //192.168.43.180是树莓派的ip地址,8080是视频流的端口号

树莓派使用摄像头进行拍照

raspistill -o Desktop/image.jpg //拍摄静态图片并将其保存到桌面
raspistill -o Desktop/image-small.jpg -w 640 -h 480  //设置图片的宽和高分别为640和480
posted @ 2023-09-01 14:11  徐博正  阅读(14)  评论(0)    收藏  举报