当前位置: 首页 > news >正文

Elasticsearch 和 Arduino:一起变得更好!

作者:Enrico Zimuel

使用 Arduino IoT 设备与 Elasticsearch 和 Elastic Cloud 进行通信的简单方法

在 Elastic®,我们不断寻找简化搜索体验的新方法,并开始关注物联网世界。 来自物联网的数据收集可能非常具有挑战性,尤其是当我们拥有数千台设备时。

Elasticsearch® 对于收集、探索、可视化和发现数据非常有用 - 对于来自多个设备的所有数据。 Elastic 的分布式特性使其能够轻松处理来自数百万台设备的请求。

感谢与物联网领域非常受欢迎的品牌 Arduino 的合作,我们测试了一些设备,并开发了一个实验性开源库,可以以非常简单的方式将 Arduino 板连接到 Elasticsearch。

什么是 Arduino?

Arduino 是全球开源硬件和软件领域的领导者,拥有超过 3000 万活跃用户! 该品牌旨在帮助各类创客创建自己的互动项目,随着用户面临新的挑战,该品牌不断成长和适应,并扩展到物联网、可穿戴设备、3D 打印和嵌入式环境。 它还开设了专门的专业业务部门,以支持公司成为各自领域的创新者,采用定制且用户友好的方法,避免供应商锁定,并利用 360° 生态系统,做好从原型设计到大规模生产的准备。

Arduino 专业版

在 Arduino Pro 的高性能技术解决方案中,你会发现低功耗且安全的模块系统,例如 Portenta H7,它可以使用高级语言和 AI 进行编程,同时在其可定制的上执行低延迟操作硬件和最新的 Portenta C33,凭借一系列精简且经济高效的功能,使物联网比以往任何时候都更容易访问。

此外,Arduino Pro 的工业级产品适合整个 Arduino 生态系统,其中包括云服务、无数软件库和社区共享的即用型草图,当然还有满足任何需求的各种组件。 其中包括 MKR WiFi 1010 和 Nano RP2040 板等流行产品 —— 创客运动名副其实的基石。

Elasticsearch 和 Arduino

我们开发了一个研发项目来提供一个在 Arduino 模块上运行的简单 Elasticsearch 客户端库(用 C++ 编写)。 没错:现在你可以直接从 Arduino 板与 Elasticsearch 集群通信!

我们使用 Portenta H7、MKR WiFi 1010 和 NANO RP2040 Connect 测试了该库。 任何具有 Wi-Fi 或以太网连接的 Arduino 板都可以使用该库。

我们使用 Elastic Cloud 作为数据库,从相邻设备收集所有数据并提供平均温度的详细信息。 这是控制工程应用中的典型场景。

想了解更多? 以下是包含所有详细信息的简单教程。

使用案例:监控多个物联网设备的温度

我们为一家需要管理位于意大利的多个物联网设备的公司设计了一个用例。 每个设备将来自传感器的数据(例如温度)发送到 Elastic Cloud。 使用 Elastic Cloud,该公司可以管理任何规模的物联网设备,而无需管理专用基础设施。 此外,该公司还需要根据相邻设备的平均温度来调整每个设备的一些内部参数,范围为 100 公里,这是控制工程应用中的典型场景。

使用 Elasticsearch,我们可以使用过滤、聚合、多重匹配、地理空间、向量搜索 (kNN)、语义搜索和机器学习等搜索功能提供多种反馈。

在此用例中,我们使用平均聚合 (average aggregation) 和地理距离 (geo-distance) 来检索 100 公里之间的所有设备。

使用 Elastic Cloud 中提供的 UI Kibana®,我们可以轻松创建仪表板来监控来自所有设备的数据。 由于我们还有地理数据,因此我们可以在地图中表示这些信息。

这是用不同颜色代表不同温度(蓝色是冷,绿色是热)创建的 heat map。

Elastic Cloud 设置

第一步是拥有 Elastic Cloud 帐户。 如果你没有,可以在此处注册试用(无需信用卡)。 登录后,你可以创建新部署,选择要使用的 Elasticsearch 实例的大小。

创建部署后,你需要检索端点 URL 并生成 Elasticsearch 的 API 密钥。 你可以阅读本指南来获取此信息。 对于高级用例,你还可以创建用于不同设备的 API 密钥组,并更改 API 策略以仅允许使用特定索引。

如果你想有自己的本地部署,请参阅文章 “如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch”。

准备Elasticsearch索引

我们需要创建一个索引来存储来自 Arduino 板的数据。 我们想要存储温度值、使用地理位置(纬度和经度)的设备位置、设备标识符名称和时间戳。

我们可以通过向 Elasticsearch 发出以下 HTTP 请求来创建索引 “temperature”:

PUT /temperature
{"mappings": {"properties": {"temperature": { "type": "float" }, "timestamp":   { "type": "date" }, "location":    { "type": "geo_point" },"device-id":   { "type": "keyword" }}}
}

要发送此 HTTP 请求,你可以使用 Elastic Cloud 中 Kibana 的 Dev Tools。

我们希望存储每次设备发送数据时操作的时间戳。 这可以使用 Elasticsearch 的摄取管道 (ingest pipeline) 功能来完成。 摄取管道是 Elasticsearch 在索引(存储)文档之前执行的操作。 例如,管道可以根据某些计算分配特定文档字段的值。

在我们的例子中,我们只需要存储时间戳,我们就可以创建一个 “set-timestamp” 管道:

PUT _ingest/pipeline/set-timestamp
{"description": "sets the timestamp","processors": [{"set": {"field": "timestamp","value": "{{{_ingest.timestamp}}}"}}]
}

使用这个管道,我们可以将数据发送到 Elasticsearch,如下所示:

POST /temperature/_doc?pipeline=set-timestamp
{"temperature": 21.45,"device-id": "H7-001","location": {"type": "Point","coordinates": [12.4923, 41.8903]}
}

这里的 device-id H7-001 是 Arduino 板的名称,location 是用12.4923(经度)和41.8903(纬度)表示的地理点,这是罗马斗兽场(意大利)的位置。

请注意,我们没有指定时间戳值,因为这是使用 “set-timestamp” 管道(在 URL 中指定为查询字符串)自动生成的。

地理距离查询

要检索 100 公里以内设备的平均温度,我们可以使用以下 Elasticsearch 查询:

GET /temperature/_search
{"query": {"bool": {"must": {"match_all": {}},"filter": {"geo_distance": {"distance": "100km","location": [12.4923, 41.8903]}}}},"aggs": {"avg_temp": { "avg": { "field": "temperature" } }}
}

该查询将返回一个 “avg_temp” 聚合字段,其中包含 100 公里半径内所有设备的平均温度。

Arduino 的 Elasticsearch 客户端的使用

终于到了展示一些 Arduino 代码的时候了! 在这里,我们报告了一个简单的草图,它将温度值发送到 Elastic Cloud,执行地理距离查询获取平均温度,然后等待 30 秒。

此处报告的代码可在 GitHub 存储库 elastic/elasticsearch-arduino 的 examples 文件夹中在线获取。 该草图使用 elasticsearch_config.h 文件,如下所示:

#define WIFI_SECRET_SSID ""
#define WIFI_SECRET_PASS ""
#define ELASTIC_ENDPOINT ""
#define ELASTIC_PORT 443
#define ELASTIC_CLOUD_API_KEY ""
#define DEVICE_GEO_LON 12.4923
#define DEVICE_GEO_LAT 41.8903
#define DEVICE_ID "x"
#define DEVICE_GEO_DISTANCE "50km"

在我们的示例中,我们使用 Wi-Fi 连接将 Arduino 板连接到互联网。

WIFI_SECRET_SSID 和 WIFI_SECRET_PASS 是要使用的 SSID 网络的名称和 Wi-Fi 密码。

ELASTIC_ENDPOINT 是 Elastic Cloud 端点的 URL,ELASTIC_PORT 是 443,因为 Elastic Cloud 使用 TLS (https)。 ELASTIC_CLOUD_API_KEY 是要在 Elastic Cloud 管理界面中生成的 API 密钥。

该文件还包含与 Arduino 设备相关的其他信息。 我们有地理查询的经度 (DEVICE_GEO_LON) 和纬度 (DEVICE_GEO_LAT)、ID (DEVICE_ID) 和距离 (DEVICE_GEO_DISTANCE)。

填写完前面的信息后,我们可以看一下设计,报告如下。

#include <ArduinoJson.h>
#include <WiFi.h>
#include <WiFiSSLClient.h>
#include "ESClient.h" 
#include "elasticsearch_config.h"// WiFi settings
char ssid[] = WIFI_SECRET_SSID;
char pass[] = WIFI_SECRET_PASS;// Elastic settings
char serverAddress[] = ELASTIC_ENDPOINT;
int serverPort = ELASTIC_PORT;WiFiSSLClient wifi;ESClient client = ESClient(wifi, serverAddress, serverPort); 
int status = WL_IDLE_STATUS;void setup() {Serial.begin(9600);Serial.println("Started");while (status != WL_CONNECTED) {Serial.print("Attempting to connect to Network named: ");Serial.println(ssid);// Connect to WPA/WPA2 network:status = WiFi.begin(ssid, pass);}// print the SSID of the network you're attached to:Serial.print("SSID: ");Serial.println(WiFi.SSID());// print your WiFi shield's IP address:IPAddress ip = WiFi.localIP();Serial.print("IP Address: ");Serial.println(ip);client.setElasticCloudApiKey(ELASTIC_CLOUD_API_KEY);
}void loop() {float temperature;// Set the temperature from a sensor (removing the randomness)temperature = random(10,30) + random(0,100)/100.00;// Prepare the JSON with temperature and geopoint for ElasticsearchStaticJsonDocument<200> doc;doc["temperature"] = temperature;doc["device-id"] = DEVICE_ID;doc["location"]["type"] = "Point";doc["location"]["coordinates"][0] = DEVICE_GEO_LON;doc["location"]["coordinates"][1] = DEVICE_GEO_LAT;String temp;serializeJson(doc, temp);Serial.println("Sending to Elasticsearch:");Serial.println(temp);ESResponse indexResult;// Send the temperature to Elastic CloudindexResult = client.index("temperature", temp, "pipeline=set-timestamp");DynamicJsonDocument result(1024);deserializeJson(result, indexResult.body);if (result["result"] == "created") {Serial.println("Created with _id: " + result["_id"].as<String>());} else {Serial.println("Error sending data: " + indexResult.body);}StaticJsonDocument<512> query;query["query"]["bool"]["filter"]["geo_distance"]["distance"] = DEVICE_GEO_DISTANCE;query["query"]["bool"]["filter"]["geo_distance"]["location"][0] = DEVICE_GEO_LON;query["query"]["bool"]["filter"]["geo_distance"]["location"][1] = DEVICE_GEO_LAT;query["aggs"]["avg_temp"]["avg"]["field"] = "temperature";query["size"] = 0;String search;serializeJson(query, search);Serial.println("Geo-location query:");Serial.println(search);ESResponse searchResult;// Send the temperature to Elastic CloudsearchResult = client.search("temperature", search);DynamicJsonDocument avg(512);deserializeJson(avg, searchResult.body);float avgTemp = avg["aggregations"]["avg_temp"]["value"];int numDevices = avg["hits"]["total"]["value"];Serial.println("Average temperature of " + String(numDevices) + " devices in " + DEVICE_GEO_DISTANCE + ": " + String(avgTemp));Serial.println("Wait 30 seconds");delay(30000);
}

此设计需要 Wi-Fi、WiFiSSLClient(用于使用 TLS 进行连接)进行互联网连接、用于连接 Elasticsearch 的 EsClient 以及用于序列化和反序列化 Json 数据结构的 ArduinoJson 库。

在 setup() 函数中,我们启动 Wi-Fi 连接,并使用 client.setElasticCloudApiKey(ELASTIC_CLOUD_API_KEY) 函数调用设置 Elastic Cloud 的 API 密钥。

客户端对象在主区域中初始化,传递 Wi-Fi 对象、服务器地址(端点)和 HTTP 端口。

在 loop() 函数中,我们有将温度发送到 Elastic Cloud 的代码。 这里的温度只是一个 10 到 30 之间的随机浮点数; 通常它来自连接到 Arduino 板的传感器。

为了准备发送到 Elasticsearch 的文档,我们使用了 ArduinoJson 库。

我们使用以下代码创建一个 “doc” 对象:

StaticJsonDocument<200> doc;
doc["temperature"] = temperature;
doc["device-id"] = DEVICE_ID;
doc["location"]["type"] = "Point";
doc["location"]["coordinates"][0] = DEVICE_GEO_LON;
doc["location"]["coordinates"][1] = DEVICE_GEO_LAT;

该对象被序列化为 JSON 字符串,如下所示:

String temp;
serializeJson(doc, temp);

最后,可以使用索引 API 将存储在 “temp” 变量中的文档发送到 Elasticsearch,如下所示:

ESResponse indexResult;
indexResult = client.index("temperature", temp, "pipeline=set-timestamp");

此 API 使用 “set-timestamp” 管道在索引 “temp” 中添加 “temp” 文档。 结果存储在 “indexResult” 变量中,该变量是一个结构类型,如下所示:

struct ESResponse {int statusCode;String body;
};

“statusCode” 是响应的 HTTP 状态代码,“body” 是响应正文。 如果响应包含值为 “created” 的 “result” 字段,则索引操作成功。

为了获取半径 100 公里内设备的平均温度,我们使用了以下地理距离查询,使用 ArduinoJson 表示。

StaticJsonDocument<512> query;
query["query"]["bool"]["filter"]["geo_distance"]["distance"] = DEVICE_GEO_DISTANCE;
query["query"]["bool"]["filter"]["geo_distance"]["location"][0] = DEVICE_GEO_LON;
query["query"]["bool"]["filter"]["geo_distance"]["location"][1] = DEVICE_GEO_LAT;
query["aggs"]["avg_temp"]["avg"]["field"] = "temperature";
query["size"] = 0;String search;
serializeJson(query, search);ESResponse searchResult;
searchResult = client.search("temperature", search);DynamicJsonDocument avg(512);
deserializeJson(avg, searchResult.body);
float avgTemp = avg["aggregations"]["avg_temp"]["value"];
int numDevices = avg["hits"]["total"]["value"];

搜索的响应包含平均温度作为聚合值。 此外,我们可以使用 Elasticsearch 的 JSON 响应中的 ['hits']['total']['value'] 字段来检索查询检索到的设备数量。

结论

由于与 Arduino 的合作,我们开发了一个非常简单的库,允许直接从 Arduino 板使用 Elasticsearch。 只需几行代码,我们就可以将数据发送到 Elasticsearch 并使用地理定位等执行复杂的阐述。

我们迫不及待地想看看 Arduino 用户将使用 Elasticsearch 设计出哪些其他创意用例。 例如,如果你对生成式人工智能感兴趣,你将享受 Elastic 的所有最新功能。

不要再等待了 —— 尝试一下 Elastic Cloud 和 elasticsearch-arduino 库。

致谢

我要感谢 Arduino 的所有员工,是他们使这个研发项目成为可能。 特别感谢 Giampaolo Mancini 在开发 elasticsearch-arduino 库方面的帮助和协作。 此外,我还要感谢 Arduino 的 Andrea Richetta 和 Stefano Implicito 使这次合作成为可能。

本文中描述的任何特性或功能的发布和时间安排均由 Elastic 自行决定。 当前不可用的任何特性或功能可能无法按时交付或根本无法交付。

相关文章:

Elasticsearch 和 Arduino:一起变得更好!

作者&#xff1a;Enrico Zimuel 使用 Arduino IoT 设备与 Elasticsearch 和 Elastic Cloud 进行通信的简单方法 在 Elastic&#xff0c;我们不断寻找简化搜索体验的新方法&#xff0c;并开始关注物联网世界。 来自物联网的数据收集可能非常具有挑战性&#xff0c;尤其是当我们…...

基于Ubuntu环境Git 服务器搭建及使用

多人合作开发的时候 常常会需要使用代码管理平台&#xff0c;保持代码一致和解决冲突。在工作中我使用过SVN和TFS&#xff0c;本文说明另外一种平台&#xff0c;Git&#xff0c;下面是基于Ubuntu环境安装并简单使用Git服务器。 确认安装git apt install git levilevi-ThinkPa…...

【quartus13.1/Verilog】swjtu西南交大:计组课程设计

实验目的&#xff1a; 通过学习简单的指令系统及其各指令的操作流程&#xff0c;用 Verilog HDL 语言实 现简单的处理器模块&#xff0c;并通过调用存储器模块&#xff0c;将处理器模块和存储器模块连接形成简 化的计算机核心部件组成的系统。 二. 实验内容 1. 底层用 Verilog…...

基于springboot的网上点餐系统论文开题报告

一、选题背景 随着互联网和移动互联网技术的快速发展&#xff0c;网上点餐成为了人们越来越喜欢的一种点餐方式。一些具有创新意识的餐厅也开始逐渐尝试利用互联网技术来提升用户的点餐体验。因此&#xff0c;开发一个基于Spring Boot的网上点餐系统就显得非常必要和重要。 二…...

Hadoop3教程(九):MapReduce框架原理概述

文章目录 简介参考文献 简介 这属于整个MR中最核心的一块&#xff0c;后续小节会展开描述。 整个MR处理流程&#xff0c;是分为Map阶段和Reduce阶段。 一般&#xff0c;我们称Map阶段的进程是MapTask&#xff0c;称Reduce阶段是ReduceTask。 其完整的工作流程如图&#xff…...

使用PyTorch加载数据集:简单指南

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…...

【考研数学】线性代数第六章 —— 二次型(2,基本定理及二次型标准化方法)

文章目录 引言一、二次型的基本概念及其标准型1.2 基本定理1.3 二次型标准化方法1. 配方法2. 正交变换法 写在最后 引言 了解了关于二次型的基本概念以及梳理了矩阵三大关系后&#xff0c;我们继续往后学习二次型的内容。 一、二次型的基本概念及其标准型 1.2 基本定理 定理…...

Raven2靶机渗透

1. 信息收集 1.1 主机探测 sudo arp-scan -l1.2 端口扫描 nmap -p- -A 192.168.16.185开放了80端口&#xff0c;尝试登录网址查看信息&#xff0c;通过浏览器插件找出指纹 1.3 目录扫描 访问登录界面&#xff0c;发现remember Me怀疑是shiro界面 登录/vendor/界面&#xff0…...

UE5中双pass解决半透明材质乱序问题

透明度材质乱序问题一直是半透明效果时遇到的比较多的问题&#xff0c;用多pass方案只能说一定程度上解决&#xff0c;当遇到多半透明物体穿插等情况时&#xff0c;仍然不能完美解决。 双pass方案Unity用的比较多&#xff0c;因为Unity支持多个pass绘制。在UE中我们可以以复制多…...

Cisdem Video Player for mac(高清视频播放器) v5.6.0中文版

Cisdem Video Player mac是一款功能强大的视频播放器&#xff0c;适用于 macOS 平台。它可用于播放不同格式的视频文件&#xff0c;并具有一些实用的特性和功能。 Cisdem Video Player mac 中文版软件特点 多格式支持&#xff1a;Cisdem Video Player 支持几乎所有常见的视频格…...

数据库管理-第109期 19c OCM考后感(20231015)

数据库管理-第109期 19c OCM考后感&#xff08;202301015&#xff09; 距离上一篇又过了两周多&#xff0c;为啥又卡了这么久&#xff0c;主要是后面几个问题&#xff1a;1. 9月1日的19c OCM upgrade考试木有过&#xff0c;因为有一次免费补考机会就又预约了10月8日的考试&…...

初出茅庐的小李博客之SPI工作模式

SPI的工作模式 SPI&#xff08;Serial Peripheral Interface&#xff09;是一种同步串行通信协议&#xff0c;常用于连接微控制器和外围设备。SPI有四种模式&#xff0c;分别是0、1、2、3模式。 0模式&#xff1a;时钟空闲时为低电平&#xff0c;数据在时钟的下降沿采样&#…...

SpringCloud-Bus

一、介绍 &#xff08;1&#xff09;bus搭配config可以实现客户端配置自动刷新 &#xff08;2&#xff09;bus支持两种消息代理&#xff0c;rabbitmq和kafka &#xff08;3&#xff09;使用topic模式分发消息 二、项目搭建&#xff08;广播&#xff09; &#xff08;1&#…...

Adobe2024 全家桶更新了,PS、Ai、AE、PR应用尽有

Adobe2024 全家桶更新了&#xff0c;包含的PS、Ai、AE、PR......个人学习&#xff0c;专业领域都是必不可少的软件都有&#xff0c;需要的不要错过了。 如果你不知道从哪里安装这些工具&#xff0c;小编为大家带来了破J版资源&#xff0c;附上详细的安装包及安装教程。 Mac软件…...

【斗破年番】彩鳞换装美翻,雁落天惨死,萧炎暗杀慕兰三老遇险,彩鳞霸气护夫

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析斗破苍穹年番资讯。 斗破苍穹动画已经更新了&#xff0c;小医仙与萧炎相认&#xff0c;三国联军撤退&#xff0c;随后彩鳞与萧炎以及小医仙夜晚相会&#xff0c;一起制定了刺杀行动。从官方公布的第68集预告&#xff0c;彩…...

华为端到端战略管理体系(DSTE开发战略到执行)的运作日历图/逻辑图及DSTE三大子流程介绍

华为端到端战略管理体系&#xff08;DSTE开发战略到执行&#xff09;的运作日历图/逻辑图及DSTE三大子流程介绍 本文作者 | 谢宁&#xff0c;《华为战略管理法&#xff1a;DSTE实战体系》、《智慧研发管理》作者 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#…...

Linux友人帐之调试器--gdb的使用

一、debug和realease版本的区别 区别 debug是给程序员用的版本&#xff0c;添加了调试信息&#xff0c;用于解决软件或程序中出现的问题&#xff0c;realease是发行给客户使用的版本&#xff0c;并未添加调试信息&#xff0c;只需要给客户提供优越的产品使用环境即可&#xff…...

antd pro form 数组套数组 form数组动态赋值 shouldUpdate 使用

antd form中数组套数组 form数组动态变化 动态赋值 需求如上&#xff0c;同时添加多个产品&#xff0c;同时每个产品可以增加多台设备&#xff0c;根据设备增加相应编号&#xff0c;所以存在数组套数组&#xff0c;根据数组值动态变化 使用的知识点 form.list form中的数组…...

动态规划:918. 环形子数组的最大和

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《算法》 文章目录 前言一、题目解析二、解题思路解题思路状态表示状态转移方程初始化填表顺序返回值 三、代码实现总结 前言 本篇文章仅是作为小白的我的一些理解&#xff0c;&#xff0c;…...

毅速丨模具3D打印材料有哪些选择

当前1.2709和CX是市面上最常用的3D打印模具钢材料&#xff0c;模具3D打印有没有更多的材料选择呢&#xff1f; 据了解&#xff0c;上海毅速推出的几款3D打印新材料正在被越来越多的行业所采用。如毅速的EM191S高性能高抛光不锈钢粉末&#xff0c;这款材料的抗开裂和耐腐蚀性能是…...

Springcloud笔记(1)-微服务和springcloud介绍

微服务简介 就是将一个大的应用&#xff0c;拆分成多个小的模块&#xff0c;每个模块都有自己的功能和职责&#xff0c;每个模块可以 进行交互&#xff0c;这就是微服务对于微服务&#xff0c;业界没有严格统一的定义&#xff0c;但是作为“微服务”这名词的发明人&#xff0c;…...

十六、代码校验(4)

本章概要 调试 使用 JDB 调试图形化调试器 调试 尽管聪明地使用 System.out 或日志信息能给我们带来对程序行为的有效见解&#xff0c;但对于困难问题来说&#xff0c;这种方式就显得笨拙且耗时了。 你也可能需要更加深入地理解程序&#xff0c;仅依靠打印日志做不到。此时…...

【已解决】No Python at ‘D:\Python\python.exe‘

起因&#xff0c;我把我的python解释器&#xff0c;重新移了个位置&#xff0c;导致我在Pycharm中的爬虫项目启动&#xff0c;结果出现这个问题。 然后&#xff0c;从网上查到了这篇博客: 【已解决】No Python at ‘D:\Python\python.exe‘-CSDN博客 但是&#xff0c;按照上述…...

蓝桥杯双周赛算法心得——数树数(dfs)

大家好&#xff0c;我是晴天学长&#xff0c;一个简单的dfs思想&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。 1) .数树数 2) .算法思路 代码的主要逻辑是&#xff1a; 1.使用Scanner读取输入的整数n和q&#xff0c;其中n表示测试用例的数量&am…...

综述:大规模小目标检测

论文地址: Towards Large-Scale Small Object Detection: Survey and Benchmarks​arxiv.org/abs/2207.14096 目录 摘要 1.Introduction 1.1 与之前综述的比较 1.2 总结 2.小目标检测回顾 2.1 问题定义 2.2 主要挑战 2.3 小目标检测算法回顾 3.小目标检测的数据集 …...

ORACLE XXX序列 goes below MINVALUE 无法实例化的处理办法

--序列增加区分 --删除未使用序列表 DECLARE V_CNT INT; BEGINSELECT COUNT(*) INTO V_CNT FROM USER_SEQUENCES WHERE SEQUENCE_NAME SEQ_INTELLECT_BIZ_DETAIL_ID;IF V_CNT1 THEN BEGINEXECUTE IMMEDIATE DROP SEQUENCE SEQ_INTELLECT_BIZ_DETAIL_ID;END;END IF; END; / ---…...

6款流程图制作软件:一站式指南

流程图是一种常用的图示工具&#xff0c;可以帮助我们更清晰地表达和展示流程、流程图等内容。在今天已经变得非常普及和便捷&#xff0c;接下来本文将于大家分享6款好用的流程图软件&#xff0c;一起来看看吧&#xff01; 博思白板boardmix 博思白板boardmix是一款基于浏览器…...

第三章:Python中的序列(上)

Python中的序列 是一种有序的数据结构,通常用于存储一组相关的元素。Python中的序列包括列表(list)、元组(tuple)和字符串(string)。 1. 列表 是最常用的序列类型,它是可变的(即可以添加、删除和修改元素)。列表中的元素可以是任何类型,包括其他列表或元组。列表…...

使用.NET实现WOL唤醒远程开机

文章目录 1. 背景2. 关于 WOL2.1 WOL 工作原理2.2 开启网卡唤醒功能 3. 快速验证3.1 局域网 Wake on Lan 应用3.2 Ubuntu 的 etherwake 命令4. 代码实现4.1 创建.NET控制台应用程序4.2 编写代码4.3 运行应用程序 5. 最后 1. 背景 家居自动化是现代智能家居的重要组成部分&…...

适用于 Golang 的任务调度程序 AGScheduler

以前一直使用 Python 的任务调度库 APScheduler&#xff08;支持任务持久化&#xff0c;支持多种存储方式&#xff09;&#xff0c;但由于没有找到和它功能和使用方式类似的 Golang 库&#xff0c;所以模仿 APScheduler 3.x 写了个简易版本的 AGScheduler。 AGScheduler Advan…...