Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Menghantar Data Peranti IoT melalui broker MQTT.

Menghantar Data Peranti IoT melalui broker MQTT.

Patricia Arquette
Patricia Arquetteasal
2024-09-23 14:19:29985semak imbas

Sending IoT Device Data via MQTT broker.

Dalam siaran sebelumnya, kami menunjukkan cara menghantar dan menerima mesej daripada peranti IoT menggunakan broker MQTT. Dalam siaran ini, kami akan memanjangkan idea itu kepada contoh dunia sebenar.

Andaikan anda mempunyai peranti IoT yang mengukur suhu dan kelembapan dalam rumah hijau (Tidak sukar untuk membuatnya menggunakan Raspberry Pi atau Arduino).

Kami mahu memantau keadaan rumah hijau dari jauh dari komputer lain atau, mungkin, perkhidmatan pembalakan pusat. Dalam siaran sebelumnya, kami menunjukkan pelaksanaan kod Go untuk menghantar mesej supaya kami akan melanjutkan contoh itu.

Daripada hanya menghantar rentetan yang mengatakan "temp ialah x, kelembapan ialah y", mari kita tentukan struktur untuk mesej dan peranti. Pertimbangkan bahawa anda mempunyai (atau ingin menambah pada masa hadapan) peranti untuk memantau kelembapan atau hujan dan anda mahu menyambungkannya juga.

Untuk membuka kemungkinan berbilang peranti dan jenis, kami memerlukan model data untuk mengendalikannya.

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
}

Struktur Mesej ialah apa yang akan dihantar kepada broker MQTT. Kami mencipta antara muka untuk mengendalikan atribut biasa peranti IoT kami dan mengabstrakkan butiran peranti tertentu.

TempRHDevice ialah peranti kami yang mengukur suhu dan kelembapan. Ia melaksanakan antara muka Peranti, jadi ia boleh digunakan dalam Mesej.

Seterusnya, kita perlu menghantar mesej kepada broker. Kami akan menggunakan format JSON untuk kesederhanaannya dalam contoh ini. Perhatikan bahawa dalam sistem berskala besar dengan ribuan atau lebih peranti, kami mungkin mahu menggunakan format yang lebih padat.

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

Go menjadikan marshalling ke JSON agak mudah. Setelah disusun, mesej json dihantar kepada broker.

Apa lagi yang ingin kami lakukan dengan data setelah kami memilikinya: simpannya ke pangkalan data, paparkannya pada papan pemuka, semak nilai untuk keadaan penggera. Kita perlu menukar json untuk menjadikannya boleh digunakan.

Di bahagian penerima, kita hanya perlu membongkar json ke dalam struct. Kami akan menggunakan struktur yang serupa dengan yang digunakan pada bahagian penghantaran; tetapi kita memerlukan cara untuk membongkar jenis konkrit dan bukannya antara muka Peranti dalam Mesej. Kami akan menambah kaedah unmarshal tersuai pada Message untuk menjadikan kod itu lebih bersih juga

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 := <-input:
    if !ok {
        return
    }
    logger.Info().Msg(fmt.Sprintf("Received message: %s from topic: %s\n", msg.Payload(), msg.Topic()))
    var iotMsg Message
    err := json.Unmarshal(msg.Payload(), &iotMsg)
    if err != nil {
        logger.Error().Err(err).Msg("Error unmarshalling Message")
    } else {
        out <- iotMsg
    }

...

Adalah wajar untuk menunjukkan di sini bahawa kaedah ini menjadi rumit apabila lebih banyak jenis peranti ditambahkan. Sebagai contoh, bagaimana kaedah UnmarshalJSON mengetahui jenis peranti yang mengandungi mesej. Kita boleh melakukan beberapa logik pintar dalam UnmarshalJSON untuk mengesan jenisnya.

Untuk alternatif lain, ingat bahawa MQTT boleh digunakan untuk menerbitkan kepada berbilang topik dan adalah amalan biasa untuk menggunakan konvensyen penamaan hierarki untuk topik. Oleh itu, dalam kes berbilang jenis peranti dalam contoh rumah hijau, cara yang disyorkan adalah dengan mempunyai jenis peranti yang berbeza diterbitkan ke topik yang berbeza. Inilah cara kami akan mengendalikannya semasa kami menambah jenis peranti baharu.

Dalam contoh rumah hijau, nama topik boleh distrukturkan seperti:

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

Dalam MQTT, kami boleh melanggan topik menggunakan topik kad bebas, seperti:

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

yang akan sepadan dengan semua peranti dalam ruang nama rumah hijau. maka kita hanya perlu menambah logik pada processMsg() untuk melihat topik mesej masuk untuk mengetahui cara menyahmarshalnya.

Sekarang kami mempunyai mesej peranti dalam bentuk yang boleh digunakan, apa yang perlu dilakukan dengannya. Dalam siaran seterusnya dalam siri ini, kami akan menunjukkan pendekatan kami untuk mengekalkan mesej dalam PostGres.

Seperti biasa kod sumber penuh untuk pengirim boleh didapati di sini dan kod pelanggan boleh didapati di sini.

Beri tahu saya pendapat anda dalam ulasan.

Terima kasih!

Atas ialah kandungan terperinci Menghantar Data Peranti IoT melalui broker MQTT.. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn