----------------------------------------
Little Free Library, part 1
October 14th, 2018
----------------------------------------
Below is a list of notes I've prepared while building my little
free ebook library. What is that, you ask? Well, it's a solar
powered rapsberry pi zero w that will live off-grid with an open
wifi access point. When a user connects to it, Captive Portal will
automatically trigger a "sign-in" page. The page isn't meant to
sign into anything, though. Instead it will present users with
free ebooks for download to their devices!
My first go will likely be a collection of PDF maps from USGS,
some trail guides and bird identification things that are
appropriate for the trail that runs past my house.
My TODO list remains:
- Test apple devices captive portal
- Design a static site page to download the ebooks
# Starting from a raspbian lite install on a raspberry pi zero w:
# After setting up your local wifi connection in wpa_supplicant,
# then proceed to make your littlefreelibrary work when away from
# home...
# Update packages to prepare
$ sudo apt update
$ sudo apt upgrade -y
# Install dependencies, but disable by default
$ sudo apt install dnsmasq hostapd nginx -y
$ sudo systemctl disable hostapd
$ sudo systemctl disable dnsmasq
# Configure
$ sudo vi /etc/hostapd/hostapd.conf
interface=wlan0
driver=nl80211
ssid=LittleFreeLibrary
hw_mode=g
channel=8
wmm_enabled=0
macaddr_acl=0
auth_algs=1
wpa=0
ignore_broadcast_ssid=0
country_code=US
ieee80211n=1
$ sudo vi /etc/default/hostapd
DAEMON_CONF="/etc/hostapd/hostapd.conf" # change only this line
$ sudo vi /etc/dnsmasq.conf # add the following to the end of file
bogus_priv
addrdess=/#/10.0.0.5
interface=wlan0
no-resolv
bind-interfaces
dhcp-range=10.0.0.50,10.0.0.100,12h
$ sudo vi /etc/dchcpd.conf # add the following to the end of file
nohook wpa_supplicant
$ sudo vi /etc/systemd/system/autohotspot.service
[Unit]
Description=Automatically generate an internet Hotspot when a valid ssid is not in range
After=multi-user.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/autohotspot
[Install]
WantedBy=multi-user.target
$ sudo systemctl enable autohotspot.service
$ curl http://www.raspberryconnect.com/images/Autohotspot/autohotspot-95-4/autohotspot.txt > autohotspot
$ chmod 755 autohotspot
$ sudo mv autohotspot /usr/bin/autohotspot
# Change hostname to littlefreelibrary
$ sudo hostname littlefreelibrary
$ sudo vi /etc/hostname
littlefreelibrary
$ sudo vi /etc/hosts
127.0.0.1 littlefreelibrary
# Set up a cron to detect changes
$ crontab -e # add the following to the end of file
*/5 * * * * sudo /usr/bin/autohotspot >/dev/null 2>&1
# Set up nginx to work with captive portal
$ sudo vi /etc/nginx/sites-available/default
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html;
server_name _;
# For iOS
if ($http_user_agent ~* (CaptiveNetworkSupport) ) {
return 302 http://littlefreelibrary.local/apple.html;
}
# For Android
location /generate_204 {
return 302 http://littlefreelibrary.local/index.html;
}
location / {
try_files $uri $uri/ /index.html;
}
}
$ sudo service nginx restart
# Add apple captive portal page
$ sudo vi /var/www/html/apple.html
<!--
<?xml version="1.0" encoding="UTF-8"?>
<WISPAccessGatewayParam xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.wballiance.net/wispr_2_0.xsd">
<Redirect>
<MessageType>100</MessageType>
<ResponseCode>0</ResponseCode>
<VersionHigh>2.0</VersionHigh>
<VersionLow>1.0</VersionLow>
<AccessProcedure>1.0</AccessProcedure>
<AccessLocation>LittleFreeLibrary</AccessLocation>
<LocationName>LittleFreeLibrary</LocationName>
<LoginURL>http://littlefreelibrary.local/index.html</LoginURL>
</Redirect>
</WISPAccessGatewayParam>
-->
# Create your library page
$ sudo vi /var/www/html/index.html
TBD HTML code
# To manage device when in AP mode
$ ssh pi@10.0.0.5