1. Pengantar
OpenThread yang dirilis oleh Google adalah implementasi open source dari protokol jaringan Thread®. Google Nest telah merilis OpenThread untuk membuat teknologi yang digunakan dalam produk Nest tersedia secara luas bagi developer guna mempercepat pengembangan produk untuk rumah yang terhubung.
Spesifikasi Thread mendefinisikan protokol komunikasi nirkabel device-to-device berbasis IPv6 yang andal, aman, dan berdaya rendah untuk aplikasi rumah. OpenThread mengimplementasikan semua lapisan jaringan Thread, termasuk IPv6, 6LoWPAN, IEEE 802.15.4 dengan keamanan MAC, Pembentukan Link Mesh, dan Perutean Mesh.
Dalam Codelab ini, Anda akan memprogram OpenThread di hardware sebenarnya, membuat dan mengelola jaringan Thread, serta meneruskan pesan antar-node.
Yang akan Anda pelajari
- Membangun dan mem-flash biner OpenThread CLI ke papan pengembangan
- Membangun RCP yang terdiri dari mesin Linux dan papan pengembangan
- Berkomunikasi dengan RCP menggunakan OpenThread Daemon dan
ot-ctl
- Mengelola node Thread secara manual dengan GNU Screen dan OpenThread CLI
- Penyiapan perangkat yang aman ke jaringan Thread
- Cara kerja multicast IPv6
- Meneruskan pesan antar-node Thread dengan UDP
Yang Anda butuhkan
Hardware:
- 3 papan pengembangan Nordic Semiconductor nRF52840
- 3 kabel USB ke Micro-USB untuk menghubungkan papan
- Mesin Linux dengan minimal 3 port USB
Software:
- GNU Toolchain
- Alat command line Nordic nRF5x
- Software Segger J-Link
- OpenThread
- Git
2. Memulai
Simulasi OpenThread
Sebelum memulai, sebaiknya Anda mempelajari Codelab Simulasi OpenThread untuk memahami konsep dasar Thread dan OpenThread CLI.
Terminal port serial
Anda seharusnya telah memahami cara menghubungkan ke port serial melalui terminal. Codelab ini menggunakan GNU Screen dan menyediakan ringkasan penggunaan, tetapi software terminal lainnya dapat digunakan.
Mesin Linux
Codelab ini dirancang untuk menggunakan mesin Linux berbasis i386 atau x86 sebagai host untuk perangkat Thread Radio Co-Processor (RCP), dan untuk mem-flash semua board pengembangan Thread. Semua langkah telah diuji di Ubuntu 14.04.5 LTS (Trusty Tahr).
Board Nordic Semiconductor nRF52840
Codelab ini menggunakan tiga board PDK nRF52840.
Menginstal SEGGER J-Link
Kita menggunakan SEGGER J-Link untuk memprogram papan nRF52840, yang memiliki modul JTAG onboard. Instal ini di komputer Linux Anda.
Download paket yang sesuai untuk komputer Anda, dan instal di lokasi yang tepat. Di Linux, ini adalah /opt/SEGGER/JLink
.
Menginstal Alat Command Line nRF5x
nRF5x Command Line Tools memungkinkan Anda mem-flash biner OpenThread ke papan nRF52840. Instal build nRF5x-Command-Line-Tools-<OS> yang sesuai di mesin Linux Anda.
Tempatkan paket yang diekstrak di folder root ~/
Menginstal ARM GNU Toolchain
ARM GNU Toolchain digunakan untuk membangun.
Sebaiknya tempatkan arsip yang diekstrak di /opt/gnu-mcu-eclipse/arm-none-eabi-gcc/
di perangkat Linux Anda. Ikuti petunjuk dalam file readme.txt
arsip untuk petunjuk penginstalan.
Layar Penginstalan (opsional)
Screen adalah alat sederhana untuk mengakses perangkat yang terhubung melalui port serial. Codelab ini menggunakan Screen, tetapi Anda dapat menggunakan aplikasi terminal port serial apa pun yang Anda inginkan.
$ sudo apt-get install screen
3. Meng-clone repositori
OpenThread
Buat clone dan instal OpenThread. Perintah script/bootstrap
memastikan toolchain diinstal dan lingkungan dikonfigurasi dengan benar:
$ mkdir -p ~/src $ cd ~/src $ git clone --recursive https://github.com/openthread/openthread.git $ cd openthread $ ./script/bootstrap
Bangun Daemon OpenThread:
$ script/cmake-build posix -DOT_DAEMON=ON
Sekarang Anda siap untuk membuat dan mem-flash OpenThread ke papan nRF52840.
4. Menyiapkan Penggabung RCP
Membangun dan mem-flash
Bangun contoh nRF52840 OpenThread dengan fungsi Joiner dan USB native. Perangkat menggunakan peran Joiner untuk diautentikasi dan diaktifkan dengan aman ke jaringan Thread. USB Native memungkinkan penggunaan USB CDC ACM sebagai transportasi serial antara nRF52840 dan host.
Selalu bersihkan repo dari build sebelumnya terlebih dahulu dengan menjalankan rm -rf build
.
$ cd ~/src $ git clone --recursive https://github.com/openthread/ot-nrf528xx.git $ cd ot-nrf528xx $ script/build nrf52840 USB_trans
Buka direktori dengan biner RCP OpenThread, lalu konversikan ke format hex:
$ cd ~/src/ot-nrf528xx/build/bin $ arm-none-eabi-objcopy -O ihex ot-rcp ot-rcp.hex
Pasang kabel USB ke port debug Micro-USB di samping pin daya eksternal pada papan nRF52840, lalu colokkan ke mesin Linux. Setel sakelar nRF power source di papan nRF52840 ke VDD. Jika terhubung dengan benar, LED5 akan menyala.
Jika ini adalah board pertama yang terhubung ke mesin Linux, board tersebut akan muncul sebagai port serial /dev/ttyACM0
(semua board nRF52840 menggunakan ttyACM
untuk ID port serial).
$ ls /dev/ttyACM* /dev/ttyACM0
Catat nomor seri papan nRF52840 yang digunakan untuk RCP:
Buka lokasi nRFx Command Line Tools, lalu flash file hex OpenThread RCP ke papan nRF52840, menggunakan nomor seri papan. Perhatikan bahwa jika Anda tidak menyertakan tanda --verify
, Anda akan melihat pesan peringatan yang memberi tahu Anda bahwa proses flash dapat gagal tanpa error.
$ cd ~/nrfjprog/ $ ./nrfjprog -f nrf52 -s 683704924 --verify --chiperase --program \ ~/src/ot-nrf528xx/build/bin/ot-rcp.hex --reset
Output berikut akan dihasilkan jika berhasil:
Parsing hex file. Erasing user available code and UICR flash areas. Applying system reset. Checking that the area to write is not protected. Programing device. Applying system reset. Run.
Beri label papan "RCP" agar Anda tidak salah mengira peran papan tersebut nanti.
Menghubungkan ke USB bawaan
Karena build RCP OpenThread memungkinkan penggunaan USB CDC ACM native sebagai transportasi serial, Anda harus menggunakan port nRF USB di papan nRF52840 untuk berkomunikasi dengan host RCP (mesin Linux).
Lepaskan ujung USB Mikro kabel USB dari port debug board nRF52840 yang di-flash, lalu pasang kembali ke port nRF USB USB Mikro di samping tombol RESET. Setel sakelar nRF power source ke USB.
Mulai Daemon OpenThread
Dalam desain RCP, gunakan OpenThread Daemon untuk berkomunikasi dengan dan mengelola perangkat Thread. Mulai ot-daemon
dengan tanda panjang -v
sehingga Anda dapat melihat output log dan mengonfirmasi bahwa aplikasi sedang berjalan:
$ cd ~/src/openthread $ sudo ./build/posix/src/posix/ot-daemon -v \ 'spinel+hdlc+uart:///dev/ttyACM0?uart-baudrate=460800'
Jika berhasil, ot-daemon
dalam mode verbose akan menghasilkan output yang mirip dengan berikut ini:
ot-daemon[12463]: Running OPENTHREAD/thread-reference-20200818-1938-g0f10480ed; POSIX; Aug 30 2022 10:55:05 ot-daemon[12463]: Thread version: 4 ot-daemon[12463]: Thread interface: wpan0 ot-daemon[12463]: RCP version: OPENTHREAD/thread-reference-20200818-1938-g0f10480ed; SIMULATION; Aug 30 2022 10:54:10
Biarkan jendela terminal ini tetap terbuka agar log dari ot-daemon
dapat dilihat.
Gunakan ot-ctl
untuk berkomunikasi dengan node RCP. ot-ctl
menggunakan CLI yang sama dengan aplikasi CLI OpenThread. Oleh karena itu, Anda dapat mengontrol node ot-daemon
dengan cara yang sama seperti perangkat Thread simulasi lainnya.
Di jendela terminal kedua, mulai ot-ctl
:
$ sudo ./build/posix/src/posix/ot-ctl >
Periksa state
Node 2 (node RCP) yang Anda mulai dengan ot-daemon
:
> state disabled Done
5. Menyiapkan FTD
Dua node Thread lainnya yang digunakan dalam Codelab ini adalah Perangkat Thread Lengkap (FTD) dengan desain System-on-Chip (SoC) standar. Satu perangkat berfungsi sebagai Komisioner, untuk mengautentikasi dan mengaktifkan perangkat dengan aman ke jaringan tersebut. Perangkat lain berfungsi sebagai Penggabung yang dapat diautentikasi oleh Pengatur ke jaringan Thread.
Membangun dan mem-flash
Bangun contoh FTD OpenThread untuk platform nRF52840, dengan peran Commissioner dan Joiner diaktifkan:
$ cd ~/src/ot-nrf528xx $ rm -rf build $ script/build nrf52840 USB_trans -DOT_JOINER=ON -DOT_COMMISSIONER=ON
Buka direktori dengan biner CLI Perangkat Thread Lengkap (FTD) OpenThread, lalu konversikan ke format hex:
$ cd ~/src/ot-nrf528xx/build/bin $ arm-none-eabi-objcopy -O ihex ot-cli-ftd ot-cli-ftd.hex
Pasang kabel USB ke port Micro-USB di samping pin daya eksternal pada papan nRF52840, lalu colokkan ke mesin Linux. Jika RCP masih terhubung ke mesin Linux, board baru ini akan muncul sebagai port serial /dev/ttyACM1
(semua board nRF52840 menggunakan ttyACM
untuk ID port serial).
$ ls /dev/ttyACM* /dev/ttyACM0 /dev/ttyACM1
Seperti sebelumnya, catat nomor seri papan nRF52840 yang digunakan untuk FTD:
Buka lokasi nRFx Command Line Tools, lalu flash file hex FTD OpenThread CLI ke board nRF52840, menggunakan nomor seri board:
$ cd ~/nrfjprog/ $ ./nrfjprog -f nrf52 -s 683704924 --verify --chiperase --program \ ~/src/ot-nrf528xx/build/bin/ot-cli-ftd.hex --reset
Beri label papan "Commissioner".
Menghubungkan ke USB bawaan
Karena build FTD OpenThread memungkinkan penggunaan USB CDC ACM native sebagai transpor serial, Anda harus menggunakan port nRF USB di papan nRF52840 untuk berkomunikasi dengan host RCP (mesin Linux).
Lepaskan ujung USB Mikro kabel USB dari port debug board nRF52840 yang di-flash, lalu pasang kembali ke port nRF USB USB Mikro di samping tombol RESET. Setel sakelar nRF power source ke USB.
Verifikasi build
Verifikasi keberhasilan build dengan mengakses OpenThread CLI menggunakan GNU Screen dari jendela terminal.
$ screen /dev/ttyACM1
Di jendela baru, tekan Return pada keyboard beberapa kali untuk memunculkan prompt >
OpenThread CLI. Aktifkan antarmuka IPv6 dan periksa alamat:
> ifconfig up Done > ipaddr fe80:0:0:0:1cd6:87a9:cb9d:4b1d Done
Gunakan Ctrl+a →
d
untuk keluar dari layar FTD Commissioner CLI dan kembali ke terminal Linux agar board berikutnya dapat di-flash. Untuk masuk kembali ke CLI kapan saja, gunakan screen -r
dari command line. Untuk melihat daftar layar yang tersedia, gunakan screen -ls
:
$ screen -ls There is a screen on: 74182.ttys000.mylinuxmachine (Detached) 1 Socket in /tmp/uscreens/S-username.
Menyiapkan Penggabung FTD
Ulangi proses di atas untuk mem-flash board nRF52840 ketiga, menggunakan build ot-cli-ftd.hex
yang ada. Setelah selesai, pastikan untuk menghubungkan kembali board ke PC menggunakan port USB nRF dan setel sakelar sumber daya nRF ke VDD.
Jika dua node lainnya terhubung ke mesin Linux saat board ketiga ini terhubung, board tersebut akan muncul sebagai port serial /dev/ttyACM2
:
$ ls /dev/ttyACM* /dev/ttyACM0 /dev/ttyACM1 /dev/ttyACM2
Beri label papan "Joiner".
Saat memverifikasi menggunakan Layar, alih-alih membuat instance Layar baru dari command line, lampirkan kembali ke instance yang ada dan buat jendela baru di dalamnya (yang Anda gunakan untuk Komisioner FTD):
$ screen -r
Buat jendela baru dalam Screen dengan Ctrl+a → c
.
Perintah command line baru akan muncul. Akses OpenThread CLI untuk FTD Joiner:
$ screen /dev/ttyACM2
Di jendela baru ini, tekan Return pada keyboard beberapa kali untuk menampilkan perintah >
OpenThread CLI. Aktifkan antarmuka IPv6 dan periksa alamat:
> ifconfig up Done > ipaddr fe80:0:0:0:6c1e:87a2:df05:c240 Done
Sekarang setelah FTD Joiner CLI berada di instance Screen yang sama dengan FTD Commissioner, Anda dapat beralih di antara keduanya menggunakan Ctrl+a → n
.
Gunakan Ctrl+a →
d
kapan saja untuk keluar dari Layar.
6. Penyiapan jendela terminal
Selanjutnya, Anda akan sering beralih antar-perangkat Thread, jadi pastikan semua perangkat tersebut aktif dan mudah diakses. Sejauh ini, kita telah menggunakan Screen untuk mengakses dua FTD, dan alat ini juga memungkinkan layar terpisah di jendela terminal yang sama. Gunakan ini untuk melihat cara satu node bereaksi terhadap perintah yang dikeluarkan di node lain.
Idealnya, Anda harus memiliki empat jendela yang siap digunakan:
- Layanan / log
ot-daemon
- RCP Joiner melalui
ot-ctl
- FTD Commissioner melalui OpenThread CLI
- FTD Joiner melalui OpenThread CLI
Jika Anda ingin menggunakan konfigurasi atau alat terminal / port serial Anda sendiri, silakan lanjutkan ke langkah berikutnya. Konfigurasi jendela terminal untuk semua perangkat dengan cara yang paling sesuai bagi Anda.
Menggunakan Layar
Untuk kemudahan penggunaan, hanya mulai satu sesi Layar. Anda seharusnya sudah memilikinya sejak menyiapkan kedua FTD.
Semua perintah dalam Screen dimulai dengan Ctrl+a.
Perintah Layar Dasar:
Melampirkan kembali ke sesi Screen (dari command line) |
|
Keluar dari sesi Layar | Ctrl+a → |
Membuat jendela baru dalam sesi Layar | Ctrl+a → |
Beralih antarjendela dalam sesi Layar yang sama | Ctrl+a → |
Menutup jendela saat ini di sesi Screen | Ctrl+a → |
Layar Terpisah
Dengan Screen, Anda dapat membagi terminal menjadi beberapa jendela:
Perintah di screen
diakses menggunakan Ctrl+a. Setiap perintah harus dimulai dengan kombinasi tombol akses ini.
Jika Anda telah mengikuti Codelab dengan tepat, Anda akan memiliki dua jendela (FTD Commissioner, FTD Joiner) pada instance Layar yang sama. Untuk membagi layar di antara keduanya, pertama-tama masukkan sesi Screen yang ada:
$ screen -r
Anda harus berada di salah satu perangkat FTD. Ikuti langkah-langkah berikut di Layar:
- Ctrl+a →
S
untuk membagi jendela secara horizontal - Ctrl+a →
Tab
untuk memindahkan kursor ke jendela kosong baru - Ctrl+a →
n
untuk mengalihkan jendela baru tersebut ke jendela berikutnya - Jika sama dengan jendela teratas, tekan Ctrl+a →
n
lagi untuk melihat perangkat FTD lainnya
Keduanya kini dapat dilihat. Beralih di antara keduanya menggunakan Ctrl+a → Tab
. Sebaiknya ganti judul setiap jendela dengan Ctrl+a → A
untuk menghindari kebingungan.
Penggunaan lanjutan
Untuk membagi layar lebih lanjut menjadi empat bagian dan melihat log ot-daemon
serta RCP Joiner ot-ctl
, layanan tersebut harus dimulai dalam instance Layar yang sama ini. Untuk melakukannya, hentikan ot-daemon
dan keluar dari ot-ctl
, lalu mulai ulang di jendela Screen baru (Ctrl+a → c
).
Penyiapan ini tidak diperlukan dan dibiarkan sebagai latihan bagi pengguna.
Pisahkan dan navigasikan antar-jendela dengan perintah berikut:
Buat jendela baru | Ctrl+a → |
Membagi jendela secara vertikal | Ctrl+a → |
Membagi jendela secara horizontal | Ctrl+a → |
Beralih ke jendela berikutnya yang ditampilkan | Ctrl+a → |
Mengalihkan jendela yang ditampilkan ke depan atau belakang | Ctrl+a → |
Mengganti nama jendela saat ini | Ctrl+a → |
Keluar dari Screen kapan saja dengan Ctrl+a → d
dan hubungkan kembali dengan screen -r
dari command line.
Untuk mengetahui informasi selengkapnya tentang Screen, lihat referensi singkat GNU Screen.
7. Buat jaringan Thread
Setelah semua jendela dan layar terminal dikonfigurasi, mari kita buat jaringan Thread. Di FTD Commissioner, buat Kumpulan Data Operasional baru dan terapkan sebagai yang aktif. Set Data Operasional adalah konfigurasi untuk jaringan Thread yang Anda buat.
## FTD Commissioner ## ---------------------- > dataset init new Done > dataset Active Timestamp: 1 Channel: 11 Channel Mask: 07fff800 Ext PAN ID: c0de7ab5c0de7ab5 Mesh Local Prefix: fdc0:de7a:b5c0/64 Network Key: 1234c0de7ab51234c0de7ab51234c0de Network Name: OpenThread-c0de PAN ID: 0xc0de PSKc: ebb4f2f8a68026fc55bcf3d7be3e6fe4 Security Policy: 0, onrcb Done
Catat Kunci Jaringan 1234c0de7ab51234c0de7ab51234c0de
yang akan digunakan nanti.
Lakukan penerapan set data ini sebagai set data aktif:
> dataset commit active Done
Aktifkan antarmuka IPv6:
> ifconfig up Done
Operasi protokol Start Thread:
> thread start Done
Setelah beberapa saat, periksa status perangkat. Harus berupa Pemimpin. Dapatkan juga RLOC16 untuk referensi pada masa mendatang.
## FTD Commissioner ## ---------------------- > state leader Done > rloc16 0c00 Done
Periksa alamat IPv6 perangkat:
## FTD Commissioner ## ---------------------- > ipaddr fdc0:de7a:b5c0:0:0:ff:fe00:fc00 # Leader Anycast Locator (ALOC) fdc0:de7a:b5c0:0:0:ff:fe00:c00 # Routing Locator (RLOC) fdc0:de7a:b5c0:0:6394:5a75:a1ad:e5a # Mesh-Local EID (ML-EID) fe80:0:0:0:1cd6:87a9:cb9d:4b1d # Link-Local Address (LLA)
Jaringan "codelab" kini terlihat saat dipindai dari perangkat Thread lain.
Dari ot-ctl
di RCP Joiner:
## RCP Joiner ## ---------------- > scan | PAN | MAC Address | Ch | dBm | LQI | +------+------------------+----+-----+-----+ | c0de | 1ed687a9cb9d4b1d | 11 | -36 | 232 |
Dari OpenThread CLI di FTD Joiner:
## FTD Joiner ## ---------------- > scan | PAN | MAC Address | Ch | dBm | LQI | +------+------------------+----+-----+-----+ | c0de | 1ed687a9cb9d4b1d | 11 | -38 | 229 |
Jika jaringan "codelab" tidak muncul dalam daftar, coba pindai lagi.
8. Menambahkan Penggabung RCP
Penyiapan Thread tidak aktif di jaringan, yang berarti kita perlu menambahkan RCP Joiner ke jaringan Thread yang baru saja kita buat menggunakan proses penyiapan di luar band.
Di FTD Commissioner, kami mencatat Kunci Jaringan, misalnya 1234c0de7ab51234c0de7ab51234c0de
. Jika Anda perlu mencari Kunci Jaringan lagi, jalankan perintah berikut di FTD Commissioner:
## FTD Commissioner ## > dataset networkkey 1234c0de7ab51234c0de7ab51234c0de Done
Selanjutnya, di RCP Joiner, setel Kunci Jaringan set data aktifnya ke Kunci Jaringan FTD Commissioner:
## RCP Joiner ## ---------------- > dataset networkkey 1234c0de7ab51234c0de7ab51234c0de Done > dataset commit active Done
Periksa set data untuk memastikan setelan sudah benar.
## RCP Joiner ## ---------------- > dataset Network Key: 1234c0de7ab51234c0de7ab51234c0de
Aktifkan Thread agar Penggabung RCP bergabung ke jaringan "codelab". Tunggu beberapa detik, periksa status, RLOC16, dan alamat IPv6-nya:
## RCP Joiner ## ---------------- > ifconfig up Done > thread start Done > state child Done > rloc16 0c01 Done > ipaddr fdc0:de7a:b5c0:0:0:ff:fe00:0c01 # Routing Locator (RLOC) fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f # Mesh-Local EID (ML-EID) fe80:0:0:0:18e5:29b3:a638:943b # Link-Local Address (LLA) Done
Catat Alamat IPv6 Mesh-Local (fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f
di sini), Anda akan menggunakannya nanti.
Kembali di FTD Commissioner, periksa tabel router dan turunan untuk mengonfirmasi bahwa kedua perangkat adalah bagian dari jaringan yang sama. Gunakan RLOC16 untuk mengidentifikasi RCP Joiner.
## FTD Commissioner ## ---------------------- > router table | ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC | +----+--------+----------+-----------+-------+--------+-----+------------------+ | 3 | 0x0c00 | 3 | 0 | 0 | 0 | 35 | 1ed687a9cb9d4b1d | Done > child table | ID | RLOC16 | Timeout | Age | LQ In | C_VN |R|S|D|VER| Extended MAC | +-----+--------+------------+------------+-------+------+-+-+-+---+------------------+ | 1 | 0x0c01 | 240 | 25 | 3 | 89 |1|1|1| 2| 1ae529b3a638943b | Done
Ping alamat lokal mesh RCP Joiner (alamat Mesh-Local yang diperoleh dari output ipaddr
RCP Joiner) untuk memverifikasi konektivitas:
## FTD Commissioner ## ---------------------- > ping fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f > 8 bytes from fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f: icmp_seq=1 hlim=64 time=40ms
Sekarang kita memiliki jaringan Thread yang terdiri dari dua node, yang diilustrasikan oleh diagram topologi ini:
Diagram topologi
Saat Anda menyelesaikan Codelab ini, kami akan menampilkan diagram topologi Thread baru setiap kali status jaringan berubah. Peran node ditunjukkan sebagai berikut:
Router selalu berbentuk pentagon, dan Perangkat Akhir selalu berbentuk lingkaran. Angka pada setiap node mewakili Router ID atau Child ID yang ditampilkan dalam output CLI, bergantung pada peran dan status saat ini setiap node pada saat itu.
9. Menugaskan FTD Joiner
Sekarang, tambahkan perangkat Thread ketiga ke jaringan "codelab". Kali ini, kita akan menggunakan proses commissioning dalam band yang lebih aman, dan hanya mengizinkan FTD Joiner untuk bergabung.
Di FTD Joiner, dapatkan eui64
, sehingga FTD Commissioner dapat mengidentifikasinya:
## FTD Joiner ## ---------------- > eui64 2f57d222545271f1 Done
Di FTD Commissioner, mulai commissioner dan tentukan eui64
perangkat yang dapat bergabung, beserta Kredensial Penggabung, misalnya J01NME
. Kredensial Penggabung adalah string khusus perangkat yang terdiri dari karakter alfanumerik huruf besar (0-9 dan A-Y, tidak termasuk I, O, Q, dan Z agar mudah dibaca), dengan panjang antara 6 dan 32 karakter.
## FTD Commissioner ## ---------------------- > commissioner start Done > commissioner joiner add 2f57d222545271f1 J01NME Done
Beralih ke FTD Joiner. Mulai peran penggabung dengan Kredensial Penggabung yang baru saja Anda siapkan di FTD Commissioner:
## FTD Joiner ## ---------------- > ifconfig up Done > joiner start J01NME Done
Dalam waktu sekitar satu menit, Anda akan mendapatkan konfirmasi autentikasi yang berhasil:
## FTD Joiner ## ---------------- > Join success
Aktifkan Thread agar FTD Joiner bergabung ke jaringan "codelab", lalu segera periksa status dan RLOC16:
## FTD Joiner ## ---------------- > thread start Done > state child Done > rloc16 0c02 Done
Periksa alamat IPv6 perangkat. Perhatikan bahwa tidak ada ALOC. Hal ini karena perangkat ini bukan Pemimpin, dan tidak memiliki peran khusus Anycast yang memerlukan ALOC.
## FTD Joiner ## ---------------- > ipaddr fdc0:de7a:b5c0:0:0:ff:fe00:c02 # Routing Locator (RLOC) fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd # Mesh-Local EID (ML-EID) fe80:0:0:0:e4cd:d2d9:3249:a243 # Link-Local Address (LLA)
Segera beralih ke FTD Commissioner dan periksa tabel router dan anak untuk mengonfirmasi bahwa ada tiga perangkat di jaringan "codelab":
## FTD Commissioner ## ---------------------- > router table | ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC | +----+--------+----------+-----------+-------+--------+-----+------------------+ | 3 | 0x0c00 | 3 | 0 | 0 | 0 | 50 | 1ed687a9cb9d4b1d | > child table | ID | RLOC16 | Timeout | Age | LQ In | C_VN |R|S|D|N| Extended MAC | +-----+--------+------------+------------+-------+------+-+-+-+-+------------------+ | 1 | 0x0c01 | 240 | 25 | 3 | 89 |1|1|1|1| 1ae529b3a638943b | | 2 | 0x0c02 | 240 | 15 | 3 | 44 |1|1|1|1| e6cdd2d93249a243 | Done
Berdasarkan RLOC16, FTD Joiner telah terhubung ke jaringan sebagai Perangkat Akhir (turunan). Berikut topologi kami yang diperbarui:
10. Cara kerja rangkaian pesan
Perangkat Thread dalam Codelab ini adalah jenis Perangkat Thread Lengkap (FTD) tertentu yang disebut Perangkat Akhir yang Memenuhi Syarat Router (REED). Artinya, perangkat ini dapat berfungsi sebagai Router atau Perangkat Akhir, dan dapat mempromosikan dirinya dari Perangkat Akhir menjadi Router.
Thread dapat mendukung hingga 32 Router, tetapi mencoba mempertahankan jumlah Router antara 16 dan 23. Jika REED terhubung sebagai Perangkat Akhir (turunan) dan jumlah Router di bawah 16, setelah jangka waktu acak dalam dua menit, REED akan otomatis dipromosikan menjadi Router.
Jika Anda memiliki dua perangkat anak di jaringan Thread setelah menambahkan FTD Joiner, tunggu setidaknya dua menit, lalu periksa kembali tabel router dan anak di FTD Commissioner:
## FTD Commissioner ## ---------------------- > router table | ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC | +----+--------+----------+-----------+-------+--------+-----+------------------+ | 3 | 0x0c00 | 3 | 0 | 0 | 0 | 50 | 1ed687a9cb9d4b1d | | 46 | 0xb800 | 63 | 0 | 3 | 3 | 1 | e6cdd2d93249a243 | > child table | ID | RLOC16 | Timeout | Age | LQ In | C_VN |R|S|D|N| Extended MAC | +-----+--------+------------+------------+-------+------+-+-+-+-+------------------+ | 1 | 0x0c01 | 240 | 61 | 3 | 89 |1|1|1|1| 1ae529b3a638943b | Done
FTD Joiner (MAC yang Diperluas = e6cdd2d93249a243
) telah mempromosikan dirinya menjadi Router. Perhatikan bahwa RLOC16 berbeda (b800
, bukan 0c02
). Hal ini karena RLOC16 didasarkan pada ID Router dan ID Turunan perangkat. Saat beralih dari Perangkat Akhir ke Router, nilai Router ID dan Child ID-nya akan berubah, begitu juga dengan RLOC16.
Konfirmasi status dan RLOC16 baru di FTD Joiner:
## FTD Joiner ## ---------------- > state router Done > rloc16 b800 Done
Melakukan downgrade FTD Joiner
Anda dapat menguji perilaku ini dengan melakukan downgrade FTD Joiner secara manual dari Router kembali ke Perangkat Akhir. Ubah status menjadi anak dan periksa RLOC16:
## FTD Joiner ## ---------------- > state child Done > rloc16 0c03 Done
Kembali ke FTD Commissioner, FTD Joiner kini akan muncul di tabel turunan (ID = 3). Bahkan mungkin ada di keduanya saat transisi:
## FTD Commissioner ## ---------------------- > router table | ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC | +----+--------+----------+-----------+-------+--------+-----+------------------+ | 3 | 0x0c00 | 3 | 0 | 0 | 0 | 50 | 1ed687a9cb9d4b1d | | 46 | 0xb800 | 63 | 0 | 3 | 3 | 1 | e6cdd2d93249a243 | > child table | ID | RLOC16 | Timeout | Age | LQ In | C_VN |R|S|D|N| Extended MAC | +-----+--------+------------+------------+-------+------+-+-+-+-+------------------+ | 1 | 0x0c01 | 240 | 61 | 3 | 89 |1|1|1|1| 1ae529b3a638943b | | 3 | 0x0c03 | 240 | 16 | 3 | 94 |1|1|1|1| e6cdd2d93249a243 | Done
Setelah beberapa waktu, router akan beralih kembali ke Router dengan RLOC b800
.
Menghapus Pemimpin
Pemimpin dipilih sendiri di antara semua Router Thread. Artinya, jika Pemimpin saat ini dikeluarkan dari jaringan Thread, salah satu Router lain akan menjadi Pemimpin baru.
Di FTD Commissioner, nonaktifkan Thread untuk menghapusnya dari jaringan Thread:
## FTD Commissioner ## ---------------------- > thread stop Done > ifconfig down Done
Dalam waktu dua menit, FTD Joiner akan menjadi pemimpin Thread baru. Periksa status dan alamat IPv6 FTD Joiner untuk memverifikasi:
## FTD Joiner ## ---------------- > state leader Done > ipaddr fdc0:de7a:b5c0:0:0:ff:fe00:fc00 # Now it has the Leader ALOC! fdc0:de7a:b5c0:0:0:ff:fe00:b800 fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd fe80:0:0:0:e4cd:d2d9:3249:a243 Done
Periksa tabel turunan. Perhatikan bahwa ada RLOC16 baru. Ini adalah RCP Joiner, seperti yang ditunjukkan oleh ID dan Extended MAC-nya. Agar jaringan Thread tetap terhubung, RCP Joiner telah mengganti Router induk, dari FTD Commissioner ke FTD Joiner. Hal ini menghasilkan RLOC16 baru untuk RCP Joiner (karena Router ID-nya berubah, dari 3 menjadi 46).
## FTD Joiner ## ---------------- > child table | ID | RLOC16 | Timeout | Age | LQ In | C_VN |R|S|D|N| Extended MAC | +-----+--------+------------+------------+-------+------+-+-+-+-+------------------+ | 1 | 0xb801 | 240 | 27 | 3 | 145 |1|1|1|1| 1ae529b3a638943b | Done
Anda mungkin harus menunggu beberapa menit hingga RCP Joiner terhubung ke FTD Joiner sebagai turunan. Periksa status dan RLOC16 untuk mengonfirmasi bahwa:
## RCP Joiner ## -------------- > state child > rloc16 b801
Pasang kembali FTD Commissioner
Jaringan Thread dengan dua node tidak terlalu menyenangkan. Mari kita aktifkan kembali Komisioner FTD.
Di FTD Commissioner, mulai ulang Thread:
## FTD Commissioner ## ---------------------- > ifconfig up Done > thread start Done
Dalam waktu dua menit, perangkat akan otomatis terhubung kembali ke jaringan "codelab" sebagai Perangkat Akhir, lalu mempromosikan dirinya menjadi Router.
## FTD Commissioner ## ---------------------- > state router Done
Periksa tabel router dan turunan di FTD Joiner untuk memverifikasi:
## FTD Joiner ## ---------------- > router table | ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC | +----+--------+----------+-----------+-------+--------+-----+------------------+ | 3 | 0x0c00 | 63 | 0 | 3 | 3 | 0 | 1ed687a9cb9d4b1d | | 46 | 0xb800 | 46 | 0 | 0 | 0 | 15 | e6cdd2d93249a243 | > child table | ID | RLOC16 | Timeout | Age | LQ In | C_VN |R|S|D|N| Extended MAC | +-----+--------+------------+------------+-------+------+-+-+-+-+------------------+ | 1 | 0xb801 | 240 | 184 | 3 | 145 |1|1|1|1| 1ae529b3a638943b | Done
Jaringan Thread kita terdiri dari tiga node lagi.
11. Pemecahan masalah
Mengelola jaringan Thread dengan beberapa perangkat di berbagai jendela terminal atau Layar dapat menjadi rumit. Gunakan tips ini untuk "mereset" status jaringan atau ruang kerja Anda jika Anda mengalami masalah.
Layar
Jika Anda pernah bingung dengan konfigurasi (terlalu banyak jendela Screen, atau Screen dalam Screen), terus tutup jendela Screen dengan Ctrl+a → k hingga tidak ada lagi jendela Screen dan screen -ls
di command line menampilkan No Sockets found
. Kemudian, buat ulang jendela Layar untuk setiap perangkat. Status perangkat dipertahankan meskipun Layar ditutup.
Node thread
Jika topologi jaringan Thread tidak seperti yang dijelaskan dalam Codelab ini, atau node terputus karena alasan tertentu (mungkin karena mesin Linux yang mendukungnya memasuki mode tidur), sebaiknya hentikan Thread, hapus kredensial jaringan, dan mulai lagi dari langkah Buat jaringan Thread.
Untuk mereset FTD:
## FTD Commissioner or FTD Joiner ## ------------------------------------ > thread stop Done > ifconfig down Done > factoryreset Done
RCP dapat direset dengan cara yang sama melalui ot-ctl
:
## RCP Joiner ## ---------------- > thread stop Done > ifconfig down Done > factoryreset Done
12. Menggunakan multicast
Multicast digunakan untuk mengomunikasikan informasi ke grup perangkat sekaligus. Di jaringan Thread, alamat tertentu dicadangkan untuk penggunaan multicast dengan berbagai grup perangkat, bergantung pada cakupannya.
Alamat IPv6 | Cakupan | Dikirim ke |
| Link-Lokal | Semua FTD dan MED |
| Link-Lokal | Semua FTD dan Router Pembatas |
| Mesh-Lokal | Semua FTD dan MED |
| Mesh-Lokal | Semua FTD dan Router Pembatas |
Karena kita tidak menggunakan Border Router dalam Codelab ini, mari kita fokus pada dua alamat multicast FTD dan MED.
Link-Lokal
Cakupan Link-Local mencakup semua antarmuka Thread yang dapat dijangkau oleh satu transmisi radio, atau satu "hop". Topologi jaringan menentukan perangkat mana yang merespons ping ke alamat multicast ff02::1
.
Ping ff02::1
dari Komisaris FTD:
## FTD Commissioner ## ---------------------- > ping ff02::1 > 8 bytes from fe80:0:0:0:e4cd:d2d9:3249:a243: icmp_seq=2 hlim=64 time=9ms
Ada dua perangkat lain dalam jaringan (FTD Joiner dan RCP Joiner), tetapi FTD Commissioner hanya menerima satu respons, dari Alamat Link-Lokal (LLA) FTD Joiner. Artinya, FTD Joiner adalah satu-satunya perangkat yang dapat dijangkau oleh FTD Commissioner dengan satu hop.
Sekarang ping ff02::1
dari FTD Joiner:
## FTD Joiner ## ---------------- > ping ff02::1 > 8 bytes from fe80:0:0:0:1cd6:87a9:cb9d:4b1d: icmp_seq=1 hlim=64 time=11ms 8 bytes from fe80:0:0:0:18e5:29b3:a638:943b: icmp_seq=1 hlim=64 time=24ms
Dua respons! Dengan memeriksa alamat IPv6 untuk perangkat lain, kita dapat melihat bahwa alamat pertama (berakhir dengan 4b1d
) adalah LLA FTD Commissioner, dan alamat kedua (berakhir dengan 943b
) adalah LLA RCP Joiner.
Artinya, FTD Joiner terhubung langsung ke FTD Commissioner dan RCP Joiner, yang mengonfirmasi topologi kita.
Mesh-Lokal
Cakupan Mesh-Local mencakup semua antarmuka Thread yang dapat dijangkau dalam jaringan Thread yang sama. Mari kita lihat respons terhadap ping ke alamat multicast ff03::1
.
Ping ff03::1
dari Komisaris FTD:
## FTD Commissioner ## ---------------------- > ping ff03::1 > 8 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:b800: icmp_seq=3 hlim=64 time=9ms 8 bytes from fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f: icmp_seq=3 hlim=64 time=68ms
Kali ini, FTD Commissioner menerima dua respons, satu dari FTD Joiner's Routing Locator (RLOC, yang diakhiri dengan b800
) dan satu dari RCP Joiner's Mesh-Local EID (ML-EID, yang diakhiri dengan d55f
). Hal ini karena cakupan mesh-local mencakup seluruh jaringan Thread. Di mana pun perangkat berada dalam jaringan, perangkat tersebut akan berlangganan alamat ff03::1
.
Ping ff03::1
dari FTD Joiner untuk mengonfirmasi perilaku yang sama:
## FTD Joiner ## ---------------- > ping ff03::1 > 8 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:c00: icmp_seq=2 hlim=64 time=11ms 8 bytes from fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f: icmp_seq=2 hlim=64 time=23ms
Perhatikan waktu respons untuk RCP Joiner di kedua output ping. RCP Joiner memerlukan waktu lebih lama untuk mencapai FTD Commissioner (68 md) daripada untuk mencapai FTD Joiner (23 md). Hal ini karena FTD Commissioner harus melakukan dua hop untuk mencapai FTD Joiner, dibandingkan dengan satu hop untuk FTD Joiner.
Anda mungkin juga memperhatikan bahwa ping multicast lokal mesh merespons dengan RLOC hanya untuk dua FTD—bukan RCP Joiner. Hal ini karena FTD adalah Router dalam jaringan, sedangkan RCP adalah Perangkat Akhir.
Periksa status RCP Joiner untuk mengonfirmasi:
## RCP Joiner ## ---------------- > state child
13. Mengirim pesan dengan UDP
Salah satu layanan aplikasi yang disediakan OpenThread adalah User Datagram Protocol (UDP), protokol Lapisan Transport. Aplikasi yang dibangun di OpenThread dapat menggunakan UDP API untuk meneruskan pesan antar-node dalam jaringan Thread, atau ke perangkat lain dalam jaringan eksternal (seperti internet, jika jaringan Thread memiliki Router Pembatas).
Soket UDP diekspos melalui CLI OpenThread. Mari kita gunakan untuk meneruskan pesan antara kedua FTD.
Dapatkan alamat EID Mesh-Local untuk FTD Joiner. Kita menggunakan alamat ini karena dapat dijangkau dari mana saja dalam jaringan Thread.
## FTD Joiner ## ---------------- > ipaddr fdc0:de7a:b5c0:0:0:ff:fe00:fc00 # Leader Anycast Locator (ALOC) fdc0:de7a:b5c0:0:0:ff:fe00:b800 # Routing Locator (RLOC) fe80:0:0:0:e4cd:d2d9:3249:a243 # Link-Local Address (LLA) fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd # Mesh-Local EID (ML-EID) Done
Mulai UDP dan ikat ke soket untuk alamat IPv6 apa pun:
## FTD Joiner ## ---------------- > udp open Done > udp bind :: 1212
Beralih ke FTD Commissioner, mulai UDP, dan hubungkan ke soket yang Anda siapkan di FTD Joiner, menggunakan ML-EID-nya:
## FTD Commissioner ## ---------------------- > udp open Done > udp connect fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd 1212 Done
Koneksi UDP harus aktif di antara kedua node. Mengirim pesan dari Komisioner FTD:
## FTD Commissioner ## ---------------------- > udp send hellothere Done
Di FTD Joiner, pesan UDP telah diterima.
## FTD Joiner ## ---------------- > 10 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:c00 49153 hellothere
14. Selamat!
Anda telah membuat jaringan Thread fisik.
Sekarang Anda tahu:
- perbedaan antara jenis, peran, dan cakupan perangkat Thread
- cara perangkat Thread mengelola statusnya dalam jaringan
- cara meneruskan pesan sederhana antar-node menggunakan UDP
Langkah berikutnya
Dari Codelab ini, coba latihan berikut:
- Lakukan flash ulang pada papan FTD Joiner sebagai MTD menggunakan biner
ot-cli-mtd
, dan amati bahwa papan tersebut tidak pernah mengupgrade dirinya sendiri ke Router atau mencoba menjadi Leader - Tambahkan lebih banyak perangkat (coba platform lain!) ke jaringan dan buat sketsa topologi menggunakan tabel router dan turunan, beserta ping ke alamat multicast
- Menggunakan pyspinel untuk mengontrol NCP
- Mengonversi NCP menjadi Router Pembatas menggunakan Router Pembatas OpenThread dan menghubungkan jaringan Thread Anda ke internet
Bacaan lebih lanjut
Lihat openthread.io dan GitHub untuk berbagai referensi OpenThread, termasuk:
- Platform yang Didukung — temukan semua platform yang mendukung OpenThread
- Membangun OpenThread — detail lebih lanjut tentang membangun dan mengonfigurasi OpenThread
- Pengantar Thread — mencakup semua konsep Thread yang ditampilkan dalam Codelab ini
Referensi: