منذ وقت طويل ، عندما كلف الهاتف المحمول حوالي 2000 دولار ودقيقة واحدة من المكالمات الصوتية 50 سنتًا ، كانت أجهزة الاستدعاء مشهورة جدًا. في وقت لاحق أصبحت الهواتف الخلوية أرخص ، وأصبحت أسعار المكالمات والرسائل النصية القصيرة أقل ، وأخيراً اختفى النداء.
بالنسبة للأشخاص الذين يمتلكون جهاز النداء من قبل ويرغبون في معرفة كيفية عمله ، ستكون هذه المقالة مفيدة.
المعلومات الرئيسية
بالنسبة للأشخاص الذين نسوا المبادئ أو وُلدوا بعد عام 2000 ، سأذكر الأفكار الرئيسية قريبًا.
تتمتع شبكة اتصالات الترحيل ببعض المزايا التي تعتبر مهمة في بعض الأحيان حتى الآن:
- إنه اتصال أحادي الاتجاه ، دون أي نوع من التأكيد ، لذلك لا يمكن تحميل الشبكة بشكل زائد - إنها لا تعتمد فقط على عدد من المستخدمين. يتم نقل الرسائل بشكل مستمر "كما هي" ، واحدة تلو الأخرى ، ويحصل جهاز النداء على الرسالة إذا كان رقمها (ما يسمى Capcode) مساوياً للرقم الداخلي للجهاز.
- جهاز الاستقبال خفيف الوزن جدًا (حرفيًا وإلكترونيًا) ، ويمكن أن يعمل لمدة تصل إلى شهر من بطاريتي AA.
هناك
معياران أساسيان لإرسال الرسائل -
POCSAG (المجموعة الاستشارية لتوحيد رمز مكتب البريد) و
FLEX . كلا المعيارين قديمان جدًا ، تم تصنيع POCSAG في عام 1982 ، ويمكن أن يدعم سرعة 512 و 1200 و 2400 بت / ثانية. لإرسال FSK (مفتاح إزاحة التردد) ، يتم استخدام طريقة فصل تردد 4.5 كيلو هرتز. FLEX أحدث قليلاً (صُنعت من قبل Motorola في التسعين) ، ويمكن أن تعمل بسرعات تصل إلى 6400 بت / ثانية ، ويمكنها استخدام FSK2 و FSK4.
كلا البروتوكولين سهل للغاية ، وقبل حوالي 20 عامًا تم إنشاء وحدات فك ترميز الكمبيوتر الشخصي ، والتي يمكنها فك تشفير الرسائل من منفذ تسلسلي لبطاقة الصوت (لا يوجد تشفير مدعوم ، لذا يمكن لأي شخص قراءة جميع الرسائل).
دعونا نلقي نظرة ، وكيف يعمل.
تلقي إشارة
أولا ، نحن بحاجة إلى إشارة لفك التشفير. لنأخذ حاسوباً محمولاً ، جهاز استقبال rtl-sdr ، واحصل عليه.

يستخدم مفتاح إزاحة التردد ، لذلك سنقوم بتعيين FM. مع HDSDR ، سنوفر إشارة بتنسيق WAV.
يتيح التحقق ، ما حصلنا عليه. تحميل ملف wav كصفيف بيانات Python:
from scipy.io import wavfile import matplotlib.pyplot as plt fs, data = wavfile.read("pocsag.wav") plt.plot(data) plt.show()
الإخراج (البتات المضافة يدويا):

كما نرى ، من السهل ، وحتى "بالعين المجردة" ، يمكننا رسم وحدات بت في الرسام ، ومن السهل التمييز بينه وبين "0" وأين "1". ولكن سوف يستغرق الأمر وقتًا طويلاً للقيام بذلك يدويًا ، فقد حان الوقت لأتمتة العملية.
بعد توسيع الرسم البياني ، يمكننا أن نرى أن كل بت لديه عرض 20 عينة. لدينا 24000 عينة في الثانية بت ملف wav ، وبالتالي فإن سرعة القفل هي 1200bit / s. يتيح العثور على موضع عبور صفري - بداية تسلسل البت. يتيح أيضًا إضافة علامات للتحقق من أن جميع وحدات البت موجودة في أماكن مناسبة.
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
كما نرى ، ليس لها تطابق تام (لدى المرسل والمستقبل ترددات مختلفة طفيفة) ، ولكن بالتأكيد كافية لفك التشفير.

بالنسبة للإشارات الطويلة ، ربما نحتاج إلى خوارزمية تصحيح تردد أوتوماتيكي ، لكن بالنسبة لهذا النوع من الإشارات ، فإنها ليست حرجة.
الخطوة الأخيرة - نحتاج إلى ترجمة ملف wav إلى تسلسل البت. كما أنه من السهل أيضًا ، معرفة طول كل بت ، وإذا كان مجموع البيانات موجبًا ، فسنضيف "1" ، وإلا "0" (تم العثور أخيرًا على أن الإشارة بحاجة إلى التراجع ، لذا تم استبدال 0 و 1) .
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)
الإخراج - تسلسل البت الصحيح (بتنسيق سلسلة) ، والذي يحتوي على رسالتنا.
101010101010101010101010101010101010101010101010101010101010101010101010101
010101010101010101010101010101010101010101010100111110011010010000101001101
100001111010100010011100000110010111011110101000100111000001100101110111101
010001001110000011001011101111010100010011100000110010111011110101000100111
000001100101110111101010001001110000011001011101111010100010011100000110010
011011110101000100111000001100101110111101010001001110000011001011101111010
100010011100000110010111011110101000100111000001100101110111101010001001110
...
111101111
فك تشفير الرسائل الرقمية فقط
تسلسل البت أكثر ملاءمة بكثير من ملف wav ، يمكننا استخراج البيانات منه. أولاً ، يتيح تقسيم البيانات إلى 4 كتل بايت.
10101010101010101010101010101010
10101010101010101010101010101010
10101010101010101010101010101010
10101010101010101010101010101010
01111100110100100001010011011000
01111010100010011100000110010111
01111010100010011100000110010111
01111010100010011100000110010111
01111010100010011100000110010111
00001000011011110100010001101000
10000011010000010101010011010100
01111100110100100001010111011000
11110101010001000001000000111000
01111010100010011100000110010111
01111010100010011100000110010111
01111010100010011100000110010111
00100101101001011010010100101111
يمكننا بالتأكيد رؤية نمط. الآن نحن بحاجة إلى إيجاد ما يعنيه كل جزء. يتوفر دليل POCSAG
بتنسيق PDF ، مما يتيح التحقق من وصف بنيات البيانات.

لها الآن أكثر وضوحا بكثير. يحتوي الرأس على كتلة طويلة "10101010101" ، وهي تستخدم "لإيقاظ" النداء من وضع السكون. تحتوي الرسالة نفسها على الكتل Batch-1 ... Batch-N ، كل كتلة تبدأ من التسلسل الفريد FSC. ثم ، كما نرى في الدليل ، إذا كانت السلسلة تبدأ من "0" ، فهي تحتوي على عنوان المستلم. العنوان نفسه (رمز الكود) هو جهاز النداء ، وإذا لم يكن متطابقًا ، فإن النداء سيتجاهل الرسالة. إذا بدأت سلسلة من "1" ، فإنها تحتوي على نص الرسالة. في مثالنا لدينا 2 سلاسل من هذا النوع.
يتيح عدم التحقق من كل كتلة. يمكننا أن نرى أيضًا رموز الخمول - الكتل الفارغة 01111 ... 0111 ، ليس لديهم أي معلومات مفيدة. بعد إزالتها ، نحصل على هذا فقط:
01111100110100100001010011011000 - Frame Sync
00001000011011110100010001101000 - Address
10000011010000010101010011010100 - Message
01111100110100100001010111011000 - Frame Sync
11110101010001000001000000111000 - Message
00100101101001011010010100101111 - Address
نحن بحاجة إلى البحث ، ما في الداخل.
بعد التحقق من الدليل ، من الواضح أن هناك نوعين من الرسائل -
الرقمية فقط والأبجدية الرقمية . يتم حفظ الرسائل الرقمية فقط كرموز BCD 4bit ، بحيث يمكن أن تحتوي 20 بتة على 5 رموز (هناك أيضًا بتات CRC ، لا نستخدمها في الوقت الحالي). إذا كانت الرسالة أبجدية رقمية ، فسيتم استخدام ترميز ASCII ذي 7 بت. هذه الرسالة قصيرة جدًا ، لذا يمكن أن تكون رسالة رقمية فقط.
من السلاسل 10000011010000010101010010011010100 و 11110101010001000001000000111000 ، يمكننا الحصول على تسلسلات 4 بت:
1 0000 0110 1000 0010 10101 0011010100 - 0h 6h 8h 2h Ah
1 1110 1010 1000 1000 00100 0000111000 - Eh Ah 8h 8h 2h
الخطوة التالية هي الحصول على جدول فك التشفير من الدليل:

