Documentação
O Meshbell é um instrumento de emergência à escala do bairro. A verificação é o alicerce, não uma funcionalidade. Esta página diz como, e onde estão os limites.
Visão geral
No Meshbell, um aviso de perigo é um pequeno registo assinado. É nomeado pelo hash dos seus próprios bytes, assinado com uma chave de dispositivo, e nunca alterado. Uma correção é um registo novo que aponta para o antigo, o que permite que um aviso e a sua correção viajem juntos e permite que qualquer dispositivo volte a verificar tudo o que recebe.
O seu telefone tem duas ligações, e nenhuma precisa de internet
É este todo o modelo de conexão, e o separador Conexão da aplicação é onde vê as duas.
| Ligação | O que alcança | Como começa |
|---|---|---|
| Bluetooth | Um rádio de bolso: um nó LoRa companheiro que traz consigo. É a única forma de um telefone entrar no ar, porque nenhum iPhone tem um rádio LoRa lá dentro. | Toque em Conexão. Uma procura gasta bateria e reserva o rádio em exclusivo, por isso é uma pessoa que a inicia, nunca a aplicação. |
| Wi-Fi | Uma ponte do bairro: uma caixa sempre ligada na rede local, que guarda o registo e o serve a telefones e navegadores. | Automaticamente ao arrancar. A aplicação procura uma ponte no Wi-Fi em que estiver, e há um campo de endereço manual para as redes que bloqueiam a deteção. |
As duas ligações alimentam um só diário e um só porta-chaves. Um registo que chega pelo ar e outro que chega por Wi-Fi caem no mesmo diário e recebem a mesma verificação. Desligar o rádio não trava a receção pela ponte, porque são caminhos separados para o mesmo sítio.
Tudo o que está acima da rede está construído de forma a que perder uma ligação, um servidor ou um modelo lhe custe uma anotação, nunca o alerta.
O modelo de confiança
O Meshbell mantém duas perguntas separadas, porque são factos diferentes e é ao confundi-los que a má informação se espalha.
| Pergunta | O que responde | O que pode dizer |
|---|---|---|
| Que registo é este, e está intacto? | O endereço de conteúdo e a verificação da assinatura, ambos executados no seu dispositivo | vinculado · pré-visualização · alterado |
| Quem o assinou, e posso verificar? | O porta-chaves do seu dispositivo | verificado · não é possível verificar · falsificado |
O segundo eixo tem deliberadamente três valores. Uma falsificação, verificada contra uma chave que possui e que falhou, não é o mesmo facto que uma chave desconhecida, para a qual ainda não há forma de verificar quem assinou. Juntá-los numa só palavra, «inválido», esconderia exatamente a distinção de que uma pessoa precisa. Uma mensagem só é guardada como fiável quando o porta-chaves diz verificado.
Verificado a partir do ar, sem cópia prévia
Uma trama de rádio curta é uma pré-visualização: um ponteiro para um registo, mostrado mas nunca tratado como fiável e nunca usado para inventar um corpo. Um registo também pode ser enviado por inteiro como um envelope autoautenticado, dividido por várias tramas e reagrupado do outro lado. Um dispositivo que nunca viu o registo antes pode então reconstruí-lo, voltar a derivar o seu endereço de conteúdo e verificar a assinatura, chegando a um veredicto verificado num bairro puramente de rádio, sem internet em ponto nenhum do circuito.
As tramas chegam sem autenticação por LoRa, e os fragmentos de um registo dividido não estão assinados em trânsito. Só o registo reagrupado é verificado. Um grupo incompleto di-lo e continua a ser uma pré-visualização.
A barreira de instruções
A única coisa que uma aplicação de emergência nunca pode fazer é transformar um rumor numa ordem. O Meshbell impõe isso na estrutura do código, não por disciplina de revisão.
- O ecrã que apresenta uma instrução, ou seja, o que fazer, não pode ser construído a partir de uma mensagem não verificada. O sistema de tipos recusa-o.
- O texto de orientação vem de um manual incluído na aplicação, versionado e indexado por identificador. Nunca vem de texto livre transmitido pelo ar e nunca de um modelo de linguagem. Um modelo pode resumir uma situação, em prosa, etiquetada como inferida. Não tem nenhum campo onde pôr um comando.
- Um alerta oficial retransmitido é mostrado como um vizinho a dar a cara, não como oficial. O veredicto di-lo por palavras: alerta oficial retransmitido, não tratado aqui como oficial.
A promessa, numa linha. A aplicação nunca transforma um rumor numa instrução, e essa frase é uma propriedade do código e não uma declaração de intenções.
A camada de coordenação
Os alertas verificados respondem ao que está a acontecer e a se pode confiar nisso. Um bairro em emergência tem também logística vulgar: quem está localizado, onde fica o abrigo, quem tem um gerador. O Meshbell transporta uma segunda camada, deliberadamente separada, para esse trabalho, nativa no separador Bairro da aplicação e num navegador para quem não tiver a aplicação.
Esta camada é não verificada por conceção. Não é endereçada por conteúdo, não é assinada, e não faz parte do canal verificado dos alertas. É estado partilhado mutável que os vizinhos escrevem e editam, por isso trate-a como um papel colado numa porta. A barreira de instruções mantém-se: nada aqui pode ser apresentado como instrução oficial, e o modelo de confiança acima rege apenas os alertas.
O que contém
| Superfície | O que é | Forma de privacidade |
|---|---|---|
| Lista de presenças em segurança | Marcação de presença «Estou em segurança» com um só toque. Toda a gente vê uma contagem agregada face a um total aproximado de agregados. | Sem nomes, moradas ou localizações, e sem lista nominativa. A contagem é retida até um punhado de pessoas ter marcado presença, para que não seja possível inferir um único agregado. |
| Listas de recursos | Listas partilhadas e editáveis: abrigo e aquecimento, água e provisões, energia e carregamento, e um «quem pode ajudar» de inscrição própria. Os itens podem levar uma etiqueta de lugar. | Qualquer pessoa na ponte pode acrescentar ou editar. Só inscrição própria. Ninguém é acrescentado por outra pessoa. |
| Quadro de avisos | Mensagens curtas marcadas com um canal (informação, oferta, pedido, pergunta) e filtradas pelo tempo que têm, publicadas com um nome que escreve. | O nome que escrever. Sem conta, sem identidade verificada. |
| Instantâneo imprimível | Uma página /coord/print com a lista de presenças, as listas e o quadro mais recente, para quando as baterias acabarem. | A mesma lista de presenças só agregada, por isso é seguro colá-la num quadro físico. |
Porque é mantida à parte
Misturar notas mutáveis de vizinhos num diário de alertas assinado e apenas de acrescento estragaria os dois. Por isso o armazenamento de coordenação é uma coisa à parte: só de rede local, mutável, e servido pela ponte ao lado dos alertas verificados em vez de dentro deles. Um operador guarda um token de administração para arrumações, como limpar dados de teste ou podar um quadro descontrolado, e as rotas de administração falham fechadas sem ele. Publicar e marcar presença não precisam de credencial nenhuma. As duas camadas partilham um ecrã, nunca uma fronteira de confiança.
Funcionamento offline
A degradação é o estado esperado, não um erro. Quando um caminho de dados está em baixo, o Meshbell serve os últimos dados bons conhecidos etiquetados com a idade que têm, «de há 40 minutos», em vez de um vazio de aparência segura. O nível zero de modelo, um telefone antigo sem nada de esperto lá dentro, é um nível de produto de primeira classe. Uma aplicação de emergência que só funciona no equipamento mais recente falha com as pessoas que mais provavelmente vão precisar dela.
A receção funciona enquanto a aplicação estiver aberta. O Meshbell não escuta em segundo plano nem depois de ser fechado, e não vai afirmar que o faz.
Rádios e equipamento
O Meshbell funciona só no seu telefone. Os rádios alargam o alcance quando a rede está em baixo. Uma rede em malha do bairro constrói-se com equipamento LoRa barato e comum, a correr o firmware aberto MeshCore.
| Peça | Custo | Função |
|---|---|---|
| Um rádio LoRa companheiro, por exemplo um nó Heltec | ~$30 | O seu telefone emparelha com ele por Bluetooth para enviar e ouvir boletins. Um companheiro serve um telefone de cada vez. Se outro telefone ou outra aplicação o estiver a usar, o seu é informado com clareza em vez de ficar a rodar. |
| Mais rádios pelo bairro | ~$30 cada | Cada um é um salto, e cada um repete um registo uma vez e depois para, para que o ar continue livre. Três ou mais começam a dar um alcance real de vários saltos, entre quarteirões e cristas. |
| Uma ponte sempre ligada, normalmente um Raspberry Pi | ~$50-80 | Guarda um diário durável e serve-o por Wi-Fi local na port 4190. Usa uma ligação à internet quando existe, e não precisa de nenhuma. |
Definições de rádio nos EUA. A bancada de referência do Meshbell corre a 910.525 MHz, bw 62.5 kHz, sf7, cr 4/5, dentro da banda livre de licença 902-928 MHz, com um envelope de ligação companheira de 172 B. Releia sempre a configuração do seu rádio antes de transmitir. O valor por omissão da região pode ser uma banda que não está licenciado para usar.
Bandas de rádio por região
O seu telefone não tem nenhum rádio LoRa lá dentro, por isso nunca toca na banda. É o firmware do próprio rádio que detém essa definição. O Meshbell relê a sintonia do rádio quando se conecta, mostra-a, e diz com clareza quando o rádio não está no canal que a sua região usa.
910.525 MHz é a estação norte-americana. Cada região abaixo tem o seu próprio canal, colocado dentro da banda livre de licença que essa região permite. Onde a comunidade MeshCore publica um canal recomendado para um país, o Meshbell adota esse canal e as suas definições tal e qual, para que os repetidores MeshCore já instalados aí possam transportar boletins Meshbell. Onde a comunidade não publicou nenhum, o Meshbell escolhe um canal que fica afastado da parte mais movimentada da banda.
| Região | Banda | Canal Meshbell | Ciclo de utilização ou escutar antes de transmitir |
|---|---|---|---|
| Estados Unidos e Canadá | 902-928 MHz | 910.525 MHz | Sem limite de ciclo de utilização, por isso uma ponte pode emitir tantas vezes quantas precisar. Até 36 dBm, antena incluída. Esta é a recomendação do próprio MeshCore para os Estados Unidos e o Canadá, por isso os repetidores MeshCore já existentes aqui podem transportar boletins Meshbell. |
| Europa e Reino Unido | 869.4-869.65 MHz | 869.618 MHz · sf8 · cr 4/8 | Ciclo de utilização de 10%, cerca de seis minutos de tempo de emissão por hora. Até 29 dBm. O Reino Unido aplica os mesmos limites, por isso não há uma definição separada para ele. Esta é a recomendação do próprio MeshCore para a Europa e o Reino Unido, por isso os repetidores MeshCore já existentes aqui podem transportar boletins Meshbell. |
| República Checa | 869.4-869.65 MHz | 869.432 MHz | O mesmo ciclo de utilização de 10% e o mesmo teto de 29 dBm que na Europa, num canal só dela. Esta é a recomendação do próprio MeshCore para a República Checa, por isso os repetidores MeshCore já existentes aí podem transportar boletins Meshbell. |
| Países Baixos | 869.4-869.65 MHz | 869.618 MHz | O mesmo ciclo de utilização de 10% e o mesmo teto de 29 dBm que na Europa. Esta é a recomendação do próprio MeshCore para os Países Baixos, por isso os repetidores MeshCore já existentes aí podem transportar boletins Meshbell. Partilha a frequência da Europa mas corre com os valores por omissão sf7 e cr 4/5, por isso os dois não se ouvem, mesmo na mesma frequência. |
| Portugal | 869.4-869.65 MHz | 869.618 MHz · cr 4/6 | O mesmo ciclo de utilização de 10% e o mesmo teto de 29 dBm que na Europa. Esta é a recomendação do próprio MeshCore para Portugal, por isso os repetidores MeshCore já existentes aí podem transportar boletins Meshbell. Partilha a frequência da Europa mas corre em sf7 e cr 4/6, por isso os dois não se ouvem, mesmo na mesma frequência. |
| Austrália | 915-928 MHz | 916.575 MHz · cr 4/8 | Sem limite de ciclo de utilização. Até 30 dBm. Aqui a banda começa em 915 MHz, por isso o canal norte-americano não é legal. Esta é a recomendação do próprio MeshCore para a Austrália, por isso os repetidores MeshCore já existentes aí podem transportar boletins Meshbell. |
| Nova Zelândia | 915-928 MHz | 917.375 MHz | Sem limite de ciclo de utilização. Até 30 dBm. Também aqui a banda começa em 915 MHz, por isso o canal norte-americano não é legal. Esta é a recomendação do próprio MeshCore para a Nova Zelândia, por isso os repetidores MeshCore já existentes aí podem transportar boletins Meshbell. |
| Brasil | 915-928 MHz | 923.125 MHz · sf8 · cr 4/8 | Sem limite de ciclo de utilização. Até 30 dBm. Esta é a recomendação do próprio MeshCore para o Brasil, por isso os repetidores MeshCore já existentes aí podem transportar boletins Meshbell. |
| Sudeste Asiático | 920-923 MHz | 921.875 MHz | Ciclo de utilização de 10% no país mais restritivo do grupo. Até 17 dBm. Uma definição agrupada para a Tailândia, Singapura, a Malásia e a Indonésia, por isso verifique o seu próprio país antes de deixar uma ponte a funcionar. A comunidade não publica nenhum canal para estes países, por isso este é do próprio Meshbell, escolhido afastado da parte mais movimentada da janela. |
| Vietname | 920-923 MHz | 920.25 MHz · sf8 | Ciclo de utilização de 10%. Até 17 dBm, e as regras aqui mudam, por isso verifique as atuais antes de deixar uma ponte a funcionar. Esta é a recomendação do próprio MeshCore para o Vietname, por isso os repetidores MeshCore já existentes aí podem transportar boletins Meshbell. |
| Índia | 865-868 MHz | 866.5 MHz | Ciclo de utilização de 1%, cerca de 36 segundos de tempo de emissão por hora. Até 16 dBm. O rádio não consegue manter-se sozinho num limite tão apertado, por isso é a ponte que se tem de racionar. A comunidade não publica nenhum canal para a Índia, por isso este é do próprio Meshbell, escolhido afastado da parte mais movimentada da banda. |
| Coreia do Sul | 920.9-923.3 MHz | 921.4 MHz | Sem limite de ciclo de utilização, mas o rádio tem de escutar antes de transmitir. Até 23 dBm. |
| Japão | 920.6-928 MHz | 924.6 MHz · bw 125 kHz | Ciclo de utilização de 10% e uma escuta antes de cada transmissão. Até 16 dBm. É a largura de banda maior que mantém uma emissão curta o suficiente para as regras do Japão. |
| Rússia | 864-865 MHz | 864.5 MHz | Ciclo de utilização de 0.1%, cerca de 3.6 segundos de tempo de emissão por hora, a não ser que o rádio escute antes de transmitir. Até 16 dBm. |
Salvo indicação em contrário na linha, um canal corre em sf7, cr 4/5 e bw 62.5 kHz. Uma linha que segue um canal MeshCore leva o que esse canal usar, e é por isso que várias mostram um fator de espalhamento ou uma taxa de codificação diferentes, e o Japão corre em bw 125 kHz para caber nas regras japonesas. Dois rádios só se ouvem quando a frequência, a largura de banda, o fator de espalhamento e a taxa de codificação coincidem todos.
Os rádios vêm em duas famílias, uma talhada para 902-928 MHz e outra para 863-870 MHz, e entre as duas cobrem todas as regiões desta lista, mas a banda de 470 MHz da China precisa de um chip de rádio diferente e de uma antena diferente, por isso não é uma definição para a qual se possa mudar.
Três regiões não estão prontas. O Japão, a Coreia do Sul e a Rússia esperam um rádio que escute antes de transmitir, e o firmware MeshCore ainda não o faz, por isso essas três ficam desligadas até que o faça. Uma região traz também um teto de potência, e a potência é uma definição separada no rádio, por isso mudar de canal não é o mesmo que baixar a potência. Releia sempre a configuração do seu rádio antes de transmitir.
Configurar uma ponte
Uma ponte é um nó sempre ligado na rua, normalmente um Raspberry Pi, que transporta os alertas verificados e a camada de coordenação por Wi-Fi local para que o telefone ou o navegador de cada vizinho lhes chegue sem rede móvel e sem internet. É a segunda das duas ligações do telefone: o Bluetooth alcança um rádio de bolso, o Wi-Fi alcança uma ponte, e qualquer uma funciona sem internet nenhuma.
Se for o anfitrião, um vizinho preparado
O instalador vem incluído na aplicação e é exportado diretamente do seu telefone, por isso não se descarrega nada. Descompacte-o no Pi, corra o script de instalação, e ele mostra o endereço para distribuir. O nó arranca autossuficiente: serve os ecrãs de coordenação, uma aplicação web instalável para os vizinhos que só têm navegador, um código QR desse endereço, e uma vista de administração para arrumações. Anuncia-se na rede local como _meshbell._tcp, e é a aplicação que faz a descoberta. Não há nada para configurar à mão e nenhuma conta para criar.
Se for um vizinho que nunca ouviu falar de uma rede em malha
Ligue-se ao Wi-Fi da rua e abra o separador Bairro. A aplicação procura a ponte sozinha e conecta-se. Quando a deteção precisa de ajuda, faz as perguntas simples, se esta é a rede certa e se a ponte está acordada, e oferece um campo de endereço manual. Se um computador consegue alcançar a ponte mas este telefone não, é quase sempre porque os dois estão em redes Wi-Fi diferentes.
A ponte entrega, nunca decide. Uma ponte pode passar adiante um alerta verificado, mas não pode torná-lo verdadeiro. As assinaturas são verificadas no seu próprio dispositivo e, num navegador simples, são verificadas nesse navegador. Uma ponte comprometida ou maliciosa pode largar ou atrasar mensagens. Nunca pode forjar uma mensagem fiável. É por isso que o modelo de confiança vive no telefone e não no nó.
Arquitetura
A lógica de domínio é pura e portável. Compila e é testada num Raspberry Pi sem equipamento da Apple no circuito, por isso as partes que decidem se uma mensagem é de confiança são verificadas continuamente e não apenas na altura de lançar. A aplicação iOS é um apresentador fino por cima dela.
- JSON canónico, com chaves ordenadas e ASCII fixo, dá a cada dispositivo uma pré-imagem idêntica byte a byte, de modo que um endereço de conteúdo calculado num telefone corresponde a um calculado num nó.
- Ed25519 para assinar e verificar, uma só implementação em Apple e Linux.
- Um diário apenas de acrescento, só de inserção. Os registos nunca são atualizados nem apagados, por isso o histórico, incluindo as correções, é preservado e pode voltar a ser verificado.
- Um controlo de conformidade entre linguagens: as mesmas tramas são descodificadas pela aplicação e por um nó Python independente e comparadas byte a byte, para que as duas não possam divergir em silêncio.
Limites assumidos
Dito com clareza, porque uma ferramenta de emergência que se sobrevende é perigosa.
- O Meshbell é uma beta inicial. Já transportou um boletim assinado através de rádios LoRa reais e verificou-o num telefone. Não substitui os serviços de emergência oficiais, por isso mantenha ativados os alertas que já tem.
- O que está provado em bancada é um único salto. A retransmissão de vários saltos está concebida e implementada, ainda não medida no terreno, e nenhum número de distância neste sítio foi medido em bancada.
- Os registos grandes demais para uma trama são divididos, e ainda não se observou em bancada o reagrupamento de vários fragmentos a concluir-se no telefone. Um grupo incompleto continua a ser uma pré-visualização e di-lo.
- As chaves de assinatura vivem no porta-chaves do iOS, só neste dispositivo. São extraíveis por qualquer coisa que já consiga ler o porta-chaves da aplicação. Não há aqui proteção por enclave de hardware e não vamos afirmar que há.
- Os registos são assinados, não cifrados. O Meshbell não é mensagens privadas. Parta do princípio de que tudo o que vai para o ar pode ser lido por qualquer pessoa ao alcance.
- A distribuição de chaves, ou seja, como o seu dispositivo aprende que chave pública pertence a quem, é trabalho em curso. Uma assinatura prova a posse de uma chave. Ligar uma chave a uma pessoa real é um problema separado e deliberado, resolvido hoje pelo encontro em pessoa.
- A receção só funciona enquanto a aplicação estiver aberta. Não há escuta em segundo plano.
- A camada de coordenação é não verificada por conceção e separada do canal verificado dos alertas assinados. É útil para a logística, nunca uma fonte de instrução oficial, e é só de rede local, por isso alcança quem estiver na ponte e não a rede em malha mais larga.
- O Meshbell não interopera hoje com rádios Meshtastic pelo ar.