Orange Pi Zero/Dash Button Access Point Setup
This is a very condensed tutorial on how to set up an OrangePi running Armbian as an access point to intercept Dash Button commands, allowing you to have wireless buttons on the cheap. This is a project that migrates the existing solution I had on my Raspberry Pi 3 to the OrangePi, which frees up my Raspberry Pi 3 for other tasks, since most of the commands are replicated, the commands are listed here in order to set up the OrangePi. This tutorial borrows very heavily from frillip's tutorial and the python script borrows from Familab's tutorial.
The OrangePi Zero is a ethernet-wifi SOC that is sold on aliexpress for $8.99, which is a slightly cheaper price than a Raspberry Pi Zero, and about half the price of a Raspberry Pi Zero W.
The advantage the Orange Pi Zero has is that it is widely available and has a physical and wireless interfaces, allowing it to serve as a wireless endpoint for IOT applications. However, it lacks the kind of environment and support that the Raspberry Pi has, which makes it a poor platform for initial implementation. This board also does not have HDMI output which makes it mostly suited for headless tasks where a monitor is not required.
Due to the efforts of the kind folks at Armbian, most of the commands used in the Raspberry Pi are compatible with this particular board, and hence made porting much easier.
This tutorial picks up from after you are able to successfully connect to the Orange Pi Zero over ssh.
Install required packages
sudo apt-get install dnsmasq hostapd dhcpd dhcpcd5
Tell dhcpcd to ignore wlan0
In sudo nano /etc/dhcpcd.conf
, at bottom of file:
denyinterface wlan0
Configure static IP
sudo nano /etc/network/interfaces
allow-hotplug wlan0
iface wlan0 inet static
address 172.24.1.1
netmask 255.255.255.0
network 172.24.1.0
broadcast 172.24.1.255
# wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
Configure hostapd
sudo nano /etc/hostapd/hostapd.conf
# This is the name of the WiFi interface we configured above
interface=wlan0
# Use the nl80211 driver with the brcmfmac driver
driver=nl80211
# This is the name of the network
ssid=OrangePi-Ap
# Use the 2.4GHz band
hw_mode=g
# Use channel 6
channel=6
# Enable 802.11n
ieee80211n=1
# Enable WMM
wmm_enabled=1
# Enable 40MHz channels with 20ns guard interval
ht_capab=[HT40]
#[SHORT-GI-20][DSSS_CCK-40]
# Accept all MAC addresses
macaddr_acl=0
# Use WPA authentication
auth_algs=1
# Require clients to know the network name
ignore_broadcast_ssid=0
# Use WPA2
wpa=2
# Use a pre-shared key
wpa_key_mgmt=WPA-PSK
# The network passphrase
wpa_passphrase=raspberry
# Use AES, instead of TKIP
rsn_pairwise=CCMP
Configure hostapd
In sudo nano /etc/default/hostapd
replace:
#DAEMON_CONF=""
with:
DAEMON_CONF="/etc/hostapd/hostapd.conf"
Dnsmasq config
Create a copy:
sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig
Open file for editing:
sudo nano /etc/dnsmasq.conf
interface=wlan0 # Use interface wlan0
listen-address=172.24.1.1 # Explicitly specify the address to listen on
bind-interfaces # Bind to the interface to make sure we aren't sending things elsewhere
server=8.8.8.8 # Forward DNS requests to Google DNS
domain-needed # Don't forward short names
bogus-priv # Never forward addresses in the non-routed address spaces.
dhcp-range=172.24.1.50,172.24.1.150,12h # Assign IP addresses between 172.24.1.50 and 172.24.1.150 with a 12 hour lease time
Set up IPv4 forwarding
In sudo nano /etc/sysctl.conf
remove #
from the line net.ipv4.ip_forward=1
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
Save our configuration:
sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"
Init file
In sudo nano /etc/rc.local
, above exit 0
:
iptables-restore < /etc/iptables.ipv4.nat
rfkill unblock all
Install pip & setuptools
sudo apt install pip3 setuptools
sudo pip3 --upgrade pip setuptools
Install needed python libraries
sudo pip3 install scrapy paho-mqtt
Add python scripts
sniffer.py
Remember to change the HEX HERE
to the MAC address of the Dash button. This can be done by running sudo /usr/sbin/hostapd /etc/hostapd/hostapd.conf
, connecting the button to the AP and pressing the button. At this point the MAC address should be displayed in the output. This is a simple script that publishes "1" to the channel "light".
import sys
import logging
import codecs
import paho.mqtt.publish as publish
import time
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *
decode_hex = codecs.getdecoder("hex_codec")
def arp_display(pkt):
if pkt[ARP].op == 1:
print(pkt[ARP].hwsrc)
if pkt[ARP].pdst == "172.24.1.1":
if pkt[ARP].hwsrc == "HEX HERE":
onCheck()
time.sleep(2)
def test(pkt):
if ARP in pkt and pkt[ARP].op in (1,2):
return pkt.sprintf("ARP.hwsrc% %ARP.psrc%")
def onCheck():
publish.single("light","1",hostname="172.24.1.1")
sniff(prn=arp_display, filter="arp", store=0)
Create a script to automate the process
Since we don't want to have to manually run commands each time we boot up the OrangePi, we create a set of startup scripts to run each time it is booted:
sudo nano /etc/init.d/startupscript
#!/bin/bash
sudo rfkill unblock wlan
sudo ifconfig wlan0 up
sudo service dnsmasq restart
sudo /usr/sbin/hostapd /etc/hostapd/hostapd.conf
chmod 755 startupscript
ln -s /etc/init.d/startupscript /etc/rc3.d/S99startupscript
Create a cronjob to start our python script
sudo crontab -e
@reboot sudo /usr/bin/python3 /full/path/here/sniffer.py > /dev/null 2>&1
Reboot
sudo reboot now
References
https://raspberrypi.stackexchange.com/questions/42940/how-to-manually-install-dhcpcd
https://askubuntu.com/questions/472794/hostapd-error-nl80211-could-not-configure-driver-mode
https://frillip.com/using-your-raspberry-pi-3-as-a-wifi-access-point-with-hostapd/
https://familab.org/2016/02/hacking-the-amazon-dash-button-to-make-a-simple-cheap-iot-place-anywhere-networked-button-3/