• Nenhum resultado encontrado

Configurações Gerais dos Módulos e Funções do Protocolo MiWi

No documento 2011.1 RelatorioTCCLintonVFinal (páginas 40-45)

2 FUNDAMENTAÇÃO TEÓRICA

3.3 Projeto de Software

3.3.1 Configurações Gerais dos Módulos e Funções do Protocolo MiWi

Como ambos os módulos possuem uma arquitetura semelhante, existem algumas configurações que são compartilhadas. Dentre elas podemos destacar as funções de configuração do hardware do microcontrolador e do protocolo MiWi. As figuras 17 e 18 ilustram o fluxograma desse processo de configuração dos módulos da base e da estação, respectivamente.

Início

BoardInit() ConsoleInit() ConfigurarHardwareModulo()

MiApp_ProtocolInit (FALSE); MiApp_SetChannel (myChannel) MiApp_ConnectionMode (ENABLE_ALL_CONN) i=MiApp_EstablishConnection (0xFF, CONN_MODE_DIRECT) MiApp_StartConnection( START_CONN_DIRECT, 10, 0) i == 0xFF sim Fim Configuração não

Figura 17 - Processo de configuração do hardware e do protocolo MiWi no coordenador. Fonte: Próprio Autor

Início

BoardInit() ConsoleInit() ConfigurarHardwareModulo()

MiApp_ProtocolInit (FALSE); MiApp_ConnectionMode (ENABLE_ALL_CONN) sim i=MiApp_EstablishConnectio n(0xFF, CONN_MODE_DIRECT) i == 0xFF sim nao Fim Configuração MiApp_SetChannel (myChannel) não Fim do programa

Figura 18 - Processo de configuração do hardware e do protocolo MiWi na Estação. Fonte: Próprio Autor

A primeira função executada após a inicialização dos módulos é a “BoardInit()” que é a encarregada de configurar as portas de entrada e saída do microcontrolador, comunicação SPI com o módulo RF e o Watch Dog Timer (WDT). Logo após sua execução a função “ConsoleInit()” é acionada, e as configurações da comunicação USART são selecionadas:

1. Baud Rate – 9600; 2. Bits de dados – 8; 3. Sem paridade; 4. Bit de parada – 1; e 5. Sem controle de fluxo.

Em seguida é iniciado o processo de configuração do protocolo MiWi. Um fator decisivo para o cumprimento de forma eficiente desse processo, foi a utilização das rotinas presentes no MiApp (YANG, 2009a). Esse framework disponibiliza diversas funções que facilitam o processo de configuração e manipulação do protocolo.

A primeira executada entre elas é a “BOOL MiApp_ProtocolInit(BOOL

bNetworkFreezer)”, responsável por inicializar a pilha do protocolo. Essa função possui um

único parâmetro de entrada que define se configurações prévias serão carregadas (TRUE) ou se a pilha será iniciada do zero (FALSE) (YANG, 2009a). Nesse projeto, a função foi chamada com o parâmetro FALSE.

Logo após, é feita uma chamada à função “BOOL MiApp_SetChannel(BYTE

Channel)”, que configura o canal de comunicação a ser utilizado (YANG, 2009a). Como no

projeto não foi utilizado a funcionalidade de detecção automática de canal, seu valor foi configurado para o canal 25, que é o canal padrão do MiWi DE. Caso durante o processo de configuração do canal ocorra um erro, uma mensagem é exibida e a execução do programa interrompida. Caso a seleção do canal tenha sido realizada com sucesso, é feita uma chamada à função “void MiApp_ConnectionMode(BYTE Mode)” (YANG, 2009a) que configura o modo de conexão a ser utilizado. Essa função pode receber quatro tipos de parâmetros:

 ENABLE_ALL_CONN

o Habilita qualquer tentativa de conexão;  ENABLE_PREV_CONN

o Habilita apenas conexões que já existiram;  ENABLE_ACTIVE_SCAN_RSP

o Configura o módulo para responder a qualquer active scan recebido;  DISABLE_ALL_CONN

o Desabilita todas as requisições de conexão.

No projeto, por apresentar uma alternativa mais simples, o parâmetro escolhido foi o ENABLE_ALL_CONN.

A próxima função executada é a “BYTE EstablishConnection(BYTE

ActiveScanIndex, BYTE Mode)”. Ela recebe como parâmetros de entrada o índice na tabela

resultante do active scan para o nó que se deve estabelecer uma conexão, se seu valor for “0xFF” ela tentará estabelecer uma conexão com qualquer dispositivo. O parâmetro “mode” especifica o modo de conexão: “MODE_DIRECT”, usado quando o dispositivo destino está no alcance do rádio, ou “MODE_INDIRECT”, para estabelecer a conexão indiretamente através de outros nós. Após ser chamada, essa função retorna um byte indicando o índice da nova conexão na tabela de conexões, quando seu valor é 0xFF significa que não foi possível estabelecer uma conexão (YANG, 2009a).

No projeto, como a rede foi construída com apenas um nó, foram utilizados os parâmetros 0xFF e “MODE_DIRECT” (YANG, 2009a). No entanto, existe uma pequena diferença entre a chamada dessa função entre o coordenador e a estação remota. No coordenador, ela é chamada apenas uma vez, e caso o valor de retorno seja 0xFF a função “StartConnection()” é acionada (Figura 17). Já na estação, enquanto o valor de retorno não for diferente de 0xFF ela é chamada constantemente (Figura 18). Em ambos os módulos, quando se tem uma chamada bem sucedida da função “EstablishConnection()”, o processo de configuração dos módulos é finalizado.

A função “BOOL StartConnection(BYTE Mode, BYTE ScanDuration, DWORD

ChannelMap)”, acionada pela base, recebe três parâmetros de entrada (YANG, 2009a):

 Mode

o Identifica o modo de iniciar a PAN;  ScanDuration

o Define o tempo máximo de execução da avaliação do canal;  ChannelMap

o Identifica os canais a serem escaneados no processo.

Na base, o campo “Mode” é definido como “START_CONN_DIRECT”, para que a conexão seja estabelecida sem a detecção de ruído. O campo “ScanDuration” foi colocado em 10, o que equivale a um tempo de 1 segundo de acordo com a equação: ScanTime(us) =

configurado como “START_CONN_DIRECT”, o parâmetro “ChannelMap” é automaticamente descartado (YANG, 2009a).

Com a realização dessas funções, o processo de configuração do hardware e do protocolo MiWi nos módulos está finalizado. A partir desse ponto, ambos os módulos entram em um laço para execução de suas rotinas especificas. No entanto, as operações de envio e recepção de dados via rádio realizadas durante esse laço não mudam entre os módulos. Sendo assim, não existe motivo para essas operações serem abordadas de forma separada.

A cada iteração do laço principal do programa, é acionada a função “MiApp_MessageAvailable()”. Essa função retorna verdadeiro sempre que for recebida uma nova mensagem de um dos nós da rede.

Toda vez que uma nova mensagem é recebida, o MiApp automaticamente organiza o seu conteúdo em um struct do tipo “RECEIVED_MESSAGE” (Figura 19). Nessa estrutura, estão contidas informações importantes como os bytes de configuração da mensagem, o endereço de origem e o payload da mensagem. Por padrão, o MiApp já cria a variável “rxMessage” do tipo “RECEIVED_MESSAGE”.

Figura 19 - Struct RECEIVED_MESSAGE. Fonte: Próprio Autor

Dessa forma, após a detecção de uma nova mensagem, é possível acessar a todas as informações recebidas através da variável “rxMessage”. Caso se deseje acessar, por exemplo, o conteúdo do primeiro byte recebido, basta apenas fazer a seguinte chamada: “rxMessage.PayLoad[0]”.

Após a recepção da mensagem e realização das operações adequadas com os dados coletados, a mensagem recebida é então descartada ao se chamar a função “MiApp_DiscardMessage()”.

Por outro lado, o processo de envio de dados pode ser realizado de duas formas:

broadcast - a mensagem é enviada para todos os nós da rede, ou unicast - a mensagem é

enviada apenas para um dispositivo. Como nesse projeto foi definida a utilização de mensagens do tipo broadcast, apenas esse tipo será abordado aqui.

Para cada byte que se deseja enviar através do protocolo, a função “void

MiApp_WriteData(BYTE OneByteTxData)” é acionada. Sendo assim, caso o usuário

necessite enviar “n” bytes, essa função deve ser chamada “n” vezes, contanto que o valor de “n” não ultrapasse o tamanho máximo configurado do buffer TX, no projeto esse valor foi configurado para enviar até 100 bytes por vez.

Com toda a informação que se deseja enviar carregada no buffer TX a função “BOOL

MiApp_BroadcastMessage(BOOL SecEn)” é acionada. Seu parâmetro de entrada indica se o payload da mensagem deve ou não ser criptografado. Caso a operação tenha sido realizada

com sucesso essa função retornará “verdadeiro”. Como não foi utilizado criptografia dos dados no projeto, “SecEn” é configurado como FALSE.

No documento 2011.1 RelatorioTCCLintonVFinal (páginas 40-45)

Documentos relacionados