【ESP-NOW with ESP32:从多个开发板接收数据(多对一)】

news2024/11/30 9:35:33

【ESP-NOW with ESP32:从多个开发板接收数据(多对一)】

  • 1. 项目概况
  • 2. 先决条件
    • 2.1 环境配置
    • 2.2 所需零件
  • 3. 获取接收板 MAC 地址
  • 4. ESP32 发送码 (ESP-NOW)
    • 4.1 代码的工作原理
    • 4.2 setup()
    • 4.3 添加对等设备
    • 4.4 loop()
    • 4.5 发送 ESP-NOW 消息
  • 5. ESP32 接收器代码 (ESP-NOW)
    • 5.1 代码的工作原理
    • 5.2 onDataRecv()
    • 5.3 setup()
  • 6. 示范
  • 7. 总结

本教程介绍如何设置 ESP32 开发板,通过 ESP-NOW 通信协议(多对一配置)接收来自多个 ESP32 开发板的数据。如果您想将多个传感器节点的数据收集到一个 ESP32 开发板中,此配置是理想的选择。这些板将使用Arduino IDE进行编程。

ESP-NOW with ESP32:多对一接收多板数据

我们还有其他与 ESP-NOW 相关的指南,您可能对此感兴趣:

ESP-NOW 入门(ESP32 with Arduino IDE)
ESP-NOW ESP32 开发板之间的双向通信
ESP-NOW with ESP32:向多个开发板发送数据(一对多)

1. 项目概况

本教程介绍如何设置 ESP32 开发板,通过 ESP-NOW 通信协议(多对一配置)接收来自多个 ESP32 开发板的数据,如下图所示。

ESP-NOW 搭载 ESP32 从多个开发板接收数据(多对一) 项目概况

  • 一个 ESP32 开发板用作接收器/从设备;
  • 多个 ESP32 开发板充当发送器/主站。我们已经用 5 个 ESP32发送板测试了这个示例,它工作正常。您应该能够将更多板添加到您的设置中;
  • 发送方板收到一条确认消息,指示消息是否已成功传递;
  • ESP32接收板接收来自所有发送方的消息,并识别哪个板发送了消息;
  • 例如,我们将在板之间交换随机值。您应该修改此示例以发送命令或传感器读数(使用ESP-NOW 交换传感器读数)。

注意:在 ESP-NOW 文档中,没有“发送者/主站”和“接收者/从站”之类的东西。每个板都可以是发送方或接收方。但是,为了清楚起见,我们将使用术语“发送方”和“接收方”或“主”和“从属”。

2. 先决条件

我们将使用 Arduino IDE 对 ESP32 开发板进行编程,因此在继续本教程之前,请确保已在 Arduino IDE 中安装这些开发板。

我们将使用 Arduino IDE 对 ESP32/ESP8266 开发板进行编程,因此在继续本教程之前,请确保已在 Arduino IDE 中安装这些开发板。

2.1 环境配置

在 Arduino IDE 中安装 ESP32 开发板(Windows、Mac OS X 和 Linux)
在Arduino IDE中安装ESP8266板(Windows,Mac OS X,Linux)

2.2 所需零件

要学习本教程,您需要多个 ESP32 开发板。所有 ESP32 型号都可以正常工作。我们尝试了不同型号的 ESP32 开发板,并且都运行良好(ESP32 DOIT 开发板、TTGO T-Journal、ESP32 with OLED 开发板和 ESP32-CAM)。

ESP32(阅读最佳 ESP32 开发板 )

3. 获取接收板 MAC 地址

要通过 ESP-NOW 发送消息,您需要知道接收器板的 MAC 地址。每个开发板都有一个唯一的 MAC 地址(了解如何获取和更改 ESP32 MAC 地址)。

将以下代码上传到每个接收器板以获取其 MAC 地址。

// Complete Instructions to Get and Change ESP MAC Address: https://RandomNerdTutorials.com/get-change-esp32-esp8266-mac-address-arduino/

#ifdef ESP32
  #include <WiFi.h>
#else
  #include <ESP8266WiFi.h>
#endif

void setup(){
  Serial.begin(115200);
  Serial.println();
  Serial.print("ESP Board MAC Address:  ");
  Serial.println(WiFi.macAddress());
}
 
void loop(){

}

上传代码后,按 RST/EN 按钮,MAC 地址应显示在串行监视器上。

在这里插入图片描述

4. ESP32 发送码 (ESP-NOW)

接收方可以通过其唯一的MAC地址来识别每个发送方。但是,在接收端处理不同的MAC地址以识别哪个板发送了哪个消息可能很棘手。

因此,为了方便起见,我们将用一个唯一的编号(编号) 从 1 开始。如果您有三块板,则一块板的 ID 号为 1,另一块板的 ID 号为 2,最后是 3 号。该 ID 将与其他变量一起发送给接收方。

例如,我们将交换包含板的结构编号数字和两个随机数x和y如下图所示。

ESP-NOW 搭载 ESP32 从多个开发板(多对一)接收数据 示例数据

将以下代码上传到每个发送方板。别忘了增加编号每个发送板的编号。

/*********
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/esp-now-many-to-one-esp32/
  
  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.
  
  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*********/

#include <esp_now.h>
#include <WiFi.h>

// REPLACE WITH THE RECEIVER'S MAC Address
uint8_t broadcastAddress[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

// Structure example to send data
// Must match the receiver structure
typedef struct struct_message {
    int id; // must be unique for each sender board
    int x;
    int y;
} struct_message;

// Create a struct_message called myData
struct_message myData;

// Create peer interface
esp_now_peer_info_t peerInfo;

// callback when data is sent
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
  Serial.print("\r\nLast Packet Send Status:\t");
  Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
}
 
void setup() {
  // Init Serial Monitor
  Serial.begin(115200);

  // Set device as a Wi-Fi Station
  WiFi.mode(WIFI_STA);

  // Init ESP-NOW
  if (esp_now_init() != ESP_OK) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }

  // Once ESPNow is successfully Init, we will register for Send CB to
  // get the status of Trasnmitted packet
  esp_now_register_send_cb(OnDataSent);
  
  // Register peer
  memcpy(peerInfo.peer_addr, broadcastAddress, 6);
  peerInfo.channel = 0;  
  peerInfo.encrypt = false;
  
  // Add peer        
  if (esp_now_add_peer(&peerInfo) != ESP_OK){
    Serial.println("Failed to add peer");
    return;
  }
}
 
void loop() {
  // Set values to send
  myData.id = 1;
  myData.x = random(0,50);
  myData.y = random(0,50);

  // Send message via ESP-NOW
  esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));
   
  if (result == ESP_OK) {
    Serial.println("Sent with success");
  }
  else {
    Serial.println("Error sending the data");
  }
  delay(10000);
}

4.1 代码的工作原理

包括无线上网和esp_now库。

#include <esp_now.h>
#include <WiFi.h>

在以下行中插入接收方的 MAC 地址。

uint8_t broadcastAddress[] = {0x30, 0xAE, 0xA4, 0x15, 0xC7, 0xFC};

然后,创建一个包含我们要发送的数据的结构。我们称这种结构为struct_message它包含三个整数变量:板编号,x和y.您可以更改它以发送所需的任何变量类型(但不要忘记在接收端也进行更改)。

typedef struct struct_message {
  int id; // must be unique for each sender board
  int x;
  int y;
} struct_message;

创建一个类型的新变量struct_message这被称为myData(我的数据)这将存储变量的值。

struct_message myData;

创建类型的变量esp_now_peer_info_t存储有关对等方的信息。

esp_now_peer_info_t peerInfo;

OnDataSent() 回调函数
接下来,定义OnDataSent()功能。这是一个回调函数,将在发送消息时执行。在这种情况下,此函数将打印消息是否成功传递。

void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
  Serial.print("\r\nLast Packet Send Status:\t");
  Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
}

4.2 setup()

在setup(),初始化串行监视器以进行调试:

Serial.begin(115200);

将设备设置为 Wi-Fi 站:

WiFi.mode(WIFI_STA);

初始化 ESP-NOW:

if (esp_now_init() != ESP_OK) {
  Serial.println("Error initializing ESP-NOW");
  return;
}

成功初始化 ESP-NOW 后,注册发送消息时将调用的回调函数。在这种情况下,请注册OnDataSent()之前创建的函数。

esp_now_register_send_cb(OnDataSent);

4.3 添加对等设备

要将数据发送到另一块板(接收器),您需要将其配对为对等体。以下行注册并添加新的对等体。

memcpy(peerInfo.peer_addr, broadcastAddress, 6);
peerInfo.channel = 0;
peerInfo.encrypt = false;

// Add peer
if (esp_now_add_peer(&peerInfo) != ESP_OK){
  Serial.println("Failed to add peer");
  return;
}

4.4 loop()

在loop(),我们将每 10 秒通过 ESP-NOW 发送一条消息(您可以更改此延迟时间)。

为每个变量赋值。

myData.id = 1;
myData.x = random(0,50);
myData.y = random(0,50);

不要忘记更改每个发送方板的 ID。

请记住,myData(我的数据)是一种结构。在这里,分配要在结构内发送的值。在本例中,我们只是发送编号和随机值x和y.例如,在实际应用中,这些应替换为命令或传感器读数。

4.5 发送 ESP-NOW 消息

最后,通过 ESP-NOW 发送消息。

// Send message via ESP-NOW
esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));
 
if (result == ESP_OK) {
  Serial.println("Sent with success");
}
else {
  Serial.println("Error sending the data");
}

5. ESP32 接收器代码 (ESP-NOW)

将以下代码上传到 ESP32 接收器板。该代码准备接收来自三个不同板的数据。您可以轻松修改代码,以从不同数量的电路板接收数据。

/*********
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/esp-now-many-to-one-esp32/
  
  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.
  
  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*********/

#include <esp_now.h>
#include <WiFi.h>

// Structure example to receive data
// Must match the sender structure
typedef struct struct_message {
  int id;
  int x;
  int y;
}struct_message;

// Create a struct_message called myData
struct_message myData;

// Create a structure to hold the readings from each board
struct_message board1;
struct_message board2;
struct_message board3;

// Create an array with all the structures
struct_message boardsStruct[3] = {board1, board2, board3};

// callback function that will be executed when data is received
void OnDataRecv(const uint8_t * mac_addr, const uint8_t *incomingData, int len) {
  char macStr[18];
  Serial.print("Packet received from: ");
  snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
           mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
  Serial.println(macStr);
  memcpy(&myData, incomingData, sizeof(myData));
  Serial.printf("Board ID %u: %u bytes\n", myData.id, len);
  // Update the structures with the new incoming data
  boardsStruct[myData.id-1].x = myData.x;
  boardsStruct[myData.id-1].y = myData.y;
  Serial.printf("x value: %d \n", boardsStruct[myData.id-1].x);
  Serial.printf("y value: %d \n", boardsStruct[myData.id-1].y);
  Serial.println();
}
 
void setup() {
  //Initialize Serial Monitor
  Serial.begin(115200);
  
  //Set device as a Wi-Fi Station
  WiFi.mode(WIFI_STA);

  //Init ESP-NOW
  if (esp_now_init() != ESP_OK) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }
  
  // Once ESPNow is successfully Init, we will register for recv CB to
  // get recv packer info
  esp_now_register_recv_cb(OnDataRecv);
}
 
void loop() {
  // Acess the variables for each board
  /*int board1X = boardsStruct[0].x;
  int board1Y = boardsStruct[0].y;
  int board2X = boardsStruct[1].x;
  int board2Y = boardsStruct[1].y;
  int board3X = boardsStruct[2].x;
  int board3Y = boardsStruct[2].y;*/

  delay(10000);  
}

5.1 代码的工作原理

与发送方类似,首先包括库:

#include <esp_now.h>
#include <WiFi.h>

创建一个结构来接收数据。此结构应与发送方草图中定义的结构相同。

typedef struct struct_message {
  int id;
  int x;
  int y;
} struct_message;

创建一个struct_message称为myData(我的数据)这将保存接收到的数据。

struct_message myData;

然后,创建一个struct_message变量,以便我们可以将接收到的数据分配给相应的板。在这里,我们将为三个发送方板创建结构。如果有更多的发送方板,则需要创建更多结构。

struct_message board1;
struct_message board2;
struct_message board3;

创建一个包含所有板结构的数组。如果您使用的是不同数量的板,则需要对其进行更改。

struct_message boardsStruct[3] = {board1, board2, board3};

5.2 onDataRecv()

创建一个回调函数,当 ESP32 通过 ESP-NOW 接收到数据时调用该函数。该函数被调用onDataRecv()并应接受以下几个参数:

void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) 

获取板子MAC地址:

char macStr[18];
Serial.print("Packet received from: ");
snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
         mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
Serial.println(macStr);

复制传入数据data 变量添加到myData(我的数据)变量。

memcpy(&myData, incomingData, sizeof(myData));

现在,myData(我的数据)结构包含多个变量,其值由 ESP32 发送方之一发送。我们可以通过其 ID 来识别哪个板发送数据包:myData.id.

这样,我们可以将接收到的值分配给板结构数组:

boardsStruct[myData.id-1].x = myData.x;
boardsStruct[myData.id-1].y = myData.y;

例如,假设您收到一个来自 ID 为 2 的板的数据包。的值myData.id,为 2。

因此,您要更新董事会2结构。这董事会2structure 是索引为 1 的元素板结构数组。这就是我们减去 1 的原因,因为 C 中的数组索引为 0。如果您查看下图,可能会有所帮助。
在这里插入图片描述

5.3 setup()

在setup(),初始化串行监视器。

Serial.begin(115200);

将设备设置为 Wi-Fi Station。

WiFi.mode(WIFI_STA);

初始化 ESP-NOW:

if (esp_now_init() != ESP_OK) {
  Serial.println("Error initializing ESP-NOW");
  return;
}

注册一个回调函数,该函数将在收到数据时调用。在这种情况下,我们注册OnDataRecv()之前创建的函数。

esp_now_register_recv_cb(OnDataRecv);

循环中注释的以下行举例说明了如果要访问每个板结构的变量,需要执行的操作。例如,要访问x值董事会1:

int board1X = boardsStruct[0].x;

6. 示范

将发送方代码上传到每个发送方板。不要忘记为每个板子提供不同的 ID。

将接收器代码上传到 ESP32 接收器板。不要忘记修改结构以匹配发送板的数量。

在发件人的串行监视器上,如果邮件正确传递,您应该会收到“传递成功”消息。

ESP-NOW 发送数据包成功 ESP32 串口监控器

在接收器板上,您应该接收来自所有其他板的数据包。在这个测试中,我们从5个不同的电路板接收数据。

ESP-NOW 从多个板卡接收数据 ESP32 串口监视器

7. 总结

🥳🥳🥳现在,我们在本教程中,您学习了如何使用 ESP-NOW(多对一配置)设置 ESP32 以接收来自多个 ESP32 开发板的数据。🛹🛹🛹从而实现对外部世界进行感知,充分认识这个有机与无机的环境,后期会持续分享esp32跑freertos实用案列🥳🥳🥳科学地合理地进行创作和发挥效益,然后为人类社会发展贡献一点微薄之力。🤣🤣🤣

