---
# System prepended metadata

title: Unity專案使用MQTT進行通訊

---

# Unity專案使用MQTT進行通訊
現成的MQTT框架有許多種，這篇筆記紀錄使用**paho.mqtt.m2mqtt**框架進行開發

## 安裝NuGet套件管理員
[下載](https://github.com/GlitchEnzo/NuGetForUnity/releases)給Unity使用的NuGet套件管理員[GlitchEnzo/NuGetForUnity](https://github.com/GlitchEnzo/NuGetForUnity)

下載完成後點擊.unitypackage進行安裝

## 安裝M2Mqtt
安裝完成後在Unity的工具列會出現NuGet選項，點擊NuGet>Manage NuGet Packages

![0.0](https://i.imgur.com/4ypRwRU.png)

開啟NuGet後，在搜尋框裡搜尋M2Mqtt，安裝M2Mqtt by Paolo Patierno
![0.1](https://i.imgur.com/nEPxBWx.png)

## 建立與Broker的連線

在Assets>Scripts目錄內點選右鍵，建立C# Script，這裡使用ConnectToBroker作為檔名

![1.0](https://i.imgur.com/sH4CERY.png)

開啟檔案後首先需要先引用package
```csharp=5
using uPLibrary.Networking.M2Mqtt;
using uPLibrary.Networking.M2Mqtt.Messages;
using TMPro;
```
這裡要注意的是5,6行為MQTT的package，第7行為使用到UI元件(TextMeshProUGUI)會用到的package，不一定需要引用，可依照自己需求引用

```csharp=
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Net;
using uPLibrary.Networking.M2Mqtt;
using uPLibrary.Networking.M2Mqtt.Messages;
using TMPro;

public class ConnectToBroker : MonoBehaviour

{
    //填寫MQTT Broker的IP位址
    private string MQTT_BROKER_ADDRESS = "127.0.0.1";
    
    //宣告一個字串存放MQTT接收到的內容
    private string mqttPayload = "";

    //宣告一個顯示MQTT接收到內容的物件
    public GameObject object;
    
    // Start is called before the first frame update
    void Start()
    {
        //建立一個MQTT Client
        MqttClient client = new MqttClient(MQTT_BROKER_ADDRESS);

        //增加事件，當收到訊息時會觸發client_MqttMsgPublishReceived
        client.MqttMsgPublishReceived += client_MqttMsgPublishReceived;

        //將要訂閱的topic放在string陣列裡面
        string[] topic = { "sensor/temp" };

        //設定對應於topic的QoS Level
        byte[] qosLevels = { MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE };
        
        //建立訂閱
        client.Subscribe(topic, qosLevels);
        
        //呼叫Connect建立連線，第一個參數為ClientID(可自訂)，二三個參數為Broker的帳號及密碼
        client.Connect("Hololens","username","password");
    }

    // Update is called once per frame
    void Update()
    {
        //將UI中的文字更新為收到的值
        object.transform.GetComponent<TextMeshPro>().text = mqttPayload;
    }

    void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
    {
        //將收到的內容放進mqttPayload字串，供Update使用
        mqttPayload = System.Text.Encoding.Default.GetString(e.Message);
    }
}
```
而下列則是用C#Public連線
```csharp=
using System.Text;
using uPLibrary.Networking.M2Mqtt;

//填寫MQTT Broker的IP位址
string MQTT_BROKER_ADDRESS = "127.0.0.1";

//宣告一個字串存放MQTT輸出的內容
string strValue = "";

//建立一個MQTT Client
MqttClient client = new MqttClient(MQTT_BROKER_ADDRESS);

//建立訂閱，第一個參數為Topic，第二個為預輸出值
client.Publish("sensor/temp",Encoding.UTF8.GetBytes(strValue));

//呼叫Connect建立連線，參數為ClientID(可自訂)
client.Connect("Machine");
```
訂閱與發佈混合:
先基礎宣告IP，MqttClient
在開始的地方建立MQTT Client => 增加事件 => 建立連線 => 建立訂閱
在自訂發布函式裡面 Json格式填入 => json格式轉成字串 => 建立訂閱