Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Industrial Internet of Things >> Tertanam

Menerapkan klien MQTT untuk sistem reaktif

MQTT-Reactive adalah klien MQTT v3.1.1 yang berasal dari perpustakaan MQTT-C LiamBindle. Tujuan MQTT-Reactive adalah untuk menyediakan klien MQTT portabel dan non-blocking yang ditulis dalam C untuk digunakan dalam sistem tertanam reaktif. Pertama-tama, artikel ini menjelaskan apa itu sistem reaktif. Kemudian, dijelaskan bagaimana merancang struktur perangkat lunak yang sesuai untuk sistem semacam itu. Akhirnya artikel menunjukkan cara menggunakan perpustakaan MQTT-Reaktif dalam sistem reaktif dengan menggunakan mesin keadaan dan paradigma yang digerakkan oleh peristiwa. Untuk melakukan itu, artikel tersebut menggunakan perangkat IoT nyata sebagai contoh demonstratif dari mana artikel tersebut menjelaskan struktur perangkat lunaknya dan perilaku berbasis status dengan menggunakan diagram UML seperti mesin status, interaksi, dan struktur. Artikel ini juga memberikan panduan untuk mengimplementasikan klien MQTT-Reactive perangkat IoT dalam bahasa C.

Banyak sistem tertanam bersifat reaktif, yaitu bereaksi terhadap kejadian internal atau eksternal. Setelah reaksi ini selesai, perangkat lunak kembali untuk menunggu acara berikutnya. Itulah sebabnya sistem yang digerakkan oleh peristiwa secara alternatif disebut sistem reaktif.

Pemrograman berbasis peristiwa, atau pemrograman reaktif, adalah salah satu paradigma pemrograman yang paling cocok untuk mencapai perangkat lunak yang fleksibel, dapat diprediksi, dan dapat dipelihara untuk sistem reaktif. Dalam paradigma ini alur program ditentukan oleh peristiwa. Seringkali, struktur perangkat lunak reaktif terdiri dari beberapa unit bersamaan, yang dikenal sebagai objek aktif, yang menunggu dan memproses berbagai jenis kejadian. Setiap objek aktif memiliki utas kontrol dan antrian peristiwa yang melaluinya ia memproses peristiwa yang masuk. Dalam sistem reaktif, objek aktif biasanya memiliki perilaku berbasis status yang didefinisikan dalam bagan status.

Untuk mempelajari cara menggunakan library MQTT-Reactive dalam sistem reaktif dengan banyak dan  tugas bersamaan, serta menggunakan state machine dan paradigma berbasis peristiwa, kami menggunakan perangkat IoT sebagai contoh.

Ide menggunakan protokol MQTT lahir ketika perangkat IoT sedang dikembangkan untuk perusahaan kereta api. Perangkat ini adalah sistem reaktif yang jelas yang mampu:

  1. mendeteksi dan menyimpan perubahan beberapa input digital
  2. memperoleh, memfilter, dan menyimpan beberapa sinyal analog
  3. mengirim informasi yang disimpan ke server jauh secara berkala
  4. mengirim dan menerima informasi melalui protokol MQTT melalui jaringan GSM

MQTT dipilih karena merupakan protokol perpesanan ringan berbasis penerbit-pelanggan yang umum digunakan dalam IoT dan aplikasi jaringan di mana diharapkan tautan dengan latensi tinggi dan kecepatan data rendah seperti jaringan GSM.

Kemampuan MQTT untuk perangkat IoT tersebut dicapai dengan menggunakan versi modifikasi dari MQTT-C LiamBindle. Karena perangkat lunak perangkat itu telah dirancang sebagai perangkat lunak reaktif, MQTT-C harus dimodifikasi untuk mengomunikasikannya dengan seluruh sistem dengan bertukar peristiwa asinkron. Peristiwa ini digunakan untuk menerima dan mengirim lalu lintas melalui jaringan serta untuk menghubungkan dan menerbitkan informasi sensitif ke server. Pustaka perangkat lunak yang dihasilkan disebut MQTT-Reactive.

Mesin negara

MQTT-Reactive digunakan melalui mesin status seperti yang ditunjukkan pada Gambar 1, yang memodelkan perilaku dasar klien MQTT-Reactive. Itu adalah objek aktif yang disebut MqttMgr (MQTT Manager). Tindakan mesin negara pada Gambar 1 menunjukkan bagaimana perpustakaan MQTT-Reaktif dapat digunakan dari mesin negara. Meskipun bahasa C digunakan sebagai bahasa tindakan pada Gambar 1, komputer atau bahasa formal apa pun dapat digunakan.

klik untuk gambar lebih besar

Gambar 1. Mesin status klien MQTT-Reactive (Sumber:VortexMakes)

Mesin status pada Gambar 1 dimulai dalam status WaitingForNetConnection. Setelah koneksi jaringan dibuat ke server, WaitingForNetConnection menerima acara Activate, dan kemudian mesin status bertransisi ke status WaitingForSync. Hanya dalam keadaan ini mesin negara dapat mementaskan pesan MQTT untuk dikirim ke broker seperti CONNECT atau PUBLISH melalui acara Connect dan Publish masing-masing. Status Sinkronisasi menggunakan mekanisme khusus UML untuk menunda peristiwa Terbitkan yang ditentukan oleh kata kunci penangguhan yang disertakan dalam kompartemen internal status Sinkronisasi. Jika peristiwa Terbitkan terjadi saat Sinkronisasi adalah status saat ini, peristiwa tersebut akan disimpan (ditangguhkan) untuk diproses di masa mendatang hingga SM memasuki keadaan di mana peristiwa Terbitkan tidak ada dalam daftar peristiwa yang ditangguhkan seperti WaitingForSync atau WaitingForNetConnection. Setelah masuk ke status tersebut, mesin status akan secara otomatis memanggil kembali setiap peristiwa Publish yang disimpan dan kemudian akan menggunakan atau membuang peristiwa ini sesuai dengan status target transisi.

Setiap SyncTime milidetik, mesin status bertransisi ke status komposit Sync, yang melakukan pengiriman dan penerimaan lalu lintas yang sebenarnya dari jaringan dengan memposting acara Terima dan Kirim ke manajer jaringan. Ini adalah entitas bersamaan yang menangani masalah jaringan.

Meskipun MqttMgr yang diperkenalkan hanya mendukung paket CONNECT dan PUBLISH, MqttMgr dapat mendukung paket SUBSCRIBE dengan perubahan yang cukup sederhana.

Mesin negara bertindak mengakses parameter peristiwa yang dikonsumsi dengan menggunakan kata kunci params. Misalnya, dalam transisi berikut, peristiwa Connect membawa dua parameter, clientId dan keepAlive, yang nilainya digunakan untuk memperbarui atribut objek MqttMgr yang sesuai:

Connect(clientId, keepAlive)/    me->clientId =params->clientId; saya->keepAlive =params->keepAlive; me->operRes =mqtt_connect(&me->client, me->clientId, NULL, NULL, 0,                           NULL, NULL, 0, me->keepAlive);

Dalam contoh ini, peristiwa Connect(clientId, keepAlive) adalah pemicu transisi dan panggilan mqtt_connect() adalah bagian dari tindakan yang dijalankan sebagai hasilnya. Dengan kata lain, ketika objek MqttMgr menerima peristiwa Connect(clientId, keepAlive) dengan parameter 'publishing_client' dan '400', Connect(“publishing_client”, 400), atribut clientId dan keepAlive MqttMgr diperbarui dengan nilai ' publishing_client' dan '400' sebagai konsekuensinya.

Untuk membuat dan mengirim peristiwa, tindakan mesin status menggunakan makro GEN(). Misalnya, pernyataan berikut mengirimkan peristiwa Terima ke objek Kolektor, yang direferensikan sebagai atribut objek MqttMgr  oleh penunjuk Kolektor:

GEN(saya->kolektornya, Terima());

Argumen pertama dari pernyataan GEN() adalah objek yang menerima event, sedangkan argumen kedua adalah event yang dikirim, termasuk argumen event (jika ada). Argumen harus sesuai dengan parameter acara. Misalnya, pernyataan berikut menghasilkan peristiwa ConnRefused(code) dan mengirimkannya ke objek Kolektor dengan meneruskan kode yang dikembalikan oleh broker sebagai parameter peristiwa:

GEN(me->itsCollector, ConRefused(code));

Gagasan menggunakan kata kunci params untuk mengakses parameter peristiwa yang dikonsumsi dan makro GEN() untuk menghasilkan peristiwa dari tindakan diadopsi dari pembuat kode Rational Rhapsody Developer untuk tujuan ilustrasi semata.

Tindakan default mesin negara pada Gambar 1 menetapkan panggilan balik yang dipanggil oleh MQTT-Reaktif setiap kali penerimaan koneksi diterima dari broker. Panggilan balik ini harus diterapkan dalam kode MqttMgr. Callback ini harus menghasilkan event ConnAccepted atau ConnRefused(code) untuk dikirim ke objek Collector seperti yang ditunjukkan di bawah ini.

statis  batal connack_response_callback (enum MQTTConnackReturnCode return_code){    /*...*/    jika (return_code ==MQTT_CONNACK_ACCEPTED)    {        GEN(saya->itsCollector, ConnAccepted()); }    lainnya {        GEN(saya->itsCollector, ConnRefused(return_code)); }}

Penerapan model

Model pada Gambar 1 dapat diimplementasikan dalam C atau C++ dengan menggunakan perangkat lunak favorit Anda atau hanya implementasi state machine Anda sendiri. Ada berbagai alat yang tersedia di Internet untuk melakukan itu, seperti kerangka RKH, kerangka QP, Alat Yakindu Statechart, atau Pengembang Rational Rhapsody, antara lain. Semuanya mendukung Statecharts dan bahasa C/C++. Selain itu, beberapa di antaranya menyertakan alat untuk menggambar diagram Statechart dan menghasilkan kode darinya.

Mesin status ini dieksekusi dari objek aktif yang disebut MqttMgr (Manajer MQTT), yang menyediakan enkapsulasi ketat kode MQTT-Reaktif dan itu adalah satu-satunya entitas yang diizinkan untuk memanggil fungsi MQTT-Reaktif atau mengakses data MQTT-Reaktif. Entitas bersamaan lainnya dalam sistem serta ISR mana pun hanya dapat menggunakan MQTT-Reaktif secara tidak langsung dengan bertukar peristiwa dengan MqttMgr. Penggunaan mekanisme ini untuk menyinkronkan entitas konkuren dan untuk berbagi data di antara mereka menghindari berurusan dengan bahaya mekanisme pemblokiran tradisional seperti semaphore, mutex, penundaan, atau event-flag. Mekanisme tersebut dapat menyebabkan malfungsi tak terduga yang sulit dan membosankan untuk didiagnosis dan diperbaiki.

Objek aktif MqttMgr merangkum atributnya sebagai satu set item data. Item data menunjuk variabel dengan nama dan tipe, di mana tipe sebenarnya adalah tipe data. Item data untuk objek MqttMgr dipetakan ke anggota struktur objek. Nama dan tipe anggota sama dengan nama dan tipe data objek. Misalnya, atribut klien dari tipe objek MqttMgr disematkan berdasarkan nilai sebagai anggota data di dalam struktur MqttMgr:

struktur MqttMgr {    /* ... */ struktur mqtt_client klien; /* klien atribut */ LocalRecvSemua localRecv; /* atribut localRecv */ };

Data objek MqttMgr diakses dan dimodifikasi secara langsung tanpa menggunakan operasi pengakses atau mutator. Misalnya, klien dan localRecv diakses melalui pointer me, yang menunjuk ke instance MqttMgr.

mqtt_recvMsgError(&me->klien, &me->localRecv);

MqttMgr memiliki daftar atribut yang ditunjukkan pada Tabel 1.

Tabel 1. Atribut MqttMgr

Struktur pada Gambar 2 berguna untuk mengingat hubungan antara aktor yang bersangkutan. Mereka adalah:objek Kolektor, yang ingin mengirim informasi ke broker; objek NetMgr, yang berhubungan dengan jaringan; dan objek MqttMgr.


Gambar 2. Rancangan struktur sistem IoT (Sumber:VortexMakes)

Diagram urutan pada Gambar 3 menunjukkan bagaimana objek MqttMgr berinteraksi dengan seluruh sistem saat diperlukan untuk membuka sesi dengan server MQTT. Dalam diagram ini, status MqttMgr dan pesan asinkron yang dipertukarkan ditampilkan antara aktor Collector, MqttMgr, dan NetMgr.


Gambar 3. Menghubungkan ke broker MQTT (Sumber:VortexMakes)

Setelah koneksi jaringan dibuat oleh objek NetMgr ke broker, paket pertama yang dikirim dari MqttMgr ke server MQTT harus berupa paket CONNECT. Dengan demikian, aktor Kolektor mengirimkan acara Connect(clientId, keepAlive) ke aktor MqttMgr. Acara ini harus membawa pengidentifikasi klien dan interval waktu tetap hidup. Jika server menerima permintaan koneksi, aktor MqttMgr akan mengirim acara ConnAccepted ke aktor Kolektor untuk memberi tahu situasi ini. Sejak saat itu, aktor Collector dapat memublikasikan pesan informasi ke broker tersebut.

Jika server menolak permintaan koneksi, aktor MqttMgr akan mengirim acara ConnRefused ke aktor Kolektor. Peristiwa ini disertai dengan kode yang memberitahukan penyebab penolakan seperti yang ditunjukkan pada Gambar 4. Lihat MQTT v3.1.1 bagian 3.2.2.3.


Gambar 4. Broker menolak permintaan koneksi (Sumber:VortexMakes)

Gambar 5 menunjukkan alur interaksi saat sebuah pesan dipublikasikan. Untuk melakukan itu, aktor Collector mengirimkan event Publish(data, size, topic, qos), yang membawa informasi yang akan dipublikasikan (data), panjang informasi dalam bytes (size), nama topik yang informasi yang akan dipublikasikan (topik) dan tingkat kepastian untuk menyampaikan pesan ini (qos). Di perangkat IoT yang disebutkan sebelumnya, informasi yang dipublikasikan diformat menggunakan spesifikasi JSON. Ini adalah format standar terbuka yang berisi objek data dengan pasangan atribut-nilai dalam teks yang dapat dibaca manusia. Format ini diselesaikan dengan menggunakan jWrite, yang merupakan pustaka sederhana dan ringan yang ditulis dalam C.


Gambar 5. Mempublikasikan data ke broker (Sumber:VortexMakes)

Gambar 6 menunjukkan skenario di mana penerimaan dan pengiriman pesan MQTT ke jaringan gagal. Jika manajer jaringan tidak dapat menerima lalu lintas dari jaringan, itu akan mengirim aktor ReceiveFail ke MqttMgr. Demikian pula, Jika manajer jaringan tidak dapat mengirim data ke jaringan, itu akan mengirim aktor SendFail to MqttMgr.


Gambar 6. Kegagalan dalam jaringan (Sumber:VortexMakes)

Tabel 2 merangkum peristiwa yang terlibat dalam skenario yang ditampilkan.

Tabel 2. Peristiwa

Kesimpulan

Dengan menghindari bahaya mekanisme pemblokiran tradisional — seperti semaphore, mutex, penundaan, atau event-flags — perpustakaan MQTT-Reactive, mesin negara dan arsitektur perangkat lunak yang diusulkan dalam artikel ini memungkinkan sistem tertanam reaktif untuk mengimplementasikan klien MQTT dalam sebuah novel jalan. Hal ini dicapai dengan mengenkapsulasi kode MQTT-Reactive dalam unit konkurensi yang disebut objek aktif , yang perilaku berbasis statusnya ditentukan di mesin status yang disarankan. Objek aktif ini berkomunikasi dengan seluruh sistem dengan bertukar peristiwa asinkron yang digunakan:tidak hanya untuk menerima dan mengirim lalu lintas melalui jaringan, tetapi juga untuk menghubungkan dan menerbitkan informasi ke server untuk aplikasi Internet of Things.


Tertanam

  1. Taksonomi untuk IIoT
  2. Membangun Sistem Manufaktur yang Fleksibel untuk Industri 4.0
  3. Ringkasan tentang Teknologi IC Untuk Mikrokontroler dan Sistem Tertanam
  4. Würth Elektronik eiSos menghadirkan komponen baru untuk sistem pintar
  5. Merancang kontrol motor untuk sistem robot
  6. Syslogic:komputer tangguh dan sistem HMI untuk mesin konstruksi
  7. Kontron dan SYSGO:Platform komputasi SAFe-VX untuk sistem yang kritis terhadap keselamatan
  8. Konfigurasi Status yang Diinginkan untuk Sirkuit
  9. Perusahaan Menetapkan Tenggat Waktu untuk Sistem Cerdas
  10. 10 Alur Kerja Teratas untuk Produsen