Membangun jaringan Thread dengan board nRF52840 dan OpenThread

1. Pengantar

26b7f4f6b3ea0700.pngS

OpenThread yang dirilis oleh Google merupakan 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 perangkat-ke-perangkat berbasis IPv6 yang andal, aman, dan rendah daya untuk aplikasi rumah. OpenThread menerapkan 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 pada hardware sungguhan, membuat dan mengelola jaringan Thread, serta meneruskan pesan antar-node.

4806d16a8c137c6d.jpeg

Yang akan Anda pelajari

  • Membangun dan mem-flash biner OpenThread CLI ke dev board
  • Membangun RCP yang terdiri dari mesin Linux dan board pengembangan
  • Berkomunikasi dengan RCP menggunakan OpenThread Daemon dan ot-ctl
  • Mengelola node Thread secara manual dengan GNU Screen dan OpenThread CLI
  • Mengamankan commissioning perangkat ke jaringan Thread
  • Cara kerja multicast IPv6
  • Meneruskan pesan antara node Thread dengan UDP

Yang Anda butuhkan

Perangkat keras:

  • 3 papan dev Nordic Semiconductor nRF52840
  • 3 kabel USB ke USB Mikro untuk menghubungkan board
  • Komputer Linux dengan minimal 3 port USB

Software:

  • Toolchain GNU
  • Alat command line nRF5x Nordic
  • Software Segger J-Link
  • OpenThread
  • Git

2. Memulai

Simulasi OpenThread

Sebelum memulai, sebaiknya jalankan Codelab Simulasi OpenThread untuk memahami konsep Thread dasar dan CLI OpenThread.

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 bagi perangkat Thread Radio Co-Processor (RCP), dan untuk mem-flash semua board pengembangan Thread. Semua langkah diuji di Ubuntu 14.04.5 LTS (Trusty Tahr).

Papan nRF52840 Nordic Semiconductor

Codelab ini menggunakan tiga papan nRF52840 PDK.

a6693da3ce213856.png

Kami menggunakan SEGGER J-Link untuk memprogram papan nRF52840, yang memiliki modul JTAG onboard. Instal ini di komputer Linux Anda.

Unduh paket yang sesuai untuk komputer Anda, dan instal di lokasi yang tepat. Di Linux, nama ini adalah /opt/SEGGER/JLink.

Instal Alat Command Line nRF5x

Alat Baris Perintah nRF5x memungkinkan Anda untuk melakukan flash biner OpenThread ke board nRF52840. Instal nRF5x-Command-Line-Tools-<OS> yang sesuai dibangun di mesin Linux Anda.

Tempatkan paket yang diekstrak di folder root ~/

Instal Toolchain ARM GNU

Toolchain ARM GNU digunakan untuk membangun.

Sebaiknya tempatkan arsip yang diekstrak di /opt/gnu-mcu-eclipse/arm-none-eabi-gcc/ pada mesin Linux Anda. Ikuti petunjuk dalam file readme.txt arsip untuk petunjuk penginstalan.

Layar Instal (opsional)

Layar adalah alat sederhana untuk mengakses perangkat yang terhubung melalui port serial. Codelab ini menggunakan Layar, tetapi Anda dapat menggunakan aplikasi terminal port serial apa pun yang Anda inginkan.

$ sudo apt-get install screen

3. Meng-clone repositori

OpenThread

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

Membuat Daemon OpenThread:

$ script/cmake-build posix -DOT_DAEMON=ON

Sekarang Anda siap untuk membangun dan mem-flash OpenThread ke board nRF52840.

4. Menyiapkan RCP Joiner

Membangun dan mem-flash

Buat contoh OpenThread nRF52840 dengan Joiner dan fungsi USB native. Perangkat menggunakan peran Joiner untuk diautentikasi dan ditugaskan secara aman ke jaringan Thread. USB native memungkinkan penggunaan USB CDC ACM sebagai transportasi serial antara nRF52840 dan host.

Selalu bersihkan repo 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 board nRF52840, lalu colokkan ke mesin Linux. Setel tombol nRF power source di board nRF52840 ke VDD. Saat terhubung dengan benar, LED5 akan menyala.

20a3b4b480356447.pngS

Jika ini adalah board pertama yang dipasang ke komputer Linux, board ini akan muncul sebagai port serial /dev/ttyACM0 (semua board nRF52840 menggunakan ttyACM untuk ID port serial).

$ ls /dev/ttyACM*
/dev/ttyACM0

Perhatikan nomor seri board nRF52840 yang digunakan untuk RCP:

c00d519ebec7e5f0.jpeg

Arahkan ke lokasi Alat Baris Perintah nRFx, dan flash file hex OpenThread RCP ke board nRF52840, menggunakan nomor seri board. Perhatikan bahwa jika tanda --verify tidak ada, Anda akan melihat pesan peringatan yang memberi tahu 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 dibuat setelah 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 "RCP" board agar nanti Anda tidak tertukar dalam peran dewan.

Hubungkan ke USB native

Karena build RCP OpenThread memungkinkan penggunaan ACM CDC USB native sebagai transpor serial, Anda harus menggunakan port nRF USB pada board nRF52840 untuk berkomunikasi dengan host RCP (mesin Linux).

Lepaskan ujung kabel USB Mikro dari port debug board nRF52840 yang di-flash, lalu pasang kembali ke port nRF USB Micro-USB di samping tombol RESET. Setel tombol sumber daya nRF ke USB.

46e7b670d2464842.png

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 memastikan bahwa ia berjalan:

$ cd ~/src/openthread
$ sudo ./build/posix/src/posix/ot-daemon -v \
    'spinel+hdlc+uart:///dev/ttyACM0?uart-baudrate=115200'

Jika berhasil, ot-daemon dalam mode panjang 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

Jangan tutup jendela terminal ini agar log dari ot-daemon dapat dilihat.

Gunakan ot-ctl untuk berkomunikasi dengan node RCP. ot-ctl menggunakan CLI yang sama dengan aplikasi OpenThread CLI. Oleh karena itu, Anda dapat mengontrol node ot-daemon dengan cara yang sama seperti simulasi perangkat Thread 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 Penuh (FTD) pada desain System-on-Chip (SoC) standar. Dalam setelan Produksi, orang mungkin menggunakan wpantund, driver antarmuka jaringan tingkat produksi, untuk mengontrol instance NCP OpenThread, tetapi dalam codelab ini, kita akan menggunakan ot-ctl, CLI OpenThread.

Satu perangkat berfungsi sebagai Commissioner, untuk mengautentikasi dan melakukan commissioning perangkat secara aman ke jaringan tersebut. Perangkat lainnya berfungsi sebagai Joiner yang dapat diautentikasi oleh Commissioner ke jaringan Thread.

Membangun dan mem-flash

Buat contoh FTD OpenThread untuk platform nRF52840, dengan peran Commissioner dan Joiner yang diaktifkan:

$ cd ~/src/ot-nrf528xx
$ rm -rf build
$ script/build nrf52840 USB_trans -DOT_JOINER=ON -DOT_COMMISSIONER=ON

Buka direktori dengan biner CLI OpenThread Full Thread Device (FTD), 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 board nRF52840, lalu colokkan ke mesin Linux. Jika RCP masih terpasang ke komputer 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, perhatikan nomor seri board nRF52840 yang digunakan untuk FTD:

c00d519ebec7e5f0.jpeg

Arahkan ke lokasi Alat Baris Perintah nRFx, dan flash file hex OpenThread CLI FTD 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 "Komisaris".

Hubungkan ke USB native

Karena build OpenThread FTD memungkinkan penggunaan ACM CDC USB native sebagai transpor serial, Anda harus menggunakan port nRF USB pada board nRF52840 untuk berkomunikasi dengan host RCP (mesin Linux).

Lepaskan ujung kabel USB Mikro dari port debug board nRF52840 yang di-flash, lalu pasang kembali ke port nRF USB Micro-USB di samping tombol RESET. Setel tombol sumber daya nRF ke USB.

46e7b670d2464842.png

Memverifikasi build

Verifikasi bahwa build berhasil dengan mengakses OpenThread CLI menggunakan GNU Screen dari jendela terminal. Board nRF52840 menggunakan frekuensi baud{i> <i}115200.

$ screen /dev/ttyACM1 115200

Di jendela baru, tekan Return pada keyboard beberapa kali untuk menampilkan perintah > OpenThread CLI. Tampilkan antarmuka IPv6 dan periksa alamat:

> ifconfig up
Done
> ipaddr
fe80:0:0:0:1cd6:87a9:cb9d:4b1d
Done

Gunakan Ctrl+a →

d untuk lepas 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 Penyambung FTD

Ulangi proses di atas untuk melakukan flash board nRF52840 ketiga, menggunakan build ot-cli-ftd.hex yang sudah ada. Setelah selesai, pastikan untuk menghubungkan kembali board ke PC menggunakan port USB nRF dan setel tombol sumber daya nRF ke VDD.

Jika dua node lainnya dipasang ke mesin Linux saat board ketiga ini terpasang, node tersebut akan muncul sebagai port serial /dev/ttyACM2:

$ ls /dev/ttyACM*
/dev/ttyACM0  /dev/ttyACM1  /dev/ttyACM2

Beri label "Penggabung".

Saat memverifikasi menggunakan Screen, alih-alih membuat instance Screen baru dari command line, lampirkan kembali ke instance yang sudah ada dan buat jendela baru di dalamnya (yang Anda gunakan untuk FTD Commissioner):

$ screen -r

Buat jendela baru di dalam Screen dengan Ctrl+a → c.

Perintah command line baru akan muncul. Akses OpenThread CLI untuk FTD Joiner:

$ screen /dev/ttyACM2 115200

Di jendela baru ini, tekan Return pada keyboard beberapa kali untuk menampilkan perintah > OpenThread CLI. Tampilkan antarmuka IPv6 dan periksa alamat:

> ifconfig up
Done
> ipaddr
fe80:0:0:0:6c1e:87a2:df05:c240
Done

Setelah CLI Joiner FTD berada dalam instance Screen yang sama dengan Commissioner FTD, Anda dapat beralih di antaranya menggunakan Ctrl+a → n.

Gunakan Ctrl+a →

d kapan saja untuk keluar dari Layar.

6. Penyiapan jendela terminal

Ke depannya, Anda akan sering beralih antar-perangkat Thread, jadi pastikan semuanya aktif dan mudah diakses. Sejauh ini, kita telah menggunakan Screen untuk mengakses dua FTD, dan alat ini juga memungkinkan layar terpisah pada jendela terminal yang sama. Gunakan ini untuk melihat bagaimana satu reaksi {i>node<i} bereaksi terhadap perintah yang dikeluarkan pada {i>node<i} lainnya.

Idealnya, Anda harus memiliki empat jendela yang selalu tersedia:

  1. Layanan / log ot-daemon
  2. RCP Joiner melalui ot-ctl
  3. FTD Commissioner melalui OpenThread CLI
  4. FTD Joiner melalui OpenThread CLI

Jika Anda ingin menggunakan alat atau konfigurasi terminal / port serial Anda sendiri, lanjutkan ke langkah berikutnya. Konfigurasikan jendela terminal untuk semua perangkat dengan cara yang paling sesuai untuk Anda.

Menggunakan Layar

Untuk kemudahan penggunaan, cukup mulai satu sesi Layar. Anda seharusnya sudah memilikinya dari saat menyiapkan kedua FTD.

Semua perintah dalam Layar dimulai dengan Ctrl+a.

Perintah Layar Dasar:

Lampirkan kembali ke sesi Screen (dari command line)

screen -r

Keluar dari sesi Screen

Ctrl+a → d

Membuat jendela baru dalam sesi Screen

Ctrl+a → c

Beralih antarjendela dalam sesi Layar yang sama

Ctrl+a → n (maju)Ctrl+a → p (kembali)

Menghentikan jendela saat ini di sesi Screen

Ctrl+a → k

Layar Terpisah

Dengan Screen, Anda dapat membagi terminal menjadi beberapa jendela:

f1cbf1258cf0a5a.png

Perintah di screen diakses menggunakan Ctrl+a. Setiap perintah harus dimulai dengan kombo kunci akses ini.

Jika telah mengikuti Codelab dengan tepat, Anda seharusnya memiliki dua jendela (FTD Commissioner, FTD Joiner) pada instance Screen yang sama. Untuk membagi layar di antara keduanya, pertama-tama masuk ke sesi Layar yang ada:

$ screen -r

Anda seharusnya menggunakan salah satu perangkat FTD. Ikuti langkah-langkah berikut di Layar:

  1. Ctrl+a → S untuk membagi jendela secara horizontal
  2. Ctrl+a → Tab untuk memindahkan kursor ke jendela kosong baru
  3. Ctrl+a → n untuk mengalihkan jendela baru tersebut ke jendela berikutnya
  4. Jika sama dengan jendela atas, Ctrl+a → n lagi untuk melihat perangkat FTD lainnya

Keduanya kini terlihat. Beralih antar-perangkat menggunakan Ctrl+a → Tab. Sebaiknya ganti judul setiap jendela dengan Ctrl+a → A untuk menghindari kebingungan.

Penggunaan lanjutan

Untuk membagi layar lebih lanjut menjadi kuadran serta melihat log ot-daemon dan 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 dalam jendela Screen baru (Ctrl+a → c).

Penyiapan ini tidak diperlukan dan dibiarkan sebagai latihan bagi pengguna.

Bagi dan beralih antarjendela dengan perintah berikut:

Buat jendela baru

Ctrl+a → c

Pisahkan jendela secara vertikal

Ctrl+a →

Memisahkan jendela secara horizontal

Ctrl+a → S

Beralih ke jendela yang ditampilkan berikutnya

Ctrl+a → Tab

Mengalihkan jendela yang ditampilkan ke depan atau ke belakang

Ctrl+a → n atau p

Mengganti nama jendela saat ini

Ctrl+a → A

Keluar dari Layar kapan saja dengan Ctrl+a → d dan lampirkan kembali dengan screen -r dari command line.

Untuk mengetahui informasi selengkapnya tentang Layar, lihat Referensi cepat Layar GTFS.

7. Membuat jaringan Thread

Setelah semua jendela dan layar terminal dikonfigurasi, mari kita buat jaringan Thread. Di FTD Commissioner, buat Set Data Operasional baru dan commit 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.

Commit set data ini sebagai set data aktif:

> dataset commit active
Done

Munculkan antarmuka IPv6:

> ifconfig up
Done

Mulai operasi protokol Thread:

> thread start
Done

Setelah beberapa saat, periksa status perangkat. Harusnya menjadi 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)

"Codelab" jaringan kini terlihat saat dipindai dari perangkat Thread lainnya.

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 "codelab" jaringan tersebut tidak muncul dalam daftar, coba pindai lagi.

8. Menambahkan RCP Joiner

Thread Commissioning tidak aktif di jaringan, yang berarti kita perlu menambahkan RCP Joiner ke jaringan Thread yang baru saja dibuat menggunakan proses commissioning out-of-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, pada RCP Joiner, tetapkan Kunci Jaringan set data aktif ke Kunci Jaringan Commissioner FTD:

## RCP Joiner ##
----------------

> dataset networkkey 1234c0de7ab51234c0de7ab51234c0de
Done
> dataset commit active
Done

Periksa {i>dataset<i} untuk memastikan bahwa {i>dataset <i}itu sudah diatur dengan benar.

## RCP Joiner ##
----------------

> dataset
Network Key: 1234c0de7ab51234c0de7ab51234c0de

Tampilkan Thread agar Penyambung RCP bergabung dengan "codelab" jaringan. 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 ke FTD Commissioner, periksa router dan tabel turunan untuk memastikan bahwa kedua perangkat merupakan bagian dari jaringan yang sama. Gunakan RLOC16 untuk mengidentifikasi Penyambung RCP.

## 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 mesh-lokal 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

Kita sekarang memiliki jaringan Thread yang terdiri dari dua node, yang diilustrasikan dengan diagram topologi ini:

otcodelab_top01C_2nodes.png

Diagram topologi

Saat Anda mengerjakan Codelab lainnya, kami akan menampilkan diagram topologi Thread baru setiap kali status jaringan berubah. Peran node dilambangkan sebagai berikut:

b75a527be4563215.png

Router selalu berbentuk pentagon, dan Perangkat Akhir selalu berbentuk lingkaran. Angka di setiap node mewakili Router ID atau ID Turunan yang ditampilkan di output CLI, bergantung pada peran dan status setiap node saat ini pada saat itu.

9. Membuat Komisi untuk Penyambung FTD

Sekarang, mari tambahkan perangkat Thread ketiga ke "codelab" jaringan. Kali ini kita akan menggunakan proses commissioning in-band yang lebih aman, dan hanya mengizinkan FTD Joiner untuk bergabung.

Di FTD Joiner, dapatkan eui64, agar FTD Commissioner dapat mengidentifikasinya:

## FTD Joiner ##
----------------

> eui64
2f57d222545271f1
Done

Di FTD Commissioner, mulai komisaris dan tentukan eui64 perangkat yang dapat bergabung, beserta Joiner Credential, misalnya J01NME. Kredensial Joiner adalah string khusus perangkat yang berisi semua karakter alfanumerik huruf besar (0-9 dan A-Y, tidak termasuk I, O, Q, dan Z untuk keterbacaan), dengan panjang antara 6 hingga 32 karakter.

## FTD Commissioner ##
----------------------

> commissioner start
Done
> commissioner joiner add 2f57d222545271f1 J01NME
Done

Beralih ke FTD Joiner. Mulai peran joiner dengan Joiner Credential 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 bahwa autentikasi berhasil:

## FTD Joiner ##
----------------

>
Join success

Tampilkan Thread agar Penggabung FTD bergabung dengan "codelab" jaringan, dan segera memeriksa status dan RLOC16:

## FTD Joiner ##
----------------

> thread start
Done
> state
child
Done
> rloc16
0c02
Done

Periksa alamat IPv6 perangkat. Perhatikan bahwa tidak ada ALOC. Hal itu karena perangkat ini bukan Leader, juga 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 router dan tabel turunan untuk mengonfirmasi bahwa ada tiga perangkat di "codelab" jaringan:

## 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, Penggabung FTD telah terhubung ke jaringan sebagai Perangkat Akhir (turunan). Berikut adalah topologi kami yang telah diperbarui:

otcodelab_top01C_ed01.png

10. Cara kerja rangkaian pesan

Perangkat Thread dalam Codelab ini adalah jenis Perangkat Thread Penuh (FTD) spesifik yang disebut Perangkat Akhir yang Memenuhi Syarat Router (REED). Artinya, perangkat dapat berfungsi sebagai Router atau Perangkat Akhir, dan dapat mempromosikan diri dari Perangkat Akhir ke Router.

Thread dapat mendukung hingga 32 Router, tetapi mencoba mempertahankan jumlah Router antara 16 dan 23. Jika REED terpasang sebagai Perangkat Akhir (turunan) dan jumlah Router kurang dari 16, setelah jangka waktu acak dalam dua menit, REED akan otomatis mempromosikan dirinya ke Router.

Jika Anda memiliki dua turunan di jaringan Thread setelah menambahkan FTD Joiner, tunggu minimal dua menit, lalu periksa kembali router dan tabel turunan 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

Penyambung FTD (MAC yang Diperluas = e6cdd2d93249a243) telah mempromosikan dirinya sendiri ke Router. Perhatikan bahwa RLOC16 berbeda (b800, bukan 0c02). Hal itu karena RLOC16 didasarkan pada ID Router dan ID Turunan perangkat. Saat bertransisi dari Perangkat Akhir ke Router, nilai ID Router dan ID Turunannya akan berubah, begitu juga RLOC16.

otcodelab_top01C.png

Konfirmasi status baru dan RLOC16 di FTD Joiner:

## FTD Joiner ##
----------------

> state
router
Done
> rloc16
b800
Done

Mendowngrade Penyambung FTD

Anda dapat menguji perilaku ini dengan mendowngrade FTD Joiner secara manual dari Router kembali ke Perangkat Akhir. Ubah status menjadi turunan dan periksa RLOC16:

## FTD Joiner ##
----------------

> state child
Done
> rloc16
0c03
Done

otcodelab_top01C_ed02.png

Kembali ke FTD Commissioner, FTD Joiner kini akan muncul di tabel turunan (ID = 3). Ini bahkan mungkin berada di keduanya saat melakukan 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.

otcodelab_top01C.png

Hapus Pemimpin

Leader terpilih di antara semua Thread Router. Artinya, jika Leader saat ini dihapus dari jaringan Thread, salah satu Router lain akan menjadi Leader 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

otcodelab_top02C_01.png

Periksa tabel turunan. Perhatikan bahwa ada RLOC16 baru. Ini adalah {i>RCP Joiner<i}, seperti yang ditunjukkan oleh ID dan {i>Extended MAC<i}-nya. Agar jaringan Thread tetap terhubung, Thread 2 telah mengalihkan Router induk, dari FTD Commissioner ke FTD Joiner. Ini menghasilkan RLOC16 baru untuk RCP Joiner (karena ID Routernya 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 sampai RCP Joiner dilampirkan ke FTD Joiner sebagai turunan. Periksa status dan RLOC16 untuk mengonfirmasi bahwa:

## RCP Joiner ##
--------------

> state
child
> rloc16
b801

Lampirkan kembali FTD Commissioner

Jaringan Thread dengan dua {i>node<i} bukanlah hal yang menyenangkan. Mari kita kembalikan FTD Commissioner ke internet.

Di FTD Commissioner, mulai ulang Thread:

## FTD Commissioner ##
----------------------

> ifconfig up
Done
> thread start
Done

Dalam waktu dua menit, kode ini akan otomatis dilampirkan kembali ke "codelab" jaringan sebagai Perangkat Akhir, lalu mempromosikan dirinya sendiri ke Router.

## FTD Commissioner ##
----------------------

> state
router
Done

Periksa router dan tabel turunan di FTD Joiner untuk memastikan:

## 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

otcodelab_top02C_02.png

Jaringan Thread kita kembali terdiri dari tiga {i>node<i}.

11. Pemecahan masalah

Mengelola jaringan Thread dengan beberapa perangkat pada terminal atau jendela Layar yang berbeda bisa jadi rumit. Gunakan tips berikut untuk "mereset" status jaringan atau ruang kerja Anda jika Anda mengalami masalah.

Layar

Jika Anda tersesat dalam konfigurasi (terlalu banyak jendela Layar atau Layar dalam Layar), terus matikan jendela Layar dengan Ctrl+a → k hingga tidak ada dan screen -ls pada command line menghasilkan No Sockets found. Kemudian, buat ulang jendela Layar untuk setiap perangkat. Status perangkat dipertahankan meskipun Layar dimatikan.

Node thread

Jika topologi jaringan Thread tidak seperti yang dijelaskan dalam Codelab ini, atau koneksi node terputus karena alasan tertentu (mungkin karena mesin Linux yang mendukungnya beralih ke mode tidur), sebaiknya hapus Thread, hapus kredensial jaringan, dan mulai lagi dari langkah Membuat 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 sekelompok perangkat sekaligus. Dalam jaringan Thread, alamat tertentu dicadangkan untuk penggunaan multicast dengan grup perangkat yang berbeda, bergantung pada cakupannya.

Alamat IPv6

Cakupan

Dikirim ke

ff02::1

Link-Lokal

Semua FTD dan MED

ff02::2

Link-Lokal

Semua FTD dan Router Perbatasan

ff03::1

Mesh-Lokal

Semua FTD dan MED

ff03::2

Mesh-Lokal

Semua FTD dan Router Perbatasan

Karena kita tidak menggunakan Router Batas dalam Codelab ini, mari kita fokus pada dua alamat multicast FTD dan MED.

Cakupan Link-Local terdiri dari 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 FTD Commissioner:

## 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 di jaringan (FTD Joiner dan RCP Joiner), tetapi FTD Commissioner hanya menerima satu respons, dari Link-Local Address (LLA) Joiner FTD. Artinya, {i>FTD Joiner<i} adalah satu-satunya perangkat yang dapat dijangkau oleh FTD Commissioner dengan satu hop.

otcodelab_top02C_02_LL.png

Sekarang, ping ff02::1 dari Penggabung FTD:

## 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 jawaban! Memeriksa alamat IPv6 untuk perangkat lain, kita dapat melihat yang pertama (diakhiri dengan 4b1d) adalah LLA Commissioner FTD, dan yang kedua (diakhiri dengan 943b) adalah LLA RCP Joiner.

otcodelab_top02C_02_LL02.png

Ini berarti Penggabung FTD terhubung langsung ke FTD Commissioner dan RCP Joiner, yang mengonfirmasi topologi kami.

Mesh-Lokal

Cakupan Mesh-Local terdiri dari 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 FTD Commissioner:

## 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 Routing Locator (RLOC, diakhiri dengan b800) dan satu dari EID Mesh-Local RCP Joiner (ML-EID, yang diakhiri dengan d55f). Hal ini dikarenakan cakupan lokal mesh mencakup keseluruhan jaringan Thread. Di mana pun perangkat berada di jaringan, perangkat akan berlangganan ke alamat ff03::1.

otcodelab_top02C_02_ML.png

Ping ff03::1 dari Penggabung FTD 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

otcodelab_top02C_02_LL02.png

Catat waktu respons untuk RCP Joiner di kedua output ping. RCP Joiner membutuhkan waktu lebih lama untuk mencapai FTD Commissioner (68 ms) dibandingkan dengan FTD Joiner (23 ms). Itu karena harus membuat dua hop untuk mencapai FTD Commissioner, dibandingkan dengan satu hop untuk FTD Joiner.

Anda mungkin juga memperhatikan bahwa ping multicast {i>mesh-local<i} merespons dengan RLOC hanya untuk dua FTD—bukan RCP Joiner. Ini karena FTD adalah {i>Router<i} 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 {i>User Datagram Protocol<i} (UDP), sebuah protokol {i>Transport Layer<i}. Aplikasi yang dibangun dengan OpenThread dapat menggunakan UDP API untuk meneruskan pesan antar-node di jaringan Thread, atau ke perangkat lain di jaringan eksternal (seperti internet, jika jaringan Thread memiliki Router Perbatasan).

Soket UDP terekspos melalui OpenThread CLI. Mari kita gunakan untuk meneruskan pesan di 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

Beralihlah 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. Kirim pesan dari FTD Commissioner:

## 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.

b915c433e7027cc7.png

Anda sekarang mengetahui:

  • 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

Berdasarkan Codelab ini, coba latihan berikut:

  • Mem-flash ulang board Joiner FTD sebagai MTD menggunakan biner ot-cli-mtd, dan amati bahwa biner tidak pernah mengupgrade dirinya sendiri ke Router atau mencoba menjadi Pemimpin
  • Menambahkan lebih banyak perangkat (coba platform lain) ke jaringan dan membuat sketsa topologi menggunakan router dan tabel turunan, bersama dengan ping ke alamat multicast
  • Menggunakan pyspinel untuk mengontrol NCP
  • Konversi NCP menjadi Router Pembatas menggunakan Router Pembatas OpenThread dan menghubungkan jaringan Thread ke internet

Bacaan lebih lanjut

Lihat openthread.io dan GitHub untuk berbagai resource OpenThread, termasuk:

Referensi: