Kami merakit jaringan ZigBee yang paling sederhana, program di bawah Mbed, berkomunikasi melalui MQTT

Artikel ini adalah lokakarya pelatihan tingkat pemula yang hebat tentang penggunaan modul XBee bersama dengan mikrokontroler yang memiliki Mbed OS. ZigBee adalah standar yang panjang dan berakar kuat dalam sistem Smart Home (misalnya, digunakan bersama dengan Z-Wave di hub Samsung SmartThings, lihat artikel kami ), ini ditandai dengan konsumsi daya yang rendah, kemudahan penggunaan, dan, yang paling menarik, kemampuan untuk membuat jaringan mesh yang dapat dikonfigurasi sendiri. Anda akan melihat dari bengkel bahwa ini memang benar - kita akan melihat struktur jaringan seperti itu melalui utilitas visualizer yang nyaman.

Diasumsikan bahwa Anda sudah tahu apa itu ZigBee dan untuk apa ZigBee. Sekarang Anda ingin menghubungkan modul-XBee pertama Anda dan menyelesaikan masalah Anda dengannya, tanpa masuk ke pemrograman modul itu sendiri, tetapi hanya menggunakannya sebagai antarmuka komunikasi. Pada akhirnya, kami akan mengirim semua data melalui gateway MQTT darurat di mana saja, bahkan ke server lokal, bahkan ke Internet. Kami memutuskan untuk menunjukkan semuanya pada contoh Mbed sebagai RTOS yang paling sederhana dan paling mudah diakses. Anda akan diyakinkan bahwa semuanya bekerja "di luar kotak", dan Anda dapat segera mulai membuat proyek Anda, bahkan jika sebelumnya Anda hanya berurusan dengan Arduino.



Manual akan terdiri dari bagian-bagian berikut:

  1. Koneksi dan konfigurasi modul XBee
  2. Hubungkan modul ke jaringan
  3. Kami mengkonfigurasi modul tanpa melepaskannya dari perisai
  4. Penerimaan data
  5. Mengirim data
  6. Membuat gateway MQTT sederhana

Tetapi pertama-tama, daftar komponen: apa yang diinginkan untuk dimiliki untuk melakukan semua hal di atas.

Komponen yang Diperlukan


  • Dua papan yang kompatibel dengan Mbed. Kami merekomendasikan papan pelatihan STM32 Nucleo sebagai relatif murah dan populer untuk tujuan pendidikan. Proses pemrograman di sana disederhanakan secara maksimal: kumpulkan program dalam IDE online gratis, unduh firmware yang telah dirakit dan “jatuhkan” ke papan, yang akan muncul dalam sistem sebagai flash drive. Apa model spesifik untuk mengambil tidak penting, tetapi jangan mengambil yang tertua, perhatikan jumlah memori. Sebagai contoh, F401RE - kami berikan hanya untuk kepastian, sehingga Anda tidak menjadi bingung dalam variasi mereka dan pada awalnya kode alfabet yang tidak dapat dimengerti dari prosesor STM.


  • XBee-. Digi. «» , , , MBee, , , , . / : , . / Pro: , , Pro .

  • XBee Shield V2 ( SeeedStudio). - , RX TX XBee-.

  • Satu konverter USB-UART dengan konektor untuk XBee. Diperlukan untuk konfigurasi awal. Modul XBee sendiri tidak dilengkapi dengan antarmuka USB (tidak ada hubungannya dengan itu). USB diperlukan semata-mata dan secara eksklusif untuk komunikasi antara modul dan komputer, dan di perangkat ini dapat bekerja pada UART yang jauh lebih sederhana.

    Slot pitch modul XBee adalah 2,0 mm - untuk elektronik itu tidak standar, dalam sistem metrik (kita biasanya terbiasa melihat langkah 2.54 sesuai dengan standar Amerika). Oleh karena itu, sayangnya, modul-modul tersebut tidak dimasukkan ke papan tempat memotong roti dan mereka selalu membutuhkan adaptor.

    Adaptor apa pun cocok di sini, kami mengambil yang ini dari Waveshare:


Koneksi dan konfigurasi modul XBee


Hal paling sederhana yang dapat Anda lakukan dengan modul adalah menghubungkannya ke komputer secara langsung melalui USB. Kami akan segera mendapatkan akses ke parameter konfigurasinya.

Instal XCTU


Untuk bekerja dengan XBee, ada program XCTU resmi. Unduh dan instal. Dokumentasi mengatakan bahwa di Ubuntu Anda perlu menambahkan pengguna ke grup dialoutuntuk bekerja dengan port yang bukan dari pengguna super - lakukan ini jika Anda belum melakukannya:

sudo usermod -a -G dialout <username>

Unduh arsip zip dari tautan, itu akan berisi file .run. Perlu dibuat dapat dieksekusi (melalui chmod +x _di konsol atau: tombol kanan mouse - Properties - Izin) dan jalankan ./40002881_V.run.

Penting untuk memulai instalasi bukan dari root (tanpa sudo), jika tidak, akan ada masalah nanti.

Setup terlihat seperti ini:



Program XCTU


Setelah instalasi, Anda dapat memulai program dengan menjalankan file appdi direktori tempat Anda menginstal program (secara default - ~/Digi/XCTU-NG).
 
Tampilannya adalah sebagai berikut:



Dalam program ini, Anda dapat menambahkan modul yang ada yang terhubung ke port USB melalui adaptor. Klik pada tombol Discover dengan kaca pembesar. Sebuah jendela muncul meminta Anda untuk memilih port - seperti yang Anda lihat, program mendeteksi port dengan benar dalam sistem /dev/ttyUSB0, ini adalah adaptor USB-UART kami.



Jendela menyarankan mencentang pencarian. Tentu saja, ada godaan untuk memeriksa sekaligus untuk menemukan modul Anda. Tetapi kemudian pencarian akan berlangsung untuk waktu yang sangat lama. Dalam praktiknya, masuk akal untuk membiarkan kotak dicentang secara default, dan memilih opsi yang paling umum untuk kecepatan transfer data, seperti pada gambar di bawah ini. Biasanya, modul baru default ke 9600, dan untuk tujuan pelatihan ini lebih dari cukup, kecepatan di sini tidak penting bagi kami.



Akibatnya, jika semuanya berhasil, Anda akan diminta untuk memilih modul yang ditemukan:



Bug kecil diketahui: terkadang modul tidak pada kecepatan non-standar, reset manual modul dengan tombol Reset selama pencarian dan mengatur ulang baud rate ke standar (9600) membantu.

Ubah parameter modul


Selanjutnya kami terlibat dalam konfigurasi modul. Sejumlah parameter akan keluar, yang sebagian besar pada awalnya tidak dapat dipahami. Untungnya, hanya sedikit dari mereka yang perlu diubah untuk memulai lebih cepat.

ID Jaringan - ID PAN. Kunci jaringan umum, itu harus sama untuk semua perangkat sehingga mereka terhubung secara independen ke jaringan. Masukkan nomor berapapun, dalam kasus kami kami lakukan 42.



CE - Coordinator Diaktifkan. Jika ada 1, maka modul ini bertindak sebagai koordinator. Jika 0, maka modul bertindak sebagai router (Router) - pada kenyataannya, itu hanya memastikan bahwa paket melewati jaringan melalui dirinya sendiri. Kebanyakan host biasanya adalah router. Kami membutuhkan satu koordinator dan dua router di jaringan kami, jadi taruh satu di sini.

Ada juga peran "Perangkat akhir" - ini adalah modul yang tidak melakukan pekerjaan pada transfer paket, tetapi hanya berkomunikasi dengan router lain dan melakukan fungsi yang bermanfaat. Biasanya, dia hanya dalam mode tidur dan bangun pada interval yang ditentukan dan mencari tahu apakah ada pesan. Modul semacam itu dapat ditenagai oleh baterai, sedangkan router dan koordinator harus selalu "online" dan sebagai hasilnya, membutuhkan daya yang konstan untuk mempertahankan seluruh jaringan. Kami tidak akan mempertimbangkan contoh seperti itu sekarang, karena lebih menarik bagi semua orang untuk menetapkan peran router dan mengamati bagaimana jaringan akan secara otomatis mengubah konfigurasinya.



AP - API Aktifkan.Modus operasi. Modul XBee dapat beroperasi dalam dua mode: AT atau API. AT-mode lebih mudah bagi pemula, itu adalah penggantian transparan dari port serial dan bekerja dengan modul melalui AT-command. Namun, mode API jauh lebih kaya dalam fungsi, memungkinkan Anda untuk mengkonfigurasi modul dari jarak jauh, berisi alamat pengirim, mengembalikan status pengiriman paket, dan banyak lagi. Selain itu, perpustakaan untuk berinteraksi dengan XBee menganggap bahwa perangkat tersebut digunakan dalam mode API. Oleh karena itu, segera ganti dengan mode API, ini dilakukan dengan mengatur unit di bidang yang sesuai.



Nama modul adalah Node Identifier. Opsi praktis untuk memberi modul Anda nama yang bisa dibaca manusia. Mari kita beri nama seperti itu - Koordinator.



Setelah itu, Anda dapat mem-flash pengaturan ke modul dengan menekan tombol dengan pensil:



2. Sambungkan modul ke jaringan


Sekarang kita akan melihat jaringan apa yang kita dapatkan jika kita mengkonfigurasi tiga modul. Program XCTU memiliki visualisator jaringan yang cukup nyaman, kita akan dengan jelas melihat topologi.

Kami akan mengkonfigurasi ketiga modul secara bergantian dengan parameter berikut:
  • ID PAN - jumlah total, misalnya 42
  • AP (API Enable) - diatur ke 1 (berfungsi dalam mode API)
  • NI (Node Identifier) ​​- memberikan nama modul yang dapat dimengerti (Koordinator, Lampu dan Sakelar, jika kita melakukan, misalnya, model sistem Smart Home).
  • CE (Coordinator Enable) - atur salah satu modul ke 1, itu akan menjadi koordinator.

Kemudian berikan daya ke semua modul. Posisikan mereka seperti ini: koordinator akan berada di konverter USB-UART, dan dua lainnya (router) akan ditempatkan di papan XBee Shield di atas Nucleo.

Jika Anda melakukan semuanya dengan hati-hati, maka keindahan akan terjadi. Modul akan secara otomatis terhubung ke jaringan. Anda dapat berkomunikasi dengan router dari jarak jauh melalui koordinator.

Ini terlihat seperti ini. Klik tombol "Temukan node radio di jaringan yang sama".



Anda akan melihat bahwa dua modul secara otomatis terdeteksi dan ditambahkan:


Dan Anda dapat mengubah parameternya dengan cepat! 

Apa yang masih bagus: sekarang Anda dapat melihat peta jaringan jika Anda beralih ke mode kerja Jaringan di kanan atas.



Setelah menyebar node jaringan dengan mouse, Anda akan melihat segitiga. Harap dicatat bahwa lalu lintas ke modul paling kanan dapat berlangsung dalam dua cara. Dan jika Anda memindahkan modul di ruang angkasa, Anda akan melihat bahwa gambar telah berubah, dan sekarang, mungkin, modul lain akan menjadi "ekstrem". Ini adalah inti dari jaringan konfigurasi-sendiri.

3. Pasang modul XBee tanpa melepaskannya dari pelindung


Tentu saja, akan lebih menarik untuk bekerja dengan modul XBee tidak melalui komputer, tetapi dengan mengendalikannya menggunakan program pada mikrokontroler. Yaitu, menghubungkannya ke papan STM32Nucleo.
Mari kita bahas bagaimana modul XBee dapat berkomunikasi dengan mikrokontroler. Dan mari kita mulai dengan tugas kecil: cara mengkonfigurasi modul tanpa mengeluarkannya dari perisai ekspansi? Anda harus mengakui bahwa memindahkan modul bolak-balik tidak nyaman, pada saat yang sama Anda ingin bereksperimen dengan parameter dan aneh mengapa Anda memerlukan modul USB-UART yang terpisah, karena secara teori ada satu di papan STM32Nucleo.

Solusinya sederhana: kita perlu mengubah papan Nucleo menjadi jembatan antara modul XBee dan konverter USB di papan tulis.

Deskripsi umum dari ide tersebut


Mikrokontroler STM32 yang kami gunakan memiliki beberapa antarmuka UART. Setiap antarmuka seperti itu mewakili saluran komunikasi. Salah satunya terhubung ke konverter USB-UART sehingga kita dapat berkomunikasi dengan komputer melalui USB di terminal. Dua lainnya belum digunakan. Kami akan menghubungkan modul XBee ke salah satunya, yang juga memiliki saluran komunikasi seperti itu. Anda dapat memilih UART apa saja, kami telah memilih UART1 kepastian.

