라즈베리파이에 OLED 1.3" SH1106 I2C  DISPLAY 모듈 연결해서

시스템 정보를 표시해보자.

 

import time
import socket
import subprocess
from luma.core.interface.serial import i2c
from luma.oled.device import sh1106
from PIL import Image, ImageDraw, ImageFont


# =========================
# System Info Functions
# =========================

def get_ip():
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.connect(("8.8.8.8", 80))
        ip = s.getsockname()[0]
        s.close()
        return ip
    except:
        return "No IP"


def cmd(cmd):
    return subprocess.check_output(cmd, shell=True).decode().strip()


def get_cpu():
    return cmd("top -bn1 | grep 'Cpu(s)' | awk '{print $2}'") + "%"


def get_ram():
    return cmd("free -m | awk 'NR==2{printf \"%s/%sMB (%.0f%%)\", $3,$2,$3*100/$2}'")


def get_temp():
    try:
        return cmd("vcgencmd measure_temp").replace("temp=", "")
    except:
        return "N/A"


def get_users():
    return cmd("who | wc -l")


def get_ssh():
    return cmd("ss -tn | grep ':22 ' | wc -l")


def get_http():
    return cmd("ss -tn | grep ':80 ' | wc -l")


def get_net_speed():
    rx1 = int(cmd("cat /sys/class/net/eth0/statistics/rx_bytes"))
    tx1 = int(cmd("cat /sys/class/net/eth0/statistics/tx_bytes"))
    time.sleep(1)
    rx2 = int(cmd("cat /sys/class/net/eth0/statistics/rx_bytes"))
    tx2 = int(cmd("cat /sys/class/net/eth0/statistics/tx_bytes"))
    return (rx2 - rx1) // 1024, (tx2 - tx1) // 1024  # KB/s


# =========================
# OLED Init
# =========================

serial = i2c(port=1, address=0x3C)
device = sh1106(serial)
font = ImageFont.load_default()


def show(lines):
    image = Image.new("1", (device.width, device.height))
    draw = ImageDraw.Draw(image)
    y = 0
    for line in lines:
        draw.text((0, y), line, font=font, fill=255)
        y += 12
    device.display(image)


# =========================
# Pages
# =========================

def page_network():
    ip = get_ip()
    users = get_users()
    ssh = get_ssh()
    show([
        "=== NETWORK ===",
        f"IP: {ip}",
        f"Login: {users}",
        f"SSH: {ssh}",
    ])


def page_system():
    cpu = get_cpu()
    ram = get_ram()
    temp = get_temp()
    show([
        "=== SYSTEM ===",
        f"CPU: {cpu}",
        f"RAM: {ram}",
        f"TEMP: {temp}",
    ])


def page_traffic():
    rx, tx = get_net_speed()
    show([
        "=== TRAFFIC ===",
        f"RX: {rx} KB/s",
        f"TX: {tx} KB/s",
    ])


def page_ports():
    http = get_http()
    ssh = get_ssh()
    show([
        "=== PORTS ===",
        f"80(HTTP): {http}",
        f"22(SSH): {ssh}",
    ])


pages = [page_network, page_system, page_traffic, page_ports]

while True:
    for p in pages:
        try:
            p()
        except Exception as e:
            show(["ERROR", str(e)])
        time.sleep(3)

 

 

728x90

+ Recent posts