智能家居
项目流程
在智能家具项目中,会对之前学过的知识进行一个整合,并且采用内核式的代码设计模式,让代码阅读起来更加清醒明了。
代码设计模式
设计模式是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。让代码更容易被他人理解、保证代码可靠性、程序的稳定性。
是从建筑设计域引入到计算机科学来的。
设计模式一共有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函数中不可见,用户只管调用就可以。
工厂模式的实现
例如上图所示,所谓工厂模式,就是将所有的设备分开编写,每一个设备都是一个独立的文件,将一个设备所有的功能(函数)写到一个结构体里面,并通过链表,将这些设备链接在一起。

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

树莓派安装摄像头
树莓派监控的实现,使用的是一个库,叫做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


其中,input_uvc.so 用的是树莓派上的usb摄像头
树莓派摄象头相关配置
sudo raspi-config

选择Interface Options

选择 Legacy Camera

点击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
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号