在完成了基于AMQP协议的RabbitMQ消息收发后,我们要继续实现基于MQTT协议的RabbitMQ消息收发。

由于C#的RabbitMQ.Client包中只实现了基于AMQP协议的消息收发功能的封装,所以要实现基于MQTT协议的收发,我们要下载新的包。

在NuGet的解决方案中,我们选择了简单实用的M2Mqtt。

关于M2Mqtt的资料,可以参考: https://m2mqtt.wordpress.com/     https://github.com/eclipse/paho.mqtt.m2mqtt

消费者代码:

using System;
using uPLibrary.Networking.M2Mqtt;
using uPLibrary.Networking.M2Mqtt.Messages; namespace MQTTDemo
{
class Client
{
static void Main()
{
// create client instance
MqttClient client = new MqttClient("127.0.0.1"); // register to message received
client.MqttMsgPublishReceived += client_MqttMsgPublishReceived; string clientId = Guid.NewGuid().ToString();
client.Connect(clientId); client.Subscribe(new string[] { "test" }, new byte[] { MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE });
} static void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
{
string msg = System.Text.Encoding.Default.GetString(e.Message);
Console.WriteLine(msg);
}
}
}

生产者代码:

using System;
using System.Text;
using uPLibrary.Networking.M2Mqtt;
using uPLibrary.Networking.M2Mqtt.Messages; namespace MQTTServer
{
class Server
{
static void Main()
{
// create client instance
MqttClient client = new MqttClient("127.0.0.1"); string clientId = Guid.NewGuid().ToString();
client.Connect(clientId); client.Publish("test", Encoding.UTF8.GetBytes("hello"), MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE, false); Console.WriteLine("Publish!!!"); Console.ReadKey();
client.Disconnect();
}
}
}

消费者监听的队列名会基于产生的Guid进行前后封装,“test”表示的是topic值,选择QOS_LEVEL_AT_MOST_ONCE而不是QOS_LEVEL_EXACTLY_ONCE是因为测试发现QOS_LEVEL_EXACTLY_ONCE消息会被收到多次(我也不知道为啥)。

消费者监听的队列会在消费者程序结束后自动删除,生产者不产生队列。

在rabbitmq-plugins enable rabbitmq_mqtt之后,我们就可以愉快地通过MQTT收发消息了。

然而,我们发现只能通过127.0.0.1和localhost访问RabbitMQ服务器,而本机IP访问失败。

查阅了大量资料后,我发现这是由于rabbitmq默认的config中有这么一段文字,所以我们之能在localhost中访问服务器。

%% The default "guest" user is only permitted to access the server
%% via a loopback interface (e.g. localhost).
%% {loopback_users, [<<"guest">>]},

所以我们取消了{loopback_users, []}的注释

%% Uncomment the following line if you want to allow access to the
%% guest user from anywhere on the network.
%% {loopback_users, []},

值得注意的是,由于我们在config中仅仅取消了一行注释,所以这段代码是整个代码块的最后一行。于是我们应该将句末的逗号一同去掉。

然而,我发现怎么更改默认启动的rabbitmq对应的comfig文件,都无法成功地使用我更改后的config文件,察看了log发现用的是不存在的rabbitmq.conf文件。

修改成rabbitmq.conf后服务启动失败,所以我放弃了直接在默认启动服务中更改。

由于之前配置过rabbitmq集群,所以我打算采用集群的方式解决问题。

操作可以参考https://www.cnblogs.com/lucifer1997/p/9324130.html,其中我将ClusterNode1改为了mqtt,同时在rabbitmq-mqtt.config中对{loopback_users, []}进行了更改。

如果要修改默认的mqtt用户、密码、虚拟用户、交换机信息,可以参照http://www.rabbitmq.com/mqtt.html在rabbitmq-mqtt.config中进行修改。

在命令行操作之前先把原来开启的rabbitmq_mqtt停用,避免两个服务同时监听1883端口导致报错。 rabbitmq-plugins disable rabbitmq_mqtt

同时在操作了rabbitmq-plugins-mqtt enable rabbitmq_management之后执行rabbitmq-plugins-mqtt enable rabbitmq_mqtt。

如此就可以在集群后实现远程MQTT收发,同时还可以实现AMQP与MQTT之间的收发。

通过集群的方式解决基于MQTT协议的RabbitMQ消息收发的更多相关文章

  1. Elastic Stack之ElasticSearch分布式集群二进制方式部署

    Elastic Stack之ElasticSearch分布式集群二进制方式部署 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 想必大家都知道ELK其实就是Elasticsearc ...

  2. Elastic Stack之ElasticSearch分布式集群yum方式搭建

    Elastic Stack之ElasticSearch分布式集群yum方式搭建 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.搜索引擎及Lucene基本概念 1>.什么 ...

  3. 大数据学习day18----第三阶段spark01--------0.前言(分布式运算框架的核心思想,MR与Spark的比较,spark可以怎么运行,spark提交到spark集群的方式)1. spark(standalone模式)的安装 2. Spark各个角色的功能 3.SparkShell的使用,spark编程入门(wordcount案例)

    0.前言 0.1  分布式运算框架的核心思想(此处以MR运行在yarn上为例)  提交job时,resourcemanager(图中写成了master)会根据数据的量以及工作的复杂度,解析工作量,从而 ...

  4. hadoop 集群常见错误解决办法

    hadoop 集群常见错误解决办法 hadoop 集群常见错误解决办法: (一)启动Hadoop集群时易出现的错误: 1.   错误现象:Java.NET.NoRouteToHostException ...

  5. RocketMQ集群搭建方式

    各角色介绍 Producer:消息的发送者:举例:发信者 Consumer:消息接收者:举例:收信者 Broker:暂存和传输消息:举例:邮局 NameServer:管理Broker:举例:各个邮局的 ...

  6. Android消息推送(二)--基于MQTT协议实现的推送功能

    国内的Android设备,不能稳定的使用Google GCM(Google Cloud Messageing)消息推送服务. 1. 国内的Android设备,基本上从操作系统底层开始就去掉了Googl ...

  7. .net平台 基于 XMPP协议的即时消息服务端简单实现

    .net平台 基于 XMPP协议的即时消息服务端简单实现 昨天抽空学习了一下XMPP,在网上找了好久,中文的资料太少了所以做这个简单的例子,今天才完成.公司也正在准备开发基于XMPP协议的即时通讯工具 ...

  8. Kubernetes 企业级集群部署方式

    一.Kubernetes介绍与特性 1.1.kubernetes是什么 官方网站:http://www.kubernetes.io • Kubernetes是Google在2014年开源的一个容器集群 ...

  9. activeMQ主要的几类集群部署方式

    官方主从实现的文档:http://activemq.apache.org/masterslave.html   一.activeMQ主要的几类部署方式比较 1.默认的单机部署(kahadb) acti ...

随机推荐

  1. HihoCoder#1509 : 异或排序(二进制)

    题意 题目链接 Sol 挺简单的吧.考虑两个元素什么时候不满足条件 设\(a_i\)与\(a_i + 1\)最高的不同位分别为0 1,显然\(S\)的这一位必须为\(0\),否则这一位必须为\(1\) ...

  2. 零基础逆向工程36_Win32_10_互斥体_互斥体与临界区的区别

    1 引言 讲了第二个内核对象,互斥体.前面已经学过一个内核对象,线程.这节讲两个函数,WaitForSingleObject()和WaitForMultipleObjects().因此这两个函数是根据 ...

  3. oracle笔记2-多表查询和子查询

    --查询出当前用户下的所有表 select table_name from user_tables; --执行顺序原则:  from  where group by  having   select  ...

  4. Python列表边遍历边修改问题解决方案:alist[:]

    最近在看python,遇到个简单的问题:删除列表中指定的重复元素,发现一些实用并且有趣的东西. 1.错误示范 alist = [1,1,2,2,3,3,2,2,1,1] for i in alist: ...

  5. 【起航计划 018】2015 起航计划 Android APIDemo的魔鬼步伐 17 App->Alarm->Alarm Service

    Alarm Service和Alarm Controller 例子非常类似,只是Alarm Service是用来Schedule一个Service,而前面的例子是来Schedule一个Broadcas ...

  6. 使用mongoDB时错误解决

    接触mongodb遇到的错误,记录下来,后续遇到问题,会持续更新 为了让mongodb更直观,在windows使用了NoSQL Manager for MongoDB作为连接工具 1.在连接数据库时遇 ...

  7. ALPS语言学校(西雅图)|ALPS Language School (Seattle)

    http://www.swliuxue.com/school-3879.html 所属国家: 美国 所在省洲: 华盛顿州 所在城市: 华盛顿州 建校时间: 1992年 学校类型: 院校 学校类别: 私 ...

  8. linux基础命令-chgrp/chown/chomd

    chgrp 改变所属用户组 要被改变的组名必须要在/etc/group文件内存在才行: chgrp [-R]   dirname/filename -R:进行递归的持续更改,连同子目录下的所有文件.目 ...

  9. Redis 基础概念和命令

    Redis 是什么 Redis是一种基于键值对(key-value)的NoSQL数据库. 为什么使用Redis 速度快 Redis的时间颗粒度一般是微秒,慢查询的默认值是10 000微秒,即10毫秒. ...

  10. April 24 2017 Week 17 Monday

    Much effort, much prosperity. 越努力,越幸运. I have ever seen this sentence in many people's signature of ...