CupCarbon: para smartcities e rede de sensores (como simular)
A área do IoT (Internet das Coisas) surgiu como a nova geração da Internet, onde os dispositivos passaram a ser inteligentes e a comunicar entre eles. É agora possível controlar ou monitorizar, remotamente, as mais diversas variáveis como, por exemplo, temperatura ambiente, CO2, tráfego de uma cidade, nível de humidade, etc.
Depois de apresentarmos o Simulador CupCarbon vamos aprender a usá-lo.
Esta segunda parte do artigo é dedicada à programação dos nodes e sink da rede mesh já pré-configurada na primeira parte (Ver AQUI) e isso com um algoritmo simples (flooding). Um grande problema deste algoritmo é que ele gera um grande número de pacotes duplicados na rede, mas é de simples implementação.
Utilizaremos também o simulador CupCarbon para análise dos resultados obtidos.
“Programar” em SenScript
O CupCarbon permite configurar cada agente do simulador utilizando ficheiros script para programar as suas interações. Tais arquivos descrevem como um agente vai comunicar com os seus vizinhos e/ou com o seu ambiente. Contém todas as principais acções a serem executadas por um sensor durante a simulação.
Os scripts permitem variáveis não declaradas e sem tipo, mas podem ser inicializadas (com comando set). Para as variáveis string, não é necessário utilizar as aspas. Uma variável é utilizada pelo seu nome e o seu valor é determinado por $ - saber mais aqui.
Lista de comandos
Código SINK(Gateway)
VAR node: inteiro (aleatório) count: inteiro d: array INICIO ENVIA pedido inicial aleatório ESPERAR por mensagem no máximo 300000 ms INCREMENTAR contador LER mensagem SE mensagem for do TIPO B ENTÃO receber nova temperatura ENVIAR mensagem para reiniciar NODES FIM //permite enviar novo pedido se o anterior não teve resposta SE contador for maior que 20 ENTÃO REINICIAR contador ENVIAR mensagem para reiniciar NODES ESPERAR 2000 ms ENVIAR pedido de nova temperatura FIM FIM ALGORITMO |
A implementação deste algoritmo produziu o seguinte senScript. Repare que o gateWay vai receber Temperatura de node de forma aleatória. É enviado um pedido para um Node específico e o gateway espera pela resposta. Se a resposta não chegar em tempo útil (Nodes está offline por falha de bateria ou outro problema, ou já não existe na rede) o gateway irá enviar um novo pedido a outro Node escolhido de forma aleatória.
SenScript (sink)
atget id id randb node 10 20 set count 0 data d $id A $node send $d loop wait 300000 read m rdata $m rid type x y inc count if ($type==B) simulation 0 100 mark 1 println N: $count TEMP: $x data r $id R $node send $r end if($count>20) set count 0 data r $id R $node send $r delay 2000 randb node 10 20 data d $id A $node send $d end |
Código NODE (unificado para todos os Nodes)
O código para os nodes é um pouco mais complexo porque se pretendeu nesta abordagem, unificar o mesmo. Todos os nodes têm o mesmo código e não scripts diferentes para cada um deles.
Var recA: int id: inteiro INICIO ESPERAR por mensagem LER mensagem SE mensagem for do TIPO R e recA for 1 ENTÃO DESMARCAR o sensor REINICAR recA IDENTIFICAR id do nó anterior ENVIAR mensagem de RESET para todos FIM SE mensagem for do TIPO A e recA for 0 ENTÃO INICAR recA com 1 SE id de destino for id atual ENTÃO MARCAR Node LER sensor temperatura ENVIAR mensagem com Temperatura para todos SE NÃO ENTÃO IDENTIFICAR id do nó que enviou ENVIAR mensagem recebida para os seguintes FIM FIM SE mensagen for tipo B ENTÃO MARCAR sensor ENVIAR mensagem PARA node ANTERIOR FIM FIM ALGORITMO |
A implementação do algoritmo originou O script SenScript seguinte. Repare que aqui a mensagem de RESET e de PEDIDO é enviada em broadcast para todos os nodes. Mas receber informação é passada unicamente para o node anterior (até chegar ao gateway que pediu a mensagem... ). São utilizados mais recursos no envio, mas menores ao receber.
SenScript (node):
atget id id set recA 0 loop wait read m rdata $m rid type info info2 if(($type==R) && ($recA==1)) mark 0 set recA 0 set prev $rid data r $id R $info send $r end if(($type==A) && ($recA==0)) set recA 1 if($info==$id) mark 1 //ENVIA temperatura areadsensor x rdata $x a b c //println TEMP ENVIADA: $c data d $id B $c send $d $rid else set prev $rid data d $id A $info send $d end end if($type==B) simulation 0 100 mark 1 data d $id B $info $info2 send $d $prev end |
Resultados
Na configuração inicial obtemos todas as temperaturas dos 7 nodes. A figura 2 mostra a simulação deste algoritmo de comunicação.
https://cdn-images-1.medium.com/max/2400/1*WJtMsDxo4JXHfGQpFay4vw.gif
É visível como nodes não diretamente ligados à gateway conseguem enviar a temperatura e o gateway efetivamente receber a mesma. Esta implementação simples pode ser utilizada em muitos mais nodes. Na figura 3 pode ver a simulação com uns 20 nodes e uma gateway. O mesmo código.
Da leitura da documentação é dito ser possível utilizar JAVA ou Python para programar as simulações. Para isso deve ser alterado o código fonte do simulador, pode encontrar o mesmo no GitHub.
É também possível simular o consumo da bateria dos sensores. Ou até mesmo simular o carregamento das baterias por painel solar, simulando as horas de sol e a sua intensidade.
https://cdn-images-1.medium.com/max/2400/1*mW1CarjUmZr3xlOgnpg3wQ.gif
Os nodes por onde o pedido da temperatura “passa”, são marcados; para visualmente ser possível acompanhar o trajeto até à gateway.
Muitos mais nodes!!!
https://cdn-images-1.medium.com/max/2400/1*g2kxNHdL1bXWXz9IsiEP-w.gif
CONCLUSÃO
CupCarbon revelou-se um simulador excelente para testar novos algoritmos de comunicação (simples ou complexos). Com todas as funcionalidades necessárias aos testes que pretendemos realizar. Simples de instalar, com uma documentação bastante boa e com exemplos práticos disponíveis no site (AQUI).
O site dispõe igualmente de um fórum, mas é muito pouco frequentado. O melhor é mesmo ler o PDF e abrir os exemplos.
Leia também...
Este artigo tem mais de um ano