基于嵌入式C++、SQLite、MQTT、Modbus和Web技术的工业物联网网关:从边缘计算到云端集成的全栈解决方案设计与实现
一、项目概述
1.1 项目目标与用途
随着工业4.0时代的到来,传统工业设备与现代信息技术的结合越来越紧密。物联网工业网关作为连接工业设备与云端平台的桥梁,在工业自动化、设备监控、远程运维等方面发挥着至关重要的作用。本项目旨在设计并实现一个能够适用于工业环境的物联网工业网关,支持多种通信协议和云平台集成,满足工业环境中的数据采集、边缘计算、安全管理等需求。
项目目标:
-
设计一个稳定、可靠的工业网关设备,用于工业数据采集与处理。
-
支持多种工业通信协议(如Modbus TCP/RTU, CAN, RS-232/485等)。
-
提供边缘计算能力,实时处理和分析数据。
-
支持主流云平台的集成,便于远程监控与管理。
-
确保设备具备高安全性,能够抵御常见的网络威胁。
项目用途:
-
实现工业设备的远程监控与管理,提高生产效率。
-
通过边缘计算减少对云端的依赖,降低延迟和带宽消耗。
-
提供灵活的接口,便于集成到现有的工业自动化系统中。
二、系统架构
2.1 系统架构设计
系统架构的设计需要充分考虑工业环境的需求,包括硬件平台的选择、通信协议的支持、数据处理与存储、安全性、云服务集成等。以下是该系统的整体架构图。
系统组件说明:
-
工业设备: 通过不同的工业通信协议连接到网关,传输数据。
-
物联网工业网关: 核心组件,负责与工业设备通信、进行数据处理和边缘计算,并将数据传输到云平台或第三方系统。
-
本地存储: 用于存储经过处理的数据,或在网络连接中断时提供数据缓冲。
-
云平台: 用于远程数据存储、分析和可视化。支持MQTT、HTTP/HTTPS、OPC UA等协议。
-
第三方系统: 通过RESTful API或gRPC与网关进行数据交互,实现更多的集成应用。
-
远程管理界面: 提供Web管理界面,便于用户对网关进行配置和管理。
-
日志与监控: 实时监控网关状态,并记录系统日志以供故障排查。
2.2 硬件平台选择
网关的硬件平台选择需要考虑工业环境的可靠性和扩展性,通常包括以下组件:
-
处理器: 选择工业级的ARM Cortex-A系列处理器,能够支持边缘计算需求。
-
通信接口: 提供丰富的接口如RS-232/485、CAN、以太网等,以支持多种工业协议。
-
存储: 配备足够的闪存和RAM,用于操作系统、应用程序和数据缓存。
-
电源管理: 考虑到工业环境的电源条件,选择支持宽电压输入的电源管理模块。
2.3 软件技术栈
-
操作系统: 选择Linux或实时操作系统(如FreeRTOS),根据实际需求决定。
-
通信协议栈: 提供对Modbus TCP/RTU, CAN, MQTT, OPC UA等协议的支持。
-
编程语言: 使用C/C++实现底层驱动与通信协议;Python或JavaScript用于Web管理界面开发。
-
数据库: 使用SQLite或嵌入式NoSQL数据库用于本地数据存储。
-
安全性: 实现TLS/SSL加密,使用防火墙和入侵检测系统(IDS)来保护系统安全。
三、环境搭建
3.1 软件环境
在开发和部署物联网工业网关的过程中,需要设置适当的开发环境和工具链,以确保项目的顺利进行。以下是所需的软件环境及其配置步骤:
3.1.1 操作系统
-
主机操作系统: 建议使用Ubuntu 20.04或更高版本的Linux系统,因其对嵌入式开发和开源工具的广泛支持。
-
目标操作系统: 物联网工业网关选择运行嵌入式Linux(如Yocto或Buildroot生成的定制Linux系统)或实时操作系统(如FreeRTOS)。
3.1.2 开发工具链
-
编译器: 安装GCC交叉编译工具链,适用于ARM架构的设备。
sudo apt-get install gcc-arm-linux-gnueabi
-
构建系统: 使用CMake或Makefile管理项目构建。
sudo apt-get install cmake
-
调试工具: 安装GDB调试器和OpenOCD,用于调试嵌入式设备。
sudo apt-get install gdb openocd
3.1.3 必要库和依赖
-
通信协议库: 安装libmodbus、can-utils等库,用于实现Modbus和CAN通信。
sudo apt-get install libmodbus-dev can-utils
-
网络库: 安装libcurl、libmosquitto等库,用于HTTP/HTTPS和MQTT通信。
sudo apt-get install libcurl4-openssl-dev libmosquitto-dev
-
数据库: 安装SQLite库,用于本地数据存储。
sudo apt-get install libsqlite3-dev
3.1.4 集成开发环境(IDE)
-
推荐使用VS Code或CLion作为开发环境,配合适当的插件进行远程开发和调试。
-
VS Code: 可通过Remote-SSH插件在嵌入式设备上进行远程开发。
-
CLion: 支持CMake项目,可以直接配置远程开发和调试。
3.2 硬件环境
3.2.1 开发板选择
-
开发板类型: 选择Raspberry Pi 4、BeagleBone Black或类似的ARM Cortex-A系列开发板进行原型开发。
-
接口模块: 根据需求选择带有RS-232/485、CAN、以太网等接口的扩展板。
3.2.2 电源
- 电源规格: 开发板通常需要5V或12V电源,建议使用稳定的工业级电源适配器,确保设备长时间稳定运行。
3.2.3 传感器与外设
-
传感器连接: 根据实际应用选择温度、湿度、压力等传感器,并通过RS-485或CAN总线与网关连接。
-
存储设备: 使用工业级SD卡或eMMC模块,确保数据存储的可靠性和持久性。
3.3 环境安装步骤与配置
3.3.1 编译工具链安装
-
下载并安装适用于目标硬件平台的交叉编译工具链。
sudo apt-get install gcc-arm-linux-gnueabi
-
设置交叉编译环境变量,确保编译器能够正确找到目标平台的库和头文件。
export CC=arm-linux-gnueabi-gccexport CXX=arm-linux-gnueabi-g++
3.3.2 开发环境配置
-
配置CMake: 在项目根目录中创建CMakeLists.txt文件,配置项目的编译选项和依赖库。
cmake\_minimum\_required(VERSION 3.10) project(IndustrialGateway)set(CMAKE\_CXX\_STANDARD 14)include_directories(/usr/include/modbus) include_directories(/usr/include/mosquitto)add_executable(IndustrialGateway main.cpp) target\_link\_libraries(IndustrialGateway modbus mosquitto sqlite3)
3.3.2 开发环境配置
- 编译与运行: 使用CMake生成Makefile,然后编译项目。
-
首先,在项目的根目录下创建一个名为
build
的目录,用于存放编译生成的文件。mkdir buildcd build
-
接着,使用CMake命令生成Makefile文件:
cmake ..
cmake ..
命令会根据你在CMakeLists.txt
中的配置生成Makefile文件。如果一切配置正确,你应该会看到CMake成功生成构建文件的消息。 -
生成Makefile后,使用
make
命令开始编译项目:make
编译成功后,会在
build
目录下生成一个可执行文件(假设在CMakeLists.txt
中指定了IndustrialGateway
作为输出文件名)。 -
编译完成后,可以将生成的可执行文件部署到目标设备(如Raspberry Pi或BeagleBone Black)上,或者直接在开发板上运行。如果是在开发主机上进行的交叉编译,则需要将可执行文件通过
scp
命令复制到目标设备上:scp IndustrialGateway user@target\_device\_ip:/path/to/deploy
-
在目标设备上,进入部署目录并运行可执行文件:
./IndustrialGateway
-
运行后,网关程序会开始与连接的工业设备进行通信,处理数据,并将数据上传到配置的云平台或第三方系统。
3.3.3 远程调试配置(可选)
远程调试对于嵌入式开发非常重要,以下是如何通过GDB和VS Code进行远程调试的步骤:
- 在目标设备上启动GDB Server:
-
在目标设备上,使用GDB启动调试服务:
gdbserver :1234 /path/to/IndustrialGateway
-
这将启动GDB Server,监听目标设备上的1234端口。
- 在开发主机上配置VS Code进行远程调试:
-
打开VS Code,安装
C/C++
和Remote - SSH
插件。 -
在VS Code中配置
.vscode/launch.json
以支持远程调试:{ "version": "0.2.0", "configurations": [ {"name": "Remote Debug","type": "cppdbg","request": "launch","program": "/path/to/IndustrialGateway","args": [],"stopAtEntry": false,"cwd": "${workspaceFolder}","environment": [],"externalConsole": false,"MIMode": "gdb","setupCommands": [{"description": "Enable pretty-printing for gdb","text": "-enable-pretty-printing","ignoreFailures": true}],"miDebuggerServerAddress": "target_device_ip:1234","miDebuggerPath": "/usr/bin/gdb-multiarch","serverReadyAction": {"pattern": "Listening on port (\\d+)","uriFormat": "http://localhost:%s","action": "openExternally"},"preLaunchTask": "build","pipeTransport": {"pipeProgram": "ssh","pipeArgs": ["user@target_device_ip"],"debuggerPath": "/usr/bin/gdb","pipeCwd": ""},"sourceFileMap": {"/build": "${workspaceFolder}"} }] }
- 配置完成后,在VS Code中启动调试,会连接到目标设备的GDB Server,允许你在开发主机上进行断点调试、变量查看等操作。
3.3.4 配置示例和注意事项
3.3.4.1 配置示例
以下是一个 CMakeLists.txt
配置示例,用于编译一个集成了Modbus和MQTT通信的网关应用:
cmake_minimum_required(VERSION 3.10)
project(IndustrialGateway)# 设置C++标准
set(CMAKE_CXX_STANDARD 14)# 包含头文件路径
include_directories(/usr/include/modbus)
include_directories(/usr/include/mosquitto)# 添加源文件
add_executable(IndustrialGateway main.cpp modbus_handler.cpp mqtt_handler.cpp)# 链接库
target_link_libraries(IndustrialGateway modbus mosquitto sqlite3)
在这个配置示例中:
-
include_directories
用于指定项目需要的头文件路径,如Modbus和Mosquitto库的头文件。 -
add_executable
用于添加项目的源代码文件,这里包括main.cpp
、modbus_handler.cpp
和mqtt_handler.cpp
。 -
target_link_libraries
用于指定项目需要链接的库,如modbus
、mosquitto
和sqlite3
。
3.3.4.2 注意事项
在搭建开发环境和配置项目时,有若干关键点需要注意,以避免常见的错误和问题。
- 交叉编译工具链的选择:
-
确保选择的交叉编译工具链与目标硬件平台的架构相匹配。如果目标设备是ARM架构,使用
gcc-arm-linux-gnueabi
或gcc-arm-linux-gnueabihf
之类的工具链。 -
如果目标设备使用64位架构(如ARM64),请使用相应的工具链如
gcc-aarch64-linux-gnu
。
- 依赖库的安装:
-
在开发主机上安装的库版本应与目标设备上的库版本匹配,避免出现运行时库版本不兼容的问题。
-
如果在目标设备上运行时出现库缺失问题,检查库是否已正确安装,并确保其路径在运行时可访问。
- 路径配置:
-
在
CMakeLists.txt
中指定的头文件路径和库路径应与实际安装路径一致。可以使用find_package
或pkg-config
等工具自动查找依赖库,避免手动指定路径时出错。 -
如果使用了自定义路径安装的库,确保在
CMakeLists.txt
中正确配置了include_directories
和link_directories
。
- 调试配置:
-
在远程调试配置中,确保正确配置了
miDebuggerServerAddress
和pipeTransport
,以便VS Code能够正确连接到目标设备上的GDB Server。 -
如果调试连接失败,检查目标设备上的GDB Server是否正在运行,并确保网络连接正常。
- 安全性:
-
在生产环境中,确保所有网络通信使用加密协议(如TLS/SSL)以保护数据安全。
-
定期更新操作系统和库,修补已知的安全漏洞。
- 部署和测试:
-
在部署到生产环境之前,务必在开发环境中进行充分的测试,特别是在不同网络条件下的稳定性测试。
-
使用日志和监控工具实时监控系统状态,迅速发现并处理潜在问题。
四、代码实现
4.1 功能模块设计
根据前面的系统架构设计,物联网工业网关的代码实现将按照以下几个主要功能模块进行开发:
-
Modbus通信模块:负责与工业设备进行Modbus TCP/RTU通信,采集设备数据。
-
MQTT通信模块:负责将采集的数据发布到云平台或其他系统,支持MQTT协议。
-
边缘计算模块:在网关设备本地对采集的数据进行初步处理和分析。
-
存储模块:将数据存储到本地SQLite数据库中,支持断网情况下的数据缓存。
-
远程管理模块:提供Web管理界面,用于配置和监控网关状态。
4.2 关键代码示例
4.2.1 Modbus通信模块
以下是一个简单的Modbus TCP通信的示例代码,用于从工业设备读取数据:
#include <modbus.h>
#include <iostream>class ModbusHandler {
public:ModbusHandler(const std::string& ip, int port) {ctx = modbus_new_tcp(ip.c_str(), port);if (ctx == nullptr) {std::cerr << "Unable to create Modbus context" << std::endl;exit(1);}}~ModbusHandler() {modbus_close(ctx);modbus_free(ctx);}void connect() {if (modbus_connect(ctx) == -1) {std::cerr << "Connection failed: " << modbus_strerror(errno) << std::endl;exit(1);}}int readRegisters(int addr, int nb, uint16_t* dest) {int rc = modbus_read_registers(ctx, addr, nb, dest);if (rc == -1) {std::cerr << "Failed to read registers: " << modbus_strerror(errno) << std::endl;}return rc;}private:modbus_t* ctx;
};int main() {ModbusHandler modbus("192.168.0.1", 502);modbus.connect();uint16_t data[10];int rc = modbus.readRegisters(0, 10, data);if (rc > 0) {for (int i = 0; i < rc; i++) {std::cout << "Register " << i << ": " << data[i] << std::endl;}}return 0;
}
在这个示例中,ModbusHandler
类封装了Modbus TCP的连接和数据读取操作。main
函数中实例化该类并读取设备的寄存器数据。
4.2.2 MQTT通信模块
以下是一个简单的MQTT客户端示例代码,用于将数据发布到MQTT Broker:
#include <mosquitto.h>
#include <iostream>
#include <cstring>class MQTTHandler {
public:MQTTHandler(const std::string& broker, int port) {mosquitto_lib_init();mosq = mosquitto_new(NULL, true, NULL);if (!mosq) {std::cerr << "Failed to create mosquitto instance" << std::endl;exit(1);}if (mosquitto_connect(mosq, broker.c_str(), port, 60) != MOSQ_ERR_SUCCESS) {std::cerr << "Failed to connect to broker" << std::endl;exit(1);}}~MQTTHandler() {mosquitto_destroy(mosq);mosquitto_lib_cleanup();}void publish(const std::string& topic, const std::string& message) {int ret = mosquitto_publish(mosq, NULL, topic.c_str(), message.size(), message.c_str(), 0, false);if (ret != MOSQ_ERR_SUCCESS) {std::cerr << "Failed to publish message: " << mosquitto_strerror(ret) << std::endl;}}private:mosquitto* mosq;
};int main() {MQTTHandler mqtt("broker.hivemq.com", 1883);mqtt.publish("industrial/data", "Sensor data: 1234");return 0;
}
4.2.3 边缘计算模块
边缘计算模块的主要任务是在网关设备上对采集到的数据进行初步处理和分析,以减少上行数据量,降低云平台的负载,并实现实时性要求。以下是一个简单的边缘计算示例代码,用于对采集到的传感器数据进行过滤和平均计算:
#include <iostream>
#include <vector>
#include <numeric>class EdgeCompute {
public:// 简单的移动平均滤波器double movingAverageFilter(const std::vector<double>& data, int windowSize) {if (data.size() < windowSize) {std::cerr << "Insufficient data for the specified window size" << std::endl;return 0.0;}double sum = 0.0;for (size_t i = data.size() - windowSize; i < data.size(); ++i) {sum += data[i];}return sum / windowSize;}// 数据范围检测bool isDataInRange(double value, double min, double max) {return value >= min && value <= max;}
};int main() {EdgeCompute edgeCompute;// 模拟一组传感器数据std::vector<double> sensorData = {23.5, 24.0, 23.8, 24.2, 23.9, 24.1, 23.7};// 使用移动平均滤波器处理数据,窗口大小为3double filteredData = edgeCompute.movingAverageFilter(sensorData, 3);std::cout << "Filtered Data (Moving Average): " << filteredData << std::endl;// 判断过滤后的数据是否在合理范围内double minThreshold = 23.0;double maxThreshold = 25.0;if (edgeCompute.isDataInRange(filteredData, minThreshold, maxThreshold)) {std::cout << "Data is within the acceptable range." << std::endl;} else {std::cout << "Data is out of range!" << std::endl;}return 0;
}
说明:
-
移动平均滤波器:这个简单的算法用于平滑传感器数据,减少噪声。
movingAverageFilter
函数接受一组数据和一个窗口大小,计算该窗口内数据的平均值。 -
数据范围检测:
isDataInRange
函数用于检测数据是否在预定的范围内,如果数据超出范围,可以触发告警或进一步处理。
在实际应用中,边缘计算模块可以更复杂,包括但不限于:
-
数据聚合:对多个传感器的数据进行聚合处理(如求和、求平均等)。
-
异常检测:使用机器学习模型或统计方法检测异常数据。
-
事件驱动处理:根据特定的条件触发事件(如设备故障报警)。
4.2.4 存储模块
存储模块的任务是将采集到的数据存储到本地数据库中,以便在网络连接中断或者需要历史数据时进行访问。以下是一个使用SQLite数据库存储传感器数据的简化示例:
#include <sqlite3.h>
#include <iostream>
#include <string>class Storage {
public:Storage(const std::string& dbname) {int rc = sqlite3_open(dbname.c_str(), &db);if (rc) {std::cerr << "Can't open database: " << sqlite3_errmsg(db) << std::endl;exit(1);}}~Storage() {sqlite3_close(db);}void createTable() {const char* sql = "CREATE TABLE IF NOT EXISTS SensorData (""ID INTEGER PRIMARY KEY AUTOINCREMENT,""Timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,""Value REAL);";executeSQL(sql);}void insertData(double value) {std::string sql = "INSERT INTO SensorData (Value) VALUES (" + std::to_string(value) + ");";executeSQL(sql.c_str());}private:sqlite3* db;void executeSQL(const char* sql) {char* errMsg = 0;int rc = sqlite3_exec(db, sql, 0, 0, &errMsg);if (rc != SQLITE_OK) {std::cerr << "SQL error: " << errMsg << std::endl;sqlite3_free(errMsg);}}
};int main() {Storage storage("industrial_gateway.db");storage.createTable();double sensorValue = 24.5; // 模拟读取到的传感器数据storage.insertData(sensorValue);std::cout << "Sensor data inserted into the database successfully." << std::endl;return 0;
}
说明:
-
SQLite 数据库:
Storage
类封装了SQLite数据库的基本操作,包括数据库连接、表创建和数据插入。 -
数据表:
createTable
方法用于创建一个名为SensorData
的表,其中包含ID
(主键)、Timestamp
(自动生成的时间戳)和Value
(传感器数据)。 -
数据插入:
insertData
方法用于将传感器数据插入到SensorData
表中。
在实际应用中,存储模块可能包含更多功能,如:
-
数据查询:支持按时间范围查询历史数据。
-
数据清理:定期清理旧数据以节省存储空间。
-
事务处理:确保在写入数据时的原子性和一致性,避免数据损坏。
4.2.5 远程管理模块
远程管理模块提供Web管理界面,允许用户通过网络远程配置和监控网关设备的状态。以下是一个简单的Web服务器示例,使用C++的cpp-httplib库来实现一个基本的HTTP服务器:
#include <httplib.h>
#include <iostream>class WebServer {
public:WebServer(int port) : server(), port(port) {}void start() {server.Get("/", [](const httplib::Request& req, httplib::Response& res) {res.set_content("Welcome to the Industrial Gateway Web Interface!", "text/plain");});server.Get("/status", [](const httplib::Request& req, httplib::Response& res) {res.set_content("Gateway Status: Running", "text/plain");});std::cout << "Starting web server on port " << port << std::endl;server.listen("0.0.0.0", port);}private:httplib::Server server;int port;
};int main() {WebServer webServer(8080);webServer.start();return 0;
}
说明:
-
Web 服务器:
WebServer
类使用cpp-httplib
库实现了一个简单的HTTP服务器,监听指定端口。 -
路由处理:在代码中定义了两个简单的路由,一个是根路径
/
,另一个是/status
,分别返回欢迎信息和网关状态。 -
启动服务器:
start
方法启动Web服务器,监听所有网络接口上的指定端口。
在实际应用中,远程管理模块可能需要更复杂的功能,如:
-
用户认证:通过身份验证和授权确保只有授权用户才能访问管理界面。
-
设备配置:提供界面供用户配置网关的各种参数(如通信协议、云平台连接信息等)。
-
实时监控:通过Web界面实时显示设备的运行状态和数据,如CPU使用率、内存占用、网络流量等。
五、项目总结
5.1 项目主要功能
本项目通过设计并实现一个物联网工业网关,成功集成了多种功能模块,具体包括:
-
工业设备通信:支持多种工业通信协议(如Modbus TCP/RTU、CAN、RS-232/485),实现了工业设备的数据采集。
-
边缘计算:在网关设备上实现了基本的边缘计算能力,对采集的数据进行初步处理和分析。
-
数据存储:使用本地SQLite数据库存储采集的数据,支持断网情况下的数据缓存和历史数据查询。
-
云平台集成:通过MQTT协议将数据上传到云平台,实现远程监控和数据分析。
-
远程管理:提供了一个简单的Web管理界面,支持远程配置和监控网关状态。
相关文章:
基于嵌入式C++、SQLite、MQTT、Modbus和Web技术的工业物联网网关:从边缘计算到云端集成的全栈解决方案设计与实现
一、项目概述 1.1 项目目标与用途 随着工业4.0时代的到来,传统工业设备与现代信息技术的结合越来越紧密。物联网工业网关作为连接工业设备与云端平台的桥梁,在工业自动化、设备监控、远程运维等方面发挥着至关重要的作用。本项目旨在设计并实现一个能够…...
Chapter 38 设计模式
欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能! 文章目录 前言一、单例模式二、工厂模式 前言 在软件开发中,设计模式提供了一种可重用的解决方案,以应对在特定环境中反复出现的问题。这些模式是基于经验总结…...
Redis5主备安装-Redis
本次Redis有两台服务器及3个独立IP:主服务器的ip地址是192.168.31.190,从服务器的IP地址是192.168.31.191,vipIP地址是192.168.31.216 主备方案承载Redis最大的好处是无需考虑Redis崩后无法访问。 前提是需要优先安装keepalived,…...

C++票据查验、票据ocr、文字识别
现在,80、90后的人们逐渐过渡为职场上的主力人员,在工作中当然也会碰到各种各样的问题。比如,当你的老板给你一个艰难的任务时,肯定是不能直接拒绝的。那么我们该怎么做呢?翔云建议您先认真考虑老板说的任务的难度&…...
pytest.ini介绍
1.pytest.ini是什么 ? pytest.ini文件是pytest的主配置文件;pytest.ini文件的位置一般放在项目的根目录下,不能随便放,也不能更改名字。在pytest.ini文件中都是存放的一些配置选项 ,这些选项都可以通过pytest -h查看到…...
Vue项目打包成桌面应用
Vue项目打包成桌面应用 一、使用 NW.js 打包 NW.js基于Chromium和Node.js。它允许您直接从浏览器调用Node.js代码和模块,并在应用程序中使用Web技术。此外,您可以轻松地将web应用程序打包为本机应用程序。 NW官网...
DEFAULT_JOURNAL_IOPRIO
/* * 这些是 CFQ(完全公平排队)实现的 I/O 优先级组。 RT 是实时类,它总是能获得优质服务。 BE 是尽力而为的调度类,是任何进程的默认类别。 IDLE 是空闲调度类,只有在没有其他人使用磁盘时才会被服务。 */ /* *…...

【阿卡迈防护分析】Vueling航空Akamai破盾实战
文章目录 1. 写在前面2. 风控分析3. 破盾实战 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python…...

使用AWS Lambda轻松开启Amazon Rekognition之旅
这是本系列文章的第一篇,旨在通过动手实践,帮助大家学习亚马逊云科技的生成式AI相关技能。通过这些文章,大家将掌握如何利用亚马逊云科技的各类服务来应用AI技术。 那么让我们开始今天的内容吧! 介绍 什么是Amazon Rekognition&…...

如何获取VS Code扩展的版本更新信息
获取VS Code 扩展的版本更新的需求 因为企业内部有架设私有扩展管理器的要求,但是对于一些官方市场的插件,希望可以自动获取这些扩展的更新并上传至私有扩展管理器。于是就有了本篇介绍的需求: 通过API的方式获取VS Code 扩展的更新。 关于…...

Python开源项目周排行 2024年第13周
#2024年第13周2024年8月5日1roop一款基于深度学习框架TensorFlow和Keras开发的单图换脸工具包,提供了丰富的功能和简洁易用的界面,使得用户可以轻松实现单图换脸操作。支持多张人脸替换成同一个人脸,勾选多人脸模式即可 人脸替换 高清修复自…...

day04--js的综合案例
1.1 商品全选 需求:商品全选 1. 全选 :点击全选按钮,所有复选框都被选中 2. 全不选 :点击全不选按钮,所有复选框都被取消选中 3. 反选 : 点击反选按钮,所有复选框状态取反 <!DOCTYPE html> <html lang"en">…...
【产品经理】定价策略
年初的时候,尝试自己独立运营了一个美团店铺,最终没有继续做下去了,原因是利润率太低,平台和骑手把利润拿走太多了,根本没有钱赚,烧钱搞流量更是深不见底。 不过也学到了很多东西,比如选品策略…...

webrtc学习笔记3
Nodejs实战 对于我们WebRTC项目而言,nodejs主要是实现信令服务器的功能,客户端和服务器端的交互我们选择websocket作为通信协议,所以以websocket的使用为主。 web客户端 websocket WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行…...

Transformer架构;Encoder-Decoder;Padding Mask;Sequence Mask;
目录 Transformer架构 Transformer架构的主要组成部分: 简单举例说明输入和输出: Encoder-Decoder 编码器/解码器组成 6、位置前馈网络(Position-wise Feed-Forward Networks) 7、残差连接和层归一化 10、掩码Mask 10.1 Padding Mask 10.2 Sequence Mask 为什么…...

【leetcode详解】特殊数组II : 一题代表了一类问题(前缀和思想)
前缀和的优势 给定一个数组,前缀和的特点在于,任意给出一对始末位置,能够用O(1)的时间复杂度得到始末位置之间所有元素的某种关系。 题型分析 这道题目正是“给出始末位置,检测其中元素特点”那一类,那我们就想&#…...

SQL每日一练-0814
今日SQL题难度:🌟☆☆☆☆☆☆☆☆☆ 1、题目要求 找出每个部门中薪资最高的员工显示部门ID、部门名称、员工ID、员工姓名以及对应的薪资 2、表和虚拟数据 现有两个表:Employees 和 Departments,记录了员工和部门信息。…...

Android持久化技术—文件存储
Android持久化技术—文件存储 文件存储是Android中最基本的一种数据存储方式,它不对存储的内容进行任何的格式化处理,所有数据都是原封不动地保存到文件当中的,因而它比较适合用于存储一些简单的文本数据或二进制数据。如果你想使用文件存储…...

动手学深度学习(pytorch)学习记录12-激活函数[学习记录]
激活函数 激活函数(activation function)通过计算加权和并加上偏置来确定神经元是否应该被激活, 它们将输入信号转换为输出的可微运算。 import torch import matplotlib.pyplot as plt 简单定义一个画图的函数 def graph_drawing(x_,y_…...

微服务实战系列之玩转Docker(十)
前言 我们知道Docker的“使命”是为了快速完成应用的迁移和部署。为提升它的战斗能力,Docker官方携手发布了Docker Swarm—— 一个快速完成Docker集群构建的利器。那么请先回忆一下本系列第八篇(重点compose)和第九篇(重点networ…...

深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...