Bagaimana cara membuat protokol komunikasi UART yang aman?

8

Saya bertanya-tanya bagaimana cara membuat protokol komunikasi UART / USB yang aman. Saya membutuhkannya untuk komunikasi antara mikrokontroler dan PC. Saya punya ~ 10 perintah dan saya pikir saya akan menggunakan 10 perintah pengakuan terpisah untuk masing-masing.

Pertukarannya harus seperti ini:

  • PC mengirimkan perintah bangun melalui UART
  • μC mengakui bahwa PC terhubung dan mengirimkan perintahnya ke PC, mis. 0x01
  • PC melakukan apa yang diminta (beberapa perangkat keras) dan merespons ~0x01ketika selesai (saya meniadakan nomor untuk membuat "jarak" yang lebih besar antara dua angka)
  • μC tahu bahwa itu dikirim 0x01dan diharapkan ~0x01dari PC. Jika sesuatu selain ~0x01kembali, μC akan tahu bahwa ada yang tidak beres dan akan mengirim permintaan baru atau pesan kesalahan

Kasus yang dikirim μC 0x01, PC memahami 0x02dan mengirim ~0x02kembali tetapi μC membaca ~0x01karena beberapa kebisingan akan sangat buruk.

Seberapa aman itu dalam hal transmisi, atau bagaimana saya bisa membuatnya lebih aman?

JavaForStarters
sumber
1
Anda mungkin ingin meninjau pertanyaan terkait saya dan jawaban yang sangat bagus untuk itu.
Eugene Sh.
1
Dengan "lebih aman" saya menganggapnya maksud Anda kurang rentan terhadap kesalahan transmisi, tidak menambahkan crypto dll untuk menolak menguping dan apa yang tidak. Bahkan itu adalah bidang yang sangat luas: en.wikipedia.org/wiki/Error_detection_and_correction
Fizz
2
Anda mungkin ingin mencari kode Hamming . Ini akan memakan waktu hingga 16 perintah (4 bit), dan perluas secara sistematis hingga 7 bit (yang dapat ditransmisikan melalui UART standar). Anda dapat memilih untuk memperbaiki kesalahan bit tunggal, atau mendeteksi apakah ada dua bit yang salah diterima.
Neil_UK
2
1) 7 bit + bit paritas adalah satu cara dan sederhana. Itu tidak akan menangkap semua kemungkinan kesalahan tetapi akan menangkap banyak. 2) Metode yang lebih kuat adalah mengirim dua byte, pertama dengan perintah aktual dan kedua dengan 'tidak' dari perintah pertama. 3) Yang lebih baik adalah mengirim byte 'perintah yang datang', diikuti oleh perintah, diikuti oleh pujian dari perintah, diikuti oleh 'akhir byte perintah. Bytes 'perintah datang' dan 'akhir dari perintah' harus dipilih untuk tidak overlay dengan perintah apa pun dan perintah byte
pujian
1
Jika Anda hanya membutuhkan 10 perintah, Anda dapat memasukkan dua salinan dalam setiap byte (untuk redundansi), ditambah bit paritas. Atau karena Anda memiliki ruang simbol 256 simbol, dan hanya membutuhkan 10, Anda dapat memilih simbol berbeda secara maksimal (semua simbol berbeda dengan beberapa bit), atau hanya memilih simbol dengan jumlah gen dan nol genap. Anda tentu tidak perlu khawatir tentang kesalahan bit tunggal.
mkeith

Jawaban:

1

Saya pikir Anda harus mendefinisikan perintah yang lebih panjang termasuk mungkin checksum atau CRC dan menunggu kondisi ACK / NACK atau kesalahan.

Anda dapat mengambil contoh dari protokol mudah seperti TFTP ( RFC 1350 )

Menepuk
sumber
1

Untuk komunikasi yang aman, Anda harus mempertimbangkan semua utas yang mungkin untuk saluran komunikasi Anda. Karena itu Anda perlu mendefinisikan, jika sistem dapat diakses dari luar (sistem pihak ketiga misalnya nirkabel)

Secara umum, Anda harus memikirkan utas berikut:

  • pengulangan
  • komisioning
  • resequencing
  • manipulasi
  • menunda
  • insersi
  • korupsi

Langkah-langkah standar terhadap utas adalah:

  • Sequencing atau cap waktu
  • pengawasan waktu
  • kode sumber dan tujuan yang unik
  • tanggapan
  • precedure identifikasi
  • semacam checksum, kode hash ...
  • beberapa teknik cryprographic ini sudah Anda terapkan dengan protocoll sederhana.
pengguna2572309
sumber