MQTT Publisher ボックスを作る その2


## はじめに
* 「[MQTT Publisher ボックスを作る](http://qiita.com/Suna/items/26dc236606f27dfafa16)」の続きです。
*  TLS 接続に対応してみました。

### TLS MQTT Publisher ボックス

前回のボックスをコピーして、「TLS MQTT Pub」ボックスを作成します。


#### 設定項目

* Port を 8883 に変更
* Topic のパスに tls を追加 (前回との区別のためだけです)
* Certificate パラメータを追加

Certificate には証明書のファイル名を指定します。test.mosquitto.org を使う場合には[コチラ](http://test.mosquitto.org)からダウンロードします。

![2015032901.png](https://qiita-image-store.s3.amazonaws.com/0/20418/20e5c8b9-67fe-f6a9-cf7f-741d1c0894b9.png "2015032901.png")

使用する証明書は以下の場所に配置します。

![2015032902.png](https://qiita-image-store.s3.amazonaws.com/0/20418/32d00dae-39b8-c3bc-754e-43611e1494e2.png "2015032902.png")


#### Python コード

コードはこんな感じにします。前回とほとんど変わりません。crt_file を取得して、tls_set() しているだけです。

```python
class MyClass(GeneratedClass):
    def __init__(self):
        GeneratedClass.__init__(self)

    def onLoad(self):
        self.framemanager = ALProxy("ALFrameManager")
        self.folderName = None

    def onUnload(self):
        import sys

        if self.folderName and self.folderName in sys.path:
            sys.path.remove(self.folderName)
        self.folderName = None

    def onInput_onStart(self, payload):
        import sys, os

        self.folderName = os.path.join(
            self.framemanager.getBehaviorPath(self.behaviorId), "../lib")
        if self.folderName not in sys.path:
            sys.path.append(self.folderName)

        import paho.mqtt.client as paho

        host       = self.getParameter("Broker Host")
        port       = self.getParameter("Broker Port")
        crt_file   = self.getParameter("Certificate")
        keep_alive = self.getParameter("KeepAlive")
        topic      = self.getParameter("Topic")
        qos        = self.getParameter("Qos")
        retain     = self.getParameter("Retain")

        mqttc = paho.Client()
        mqttc.tls_set(self.folderName + "/crts/" + crt_file)
        mqttc.connect(host, port, keep_alive)
        mqttc.publish(topic, payload, qos, retain)

    def onInput_onStop(self):
        self.onUnload()
        self.onStopped()
```


#### Choregraphe で接続

これも前回とほとんど同じです。

![2015032903.png](https://qiita-image-store.s3.amazonaws.com/0/20418/dd35ff57-d56a-b40a-1d47-e44e8b696d69.png "2015032903.png")


### Subscriber 側

Subscriber もほとんど同じです。

```tls_sub.py
import paho.mqtt.client as paho

def on_message(mqttc, obj, msg):
    print("topic: " + msg.topic + ", payload: " + str(msg.payload) + ", qos: " + str(msg.qos) + ", retain: " + s\
tr(msg.retain))

if __name__ == '__main__':
    mqttc = paho.Client()

    mqttc.on_message = on_message
    mqttc.tls_set("mosquitto.org.crt")
    mqttc.connect("test.mosquitto.org", 8883, 60)
    mqttc.subscribe("my/topic/tls/pepper", 0)

    mqttc.loop_forever()
```


### 動作確認

#### Subscriber を実行

PC 上で実行し、トピックに対するメッセージを受け取るために待機します。

```bash
$ python tls_sub.py
```


#### Publisher を実行

Choregraphe でプログラムを実行し、メッセージを送信します。


#### 結果表示

Publisher -> Broker -> Subscriber とメッセージが伝わり、Subscriber 側で表示されました。

```bash
$ python tls_sub.py
topic: my/topic/tls/pepper, payload: TLS Hello World from Pepper, qos: 0, retain: 0
```

#### 通信内容の確認

一応、SSL/TLS になっているか、パケットをキャプチャして見てみます。内容の詳細までは見ていませんが、何やら SSL/TLSv1 でやりとりしているらしいことが分かります。

![2015032904.png](https://qiita-image-store.s3.amazonaws.com/0/20418/8ce92eb2-8d3e-534f-2643-c66f1858ec84.png "2015032904.png")


### 感想

* Topic は外から渡せるようにしておいたほうが良い気がしています。
* 次は Sub ボックスをやります。
* でも、3/31 で Choregraphe の期限が切れてしまいます(泣