Memilih protokol yang sesuai untuk Aplikasi IoT


12

Kami sedang mengerjakan skenario IoT di mana Perangkat Terkendala mengirimkan posisi GPS-nya dalam interval reguler ke server yang diberikan. Perangkat yang dibatasi adalah papan mirip Arduino yang bertenaga baterai dan menggunakan perisai GSM / SIM untuk konektivitas. Itulah tujuan desain kami:

  • Memaksimalkan masa pakai baterai
  • Meminimalkan transfer data

Untuk tujuan pengujian kami telah menggunakan HTTP yang menghasilkan pesan sekitar 500 byte, tetapi sekarang saatnya untuk menggunakan protokol yang lebih tepat untuk transmisi data. Beberapa karakteristik transfer data adalah:

  • The payload cukup kecil, biasanya kurang dari 50 byte (cukup jauh dari MTUs khas, yaitu segala sesuatu harus sesuai dalam paket IP)
  • Data harus dikirim kira-kira satu menit sekali . Beberapa varian tidak kritis.
  • Tidak masalah untuk kehilangan beberapa pesan
  • Saat ini, perangkat tidak memerlukan respons apa pun dari r servis (namun, ini dapat berubah di masa mendatang). Server juga tidak harus memulai percakapan dengan perangkat.

Sejauh ini kami telah memikirkan kemungkinan-kemungkinan ini:

  • Protokol khusus melalui TCP . Ini akan menghilangkan tajuk HTTP yang membuat pesan 10 kali lebih kecil. Ini adalah pendekatan kami yang dapat diandalkan / konservatif.
  • Protokol khusus melalui UDP . Karena UDP memiliki header yang lebih kecil dan tidak ada overhead untuk keandalan, kami berharap akan cukup efisien. Seperti dikomentari, kehilangan satu pesan di sini atau di sana tidak ada masalah ... namun, mungkin ada masalah lain dengan non-reliabilitas yang tidak kami sadari.
  • MQTT (standar lebih dari TCP): Dengan hampir tidak ada overhead yang ada dibandingkan dengan TCP, ini bisa menjadi pilihan juga ... Namun, kami tidak memiliki terlalu banyak pengalaman dengan teknologi GSM / SIM, dan tidak tahu bagaimana koneksi MQTT terus menerus akan bekerja dengan cara ini, dan apakah bandwidth detak jantung layak untuk transfer data frekuensi rendah.
  • CoAP (standar lebih dari UDP): Tampaknya juga menjanjikan. Hanya 4 byte overhead untuk header dan bekerja di atas UDP. Namun demikian, risiko UDP yang tidak diketahui ada.

Adakah yang bisa memberi petunjuk? Terima kasih sebelumnya.


1
@ RichardChambers dalam skenario ini, keandalannya tidak begitu penting. Kami mampu kehilangan beberapa paket di sini atau di sana. Acktidak perlu. Saya pikir bekerja pada keandalan di atas UDP tidak masuk akal, itulah gunanya TCP.
bgusach

1
Saya tidak akan menemukan kembali roda dengan merancang protokol khusus. Google CoAP vs. MQTT akan memberi Anda lebih banyak pertimbangan. Apakah Anda perlu membuktikan masa depan solusi Anda, yaitu. menangani persyaratan yang lebih ketat di masa depan (jaminan kerugian, waktu respons, interoperabilitas, dll)? Apakah perangkat NAT'ed? Apakah ada pengelompokan perangkat di balik gateway? Banyak yang tidak diketahui ...
Dukungan Gambit

Jawaban:


6

Beberapa pemikiran tentang pengalaman saya dengan TCP, UDP, dan MQTT serta beberapa sumber tambahan untuk ditinjau.

Dengan UDP saya telah mengalami masalah kegagalan diam di mana aplikasi pada satu node jaringan, klien, hanya melihat beberapa pesan UDP yang dikirim. Ada terlalu banyak alasan mengapa lalu lintas jaringan menjadi serba salah. Masalah dengan UDP adalah bahwa paket dapat dibuang cukup banyak setiap kali ada node di jalur jaringan antara produsen paket dan konsumen paket menjamin. Lihat topik Wikipedia Paket loss .

Pertanyaannya adalah berapa tingkat kerugian Anda dalam konteks jaringan apa pun saat ini. Jadi, jika ini adalah komunikasi dalam LAN atau sub-jaringan tingkat kerugian Anda mungkin rendah. Di WAN atau di internet, tingkat kerugian Anda mungkin cukup tinggi. Paket UDP dibuang karena beberapa alasan dan dialihkan namun kondisi jaringan memungkinkan dengan pengurangan jumlah hop itu. Mengirim paket ke kekosongan besar tanpa pertanggungjawaban membuka kemungkinan kegagalan diam-diam.

Kedengarannya seperti dalam kasus Anda hanya ack sederhana dengan mentransmisikan kembali setelah batas waktu tanpa menerima ack akan cukup.

Saya telah melakukan pesan XML melalui koneksi TCP yang terpelihara dan itu bekerja dengan baik. Saya memiliki lapisan yang mengirimkan pesan lengkap masing-masing dalam buffer ke lapisan aplikasi untuk ditangani. Saya menggunakan XML untuk mengemas pesan dengan tag awal XML untuk awal pesan dan tag akhir XML untuk mengetahui kapan seluruh pesan telah diterima.

TCP memang memiliki beberapa fitur seperti urutan paket yang berurutan, tidak ada pengulangan, dan menjadi mekanisme transportasi yang terhubung berarti Anda tahu jika ujung yang lain hilang atau tidak meskipun mungkin perlu beberapa saat untuk mengetahuinya. Menghubungkan dan memutuskan sambungan dapat menyebabkan penundaan tetapi tidak memberatkan dalam kondisi biasa meskipun kondisi jaringan dapat menyebabkan throughput TCP melambat.

MQTT adalah protokol yang diangkut oleh lapisan transport jaringan, biasanya TCP. MQTT menggunakan model terbitkan / berlangganan sehingga tidak ada penyimpanan pesan. Jadi, ketika penerbit menerbitkan pesan jika pelanggan tidak terhubung pada saat itu ketika terhubung, ia tidak akan melihat pesan. MQTT cukup real time, saya kira itulah bagian telemetri dari akronim itu. Saya suka MQTT untuk pesan kecil dan telah melakukan beberapa percobaan dengan muatan JSON melalui MQTT menggunakan Mosquitto. Lihat artikel ini Pengiriman pesan yang dapat diandalkan dengan Mosquitto (MQTT) dengan gambaran umum tentang MQTT dan kualitas layanan. Dan melihat artikel singkat ini dengan link ke sumber daya termasuk aplikasi sampel IOT - MQTT Publikasikan dan Subscriber C Kode .

Eksperimen saya dengan MQTT menggunakan teks JSON dan database SQLite3 di pelanggan untuk menyimpan pesan ada di https://github.com/RichardChambers/raspberrypi/tree/master/mqtt meskipun sumbernya ada di C dan cukup berantakan.

Berikut adalah 13 menit video # 144 Protokol Internet: CoAP vs MQTT, Network Sniffing, dan persiapan untuk IKEA Tradfri Hacking . Ini adalah artikel yang menarik tentang CoAP, Constrained Application Protocol: CoAP adalah protokol 'modern' IoT . Ada penjumlahan dari CoAP ini:

Pengadopsi awal setuju bahwa Protokol Aplikasi Terbatas berfungsi sangat baik untuk jaringan dan perangkat terbatas. Sesuatu yang tidak diketahui: "Pada jaringan nirkabel yang sangat padat - Wi-Fi atau seluler - CoAP dapat terus bekerja di mana protokol berbasis Protokol Kontrol Transmisi (TCP) seperti MQTT bahkan tidak dapat mengatur untuk berjabat tangan, "Kata Vermillard.

Ini karena tidak seperti kebanyakan protokol IOT lainnya, CoAP dibangun di atas UDP. Dengan kata lain, itu berarti tidak ada jabat tangan protokol atau koreksi kesalahan seperti yang dijumpai dengan TCP. "CoAP mungkin tidak dapat diandalkan seperti HTTP atau menjamin pengiriman pesan seperti MQTT, tapi ini sangat cepat," kata Matthieu. "Jika Anda setuju dengan beberapa pesan yang tidak diterima, Anda dapat mengirim lebih banyak pesan dalam jangka waktu yang sama."

Ada beberapa yang lain seperti AMQP, STOMP, dan CBOR yang mungkin Anda lihat juga. Lihat situs web standar CBOR serta tesis ini, Implementasi dan evaluasi protokol CBOR . Lihat artikel ini, Memilih Protokol Perpesanan Anda: AMQP, MQTT, atau STOMP yang membandingkan dan membedakan AMQP, MQTT, dan STOMP dan diakhiri dengan catatan tentang broker RabitMQ:

Mudah-mudahan, ini dapat membantu banyak orang mulai menavigasi sup protokol di luar sana untuk setiap kasus penggunaan Anda. Karena sudah umum bagi perusahaan untuk memiliki banyak aplikasi dengan kebutuhan yang berbeda, tentu saja mungkin Anda memerlukan ketiga broker di berbagai aplikasi yang berbeda. Di situlah multiprotocol yang solid, broker polyglot seperti RabbitMQ masuk — karena dapat mengirim STOMP, MQTT, atau AMQP ke dalam dan mengeluarkan salah satu dari yang lain. Anda tidak perlu dikunci oleh salah satu protokol ini — ketiganya didukung oleh broker RabbitMQ, menjadikannya pilihan ideal untuk interoperabilitas antar aplikasi. Arsitektur plugin juga memungkinkan RabbitMQ untuk berkembang untuk mendukung versi tambahan atau yang diperbarui dari protokol-protokol ini di masa depan.

Paket slide share dari sekitar 60 slide ini melakukan perbandingan dan kontras antara empat protokol IoT yang berbeda yang melihat kebutuhan dua kelompok IoT yang berbeda, Konsumen dan Industri, yang memiliki kebutuhan yang berbeda untuk keandalan dan ketahanan. Apa Standar Perpesanan yang Tepat untuk IoT? .


4

Kedengarannya seperti aplikasi yang sempurna untuk UDP: topologi client-server (pub / sub tidak diperlukan), toleran terhadap kehilangan paket dan kesenjangan besar antara transmisi paket tunggal berarti kedatangan yang tidak sesuai pesanan tidak menjadi masalah.

Penghematan dalam pembuatan koneksi dan overhead paket akan bekerja dengan baik sesuai keinginan Anda.

Anda hanya perlu mengurangi masalah kegagalan diam. Banyak cara untuk melakukan ini, tetapi saran saya adalah agar server merespons setiap kali menerima paket x (mis. 10). Dengan cara itu klien tahu berapa banyak paketnya yang melewati, dan jika itu di bawah ambang batas itu bisa meningkatkan frekuensi transmisi untuk melawan kehilangan paket. Jika tidak ada yang melewati maka TCP tidak akan membantu, jadi Anda lebih baik hanya menempatkan klien dalam mode marabahaya sampai kondisinya membaik.

Kehilangan paket UDP melalui internet umumnya tidak tinggi, dan jika itu biasanya fenomena sementara. GSM menyediakan beberapa penilaian buffering dan sinyal radio sehingga memberikan toleransi terhadap noise palsu.


4

Apakah Anda dibatasi secara eksternal untuk menggunakan GSM / SIM?

Alternatif mungkin menggunakan jaringan LoRa yang:

  • sangat dioptimalkan untuk muatan kecil
  • dirancang untuk penggunaan energi minimum (dan karenanya masa pakai baterai maks)
  • jarak jauh dengan desain
  • memiliki kelas koneksi (selalu aktif, diakui, tidak diakui)
  • memiliki jendela unduhan terjadwal (mis., untuk pembaruan firmware atau RX ACK)

Anda dapat menyambungkan ke komunitas yang ada atau infrastruktur LoRa komersial di sebagian besar negara, atau Anda dapat menggunakan hub LoRa Anda sendiri jika itu lebih tepat.

Ada pengembangan aktif secara global dan ketersediaan mudah dari perisai prototyping (misalnya untuk Arduino).


1
Sekali satu menit seperti yang disebutkan dalam pertanyaan itu terlalu sering untuk cocok dengan interval transmisi simpul LoRa yang direkomendasikan.
Chris Stratton

1
Setuju 1 menit terlalu sering. Meskipun @bgusach tidak menyebutkan aplikasi. Jika payload dapat dikodekan biner untuk mengurangi ukuran dan jika interval 3-5 menit (atau bahkan 10 menit) dapat digunakan maka itu bisa menjadi ideal. Pokoknya, hanya saran seperti yang saya perhatikan bahwa itu tidak disebutkan sebelumnya dalam jawaban.
BrendanMcL

1
Ya, jika saya membacanya dengan benar, kira-kira 50 byte pada interval empat menit mungkin hampir tidak cocok; tapi itu perlu verifikasi, bisa dengan mudah dimatikan setidaknya dengan dua faktor.
Chris Stratton

1
Menarik, tetapi kami dibatasi GSM / SIM (ini dimaksudkan untuk menjadi barang konsumen, sesuatu yang dapat dibeli dan digunakan di mana saja tanpa infrastruktur selain jaringan telepon).
bgusach

3

Saya lebih suka respons HTTP minimum dengan data JSON ... respons HTTP bisa jauh di bawah transfer HTTP 500 byte, dan Anda tetap kompatibilitas dengan banyak klien untuk aplikasi web RESTful.

Pesan HTTP minimum (misalnya dengan hasil JSON) dengan aprox 130 byte data HTTP terlihat seperti:

HTTP/1.1 200 OK
Server: ProprietaryAndroid
Connection: close
Content-Type: application/json
{
  "lat": "42.00000",
  "long": "10.00000"
}

jika Anda hanya ingin MENGIRIM data dari aplikasi Anda ke server, Anda cukup menggunakan HTTP GET di mana Anda mengatur lat / long sebagai parameter URL. Permintaan memiliki data lebih sedikit daripada respons.

