QtMQTT 導入手順

# QtMqtt について

MQTT は、IBM が考案した軽量な通信プロトコルで([MQTT の基本知識](https://www.ibm.com/developerworks/jp/iot/library/iot-mqtt-why-good-for-iot/index.html))、データ量の削減や省リソースの点でIoT界隈でも採用されているプロトコルです。

このプロトコルを、 Qt ベースで実装したライブラリとして [Qt Mqtt 5.12](https://doc.qt.io/QtMQTT/index.html) が提供されています。
※注 GPLです

こちらのライブラリを、自身の開発環境に導入する手順を記していきます。

# 環境について

作業は x86-64、 ubuntu16.04、Qt 5.12.0 を用いて進めます。
ただ、同じ方法で Windows 環境(UWP含む)でも導入可能でしたので、多くの方法は共通すると思います。

私の環境下では、Qtは以下のパスにインストールしています。

```shell:Qtのインストール先(例)
$ ls /opt/qt/Qt5.12.0
5.12.0    InstallationLog.txt  MaintenanceTool.dat  components.xml
Docs      Licenses             MaintenanceTool.ini  dist
Examples  MaintenanceTool      Tools                network.xml
```

## 下準備
まず、対象のビルド環境を準備しておくこと。
セルフビルドだけに限れば、インストールした環境のデフォルトになっているはずなので、特に用意する必要はありません。
Android や Windows10 IoT上で動作する QtMqtt を用意したい場合に別途準備する必要があります。

その手順については・・・、ある程度情報は転がっているだろう、という他力本願で。
必要性を感じたら折を見て記事を書きたいと思います。

## QtMqtt ソースコードの取得

肝心の QtMqtt は下記で公開されているので、適宜取得してください。
https://github.com/qt/qtmqtt.git

また、現時点では、master は 5.11 なので、5.12 向けにビルドする際はブランチを切り替えて作業を進めてください。

```shell
$ git clone https://github.com/qt/qtmqtt.git
$ cd qtmqtt
$ git branch
* 5.11
$ git checkout remotes/origin/5.12 -b 5.12
Branch 5.12 set up to track remote branch 5.12 from origin.
Switched to a new branch '5.12'
$ git branch
  5.11
* 5.12
```

## Makefile の生成

旧来から、Qt 用のプロジェクトファイル(*.pro)から、Makefile を生成する方法が多く取られ、qtmqtt でもその方法を採用しています。
qmake は、Qt のインストール先の下記ディレクトリに、ターゲットごとに用意されているため、作成したいターゲットにあわせて使い分けます。

```shell:ターゲットごとのqmake
$ ls /opt/qt/Qt5.12.0/5.12.0/*/bin/qmake
/opt/qt/Qt5.12.0/5.12.0/android_arm64_v8a/bin/qmake
/opt/qt/Qt5.12.0/5.12.0/android_armv7/bin/qmake
/opt/qt/Qt5.12.0/5.12.0/android_x86/bin/qmake
/opt/qt/Qt5.12.0/5.12.0/gcc_64/bin/qmake
```

それぞれ、以下の使い分けになります。

|ディレクトリ名|ターゲット|
|:-----------|:-------|
| android_arm64_v8a | ARMv8 以降の 64bit Android 向け |
| android_armv7 | ARMv7 以降の 32bit Android 向け |
| android_x86 | x86 の 32bit Android 向け |
| gcc_64 | x86-64 の 64bit PC Linux 向け |

PC Linux向けに作りたい場合は、gcc_64 以下の qmake を使い、ARMv7 の 32bit Android 向けに作りたい場合は、android_armv7 以下の qmake を使うことになります。
なお、android 向けにビルドを行う場合、Android NDK をインストールする必要があり、そちらへのパスも設定しておく必要があります。
(下記は Android SDK を /opt/google/android-sdk にインストールしている場合の例です)

```shell:
$ export ANDROID_NDK_ROOT=/opt/google/android-sdk/ndk-bundle/
```

PC 向けのライブラリを生成したい場合は、gcc_64 以下の qmake を使います。
Android 向け等、違うターゲット用に作りたい場合は、上記表を参考に、作りたいターゲット用の qmake を指定するだけです。

```shell:qmakeによるMakefileの生成
$ cd qtmqtt
$ ls
LICENSE.GPL3         dist      qtmqtt.pro  sync.profile
LICENSE.GPL3-EXCEPT  examples  src         tests
$ /opt/qt/Qt5.12.0/5.12.0/gcc_64/bin/qmake
$ ls
LICENSE.GPL3         Makefile  examples    src           tests
LICENSE.GPL3-EXCEPT  dist      qtmqtt.pro  sync.profile
```
あとは、ターゲットを問わず make コマンドでビルド＆インストールを実施するだけ(Qt SDK 以下にインストールされるので書き込み権限には注意)。

```shell:ビルド＆インストール
$ make
$ make install
```
```shell:インストール先を確認
$ ls /opt/qt/Qt5.12.0/5.12.0/gcc_64/lib/libQt5Mqtt.*
/opt/qt/Qt5.12.0/5.12.0/gcc_64/lib/libQt5Mqtt.la
/opt/qt/Qt5.12.0/5.12.0/gcc_64/lib/libQt5Mqtt.prl
/opt/qt/Qt5.12.0/5.12.0/gcc_64/lib/libQt5Mqtt.so
/opt/qt/Qt5.12.0/5.12.0/gcc_64/lib/libQt5Mqtt.so.5
/opt/qt/Qt5.12.0/5.12.0/gcc_64/lib/libQt5Mqtt.so.5.12
/opt/qt/Qt5.12.0/5.12.0/gcc_64/lib/libQt5Mqtt.so.5.12.0
/opt/qt/Qt5.12.0/5.12.0/gcc_64/lib/libQt5Mqtt.so.5.12.0.debug

$ ls /opt/qt/Qt5.12.0/5.12.0/gcc_64/include/QtMqtt
5.12.0                           QtMqtt
QMqttAuthenticationProperties    QtMqttDepends
QMqttClient                      QtMqttVersion
QMqttConnectionProperties        qmqttauthenticationproperties.h
QMqttLastWillProperties          qmqttclient.h
QMqttMessage                     qmqttconnectionproperties.h
QMqttMessageStatusProperties     qmqttglobal.h
QMqttPublishProperties           qmqttmessage.h
QMqttServerConnectionProperties  qmqttpublishproperties.h
QMqttStringPair                  qmqttsubscription.h
QMqttSubscription                qmqttsubscriptionproperties.h
QMqttSubscriptionProperties      qmqtttopicfilter.h
QMqttTopicFilter                 qmqtttopicname.h
QMqttTopicName                   qmqtttype.h
QMqttUnsubscriptionProperties    qtmqttversion.h
QMqttUserProperties
```