ESP32基础应用之使用两个ESP32通过阿里云物联网平台实现相互通信

news2024/11/27 4:36:41

文章目录

  • 1 阿里云物联网平台
  • 2 程序编写
    • 2.1 ESP32-COM4 设备
    • 2.1 ESP32-COM5 设备
  • 3 实验现象分析

1 阿里云物联网平台

  1. 在设备管理下创建两个设备,参考ESP32基础应用之ESP32与阿里云物联网平台实现数据互传(MQTT协议)
    在这里插入图片描述

  2. 在规则引擎下创建云产品流转,包括数据源、数据目的、解析器,参考云产品流转概述
    在这里插入图片描述创建数据源
    在这里插入图片描述

    创建数据目的
    在这里插入图片描述创建解析器
    在这里插入图片描述依次关联数据源、数据目的、解析脚本,解析脚本较为复杂,这里只实现简单的数据转发到另一Topic
    在这里插入图片描述

    //通过payload函数,获取设备上报的消息内容,并按照JSON格式转换。
    var data = payload("json");
    //直接流转物模型上报数据。
    writeIotTopic(1000, "/a1Buwr73pUI/dev-esp32-com5/user/get", data)
    

    这里只实现了设备1将数据流转到设备2,还需要使用同样的方法创建另一个解析器将设备2的数据流转到设备1。

  3. 云产品流转有许多复杂的规则与应用,这里只实现简单的数据转发到另一Topic
    在这里插入图片描述
    在这里插入图片描述

2 程序编写

程序逻辑:

  1. ESP32-COM4 设备按键按下,上传数据到阿里云物联网平台并流传到ESP32-COM5设备,将数据打印出来;
  2. ESP32-COM5 设备按键按下,上传数据到阿里云物联网平台并流传到ESP32-COM4设备,将数据打印出来;

2.1 ESP32-COM4 设备

  1. 本地数据上传
static void mqtt_test_task(void *pvParameters)
{
    int  msg_id;
    char key_flag = 0;
    //构造JSON格式数据,该数据用于反馈给阿里云物联网平台,
    cJSON *Wroot =	cJSON_CreateObject();
    cJSON_AddItemToObject(Wroot, "DeviceSource", cJSON_CreateString("ESP32-COM4"));
    cJSON_AddItemToObject(Wroot, "DevicePurpose", cJSON_CreateString("ESP32-COM5"));
    cJSON_AddItemToObject(Wroot, "Data", cJSON_CreateString("hello ,I am COM4"));
    cJSON_AddItemToObject(Wroot, "Date", cJSON_CreateString("444444"));
    memset(local_data_tx,0x0,LOCAL_DATA_SIZE);		
    int len = strlen(cJSON_Print(Wroot));			
    memcpy(local_data_tx, cJSON_Print(Wroot),len); //将JSON格式数据复制到数组中,将以数组的形式传递给发布函数
    while(1)
    {
        if(0 == gpio_get_level(USER_KEY_PIN)){
            vTaskDelay(10 / portTICK_RATE_MS);
            while(0 == gpio_get_level(USER_KEY_PIN)){
                if(key_flag == 0){
                    key_flag = 1;
                    printf("key press  \n");
                    msg_id = esp_mqtt_client_publish(client, AliyunPublishTopic_user_update, local_data_tx, strlen(local_data_tx), 0, 0);
                    ESP_LOGI(TAG, "esp32 com4 send data successful, msg_id=%d", msg_id);	
                }
            }
	    }else{
            key_flag = 0;
        }
    }
    vTaskDelete(NULL);
}
  1. 打印收到的数据
static int user_parse_json(char *json_data)
{
	cJSON *root = NULL;
    root = cJSON_Parse(json_data);   
    printf("%s\n\n", cJSON_Print(root));   /*将完整的数据以JSON格式打印出来*/
    return 0;
}
static esp_err_t mqtt_event_handler_cb(esp_mqtt_event_handle_t event)
{
    esp_mqtt_client_handle_t client = event->client;
    int  msg_id;
    switch (event->event_id) {
        case MQTT_EVENT_DATA:
            ESP_LOGI(TAG, "MQTT_EVENT_DATA");
            printf("TOPIC=%.*s\r\n", event->topic_len, event->topic);
            printf("DATA=%.*s\r\n", event->data_len, event->data);
            memset(local_data_rx,0x0,LOCAL_DATA_SIZE);
            strncpy(local_data_rx, event->data, event->data_len); //将指针类型的数据复制到一个数组中
            msg_id = user_parse_json(local_data_rx);
            break;
        default:
            ESP_LOGI(TAG, "Other event id:%d", event->event_id);
            break;
    }
    return ESP_OK;
}

2.1 ESP32-COM5 设备

  1. 本地数据上传
static void mqtt_test_task(void *pvParameters)
{
    int  msg_id;
    char key_flag = 0;
    //构造JSON格式数据,该数据用于反馈给阿里云物联网平台,
    cJSON *Wroot =	cJSON_CreateObject();
    cJSON_AddItemToObject(Wroot, "DeviceSource", cJSON_CreateString("ESP32-COM5"));
    cJSON_AddItemToObject(Wroot, "DevicePurpose", cJSON_CreateString("ESP32-COM4"));
    cJSON_AddItemToObject(Wroot, "Data", cJSON_CreateString("hello ,I am COM5"));
    cJSON_AddItemToObject(Wroot, "Date", cJSON_CreateString("555555"));
    memset(local_data_tx,0x0,LOCAL_DATA_SIZE);		
    int len = strlen(cJSON_Print(Wroot));			
    memcpy(local_data_tx, cJSON_Print(Wroot),len); //将JSON格式数据复制到数组中,将以数组的形式传递给发布函数

    for(;;)
    {
        if(0 == gpio_get_level(USER_KEY_PIN)){
            vTaskDelay(10 / portTICK_RATE_MS);
            while(0 == gpio_get_level(USER_KEY_PIN)){
                if(key_flag == 0){
                    key_flag = 1;
                    printf("key press  \n");
                    msg_id = esp_mqtt_client_publish(client, AliyunPublishTopic_user_update, local_data_tx, strlen(local_data_tx), 0, 0);
                    ESP_LOGI(TAG, "esp32 com4 send data successful, msg_id=%d", msg_id);	
                }
            }
	    }else{
            key_flag = 0;
        }
	}
    vTaskDelete(NULL);
}
  1. 打印收到的数据
static int user_parse_json(char *json_data)
{
	cJSON *root = NULL;
    root = cJSON_Parse(json_data);   
    printf("%s\n\n", cJSON_Print(root));   /*将完整的数据以JSON格式打印出来*/
    return 0;
}
static esp_err_t mqtt_event_handler_cb(esp_mqtt_event_handle_t event)
{
    esp_mqtt_client_handle_t client = event->client;
    int  msg_id;
    switch (event->event_id) {
        case MQTT_EVENT_DATA:
            ESP_LOGI(TAG, "MQTT_EVENT_DATA");
            printf("TOPIC=%.*s\r\n", event->topic_len, event->topic);
            printf("DATA=%.*s\r\n", event->data_len, event->data);
            memset(local_data_rx,0x0,LOCAL_DATA_SIZE);
            strncpy(local_data_rx, event->data, event->data_len); //将指针类型的数据复制到一个数组中
            msg_id = user_parse_json(local_data_rx);
            break;
        default:
            ESP_LOGI(TAG, "Other event id:%d", event->event_id);
            break;
    }
    return ESP_OK;
}

3 实验现象分析

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/27234.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前后端分离 基础(新增与查询)

目录 一,后端 1.1 修改settings---->搜索Maven 1.2 application.yml文件与jdbc.properties文件 对应数据库的账号密码 application.yml 1.4 jdbc.properties 1.3 generatorConfig.xml jdbc驱动jar包 1.4 从本地导入pom依赖 POM 1.5 自动生成 1.6 各个层…

axure学习:设置部件固定到浏览器,预览时部件消失

​在Axure中有一个非常好用且常用的部件——动态面板,动态面板很常用的一个功能是利用不同状态页做tab的切换、轮播图等,但咱们今天要说的不是关于这方面的问题。这里我们要说的是关于动态面板的属性:固定到浏览器的使用。 关于这一点&#…

react(任意组件之间传值--消息订阅与发布、路由)

目录 兄弟组件传值--任意组件之间传值 fetch发送请求: react 路由 解决样式丢失的问题: 路由的模糊匹配和严格匹配 嵌套路由 向路由组件传参 前端中文学习网站:印记中文 - 深入挖掘国外前端新领域,为国内 Web 前端开发人员提…

最优化方法总结——梯度下降法、最速下降法、牛顿法、高斯牛顿法、LM法、拟牛顿法

目录 1 最优化方法的结构 2 常用最优化方法对比分析 3 相关计算公式 1 最优化方法的结构 最优化问题的一般形式为: 其中为决策变量,是目标函数,为约束集或可行域。特别地,如果,则最优化问题成为无约束最优化问题。 …

目标检测DiffusionDet: Diffusion Model for Object Detection

