main函数(所有的头文件都放到最后)
事先创建好一个管理线程的链表control_list,并且将mqd和control链表再封装一个结构体ctrl_info
1、初始化(链表、临时指针、累计数、wiringPi库)
2、获取消息队列描述符
3、将各个线程都放入链表中
4、遍历链表,初始化各个线程并且统计链表节点个数
5、遍历链表,创建各个线程
6、等待线程结束时回收资源
7、全部线程结束后释放所有资源、以及销毁消息队列的资源
6和7一般不会执行到,因为在各个线程里面都是死循环
整个项目的逻辑是,语音线程、网络线程、烟雾报警线程一直循环等待,在收到数据之后发送给消息处理线程,再去处理对应的逻辑,语音播报或者进行家具的控制或者OLED屏幕显示
整个项目开启4个监听线程, 分别是:
1.语音监听线程:用于监听语音指令, 当有语音指令过来后, 通过消息队列的方式给消息处理线程发送指令
2.网络监听线程:用于监听网络指令,当有网络指令过来后, 通过消息队列的方式给消息处理线程发送指令
3.火灾检测线程:当存在煤气泄漏或者火灾闲情时, 发送警报指令给消息处理线程
4.消息监听线程: 用于处理以上3个线程发过来的指令,并根据指令要求配置GPIO引脚状态, OLED屏显示、语音播报,还有人脸识别开门
上述四个线程采用统一个对外接口接口,同时添加到监听链表中。
1 | //main.c |
人脸识别代码(C语言调用python函数并接收返回值)
1、初始化:python环境、路径、模块初始化
2、结束:释放所有引用的Python对象
3、人脸识别
3.1将本地的人脸照片上传阿里云OCR
3.2导入face.py模块
3.3获取alibabacloud_face函数对象
3.4调用alibabacloud_face函数并获取返回值
3.5解析获取alibabacloud_face函数的返回值,转行为C语言格式
3.6最后释放所有python资源并返回比对的结果数据
1 | //face.c |
人脸识别face.py
事先需引入依赖包,在阿里云创建AccessKey 并配置环境变量
并且创建并从环境变量中读取AccessKey ID和AccessKey Secret
1、读取本地的人脸照片
2、指定搜索的人脸库
3、#初始化,传入AccessKey
4、调用人脸识别API,并且返回比对结果
5、提取并处理比对结果(字典->浮点型)
1 | # 引入依赖包 |
语音线程
各种错误处理,然后接收串口发送来的数据,符合格式的话就发送数据到消息队列,再将缓冲区清空,等待下次数据到来
1 | //voice_interface.c |
自己实现的串口初始化,收发数据
1 | //uarTool.c |
链表实现
1 | //control.c |
1 | //control.h |
网络线程
1、init函数:创建socket描述符,传入IP地址和端口
2、close函数:关闭文件描述符
3、等待接收指令:
3.1、启用TCP保活机制,故障时自动断开
3.2、各种错误处理,线程、socket、消息队列描述符
3.3、accept接收消息
3.4、处理获取得到的消息,符合格式的消息后发送消息
1 | //socket_interface.c |
烟雾报警线程
初始化,各种错误处理,读取GPIO口的状态给标志位,当标志位持续为低时每五秒发出一个警告,当标志位为高且当前GPIO口状态为高时将标志位置低,未触发烟雾报警仅执行一次,后面就是常规的结束线程,一般不执行,因为前面死循环
1 |
|
消息队列线程
gdevice是灯、风扇、锁家具的管理链表
1、定义handler_gdevice函数
1 |
|