参考文献:

  • 【ESP-NOW ESP32 开发板之间的双向通信】
  • 【ESP-NOW 入门(ESP32 with Arduino IDE)】
  • 【ESP-NOW with ESP32:向多个开发板发送数据(一对多)】
  • ESP-NOW with ESP32: Receive Data from Multiple Boards (many-to-one)

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

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

相关文章

第6课 用window API捕获麦克风数据并加入队列备用

今天是2024年1月1日&#xff0c;新年的第一缕阳光已经普照大地&#xff0c;祝愿看到这篇文章的所有程序员或程序爱好者都能在新的一年里持之以恒&#xff0c;事业有成。 今天也是我加入CSDN的第4100天&#xff0c;但回过头看一看&#xff0c;这么长的时间也没有在CSDN写下几篇…

Windows 10 安装和开启VNCServer 服务

Windows 10 安装和开启VNCServer 服务 登录云服务器 使用本地RDP登录到配置VNCServer服务的Windows10系统的云服务器。 下载VNC Server安装包 打开官网下载VNCServer安装包 URL&#xff1a;https://www.realvnc.com/en/connect/download/vnc/windows/ 安装VNC Server 双击…

LVGL 在framebuffer设备上的移植

LVGL 在framebuffer设备上的移植 ItemDescDate2023-12-31Authorhongxi.zhuplatformNXP I.MX6ULLLCDSPI TFTLCD NV3030B 文章目录 LVGL 在framebuffer设备上的移植一、LVGL源码获取二、源码修改适配三、编译&运行补充 一、LVGL源码获取 新建lvgl_imx6ull文件夹&#xff0c…

【python_数据分组】

对excel按照标签进行分组&#xff0c;例如按照“开票主体和对方公司”进行分组&#xff0c;并获取对应的明细。 表格如下&#xff1a; def main(excel_data):result {}for d in excel_data:if str(d[0])str(d[1]) in result:result[str(d[0])str(d[1])].append([d[0],d[1],…

MySQL高级SQL语句补充

目录 1.空值&#xff08;NULL&#xff09;和 无值&#xff08; &#xff09;的区别 2.正则表达式 3.存储过程 存储过程的优点 创建存储过程 调用存储过程 查看存储过程 存储过程的参数 IN 输入参数 OUT 输出参数 INOUT 输入输出参数 删除存储过程 存储过程的控制语…

【2024最新版】neo4j安装配置

neo4j安装 写在最前面下载配置环境&#xff08;还是不行&#xff1f;&#xff09;启动neo4jpython中调用 写在最前面 之前我安装过&#xff0c;还写了一篇笔记 结果意外发现没有了&#xff0c;而且和之前安装的步骤不一样了&#xff0c;因此再次记录安装过程 下载 https://ne…

B端产品学习-市场调研与分析

B端产品市场调研与分析 目录&#xff1a; 为什么要做产品调研 B端产品调研对比C端产品调研 B端产品调研要怎么做 为什么要做产品调研 杰克特劳特说过&#xff1a;“成为唯一。如果不能争得第一&#xff0c;那就找到一个能够成为第一的细分&#xff0c;这就是定位的第一法则…

软考网络工程师教程第五版(2018最新版)

软考网络工程师教程第五版(2018最新版) 内容简介 本书是全国计算机技术与软件专业技术资格(水平)考试指定用书。作者在前4版的基础上,根据网络工程师新版大纲的要求,针对考试的重点内容做了较大篇幅的修订,书中主要内容包括数据通信、广域通信网、局域网、城域网、因特网…

K8s实战入门

1.NameSpace Namespace是kubernetes系统中的一种非常重要资源&#xff0c;它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。 默认情况下&#xff0c;kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中&#xff0c;可能不想让两个Pod之间进行互相…

用LCD显示字符‘A‘

