----------------------------------------
PicoGopher Part 3: free bird
November 5, 2022
----------------------------------------
Written on my laptop, connected via
SSH to my gopher server
----------------------------------------
Welcome to Part 3 of my PicoGopher journey! If you want to
see how everything started, you can find the previous parts
in my phlog at gopher://gopher.club/1/users/mala/ (also
mirrored at gopher://gopher.3564020356.org). You can find the
project's code at https://github.com/aittalam/PicoGopher.
In the previous parts we talked about the rationale behind
this project and the steps required to connect your Pico
and serve files to a Gopher client. At the end of last part
we realised we already had a fully functional server (yaay!)
that one could connect to a local network or (just the same
way as I do with my gopherhole) with the rest of the world,
all at the expense of 6 dollars... This is even less than a
Twitter subscription!
This was definitely an interesting experiment by, in my
opinion, we have just scratched the surface of it.
The RasPi Pico has some capabilities we have not taken
advantage of yet, and we could do so much more with it
despite its tiny fingerprint. Actually, we could do more
*thanks to* its tiny fingerprint!
The Pico is so small that you can carry it with yourself all
the time. I would lie if I said I did not think about
Pwnagotchi [1] when I first thought about this project:
I suggest you to go and check it out immediately, as it is
a great example of what you can do on the move (and has a
lovely E-Ink UI which makes me want to attach a screen to
a PicoGopher so badly!). An additional advantage of the Pico
with respect to the RasPi Zero (which is what Pwnagotchi is
based on) is that it consumes even less power, so you can
bring it along with you for days or just leave it anywhere
and rely on the sun to keep it powered for free.
But to be really free (not just as in beer, but as a bird)
we still need to be autonomous, with no need to rely on an
Internet connection to share our stuff. So today we will
learn how to provide WiFi connection together with our
gopherholes, allowing people to connect to our server
wherever we bring (or leave) it... provided they are close
enough, of course ;-)
========= Project status =========
Below you can see the current status of the project. The
steps marked as "x" have been completed, while those marked
as "+" are described in this post. Today's update is rather
small but you will soon realise how useful it is!
- [x] connect to the WiFi
- [x] run a simple HTTP server
- [x] run a mockup Gopher server
- [x] load/save files
- [x] make the Gopher server not a mockup anymore:
- [x] translate gophermaps following gopher protocol
- [x] load any file from disk
- [+] set up the pico as an access point for geolocalised
access
- [ ] make the server a bit more accessible
- [ ] enable async
- [ ] enable HTTP
- [ ] powering PicoGopher
- [ ] better understand power saving
- [ ] playing with batteries
==== Setting the Pico as an AP ====
There are many tutorials showing how to set up the Pico W as
an access point (AP): first the very comprehensive guide
"Everything about the Raspberry Pi Pico W" [2], which has a
section called "Broadcasting a WiFi Network". Then the
article "Raspberry Pi Pico W remote weather station (solar
powered and SoftAP) [3], which we'll delve deeper into for
the "powering PicoGopher" post. Another project by Michael
Horne [4] shows how to create an AP and pilot the on-board
LED through a web page.
All of these tutorials show the same approach, which consists
of creating a WLAN object with AP_IF as a parameter (as
opposed to STA_IF for a simple WiFi device which connects to
an existing AP), then providing essid and password using the
config function, and finally activating the interface with
the active() method:
ap = network.WLAN(network.AP_IF)
ap.config(essid=ssid, password=password)
ap.active(True)
What none of these tutorial shows, however, is how to create
an open WiFi, one that anyone could access without a
password. Nobody is trying to keep this secret, it just
does not make a lot of sense to keep a network open all
time: PicoGopher aside, it is way safer to use a private
WiFi network than a public one, and connecting to random
open WiFis is a no-no from a security standpoint (and
speaking about this, I feel like sharing Kate Bevan's tweet
[5] is the right thing to do here).
Hard times require hard choices though, so I will share the
following with the hope you will do the right thing,
depending on your specific application.
The config() function in micropython allows one to specify
the authorization type for the WiFi AP: the default one is
WPA2 AES [6], but the Pico's SDK docs [7] show what values
you can provide to the "security" parameter to customize
it, and the one for the open network is 0. So if you choose
to have an open Wifi, here is an example showing how to
start your AP:
essid = 'JOIN ¯\_(ツ)_/¯ ME'
ap = network.WLAN(network.AP_IF)
ap.config(essid=essid, security=0)
print('waiting for connection...')
ap.active(True)
print('Connection successfull')
print(ap.ifconfig())
==== Conclusions ====
Now the only thing you need to do is take the latest code
from the github repo, copy the main.py file to your Pico,
disconnect it from your computer and power it with the usb
cable. In a few seconds it will be ready to go... and
connect to!
If you want to customize your PicoGopher's essid, do as I
did and find some inspiration by looking for "ASCII
oneliners" on the Web (or Gopher itself!). And given the
events of this week, I salute you with one that will be
the default essid for this current version of the code
and perfectly summarizes my current state of mind:
╭∩╮(︶︿︶)╭∩╮
P.S. I realised that some of the text above is not shown
properly by all browsers (welcome back 1993!). But I feel
very kind today and instead of just suggesting you to
install a proper gopher, I redirect you to where you can
see it in all its glory:
https://github.com/aittalam/PicoGopher/commit/d618f2f0091542845bd250a0b85141aaa5246cb7
[1] https://pwnagotchi.ai/
[2] https://picockpit.com/raspberry-pi/everything-about-the-raspberry-pi-pico-w/#Broadcasting_a_WiFi_network_SoftAP_access_point
[3] https://picockpit.com/raspberry-pi/raspberry-pi-pico-w-remote-weather-station-solar-powered-and-softap/
[4] https://www.recantha.co.uk/blog/?p=21398
[5] https://twitter.com/katebevan/status/1587019130363846656
[6] https://github.com/raspberrypi/pico-examples/blob/master/pico_w/access_point/picow_access_point.c#L137
[7] https://raspberrypi.github.io/pico-sdk-doxygen/group__cyw43__ll.html#CYW43_AUTH_