先贴一张流程图: github:GitHub - ShoufaChen/DiffusionDet: PyTorch implementation of DiffusionDet (https://arxiv.org/abs/2211.09788) pdf: https://arxiv.org/abs/2211.09788 Abstract: 本文提出了一个新的框架DiffusionDet,将目标检测问题构建…

Lombok的@Data注解包含的方法(没有全参构造方法)

Lombok的Data注解包含的方法(没有全参构造方法) 目录Lombok的Data注解包含的方法(没有全参构造方法)结论:测试:1.Maven引入依赖2.安装lombok插件3.编写实体类4.编译5.查看target文件6.编译后的源代码结论&a…

实用的3款视频添加水印软件分享,简单易上手

如今刷短视频已经成为许多小伙伴饭后闲暇之余消遣的项目,也有不少人因此加入了创作短视频的队列。但是在分享前,最好是对自己的作品加上水印。为什么呢?第一是可以起到更好的宣传作用,第二是防止他人盗窃作品内容,毕竟…

卷积输入输出维度计算公式,Conv, Dilation Conv, Padding, Kernel_size, Output的维度计算关系

define i input o output p padding k kernel_size s stride d dilation 公式 o [i 2p - k - (k-1)(d-1)]/s 1 举例 当 padding “same” 时,输入尺度和输出尺度相同。 oi 则有: p[(i-1)s-i k(k-1)(d-1)]*0.5 假设 k5, s1, 那么 p[(i-1) …

深度学习入门---《白话机器学习的数学》笔记

文章目录一、基础:回归的实现1、训练数据click.csv2、参考公式:3、代码实现:4、运行结果:5、验证:二、多项式回归1、参考公式2、代码实现3、运行结果三、随机梯度下降法的实现1、参考公式小批量(mini-batch…

F. Quests(二分)

Problem - F - Codeforces 有n个任务。如果你完成第i个任务,你将获得ai币。你每天最多只能完成一个任务。然而,一旦你完成了一个任务,在K天内你不能再做同样的任务。(例如,如果k2,你在第1天做了任务1,那么你…

radiantq:jQuery Gantt Package--好使的HTML5甘特图

Radiantq--jQuery Gantt Package是一个真正跨平台的、基于原生 HTML5/jQuery 的实现,带有 2 个不同的甘特图小部件。 部署在众多垂直领域 无论您的应用程序属于哪个领域,甘特图都是基于时间的信息的理想可视化工具,包括在软件开发、施工、钻井…

JNoteHelper 给你的java swing或桌面程序提供一双翅膀

JNoteHelper 使用swing构建的java程序, 主要基于miglayout,swingx,flatlatf, 本来打算作为个人笔记的助手, 但是事与愿违, 发现理想和现实很骨感. 项目基于windows测试及开发 ,所以运行效果图片都基于windows 截图 1. 项目地址 JNoteHelper github地址 gitee地址 gitcode地址…

玩法专利获批,发布4年《Beat Saber》为何持续火爆

从2018年首次上线以来,《Beat Saber》被大家爱了4年多,直到现在热度未减,依然是史上最赚钱的VR游戏之一。该作最开始的概念,就是用红、蓝两色的光剑,根据箭头方向和节奏去切方块,玩法简单爽快,受…

Qt QSS QSlider样式

本文章主要学习QSlider样式 准备下面几张背景图片: 调小图标 、调大图标 ​、QSlider位置图标 ​QSlider划过的背景图标 ​、QSlider未划过的背景图标 ​最终效果图 自己创建一个QSlider工程,此处省略…… CSDN QT大纲:Qt开发必备技术栈学…

[附源码]java毕业设计鞋店销售管理

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

DM-VERITY流程分析

DM-Verity分析报告 0.问题的表现形式 1.dm-verity的初始化及验证流程 1.1 dm-verity的初始化 初始化dm的log: [ 3.579718] md: Waiting for all devices to be available before autodetect [ 3.586549] md: If you dont use raid, use raidnoautodetect [ 3.594…

Allegro如何录制SCR快捷键操作指导

Allegro如何录制SCR快捷键操作指导 Allegro可以录制SCR快捷键,里面记录了一些操作,类似一个插件,使用的时候可以直接调用,节省时间。下面介绍如何录制 选择file-Script 会出现一个对话框,任意输入一个名字,比如666 然后点击record 比如录制一个打开层面的scr,操作如…

基于matlab的排队系统仿真

欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》 目录 一、理论基础 二、核心程序 三、测试结果 一、理论基础 排队系统是基本的离散事件系统,了解掌握离散事件系统是研究排队系统仿真不可或缺的前提。离散事件系统是指其状态变量只在某些离散时…

SAP-FICO概览培训 的PPT 文档

目录 SAP ERP 系统功能模块概览 财务会计(FI)、管理会计(CO) 财务会计(FI)、管理会计(CO)需求出发点 FI 与CO灵活性对比 财务会计(FI) 财务业务一体化平台示…

JSP概述

JSP JSP是Sun为了解决动态生成HTML文档的技术,通过Servlet输出简单html页面信息都非常不方便。如果要输出一个复杂页面的时候,就更加的困难,而且不利于页面的维护和调试。所以sun公司推出一种叫做jsp的动态页面技术来实现对页面的输出繁锁工…