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

LeifHomieLib:ESP32/8266轻量级Homie v3 MQTT设备库

1. LeifHomieLib 项目概述LeifHomieLib 是一个专为 ESP8266 和 ESP32 平台设计的轻量级 Homie v3 协议实现库其核心目标是为资源受限的物联网边缘节点提供符合 Homie 规范的 MQTT 设备抽象能力。该库并非 Homie v3 标准的全功能实现而是聚焦于与 openHAB 等主流 Home Automation 平台的互操作性在协议兼容性、内存占用与运行时开销之间取得工程化平衡。它不依赖特定网络栈支持三种主流 Arduino MQTT 客户端后端arduino-mqtt同步阻塞式、AsyncMqttClient异步非阻塞式和PangolinMQTT轻量级异步实现赋予开发者在实时性、功耗与代码复杂度之间的灵活选型权。Homie v3 协议本身定义了一套基于 MQTT 的设备发现与状态同步语义框架其核心价值在于解耦设备固件与上位控制平台——设备只需按约定 Topic 结构发布属性Property、设置节点Node状态并响应$homie层级的配置请求而 openHAB、Home Assistant 等平台则通过订阅固定前缀的 Topic 自动完成设备发现、元数据解析与双向控制。LeifHomieLib 的工程意义正在于此它将 Homie v3 的协议逻辑封装为可复用的 C 类库使嵌入式工程师无需手动拼接 Topic 字符串、解析 JSON 配置或维护状态同步状态机即可快速构建符合工业级 IoT 语义规范的智能终端。该库的“轻量”特性体现在三方面第一无动态内存分配new/malloc所有对象在编译期确定大小适用于 RAM 仅数十 KB 的 ESP8266第二不内置 JSON 解析器而是要求用户在回调中自行处理homie/$implementation或homie/$extensions等配置 Topic 的 payload避免引入ArduinoJson等重量级依赖第三采用事件驱动模型而非轮询仅在 MQTT 消息到达或定时器触发时执行最小必要逻辑空闲时可进入深度睡眠模式。这种设计哲学使其天然适配电池供电的传感器节点、低功耗网关等对能效比敏感的应用场景。2. Homie v3 协议核心机制与 LeifHomieLib 实现映射理解 LeifHomieLib 的工作原理必须首先掌握 Homie v3 协议的四个关键层级及其在库中的映射关系。Homie 将设备抽象为树状结构设备Device→ 节点Node→ 属性Property所有通信均通过 MQTT Topic 层级展开且严格遵循$前缀的系统 Topic 与普通 Topic 的分离原则。2.1 设备层级Device Level设备是 Homie 的根实体其唯一标识由homie/device-id构成。LeifHomieLib 通过HomieDevice类管理设备生命周期。初始化时需调用HomieDevice::begin(const char* deviceId, const char* name)其中deviceId必须满足 Homie 规范仅含小写字母、数字、连字符-和下划线_长度不超过 24 字符。该函数内部执行三项关键操作注册$homieTopic发布协议版本字符串3.0.1注册$nameTopic发布设备名称用于 openHAB UI 显示注册$stateTopic初始值设为init后续依序切换为ready→disconnected→sleeping。// 典型初始化流程以 AsyncMqttClient 为例 #include Homie.h #include AsyncMqttClient.h AsyncMqttClient mqttClient; HomieDevice homie(livingroom-sensor, Living Room Sensor); void setup() { Serial.begin(115200); // 初始化 WiFi 后... mqttClient.onConnect(onMqttConnect); mqttClient.onDisconnect(onMqttDisconnect); mqttClient.onMessage(onMqttMessage); homie.setMqttClient(mqttClient); // 绑定 MQTT 客户端 homie.begin(); // 发布 $homie, $name, $stateinit }2.2 节点层级Node Level节点是设备的功能模块单元如temperature、led或button。LeifHomieLib 使用HomieNode类封装节点行为。每个节点需在HomieDevice::begin()之后、HomieDevice::loop()之前注册调用homie.addNode(new HomieNode(temperature, sensor))。此处temperature为节点 IDTopic 路径段sensor为节点类型TypeopenHAB 依据 Type 决定 UI 控件样式如温度传感器显示为数值仪表。节点的核心职责是声明其包含的属性Property。LeifHomieLib 提供两种属性注册方式只读属性Read-Only通过addProperty()注册仅支持settable false设备单向上报数据可写属性Settable通过addProperty()注册并设置settable true平台可向device-id/node-id/property-id/setTopic 发布指令触发设备回调。// 定义温度节点及其属性 HomieNode temperatureNode(temperature, sensor); HomieProperty temperatureProp(celsius, float, °C); // ID, DataType, Unit void setup() { // ... MQTT 初始化 temperatureProp.settable(false); // 只读 temperatureNode.addProperty(temperatureProp); homie.addNode(temperatureNode); // 定义 LED 节点可写 HomieNode ledNode(led, actuator); HomieProperty ledProp(state, boolean, ); ledProp.settable(true); ledProp.setHandler(ledHandler); // 设置写入回调 ledNode.addProperty(ledProp); homie.addNode(ledNode); } // LED 状态变更回调 void ledHandler(const HomieProperty property, const String value) { bool state value true; digitalWrite(LED_PIN, state ? LOW : HIGH); // ESP32/8266 电平逻辑 // 回写确认值到 /led/state Topic ledProp.send(value); }2.3 属性层级Property Level属性是 Homie 的数据原子单元对应具体传感器读数或执行器状态。LeifHomieLib 的HomieProperty类封装了属性的元数据ID、DataType、Unit、Retained与数据流send()、setHandler()。其 DataType 必须为 Homie v3 预定义类型string、integer、float、boolean、color、datetime库在send()时自动进行类型校验与格式化如float转为23.45字符串。关键工程细节在于QoS 与 Retain 标志所有$开头的系统 Topic$homie,$name,$nodes必须以 QoS 1 Retain true 发布确保平台断线重连后能立即获取设备元数据普通属性 Topic如livingroom-sensor/temperature/celsius默认 QoS 0 Retain false若需状态持久化如开关状态需显式调用property.setRetained(true)。// 强制温度属性为 Retained避免平台重启后丢失最新值 temperatureProp.setRetained(true); // 在 loop() 中周期性上报 void loop() { homie.loop(); // 处理 MQTT 底层事件 static unsigned long lastReport 0; if (millis() - lastReport 2000) { float temp readTemperature(); // 用户自定义读取函数 temperatureProp.send(String(temp, 2)); // 发送 23.45 lastReport millis(); } }2.4 系统 Topic 交互机制Homie v3 要求设备响应两类系统 Topic 请求$stats平台查询设备统计信息内存、UptimeLeifHomieLib 默认不实现需用户重载HomieDevice::onStatsRequest()$implementation平台下发固件更新指令或自定义扩展LeifHomieLib 通过HomieDevice::onImplementationRequest()回调暴露接口用户在此解析 JSON payload 并执行 OTA 或配置更新。// 响应 $implementation 请求示例处理固件升级指令 void onImplementationRequest(const String payload) { // payload 示例: {ota: {url: http://example.com/firmware.bin}} // 此处需集成 ESPAsyncWebServer 或 HTTPClient 进行 OTA Serial.print(Received implementation request: ); Serial.println(payload); // 解析 JSON需额外引入 ArduinoJson // DynamicJsonDocument doc(512); // deserializeJson(doc, payload); // if (doc.containsKey(ota)) { ... } } void setup() { // ... 其他初始化 homie.onImplementationRequest(onImplementationRequest); }3. 三大 MQTT 客户端后端集成详解LeifHomieLib 的架构设计明确分离协议逻辑与网络传输层通过抽象接口HomieMqttClient实现多后端支持。开发者需根据项目需求选择合适客户端并完成三步绑定包含头文件 → 声明客户端实例 → 调用setMqttClient()。3.1 arduino-mqtt同步阻塞式arduino-mqtt是最简化的 MQTT 客户端基于WiFiClient同步收发适合对实时性要求不高、代码体积敏感的场景。其优势在于零依赖、编译后 Flash 占用最小约 12KB但缺点是loop()中mqttClient.loop()会阻塞直至网络 I/O 完成影响其他任务调度。#include Homie.h #include PubSubClient.h // arduino-mqtt 依赖此库 WiFiClient wifiClient; PubSubClient mqttClient(wifiClient); void setup() { // 初始化 WiFi WiFi.begin(SSID, PASSWORD); while (WiFi.status() ! WL_CONNECTED) delay(500); mqttClient.setServer(broker.hivemq.com, 1883); homie.setMqttClient(mqttClient); homie.begin(); } void loop() { if (!mqttClient.connected()) reconnect(); mqttClient.loop(); // 同步阻塞调用 homie.loop(); // 协议逻辑处理 }3.2 AsyncMqttClient异步非阻塞式AsyncMqttClient是 ESP32/ESP8266 最推荐的后端利用硬件 TCP/IP 栈的异步事件机制loop()中仅做事件分发无任何阻塞。其回调函数onConnect,onMessage在 WiFi 事件循环中执行完美契合 FreeRTOS 任务调度。需注意AsyncMqttClient的onMessage回调中禁止调用delay()或长时间运算应将耗时操作投递至 FreeRTOS 队列。#include Homie.h #include AsyncMqttClient.h AsyncMqttClient mqttClient; void onMqttConnect(bool sessionPresent) { Serial.println(Connected to MQTT.); homie.onMqttConnect(sessionPresent); // 通知 LeifHomieLib } void onMqttMessage(char* topic, char* payload, size_t len) { // 将 MQTT 消息转发给 LeifHomieLib 处理 homie.onMqttMessage(topic, payload, len); } void setup() { // 初始化 WiFi WiFi.begin(SSID, PASSWORD); while (WiFi.status() ! WL_CONNECTED) delay(500); mqttClient.onConnect(onMqttConnect); mqttClient.onDisconnect(onMqttDisconnect); mqttClient.onMessage(onMqttMessage); mqttClient.setServer(broker.hivemq.com, 1883); homie.setMqttClient(mqttClient); homie.begin(); } void loop() { // 无需调用 mqttClient.loop() —— 由底层事件循环自动触发 homie.loop(); }3.3 PangolinMQTT轻量级异步式PangolinMQTT是专为超低资源设备优化的异步客户端其核心创新在于使用静态环形缓冲区替代动态内存分配MQTT 报文解析采用状态机而非递归栈空间占用恒定 256 字节支持 MQTT v3.1.1 协议子集无遗嘱消息、无主题别名精简代码体积至 8KB 以内。#include Homie.h #include PangolinMQTT.h PangolinMQTT mqttClient; void onMqttEvent(PangolinMQTT::Event event, const char* topic, const uint8_t* payload, size_t len) { switch (event) { case PangolinMQTT::CONNECTED: homie.onMqttConnect(true); break; case PangolinMQTT::MESSAGE: // 转换为 Homie 期望的 char* 格式 char t[128]; strncpy(t, topic, sizeof(t)-1); t[sizeof(t)-1] \0; char p[256]; memcpy(p, payload, min(len, sizeof(p)-1)); p[min(len, sizeof(p)-1)] \0; homie.onMqttMessage(t, p, len); break; } } void setup() { // 初始化 WiFi WiFi.begin(SSID, PASSWORD); while (WiFi.status() ! WL_CONNECTED) delay(500); mqttClient.onEvent(onMqttEvent); mqttClient.connect(broker.hivemq.com, 1883); homie.setMqttClient(mqttClient); homie.begin(); }4. 与 openHAB 的深度集成实践LeifHomieLib 与 openHAB 的协同并非自动完成需在 openHAB 端进行显式配置。其集成本质是 openHAB 的 MQTT Binding 对 Homie Topic 结构的模式匹配。以下为生产环境验证的配置步骤4.1 openHAB MQTT Binding 配置在services/mqtt.cfg中定义 Broker# MQTT Broker 配置 homieBroker.urltcp://broker.hivemq.com:1883 homieBroker.clientIdopenhab-homie homieBroker.user homieBroker.password4.2 Things 定义homie.things使用 Homie Discovery 自动创建 Thing需启用homiediscovery strategy// 自动发现 livingroom-sensor 设备 Bridge mqtt:broker:homieBroker Homie Broker [ hostbroker.hivemq.com, port1883 ] { Thing topic livingroom-sensor Living Room { Channels: Type number : temperature_celsius Temperature [ stateTopiclivingroom-sensor/temperature/celsius, transformationPatternJSONPATH:$.value ] Type switch : led_state LED State [ stateTopiclivingroom-sensor/led/state, commandTopiclivingroom-sensor/led/state/set ] } }4.3 Items 映射homie.items将 Thing Channel 绑定到 openHAB Item实现 UI 控制Number LivingRoom_Temperature Temperature [%.1f °C] temperature (gTemperature) { channelmqtt:topic:homieBroker:livingroom-sensor:temperature_celsius } Switch LivingRoom_LED LED light (gLight) { channelmqtt:topic:homieBroker:livingroom-sensor:led_state }4.4 关键调试技巧当 openHAB 无法发现设备时按以下顺序排查抓包验证 Topic 发布使用mosquitto_sub -t homie/# -v订阅所有 Homie Topic确认设备是否发布$homie,$name,$nodes检查 Topic 权限openHAB MQTT Binding 默认不订阅$开头 Topic需在mqtt.things中显式添加stateTopic$homie验证 Retain 标志mosquitto_sub -t livingroom-sensor/$homie -R-R表示只接收 Retained 消息若无输出说明设备未正确设置 Retain日志级别调优在services/logging.cfg中增加org.openhab.binding.mqttDEBUG观察 Binding 是否收到消息。5. 生产级增强实践LeifHomieLib 基础功能已足够支撑多数场景但在工业部署中需补充以下增强措施5.1 断线自动重连与状态同步设备网络中断后openHAB 的$state会变为disconnected但重连时需主动恢复所有属性值否则平台显示陈旧数据。LeifHomieLib 提供onMqttConnect()回调应在其中重新发送关键属性void onMqttConnect(bool sessionPresent) { Serial.println(MQTT Reconnected.); // 重发所有 Retained 属性确保平台状态同步 temperatureProp.send(String(readTemperature(), 2)); ledProp.send(digitalRead(LED_PIN) LOW ? true : false); }5.2 低功耗深度睡眠集成对于电池供电节点可结合 ESP32 的esp_sleep_enable_timer_wakeup()实现定时唤醒上报。关键是在睡眠前调用homie.disconnect()清理 MQTT 状态并在唤醒后重新连接void enterDeepSleep(uint64_t time_us) { homie.disconnect(); // 主动断开 MQTT esp_sleep_enable_timer_wakeup(time_us); esp_deep_sleep_start(); // 进入深度睡眠 } void setup() { // ... 初始化 homie.begin(); // 首次上报后进入睡眠 temperatureProp.send(String(readTemperature(), 2)); enterDeepSleep(60 * 1000000ULL); // 睡眠 60 秒 }5.3 FreeRTOS 任务隔离ESP32在 ESP32 上可将 Homie 协议处理与传感器采集分离为独立任务提升实时性// Homie 任务专注 MQTT 通信 void homieTask(void* pvParameters) { for(;;) { homie.loop(); vTaskDelay(10 / portTICK_PERIOD_MS); // 10ms 调度间隔 } } // 传感器任务专注数据采集 void sensorTask(void* pvParameters) { for(;;) { float temp readTemperature(); temperatureProp.send(String(temp, 2)); vTaskDelay(2000 / portTICK_PERIOD_MS); // 2s 上报周期 } } void setup() { // ... 初始化 xTaskCreate(homieTask, HomieTask, 8192, NULL, 2, NULL); xTaskCreate(sensorTask, SensorTask, 4096, NULL, 3, NULL); }6. API 接口速查表类名方法参数作用备注HomieDevicebegin(const char*, const char*)deviceId,name初始化设备发布$homie,$name,$stateinit必须在setup()中调用addNode(HomieNode*)节点指针将节点注册到设备树必须在begin()后、loop()前调用setMqttClient(HomieMqttClient*)MQTT 客户端指针绑定网络后端支持PubSubClient,AsyncMqttClient,PangolinMQTTonImplementationRequest(callback)回调函数注册$implementation请求处理器用于 OTA 或扩展配置HomieNodeaddProperty(HomieProperty*)属性指针将属性添加到节点一个节点可含多个属性HomiePropertysend(const String)值字符串发布属性值到device/node/propTopic自动处理 DataType 格式化settable(bool)true/false设置属性是否可被平台写入true时需配合setHandler()setHandler(handler)回调函数设置属性写入处理器回调中应调用send()确认值setRetained(bool)true/false设置属性 Topic 是否 Retained影响平台断线重连后状态恢复LeifHomieLib 的价值不在于功能堆砌而在于以极简接口承载工业级协议语义。当一个温湿度传感器节点在 openHAB 中自动呈现为带单位、可图表化的数据源当一条 MQTT 指令毫秒级点亮远端 LED工程师所面对的不再是裸露的 Topic 字符串与字节流而是经过 Homie v3 协议锤炼的、可预测的、可组合的设备抽象。这种抽象层次的跃迁正是嵌入式物联网从“能用”走向“好用”的关键一跃。

相关文章:

LeifHomieLib:ESP32/8266轻量级Homie v3 MQTT设备库

1. LeifHomieLib 项目概述LeifHomieLib 是一个专为 ESP8266 和 ESP32 平台设计的轻量级 Homie v3 协议实现库,其核心目标是为资源受限的物联网边缘节点提供符合 Homie 规范的 MQTT 设备抽象能力。该库并非 Homie v3 标准的全功能实现,而是聚焦于与 openH…...

避坑指南:如何在torch 2.4.0 + CUDA 12.1环境下成功安装llamafactory及其依赖

深度避坑:PyTorch 2.4.0与CUDA 12.1环境下的Llamafactory全栈部署实战 当开发者尝试在PyTorch 2.4.0和CUDA 12.1环境下部署Llamafactory时,往往会陷入依赖地狱——从Torch版本误装到vllm模块缺失,每个环节都可能成为耗时数小时的深坑。本文将…...

告别手打公式!用SimpleTex截图转LaTeX+Axmath微调+Typora排版的保姆级教程

数学公式高效处理全流程:从截图识别到专业排版 每次在论文或笔记中插入复杂的数学公式时,你是否也经历过这样的痛苦?反复核对LaTeX代码中的每个括号,调整上下标位置,或是为了一个特殊符号翻遍文档。传统的手动输入方式…...

保姆级教程:在Ubuntu 20.04上搞定海思SS524/SS522 SDK编译与固件烧录

海思SS524/SS522开发实战:从零构建嵌入式Linux系统的完整指南 作为一名长期深耕嵌入式开发的工程师,我深知从零开始搭建一个完整的开发环境有多么令人头疼。特别是当你拿到一块全新的开发板,面对陌生的SDK和工具链时,那种既兴奋又…...

开发提效新组合:用Cursor生成代码片段,在快马一键集成与部署

最近在做一个数据整理的小工具时,发现了一个特别高效的工作流组合:先用Cursor快速生成核心代码片段,再用InsCode(快马)平台一键整合部署。整个过程就像搭积木一样顺畅,特别适合需要快速实现功能模块的场景。 需求分析 我们经常要处…...

Solidity 智能合约入门:从 0 到 1 编写第一个区块链合约

一、什么是 Solidity? Solidity 是一门面向以太坊虚拟机(EVM)、静态类型的高级编程语言,专门用于编写区块链上的智能合约。 简单来说: 智能合约 运行在区块链上的自动执行代码(无需第三方,代…...

Unity URDF导入终极指南:3步快速实现机器人仿真

Unity URDF导入终极指南:3步快速实现机器人仿真 【免费下载链接】URDF-Importer URDF importer 项目地址: https://gitcode.com/gh_mirrors/ur/URDF-Importer Unity URDF Importer是Unity Robotics官方推出的机器人模型导入工具,它能够让你在Unit…...

x265帧内预测实战:从35种模式到MPM优化的效率提升技巧

x265帧内预测深度优化:从35种模式到MPM的工程实践 在视频编码领域,HEVC标准相比前代H.264引入了更复杂的帧内预测机制,其中x265作为开源编码器实现,其帧内预测模块的优化直接影响编码效率。本文将深入剖析x265帧内预测的核心技术…...

LibreHardwareMonitor:5分钟掌握免费开源硬件监控的终极指南

LibreHardwareMonitor:5分钟掌握免费开源硬件监控的终极指南 【免费下载链接】LibreHardwareMonitor Libre Hardware Monitor, home of the fork of Open Hardware Monitor 项目地址: https://gitcode.com/GitHub_Trending/li/LibreHardwareMonitor 想要实时…...

【YOLOv11工业级实战】35. DeepStream集成实战——构建高并发视频分析管道

摘要:在智慧交通、智慧工地等工业场景中,多路高清视频的实时分析面临高并发、低延迟、低资源占用的核心诉求。传统PyTorch逐帧推理方案因CPU解码瓶颈、内存拷贝频繁等问题,无法满足500路以上视频流的并发处理需求。本文以NVIDIA DeepStream框架为核心,结合YOLOv11目标检测模…...

ElasticSearch集群搭建步骤

文章目录一、前言二、使用 RPM 安装 Elasticsearch导入 Elasticsearch GPG 密钥从 RPM 存储库安装三、设置基本安全性生成证书使用TLS加密节点间通信四、为 Elasticsearch 加密 HTTP 客户端通信五、配置集群编辑 elasticsearch.yml(通用配置)关键性能参数…...

智能变电站实战:如何用SCL配置文件搞定IED设备联调(附避坑案例)

智能变电站实战:SCL配置文件在IED设备联调中的关键作用与避坑指南 在智能变电站的工程实施中,设备联调环节往往成为项目进度的"拦路虎"。据统计,超过60%的现场调试时间消耗在IED设备间的通信配置问题上。SCL(Substation…...

如何在5分钟内将网页SVG完美保存为可编辑矢量文件?

如何在5分钟内将网页SVG完美保存为可编辑矢量文件? 【免费下载链接】svg-crowbar Extracts an SVG node and accompanying styles from an HTML document and allows you to download it all as an SVG file. 项目地址: https://gitcode.com/gh_mirrors/sv/svg-cr…...

告别ZooKeeper!ClickHouse Keeper双机集群搭建全攻略(含常见报错解决方案)

ClickHouse Keeper双机集群实战指南:从零搭建到故障排查 1. 为什么选择ClickHouse Keeper替代ZooKeeper 在ClickHouse集群架构中,协调服务一直扮演着关键角色。传统方案依赖ZooKeeper实现分布式协调,但这种方式存在几个明显痛点: …...

Repomix Git日志集成:掌握commit历史分析的终极指南

Repomix Git日志集成:掌握commit历史分析的终极指南 【免费下载链接】repomix 📦 Repomix (formerly Repopack) is a powerful tool that packs your entire repository into a single, AI-friendly file. Perfect for when you need to feed your codeb…...

手把手教你用Matlab Simulink搭建闭环Buck电路:从PID调参到负载突变分析

从零构建闭环Buck电路:Simulink实战与PID调参全解析 电力电子工程师的日常工作中,Buck降压电路的设计与调试是基础中的基础。但真正让一个新手头疼的,往往不是电路拓扑本身,而是如何通过仿真快速验证设计,特别是当引入…...

新手避坑指南:用Prometheus+PX4+ROS在Gazebo里复现无人机追踪小车(保姆级流程)

新手避坑指南:用PrometheusPX4ROS在Gazebo里复现无人机追踪小车(保姆级流程) 当第一次接触无人机仿真开发时,很多人会被复杂的工具链和晦涩的错误信息劝退。本文将手把手带你完成从零搭建仿真环境到实现视觉追踪的全过程&#xff…...

用腾讯云轻量锐驰和对象存储,手把手教你30分钟搞定私人不限速网盘(附SSL证书配置)

零基础30分钟搭建高性能私人网盘:腾讯云轻量锐驰对象存储实战指南 你是否也受够了公有网盘动辄几百KB的下载速度?每次分享文件给朋友,对方总要忍受龟速下载的煎熬。更别提那些突然消失的文件和频繁弹出的会员广告——是时候拥有一个完全自主掌…...

brpc连接池动态调整算法:基于排队理论的设计与实现

brpc连接池动态调整算法:基于排队理论的设计与实现 【免费下载链接】brpc brpc is an Industrial-grade RPC framework using C Language, which is often used in high performance system such as Search, Storage, Machine learning, Advertisement, Recommendat…...

新手福音:免安装claude code,在快马平台开启你的ai编程第一课

作为一个刚接触编程的新手,最近想尝试用AI辅助写代码,但光是安装本地工具就让我头疼不已。直到发现了InsCode(快马)平台,才发现原来AI编程可以这么简单——不用配环境、不用解决依赖冲突,打开网页就能直接开玩。今天就把我的入门体…...

基于模糊PID的水下航行器运动控制系统研究——Matlab 2016b及以上软件应用、课程报告...

基于模糊PID的水下航行器运动控制系统研究 1.适用软件Matlab 2016b及以上 2.课程报告6500字左右共16页 3.课程报告小报告仿真仿真视频 4.请结合以下图片水下航行器的运动控制一直是海洋工程领域的热门课题。面对复杂多变的洋流扰动和强非线性的水动力特性,传统PID控…...

如何使用Postman,通过Mock的方式测试我们的API

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 这篇文章将教会大家如何利用 postman,通过 Mock 的方式测试我们的 API。什么是 MockMock 是一项特殊的测试技巧,可以在没有依赖项的情况下进…...

Deepfake Offensive Toolkit Docker部署:跨平台解决方案详解

Deepfake Offensive Toolkit Docker部署:跨平台解决方案详解 【免费下载链接】dot The Deepfake Offensive Toolkit 项目地址: https://gitcode.com/gh_mirrors/dot/dot Deepfake Offensive Toolkit(简称dot)是一款功能强大的深度学习…...

源网荷储全场景适配:新型电力系统时序数据库落地指南

新型电力系统应该用什么数据库?源网荷储四侧的时序数据库选型与落地实战 “双碳”目标的推进正在深刻重构电力系统的运行逻辑。新能源装机占比持续攀升,储能、虚拟电厂、需求响应等新业态快速涌现,源、网、荷、储各侧的角色与互动方式正在被…...

手把手教你用STM32F103驱动ST7565R芯片的JLX12864G屏幕(附取模工具配置)

STM32F103驱动ST7565R液晶屏的深度开发指南 在嵌入式显示领域,128x64分辨率的单色液晶屏因其性价比高、接口简单而广受欢迎。本文将深入探讨基于STM32F103微控制器驱动ST7565R芯片的JLX12864G液晶屏的完整技术方案,从硬件连接到高级显示功能的实现&#…...

二进制入门及其运算

二进制,十进制以及它们之间的转换- 十进制:我们日常生活中最常用的计数系统是\它的基数是10,使用0 - 9这十个数字来表示数。每个数位的权重是10的幂次方,从右往左依次是10⁰、10、10等。例如,数字234可以表示为210 310 410⁰。- 二进制:是计算机科学中广泛使用的计数系统。它的…...

突破传统:用Arduino SI4735库打造全频段数字收音机方案

突破传统:用Arduino SI4735库打造全频段数字收音机方案 【免费下载链接】SI4735 SI473X Library for Arduino 项目地址: https://gitcode.com/gh_mirrors/si/SI4735 你是否曾梦想过亲手打造一台能接收全球广播的专业收音机?面对传统模拟电路的复杂…...

OpenRocket全栈实战手册:从仿真引擎到航天教育生态构建

OpenRocket全栈实战手册:从仿真引擎到航天教育生态构建 【免费下载链接】openrocket Model-rocketry aerodynamics and trajectory simulation software 项目地址: https://gitcode.com/GitHub_Trending/op/openrocket 价值定位:重新定义航天工程…...

Path of Building:流放之路玩家必备的终极Build规划神器

Path of Building:流放之路玩家必备的终极Build规划神器 【免费下载链接】PathOfBuilding Offline build planner for Path of Exile. 项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding 如果你正在玩《流放之路》并为复杂的Build规划感到头…...

PingFangSC 字体技术深度解析:现代Web字体架构实践指南

PingFangSC 字体技术深度解析:现代Web字体架构实践指南 【免费下载链接】PingFangSC PingFangSC字体包文件、苹果平方字体文件,包含ttf和woff2格式 项目地址: https://gitcode.com/gh_mirrors/pi/PingFangSC PingFangSC(苹方-简&#…...