iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 15
1
IoT

來與IoT譜寫一首戀愛樂章吧系列 第 15

op.15《網路層》-自己的 Broker 自己造 by C#

  • 分享至 

  • xImage
  •  

op.15 與IoT穿越時空的通訊

為了能夠盡快找到妳......
跟妳說上幾句話
緩解我對妳的思念之情
我決定要來建置穿越時空的通訊平台

今天是一個在台北的裝死之日XDD,晚一點還要去玩音樂呢 :)

今日的主題:MQTT Broker 建置

還記得前幾天的文章有提到 MQTT 的通訊方式,中間需要一個 代理商(Broker),那麼今天我們便需要來為此用 C# 寫出一個 Broker 出來!

首先第一步需要先新增一個 主控台應用程式 的專案,並且對專案命名。
https://ithelp.ithome.com.tw/upload/images/20200930/20129084MXYoDc0D4i.png

進到主頁面時,找到方案總管,右鍵點選 管理 NuGet 套件
https://ithelp.ithome.com.tw/upload/images/20200930/20129084goFtGxQ5Va.png

然後切換到瀏覽,輸入 MQTTnet ,右邊版本這裡選擇 3.0.5,按下安裝。
https://ithelp.ithome.com.tw/upload/images/20200930/201290845nGnh0yi6o.png

此時下方會出現開始安裝等字樣
https://ithelp.ithome.com.tw/upload/images/20200930/20129084m9jHXecLBC.png

中途會跳出需要按下授權接受的視窗,按下 我接受
https://ithelp.ithome.com.tw/upload/images/20200930/201290847awwvjCrvW.png

接著可以切回程式碼的區域,進行程式的撰寫。

需要先 using MQTTnet 的東西。

using MQTTnet;
using MQTTnet.Adapter;
using MQTTnet.Client.Connecting;
using MQTTnet.Client.Receiving;
using MQTTnet.Diagnostics;
using MQTTnet.Protocol;
using MQTTnet.Server;

以及 using C#提供的一些進階功能

using System.Text;
using System.Threading;
using System.Threading.Tasks;

接下來要把 Mqtt 服務寫成 Task (外部參考連結 使用 async 和 await 進行非同步程式設計)

主要建構 MQTT 的程式碼

var optionsBuilder = new MqttServerOptionsBuilder().WithConnectionBacklog(100).WithDefaultEndpointPort(1883);
//設定MQTT連接的相關參數建置,如Backlog、Port等
var mqttServer = new MqttFactory().CreateMqttServer();
//使用 MqttFactory 的 CreateMqttServer 方法來完成建置
await mqttServer.StartAsync(optionsBuilder.Build());
//使用非同步的方式啟用服務,並引入相關的參數

完整的 Task Code 會長這樣。

private static async Task MqttAsync()
{
    var optionsBuilder = new MqttServerOptionsBuilder().WithConnectionBacklog(100).WithDefaultEndpointPort(1883);
    var mqttServer = new MqttFactory().CreateMqttServer();
    await mqttServer.StartAsync(optionsBuilder.Build());
}

此時即可在 Main 裡面呼叫使用

static void Main(string[] args)
{
    MqttAsync();
    while (true);    //防止程式執行完自行結束
}

因為現在只有將服務建置起來,但我們還是想透過介面來觀看是否有人連線、離線,或是有發送訊息等,那這裡就要在Task裡新增相關的監聽事件!

訊息監聽:

mqttServer.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(e =>
{
    Console.WriteLine($"Client:{e.ClientId} Topic:{e.ApplicationMessage.Topic} Message:{Encoding.UTF8.GetString(e.ApplicationMessage.Payload ?? new byte[0])}");
});

客戶端連線監聽:

mqttServer.ClientConnectedHandler = new MqttServerClientConnectedHandlerDelegate(e =>
{
    Console.WriteLine($"Client:{e.ClientId} 已連接!");
});

客戶端離線監聽:

mqttServer.ClientDisconnectedHandler = new MqttServerClientDisconnectedHandlerDelegate(e =>
{
    Console.WriteLine($"Client:{e.ClientId}已離線!");
});

完整程式碼:

using System;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using MQTTnet;
using MQTTnet.Adapter;
using MQTTnet.Client.Connecting;
using MQTTnet.Client.Receiving;
using MQTTnet.Diagnostics;
using MQTTnet.Protocol;
using MQTTnet.Server;

namespace mqtt_3._0._5
{
    class Program
    {
        private static MqttServer MqttServer = null;
        static void Main(string[] args)
        {
            MqttAsync();
            while (true) ;

        }
        private static async Task MqttAsync()
        {
            var optionsBuilder = new MqttServerOptionsBuilder().WithConnectionBacklog(100).WithDefaultEndpointPort(1883);
            var mqttServer = new MqttFactory().CreateMqttServer();
            await mqttServer.StartAsync(optionsBuilder.Build());
            mqttServer.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(e =>
            {
                Console.WriteLine($"Client:{e.ClientId} Topic:{e.ApplicationMessage.Topic} Message:{Encoding.UTF8.GetString(e.ApplicationMessage.Payload ?? new byte[0])}");
            });
            mqttServer.ClientConnectedHandler = new MqttServerClientConnectedHandlerDelegate(e =>
            {
                Console.WriteLine($"Client:{e.ClientId} 已連接!");
            });
            mqttServer.ClientDisconnectedHandler = new MqttServerClientDisconnectedHandlerDelegate(e =>
            {
                Console.WriteLine($"Client:{e.ClientId}已離線!");
            });
        }
    }
}

好啦!到這邊就完成 C# 的程式,可以開始執行,接著可以準備手機來進行測試!

可以下載 Google Play 的 MyMQTT APP
https://ithelp.ithome.com.tw/upload/images/20200930/20129084XhSAweT2uD.jpg
打開程式會需要先設定相關的參數,不知道自己電腦的 IP 可以使用 這個 查看
https://ithelp.ithome.com.tw/upload/images/20200930/201290847tIOFOWFDL.jpg
設定成功後此時 C# 應該會顯示已連接的字樣
https://ithelp.ithome.com.tw/upload/images/20200930/20129084q7zObnypTN.png
可以切換 APP 的 Publish 頁面,輸入 Topic & Message 後發送
https://ithelp.ithome.com.tw/upload/images/20200930/20129084hyJHoi84dh.jpg
C# 應該會顯示相關的推送資訊
https://ithelp.ithome.com.tw/upload/images/20200930/201290845MTyCEUkmP.png

到這裡就算是完成測試啦~恭喜完成基本的 Broker 實戰,感謝各位的閱讀。

今日的曲子:<<火-彩衣姑娘>>劉文金

Yes


上一篇
op.14 《網路/應用層》-初探 C# 視窗程式設計
下一篇
op.16 《網路層》-Broker的基本防護與網路設定
系列文
來與IoT譜寫一首戀愛樂章吧30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言