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

Menyimulasikan jaringan Thread dengan OpenThread

1. Pengantar

26b7f4f6b3ea0700.png

OpenThread yang dirilis oleh Google adalah implementasi open source protokol jaringan Thread. Google Nest telah merilis OpenThread untuk menjadikan teknologi yang digunakan di produk Nest tersedia secara luas bagi developer guna mempercepat pengembangan produk untuk rumah yang terhubung.

Spesifikasi Thread menetapkan 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 Assignment, dan Mesh Routing.

Codelab ini memandu Anda melakukan simulasi jaringan Thread pada perangkat yang disimulasikan.

Yang akan Anda pelajari

  • Cara menyiapkan toolchain build OpenThread
  • Cara menyimulasikan jaringan Thread
  • Cara mengautentikasi Node thread
  • Cara mengelola jaringan Thread dengan OpenThread Daemon

Yang Anda butuhkan

  • git
  • Pengetahuan dasar tentang Linux, pemilihan rute jaringan

2. Menyiapkan sistem build

Git

Git diperlukan untuk menyelesaikan Codelab ini. Download dan instal aplikasi sebelum melanjutkan.

Setelah diinstal, ikuti petunjuk bagi OS khusus Anda untuk mendownload dan membuat OpenThread.

XCode untuk Mac OS X

XCode diperlukan untuk menginstal dan membuat OpenThread pada Mac OS X.

Setelah XCode terinstal, instal XCode Command Line Tools:

$ xcode-select --install

Mem-build pada Linux / Mac OS X

Petunjuk penginstalan ini telah diuji di Ubuntu Server 14.04 LTS dan Mac OS X Sierra 10.12.6.

Instal OpenThread. Perintah bootstrap memastikan toolchain telah diinstal dan lingkungan dikonfigurasi dengan benar:

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

Menggunakan Windows

Jika Anda lebih memilih Windows, sebaiknya coba versi Docker Codelab ini.

3. Mem-build aplikasi OpenThread

Setelah penginstalan selesai, buat contoh aplikasi OpenThread. Untuk Codelab ini, kami menggunakan contoh simulasi.

$ cd ~/src/openthread
$ make -f examples/Makefile-simulation

Sekarang buat OpenThread Daemon:

$ cd ~/src/openthread
$ make -f src/posix/Makefile-posix DAEMON=1

4. Menyimulasikan jaringan Thread

Contoh aplikasi yang akan Anda gunakan untuk Codelab ini mendemonstrasikan aplikasi OpenThread minimal yang mengekspos konfigurasi pengelolaan dan antarmuka OpenThread melalui antarmuka command line (CLI) dasar.

Latihan ini akan memandu Anda melakukan langkah-langkah minimal yang diperlukan untuk melakukan ping ke satu perangkat Thread yang disimulasikan dari perangkat Thread yang disimulasikan lainnya.

Gambar di bawah ini menjelaskan topologi jaringan Thread dasar. Untuk latihan ini, kita akan menyimulasikan dua node dalam lingkaran hijau: Thread Leader dan Thread Router dengan satu koneksi di antara keduanya.

6e3aa07675f902dc.png

Ping node

1. Memulai Node 1

Buka direktori openthread dan jalankan proses CLI untuk perangkat Thread yang disimulasikan menggunakan biner ot-cli-ftd.

$ cd ~/src/openthread
$ ./output/simulation/bin/ot-cli-ftd 1

Catatan: Jika Anda tidak melihat perintah > setelah menjalankan perintah ini, tekan enter.

Biner ini mengimplementasikan perangkat OpenThread yang disimulasikan di atas POSIX. Driver radio IEEE 802.15.4 diimplementasikan di atas UDP (frame IEEE 802.15.4 diteruskan dalam payload UDP).

Argumen 1 adalah deskripsi file yang merepresentasikan bit yang paling tidak signifikan dari "ditetapkan pabrik" IEEE EUI-64 untuk perangkat yang disimulasikan. Nilai ini juga digunakan saat mengikat ke port UDP untuk emulasi radio IEEE 802.15.4 (port = 9000 + file deskriptor). Setiap instance perangkat Thread yang disimulasikan dalam Codelab ini akan menggunakan deskriptor file yang berbeda.

Catatan: Hanya gunakan deskriptor file dari 1 atau yang lebih baru, seperti yang disebutkan dalam Codelab ini saat menghasilkan proses untuk perangkat yang disimulasikan. Deskriptor file 0 dicadangkan untuk penggunaan lain.

Membuat Set Data Operasional baru dan meng-commitnya sebagai yang aktif. Set Data Operasional adalah konfigurasi untuk jaringan Thread yang Anda buat.

> dataset init new
Done
> dataset
Active Timestamp: 1
Channel: 20
Channel Mask: 07fff800
Ext PAN ID: d6263b6d857647da
Mesh Local Prefix: fd61:2344:9a52:ede0/64
Network Key: e4344ca17d1dca2a33f064992f31f786
Network Name: OpenThread-c169
PAN ID: 0xc169
PSKc: ebb4f2f8a68026fc55bcf3d7be3e6fe4
Security Policy: 0, onrcb
Done

Lakukan commit pada set data ini sebagai set data aktif:

> dataset commit active
Done

Munculkan antarmuka IPv6:

> ifconfig up
Done

Mulai operasi protokol Thread:

> thread start
Done

Tunggu beberapa detik dan verifikasi bahwa perangkat telah menjadi Pengelola Thread. Leader adalah perangkat yang bertanggung jawab untuk mengelola penetapan ID router.

> state
leader
Done

Lihat alamat IPv6 yang ditetapkan untuk antarmuka Thread 1's (output Anda akan berbeda):

> ipaddr
fd61:2344:9a52:ede0:0:ff:fe00:fc00
fd61:2344:9a52:ede0:0:ff:fe00:5000
fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6
fe80:0:0:0:94da:92ea:1353:4f3b
Done

Perhatikan jenis alamat IPv6 spesifik:

  • Diawali dengan fd = mesh-local
  • Diawali dengan fe80 = link-local

Jenis alamat mesh-lokal diklasifikasikan lebih lanjut:

  • Berisi ff:fe00 = Pencari Router (RLOC)
  • Tidak berisi ff:fe00 = ID Endpoint (EID)

Identifikasi EID di output konsol Anda dan catat untuk digunakan nanti. Dalam contoh output di atas, EID-nya adalah:

fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6

2. Memulai Node 2

Buka terminal baru dan pilih direktori openthread lalu buat proses CLI. Ini adalah perangkat Thread kedua yang disimulasikan:

$ cd ~/src/openthread
$ ./output/simulation/bin/ot-cli-ftd 2

Catatan: Jika Anda tidak melihat perintah > setelah menjalankan perintah ini, tekan enter.

Konfigurasikan Kunci Jaringan Thread dan ID PAN, menggunakan nilai yang sama dengan Set Data Operasional Node 1:

> dataset networkkey e4344ca17d1dca2a33f064992f31f786
Done
> dataset panid 0xc169
Done

Lakukan commit pada set data ini sebagai set data aktif:

> dataset commit active
Done

Munculkan antarmuka IPv6:

> ifconfig up
Done

Mulai operasi protokol Thread:

> thread start
Done

Perangkat akan melakukan inisialisasi sendiri sebagai Turunan. Turunan Thread setara dengan Perangkat Akhir, yang merupakan perangkat Thread yang mentransmisikan dan menerima traffic unicast hanya dengan perangkat Parent.

> state
child
Done

Dalam waktu 2 menit, Anda akan melihat tombol status dari child ke router. Router Thread mampu mengarahkan traffic di antara perangkat Thread. Aktivitas ini juga disebut sebagai Induk.

> state
router
Done

Memverifikasi jaringan

Cara mudah untuk memverifikasi jaringan mesh adalah dengan melihat tabel router.

1. Periksa konektivitas

Di Node 2, dapatkan RLOC16. RLOC16 adalah 16 bit terakhir dari alamat RLOC IPv6 perangkat.

> rloc16
5800
Done

Pada Node 1, periksa tabel router untuk RLOC16 Node 2. Pastikan Node 2 telah beralih ke status router terlebih dahulu.

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQI In | LQI Out | Age | Extended MAC  |
+----+--------+----------+----------+-------+---------+-----+------------------+
| 20 | 0x5000 |       63 |         0 |     0 |      0 |   0 | 96da92ea13534f3b |
| 22 | 0x5800 |       63 |         0 |     3 |      3 |  23 | 5a4eb647eb6bc66c |

RLOC node 1 dari 0xa800 ditemukan dalam tabel, yang mengonfirmasi bahwa node tersebut terhubung ke mesh.

2. Node Ping 1 dari Node 2

Memverifikasi konektivitas antara dua perangkat Thread yang disimulasikan. Di Node 2, ping EID yang ditetapkan ke Node 1:

> ping fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6
> 16 bytes from fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6: icmp_seq=1
hlim=64 time=12ms

Tekan enter untuk kembali ke perintah CLI >.

Menguji jaringan

Setelah Anda berhasil melakukan ping antara dua perangkat Thread yang disimulasikan, uji jaringan mesh dengan mengambil satu node secara offline.

Kembali ke Node 1 dan hentikan Thread:

> thread stop
Done

Beralih ke Node 2 dan periksa statusnya. Dalam dua menit, Node 2 mendeteksi bahwa pemimpin (Node 1) sedang offline, dan Anda akan melihat transisi Node 2 menjadi leader dari jaringan:

> state
router
Done
...
> state
leader
Done

Setelah dikonfirmasi, hentikan Thread dan reset Node 2 ke setelan pabrik sebelum keluar. Reset ke setelan pabrik dilakukan untuk memastikan bahwa kredensial jaringan Thread yang kita gunakan dalam latihan ini tidak dialihkan ke latihan berikutnya.

> thread stop
Done
> factoryreset
>
> exit

Selain itu, reset ke setelan pabrik, lalu keluar dari Node 1:

> factoryreset
>
> exit

Baca Referensi CLI OpenThread untuk mempelajari semua perintah CLI yang tersedia.

5. Mengautentikasi node dengan Commissioning

Dalam latihan sebelumnya, Anda menyiapkan jaringan Thread dengan dua perangkat yang disimulasikan dan konektivitas terverifikasi. Namun, tindakan ini hanya memungkinkan traffic IPv6-lokal yang tidak diautentikasi untuk melewati antar-perangkat. Untuk mengarahkan traffic IPv6 global di antaranya (dan internet melalui router batas Thread), node harus diautentikasi.

Untuk mengautentikasi, satu perangkat harus bertindak sebagai Komisaris. Komisaris adalah server autentikasi yang dipilih saat ini untuk perangkat Thread baru, dan pemberi otorisasi untuk memberikan kredensial jaringan yang diperlukan agar perangkat dapat bergabung ke jaringan.

Dalam latihan ini, kita akan menggunakan topologi dua node yang sama seperti sebelumnya. Untuk autentikasi, Thread Manager akan bertindak sebagai Komisaris, Thread Router sebagai Joiner.

d6a67e8a0d0b5dcb.png

1. Buat jaringan

Jika melanjutkan dari latihan sebelumnya, dua jendela terminal seharusnya sudah terbuka. Jika tidak, pastikan dua sudah terbuka dan siap digunakan. Yang pertama akan berfungsi sebagai Node 1, yang lain sebagai Node 2.

Di Node 1, munculkan proses CLI:

$ cd ~/src/openthread
$ ./output/simulation/bin/ot-cli-ftd 1

Catatan: Jika Anda tidak melihat perintah > setelah menjalankan perintah ini, tekan enter.

Membuat Set Data Operasional baru, meng-commit-nya sebagai yang aktif, dan memulai Thread:

> dataset init new
Done
> dataset
Active Timestamp: 1
Channel: 12
Channel Mask: 07fff800
Ext PAN ID: e68d05794bf13052
Mesh Local Prefix: fd7d:ddf7:877b:8756/64
Network Key: a77fe1d03b0e8028a4e13213de38080e
Network Name: OpenThread-8f37
PAN ID: 0x8f37
PSKc: f9debbc1532487984b17f92cd55b21fc
Security Policy: 0, onrcb
Done

Lakukan commit pada set data ini sebagai set data aktif:

> dataset commit active
Done

Munculkan antarmuka IPv6:

> ifconfig up
Done

Mulai operasi protokol Thread:

> thread start
Done

Tunggu beberapa detik dan verifikasi bahwa perangkat telah menjadi Pengelola Rangkaian Pesan:

> state
leader
Done

2. Memulai peran Komisaris

Saat masih berada di Node 1, mulai peran Komisaris:

> commissioner start
Done

Mengizinkan segala Joiner (dengan menggunakan karakter pengganti *) dengan Kredensial Joiner J01NME untuk ditugaskan ke jaringan. Joiner adalah perangkat yang ditambahkan oleh administrator manusia ke Jaringan Thread yang ditugaskan.

> commissioner joiner add * J01NME
Done

3. Memulai peran Joiner

Di jendela terminal kedua, buat proses CLI baru. Ini adalah Node 2.

$ cd ~/src/openthread
$ ./output/simulation/bin/ot-cli-ftd 2

Pada Node 2, aktifkan peran Joiner menggunakan Kredensial Joiner J01NME.

> ifconfig up
Done
> joiner start J01NME
Done

... tunggu beberapa detik untuk konfirmasi ...

Join success

Sebagai Joiner, perangkat (Node 2) telah berhasil mengautentikasi dirinya sendiri dengan Komisaris (Node 1) dan menerima kredensial Jaringan Thread.

Setelah Node 2 diautentikasi, mulai Thread:

> thread start
Done

4. Memvalidasi autentikasi jaringan

Periksa state pada Node 2, untuk memvalidasi bahwa node tersebut sekarang telah bergabung ke jaringan. Dalam dua menit, transisi Node 2 dari child ke router:

> state
child
Done
...
> state
router
Done

5. Reset konfigurasi

Untuk mempersiapkan latihan berikutnya, reset konfigurasi. Di setiap Node, hentikan Thread, lakukan reset ke setelan pabrik, dan keluar dari perangkat Thread yang disimulasikan:

> thread stop
Done
> factoryreset
>
> exit

Anda mungkin perlu menekan enter beberapa kali untuk memunculkan kembali perintah > setelah perintah factoryreset.

6. Mengelola jaringan dengan OpenThread Daemon

Untuk latihan ini, kita akan menyimulasikan satu instance CLI (satu perangkat SoC Thread tersemat) dan satu instance Radio Co-Processor (RCP).

ot-daemon adalah mode aplikasi OpenThread Posix yang menggunakan soket UNIX sebagai input dan output, sehingga inti OpenThread dapat berjalan sebagai layanan. Klien dapat berkomunikasi dengan layanan ini dengan menyambungkan ke soket menggunakan CLI OpenThread sebagai protokol.

ot-ctl adalah CLI yang disediakan oleh ot-daemon untuk mengelola dan mengonfigurasi RCP. Menggunakan ini, kita akan menghubungkan RCP ke jaringan yang dibuat oleh perangkat Thread.

Gunakan ot-daemon

Latihan ini akan menggunakan tiga jendela terminal, yang sesuai dengan yang berikut:

  1. Instance CLI perangkat Thread yang disimulasikan (Node 1)
  2. ot-daemon proses
  3. Instance CLI ot-ctl

Jika melanjutkan dari latihan sebelumnya, Anda akan memiliki dua jendela terminal yang terbuka. Buka yang ketiga untuk memastikan Anda memiliki tiga jendela terminal yang tersedia untuk latihan ini.

1. Memulai Node 1

Di jendela terminal pertama, berikan proses CLI untuk perangkat Thread yang disimulasikan:

$ cd ~/src/openthread
$ ./output/simulation/bin/ot-cli-ftd 1

Catatan: Jika Anda tidak melihat perintah > setelah menjalankan perintah ini, tekan enter.

Membuat Set Data Operasional baru, meng-commit-nya sebagai yang aktif, dan memulai Thread:

> dataset init new
Done
> dataset
Active Timestamp: 1
Channel: 13
Channel Mask: 07fff800
Ext PAN ID: 97d584bcd493b824
Mesh Local Prefix: fd55:cf34:dea5:7994/64
Network Key: ba6e886c7af50598df1115fa07658a83
Network Name: OpenThread-34e4
PAN ID: 0x34e4
PSKc: 38d6fd32c866927a4dfcc06d79ae1192
Security Policy: 0, onrcb
Done

Lakukan commit pada set data ini sebagai set data aktif:

> dataset commit active
Done

Munculkan antarmuka IPv6:

> ifconfig up
Done

Mulai operasi protokol Thread:

> thread start
Done

Lihat alamat IPv6 yang ditetapkan untuk antarmuka Thread 1&39;s Thread:

> ipaddr
fd55:cf34:dea5:7994:0:ff:fe00:fc00
fd55:cf34:dea5:7994:0:ff:fe00:d000
fd55:cf34:dea5:7994:460:872c:e807:c4ab
fe80:0:0:0:9cd8:aab6:482f:4cdc
Done
>

Seperti yang dijelaskan pada langkah Simulasikan jaringan Thread, satu alamat adalah link-local (fe80) dan tiga adalah mesh-local (fd). EID adalah alamat mesh-local yang tidak berisi ff:fe00 di alamat tersebut. Dalam contoh output, EID-nya adalah fd55:cf34:dea5:7994:460:872c:e807:c4ab.

Identifikasi EID tertentu dari output ipaddr, yang akan digunakan untuk berkomunikasi dengan node.

2. Mulai ot-daemon

Di jendela terminal kedua, buka direktori openthread, dan mulai ot-daemon untuk node RCP, yang akan kita sebut Node 2. Gunakan tanda panjang -v agar Anda dapat melihat output log dan mengonfirmasi bahwa output log sedang berjalan:

$ cd ~/src/openthread
$ ./output/posix/bin/ot-daemon -v \
    'spinel+hdlc+forkpty://output/simulation/bin/ot-rcp?forkpty-arg=2'

Jika berhasil, ot-daemon dalam mode panjang menghasilkan output yang mirip dengan yang berikut:

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 terminal ini terbuka dan berjalan di latar belakang. Anda tidak akan memasukkan perintah lebih lanjut di dalamnya.

3. Menggunakan ot-ctl untuk bergabung ke jaringan

Kami belum memesan Node 2 (ot-daemon RCP) ke jaringan Thread mana pun. Di sinilah ot-ctl berperan. ot-ctl menggunakan CLI yang sama dengan aplikasi CLI OpenThread. Oleh karena itu, Anda dapat mengontrol ot-daemon node dengan cara yang sama seperti perangkat Thread yang disimulasikan lainnya.

Di jendela terminal ketiga, mulai ot-ctl:

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

Anda akan menggunakan ot-ctl di jendela terminal ketiga ini untuk mengelola Node 2 (node RCP) yang Anda mulai di jendela terminal kedua dengan ot-daemon. Periksa state Node 2:

> state
disabled
Done

Dapatkan eui64 Node 2, untuk membatasi bergabung ke Joiner tertentu:

> eui64
18b4300000000001
Done

Pada Node 1 (jendela terminal pertama), mulai Komisaris dan batasi penggabungan hanya untuk eui64 tersebut:

> commissioner start
Done
> commissioner joiner add 18b4300000000001 J01NME
Done

Di Node 2 (jendela terminal ketiga), buka antarmuka jaringan dan gabung ke jaringan:

> ifconfig up
Done
> joiner start J01NME
Done

... tunggu beberapa detik untuk konfirmasi ...

Join success

Sebagai Joiner, RCP (Node 2) telah berhasil mengautentikasi dirinya sendiri dengan Komisaris (Node 1) dan menerima kredensial Jaringan Thread.

Sekarang gabung ke Node 2 ke jaringan Thread:

> thread start
Done

4. Memvalidasi autentikasi jaringan

Periksa state pada Node 2, untuk memvalidasi bahwa node tersebut sekarang telah bergabung ke jaringan. Dalam dua menit, transisi Node 2 dari child ke router:

> state
child
Done
...
> state
router
Done

5. Memvalidasi konektivitas

Keluar dari ot-ctl menggunakan perintah Ctrl+D atau exit, dan pada command line mesin host Anda, ping Node 1, menggunakan EID-nya dengan perintah ping6. Jika instance RCP ot-daemon berhasil digabungkan dan berkomunikasi dengan jaringan Thread, ping akan berhasil:

$ ping6 -c 4 fd55:cf34:dea5:7994:460:872c:e807:c4ab
PING fd55:cf34:dea5:7994:460:872c:e807:c4ab (fd55:cf34:dea5:7994:460:872c:e807:c4ab): 56 data bytes
64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=0 ttl=64 time=4.568 ms
64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=1 ttl=64 time=6.396 ms
64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=2 ttl=64 time=7.594 ms
64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=3 ttl=64 time=5.461 ms
--- fd55:cf34:dea5:7994:460:872c:e807:c4ab ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max/stddev = 4.568/6.005/7.594/1.122 ms

7. Selamat!

Anda telah berhasil menyimulasikan jaringan Thread pertama menggunakan OpenThread. Keren!

Dalam codelab ini, Anda telah mempelajari cara:

  • Menyiapkan toolchain build OpenThread
  • Menyimulasikan jaringan Thread
  • Mengautentikasi node Thread
  • Mengelola jaringan Thread dengan OpenThread Daemon

Jika Anda ingin mempelajari lebih lanjut, pelajari referensi berikut: