Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Membuat jaringan Thread dengan board nRF52840 dan OpenThread

1. Pengantar

26b7f4f6b3ea0700.png

OpenThread yang dirilis oleh Google adalah penerapan open source protokol jaringan Thread®. Google Nest telah merilis OpenThread untuk menghadirkan teknologi yang digunakan dalam produk Nest secara luas bagi developer guna mempercepat pengembangan produk untuk rumah yang terhubung.

Spesifikasi Thread menentukan protokol komunikasi perangkat ke perangkat nirkabel yang andal, aman, dan berbasis IPv6 untuk aplikasi rumah. OpenThread mengimplementasikan semua lapisan jaringan Thread termasuk IPv6, 6LoWPAN, IEEE 802.15.4 dengan keamanan MAC, Mesh Link Establishment, dan Mesh Routing.

Dalam Codelab ini, Anda akan memprogram OpenThread pada hardware, membuat dan mengelola jaringan Thread, dan meneruskan pesan di antara node.

4806d16a8c137c6d.jpeg

Yang akan Anda pelajari

  • Mem-build dan mem-flash biner OpenThread CLI ke dev board
  • Membuat RCP yang terdiri dari mesin Linux dan dev board
  • Berkomunikasi dengan RCP menggunakan OpenThread Daemon dan ot-ctl
  • Mengelola node Thread secara manual dengan Layar GNU dan CLI OpenThread
  • Tindakan komisi aman perangkat ke jaringan Thread
  • Cara kerja multicast IPv6
  • Meneruskan pesan antara node Thread dengan UDP

Yang Anda butuhkan

Perangkat Keras:

  • 3 papan dev nRF52840 Nordik Semikonduktor
  • 3 kabel USB ke USB Mikro untuk menghubungkan board
  • Mesin Linux dengan minimal 3 port USB

Perangkat lunak:

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

2. Memulai

Simulasi OpenThread

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

Terminal port serial

Anda harus terbiasa dengan cara menghubungkan ke port serial melalui terminal. Codelab ini menggunakan Layar GNU dan memberikan ringkasan penggunaan, tetapi software terminal lainnya dapat digunakan.

Mesin Linux

Codelab ini dirancang untuk menggunakan mesin Linux berbasis i386 atau x86 untuk berfungsi sebagai host ke perangkat Thread Thread (Radio Co-Processor) dan mem-flash semua papan pengembangan Thread. Semua langkah diuji pada Ubuntu 14.04.5 LTS (Trusty Tahr).

Papan Nordic Semiconductor nRF52840

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.

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

Menginstal Alat Command Line nRF5x

Alat Command Line nRF5x memungkinkan Anda melakukan flash biner OpenThread ke board nRF52840. Instal build nRF5x-Command-Line-Tools-<OS> yang sesuai di komputer Linux Anda.

Tempatkan paket yang diekstrak di folder root ~/

Menginstal ARM GNU Toolchain

ARM GNU Toolchain digunakan untuk membuat.

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

Instal Layar (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 diinginkan.

$ sudo apt-get install screen

3 Clone repositori

OpenThread

Meng-clone dan menginstal 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 OpenThread Daemon:

$ script/cmake-build posix -DOT_DAEMON=ON

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

4. Menyiapkan RCP Joiner

Mem-build dan flash

Membuat 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 serial transport 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 OpenThread RCP, dan konversikan ke format heksa:

$ 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 nRF52840, lalu colokkan ke komputer Linux. Setel tombol sumber daya nRF di board nRF52840 ke VDD. Saat terhubung dengan benar, LED5 akan aktif.

20a3b4b480356447.png

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

$ ls /dev/ttyACM*
/dev/ttyACM0

Perhatikan nomor seri nRF52840 board yang digunakan untuk RCP:

c00d519ebec7e5f0.jpeg

Buka lokasi nRFx Command Line Tools, dan flash file hex OpenThread RCP ke board nRF52840, menggunakan nomor seri board. Perlu diperhatikan bahwa jika Anda tidak menyertakan flag --verify, 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 dihasilkan 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 pada papan "RCP" sehingga nanti Anda tidak bingung dengan perannya.

Menghubungkan ke USB native

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

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

46e7b670d2464842.png

Memulai OpenThread Daemon

Dalam desain RCP, gunakan OpenThread Daemon untuk berkomunikasi dengan dan mengelola perangkat Thread. Mulai ot-daemon dengan flag panjang -v sehingga Anda dapat melihat output log dan mengonfirmasi bahwa output tersebut berjalan:

$ cd ~/src/openthread
$ ./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 serupa dengan berikut ini:

ot-daemon[228024]: Running OPENTHREAD/20191113-00831-gfb399104; POSIX; Jun  7 2020 18:05:15
ot-daemon[228024]: Thread version: 2
ot-daemon[228024]: RCP version: OPENTHREAD/20191113-00831-gfb399104; SIMULATION; Jun  7 2020 18:06:08

Biarkan jendela terminal ini terbuka sehingga 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:

$ ./build/posix/bin/ot-ctl
>

Periksa state Node 2 (node RCP) yang Anda mulai dengan ot-daemon:

> state
disabled
Done

5. Menyiapkan FTD

Dua node Thread lain yang digunakan dalam Codelab ini adalah Full Thread Devices (FTD) pada desain System-on-Chip (SoC) standar. Dalam setelan Produksi, kita dapat menggunakan wpantund, driver antarmuka jaringan tingkat produksi, untuk mengontrol instance OpenThread NCP, tetapi dalam codelab ini, kita akan menggunakan ot-ctl, yaitu OpenThread CLI.

Satu perangkat berfungsi sebagai Komisaris, untuk mengautentikasi dan melakukan komisi perangkat dengan aman ke jaringan tersebut. Perangkat lainnya berfungsi sebagai Joiner yang dapat diautentikasi oleh Komisaris ke jaringan Thread.

Mem-build dan flash

Build contoh OpenThread FTD 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 OpenThread Thread Device (FTD) CLI, dan konversikan ke format heksa:

$ cd ~/src/ot-nrf528xx/build/bin
$ arm-none-eabi-objcopy -O ihex ot-cli-ftd ot-cli-ftd.hex

Pasang kabel USB ke port USB Mikro di sebelah pin daya eksternal pada board nRF52840, lalu colokkan ke komputer Linux. Jika RCP masih terpasang ke mesin Linux, papan baru ini akan muncul sebagai port serial /dev/ttyACM1 (semua nRF52840 papan menggunakan ttyACM untuk pengidentifikasi 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 nRFx Command Line Tools, 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 pada papan "Komisaris".

Menghubungkan ke USB native

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

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

46e7b670d2464842.png

Verifikasi build

Verifikasi build yang berhasil dengan mengakses OpenThread CLI menggunakan GNU Screen dari jendela terminal. Board nRF52840 menggunakan laju baud 115200.

$ screen /dev/ttyACM1 115200

Di jendela baru, tekan Kembali di keyboard beberapa kali untuk memunculkan perintah > OpenThread CLI. Munculkan antarmuka IPv6 dan periksa alamatnya:

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

Gunakan Ctrl+a →

d untuk melepaskan diri dari layar FTD Commissioner CLI dan kembali ke terminal Linux, sehingga board berikutnya dapat di-flash. Untuk memasukkan kembali 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 FTD Joiner

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 tetapkan tombol sumber daya nRF ke VDD.

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

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

Beri label pada papan "Gabung".

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

$ screen -r

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

Baris perintah baru akan muncul. Akses CLI OpenThread untuk Joiner FTD:

$ screen /dev/ttyACM2 115200

Di jendela baru ini, tekan Return di keyboard beberapa kali untuk memunculkan perintah > OpenThread CLI. Munculkan antarmuka IPv6 dan periksa alamatnya:

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

Setelah CLI FTD Joiner berada dalam instance Layar yang sama dengan Commissioner FTD, Anda dapat beralih di antara CLI 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 kedua FTD, dan alat ini juga memungkinkan split screen pada jendela terminal yang sama. Gunakan ini untuk melihat bagaimana satu node bereaksi terhadap perintah yang dikeluarkan pada node lainnya.

Idealnya, Anda akan memiliki empat jendela yang tersedia:

  1. Log / layanan ot-daemon
  2. Gabungan RRC melalui ot-ctl
  3. Komisaris FTD melalui OpenThread CLI
  4. FTD Joiner melalui OpenThread CLI

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

Menggunakan Layar

Untuk kemudahan penggunaan, hanya mulai satu sesi Layar. Anda harus memiliki sandi ini saat menyiapkan kedua FTD.

Semua perintah di Layar dimulai dengan Ctrl+a.

Perintah Layar Dasar:

Pasang kembali ke sesi Layar (dari command line)

screen -r

Keluar dari sesi Layar

Ctrl+a → d

Membuat jendela baru dalam sesi Layar

Ctrl+a → c

Beralih antar-jendela dalam sesi Layar yang sama

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

Mematikan jendela saat ini di sesi Layar

Ctrl+a → k

Bagi Layar

Dengan Screen, Anda dapat membagi terminal menjadi beberapa jendela:

f1cbf1258cf0a5a.png

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

Jika Anda telah mengikuti Codelab, Anda harus memiliki dua jendela (FTD Commissioner, FTD Joiner) pada instance Screen yang sama. Untuk membagi layar antara keduanya, masukkan sesi Layar yang ada terlebih dahulu:

$ screen -r

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

  1. Ctrl+a → S untuk memisahkan 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 di antara keduanya menggunakan Ctrl+a → Tab. Sebaiknya beri judul ulang setiap jendela dengan Ctrl+a → A untuk menghindari kebingungan.

Penggunaan lanjutan

Untuk membagi layar lebih lanjut menjadi kuadran 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 ot-ctl, lalu mulai ulang di dalam Jendela layar baru (Ctrl+a → c).

Penyiapan ini tidak diperlukan dan dibiarkan sebagai latihan bagi pengguna.

Bagi dan navigasi antarjendela dengan perintah berikut:

Buat jendela baru

Ctrl+a → c

Bagi jendela secara vertikal

Ctrl+a →

Pisahkan jendela secara horizontal

Ctrl+a → S

Beralih ke jendela berikutnya yang ditampilkan

Ctrl+a → Tab

Mengalihkan jendela yang ditampilkan maju atau mundur

Ctrl+a → n atau p

Mengganti nama jendela saat ini

Ctrl+a → A

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

Untuk mengetahui informasi selengkapnya di Layar, lihat Referensi cepat Layar GNU.

7. Membuat jaringan Thread

Setelah semua jendela dan layar terminal Anda dikonfigurasi, mari kita buat jaringan Thread. Di Komisaris FTD, buat Set Data Operasional baru dan jalankan sebagai set data 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. Seharusnya Pemimpin Terdepan. Dapatkan juga RLOC16 untuk referensi di 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" sekarang terlihat saat dipindai dari perangkat Thread lain.

Dari ot-ctl di RCP Joiner:

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

> scan
| J | Network Name     | Extended PAN     | PAN  | MAC Address      | Ch | dBm | LQI |
+---+------------------+------------------+------+------------------+----+-----+-----+
| 0 | OpenThread-c0de  | c0de7ab5c0de7ab5 | c0de | 1ed687a9cb9d4b1d | 11 | -36 | 232 |

Dari CLI OpenThread di FTD Joiner:

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

> scan
| J | Network Name     | Extended PAN     | PAN  | MAC Address      | Ch | dBm | LQI |
+---+------------------+------------------+------+------------------+----+-----+-----+
| 0 | OpenThread-c0de  | c0de7ab5c0de7ab5 | c0de | 1ed687a9cb9d4b1d | 11 | -38 | 229 |

Jika jaringan "codelab" tidak muncul dalam daftar, coba pindai lagi.

Anda dapat memperhatikan bahwa di kedua pemindaian, jaringan tersebut mungkin tidak dapat digabungkan (kolom J di RCP Joiner dan FTD Joiner). Ini hanya berarti bahwa Thread Commissioning tidak aktif di jaringan. Kartu ini tetap dapat dihubungkan dari luar, dengan memasukkan kunci jaringan di perangkat sambungan secara manual.

8 Menambahkan RCP Joiner

Mari menambahkan RCP Joiner ke jaringan Thread yang baru saja kita buat, menggunakan proses out-of-band. Pindai jaringan di RCP Joiner:

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

> scan
| J | Network Name     | Extended PAN     | PAN  | MAC Address      | Ch | dBm | LQI |
+---+------------------+------------------+------+------------------+----+-----+-----+
| 0 | OpenThread-c0de  | c0de7ab5c0de7ab5 | c0de | 1ed687a9cb9d4b1d | 11 | -38 | 229 |

Untuk bergabung, setel kunci jaringan (yang baru saja kami peroleh dari komisioner FTD) di RCP Joiner dalam set data aktifnya.

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

> dataset networkkey 1234c0de7ab51234c0de7ab51234c0de
Done
> dataset commit active
Done

Periksa set data untuk memastikan set data sudah benar.

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

> dataset
Network Key: 1234c0de7ab51234c0de7ab51234c0de

Munculkan Thread sehingga Joint RCP bergabung dengan jaringan "codelab". Tunggu beberapa detik, periksa status, RLOC16 dan alamat IPv6-nya:

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

> 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 Lokal (fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f di sini), Anda akan menggunakannya nanti.

Kembali ke Komisaris FTD, periksa router dan tabel 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 mesh-local 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 digambarkan oleh diagram topologi ini:

otcodelab_top01C_2node.png

Diagram topologi

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

b75a527be4563215.png

Router selalu berbentuk segi lima, dan Perangkat Akhir selalu berbentuk lingkaran. Jumlah pada setiap node mewakili ID Router atau ID Turunan yang ditampilkan pada keluaran CLI, bergantung pada peran dan status setiap node saat itu.

9. Komisi FTD Joiner

Sekarang mari kita tambahkan perangkat Thread ketiga ke jaringan "codelab". Kali ini kita akan menggunakan proses komisioning in-band yang lebih aman. Di FTD Joiner, pindai jaringan:

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

> scan
| J | Network Name     | Extended PAN     | PAN  | MAC Address      | Ch | dBm | LQI |
+---+------------------+------------------+------+------------------+----+-----+-----+
| 0 | OpenThread-c0de  | c0de7ab5c0de7ab5 | c0de | f65ae2853ff0c4e4 | 11 | -36 |  57 |

0 di kolom J menunjukkan bahwa Komisi Thread tidak aktif di perangkat.

Mari kita spesifik saat memesan di perangkat berikutnya, dan hanya mengizinkan FTD Joiner untuk bergabung. Masih di FTD Joiner, dapatkan eui64, sehingga Komisaris FTD dapat mengidentifikasinya:

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

> eui64
2f57d222545271f1
Done

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

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

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

Beralihlah ke FTD Joiner, lalu pindai ulang:

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

> scan
| J | Network Name     | Extended PAN     | PAN  | MAC Address      | Ch | dBm | LQI |
+---+------------------+------------------+------+------------------+----+-----+-----+
| 1 | OpenThread-c0de  | c0de7ab5c0de7ab5 | c0de | 1ed687a9cb9d4b1d | 11 | -45 | 196 |

Seperti yang ditunjukkan oleh 1 di kolom J, Komisi Thread sekarang aktif di jaringan. Mulai peran bergabung dengan Joiner Credential yang baru saja Anda siapkan di Komisi FTD:

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

Munculkan Thread sehingga FTD Joiner bergabung dengan jaringan "codelab", dan 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. Itu karena perangkat ini bukan Leader, dan 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 Komisaris FTD dan periksa router dan tabel turunan untuk mengonfirmasi bahwa tiga perangkat ada 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 adalah topologi yang diperbarui:

otcodelab_top01C_ed01.png

10. Cara kerja thread

Perangkat Thread dalam Codelab ini adalah jenis Perangkat Thread Lengkap (FTD) tertentu yang disebut Perangkat Akhir yang Memenuhi Syarat Router (REED). Ini berarti perangkat dapat berfungsi sebagai Router atau Perangkat Akhir, dan dapat mempromosikan dirinya sendiri dari Perangkat Akhir ke Router.

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

Jika Anda memiliki dua turunan di jaringan Thread setelah menambahkan Joiner FTD, tunggu setidaknya dua menit, lalu periksa kembali tabel router dan turunan di Komisaris FTD:

## 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 (Extended MAC = e6cdd2d93249a243) telah mempromosikan dirinya sendiri ke Router. Perhatikan bahwa RLOC16 berbeda (b800 bukan 0c02). Itu karena RLOC16 didasarkan pada ID Router dan ID Turunan perangkat. Saat bertransisi dari End Device ke Router, nilai Router ID dan Child ID-nya berubah, begitu pula RLOC16.

otcodelab_top01C.pngs

Konfirmasikan status baru dan RLOC16 pada FTD Joiner:

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

> state
router
Done
> rloc16
b800
Done

Mendowngrade FTD Joiner

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

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

> state child
Done
> rloc16
0c03
Done

otcodelab_top01C_ed02.png

Kembali ke Komisaris FTD, FTD Joiner kini akan muncul di tabel turunan (ID = 3). Bahkan keduanya mungkin berada dalam transisi 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 saat, perangkat akan beralih kembali ke Router dengan RLOC b800.

otcodelab_top01C.pngs

Hapus Pemimpin

Leader dipilih secara mandiri 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, matikan Thread untuk menghapusnya dari jaringan Thread:

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

> thread stop
Done
> ifconfig down
Done

Dalam waktu dua menit, FTD Joiner akan menjadi pimpinan Thread baru. Periksa status dan alamat IPv6 dari 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 RCP Joiner, seperti yang ditunjukkan oleh ID dan Extended MAC-nya. Untuk menjaga jaringan Thread bersama-sama, jaringan ini telah beralih Router induk, dari FTD Commissioner ke FTD Joiner. Hal 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 sebelum RCP Joiner dipasang ke FTD Joiner sebagai turunan. Periksa negara bagian dan RLOC16 untuk memastikan bahwa:

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

> state
child
> rloc16
b801

Lampirkan kembali Komisioner FTD

Jaringan Thread dengan dua node tidaklah menyenangkan. Mari kembali Komisaris FTD online.

Di FTD Commissioner, mulai ulang Thread:

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

> ifconfig up
Done
> thread start
Done

Dalam waktu dua menit, perangkat akan otomatis dipasang kembali ke jaringan "codelab" sebagai Perangkat Akhir, kemudian mempromosikan dirinya ke Router.

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

> state
router
Done

Periksa router dan tabel 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

otcodelab_top02C_02.png

Jaringan Thread kami terdiri dari tiga node lagi.

11. Pemecahan masalah

Mengelola jaringan Thread dengan beberapa perangkat di terminal atau Jendela layar yang berbeda dapat menjadi rumit. Gunakan tips ini untuk "mereset" status jaringan atau ruang kerja 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 k hingga tidak ada dan screen -ls di baris perintah mengeluarkan No Sockets found. Kemudian buat ulang Jendela layar untuk setiap perangkat. Status perangkat dipertahankan bahkan saat Layar dimatikan.

Node thread

Jika topologi jaringan Thread tidak seperti yang dijelaskan dalam Codelab ini, atau node terputus karena alasan tertentu (mungkin karena mesin Linux yang mematikannya), sebaiknya hentikan Thread, hapus kredensial jaringan, dan mulai lagi dariMembuat 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. Dalam jaringan Thread, alamat tertentu dicadangkan untuk penggunaan multicast dengan grup perangkat yang berbeda, bergantung pada cakupan.

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 Border Router di Codelab ini, mari kita fokus pada dua alamat multicast FTD dan MED.

Cakupan Link-Local terdiri dari semua antarmuka Thread yang dapat dijangkau dengan 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 di jaringan tersebut (FTD Joiner dan RCP Joiner), tetapi Komisaris FTD hanya menerima satu respons, dari FTD Joiner's Link-Local Address (LLA). Artinya, FTD Joiner adalah satu-satunya perangkat yang dapat dijangkau oleh Komisaris FTD dengan sekali lompatan.

otcodelab_top02C_02_LL.pngs

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

otcodelab_top02C_02_LL02.png

Artinya, FTD Joiner terhubung langsung dengan 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 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 Komisaris FTD menerima dua respons, satu dari Routing Routing Locator (RLOC Joiner, diakhiri dengan b800) FTD dan satu dari EID Mesh-Local (ML-EID), yang diakhiri dengan d55f. Itu karena cakupan mesh-local terdiri dari seluruh jaringan Thread. Di mana pun berada di jaringan, perangkat akan berlangganan ke alamat ff03::1.

otcodelab_top02C_02_ML.png

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

otcodelab_top02C_02_LL02.png

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

Anda mungkin juga memperhatikan bahwa ping multicast mesh-lokal merespons dengan RLOC hanya untuk dua FTD—bukan RCP Joiner. Ini karena FTD adalah Router dalam jaringan, sedangkan RCP adalah Perangkat Akhir.

Memeriksa status Penggabung RRC untuk mengonfirmasi:

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

> state
child

13. Mengirim pesan dengan UDP

Salah satu layanan aplikasi yang disediakan OpenThread adalah Protokol Datagram Pengguna (UDP), protokol Transport Layer. Aplikasi yang di-build di 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 Border).

Soket UDP ditampilkan melalui CLI OpenThread. Mari kita gunakan untuk meneruskan pesan di antara dua FTD.

Dapatkan alamat EID Mesh-Local untuk FTD Joiner. Kami 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 Komisaris FTD, 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 Komisaris 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!

b915c433e7027cc7.png

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

Berdasarkan Codelab ini, coba latihan berikut:

  • Jalankan ulang papan FTD Joiner sebagai MTD menggunakan biner ot-cli-mtd, dan amati bahwa FTD tidak pernah mengupgrade dirinya sendiri ke Router atau mencoba menjadi Leader
  • Tambahkan lebih banyak perangkat (coba platform lain!) ke jaringan dan buat sketsa topologi dengan menggunakan router dan tabel turunan, bersama dengan ping ke alamat multicast
  • Menggunakan pyspinel untuk mengontrol NCP
  • Konversi NCP menjadi Border Router menggunakan OpenThread Border Router dan hubungkan jaringan Thread ke internet

Bacaan lebih lanjut

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

Referensi: