如果想用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的操作示例。