GET /?lat=42.00000&long=10.0000 HTTP/1.1
Host: 192.168.0.2 
User-Agent: Proprietary
Accept: */* 
Connection: close

7
Terima kasih atas jawaban Anda, tetapi saya tidak mengerti maksud Anda dengan Respons HTTP. Kami ingin menyingkirkan seluruh Protokol HTTP untuk menghemat transfer data. Dan di atas itu, menggunakan GETuntuk memodifikasi sumber daya adalah yang Wrong Thing™harus dilakukan
bgusach

Setuju dengan Anda dari sisi arsitektur bahwa kata kerja lain seperti POST (sebagai kata kerja universal) sementara itu lebih umum di REST APIs. Tergantung pada tingkat kematangan mana Anda mengembangkan REST API Anda. Hanya ingin menunjukkan bagaimana HTTP dapat diminimalkan, sambil tetap memanfaatkan kemudahan dan kompatibilitas dengan kerangka kerja yang ada (klien dan server), dan pada saat yang sama menjaga keterbacaan manusia. Menjawab dengan sampel tanggapan membingungkan ... Jika Anda ingin MENGIRIM data, tentu saja Anda akan menggunakan pesan POST atau GET - jika POST, dengan konten json yang saya tunjukkan dalam sampel pertama saya.
Christoph Bimminger

3

Tidak ada protokol "terbaik". Hanya banyak pilihan untuk dipertimbangkan:

  • Apakah perangkat Anda berada di jaringan acak dengan port acak diblokir? Jika demikian, mungkin lebih baik menggunakan HTTPS.

  • Jika Anda mengirim UDP, Anda selalu dapat mengirim pengukuran N terakhir setiap kali, sehingga kehilangan paket kecil diabaikan. Anda juga dapat mengirim paket ACK, mengubah UDP menjadi protokol yang andal. (Sebagian besar protokol di atas UDP melakukan ini.)

  • Apakah pelanggan Anda akan peduli jika data mereka terpapar tidak terenkripsi? Apakah pelanggan Anda peduli jika peretas dapat menyuntikkan data buruk ke dalam koneksi yang tidak dienkripsi? (Jika demikian, Anda mungkin ingin enkripsi.)

  • Apa yang terjadi jika seseorang mengendus protokol Anda dan memanipulasi data? Bisakah Anda mencegah satu perangkat dari menimpa data untuk yang lain?

  • Berapa banyak perangkat yang akan Anda miliki maksimum? Bagaimana Anda akan berurusan dengan semua perangkat itu? Bagaimana Anda akan merutekan data ke tempat yang diinginkan? Bagaimana Anda menangani pemeliharaan dan peningkatan infrastruktur server Anda? Jika Anda tidak memiliki pengalaman, Anda mungkin memperkirakan kemampuan Anda untuk menangani banyak koneksi secara bersamaan. Mungkin lebih baik untuk melakukan outsourcing ke vendor (dan menggunakan protokol mereka, seperti AWS IoT).


3

Kami memiliki tes yang tepat membandingkan laju transmisi HTTP vs MQTT, lihat test2 , dalam skenario Anda saat ini MQTT akan membawa Anda 50 kali lebih sedikit lalu lintas (dan baterai) daripada HTTP.

Pada dasarnya tidak ada perbedaan antara MQTT dan TCP polos (dalam ukuran pesan). Saya bahkan akan mengatakan bahwa pada dasarnya tidak ada perbedaan antara TCP polos dan pesan biner dan JSON dalam muatan MQTT. Sedemikian rupa, jauh lebih nyaman untuk menggunakan MQTT + JSON dan mengandalkan teknologi ini untuk pengiriman dan representasi data. Beri nama kunci Anda kurang lebih pendek.

Mengenai UDP, jika transmisi sekali per menit, maka lebih baik menggunakan TCP. Jika transmisi sekali per 10-20 menit atau lebih, maka Anda dapat mempertimbangkan UDP sebagai solusi yang lebih efektif untuk lalu lintas / baterai. Jika Anda akan mencoba mengembangkan protokol sendiri dengan ACK, saya sarankan Anda untuk menggunakan MQTT atau TCP dan hanya berkonsentrasi pada kasus bisnis Anda.

Secara umum - semakin mudah Anda menerapkannya hasil terbaik yang dapat Anda capai dalam waktu singkat. Jika saya jadi Anda, dalam hal ini saya akan lebih baik menguji format biner UDP + sendiri dan MQTT + JSON dan pilih salah satunya. Atau bahkan baru saja mulai dari MQTT + JSON dan kemudian berpikir apakah itu OK untuk kasus saya.


1
Di sini saya akan menyebutkan beberapa kata menentang UDP. Kami memelihara sistem manajemen armada GPS SaaS besar (lebih dari 1 juta kendaraan terhubung) yang memiliki pelanggan di lebih dari 100 negara di seluruh dunia. Dan baru-baru ini kami menemukan bahwa penyedia internet berbasis di AS memblokir paket UDP keluar dari AS karena beberapa alasan, bahkan untuk aplikasi M2M. Ini dimulai beberapa bulan yang lalu, tetapi sangat menyakitkan, jadi saya sarankan Anda untuk memilih protokol berbasis TCP (MQTT) dan bergantung pada standar global. Suatu hari dan di beberapa negara Anda bahkan akan dipaksa untuk menggunakan MQTT melalui websockets untuk menjaga koneksi. Nasihat kecil saja.
shal
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.