سأخمن وأقول إن كل من قام أصدقاؤه أو عائلته بالطيران على متن طائرة ، قد استخدم Flightradar24 - خدمة مجانية ومريحة لتتبع الرحلات في الوقت الفعلي.

في
الجزء الأول ، تم وصف الأفكار الأساسية للعملية. الآن دعنا نذهب إلى أبعد من ذلك ونكتشف ما هي البيانات التي ترسلها وتستقبلها بالضبط بين الطائرة والمحطة الأرضية. سنقوم أيضًا بفك تشفير هذه البيانات باستخدام Python.
تاريخ
يجب أن يكون واضحًا أن بيانات الطائرات ليست مخصصة للمستخدمين الذين يريدون رؤيتها على هواتفهم الذكية فقط. يسمى هذا النظام ADS - B (مراقبة تعتمد تلقائيًا - بث) ، وقد تم تصميمه للإرسال التلقائي لبيانات معلومات الطائرة إلى مركز التحكم - يتم إرسال معلمات مختلفة ، مثل الإحداثيات والسرعة والعنوان والارتفاع وغيرها. في السابق ، لم يكن بإمكان المرسل رؤية سوى نقطة على شاشة الرادار. وأصبح بالتأكيد لا يكفي عندما زاد عدد الطائرات بشكل كبير.
من الناحية الفنية ، يتكون ADS-B من جهاز إرسال داخل الطائرة ، يرسل بشكل دوري إطارات بيانات المعلومات بتردد عالٍ نسبياً يبلغ 1090 ميغاهيرتز (هناك بعض الأوضاع الأخرى ، لكنها ليست مثيرة للاهتمام بالنسبة لنا ، لأن الإحداثيات يتم إرسالها هنا فقط ). بالطبع ، هناك أيضًا جهاز استقبال في مكان ما في المطار ، ولكن بالنسبة لنا ، كما هو الحال بالنسبة للمستخدمين ، فإن جهاز الاستقبال الخاص بنا أكثر إثارة للاهتمام.
للمقارنة فقط ، ظهر أول نظام من هذا القبيل مصمم للمستخدمين العاديين ، وهو Airnav Radarbox ، في عام 2007 ، وبلغت تكلفته حوالي 900 دولار ، وحوالي 250 دولارًا في السنة كلف اشتراكًا في خدمات شبكتهم (الفكرة الرئيسية لهذا النظام هي جمع و مشاركة البيانات من
العديد من
أجهزة الاستقبال ، جهاز استقبال مستقل غير مجدية نسبيا).

الآن ، عندما أصبحت أجهزة الاستقبال RTL-SDR متاحة بدرجة أكبر بكثير ، يمكن صنع جهاز مماثل مقابل 30 دولارًا. يمكن العثور عليه في
الجزء الأول من المقالة ، وسوف نذهب أبعد من ذلك ونصف البروتوكول نفسه - دعنا نرى كيف يعمل.
تلقي إشارة
أولاً ، نحتاج إلى تسجيل عينة إشارة. يبلغ طول الإشارة بأكملها 120 ميكروثانية فقط ، ولترى تفاصيلها بدقة "دقة" ، من الأفضل أن يكون لها راديو SDR بمعدل لا يقل عن 5 ميجاهرتز.

بعد التسجيل ، نحصل على ملف WAV بمعدل أخذ العينات 5000000 / ثانية ، 30 ثانية من هذا السجل بحجم حوالي 500 ميغابايت. بالطبع ، من غير المجدي أن تستمع إليه مع مشغل الوسائط المفضل لديك - الملف لا يحتوي على صوت ، ولكن إشارة راديو رقمية مباشرة نفسها - هذه هي بالضبط طريقة عمل Software Defined Radio.
يمكننا فتح ومعالجة هذا الملف مع بيثون. يمكن لأولئك الذين يرغبون في إجراء التجربة بأنفسهم ، تنزيل عينة من
هذا الرابط .
يتيح فتح ملف ونرى ، ما هو في الداخل.
from scipy.io import wavfile import matplotlib.pyplot as plt import numpy as np fs, data = wavfile.read("adsb_20190311_191728Z_1090000kHz_RF.wav") data = data.astype(float) I, Q = data[:, 0], data[:, 1] A = np.sqrt(I*I + Q*Q) plt.plot(A) plt.show()
النتيجة: نرى بعض "النبضات" على الضوضاء.

كل "دفعة" هي إشارة ، يكون هيكلها مرئيًا بوضوح إذا قمنا بزيادة الدقة على الرسم البياني.

كما نرى ، كانت الصورة متوافقة تمامًا مع الوصف أعلاه. يمكننا الآن معالجة هذه البيانات.
فك
أولا ، نحن بحاجة إلى تيار قليلا. يتم ترميز الإشارة نفسها بترميز manchester:

من الاختلافات نصف لدغة ، يمكننا بسهولة الحصول على "0" و "1" الحقيقية.
bits_str = "" for p in range(8): pos = start_data + bit_len*p p1, p2 = A[pos: pos + bit_len/2], A[pos + bit_len/2: pos + bit_len] avg1, avg2 = np.average(p1), np.average(p2) if avg1 < avg2: bits_str += "0" elif avg1 > avg2: bits_str += "1"
تبدو بنية الإشارة نفسها كما يلي:

لنرى الحقول بمزيد من التفاصيل.
DF (تنسيق الوصلة الهابطة ، 5 بت) - يحدد نوع الرسالة. هناك عدة أنواع منها:

(
مصدر الصفحة )
نحن مهتمون فقط بنوع DF17 ، لأن هذا واحد فقط يحتوي على إحداثيات الطائرة.
الايكاو (24 بت) - هو رمز دولي فريد للطائرة. يمكننا التحقق من الطائرة عن طريق الرمز الخاص بها
على هذا الموقع (للأسف ، توقف المؤلف عن تحديث قاعدة البيانات ، لكنه لا يزال ذا صلة). على سبيل المثال ، بالنسبة للرمز 3c5ee2 ، يمكننا الحصول على المعلومات التالية:
البيانات (56 أو 112 بت) - هي البيانات نفسها ، والتي سنقوم بفك تشفيرها. أول 5 بتات من البيانات هي حقل
Type Code ، الذي يحتوي على النوع الفرعي للبيانات التي يتم تخزينها (لا يتم خلطها مع حقل
DF ). هناك الكثير من هذه الأنواع:

(
مصدر الجدول )
لنلقي نظرة على بعض الأمثلة.
تحديد الطائراتمثال في شكل ثنائي:
00100 011 000101 010111 000111 110111 110001 111000
حقول البيانات:
+------+------+------+------+------+------+------+------+------+------+ | TC,5 | EC,3 | C1,6 | C2,6 | C3,6 | C4,6 | C5,6 | C6,6 | C7,6 | C8,6 | +------+------+------+------+------+------+------+------+------+------+
TC = 00100b = 4 ، وكل رمز C1-C8 يحتوي على رموز ، يجب أن تتطابق مع الفهارس في هذه السلسلة:
#ABCDEFGHIJKLMNOPQRSTUVWXYZ ##### _ ################# 0123456789 ######
بعد فك تشفيرها ، أصبح من السهل الحصول على اسم الطائرة: EWG7184
symbols = "#ABCDEFGHIJKLMNOPQRSTUVWXYZ#####_###############0123456789######" code_str = "" for p in range(8): c = int(bits_str[8 + 6*p:8 + 6*(p + 1)], 2) code_str += symbols[c] print("Aircraft Identification:", code_str.replace('#', ''))
موقف المحمولة جواكان فك تشفير الاسم بسيطًا ، لكن الإحداثيات أكثر تعقيدًا. يتم نقلها في شكل 2 إطارات ، وحتى غريبة. رمز الحقل TC = 01011b = 11.

مثال على إطارات البيانات الفردية والزوجية:
01011 000 000101110110 00 10111000111001000 10000110101111001 01011 000 000110010000 01 10010011110000110 10000011110001000
يستخدم حساب الإحداثيات نفسها صيغة صعبة بعض الشيء:

(
المصدر )
أنا لست خبيرا في نظم المعلومات الجغرافية ، لذلك لا أعرف من أين تأتي. من يعرف ذلك بشكل أفضل ، يرجى كتابة التعليقات.
حساب الارتفاع أبسط - اعتمادًا على بت معين ، يمكن تمثيله على أنه مضاعف 25 أو 100 قدم.
السرعة المحمولة جواDataframe with TC = 19. الشيء المثير للاهتمام هنا هو أن السرعة يمكن أن تكون ذات صلة بالأرض (أكثر دقة ، تسمى السرعة الأرضية) ، و Airspeed ، المقاسة بواسطة مستشعر هواء الطائرة (يمكن أن تكون أقل دقة بسبب الرياح). يتم نقل العديد من المجالات المختلفة الأخرى أيضًا:

(
المصدر )
استنتاج
كما نرى ، أصبحت تقنية ADS-B تعايشًا مثيرًا للاهتمام ، عندما يكون المعيار قابلاً للاستخدام على نطاق واسع ليس فقط للمحترفين ، ولكن أيضًا للمستخدمين العاديين. ولكن من المؤكد أن الدور الرئيسي في ذلك تم بواسطة تخفيض تكلفة تقنية مستقبلات SDR الرقمية ، والتي تتيح استقبال الإشارات بتردد أعلى من جيجاهيرتز على جهاز رخيص للغاية.
المعيار نفسه ، بالطبع ، لديه المزيد من البيانات. يمكن للمهتمين عرض ملف PDF على الصفحة
ICAO أو زيارة
موقع mode-s.org المذكور أعلاه. من غير المحتمل أن يستخدم معظم القراء هذه المقالة حقًا ، لكنني آمل أن تكون الفكرة العامة حول كيفية عملها على الأقل أكثر وضوحًا الآن.
بالمناسبة ، وحدة فك ترميز ADS-B Python موجودة بالفعل ، ويمكن التحقيق
في جيثب . يمكن لمالكي مستقبلات حقوق السحب الخاصة أيضًا إنشاء وتشغيل وحدة فك ترميز ADS-B جاهزة للاستخدام
من هذه الصفحة ، و (سأكرر مرة أخرى) بعض التفاصيل التي قمنا أيضًا بتوضيحها في
الجزء الأول من هذه المقالة.
يتم إعطاء رمز مصدر المحلل اللغوي ، الموضح أعلاه ، تحت المفسد. هذا مجرد مثال اختبار لا يتظاهر بجودة الإنتاج ، ولكنه يعمل بشكل عام ، ويمكنه تحليل
ملف WAV ، المسجل أعلاه.
شفرة المصدر (بيثون) from __future__ import print_function from scipy.io import wavfile from scipy import signal import matplotlib.pyplot as plt import numpy as np import math import sys def parse_message(data, start, bit_len): max_len = bit_len*128 A = data[start:start + max_len] A = signal.resample(A, 10*max_len) bits = np.zeros(10*max_len) bit_len *= 10 start_data = bit_len*8
آمل أن تكون مفيدة ، شكرا للقراءة.