【Arduino】ESP32/ESP8266 JSON格式解析

目录

1、JSON

2、JSON语法格式

基本概念:

语法规则:

数据类型:

示例:

3、JSON解析

单一对象JSON解析(无嵌套)

JSON数组解析

使用ArduinoJson官网在线工具解析JSON信息

ESP8266闪存存储的JSON解析

通过api获取天气预报json格式并解析打印输出

4、发送json格式


1、JSON

JSON是一种简洁、易于理解和使用的数据格式,主要用于存储和传输数据。它基于JavaScript语言的标准,但与任何编程语言无关,因此广泛用于不同的编程环境中。

2、JSON语法格式

基本概念:

-数据对象:由一系列“名/值对”组成,用于表示复杂的数据结构。

- 数组:由一系列值组成,这些值是有序的。

语法规则:

- 数据以“名/值”对的形式呈现,其中“名”和“值”由冒号分隔。

- 对象用大括号`{}`表示,对象中的“名/值”对由逗号分隔。

- 数组用中括号`[]`表示,数组中的值也由逗号分隔。

数据类型:

-名称:必须用双引号`""`括起来。

- 值:可以是数字、字符串、布尔值(true/false)、数组、对象或null。

示例:

- 数字:"value": 25

- 字符串:"name": "taichi-maker"

- 布尔值:"bool_value": true

-数组:

"info": [{"name": "taichi-maker", "website": "www.taichi-maker.com"}, {"year": 2020, "month": 12, "day": 30}]

- 对象:

{"info": {"name": "taichi-maker","website": "www.taichi-maker.com"}
}
  1. 注意:
  • 对象和数组:

对象可以包含多个数据,包括其他对象和数组,但不能直接存放对象或数组。

数组可以包含多个对象或值,但不能直接存放“名/值”对。

  • 混合使用:

- 对象和数组可以相互嵌套,一个对象的值可以是数组,反之亦然

  • 对象是用来存储数据的,而数组是用来存储有序集合的。

3、JSON解析

解析JSON格式信息是一个较为繁琐的工作,因此我们将借助解析Arduino – ESP8266平台中解析JSON格式信息的第三方库——ArduionJson库,该库是目前最受好评的解析JSON信息第三方库。

解析json格式的过程就是反序列号过程

注意版本号,不同版本可能会有区别,当前使用版本为7.0.4。该版本提供了两个工具,一个在线解析json格式代码工具,一个故障排除工具。

ArduinoJson Assistant 6

ArduinoJson Troubleshooter

单一对象JSON解析(无嵌套)

以下方json信息解析示例

{"gatew": "admin5555","time": 153034324,"tag1": 15.32,"tag2": 0,"tag3": 43,"tag4": "33"
}

代码实现

#include <ArduinoJson.h>void setup() {Serial.begin(9600);}void loop() {Serial.println("");//1、JsonDocument doc  对象JsonDocument doc;
// 2、即将解析的json文件
String json="{\"gatew\": \"admin5555\",\"time\": 153034324,\"tag1\": 15.32,\"tag2\": 0,\"tag3\": 43,\"tag4\": \"33\"}";//3、反序列化数据
DeserializationError error = deserializeJson(doc, json);if (error) {Serial.print("deserializeJson() failed: ");Serial.println(error.c_str());return;
}// 4:获取解析后的数据信息
const char* gatew = doc["gatew"]; // "admin5555"
long time = doc["time"]; // 153034324
float tag1 = doc["tag1"]; // 15.32
int tag2 = doc["tag2"]; // 0
int tag3 = doc["tag3"]; // 43
const char* tag4 = doc["tag4"]; // "33"// 通过串口监视器输出解析后的数据信息Serial.print("gatew = ");Serial.println(gatew);Serial.print("tag1 = ");Serial.println(tag1);Serial.print("tag2 = ");Serial.println(tag2);Serial.print("tag3 = ");Serial.println(tag3);Serial.print("tag4 = ");Serial.println(tag4);Serial.print("time = ");Serial.println(time);delay(1000);}

测试ok,间隔1s输出解析后的数据信息。

JSON数组解析

[{"name": "taichi-maker"},{"website": "www.taichi-maker.com"}
]

示例程序内容

#include <ArduinoJson.h>
void setup() {Serial.begin(9600);
}
void loop() {Serial.println("");//1、JsonDocument doc  对象JsonDocument doc;
// 2、即将解析的json文件
String json="[{\"name\":\"taichi-maker\"},{\"website\": \"www.taichi-maker.com\"}]";//3、反序列化数据
DeserializationError error = deserializeJson(doc, json);if (error) {Serial.print("deserializeJson() failed: ");Serial.println(error.c_str());return;
}// 4:获取解析后的数据信息
const char* name = doc[0]["name"]; // "taichi-maker"
const  char* website = doc[1]["website"]; // www.taichi-maker.com// 通过串口监视器输出解析后的数据信息Serial.print("name = ");Serial.println(name);Serial.print("website = ");Serial.println(website);delay(1000);}

使用ArduinoJson官网在线工具解析JSON信息

#include <ArduinoJson.h>JsonDocument doc;DeserializationError error = deserializeJson(doc, input);if (error) {Serial.print("deserializeJson() failed: ");Serial.println(error.c_str());return;
}const char* gatew = doc["gatew"]; // "admin5555"
long time = doc["time"]; // 153034324
float tag1 = doc["tag1"]; // 15.32
int tag2 = doc["tag2"]; // 0
int tag3 = doc["tag3"]; // 43
const char* tag4 = doc["tag4"]; // "33"

ESP8266闪存存储的JSON解析

        在开发物联网项目时,大型JSON信息存储再程序中,将会占用大量系统动态内存,严重的甚至会出现系统控制程序空间不足问题。因此,我们需要将大型JSON文件存储在ESP8266的闪存系统中。暂未研究。

通过api获取天气预报json格式并解析打印输出

api格式

天气实况 | 心知天气文档

{"results": [{"location": {"id": "C23NB62W20TF","name": "西雅图","country": "US","path": "西雅图,华盛顿州,美国","timezone": "America/Los_Angeles","timezone_offset": "-07:00"},"now": {"text": "多云", //天气现象文字"code": "4", //天气现象代码"temperature": "14", //温度,单位为c摄氏度或f华氏度"feels_like": "14", //体感温度,单位为c摄氏度或f华氏度"pressure": "1018", //气压,单位为mb百帕或in英寸"humidity": "76", //相对湿度,0~100,单位为百分比"visibility": "16.09", //能见度,单位为km公里或mi英里"wind_direction": "西北", //风向文字"wind_direction_degree": "340", //风向角度,范围0~360,0为正北,90为正东,180为正南,270为正西"wind_speed": "8.05", //风速,单位为km/h公里每小时或mph英里每小时"wind_scale": "2", //风力等级,请参考:http://baike.baidu.com/view/465076.htm"clouds": "90", //云量,单位%,范围0~100,天空被云覆盖的百分比 #目前不支持中国城市#"dew_point": "-12" //露点温度,请参考:http://baike.baidu.com/view/118348.htm #目前不支持中国城市#},"last_update": "2015-09-25T22:45:00-07:00" //数据更新时间(该城市的本地时间)}]
}
#include <ArduinoJson.h>
#include <ESP8266WiFi.h>const char *ssid = "Xiaomi Civi 3"; // WiFi账号
const char *password = "12345678c";  // WiFi密码const char* host = "api.seniverse.com";     // 将要连接的服务器地址  
const int httpPort = 80;                    // 将要连接的服务器端口      // 心知天气HTTP请求所需信息
String reqUserKey = "Smlv4QbicqLpVYlXH";   // 私钥
String reqLocation = "Wuhan";            // 城市
String reqUnit = "c";                      // 摄氏/华氏void setup(){Serial.begin(9600);          Serial.println("");// 连接WiFiconnectWiFi();
}void loop(){// 建立心知天气API当前天气请求资源地址String reqRes = "/v3/weather/now.json?key=" + reqUserKey ++ "&location=" + reqLocation + "&language=en&unit=" +reqUnit;// 向心知天气服务器服务器请求信息并对信息进行解析httpRequest(reqRes);delay(3000);
}// 向心知天气服务器服务器请求信息并对信息进行解析
void httpRequest(String reqRes){WiFiClient client;// 建立http请求信息String httpRequest = String("GET ") + reqRes + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n";Serial.println(""); Serial.print("Connecting to "); Serial.print(host);// 尝试连接服务器if (client.connect(host, 80)){Serial.println(" Success!");// 向服务器发送http请求信息client.print(httpRequest);Serial.println("Sending request: ");Serial.println(httpRequest);  // 获取并显示服务器响应状态行 String status_response = client.readStringUntil('\n');Serial.print("status_response: ");Serial.println(status_response);// 使用find跳过HTTP响应头if (client.find("\r\n\r\n")) {Serial.println("Found Header End. Start Parsing.");}// 利用ArduinoJson库解析心知天气响应信息parseInfo(client); } else {Serial.println(" connection failed!");}   //断开客户端与服务器连接工作client.stop(); 
}// 连接WiFi
void connectWiFi(){WiFi.begin(ssid, password);                  // 启动网络连接Serial.print("Connecting to ");              // 串口监视器输出网络连接信息Serial.print(ssid); Serial.println(" ...");  // 告知用户NodeMCU正在尝试WiFi连接int i = 0;                                   // 这一段程序语句用于检查WiFi是否连接成功while (WiFi.status() != WL_CONNECTED) {      // WiFi.status()函数的返回值是由NodeMCU的WiFi连接状态所决定的。 delay(1000);                               // 如果WiFi连接成功则返回值为WL_CONNECTED                       Serial.print(i++); Serial.print(' ');      // 此处通过While循环让NodeMCU每隔一秒钟检查一次WiFi.status()函数返回值}                                            // 同时NodeMCU将通过串口监视器输出连接时长读秒。// 这个读秒是通过变量i每隔一秒自加1来实现的。                                              Serial.println("");                          // WiFi连接成功后Serial.println("Connection established!");   // NodeMCU将通过串口监视器输出"连接成功"信息。Serial.print("IP address:    ");             // 同时还将输出NodeMCU的IP地址。这一功能是通过调用Serial.println(WiFi.localIP());              // WiFi.localIP()函数来实现的。该函数的返回值即NodeMCU的IP地址。  
}// 利用ArduinoJson库解析心知天气响应信息
void parseInfo(WiFiClient client){// String input;StaticJsonDocument<768> doc;DeserializationError error = deserializeJson(doc, client);if (error) {Serial.print(F("deserializeJson() failed: "));Serial.println(error.f_str());return;
}JsonObject results_0 = doc["results"][0];JsonObject results_0_location = results_0["location"];
const char* results_0_location_id = results_0_location["id"]; // "C23NB62W20TF"
const char* results_0_location_name = results_0_location["name"]; // "西雅图"
const char* results_0_location_country = results_0_location["country"]; // "US"
const char* results_0_location_path = results_0_location["path"]; // "西雅图,华盛顿州,美国"
const char* results_0_location_timezone = results_0_location["timezone"]; // "America/Los_Angeles"
const char* results_0_location_timezone_offset = results_0_location["timezone_offset"]; // "-07:00"JsonObject results_0_now = results_0["now"];
const char* results_0_now_text = results_0_now["text"]; // "多云"
const char* results_0_now_code = results_0_now["code"]; // "4"
const char* results_0_now_temperature = results_0_now["temperature"]; // "14"
const char* results_0_now_feels_like = results_0_now["feels_like"]; // "14"
const char* results_0_now_pressure = results_0_now["pressure"]; // "1018"
const char* results_0_now_humidity = results_0_now["humidity"]; // "76"
const char* results_0_now_visibility = results_0_now["visibility"]; // "16.09"
const char* results_0_now_wind_direction = results_0_now["wind_direction"]; // "西北"
const char* results_0_now_wind_direction_degree = results_0_now["wind_direction_degree"]; // "340"
const char* results_0_now_wind_speed = results_0_now["wind_speed"]; // "8.05"
const char* results_0_now_wind_scale = results_0_now["wind_scale"]; // "2"
const char* results_0_now_clouds = results_0_now["clouds"]; // "90"
const char* results_0_now_dew_point = results_0_now["dew_point"]; // "-12"const char* results_0_last_update = results_0["last_update"]; // "2015-09-25T22:45:00-07:00"// 通过串口监视器显示以上信息int results_0_now_code_int = results_0_now["code"].as<int>(); int results_0_now_temperature_int = results_0_now["temperature"].as<int>(); String  results_0_now_text_Str = results_0_now["text"].as<String>();Serial.println(F("======Weahter Now======="));Serial.print(F("Weather Now: "));Serial.println(results_0_now_code_int);Serial.print(F("Temperature: "));Serial.println(results_0_now_temperature_int);Serial.print(F("天气: "));Serial.println(results_0_now_text_Str);Serial.println(F("========================"));
}

串口打印结果

4、发送json格式

esp8266以json的格式往mqtt服务发数据,数据格式如下:

上行topic:esp8266/tsest

{"gatew": "admin5555","time": 153034324,"tag1": 15.32,"tag2": 0,"tag3": 43,"tag4": "33"
}

1、发送固定格式

#include <ESP8266WiFi.h>
#include <PubSubClient.h>// WiFi
const char *ssid = "999"; // WiFi账号
const char *password = "sp888888";  // WiFi密码// MQTT Broker
const char *mqtt_broker = "39.98.87.103";//服务器Ip
const char *topic = "esp8266/io_test";//主题topic。下行topic,根据这个进行控制
const char *mqtt_username = "PubSubClien1"; //用户名
const char *mqtt_password = "";//密码
const int mqtt_port = 1883;//服务端口号WiFiClient espClient;
PubSubClient client(espClient);unsigned long previousMillis = 0;// 将保存上次触发的时间点,默认为0// 定义常量:触发间隔,单位是毫秒,1000 = 1秒const long interval = 3000;
void setup() {// 串口波特率: 115200;Serial.begin(115200);delay(1000); // 连接WIFI网络WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.println("连接WiFi网络中...");}Serial.println("连接到WIFI网络");// 连接MQTT服务client.setServer(mqtt_broker, mqtt_port);// client.setCallback(callback);while (!client.connected()) {String client_id = "esp8266-client-";client_id += String(WiFi.macAddress());Serial.printf("客户端%s连接到MQTT 服务\n", client_id.c_str());if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {Serial.println("已连接MQTT服务");//已连接公共EMQX MQTT代理} else {Serial.print("失败,状态为 ");Serial.print(client.state());delay(2000);}}// 发布和订阅//client.publish(topic, "hello emqx");//发布client.subscribe(topic);//订阅}
char* payloadJson="{\"gatew\": \"admin5555\",\"time\": 153034324,\"tag1\": 15.32,\"tag2\": 0,\"tag3\": 43,\"tag4\": \"33\"}";void loop() {client.loop();unsigned long currentMillis = millis();//获取当前时间//如果(当前时间 - 上次触发的时间 >) 说明该进行下一次触发了。if (currentMillis - previousMillis >= interval){// 将上次触发事件更新为 "当前时间"previousMillis = currentMillis;client.publish(topic, payloadJson);Serial.println(payloadJson);}
}

2、获取io状态以及传感器数据,通过json格式发送给mqtt。

测试代码

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
#include <ArduinoJson.h>
// WiFi
const char *ssid = "999";  // WiFi账号
const char *password = "sp888888";  // WiFi密码
// MQTT Broker
const char *mqtt_broker = "39.98.87.103";  // 服务器Ip
const char *topic1 = "esp8266/io_test/w";  // 主题topic。下行topic,根据这个进行控制
const char *topic2 = "esp8266/io_test/r";  // 主题topic。下行topic,根据这个进行控制
const char *mqtt_username = "PubSubClien1";  // 用户名
const char *mqtt_password = "";  // 密码
const int mqtt_port = 1883;  // 服务端口号
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long previousMillis = 0;  // 将保存上次触发的时间点,默认为0
//传感器
#define DHTPIN 2   // 连接到DHT传感器的数字引脚
#define DHTTYPE DHT11   // DHT 11
DHT dht(DHTPIN, DHTTYPE);
//定义4的标志位,存放4个io的状态。
int key1=0;
int key2=0;
int key3=0;
int key4=0;
void setup() {// 串口波特率: 9600;Serial.begin(9600);// pinMode(0,OUTPUT);//pinMode(5,OUTPUT);//pinMode(6,OUTPUT);// pinMode(7,OUTPUT);//digitalWrite(0,HIGH);// digitalWrite(5,HIGH);//digitalWrite(6,HIGH);//digitalWrite(7,HIGH);delay(1000); // 连接WIFI网络WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.println("连接WiFi网络中...");}Serial.println("连接到WIFI网络");// 连接MQTT服务client.setServer(mqtt_broker, mqtt_port);// client.setCallback(callback);while (!client.connected()) {String client_id = "esp8266-client-";client_id += String(WiFi.macAddress());Serial.printf("客户端%s连接到MQTT 服务\n", client_id.c_str());if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {Serial.println("已连接MQTT服务");//已连接公共EMQX MQTT代理} else {Serial.print("失败,状态为 ");Serial.print(client.state());delay(2000);}}// 发布和订阅// client.publish(topic, "hello emqx");//发布client.subscribe(topic1);//订阅client.subscribe(topic2);//订阅dht.begin();//初始化温湿度传感器
}
void loop() {client.loop();unsigned long currentMillis = millis();  // 获取当前时间// 如果(当前时间 - 上次触发的时间 >) 说明该进行下一次触发了。if (currentMillis - previousMillis >= 5000) {// 将上次触发事件更新为 "当前时间"previousMillis = currentMillis;// 温湿度传感器float h = dht.readHumidity();// 读取湿度度(%RH)float t = dht.readTemperature();// 读取湿度(℃)  // 检查传感器是否有任何读取失败,并提前退出(重试)。if (isnan(h) || isnan(t)) {Serial.println(F("从DHT传感器读取失败!"));//return;  // 如果传感器读取失败,直接退出此次循环} // 序列化 JSON 数据DynamicJsonDocument doc(256); // 定义一个大小为 256 字节的 JSON 文档doc["temp"] = t;doc["hum"] = h;doc["key1"] = key1;doc["key2"] = key2;doc["key3"] = key3;doc["key4"] = key4;   // 分配足够的内存char payloadJson[256]; //将 JSON 文档 doc 序列化为 JSON 字符串,并将其存储在 payloadJson 字符数组中,//然后将序列化后的 JSON 字符串的长度存储在 length 变量中size_t length = serializeJson(doc, payloadJson, sizeof(payloadJson));// 发布 MQTT 消息client.publish(topic2, payloadJson);// 打印到串口Serial.print(F("湿度: "));Serial.print(h);Serial.print(F(",温度: "));Serial.println(t);}
}

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

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

相关文章

MySQL性能优化(提升数据库性能的措施)

万物皆有裂痕&#xff0c;那是光照进来的地方。大家好&#xff0c;今天给大家分享一下关于MySQL性能优化&#xff0c;在处理大型数据集和高负载情况下&#xff0c;MySQL数据库的性能优化是至关重要的。通过合理的调优策略&#xff0c;可以有效提高数据库的响应速度和稳定性。本…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-13-按键实验

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

xhci 寄存器学习

xhci 寄存器介绍 查看linux 代码&#xff1a; 1733 /* There is one xhci_hcd structure per controller */ 1734 struct xhci_hcd { 1735 struct usb_hcd *main_hcd; 1736 struct usb_hcd *shared_hcd; 1737 /* glue to PCI and HCD framework */ 1738 stru…

实操专区-第11周-课堂练习专区-图的标记线和标记点

下载安装ECharts&#xff0c;完成如下样式图形。 代码和截图上传 完成 3.1.3.5 图的标记线和标记点 中的任务点 在一些折线图或柱状图当中&#xff0c;可以经常看到图中对最高值和最低值进行了标记。 在ECharts中&#xff0c;标记点&#xff08;markPoint&#xff09;常用于表示…

自定义实现 Java17+SpringBoot3+OpenAPI+Knife4j Starter

文章目录 前言正文1 创建starter项目1.1 依赖文件1.2 配置信息 2 自定义starer代码开发2.1 配置字段的定义2.2 自动配置类 3 验证starter3.1 测试项目的配置3.2 功能配置 application.yml3.3 测试代码3.3.1 实体类3.3.2 控制器13.3.2 控制器2 4 效果展示4.1 主页4.2 实体类列表…

Windows快速部署DCNv4(成功版)

文章目录 一、介绍二、编译DCNv42.1 下载源码2.2 编译DCNv4 三、报错提示3.1 Cuda is not available3.2 需要Microsoft Visual C 14.0 一、介绍 论文链接&#xff1a;[https://arxiv.org/pdf/2401.06197.pdf] (https://arxiv.org/pdf/2401.06197.pdf)   在这篇文章中介绍了一…

【Android】Kotlin学习之Kotlin方法的声明和传参

方法声明 普通类的方法 静态类的方法 不需要构建实例对象, 可以通过类名直接访问静态方法 : NumUtil.double(1) companion object 伴生类的方法 使用companion object 在普通类里定义静态方法 参数 括号内传入方法 : 当参数是方法时, 并且是最后一个参数 , 可以使用括号外…

Linux -- > vim

vi和vim是什么 vi和vim是两款流行的文本编辑器&#xff0c;广泛用于Unix和类Unix系统中。它们以其强大的功能和灵活的编辑能力而闻名&#xff0c;特别是在编程和系统管理中非常受欢迎。 vi&#xff08;Visual Interface&#xff09; vi是最初的文本编辑器之一&#xff0c;由…

外观模式详解

外观模式 1 概述 有些人可能炒过股票&#xff0c;但其实大部分人都不太懂&#xff0c;这种没有足够了解证券知识的情况下做股票是很容易亏钱的&#xff0c;刚开始炒股肯定都会想&#xff0c;如果有个懂行的帮帮手就好&#xff0c;其实基金就是个好帮手&#xff0c;支付宝里就…

【智能算法】最优捕食算法(OFA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2017年&#xff0c;GY Zhu受到动物行为生态学理论启发&#xff0c;提出了最优捕食算法&#xff08;Optimal Foraging Algorithm, OFA&#xff09;。 2.算法原理 2.1算法思想 OFA灵感来源…

Lab4: traps

RISC-V assembly Which registers contain arguments to functions? For example, which register holds 13 in mains call to printf? 根据RISC-V函数调用规范&#xff0c;函数的前8个参数使用a0-a7寄存器传递。 当main函数调用printf函数时&#xff0c;a2寄存器保存13 …

MVCC 详解

介绍 MVCC&#xff0c;全称 Multi-Version Concurrency Control&#xff0c;即多版本并发控制 MVCC的目的主要是为了提高数据库并发性能&#xff0c;用更好的方式去处理读-写冲突&#xff0c;做到即使有读写冲突时&#xff0c;也能做到不加锁。 这里的多版本指的是数据库中同时…

Springboot+Vue项目-基于Java+MySQL的毕业就业信息管理系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

java异常,日志,线程堆栈与Jvm调优

一.知识目录&#xff1a; 二.什么是java异常&#xff1a; 2.1 Throwable类中的重要方法: (1)四个构造方法&#xff08;用来构造throwable对象&#xff0c;不同构造方法可以传递不同的参数值&#xff09;&#xff1a; /** 构造一个将 null 作为其详细消息的新 throwable */ Thr…

在STM32中用寄存器方式点亮流水灯

文章目录 实验资料一、对寄存器的理解1.通俗认识寄存器2.深入了解寄存器&#xff08;1&#xff09;端口配置低寄存器&#xff08;配置0到7引脚的寄存器&#xff09;&#xff08;2&#xff09;端口配置高寄存器&#xff08;配置8到15引脚&#xff09; 3.GPIO口的功能描述 二、配…

鸿蒙内核源码分析(Shell解析篇) | 应用窥视内核的窗口

系列篇从内核视角用一句话概括shell的底层实现为&#xff1a;两个任务&#xff0c;三个阶段。其本质是独立进程&#xff0c;因而划到进程管理模块。每次创建shell进程都会再创建两个任务。 客户端任务(ShellEntry)&#xff1a; 负责接受来自终端(控制台)敲入的一个个字符&…

【云原生】 Kubernetes核心概念

目录 引言 一、部署方式回溯 &#xff08;一&#xff09;传统部署时代 &#xff08;二&#xff09;虚拟化部署时代 &#xff08;三&#xff09;容器部署时代 二、Kubernetes基本介绍 &#xff08;一&#xff09;为什么使用k8s &#xff08;二&#xff09;主要功能 &am…

乡村振兴与数字乡村建设:加强农村信息化建设,推动数字乡村发展,提升乡村治理和服务水平,构建智慧化的美丽乡村

目录 一、引言 二、数字乡村建设的必要性 1、推动农村经济转型升级 2、提升乡村治理水平 3、改善乡村民生福祉 三、数字乡村建设的现状与挑战 1、现状 2、挑战 四、数字乡村建设的未来发展路径 1、加强农村信息化基础设施建设 2、提升农民信息素养和技能水平 3、制…

py黑帽子学习笔记_环境准备

1 下载os装os 下载一个kali虚机镜像然后用虚机管理软件创虚机&#xff0c;装完如下图&#xff0c;我用的版本是2024.1的版本kali-linux-2024.1-installer-amd64&#xff0c;可以从镜像站下载&#xff0c;官网下的慢还断网Index of /kali-images/kali-2024.1/ | 清华大学开源软…

C++高精度算法-加法

引子 在C++的运算中,难免会出现很大很大的数,下面是各个关键字的表示范围 但是如果要表示的数超过了long long可以表示的最大值( 2 64 2^{64} 264-1) 怎么办呢? 如果强制表示,就会溢出,这里的溢出大家可以自行百度,反正就是会出一些-5665434之类的数 现在,就要切入正…