十七、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 ~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/155497.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用户增长常见分析模型

一、用户增长是什么 用户增长基本上会涉及生意场上的各行各业&#xff0c;你开个店面希望有更多的客户光顾&#xff0c;你做了个APP希望有更多的用户经常使用&#xff0c;你搭建了个电商平台希望有更多的人下单买东西。 用户增长&#xff0c;即以提升用户LTV为目的&#xff08…

Self-Supervised Exploration via Disagreement论文笔记

通过分歧进行自我监督探索 0、问题 使用可微的ri直接去更新动作策略的参数的&#xff0c;那是不是就不需要去计算价值函数或者critic网络了&#xff1f; 1、Motivation 高效的探索是RL中长期存在的问题。以前的大多数方式要么陷入具有随机动力学的环境&#xff0c;要么效率…

应用在金银精炼控制系统中的Modbus转Profinet网关案例

应用在金银精炼控制系统中的Modbus转Profinet网关案例 Modbus转Profinet网关&#xff08;XD-MDPN100&#xff09;能够支持多种通信协议和接口&#xff0c;满足不同设备和系统的需求。在金银精炼控制系统中使用&#xff0c;通过控制PID阀门的大小&#xff0c;将1200plc与PID控制…

java:简单入门定时任务的几种方式Timer、Quartz、Spring Task

背景 后端的定时任务在许多应用中都扮演着重要的角色&#xff0c;它们可用于处理重复性任务、执行定期操作或处理需要定时触发的任务。以下是一些使用场景的示例&#xff1a; 数据同步&#xff1a;在分布式系统中&#xff0c;不同系统之间经常需要进行数据同步。例如&#xf…

Git 远程仓库(Github)

目录 添加远程库 查看当前的远程库 提取远程仓库 推送到远程仓库 删除远程仓库 Git 并不像 SVN 那样有个中心服务器。 目前我们使用到的 Git 命令都是在本地执行&#xff0c;如果你想通过 Git 分享你的代码或者与其他开发人员合作。 你就需要将数据放到一台其他开发人员…

【paddlepaddle】

安装paddlepaddle 报错 ImportError: /home/ubuntu/miniconda3/envs/paddle_gan/bin/../lib/libstdc.so.6: version GLIBCXX_3.4.30 not found (required by /home/ubuntu/miniconda3/envs/paddle_gan/lib/python3.8/site-packages/paddle/fluid/libpaddle.so) 替换 /home/ubu…

深入探究Spring Cloud中的OpenFeign和配置中心

引言 在当今快速发展的微服务架构中&#xff0c;Spring Cloud作为其核心支持&#xff0c;OpenFeign和配置中心扮演着至关重要的角色。本文将深入探讨Spring Cloud中这两个关键组件的使用、优势以及如何有效地集成&#xff0c;旨在帮助开发者更好地理解和运用这些技术。 Spring…

【CSH 入门基础 10 -- csh 设置 脚本执行的优先级】

文章目录 csh 设置 脚本执行的优先级使用 nice 启动脚本使用 renice 调整正在运行的脚本的优先级在脚本内部调整优先级 csh 设置 脚本执行的优先级 在 UNIX 和类 UNIX 系统中&#xff0c;可以使用 nice 和 renice 命令来调整脚本或程序的执行优先级。优先级&#xff08;或称为…

【python】Python生成GIF动图,多张图片转动态图,pillow

pip install pillow 示例代码&#xff1a; from PIL import Image, ImageSequence# 图片文件名列表 image_files [car.png, detected_map.png, base64_image_out.png]# 打开图片 images [Image.open(filename) for filename in image_files]# 设置输出 GIF 文件名 output_g…

GAMES101—Lec 05~06:光栅化

目录 概念回顾&#xff08;个人理解&#xff09;光栅化1.采样2.采样出现的问题&#xff1a;走样 反走样 概念回顾&#xff08;个人理解&#xff09; 屏幕&#xff1a;在图形学中&#xff0c;我们认为屏幕是一个二维数组&#xff0c;数组里的每一个元素为一个二维像素。 光栅化…

【Operating Systems:Three Easy Pieces 操作系统导论 】第28章 插叙:线程 API

【Operating Systems:Three Easy Pieces 操作系统导论 】 第28章 插叙&#xff1a;线程 API pthread 库介绍 线程创建 #include <pthread.h> // 头文件 int pthread_create(pthread_t * thread,const pthread_attr_t * attr,void * (*start_routine)(void*),void *…

【数据结构(四)】栈(1)

文章目录 1. 关于栈的一个实际应用2. 栈的介绍3. 栈的应用场景4. 栈的简单应用4.1. 思路分析4.2. 代码实现 5. 栈的进阶应用(实现综合计算器)5.1. 栈实现一位数计算(中缀表达式)5.1.1. 思路分析5.1.2. 代码实现 5.2. 栈实现多位数计算(中缀表达式)5.2.1. 解决思路5.2.2. 代码实…

Dubbo笔记

一、导包 <!--Dubbo--> <dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>2.7.8</version> </dependency> <!--Zookeeper--> <dependency>&l…

强化学习笔记

这里写自定义目录标题 参考资料基础知识16.3 有模型学习16.3.1 策略评估16.3.2 策略改进16.3.3 策略迭代16.3.3 值迭代 16.4 免模型学习16.4.1 蒙特卡罗强化学习16.4.2 时序差分学习Sarsa算法&#xff1a;同策略算法&#xff08;on-policy&#xff09;&#xff1a;行为策略是目…

Android Studio 安装及使用

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

设计模式-Factory

定义 工厂设计模式是一种创建型设计模式&#xff0c;它提供了一个用于创建对象的接口&#xff0c;但允许子类决定实例化哪个类。这种设计模式使一个类的实例化延迟到其子类。 实现举例 #include <iostream> #include <string>// 抽象产品类 class Product { pub…

电脑游戏录屏软件,记录游戏高光时刻

电脑游戏录制是游戏爱好者分享游戏乐趣、技巧和成就的绝佳方式&#xff0c;此时&#xff0c;一款好用的录屏软件就显得尤为重要。本文将为大家介绍三款电脑游戏录屏软件&#xff0c;通过对这三款软件的分步骤详细介绍&#xff0c;让大家更加了解它们的特点及使用方法。 电脑游戏…

记一次struct2漏洞获取服务器

文章目录 一、漏洞原因二、漏洞成果三、漏洞利用0x01 struts2漏洞获取shell0x02 todesk配置文件获取连接0x03 orcal数据库连接0x04 web网站 sso管理权限0x05 tomcat网站0x06 获取路由器权限0x07 远程桌面四、总结五、免责声明一、漏洞原因 由于网站使用struct2框架,未及时进行…

视频剪辑技巧:如何高效地将多个视频合并成一个新视频

在视频制作过程中&#xff0c;将多个视频合并成一个新视频是一个常见的操作。这涉及到将多个片段组合在一起&#xff0c;或者将不同的视频素材进行混剪。无论是制作一部完整的影片&#xff0c;还是为社交媒体提供短视频&#xff0c;都要掌握如何高效地将多个视频合并。现在一起…

ky10 server arm 在线编译安装openssl3.1.4

在线编译脚本 #!/bin/shOPENSSLVER3.1.4OPENSSL_Vopenssl versionecho "当前OpenSSL 版本 ${OPENSSL_V}" #------------------------------------------------ #wget https://www.openssl.org/source/openssl-3.1.4.tar.gzecho "安装OpenSSL${OPENSSLVER}...&q…