若是想用C#來和mqtt的服務器進行數據交互的話,有一個常見的選擇,那就是 MQTTNETgit
地址以下:https://github.com/chkr1011/MQTTnetgithub
那個庫在最近幾個版本升級的過程當中,更改了一些api接口,形成了你們的困惑,因此我在hsl中也提供了mqtt的實現類,用法很簡單。如今來介紹一下api
本庫的demo源代碼地址:https://github.com/dathlin/HslCommunication緩存
若是想要聯繫做者,請訪問官網: http://www.hslcommunication.cn/服務器
測試的MQTT界面以下:性能
而後須要準備mqtt的服務器了,固然了,你能夠安裝EMQtt的服務器,也能夠安裝mqttnet的服務器,固然爲了儘快的測試,可使用hsl支持的服務器,雖然目前的支持的功能比較簡陋,可是基本的功能都有的。測試
好了,咱們先運行demo,打開服務器線程
點擊start便可。orm
而後咱們新建一個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的源代碼。