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.
Ack
tidak perlu. Saya pikir bekerja pada keandalan di atas UDP tidak masuk akal, itulah gunanya TCP.Jawaban:
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:
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:
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? .
sumber
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.
sumber
Apakah Anda dibatasi secara eksternal untuk menggunakan GSM / SIM?
Alternatif mungkin menggunakan jaringan LoRa yang:
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).
sumber
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:
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.
sumber
GET
untuk memodifikasi sumber daya adalah yangWrong Thing™
harus dilakukanTidak 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).
sumber
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.
sumber