【esp32 mqtt】 连接亚马逊-加密传输信息
文章目录
- 1 加密文件
- 1.1 服务端证书
- 1.2 客户端CA证书
- 1.3 客户端私钥
- 1.4 三者协同工作的流程
- 2 亚马逊创建物品
- 3 esp32 程序编写
- 3.1 证书文件读取
- 3.2 MQTT配置
- 3.2.1 配置结构体
- 3.2.2 初始化客户端
- 3.2.3 注册事件
- 3.2.4 开启mqtt
- 3.2.5 示例
- 3.3 事件回调函数
- 3.2.1 示例
- 3.4 接收到订阅消息处理函数
1 加密文件
需要三个加密文件,分别是客户端CA证书、客户端私钥、服务CA证书
。各文件作用:
1.1 服务端证书
作用:验证服务器身份,建立可信连接。
工作流程:
1)服务器将自己的CA证书发送给客户端
2)客户端用预置CA证书验证服务器证书签名链
3)验证通过,则信任该服务器
注:包含服务器公钥
1.2 客户端CA证书
作用:向服务器证明身份的合法性
工作流程:
1)客户端在握手阶段发送自己的CA证书给服务端
2)服务器用CA证书验证客户端的合法性
3)验证通过,允许连接
1.3 客户端私钥
作用:与客户端证书配对使用,完成加密操作
关键特性:与客户端CA证书中的公钥是配对关系
1.4 三者协同工作的流程
2 亚马逊创建物品
连接亚马逊平台之前,需要创建一个物品,下载创建物品后的证书,一直下一步就好,最后在在生成的证书文件。
注:在这里一定要选择一个策略,否则连接不到亚马逊
3 esp32 程序编写
程序部分主要分为如下几个部分:
1)将证书文件读入程序
2)MQTT配置
3)事件回调函数
4)接收到订阅消息后的处理函数
3.1 证书文件读取
将证书文件保存在程序主目录下,将证书名修改为下途中名称:
修改主CMakeLists.txt
文件,修改内容如下:
target_add_binary_data(${CMAKE_PROJECT_NAME}.elf "main/certificate.pem.crt" TEXT)
target_add_binary_data(${CMAKE_PROJECT_NAME}.elf "main/private.pem.key" TEXT)
target_add_binary_data(${CMAKE_PROJECT_NAME}.elf "main/AmazonRootCA1.pem" TEXT)
使用下面语句将密钥读入程序
extern const uint8_t client_cert_pem_start[] asm("_binary_certificate_pem_crt_start");
extern const uint8_t client_cert_pem_end[] asm("_binary_certificate_pem_crt_end");
extern const uint8_t client_key_pem_start[] asm("_binary_private_pem_key_start");
extern const uint8_t client_key_pem_end[] asm("_binary_private_pem_key_end");
extern const uint8_t server_cert_pem_start[] asm("_binary_AmazonRootCA1_pem_start");
extern const uint8_t server_cert_pem_end[] asm("_binary_AmazonRootCA1_pem_end");
3.2 MQTT配置
主要包含下面步骤:
- 配置
esp_mqtt_client_config_t
结构体 - 初始化客户端(esp_mqtt_client_init())
- 注册mqtt事件(esp_mqtt_client_register_event())
- 开启mqtt功能(eap_mqtt_client_start)
3.2.1 配置结构体
配置mqtt需要一个esp_mqtt_client_config_t
类型的结构体,在该结构体中主要配置mqtt服务器地址、服务器公钥,客户端公钥、私钥、客户端id等信息
typedef struct esp_mqtt_client_config_t {// 代理配置struct broker_t {// 代理网络配置struct address_t {const char *uri; // 服务器地址const char *hostname; // esp_mqtt_transport_t transport; // 传输协议 tcp ssl ...const char *path; uint32_t port; // 端口号 } address; // 代理身份认证struct verification_t {bool use_global_ca_store; esp_err_t (*crt_bundle_attach)(void *conf);const char *certificate; // CA证书size_t certificate_len;const struct psk_key_hint *psk_hint_key;bool skip_cert_common_name_check;const char *common_name; } verification; } broker;// 客户端身份认证struct credentials_t {const char *username; const char *client_id; // 客户端IDbool set_null_client_id; /struct authentication_t {const char *password; const char *certificate; // 客户端证书size_t certificate_len; const char *key; // 客户端秘钥size_t key_len; const char *key_password;int key_password_len; bool use_secure_element;void *ds_data; } authentication; /*!< Client authentication */} credentials; /*!< User credentials for broker */// mqtt 主题信息struct session_t {// 遗嘱主题struct last_will_t {const char *topic;const char *msg; int msg_len;int qos; int retain; } last_will; bool disable_clean_session; // 是否清除会话,清除会话:设备上线后需要重新订阅主题int keepalive; // 心跳时间 bool disable_keepalive; esp_mqtt_protocol_ver_t protocol_ver; int message_retransmit_timeout;} session; struct network_t {int reconnect_timeout_ms; int timeout_ms;int refresh_connection_after_ms;bool disable_auto_reconnect; esp_transport_handle_t transport;struct ifreq * if_name; } network; /*** Client task configuration*/struct task_t {int priority; int stack_size; } task; struct buffer_t {int size; int out_size;} buffer; struct outbox_config_t {uint64_t limit; } outbox;
} esp_mqtt_client_config_t;
3.2.2 初始化客户端
函数原型:
esp_mqtt_client_handle_t esp_mqtt_client_init(const esp_mqtt_client_config_t *config)
函数参数:配置结构体
返回值:客户端句柄
该函数主要做了如下事情
- 创建客户端
- 检查esp_mqtt_client_config_t结构体的必填字段是否填充
- 创建mqtt任务,esp32 mqtt运行在一个单独的freertos任务中
3.2.3 注册事件
函数原型
esp_err_t esp_mqtt_client_register_event(esp_mqtt_client_handle_t client, esp_mqtt_event_id_t event, esp_event_handler_t event_handler, void *event_handler_arg)
Registers *MQTT* event
参数:
client – MQTT 客户端句柄
event – 注册的事件类型(连接成功、订阅消息、发布消息、接收到订阅信息等等事件)
event_handler – 事件回调函数
event_handler_arg – 处理程序上下文
返回:
成功: ESP_OK
3.2.4 开启mqtt
函数原型
esp_err_t esp_mqtt_client_start(esp_mqtt_client_handle_t client)
参数:
client – MQTT 客户端句柄
返回:
成功:ESP_OK
初始化失败:ESP_ERR_INVALID_ARG (参数错误)
其他错误:ESP_FAIL
3.2.5 示例
void MQTT_connect_init(void)
{esp_mqtt_client_config_t mqtt_cfg = {.broker = { // 代理.address.uri = SERVICE_IP, // 服务器地址.verification.certificate = (const char*)server_cert_pem_start,},.credentials = {.client_id = CLIENT_ID, // 客户端id.authentication = {.certificate = (const char*) client_cert_pem_start,.key = (const char*) client_key_pem_start,}},};// 初始化客户端结构体esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_cfg);// 注册mqtt事件esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, NULL);// 开启MQTT功能esp_mqtt_client_start(client);
}
3.3 事件回调函数
在上面初始化的时候,注册了mqtt时间,在程序触发了注册的事件之后会执行事件回调函数,该函数的类型是固定的esp_event_handler_t类型,所以需要创建一个该类型的函数。
函数类型如下:
void mqtt_event_handler(void *handler_args, // 传入回调函数的参数esp_event_base_t base, // 注册的事件类型 MQTT WIFI...int32_t event_id, // 事件编号void *event_data // 收到的数据
)
在该函数中,根据不同的触发事件类型和触发事件ID,添加不同的逻辑,将event_data转换为需要的数据类型,在对数据进行不同处理。
3.2.1 示例
void mqtt_event_handler(void *handler_args,esp_event_base_t base, // 注册的事件类型 MQTT WIFI...int32_t event_id, void *event_data
){esp_mqtt_event_handle_t event = event_data;esp_mqtt_client_handle_t client = event->client;// switch (event->event_id) {switch ((esp_mqtt_event_id_t)event_id) {case MQTT_EVENT_CONNECTED: // mqtt连接成功,订阅消息,好像放在这里订阅消息不太合适printf("MQTT connect ok\n");suscribed_topic(client); // 订阅消息break;case MQTT_EVENT_DISCONNECTED:printf("MQTT distconnect \n");break;case MQTT_EVENT_SUBSCRIBED: // 消息订阅成功printf("MQTT subscribed ok. msg_id = %d \n", event->msg_id);break;case MQTT_EVENT_UNSUBSCRIBED:printf("MQTT unsubscribed ok. msg_id = %d \n", event->msg_id);break;case MQTT_EVENT_PUBLISHED:printf("MQTT published ok. msg_id = %d \n", event->msg_id);break;case MQTT_EVENT_DATA: // 接收订阅主题消息printf("TOPIC=%.*s\r\n", event->topic_len, event->topic); /* %.*s 动态控制字符串输出长度 */printf("DATA=%.*s\r\n", event->data_len, event->data);receive_message_handler(event->topic, event->data);break;case MQTT_EVENT_ERROR:printf("MQTT_EVENT_ERROR \n");break;default:printf("other event id:%d \n",event->event_id);break;}
}
设备上线后是否需要重新订阅主题取决于在配置结构体中的disable_clean_session
参数设置。如果设备ID改变,则上线后一定需要重新订阅主题
3.4 接收到订阅消息处理函数
根据具体功能实现
发布主题在程序中还没有添加,后续补充
相关文章:
【esp32 mqtt】 连接亚马逊-加密传输信息
文章目录 1 加密文件1.1 服务端证书1.2 客户端CA证书1.3 客户端私钥1.4 三者协同工作的流程 2 亚马逊创建物品3 esp32 程序编写3.1 证书文件读取3.2 MQTT配置3.2.1 配置结构体3.2.2 初始化客户端3.2.3 注册事件3.2.4 开启mqtt3.2.5 示例 3.3 事件回调函数3.2.1 示例 3.4 接收到…...
用于判断主子关系的方法的实现(orm是efcore)
HasParentChildRelationship 方法:主要用于判断给定实体集合中是否存在主子关系,通过检查实体的导航属性来实现。CheckForDependencies 方法:是一个辅助方法,负责具体的依赖关系检查,包括对已访问实体的跟踪࿰…...
《Effective Python》第三章 循环和迭代器——在遍历参数时保持防御性
引言 本文基于《Effective Python: 125 Specific Ways to Write Better Python, 3rd Edition》一书的 Chapter 3: Loops and Iterators 中的 Item 21: Be Defensive when Iterating over Arguments。该条目深入探讨了在 Python 中处理迭代器(iterator)和…...
【python基础知识】Day30 模块和库的导入
学习python 学习python基础语法 处理任务需要用到的库 一、导入官方库的三种手段 1 标准导入:导入整个库 # 方式1:导入整个模块 import math# 导入库后,输出测试 print("方式1:使用 import math") print(f"圆周率…...
leetcode hot100刷题日记——4.盛最多水的容器
解答: 我的思路: class Solution{public:int maxArea(vector<int>& height){//遍历,我暴力找一下,时间超限// int vol0;// for(int i0;i<height.size()-1;i){// for(int ji1;j<height.size();j){// volmax(vol,…...
大二周周练翻译
翻译题 文章目录 翻译题[toc]中国茶道数字经济茶马古道中国父母现状电子商务长城大学生就业一带一路中国结 相遇的意义,是被你改变的那部分的我,代替你永远陪在我身边 点个赞呗! 中国茶道 China is a country with a time-honored civilizat…...
深度学习————模型保存与部署
第一部分:模型保存基础 什么是模型保存? 当你训练好一个深度学习模型后,它会拥有“学习到的参数”,这些参数(权重、偏置等)构成了模型的“知识”。如果不保存这些参数,那么训练好的模型在关闭…...
5G金融互联:迈向未来金融服务的极速与智能新时代
5G金融互联:迈向未来金融服务的极速与智能新时代 大家好,我是Echo_Wish,今天咱们聊聊一个大家都十分关心的话题:5G网络在金融服务中的应用。咱们平时可能觉得5G只是打个电话、刷个视频更流畅了,但在金融服务领域,5G的低延时、大带宽和高可靠性正在悄然改变整个游戏规则。…...
交易所开发:构建功能完备的金融基础设施全流程指南
交易所开发:构建功能完备的金融基础设施全流程指南 ——从技术架构到合规安全的系统性解决方案 一、开发流程:从需求分析到运维优化 开发一款功能完备的交易所需要遵循全生命周期管理理念,涵盖市场定位、技术实现、安全防护和持续迭代四大阶…...
Icecream Video Editor:简单易用的视频编辑软件,轻松打造专业视频
Icecream Video Editor 是一款简单易用的视频编辑软件,专为希望快速、高效编辑视频的用户设计。它提供了丰富的功能,包括视频剪辑、效果应用、音频处理和视频导出,满足用户在不同场景下的需求。无论是视频新手还是有一定基础的创作者…...
论文阅读--Logical quantum processor based on reconfigurable atom arrays
论文主要内容 研究背景与目标: 论文提出了一种基于可重构中性原子阵列的逻辑量子处理器,旨在通过量子纠错(QEC)和逻辑量子比特编码,解决物理量子比特的噪声限制问题。该处理器结合高保真度逻辑门操作、任意连接性和实时…...
安防综合管理系统EasyCVR视频融合平台安防知识:门禁系统与视频监控系统如何联动?
在现代安防体系中,视频监控与门禁系统是两大核心。前者实时记录画面,为安全事件追溯提供依据;后者精准管控人员出入。二者联动可提升安防智能化水平,实现门禁点图像抓拍与实时监视,在安全事件发生时快速整合信息&#…...
微机系统第二章-题目整理
80x86标志寄存器中ZF位等于1,说明( )。 A A.运算结果等于0 B. 运算结果大于0 C. 运算结果不等于0 D.运算结果溢出 8086CPU由哪两大部分组成?简述它们的主要功能。 总线接口部件BIU跟执行部件EU。 总线接口部件(BIU&…...
w~自动驾驶合集1
我自己的原文哦~ https://blog.51cto.com/whaosoft/12371169 #世界模型和DriveGPT这类大模型到底能给自动驾驶带来什么ne 以下分享大模型与自动驾驶结合的相关工作9篇论 1、ADAPT ADAPT: Action-aware Driving Caption Transformer(ICRA2023) AD…...
嵌入式学习的第二十三天-数据结构-树+哈希表+内核链表
一、树(一对多) 1.树的定义 树:n(n>0)个结点的有限集合。n 0 ,空树。 2.在任意一个非空树中, (1),有且仅有一个特定的根结点 (2),当n>1 时,其余结点可分为m个…...
互联网大厂Java求职面试:Spring AI与大模型交互的高级模式与自定义开发
互联网大厂Java求职面试:Spring AI与大模型交互的高级模式与自定义开发 在当今技术领域,随着AI和大模型技术的广泛应用,如何在复杂的系统架构中高效地集成这些技术成为了各大互联网公司关注的重点。本文将通过一场模拟的面试对话,…...
Ansible模块——主机名设置和用户/用户组管理
设置主机名 ansible.builtin.hostname: name:要设置的主机名 use:更新主机名的方式(默认会自动选择,不指定的话,物理机一般不会有问题,容器可能会有问题,一般是让它默认选择) syst…...
lowcoder数据库操作1:链接目标数据库
比如我使用的是PostgreSQL,要链接到数据库。 步骤1,Data Sources 步骤2, New data source 步骤3,选择PostgreSQL 步骤4,输入各种信息 命名,数据库所在的IP,端口,库名,用户密码。 步…...
R9打卡——RNN实现阿尔茨海默病诊断(优化特征选择版)
🍨 本文为🔗365天深度学习训练营中的学习记录博客 🍖 原作者:K同学啊 1.检查GPU import numpy as np import pandas as pd import torch from torch import nn import torch.nn.functional as F import seaborn as sns#设置GPU训…...
Label Studio:开源标注神器
目录 一、Label Studio 是什么? 二、核心功能大揭秘 2.1 多类型数据全兼容 2.2 个性化定制随心配 2.3 团队协作超给力 2.4 机器学习巧集成 三、上手实操超简单 3.1 安装部署不头疼 3.1.1 Docker安装 3.1.2 pip安装 3.1.3 Anaconda安装 3.2 快速开启标注…...
flow-两种SharingStarted策略的区别示例
一 代码示例 viewModel.kt:// 上游数据源 - 模拟温度传感器 private val temperatureSource flow {var temp 20while(true) {emit(temp)delay(1000)println("上游发射温度: $temp") // 日志观察发射} }// WhileSubscribed - 有订阅者才收集 val temperature1 tem…...
零基础设计模式——设计模式入门
第一部分:设计模式入门 欢迎来到设计模式的世界!别担心,这听起来可能很“高大上”,但我们会用最生活化的例子来帮助你理解。 1. 什么是设计模式? 想象一下,你是个大厨,每天都要做很多菜。有些…...
通过vcpkg交叉编译grpc:构建Arm64平台的Docker化开发环境
一、引言 在现代软件开发中,交叉编译是构建跨平台应用程序的关键技术。本文将详细介绍如何使用Docker容器和vcpkg包管理器为Arm64架构交叉编译gRPC库。这种方法特别适用于需要在x86开发机上为ARM服务器或嵌入式设备构建高性能RPC服务的场景。 二、配置Docker交叉编…...
Nginx基础知识
Nginx是什么? Nginx 是一款高性能的 Web 服务器、反向代理服务器和负载均衡器,以其高并发处理能力和低内存消耗著称。以下是 Nginx 的基础知识和常见配置示例: 1. 核心概念 • 配置文件位置:通常为 /etc/nginx/nginx.conf 或 /us…...
【计算机主板架构】ITX架构
一、引言 在计算机硬件的广阔领域中,主板架构犹如大厦的基石,对整个计算机系统的性能、功能和扩展性起着至关重要的作用。其中,ITX架构以其小巧、灵活和独特的设计理念,在特定的应用场景中脱颖而出。从家庭媒体中心到小型办公电脑…...
ubuntu 20.04 运行和编译LOAM_Velodyne
摘要:创建工作空间-->src下克隆代码(https://github.com/laboshinl/loam_velodyne)-->修改四处代码(找到src/loam_velodyne路径下的CMakeLists.txt文件,注释掉35行代码和将/LOAM/src/loam_velodyne/src/lib文件夹…...
云计算简介:从“水电”到“数字引擎”的技术革命
云计算简介:从“水电”到“数字引擎”的技术革命 在当今数字化浪潮中,云计算早已从一个技术概念演变为支撑现代社会运转的核心基础设施。无论是你手机里的天气预报、电商购物的推荐系统,还是企业内部的ERP系统,背后都离不开云计算…...
femap许可与多用户共享
随着电磁仿真技术的发展,Femap作为一款领先的工具,在多个领域中发挥着不可替代的作用。然而,对于许多团队和企业来说,如何高效、经济地管理和使用Femap许可证成为了一个亟待解决的问题。本文将探讨Femap许可与多用户共享的概念、优…...
spring中yml配置上下文与tomcat等外部容器不一致问题
结论:外部优先级大于内部 在 application.yml 中配置了: server:port: 8080servlet:context-path: /demo这表示你的 Spring Boot 应用的上下文路径(context-path)是 /demo,即访问你的服务时,URL 必须以 /d…...
网络I/O学习-poll(三)
一、为什么要用Poll 由于select参数太多,较于复杂,调用起来较为麻烦;poll对其进行了优化 二、poll机制 poll也是一个系统调用,每次调用都会将所有客户端的fd拷贝到内核空间,然后进行轮询,判断IO是否就绪…...
云原生攻防2(Docker基础补充)
Docker基础入门 容器介绍 Docker是什么 Docker是基于Linux内核实现,最早是采用了 LXC技术,后来Docker自己研发了runc技术运行容器。 它基于Google Go语言实现,采用客户端/服务端架构,使用API来管理和创建容器。 虚拟机 VS Docker Namespace 内核命名空间属于容器非常核…...
【C++模板与泛型编程】实例化
目录 一、模板实例化的基本概念 1.1 什么是模板实例化? 1.2 实例化的触发条件 1.3 实例化的类型 二、隐式实例化 2.1 隐式实例化的工作原理 2.2 类模板的隐式实例化 2.3 隐式实例化的局限性 三、显式实例化 3.1 显式实例化声明(extern templat…...
CI/CD 实践:实现可灰度、可监控、可回滚的现代部署体系
CI/CD 实践:实现可灰度、可监控、可回滚的现代部署体系 一、背景 随着微服务架构、云原生技术的普及,传统的手动部署方式已难以满足现代业务快速迭代、高可用的需求。CI/CD(持续集成/持续交付)作为现代 DevOps 的核心环节&#…...
后退的风景
后退的风景 前言回退的景色 前言 坐在高铁的窗边,这是一趟回程的旅途,所有的树木、铁塔、石碑向后涌去,一如从前。 所谓风景正是如此,无非是看到了一段触动内心的感受,这段感受可能是伤心,亦或是欣喜。这…...
腾讯云安装halo博客
腾讯云安装halo博客 如果网站已经配置好可以直接使用的,可以直接跳转到《6》进行1panel的安装, 如果跳过之后安装出现问题,可以看看前面步骤 从《6》开始的安装视频 我估计是网站默认放开的端口和他返代理应用的端口冲突了,重装…...
Excel宏和VBA的详细分步指南
Excel宏和VBA的详细分步指南 一、宏录制与代码分析(超详细版)1. 启用开发工具2. 录制宏 二、VBA核心语法(深入详解)1. 变量与数据类型2. 循环结构3. 条件判断2. Worksheet对象3. Range对象的高级操作 四、实用案例扩展1. 数据清洗…...
第十六届蓝桥杯复盘
文章目录 1.数位倍数2.IPv63.变换数组4.最大数字5.小说6.01串7.甘蔗8.原料采购 省赛过去一段时间了,现在复盘下,省赛报完名后一直没准备所以没打算参赛,直到比赛前两天才决定参加,赛前两天匆匆忙忙下载安装了比赛要用的编译器ecli…...
深度学习---模型预热(Model Warm-Up)
一、基本概念与核心定义 模型预热是指在机器学习模型正式训练或推理前,通过特定技术手段使模型参数、计算图或运行环境提前进入稳定状态的过程。其本质是通过预处理操作降低初始阶段的不稳定性,从而提升后续任务的效率、精度或性能。 核心目标…...
python:pymysql概念、基本操作和注入问题讲解
python:pymysql分享目录 一、概念二、数据准备三、安装pymysql四、pymysql使用(一)使用步骤(二)查询操作(三)增(四)改(五)删 五、关于pymysql注入…...
科普:极简的AI乱战江湖
本文无图。 大模型 2022年2月,文生图应用的鼻祖Midjourney上线。 2022年8月,开源版的Midjourney,也就是Stable Diffusion上线。 2022年11月30日,OpenAI正式发布ChatGPT-3.5。 此后,不断有【大模型】面世&…...
养生指南:解锁健康生活新方式
一、饮食:精准搭配,科学滋养 饮食以 “少加工、多天然” 为核心。早餐选择希腊酸奶搭配蓝莓与一把混合坚果,富含蛋白质与抗氧化成分;午餐用藜麦饭搭配香煎龙利鱼和彩椒炒芦笋,营养全面且低脂;晚餐则是山药…...
Dolphinscheduler执行工作流失败,后台报duplicate key错误
背景 现场童鞋发来一张图如下 我很懵逼,不知道出了啥问题,在聊天工具上聊了10m还不知道啥,干脆就搞个腾讯会议(在此感谢腾讯爸爸免费会议)。哦,现场临时搭建了dolphinscheduler,然后导入工作流…...
【Vue】路由2——编程式路由导航、 两个新的生命周期钩子 以及 路由守卫、路由器的两种工作模式
目录 一、路由的push 与 replace切换 二、编程式路由导航 三、缓存路由组件 四、新增的两个生命周期钩子 五、路由守卫 5.1 前置路由守卫 5.2 后置路由守卫 5.3 独立路由守卫 5.4 组件内 路由守卫 六、路由器的两种工作模式 6.1 hash模式 6.2 history模式 6.3 V…...
VDC、SMC、MCU怎么协同工作的?
华为视频会议系统中,VDC(终端控制)、SMC(会话管理)、MCU(媒体处理) 通过分层协作实现端到端会议管理,其协同工作机制可总结为以下清晰架构: 1. 角色分工 组件核心职责类…...
ETL数据集成产品选型需要关注哪些方面?
ETL(Extract,Transform,Load)工具作为数据仓库和数据分析流程中的关键环节,其选型对于企业的数据战略实施有着深远的影响。谷云科技在 ETL 领域耕耘多年,通过自身产品的实践应用,对 ETL 产品选型…...
DriveGenVLM:基于视觉-语言模型的自动驾驶真实世界视频生成
《DriveGenVLM: Real-world Video Generation for Vision Language Model based Autonomous Driving》2024年8月发表,来自哥伦比亚大学的论文。 自动驾驶技术的进步需要越来越复杂的方法来理解和预测现实世界的场景。视觉语言模型(VLM)正在成…...
【达梦数据库】过程、函数、包头和包体详解零基础
目录 背景参考链接解释包头包体 背景 最近遇到关于包头和包体的问题,学习并记录 参考链接 参考链接: oracle的过程、函数、包头和包体详解零基础 解释 包头主要用于定义接口,包体主要用以实现包体中声明的存储过程、函数等。 包头 包体...
HarmonyOS开发样式布局
个人简介 👨💻个人主页: 魔术师 📖学习方向: 主攻前端方向,正逐渐往全栈发展 🚴个人状态: 研发工程师,现效力于政务服务网事业 🇨🇳人生格言&…...
SpringCloud——EureKa
目录 1.前言 1.微服务拆分及远程调用 3.EureKa注册中心 远程调用的问题 eureka原理 搭建EureKaServer 服务注册 服务发现 1.前言 分布式架构:根据业务功能对系统进行拆分,每个业务模块作为独立项目开发,称为服务。 优点: 降…...
【力扣刷题】LeetCode763-划分字母区间
文章目录 1. LeetCode763_划分字母区间 1. LeetCode763_划分字母区间 题目链接🔗 🐧解题思路: 区间合并 题目中这句话很关键“我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。” 你这句话你可以理解为 把…...