#include<reg51.h> //包含单片机寄存器的头文件 #include<intrins.h> //包含_nop_()函数定义的头文件 sbit RSP2^0; //寄存器选择位&#xff0c;将RS位定义为P2.0引脚 sbit RWP2^1; //读写选择位&#xff0c;将RW位定义为P2.1引脚 sbit EP2^2; //使能…

用LCD循环右移显示“Welcome to China“

#include<reg51.h> //包含单片机寄存器的头文件 #include<intrins.h> //包含_nop_()函数定义的头文件 sbit RSP2^0; //寄存器选择位&#xff0c;将RS位定义为P2.0引脚 sbit RWP2^1; //读写选择位&#xff0c;将RW位定义为P2.1引脚 sbit EP2^2; //使能…

「Verilog学习笔记」乘法与位运算

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 观察乘数的特点&#xff1a; 1111_1011 1_0000_0000 - 1 - 100 timescale 1ns/1nsmodule dajiang13(input [7:0] A,output [15:0] B);//*************code*********…

Unity Shader UVLightReveal (紫外线显示,验钞效果)

Unity Shader UVLightReveal &#xff08;紫外线显示&#xff0c;验钞效果&#xff09; UVLight Reveal 实现验钞机的效果实现方案操作实现1.Light2.将另一个图形加入3.加上图形效果4.加上灯光的颜色自定义判定 源码 UVLight Reveal 实现验钞机的效果 大家应该都有见过验钞机验…

力扣:452. 用最少数量的箭引爆气球(贪心)

题目&#xff1a; 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。…

apache httpd多后缀解析漏洞复现

一、漏洞描述 Apache Httpd支持一个文件拥有多个后缀,不同的后缀执行不同的命令,也就是说当我们上传的文件中只要后缀名含有php,该文件就可以被解析成php文件,利用Apache httpd这个特性,就可以绕过上传文件的白名单。 该漏洞和apache版本和php版本无关,属于用户配置不当造成的解…

大数据 - Hadoop系列《三》- HDFS(分布式文件系统)概述

&#x1f436;5.1 hdfs的概念 HDFS分布式文件系统,全称为:Hadoop Distributed File System。 它是一个文件系统&#xff0c;用于存储文件&#xff0c;通过目录树来定位文件&#xff1b;其次&#xff0c;它是分布式的&#xff0c;由很多服务器联合起来实现其功能&#xff0c;集…

个人博客主题 vuepress-hope

文章目录 1. 简介2. 配置2.1 个人博客&#xff0c;社媒链接配置 非常推荐vuepress-hope 1. 简介 下面的我的博客文章的截图 通过md写博客并且可以同步到github-page上 2. 配置 2.1 个人博客&#xff0c;社媒链接配置 配置文件 .vuepress/theme.ts blog: {medias: {BiliB…

【NLP论文】02 TF-IDF 关键词权值计算

之前写了一篇关于关键词词库构建的文章&#xff0c;没想到反响还不错&#xff0c;最近有空把接下来的两篇补完&#xff0c;也继续使用物流关键词词库举例&#xff0c;本篇文章承接关键词词库构建并以其为基础&#xff0c;将计算各关键词的 TF-IDF 权值&#xff0c;TF-IDF 权值主…

网络安全—PKI公钥基础设施

文章目录 前提知识散列函数非对称加密数字签名 PKI受信任的人RA注册CA颁发IKE数字签名认证&#xff08;交换证书&#xff09;密钥管理 前提知识 散列函数 散列也可以叫哈希函数&#xff0c;MD5、SHA-1、SHA-2、、&#xff08;不管叫啥&#xff0c;都记得是同一个东西就行&…

解决Hive在DataGrip 中注释乱码问题

注释属于元数据的一部分&#xff0c;同样存储在mysql的metastore库中&#xff0c;如果metastore库的字符集不支持中文&#xff0c;就会导致中文显示乱码。 不建议修改Hive元数据库的编码&#xff0c;此处我们在metastore中找存储注释的表&#xff0c;找到表中存储注释的字段&a…