1. Pengantar
OpenThread yang dirilis oleh Google merupakan implementasi open source dari protokol jaringan Thread. Google Nest telah merilis OpenThread untuk membuat teknologi yang digunakan dalam produk Nest tersedia secara luas bagi developer guna mempercepat pengembangan produk untuk rumah yang terhubung.
Spesifikasi Thread mendefinisikan protokol komunikasi perangkat-ke-perangkat berbasis IPv6 yang andal, aman, dan rendah daya untuk aplikasi rumah. OpenThread menerapkan semua lapisan jaringan Thread termasuk IPv6, 6LoWPAN, IEEE 802.15.4 dengan keamanan MAC, Pembentukan Link Mesh, dan Perutean Mesh.
Codelab ini memandu Anda dalam melakukan simulasi jaringan Thread di 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 sebelum melanjutkan.
Setelah terinstal, ikuti petunjuk untuk OS tertentu Anda agar dapat mendownload dan membuat OpenThread.
XCode untuk Mac OS X
XCode diperlukan untuk menginstal dan membuat OpenThread di Mac OS X.
Setelah XCode terinstal, instal Alat Command Line XCode:
$ xcode-select --install
Membangun aplikasi di Linux / Mac OS X
Instruksi instalasi ini telah diuji pada Ubuntu Server 14.04 LTS dan Mac OS X Sierra 10.12.6.
Instal OpenThread. Perintah 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
Menggunakan Windows
Jika Anda lebih suka Windows, sebaiknya coba versi Docker Codelab ini.
3. Membangun aplikasi OpenThread
Setelah penginstalan selesai, bangun contoh aplikasi OpenThread. Untuk Codelab ini, kami menggunakan contoh simulasi.
$ cd ~/src/openthread $ ./script/cmake-build simulation
Sekarang buat OpenThread Daemon:
$ ./script/cmake-build posix -DOT_DAEMON=ON
4. Menyimulasikan jaringan Thread
Aplikasi contoh yang akan Anda gunakan untuk Codelab ini menunjukkan aplikasi OpenThread minimal yang mengekspos antarmuka konfigurasi dan pengelolaan OpenThread melalui antarmuka command line (CLI) dasar.
Latihan ini akan membawa Anda melalui langkah-langkah minimal yang diperlukan untuk melakukan ping pada satu perangkat Thread yang disimulasikan dari perangkat Thread lain yang disimulasikan.
Gambar di bawah ini menjelaskan topologi jaringan Thread dasar. Untuk latihan ini, kita akan menyimulasikan dua node dalam lingkaran hijau: Pemimpin Thread dan Router Thread dengan satu koneksi di antara keduanya.
Melakukan ping ke node
1. Mulai Node 1
Buka direktori openthread
dan munculkan proses CLI untuk perangkat Thread yang disimulasikan menggunakan biner ot-cli-ftd
.
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 1
Catatan: Jika Anda tidak melihat perintah >
setelah menjalankan perintah ini, tekan enter
.
Biner ini menerapkan perangkat OpenThread yang disimulasikan di atas POSIX. Driver radio IEEE 802.15.4 diimplementasikan di atas UDP (IEEE 802.15.4 frame yang diteruskan dalam payload UDP).
Argumen 1
adalah deskriptor file yang mewakili bit yang paling tidak signifikan dari "ditetapkan pabrik" IEEE EUI-64 untuk perangkat simulasi. Nilai ini juga digunakan saat mengikat ke port UDP untuk emulasi radio IEEE 802.15.4 (port = 9000 + deskriptor file). Setiap instance perangkat Thread yang disimulasikan dalam Codelab ini akan menggunakan deskriptor file yang berbeda.
Catatan: Hanya gunakan deskriptor file 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 melakukan commit 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
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
Tunggu beberapa detik dan verifikasi bahwa perangkat telah menjadi Pemimpin Thread. Leader adalah perangkat yang bertanggung jawab untuk mengelola penetapan ID router.
> state leader Done
Lihat alamat IPv6 yang ditetapkan ke antarmuka Thread Node 1 (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
= Router Locator (RLOC) - Tidak berisi
ff:fe00
= ID Endpoint (EID)
Identifikasi EID di output konsol Anda, 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 arahkan ke direktori openthread
, lalu munculkan proses CLI. Ini adalah simulasi perangkat Thread kedua Anda:
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 2
Catatan: Jika Anda tidak melihat perintah >
setelah menjalankan perintah ini, tekan enter
.
Konfigurasi Kunci Jaringan Thread dan ID PAN menggunakan nilai yang sama dengan Set Data Operasional Node 1:
> dataset networkkey e4344ca17d1dca2a33f064992f31f786 Done > dataset panid 0xc169 Done
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
Perangkat akan melakukan inisialisasi sendiri sebagai Turunan. Turunan Thread setara dengan Perangkat Akhir, yang merupakan perangkat Thread yang mengirim dan menerima traffic unicast hanya dengan perangkat Induk.
> state child Done
Dalam waktu 2 menit, Anda akan melihat status beralih dari child
menjadi router
. Thread Router mampu mengarahkan traffic di antara perangkat Thread. Tindakan ini juga disebut sebagai Induk.
> state router Done
Memverifikasi jaringan
Cara mudah untuk memverifikasi jaringan mesh adalah dengan melihat tabel router.
1. Memeriksa konektivitas
Di Node 2, dapatkan RLOC16. RLOC16 adalah 16 bit terakhir dari alamat IPv6 RLOC perangkat.
> rloc16 5800 Done
Di Node 1, periksa tabel router untuk RLOC16 Node 2. Pastikan Node 2 telah dialihkan 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 RLOC tersebut terhubung ke mesh.
2. Melakukan ping ke Node 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 di 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
Beralihlah ke Node 2 dan periksa statusnya. Dalam waktu dua menit, Node 2 mendeteksi bahwa pemimpin (Node 1) sedang offline, dan Anda akan melihat transisi Node 2 menjadi leader
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 kami gunakan dalam latihan ini tidak dibawa ke latihan berikutnya.
> thread stop Done > factoryreset > > exit
Selain itu, reset ke setelan pabrik dan keluar dari Node 1:
> factoryreset > > exit
Lihat Referensi CLI OpenThread untuk mempelajari semua perintah CLI yang tersedia.
5. Mengautentikasi node dengan Commissioning
Pada latihan sebelumnya, Anda akan menyiapkan jaringan Thread dengan dua perangkat simulasi dan konektivitas terverifikasi. Namun, tindakan ini hanya mengizinkan traffic link-local IPv6 yang tidak diautentikasi untuk diteruskan antar-perangkat. Untuk mengarahkan traffic IPv6 global di antara node (dan Internet melalui router pembatas Thread), node harus diautentikasi.
Untuk mengautentikasi, satu perangkat harus bertindak sebagai Commissioner. Commissioner 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 Leader akan bertindak sebagai Commissioner, yaitu Router Thread sebagai Joiner.
1. Membuat jaringan
Jika melanjutkan dari latihan sebelumnya, seharusnya Anda sudah membuka dua jendela terminal. Jika tidak, pastikan dua terbuka dan siap digunakan. Satu berfungsi sebagai Node 1, yang lainnya sebagai Node 2.
Di Node 1, munculkan proses CLI:
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 1
Catatan: Jika Anda tidak melihat perintah >
setelah menjalankan perintah ini, tekan enter
.
Buat Set Data Operasional baru, komitmenkan sebagai yang aktif, dan mulai 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
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
Tunggu beberapa detik, lalu verifikasi bahwa perangkat telah menjadi Pemimpin Thread:
> state leader Done
2. Memulai peran Komisaris
Saat masih berada di Node 1, mulailah peran Commissioner:
> commissioner start Done
Izinkan Joiner apa pun (dengan menggunakan karakter pengganti *
) dengan Kredensial Joiner J01NME
untuk melakukan komisi 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, munculkan proses CLI baru. Ini adalah Node 2.
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 2
Di 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 dengan Commissioner (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 dengan jaringan. Dalam waktu dua menit, Node 2 bertransisi 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 harus menekan enter
beberapa kali untuk mengembalikan prompt >
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 core OpenThread dapat berjalan sebagai layanan. Klien dapat berkomunikasi dengan layanan ini dengan terhubung ke soket menggunakan OpenThread CLI sebagai protokol.
ot-ctl
adalah CLI yang disediakan oleh ot-daemon
untuk mengelola dan mengonfigurasi RCP. Dengan menggunakan ini, kita akan menghubungkan RCP ke jaringan yang dibuat oleh perangkat Thread.
Gunakan ot-daemon
Latihan ini akan menggunakan tiga jendela terminal, sesuai dengan berikut ini:
- Instance CLI dari perangkat Thread yang disimulasikan (Node 1)
ot-daemon
proses- Instance CLI
ot-ctl
Jika melanjutkan dari latihan sebelumnya, seharusnya Anda sudah membuka dua jendela terminal. Buka sepertiga untuk memastikan Anda memiliki tiga jendela terminal yang tersedia untuk latihan ini.
1. Mulai Node 1
Di jendela terminal pertama, munculkan proses CLI untuk simulasi perangkat Thread Anda:
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 1
Catatan: Jika Anda tidak melihat perintah >
setelah menjalankan perintah ini, tekan enter
.
Buat Set Data Operasional baru, komitmenkan sebagai yang aktif, dan mulai 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
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
Lihat alamat IPv6 yang ditetapkan ke antarmuka Thread Node 1:
> 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 dalam langkah Simulasikan jaringan Thread, satu alamat adalah link-local (fe80
) dan tiga alamatnya adalah mesh-local (fd
). EID adalah alamat mesh-local yang tidak berisi ff:fe00
di alamatnya. Dalam contoh output ini, EID-nya adalah fd55:cf34:dea5:7994:460:872c:e807:c4ab
.
Identifikasi EID spesifik dari output ipaddr
Anda, yang akan digunakan untuk berkomunikasi dengan node.
2. Mulai ot-daemon
Di jendela terminal kedua, buka direktori openthread
, lalu jalankan ot-daemon
untuk node RCP, yang selanjutnya disebut Node 2. Gunakan flag panjang -v
agar Anda dapat melihat output log dan memastikannya sedang berjalan, serta pastikan untuk menggunakan sudo
:
$ cd ~/src/openthread $ sudo ./build/posix/src/posix/ot-daemon -v \ 'spinel+hdlc+forkpty://build/simulation/examples/apps/ncp/ot-rcp?forkpty-arg=2'
Jika berhasil, ot-daemon
dalam mode panjang akan menghasilkan output yang mirip dengan berikut ini:
ot-daemon[12463]: Running OPENTHREAD/thread-reference-20200818-1938-g0f10480ed; POSIX; Aug 30 2022 10:55:05 ot-daemon[12463]: Thread version: 4 ot-daemon[12463]: Thread interface: wpan0 ot-daemon[12463]: RCP version: OPENTHREAD/thread-reference-20200818-1938-g0f10480ed; SIMULATION; Aug 30 2022 10:54:10
Biarkan terminal ini tetap terbuka dan berjalan di latar belakang. Anda tidak akan memasukkan perintah lebih lanjut di dalamnya.
3. Gunakan ot-ctl untuk bergabung dengan jaringan
Kami belum meminta Node 2 (RCP ot-daemon
) ke jaringan Thread mana pun. Di sinilah ot-ctl
berperan. ot-ctl
menggunakan CLI yang sama dengan aplikasi OpenThread CLI. Oleh karena itu, Anda dapat mengontrol node ot-daemon
dengan cara yang sama seperti simulasi perangkat Thread lainnya.
Di jendela terminal ketiga, mulai ot-ctl
:
$ sudo ./build/posix/src/posix/ot-ctl >
Catatan: Jika Anda tidak melihat perintah >
setelah menjalankan perintah ini, tekan enter
.
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 penggabungan ke Joiner tertentu:
> eui64 18b4300000000001 Done
Di Node 1 (jendela terminal pertama), mulai Commissioner dan batasi penggabungan hanya ke eui64 tersebut:
> commissioner start Done > commissioner joiner add 18b4300000000001 J01NME Done
Di Node 2 (jendela terminal ketiga), munculkan antarmuka jaringan dan bergabung 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 dengan Commissioner (Node 1) dan menerima kredensial Thread Network.
Sekarang, gabungkan 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 dengan jaringan. Dalam waktu dua menit, Node 2 bertransisi dari child
ke router
:
> state child Done ... > state router Done
5. Validasi konektivitas
Keluar dari ot-ctl
dengan menggunakan perintah Ctrl+D atau exit
, dan lakukan ping ke Node 1 di command line mesin host menggunakan EID-nya dengan perintah ping6
. Jika instance RCP ot-daemon
berhasil dihubungkan 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 membuat simulasi 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, baca referensi berikut: