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 merupakan implementasi open source dari protokol jaringan Thread®. Google Nest telah merilis OpenThread agar teknologi yang digunakan dalam produk Nest tersedia secara luas bagi developer untuk mempercepat pengembangan produk untuk rumah yang terhubung.

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

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

  • Membuat dan mem-flash biner OpenThread CLI ke board dev
  • Membuat RCP yang terdiri dari mesin Linux dan board dev
  • Berkomunikasi dengan RCP menggunakan OpenThread Daemon dan ot-ctl
  • Mengelola node Thread secara manual dengan GNU Screen dan OpenThread CLI
  • Memastikan perangkat aman 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 Micro USB untuk menghubungkan board
  • Mesin Linux dengan minimal 3 port USB

Software:

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

2. Memulai

Simulasi OpenThread

Sebelum memulai, Anda mungkin perlu mempelajari 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 yang berfungsi sebagai host ke 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).

Papan Nordic Semiconductor nRF52840

Codelab ini menggunakan tiga board nRF52840 PDK.

a6693da3ce213856.png

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

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

Instal Alat Command Line nRF5x

nRF5x Command Line Tools memungkinkan Anda mem-flash biner OpenThread ke board nRF52840. Instal nRF5x-Command-Line-Tools-<OS> yang sesuai untuk mesin Linux Anda.

Tempatkan paket yang diekstrak di folder root ~/

Menginstal Toolchain ARM GNU

Toolchain GNU GNU digunakan untuk membuat aplikasi.

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

Instal Layar (opsional)

Layar adalah alat sederhana untuk mengakses perangkat yang terhubung dengan 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

Clone dan instal OpenThread. Perintah script/bootstrap memastikan toolchain telah terinstal dan lingkungan dikonfigurasi dengan benar:

$ mkdir -p ~/src
$ cd ~/src
$ git clone --recursive https://github.com/openthread/openthread.git
$ cd openthread
$ ./script/bootstrap

Buat Daemon OpenThread:

$ script/cmake-build posix -DOT_DAEMON=ON

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

4. Menyiapkan Penggabung RCP

Buat dan flash

Membuat contoh OpenThread nRF52840 dengan Joiner dan fungsi native USB. Perangkat menggunakan peran Penggabung untuk diautentikasi dan ditugaskan dengan aman ke jaringan Thread. USB native memungkinkan penggunaan ACM CDC USB sebagai transpor 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 OpenThread RCP, 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 sumber daya nRF di board nRF52840 ke VDD. Jika terhubung dengan benar, LED5 akan aktif.

20a3b4b480356447.png

Jika ini adalah board pertama yang dipasang ke mesin 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

Buka lokasi Alat Command Line nRFx, dan flash file hex OpenThread RCP ke board nRF52840, menggunakan nomor seri board. Perlu diketahui bahwa jika tidak ada tanda --verify, Anda akan melihat pesan peringatan yang memberi tahu bahwa proses flash dapat gagal tanpa kesalahan.

$ cd ~/nrfjprog/
$ ./nrfjprog -f nrf52 -s 683704924  --verify --chiperase --program \
       ~/src/ot-nrf528xx/build/bin/ot-rcp.hex --reset

Output berikut 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 board "RCP" agar nantinya Anda tidak bingung dengan peran board.

Hubungkan ke USB native

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

Lepaskan ujung Micro-USB kabel USB dari port debug board nRF52840 yang berkedip, lalu pasang kembali ke port nRF USB Micro-USB di sebelah tombol Reset. Setel tombol sumber nRF power source ke USB.

46e7b670d2464842.png

Mulai 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 memastikan 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 menghasilkan output yang mirip 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 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 perangkat Thread tersimulasi lainnya.

Di jendela terminal kedua, mulai ot-ctl:

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

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

> state
disabled
Done

5. Siapkan FTD

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

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

Buat dan flash

Build contoh FTD OpenThread untuk platform nRF52840, dengan peran Commissioner and Joiner:

$ 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), dan konversikan ke format hex:

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

Colokkan kabel USB ke port USB Mikro di samping pin daya eksternal pada board nRF52840, lalu colokkan ke mesin Linux. Jika RCP masih terpasang 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, perhatikan nomor seri board nRF52840 yang digunakan untuk FTD:

c00d519ebec7e5f0.jpeg

Buka lokasi Alat Command Line nRFx, dan 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 "Komisioner."

Hubungkan ke USB native

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

Lepaskan ujung Micro-USB kabel USB dari port debug board nRF52840 yang berkedip, lalu pasang kembali ke port nRF USB Micro-USB di sebelah tombol Reset. Setel tombol sumber nRF power source ke USB.

46e7b670d2464842.png

Memverifikasi build

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

$ screen /dev/ttyACM1 115200

Di jendela baru, tekan Return pada keyboard beberapa kali untuk memunculkan 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 melepaskan diri dari layar Commissioner CLI FTD dan kembali ke terminal Linux sehingga board berikutnya dapat di-flash. Untuk memasukkan ulang 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 melakukan flash board nRF52840 ketiga, menggunakan build ot-cli-ftd.hex yang ada. Setelah selesai, pastikan Anda menyambungkan kembali board ke PC menggunakan port USB nRF dan menetapkan tombol sumber daya nRF ke VDD.

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

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

Beri label papan "Penggabung."

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

$ screen -r

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

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

$ screen /dev/ttyACM2 115200

Di jendela baru ini, tekan Return pada keyboard beberapa kali untuk memunculkan 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 Layar yang sama dengan Commissioner FTD, Anda dapat beralih antar-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-Rangkaian pesan, jadi pastikan semuanya aktif dan dapat diakses dengan mudah. Sejauh ini, kita telah menggunakan Layar untuk mengakses dua FTD, dan alat ini juga memungkinkan layar terpisah di jendela terminal yang sama. Gunakan metode ini untuk melihat cara satu node bereaksi terhadap perintah yang dikeluarkan di node lain.

Idealnya, Anda harus memiliki empat jendela yang tersedia:

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

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

Menggunakan Layar

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

Semua perintah dalam Layar dimulai dengan Ctrl+a.

Perintah Layar Dasar:

Melampirkan 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)

Menutup jendela saat ini dalam sesi Layar

Ctrl+a → k

Bagi Layar

Dengan Layar, Anda dapat membagi terminal menjadi beberapa jendela:

f1cbf1258cf0a5a.png

Perintah di screen diakses dengan menggunakan Ctrl+a. Setiap perintah harus dimulai dengan kombinasi kunci 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 masukkan sesi Layar yang ada:

$ 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, tekan Ctrl+a → n lagi untuk melihat perangkat FTD lainnya

Keduanya sekarang terlihat. Beralih di antara keduanya menggunakan Ctrl+a → Tab. Sebaiknya Anda memberi 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 dalam jendela Layar baru (Ctrl+a → c).

Penyiapan ini tidak diwajibkan dan dibiarkan sebagai latihan untuk pengguna.

Pisahkan dan buka jendela dengan perintah berikut:

Buat jendela baru

Ctrl+a → c

Memisahkan jendela secara vertikal

Ctrl+a →

Pisahkan jendela secara horizontal

Ctrl+a → S

Beralih ke jendela berikutnya yang ditampilkan

Ctrl+a → Tab

Beralih jendela yang ditampilkan ke depan atau belakang

Ctrl+a → n atau p

Ganti 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 GNU.

7. Membuat jaringan Thread

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

Lakukan commit pada set data ini sebagai set data aktif:

> dataset commit active
Done

Tampilkan antarmuka IPv6:

> ifconfig up
Done

Memulai operasi protokol Thread:

> thread start
Done

Setelah beberapa saat, periksa status perangkat. Seharusnya pemimpin. 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" kini dapat dilihat saat dipindai dari perangkat Thread lainnya.

Dari ot-ctl di Penggabung RCP:

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

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

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

Perhatikan bahwa pada kedua pemindaian, jaringan tidak dapat digabungkan (kolom J pada RCP Joiner dan FTD Joiner). Hal ini hanya berarti bahwa Komisi Thread tidak aktif di jaringan. Tindakan ini tetap dapat digabungkan, dengan memasukkan kunci jaringan di perangkat joiner secara manual.

8 Menambahkan Penyambung RCP

Mari kita tambahkan 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 sudah ditetapkan dengan benar.

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

> dataset
Network Key: 1234c0de7ab51234c0de7ab51234c0de

Memunculkan Thread sehingga Joiner RCP bergabung dengan 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 ke FTD Commissioner, periksa router dan tabel turunan untuk mengonfirmasi bahwa kedua perangkat merupakan bagian dari jaringan yang sama. Gunakan RLOC16 untuk mengidentifikasi Penggabung 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-local Penggabung RCP (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 oleh diagram topologi ini:

otcodelab_top01C_2node.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 pada setiap node mewakili ID Router atau ID Turunan yang ditampilkan dalam output CLI, bergantung pada peran dan status setiap node saat ini pada saat itu.

9. Komisi Penggabung FTD

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

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

Sebaiknya spesifik saat melakukan pemesanan di perangkat berikutnya, dan hanya izinkan Penggabung FTD untuk bergabung. Masih di Joiner FTD, dapatkan eui64 agar Komisaris FTD dapat mengidentifikasinya:

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

> eui64
2f57d222545271f1
Done

Di Komisioner FTD, mulai komisioner dan tentukan eui64 perangkat yang dapat bergabung, beserta Kredensial Penggabung, misalnya J01NME. Joiner Credential adalah string khusus perangkat dari semua 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, dan 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, Threading Commissioning sekarang aktif di jaringan. Mulai peran join dengan Kredensial Joiner yang baru saja Anda siapkan di Komisaris FTD:

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

Buka 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 FTD Commissioner dan periksa tabel router serta turunan 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, Joiner FTD telah terpasang ke jaringan sebagai Perangkat Akhir (turunan). Berikut adalah topologi terbaru kami:

otcodelab_top01C_ed01.png

10. Cara kerja rangkaian pesan

Perangkat Thread di Codelab ini adalah jenis Perangkat Thread Penuh (FTD) tertentu yang disebut Perangkat Akhir yang Memenuhi Syarat Router (REED). Ini berarti mereka dapat berfungsi sebagai Router atau Perangkat Akhir, dan dapat mempromosikan diri sendiri dari Perangkat Akhir ke Router.

Thread dapat mendukung hingga 32 Router, tetapi mencoba untuk 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 waktu dua menit perangkat akan otomatis mempromosikan dirinya sendiri ke Router.

Jika Anda memiliki dua turunan di jaringan Thread setelah menambahkan Penggabung FTD, tunggu setidaknya 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

Joiner FTD (MAC yang diperluas = e6cdd2d93249a243) telah mempromosikan dirinya sendiri ke Router. Perhatikan bahwa RLOC16 berbeda (b800 bukan 0c02). Hal ini karena RLOC16 didasarkan pada ID Router dan ID Turunan perangkat. Saat bertransisi dari Perangkat Akhir ke Router, nilai Router ID dan Child-ID-nya berubah, begitu pula RLOC16.

otcodelab_top01C.png

Konfirmasikan status baru dan RLOC16 pada Penggabung FTD:

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

> state
router
Done
> rloc16
b800
Done

Downgrade FTD Joiner

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, Joiner FTD sekarang akan muncul di tabel turunan (ID = 3). Mungkin keduanya berada dalam keduanya saat bertransisi:

## 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, router akan beralih kembali ke Router dengan RLOC b800.

otcodelab_top01C.png

Hapus Pemimpin

Pemimpin terpilih sendiri di antara semua Router Thread. Artinya, jika Pemimpin saat ini dihapus dari jaringan Thread, salah satu Router lainnya akan menjadi Pemimpin baru.

Di Komisioner FTD, nonaktifkan Thread untuk menghapusnya dari jaringan Thread:

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

> thread stop
Done
> ifconfig down
Done

Dalam dua menit, FTD Joiner akan menjadi Thread leader 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 Joiner RCP, seperti yang ditunjukkan oleh ID-nya dan MAC yang Diperpanjang. Untuk menjaga agar jaringan Thread bersama, jaringan ini telah mengalihkan Router induk, dari FTD Commissioner ke FTD Joiner. Ini menghasilkan RLOC16 baru untuk Joiner RCP (karena ID Router-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 dilampirkan ke FTD Joiner sebagai turunan. Periksa status dan RLOC16 untuk mengonfirmasi bahwa:

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

> state
child
> rloc16
b801

Pasang kembali Komisaris FTD

Jaringan Thread dengan dua node tidaklah menyenangkan. Mari kembalikan Komisaris FTD.

Di FTD Commissioner, mulai ulang Thread:

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

> ifconfig up
Done
> thread start
Done

Dalam waktu dua menit, perangkat akan otomatis terpasang kembali ke jaringan "codelab" sebagai Perangkat Akhir, kemudian mempromosikan dirinya sendiri 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 hal yang rumit. Gunakan tips ini untuk "mereset" status jaringan atau ruang kerja Anda jika mengalami masalah.

Layar

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

Node thread

Jika topologi jaringan Thread tidak seperti yang dijelaskan dalam Codelab ini, atau node terputus karena beberapa alasan (mungkin karena mesin Linux yang mendukungnya beralih ke mode tidur), sebaiknya hapus 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 menyampaikan informasi ke grup 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 Border Router

ff03::1

Mesh-Lokal

Semua FTD dan MED

ff03::2

Mesh-Lokal

Semua FTD dan Border Router

Karena kita tidak menggunakan Border Router 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 Komisioner 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 (FTD Joiner dan RCP Joiner), tetapi FTD Commissioner hanya menerima satu respons, dari FTD Joiner's Link-Local Address (LLA). Ini berarti FTD Joiner adalah satu-satunya perangkat yang bisa dijangkau oleh FTD Commissioner dengan satu lompatan.

otcodelab_top02C_02_LL.png

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

otcodelab_top02C_02_LL02.png

Ini berarti FTD Joiner 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 lihat respons terhadap ping ke alamat multicast ff03::1.

Ping ff03::1 dari Komisioner 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 Komisaris FTD menerima dua respons, satu dari Pencari Rute FTD Joiner (RLOC, berakhir di b800) dan satu lagi dari Mesh-Local EID RCP Joiner (ML-EID, yang diakhiri dengan d55f). Itu karena cakupan mesh-lokal terdiri dari seluruh jaringan Thread. Di mana pun berada di jaringan, perangkat akan berlangganan 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

Perhatikan waktu respons untuk RCP Joiner di kedua output ping. RCP Joiner membutuhkan waktu lebih lama untuk mencapai FTD Commissioner (68 md) daripada mencapai FTD Joiner (23 md). Itu karena harus membuat dua lompatan untuk mencapai Komisaris FTD, dibandingkan dengan satu lompatan untuk Penggabung FTD.

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

Periksa status Penggabung RCP untuk mengonfirmasi:

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

> state
child

13. Mengirim pesan dengan UDP

Salah satu layanan aplikasi yang disediakan OpenThread adalah User Datagram Protocol (UDP), protokol Transport Layer. Aplikasi yang dibuat di OpenThread dapat menggunakan UDP API untuk meneruskan pesan antar-node dalam jaringan Thread, atau ke perangkat lain di jaringan eksternal (seperti internet, jika Thread network memiliki Border Router).

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

Dapatkan alamat EID Mesh-Lokal untuk Penggabung FTD. 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 ikatkan 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, dengan 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 dua node. Kirim pesan dari Komisaris FTD:

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

> udp send hellothere
Done

Di Penggabung FTD, 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

Dari Codelab ini, coba latihan berikut:

  • Melakukan flash ulang pada papan Joint FTD sebagai MTD menggunakan biner ot-cli-mtd, dan mengamati bahwa port tidak pernah mengupgrade 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, beserta ping ke alamat multicast
  • Menggunakan pyspinel untuk mengontrol NCP
  • Konversikan NCP menjadi Border Router menggunakan OpenThread Border Router dan hubungkan jaringan Thread Anda ke internet

Bacaan lebih lanjut

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

Referensi: