RabbitMQ中交换机的应用 ,原理 ,案例的实现

                                🎉🎉欢迎来到我的CSDN主页!🎉🎉

                    🏅我是平顶山大师,一个在CSDN分享笔记的博主。📚📚

    🌟推荐给大家我的博客专栏《RabbitMQ中交换机的应用及原理,案例的实现》。🎯🎯

                    🎁如果感觉还不错的话请给我关注加三连吧!🎁🎁

目录

一、RabbitMQ中交换机的介绍

1.基本概念

1.1. 概述

1.2.RabbitMQ交换机类型

2. 作用及优势

2.1 作用

 2.2 优势

3. 工作原理

二、交换机Exchange

1. Direct 

2. Topic

3. Fanout

三、代码案例

1. 直连direct 

生产者代码

消费者代码:

直连测试:

2.Topic

生产者代码

测试

3. 扇形fanout 

生产者代码

测试

总结:


一、RabbitMQ中交换机的介绍

1.基本概念


1.1. 概述

RabbitMQ中的交换机(exchange)是消息的分发中心,它接收来自生产者的消息,并将这些消息路由到一个或多个队列中。交换机根据消息的路由键(routing key)将消息发送到相应的队列中。

1.2.RabbitMQ交换机类型

RabbitMQ一共四种交换机,如下所示:

直连交换机(direct exchange):直连交换机根据消息的路由键将消息发送到与之匹配的队列中。如果消息的路由键与队列的绑定键(binding key)完全匹配,那么消息将被发送到该队列中。

主题交换机(topic exchange):主题交换机根据消息的路由键和队列的绑定键的模式进行匹配。可以使用通配符(*和#)来匹配多个路由键,从而实现更灵活的消息路由。符号#表示一个或多个词,*表示一个词。

扇形交换机(fanout exchange):扇出交换机将消息发送到所有与之绑定的队列中,无论消息的路由键是什么。它实现了一对多的消息分发。

头部交换机(headers exchange):头部交换机根据消息的头部信息进行匹配,而不是路由键。可以根据消息的头部属性来决定消息的路由。

交换机和队列之间通过绑定(binding)进行关联,生产者将消息发送到交换机,交换机根据路由键将消息发送到相应的队列中。交换机和队列的绑定关系可以通过管理界面或者命令行工具进行配置。交换机它负责将消息路由到相应的队列中,实现了灵活的消息分发机制。不同类型的交换机可以满足不同的业务需求,开发者可以根据实际情况选择合适的交换机类型来实现消息的路由和分发。

2. 作用及优势


2.1 作用

交换机在项目中的主要作用包括:

       1. 消息路由:交换机负责将消息路由到一个或多个队列中,根据消息的路由键和交换机的类型进行匹配和分发,确保消息能够准确地到达目标队列。

       2. 消息分发:交换机可以根据不同的规则将消息分发到不同的队列中,实现灵活的消息分发机制。这对于实现消息的多播、广播等场景非常有用。

       3. 解耦:通过交换机,生产者和消费者之间可以完全解耦,生产者只需要将消息发送到交换机中,而不需要关心消息具体发送到哪个队列中,消费者也只需要从队列中接收消息,而不需要关心消息的来源。

        4. 消息过滤:通过不同类型的交换机和绑定规则,可以实现消息的过滤和选择性接收,确保消费者只接收到其关心的消息。

        5. 实现消息通道:交换机是消息在RabbitMQ中的通道,通过交换机可以将消息从生产者传递给消费者,实现了消息的传递和通信。

交换机在项目中起到了消息路由、分发、解耦和过滤等重要作用,是实现消息传递和通信的关键组件。通过合理使用不同类型的交换机,可以实现灵活、高效的消息传递机制,满足不同业务场景的需求。

 2.2 优势

交换机在消息传递系统中具有以下优势:

        1. 灵活的消息路由:交换机可以根据消息的路由键将消息发送到不同的队列中,实现了灵活的消息路由机制。这样可以根据消息的不同属性将消息发送到不同的消费者或处理逻辑中,提高了系统的灵活性和可扩展性。

        2. 解耦和分布式系统支持:通过交换机,生产者和消费者之间可以完全解耦,生产者只需要将消息发送到交换机中,而不需要关心消息具体发送到哪个队列中,消费者也只需要从队列中接收消息,而不需要关心消息的来源。这对于构建分布式系统和微服务架构非常有用。

        3. 多播和广播支持:通过扇出交换机(fanout exchange),交换机可以将消息发送到所有与之绑定的队列中,实现了一对多的消息分发,支持了多播和广播的消息传递方式。

        4. 消息过滤和选择性接收:通过不同类型的交换机和绑定规则,可以实现消息的过滤和选择性接收,确保消费者只接收到其关心的消息,提高了系统的效率和性能。

        5. 实现消息通道:交换机是消息在消息队列系统中的通道,通过交换机可以将消息从生产者传递给消费者,实现了消息的传递和通信,为系统中的消息传递提供了可靠的通道。

总的来说,交换机在消息传递系统中具有灵活的消息路由、解耦和分布式系统支持、多播和广播支持、消息过滤和选择性接收等优势,为构建高效、灵活的消息传递系统提供了重要的支持。        

3. 工作原理

RabbitMQ的交换机(Exchange)是消息路由的核心组件,负责消息的分发和路由。下面是RabbitMQ交换机的工作原理:

       1. 发布消息:生产者将消息发送到RabbitMQ的交换机中,同时指定一个路由键(Routing Key)。

       2. 交换机根据类型进行路由:RabbitMQ的交换机有四种类型,分别是直连交换机(direct exchange)、扇出交换机(fanout exchange)、主题交换机(topic exchange)和头部交换机(headers exchange)。不同类型的交换机根据不同的路由规则进行消息的路由和分发。

       3. 路由规则:直连交换机根据消息的路由键将消息发送到与之绑定的队列中;扇出交换机将消息发送到所有与之绑定的队列中;主题交换机根据消息的路由键和队列的绑定规则进行匹配,将消息发送到匹配的队列中;头部交换机根据消息的头部属性进行匹配,将消息发送到匹配的队列中。

       4. 绑定队列:交换机需要和队列进行绑定,指定绑定的路由键或者其他条件,确保消息能够被正确地路由到目标队列中。

       5. 发送到队列:一旦消息被交换机路由到目标队列,消费者就可以从队列中接收并处理消息。

总的来说,RabbitMQ的交换机根据不同的类型和路由规则,将消息发送到目标队列中,实现了消息的路由和分发。通过合理使用不同类型的交换机和绑定规则,可以实现灵活、高效的消息传递机制,满足不同业务场景的需求。

二、交换机Exchange


1. Direct 

 直连交换机(Direct Exchange)是RabbitMQ中最简单的交换机类型之一,它使用消息的路由键(Routing Key)来决定将消息发送到哪个队列。

 

2. Topic


主题交换机(Topic Exchange)是RabbitMQ中一种灵活且强大的交换机类型,它使用消息的路由键和通配符模式来决定将消息发送到哪个队列。Queue 通过 routingkey 绑定到TopicExchange 上,当消息到达 TopicExchange 后,TopicExchange 根据消息的 routingkey 将消息路由到一个或者多个 Queue 上。

3. Fanout


扇形交换机是RabbitMQ中的一种消息路由方式,FanoutExchange 的数据交换策略是把所有到达 FanoutExchange 的消息转发给所有与它绑定的 Queue 上,在这种策略中,routingkey 将不起任何作用,不管消息的路由键是什么。

进入RabbitMQ的管理页面:

这里会展示交换机的各种信息:

Type 表示交换机的类型。

Features 有两个取值 D 和 I。

D 表示交换机持久化,将交换机的属性在服务器内部保存,当 MQ 的服务器发生意外或关闭之后,重启 RabbitMQ 时不需要重新手动或执行代码去建立交换机,交换机会自动建立,相当于一直存在。

I 表示这个交换机不可以被消息生产者用来推送消息,仅用来进行交换机和交换机之间的绑定。

Message rate in 表示消息进入的速率。 Message rate out 表示消息出去的速率。

点击下方的 Add a new exchange 可以创建一个新的交换机。

三、代码案例

如果你掌握了上一篇博客的基础上,再来写这一次的案例,就是soeasy

3.1开启docker服务

登录:

1. 直连direct 

生产者代码

        在生产者项目中的RabbitConfig中增加以下代码:

 /*** 直连交换机* /* 创建两个Binding Bean,分别与Queue01和Queue02队列进行绑定* 并都指向directExchange01(直连交换机),键分别为Key01和Key02*///  创建队列@Beanpublic Queue Queue01() {return new Queue("Queue01");}@Beanpublic Queue Queue02() {return new Queue("Queue02");}// 创建直连(direct)交换机@Beanpublic DirectExchange directExchange01() {return new DirectExchange("directExchange01");}// 创建Binding Bean,与Queue01和directExchange01绑定,键为Key01@Beanpublic Binding binding01() {return BindingBuilder.bind(Queue01()).to(directExchange01()).with("Key01");}// 创建Binding Bean,与Queue02和directExchange01绑定,键为Key02@Beanpublic Binding binding02() {return BindingBuilder.bind(Queue02()).to(directExchange01()).with("Key02");}

        在生产者项目中的TestController中增加以下代码:

//    -------------------------直连------------------------------------@RequestMapping("sender3")@ResponseBodypublic String sender3() {// 发送消息到名为directExchange01的交换机,路由键为key01,信息内容为:Hello, direct exchange!// 这里的directExchange01是RabbitMQ中定义的交换机名称// 这里的key01是RabbitMQ中定义的路由键名称rabbitTemplate.convertAndSend("directExchange01","Key01", "Hello, direct exchange!");return "👍3";}@RequestMapping("sender4")@ResponseBodypublic String sender4() {// 发送消息到名为directExchange01的交换机,路由键为key02,信息内容为:Hello, direct exchange!// 这里的directExchange01是RabbitMQ中定义的交换机名称// 这里的key02是RabbitMQ中定义的路由键名称rabbitTemplate.convertAndSend("directExchange01","Key02", "Hello, direct exchange!");return "😘4";}

消费者代码:

        ReceiverQ1接收交换机中Queue01队列消息的方法:

package com.example.consumer;import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues = "Queue01")
public class ReceiverQ1 {// 接收directExchange01交换机中Queue01队列消息的方法@RabbitHandlerpublic void Queue01(String msg) {log.warn("Queue01,接收到信息:" + msg);}}

        ReceiverQ2接收交换机中Queue02队列消息的方法

package com.example.consumer;import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues = "Queue02")
public class ReceiverQ2 {// 接收directExchange01交换机中Queue02队列消息的方法@RabbitHandlerpublic void Queue02(String msg) {log.warn("Queue02,接收到信息:" + msg);}}

这里在备注一下;生产者根据key来找对应的消息队列

直连测试:


 

2.Topic

生产者代码

        RabbitConfig中增加以下代码:

 /*** 主题交换机**  '*'代表一个单词,*  '#'代表任意数量的字符,也代表0个或多个*/// 创建主题交换机@Beanpublic TopicExchange topicExchange() {return new TopicExchange("topicExchange");}@Beanpublic Binding binding03() {return BindingBuilder.bind(Queue01()).to(topicExchange()).with("*.*.Q1");}@Beanpublic Binding binding04() {return BindingBuilder.bind(Queue02()).to(topicExchange()).with("*.*.Q2");}@Beanpublic Binding binding05() {return BindingBuilder.bind(Queue01()).to(topicExchange()).with("平顶山大师.#");}@Beanpublic Binding binding06() {return BindingBuilder.bind(Queue02()).to(topicExchange()).with("平顶山大师.#");}

        TestController中增加以下代码:

 //    -------------------------主题topic ------------------------------------@RequestMapping("sender5")@ResponseBodypublic String test05(String rex) {rabbitTemplate.convertAndSend("topicExchange",rex,"Hello,topicExchange:Queue!");return "🎈5";}@RequestMapping("sender6")@ResponseBodypublic String test06() {rabbitTemplate.convertAndSend("fanoutExchange","","Hello,fanoutExchange:Queue!");return "💕6";}

测试

3. 扇形fanout 

生产者代码

RabbitConfig中增加以下代码:

    /*** 扇形交换机** 定义了一个FanoutExchange,加上Bean注解* 定义了两个Binding,加上Bean注解* 将两个队列绑定到FanoutExchange上,从而实现广播消息的功能* 扇形交换机会将接收到的消息路由到所有绑定到它上的队列。*/// 创建扇形交换机@Beanpublic FanoutExchange fanoutExchange() {return new FanoutExchange("fanoutExchange");}@Beanpublic Binding binding07() {return BindingBuilder.bind(Queue01()).to(fanoutExchange());}@Beanpublic Binding binding08() {return BindingBuilder.bind(Queue02()).to(fanoutExchange());}

TestController中增加以下代码:

