---------------------------------------- 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_