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

十七、Rust集成MQTT Client

1、信息整理

        目前了解到的Rust MQTT项目有:

  • bytebeamio/rumqtt

    • 1.3k star、717 commits、Contributors 78、
    • tokio、futures、tls、
    • rumqttc(client):cargo add rumqttc
      • https://github.com/bytebeamio/rumqtt/tree/main/rumqttc
    • rumqttd(server):docker run -p 1883:1883 -p 1884:1884 -it bytebeamio/rumqttd
  • ntex-rs/ntex-mqtt、crates/ntex-mqtt

    • 258 star、504 commits、Contributors 15
    • ntex、MQTT Client/Server、v5 and v3.1.1 protocols
  • eclipse/paho.mqtt.rust

    • 463 star、368 commits、
    • 异步、SSL/TLS、cargo add paho-mqtt = "0.12"
    • 但看自述文档所述,用于 musl linux 环境,有代码侵入。
    fn is_musl() -> bool {std::env::var("CARGO_CFG_TARGET_ENV").unwrap() == "musl"
    }
    
  • rmqtt/rmqtt:355 star,871 commits

    • 基于 ( tokio、ntex、ntex-mqtt )
    • 一个纯服务端,遍观项目,貌似不能做 client 使用。自身的测试,使用 paho.mqtt.testing 项目完成。
    • 分布式集群(raft),TLS,WebSocket,WebSocket-TLS,x86/Arm
    • 单个服务节点上处理百万级别的并发客户端。集群提供相同的连接量、吞吐量,应该只是解决高可用问题。

2、开始集成

       本次集成作为 Client 使用,选择了最前面的 bytebeamio/rumqtt 。

  • boot/mqtt.rs
use std::sync::Arc;
use std::time::Duration;use once_cell::sync::OnceCell;
use rumqttc::{AsyncClient, MqttOptions};
use serde::{Deserialize, Serialize};pub static MQTT_CLIENT: OnceCell<Arc<AsyncClient>> = OnceCell::new();#[derive(Debug, Default, Validate, Serialize, Deserialize)]
pub struct MqttMessage {pub addr: Option<String>,#[validate(range(min = 0, max = 1))]pub action: u8,
}pub async fn start() {let mut mqtt_options = MqttOptions::new("rumqtt-async", "192.168.1.110", 1883);mqtt_options.set_keep_alive(Duration::from_secs(5));let (client, mut event_loop) = AsyncClient::new(mqtt_options, 100);MQTT_CLIENT.get_or_init(|| { Arc::new(client) });tokio::spawn(async move {loop { while let Ok(notification) = event_loop.poll().await {}; }});log::info!("this point run ...");
}
  • boot/mod.rs
pub mod mqtt;pub async fn start() {// xxx others initializationmqtt::start().await;
}
  • modules/mod.rs
pub mod switch;pub mod handler {use actix_web::dev::HttpServiceFactory;use actix_web::web;use crate::module::{switch};pub fn api_routes() -> impl HttpServiceFactory {web::scope("").service(switch::api::index)}
}
  • modules/switch/api.rs
use rumqttc::QoS::AtLeastOnce;
use validator::Validate;use crate::boot::mqtt::{MQTT_CLIENT, MqttMessage};#[post("/switch/{id}")]
pub async fn index(Path(id): Path<String>, mut msg: Json<MqttMessage>) -> impl Responder {let ok = vec!["Hello World!", "Hello World!"];if let Err(e) = msg.validate() { return HttpResponse::BadRequest().json(e); }msg.addr = Some(id);let json = serde_json::to_string(&msg).unwrap();MQTT_CLIENT.get().unwrap().publish("/hello", AtLeastOnce, false, json).await.unwrap();HttpResponse::Ok().json(ok)
}
  • main.rs
use actix_web::{App, HttpServer, middleware};
use booking::{boot, module};#[actix_web::main]
async fn main() -> std::io::Result<()> {boot::start().await;HttpServer::new(move || App::new()// TODO other initialization.service(module::handler::api_routes())// other routes).bind("0.0.0.0:8080")?.run().await
}

       代码贴完,剩下真是没啥可说的,拜了个 bye ~

相关文章:

十七、Rust集成MQTT Client

1、信息整理 目前了解到的Rust MQTT项目有&#xff1a; bytebeamio/rumqtt 1.3k star、717 commits、Contributors 78、tokio、futures、tls、rumqttc&#xff08;client&#xff09;&#xff1a;cargo add rumqttc https://github.com/bytebeamio/rumqtt/tree/main/rumqttc ru…...

HarmonyOS ArkTS开发语言介绍(三)

1 引言 Mozilla创造了JS&#xff0c;Microsoft创建了TS&#xff0c;Huawei进一步推出了ArkTS。 从最初的基础的逻辑交互能力&#xff0c;到具备类型系统的高效工程开发能力&#xff0c;再到融合声明式UI、多维状态管理等丰富的应用开发能力&#xff0c;共同组成了相关的演进脉…...

[架构之路-247]:目标系统 - 设计方法 - 软件工程 - 结构化方法的基本思想、本质、特点以及在软件开发、在生活中的应用

目录 前言&#xff1a; 一、什么是非结构化方法 1.1 什么是非结构化方法 1.2 非结构化方法的适用场合 二、什么是结构化方法 1.1 结构化方法诞生的背景&#xff1a;软件规模发展&#xff1a;大规模、复杂系统的需要 1.2 概述 1.3 主要特点与核心思想 三、结构化方法在…...

大模型的交互能力

摘要&#xff1a; 基础大模型显示出明显的潜力&#xff0c;可以改变AI系统的开发人员和用户体验&#xff1a;基础模型降低了原型设计和构建AI应用程序的难度阈值&#xff0c;因为它们在适应方面的样本效率&#xff0c;并提高了新用户交互的上限&#xff0c;因为它们的多模式和生…...

80%测试员被骗,关于jmeter 的一个弥天大谎!

jmeter是目前大家都喜欢用的一款性能测试工具&#xff0c;因为它小巧、简单易上手&#xff0c;所以很多人都愿意用它来做接口测试或者性能测试&#xff0c;因此&#xff0c;在目前企业中&#xff0c;使用各个jmeter的版本都有&#xff0c;其中以jmeter3.x、4.x的应该居多。 但是…...

Git——感谢尚硅谷官方文档

Git——尚硅谷学习笔记 第1章 Git 概述1.1 何为版本控制1.2 为什么需要版本控制1.3 版本控制工具1.4 Git 简史1.5 Git 工作机制1.6 Git 和代码托管中心 第2章 Git 安装第 3 章 Git 常用命令3.1 设置用户签名3.2 初始化本地库3.3 查看本地库状态3.4 添加暂存区3.4.1 将工作区的文…...

Java WebSocket框架

引言 随着互联网和移动互联网的迅猛发展&#xff0c;实时通信成为了应用程序的一项重要能力。WebSocket作为一种在Web上实现双向通信的协议&#xff0c;极大地丰富了Web应用程序的交互方式。而在Java领域&#xff0c;也有许多优秀的WebSocket框架可供选择&#xff0c;本文将介…...

C#实现本地服务器客户端私聊通信

&#xff08;一&#xff09;需求 在游戏中我们经常能够看到玩家与玩家之间可以进行私聊&#xff0c;在QQ或微信中最基本的功能就是用户与用户之间的通信。抽象成计算机网络&#xff0c;就是两个客户端通过服务器进行私聊通信&#xff0c;两个客户端可以互相看到对方发送过来的信…...

PyTorch 之 Dataset 类入门学习

PyTorch 之 Dataset 类入门学习 Dataset 类简介 PyTorch 中的 Dataset 类是一个抽象类&#xff0c;用来表示数据集。通过继承 Dataset 类可以进行自定义数据集的格式、大小和其它属性&#xff0c;供后续使用&#xff1b; 可以看到官方封装好的数据集也是直接或间接的继承自 …...

Java update scheduler

引言 Java 更新调度器是 Java 中的一个特性&#xff0c;可以自动化 Java 应用程序的更新过程。它提供了一种方便的方式来安排 Java 应用程序的更新&#xff0c;确保其与最新的功能、错误修复和安全补丁保持同步。本文将深入介绍如何使用 Java 更新调度器&#xff0c;并解释它对…...

常见树种(贵州省):006栎类

摘要&#xff1a;本专栏树种介绍图片来源于PPBC中国植物图像库&#xff08;下附网址&#xff09;&#xff0c;本文整理仅做交流学习使用&#xff0c;同时便于查找&#xff0c;如有侵权请联系删除。 图片网址&#xff1a;PPBC中国植物图像库——最大的植物分类图片库 一、麻栎 …...

拓扑排序-

有向无环图是拓扑排序 拓扑排序将图中所有的顶点排成一个线性序列&#xff0c;使得所有的有向边均从序列的前面指向后面。 拓扑排序使用深度优先搜索来实现&#xff0c;图中有环则无法进行拓扑排序 一个有向图&#xff0c;如果图中有入度为0的点&#xff0c;就把这个点删掉…...

Oracle数据库如何定位trace file位置

用一个示例来说明吧。 在导入master key时&#xff0c;出现错误&#xff1a; ADMINISTER KEY MANAGEMENTIMPORT KEYS WITH SECRET "my_secret"FROM /tmp/export.expIDENTIFIED BY keypwd5 WITH BACKUP; ADMINISTER KEY MANAGEMENT * ERROR at line 1: ORA-46655…...

电脑盘符错乱,C盘变成D盘怎么办?

在一些特殊情况下&#xff0c;磁盘盘符会出现错乱&#xff0c;C盘可能会变成D盘。那么&#xff0c;这该怎么办呢&#xff1f;下面我们就来了解一下。 通过磁盘管理更改盘符 磁盘管理是Windows自带的工具&#xff0c;它位于“计算机管理”的控制台中。管理硬盘及其所包含的卷或…...

Android WMS——客户端输入事件处理(十九)

前面的文章我们介绍了 WMS 中的输入服务的启动及事件处理,这一篇我们来看一下客户端对输入事件的处理。 一、事件初始化 事件的初始化就是在添加窗口的过程。 1、ViewRootImpl 源码位置:/frameworks/base/core/java/android/view/ViewRootImpl.java public void setView(…...

Python基础学习__测试报告

# 使用pycharm生成报告:只有在单独执行一个TestCase文件时可以生成,使用TestSuite等就不能用了 # 使用第三方的测试报告:例如:HTMLTestRunner第三方类库 #使用HTMLTestRunner这个执行对象# 1.获取第三方的测试运行类Runner模块(一个py文件),将其放在代码目录下 # 2.导包:unitte…...

bclinux aarch64 ceph 14.2.10 云主机 4节点 fio

ceph -s 由于是基于底层分布式存储的云主机&#xff0c;数据仅供参考 本地云盘性能 direct1 1M读取 IOPS134, BW134MiB/s [rootceph-client rbd]# cd / [rootceph-client /]# fio -filenamefio.bin -direct1 -iodepth 128 -thread -rwread -ioenginelibaio -bs1M -size10G -n…...

智能座舱架构与芯片- (14) 测试篇 上

一、 验证平台概要 1.1 测试软件方法论 “软件定义汽车” 的时代&#xff0c;软件在整车制造中的重要性日渐凸显。但不同于其他行业的软件开发&#xff0c;汽车行业有自己独特的软件开发要求。首先是需求严谨、需求层次复杂、需要通过专业的工具进行管理&#xff1b;其次开发…...

【Django-DRF用法】多年积累md笔记,第3篇:Django-DRF的序列化和反序列化详解

本文从分析现在流行的前后端分离Web应用模式说起&#xff0c;然后介绍如何设计REST API&#xff0c;通过使用Django来实现一个REST API为例&#xff0c;明确后端开发REST API要做的最核心工作&#xff0c;然后介绍Django REST framework能帮助我们简化开发REST API的工作。 全…...

Redis主从复制,哨兵和Cluster集群

主从复制&#xff1a; 主从复制是高可用Redis的基础&#xff0c;哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份&#xff08;和同步&#xff09;&#xff0c;以及对于读操作的负载均衡和简单的故障恢复。 缺陷&#xff1a;故障恢复无法自动化…...

告别平台切换烦恼:用Playnite游戏库管理器统一管理所有游戏平台

告别平台切换烦恼&#xff1a;用Playnite游戏库管理器统一管理所有游戏平台 【免费下载链接】Playnite Video game library manager with support for wide range of 3rd party libraries and game emulation support, providing one unified interface for your games. 项目…...

Windows Batch (.bat) 脚本语法详解:从入门到实战

文章目录一、 引言&#xff1a;什么是 Batch 脚本&#xff1f;二、 创建和运行 Bat 文件三、 基础语法与命令1. 注释2. 命令回显3. 变量4. 控制流&#xff1a;条件判断 (IF)5. 循环 (FOR)6. 跳转 (GOTO)7. 退出 (EXIT)8. 其他常用命令四、 实战示例示例 1: 简单备份脚本示例 2:…...

本地AI语音识别技术突破:LocalVocal在OBS中的隐私优先实时字幕解决方案

本地AI语音识别技术突破&#xff1a;LocalVocal在OBS中的隐私优先实时字幕解决方案 【免费下载链接】obs-localvocal OBS plugin for local speech recognition and captioning using AI 项目地址: https://gitcode.com/gh_mirrors/ob/obs-localvocal 在当今内容创作和直…...

初创公司如何利用 Taotoken 的按 token 计费模式控制 AI 实验成本

初创公司如何利用 Taotoken 的按 token 计费模式控制 AI 实验成本 1. 快速接入与模型实验 对于初创团队而言&#xff0c;快速验证产品原型中的 AI 能力是关键需求。Taotoken 提供的 OpenAI 兼容 API 允许开发者在五分钟内完成基础对接。以 Python 为例&#xff0c;只需安装官…...

AI绘画提示词工程:从结构化知识库到个人工作流构建

1. 项目概述&#xff1a;一个为AI绘画与提示词工程打造的“弹药库”如果你玩过AI绘画&#xff0c;比如Midjourney、Stable Diffusion或者DALL-E&#xff0c;那你一定对“提示词”这个词不陌生。简单来说&#xff0c;提示词就是你用来告诉AI“我想要什么”的那段文字。好的提示词…...

BayLing大模型:基于LLaMA的中文指令微调实战指南

1. 项目概述&#xff1a;当大语言模型学会“说”中文如果你最近在关注大语言模型&#xff08;LLM&#xff09;的进展&#xff0c;可能会发现一个有趣的现象&#xff1a;那些在国际上表现惊艳的模型&#xff0c;比如LLaMA、Falcon&#xff0c;甚至是GPT系列&#xff0c;它们在处…...

BepInEx架构解析:解锁Unity游戏插件开发的无限可能

BepInEx架构解析&#xff1a;解锁Unity游戏插件开发的无限可能 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx是一个专为Unity和.NET游戏设计的现代化插件框架&#xff0c…...

革命性MTP内核架构:OpenMTP如何重新定义macOS与Android文件传输标准

革命性MTP内核架构&#xff1a;OpenMTP如何重新定义macOS与Android文件传输标准 【免费下载链接】openmtp OpenMTP - Advanced Android File Transfer Application for macOS 项目地址: https://gitcode.com/gh_mirrors/op/openmtp 在跨平台文件传输领域&#xff0c;mac…...

为Hermes Agent实现主动消息推送:非侵入式AI智能体扩展实践

1. 项目概述&#xff1a;为Hermes Agent注入“主动关怀”能力如果你正在使用Hermes Agent&#xff0c;可能会发现一个普遍现象&#xff1a;它非常强大&#xff0c;能处理复杂的对话、调用工具、管理任务&#xff0c;但它本质上是一个“被动响应”的智能体。只有当用户发起对话时…...

AISMM模型实施避坑手册(含12个真实客户L3→L4跃迁失败复盘):缺失这1项评估,投入百万DevOps将归零

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AISMM模型与云原生成熟度 AISMM&#xff08;AI-Savvy Modernization Maturity&#xff09;模型是面向AI增强型云原生演进的五阶段评估框架&#xff0c;聚焦组织在智能服务化、自动化治理与弹性架构协同…...