Docker에서 OpenThread를 사용하여 스레드 네트워크 시뮬레이션

1. 소개

26b7f4f6b3ea0700.png

OpenThread 구글 발표는의 오픈 소스 구현 스레드 네트워킹 프로토콜입니다. Google Nest는 개발자가 Nest 제품에 사용되는 기술을 널리 사용하여 커넥티드 홈 제품 개발을 가속화하기 위해 OpenThread를 출시했습니다.

나사 규격은 홈 애플리케이션을위한 신뢰성, 보안 IPv6 기반 저전력 무선 장치 간 통신 프로토콜을 정의합니다. OpenThread는 IPv6, 6LoWPAN, MAC 보안이 포함된 IEEE 802.15.4, 메시 링크 설정 및 메시 라우팅을 포함한 모든 스레드 네트워킹 계층을 구현합니다.

이 Codelab은 Docker를 사용하여 에뮬레이트된 장치에서 스레드 네트워크를 시뮬레이션하는 과정을 안내합니다.

배울 내용

  • OpenThread 빌드 도구 모음을 설정하는 방법
  • 스레드 네트워크를 시뮬레이션하는 방법
  • 스레드 노드를 인증하는 방법
  • OpenThread Daemon으로 스레드 네트워크를 관리하는 방법

필요한 것

  • 도커
  • Linux, 네트워크 라우팅에 대한 기본 지식

2. 도커 설정

이 Codelab은 Linux, Mac OS X 또는 Windows 시스템에서 Docker를 사용하도록 설계되었습니다. Linux가 권장되는 환경입니다.

도커 설치

원하는 OS에 Docker를 설치합니다.

도커 다운로드

Docker 이미지 가져오기

도커가 설치되면, 단자 창을 열고 손잡이 openthread/codelab_otsim 도커 이미지. 이 이미지는 OpenThread 및 OpenThread Daemon이 사전 빌드되어 이 Codelab에 사용할 준비가 된 것을 보여줍니다.

$ docker pull openthread/codelab_otsim:latest

완전히 다운로드하는 데 몇 분 정도 걸릴 수 있습니다.

단말기 창에서, 이미지로부터 도커 컨테이너를 시작하고 연결 bash

$ docker run --name codelab_otsim_ctnr -it --rm \
   --sysctl net.ipv6.conf.all.disable_ipv6=0 \
   --cap-add=net_admin openthread/codelab_otsim bash

이 Codelab에 필요한 플래그를 확인하세요.

  • --sysctl net.ipv6.conf.all.disable_ipv6=0 -이 컨테이너 내에서 IPv6을 사용 가능
  • --cap-add=net_admin - 당신은 IP 경로를 추가하는 등 네트워크 관련 작업을 수행 할 수 있습니다 NET_ADMIN 기능을 가능

컨테이너에 들어가면 다음과 유사한 프롬프트가 표시됩니다.

root@c0f3912a74ff:/#

상기 예에서, c0f3912a74ff 컨테이너 ID이다. Docker 컨테이너 인스턴스의 컨테이너 ID는 이 Codelab의 프롬프트에 표시된 것과 다릅니다.

도커 사용

이 Codelab에서는 사용자가 Docker 사용의 기본 사항을 알고 있다고 가정합니다. Codelab 전체에 대해 Docker 컨테이너에 남아 있어야 합니다.

3. 스레드 네트워크 시뮬레이션

이 Codelab에 사용할 예제 애플리케이션은 기본 명령줄 인터페이스(CLI)를 통해 OpenThread 구성 및 관리 인터페이스를 노출하는 최소 OpenThread 애플리케이션을 보여줍니다.

이 연습에서는 다른 에뮬레이트된 스레드 장치에서 하나의 에뮬레이트된 스레드 장치를 ping하는 데 필요한 최소한의 단계를 안내합니다.

아래 그림은 기본 스레드 네트워크 토폴로지를 설명합니다. 이 연습에서는 녹색 원 안에 있는 두 개의 노드, 즉 스레드 리더와 스레드 라우터를 에뮬레이션합니다.

6e3aa07675f902dc.png

네트워크 생성

1. 노드 1 시작

당신은 터미널 창에서, 아직 수행하지 않은 경우, 도커 컨테이너를 시작하고 연결 bash 쉘 :

$ docker run --name codelab_otsim_ctnr -it --rm \
   --sysctl net.ipv6.conf.all.disable_ipv6=0 \
   --cap-add=net_admin openthread/codelab_otsim bash

도커 컨테이너의 이동에 openthread 디렉토리 및 사용 에뮬레이트 나사 장치의 CLI 프로세스를 생성 ot-cli-ftd 이진.

root@c0f3912a74ff:/# cd ~/src/openthread
root@c0f3912a74ff:/# ./output/simulation/bin/ot-cli-ftd 1

참고 :이 표시되지 않는 경우 > 이 명령을 실행 한 후 프롬프트를 눌러 enter .

이 바이너리는 POSIX 위에 에뮬레이트된 OpenThread 장치를 구현합니다. IEEE 802.15.4 무선 드라이버는 UDP 위에 구현됩니다(IEEE 802.15.4 프레임은 UDP 페이로드 내에서 전달됨).

인수의 1 "공장 할당"에뮬레이트 장치 IEEE EUI-64의 최하위 비트를 나타내고, 파일 기술자이다. 이 값은 IEEE 802.15.4 무선 에뮬레이션을 위해 UDP 포트에 바인딩할 때도 사용됩니다(포트 = 9000 + 파일 설명자). 이 Codelab에서 에뮬레이트된 스레드 장치의 각 인스턴스는 다른 파일 설명자를 사용합니다.

주 : 사용 된 파일의 설명 1 에뮬레이트 장치의 프로세스를 생성 할 때이 코드 랩에 명시된 바와 같이 이상이다. 의 파일 기술자 0 다른 사용을 위해 예약되어 있습니다.

새 Operational Dataset을 만들고 활성 데이터 세트로 커밋합니다. Operational Dataset은 생성 중인 스레드 네트워크에 대한 구성입니다.

> 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

이 데이터세트를 활성 데이터세트로 커밋합니다.

> dataset commit active
Done

IPv6 인터페이스를 불러옵니다.

> ifconfig up
Done

스레드 프로토콜 작업 시작:

> thread start
Done

몇 초 동안 기다렸다가 장치가 스레드 리더가 되었는지 확인합니다. 리더는 라우터 ID 할당을 관리하는 장치입니다.

> state
leader
Done

노드 1의 스레드 인터페이스에 할당된 IPv6 주소를 봅니다(출력이 다름).

> 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

특정 IPv6 주소 유형에 유의하십시오.

  • 로 시작 fd = 메쉬 지역
  • 로 시작 fe80 = 링크 로컬

메시 로컬 주소 유형은 다음과 같이 추가로 분류됩니다.

  • 포함 ff:fe00 = 라우터 로케이터 (RLOC)
  • 포함하지 않습니다 ff:fe00 = 엔드 포인트 식별자 (EID)

콘솔 출력에서 ​​EID를 식별하고 나중에 사용할 수 있도록 기록해 둡니다. 위의 샘플 출력에서 ​​EID는 다음과 같습니다.

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

2. 노드 2 시작

새로운 단말기를 열고 실행 bash 노드 2로 사용하는 현재 실행 도커 컨테이너 쉘.

$ docker exec -it codelab_otsim_ctnr bash

이 새로운에서 bash 받는 메시지, 탐색 openthread 디렉토리와 CLI 과정 산란. 이것은 두 번째 에뮬레이트된 스레드 장치입니다.

root@c0f3912a74ff:/# cd ~/src/openthread
root@c0f3912a74ff:/# ./output/simulation/bin/ot-cli-ftd 2

참고 :이 표시되지 않는 경우 > 이 명령을 실행 한 후 프롬프트를 눌러 enter .

노드 1의 작동 데이터 세트와 동일한 값을 사용하여 스레드 네트워크 키 및 PAN ID를 구성합니다.

> dataset networkkey e4344ca17d1dca2a33f064992f31f786
Done
> dataset panid 0xc169
Done

이 데이터세트를 활성 데이터세트로 커밋합니다.

> dataset commit active
Done

IPv6 인터페이스를 불러옵니다.

> ifconfig up
Done

스레드 프로토콜 작업 시작:

> thread start
Done

장치는 자식으로 초기화됩니다. 스레드 하위는 상위 장치와만 유니캐스트 트래픽을 전송 및 수신하는 스레드 장치인 최종 장치와 동일합니다.

> state
child
Done

이분 내에서 당신의 접점 볼 수 childrouter . 스레드 라우터는 스레드 장치 간에 트래픽을 라우팅할 수 있습니다. 부모라고도 합니다.

> state
router
Done

네트워크 확인

메시 네트워크를 확인하는 쉬운 방법은 라우터 테이블을 보는 것입니다.

1. 연결 확인

노드 2에서 RLOC16을 가져옵니다. RLOC16은 장치의 RLOC IPv6 주소의 마지막 16비트입니다.

> rloc16
5800
Done

노드 1에서 노드 2의 RLOC16에 대한 라우터 테이블을 확인합니다. 노드 2가 먼저 라우터 상태로 전환되었는지 확인하십시오.

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

의 노드 2의 RLOC 0x5800 이 메시에 연결되어 있는지 확인하고, 테이블에서 발견된다.

2. 노드 2에서 노드 1에 대한 Ping

에뮬레이트된 두 스레드 장치 간의 연결을 확인합니다. 노드 2에서 ping 노드 1에 할당 된 EID를 :

> 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

눌러 enter 받는 돌아갑니다 > CLI 프롬프트.

네트워크 테스트

이제 두 개의 에뮬레이트된 스레드 장치 간에 성공적으로 ping할 수 있으므로 한 노드를 오프라인으로 전환하여 메시 네트워크를 테스트합니다.

노드 1로 돌아가서 스레드를 중지합니다.

> thread stop
Done

노드 2로 전환하고 상태를 확인합니다. 2 분 내에, 노드는 리더 (노드 1) 오프라인이 개 검출 것을, 당신은 노드 2의 전환이 될 나타납니다 leader 네트워크 :

> state
router
Done
...
> state
leader
Done

일단 도커 다시 종료하기 전에, 정지 스레드 및 공장 초기화 노드 2를 확인 bash 프롬프트. 이 연습에서 사용한 스레드 네트워크 자격 증명이 다음 연습으로 이월되지 않도록 공장 초기화가 수행됩니다.

> thread stop
Done
> factoryreset
>
> exit
root@c0f3912a74ff:/#

당신은 언론에있을 수 있습니다 enter 육성에 몇 번 > 후 프롬프트 다시 factoryreset 명령을 사용합니다. Docker 컨테이너를 종료하지 마십시오.

또한 공장 초기화하고 노드 1을 종료합니다.

> factoryreset
>
> exit
root@c0f3912a74ff:/#

참고 항목 OpenThread CLI 참조 가능한 모든 CLI 명령을 탐험.

4. 커미셔닝으로 노드 인증

이전 연습에서는 두 개의 시뮬레이션된 장치와 확인된 연결을 사용하여 스레드 네트워크를 설정했습니다. 그러나 이것은 인증되지 않은 IPv6 링크-로컬 트래픽만이 장치 사이를 통과하도록 허용합니다. 이들 사이(및 스레드 경계 라우터를 통한 인터넷) 간에 글로벌 IPv6 트래픽을 라우팅하려면 노드를 인증해야 합니다.

인증하려면 하나의 장치가 커미셔너 역할을 해야 합니다. 커미셔너는 현재 새로운 스레드 장치에 대해 선출된 인증 서버이며 장치가 네트워크에 참여하는 데 필요한 네트워크 자격 증명을 제공하는 권한 부여자입니다.

이 연습에서는 이전과 동일한 2노드 토폴로지를 사용합니다. 인증을 위해 스레드 리더는 커미셔너 역할을 하고 스레드 라우터는 조이너 역할을 합니다.

d6a67e8a0d0b5dcb.png

도커

나머지 연습의 각 노드(터미널 창)에 대해 OpenThread 빌드로 Docker 컨테이너를 실행하고 있는지 확인하십시오. 이전 연습에서 계속 경우에도이 있어야한다 bash 이미 열려 같은 도커 컨테이너 내에서 프롬프트. 그렇지 않으면, 부두 노동자 문제 해결 단계를 참조하거나 단순히 시뮬레이션에게 스레드 네트워크 운동을 다시 실행.

1. 네트워크 생성

노드 1에서 CLI 프로세스를 생성합니다.

root@c0f3912a74ff:/# cd ~/src/openthread
root@c0f3912a74ff:/# ./output/simulation/bin/ot-cli-ftd 1

참고 :이 표시되지 않는 경우 > 이 명령을 실행 한 후 프롬프트를 눌러 enter .

새 Operational Dataset을 만들고 활성 데이터 세트로 커밋하고 스레드를 시작합니다.

> 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

이 데이터세트를 활성 데이터세트로 커밋합니다.

> dataset commit active
Done

IPv6 인터페이스를 불러옵니다.

> ifconfig up
Done

스레드 프로토콜 작업 시작:

> thread start
Done

몇 초 동안 기다렸다가 장치가 스레드 리더가 되었는지 확인합니다.

> state
leader
Done

2. 커미셔너 역할 시작

노드 1에 있는 동안 위원 역할을 시작합니다.

> commissioner start
Done

하십시오 (사용하여 임의 소목 허용 * 함께 와일드 카드) J01NME 네트워크에위원회에 자격을 소목. 조이너는 인간 관리자가 위임된 스레드 네트워크에 추가하는 장치입니다.

> commissioner joiner add * J01NME
Done

3. 조이너 역할 시작

두 번째 터미널 창의 Docker 컨테이너에서 새 CLI 프로세스를 생성합니다. 노드 2입니다.

root@c0f3912a74ff:/# cd ~/src/openthread
root@c0f3912a74ff:/# ./output/simulation/bin/ot-cli-ftd 2

노드 2에서 사용 소목 역할 가능 J01NME 소목 자격 증명을.

> ifconfig up
Done
> joiner start J01NME
Done

... 확인을 위해 몇 초 기다리십시오 ...

Join success

조이너로서 장치(노드 2)는 위원(노드 1)과 성공적으로 인증되고 스레드 네트워크 자격 증명을 받았습니다.

이제 노드 2가 인증되었으므로 스레드를 시작합니다.

> thread start
Done

4. 네트워크 인증 확인

체크 state 지금 네트워크에 합류했다고 검증하기 위해, 노드 2에. 2 분 안에에서 노드 2 전환 childrouter :

> state
child
Done
...
> state
router
Done

5. 구성 재설정

다음 연습을 준비하려면 구성을 재설정하십시오. 각 노드에서 스레드를 중지하고 공장 초기화를 수행한 다음 에뮬레이트된 스레드 장치를 종료합니다.

> thread stop
Done
> factoryreset
>
> exit
root@c0f3912a74ff:/#

당신은 언론에있을 수 있습니다 enter 육성에 몇 번 > 후 프롬프트 다시 factoryreset 명령을 사용합니다.

5. OpenThread Daemon으로 네트워크 관리

이 연습에서는 하나의 CLI 인스턴스(단일 임베디드 SoC 스레드 장치)와 하나의 RCP(Radio Co-Processor) 인스턴스를 시뮬레이션할 것입니다.

ot-daemon OpenThread 코어 서비스로 실행할 수 있도록하는 것이, 입력 및 출력으로 UNIX 소켓을 사용하는 OpenThread하여 Posix 응용 프로그램의 모드입니다. 클라이언트는 OpenThread CLI를 프로토콜로 사용하여 소켓에 연결하여 이 서비스와 통신할 수 있습니다.

ot-ctl 제공하는 CLI이다 ot-daemon 관리하고 RCP를 구성 할 수 있습니다. 이것을 사용하여 우리는 RCP를 Thread 장치에 의해 생성된 네트워크에 연결할 것입니다.

도커

이 연습의 각 노드(터미널 창)에 대해 OpenThread 빌드로 Docker 컨테이너를 실행하고 있는지 확인하십시오. 이전 연습에서 계속하는 경우, 당신은이해야 bash 이미 열려 같은 도커 컨테이너 내에서 프롬프트. 그렇지 않으면, 부두 노동자 문제 해결 단계를 참조하십시오.

ot 데몬 사용

이 연습에서는 다음에 해당하는 세 개의 터미널 창을 사용합니다.

  1. 시뮬레이션된 스레드 장치의 CLI 인스턴스(노드 1)
  2. ot-daemon 과정
  3. ot-ctl CLI 인스턴스

1. 노드 1 시작

첫 번째 터미널 창에서 에뮬레이트된 스레드 장치에 대한 CLI 프로세스를 생성합니다.

root@c0f3912a74ff:/# cd ~/src/openthread
root@c0f3912a74ff:/# ./output/simulation/bin/ot-cli-ftd 1

참고 :이 표시되지 않는 경우 > 이 명령을 실행 한 후 프롬프트를 눌러 enter .

새 Operational Dataset을 만들고 활성 데이터 세트로 커밋하고 스레드를 시작합니다.

> 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

이 데이터세트를 활성 데이터세트로 커밋합니다.

> dataset commit active
Done

IPv6 인터페이스를 불러옵니다.

> ifconfig up
Done

스레드 프로토콜 작업 시작:

> thread start
Done

노드 1의 스레드 인터페이스에 할당된 IPv6 주소를 봅니다.

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

시뮬레이션에서 스레드 네트워크 공정을 설명한 바와 같이, 하나 개의 어드레스는 링크 - 로컬 (인 fe80 )와 세 메쉬 로컬 (아르 fd ). 이드는 메쉬 지역 포함하지 않는 주소입니다 ff:fe00 주소입니다. 이 샘플 출력에서 EID는 fd55:cf34:dea5:7994:460:872c:e807:c4ab .

사용자로부터 특정의 EID를 확인 ipaddr 노드와 통신하는 데 사용되는 출력.

2. ot-데몬 시작

제 2 단자 창에서, 생성 tun 디바이스 노드 집합 및 읽기 / 쓰기 권한 :

root@c0f3912a74ff:/# mkdir -p /dev/net && mknod /dev/net/tun c 10 200
root@c0f3912a74ff:/# chmod 600 /dev/net/tun

이 장치는 가상 장치에서 패킷 전송 및 수신에 사용됩니다. 장치가 이미 생성된 경우 오류가 발생할 수 있습니다. 이는 정상이며 무시할 수 있습니다.

받는 이동 openthread 디렉토리 및 시작 ot-daemon 우리는 노드 2.에게 전화 할게 RCP 노드에 대한 -v 는 로그 출력하고 실행되고 있는지 확인을 볼 수 있도록 플래그 자세한 정보를 :

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

성공하면, ot-daemon 모드는 다음과 유사한 출력 생성 자세한에서 :

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

이 터미널을 열어두고 백그라운드에서 실행하십시오. 더 이상 명령을 입력하지 않습니다.

3. ot-ctl을 사용하여 네트워크에 참여

우리는 노드 2 (위탁하지 않은 ot-daemon 아직 스레드 네트워크에 RCP)를. 곳이다 ot-ctl 제공됩니다. ot-ctl OpenThread CLI 응용 프로그램과 같은 CLI를 사용합니다. 따라서 제어 할 수 있습니다 ot-daemon 다른 시뮬레이션 스레드 장치와 같은 방식으로 노드를.

세 번째 터미널 창을 열고 기존 컨테이너를 실행합니다.

$ docker exec -it codelab_otsim_ctnr bash

컨테이너에서 일단 시작 ot-ctl :

root@c0f3912a74ff:/# cd ~/src/openthread
root@c0f3912a74ff:/# ./output/posix/bin/ot-ctl
>

당신은 사용할 것이다 ot-ctl 당신과 함께 제 2 터미널 창에서 시작 노드 2합니다 (RCP 노드) 관리하려면이 세 번째 터미널 창에서 ot-daemon . 체크 state 노드 2의를 :

> state
disabled
Done

노드 2의 취득 eui64 특정 소목에 가입 제한 :

> eui64
18b4300000000001
Done

노드 1(첫 번째 터미널 창)에서 커미셔너를 시작하고 해당 eui64로만 가입을 제한합니다.

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

노드 2(세 번째 터미널 창)에서 네트워크 인터페이스를 불러오고 네트워크에 연결합니다.

> ifconfig up
Done
> joiner start J01NME
Done

... 확인을 위해 몇 초 기다리십시오 ...

Join success

조이너로서 RCP(노드 2)는 위원(노드 1)과 성공적으로 인증되고 스레드 네트워크 자격 증명을 받았습니다.

이제 노드 2를 스레드 네트워크에 연결합니다.

> thread start
Done

4. 네트워크 인증 확인

체크 state 지금 네트워크에 합류했다고 검증하기 위해, 노드 2에. 2 분 안에에서 노드 2 전환 childrouter :

> state
child
Done
...
> state
router
Done

5. 연결 확인

종료 ot-ctl 과의 EID를 사용하여 노드 1 Ctrl 키 + D를 사용하여 귀하의 호스트 시스템의 명령 행, 핑에 ping6 명령. 는 IF ot-daemon RCP 인스턴스가 성공적으로 결합하고, 스레드 네트워크와 통신, 핑이 성공합니다 :

root@c0f3912a74ff:/# 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

6. 도커 문제 해결

Docker 컨테이너를 종료한 경우

bash 프롬프트, 당신은 필요에 따라 실행하고 다시 시작 / 다시 입력 것 있는지 확인해야합니다.

실행 중인 Docker 컨테이너를 표시하려면 다음 안내를 따르세요.

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
505fc57ffc72        codelab_otsim       "bash"              10 minutes ago      Up 10 minutes                           codelab_otsim_ctnr

모든 Docker 컨테이너(실행 중 및 중지됨)를 표시하려면:

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
505fc57ffc72        codelab_otsim       "bash"              10 minutes ago      Up 10 minutes                           codelab_otsim_ctnr

당신이 컨테이너가 표시되지 않는 경우 codelab_otsim_ctnr 하나의 출력에 docker ps 명령을 다시 실행 :

$ docker run --name codelab_otsim_ctnr -it --rm \
   --sysctl net.ipv6.conf.all.disable_ipv6=0 \
   --cap-add=net_admin openthread/codelab_otsim bash

컨테이너가 중지 된 경우 (에 나와있는 docker ps -a 하지만 docker ps , 다시 시작) :

$ docker start -i codelab_otsim_ctnr

도커 컨테이너가 이미 실행중인 경우 (나열 docker ps 각 단말의 용기에 다시 연결)

$ docker exec -it codelab_otsim_ctnr bash

"작업이 허용되지 않음" 오류

당신이로 실행하면 Operation not permitted 합니다 (사용하여 새 OpenThread 노드를 만들 때 오류 mknod 명령을), 확인이 코드 랩에서 제공하는 명령에 따라 루트 사용자로 도커를 실행하고 있습니다. 이 코드 랩은에 도커 실행을 지원하지 않습니다 뿌리없는 모드 .

7. 축하합니다!

OpenThread를 사용하여 첫 번째 스레드 네트워크를 성공적으로 시뮬레이션했습니다. 엄청난!

이 Codelab에서는 다음 방법을 배웠습니다.

  • OpenThread 시뮬레이션 Docker 컨테이너 시작 및 관리
  • 스레드 네트워크 시뮬레이션
  • 스레드 노드 인증
  • OpenThread 데몬으로 스레드 네트워크 관리

Thread 및 OpenThread에 대해 자세히 알아보려면 다음 참조를 살펴보세요.

또는 사용하려고 도커 컨테이너에 OpenThread 국경 라우터를 !