如果想用C#來和mqtt的服務器進行數據交互的話,有一個常見的選擇,那就是 MQTTNET
地址如下:https://github.com/chkr1011/MQTTnet
那個庫在最近幾個版本升級的過程中,更改了一些api接口,造成了大家的困惑,所以我在hsl中也提供了mqtt的實現類,用法很簡單。現在來介紹一下
本庫的demo源代碼地址:https://github.com/dathlin/HslCommunication
如果想要聯系作者,請訪問官網: http://www.hslcommunication.cn/
測試的MQTT界面如下:
然后需要准備mqtt的服務器了,當然了,你可以安裝EMQtt的服務器,也可以安裝mqttnet的服務器,當然為了盡快的測試,可以使用hsl支持的服務器,雖然目前的支持的功能比較簡陋,但是基本的功能都有的。
好了,我們先運行demo,打開服務器
點擊start即可。
然后我們新建一個winform項目,然后nuget安裝hslcommunication
安裝完成后,我們就要在主界面添加一個按鈕了。
先定義對象,然后在構造方法里初始化。
public Form1( ) { InitializeComponent( ); // 實例化 mqttClient = new MqttClient( new MqttConnectionOptions( ) { ClientId = "ABC", IpAddress = "127.0.0.1" } ); } private MqttClient mqttClient = null; private void button1_Click( object sender, EventArgs e ) { // 連接 OperateResult connect = mqttClient.ConnectServer( ); if (connect.IsSuccess) { MessageBox.Show( "Success" ); } else { MessageBox.Show( "Failed" ); } }
實例化的時候支持設置客戶端的ID信息,服務器的地址,端口,超時時間,如果服務器設置了用戶名和密碼。那么實例化的時候修改成下面的信息
// 實例化 mqttClient = new MqttClient( new MqttConnectionOptions( ) { ClientId = "ABC", IpAddress = "127.0.0.1", Credentials = new MqttCredential( "admin", "123456" ), // 設置了用戶名和密碼 } );
如何發布消息呢?我們再增加一個按鈕。
private void button2_Click( object sender, EventArgs e ) { // 測試發布 mqttClient.PublishMessage( new MqttApplicationMessage( ) { Topic = "A", // 主題 QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce, // 消息等級 Payload = Encoding.UTF8.GetBytes( "This is test message!" ), // 數據 Retain = false, // 是否保留 } ); }
我們來看看測試效果。
我們看到服務器上接收到客戶端的信息,可以方便的知道哪個客戶端,發的什么主題,內容是什么。
我們再來看看訂閱操作。我們再增加一個按鈕,用來訂閱操作
private void button3_Click( object sender, EventArgs e ) { // 訂閱測試,在label1上顯示結果 mqttClient.OnMqttMessageReceived += MqttClient_OnMqttMessageReceived; // 調用一次即可 mqttClient.SubscribeMessage( "A" ); // 訂閱A的主題 } private void MqttClient_OnMqttMessageReceived( string topic, byte[] payload ) { // 跨線程更新了UI界面的內容 Invoke( new Action( ( ) => { label1.Text = $"Topic[{topic}] {Encoding.UTF8.GetString( payload )}"; } ) ); }
好了我們再來操作以下
我們可以看到我們訂閱的A,然后發布的A確實是收到消息了。
實際上MQTT協議的操作就只有這么點,基本就差不多了,但是在發布消息的時候有個屬性,
QualityOfServiceLevel
這個需要額外注意一下。有三個選項,最多一次,最少一次,剛好一次,從性能上來說,最多一次最高性能,剛好一次最損耗性能。
所以一般工業現場的實時數據的推送都是最多一次即可。
還有 Retain 屬性,含義是,你推上去的消息是否要在服務器本地緩存,緩存之后有什么好處呢?新的客戶端訂閱消息的時候,會立即推送一次舊數據。這樣,你就可以及時的在界面上顯示出來。
更多的操作,可以參照demo的源代碼。