ZeroMQ 를 활용한 jetson-stats message publishing
jetson-stats 는 Jetson 하드웨어 상태를 진단할 수 있는 좋은 도구 이다. 터미널에서 jetson-stats 명령어 또는, jtop 으로 시스템 정보를 확인할 수 있다. 하지만, 터미널이 아닌 다른 Host PC 에서 Jetson 을 진단하는 방법이 필요한 use case 가 있다.
ZeroMQ 는 기본기능의 충실한 message broker 라이브러리 이다. ZeroMQ 를 이용해서 jetson-stats 데이터를 네트워크로 publising 하는 예제를 만들어보자!
jetson-stats message publishing 구현
테스트 환경
- NVIDIA Jetson NX devkit
- Jetpack 4.6 (L4T R32.6.1)
- X86 Host PC (Ubuntu 18.04)
필요 패키지 설치
Jeston NX 터미널에서 pip 명령어를 통해 jetson-stats 를 설치하고 재부팅 한다.
$ sudo -H pip install -U jetson-stats
$ sudo reboot
Jeston NX 터미널에서 pip 명령어를 통해 ZeroMQ 라이브러리 zmq 를 설치한다.
$ pip3 install --upgrade pip
$ pip3 install packaging
$ pip3 install zmq
ZeroMQ 발행과 구독 코드 작성
Jeston NX 에서 메시지를 발행하는 코드를 작성한다. 아래는 zmq 패키지를 이용하여 TCP 3063 port 에 1초에 한번씩 jetson-stats 을 전송하는 코드 이다.
#!/usr/bin/python3
import zmq
import random
import sys
import time
import json
import datetime
PORT = "3063"
context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://*:%s" % PORT)
# to filtering message on the client end
COTEXT_ID = str('sys').encode()
from jtop import jtop
def json_default(value):
if isinstance(value, datetime.datetime):
return value.strftime("%Y/%m/%d %H:%M:%S")
if isinstance(value, datetime.time):
return value.strftime("%H:%M:%S")
if isinstance(value, datetime.timedelta):
return str(value)
raise TypeError('not JSON serializable')
if __name__ == "__main__":
with jtop() as jetson:
while jetson.ok():
msg_json = json.dumps(jetson.stats, default=json_default).encode()
print(msg_json)
print(type(msg_json))
print(sys.getsizeof(msg_json))
socket.send_multipart([COTEXT_ID, msg_json])
time.sleep(1)
Host PC 에서 message 를 수신하는 코드를 작성한다. 아래는 3063 port 에서 수신된 메시지를 구독하여 출력하는 예제이다. 개발환경에 맞게 localhost 를 Jetson 의 IP 주소로 변경한다.
#!/usr/bin/python3
import zmq
import random
import sys
import time
import io
import json
import datetime
PORT = "3063"
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect("tcp://localhost:3063")
socket.setsockopt(zmq.SUBSCRIBE, b'sys')
for _ in range(100):
_, payload = socket.recv_multipart()
data = json.load(io.BytesIO(payload))
print(data)
jetson-stats publishing 테스트
Jetson NX 터미널에서 메시지를 발행하는 어플리케이션을 실행한다.
$ ./jpub
메시지를 수신하는 코드의 localhost 의 주소를 Jetson 의 IP 주소로 수정하고 실행한다.
$ ./jsub
부팅 이후 자동 시작
Jetson NX 에서 메시지 발행을 자동을 시작있게 systemd service 를 추가한다. 자세한 service 코드는 github 를 참고하자.
Autostart
$ sudo cp jpub /usr/local/bin/
$ sudo chmod +x /usr/local/bin/jpub
$ sudo vim /etc/systemd/system/jetson_stats_pub.service
$ sudo systemctl enable jetson_stats_pub.service
$ sudo systemctl start jetson_stats_pub.service
참고자료
'NVIDIA Jeston > Jetson BSP' 카테고리의 다른 글
Jetson Reverse SSH 터널링 (0) | 2022.12.03 |
---|---|
젯슨 부팅 과정에서 Power Model 고정하기 (1) | 2022.09.11 |
젯슨 NX Xavier NGC 컨테이너 개발환경 (0) | 2022.08.24 |
Jetson 로깅 시스템, Rsyslogd (0) | 2022.08.17 |
Jetson Nano 이미지 백업과 재사용 (0) | 2022.07.22 |
[Jetson] nvme ssd 를 루트파일시스템으로 사용하기 (0) | 2022.07.09 |
[Jetson] JTOP 시스템 프로파일러 도구 (0) | 2022.07.03 |
[Jetson] Xavier NX 방열팬 제어 (0) | 2022.06.30 |