Raspberry PI

The raspberry pi is a low-cost credit card sized computer that is capable of doing all sorts of things. Here I present to you a list of commands applicable to the PI.

Here are a bunch a useful commands:

# Display commands
vcgencmd display_power 0                # turn off the video output
vcgencmd display_power 1                # turn on the video output
tvservice -n | awk -F'=' '{print $2}'   # get the name of the display
tvservice -s                            # get hdmi status
tvservice -a                            # get supported audio information

# Wakeup display from screensaver
DISPLAY=:0 xset s reset

# Network Information
ip route                                # get network metric
arp -an                                 # get arp entries
ifconfig                                # display and/or configure network interfaces
netstat -rn                             # get the Kernel IP routing table

ip addr | grep -Po '(?!(inet 127.\d.\d.1))(inet \K(\d{1,3}\.){3}\d{1,3})'         # get the ip address

# Disk stats
df -h                                   # get all the disk information in human readable format
vmstat                                  # report virtual memory statistics

# Memory Information
vcgencmd get_mem arm && vcgencmd get_mem gpu                      # get memory split information [arm, gpu]
vcgencmd get_mem arm | awk -F'=' '{print $2}' | sed s'/.$//'      # get just arm portion of memory split
vcgencmd get_mem gpu | awk -F'=' '{print $2}' | sed s'/.$//'      # get just the gpu portion of memory split

cat /proc/meminfo | grep MemFree | awk '{print $2/1024}'          # get free memory in Mb
cat /proc/meminfo | grep MemTotal | awk '{print $2/1024}'         # get total memory in Mb
cat /proc/meminfo | grep MemAvailable | awk '{print $2/1024}'     # get availabe memory in Mb
cat /proc/meminfo | grep Buffers | awk '{print $2/1024}'          # get Buffers info in Mb
cat /proc/meminfo | grep Cached | awk '{print $2/1024}'           # get Cached memory info in Mb
cat /proc/meminfo | grep Dirty | awk '{print $2/1024}'            # get Dirty memory info in Mb
cat /proc/meminfo | grep Active | awk '{print $2/1024}'           # get Active memory info in Mb
cat /proc/meminfo | grep Inactive | awk '{print $2/1024}'         # get Inactive memory info in Mb

# System Information
cat /proc/cpuinfo | grep Hardware | awk '{print $3}'              # Hardware
cat /proc/cpuinfo | grep Revision | awk '{print $3}'              # Revision
hostname                                                          # get the hostname
uptime -p                                                         # get system uptime
cat /proc/cpuinfo | grep Serial | awk '{print $3}'                # get serial number of the pi
cat /sys/class/net/eth0/address                                   # get hardware mac address [eth0]
uname -mrs                                                        # kernel information

cat /proc/cpuinfo | grep 'model name' | cut -d' ' -f 3- | awk 'NR==1'                 # get processor model information

# Voltages and Clocks
# voltages
vcgencmd measure_volts core | awk -F'=' '{print $2 }'             # Measure core voltage
vcgencmd measure_volts sdram_c | awk -F'=' '{print $2 }'          # measure sdram_c voltage
vcgencmd measure_volts sdram_i | awk -F'=' '{print $2 }'          # measure sdram_i voltage
vcgencmd measure_volts sdram_p | awk -F'=' '{print $2 }'          # measure sdram_p voltage

# clock
vcgencmd measure_clock arm
vcgencmd measure_clock core
vcgencmd measure_clock h264
vcgencmd measure_clock isp
vcgencmd measure_clock v3d
vcgencmd measure_clock uart
vcgencmd measure_clock pwm
vcgencmd measure_clock emmc
vcgencmd measure_clock pixel
vcgencmd measure_clock vec
vcgencmd measure_clock hdmi
vcgencmd measure_clock dpi

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq         # cpu frequency

# Temperature
vcgencmd measure_temp | awk -F'=' '{print $2}' | sed s'/..$//'                                # GPU temperature
cat /sys/class/thermal/thermal_zone0/temp | awk '{print $1/1000}'                             # thermal CPU temperature

# EXTRA NOTES
# disabling onboard wifi and bluetooth on RPI3
# modify /boot/config.txt to add the following two lines

# dtoverlay=pi3-disable-wifi
# dtoverlay=pi3-disable-bt

# Scan wireless SSIDS that are around your raspberry pi
sudo iwlist wlan0 scanning | egrep 'Cell |Encryption|Quality|Last beacon|ESSID|Mode|Channel'

# Copy directory contents from remote host to local system
#syntax:: scp user@remote-server:/path/to/dir/* /path/to/local/dir/
scp pi@10.0.0.10:/var/tmp/contents/* /Users/krsna/Desktop/

# Copy directory contents from local system to remote host
#syntax:: scp /path/to/local/dir/ user@remote-server:/path/to/dir/*
scp /Users/krsna/Desktop/ pi@10.0.0.10:/var/tmp/contents/*

# One can also use the rsync utility to do similar things
# To sync a local directory to a remote host
rsync -avzr /path/to/dir user@remote-server:/path/to/dir

# To sync a local directory to a remote host and delete files that are in remote that are not in local
rsync -avzr --delete /path/to/dir user@remote-server:/path/to/dir

Setting up a raspberry pi as an access point in a standalone network (NAT)

# Install dnsmasq and hostapd
sudo apt-get install dnsmasq hostapd -y

# Turn them off since there are no configuration files yet
sudo systemctl stop dnsmasq
sudo systemctl stop hostapd

# Configure a static ip address
sudo bash -c "cat << EOT >> /etc/dhcpcd.conf
interface wlan0
    static ip_address=10.0.0.1/24
    nohook wpa_supplicant
EOT"

# Restart the dhcpcd daemon and set up the new wlan0 configuration
sudo service dhcpcd restart

# Move /etc/dnsmasq.conf to /etc/dnsmasq.conf.orig for a backup just incase
sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig

# Edit /etc/dnsmasq.conf file like this so that ips of range 10.0.0.2 and 10.0.0.40 is leased for 42 hours
sudo bash -c "cat << EOT >> /etc/dnsmasq.conf
interface=wlan0      # Use the require wireless interface - usually wlan0
  dhcp-range=10.0.0.2,10.0.0.40,255.255.255.0,42h
EOT"

# Set up the access point host software (hostapd)
sudo bash -c "cat << EOT >> /etc/hostapd/hostapd.conf
interface=wlan0
driver=nl80211
ssid=TESTSSID
hw_mode=g
channel=7
wmm_enabled=0
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=SOMEPASSWORD1234
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
EOT"

# Tell the system where to find the configuration file above
sudo bash -c "cat << EOT >> /etc/default/hostapd
DAEMON_CONF="/etc/hostapd/hostapd.conf"
EOT"

# Start hostapd and dnsmasq services
sudo systemctl start hostapd
sudo systemctl start dnsmasq

# In the file /etc/sysctl.conf uncomment the line #net.ipv4.ip_forward=1 using sed
sudo sed -i '/#net.ipv4.ip_forward=1/s/^#//g' /etc/sysctl.conf

# Add a masquerade for outbound traffic on eth0
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# Save the iptables rule
sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"

# Insert the line "iptables-restore < /etc/iptables.ipv4.nat" before the last line "exit 0" in file /etc/rc.local
sudo sed -i '$iiptables-restore < /etc/iptables.ipv4.nat' /etc/rc.local # the $i with the extra i is not a typo :)

# Reboot
sudo reboot now

# At this point you should be able to see a wifi network with SSID called TESTSSID being broadcasted by your raspberry pi, you can connect to it using the password SOMEPASSWORD1234

Hosting a webpage using lighttpd on the raspberry pi

# Install lightppd and reload it
$ sudo apt-get -y install lighttpd
$ sudo service lighttpd force-reload

# Set user group permissions for the /var/www/html and /var/www/cgi-bin directory
sudo chown pi:pi /var/www/html /var/www/cgi-bin
sudo chmod 775 /var/www/html /var/www/cgi-bin

# Place your index.html file inside /var/www/html/ and make sure you are on the same network as the raspi or connect to the SSID that the raspi is broadcasting  and you are all done
# Go to [your raspberry pis ip address] in a browser and you should now see your index.html being served