Hai Habr!
Sekali waktu, ketika ponsel berharga $ 2000 dan biaya panggilan satu menit 50 sen, ada hal yang populer seperti paging. Kemudian koneksi menjadi lebih murah, dan pager pertama-tama berubah dari atribut prestisius seorang pebisnis menjadi atribut non-prestisius dari seorang kurir atau sekretaris, dan kemudian teknologi ini hampir sepenuhnya menghilang.
Bagi mereka yang ingat lelucon “baca pager, banyak berpikir”, dan ingin mengetahui cara kerjanya, teruskan di bawah potongan. Bagi mereka yang ingin memahami lebih detail, bagian
kedua tersedia.
Informasi umum
Bagi mereka yang telah melupakan atau dilahirkan setelah tahun 2000-an, saya akan secara singkat mengingat ide-ide utama.
Dari sudut pandang pengguna, komunikasi paging memiliki dua nilai tambah besar, yang dalam beberapa kasus masih relevan:
- Komunikasi satu arah, tanpa konfirmasi, oleh karena itu tidak mungkin untuk membebani jaringan paging, kinerjanya tidak tergantung pada jumlah pelanggan. Pesan hanya disiarkan secara berurutan "sebagaimana adanya", dan pager menerimanya jika nomor penerima cocok dengan nomor pager.
- Perangkat penerima sangat sederhana, sehingga pager dapat bekerja tanpa mengisi ulang hingga sebulan dari 2 baterai AA biasa.
Ada dua standar utama untuk mengirim pesan -
POCSAG (Grup Penasihat Standardisasi Kode Kantor Pos) dan
FLEX . Standar tidak sama sekali baru, POCSAG disetujui kembali pada tahun 1982, kecepatan yang didukung 512, 1200 dan 2400 bit / s. Untuk transmisi, penguncian pengalihan frekuensi (FSK) dengan jarak frekuensi 4,5KHz digunakan. Standar FLEX yang lebih baru (diusulkan oleh Motorola pada tahun 90-an) mendukung kecepatan hingga 6400 bps dan dapat menggunakan tidak hanya FSK2, tetapi juga FSK4.
Protokol secara inheren cukup sederhana, dan 20 tahun yang lalu decoder ditulis untuk mereka yang dapat mendekripsi sinyal dari input kartu suara (enkripsi pesan tidak disediakan, sehingga siapa pun dapat membacanya dengan program seperti itu, pada prinsipnya).
Mari kita lihat cara kerjanya.
Menerima sinyal
Pertama, kita perlu sampel untuk decoding. Kami mengambil laptop, penerima rtl-sdr, mesin waktu, dan menerima sinyal yang kami butuhkan.

Karena modulasi frekuensi, mode terima juga mengatur FM. Menggunakan HDSDR, kami merekam sinyal dalam format WAV.
Mari kita lihat apa yang kita dapat. Unduh file wav sebagai array menggunakan Python:
from scipy.io import wavfile import matplotlib.pyplot as plt fs, data = wavfile.read("pocsag.wav") plt.plot(data) plt.show()
Hasil (bit ditandatangani secara manual):

Seperti yang Anda lihat, semuanya sederhana, dan bahkan "dengan mata" di Paint, Anda dapat menggambar bit di mana "0" dan di mana "1". Tetapi untuk melakukan ini karena seluruh file akan terlalu lama, prosesnya perlu otomatis.
Jika Anda meningkatkan grafik, Anda dapat melihat bahwa lebar masing-masing "bit" adalah 20 sampel, yang pada frekuensi sampling file wav dari 24000 sampel / s sesuai dengan kecepatan 1200 bit / s. Kami menemukan di sinyal tempat transisi melalui nol - ini akan menjadi awal dari urutan bit. Kami akan menampilkan spidol di layar untuk memeriksa apakah bitnya cocok.
speed = 1200 fs = 24000 cnt = int(fs/speed) start = 0 for p in range(2*cnt): if data[p] < - 50 and data[p+1] > 50: start = p break
Seperti yang Anda lihat, kecocokannya tidak sempurna (frekuensi pemancar dan penerima masih sedikit berbeda), tetapi cukup untuk decoding.

