Add seeedfarming hackaton. - brcon2025-hackathons - Bitreichcon 2025 Hackathons
 (HTM) git clone git://bitreich.org/brcon2025-hackathons git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/brcon2025-hackathons
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Tags
       ---
 (DIR) commit 050aff722903afb0acc885e88e2ac732e6cb1df4
 (DIR) parent 890a9a8d8c7102eb08c91a134a3af5409148d7ec
 (HTM) Author: Josuah Demangeon <me@josuah.net>
       Date:   Mon, 28 Jul 2025 18:01:57 +0200
       
       Add seeedfarming hackaton.
       
       Signed-off-by: Josuah Demangeon <me@josuah.net>
       
       Diffstat:
         A seeedfarming/README.md              |      91 +++++++++++++++++++++++++++++++
         A seeedfarming/client.sh              |       8 ++++++++
         A seeedfarming/example.py             |      26 ++++++++++++++++++++++++++
         A seeedfarming/forward.sh             |       3 +++
         A seeedfarming/server.sh              |       7 +++++++
         A seeedfarming/session.sh             |      29 +++++++++++++++++++++++++++++
       
       6 files changed, 164 insertions(+), 0 deletions(-)
       ---
 (DIR) diff --git a/seeedfarming/README.md b/seeedfarming/README.md
       @@ -0,0 +1,91 @@
       +# Seeed farm live at: nc bitreich.org 7000
       +
       +Welcome Seeed Farmer!
       +
       +Let me show you the way around:
       +
       +```
       + ((( []  []  [] )))                   .-------.
       +       \  | / _[] )))                 |       |
       +((( []__\ |/ /                        |       |
       +      _\\||_/        ((( usb-wifi----/=======/--------bitreich.org
       +     /______/-----------usb-serial--/=======/
       +     '------'                       ======='
       +
       +ESP32-C3 boards                Laptop doing SSH port forwarding
       +Connected on USB HUB
       +```
       +
       +For you that means visitting bitreich.org on port 7000 and you will
       +be given one gopher seed! You can use that tool to farm the seed:
       +
       +```
       +$ sh client.sh
       +MicroPython df05cae on 2025-07-24; ESP32C3 module with ESP32C3
       +Type "help()" for more information.
       +>>>
       +```
       +
       +That's it fellow farmer! Nature is this generous, you just have to
       +bow down and put down a seed, you'll see a tree growing!
       +
       +## Programming the farm
       +
       +Now you can whisper python runes to the tree, and it might grant
       +your wishes...
       +
       +```
       +>>> from network import WLAN
       +>>> from socket import socket
       +>>> # Connect to WiFi
       +>>> # Connect to Internet APIs
       +```
       +
       +Every seed has an IP address given by DHCP, with a port redirection
       +done on bitreich.org for it:
       +
       +- 192.168.66.3:70 is accessible from bitreich.org:7003
       +- 192.168.66.4:70 is accessible from bitreich.org:7004
       +- 192.168.66.5:70 is accessible from bitreich.org:7005
       +- 192.168.66.6:70 is accessible from bitreich.org:7006
       +- ...
       +- 192.168.66.123:70 is accessible from bitreich.org:7123
       +- 192.168.66.124:70 is accessible from bitreich.org:7124
       +
       +In this repo, you will find the scripts that make maintain the farm:
       +
       +- forward.sh - to maintain the port forwarding
       +- server.sh - that runs session.sh on every incoming connection on port :7000
       +- session.sh - that connects to the seed with python access
       +- client.sh - that's for you! run this and you can send python commands to the seed
       +
       +## Quick-start on MicroPython seed farming
       +
       +The seeds run https://micropython.org/ as a firmware!
       +
       +That way you can run python program directly bare-metal: python is your OS!
       +
       +There is a `example.py` that shows you how you can connect
       +to the farm WiFi and get outta here on the world wide gopher.
       +
       +Every time you connect to the farm with `client.sh`, you will get a new seed.
       +It will be completely reset using `machine.reset()` and you'll be having a
       +fresh new seed to plant!
       +
       +The seeds are boards called Xiao ESP32-C3:
       +https://wiki.seeedstudio.com/XIAO_ESP32C3_Getting_Started/
       +
       +Here, you can use this page to understand how WiFi and network
       +handling works:
       +https://docs.micropython.org/en/latest/esp32/quickref.html#wlan
       +
       +Here, you can lookup the networking functions of MicroPython,
       +which use the same API as Python:
       +https://docs.micropython.org/en/latest/library/socket.html
       +
       +Here, you can see instructions to run a MicroPython simulator
       +on your desktop and connect to Internet with it too:
       +https://github.com/micropython/micropython/tree/master/ports/unix
       +
       +You will have a `micropython` program that you can run to test programs
       +that work just like on the seeds.
 (DIR) diff --git a/seeedfarming/client.sh b/seeedfarming/client.sh
       @@ -0,0 +1,8 @@
       +# Clean the terminal when exiting
       +trap 'stty sane' INT TERM EXIT
       +
       +# Set the terminal in raw mode so that keybindings work
       +stty raw -echo
       +
       +# Connect to the seeed farm!
       +nc -v bitreich.org 7000
 (DIR) diff --git a/seeedfarming/example.py b/seeedfarming/example.py
       @@ -0,0 +1,26 @@
       +# this is an example script that you can load into MicroPython prompt to
       +# connect yourself to the WiFi access point
       +import network, socket
       +
       +wlan = network.WLAN()
       +wlan.active(True)
       +wlan.scan()
       +wlan.connect('seeeder', 'seeedrooots')
       +
       +# Then wait until wlan.isconnected() returns True
       +
       +myip = wlan.ipconfig('addr4')[0]
       +print(myip)
       +
       +# To access internet services:
       +# https://docs.micropython.org/en/latest/library/socket.html
       +
       +s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
       +s.bind((myip, 70))
       +s.listen(9)
       +
       +conn, addr = s.accept()
       +
       +print('Connected with ' + addr[0] + ':' + str(addr[1]))
       +
       +conn.write('hello world!\n')
 (DIR) diff --git a/seeedfarming/forward.sh b/seeedfarming/forward.sh
       @@ -0,0 +1,3 @@
       +ssh -Nv -R 7000:127.0.0.1:7000 \
       + $(for i in $(seq 1 256); do echo -R $(printf 7%03d $i):192.168.66.$i:70; done) \
       + bitreich.org
 (DIR) diff --git a/seeedfarming/server.sh b/seeedfarming/server.sh
       @@ -0,0 +1,7 @@
       +# Default parameters
       +
       +# Change to the current directory to find the session.sh script
       +cd "${0%/*}"
       +
       +# You do not need to run this, but have a look if you are curious
       +s6-tcpserver -v 0.0.0.0 7000 sh session.sh
 (DIR) diff --git a/seeedfarming/session.sh b/seeedfarming/session.sh
       @@ -0,0 +1,29 @@
       +# You do not need to run this, but have a look if you are curious
       +
       +# Initial string sent to reboot the board and start from a clean session every time
       +# Ctrl+C to cancel anything running
       +# Ctrl+B to come back to the normal prompt mode
       +# Then a python script to connect to hardware-reset the board and connect to wifi
       +init="$(printf '\x03\x02'; printf '%s\r' 'import machine' 'machine.reset()')"
       +
       +{
       +        echo "Welcome to the MicroPython Seeed farm!"
       +        for tty in /dev/ttyACM*; do
       +                if pgrep -fal "picocom --quiet --no-escape .* $tty"; then
       +                        echo "- $tty busy"
       +                else
       +                        echo "- $tty free"
       +                fi
       +        done
       +} | sed "s/$/$(printf '\r')/"
       +
       +i=0
       +while [ "$i" -lt 100 ]; do
       +        port=$(printf 1%04d $i)
       +        picocom --quiet --no-escape --initstring="$init" --baud=115200 /dev/ttyACM$i && break
       +        i=$((i + 1))
       +done
       +
       +if [ "$?" != 0 ]; then
       +        echo "Failed to find any MicroPython board available... Ask for a farm fixing the chat!"
       +fi