I needed a tool that could display relevant network information as quick as possible. Armed with a Raspberry Pi 3 B+, 2.13 inch Waveshare e-paper HAT V2, and a curiosity to explore its potential, I set out to develop a tool that could display network data. This was born out of necessity while I was setting up VLANs within PfSense. I got tired of using “ipconfig /release” and “ipconfig /renew” while testing network segregation and firewall rules. I will share that project in an additional post.
I plan making this post as concise as possible. During my research to make this project a reality, I dug through a lot of fluff to find the information I needed.
I assume you know how to flash the OS on to the PI. We will start post Pi imager. I used a fresh 64GB SD card. Also, noticed that the 128GB SD card I had initially used would not boot properly. I did not delve further to determine whether is was the SD card size or some operator error. Usually the latter..
pi@NetworkID:~ $ sudo apt update
pi@NetworkID:~ $ sudo apt upgrade
#install required packages
pi@NetworkID:~ $ sudo apt-get install python3-rpi.gpio python3-spidev python3-pil python3-pip
Next we will enable the SPI interface. We will do this from the raspi-config interface.
pi@NetworkID:~ $ sudo raspi-config
Choose option 3 – Interface options
Enable the SPI interface by selsecting the option. Then select finish when the main screen reappears.
pi@NetworkID:~ $ git clone https://github.com/waveshare/e-Paper.git
Cloning into 'e-Paper'...
remote: Enumerating objects: 8711, done.
remote: Counting objects: 100% (1961/1961), done.
remote: Compressing objects: 100% (264/264), done.
remote: Total 8711 (delta 1745), reused 1778 (delta 1694), pack-reused 6750 (from 1)
Receiving objects: 100% (8711/8711), 42.23 MiB | 307.00 KiB/s, done.
Resolving deltas: 100% (6242/6242), done.
Updating files: 100% (3002/3002), done.
Give it few seconds to clone the repository. When it has finished, navigate to the e-paper directory that was created and run setup.py
pi@NetworkID:~ $ cd e-Paper/RaspberryPi_JetsonNano/python/
pi@NetworkID:~/e-Paper/RaspberryPi_JetsonNano/python $ sudo python3 setup.py install
This is where I made a mistake. I needed to install Python3 Setup Tools and netifaces. These libraries are crucial for proper set up and network interface queries using python.
pi@NetworkID:~/e-Paper/RaspberryPi_JetsonNano/python $ sudo apt install python3-setuptools
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
python3-setuptools is already the newest version (66.1.1-1).
python3-setuptools set to manually installed.
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
pi@NetworkID:~/e-Paper/RaspberryPi_JetsonNano/python $ sudo apt install python3-netifaces
Now lets try to run Setup.py again.
Now after we have all the libraries and configurations correct, let’s write some code!
import subprocess
import netifaces
from waveshare_epd import epd2in13_V2
from PIL import Image, ImageDraw, ImageFont
from datetime import datetime
# Initialize e-Paper display
# Specifically for 2.13" V2
epd = epd2in13_V2.EPD()
# Define fonts
font = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf', 12)
font_small = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf', 10)
def get_network_info(interface):
try:
# Get network information for the specified interface
if interface in netifaces.interfaces():
addresses = netifaces.ifaddresses(interface)
ip_address = addresses[netifaces.AF_INET][0]['addr']
netmask = addresses[netifaces.AF_INET][0]['netmask']
gateway = netifaces.gateways()['default'][netifaces.AF_INET][0]
mac_address = addresses[netifaces.AF_LINK][0]['addr']
return ip_address, netmask, gateway, mac_address
else:
print(f"Interface {interface} not found.")
return None, None, None, None
except Exception as e:
print(f"Error retrieving network information: {e}")
return None, None, None, None
def get_ssid(interface):
try:
# Execute the iwgetid command to get the SSID of the specified interface
result = subprocess.run(['iwgetid', interface, '--raw'], capture_output=True, text=True)
if result.returncode == 0:
return result.stdout.strip()
else:
return "SSID not found"
except Exception as e:
print(f"Error retrieving SSID: {e}")
return "SSID error"
def display_network_info(ip_address, netmask, gateway, mac_address, ssid=None):
# Create new image with white background (landscape orientation)
image = Image.new('1', (epd.height, epd.width), 255)
draw = ImageDraw.Draw(image)
# Clear display
epd.init(epd.FULL_UPDATE)
epd.displayPartBaseImage(epd.getbuffer(image))
# Draw network information on the display
draw.text((10, 10), f"IP Address: {ip_address}", font=font, fill=0)
draw.text((10, 30), f"Subnet Mask: {netmask}", font=font, fill=0)
draw.text((10, 50), f"Default Gateway: {gateway}", font=font, fill=0)
# Add timestamp
current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
draw.text((10, 70), f"Timestamp: {current_time}", font=font, fill=0)
# If SSID is available, display it
if ssid:
draw.text((10, 90), f"SSID: {ssid}", font=font, fill=0)
# Display MAC address
draw.text((10, 110), f"MAC Address: {mac_address}", font=font, fill=0)
# Rotate the image 90 degrees clockwise
image = image.rotate(90, expand=True)
# Display rotated image on the e-Paper display
epd.init(epd.FULL_UPDATE)
epd.display(epd.getbuffer(image))
# Sleep to conserve power
epd.sleep()
def main():
# Check for wireless connection first
# Wirelss connection need to be configured before hand
if 'wlan0' in netifaces.interfaces():
interface="wlan0"
ip_address, netmask, gateway, mac_address = get_network_info(interface)
ssid = get_ssid(interface)
if ip_address:
display_network_info(ip_address, netmask, gateway, mac_address, ssid)
# If no wireless connection, check for wired connection
# Make sure the name of the interface here matches what is running on your device
elif 'eth0' in netifaces.interfaces():
interface="eth0"
ip_address, netmask, gateway, mac_address = get_network_info(interface)
if ip_address:
display_network_info(ip_address, netmask, gateway, mac_address)
else:
print("No network interface found.")
if __name__ == '__main__':
main()
I choose to use crontab to run this script at reboot.
pi@NetworkID:~ $ contab -e
# Use option one, or whichever editor you'd like.
# At the end of the file add this line.
@reboot /usr/bin/python3 /home/pi/network_monitor.py
# This will run the script at each reboot.
Source link
lol