Flightradar24 - แžแžพแžœแžถแžŠแŸ†แžŽแžพแžšแž€แžถแžšแž™แŸ‰แžถแž„แžŠแžผแž…แž˜แŸ’แžแŸแž…? แž•แŸ’แž“แŸ‚แž€แž‘แžธ 2 แž–แžทแž’แžธแž€แžถแžš ADS-B

แžŸแžฝแžŸแŸ’แžแžธ Habr แŸ” แž”แŸ’แžšแž แŸ‚แž›โ€‹แž‡แžถโ€‹แžขแŸ’แž“แž€โ€‹แžšแžถแž›แŸ‹โ€‹แž‚แŸ’แž“แžถโ€‹แžŠแŸ‚แž›โ€‹แž’แŸ’แž›แžถแž”แŸ‹โ€‹แž‡แžฝแž” แžฌโ€‹แžƒแžพแž‰โ€‹แžŸแžถแž…แŸ‹โ€‹แž‰แžถแžแžท แžฌโ€‹แž˜แžทแžแŸ’แžโ€‹แž—แž€แŸ’แžแžทโ€‹แž“แŸ…โ€‹แž›แžพโ€‹แž™แž“แŸ’แžโ€‹แž แŸ„แŸ‡โ€‹แž”แžถแž“โ€‹แž”แŸ’แžšแžพโ€‹แžŸแŸแžœแžถ Flightradar24 แžŠแŸ„แž™โ€‹แžฅแžโ€‹แž‚แžทแžโ€‹แžแŸ’แž›แŸƒแŸ” แž“แŸแŸ‡แž‚แžบแž‡แžถแž˜แž’แŸ’แž™แŸ„แž”แžถแž™แžŠแŸแž„แžถแž™แžŸแŸ’แžšแžฝแž›แž”แŸ†แž•แžปแžแž€แŸ’แž“แžปแž„แž€แžถแžšแžแžถแž˜แžŠแžถแž“แž‘แžธแžแžถแŸ†แž„แžšแž”แžŸแŸ‹แž™แž“แŸ’แžแž แŸ„แŸ‡แž€แŸ’แž“แžปแž„แž–แŸแž›แž‡แžถแž€แŸ‹แžŸแŸ’แžแŸ‚แž„แŸ”

Flightradar24 - แžแžพแžœแžถแžŠแŸ†แžŽแžพแžšแž€แžถแžšแž™แŸ‰แžถแž„แžŠแžผแž…แž˜แŸ’แžแŸแž…? แž•แŸ’แž“แŸ‚แž€แž‘แžธ 2 แž–แžทแž’แžธแž€แžถแžš ADS-B

ะ’ แž•แŸ’แž“แŸ‚แž€แžŠแŸ†แž”แžผแž„แŸ” แž‚แŸ„แž›แž€แžถแžšแžŽแŸแž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž€แžถแžšแž“แŸƒแžŸแŸแžœแžถแž€แž˜แŸ’แž˜แžขแž“แžกแžถแž‰แž”แŸ‚แž”แž“แŸแŸ‡แžแŸ’แžšแžผแžœแž”แžถแž“แž–แžทแž–แžŽแŸŒแž“แžถแŸ” แžฅแžกแžผแžœแž“แŸแŸ‡ แž™แžพแž„แž“แžนแž„แž”แž“แŸ’แžแžŸแŸ’แžœแŸ‚แž„แž™แž›แŸ‹แžแžถแžแžพแž‘แžทแž“แŸ’แž“แž“แŸแž™แžขแŸ’แžœแžธแžแŸ’แž›แŸ‡แžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž”แžถแž“แž•แŸ’แž‰แžพ แž“แžทแž„แž‘แž‘แžฝแž›แž–แžธแž™แž“แŸ’แžแž แŸ„แŸ‡แž‘แŸ…แž€แžถแž“แŸ‹แžŸแŸ’แžแžถแž“แžธแž™แž‘แž‘แžฝแž› แž แžพแž™แž’แŸ’แžœแžพแž€แžถแžšแžŒแžทแž€แžผแžŠแžœแžถแžŠแŸ„แž™แžแŸ’แž›แžฝแž“แžฏแž„แžŠแŸ„แž™แž”แŸ’แžšแžพ Python แŸ”

ะ˜ัั‚ะพั€ะธั

แž‡แžถแž€แŸ‹แžŸแŸ’แžแŸ‚แž„ แž‘แžทแž“แŸ’แž“แž“แŸแž™แž™แž“แŸ’แžแž แŸ„แŸ‡แž˜แžทแž“แžแŸ’แžšแžผแžœแž”แžถแž“แž”แž‰แŸ’แž‡แžผแž“แžฑแŸ’แž™แžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แž˜แžพแž›แžƒแžพแž‰แž“แŸ…แž›แžพแžŸแŸ’แž˜แžถแžแž แŸ’แžœแžผแž“แžšแž”แžŸแŸ‹แž–แžฝแž€แž‚แŸแž“แŸ„แŸ‡แž‘แŸแŸ” แž”แŸ’แžšแž–แŸแž“แŸ’แž’แž“แŸแŸ‡แžแŸ’แžšแžผแžœแž”แžถแž“แž‚แŸแž แŸ…แžแžถ ADS-B (แž€แžถแžšแžƒแŸ’แž›แžถแŸ†แž˜แžพแž›แžŠแŸ„แž™แžŸแŸ’แžœแŸแž™แž”แŸ’แžšแžœแžแŸ’แž-แž•แŸ’แžŸแžถแž™) แž แžพแž™แžแŸ’แžšแžผแžœแž”แžถแž“แž”แŸ’แžšแžพแžŠแžพแž˜แŸ’แž”แžธแž”แž‰แŸ’แž‡แžผแž“แž–แŸแžแŸŒแž˜แžถแž“แžขแŸ†แž–แžธแž™แž“แŸ’แžแž แŸ„แŸ‡แžŠแŸ„แž™แžŸแŸ’แžœแŸแž™แž”แŸ’แžšแžœแžแŸ’แžแžทแž‘แŸ…แž€แžถแž“แŸ‹แž˜แž‡แŸ’แžˆแž˜แžŽแŸ’แžŒแž›แž”แž‰แŸ’แž‡แžถ - แžงแž”แž€แžšแžŽแŸแž€แŸ†แžŽแžแŸ‹แžขแžแŸ’แžแžŸแž‰แŸ’แž‰แžถแžŽ แž€แžผแžขแžšแžŠแŸ„แž“แŸ แž‘แžทแžŸแžŠแŸ… แž›แŸ’แž”แžฟแž“ แžšแž™แŸˆแž€แž˜แŸ’แž–แžŸแŸ‹ แž“แžทแž„แž‘แžทแž“แŸ’แž“แž“แŸแž™แž•แŸ’แžŸแŸแž„แž‘แŸ€แžแžšแž”แžŸแŸ‹แžœแžถแžแŸ’แžšแžผแžœแž”แžถแž“แž”แž‰แŸ’แž‡แžผแž“แŸ” แž–แžธแž˜แžปแž“ แž˜แžปแž“แž–แŸแž›แž€แžถแžšแž˜แž€แžŠแž›แŸ‹แž“แŸƒแž”แŸ’แžšแž–แŸแž“แŸ’แž’แž”แŸ‚แž”แž“แŸแŸ‡ แžขแŸ’แž“แž€แž”แž‰แŸ’แž‡แžผแž“แžขแžถแž…แž˜แžพแž›แžƒแžพแž‰แžแŸ‚แž…แŸ†แžŽแžปแž…แž˜แžฝแž™แž“แŸ…แž›แžพแžšแŸ‰แžถแžŠแžถแž”แŸ‰แžปแžŽแŸ’แžŽแŸ„แŸ‡แŸ” แž“แŸแŸ‡แž˜แžทแž“แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแžถแž“แŸ‹แž‘แŸ€แžแž‘แŸ แž“แŸ…แž–แŸแž›แžŠแŸ‚แž›แž˜แžถแž“แž™แž“แŸ’แžแž แŸ„แŸ‡แž…แŸ’แžšแžพแž“แž–แŸแž€แŸ”

แžแžถแž˜แž”แž…แŸ’แž…แŸแž€แž‘แŸแžŸ ADS-B แž˜แžถแž“แžงแž”แž€แžšแžŽแŸแž”แž‰แŸ’แž‡แžผแž“แž“แŸ…แž›แžพแž™แž“แŸ’แžแž แŸ„แŸ‡แžŠแŸ‚แž›แž”แž‰แŸ’แž‡แžผแž“แž€แž‰แŸ’แž…แž”แŸ‹แž–แŸแžแŸŒแž˜แžถแž“แžแžถแž˜แž€แžถแž›แž€แŸ†แžŽแžแŸ‹แž“แŸ…แž”แŸ’แžšแŸแž€แž„แŸ‹แžแŸ’แž–แžŸแŸ‹ 1090 MHz (แž˜แžถแž“แžšแž”แŸ€แž”แž•แŸ’แžŸแŸแž„แž‘แŸ€แž แž”แŸ‰แžปแž“แŸ’แžแŸ‚แž™แžพแž„แž˜แžทแž“แžŸแžผแžœแž…แžถแž”แŸ‹แžขแžถแžšแž˜แŸ’แž˜แžŽแŸแž“แžนแž„แž–แžฝแž€แžœแžถแž‘แŸ แž–แŸ’แžšแŸ„แŸ‡แž€แžผแžขแžšแžŠแŸ„แž“แŸแžแŸ’แžšแžผแžœแž”แžถแž“แž”แž‰แŸ’แž‡แžผแž“แžแŸ‚แž“แŸ…แž‘แžธแž“แŸแŸ‡)แŸ” แž‡แžถแž€แžถแžšแž–แžทแžแžŽแžถแžŸแŸ‹ แž”แž“แŸ’แžแŸ‚แž˜แž–แžธแž›แžพแžงแž”แž€แžšแžŽแŸแž”แž‰แŸ’แž‡แžผแž“ แž€แŸแž˜แžถแž“แžขแŸ’แž“แž€แž‘แž‘แžฝแž›แž“แŸ…แž€แž“แŸ’แž›แŸ‚แž„แžŽแžถแž˜แžฝแž™แž“แŸ…แžขแžถแž€แžถแžŸแž™แžถแž“แžŠแŸ’แž‹แžถแž“แž•แž„แžŠแŸ‚แžš แž”แŸ‰แžปแž“แŸ’แžแŸ‚แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž™แžพแž„แž‡แžถแžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹ แžขแŸ’แž“แž€แž‘แž‘แžฝแž›แž•แŸ’แž‘แžถแž›แŸ‹แžšแž”แžŸแŸ‹แž™แžพแž„แž‚แžบแž‚แžฝแžšแžฑแŸ’แž™แž…แžถแž”แŸ‹แžขแžถแžšแž˜แŸ’แž˜แžŽแŸแŸ”

แžŠแŸ„แž™แžœแžทแž’แžธแž“แŸแŸ‡ แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแž”แŸ’แžšแŸ€แž”แž’แŸ€แž” แž”แŸ’แžšแž–แŸแž“แŸ’แž’แžŠแŸ†แž”แžผแž„แž”แŸ‚แž”แž“แŸแŸ‡แž‚แžบ Airnav Radarbox แžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž”แžถแž“แžšแž…แž“แžถแžกแžพแž„แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แž’แž˜แŸ’แž˜แžแžถ แž”แžถแž“แž”แž„แŸ’แž แžถแž‰แžแŸ’แž›แžฝแž“แž“แŸ…แž†แŸ’แž“แžถแŸ† 2007 แž“แžทแž„แž˜แžถแž“แžแž˜แŸ’แž›แŸƒแž”แŸ’แžšแž แŸ‚แž› 900 แžŠแžปแž›แŸ’แž›แžถแžš แž“แžทแž„แž”แŸ’แžšแž แŸ‚แž› 250$ แž€แžถแžšแž‡แžถแžœแžŸแŸแžœแžถแž€แž˜แŸ’แž˜แž”แžŽแŸ’แžแžถแž‰แž˜แžถแž“แžแž˜แŸ’แž›แŸƒแž€แŸ’แž“แžปแž„แž˜แžฝแž™แž†แŸ’แž“แžถแŸ†แŸ”

Flightradar24 - แžแžพแžœแžถแžŠแŸ†แžŽแžพแžšแž€แžถแžšแž™แŸ‰แžถแž„แžŠแžผแž…แž˜แŸ’แžแŸแž…? แž•แŸ’แž“แŸ‚แž€แž‘แžธ 2 แž–แžทแž’แžธแž€แžถแžš ADS-B

แž€แžถแžšแž–แžทแž“แžทแžแŸ’แž™แžกแžพแž„แžœแžทแž‰แž“แŸƒแž˜แŸ’แž…แžถแžŸแŸ‹แž‡แž“แž‡แžถแžแžทแžšแžปแžŸแŸ’แžŸแŸŠแžธแžŠแŸ†แž”แžผแž„แž‚แŸแžขแžถแž…แžขแžถแž“แž”แžถแž“แž“แŸ…แž›แžพแžœแŸแž‘แžทแž€แžถ แž˜แŸ‰แžถแžŸแŸŠแžธแž“แžŸแŸ’แž€แŸแž“แžœแžทแž‘แŸ’แž™แžป. แžฅแžกแžผแžœแž“แŸแŸ‡แžขแŸ’แž“แž€แž‘แž‘แžฝแž› RTL-SDR แž”แžถแž“แž€แŸ’แž›แžถแž™แž‡แžถแžขแžถแž…แž”แŸ’แžšแžพแž”แžถแž“แž™แŸ‰แžถแž„แž‘แžผแž›แŸ†แž‘แžผแž›แžถแž™ แžงแž”แž€แžšแžŽแŸแžŸแŸ’แžšแžŠแŸ€แž„แž‚แŸ’แž“แžถแž“แŸแŸ‡แžขแžถแž…แžแŸ’แžšแžผแžœแž”แžถแž“แž•แŸ’แž‚แžปแŸ†แž€แŸ’แž“แžปแž„แžแž˜แŸ’แž›แŸƒ 30 แžŠแžปแž›แŸ’แž›แžถแžšแŸ” แž”แž“แŸ’แžแŸ‚แž˜แž‘แŸ€แžแžขแŸ†แž–แžธแž“แŸแŸ‡แž‚แžบแž“แŸ…แž€แŸ’แž“แžปแž„ แž•แŸ’แž“แŸ‚แž€แžŠแŸ†แž”แžผแž„แŸ”. แž…แžผแžšแž”แž“แŸ’แžแž‘แŸ…แž–แžทแž’แžธแž€แžถแžšแžŠแŸ„แž™แžแŸ’แž›แžฝแž“แžฏแž„ - แžแŸ„แŸ‡แž˜แžพแž›แžšแž”แŸ€แž”แžŠแŸ‚แž›แžœแžถแžŠแŸ†แžŽแžพแžšแž€แžถแžšแŸ”

แž€แžถแžšแž‘แž‘แžฝแž›แžŸแž‰แŸ’แž‰แžถ

แž‘แžธแž˜แžฝแž™ แžŸแž‰แŸ’แž‰แžถแžแŸ’แžšแžผแžœแž€แžแŸ‹แžแŸ’แžšแžถแŸ” แžŸแž‰แŸ’แž‰แžถแž‘แžถแŸ†แž„แž˜แžผแž›แž˜แžถแž“แžแžทแžšแžœแŸแž›แžถแžแŸ’แžšแžนแž˜แžแŸ‚ 120 แž˜แžธแž€แŸ’แžšแžผแžœแžทแž“แžถแž‘แžธแž”แŸ‰แžปแžŽแŸ’แžŽแŸ„แŸ‡ แžŠแžผแž…แŸ’แž“แŸแŸ‡แžŠแžพแž˜แŸ’แž”แžธแž„แžถแž™แžŸแŸ’แžšแžฝแž›แž”แŸ†แž”แŸ‚แž€แžŸแž˜แžถแžŸแž’แžถแžแžปแžšแž”แžŸแŸ‹แžœแžถ แžขแŸ’แž“แž€แž‘แž‘แžฝแž› SDR แžŠแŸ‚แž›แž˜แžถแž“แž”แŸ’แžšแŸแž€แž„แŸ‹แž‚แŸ†แžšแžผแž™แŸ‰แžถแž„แž แŸ„แž…แžŽแžถแžŸแŸ‹ 5 MHz แž‚แžบแž‡แžถแž€แžถแžšแž…แž„แŸ‹แž”แžถแž“แŸ”

Flightradar24 - แžแžพแžœแžถแžŠแŸ†แžŽแžพแžšแž€แžถแžšแž™แŸ‰แžถแž„แžŠแžผแž…แž˜แŸ’แžแŸแž…? แž•แŸ’แž“แŸ‚แž€แž‘แžธ 2 แž–แžทแž’แžธแž€แžถแžš ADS-B

แž”แž“แŸ’แž‘แžถแž”แŸ‹แž–แžธแž€แžถแžšแžแž แž™แžพแž„แž‘แž‘แžฝแž›แž”แžถแž“แžฏแž€แžŸแžถแžš WAV แžŠแŸ‚แž›แž˜แžถแž“แžขแžแŸ’แžšแžถแž‚แŸ†แžšแžผ 5000000 แž‚แŸ†แžšแžผ/แžœแžทแž“แžถแž‘แžธ; 30 แžœแžทแž“แžถแž‘แžธแž“แŸƒแž€แžถแžšแžแžแž”แŸ‚แž”แž“แŸแŸ‡ "แžแŸ’แž›แžนแž„แžแŸ’แž›แŸ‚แž„" แž”แŸ’แžšแž แŸ‚แž› 500MB แŸ” แž€แžถแžšแžŸแŸ’แžแžถแž”แŸ‹แžœแžถแž‡แžถแž˜แžฝแž™แž€แž˜แŸ’แž˜แžœแžทแž’แžธแž…แžถแž€แŸ‹แž˜แŸแžŒแŸ€ แž–แžทแžแžŽแžถแžŸแŸ‹แž‚แžบแž‚แŸ’แž˜แžถแž“แž”แŸ’แžšแž™แŸ„แž‡แž“แŸแž‘แŸ - แžฏแž€แžŸแžถแžšแž˜แžทแž“แž˜แžถแž“แžŸแŸ†แžกแŸแž„แž‘แŸ แž”แŸ‰แžปแž“แŸ’แžแŸ‚แž‡แžถแžŸแž‰แŸ’แž‰แžถแžœแžทแž‘แŸ’แž™แžปแžŒแžธแž‡แžธแžแž›แž•แŸ’แž‘แžถแž›แŸ‹ - แž“แŸแŸ‡แž‚แžบแž‡แžถแžšแž”แŸ€แž”แžŠแŸ‚แž›แž€แž˜แŸ’แž˜แžœแžทแž’แžธแž€แŸ†แžŽแžแŸ‹แžœแžทแž‘แŸ’แž™แžปแžŠแŸ†แžŽแžพแžšแž€แžถแžšแŸ”

แž™แžพแž„แž“แžนแž„แž”แžพแž€ แž“แžทแž„แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžฏแž€แžŸแžถแžšแžŠแŸ„แž™แž”แŸ’แžšแžพ Python แŸ” แžขแŸ’แž“แž€แžŠแŸ‚แž›แž…แž„แŸ‹แž–แžทแžŸแŸ„แž’แž“แŸแžŠแŸ„แž™แžแŸ’แž›แžฝแž“แžฏแž„แžขแžถแž…แž‘แžถแž‰แž™แž€แž€แžถแžšแžแžแžงแž‘แžถแž แžšแžŽแŸ แžแŸ†แžŽแž—แŸ’แž‡แžถแž”แŸ‹.

แžแŸ„แŸ‡แž‘แžถแž‰แž™แž€แžฏแž€แžŸแžถแžš แž แžพแž™แž˜แžพแž›แžขแŸ’แžœแžธแžŠแŸ‚แž›แž“แŸ…แžแžถแž„แž€แŸ’แž“แžปแž„แŸ”

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()

แž›แž‘แŸ’แž’แž•แž›แŸ– แž™แžพแž„แžƒแžพแž‰ "แž‡แžธแž–แž…แžš" แž‡แžถแž€แŸ‹แžŸแŸ’แžแŸ‚แž„แž”แŸ’แžšแž†แžถแŸ†แž„แž“แžนแž„แžŸแŸ†แž›แŸแž„แžšแŸ†แžแžถแž“แž•แŸ’แž‘แŸƒแžแžถแž„แž€แŸ’แžšแŸ„แž™แŸ”

Flightradar24 - แžแžพแžœแžถแžŠแŸ†แžŽแžพแžšแž€แžถแžšแž™แŸ‰แžถแž„แžŠแžผแž…แž˜แŸ’แžแŸแž…? แž•แŸ’แž“แŸ‚แž€แž‘แžธ 2 แž–แžทแž’แžธแž€แžถแžš ADS-B

"แž‡แžธแž–แž…แžš" แž“แžธแž˜แžฝแž™แŸ—แž‚แžบแž‡แžถแžŸแž‰แŸ’แž‰แžถแž˜แžฝแž™แžŠแŸ‚แž›แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แžขแžถแž…แž˜แžพแž›แžƒแžพแž‰แž™แŸ‰แžถแž„แž…แŸ’แž”แžถแžŸแŸ‹แž”แŸ’แžšแžŸแžทแž“แž”แžพแžขแŸ’แž“แž€แž”แž„แŸ’แž€แžพแž“แž‚แžปแžŽแž—แžถแž–แž”แž„แŸ’แž แžถแž‰แž“แŸ…แž›แžพแž€แŸ’แžšแžถแž แŸ’แžœแŸ”

Flightradar24 - แžแžพแžœแžถแžŠแŸ†แžŽแžพแžšแž€แžถแžšแž™แŸ‰แžถแž„แžŠแžผแž…แž˜แŸ’แžแŸแž…? แž•แŸ’แž“แŸ‚แž€แž‘แžธ 2 แž–แžทแž’แžธแž€แžถแžš ADS-B

แžŠแžผแž…แžŠแŸ‚แž›แžขแŸ’แž“แž€แžขแžถแž…แžƒแžพแž‰แžšแžผแž”แž—แžถแž–แž‚แžบแž–แžทแžแž‡แžถแžŸแŸ’แžšแž”แž‘แŸ…แž“แžนแž„แžขแŸ’แžœแžธแžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž”แžถแž“แž•แŸ’แžแž›แŸ‹แžฑแŸ’แž™แž“แŸ…แž€แŸ’แž“แžปแž„แž€แžถแžšแž–แžทแž–แžŽแŸŒแž“แžถแžแžถแž„แž›แžพแŸ” แžขแŸ’แž“แž€แžขแžถแž…แž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž‘แžทแž“แŸ’แž“แž“แŸแž™แŸ”

แž€แžถแžšแžŒแžทแž€แžผแžŠ

แžŠแŸ†แž”แžผแž„แžขแŸ’แž“แž€แžแŸ’แžšแžผแžœแž‘แž‘แžฝแž›แž”แžถแž“แžŸแŸ’แž‘แŸ’แžšแžธแž˜แž”แž“แŸ’แžแžทแž…แŸ” แžŸแž‰แŸ’แž‰แžถแžแŸ’แž›แžฝแž“แžœแžถแžแŸ’แžšแžผแžœแž”แžถแž“แžขแŸŠแžทแž“แž€แžผแžŠแžŠแŸ„แž™แž”แŸ’แžšแžพแž€แžถแžšแžขแŸŠแžทแž“แž€แžผแžŠ ManchesterแŸ–

Flightradar24 - แžแžพแžœแžถแžŠแŸ†แžŽแžพแžšแž€แžถแžšแž™แŸ‰แžถแž„แžŠแžผแž…แž˜แŸ’แžแŸแž…? แž•แŸ’แž“แŸ‚แž€แž‘แžธ 2 แž–แžทแž’แžธแž€แžถแžš ADS-B

แž–แžธแž—แžถแž–แžแžปแžŸแž‚แŸ’แž“แžถแž“แŸƒแž€แž˜แŸ’แžšแžทแžแž“แŸ…แž€แŸ’แž“แžปแž„ nibbles แžœแžถแž„แžถแž™แžŸแŸ’แžšแžฝแž›แž€แŸ’แž“แžปแž„แž€แžถแžšแž‘แž‘แžฝแž›แž”แžถแž“ "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"

แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แž“แŸƒแžŸแž‰แŸ’แž‰แžถแžแŸ’แž›แžฝแž“แžฏแž„แž˜แžถแž“แžŠแžผแž…แžแžถแž„แž€แŸ’แžšแŸ„แž˜:

Flightradar24 - แžแžพแžœแžถแžŠแŸ†แžŽแžพแžšแž€แžถแžšแž™แŸ‰แžถแž„แžŠแžผแž…แž˜แŸ’แžแŸแž…? แž•แŸ’แž“แŸ‚แž€แž‘แžธ 2 แž–แžทแž’แžธแž€แžถแžš ADS-B

แžŸแžผแž˜แž€แŸ’แžšแžกแŸแž€แž˜แžพแž›แžœแžถแž›แžฑแŸ’แž™แž”แžถแž“แž›แŸ†แžขแžทแžแŸ”

DF (แž‘แž˜แŸ’แžšแž„แŸ‹แžแŸ†แžŽแžแžถแž„แž€แŸ’แžšแŸ„แž˜ 5 แž”แŸŠแžธแž) - แž€แŸ†แžŽแžแŸ‹แž”แŸ’แžšแž—แŸแž‘แž“แŸƒแžŸแžถแžšแŸ” แž˜แžถแž“แž…แŸ’แžšแžพแž“แž”แŸ’แžšแž—แŸแž‘แŸ–

Flightradar24 - แžแžพแžœแžถแžŠแŸ†แžŽแžพแžšแž€แžถแžšแž™แŸ‰แžถแž„แžŠแžผแž…แž˜แŸ’แžแŸแž…? แž•แŸ’แž“แŸ‚แž€แž‘แžธ 2 แž–แžทแž’แžธแž€แžถแžš ADS-B
(แž”แŸ’แžšแž—แž–แžแžถแžšแžถแž„)

แž™แžพแž„แž…แžถแž”แŸ‹แžขแžถแžšแž˜แŸ’แž˜แžŽแŸแžแŸ‚แž”แŸ’แžšแž—แŸแž‘ DF17 แž‘แŸแž–แŸ’แžšแŸ„แŸ‡... แžœแžถแž‚แžบแž‡แžถแž“แŸแŸ‡แžŠแŸ‚แž›แž˜แžถแž“แž€แžผแžขแžšแžŠแŸ„แž“แŸแž“แŸƒแž™แž“แŸ’แžแž แŸ„แŸ‡แŸ”

ICAO (24 แž”แŸŠแžธแž) - แž›แŸแžแž€แžผแžŠแžขแž“แŸ’แžแžšแž‡แžถแžแžทแž“แŸƒแž™แž“แŸ’แžแž แŸ„แŸ‡แŸ” แžขแŸ’แž“แž€แžขแžถแž…แž–แžทแž“แžทแžแŸ’แž™แž˜แžพแž›แž™แž“แŸ’แžแž แŸ„แŸ‡แžŠแŸ„แž™แž›แŸแžแž€แžผแžŠแžšแž”แžŸแŸ‹แžœแžถแŸ” แž›แžพแž”แžŽแŸ’แžแžถแž‰ (แž‡แžถแžขแž€แžปแžŸแž› แžขแŸ’แž“แž€แž“แžทแž–แž“แŸ’แž’แž”แžถแž“แžˆแž”แŸ‹แž’แŸ’แžœแžพแž”แž…แŸ’แž…แžปแž”แŸ’แž”แž“แŸ’แž“แž—แžถแž–แž˜แžผแž›แžŠแŸ’แž‹แžถแž“แž‘แžทแž“แŸ’แž“แž“แŸแž™ แž”แŸ‰แžปแž“แŸ’แžแŸ‚แžœแžถแž“แŸ…แžแŸ‚แž–แžถแž€แŸ‹แž–แŸแž“แŸ’แž’)แŸ” แžงแž‘แžถแž แžšแžŽแŸ แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž›แŸแžแž€แžผแžŠ 3c5ee2 แž™แžพแž„แž˜แžถแž“แž–แŸแžแŸŒแž˜แžถแž“แžŠแžผแž…แžแžถแž„แž€แŸ’แžšแŸ„แž˜แŸ–

Flightradar24 - แžแžพแžœแžถแžŠแŸ†แžŽแžพแžšแž€แžถแžšแž™แŸ‰แžถแž„แžŠแžผแž…แž˜แŸ’แžแŸแž…? แž•แŸ’แž“แŸ‚แž€แž‘แžธ 2 แž–แžทแž’แžธแž€แžถแžš ADS-B

