一、功能介绍
- 灯光的控制:模拟客厅灯、餐厅灯、二楼灯、卫生间灯。灯光可以通过手机App、语音、控制开关。
- 家内发生火灾后报警功能。
- 温湿度检测通过服务器上传到手机App。
- 摄像头安全监控,将视频上传到手机App,并通过摄像头实现人脸识别智能开锁。
二、实现思路
- 灯光通过普通IO口控制,自己实现IO口的引脚输入输出驱动程序。
- 树莓派创建Socket线程,手机通过Socket与树莓派实现网络通信,从而控制灯光。
- 语音模块通过SU-03T模块,在官网设置好指令,烧写SDK,输出的指令通过串口输出给树莓派,从而解析指令实现语音灯光控制。
- 通过烟雾传感器和蜂鸣器实现火灾报警功能。
- 温湿度检测传感器采集数据,通过socket和手机App通信,将数据发送给App。
- 摄像头人脸识别,主要通过翔云人工智能平台提供的人脸对比服务开发。
- 注意: 树莓派通过socket给客户端发送数据时,如果客户端直接退出,主程序也会直接崩溃。
- 解决办法: 在检测到客户端退出连接后,服务端必须退出socket读取和写入的两个线程。
三、源代码分析
- 主函数
1.1 主程序中根据指令工厂将语音类、socket类添加到指令工厂的链表中。设备控制工厂将灯、火灾报警、人脸锁类添加到设备控制的链表中。
1.2 并且创建火灾报警、语音、socket线程。
1.3 火灾报警线程: 读取烟雾传感器的值,如果为0,表示有烟雾,对蜂鸣器设备进行控制报警。
1.4 语音线程: 语音线程中,使用串口读取到数据,根据不同的指令控制不同的灯光。对“人脸识别”指令创建新的线程,在人脸识别的线程中通过摄像头拍照并识别人脸,并且将识别到的结果写入到SQLite数据库中。
1.5 socket线程: 在socket线程中创建服务端,等待客户端接入,客户端接入后,分别创建读取数据和发送数据两个线程。读取线程用于识别灯光控制指令、开关监控。发送数据指令用于将采集到 的温湿度数据发送给客户端。int main() { pthread_t voice_pt; pthread_t socket_pt; pthread_t smoke_thread; wiringPiSetup(); //添加设备节点,设备控制初始化 pdeviceHead = addBathroomLightToDeviceLink(pdeviceHead); pdeviceHead = addupstairLightToDeviceLink(pdeviceHead); pdeviceHead = addrestaurantLightToDeviceLink(pdeviceHead); pdeviceHead = addlivingroomLightToDeviceLink(pdeviceHead); pdeviceHead = addFireDeviceLink(pdeviceHead); pdeviceHead = addCameraToDeviceLink(pdeviceHead); pdeviceHead = addBuzzerToDeviceLink(pdeviceHead); //添加命令节点,指令工厂初始化 pcommandHead = addvoiceToCommandLink(pcommandHead); pcommandHead = addsocketToCommandLink(pcommandHead); //3. 线程池建立 //3.1 语言线程 //3.2 socket线程 pthread_create(&voice_pt, NULL, voice_handler, NULL); pthread_create(&socket_pt, NULL, socket_handler, NULL); //3.4 火灾线程 pthread_create(&smoke_thread, NULL, smokeAlarmThread, NULL); while(1) { ; } //3.3 摄像头线程通过语音线程中创建。 return 0; }