物联网时代的编程(主要是关于MQTT)
物联网中的软件和特点
-
- Arduino
イベント駆動
MQTT
軽量プロトコル
publish/subscribe型のMQ
Arduino是什么?
-
- 無償で使えるマイコン用プログラム作成アプリ
マイコン毎にアドオンがある(ex, ESP8266)
スケッチ(=プログラム)はsetup/loopで構成
setup: 電源入り後一度だけ呼ばれる
loop: (電源切るまで)繰り返し呼ばれる
提供されているスケッチ例を改造して動かす
$brew cask install arduino
MQTT是什么?
-
- Message Queuing Telemetry Transport
-
- 非常に軽量なプロトコル
2000年代初めに登場し標準化
TCP/IP上で動く
publish/subscribe型のメッセージ転送
IoT/モバイルに適する
センサーデバイス
Facebook Messengerで使われている
比起HTTP来说
-
- 軽量(ヘッダが最小2バイト)1・優れた処理速度・省電力
HTTPではヘッダのオーバーヘッドが高い
AgostoのテストによるとHTTPSの10倍以上オーバーヘッドが低い
IoTの利用場面に適している
貧弱な電波環境(通信帯域制限)
バイト毎に料金・バッテリーを消費する環境
与HTTP头进行比较
$curl --head https://www.yahoo.co.jp/
HTTP/1.1 200 OK
Date: Tue, 18 Jul 2017 18:10:57 GMT
(中略)
$curl --head https://www.yahoo.co.jp/ | wc -c
703
-
- 最小まで減らすとしたらHTTP/1.1 200 OKの15byte
-
- MQTTでは最小2バイト1
通信量が膨大になるほどこの10byteの差が意味を持つ
加密
-
- TLSを使った暗号接続が可能
port: 8883
ただし通信毎に認証が必要なので軽量さは失われる2
メッセージ全体のサイズが大きいならヘッダの10バイト差は誤差
MQTTとHTTPsどちらが適しているか要検討
与HTTP进行区分
发布/订阅
-
- メッセージの送信者(publisher)が特定の受信者(subscriber)に直接メッセージを送信しない
-
- メッセージのやりとりにはBrokerと呼ばれる中継serverが必要
サーバーがメッセージを保管するため受信側の状態に関係なくメッセージを送れる
オフラインでもOK
publisher/subscriberがMQTT client
接続時のデバイスIDが被ると古い接続が切れる
来源:保护MQTT – BuildingIoT 2016 幻灯片
消息(=主题+数据)
-
- 订阅者向代理商申请接收主题的消息。
-
- 仅需要进行一次连接。
-
- 当代理商发布主题时,将消息发送给已申请连接的订阅者。
-
- 无法发送过去的消息(最后一条消息可以选择接收)。
- 订阅者的访问信息不会通知给发布者。
来源:Paho Python MQTT客户端和G代码可视化讨论,Chennaipy
话题
-
- 一般的に/(スラッシュ)で階層化3
ex, tokyoA/temp
ワイルドカード(#,+)
mosquittoなどの一部ブローカーにはACL機能有り
服务质量 (Service Quality)
-
- client間のメッセージ到達保証レベル(Quality of Service)
-
- 通常は0、コントロール系のメッセージは1以上、が基本
1以上はbrokerでstoreが必要
Kafkaの例だが佐伯さんのスライドがわかりやすい
(闲话)日志的质量决定着准确性。
-
- 米テックジャイアントのログ収集は実は雑
重複やロストは気にしない
ログ設計はすごい。デモグラなど混ぜて1レコードに豊富な情報量
重複もロストも許さないログでディープラーニングにかけたら、モデルの精度がテックジャイアントより高かった
precision/recallがほぼ1
1レコードは購買やPVなど基本情報のみ
日本向けサービス同士の比較なので、日本語の壁など外的要因な可能性も
由于保密原因,我们不会公开详细信息。
MQTT代理服务器
-
- OSS
mosquitto
cloud
cloudMQTT
ニフティクラウド
公開MQTTテスト用ブローカー
iot.eclipse.org
MQTT客户端
-
- OSS
paho
様々な言語に対応
PubSubClient
Arduinoクライアント
日本語のスケッチ例はこちら
蚊子与Python中的paho
MQTT通信在Mac上的设置步骤如下:
$brew install mosquitto
# mosquitto起動のため以下のどちらかを実行
# bg
$brew services start mosquitto
# fg
$/usr/local/opt/mosquitto/sbin/mosquitto -c /usr/local/etc/mosquitto/mosquitto.conf
$pip install paho-mqtt
发布.py
在模仿Python客户端教程的同时
import paho.mqtt.client as mqtt
import time
client = mqtt.Client()
client.connect('localhost', 1883, keepalive=60)
client.loop_start()
while True:
client.publish('world/darai0512', 'test')
time.sleep(1)
执行paho sub.py。
import paho.mqtt.client as mqtt
def on_connect(client, userdata, flags, respons_code):
print('connected')
client.subscribe('world/#')
def on_message(client, userdata, msg):
print(msg.topic + ' ' + str(msg.payload))
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect('localhost', 1883, keepalive=60)
client.loop_forever()
让我们尝试一下 MQTT
$python pub.py &
$python sub.py
world/darai0512 test
world/darai0512 test
...
MQTT中传输层安全的权衡。
初次接触MQTT。