djo

Builds e IoT

O djo é um binário único, sem dependências e sem CGO. Dá para compilar versões menores, tirando o que o dispositivo não usa. Cada versão é um perfil:

PerfilTemTamanhoComo
fulllinguagem, servidor web, SQLite, Http.get~11 MBpadrão
litelinguagem, servidor web, Http.get~7 MB-tags nodb
noweblinguagem, SQLite, Http.get~7,5 MB-tags noweb
tinylinguagem e Http.get/post (só saída)~7 MB-tags "nodb noweb"
nanosó a linguagem, sem rede nenhuma~3 MB-tags "nodb noweb nonet"

Em todos os perfis existem: a linguagem inteira (structs, interfaces, mapas, for...), Json, Time, Hash, File, Serial, templates (djo arquivo.djo.html) e o REPL.

Recursofulllitenowebtinynano
djo serve, Http de entrada, Session, uploadsimsimnãonãonão
Db (SQLite)simnãosimnãonão
Http.get, Http.post... (saída)simsimsimsimnão

O que pesa: o SQLite custa uns 4 MB, o servidor web uns 3,5 MB, e o suporte a HTTPS/rede uns 3,6 MB. O nano tira tudo isso.

Usar um recurso que o perfil não tem dá um erro claro: erro (linha 3): Db não está incluído neste build (compilado com -tags nodb) (Http.get, no nano, avisa o mesmo com -tags nonet).

Para saber qual você tem: djo version.

$ djo version
djo (perfil tiny) linux/arm64 — servidor web: não, banco SQLite: não, Http.get/post: sim

Compilando

O script build.sh na raiz do projeto cuida de tudo (precisa do Go instalado):

./build.sh                       # full, para esta máquina
./build.sh tiny                  # tiny, para esta máquina
./build.sh lite linux/arm64      # perfil e destino
./build.sh iot                   # tiny para as placas mais comuns
./build.sh iot nano              # o mesmo, no perfil nano (3 MB)

Os binários vão para dist/, já sem símbolos de depuração (-ldflags "-s -w").

./build.sh iot gera (cada arquivo tem de 6,5 a 7 MB no tiny, ou uns 3 MB no nano):

ArquivoPara quê
djo-tiny-linux-armv6Raspberry Pi Zero/1 e placas ARM antigas
djo-tiny-linux-armv7Raspberry Pi 2/3, BeagleBone
djo-tiny-linux-arm64Raspberry Pi 3/4/5, Orange Pi
djo-tiny-linux-mipsleroteadores OpenWrt (MediaTek)
djo-tiny-linux-mipsroteadores OpenWrt (Atheros)
djo-tiny-linux-riscv64placas RISC-V
djo-tiny-linux-386x86 de 32 bits

Sem o script, o comando equivalente é:

CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -trimpath -ldflags "-s -w" -tags "nodb noweb" -o djo .

Copie o binário para o dispositivo (scp dist/djo-tiny-linux-arm64 pi@placa:djo) e rode ./djo programa.djo. Não precisa instalar mais nada nele.

Um programa para IoT

// sensor.djo: monta a leitura e envia para o servidor
map leitura = {"sensor": "sala", "temp": 23.5, "hora": Time.now:}

var r = Http.post:"http://192.168.0.10:8080/leituras":leitura
if
    cond[not r["ok"]]
    print "não enviou: " + (r["error"] ?? str:r["status"])

Dica: em placas minúsculas, prefira http:// para a rede local. Para https:// o djo usa os certificados do sistema (/etc/ssl/certs), que alguns Linux embarcados, como o OpenWrt, não trazem instalados.

O que mais é preciso para IoT

Para falar com sensores e placas, veja Hardware: serial e tempo: Serial, Time.sleep e Time.ms. Eles existem em todos os perfis. Ainda não existe acesso direto a GPIO, I2C e SPI.