    @RequestMapping("sender6")@ResponseBodypublic String test06() {rabbitTemplate.convertAndSend("fanoutExchange","","Hello,fanoutExchange:Queue!");return "💕6";}

这里会直接发送到Q1,Q2

测试

全部代码:

RabbitConfig:

package com.example.provide;import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@SuppressWarnings("all")
public class RabbitConfig {@Beanpublic Queue firstQueue() {return new Queue("firstQueue");}@Beanpublic Queue secondQueue() {return new Queue("secondQueue");}//   RabbitConfigII/*** 直连交换机* /* 创建两个Binding Bean,分别与Queue01和Queue02队列进行绑定* 并都指向directExchange01(直连交换机),键分别为Key01和Key02*///  创建队列@Beanpublic Queue Queue01() {return new Queue("Queue01");}@Beanpublic Queue Queue02() {return new Queue("Queue02");}// 创建直连(direct)交换机@Beanpublic DirectExchange directExchange01() {return new DirectExchange("directExchange01");}// 创建Binding Bean,与Queue01和directExchange01绑定,键为Key01@Beanpublic Binding binding01() {return BindingBuilder.bind(Queue01()).to(directExchange01()).with("Key01");}// 创建Binding Bean,与Queue02和directExchange01绑定,键为Key02@Beanpublic Binding binding02() {return BindingBuilder.bind(Queue02()).to(directExchange01()).with("Key02");}/*** 主题交换机**  '*'代表一个单词,*  '#'代表任意数量的字符,也代表0个或多个*/// 创建主题交换机@Beanpublic TopicExchange topicExchange() {return new TopicExchange("topicExchange");}@Beanpublic Binding binding03() {return BindingBuilder.bind(Queue01()).to(topicExchange()).with("*.*.Q1");}@Beanpublic Binding binding04() {return BindingBuilder.bind(Queue02()).to(topicExchange()).with("*.*.Q2");}@Beanpublic Binding binding05() {return BindingBuilder.bind(Queue01()).to(topicExchange()).with("平顶山大师.#");}@Beanpublic Binding binding06() {return BindingBuilder.bind(Queue02()).to(topicExchange()).with("平顶山大师.#");}/*** 扇形交换机** 定义了一个FanoutExchange,加上Bean注解* 定义了两个Binding,加上Bean注解* 将两个队列绑定到FanoutExchange上,从而实现广播消息的功能* 扇形交换机会将接收到的消息路由到所有绑定到它上的队列。*/// 创建扇形交换机@Beanpublic FanoutExchange fanoutExchange() {return new FanoutExchange("fanoutExchange");}@Beanpublic Binding binding07() {return BindingBuilder.bind(Queue01()).to(fanoutExchange());}@Beanpublic Binding binding08() {return BindingBuilder.bind(Queue02()).to(fanoutExchange());}
}

TestController:

package com.example.provide;import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;/*** @author 程序猿-小李哥* @site www.xiaolige.com* @company 猪八戒有限集团* @create 2024-01-19-18:46*/
@Controller
public class Testcontrol {@Autowiredprivate AmqpTemplate rabbitTemplate;@Autowiredprivate ObjectMapper objectMapper;@RequestMapping("/sender1")@ResponseBodypublic String sendFirst() {rabbitTemplate.convertAndSend("firstQueue", "Hello World");return "😶‍🌫️1";}@RequestMapping("/sender2")@ResponseBodypublic String sender2() throws JsonProcessingException {User user = new User("1", "1");// 序列化对象转换为JSON字符串String json = objectMapper.writeValueAsString(user);rabbitTemplate.convertAndSend("secondQueue", json);return "😎2";}//    -------------------------直连------------------------------------@RequestMapping("sender3")@ResponseBodypublic String sender3() {// 发送消息到名为directExchange01的交换机,路由键为key01,信息内容为:Hello, direct exchange!// 这里的directExchange01是RabbitMQ中定义的交换机名称// 这里的key01是RabbitMQ中定义的路由键名称rabbitTemplate.convertAndSend("directExchange01","Key01", "Hello, direct exchange!");return "👍3";}@RequestMapping("sender4")@ResponseBodypublic String sender4() {// 发送消息到名为directExchange01的交换机,路由键为key02,信息内容为:Hello, direct exchange!// 这里的directExchange01是RabbitMQ中定义的交换机名称// 这里的key02是RabbitMQ中定义的路由键名称rabbitTemplate.convertAndSend("directExchange01","Key02", "Hello, direct exchange!");return "😘4";}//    -------------------------主题topic ------------------------------------@RequestMapping("sender5")@ResponseBodypublic String test05(String rex) {rabbitTemplate.convertAndSend("topicExchange",rex,"Hello,topicExchange:Queue!");return "🎈5";}@RequestMapping("sender6")@ResponseBodypublic String test06() {rabbitTemplate.convertAndSend("fanoutExchange","","Hello,fanoutExchange:Queue!");return "💕6";}}

总结:

问题:为啥要使用RabbitMQ中交换机???

  1. 消息路由:交换机用于将消息从生产者发送到消费者之间建立起路由规则。它可以根据不同的路由键(routing key)将消息传递给不同的队列或者其他交换机,实现灵活的消息传递方式。

  2. 解耦和扩展性:通过使用交换机,生产者和消费者之间可以解耦。生产者只需要将消息发送到交换机上,并不需要关心具体的消费者。消费者可以根据自己的需求,绑定到交换机上接收特定类型的消息,这样可以实现系统的灵活扩展和升级。

  3. 发布-订阅模式:交换机支持发布-订阅模式,可以将消息广播给多个消费者。当多个消费者同时绑定到同一个交换机上时,交换机会将消息复制并传递给所有绑定的队列,实现消息的多播。

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

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

相关文章

TCP服务器最多支持多少客户端连接

目录 一、理论数值 二、实际部署 参考 一、理论数值 首先知道一个基础概念,对于一个 TCP 连接可以使用四元组(src_ip, src_port, dst_ip, dst_port)进行唯一标识。因为服务端 IP 和 Port 是固定的(如下图中的bind阶段&#xff0…

Pytest中conftest.py的用法

Pytest中conftest.py的用法 ​ 在官方文档中,描述conftest.py是一个本地插件的文件,简单的说就是在这个文件中编写的方法,可以在其他地方直接进行调用。 注意事项 只能在根目录编写conftest.py 插件加载顺序在搜集用例之前 基础用法 这里…

NebulaGraph is nothing without you | 社区 2023 年度人物合集

在去年的年度人物 回顾中,我们看到了形形色色的人们,他们当中有帮 NebulaGraph 捉 bug 的小能手,也有通过用回复来解答他人疑惑的启蒙者…在今年(2023 年),我们这个整点不一样的,将镜头推进&…

新版idea创建spring boot项目

目录 前言 汉化教程 项目模板初始化 1.点击新建项目 2.配置初始化信息 3.初始依赖选择 配置Maven 1.打开maven设置 2.重写maven配置文件 3.选择你创建的配置文件 4.重启项目 spring boot配置并测试 1.修改配置文件后缀 2.启动项目 3.编写测试控制类 4.重启项目…

【Go面试向】defer与time.sleep初探

【Go面试向】defer与time.sleep初探 大家好 我是寸铁👊 总结了一篇defer传参与time.sleep初探的文章✨ 喜欢的小伙伴可以点点关注 💝 请大家看下面这段代码,看运行结果会出现什么,为什么? 问题 demo package mainim…

性能优化-HVX架构简介

来自 「发表于知乎专栏《移动端算法优化》」 本文主要介绍Hexagon DSP的HVX技术,旨在通过简单的语言讲清HVX技术。 🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:高性能(HPC)开…

数据管理平台Splunk Enterprise本地部署并结合内网穿透实现远程访问

文章目录 前言1. 搭建Splunk Enterprise2. windows 安装 cpolar3. 创建Splunk Enterprise公网访问地址4. 远程访问Splunk Enterprise服务5. 固定远程地址 前言 本文主要介绍如何简单几步,结合cpolar内网穿透工具实现随时随地在任意浏览器,远程访问在本地…

【书生·浦语大模型实战】“PDF阅读小助手”学习笔记

1 模型部署 在InternStudio平台中选择A100 (1/4)的配置,镜像选择Cuda11.7-conda,可以选择已有的开发机langchain; 1.1 创建工作空间 mkdir /root/pdf_project1.2 Clone项目 git clone https://gitee.com/tcexeexe/pdf-reading-assistant.…

HCIA——23DNS层次域名空间、域名服务器、域名解析的原理的选择、解答

学习目标: 计算机网络 1.掌握计算机网络的基本概念、基本原理和基本方法。 2.掌握计算机网络的体系结构和典型网络协议,了解典型网络设备的组成和特点,理解典型网络设备的工作原理。 3.能够运用计算机网络的基本概念、基本原理和基本方法进行…

项目解决方案: 视频融合(实时监控视频和三维建模进行融合)设计方案

目 录 一、需求描述 1、视频接入和控制要求 2、视频播放需求 3、提供其他应用的调用 二、方案设计 (一)系统设计图 (二)产品实现方案 三、产品和功能描述 (一)总体描述 &#xf…

QuestDB时序数据库快速入门

简介 QuestDB是一个开源的高性能时序数据库,专门用于处理时间序列相关的数据存储与查询; QuestDB使用列式存储模型。数据存储在表中,每列存储在其自己的文件和其自己的本机格式中。新数据被附加到每列的底部,以便能够按照与摄取…

uniapp中打包Andiord app,在真机调试时地图以及定位功能可以正常使用,打包成app后失效问题(高德地图)

踩坑uniapp中打包Andiord app,在真机调试时地图以及定位功能可以正常使用,打包成app后失效问题_uniapp真机调试高德地图正常 打包apk高德地图就不加载-CSDN博客 问题: 目前两个项目,一个项目是从另一个项目里面分割出来的一整套…

10个常考的前端手写题,你全都会吗?(下)

前言 📫 大家好,我是南木元元,热爱技术和分享,欢迎大家交流,一起学习进步! 🍅 个人主页:南木元元 今天接着上篇再来分享一下10个常见的JavaScript手写功能。 目录 1.实现继承 ES5继…

【快刊录用】15天录用!含中科院1区TOP-4区,投必中!

2024年1月13日-20241月19日 进展喜讯 经核实,由我处Unionpub学术推荐的论文中,新增2篇论文录用、2篇上线见刊、5篇数据库检索: 录用通知 FA20977 FA20479 — 见刊通知 FA20245 FA20885 — 检索通知 FA20924 FA20799 FA20790 FA2…

【IEEE会议征稿】2024年第九届智能计算与信号处理国际学术会议(ICSP 2024)

2024年第九届智能计算与信号处理国际学术会议(ICSP 2024) 2024年第八届智能计算与信号处理国际学术会议(ICSP 2024)将在西安举行, 会期是2024年4月19-21日, 为期三天, 会议由西安科技大学主办。 欢迎参会&…

4G物联网LED智慧路灯杆显示屏产品介绍

4GLED显示屏是一种具有4G网络连接功能的LED显示屏。它可以通过4G网络连接到互联网,实现远程管理和控制,方便进行内容更新和管理。同时,4GLED显示屏具有高亮度、高清晰度和高对比度的特点,可以提供清晰明亮的图像和视频展示效果。它…

【蓝桥杯EDA设计与开发】立创开源社区分享的关于蓝桥被EDA真题与仿真题的项目分析

立创开源社区内有几个项目分享了往年 EDA 设计题目与仿真题,对此展开了学习。 【本人非科班出身,以下对项目的学习仅在我的眼界范围内发表意见,如有错误,请指正。】 项目一 来源:第十四届蓝桥杯EDA赛模拟题一 - 嘉立…

C++笔记(二)

函数的默认参数 如果我们自己传入数据,就用自己的数据,如果没有,就用默认值 语法: 返回值类型 函数名(形参默认值){} int func(int a,int b20,int c30){} …

软考复习之多媒体篇

常用的计算公式 数据传输率(单位:b/s) 未压缩的数据传输率 采样频率(Hz)* 量化位数(位)* 声道数 波形声音经过数字化后的信息数据量(单位:字节) 声音信号数据量 数据传输率 * …

使用Python自动化操作手机,自动执行常见任务,例如滑动手势、呼叫、发送短信等等

使用Python自动化操作手机,自动执行常见任务,例如滑动手势、呼叫、发送短信等等。 此自动化脚本将帮助你使用 Python 中的 Android 调试桥 (ADB) 自动化你的智能手机。下面我将展示如何自动执行常见任务,例如滑动手势、呼叫、发送短信等等。 您可以了解有关 ADB 的更多信息,…