من الواضح أن الرسالة الرقمية فقط يمكن أن تحتوي على أرقام من 0 إلى 9 ، حرف U ("قبيح") ، ومسافة واثنين من الأقواس. لنكتب طريقة صغيرة لفك تشفيرها:
def parse_msg(block):
أخيرًا ، تلقينا رسالة "0682 *) * 882".
من الصعب معرفة ما يعنيه ، ولكن إذا تم استخدام الرسائل الرقمية فقط ، فربما يحتاجها شخص ما.
فك تشفير الرسائل الأبجدية الرقمية
الخطوة التالية ، والأكثر إثارة للاهتمام ، هي فك تشفير الرسائل الرقمية. لها أكثر إثارة للاهتمام ، لأنه كما الإخراج ، يجب أن نحصل على نص مقروء الإنسان.
أولاً ، نحتاج إلى تسجيل رسالة مرة أخرى ، سنستخدم HDSDR. لا نعرف نوع الرسالة قبل فك التشفير ، لذلك سنقوم فقط بتسجيل أطول رسالة ، ويمكننا الحصول عليها ، ونأمل أن تحتوي على بعض النصوص.

بعد التحويل من wav إلى تسلسل بت (انظر رمز Python أعلاه) ، نحصل على هذا:

بعض الأشياء المثيرة للاهتمام التي يمكننا رؤيتها على الفور ، بالعين المجردة - على سبيل المثال ، تتكرر سلسلة البداية 01010101010101 مرتين. وبالتالي ، فإن هذه الرسالة لم تعد فقط ، بل تحتوي حرفيًا على رسالتين ، تم دمجهما معًا (لا ينفي المعيار هذا ، راجع للشغل).
كما وجدنا من قبل ، تبدأ كل كتلة بيانات من تسلسل ، يسمى Frame Sync Code (01111100 ...) ، بعد إرسال كتل 32 بت. يمكن لكل كتلة تخزين العنوان أو نص الرسالة.
في وقت سابق حصلنا على الرسائل الرقمية فقط ، والآن نريد أن نقرأ رسائل ASCII. أولا ، نحن بحاجة إلى التمييز بينها. يتم حفظ هذه البيانات في حقل "بتات الدالة" (بتات 20-21) - إذا كانت كلتا البتات 00 ، فستكون رسالة رقمية فقط ، إذا كانت البتات 11 ، فتكون رسالة نصية.
من الجدير بالذكر أن حقل الرسالة هذا يبلغ طوله 20 بتًا ، لذا فهو مثالي لوضع خمس كتل 4 بت في حالة وجود رسالة رقمية فقط. ولكن إذا كان لدينا 7bit رسالة ASCII ، لا يمكننا تقسيم 20 إلى 7. من الممكن التنبؤ أن إصدار البروتوكول الأول كان يدعم فقط الرسائل الرقمية فقط (لا تنس أنه تم صنعه في عام 1982
وربما أول أجهزة الاستدعاء الأنبوبة لم يتمكنوا من عرض المزيد ) ، وبعد ذلك فقط تم إضافة دعم رسائل ASCII. بسبب الأسباب القديمة لم يتم تغيير معيار الإطارات ، واستخدم المطورون المقاربة السهلة - لقد جمعوا فقط البتات "كما هي" ، واحدة تلو الأخرى. من كل رسالة نحتاج إلى أخذ 20 بت ودمجها مع الرسالة التالية ، أخيرًا يمكننا فك تشفير نص الرسالة.
دعونا نرى كتلة واحدة من رسالتنا (المساحات كانت الأفعى للقراءة أسهل):
0 0001010011100010111111110010010
1 00010100000110110011 11100111001
1 01011010011001110100 01111011100
1 11010001110110100100 11011000100
1 11000001101000110100 10011110111
1 11100000010100011011 11101110000
1 00110010111011001101 10011011010
1 00011001011100010110 10011000010
1 10101100000010010101 10110000101
1 00010110111011001101 00000011011
1 10100101000000101000 11001010100
1 00111101010101101100 11011111010
البت "0" في السلسلة الأولى يوضح لنا أنه حقل العنوان ، ويظهر لنا الرقم "11" في 20-21 بت أن الرسالة هي أبجدية رقمية. ثم نأخذ فقط 20 بت من كل سلسلة ودمجها معا.
هذا هو تسلسل بت لدينا:
00010100000110110011010110100110011101001101000111011010010011000001101000
11010011100000010100011011001100101110110011010001100101110001011010101100
000010010101000101101110110011011010010100000010100000111101010101101
في POCSAG يستخدم كود ASCII من 7 بت ، لذلك سنقوم بتقسيم السلسلة إلى 7 كتل char:
0001010 0000110 1100110 1011010 0110011 1010011 ...
بعد محاولة فك تشفيره (يمكن العثور بسهولة على جدول ASCII في الإنترنت) ، لن نحصل على أي شيء. التحقق من الدليل مرة أخرى ، وهنا عبارة صغيرة "يتم وضع أحرف ASCII من اليسار إلى اليمين (MSB إلى LSB). يرسل LSB أولاً. ". لذا ، يتم إرسال البت المنخفض أولاً - من أجل فك التشفير الصحيح ، نحتاج إلى عكس كل السلاسل.
من الممل جدًا القيام بذلك يدويًا ، لذلك دعونا نكتب شفرة Python:
def parse_msg(block): msgs = "" for cw in range(16): cws = block[32 * cw:32 * (cw + 1)]
أخيرًا ، نحصل على هذا التسلسل (البتات ، رموز الرموز ، ورموز ASCII):
0101000 40 ( 0110000 48 0 0110011 51 3 0101101 45 - 1100110 102 f 1100101 101 e 1100010 98 b 0101101 45 - 0110010 50 2 0110000 48 0 0110001 49 1 0111001 57 9 0100000 32 0110001 49 1 0110011 51 3 0111010 58 : 0110011 51 3 0110001 49 1 0111010 58 : 0110100 52 4 0110101 53 5 0100000 32 0101010 42 * 0110100 52 4 0110111 55 7 0110110 54 6 0101001 41 ) 0100000 32 1000001 65 A 1010111 87 W 1011010 90 Z
بعد الدمج ، نحصل على السلسلة: "(03-feb-2019 13:31:45 * 476) AWZ". كما وعدت ، إنسان جميل للقراءة.
بالمناسبة ، من المثير للاهتمام أن نذكر أنه يتم استخدام رموز ASCII 7 بت. لا يمكن ترميز رموز بعض الحروف الهجائية (الألمانية ، السيريلية ، إلخ) بشكل صحيح في 7 بتات. لماذا 7 بت؟ ربما قرر المهندسون أن "7 بتات ستكون كافية للجميع" ، من يدري ...
الخاتمة
كان من المثير للاهتمام حقًا التحقيق في كيفية عمل POCSAG. إنه أحد البروتوكولات النادرة ، التي يتم استخدامها حتى الآن ، والتي يمكن فك تشفيرها حرفيًا على ورقة (وأنا بالتأكيد لن أجرب ذلك مع TETRA أو GSM).
بالتأكيد ، لم يتم وصف بروتوكول POCSAG بشكل كامل هنا. يتم الجزء الأكثر أهمية ومثيرة للاهتمام ، أشياء أخرى ليست مثيرة للغاية. على الأقل ، لا يوجد تشفير للشفرات الخاطئة ، ولا يوجد رمز لتصحيح الأخطاء (BCH Check Bits) - يمكن أن يسمح بإصلاح ما يصل إلى 2 بت خاطئ في الرسالة. ولكن لم يكن هناك هدف لكتابة وحدة فك ترميز POCSAG أخرى هنا ، فهناك بالفعل ما يكفي منها.
بالنسبة لأولئك الذين يرغبون في اختبار فك التشفير الحقيقي باستخدام rtl-sdr ، يمكن استخدام
تطبيق PDW المجاني. لا يتطلب التثبيت ، فقط يكفي لإعادة توجيه الصوت من HDSDR إلى PDW عبر تطبيق Virtual Audio Cable.
النتائج تبدو مثل هذا:

(يرجى الانتباه إلى أن فك تشفير رسائل الخدمة العامة يمكن أن يكون غير قانوني في بعض البلدان ، وعلى أي حال احترام خصوصية المستفيدين)
إذا أراد شخص ما الحصول على مزيد من المعلومات حول هذا الموضوع ، فإن مصادر وحدة فك ترميز
multimon-ng متوفرة ، يمكنها فك تشفير العديد من البروتوكولات ، وكذلك POCSAG و FLEX.
شكرا للقراءة.