Kontrol arduino melalui MQTT

8

Saya bekerja dengan beberapa papan Arduino dan sekarang saya harus mengontrolnya melalui antarmuka web.

Melalui antarmuka web, saya ingin mengaktifkan GPIO.

Saya punya dua ide:

  1. Setiap arduino bertindak sebagai server web dan saya dapat mengontrol GPIO melalui halaman web Arduino. Pada dasarnya satu tab browser untuk setiap Arduino.
  2. Gunakan protokol MQTT untuk bertukar pesan dengan arduino board. Selanjutnya saya pikir untuk menggunakan raspberry sebagai server web dan sebagai broker MQTT. Setiap papan Arduino berlangganan ke topik tertentu dan melalui halaman web, yang dihosting di raspberry, saya dapat mengontrol GPIO Arduino.

Solusi pertama saya sangat cepat dan sederhana.

Mengenai opsi kedua, saya tidak tahu cara mengirim pesan MQTT melalui halaman web. Saya membaca bahwa saya perlu menggunakan Websocket. Apakah tepat? Perlu saya menulis kode dalam Javascript atau apa?

Pertanyaan kedua saya adalah: Dapatkah broker MQTT mengelola MQTT dan MQTT melalui Websocket secara bersamaan? Kalau tidak, saya perlu menggunakan Websocket juga di Arduino.

Pilihan lain adalah membuat skrip Python dengan GUI yang memungkinkan untuk mengirim pesan MQTT ke Arduino.

Apakah ada cara terbaik?

Terima kasih untuk bantuannya!

Federico
sumber

Jawaban:

5

Apa yang telah Anda tulis semuanya tampak masuk akal bagi saya.

MQTT biasanya berjalan di atas TCP 1 , tetapi browser Anda tidak mengizinkan halaman web untuk membuka soket TCP mentah. Ada beberapa proposal yang memungkinkan, tetapi saya ragu mereka akan diimplementasikan dalam waktu dekat. Jadi, browser Anda tidak dapat terhubung ke broker MQTT hanya mendukung koneksi TCP.

Solusinya adalah, seperti yang telah Anda identifikasi, untuk menggunakan WebSocket — ini didukung oleh browser dan beberapa kode JavaScript dapat digunakan untuk terhubung ke broker MQTT melalui halaman web. HiveMQ memiliki contoh yang dapat Anda mainkan , atau Anda dapat mencoba perpustakaan seperti MQTT.js yang mendukung komunikasi WebSocket dengan pialang MQTT.

Sebagian besar pialang — dan yang saya tahu — tidak akan peduli apakah klien itu klien WebSocket atau TCP. Anda dapat dengan senang hati menghubungkan keduanya ke satu broker, dan Anda dapat menemukan instruksi tentang cara mengkonfigurasi broker Mosquitto di Stack Overflow 2 .

Sehubungan dengan cara terbaik ... terserah Anda. Jika Anda puas dengan JavaScript, maka tidak ada masalah dengan menggunakannya. Jika Python lebih mudah, lakukan itu (Anda tidak perlu mengatur dukungan WebSockets seperti itu). Anda bahkan bisa menggunakan perangkat lunak klien yang sudah dibuat sebelumnya jika Anda tidak terlalu peduli dengan UI.


1 MQTT 3.1.1 memungkinkan untuk koneksi TLS atau WebSocket juga; lihat bagian 4.2 dari spesifikasi . Ada varian, MQTT-SN , di mana persyaratan untuk TCP santai. Bagaimanapun, Anda mungkin tidak khawatir tentang MQTT-SN untuk kasus penggunaan Anda.

2 Perhatikan bahwa pada Windows, Mosquitto build tidak mengaktifkan dukungan WebSocket . Anda perlu membuat Mosquitto sendiri jika Anda ingin menggunakannya di Windows. Atau, Anda bisa mencoba pialang lain yang tidak membatasi Anda dengan cara ini.

Aurora0001
sumber
Terima kasih Aurora0001 untuk balasan Anda! Ide saya adalah membangun halaman web dengan kode JS yang mengirim pesan MQTT ke broker (Raspberrry Pi). Satu-satunya kekhawatiran saya adalah koeksistensi koneksi TCP dan Web Secket MQTT. Apa pendapat Anda tentang Mosquitto Broker? Saya dapat menginstal Mosquitto Broker pada raspberry dan menjalankannya seperti layanan.
Federico
1
Seperti yang saya katakan, TCP dan WebSockets dapat dengan senang hati hidup berdampingan. Jika Anda pergi melalui rute WebSockets, itu benar-benar tidak masalah apa server web Anda (bahkan host file statis akan bekerja) karena JS sisi klien yang penting. Jika Anda melakukan koneksi MQTT melalui Pi dan kemudian ingin membuat halaman web untuk mengontrol itu (yaitu bukan websockets), Python mungkin akan lebih mudah digunakan karena punya lebih banyak kerangka kerja web daripada C.
Aurora0001
Ide saya adalah menggunakan raspberry sebagai MQTT Broker. Halaman web membuka websocket untuk mempublikasikan pesan pada topik tertentu. Akhirnya, pesan-pesan seperti diteruskan oleh server broker (dalam kasus saya sebuah Raspberry)
Federico