Pinout dapat dilihat dalam MBed di kanan atas, dengan menekan tombol pemilihan board, dan kemudian pada tab Pinout. Karena kebiasaan, mungkin cukup sulit untuk memahami gambar yang penuh warna ini. Ada banyak hal di sini, karena papan memiliki banyak antarmuka, dan ada dua nomor pin: relatif terhadap mikrokontroler (PA_5, PA_6 - penomoran pin), dan relatif ke papan (D13, D12 - tulisan pada papan Nucleo, angka yang sama di dekat terminal).


 
Ternyata pada mikrokontroler, antarmuka UART1 akan berkomunikasi dengan modul-XBee, dan UART2 - seperti sebelumnya, dengan komputer. Kode internal akan mengalihkan UART1 ke UART2 dan sebaliknya.



Dengan koneksi, akan terlihat seperti ini:



Membuat "jembatan" dari mikrokontroler


Dalam kasus kami, kami dapat melompat pada perisai mengatur angka yang ingin kami sambungkan modul ZigBee. Modul komunikasi TX akan terhubung ke pin 2 board (PA_9 pada mikrokontroler), dan RX ke pin 8 (alias PA_10).

Akan terlihat seperti ini:



Kode yang kami ambil disebut Serial Bridge. Ini adalah "jembatan" antara dua saluran komunikasi. Kami memuat kode ke dalam mikrokontroler, yang meneruskan segala sesuatu yang datang ke input dari komputer melalui UART2, ke UART1, dan sebaliknya. Seolah kami menyisipkan pipa di antara dua sumber informasi (Linuxsoids akan mengerti). Kami menghubungkan modul XBee ke UART1.
Kode ini sangat sederhana, satu-satunya hal yang perlu Anda ubah di dalamnya adalah nomor pin yang terhubung dengan perangkat. Artinya, buat mereka PA_9 dan PA_10, seperti yang ditunjukkan di atas.
#include "mbed.h"
// Make a serial bridge from a serial I/O device on mbed to the PC
Serial pc(USBTX, USBRX); // tx, rx
Serial device(PA_9, PA_10); // tx, rx
// Defaults to 9600 baud on each device - use .baud(baudrate) to change
int main() {
 pc.printf("Hello!");
 while(1) {
   if(pc.readable()) {
     device.putc(pc.getc());
   }
   if(device.readable()) {
     pc.putc(device.getc());
   }
 }
}

Penting bahwa jika Anda mengacaukan urutan kesimpulan - misalnya, Anda membuat kesalahan dan menulis PA_10, PA_9 bukannya PA_9, PA_10 - urutan yang salah, maka kompiler tidak akan melaporkan kesalahan kepada Anda, dan program akan menampilkan kesalahan di konsol saat reboot:
pinmap not found for peripheral

dan tidak akan bergerak, yaitu, pada prinsipnya, tidak ada yang akan berhasil.

Setelah Anda mengunduh kode ini dan mengatur jumper dengan benar pada pelindung, Anda dapat terhubung dengan aman ke modul XBee dari komputer, seperti yang Anda lakukan sebelumnya dengan adaptor USB-UART tanpa melepaskannya dari pelindung. Itu akan secara teratur terdeteksi oleh program XCTU.

Sekalipun Anda tidak memerlukan fungsi ini, masih periksa apakah programnya berfungsi, karena dalam contoh berikut ini kami akan berkomunikasi dengan modul XBee dari mikrokontroler, dan koneksi melalui UART1 harus sudah dibangun (yaitu, jumper diatur dengan benar dan nomor pin ditunjukkan dalam program) .

4. Akuisisi data


Mari kita lihat dua contoh sederhana: cara menerima dan mengirim data pada level mikrokontroler, menggunakan modul XBee sebagai antarmuka komunikasi eksternal.

Ada perpustakaan resmi dari produsen - perusahaan Digi. Itu terletak di repositori Mbed, ada komentar yang berguna tentang penggunaan dan logika kode.

Pertama, kita akan belajar cara mendapatkan data - ada contoh yang lebih mudah. Kami akan memiliki modul XBee yang terhubung ke konverter USB-UART, mengirim ucapan ke papan Nucleo, dan itu akan mencetak ucapan ini ke konsol.



Buka proyek di perpustakaan ini. Seperti biasa, impor ke kompiler online sebagai program.

Perbaiki perpustakaan untuk modul S2C


Perlu diingat bahwa jika Anda memiliki modul seri S2C:



maka alih-alih pustaka standar Anda harus menggunakan perbaikan: XBeeLib_Fixed . Kalau tidak, program ini tidak akan berfungsi. Itu ditambahkan ke proyek hanya dengan menghapus perpustakaan XBeeLib dari sana, dan mengimpornya ke proyek XBeeLibFix. Tidak ada lagi yang perlu diubah.

Jadi: impor perpustakaan ini ke kompiler online:



Jendela impor proyek akan muncul. Di sana Anda harus memilih target - tempat kami mengimpor:



Sebagai proyek target, pilih contoh kami XBeeZB_Receive_Data.



Setelah itu perpustakaan akan diimpor ke proyek, dan kemudian dengan langkah berani kami menghapus versi XBeeLib yang salah.



Contoh Kompilasi


Jadi, Anda mengimpor contoh dan mengganti perpustakaan di dalamnya jika perlu.
Lihatlah kode sampel, ini cukup sederhana. Ini mendefinisikan fungsi panggilan balik yang dipanggil saat paket diterima. Fungsi ini mencetak isi dari paket yang diterima ke konsol. Jadi jika kita mengirimnya salam, dia akan mencetaknya juga.

Agar contoh dikompilasi, Anda harus menulis dalam contoh kesimpulan bahwa kita bertanggung jawab untuk berkomunikasi dengan modul-XBee, karena program tidak tahu kesimpulan mana yang kita hubungkan dengan perangkat keras.

Oleh karena itu, kita buka file config.h dan baris di dalamnya:

//#define RADIO_TX NC /* TODO: specify your setup's Serial TX pin connected to the XBee module DIN pin */
//#define RADIO_RX NC /* TODO: specify your setup's Serial RX pin connected to the XBee module DOUT pin */

Batalkan komentar, dan bukannya NC yang kami tulis, sesuai dengan kesimpulan apa yang kami hubungkan dengan jumper:

#define RADIO_TX PA_9
#define RADIO_RX PA_10

Demikian pula, kami memodifikasi garis:

//#define DEBUG_TX NC /* TODO: specify your setup's Serial TX for debugging */
//#define DEBUG_RX NC /* TODO: specify your setup's Serial RX for debugging (optional) */

Kami menulis:

#define DEBUG_TX USBTX
#define DEBUG_RX USBRX

Jika Anda menemukan kesalahan selama kompilasi yang tidak dapat Anda temukan device.h, perbarui perpustakaan Mbed di pohon proyek (klik kanan di atasnya -> Perbarui).

Setelah itu, program akan berhasil dikompilasi, dan Anda dapat mengunduhnya ke papan.

Contoh menjalankan


Setelah melihat konsol apa yang ditulis papan Nucleo, Anda akan melihat yang berikut:



Bagaimana kami mengirim data? Opsi termudah: melalui konsol dalam program XCTU. Pilih di menu utama program: Alat - Kirim paket.



Di bagian bawah ada jendela dengan kata-kata Kirim paket. Buat paket baru dengan mengklik "plus" di sebelah kanan. Sebuah jendela untuk membuat paket baru akan muncul. Pilih tab HEX di sana.



Masukkan pengiriman data seperti itu:
7E 00 19 10 01 00 00 00 00 00 00 FF FF FF FE 00 00 48 65 6C 6C 6F 20 58 42 65 65 21 5A
(menggunakan tombol "Kirim paket terpilih" di sebelah kanan daftar paket)

Anda akan melihat hasilnya di konsol modul pendengaran:



Harap dicatat bahwa itu hanya mencetak bagian terakhir dari byte yang Anda kirim. Ini adalah muatan pesan yang sebenarnya. Juga perhatikan bahwa jika Anda mengirim "hanya byte" (kombinasi byte acak), penerima tidak akan mengeluarkannya.

Jika Anda meletakkan satu set byte: 
48 65 6C 6C 6F 20 58 42 65 65 21
di konverter HEX-ASCIII mana pun (misalnya, satu ), maka pastikan itu berarti "Halo XBee!"

