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.