智能家居4 -- 添加接收消息的初步处理

【物联网系列】springboot + rabbitmq 做智能家居以及web显示未读消息 mqtt协议 rabbitmq安装mqtt协议 在rabbitmq安装路径下sbin shift+右击打开命令窗口 阅读详情

 这一模块的思路和前面的语言控制模块很相似,差别只是调用TCP 去控制

废话少说,放码过来

增添/修改代码

receive_interface.c


#include <pthread.h>
#include <mqueue.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>

#include "receive_interface.h"
#include "control.h"
#include "mq_queue.h"
#include "global.h"
#include "face.h"
#include "myoled.h"

/*
接收模块:
对接收到消息做出相应处理
包括 oled 人脸识别 语言播报 GPIO  引脚状态配置

*/

static int oled_fd = -1;

typedef struct  
{
 int msg_len;
 unsigned char*buffer;
 ctrl_info_t *ctrl_info;
}recv_msg_t;



static int  receive_init(void)
{ 
  // 设备类链表添加
  oled_fd = myoled_init(); // 初始化oled
  face_init(); // 初始化人脸识别


    return 0;
}

static void receive_final(void) 
{
  face_final();
  if(-1 != oled_fd)
  {
     close(oled_fd); // 关闭oled 打开的文件
     oled_fd = -1; //复位
  }

}
//  处理设备 --  比如打开灯 和风扇等
static void*handler_device(void *arg)
{
 pthread_detach(pthread_self()); // 和主线程(他的父线程)分离

 recv_msg_t *recv_msg = NULL;
 if(NULL != arg)
 {
   recv_msg = (recv_msg_t *)arg;
   printf("recv_len = %d\n",recv_msg->msg_len);
   printf("%s|%s|%d, handler: 0x%x,0x%x,0x%x,0x%x,0x%x,0x%x\n",__FILE__,__func__,__LINE__,
   recv_msg->buffer[0],recv_msg->buffer[1],recv_msg->buffer[2],recv_msg->buffer[3],recv_msg->buffer[4],recv_msg->buffer[5]);
 }

 

 // need to do something 
 pthread_exit(0);
}


static void* receive_get(void *arg) // 接收消息队列里面的 数据
{
   printf("enter receive_get\n");
   //  通过参数 初始化我们 定义的recv_msg_t 结构体
   recv_msg_t *recv_msg = NULL;
   unsigned char*buffer = NULL;
   struct mq_attr attr;
   pthread_t tid = -1;
   ssize_t read_len = -1;

  if(NULL != arg)
  {
    recv_msg = (recv_msg_t *)malloc(sizeof(recv_msg_t));
    recv_msg->ctrl_info = (ctrl_info_t *)arg;// 这里实际上就获取到了mqd 和 phead(我们需要操作的struct control 链表 的头节点)
    recv_msg->msg_len = 0;
    recv_msg->buffer = NULL;
  }
  else
     pthread_exit(0);


  if(mq_getattr(recv_msg->ctrl_info->mqd,&attr) == -1)
  { // 获取消息队列失败 -- 异常
     pthread_exit(0);
  }

  // 能获取到消息队列
  recv_msg->buffer = (unsigned char *)malloc(attr.mq_msgsize); // 分配内存
  buffer = (unsigned char *)malloc(attr.mq_msgsize); 
  // mq_msgsize -- 每条消息的大小
  memset(recv_msg->buffer,0,attr.mq_msgsize); // 初始化
  memset(buffer,0,attr.mq_msgsize); // 初始化
  

  pthread_detach(pthread_self()); // 和主线程(他的父线程)分离

  while (1)
  {
   read_len = mq_receive(recv_msg->ctrl_info->mqd,buffer,attr.mq_msgsize,NULL) ;

  printf("%s|%s|%d, recv: 0x%x,0x%x,0x%x,0x%x,0x%x,0x%x\n",__FILE__,__func__,__LINE__,buffer[0],buffer[1],buffer[2],buffer[3],buffer[4],buffer[5]);
  printf("%s|%s|%d: read_len = %ld\n",__FILE__,__func__,__LINE__,read_len);
   if(-1 == read_len)
    {// 接收失败
      if(errno == EAGAIN)
      {
        printf("queue is empty\n");
      }
      else
      {
          break;
      }
    }
    // 以下是接收到正常数据的情况 
    else if(buffer[0] == 0xAA && buffer[1] == 0x55 
            &&buffer[4]==0x55 && buffer[5]==0xAA)
    {
      recv_msg->msg_len = read_len;
      memcpy(recv_msg->buffer,buffer,read_len);
      //  创建线程去 处理我们的接收到的信号
      pthread_create(&tid,NULL,handler_device,(void*)recv_msg);

    }
  }
  if(NULL != recv_msg)
   free(recv_msg);

  if(NULL !=  buffer)
   free(buffer);

 

    pthread_exit(0);

}


struct  control receive_control ={
    .control_name = "receive",
    .init = receive_init,
    .final = receive_final,
    .get = receive_get,
    .set = NULL, //不需要实现 设置
    .next = NULL
};


struct control *add_receive_to_ctrl_list(struct control *phead)
{
  //头插法实现 添加链表节点

   return add_interface_to_ctrl_list(phead,&receive_control);

};



receive_interface.h


#ifndef ___RECEIVE_INTERFACE_H___
#define ___RECEIVE_INTERFACE_H___

#include "control.h"
struct control *add_receive_to_ctrl_list(struct control *phead);



#endif

修改的main.c


#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <wiringPi.h>

#include "control.h"
#include "mq_queue.h"
#include "voice_interface.h"
#include "socket_interface.h"
#include "smoke_interface.h"
#include "receive_interface.h"
#include "global.h"

// msg_queue_create



int main() {
    pthread_t thread_id;
    struct control *control_phead = NULL;
    struct control *pointer = NULL;
    ctrl_info_t *ctrl_info = NULL;
    ctrl_info = (ctrl_info_t *)malloc(sizeof(ctrl_info_t));
    ctrl_info->ctrl_phead = NULL;
    ctrl_info->mqd = -1;

    int node_num = 0; // 统计节点数
    if(-1 == wiringPiSetup())// 初始化 wiringPi 库
    {
        perror("wiringPi Init");
        return -1;
    }

    // 创建消息队列
    ctrl_info->mqd = msg_queue_create();
    if(-1 == ctrl_info->mqd)// 创建消息队列失败
    {
        printf("%s|%s|%d, mqd= %d\n",__FILE__,__func__,__LINE__,ctrl_info->mqd);
        return -1;
    }
    
    //  头插法插入 , so 头一直在变化
    ctrl_info->ctrl_phead = add_voice_to_ctrl_list(ctrl_info->ctrl_phead);
    ctrl_info->ctrl_phead = add_tcpsocket_to_ctrl_list(ctrl_info->ctrl_phead);
    ctrl_info->ctrl_phead = add_smoke_to_ctrl_list(ctrl_info->ctrl_phead);
    ctrl_info->ctrl_phead = add_receive_to_ctrl_list(ctrl_info->ctrl_phead);
  
  

    pointer = ctrl_info->ctrl_phead;

    while(NULL!=pointer) // 对所有控制结构体初始化,并且统计节点数
    {
        if(NULL != pointer->init)
        {
             printf("%s|%s|%d   control_name = %s\n",__FILE__,__func__,__LINE__,pointer->control_name);
             pointer->init();
        }
        pointer = pointer->next;
        node_num++; // 统计节点数
    }

    // 根据节点的总数 --> 创建对应数目的线程
    pthread_t *tid = (pthread_t *)malloc(sizeof(int) *node_num);
    pointer = ctrl_info->ctrl_phead;

    for(int i=0;i<node_num;++i)//遍历所有节点
    {
       if(NULL != pointer->get){
          printf("%s|%s|%d   control_name = %s\n",__FILE__,__func__,__LINE__,pointer->control_name);
          pthread_create(&tid[i],NULL,(void *)pointer->get,(void *)ctrl_info); // 传入这个结构体参数,方便同时调用多组线程里面的API
       }
        pointer = pointer->next;
    }
    
     for(int i=0;i<node_num;++i)
     {
     pthread_join(tid[i],NULL);
     }

     for(int i=0;i<node_num;++i)
     {
      if(NULL != pointer->final)
          pointer->final(); // 接打开的使用接口关闭
      pointer = pointer->next;
     }
     
     msq_queue_final(ctrl_info->mqd);

     if(NULL != ctrl_info)
          free(ctrl_info); // 这个是malloc 堆区申请的内存 -->  需要手动的释放

     if(NULL != tid)
          free(tid);


     return 0;
}
















编译执行:

编译:

make

发送到arm-64平台

scp ./obj/smarthome  orangepi@192.168.1.11:/home/orangepi

// 需要用到阿里云人脸识别接口,需要调用 py文件,一起传过去
 scp src/face.py  orangepi@192.168.1.11:/home/orangepi

执行:

sudo -E ./smarthome

可以看到我们的 hanler 函数已经接收到对的数据了,剩下的就是对这些数据的处理了,我们将在下一篇实现,让代码和关联设备们起来,进一步完善我们的功能。

基于STM32和阿里云的智能家居 1.需求分析 人类的生活品质和科学技术的发展息息相关。人类居所从高山洞穴演变为现代社会的摩天大楼。最开始人们对住所要求只要能够简单地遮挡风雨即可,得益物联网技术、无线传感技术和互联网技术等技术的飞速发展,各种家用电器带来的便利已经无法满足人们的生活需求,由于对互联网依赖程度逐渐加深,现代人类通过移动终端远程对家用设备进行智能控制,为人们的日常生活带来了极大的便利,此举同时也加快了各类家用电器的“智慧化”变革以及智能家居的快速发展。 智能家居是物联网和互联网影响下物联化的体现。智能家居即智能住宅,智能家居系统 阅读详情

相关推荐

在树莓派上搭建智能家居网关

智能家居系统利用大量的物联网设备(如温湿度传感器、安防系统、照明系统)实时监控家庭内部状态,完成智能调节、人机互动。随着物联网技术的发展,其应用范围、数据规模、市场份额将进一步扩大,智能家居设备之间的智能联动也将变的越来越困难,同时由于家庭数据的隐私性,用户数据上传至云端处理还有一定的安全问题。 为此我们将使用 Raspberry Pi + EMQ X Edge + EMQ X Kuiper 搭建智能家居网关,实现智能家居设备数据的边缘计算处理,减少家庭私密数据外流。 本文中我们将用 BH1750FVI 光

emqx_broker的博客 6185

【OrangePi Zero2 智能家居】智能家居项目的软件实现

之前讲过智能分类的项目,因为会用到语音模块、OLED显示、网络模块、这些代码都可以从智能分类的项目中直接拷贝过来使用,另外添加之前准备好的人脸识别的代码。语音监听模块会借助消息队列进行消息的传递,因此先实现消息队列的接口。另外,被控制的设备类也统一配置接口,同时添加到设备链表中。根据control.h头文件的定义,实现语音监听接口。同样参考voice接口实现receive 接口。同样参考voice接口实现smoke 接口。参考voice接口实现socket 接口。三、实现语音监听接口。

咖喱年糕的博客 1883

9、消息发送与接收算法详解

本文详细介绍了消息发送与接收算法的基本概念、消息格式、发送与接收算法、可靠性保障措施、安全机制以及优化技术,并结合云计算平台、物联网设备和微服务架构等具体应用场景进行了深入分析,同时探讨了消息传递中的常见挑战及解决方案,帮助读者全面理解消息传递机制的核心原理及其实际应用。

desk3的博客 565

OpenAI GPT-4智能家居数据处理

GPT-4在智能家居中实现多源数据融合与语义理解,提升语音指令解析、用户行为建模及异常检测能力,推动系统从自动化向智能化演进。

weixin_42612405的博客 1144

基于树莓派4的智能家居系统

本文设计了一种基于物联网和树莓派4的家庭自动化系统,通过传感器采集环境数据,结合安卓应用与Web服务器实现远程控制。系统支持温度、光照、运动等感知,并能分析设备使用模式,实现自动开关。实验表明,该系统在以太网和Wi-Fi吞吐量上优于Arduino,且功耗更低。

j0k1l2m3n的博客 872

手把手教你用MOS管设计双电源自动切换电路(附零压降方案)

本文详细介绍了使用MOS管设计双电源自动切换电路的完整方案,包括基础电路拓扑、零压降优化设计及实战调试技巧。针对外接电源与电池供电的无缝切换需求,提供低损耗MOS管选型建议和性能实测数据,帮助工程师解决传统二极管方案的压降与漏电问题。

h0i1j2k3l的博客 1446

zigbee2mqtt消息接收处理:Receive模块的事件分发架构

在智能家居和工业物联网(IoT)领域,Zigbee设备与MQTT协议之间的高效通信是构建可靠智能系统的核心挑战。zigbee2mqtt作为开源桥接解决方案,其Receive模块承担着从Zigbee网络接收消息、转换协议格式、并分发到MQTT代理的关键职责。 本文将深入解析zigbee2mqtt Receive模块的事件分发架构,揭示其如何实现高性能、低延迟的消息处理,以及如何通过精巧的设计解决物...

gitblog_01196的博客 1095

语义通信理论必看论文:Towards a Theory of Semantic Communication

了解语义通信发展必看的一篇文章

一去不复返的通信er 3926

基于FastAPI与WebSocket构建智能家居实时消息中心

在物联网与智能家居系统中,实时数据处理与信息聚合是核心挑战。其原理在于通过异步通信与事件驱动架构,高效处理来自多源设备的并发数据流。这项技术的价值在于将碎片化的设备状态、事件日志与外部信息统一管理,从而提升系统的可观测性与交互效率。典型的应用场景包括家庭环境监控、安防告警集中展示以及自动化场景的联动触发。本文以FastAPI和WebSocket为技术基础,结合Redis实现实时消息推送,并深度集成Home Assistant,构建了一个高可定制的信息看板,有效解决了信息分散的痛点。

weixin_34378969的博客 448

【Office激活】学校正版Office已激活成功仍弹出激活窗口

学校正版Office激活问题:已激活成功仍弹出激活窗口

ESCM_的博客 1万+

运算放大器测试方法-输入失调电压

由于运放输入回路的不对称性,在输入端将产生一定的误差信号,从而限制运放信号灵敏度。通常用输入失调电压(VOS)、输入失调电流(Ios)和输入偏置电流(IB)表示。运放有四个主要特征:输入失调特征、开环特征、共模特征及输出特征。其放大倍数较大,由于外界的影响,即使运放的输入端产生较小的输入信号,经过放大,在输出端也会产生较大的误差。为能精确测量其性能,一般采用辅助运放进行测试。下面着重讲了运放的主要参数及如何精确测量这些参数。文中DUT代表被测运放,A代表辅助运放。

weixin_46135931的博客 1万+

【花雕学编程】Arduino RTOS 之超时阻塞接收消息队列

例如,在机器人的装配任务中,一个任务负责提供零部件,另一个任务负责装配,提供零部件的任务将零部件信息发送到消息队列,装配任务通过超时阻塞接收消息队列等待零部件信息,确保装配工作的顺利进行。例如,在一个等待传感器数据的线程中,通过阻塞接收,当传感器数据还未到达消息队列时,线程可以等待,直到有新的数据到来。例如,在一个多任务的物联网设备中,通过合理设置超时时间,可以让不同的任务在等待消息的过程中不会过度消耗系统资源,提高了设备的整体运行效率。不同的线程可以向消息队列发送消息,也可以从消息队列接收消息。

雕爷学编程 994

用Excel或WPS做两独立样本的T检验

一般情况下收集数据时常用的是Excel或者WPS,但统计时却用SPSS等软件进行统计学分析,经常很多人找不到SPSS的安装包,或者苦于正版激活或忘记教程,其实Excel或WPS自带函数就足够了,均数、标准差以及统计检验都是一个函数而已。解释:先做F检验,如果F>0.05就做T检验,Ttset里的数据为两组的数据的比较,结果如下。A组的均数计算 =AVERAGE(B2:B6)A组的标准差计算 =STDEV(B2:B6)B组的标准差计算=STDEV(B7:B19)分组 数值 A组均数 A组标准差 p值。

Mrrunsen的博客 6752

【花雕学编程】Arduino RTOS 之数据块的接收与处理

例如,当用户通过手机应用发送 “打开客厅灯” 的指令时,该指令以数据块的形式被 Arduino 设备接收,经过处理后,Arduino 设备会通过相应的接口控制客厅灯打开。例如,当通过网络或串口接收数据块时,接收任务可以在数据到达时被唤醒,而在没有数据时,系统可以运行其他任务,如数据处理、用户界面更新等。不同的数据块处理任务可以设置不同的优先级。例如,在一个无线传感器网络中,Arduino 设备作为节点与其他节点进行数据交换,接收来自其他节点的数据块,并将处理后的结果发送回去,实现数据的共享和协同处理。

雕爷学编程 945

分立器件---电感介绍(7000字)

电感基础整理

HW-BASE的博客 2350

使用VNA(Vector Network Analyzer)对S参数进行去嵌(一)

传统上,RF和微波组件被设计成具有同轴接口的封装。通过连接一系列这些单独的同轴设备,可以容易地制造复杂的系统。使用使用类似同轴接口的标准测试设备可以很容易地测量这些部件和系统的性能。然而,现代系统需要更高水平的组件集成、更低的功耗和更低的制造成本。射频组件正在迅速从使用昂贵同轴接口的设计转向使用印刷电路板和表面贴装技术(SMT)的设计。传统的同轴接口甚至可以从最终产品中取消。这就给设计者留下了用需要同轴接口的测试设备测量这些射频和微波组件性能的问题。解决方案是使用连接同轴和非同轴传输线的测试夹具。

小孟同学的博客 1万+

OpenAI GPT-4智能家居案例分享

本文探讨GPT-4在智能家居中的应用,涵盖语音交互系统设计、多设备协同控制、边缘计算融合及自主任务规划,提出云边协同架构以优化响应延迟与隐私安全,并分析成本、实时性与幻觉风险等挑战。

weixin_33562004的博客 666

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

智能家居DIY连载教程(2)——在实际项目中运用消息队列与邮箱

前言千呼万唤始出来,智能家居 DIY 教程连载第二篇终于登场了!本文将重点给大家介绍如何将消息队列与邮箱运用到实际项目中去。一起来看看吧~DIY回顾上期:1、智能家居DIY连载教程(1)...

rtthreadiotos的博客 870

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

深入解析MQTT协议消息订阅与接收机制:标准协议与阿里云物联网平台的差异及开发建议

例如,在一个智能家居系统中,用户的智能音箱只订阅了与音乐播放和语音交互相关的主题,那么服务器就不会将其他设备(如智能摄像头)的监控信息发送给智能音箱,避免了信息的混乱和安全隐患。开发者在使用MQTT协议进行物联网开发时,需要充分了解这些差异,掌握确认消息接收的方法,并遵循相关的开发建议,以确保系统的正常运行和开发的高效性。例如,当设备的某项功能被启用或禁用时,SDK会自动订阅或取消订阅相关的主题,确保设备能够及时接收和处理相关的消息。的参数,通过查看该参数的值,就可以知道设备是否会自动订阅一些系统主题。

yiyi8399的博客 1155

C#接收/发送MQTT消息,使用C# MqttLib

C#接收、发送mqtt消息,使用MqttLib。本篇代码较为详细,提供了完整的demo例程。

安心写bug的博客 9213

OpenAI GPT-4智能家居部署教程

本文深入探讨GPT-4在智能家居中的应用,涵盖系统架构、本地部署、功能实现与性能评估,突出其在自然语言理解、多设备协同和隐私安全方面的技术优势。

weixin_30533301的博客 566

OpenAI GPT-4智能家居实战指南

本文探讨GPT-4与智能家居融合的技术路径,涵盖系统架构、自然语言解析、典型应用场景及性能优化策略,实现从指令响应到主动服务的智能化升级。

weixin_42600128的博客 774

ESP32与MQTT的隐秘对话:从零构建智能家居消息中枢

本文详细介绍了如何利用ESP32和MQTT协议构建智能家居消息中枢,涵盖ESP-MQTT的深度配置、弱网环境优化策略及安全加固方案。通过实战案例展示智能灯光控制系统的实现,帮助开发者快速掌握物联网设备通信技术,提升智能家居系统的可靠性和安全性。

weixin_29172963的博客 279

探索智能家居新境界:ZhiMsg 消息平台

探索智能家居新境界:ZhiMsg 消息平台 在智能家居领域,HomeAssistant 已经成为了一个不可或缺的工具,它让我们的家居生活更加智能化、便捷化。今天,我们要介绍的是一个为 HomeAssistant 量身打造的开源项目——ZhiMsg,它将进一步提升你的智能家居体验。 项目介绍 ZhiMsg 是一个专为 HomeAssistant 设计的通用消息平台,它不仅提供了与 HomeAssis...

gitblog_00448的博客 739

LLaMA 2智能家居数据处理

LLaMA 2在智能家居中实现语义理解与行为预测,通过数据预处理、边缘-云协同架构及隐私保护机制,推动系统从自动化向认知化转型。

weixin_42437253的博客 1073
上一篇: 智能家居2 -- 实现网络控制模块
下一篇: C++ 复习 1 : 命名 空间
mx_jun
博客等级 码龄5年 1605粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值