Tugas yang sangat sederhana untuk eksekusi independen: modifikasi kode contoh sehingga menampilkan teks pesan dalam ASCII, bukan HEX, dan Anda bisa membaca teks ini di terminal.

5. Mengirim data


Dengan analogi dengan contoh sebelumnya, kami sekarang mempertimbangkan untuk mengirim data.



Semuanya ada di sini, seperti pada contoh sebelumnya. Hanya dengan perbedaan itulah kita sekarang membuka contoh XBeeZB_Send_Data.

Contoh Kompilasi


Penting bahwa jika Anda memiliki modul S2C (itu tertulis dengan jelas di atasnya),



maka Anda akan kembali menghubungkan perpustakaan dengan perbaikan, jika tidak, tidak ada yang akan bekerja untuk Anda. Cara melakukan ini dijelaskan dalam contoh sebelumnya. 

Juga, di sini untuk kompilasi yang berhasil Anda perlu menentukan pin pengontrol yang digunakan, Anda dapat menyalinnya dari contoh sebelumnya.

Kami melihat contoh kode itu sendiri. Ini mainmenggunakan beberapa metode untuk mengirim data. Pilih yang paling sederhana: kirim data ke koordinator. Kami bahkan tidak perlu mendaftarkan alamat koordinator, karena dia sudah terdaftar di jaringan. Karenanya, tanpa mengubah sampel, kami mengomentari semua baris di akhir:
send_data_to_coordinator(xbee);
//send_broadcast_data(xbee);
//send_data_to_remote_node(xbee, remoteDevice);
//send_explicit_data_to_remote_node(xbee, remoteDevice);

Dan ketika Anda mulai, Anda akan melihat ini:



(jika Anda tidak melihatnya, cukup restart papan)

Bagaimana saya bisa memastikan bahwa data mencapai koordinator? Misalnya, XCTU memiliki mode konsol jaringan. Diaktifkan oleh tombol di kanan atas. Dalam mode ini, Anda akan melihat semua paket di jaringan. Tentu saja, pada saat yang sama, Anda harus memiliki koneksi serial dengan koordinator. Dan jangan lupa klik tombol Open di kiri atas untuk membuatnya hijau.



Anda dapat melihat informasi terperinci tentang setiap paket di jaringan dengan memilihnya dalam daftar di sebelah kiri:



Menggulir ke bagian akhir isi paket, Anda juga akan melihat baris dengan teks "send_data_to_coordinator":



Anda dapat mencoba metode lain untuk mengirim data, tetapi di sana (misalnya, untuk mengirim ke simpul yang dipilih terpisah) Anda harus mendaftarkan alamat simpul. Anda dapat melihat alamat semua modul dalam program XCTU. Cara mendaftarkan alamat tertentu dijelaskan secara mendalam dalam contoh ini.

6. Kami membuat gateway MQTT


Semuanya bagus, tapi sekarang saya ingin bekerja dengan data ini di luar jaringan XBee, misalnya, di Internet. Salah satu cara untuk melakukan ini adalah dengan menempatkan penerjemah dari XBee ke dalam protokol MQTT yang populer. Kemudian, dengan cara biasa, kita dapat berlangganan pemberitahuan acara dan mengirim perintah dari antarmuka pengguna, dan program ini dapat ditemukan di mana saja (jika Anda menggunakan server MQTT eksternal daripada eksternal), dan tidak hanya di komputer kami.

Di bawah ini adalah instruksi. Singkatnya, program yang diluncurkan di komputer akan bertukar data dari koordinator jaringan melalui koneksi USB. Dia akan mengirimkan data ini ke protokol MQTT.


Instal dan konfigurasikan XBMQ


Program yang akan kita gunakan sebagai gateway MQTT disebut XBMQ, terbuka dan gratis. Ada dalam dua versi:

Versi Java akan dipertimbangkan, meskipun ini tidak terlalu mendasar: kita tidak akan memprogramnya, kita hanya akan menginstalnya dan menggunakannya.
Agar program dapat bekerja, Anda memerlukan pustaka RXTX, itu dapat diinstal hanya dari repositori:
sudo apt-get install librxtx-java

Dan tentu saja, Anda memerlukan JDK (Java Development Kit). Itu ada dalam dua versi - dari Oracle dan OpenJDK, yang kedua direkomendasikan. Kemungkinan besar, OpenJDK sudah diinstal pada sistem Anda, jika tidak, instal ulang. Java membutuhkan maksimum 8, karena javax.xml.bind dikecualikan dari Java 11 dan Anda harus memilih alternatif dengan JDK-8 sebagai opsi default, atau membuat konfigurasi untuk kasus ini.

Unduh repositori program XBMQ:
git clone https://github.com/angryelectron/xbmq-java

Setelah mengunduh kode sumber, kami akan mengumpulkan file biner program. Tim
ant dist

akan merakit proyek untuk semua sistem operasi utama. Program akhir yang dikompilasi akan berada di folder dist.
Sekarang konfigurasikan program ini. Membuka file
dist/xbmq.properties

dan lihat di sana:
#
# Xbmq Properties.
#
#port = /dev/ttyUSB0
#baud = 9600
#rootTopic = ab123
#broker = tcp://test.mosquitto.org:1883
#username = user
#password = password

Batalkan komentar dan ubah ke parameter Anda. Parameternya adalah sebagai berikut: Port koneksi koordinator ZigBee, kecepatan, topik root (semua data akan jatuh ke dalamnya), alamat server MQTT, nama pengguna dan kata sandi (jika server membutuhkannya).

Dalam contoh ini, hanya alamat server yang berubah - ke server mqtt lokal (mosquitto standar dari Linux). Segala sesuatu yang lain ditinggalkan secara default:

port = /dev/ttyUSB0
baud = 9600
rootTopic = ab123
broker = tcp://127.0.0.1:1883
username = user
password = password

Sebelum langkah berikutnya, Anda harus menginstal dan menjalankan server MQTT mosquitto lokal: 
sudo apt-get install mosquitto


Peluncuran XBMQ


Akhirnya, program dapat diluncurkan. Setelah menghubungkan konverter USB-UART dengan modul koordinator dimasukkan, jalankan program:
./dist/xbmq.sh

Saat Anda menjalankan skrip, kami melihat baris di konsol:
INFO - Starting XBMQ gateway ab123/0013A2004154EA46

Terakhir - ini persis alamat koordinator kami. Jika Anda berlangganan semua topik dengan klien MQTT eksternal, Anda akan segera melihat 2 pesan:
  • Dalam topik ab123/0013A2004154EA46/online- akan menjadi 1, ini adalah Kehendak Terakhir (contoh yang baik tentang bagaimana parameter "khusus" ini digunakan dalam kehidupan nyata)
  • Topik ab123/0013A2004154EA46/logakan berisi frasa debug yang sama, "Memulai gateway XBMQ ..." yang sudah Anda lihat di konsol

Sekarang cobalah mengirim pesan dari beberapa modul XBee eksternal lainnya - misalnya, ambil contoh dengan mengirim data.

Akibatnya, dalam program MQTT.fx, jika Anda berlangganan semua topik (#), Anda akan melihat ini:


Jendela program MQTT.fx.

Dengan menjalankan contoh yang dipelajari sebelumnya dengan mengirim pesan ke koordinator, kita akan melihat teks ini (“send_data_to_coordinator”) sebagai bagian Paket MQTT. Topik induk umum bagi kami adalah yang ditentukan dalam konfigurasi program ( ab123 , Anda dapat mengubahnya sendiri). Berikutnya adalah alamat koordinator, kemudian alamat modul dari mana pesan itu berasal. Akhirnya, topik ini disebut DataOut, karena ini adalah data keluar. 

Tentu saja, Anda akan melihat gambar seperti itu di klien MQTT lain, apakah itu MQTTLens atau bahkan hanyamosquitto_subdi konsol.

Beberapa komentar terakhir:
  • Dalam cara yang baik, program ini harus bekerja dalam mode daemon. Ada file xbmqd untuk ini, dan README mengatakan bagaimana cara menggunakannya.
  • Perlu diingat bahwa karena ia xbmqmemegang port, kami tidak dapat menjalankan program ini pada saat yang sama dengan XCTU.

Sekarang Anda dapat bekerja dengan sistem Anda menggunakan protokol MQTT dan menulis program yang kompleks dan menarik!


Tatyana Volkova - Penulis program pelatihan di Internet of Things melacak "Samsung IT Academy", seorang spesialis dalam program tanggung jawab sosial perusahaan di Samsung Research Center

All Articles