MQTT笔记
2020-04-12 本文已影响0人
StormerX
首先在本机macOS安装ActiveMQ
https://activemq.apache.org/getting-started#Pre-InstallationRequirements
安装后运行,打开ActiveMQ控制台
http://127.0.0.1:8161/admin/topics.jsp
C#项目中
m2mqtt: https://github.com/mohaqeq/paho.mqtt.m2mqtt
项目中添加依赖在API控制器中加入测试代码,订阅名为 /home/temperature 的主题。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using uPLibrary.Networking.M2Mqtt;
using uPLibrary.Networking.M2Mqtt.Messages;
// For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860
namespace TestMQTT.Controllers
{
[Route("api/[controller]")]
public class MqttController : Controller
{
private static string ReceivedMessage;
// GET: api/values
[HttpGet]
[Obsolete]
public IEnumerable<string> Get()
{
// create client instance
MqttClient client = new MqttClient(IPAddress.Parse("127.0.0.1"));
// register to message received
client.MqttMsgPublishReceived += client_MqttMsgPublishReceived;
string clientId = Guid.NewGuid().ToString();
client.Connect(clientId);
// subscribe to the topic "/home/temperature" with QoS 2
client.Subscribe(new string[] { "/home/temperature" }, new byte[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE });
return new string[] { ReceivedMessage };
}
static void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
{
// handle message received
ReceivedMessage = Encoding.UTF8.GetString(e.Message);
}
}
}
编译执行后打开API https://localhost:5001/api/mqtt/
这时返回值为null,但是已经订阅了主题。
回到ActiveMQ控制台,选Topics,在Operations里点选Send To
填写好消息内容后点击send按钮,这样凡是订阅了该主题的客户端都可以收到这条消息。再次刷新接口:https://localhost:5001/api/mqtt/
可以看见订阅的客户端已经接收到了消息内容。
下面记录一段在WinFrom里的示例代码。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
// including the M2Mqtt Library
using uPLibrary.Networking.M2Mqtt;
using uPLibrary.Networking.M2Mqtt.Messages;
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
MqttClient client;
string clientId;
// this code runs when the main window opens (start of the app)
public MainWindow()
{
InitializeComponent();
string BrokerAddress = "test.mosquitto.org";
client = new MqttClient(BrokerAddress);
// register a callback-function (we have to implement, see below) which is called by the library when a message was received
client.MqttMsgPublishReceived += client_MqttMsgPublishReceived;
// use a unique id as client id, each time we start the application
clientId = Guid.NewGuid().ToString();
client.Connect(clientId);
}
// this code runs when the main window closes (end of the app)
protected override void OnClosed(EventArgs e)
{
client.Disconnect();
base.OnClosed(e);
App.Current.Shutdown();
}
// this code runs when the button "Subscribe" is clicked
private void btnSubscribe_Click(object sender, RoutedEventArgs e)
{
if (txtTopicSubscribe.Text != "")
{
// whole topic
string Topic = "/ElektorMyJourneyIoT/" + txtTopicSubscribe.Text + "/test";
// subscribe to the topic with QoS 2
client.Subscribe(new string[] { Topic }, new byte[] { 2 }); // we need arrays as parameters because we can subscribe to different topics with one call
txtReceived.Text = "";
}
else
{
System.Windows.MessageBox.Show("You have to enter a topic to subscribe!");
}
}
// this code runs when the button "Publish" is clicked
private void btnPublish_Click(object sender, RoutedEventArgs e)
{
if (txtTopicPublish.Text != "")
{
// whole topic
string Topic = "/ElektorMyJourneyIoT/" + txtTopicPublish.Text + "/test";
// publish a message with QoS 2
client.Publish(Topic, Encoding.UTF8.GetBytes(txtPublish.Text), MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, true);
}
else
{
System.Windows.MessageBox.Show("You have to enter a topic to publish!");
}
}
// this code runs when a message was received
void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
{
string ReceivedMessage = Encoding.UTF8.GetString(e.Message);
Dispatcher.Invoke(delegate { // we need this construction because the receiving code in the library and the UI with textbox run on different threads
txtReceived.Text = ReceivedMessage;
});
}
}
}