32单片机从入门到精通之数据处理——传感器接口(十二)

news2025/1/8 6:03:10

无论遇到什么困难和挑战,我们都要坚定信心,勇往直前。成功的路上充满了艰辛和磨砺,但正是这些困难使我们变得更加坚强和成熟。在人生的道路上,我们要时刻提醒自己,不管面对多大的困难,都要勇敢地迎接,坚持下去。努力奋斗的过程并不容易,但只有经历了努力和汗水,才能收获更多的成功和成果。让我们鼓起勇气,迎接挑战,相信自己的实力,坚信只要不放弃,就一定能够实现梦想。在逆境中崛起,不断超越自己,这就是成功的真谛。无论遇到什么困难,我们都要坚信自己的能力,不轻言放弃。困难是人生路上的一道坎,只有越过了它,我们才能迎来更美好的未来。励志不仅仅是一种口号,更是一种信念和行动,相信自己,你就已经成功了一半。所以,让我们保持积极的心态,勇往直前,坚持不懈,一定能够走向成功的巅峰!

目录

上一张试卷讲解

一、选择题(每题2分,共40分)

二、简答题(每题10分,共30分)

三、编程题(每题15分,共30分)

知识点和代码详解

一、传感器接口与数据读取

1. 温度传感器(以DHT22为例)

2. 加速度计(以ADXL345为例)

二、模拟信号输入处理

三、PWM输出控制

试卷

一、选择题(每题2分,共20分)

二、简答题(每题10分,共30分)

三、编程题(每题15分,共30分)


上一张试卷讲解

一、选择题(每题2分,共40分)

  1. B. 波特率
    UART通信中,确保两端设备同步传输的关键参数是波特率。它定义了数据传输的速度。

  2. C. 起始条件
    在I2C通信中,起始条件用于标识数据传输的开始。

  3. C. SCK
    SPI通信中,SCK(串行时钟)引脚负责控制时钟信号,协调主从设备之间的数据交换。

  4. D. MQTT
    MQTT是一种发布/订阅模式的消息协议,不是基于点对点的通信方式。

  5. C. 可靠的数据传输
    TCP/IP模型中的传输层主要提供可靠的数据传输服务,例如通过TCP协议实现。

  6. B. 资源受限的IoT设备
    MQTT协议设计用于资源受限的IoT设备,因为它具有轻量级的特点。

  7. A. 指示数据帧的结束
    停止位在UART通信中用来指示一个数据帧的结束。

  8. A. 设备地址
    I2C总线上的每个设备都有唯一的地址,以区分彼此。

  9. B. 同时发送和接收数据
    在SPI通信中,全双工模式允许同时进行数据的发送和接收。

  10. B. 会话层
    会话层不属于TCP/IP四层模型;该模型包括应用层、传输层、网络层和链路层。

  11. B. 最多一次传递
    MQTT协议中的QoS级别0表示最多一次传递,即消息可能丢失但不会重复。

  12. B. 接收完成中断
    实现UART通信时,通常使用接收完成中断来处理接收到的数据。

  13. B. 从设备
    I2C协议中的ACK信号通常由从设备发出,确认已经成功接收到数据。

  14. C. 需要外部时钟源
    SPI通信不需要外部时钟源,因为时钟是由主设备提供的。

  15. C. 网络层
    IP协议位于TCP/IP栈的网络层,负责路由选择等任务。

  16. A. MQTTClient_connect
    MQTT客户端连接到服务器时使用的函数通常是MQTTClient_connect

  17. D. 简单硬件连接
    I2C通信的一个优势是只需要两条线(SDA和SCL),因此硬件连接较为简单。

  18. C. 选择从设备
    在SPI通信中,SS(片选)引脚的主要作用是选择哪个从设备参与当前通信。

  19. C. 可靠的数据传输
    相对于UDP,TCP的主要优势在于提供了可靠的、面向连接的数据传输。

  20. B. 继续接收离线消息
    MQTT的持久会话特性使得客户端断开后还能继续接收离线期间的消息。

二、简答题(每题10分,共30分)

  1. 描述UART通信的基本原理,并说明波特率设置的重要性

     

    UART(通用异步收发传输器)通信是一种串行通信方式,其中两个设备之间通过发送和接收一系列比特来交换信息。通信过程中,发送方将并行数据转换为串行格式发送出去,接收方则执行相反的操作。为了保证正确的数据传输,双方必须事先约定好相同的波特率(即每秒传输的比特数)。波特率设置的重要性在于,它决定了通信速度以及两端设备如何同步地读取和写入数据。如果波特率不匹配,可能会导致数据误读或丢失。

  2. 比较I2C和SPI两种通信协议的主要区别,包括硬件连接、数据传输方式和应用场景

    • 硬件连接:I2C仅需两根线(SDA和SCL)即可实现多主多从架构;而SPI需要至少四根线(MOSI, MISO, SCK, SS),并且每次只能有一个主设备。
    • 数据传输方式:I2C采用半双工模式,同一时间内只能单向传输数据;SPI则是全双工模式,可以同时双向传输数据。
    • 应用场景:I2C适合于低速、简单的通信场景,如传感器读取;SPI更适合高速传输需求的应用,如LCD显示驱动、音频数据传输等。
  3. 解释TCP/IP模型的四层结构及其各层的主要功能

    • 应用层:负责应用程序间的通信,例如HTTP、FTP等协议。
    • 传输层:提供端到端的通信服务,如TCP提供可靠的流控传输,UDP提供无连接的服务。
    • 网络层:负责逻辑寻址与路由选择,IP协议在此层工作,确保数据包能够正确到达目的地。
    • 链路层:管理物理层之上的一系列操作,如MAC地址解析、错误检测等,保障数据在本地网络内的传输。

三、编程题(每题15分,共30分)

  1. 编写一段C语言代码,初始化一个UART接口并实现发送字符串“Hello, World!”的功能。假设使用STM32微控制器
#include "stm32f4xx_hal.h"

UART_HandleTypeDef huart2;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART2_UART_Init(void);

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_USART2_UART_Init();

    char *msg = "Hello, World!\r\n";
    HAL_UART_Transmit(&huart2, (uint8_t *)msg, strlen(msg), HAL_MAX_DELAY);

    while (1)
    {
        // 主循环等待
    }
}

static void MX_USART2_UART_Init(void)
{
    huart2.Instance = USART2;
    huart2.Init.BaudRate = 115200;
    huart2.Init.WordLength = UART_WORDLENGTH_8B;
    huart2.Init.StopBits = UART_STOPBITS_1;
    huart2.Init.Parity = UART_PARITY_NONE;
    huart2.Init.Mode = UART_MODE_TX_RX;
    huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    huart2.Init.OverSampling = UART_OVERSAMPLING_16;
    if (HAL_UART_Init(&huart2) != HAL_OK)
    {
        Error_Handler();
    }
}

void Error_Handler(void)
{
    while(1)
    {
        // 错误处理
    }
}
  1. 使用Paho-MQTT库编写一个简单的MQTT客户端程序,该程序能够连接到指定的MQTT服务器,订阅一个主题,并打印接收到的消息
import paho.mqtt.client as mqtt

# 定义回调函数-连接上服务器后触发
def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))
    client.subscribe("test/topic")

# 定义回调函数-收到消息后触发
def on_message(client, userdata, msg):
    print(f"Received message: {msg.payload.decode()} from topic: {msg.topic}")

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

# 连接到MQTT服务器
client.connect("broker.hivemq.com", 1883, 60)

# 开始循环监听
client.loop_forever()

以上代码段展示了如何配置和初始化STM32的UART接口以发送字符串,以及如何利用Python的Paho-MQTT库创建一个简单的MQTT客户端。请注意,在实际项目中还需要根据具体的硬件平台和开发环境做适当的调整。

知识点和代码详解

接下来我将详细讲解如何读取温度、湿度、加速度计等传感器的数据,并处理模拟信号输入以及控制PWM输出。同时,我会提供详细的代码示例和注释,帮助你更好地理解每个部分的工作原理。

一、传感器接口与数据读取

1. 温度传感器(以DHT22为例)

知识点讲解:

  • DHT22 是一种数字温湿度传感器,它可以通过单总线协议与微控制器通信。
  • 使用Arduino平台上的DHT库可以简化对DHT22的操作,该库提供了易于使用的API来读取温度和湿度值。

代码详解及注释:

#include <DHT.h> // 包含DHT传感器库

// 定义DHT22连接的引脚编号以及传感器类型
#define DHTPIN 2          // DHT22 数据引脚连接到数字引脚2
#define DHTTYPE DHT22     // 指定使用的是DHT22型号

DHT dht(DHTPIN, DHTTYPE); // 创建DHT对象

void setup() {
  Serial.begin(9600); // 初始化串口通信,波特率为9600
  dht.begin();        // 初始化DHT传感器
}

void loop() {
  // 从DHT22读取湿度和温度值
  float humidity = dht.readHumidity();
  float temperature = dht.readTemperature();

  // 如果读取失败,则打印错误信息并返回
  if (isnan(humidity) || isnan(temperature)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  // 打印湿度和温度值到串口监视器
  Serial.print("Humidity: ");
  Serial.print(humidity);
  Serial.print("%  Temperature: ");
  Serial.print(temperature);
  Serial.println("°C");

  delay(2000); // 等待两秒再读取新数据
}

注释说明:

  • #include <DHT.h>:包含用于操作DHT传感器的库文件。
  • #define DHTPIN 2 和 #define DHTTYPE DHT22:定义了DHT22传感器连接的引脚号及其类型。
  • DHT dht(DHTPIN, DHTTYPE):实例化了一个名为dht的对象,用来表示连接在指定引脚上的DHT22传感器。
  • Serial.begin(9600):初始化串行通信,设置波特率为9600,以便能够通过串口监视器查看结果。
  • dht.begin():初始化DHT传感器,准备开始读取数据。
  • float humidity = dht.readHumidity(); 和 float temperature = dht.readTemperature();:分别调用readHumidity()readTemperature()方法读取湿度和温度值。
  • if (isnan(humidity) || isnan(temperature)):检查是否成功读取到了有效数值;如果不是,则输出错误信息并退出当前循环迭代。
  • delay(2000):等待2秒钟后再次尝试读取新的数据。
2. 加速度计(以ADXL345为例)

知识点讲解:

  • ADXL345 是一个三轴加速度计,支持I²C或SPI接口,通常用于检测物体的运动状态。
  • 可以通过I²C或SPI协议与MCU进行通信,获取XYZ三个方向上的加速度信息。

代码详解及注释:

#include <Wire.h>         // 包含I2C通信所需的库
#include <Adafruit_ADXL345_U.h> // 包含ADXL345传感器库

Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(ADXL345_ADDRESS);

void setup() {
  Serial.begin(9600); // 初始化串口通信,波特率为9600
  Wire.begin();       // 初始化I2C通信

  if (!accel.begin()) { // 尝试初始化ADXL345传感器
    Serial.println("Failed to initialize ADXL345!");
    while (1);         // 如果初始化失败,则进入死循环
  }
}

void loop() {
  sensors_event_t event; // 创建一个事件结构体存储传感器数据

  accel.getEvent(&event); // 获取加速度计数据

  // 打印X、Y、Z轴的加速度值到串口监视器
  Serial.print("X: "); Serial.print(event.acceleration.x); Serial.print(" m/s^2");
  Serial.print(" Y: "); Serial.print(event.acceleration.y); Serial.print(" m/s^2");
  Serial.print(" Z: "); Serial.print(event.acceleration.z); Serial.print(" m/s^2");
  Serial.println("");

  delay(500); // 等待半秒再读取新数据
}

注释说明:

  • #include <Wire.h> 和 #include <Adafruit_ADXL345_U.h>:包含必要的库文件,前者用于I²C通信,后者是专门为ADXL345设计的库。
  • Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(ADXL345_ADDRESS);:创建了一个Adafruit_ADXL345_Unified类型的对象accel,并通过传递设备地址来初始化它。
  • Wire.begin();:初始化I²C通信。
  • if (!accel.begin()):尝试初始化ADXL345传感器,如果失败则停止程序运行。
  • sensors_event_t event;:声明一个sensors_event_t类型的变量event,用于存储从传感器获得的数据。
  • accel.getEvent(&event);:调用getEvent()方法填充event变量中的数据。
  • Serial.print(event.acceleration.x); 等:将X、Y、Z轴的加速度值打印出来。

二、模拟信号输入处理

对于模拟传感器,如LM35温度传感器,其输出是一个随温度变化而变化的电压值。为了将其转换为数字形式,我们需要利用微控制器内置的ADC(模数转换器)功能。

代码详解及注释:

const int analogPin = A0; // 定义模拟输入引脚

void setup() {
  Serial.begin(9600); // 初始化串口通信,波特率为9600
}

void loop() {
  int sensorValue = analogRead(analogPin); // 读取模拟引脚上的电压值

  // 将ADC值转换为实际温度(假设使用LM35,每10mV对应1°C)
  float voltage = sensorValue * (5.0 / 1023.0); // 转换为电压值
  float temperatureC = voltage * 100.0;         // 转换为摄氏度

  // 打印温度值到串口监视器
  Serial.print("Temperature: ");
  Serial.print(temperatureC);
  Serial.println("°C");

  delay(1000); // 等待一秒再读取新数据
}

注释说明:

  • const int analogPin = A0;:定义模拟输入引脚A0,这是LM35传感器的输出端应该连接的地方。
  • int sensorValue = analogRead(analogPin);:调用analogRead()函数读取模拟引脚上的电压值,范围通常是0到1023之间的整数。
  • float voltage = sensorValue * (5.0 / 1023.0);:根据ADC的最大输入电压(这里是5V),计算出对应的电压值。
  • float temperatureC = voltage * 100.0;:由于LM35的输出特性是10mV/°C,因此乘以100即可得到摄氏度值。
  • delay(1000);:等待1秒钟后再次读取新的数据。

三、PWM输出控制

PWM(脉宽调制)是一种常用的模拟控制技术,主要用于调节电机速度、LED亮度等。通过改变占空比(即高电平持续时间相对于周期的比例),可以在固定频率下实现不同级别的功率输出。

代码详解及注释:

const int ledPin = 9; // 定义PWM输出引脚

void setup() {
  pinMode(ledPin, OUTPUT); // 设置引脚模式为输出
}

void loop() {
  for (int brightness = 0; brightness <= 255; brightness++) { // 逐渐增加亮度
    analogWrite(ledPin, brightness); // 设置PWM占空比
    delay(30);                       // 等待一段时间
  }

  for (int brightness = 255; brightness >= 0; brightness--) { // 逐渐降低亮度
    analogWrite(ledPin, brightness); // 设置PWM占空比
    delay(30);                       // 等待一段时间
  }
}

注释说明:

  • const int ledPin = 9;:定义PWM输出引脚为数字引脚9,这个引脚支持PWM功能。
  • pinMode(ledPin, OUTPUT);:配置引脚模式为输出,以便可以发送PWM信号。
  • for (int brightness = 0; brightness <= 255; brightness++) 和 for (int brightness = 255; brightness >= 0; brightness--):这两个循环分别实现了LED亮度从暗到亮再到暗的过程。
  • analogWrite(ledPin, brightness);:调用analogWrite()函数设置PWM占空比,参数brightness的取值范围是从0到255,代表不同的亮度级别。
  • delay(30);:每次调整亮度后等待30毫秒,使得过渡效果更加平滑。

以上就是关于如何读取温度、湿度、加速度计等传感器的数据,处理模拟信号输入以及控制PWM输出的详细讲解。希望这些内容能帮助你更深入地理解各个知识点,并且能够根据提供的代码示例快速上手实践。如果有任何疑问或者需要进一步的帮助,请随时告诉我!

试卷

一、选择题(每题2分,共20分)

  1. 在读取DHT22温湿度传感器数据时,以下哪个库可以简化操作?

    • A. Wire.h
    • B. DHT.h
    • C. Adafruit_ADXL345_U.h
    • D. SPI.h
  2. I2C通信中,用于标识数据传输开始的是:

    • A. ACK信号
    • B. NACK信号
    • C. 起始条件
    • D. 停止条件
  3. LM35温度传感器输出的电压值与摄氏度之间的关系是:

    • A. 每1V对应1°C
    • B. 每10mV对应1°C
    • C. 每100mV对应1°C
    • D. 每1mV对应1°C
  4. PWM信号的主要用途之一是:

    • A. 实现模拟到数字转换
    • B. 控制电机速度或LED亮度
    • C. 提供网络寻址服务
    • D. 读取传感器数据
  5. 下列哪种传感器通常使用I²C接口进行通信?

    • A. DHT22
    • B. ADXL345
    • C. LM35
    • D. LDR(光敏电阻)

二、简答题(每题10分,共30分)

  1. 描述如何使用Arduino平台上的DHT库读取DHT22传感器的数据。

  2. 解释如何利用微控制器内置的ADC将来自LM35温度传感器的模拟信号转换为数字值,并计算出实际温度。

  3. 说明PWM(脉宽调制)的工作原理以及它在控制电机或其他执行机构中的应用。


三、编程题(每题15分,共30分)

  1. 编写一段Arduino代码,初始化一个DHT22传感器并打印温度和湿度值。
  1. 编写一段Arduino代码,从模拟输入读取LM35温度传感器的电压值,将其转换为摄氏度,并通过串口打印出来。

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

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

相关文章

外驱功率管电流型PWM控制芯片CRE6281B1

CRE6281B1 是一款外驱功率管的高度集成的电流型PWM 控制 IC&#xff0c;为高性能、低待机功率、低成本、高效率的隔离型反激式开关电源控制器。在满载时&#xff0c;CRE6281B1工作在固定频率(65kHz)模式。在负载较低时&#xff0c;CRE6281B1采用节能模式&#xff0c;实现较高的…

mapbox基础,加载高德栅格底图

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.1 ☘️mapboxgl.Map style属性二、🍀加载高德栅格底图1. ☘️实现思路2. ☘…

【大数据】(选修)实验4 安装熟悉HBase数据库并实践

实验4 安装熟悉HBase数据库并实践 1、实验目的 (1)理解HBase在Hadoop体系结构中的角色; (2)熟练使用HBase操作常用的Shell命令; (3)熟悉HBase操作常用的Java API。 2、实验平台 操作系统:Linux Hadoop版本:2.6.0或以上版本 HBase版本:1.1.2或以上版本 JDK版…

安装vue脚手架出现的一系列问题

安装vue脚手架出现的一系列问题 前言使用 npm 安装 vue/cli2.权限问题及解决方法一&#xff1a;可以使用管理员权限进行安装。方法二&#xff1a;更改npm全局安装路径 前言 由于已有较长时间未进行 vue 项目开发&#xff0c;今日着手准备开发一个新的 vue 项目时&#xff0c;在…

前端JS中var、let、const之间的区别

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 一、var 二、let 三、const 四、区别 变量…

STM32+ADC+DMA快速循环转换

测试平台&#xff1a;STM32F405RGT6 uint32_t AD_Buf[100]{0}; HAL_ADC_Start_DMA(&hadc2,(uint32_t *)AD_Buf,100); while(1) {printf("AD_Buf:%d\n",AD_Buf[0]); }

Unity中 Xlua使用整理(一)

1.安装: 从GitHub上下载Xlua源码 Tencent/xLua: xLua is a lua programming solution for C# ( Unity, .Net, Mono) , it supports android, ios, windows, linux, osx, etc. (github.com) 下载Xlua压缩包&#xff0c;并解压将Aseet文件夹中的Xlua和Plugins文件夹复制到Unit…

js高阶-函数闭包this

闭包 一等公民 在js中函数是一等公民 函数使用很灵活,可以作为参数,也可以作为返回值 高阶函数 函数接收函数作为参数或者返回函数,则该函数称为高阶函数 eg: array.filter/reduce/find/findIndex/map.forEach 函数与方法 独立使用的 Function 做为对象的属性 method Wh…

Ubuntu 24.04.1 LTS nginx配置maccms

之前在Ubuntu 20.04中搭建过&#xff0c;现在换了新操作系统&#xff0c;顺便整理一下。 相关文章 《Ubuntu 20.04.1 LTS搭建nginx php7.4运行环境》 https://blog.csdn.net/lxyoucan/article/details/144850572《linux nginx maccms管理后台无法进入页面不存在和验证码不显…

【Ubuntu】想知道怎么通过命令行查看笔记本电池健康程度吗?

你想在 Ubuntu 中通过命令行检查电池健康状态&#xff0c;而不需要额外安装任何工具吗&#xff1f; 其实&#xff0c;你可以做到。 大多数在笔记本电脑上使用 Ubuntu 的用户都会通过顶部栏来监控电池电量&#xff08;我总是在顶部栏启用电池百分比显示&#xff0c;以便一目了…

ue5动画重定向,一键重定向。ue4小白人替换成ue5

这就是我们下载的 初学者动画内容包 点击设置选中列 绿色的是动画 黄色的关卡 蓝色是蓝图 ctrla 全选 ctrl鼠标左键 选中所有动画 重定向动画资产 不要选错&#xff0c;只要绿色 选择目标网格体 选择所有的绿色 动画 导出动画 添加前缀ycn 导出 一定要提前新建好存放的…

05容器篇(D2_集合 - D6_容器源码分析篇 - D1_ArrayList)

目录 本章目标 一、基本介绍 二、原理分析 1. 数据结构源码分析 2. 默认容量&最大容量 为什么最大容量要-8呢&#xff1f; 3. 为什么ArrayList查询快&#xff0c;增删慢&#xff1f; 4. 初始化容量 1> 创建ArrayList对象分析&#xff1a;无参数 2> 创建Arra…

TVbox 手机、智能电视节目一网打尽

文章目录 一、简要介绍二、下载地址 一、简要介绍 TVbox是目前最火爆的多端、多源的电视影音工具&#xff0c;是一款开源的自定义添加站源的影音工具。TVBox&#xff0c;支持电视频道直播。一款TV端影视工具&#xff0c;软件本身不具有任何影视资源&#xff0c;但可以通过配置…

IP Anycast 与 CDN

基于名字寻址而不是基于地址寻址早就不是什么新鲜事&#xff0c;我们日常生活中的寻址基本都是找名字&#xff0c;比如找厕所&#xff0c;找连锁店&#xff0c;我们倾向于去具有同样称呼的最近那家。IP 网络中的这种机制叫 Anycast。 是不是一下子就不需要过多解释了。所有具有…

【0x006D】HCI_Write_LE_Host_Support命令详解

目录 一、命令概述 二、命令格式及参数说明 2.1. HCI_Write_LE_Host_Support命令格式 2.2. LE_Supported_Host 三、生成事件及参数 3.1. HCI_Command_Complete 事件 3.2. Status 四、命令执行流程 4.1. 命令发起阶段&#xff08;主机端&#xff09; 4.2. 命令处理阶段…

Harmony OS开发之ArkUI框架速成九弹性布局和层叠布局

> 程序员Feri一名12年的程序员,做过开发带过团队创过业,擅长Java相关开发、鸿蒙开发、人工智能等,专注于程序员搞钱那点儿事,希望在搞钱的路上有你相伴&#xff01;君志所向,一往无前&#xff01; --- 1.弹性布局&#xff08;Flex&#xff09; 弹性布局分为单行布局和多行…

HarmonyOS-面试资料

1. HarmonyOS-面试资料 1.1. HarmonyOS 优点、特点 1.1.1. 优点 &#xff08;1&#xff09;在国家方面&#xff0c;是国产的系统&#xff0c;受国家支持不会有限制的情况。   &#xff08;2&#xff09;设备互连18N(1:手机 8&#xff1a;平板、PC、vr设备、可穿戴设备、智慧…

macos安装java8

下载 dmg方式安装 安装 双击pkg运行 输入java -version验证 配置环境变量 cd ~ ls -a输入 ls -a后查看是否已经存在.bash_profile文件&#xff0c;如果已经存在就不需要创建&#xff0c;如果不存在&#xff0c;继续执行下方命令创建文件 touch .bash_profile /usr/l…

记一次k8s下容器启动失败,容器无日志问题排查

问题 背景 本地开发时&#xff0c;某应用增加logback-spring.xml配置文件&#xff0c;加入必要的依赖&#xff1a; <dependency><groupId>net.logstash.logback</groupId><artifactId>logstash-logback-encoder</artifactId><version>8…

KAFKA入门:原理架构解析

文章目录 一、认识kafka二、架构介绍2.1 工作流程2.2 Kafka可靠性保证2.3 Kafka存储 一、认识kafka Kafka到底是个啥&#xff1f;用来干嘛的&#xff1f; 官方定义如下&#xff1a; Kafka is used for building real-time data pipelines and streaming apps. It is horizont…