「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > MQTT ブローカー経由で IoT デバイス データを送信します。

MQTT ブローカー経由で IoT デバイス データを送信します。

2024 年 11 月 8 日に公開
ブラウズ:930

Sending IoT Device Data via MQTT broker.

前回の投稿では、MQTT ブローカーを使用して IoT デバイスからメッセージを送受信する方法を説明しました。この投稿では、そのアイデアを実際の例に拡張します。

温室内の温度と湿度を測定する IoT デバイスがあるとします (Raspberry Pi または Arduino を使用して作成するのは難しくありません)

私たちは、別のコンピューター、またはおそらく中央ログサービスから温室の状態をリモートで監視したいと考えています。前回の投稿では、メッセージを送信するコードの Go 実装を示したので、その例を拡張します。

単に「温度は x、湿度は y」という文字列を送信する代わりに、メッセージとデバイスの構造を定義しましょう。湿気や降雨量を監視するデバイスがあり (または将来追加したいと考えていて)、それも接続したいと考えているとします。

複数のデバイスとタイプの可能性を残しておくには、それを処理するデータ モデルが必要です。

type Message struct {
    Time   time.Time `json:"time"`
    Device Device    `json:"device"`
}

type Device interface {
    ID() string
    Name() string
}

type TempRHDevice struct {
    Id         string  `json:"id"`
    DeviceName string  `json:"name,omitempty"`
    Temp       float32 `json:"temp,omitempty"`
    Rh         float32 `json:"rh,omitempty"`
}

func (t TempRHDevice) ID() string {
    return t.Id
}

func (t TempRHDevice) Name() string {
    return t.DeviceName
}

メッセージ構造体は、MQTT ブローカーに送信されるものです。私たちは、IoT デバイスの共通属性を処理し、特定のデバイスの詳細を抽象化するインターフェイスを作成しました。

TempRHDevice は、温度と湿度を測定する当社のデバイスです。 Device インターフェイスを実装しているため、Message.

で使用できます。

次に、メッセージをブローカーに送信する必要があります。この例では、簡単にするために JSON 形式を使用します。 数千台以上のデバイスを備えた大規模システムでは、よりコンパクトな形式を使用する必要がある場合があることに注意してください。

message := generateRandomMessage()
payload, err := json.Marshal(message)
if err != nil {
    panic(err)
}
token := client.Publish(topic, 0, false, payload)

Go を使用すると、JSON へのマーシャリングが非常に簡単になります。マーシャリングされると、json メッセージがブローカーに送信されます。

データを取得したら、他に何をしたいでしょうか。データベースに保存し、ダッシュボードに表示し、アラーム条件の値を確認します。 json を使用できるように変換する必要があります。

受信側では、JSON を構造体にアンマーシャリングするだけです。送信側で使用されるものと同様の構造を使用します。ただし、Message の Device インターフェイスではなく、具体的な型にアンマーシャリングする方法が必要です。メッセージにカスタムのアンマーシャル メソッドを追加して、コードも少しすっきりさせます

type rawMessage struct {
    Time   time.Time `json:"time"`
    Device TempRHDevice    `json:"device"`
}
func (m *Message) UnmarshalJSON(data []byte) error {
    var raw rawMessage
    if err := json.Unmarshal(data, &raw); err != nil {
        return err
    }
    m.Time = raw.Time
    m.Device = &raw.Device
    return nil
}

...

func processMsg(ctx context.Context, ....

...

    case msg, ok := 



デバイスの種類が増えると、この方法が複雑になることをここで指摘するのは適切です。たとえば、UnmarshalJSON メソッドは、メッセージに含まれるデバイスの種類をどのようにして認識するのでしょうか。 UnmarshalJSON で賢いロジックを実行して型を検出できます。

別の方法として、MQTT を使用して複数のトピックに公開できること、およびトピックに階層的な命名規則を使用することが一般的であることを思い出してください。したがって、温室の例に複数のデバイス タイプがある場合、推奨される方法は、異なるデバイス タイプを異なるトピックに公開することです。これは、新しいデバイス タイプを追加するときに今後処理する方法です。

温室の例では、トピック名は次のように構成できます:

/greenhouse/temprh/deviceid
/greenhouse/moisture/deviceid

MQTT では、次のようなワイルドカード トピックを使用してトピックをサブスクライブできます。

if token := client.Subscribe("/greenhouse/#", 0, nil); token.Wait() && token.Error() != nil {
        fmt.Println(token.Error())
        os.Exit(1)
    }

温室名前空間内のすべてのデバイスと一致します。その後、 processMsg() にロジックを追加して、受信メッセージのトピックを調べ、それをアンマーシャリングする方法を知る必要があります。

デバイス メッセージを使用可能な形式で取得したので、これをどうすればよいでしょうか。このシリーズの次の投稿では、メッセージを PostGres に保持するアプローチを示します。

いつものように、送信者の完全なソース コードはここにあり、サブスクライバ コードはここにあります。

コメント欄であなたのご意見をお聞かせください。

ありがとう!

リリースステートメント この記事は次の場所に転載されています: https://dev.to/johnscode/sending-iot-device-data-via-mqtt-broker-3ji6?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3