0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

M2MqttUnityライブラリを使用したUnityでMQTT

Posted at

M2MqttUnityライブラリを使用したUnityでのMQTT利用:ステップバイステップガイド

Unityは、幅広いゲームやシミュレーションを作成するために使用されている人気のゲームエンジンです。MQTTは、パブリッシュ/サブスクライブモデルに基づく軽量なメッセージングプロトコルであり、低帯域幅や不安定なネットワーク環境でのIoTアプリケーション向けに特別に設計されています。

MQTTは、AR(拡張現実)ゲーム、センサーやその他のデバイスを利用したIoT対応ゲーム、ゲームやシミュレーションのリモートコントロールなど、さまざまな目的でUnityで使用できます。例えば、ARゲームでは、ユーザーのデバイスから平面表面の位置、オブジェクト、人、顔の検出など、世界に関する情報を受信するためにMQTTが使用されます。

このブログでは、M2MQTTをUnityで使用するためのシンプルなUnity3dプロジェクトを提供します。プロジェクトには、ブローカーへの接続管理やメッセージングのテスト用のユーザーインターフェースを備えた例のシーンが含まれています。

前提条件

Unityのインストール

Unityのインストーラーは、Unityのウェブサイトから主要なプラットフォーム向けにダウンロードできます。

MQTTブローカーの準備

先に進む前に、通信およびテスト用のMQTTブローカーを用意してください。

このブログ記事では、broker.emqx.ioにある無料のパブリックMQTTブローカーを使用します。

サーバー: broker.emqx.io
TCPポート: 1883
WebSocketポート: 8083
SSL/TLSポート: 8883
セキュアWebSocketポート: 8084

無料のパブリックMQTTブローカーは、MQTTプロトコルを学習およびテストしたい方専用に提供されています。セキュリティリスクやダウンタイムの懸念があるため、本番環境での使用は避けることが重要です。

Open Manufacturing Hub

MQTTブローカー選定の実践ガイド

この実践ガイドをダウンロードして、MQTTブローカーを選ぶ際に考慮すべき点を学びましょう。

eBookを入手 →

Unity用のM2MQTT

M2MQTTライブラリは、UnityでM2MQTTを使用するためのシンプルなUnity3dプロジェクトです。ブローカーへの接続管理やメッセージングのテスト用のUIを備えた例のシーンが含まれています。このブログ記事では、例のシーンを使用して、MQTTを利用してMQTTブローカーと通信するアプリケーションを作成する方法を説明します。

まず、GitHubからリポジトリをダウンロードします。

git clone https://github.com/CE-SDV-Unity/M2MqttUnity.git

例のシーンをインポートする

次に、UnityHubで新しいUnityプロジェクトを作成します。

UnityHubで新しいUnityプロジェクトを作成

その後、ダウンロードしたM2MQTTリポジトリからM2MqttおよびM2MqttUnityフォルダを新しいUnityプロジェクトのAssetsフォルダにコピーします。

M2MqttとM2MqttUnityをコピー

ライブラリには、M2MqttUnity_Testというテストシーンが含まれており、M2MqttUnity/Examples/Scenesフォルダにあります。このシーンを確認すると、MQTTクライアントのセットアップに使用されている唯一のスクリプトはM2MqttUnityTest.csであり、このスクリプトはシーン内のM2MQTT GameObjectにアタッチされています。ただし、このスクリプトはメインフォルダM2Mqttの他のクラスとリンクされています。

接続と購読

Playボタンを押してアプリケーションを実行します。Gameタブには、ブローカーアドレス入力ボックスにデフォルトでオフラインのブローカーが表示されます。事前に準備したパブリックMQTTブローカー(broker.emqx.io)に置き換える必要があります。

アプリケーションを実行

アドレスを置き換えたら、「Connect」をクリックしてパブリックMQTTブローカーへの接続を確立します。

「Connect」をクリック

対応するコードは非常にシンプルです。broker.emqx.ioへの接続を作成し、トピック「M2MQTT_Unity/test」を購読します。

public void SetBrokerAddress(string brokerAddress)
{
    if (addressInputField && !updateUI)
    {
        this.brokerAddress = brokerAddress;
    }
}

public void SetBrokerPort(string brokerPort)
{
    if (portInputField && !updateUI)
    {
        int.TryParse(brokerPort, out this.brokerPort);
    }
}

public void SetEncrypted(bool isEncrypted)
{
    this.isEncrypted = isEncrypted;
}

public void SetUiMessage(string msg)
{
    if (consoleInputField != null)
    {
        consoleInputField.text = msg;
        updateUI = true;
    }
}

public void AddUiMessage(string msg)
{
    if (consoleInputField != null)
    {
        consoleInputField.text += msg + "\n";
        updateUI = true;
    }
}

protected override void OnConnecting()
{
    base.OnConnecting();
    SetUiMessage("Connecting to broker on " + brokerAddress + ":" + brokerPort.ToString() + "...\n");
}

protected override void OnConnected()
{
    base.OnConnected();
    SetUiMessage("Connected to broker on " + brokerAddress + "\n");

    if (autoTest)
    {
        TestPublish();
    }
}

protected override void SubscribeTopics()
{
    client.Subscribe(new string[] { "M2MQTT_Unity/test" }, new byte[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE });
}

MQTTメッセージのパブリッシュ

別のクライアントとしてMQTTクライアントツール - MQTTXを使用して、メッセージのパブリッシュと受信をテストします。

MQTTXクライアントツール - MQTTX

接続後、「Test Publish」をクリックします。「Test message」がゲームクライアントとMQTTXの両方で受信されたことが確認できます。

「Test Publish」をクリック

「Test message」が受信されました

対応するコードは、publish()関数を使用してトピック「M2MQTT_Unity/test」にメッセージ「Test message」をパブリッシュします。

public void TestPublish()
{
    client.Publish("M2MQTT_Unity/test", System.Text.Encoding.UTF8.GetBytes("Test message"), MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, false);
    Debug.Log("Test message published");
    AddUiMessage("Test message published.");
}

メッセージの受信

メッセージの受信

MQTTXを使用して別のテストメッセージを送信すると、クライアントがそれを受信し、Gameタブに表示されます。

別のテストメッセージを送信

対応するコードは、メッセージをデコード、処理し、Gameタブに表示します。

protected override void DecodeMessage(string topic, byte[] message)
{
    string msg = System.Text.Encoding.UTF8.GetString(message);
    Debug.Log("Received: " + msg);
    StoreMessage(msg);
    if (topic == "M2MQTT_Unity/test")
    {
        if (autoTest)
        {
            autoTest = false;
            Disconnect();
        }
    }
}

private void StoreMessage(string eventMsg)
{
    eventMessages.Add(eventMsg);
}

private void ProcessMessage(string msg)
{
    AddUiMessage("Received: " + msg);
}

protected override void Update()
{
    base.Update(); // call ProcessMqttEvents()

    if (eventMessages.Count > 0)
    {
        foreach (string msg in eventMessages)
        {
            ProcessMessage(msg);
        }
        eventMessages.Clear();
    }
    if (updateUI)
    {
        UpdateUI();
    }
}

完全なコード

すべてのサンプルコードは以下で見つけることができます:Github qtmqtt/example

Qt Creatorでの一般的なコンパイルエラー

  1. 「Qt6」というパッケージ構成ファイル(Qt6Config.cmakeまたはqt6-config.cmake)が見つかりませんでした。

    qtmqttをQt Creatorにインポートした後、以下のエラーが発生することがあります。

    [cmake] CMake Error at CMakeLists.txt:14 (find_package):
    [cmake]   Could not find a package configuration file provided by "Qt6" (requested
    [cmake]   version 6.6.2) with any of the following names:
    [cmake]
    [cmake]     Qt6Config.cmake
    [cmake]     qt6-config.cmake
    [cmake]
    [cmake]   Add the installation prefix of "Qt6" to CMAKE_PREFIX_PATH or set "Qt6_DIR"
    [cmake]   to a directory containing one of the above files.  If "Qt6" provides a
    

    解決策として、デスクトップ(arm-xx)用のビルドターゲットのQtバージョンが正しいことを「Manage Kits」で確認する必要があります。

    Qt Creator

まとめ

このブログ記事では、Unityを使用してMQTTブローカーと通信するアプリケーションを作成する方法についてのガイドを提供しました。このガイドに従うことで、接続の確立、トピックの購読、メッセージのパブリッシュ、およびM2MQTTライブラリを使用したリアルタイムメッセージの受信方法を学ぶことができます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?