Untuk sinyal lama, algoritma penyesuaian frekuensi harus diperkenalkan, tetapi ini tidak diperlukan dalam kasus ini.
Dan langkah terakhir adalah menerjemahkan array dari wav ke dalam urutan bit. Semuanya juga sederhana di sini, kita sudah tahu panjang satu bit, jika data untuk periode ini positif, lalu tambahkan "1", jika tidak "0" (pengeditan - ternyata, sinyal perlu dibalik, sehingga 0 dan 1 terbalik).
bits_str = "" for p in range(0, data.size - cnt, cnt): s = 0 for p1 in range(p, p+cnt): s += data[p] bits_str += "1" if s < 0 else "0" print("Bits") print(bits_str)
Mungkin kode dapat dioptimalkan dengan meninggalkan loop, walaupun dalam hal ini tidak kritis.
Hasilnya adalah urutan bit yang selesai (sebagai string) yang menyimpan pesan kami.
1010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101
010101010101010101010101010101010101010101010101010100111110011010010000101001101
100001111010100010011100000110010111011110101000100111000001100101110111101
01000100111000001100101110111101010001001110000011001011101111010101000100111
000001100101110111101010001001110000011001011101111010100010011100000110010
011011110101000100111000001100101110111101010001001110000011001011101111010
100010011100000110010111011110101000100111000001100101110111101010001001110
...
111101111Decoding
Urutan bit jauh lebih nyaman daripada hanya file wav, Anda sudah dapat mengekstrak data apa pun darinya. Kami membagi file menjadi blok 4 byte, dan mendapatkan urutan yang lebih dimengerti:
101010101010101010101010101010101010
101010101010101010101010101010101010
101010101010101010101010101010101010
101010101010101010101010101010101010
01111100110100100001010011011000
01111010100010011100000110010111
01111010100010011100000110010111
01111010100010011100000110010111
01111010100010011100000110010111
00001000011011110100010001101000
10000011010000010101010011010100
01111100110100100001010111011000
11110101010001000001000000111000
01111010100010011100000110010111
01111010100010011100000110010111
01111010100010011100000110010111
00100101101001011010010100101111Hanya itu yang bisa kita ekstrak dari file, masih untuk memahami apa arti garis-garis ini. Buka dokumentasi untuk format, yang tersedia
dalam bentuk PDF .

Semuanya kurang lebih jelas. Header pesan terdiri dari blok panjang "10101010101" yang diperlukan agar pager meninggalkan "mode tidur". Pesan itu sendiri terdiri dari Batch-1 ... Batch-N blok, yang masing-masing dimulai dengan urutan FSC yang unik (disorot dalam huruf tebal dalam teks). Selanjutnya, seperti yang dapat dilihat dari manual, jika baris dimulai dengan "0", maka ini adalah alamat penerima. Alamat itu ditransfer ke pager itu sendiri, dan jika tidak cocok, pager hanya akan mengabaikan pesan. Jika baris dimulai dengan "1", maka ini sebenarnya adalah pesan. Kami memiliki dua garis seperti itu.
Sekarang lihat setiap blok. Kami melihat kode siaga - blok kosong 01111 ... 0111 yang tidak membawa informasi berguna. Kami menghapusnya, hanya ada sedikit informasi yang tersisa, yang tersisa:
01111100110100100001010011011000 - Sinkronisasi Bingkai
00001000011011110100010001101000 - Alamat
10000011010000010101010011010100 - Pesan
01111100110100100001010111011000 - Sinkronisasi Bingkai
11110101010001000001000000111000 - Pesan
00100101101001011010010100101111 - AlamatMasih memahami apa yang ada di dalamnya.
Kami melihat lebih jauh dalam manual, dan menemukan bahwa pesan dapat berupa digital atau teks. Pesan digital disimpan dalam bentuk kode BCD 4-bit, yang berarti bahwa 5 karakter dapat ditampung dalam 20 bit (masih ada bit untuk kontrol, kami tidak akan mempertimbangkannya). Pesan juga bisa berupa teks, dalam hal ini digunakan pengodean 7-bit, tetapi untuk teks pesan kami terlalu kecil - total jumlah bit pesan bukan kelipatan 7.
Dari string 10000011010000010101010011010100 dan 11110101010001000001000000111000 kita mendapatkan urutan 4-bit berikut:
1 0000 0110 1000 0010 10101 0011010100 - 0h
6j 8j 2j Ah
1 1110 1010 1000 1000 00100 0000111000 - Eh Ah
8j 8j 2j
Dan akhirnya, langkah terakhir - kita lihat dalam dokumentasi daftar korespondensi karakter.

Seperti yang Anda lihat, pesan digital hanya dapat berisi angka 0–9, huruf U (“ugrent”), spasi, dan sepasang tanda kurung. Kami menulis fungsi keluaran sederhana agar tidak membacanya secara manual:
def parse_msg(block):
Akibatnya, kami mendapatkan pesan yang dikirimkan "0682 *) * 882". Sulit untuk mengatakan apa artinya, tetapi karena formatnya mendukung pesan digital, maka mungkin seseorang membutuhkannya.
Kesimpulan
Seperti yang Anda lihat, format POCSAG sangat sederhana, dan pada kenyataannya, dapat diterjemahkan bahkan dalam buku catatan sekolah. Dan meskipun sekarang ini adalah kepentingan yang agak historis, analisis protokol tersebut sangat berguna dari sudut pandang kognitif.
Bagian
selanjutnya menjelaskan penguraian pesan ASCII.