แž€แŸ‚แžŸแž˜แŸ’แžšแžฝแž›แŸ– แž€แŸ’แž“แžปแž„ แž™แŸ„แž”แž›แŸ‹แž‘แŸ…แžขแžแŸ’แžแž”แž‘ แž€แžถแžšแž–แžทแž–แžŽแŸŒแž“แžถแž“แŸƒแž€แžผแžŠ ICAO แžแŸ’แžšแžผแžœแž”แžถแž“แž•แŸ’แžแž›แŸ‹แžฑแŸ’แž™แž™แŸ‰แžถแž„แž›แž˜แŸ’แžขแžทแž แžแŸ’แž‰แžปแŸ†แžŸแžผแž˜แžŽแŸ‚แž“แžถแŸ†แžฑแŸ’แž™แžขแŸ’แž“แž€แžŠแŸ‚แž›แž…แžถแž”แŸ‹แžขแžถแžšแž˜แŸ’แž˜แžŽแŸแžขแžถแž“แžœแžถแŸ”

แž‘แžทแž“แŸ’แž“แž“แŸแž™ (56 แžฌ 112 แž”แŸŠแžธแž) - แž‘แžทแž“แŸ’แž“แž“แŸแž™แž–แžทแžแž”แŸ’แžšแžถแž€แžŠแžŠแŸ‚แž›แž™แžพแž„แž“แžนแž„แžŒแžทแž€แžผแžŠแŸ” แž‘แžทแž“แŸ’แž“แž“แŸแž™ 5 แž”แŸŠแžธแžแžŠแŸ†แž”แžผแž„แž‚แžบแž‡แžถแžœแžถแž› แž”แŸ’แžšแž—แŸแž‘แž€แžผแžŠแžŠแŸ‚แž›แž˜แžถแž“แž”แŸ’แžšแž—แŸแž‘แžšแž„แž“แŸƒแž‘แžทแž“แŸ’แž“แž“แŸแž™แžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž”แžถแž“แžšแž€แŸ’แžŸแžถแž‘แžปแž€ (แž˜แžทแž“แžแŸ’แžšแžผแžœแž…แŸ’แžšแžกแŸ†แž‡แžถแž˜แžฝแž™ DF)แŸ” แž˜แžถแž“แž”แŸ’แžšแž—แŸแž‘แž‘แžถแŸ†แž„แž“แŸแŸ‡แž˜แžฝแž™แž…แŸ†แž“แžฝแž“แŸ–

Flightradar24 - แžแžพแžœแžถแžŠแŸ†แžŽแžพแžšแž€แžถแžšแž™แŸ‰แžถแž„แžŠแžผแž…แž˜แŸ’แžแŸแž…? แž•แŸ’แž“แŸ‚แž€แž‘แžธ 2 แž–แžทแž’แžธแž€แžถแžš ADS-B
(แž”แŸ’แžšแž—แž–แžแžถแžšแžถแž„)

แžŸแžผแž˜แž€แŸ’แžšแžกแŸแž€แž˜แžพแž›แžงแž‘แžถแž แžšแžŽแŸแž˜แžฝแž™แž…แŸ†แž“แžฝแž“แž“แŸƒแž€แž‰แŸ’แž…แž”แŸ‹แŸ”

แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžขแžแŸ’แžแžŸแž‰แŸ’แž‰แžถแžŽแž™แž“แŸ’แžแž แŸ„แŸ‡

แžงแž‘แžถแž แžšแžŽแŸแž€แŸ’แž“แžปแž„แž‘แž˜แŸ’แžšแž„แŸ‹แž‚แŸ„แž›แž–แžธแžšแŸ–

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 แŸ”

Flightradar24 - แžแžพแžœแžถแžŠแŸ†แžŽแžพแžšแž€แžถแžšแž™แŸ‰แžถแž„แžŠแžผแž…แž˜แŸ’แžแŸแž…? แž•แŸ’แž“แŸ‚แž€แž‘แžธ 2 แž–แžทแž’แžธแž€แžถแžš ADS-B

แžงแž‘แžถแž แžšแžŽแŸแž“แŸƒแž€แž‰แŸ’แž…แž”แŸ‹แž‚แžผ แž“แžทแž„แžŸแŸแžŸแŸ–

01011 000 000101110110 00 10111000111001000 10000110101111001
01011 000 000110010000 01 10010011110000110 10000011110001000

แž€แžถแžšโ€‹แž‚แžŽแž“แžถโ€‹แž€แžผแžขแžšแžŠแŸ„แžŽแŸโ€‹แžŠแŸ„แž™โ€‹แžแŸ’แž›แžฝแž“โ€‹แžœแžถโ€‹แž€แžพแžโ€‹แžกแžพแž„โ€‹แžŠแŸ„แž™โ€‹แž™แŸ„แž„โ€‹แžแžถแž˜โ€‹แžšแžผแž”แž˜แž“แŸ’แžโ€‹แžŠแŸ‚แž›โ€‹แž–แžทแž”แžถแž€โ€‹แž‡แžถแž„โ€‹แž“แŸแŸ‡แŸ–

Flightradar24 - แžแžพแžœแžถแžŠแŸ†แžŽแžพแžšแž€แžถแžšแž™แŸ‰แžถแž„แžŠแžผแž…แž˜แŸ’แžแŸแž…? แž•แŸ’แž“แŸ‚แž€แž‘แžธ 2 แž–แžทแž’แžธแž€แžถแžš ADS-B
(แž”แŸ’แžšแž—แž–)

แžแŸ’แž‰แžปแŸ†แž˜แžทแž“แž˜แŸ‚แž“แž‡แžถแžขแŸ’แž“แž€แž‡แŸ†แž“แžถแž‰ GIS แž‘แŸ แžŠแžผแž…แŸ’แž“แŸแŸ‡แžแŸ’แž‰แžปแŸ†แž˜แžทแž“แžŠแžนแž„แžแžถแžœแžถแž˜แž€แž–แžธแžŽแžถแž‘แŸแŸ” แžขแŸ’แž“แž€แžŽแžถแžŠแžนแž„แžŸแžšแžŸแŸแžšแž€แŸ’แž“แžปแž„แž˜แžแžทแž™แŸ„แž”แž›แŸ‹แŸ”

แž€แž˜แŸ’แž–แžŸแŸ‹แžแŸ’แžšแžผแžœแž”แžถแž“แž‚แŸแž…แžถแžแŸ‹แž‘แžปแž€แžแžถแžŸแžถแž˜แž‰แŸ’แž‰แž‡แžถแž„ - แžขแžถแžŸแŸ’แžšแŸแž™แž›แžพแž”แŸŠแžธแžแž‡แžถแž€แŸ‹แž›แžถแž€แŸ‹แžœแžถแžขแžถแž…แžแŸ’แžšแžผแžœแž”แžถแž“แžแŸ†แžŽแžถแž„แžแžถแž‡แžถแž–แž แžปแž‚แžปแžŽแž“แŸƒ 25 แžฌ 100 แž แŸ’แžœแžธแžแŸ”

แž›แŸ’แž”แžฟแž“แžแŸ’แž™แž›แŸ‹

แž€แž‰แŸ’แž…แž”แŸ‹แž‡แžถแž˜แžฝแž™ TC = 19 แŸ” แžขแŸ’แžœแžธโ€‹แžŠแŸ‚แž›โ€‹แž‚แžฝแžšโ€‹แžฑแŸ’แž™โ€‹แž…แžถแž”แŸ‹โ€‹แžขแžถแžšแž˜แŸ’แž˜แžŽแŸโ€‹แž“แŸ…โ€‹แž‘แžธโ€‹แž“แŸแŸ‡โ€‹แž‚แžบโ€‹แžแžถ แž›แŸ’แž”แžฟแž“โ€‹แžขแžถแž…โ€‹แž˜แžถแž“โ€‹แž—แžถแž–โ€‹แžŸแžปแž€แŸ’แžšแžนแž แž‘แžถแž€แŸ‹แž‘แž„โ€‹แž‘แŸ…โ€‹แž“แžนแž„โ€‹แžŠแžธ (Ground Speed) แžฌโ€‹แžแŸ’แž™แž›แŸ‹โ€‹แžŠแŸ‚แž›โ€‹แžœแžถแžŸแŸ‹โ€‹แžŠแŸ„แž™โ€‹แžงแž”แž€แžšแžŽแŸโ€‹แž…แžถแž”แŸ‹โ€‹แžŸแž‰แŸ’แž‰แžถโ€‹แž™แž“แŸ’แžแž แŸ„แŸ‡ (Airspeed)แŸ” แžœแžถแž›แž•แŸ’แžŸแŸแž„แž‚แŸ’แž“แžถแž‡แžถแž…แŸ’แžšแžพแž“แžแŸ’แžšแžผแžœแž”แžถแž“แž”แž‰แŸ’แž‡แžผแž“แž•แž„แžŠแŸ‚แžš:

Flightradar24 - แžแžพแžœแžถแžŠแŸ†แžŽแžพแžšแž€แžถแžšแž™แŸ‰แžถแž„แžŠแžผแž…แž˜แŸ’แžแŸแž…? แž•แŸ’แž“แŸ‚แž€แž‘แžธ 2 แž–แžทแž’แžธแž€แžถแžš ADS-B
(แž”แŸ’แžšแž—แž–)

แžŸแŸแž…แž€แŸ’แžแžธแžŸแž“แŸ’แž“แžทแžŠแŸ’แž‹แžถแž“

แžŠแžผแž…แžŠแŸ‚แž›แžขแŸ’แž“แž€แžขแžถแž…แžƒแžพแž‰ แž”แž…แŸ’แž…แŸแž€แžœแžทแž‘แŸ’แž™แžถ ADS-B แž”แžถแž“แž€แŸ’แž›แžถแž™แž‡แžถแž“แžทแž˜แžทแžแŸ’แžแžŸแž‰แŸ’แž‰แžถแžŠแŸแž‚แžฝแžšแžฑแŸ’แž™แž…แžถแž”แŸ‹แžขแžถแžšแž˜แŸ’แž˜แžŽแŸแž˜แžฝแž™ แž“แŸ…แž–แŸแž›แžŠแŸ‚แž›แžŸแŸ’แžแž„แŸ‹แžŠแžถแžšแž˜แžฝแž™แž˜แžถแž“แž”แŸ’แžšแž™แŸ„แž‡แž“แŸแž˜แžทแž“แžแŸ’แžšแžนแž˜แžแŸ‚แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžขแŸ’แž“แž€แž‡แŸ†แž“แžถแž‰แž”แŸ‰แžปแžŽแŸ’แžŽแŸ„แŸ‡แž‘แŸ แž”แŸ‰แžปแž“แŸ’แžแŸ‚แž€แŸแžŸแž˜แŸ’แžšแžถแž”แŸ‹แžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แž’แž˜แŸ’แž˜แžแžถแž•แž„แžŠแŸ‚แžšแŸ” แž”แŸ‰แžปแž“แŸ’แžแŸ‚แž‡แžถแž€แžถแžšแž–แžทแžแžŽแžถแžŸแŸ‹ แžแžฝแž“แžถแž‘แžธแžŸแŸ†แžแžถแž“แŸ‹แž€แŸ’แž“แžปแž„แžšแžฟแž„แž“แŸแŸ‡แžแŸ’แžšแžผแžœแž”แžถแž“แž›แŸแž„แžŠแŸ„แž™แž”แž…แŸ’แž…แŸแž€แžœแžทแž‘แŸ’แž™แžถแžแŸ„แž€แž‡แžถแž„แž“แŸƒแžขแŸ’แž“แž€แž‘แž‘แžฝแž›แžŒแžธแž‡แžธแžแž› SDR แžŠแŸ‚แž›แžขแž“แžปแž‰แŸ’แž‰แžถแžแžฑแŸ’แž™แžงแž”แž€แžšแžŽแŸแž“แŸแŸ‡แž‘แž‘แžฝแž›แž”แžถแž“แžŸแž‰แŸ’แž‰แžถแžแžถแž˜แž–แŸ’แž™แž‰แŸ’แž‡แž“แŸˆแž‡แžถแž˜แžฝแž™แž“แžนแž„แž”แŸ’แžšแŸแž€แž„แŸ‹แž›แžพแžŸแž–แžธ gigahertz "แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแž€แŸ‹" แŸ”

แž“แŸ…แž€แŸ’แž“แžปแž„แžŸแŸ’แžแž„แŸ‹แžŠแžถแžšแžแŸ’แž›แžฝแž“แžœแžถแž–แžทแžแžŽแžถแžŸแŸ‹แž˜แžถแž“แž…แŸ’แžšแžพแž“แž‘แŸ€แžแŸ” แžขแŸ’แž“แž€แžŠแŸ‚แž›แž…แžถแž”แŸ‹แžขแžถแžšแž˜แŸ’แž˜แžŽแŸแžขแžถแž…แž˜แžพแž›แžฏแž€แžŸแžถแžš PDF แž“แŸ…แž›แžพแž‘แŸ†แž–แŸแžš ICAO แžฌแž…แžผแž›แž‘แŸ…แž€แžถแž“แŸ‹แž‚แŸแž แž‘แŸ†แž–แŸแžšแžŠแŸ‚แž›แž”แžถแž“แžšแŸ€แž”แžšแžถแž”แŸ‹แžแžถแž„แž›แžพ แžœแŸแž”แžŸแžถแž™.

แžœแžถแž˜แžทแž“แž‘แŸ†แž“แž„แžแžถแž‘แžถแŸ†แž„แžขแžŸแŸ‹แžแžถแž„แž›แžพแž“แžนแž„แž˜แžถแž“แž”แŸ’แžšแž™แŸ„แž‡แž“แŸแžŸแž˜แŸ’แžšแžถแž”แŸ‹แž˜แž“แžปแžŸแŸ’แžŸแž‡แžถแž…แŸ’แžšแžพแž“แž“แŸ„แŸ‡แž‘แŸแž”แŸ‰แžปแž“แŸ’แžแŸ‚แž™แŸ‰แžถแž„แž แŸ„แž…แžŽแžถแžŸแŸ‹แž‚แŸ†แž“แžทแžแž‘แžผแž‘แŸ…แž“แŸƒแžšแž”แŸ€แž”แžŠแŸ‚แž›แžœแžถแžŠแŸ†แžŽแžพแžšแž€แžถแžšแžแŸ’แž‰แžปแŸ†แžŸแž„แŸ’แžƒแžนแž˜แžแžถแž“แŸ…แžแŸ‚แž˜แžถแž“แŸ”

แžŠแŸ„แž™แžœแžทแž’แžธแž“แŸแŸ‡ แžงแž”แž€แžšแžŽแŸแžŒแžทแž€แžผแžŠแžŠแŸ‚แž›แžแŸ’แžšแŸ€แž˜แžšแžฝแž…แž‡แžถแžŸแŸ’แžšแŸแž…แž“แŸ…แž€แŸ’แž“แžปแž„ Python แž˜แžถแž“แžšแžฝแž…แž แžพแž™ แžขแŸ’แž“แž€แžขแžถแž…แžŸแžทแž€แŸ’แžŸแžถแžœแžถแž”แžถแž“ แž“แŸ…แž‘แžธแž“แŸแŸ‡. แž แžพแž™แž˜แŸ’แž…แžถแžŸแŸ‹แžขแŸ’แž“แž€แž‘แž‘แžฝแž› SDR แžขแžถแž…แž”แŸ’แžšแž˜แžผแž›แž•แŸ’แžแžปแŸ† แž“แžทแž„แž”แžพแž€แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžงแž”แž€แžšแžŽแŸแžŒแžทแž€แžผแžŠ ADS-B แžŠแŸ‚แž›แžแŸ’แžšแŸ€แž˜แžšแžฝแž…แž‡แžถแžŸแŸ’แžšแŸแž… แž–แžธแž‘แŸ†แž–แŸแžšแž“แŸแŸ‡แžแŸ’แžšแžผแžœแž”แžถแž“แž–แžทแž—แžถแž€แŸ’แžŸแžถแž›แž˜แŸ’แžขแžทแžแž”แž“แŸ’แžแŸ‚แž˜แž‘แŸ€แžแž“แŸ…แž€แŸ’แž“แžปแž„ แž•แŸ’แž“แŸ‚แž€แžŠแŸ†แž”แžผแž„แŸ”.

แž€แžผแžŠแž”แŸ’แžšแž—แž–แž“แŸƒแž’แžถแžแžปแž‰แŸ‚แž€แžŠแŸ‚แž›แž”แžถแž“แž–แžทแž–แžŽแŸŒแž“แžถแž“แŸ…แž€แŸ’แž“แžปแž„แžขแžแŸ’แžแž”แž‘แžแŸ’แžšแžผแžœแž”แžถแž“แž•แŸ’แžแž›แŸ‹แžฑแŸ’แž™แžแžถแž„แž€แŸ’แžšแŸ„แž˜แž€แžถแžšแž€แžถแžแŸ‹แŸ” แž“แŸแŸ‡โ€‹แž‡แžถโ€‹แžงแž‘แžถแž แžšแžŽแŸโ€‹แžŸแžถแž€แž›แŸ’แž”แž„โ€‹แžŠแŸ‚แž›โ€‹แž˜แžทแž“โ€‹แž’แŸ’แžœแžพโ€‹แž–แžปแžโ€‹แž‡แžถโ€‹แž•แž›แžทแžโ€‹แž‘แŸ แž”แŸ‰แžปแž“แŸ’แžแŸ‚โ€‹แžšแžฟแž„โ€‹แžแŸ’แž›แŸ‡โ€‹แžŠแŸ†แžŽแžพแžšแž€แžถแžšโ€‹แž€แŸ’แž“แžปแž„โ€‹แžœแžถ แž แžพแž™โ€‹แžœแžถโ€‹แžขแžถแž…โ€‹แž”แŸ’แžšแžพโ€‹แžŠแžพแž˜แŸ’แž”แžธโ€‹แž‰แŸ‚แž€โ€‹แžฏแž€แžŸแžถแžšโ€‹แžŠแŸ‚แž›โ€‹แž”แžถแž“โ€‹แž€แžแŸ‹แžแŸ’แžšแžถโ€‹แžแžถแž„แž›แžพแŸ”
แž€แžผแžŠแž”แŸ’แžšแž—แž– (Python)

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

    # Parse first 8 bits
    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 = int(bits_str[0:5], 2)

    # Aircraft address (db - https://junzis.com/adb/?q=3b1c5c )
    bits_str = ""
    for p in range(8, 32):
        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"
    # print "Aircraft address:", bits_str, hex(int(bits_str, 2))
    address = hex(int(bits_str, 2))

    # Filter specific aircraft (optional)
    # if address != "0x3c5ee2":
    #    return

    if df == 16 or df == 17 or df == 18 or df == 19 or df == 20 or df == 21:
        # print "Pos:", start, "DF:", msg_type

        # Data (56bit)
        bits_str = ""
        for p in range(32, 88):
            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"
                # bits[pos + bit_len / 2] = 50
            elif avg1 > avg2:
                bits_str += "1"

        # http://www.lll.lu/~edward/edward/adsb/DecodingADSBposition.html
        # print "Data:"
        # print bits_str[:8], bits_str[8:20],  bits_str[20:22], bits_str[22:22+17], bits_str[39:39+17]
        # Type Code:
        tc, ec = int(bits_str[:5], 2), int(bits_str[5:8], 2)
        # print("DF:", df, "TC:", tc)
        
        # 1 - 4  Aircraft identification
        # 5 - 8  Surface position
        # 9 - 18  Airborne position (w/ Baro Altitude)
        # 19  Airborne velocities

        if tc >= 1 and tc <= 4: # and (df == 17 or df == 18):
            print("Aircraft address:", address)
            print("Data:")
            print(bits_str[:8], bits_str[8:14],  bits_str[14:20], bits_str[20:26], bits_str[26:32], bits_str[32:38], bits_str[38:44])

            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('#', ''))
            print()
        if tc == 11:
            print("Aircraft address:", address)
            print("Data: (11)")
            print(bits_str[:8], bits_str[8:20],  bits_str[20:22], bits_str[22:22+17], bits_str[39:39+17])

            # Bit 22 contains the F flag which indicates which CPR format is used (odd or even)
            # First frame has F flag = 0 so is even and the second frame has F flag = 1 so odd
            # f = bits_str[21:22]
            # print("F:", int(f, 2))

            # Altitude
            alt1b = bits_str[8:20]
            if alt1b[-5] == '1':
                bits = alt1b[:-5] + alt1b[-4:]
                n = int(bits, 2)
                alt_ft = n*25 - 1000
                print("Alt (ft)", alt_ft)

            # lat_dec = int(bits_str[22:22+17], 2)
            # lon_dec = int(bits_str[39:39+17], 2)
            # print("Lat/Lon:", lat_dec, lon_dec)

            # http://airmetar.main.jp/radio/ADS-B%20Decoding%20Guide.pdf
            print()
        if tc == 19:
            print("Aircraft address:", address)
            print("Data:")
            # print(bits_str)
            print(bits_str[:5], bits_str[5:8], bits_str[8:10], bits_str[10:13], bits_str[13] ,bits_str[14:24], bits_str[24], bits_str[25:35], bits_str[35:36], bits_str[36:65])

            subtype = int(bits_str[5:8], 2)
            # https://mode-s.org/decode/adsb/airborne-velocity.html
            spd, hdg, rocd = -1, -1, -1
            if subtype == 1 or subtype == 2:
                print("Velocity Subtype 1: Ground speed")
            
                v_ew_sign = int(bits_str[13], 2)
                v_ew = int(bits_str[14:24], 2) - 1       # east-west velocity
                
                v_ns_sign = int(bits_str[24], 2)
                v_ns = int(bits_str[25:35], 2) - 1       # north-south velocity
                
                v_we = -1*v_ew if v_ew_sign else v_ew
                v_sn = -1*v_ns if v_ns_sign else v_ns
                
                spd = math.sqrt(v_sn*v_sn + v_we*v_we)  # unit in kts
                
                hdg = math.atan2(v_we, v_sn)
                hdg = math.degrees(hdg)                 # convert to degrees
                hdg = hdg if hdg >= 0 else hdg + 360    # no negative val
            if subtype == 3:
                print("Subtype Subtype 3: Airspeed")
                hdg = int(bits_str[14:24], 2)/1024.0*360.0
                spd = int(bits_str[25:35], 2)
            
            vr_sign = int(bits_str[36], 2)
            vr = int(bits_str[36:45], 2)
            rocd = -1*vr if vr_sign else vr         # rate of climb/descend
            print("Speed (kts):", spd, "Rate:", rocd, "Heading:", hdg)
            print()

        # print()

def calc_coordinates():
    def _cprN(lat, is_odd):
        nl = _cprNL(lat) - is_odd
        return nl if nl > 1 else 1

    def _cprNL(lat):
        try:
            nz = 15
            a = 1 - math.cos(math.pi / (2 * nz))
            b = math.cos(math.pi / 180.0 * abs(lat)) ** 2
            nl = 2 * math.pi / (math.acos(1 - a/b))
            return int(math.floor(nl))
        except:
            # happens when latitude is +/-90 degree
            return 1
    
    def floor_(x):
        return int(math.floor(x))
  
    lat1b, lon1b, alt1b = "10111000111010011", "10000110111111000", "000101111001"
    lat2b, lon2b, alt2b = "10010011101011100", "10000011000011011", "000101110111"
    lat1, lon1, alt1 = int(lat1b, 2), int(lon1b, 2), int(alt1b, 2)
    lat2, lon2, alt2 = int(lat2b, 2), int(lon2b, 2), int(alt2b, 2)
    
    # 131072 is 2^17, since CPR lat and lon are 17 bits each
    cprlat_even, cprlon_even = lat1/131072.0, lon1/131072.0
    cprlat_odd, cprlon_odd = lat2/131072.0, lon2/131072.0
    print(cprlat_even, cprlon_even)

    j = floor_(59*cprlat_even - 60*cprlat_odd)
    print(j)

    air_d_lat_even = 360.0 / 60
    air_d_lat_odd = 360.0 / 59

    # Lat
    lat_even = float(air_d_lat_even * (j % 60 + cprlat_even))
    lat_odd = float(air_d_lat_odd * (j % 59 + cprlat_odd))
    if lat_even >= 270:
        lat_even = lat_even - 360
    if lat_odd >= 270:
        lat_odd = lat_odd - 360

    # Lon
    ni = _cprN(lat_even, 0)
    m = floor_(cprlon_even * (_cprNL(lat_even)-1) - cprlon_odd * _cprNL(lat_even) + 0.5)
    lon = (360.0 / ni) * (m % ni + cprlon_even)
    print("Lat", lat_even, "Lon", lon)

    # Altitude
    # Q-bit (bit 48) indicates whether the altitude is encoded in multiples of 25 or 100 ft (0: 100 ft, 1: 25 ft)
    # The value can represent altitudes from -1000 to +50175 ft.
    if alt1b[-5] == '1':
        bits = alt1b[:-5] + alt1b[-4:]
        n = int(bits, 2)
        alt_ft = n*25 - 1000
        print("Alt (ft)", alt_ft)


fs, data = wavfile.read("adsb_20190311_191728Z_1090000kHz_RF.wav")
T = 1/fs

print("Sample rate %f MS/s" % (fs / 1e6))
print("Cnt samples %d" % len(data))
print("Duration: %f s" % (T * len(data)))

data = data.astype(float)

cnt = data.shape[0]
# Processing only part on file (faster):
# cnt = 10000000
# data = data[:cnt]
print("Processing I/Q...")
I, Q = data[:, 0], data[:, 1]
A = np.sqrt(I*I + Q*Q)

bits = np.zeros(cnt)

# To see scope without any processing, uncomment
# plt.plot(A)
# plt.show()
# sys.exit(0)

print("Extracting signals...")

pos = 0
avg = 200
msg_start = 0
# Find beginning of each signal
while pos < cnt - 16*1024:
    # P1 - message start
    while pos < cnt - 16*1024:
        if A[pos] < avg and A[pos+1] > avg and pos - msg_start > 1000:
            msg_start = pos
            bits[pos] = 100
            pos += 4
            break
        pos += 1

    start1, start2, start3, start4 = msg_start, 0, 0, 0
    # P2
    while pos < cnt - 16*1024:
        if A[pos] < avg and A[pos+1] > avg:
            start2 = pos
            bits[pos] = 90
            pos += 1
            break
        pos += 1
    # P3
    while pos < cnt - 16*1024:
        if A[pos] < avg and A[pos+1] > avg:
            start3 = pos
            bits[pos] = 80
            pos += 1
            break
        pos += 1
    # P4
    while pos < cnt - 16*1024:
        if A[pos] < avg and A[pos+1] > avg:
            start4 = pos
            bits[pos] = 70
            pos += 1
            break
        pos += 1


    sig_diff = start4 - start1
    if 20 < sig_diff < 25:
        bits[msg_start] = 500
        bit_len = int((start4 - start1) / 4.5)
        # print(pos, start1, start4, ' - ', bit_len)
        # start = start1 + 8*bit_len
        parse_message(A, msg_start, bit_len)

        pos += 450

# For debugging: check signal start
# plt.plot(A)
# plt.plot(bits)
# plt.show()

แžแŸ’แž‰แžปแŸ†แžŸแž„แŸ’แžƒแžนแž˜แžแžถแž˜แžถแž“แž“แžšแžŽแžถแž˜แŸ’แž“แžถแž€แŸ‹แž…แžถแž”แŸ‹แžขแžถแžšแž˜แŸ’แž˜แžŽแŸ แžŸแžผแž˜แžขแžšแž‚แžปแžŽแž…แŸ†แž–แŸ„แŸ‡แž€แžถแžšแž™แž€แž…แžทแžแŸ’แžแž‘แžปแž€แžŠแžถแž€แŸ‹แžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แŸ”

แž”แŸ’แžšแž—แž–: www.habr.com

แž‘แžทแž‰แž€แžถแžšแž”แž„แŸ’แž แŸ„แŸ‡แžŠแŸ‚แž›แžขแžถแž…แž‘แžปแž€แž…แžทแžแŸ’แžแž”แžถแž“แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž‚แŸแž แž‘แŸ†แž–แŸแžšแžŠแŸ‚แž›แž˜แžถแž“แž€แžถแžšแž€แžถแžšแž–แžถแžš DDoS, แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸ VPS VDS ๐Ÿ”ฅ แž‘แžทแž‰แžŸแŸแžœแžถแž”แž„แŸ’แž แŸ„แŸ‡แž‚แŸแž แž‘แŸ†แž–แŸแžšแžŠแŸ‚แž›แžขแžถแž…แž‘แžปแž€แž…แžทแžแŸ’แžแž”แžถแž“แž‡แžถแž˜แžฝแž™แž“แžนแž„แž€แžถแžšแž€แžถแžšแž–แžถแžš DDoS แž“แžทแž„แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸ VPS VDS | ProHoster