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

通讯协议开发实战:从零到一打造企业级通信解决方案

简介

从工业控制到物联网,掌握主流通信协议开发是构建现代智能系统的核心能力。本文将通过深入分析CAN FD和MQTT两种关键协议的原理、特性及应用场景,结合TypeScript和Node.js技术栈,设计一个完整的实时运动控制系统开发案例。从协议解析到数据转换,再到系统集成,全程提供详细代码示例和完整开发流程,帮助读者快速掌握企业级通信协议开发技能。


一、协议基础知识与技术选型

通信协议是计算机网络中实现数据交换和通信的基础规则,根据应用场景不同,可分为多种类型。在工业自动化和物联网领域,CAN FD和MQTT协议因其各自独特的优势而备受青睐。

CAN FD(Controller Area Network with Flexible Data-rate)是CAN协议的扩展版本,它在保持原有CAN协议高可靠性、实时性和抗干扰能力的同时,显著提升了数据传输速率和容量。CAN FD支持高达5-8Mbps的数据传输速率,数据帧长度从传统CAN的8字节扩展到64字节,同时采用了更高级的错误检测机制(17或21位CRC校验)。这些改进使得CAN FD成为工业机器人控制、高精度运动控制、汽车电子等高数据量场景的理想选择。

MQTT(Message Queuing Telemetry Transport)则是一种轻量级的发布/订阅模式消息传输协议,专为物联网设备设计。MQTT协议具有低带宽占用、高可靠性、支持多种服务质量(QoS)级别等特点,特别适合网络带宽有限、设备资源受限的物联网环境。在工业物联网中,MQTT广泛应用于传感器数据采集、设备监控和远程控制等场景。

在企业级开发中,协议的选择需综合考虑数据量、实时性、可靠性及网络环境等多方面因素。对于需要高速率、大数据量传输且实时性要求高的场景,如工业机器人控制或智能驾驶模块,CAN FD是更合适的选择;而对于设备数量庞大、网络条件不稳定、注重消息可靠性的物联网场景,MQTT则更具优势。本文将设计一个同时兼容这两种协议的系统集成案例,展示如何将CAN FD的高速实时通信与MQTT的轻量可靠传输相结合,构建一个完整的工业物联网解决方案。


二、CAN FD协议解析实战

CAN FD协议解析是实现通信功能的基础,需要准确理解其帧结构和工作原理。CAN FD帧结构包含七个部分:帧起始(SOF)、仲裁段、控制段、数据段、CRC段、ACK段和帧结束(EOF)。其中控制段是CAN FD与传统CAN的主要区别所在,新增了FDF、BRS和ESI三个位:

  1. FDF位(Flexible Data Rate Format):原CAN数据帧中的保留位r。表示CAN报文还是CAN FD报文,FDF位常为隐性(1),表示CAN FD报文。

  2. BRS位(Bit Rate Switch):表示位速率转换,当BRS为显性位(0)时数据段的位速率与仲裁段的位速率一致(恒定速率),当BRS为隐性位(1)时速率可变(即BSR到CRC使用转换速率传输)。

  3. ESI位(Error State Indicator):发送节点错误状态指示,主动错误时发送显性位(0),被动错误时发送隐性位(1)。

由于CAN FD帧结构较为复杂,手动解析需要深入理解位操作和帧格式。在TypeScript中,可以通过定义CAN FD帧结构接口和实现解析函数来完成这一过程。以下是一个完整的CAN FD帧解析实现:

// 定义CAN FD帧结构接口
interface CANFDFrame {can_id: number;flags: number; // 包含FDF、BRS、ESI等标志位len: number;data: Uint8Array;
}// 解析CAN FD帧的函数
function parseCANFDFrame(buffer: Uint8Array): CANFDFrame | null {if (buffer.length < 12) {console.error("CAN FD帧长度不足");return null;}// 解析CAN ID(12位)const can_id = buffer[0] << 8 | buffer[1];// 解析标志位(包含FDF、BRS、ESI)const flags = buffer[2];// 解析数据长度(0-64字节)const len = buffer[3];// 解析数据段const data = buffer.slice(4, 4 + len);return {can_id,flags,len,data};
}// 示例:解析包含传感器数据的CAN FD帧
const sampleBuffer = new Uint8Array([0x01, 0x23, 0x45, 0x08, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA
]);
const parsedFrame = parseCANFDFrame(sampleBuffer);
if (parsedFrame) {console.log("解析结果:", parsedFrame);
}

在实际开发中,理解CAN FD的位填充规则和错误检测机制同样重要。CAN FD在传输数据时,每5个相同位会插入一个反向位,这会影响帧的实际传输时间。例如,传输全为0x00的数据(00000000B)需要插入大量反向位,传输时间会更长;而传输0x55或0xAA(00010101010B)的数据几乎不需要额外位填充,传输时间更短。


三、MQTT协议与Protobuf数据转换

在物联网开发中,MQTT协议与Protobuf数据格式的结合能提供高效、可靠且类型安全的数据传输。Protobuf是一种二进制序列化协议,相比JSON具有更小的数据体积和更快的解析速度,特别适合资源受限的物联网设备。

首先,需要定义Protobuf消息结构。以下是一个简单的传感器数据Protobuf定义:

syntax = "proto3";package sensor;message SensorData {string device_id = 1;string sensor_type = 2;double value = 3;int64 timestamp = 4;
}

接下来,在TypeScript中使用protobufjs库进行数据编码和解码:

import * as protobuf from "protobufjs";// 加载Protobuf文件
const root = protobuf.loadSync("sensor.proto");
const SensorData = root.lookupType("sensor.SensorData");// 序列化数据
const data = SensorData.create({device_id: "device_001",sensor_type: "temperature",value: 25.5,timestamp: Date.now()
});// 序列化为Buffer
const buffer = SensorData.encode(data).finish();// 解码数据
const decoded = SensorData.decode(buffer);
console.log("解码结果:", decoded);

将Protobuf数据通过MQTT传输需要以下步骤:

安装MQTT客户端库

npm install @types/mqtt

建立MQTT连接并发布消息

import * as mqtt from "mqtt";// 连接MQTT Broker
const client = mqtt.connect("mqtt://broker.hivemq.com");// 连接成功后发布消息
client.on("connect", () => {// 每秒发布一次传感器数据setInterval(() => {const data = SensorData.create({device_id: "device_001",sensor_type: "temperature",value: Math.random() * 30,timestamp: Date.now()});const buffer = SensorData.encode(data).finish();// 发布到指定主题client.publish("sensor/data", buffer, { qos: 1 });}, 1000);
});

订阅并处理消息

// 订阅指定主题
client.subscribe("sensor/data", { qos: 1 });// 处理接收到的消息
client.on("message", (topic, message) => {if (topic === "sensor/data") {try {const decoded = SensorData.decode(message);console.log("收到传感器数据:", decoded);} catch (error) {console.error("解码失败:", error);}}
});

在企业级开发中,数据验证和类型安全至关重要。TypeScript的静态类型检查能有效减少运行时错误,而Protobuf的严格数据结构定义则确保了传输数据的完整性。通过结合TypeScript和Protobuf,可以构建出高可靠性的数据转换层,为后续的系统集成打下坚实基础。


四、构建边缘计算网关服务

在工业物联网中,边缘计算网关扮演着连接现场设备与云端平台的关键角色。以下是一个基于Node.js和TypeScript的CAN FD到MQTT的网关服务实现:

import * as can from "socketcan"; // 假设使用socketcan驱动
import * as mqtt from "mqtt";
import * as protobuf from "protobufjs";// 加载Protobuf文件
const root = protobuf.loadSync("sensor.proto");
const SensorData = root.lookupType("sensor.SensorData");// 连接CAN FD总线
const bus = can.createBus("can0", { bustype: "socketcan", bitrate: 1000000 });// 连接MQTT Broker
const client = mqtt.connect("mqtt://broker.hivemq.com");// 解析CAN FD帧并转换为Protobuf
function canfdToMqtt(frame: can.Frame) {// 解析CAN FD帧const parsedFrame = parseCANFDFrame(frame.data);if (!parsedFrame) {console.error("CAN FD帧解析失败");return;}// 提取传感器数据(假设前4字节为温度,后4字节为压力)const temperature = parsedFrame.data.subarray(0, 4).reduce((acc, val) => acc * 256 + val, 0);const pressure = parsedFrame.data.subarray(4, 8).reduce((acc, val) => acc * 256 + val, 0);// 创建Protobuf消息const sensorData = SensorData.create({device_id: "device_001",sensor_type: "temperature",value: temperature,timestamp: Date.now()});// 序列化为Buffer并发布const buffer = SensorData.encode(sensorData).finish();client.publish("sensor/data", buffer, { qos: 1 });
}// 监听CAN FD总线
bus.on("message", canfdToMqtt);// 处理错误
bus.on("error", (error) => {console.error("CAN FD总线错误:", error);
});// 保持连接
setInterval(() => {client.publish("sensor/online", "online", { qos: 0 });
}, 10000);

该网关服务实现了从CAN FD到MQTT的完整数据转换流程:首先通过CAN FD总线接收实时设备数据,然后解析帧结构提取关键参数,接着将数据转换为Protobuf格式以减少传输开销,最后通过MQTT协议将数据发送到云端平台。这种架构既能利用CAN FD的高速实时通信能力,又能借助MQTT的轻量可靠传输特性,满足工业物联网的多样化需求。


五、系统集成与云平台对接

在实际企业级应用中,通信协议往往需要与云平台、数据库及其他系统进行深度集成。以下是一个将MQTT数据接入阿里云物联网平台的示例:

企业级协议开发需要严格的测试和性能优化。CAN FD的高速率和大数据容量特性需要特别关注总线负载和网络稳定性;而MQTT的轻量高效特性则需要优化QoS级别选择和消息传输频率,以平衡系统性能和资源消耗。

随着技术的发展,企业级通信协议开发将更加注重类型安全、性能优化和系统集成。TypeScript等强类型语言将成为协议开发的主流选择,而边缘计算和云原生架构将重新定义通信协议的实现方式和部署模式。

 

通过遵循这些开发工具和最佳实践,可以构建出高质量的企业级通信协议解决方案,满足工业物联网的多样化需求。

  1.  创建阿里云设备并获取认证信息

    • 在阿里云物联网平台创建产品和设备,获取设备证书(ProductKey、DeviceName、DeviceSecret)。
    • 配置MQTT连接参数(如连接地址、端口、客户端ID)。
  2. 实现设备认证和安全连接

    import * as mqtt from "mqtt";
    import * as crypto from "crypto";// 阿里云设备认证参数
    const ProductKey = "a1B2c3d4e5";
    const DeviceName = "device_001";
    const DeviceSecret = "your_device_secret";
    const BrokerUrl = "tcp://iot-as-mqtts.cn-shanghai.aliyuncs.com:1883";// 生成MQTT客户端ID
    const ClientId = ProductKey + "/" + DeviceName + "/" + "timestamp";// 生成签名
    function generateSign(clientId: string, timestamp: number): string {const data = "clientId=" + clientId + "&timestamp=" + timestamp;const hash = crypto.createHmac("sha1", DeviceSecret).update(data).digest("hex");return hash;
    }// 连接到阿里云物联网平台
    const client = mqtt.connect(BrokerUrl, {username: ClientId,password: generateSign(ClientId, Date.now()),protocolId: "MQTT",protocolVersion: 4,clean: true
    });// 连接成功
    client.on("connect", () => {console.log("已连接到阿里云物联网平台");// 订阅控制指令主题client.subscribe("control指令主题", { qos: 1 });
    });// 接收控制指令
    client.on("message", (topic, message) => {if (topic === "control指令主题") {// 解码指令并执行控制逻辑const controlData = ControlData.decode(message);executeControlLogic(controlData);}
    });
  1. 实现双向通信

    • 从CAN FD总线接收传感器数据并通过MQTT上传到云端。
    • 从MQTT接收控制指令并通过CAN FD总线下发到设备。

系统集成是企业级通信协议开发的关键环节,需要考虑网络稳定性、数据安全性和系统可扩展性。通过边缘计算网关将现场设备与云端平台连接,可以实现数据的集中管理和远程控制,为工业物联网的智能化升级提供支持。


六、测试与部署实战

在协议开发完成后,需要进行全面的测试和部署。以下是测试和部署的关键步骤:

  1. CAN FD协议测试

    • 使用CAN分析仪(如Vector CANoe)捕获和解码CAN FD帧,验证帧结构和数据内容。
    • 测试不同数据长度(从8字节到64字节)和不同数据内容的传输性能。
    • 验证错误检测和恢复机制的有效性。
  2. MQTT协议测试

    • 使用MQTT客户端工具(如MQTTX)订阅和发布消息,验证连接稳定性。
    • 测试不同QoS级别的消息传输可靠性。
    • 验证遗言消息(Last Will)和会话持久化功能。
  3. 性能优化

    • 调整CAN FD总线的波特率和采样点,优化传输性能。
    • 优化Protobuf消息结构,减少数据传输体积。
    • 实现消息批量发送,提高MQTT传输效率。
  4. 部署注意事项

    • 确保CAN FD硬件驱动在目标设备上的兼容性。
    • 配置MQTT客户端的重连机制和心跳保持。
    • 实现设备认证和数据加密,确保通信安全。

企业级协议开发需要严格的测试和性能优化。CAN FD的高速率和大数据容量特性需要特别关注总线负载和网络稳定性;而MQTT的轻量高效特性则需要优化QoS级别选择和消息传输频率,以平衡系统性能和资源消耗。


七、开发工具与最佳实践

在企业级通信协议开发过程中,选择合适的工具和遵循最佳实践能显著提高开发效率和代码质量。

开发工具推荐

  1. CAN FD开发工具

    • Vector CANoe:专业的CAN/FD总线仿真和测试工具。
    • Wireshark with CAN dissector:用于网络协议分析和调试。
    • ADTF(AUTOMOTIVE DATA & TIME-TRIGGERED FRAMEWORK):支持CAN FD数据解析和可视化。
  2. MQTT开发工具

    • MQTTX:功能强大的MQTT客户端工具,支持Protobuf编解码。
    • EMQX:开源MQTT消息代理,适合测试和开发环境。
    • Mosquitto:轻量级MQTT Broker,广泛应用于物联网场景。

TypeScript最佳实践

  1. 类型安全:使用TypeScript的接口和类型定义确保数据结构的正确性。
  2. 模块化设计:将协议解析、数据转换和通信功能拆分为独立模块,提高代码复用性。
  3. 错误处理:实现完善的错误检测和恢复机制,确保系统稳定性。
  4. 性能优化:合理使用Protobuf的预生成代码功能,提升序列化和反序列化性能。

系统集成最佳实践

  1. 分层架构:采用清晰的分层设计(数据采集层、数据传输层、平台层、应用层)。
  2. 微服务架构:将不同功能拆分为独立的微服务,提高系统可扩展性。
  3. 容器化部署:使用Docker容器化部署网关服务,简化环境配置。
  4. 监控与日志:实现完善的系统监控和日志记录功能,便于故障诊断和性能优化。

通过遵循这些开发工具和最佳实践,可以构建出高质量的企业级通信协议解决方案,满足工业物联网的多样化需求。


八、未来发展趋势与技术展望

随着物联网和工业自动化技术的快速发展,通信协议也在不断演进。CAN FD和MQTT作为当前主流协议,未来也将面临新的挑战和机遇。

CAN FD未来发展趋势

  1. 速率进一步提升:随着汽车电子和工业自动化对数据传输速率需求的增加,CAN FD速率有望突破8Mbps。
  2. 与以太网融合:CAN FD正与以太网技术结合,形成更高效的车内和工业网络架构。
  3. 安全性增强:引入加密和认证机制,满足工业4.0和车联网的安全要求。
  4. 标准化扩展:ISO 11898系列标准将持续扩展,支持更多工业场景。

MQTT未来发展趋势

  1. MQTT 5.0普及:支持更多QoS级别和属性扩展,满足复杂物联网场景需求。
  2. 与边缘计算结合:在边缘节点实现MQTT消息的预处理和分析,减少云端负载。
  3. 安全性增强:通过TLS/SSL加密和认证机制,确保物联网设备的安全通信。
  4. 与5G技术融合:利用5G的低延迟和高带宽特性,优化MQTT在车联网和工业物联网中的表现。

企业级通信协议开发的未来方向

  1. 多协议融合:同时支持CAN FD、MQTT、OPC UA等多种协议,实现异构系统的无缝集成。
  2. AI驱动的协议优化:利用机器学习分析通信模式,动态优化协议参数和传输策略。
  3. 低功耗广域网(LPWAN)集成:将CAN FD和MQTT与NB-IoT、LoRa等LPWAN技术结合,扩展物联网应用场景。
  4. 云原生协议实现:在Kubernetes和Serverless架构中实现通信协议,提高系统弹性和可扩展性。

随着技术的发展,企业级通信协议开发将更加注重类型安全、性能优化和系统集成。TypeScript等强类型语言将成为协议开发的主流选择,而边缘计算和云原生架构将重新定义通信协议的实现方式和部署模式。


总结

本文通过从零到一的开发流程,深入探讨了CAN FD和MQTT两种主流通信协议的原理、实现和系统集成方法。从协议解析到数据转换,再到云平台对接,全程提供了详细的TypeScript代码示例和架构设计思路。通过构建边缘计算网关服务,实现了CAN FD与MQTT的无缝连接,为工业物联网的实时监控和控制提供了完整的解决方案。

企业级通信协议开发需要综合考虑协议特性、数据安全、系统集成和性能优化等多方面因素。CAN FD的高速率和大数据容量特性使其成为工业自动化和汽车电子的理想选择;而MQTT的轻量高效和类型安全特性则使其在物联网设备通信中占据主导地位。通过将这两种协议的优势相结合,可以构建出适应不同场景的通信解决方案。

随着工业物联网和智能网联汽车的发展,通信协议将在系统智能化、数据安全性和网络稳定性方面提出更高要求。TypeScript等强类型语言和边缘计算架构将成为未来通信协议开发的重要趋势。通过掌握本文介绍的开发方法和最佳实践,读者可以快速构建出高质量的企业级通信协议解决方案,为工业物联网的智能化升级提供技术支持。


技术要点

  • CAN FD帧结构:包含FDF、BRS和ESI三个关键位,支持64字节数据传输
  • MQTT协议特性:轻量高效、支持发布/订阅模式、三种QoS服务质量级别
  • TypeScript优势:静态类型检查、类型安全、代码可维护性和可扩展性
  • Protobuf数据转换:二进制序列化、减少传输体积、提高解析速度
  • 边缘计算网关:连接现场设备与云端平台、实现协议转换和数据预处理
  • 阿里云物联网平台:设备认证、数据存储、远程控制、监控与分析功能

</

相关文章:

通讯协议开发实战:从零到一打造企业级通信解决方案

简介 从工业控制到物联网,掌握主流通信协议开发是构建现代智能系统的核心能力。本文将通过深入分析CAN FD和MQTT两种关键协议的原理、特性及应用场景,结合TypeScript和Node.js技术栈,设计一个完整的实时运动控制系统开发案例。从协议解析到数据转换,再到系统集成,全程提供…...

《MATLAB实战训练营:从入门到工业级应用》工程实用篇-自动驾驶初体验:车道线检测算法实战(MATLAB2016b版)

《MATLAB实战训练营&#xff1a;从入门到工业级应用》工程实用篇-&#x1f697; 自动驾驶初体验&#xff1a;车道线检测算法实战&#xff08;MATLAB2016b版&#xff09; 大家好&#xff01;今天我要带大家一起探索自动驾驶中一个非常基础但又至关重要的技术——车道线检测。我…...

【网络】什么是串口链路(Serial Link)?

在路由器上&#xff0c;串口链路&#xff08;Serial Link&#xff09;就是指路由器之间通过串行接口&#xff08;serial interface&#xff09;和串行电缆&#xff08;通常是V.35、RS-232或同步串行线路&#xff09;直接点对点相连的那一段连线。它和我们平常在局域网里用的以太…...

为了结合后端而学习前端的学习日志——【黑洞光标特效】

前端设计专栏 今天给大家带来一个超酷的前端特效——黑洞光标&#xff01;让你的鼠标变成一个会吞噬光粒子的迷你黑洞&#xff0c;点击时还会喷射出绿色能量粒子&#xff01;&#x1f320; &#x1f680; 效果预览 想象一下&#xff1a;你的鼠标变成一个旋转的黑洞&#xff0…...

set autotrace报错

报错&#xff1a; SQL> set autotrace traceonly SP2-0618: Cannot find the Session Identifier. Check PLUSTRACE role is enabled SP2-0611: Error enabling STATISTICS report原因分析&#xff1a; 根据上面的错误提示“SP2-0618: Cannot find the Session Identifie…...

算法每日一题 | 入门-顺序结构-大象喝水

大象喝水 题目描述 一只大象口渴了&#xff0c;要喝 20 升水才能解渴&#xff0c;但现在只有一个深 h 厘米&#xff0c;底面半径为 r 厘米的小圆桶 &#xff08;h 和 r 都是整数&#xff09;。问大象至少要喝多少桶水才会解渴。 这里我们近似地取圆周率 π 3.14 \pi3.14 π…...

n8n 构建一个 ReAct AI Agent 示例

n8n 构建一个 ReAct AI Agent 示例 0. 引言1. 详细步骤创建一个 "When Executed by Another Workflow"创建一个 "Edit Fields (Set)"再创建一个 "Edit Fields (Set)"创建一个 HTTP Request创建一个 If 节点在 true 分支创建一个 "Edit Fiel…...

Scartch038(四季变换)

知识回顾 1.了解和简单使用音乐和视频侦测模块 2.使用克隆体做出波纹特效 3.取色器妙用侦测背景颜色 前言 我国幅员辽阔,不同地方的四季会有不同的美丽景色,这节课我带你使用程序做一个体现北方四季变化的程序 之前的程序基本都是好玩的,这节课做一个能够赏心悦目的程序。…...

【Linux】SELinux 的基本操作与防火墙的管理

目录 一、SELinux的管理 1.1 Linux 系统的安全机制 1.2 SELinux 的概述 1.3 SELinux 的配置 1.3.1 查看 SELinux 的工作方式 1.3.2 设置 SELinux 的工作方式 1.3.2.1 基于配置文件修改&#xff08;推荐方式&#xff09; 1.3.2.2 基于命令方式修改 二、防火墙管理 2.1 防…...

【React Hooks原理 - useCallback、useMemo】

useMemo用于缓存计算结果&#xff0c;它只在依赖项发生变化时重新计算 原理&#xff1a; 依赖项检查&#xff1a;useMemo接收2个参数&#xff0c;一个“创建”函数和一个依赖项数组。依赖项数组中的值在每次渲染时都会被比较&#xff0c;以决定是否需要重新计算 缓存机制&am…...

一格一格“翻地毯”找单词——用深度优先搜索搞定单词搜索

一格一格“翻地毯”找单词——用深度优先搜索搞定单词搜索 一、引子&#xff1a;别看题简单&#xff0c;实则套路深 说起“单词搜索”这个题目&#xff0c;初学者第一眼可能会说&#xff1a;“哦不就是个查字母吗&#xff1f;”其实&#xff0c;真没这么简单。 LeetCode 上那…...

深入了解 OpenIddict:实现 OAuth 2.0 和 OpenID Connect 协议的 .NET 库

在现代 Web 开发中&#xff0c;身份验证和授权是安全性的重要组成部分。随着对安全性的要求不断增加&#xff0c;OAuth 2.0 和 OpenID Connect&#xff08;OIDC&#xff09;协议已经成为许多应用程序的标准身份验证方式。而 OpenIddict&#xff0c;作为一个用于实现 OAuth 2.0 …...

学习黑客 TCP/IP

一句话总结&#xff1a;把 TCP/IP 看成大型多人在线游戏的“世界引擎”&#xff1a;链路层是地基&#xff0c;互联网层是道路&#xff0c;运输层是交通系统&#xff0c;应用层是景点与商店&#xff1b;协议们则是各种交通工具与技能&#xff08;TCP 稳重的长途客车&#xff0c…...

【沐风老师】3DMAX按元素UV修改器插件教程

3DMAX按元素UV修改器UV By Element是一个脚本化的修改器插件。对于需要创建随机化纹理效果的用户而言&#xff0c;3DMAX的UV By Element修改器无疑是一款高效工具&#xff0c;它将以伪随机量偏移、旋转和/或缩放每个元素的UV坐标。 【版本要求】 3dMax 2016及以上 【安装方法】…...

Jetpack Compose 边距终极指南:Margin 和 Padding 的正确处理方式

Jetpack Compose 边距终极指南&#xff1a;Margin 和 Padding 的正确处理方式 在 Android 开发中&#xff0c;Jetpack Compose 彻底改变了 UI 构建方式&#xff0c;但许多开发者对如何处理边距&#xff08;Margin/Padding&#xff09;感到困惑。本文将深入解析 Compose 的边距…...

Go语言--语法基础4--基本数据类型--类型转换

Go 是一种强类型的语言&#xff0c;所以如果在赋值的时候两边类型不一致会报错。一个类型的值可以被转换成另一种类型的值。由于 Go 语言不存在隐式类型转换&#xff0c;因此所有的类型转换都必须显式的声明。 强制类型转换语法 使用 type (a) 这种形式来进行强制类型转换&am…...

【C++ Qt】输入类控件(上) LineEdit、QTextEdit

每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” 绪论​&#xff1a; 本次分享聚焦 Qt 框架里常用的输入框组件&#xff0c;重点讲解 QLineEdit&#xff08;单行输入框&#xff09;和 QTextEdit&#xff08;多行输入框&…...

【c++深入系列】:万字详解vector(附模拟实现的vector源码)

&#x1f525; 本文专栏&#xff1a;c &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; 种子破土时从不问‘会不会有光’&#xff0c;它只管生长 ★★★ 本文前置知识&#xff1a; 模版 1.什么是vector 那么想必大家都学过顺…...

OpenHarmony平台驱动开发(二),CLOCK

OpenHarmony平台驱动开发&#xff08;二&#xff09; CLOCK 概述 功能简介 CLOCK&#xff0c;时钟是系统各个部件运行的基础&#xff0c;以CPU时钟举例&#xff0c;CPU 时钟是指 CPU 内部的时钟发生器&#xff0c;它以频率的形式工作&#xff0c;用来同步和控制 CPU 内部的各…...

Java大厂面试:Java技术栈中的核心知识点

Java技术栈中的核心知识点 第一轮提问&#xff1a;基础概念与原理 技术总监&#xff1a;郑薪苦&#xff0c;你对JVM内存模型了解多少&#xff1f;能简单说说吗&#xff1f;郑薪苦&#xff1a;嗯……我记得JVM有堆、栈、方法区这些区域&#xff0c;堆是存放对象的地方&#xf…...

硬件加速模式Chrome(Edge)闪屏

Chrome开启“硬件加速模式”后&#xff0c;打开浏览器会闪屏或看视频会闪屏&#xff0c;如果电脑只有集显&#xff0c;直接将这个硬件加速关了吧&#xff0c;没啥必要开着 解决方法 让浏览器使用独立显卡 在Windows左下角搜索 图形设置 &#xff0c;将浏览器添加进去&#…...

【ArcGIS微课1000例】0145:如何按照自定义形状裁剪数据框?

文章目录 一、添加数据二、绘制形状三、裁剪格网和经纬网一、添加数据 打开软件,添加配套实验数据包中0145.rar中的影像数据,如下图所示: 二、绘制形状 1. 在数据视图中,使用绘图 工具条上的新建圆工具 可创建一个椭圆,使其包含要在该数据框中显示的数据范围。 修改椭圆…...

深入了解Linux系统—— 环境变量

命令行参数 我们知道&#xff0c;我们使用的指令它本质上也是一个程序&#xff0c;我们要执行这个指令&#xff0c;输入指令名然后回车即可执行&#xff1b;但是对于指令带选项&#xff0c;又是如何实现的呢&#xff1f; 问题&#xff1a;main函数有没有参数&#xff1f; 在我…...

软考-软件设计师中级备考 12、软件工程

一、软件工程概述 定义&#xff1a;软件工程是一门研究用工程化方法构建和维护有效的、实用的和高质量软件的学科。它涉及到软件的开发、测试、维护、管理等多个方面&#xff0c;旨在运用一系列科学方法和技术手段&#xff0c;提高软件的质量和开发效率&#xff0c;降低软件开…...

FreeSwitch Windows安装

下载 FreeSwitch 官网下载地址https://files.freeswitch.org/windows/ 根据自己的系统选择不同的版本&#xff0c;如下图 官网下载可能比较慢&#xff0c;请使用下方下载 FreeSWITCH-1.10.12-Release-x64.msi https://download.csdn.net/download/a670941001/90752912 2、…...

南京优质的公司有哪些?

南京有许多优质的公司&#xff0c;以下是一些有代表性的&#xff1a; 制造业 • 南京钢铁集团有限公司 &#xff1a;作为国家战略布局的 18 家重点钢企之一&#xff0c;是中国特大型钢铁联合企业&#xff0c;1993 年 12 月进行公司制改革&#xff0c;2010 年 9 月实现整体上市…...

Spring AI 实战:第十一章、Spring AI Agent之知行合一

引言:智能体的知行辩证法 “知为行之始,行为知之成”,王阳明的哲学智慧在AI时代焕发光彩。智能体(LLM Agent)的进化之路,正是"认知-决策-执行"这一闭环的完美诠释: 知明理:融合大语言模型的推理能力与知识图谱的结构化认知行致用:基于ReAct模式的动态工具调…...

LeetCode 1128 等价多米诺骨牌对的数量 题解

今天的每日一题&#xff0c;我的思路还是硬做&#xff0c;不如评论区通过状压写的简单&#xff0c;但是答题思路加算法实现是没有问题的&#xff0c;且时间复杂度也是可以通过的&#xff0c;毕竟全是o(n) 那么我就来说一下我的思路&#xff0c;根据dominoes[i] [a, b] 与 domi…...

管理配置信息和敏感信息

管理配置信息和敏感信息 文章目录 管理配置信息和敏感信息[toc]一、什么是ConfigMap和Secret二、使用ConfigMap为Tomcat提供配置文件三、使用Secret为MongDB提供配置文件 一、什么是ConfigMap和Secret 在 Kubernetes 中&#xff0c;ConfigMap 和 Secret 是两种用于管理配置数据…...

Rust与C/C++互操作实战指南

目录 1.前言2.动态库调用2.1 动态加载2.2 静态加载3.代码调用4.静态库调用1.前言 本文原文为:Rust与C/C++互操作实战指南 由于rust诞生时间太短,目前生态不够完善,因此大量的功能库都需要依赖于C、C++语言的历史积累。 而本文将要介绍的便是如何实现rust与c乃至c++之间实…...

word批量转pdf工具

word批量转pdf工具 图片 说到了办公&#xff0c;怎能不提PDF转换哦&#xff1f; 这是一款一键就可以批量word转换为PDF的小工具&#xff0c;简直是VB界的一股清流。 图片 操作简单到不行&#xff0c;只要把需要转换的word文件和这个工具放在同一个文件夹里&#xff0c;双击…...

【数据结构】励志大厂版·初阶(复习+刷题)排序

前引&#xff1a;本篇作为初阶结尾的最后一篇—排序&#xff0c;将先介绍八种常用的排序方法&#xff0c;然后开始刷题&#xff0c;小编会详细注释每句代码的作用&#xff0c;不会出现看不懂的情况&#xff0c;这点大家放心&#xff0c;既是写给大家同时也是写给自己的&#xf…...

Git推送大文件导致提交回退的完整解决记录

问题背景 在向Gitee推送代码时&#xff0c;因单文件超过平台限制&#xff08;100MB&#xff09;&#xff0c;推送被拒绝&#xff1a; > git push origin master:master remote: File [6322bc3f1becedcade87b5d1ea7fddbdd95e6959] size 178.312MB, exceeds quota 100MB rem…...

游戏引擎学习第257天:处理一些 Win32 相关的问题

设定今天的工作计划 今天我们本来是打算继续开发性能分析器&#xff08;Profiler&#xff09;&#xff0c;但在此之前&#xff0c;我们认为有一些问题应该先清理一下。虽然这类事情不是我们最关心的核心内容&#xff0c;但我们觉得现在是时候处理一下了&#xff0c;特别是为了…...

高性能数据库架构探索:OceanBase 分布式技术深入解析

高性能数据库架构探索&#xff1a;OceanBase 分布式技术深入解析 简介 OceanBase 高性能分布式数据库&#xff0c;解决传统数据库在大规模、高并发场景下的性能瓶颈&#xff0c;通过分布式架构、数据自动分片和强一致性协议&#xff0c;提供高可用性、弹性扩展和出色的性能&am…...

【CISCO】Se2/0, Se3/0:串行口(Serial) 这里串口的2/0 和 3/0分别都是什么?

在 Cisco IOS 设备上&#xff0c;接口名称通常遵循这样一个格式&#xff1a; <类型><槽号>/<端口号>类型&#xff08;Type&#xff09;&#xff1a;表示接口的物理或逻辑类型&#xff0c;比如 Serial&#xff08;串行&#xff09;、FastEthernet、GigabitEt…...

GPU集群训练经验评估框架:运营经理经验分析篇

引言 随着深度学习模型规模的持续增长和复杂度的不断提高,单GPU训练已经难以满足现代AI研究和应用的需求。GPU集群训练作为一种有效的扩展方案,能够显著提升训练效率、处理更大规模的数据集和模型。然而,GPU集群训练涉及到分布式训练框架、集群管理工具、性能优化等多个技术…...

函数多项式拟合

函数多项式拟合 用处 不方便使用math时&#xff0c;可以使用多项式拟合法实现比较高效的数学函数&#xff0c;比如使用avx指令时&#xff0c;O3优化&#xff0c;math中的函数会调用FPU指令集&#xff0c;在指令集切换的过程中代码效率大幅降低&#xff0c;为避免使用math中的…...

【Hive入门】Hive与Spark SQL集成:混合计算实践指南

目录 引言 1 Hive与Spark SQL概述 1.1 Hive简介 1.2 Spark SQL简介 2 Hive与Spark SQL集成架构 2.1 集成原理 2.2 配置集成环境 3 混合计算使用场景 3.1 场景一&#xff1a;Hive表与Spark DataFrame互操作 3.2 场景二&#xff1a;Hive UDF与Spark SQL结合使用 3.3 场…...

TFQMR和BiCGStab方法比较

TFQMR&#xff08;Transpose-Free Quasi-Minimal Residual&#xff09;和BiCGStab&#xff08;Bi-Conjugate Gradient Stabilized&#xff09;都是用于求解非对称线性方程组的迭代方法&#xff0c;属于Krylov子空间方法的范畴。它们分别是BiCG&#xff08;双共轭梯度法&#xf…...

小程序 IView WeappUI组件库(简单增删改查)

IView Weapp 微信小程序UI组件库&#xff1a;https://weapp.iviewui.com/components/card IView Weapp.png 快速上手搭建 快速上手.png iView Weapp 的代码 将源代码下载下来&#xff0c;然后将dict放到自己的项目中去。 iView Weapp 的代码.png 小程序中添加iView Weapp 将di…...

nginx 核心功能 02

目录 1. 正向代理 1.1 编译安装 Nginx 1.2 配置正向代理 2. 反向代理 2.1 配置nginx七层代理 2.2 配置nginx四层代理 3. Nginx 缓存 3.1 缓存功能的核心原理和缓存类型 3.2 代理缓存功能设置 4. Nginx rewrite 和正则 4.1 Nginx正则 4.2 nginx location 4.3 Rewri…...

LeetCode 102题解 | 二叉树的层序遍历

二叉树的层序遍历 一、题目链接二、题目三、算法原理四、编写代码 一、题目链接 二叉树的层序遍历 二、题目 三、算法原理 本题要求把结果放在不规则的二维数组里&#xff0c;即每一层二叉树的数值放在一行数组中。 回顾之前的层序遍历是借助队列实现的&#xff0c;是不考虑…...

Flink基础整理

文章目录 前言1.Flink系统架构2.编程模型(API层次结构)3.DataSet和DataStream区别4.Flink的批流统一5.Flink的状态后端6.Flink有哪些状态类型7.Flink并行度前言 提示:下面是根据网络或AI整理: 1.Flink系统架构 用户在客户端提交作业(Job)到服务端。服务端为分布式的主从…...

C++23 新特性:为 std::pair 的转发构造函数添加默认实参

文章目录 1\. 背景&#xff1a;std::pair 的转发构造函数2\. C23 的改进&#xff1a;添加默认实参示例代码 3\. 带来的好处3.1 更简洁的代码3.2 提高代码的可维护性3.3 与 std::optional 和 std::variant 的协同 4\. 实现细节示例实现&#xff08;简化版&#xff09; 5\. 使用场…...

JavaScript性能优化实战(9):图像与媒体资源优化

引言 在当今视觉驱动的网络环境中,图像和媒体资源往往占据了网页总下载量的60%-80%,因此对图像和媒体资源进行有效优化已成为前端性能提升的关键领域。尽管网络带宽持续提升,但用户对加载速度的期望也在不断提高,特别是在移动设备和网络条件不稳定的场景下。 本文作为Jav…...

施磊老师rpc(四)

文章目录 rpc网络服务简介RpcProvider 的设计目标Eventloop不使用智能指针-弃用RpcProvider类似于集群的服务器provider网络实现**src/include/rpcprovider.h****src/include/mprpcapplication.h****src/rpcprovider.cc** 错误1错误2-重点**本项目的 mprpc 是动态库, muduo..是…...

Java学习手册:MyBatis 框架作用详解

一、MyBatis 简介 MyBatis 是一款优秀的持久层框架&#xff0c;用于简化 JDBC 开发。它通过将 Java 对象与数据库表之间的映射关系进行配置&#xff0c;使得开发者可以使用简单的 SQL 语句和 Java 代码来完成复杂的数据操作。MyBatis 支持自定义 SQL 语句&#xff0c;提供了灵…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】3.1 数据质量评估指标(完整性/一致性/准确性)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 数据质量评估核心指标&#xff1a;完整性、一致性、准确性实战解析3.1 数据质量评估指标体系3.1.1 完整性&#xff1a;数据是否存在缺失1.1.1 核心定义与业务影响1.1.2 检测…...

分布式系统中的 ActiveMQ:异步解耦与流量削峰(一)

一、引言 在当今数字化时代&#xff0c;分布式系统已成为构建大规模应用的关键架构。随着业务的快速发展和用户量的急剧增长&#xff0c;分布式系统面临着诸多挑战&#xff0c;其中异步通信、系统解耦和流量削峰是亟待解决的重要问题。 以电商系统为例&#xff0c;在秒杀活动中…...