Como criar um protocolo de comunicação UART seguro?

8

Eu queria saber como criar um protocolo de comunicação UART / USB seguro. Eu preciso disso para a comunicação entre um microcontrolador e um PC. Eu tenho ~ 10 comandos e pensei em usar 10 comandos de reconhecimento separados para cada um deles.

A troca deve ser assim:

  • PC envia comando de ativação via UART
  • O µC reconhece que o PC está conectado e envia seu comando ao PC, por exemplo. 0x01
  • O PC faz o que foi solicitado (algumas coisas de hardware) e responde ~0x01quando termina (eu nego o número para criar uma "distância" maior entre os dois números)
  • O µC sabe que foi enviado 0x01e está esperando ~0x01pelo PC. Se algo além de ~0x01voltar, o µC saberá que algo deu errado e enviará uma nova solicitação ou uma mensagem de erro

O caso que o µC envia 0x01, o PC entende 0x02e envia de ~0x02volta, mas a leitura do µC ~0x01devido a algum ruído seria muito ruim.

Quão seguro é isso em termos de transmissão, ou como posso tornar isso mais seguro?

JavaForStarters
fonte
1
Você pode revisar a minha pergunta relacionada e as respostas muito boas para ela.
Eugene Sh.
1
Por "mais seguro", entendo que você quer dizer menos propenso a erros de transmissão, não adicionando criptografia etc. para resistir à espionagem e outras coisas. Mesmo apenas que é um muito vasto campo: en.wikipedia.org/wiki/Error_detection_and_correction
Fizz
2
Você pode procurar a codificação de Hamming . Serão necessários até 16 comandos (4 bits) e os expandirão de maneira sistemática para 7 bits (que podem ser transmitidos por um UART padrão). Você pode optar por corrigir qualquer erro de bit único ou detectar se dois bits foram mal recebidos.
Neil_UK
2
1) 7 bits + um bit de paridade é uma maneira e é simples. Ele não captura todos os erros possíveis, mas captura muitos. 2) Um método mais robusto é enviar dois bytes, primeiro com o comando real e depois com o 'não' do primeiro comando. 3) Melhor ainda é enviar um byte 'command coming', seguido pelo comando, seguido pelo complemento do comando, seguido por um 'byte final do comando. Os bytes 'command coming' e 'end of command' devem ser selecionados para não se sobreporem a nenhum dos bytes de comando e elogio
user3629249
1
Se você precisar apenas de 10 comandos, poderá caber duas cópias em cada byte (para redundância), além de bits de paridade. Ou como você tem um espaço de 256 símbolos e precisa apenas de 10, você pode simplesmente escolher símbolos maximamente diferentes (todos os símbolos diferem por vários bits) ou escolher apenas símbolos com números pares de um e zeros. Você certamente não precisa se preocupar com erros de bit único.
Mkeith

Respostas:

1

Eu acho que você deve definir comandos mais longos, incluindo provavelmente soma de verificação ou CRC e aguardar uma ACK / NACK ou condição de erro.

Você pode obter exemplos de protocolos fáceis como TFTP ( RFC 1350 )

Pat
fonte
1

Para uma comunicação segura, você deve considerar todos os threads possíveis para sua linha de comunicação. Portanto, você precisa definir se o sistema pode ser acessado de fora (sistemas de terceiros, por exemplo, sem fio)

Em geral, você precisa pensar nos seguintes tópicos:

  • repetição
  • omissão
  • ressequenciamento
  • manipulação
  • demora
  • inserção
  • corrupção

As medidas padrão contra threads são:

  • Sequenciamento ou timestamps
  • supervisão de tempo
  • códigos de origem e destino exclusivos
  • resposta
  • precedência de identificação
  • algum tipo de soma de verificação, código hash ...
  • técnicas de cryprographic, algumas delas que você já implementou com seu protocolo simples.
user2572309
fonte