본문 바로가기
NVIDIA Jeston/Jetson BSP

메시지브로커를 통한 jetson-stats 퍼블리싱

by makepluscode 2022. 12. 3.
반응형

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

참고자료

https://github.com/makepluscode/jetson-stats-zeromq

 

GitHub - makepluscode/jetson-stats-zeromq

Contribute to makepluscode/jetson-stats-zeromq development by creating an account on GitHub.

github.com

반응형