C# 創建mqtt服務器,mqtt發布數據,驗證邏輯


如果想用C#來創建mqtt的服務器進行數據交互的話,有一個常見的選擇,那就是 MQTTNET

地址如下:https://github.com/chkr1011/MQTTnet

那個庫在最近幾個版本升級的過程中,更改了一些api接口,造成了大家的困惑,所以我在hsl中也提供了mqtt的實現類,用法很簡單。現在來介紹一下

 

聯系作者及加群方式:http://www.hslcommunication.cn/Cooperation 

 

在Visual Studio 中的NuGet管理器中可以下載安裝,也可以直接在NuGet控制台輸入下面的指令安裝:

 

1
Install-Package HslCommunication

  

  

 如果需要教程:Nuget安裝教程:http://www.cnblogs.com/dathlin/p/7705014.html

 

組件的完整信息和API介紹參照:http://www.cnblogs.com/dathlin/p/7703805.html   組件的使用限制,更新日志,都在該頁面里面。

本庫的demo源代碼地址:https://github.com/dathlin/HslCommunication

如果想要聯系作者,請訪問官網:  http://www.hslcommunication.cn/

MQTT的客戶端的教程:https://www.cnblogs.com/dathlin/p/11631894.html

 

測試的MQTT界面如下:

 

 

 如果需要客戶端,hsl的demo也提供了可供直接快速測試的客戶端。

 

 

 

各位方便的話,可以從git上下載代碼下來,自己測試一下。基本看代碼的話,就可以看懂相關的操作了。此處還是稍微講解下如何創建服務器信息

 

首先從nuget安裝 hslcommunication 組件,這個應該很簡單的,如果不會的話,可以參照下面的地址的文章

https://www.cnblogs.com/dathlin/p/7705014.html

 

好的,我們來看下最簡單的代碼

private MqttServer mqttServer = new MqttServer( );

 然后啟動系統

mqttServer.ServerStart(1883);

  

好了,這就啟動了一個系統了。那么其他的客戶端可以發布訂閱操作信息了。

 

現在我們往前進一步,我希望在服務器端把所有的客戶端發過來的數據都打印出來,那么如下的操作即可

mqttServer.OnClientApplicationMessageReceive += MqttServer_OnClientApplicationMessageReceive;

這個綁定的方法參考下面,直接簡單的打印出來

		private void MqttServer_OnClientApplicationMessageReceive( MqttSession session, MqttClientApplicationMessage message )
		{
			Invoke( new Action( ( ) =>
			{
				textBox8.AppendText( $"Cliend Id[{message.ClientId}] Topic:[{message.Topic}] Payload:[{Encoding.UTF8.GetString( message.Payload )}]" + Environment.NewLine );
			} ) );
		}

  上述的代碼是在textbox8里面將所有的客戶端信息顯示出來。當然,你可以進行額外的處理。例如,這個客戶端的發布的數據是無效的危險數據,禁止推送給其他的客戶端,那么可以如下操作

		private void MqttServer_OnClientApplicationMessageReceive( MqttSession session, MqttClientApplicationMessage message )
		{
			message.IsCancelPublish = true;
		}

  這樣的話,這條消息就到服務器為止,不管客戶端有沒有訂閱,都不會推送出去了。

 

 

 

 

 

如果我們想驗證客戶端的連接,比如,必須如果用戶名和密碼,或是限定客戶端的ID信息。那么可以如下的操作。

mqttServer.ClientVerification += MqttServer_ClientVerification;  

綁定的方法如下

		private int MqttServer_ClientVerification( string clientId, string userName, string passwrod )
		{
			if(userName == "admin" && passwrod == "123456")
			{
				return 0; // 成功
			}
			else
			{
				return 5; // 賬號密碼驗證失敗
			}
		}

  此處舉了個例子,限定了賬戶名 admin  密碼 123456 的信息。

 

如果在客戶端剛連接上服務器后,需要返回客戶端的信息的話,可以綁定一個事件

mqttServer.OnClientConnected += MqttServer_OnClientConnected;

  

綁定的方法內容如下:

		private void MqttServer_OnClientConnected( MqttSession session )
		{
				// 當客戶端連接上來時,可以立即返回一些數據內容信息
				mqttServer.PublishTopicPayload( session, "HslMqtt", Encoding.UTF8.GetBytes( "This is a test message" ) );
		}

  

這樣的話,所有的客戶端在連接服務器的時候,可以返回一串數據信息。

 

 

 

 

接下來介紹下如何發送數據給客戶端,從服務器端進行發布數據

mqttServer.PublishTopicPayload( "A", Encoding.UTF8.GetBytes( "iaishdasd" ) );

  

這里舉例了,從服務器進行發布數據信息,默認消息不駐留,如果要消息駐留(意思就是客戶端訂閱的一瞬間,如果服務器就消息駐留,立即返回給客戶端,而不是等到發布)

mqttServer.PublishTopicPayload( "A", Encoding.UTF8.GetBytes( "iaishdasd" ), true );

  

 好了,如果我們想要針對clientId為  1000 的客戶端發布數據呢?

mqttServer.PublishTopicPayload( "1000", "A", Encoding.UTF8.GetBytes( "asd" ) );

  

記下來看看,我們強制給所有的客戶端發布數據的情況,而不管客戶端有沒有訂閱

mqttServer.PublishAllClientTopicPayload( "A", Encoding.UTF8.GetBytes( "asd" ) );

  

如果需要查看日志信息有個 LogNet屬性,可以參照demo實例化。更多的信息請參照demo的操作示例。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM