# 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

開啟NuGet後,在搜尋框裡搜尋M2Mqtt,安裝M2Mqtt by Paolo Patierno

## 建立與Broker的連線
在Assets>Scripts目錄內點選右鍵,建立C# Script,這裡使用ConnectToBroker作為檔名

開啟檔案後首先需要先引用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格式轉成字串 => 建立訂閱