物联网时代的编程(主要是关于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进行区分

protocol適した用途http1対1で画像など大きなデータをやりとりしたい, secureな通信がしたいmqtt複数台から小さいデータを大量にもらいたい

发布/订阅

pub-sub.jpg
    • メッセージの送信者(publisher)が特定の受信者(subscriber)に直接メッセージを送信しない

 

    • メッセージのやりとりにはBrokerと呼ばれる中継serverが必要

サーバーがメッセージを保管するため受信側の状態に関係なくメッセージを送れる

オフラインでもOK

publisher/subscriberがMQTT client

接続時のデバイスIDが被ると古い接続が切れる

来源:保护MQTT – BuildingIoT 2016 幻灯片


消息(=主题+数据)

pub-sub-model.png
    1. 订阅者向代理商申请接收主题的消息。

 

    1. 仅需要进行一次连接。

 

    1. 当代理商发布主题时,将消息发送给已申请连接的订阅者。

 

    1. 无法发送过去的消息(最后一条消息可以选择接收)。

 

    订阅者的访问信息不会通知给发布者。

来源:Paho Python MQTT客户端和G代码可视化讨论,Chennaipy


话题

    • 一般的に/(スラッシュ)で階層化3

ex, tokyoA/temp

ワイルドカード(#,+)
mosquittoなどの一部ブローカーにはACL機能有り


服务质量 (Service Quality)

    • client間のメッセージ到達保証レベル(Quality of Service)

 

    • 通常は0、コントロール系のメッセージは1以上、が基本

1以上はbrokerでstoreが必要

Kafkaの例だが佐伯さんのスライドがわかりやすい

leveldescexample0At most once(メッセージ到達保証無)subscriberの受信失敗時のケアがない、など1At least once(届くけど重複するかも)subscriberのACK受信失敗時に再送、など2Exactly once(確実に重複無く届ける)transaction制御、速度低下

(闲话)日志的质量决定着准确性。

    • 米テックジャイアントのログ収集は実は雑

重複やロストは気にしない
ログ設計はすごい。デモグラなど混ぜて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中传输层安全的权衡。
初次接触MQTT。
广告
将在 10 秒后关闭
bannerAds