From b139e68a57cb893c29f1ce609cf960858cf68c7c Mon Sep 17 00:00:00 2001 From: Anton Chua Date: Wed, 26 Apr 2023 16:10:15 +0800 Subject: [PATCH 01/22] Modified project to ADS-B Track Player Updated README Implemented waypoint simulation Removed circle and random tracks --- AbstractTrajectorySimulatorBase.py | 3 +- FixedTrajectorySimulator.py | 4 +- PseudoCircleTrajectorySimulator.py | 48 --------- README.md | 159 ++++++++++------------------- RandomTrajectorySimulator.py | 45 -------- WaypointsTrajectorySimulator.py | 32 ++++-- examples/scenario.json | 8 +- examples/scenario4.json | 7 ++ examples/waypoints.txt | 3 + realtime-adsb-out.py | 87 +++++++--------- 10 files changed, 133 insertions(+), 263 deletions(-) delete mode 100644 PseudoCircleTrajectorySimulator.py delete mode 100644 RandomTrajectorySimulator.py create mode 100644 examples/scenario4.json create mode 100644 examples/waypoints.txt diff --git a/AbstractTrajectorySimulatorBase.py b/AbstractTrajectorySimulatorBase.py index 22b38e4..ea4ae23 100644 --- a/AbstractTrajectorySimulatorBase.py +++ b/AbstractTrajectorySimulatorBase.py @@ -28,11 +28,12 @@ from ModeS import ModeS class AbstractTrajectorySimulatorBase(threading.Thread,abc.ABC): - def __init__(self,mutex,broadcast_thread,aircraftinfos): + def __init__(self,mutex,broadcast_thread,aircraftinfos,waypoints_file): super().__init__() self._mutex = mutex self._broadcast_thread = broadcast_thread self._aircraftinfos = aircraftinfos + self._waypoints_file = waypoints_file self._modeSencoder = ModeS(df=17,icao=self._aircraftinfos.icao,ca=self._aircraftinfos.capability) diff --git a/FixedTrajectorySimulator.py b/FixedTrajectorySimulator.py index 1c0f5f0..499126e 100644 --- a/FixedTrajectorySimulator.py +++ b/FixedTrajectorySimulator.py @@ -17,8 +17,8 @@ from AbstractTrajectorySimulatorBase import AbstractTrajectorySimulatorBase class FixedTrajectorySimulator(AbstractTrajectorySimulatorBase): - def __init__(self,mutex,broadcast_thread,aircrafinfos): - super().__init__(mutex,broadcast_thread,aircrafinfos) + def __init__(self,mutex,broadcast_thread,aircrafinfos,waypoints_file=None): + super().__init__(mutex,broadcast_thread,aircrafinfos,waypoints_file=None) def refresh_delay(self): return 0.05 diff --git a/PseudoCircleTrajectorySimulator.py b/PseudoCircleTrajectorySimulator.py deleted file mode 100644 index 695c019..0000000 --- a/PseudoCircleTrajectorySimulator.py +++ /dev/null @@ -1,48 +0,0 @@ -""" simplest implementation of a trajectory simulation where the simulated -aircraft is flying a pseudo circle around center position at max load factor - -mutex protection occurs when calling replace_message - -This program is free software: you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation, either version 3 of the License, or (at your option) any later -version. -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -You should have received a copy of the GNU General Public License along with -this program. If not, see . -""" - -import datetime, math -from AbstractTrajectorySimulatorBase import AbstractTrajectorySimulatorBase - -class PseudoCircleTrajectorySimulator(AbstractTrajectorySimulatorBase): - def __init__(self,mutex,broadcast_thread,aircrafinfos): - super().__init__(mutex,broadcast_thread,aircrafinfos) - - self._lat0 = aircrafinfos.lat_deg - self._lon0 = aircrafinfos.lon_deg - - def refresh_delay(self): - return 0.02 - - def update_aircraftinfos(self): - turn_rate = self.getTurnRate() - R = self.getTurnRadius() - Rlat = (R/6371000.0)*(180.0/math.pi) - ta = self._aircraftinfos.track_angle_deg - (turn_rate*self.refresh_delay())*(180.0/math.pi) - ta = math.fmod(ta,360.0) - self._aircraftinfos.track_angle_deg = ta # intermediate value and single assignment needed at time because of - # setter and change detection mecanism in AircraftInfo (somehox shitty) - # TODO : implement better mecanism - self._aircraftinfos.lat_deg = self._lat0 - Rlat*math.sin(self._aircraftinfos.track_angle_deg*math.pi/180.0) - self._aircraftinfos.lon_deg = self._lon0 + Rlat/math.cos(self._aircraftinfos.lat_deg*math.pi/180.0)*math.cos(self._aircraftinfos.track_angle_deg*math.pi/180.0) - #self._lasttime = now - - def getTurnRate(self): - tr = (9.81/self._aircraftinfos.speed_mps)*math.sqrt(self._aircraftinfos.maxloadfactor**2.0 - 1.0) - return tr - - def getTurnRadius(self): - return self._aircraftinfos.speed_mps/self.getTurnRate() diff --git a/README.md b/README.md index e01fe8a..0f4a8bc 100755 --- a/README.md +++ b/README.md @@ -1,146 +1,91 @@ -# realtime ADS-B out +# ADS-B Track Player ## Foreword -This project is inspired and reuse several parts of several other ADS-B / mode S projects amongst which: +This project is a highly modified fork of: -- https://github.com/lyusupov/ADSB-Out -- https://github.com/nzkarit/ADSB-Out and https://github.com/pynstrom/adsb-out -- https://github.com/bistromath/gr-air-modes -- https://github.com/junzis/pyModeS +https://github.com/Matioupi/realtime-adsb-out -All those repositories are published under GNU General Public License v3.0. This is also the license chosen for this repository. -Please let me know if you have issues or require more explicit citations about reused source code. - -I wrote a short article (in french) about how (and why) I used this repository to spoof data on Flightradar24 on the 11th of March 2022: -https://www.linkedin.com/pulse/comment-et-pourquoi-jai-tromp%25C3%25A9-flightradar24-mathieu-peyr%25C3%25A9ga/?trackingId=%2BGNCsBDoBSYuF8W3JPNclw%3D%3D - -## Project goals - -The initial project goals are oriented towards: - -- completing the set of broadcastable messages that have already been implemented "adsb-out" in referenced projects. -- fixing bugs / adding features in existing code. -- producing a software architecture that better suit my understanding/habits. -- beeing able to live feed HackRF through a libhackrf python wrapper layer, rather than generating an IQ sample files that would later be hackrf_transfer'd. - -## HackRF python wrapper - -HackRF python wrapper `pyhackrf.py` is included in this repository and was also proposed to be merged into hackRF main repository: https://github.com/greatscottgadgets/hackrf/pull/1058 but this has not been accepted. I'll try to keep maintaining it if API of libhackrf change and may think to build a proper independant Python package. -This repo only uses TX feature of the python wrapper, but RX is also possible (see examples in https://github.com/Matioupi/hackrf/tree/python_wrapper/host/python) - -## Software architecture - -The workflow is divided between 3 execution threads: - -- main thread wich performs all initializations and control user inputs (mainly start / stop simulation for now) -- hackrf broadcasting thread which pump encoded messages and send them over the air with a predefined schedule -- trajectory simulation thread which feed brodcasting thread with encoded messages matching a real time simulated trajectory - -The message encoding is splitted into mode S "frame encoding" and "low level encoding" which handles PPM modulation and conversion to hackRF IQ sample format. -Software source code structure tries to reflect those 2 different layers. +It is thus important to read the README of the this project. -So far only "simple" simulated trajectories are available, but one can easily extend/fork behaviour to e.g. have a flight informations coming from a flight simulator (X-plane would be pretty well suited for that purpose through it's UDP aircraft state broadcast facility) or use actual sensors to feed live data. +As such, it draws inspiration and some code from all repositories referenced in that original project: + https://github.com/lyusupov/ADSB-Out + https://github.com/nzkarit/ADSB-Out and https://github.com/pynstrom/adsb-out + https://github.com/bistromath/gr-air-modes + https://github.com/junzis/pyModeS -## Usage and RF broadcast disclaimer - -Usage can be demonstrated together with `dump1090-mutability` or `dump1090-fa` and associated webservers or text message views. +All referenced repositories are published under GNU General Public License v3.0. This is also the license chosen for this repository. +Please let me know if you have issues or require more explicit citations about reused source code. -Repository source code is tuned for a 1090 MHz brodcast with **direct wire feed** to a receiver SDR dongle (no over the air broadcast). -The hardware setup I'm using is pictured below. Please note the RF attenuators (-20dB and -30dB). -The extra 1090MHz filter is probably not requiered as the flight aware dongle already features 1090 MHz filtering. -My HackRF is fitted with a 0.5 ppm TCXO +## Software Architecture -![test setup image](./images/test-setup.jpg "test setup") +As per the project 'realtime-adsb-out', the workflow is divided between 3 execution threads: -The default hackrf settings in repo are : -- 1090 MHz -- LNA amplificator disabled -- TX gain 4dB -- Sample rate needs to be 2MHz as this matches the ADS-B specification where PPM symbols last for 0.5 µs. +- Main thread wich performs all initializations and control user inputs (mainly start / stop simulation for now) +- HackRF broadcasting thread which pump encoded messages and send them over the air with a predefined schedule +- Trajectory simulation thread which feed brodcasting thread with encoded messages matching a real time simulated trajectory -Actual ADS-B brodcast frequency is 1090MHz which in most if not all places is a reserved band. -Some critical **flight safety feature** do rely on actual ADS-B broadcasts. -Unless you have special authorisations, **you should NEVER broadcast over the air at this frequency**. +The message encoding is splitted into mode S "frame encoding" and "low level encoding" which handles PPM modulation and conversion to hackRF IQ sample format. Software source code structure tries to reflect those 2 different layers. -If you can't use a wired RF feeding between hackRF and your SDR receiver for your test setup, you can easily modify source code in order to use a "fake" free frequency (e.g. 868MHz) and setup dump1090 accordingly to match this "fake" frequency by adding switch `--freq 868000000` to your usual `dump1090` command line. Increasing TX gain may be needed in that use case. +## Modifications from 'realtime-adsb-out' -By the way, I believe that the fact that one with 200$ hardware would actually be able to broadcast at 1090MHz and produce some fake ADS-B aircraft tracks highlights a serious weakness in ADS-B design. -Those forged broadcasts may be used to spoof ATC, trigger TCAS or other malicious behaviours. +- Waypoint trajectory simulation is implemented +- Circle and Random trajectory simulations have been removed +- Increased verbosity and updated usage print -## Command line examples +## Command Line Examples #### *Command line switches can be displayed with* ``` -mathieu@devbox:~/Dev/matioupi/realtime-adsb-out$ ./realtime-adsb-out.py -h +six3oo@computer:~/realtime-adsb-out$ ./realtime-adsb-out.py -h Usage: ./realtime-adsb-out.py [options] --h | --help Display help message. ---scenario Scenario mode with a provided scenario filepath ---icao Callsign in hex, Default:0x508035 ---callsign Callsign (8 chars max), Default:DEADBEEF ---squawk 4-digits 4096 code squawk, Default:7000 ---trajectorytype Type of simulated trajectory amongst : +-h | --help Display help message +--scenario Scenario mode, argument is scenario JSON filepath +--icao Callsign in hex, default: 0x508035 +--callsign Callsign (8 chars max), Default: DEADBEEF +--squawk 4-digit 4096 code squawk, Default: 7000 +--trajectorytype Types of simulated trajectories: fixed : steady aircraft - circle : pseudo circular flight - random : random positions inside circle area waypoints : fly long flight path Default:fixed ---lat Latitude for the plane in decimal degrees, Default:50.44994 ---long Longitude for the place in decimal degrees. Default:30.5211 ---altitude Altitude in decimal feet, Default:1500.0 ---speed Airspeed in decimal kph, Default:300.0 ---vspeed Vertical speed en ft/min, positive up, Default:0 ---maxloadfactor Specify the max load factor for aircraft simulation. Default:1.45 ---trackangle Track angle in decimal degrees. Default:0 ---timesync 0/1, 0 indicates time not synchronous with UTC, Default:0 ---capability Capability, Default:5 ---typecode ADS-B message type, Default:11 ---sstatus Surveillance status, Default:0 ---nicsupplementb NIC supplement-B, Default:0 ---surface Aircraft located on ground, Default:False ---waypoints Waypoints file for waypoints trajectory ---posrate position frame broadcast period in µs, Default: 150000 -``` - -#### *Single plane scenarii can be achieved with command line switches* - -`./realtime-adsb-out.py --callsign 'FCKPUTIN' --alt 4500 --speed 600 --trajectorytype circle --maxloadfactor 1.03` +--lat Latitude for the plane in decimal degrees, Default: 50.44994 +--long Longitude for the plane in decimal degrees. Default: 30.5211 +--altitude Altitude in decimal feet, Default: 1500.0 +--speed Airspeed in decimal kph, Default: 300.0 +--vspeed Vertical speed en ft/min, positive UP, Default: 0 +--maxloadfactor Specify the max load factor for aircraft simulation, Default: 1.45 +--trackangle Track angle in decimal degrees, Default: 0 +--timesync 0/1, 0 indicates time not synchronous with UTC, Default: 0 +--capability Capability, Default: 5 +--typecode ADS-B message type, Default: 11 +--sstatus Surveillance status, Default: 0 +--nicsupplementb NIC supplement-B, Default: 0 +--surface Aircraft located on ground, Default: False +--waypoints Waypoints file for waypoints trajectory, argument is .txt filepath +--posrate Position frame broadcast period in µs, Default: 150000 -will generate a pseudo circular trajectory, flown at 4500 ft, 600 km/h and a load factor of 1.03. - -![circle mode example image](./images/adsb-out-circle.png "circle mode example") +``` -`./realtime-adsb-out.py --callsign 'FCKPUTIN' --alt 4500 --trajectorytype random` +#### *Single plane scenarios* -will generate a random trajectory in a ~30s at specified (here default) speed around center lat / lon (default here too). -track angle is randomized, speed is randomized, altitude is randomized. The default position frame broadcast period can be lowered in order to -produce a large numer of tracks in a given area +`./realtime-adsb-out.py --callsign 'TEST' --alt 4500 --speed 600 --trajectorytype fixed --maxloadfactor 1.03` -![random mode example image](./images/adsb-out-random.png "random mode example") +will generate a fixed trajectory, flown at 4500 ft, 600 km/h and a load factor of 1.03. -#### *More complex scenarii with multiple planes can be achieved through json configuration files* +#### *JSON scenarios with multiple planes* -`./realtime-adsb-out.py --scenario ./examples/scenario3.json` +`./realtime-adsb-out.py --scenario ./examples/scenario.json` ![4 planes scenario example](./images/adsb-out-scenario3.png "4 planes scenario example") The maximum number of planes that can be simulated has not been evaluated yet. It will depends on the refresh rate of each message type, etc. Tests have been performed on a laptop computer, but with not too many tracks, it should be possible to run on lighter platforms such as Raspberry Pi. -## Reference documentation - -All reference documentation from the repositories mentionned in the foreword. - -[https://mode-s.org/](https://mode-s.org/) - -*ICAO Annex 10, Aeronautical Telecommunications, Volume IV - Surveillance Radar and Collision Avoidance Systems* which at time of writing can be retrieved here: -- english version https://www.bazl.admin.ch/bazl/en/home/specialists/regulations-and-guidelines/legislation-and-directives/anhaenge-zur-konvention-der-internationalen-zivilluftfahrtorgani.html -- french version https://www.bazl.admin.ch/bazl/fr/home/experts/reglementation-et-informations-de-base/bases-legales-et-directives/annexes-a-la-convention-de-l-organisation-internationale-de-l-av.html +## Reference Documentation -*ICAO doc 9871 edition 1* which can be retrieved here (There is an edition 2 of this document but all seems to be behing paywalls): -- [ICAO doc 9871 edition 1](http://www.aviationchief.com/uploads/9/2/0/9/92098238/icao_doc_9871_-_technical_provisions_for_mode_s_-_advanced_edition_1.pdf) +All reference documentation from the repositories mentioned in the foreword. Ghost in the Air(Traffic): On insecurity of ADS-B protocol and practical attacks on ADS-B devices (Andrei Costin, Aurélien Francillon): [publication PDF hosted at eurocom.fr](https://www.s3.eurecom.fr/docs/bh12us_costin.pdf) diff --git a/RandomTrajectorySimulator.py b/RandomTrajectorySimulator.py deleted file mode 100644 index c3427d0..0000000 --- a/RandomTrajectorySimulator.py +++ /dev/null @@ -1,45 +0,0 @@ -""" simplest implementation of a trajectory simulation where the simulated -aircraft is randomly distributed inside a circle - -mutex protection occurs when calling replace_message - -This program is free software: you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation, either version 3 of the License, or (at your option) any later -version. -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -You should have received a copy of the GNU General Public License along with -this program. If not, see . -""" - -import random -import datetime, math -from AbstractTrajectorySimulatorBase import AbstractTrajectorySimulatorBase - -class RandomTrajectorySimulator(AbstractTrajectorySimulatorBase): - def __init__(self,mutex,broadcast_thread,aircrafinfos): - super().__init__(mutex,broadcast_thread,aircrafinfos) - self._starttime = datetime.datetime.now(datetime.timezone.utc) - - self._lat0 = aircrafinfos.lat_deg - self._lon0 = aircrafinfos.lon_deg - - self._max_alt_m = aircrafinfos.alt_msl_m - self._max_speed_mps = aircrafinfos.speed_mps - - def refresh_delay(self): - return 0.005 - - def update_aircraftinfos(self): - - d0 = self._max_speed_mps * 30.0 - Rlat = (d0/6371000.0)*(180.0/math.pi) - Rlon = Rlat/math.cos(self._lat0*math.pi/180.0) - self._aircraftinfos.track_angle_deg = random.uniform(0,360.0) - self._aircraftinfos.lat_deg = self._lat0 - random.uniform(-Rlat,Rlat) - self._aircraftinfos.lon_deg = self._lon0 + random.uniform(-Rlon,Rlon) - - self._aircraftinfos.alt_msl_m = random.uniform(1.0,self._max_alt_m) - self._aircraftinfos.speed_mps = random.uniform(0.0,self._max_speed_mps) diff --git a/WaypointsTrajectorySimulator.py b/WaypointsTrajectorySimulator.py index 03d2caf..202d528 100644 --- a/WaypointsTrajectorySimulator.py +++ b/WaypointsTrajectorySimulator.py @@ -14,19 +14,33 @@ this program. If not, see . """ +import datetime import time from AbstractTrajectorySimulatorBase import AbstractTrajectorySimulatorBase class WaypointsTrajectorySimulator(AbstractTrajectorySimulatorBase): - def __init__(self,mutex,broadcast_thread,aircrafts_info,waypoints_file): - super().__init__(mutex,broadcast_thread) - - + def __init__(self,mutex,broadcast_thread,aircraftinfos,waypoints_file): + super().__init__(mutex,broadcast_thread, aircraftinfos,waypoints_file) + self._starttime = datetime.datetime.now(datetime.timezone.utc) + + self._lat0 = aircraftinfos.lat_deg + self._lon0 = aircraftinfos.lon_deg + def refresh_delay(self): return 0.005 - - - # TODO : implement waypoint simulation... - #def update_aircraftinfos(self): - # pass \ No newline at end of file + + def update_aircraftinfos(self): + + with open(self._waypoints_file, 'r') as wp: + # Line format: "<0:lat> <1:lon> <2:alt> <3:speed> <4:track angle> <5:iterate time>" + for line in wp: + posi = line.split() + print("[!] Setting "+self._aircraftinfos.callsign+"'s data") + print(" [:] Lat: "+posi[0]+" | Long: "+posi[1]+" | Alt: "+posi[2]+" | Speed: "+posi[3]+" | Trk Angle: "+posi[4]+" | ValidTime: "+posi[5]) + self._aircraftinfos.lat_deg = float(posi[0]) + self._aircraftinfos.lon_deg = float(posi[1]) + self._aircraftinfos.alt_msl_m = float(posi[2]) + self._aircraftinfos.speed_mps = float(posi[3]) + self._aircraftinfos.track_angle_deg = float(posi[4]) #valid: 0.0-360.0 + time.sleep(int(posi[5])) #int, in seconds diff --git a/examples/scenario.json b/examples/scenario.json index 33ce0c6..e964e0b 100644 --- a/examples/scenario.json +++ b/examples/scenario.json @@ -2,6 +2,12 @@ "plane1": { "filename":"./examples/MRYIA.json", - "trajectory_type":"circle" + "trajectory_type":"waypoints", + "waypoints_file":"waypoints.txt" + }, + "plane2": + { + "filename":"./examples/AN-IL78MP.json", + "trajectory_type":"fixed" } } diff --git a/examples/scenario4.json b/examples/scenario4.json new file mode 100644 index 0000000..33ce0c6 --- /dev/null +++ b/examples/scenario4.json @@ -0,0 +1,7 @@ +{ + "plane1": + { + "filename":"./examples/MRYIA.json", + "trajectory_type":"circle" + } +} diff --git a/examples/waypoints.txt b/examples/waypoints.txt new file mode 100644 index 0000000..8beea94 --- /dev/null +++ b/examples/waypoints.txt @@ -0,0 +1,3 @@ +1 2 3 4 5 3 +11 12 13 14 15 3 +21 22 23 24 25 3 diff --git a/realtime-adsb-out.py b/realtime-adsb-out.py index 708df6e..b8407f0 100755 --- a/realtime-adsb-out.py +++ b/realtime-adsb-out.py @@ -20,8 +20,6 @@ from AircraftInfos import AircraftInfos from FixedTrajectorySimulator import FixedTrajectorySimulator -from PseudoCircleTrajectorySimulator import PseudoCircleTrajectorySimulator -from RandomTrajectorySimulator import RandomTrajectorySimulator from WaypointsTrajectorySimulator import WaypointsTrajectorySimulator from HackRfBroadcastThread import HackRfBroadcastThread @@ -30,49 +28,40 @@ def usage(msg=False): if msg:print(msg) print("Usage: %s [options]\n" % sys.argv[0]) - print("-h | --help Display help message.") - print("--scenario Scenario mode with a provided scenario filepath") - print("--icao Callsign in hex, Default:0x508035") - print("--callsign Callsign (8 chars max), Default:DEADBEEF") - print("--squawk 4-digits 4096 code squawk, Default:7000") - print("--trajectorytype Type of simulated trajectory amongst :") + print("-h | --help Display help message") + print("--scenario Scenario mode, argument is scenario JSON filepath") + print("--icao Callsign in hex, default: 0x508035") + print("--callsign Callsign (8 chars max), Default: DEADBEEF") + print("--squawk 4-digit 4096 code squawk, Default: 7000") + print("--trajectorytype Types of simulated trajectories:") print(" fixed : steady aircraft") - print(" circle : pseudo circular flight") - print(" random : random positions inside circle area") print(" waypoints : fly long flight path") print(" Default:fixed") - print("--lat Latitude for the plane in decimal degrees, Default:50.44994") - print("--long Longitude for the place in decimal degrees. Default:30.5211") - print("--altitude Altitude in decimal feet, Default:1500.0") - print("--speed Airspeed in decimal kph, Default:300.0") - print("--vspeed Vertical speed en ft/min, positive up, Default:0") - print("--maxloadfactor Specify the max load factor for aircraft simulation. Default:1.45") - print("--trackangle Track angle in decimal degrees. Default:0") - print("--timesync 0/1, 0 indicates time not synchronous with UTC, Default:0") - print("--capability Capability, Default:5") - print("--typecode ADS-B message type, Default:11") - print("--sstatus Surveillance status, Default:0") - print("--nicsupplementb NIC supplement-B, Default:0") - print("--surface Aircraft located on ground, Default:False") - print("--waypoints Waypoints file for waypoints trajectory") - print("--posrate position frame broadcast period in µs, Default: 150000") + print("--lat Latitude for the plane in decimal degrees, Default: 50.44994") + print("--long Longitude for the plane in decimal degrees. Default: 30.5211") + print("--altitude Altitude in decimal feet, Default: 1500.0") + print("--speed Airspeed in decimal kph, Default: 300.0") + print("--vspeed Vertical speed en ft/min, positive UP, Default: 0") + print("--maxloadfactor Specify the max load factor for aircraft simulation, Default: 1.45") + print("--trackangle Track angle in decimal degrees, Default: 0") + print("--timesync 0/1, 0 indicates time not synchronous with UTC, Default: 0") + print("--capability Capability, Default: 5") + print("--typecode ADS-B message type, Default: 11") + print("--sstatus Surveillance status, Default: 0") + print("--nicsupplementb NIC supplement-B, Default: 0") + print("--surface Aircraft located on ground, Default: False") + print("--waypoints Waypoints file for waypoints trajectory, argument is .txt filepath") + print("--posrate Position frame broadcast period in µs, Default: 150000") print("") #print("see usage.md for additionnal information") sys.exit(2) -def getTrackSimulationThread(trajectory_type,brodcast_thread,aircraftinfos,waypoints_file = None): - +def getTrackSimulationThread(trajectory_type,broadcast_thread,aircraftinfos,waypoints_file): if trajectory_type == 'fixed': - return FixedTrajectorySimulator(brodcast_thread.getMutex(),brodcast_thread,aircraftinfos) - elif trajectory_type == 'circle': - return PseudoCircleTrajectorySimulator(brodcast_thread.getMutex(),brodcast_thread,aircraftinfos) - elif trajectory_type == 'random': - return RandomTrajectorySimulator(brodcast_thread.getMutex(),brodcast_thread,aircraftinfos) + return FixedTrajectorySimulator(broadcast_thread.getMutex(),broadcast_thread,aircraftinfos) elif trajectory_type == 'waypoints': - print("WaypointsTrajectorySimulator not implemented yet") - exit(-1) - return WaypointsTrajectorySimulator(brodcast_thread.getMutex(),brodcast_thread,aircraftinfos,waypoints_file) + return WaypointsTrajectorySimulator(broadcast_thread.getMutex(),broadcast_thread,aircraftinfos,waypoints_file) else: return None @@ -82,7 +71,6 @@ def main(): icao_aa = '0x508035' callsign = 'DEADBEEF' squawk = '7000' - alt_ft = 1500.0 lat_deg = 50.44994 lon_deg = 30.5211 @@ -100,6 +88,7 @@ def main(): waypoints_file = None posrate = 150000 scenariofile = None + waypoints_file = None try: (opts, args) = getopt(sys.argv[1:], 'h', \ ['help','scenario=','icao=','callsign=','squawk=','trajectorytype=','lat=','long=','altitude=','speed=','vspeed=','maxloadfactor=','trackangle=', @@ -119,13 +108,10 @@ def main(): elif opt in ('--lat'):lat_deg = float(arg) elif opt in ('--long'):lon_deg = float(arg) elif opt in ('--altitude'):alt_ft = float(arg) - elif opt in ('--speed'):speed_kph = float(arg) elif opt in ('--vspeed'):vspeed_ftpmin = float(arg) elif opt in ('--maxloadfactor'):maxloadfactor = float(arg) - elif opt in ('--trackangle'):track_angle_deg = float(arg) - elif opt in ('--timesync'):timesync = int(arg) elif opt in ('--capability'):capability = int(arg) elif opt in ('--typecode'):type_code = int(arg) @@ -134,22 +120,22 @@ def main(): elif opt in ('--surface'):on_surface = True elif opt in ('--posrate'):posrate = int(arg) else:usage("Unknown option %s\n" % opt) - + print ("\n@@@@@@@ REALTIME-ADSB-OUT v0.2 core by Matioupi modified by six3oo @@@@@@@\n") track_simulators = [] broadcast_thread = HackRfBroadcastThread(posrate) # posrate would usally be used with random mode to generate load of tracks + # Scenario file presence check if scenariofile == None: - print("Going to run in single plane from command line mode") + print("[*] Single plane CLI mode") aircraftinfos = AircraftInfos(icao_aa,callsign,squawk, \ lat_deg,lon_deg,alt_ft,speed_kph,vspeed_ftpmin,maxloadfactor,track_angle_deg, \ timesync,capability,type_code,surveillance_status,nicsup,on_surface) - track_simulation = getTrackSimulationThread(trajectory_type,broadcast_thread,aircraftinfos,waypoints_file) - track_simulators.append(track_simulation) - + + # Scenario file parsing else: - print("Going to run in json scenario mode from file "+os.path.abspath(scenariofile)) + print("[*] JSON Scenario mode: "+os.path.abspath(scenariofile)) with open(scenariofile,'r') as json_file: scenario = json.load(json_file) @@ -158,14 +144,15 @@ def main(): if "waypoints_file" in plane: waypoints_file = plane["waypoints_file"] + print("[!] Waypoints file detected: " +os.path.abspath(waypoints_file)) track_simulation = getTrackSimulationThread(plane["trajectory_type"],broadcast_thread,plane_info,waypoints_file) track_simulators.append(track_simulation) - print("scenario contains tracks simulation instructions for "+str(len(track_simulators))+" planes:") + print("[*] Scenario contains track simulation instructions for "+str(len(track_simulators))+" plane(s):") for tsim in track_simulators: - print("callsign: "+tsim.aircraftinfos.callsign.ljust(9,' ')+"MSL altitude: "+"{:7.1f}".format(tsim.aircraftinfos.alt_msl_ft)+" ft") + print(" [:] Callsign: "+tsim.aircraftinfos.callsign.ljust(9,' ')+"MSL altitude: "+"{:7.1f}".format(tsim.aircraftinfos.alt_msl_ft)+" ft") for tsim in track_simulators: broadcast_thread.register_track_simulation_thread(tsim) @@ -179,7 +166,7 @@ def main(): broadcast_thread.start() - # user input loop. Todo : implement other commands ? (in that case don't forget to check if mutex protection is needed) + # user input loop. Todo : implement other commands? (in that case don't forget to check if mutex protection is needed) while(val:=input("") != 's'): time.sleep(0.05) @@ -194,7 +181,7 @@ def main(): tsim.join() broadcast_thread.join() - print("reatime-adsb-out simulation is finished") + print("realtime-adsb-out simulation ended") if __name__ == "__main__": - main() \ No newline at end of file + main() From 9b8b147897005385f1d6adb5a6339f2e2af861b7 Mon Sep 17 00:00:00 2001 From: Anton Chua Date: Thu, 27 Apr 2023 14:23:03 +0800 Subject: [PATCH 02/22] Configure HackRF for wireless transmission TX Gain set to 20 instead of 4 LNA Amplifier turned ON Also edited Scenario 4 to 1x Fixed test --- HackRfBroadcastThread.py | 6 +++--- examples/scenario.json | 2 +- examples/scenario4.json | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/HackRfBroadcastThread.py b/HackRfBroadcastThread.py index 4b91414..188664b 100644 --- a/HackRfBroadcastThread.py +++ b/HackRfBroadcastThread.py @@ -97,11 +97,11 @@ def __init__(self,airborne_position_refresh_period = 150000): if (result != LibHackRfReturnCode.HACKRF_SUCCESS): print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) - result = self._hackrf_broadcaster.setTXVGAGain(4) # week gain (used for wire feed + attenuators) + result = self._hackrf_broadcaster.setTXVGAGain(20) # TX Gain (use 4 for wire feed + attenuators, ~20 for wireless) if (result != LibHackRfReturnCode.HACKRF_SUCCESS): print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) - result = self._hackrf_broadcaster.setAmplifierMode(LibHackRfHwMode.HW_MODE_OFF) + result = self._hackrf_broadcaster.setAmplifierMode(LibHackRfHwMode.HW_MODE_ON) # LNA Amplifier ON or OFF (OFF for wire feed, ON for wireless) if (result != LibHackRfReturnCode.HACKRF_SUCCESS): print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) @@ -231,4 +231,4 @@ def run(self): #self._mutex.release() # upon exit, reset _do_stop flag in case there is a new start - self._do_stop = False \ No newline at end of file + self._do_stop = False diff --git a/examples/scenario.json b/examples/scenario.json index e964e0b..308db11 100644 --- a/examples/scenario.json +++ b/examples/scenario.json @@ -3,7 +3,7 @@ { "filename":"./examples/MRYIA.json", "trajectory_type":"waypoints", - "waypoints_file":"waypoints.txt" + "waypoints_file":"./examples/waypoints.txt" }, "plane2": { diff --git a/examples/scenario4.json b/examples/scenario4.json index 33ce0c6..031ea29 100644 --- a/examples/scenario4.json +++ b/examples/scenario4.json @@ -2,6 +2,6 @@ "plane1": { "filename":"./examples/MRYIA.json", - "trajectory_type":"circle" + "trajectory_type":"fixed" } } From e4eb0b6fbeb96668ebb7b7a50c98680e00f7845e Mon Sep 17 00:00:00 2001 From: Anton Chua Date: Thu, 27 Apr 2023 17:17:21 +0800 Subject: [PATCH 03/22] Update CLI prints Rename main executable Update README --- FixedTrajectorySimulator.py | 7 +- HackRfBroadcastThread.py | 47 ++++---- README.md | 2 +- WaypointsTrajectorySimulator.py | 8 +- adsb-track-player.py | 186 ++++++++++++++++++++++++++++++++ realtime-adsb-out.py | 11 +- 6 files changed, 227 insertions(+), 34 deletions(-) create mode 100755 adsb-track-player.py mode change 100755 => 100644 realtime-adsb-out.py diff --git a/FixedTrajectorySimulator.py b/FixedTrajectorySimulator.py index 499126e..95dcf5a 100644 --- a/FixedTrajectorySimulator.py +++ b/FixedTrajectorySimulator.py @@ -1,4 +1,4 @@ -""" simplest implementation of a trajectory simulation where the simulated +""" Simplest implementation of a trajectory simulation where the simulated aircraft is steady at the provided position mutex protection occurs when calling replace_message @@ -21,7 +21,8 @@ def __init__(self,mutex,broadcast_thread,aircrafinfos,waypoints_file=None): super().__init__(mutex,broadcast_thread,aircrafinfos,waypoints_file=None) def refresh_delay(self): - return 0.05 + return 0.5 def update_aircraftinfos(self): - pass + print("[!] FIXED TRAJECTORY\t\tCallsign: "+self._aircraftinfos.callsign) + print(" [:] Lat: "+str(self._aircraftinfos.lat_deg)+" | Lon: "+str(self._aircraftinfos.lon_deg)+" | Alt: "+str(self._aircraftinfos.alt_msl_m)+" | Spd: "+str(self._aircraftinfos.speed_mps)+" | Trk Angle: "+str(self._aircraftinfos.track_angle_deg)) diff --git a/HackRfBroadcastThread.py b/HackRfBroadcastThread.py index 188664b..30d445b 100644 --- a/HackRfBroadcastThread.py +++ b/HackRfBroadcastThread.py @@ -74,42 +74,48 @@ def __init__(self,airborne_position_refresh_period = 150000): # Initialize HackRF instance (could pass board serial or index if specific board is needed) self._hackrf_broadcaster = HackRF() - # Do requiered settings - # so far hard-coded e.g. gain and disabled amp are specific to hardware test setup - # with hackrf feeding a flight aware dongle through cable + attenuators (-50dB) + # HackRF Transmit Settings result = self._hackrf_broadcaster.open() if (result != LibHackRfReturnCode.HACKRF_SUCCESS): print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) - - self._hackrf_broadcaster.setCrystalPPM(0) - result = self._hackrf_broadcaster.setSampleRate(2000000) + #result = self._hackrf_broadcaster.setAmplifierMode(LibHackRfHwMode.HW_MODE_ON) # LNA Amplifier ON or OFF + #if (result != LibHackRfReturnCode.HACKRF_SUCCESS): + # print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) + + #result = self._hackrf_broadcaster.setLNAGain(10) # LNA Amplifier Gain + #if (result != LibHackRfReturnCode.HACKRF_SUCCESS): + # print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) + + result = self._hackrf_broadcaster.setAntennaPowerMode(LibHackRfHwMode.HW_MODE_ON) # Antenna Power Mode ON or OFF if (result != LibHackRfReturnCode.HACKRF_SUCCESS): print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) - result = self._hackrf_broadcaster.setBasebandFilterBandwidth(HackRF.computeBaseBandFilterBw(2000000)) + self._hackrf_broadcaster.setCrystalPPM(0) + + # 2MHz sample rate to meet ADS-B spec of 0.5µs PPM symbol + result = self._hackrf_broadcaster.setSampleRate(2000000) if (result != LibHackRfReturnCode.HACKRF_SUCCESS): print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) - #result = self.hackrf_broadcaster.setFrequency(868000000) # free frequency for over the air brodcast tests - result = self._hackrf_broadcaster.setFrequency(1090000000) # do not use 1090MHz for actual over the air broadcasting - # only if you use wire feed (you'll need attenuators in that case) + result = self._hackrf_broadcaster.setBasebandFilterBandwidth(HackRF.computeBaseBandFilterBw(2000000)) if (result != LibHackRfReturnCode.HACKRF_SUCCESS): print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) - result = self._hackrf_broadcaster.setTXVGAGain(20) # TX Gain (use 4 for wire feed + attenuators, ~20 for wireless) + #result = self.hackrf_broadcaster.setFrequency(868000000) # 868MHz = Free frequency for over the air broadcast tests + result = self._hackrf_broadcaster.setFrequency(1090000000) # Actual 1090MHz setting if (result != LibHackRfReturnCode.HACKRF_SUCCESS): print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) - result = self._hackrf_broadcaster.setAmplifierMode(LibHackRfHwMode.HW_MODE_ON) # LNA Amplifier ON or OFF (OFF for wire feed, ON for wireless) + result = self._hackrf_broadcaster.setTXVGAGain(40) # TX VGA Gain (4 for wire feed + attenuators, 40 for wireless) if (result != LibHackRfReturnCode.HACKRF_SUCCESS): - print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) + print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) self._tx_context = hackrf_tx_context() self._do_stop = False - # do hackRF lib and instance cleanup at object destruction time + # HackRF lib and instance cleanup at object destruction time def __del__(self): result = self._hackrf_broadcaster.close() if (result != LibHackRfReturnCode.HACKRF_SUCCESS): @@ -129,9 +135,10 @@ def getMutex(self): #@Timed def replace_message(self,type,frame_even,frame_odd = []): + # 1090ES Frame IQ modulating frame_IQ = self._lowlevelencoder.frame_1090es_ppm_modulate_IQ(frame_even, frame_odd) - # this will usually be called from another thread, so mutex lock mecanism is used during update + # this will usually be called from another thread, so mutex lock mechanism is used during update self._mutex.acquire() calling_thread = threading.current_thread() @@ -161,7 +168,7 @@ def broadcast_data(self,data): self._tx_context.buffer_length = length self._tx_context.buffer = (c_ubyte*self._tx_context.buffer_length).from_buffer_copy(data) - # TODO : need to evaluate if mutex protection is requiered during full broadcast or + # TODO : need to evaluate if mutex protection is required during full broadcast or # could be reduced to buffer filling (probably can be reduced) # reduced version is when next line mutex.release() is uncommented and # mutex release at the end of this method is commented @@ -186,6 +193,7 @@ def run(self): while not self._do_stop: #self._mutex.acquire() + now = datetime.datetime.now(datetime.timezone.utc) plane_messages = bytearray() sleep_time = 10.0 @@ -198,9 +206,9 @@ def run(self): else: remaining = -float('inf') sleep_time = 0.0 - # Time throttling : messages are broadcasted only at provided time intervall - # TODO : implement UTC syncing mecanism (requiered that the actual host clock is UTC synced) ? - # which may be implemented to some accuracy level with ntp or GPS + PPS mecanisms ? in Python ? + # Time throttling: messages are broadcasted only at provided time intervall + # TODO : Implement UTC syncing mechanism (requires that the actual host clock is UTC synced) ? + # which may be implemented to some accuracy level with ntp or GPS + PPS mechanisms in Python ? if (v[0] != None and len(v[0]) > 0) and remaining <= 0.0: plane_messages.extend(v[0]) v[1] = now @@ -209,7 +217,6 @@ def run(self): if remaining < sleep_time: sleep_time = remaining - #print("sleep_time1",sleep_time) bc_length = len(plane_messages) if (bc_length > 0): diff --git a/README.md b/README.md index 0f4a8bc..1915021 100755 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ This project is a highly modified fork of: https://github.com/Matioupi/realtime-adsb-out -It is thus important to read the README of the this project. +It is thus important to read the README of that project. As such, it draws inspiration and some code from all repositories referenced in that original project: https://github.com/lyusupov/ADSB-Out diff --git a/WaypointsTrajectorySimulator.py b/WaypointsTrajectorySimulator.py index 202d528..ef1faa6 100644 --- a/WaypointsTrajectorySimulator.py +++ b/WaypointsTrajectorySimulator.py @@ -1,4 +1,4 @@ -""" implementation of a trajectory simulation where the simulated aircraft +""" Implementation of a trajectory simulation where the simulated aircraft is following a preplanned trajectory mutex protection occurs when calling replace_message @@ -36,11 +36,11 @@ def update_aircraftinfos(self): # Line format: "<0:lat> <1:lon> <2:alt> <3:speed> <4:track angle> <5:iterate time>" for line in wp: posi = line.split() - print("[!] Setting "+self._aircraftinfos.callsign+"'s data") - print(" [:] Lat: "+posi[0]+" | Long: "+posi[1]+" | Alt: "+posi[2]+" | Speed: "+posi[3]+" | Trk Angle: "+posi[4]+" | ValidTime: "+posi[5]) + print("[!] WAYPOINTS TRAJECTORY\tCallsign: "+self._aircraftinfos.callsign) + print(" [:] Lat: "+posi[0]+" | Lon: "+posi[1]+" | Alt: "+posi[2]+" | Spd: "+posi[3]+" | Trk Angle: "+posi[4]+" | ValidTime: "+posi[5]) self._aircraftinfos.lat_deg = float(posi[0]) self._aircraftinfos.lon_deg = float(posi[1]) self._aircraftinfos.alt_msl_m = float(posi[2]) self._aircraftinfos.speed_mps = float(posi[3]) self._aircraftinfos.track_angle_deg = float(posi[4]) #valid: 0.0-360.0 - time.sleep(int(posi[5])) #int, in seconds + time.sleep(int(posi[5])) #int, in seconds # TODO: Currently iterates whole file before user-quit takes effect diff --git a/adsb-track-player.py b/adsb-track-player.py new file mode 100755 index 0000000..9f178b7 --- /dev/null +++ b/adsb-track-player.py @@ -0,0 +1,186 @@ +#!/usr/bin/env python3 + +""" This file hold the main function which read user inputs +initialize and launch the simulation + +This program is free software: you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation, either version 3 of the License, or (at your option) any later +version. +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +You should have received a copy of the GNU General Public License along with +this program. If not, see . +""" + +import sys, time, math, os +import threading, json +import traceback + +from AircraftInfos import AircraftInfos +from FixedTrajectorySimulator import FixedTrajectorySimulator +from WaypointsTrajectorySimulator import WaypointsTrajectorySimulator +from HackRfBroadcastThread import HackRfBroadcastThread + +from getopt import getopt, GetoptError + +def usage(msg=False): + if msg:print(msg) + print("[h] Usage: %s [options]\n" % sys.argv[0]) + print("-h | --help Display help message") + print("--scenario Scenario mode, argument is scenario JSON filepath") + print("--icao Callsign in hex, default: 0x508035") + print("--callsign Callsign (8 chars max), Default: DEADBEEF") + print("--squawk 4-digit 4096 code squawk, Default: 7000") + print("--trajectorytype Types of simulated trajectories:") + print(" fixed : steady aircraft") + print(" waypoints : fly long flight path") + print(" Default:fixed") + print("--lat Latitude for the plane in decimal degrees, Default: 50.44994") + print("--long Longitude for the plane in decimal degrees. Default: 30.5211") + print("--altitude Altitude in decimal feet, Default: 1500.0") + print("--speed Airspeed in decimal kph, Default: 300.0") + print("--vspeed Vertical speed en ft/min, positive UP, Default: 0") + print("--maxloadfactor Specify the max load factor for aircraft simulation, Default: 1.45") + print("--trackangle Track angle in decimal degrees, Default: 0") + print("--timesync 0/1, 0 indicates time not synchronous with UTC, Default: 0") + print("--capability Capability, Default: 5") + print("--typecode ADS-B message type, Default: 11") + print("--sstatus Surveillance status, Default: 0") + print("--nicsupplementb NIC supplement-B, Default: 0") + print("--surface Aircraft located on ground, Default: False") + print("--posrate Position frame broadcast period in µs, Default: 150000") + print("") + #print("see usage.md for additionnal information") + + sys.exit(2) + +def getTrackSimulationThread(trajectory_type,broadcast_thread,aircraftinfos,waypoints_file): + if trajectory_type == 'fixed': + return FixedTrajectorySimulator(broadcast_thread.getMutex(),broadcast_thread,aircraftinfos) + elif trajectory_type == 'waypoints': + return WaypointsTrajectorySimulator(broadcast_thread.getMutex(),broadcast_thread,aircraftinfos,waypoints_file) + else: + return None + +def main(): + + # Default values + icao_aa = '0x508035' + callsign = 'DEADBEEF' + squawk = '7000' + alt_ft = 1500.0 + lat_deg = 50.44994 + lon_deg = 30.5211 + speed_kph = 300.0 + vspeed_ftpmin = 0.0 + maxloadfactor = 1.45 + track_angle_deg = 0.0 + capability = 5 + type_code = 11 + surveillance_status = 0 + timesync = 0 + nicsup = 0 + on_surface = False + trajectory_type = 'fixed' + waypoints_file = None + posrate = 150000 + scenariofile = None + waypoints_file = None + try: + (opts, args) = getopt(sys.argv[1:], 'h', \ + ['help','scenario=','icao=','callsign=','squawk=','trajectorytype=','lat=','long=','altitude=','speed=','vspeed=','maxloadfactor=','trackangle=', + 'timesync=','capability=','typecode=','sstatus=','nicsupplementb=','surface','posrate=' + ]) + except GetoptError as err: + usage("%s\n" % err) + + if len(opts) != 0: + for (opt, arg) in opts: + if opt in ('-h', '--help'):usage() + elif opt in ('--scenario'):scenariofile = arg + elif opt in ('--icao'):icao_aa = arg + elif opt in ('--callsign'):callsign = arg + elif opt in ('--squawk'):squawk = arg + elif opt in ('--trajectorytype'):trajectory_type = arg + elif opt in ('--lat'):lat_deg = float(arg) + elif opt in ('--long'):lon_deg = float(arg) + elif opt in ('--altitude'):alt_ft = float(arg) + elif opt in ('--speed'):speed_kph = float(arg) + elif opt in ('--vspeed'):vspeed_ftpmin = float(arg) + elif opt in ('--maxloadfactor'):maxloadfactor = float(arg) + elif opt in ('--trackangle'):track_angle_deg = float(arg) + elif opt in ('--timesync'):timesync = int(arg) + elif opt in ('--capability'):capability = int(arg) + elif opt in ('--typecode'):type_code = int(arg) + elif opt in ('--sstatus'):surveillance_status = int(arg) + elif opt in ('--nicsupplementb'):nicsup = int(arg) + elif opt in ('--surface'):on_surface = True + elif opt in ('--posrate'):posrate = int(arg) + else:usage("Unknown option %s\n" % opt) + print ("\n==== ADS-B Track Player v0.1.2 | by six3oo | core by Matioupi ====\n") + track_simulators = [] + broadcast_thread = HackRfBroadcastThread(posrate) # posrate would usally be used with random mode to generate load of tracks + + # Scenario file presence check + if scenariofile == None: + print("[*] Single plane CLI mode") + aircraftinfos = AircraftInfos(icao_aa,callsign,squawk, \ + lat_deg,lon_deg,alt_ft,speed_kph,vspeed_ftpmin,maxloadfactor,track_angle_deg, \ + timesync,capability,type_code,surveillance_status,nicsup,on_surface) + track_simulation = getTrackSimulationThread(trajectory_type,broadcast_thread,aircraftinfos,waypoints_file) + track_simulators.append(track_simulation) + + # Scenario file parsing + else: + print("[*] JSON Scenario mode: "+os.path.abspath(scenariofile)) + with open(scenariofile,'r') as json_file: + scenario = json.load(json_file) + + for plane in scenario.values(): + plane_info = AircraftInfos.from_json(plane["filename"]) + + if "waypoints_file" in plane: + waypoints_file = plane["waypoints_file"] + print("[!] Waypoints file detected: " +os.path.abspath(waypoints_file)) + + track_simulation = getTrackSimulationThread(plane["trajectory_type"],broadcast_thread,plane_info,waypoints_file) + + track_simulators.append(track_simulation) + + print("[*] Scenario contains track simulation instructions for "+str(len(track_simulators))+" plane(s):") + for tsim in track_simulators: + print(" [:] Callsign: "+tsim.aircraftinfos.callsign.ljust(9,' ')+"MSL altitude: "+"{:7.1f}".format(tsim.aircraftinfos.alt_msl_ft)+" ft") + + for tsim in track_simulators: + broadcast_thread.register_track_simulation_thread(tsim) + + while(val:=input("[*] Type \'s + Enter\' to start ADS-B transmission, and type \'s + Enter\' again to stop:\n") != 's'): + time.sleep(0.05) + + # start all threads + for tsim in track_simulators: + tsim.start() + + broadcast_thread.start() + + # user input loop. Todo : implement other commands? (in that case don't forget to check if mutex protection is needed) + while(val:=input("") != 's'): + time.sleep(0.05) + + # stop all threads + for tsim in track_simulators: + tsim.stop() + + broadcast_thread.stop() + + # wait for all threads to terminate + for tsim in track_simulators: + tsim.join() + broadcast_thread.join() + + print("==== ADS-B transmission ended ====") + +if __name__ == "__main__": + main() diff --git a/realtime-adsb-out.py b/realtime-adsb-out.py old mode 100755 new mode 100644 index b8407f0..352b6c7 --- a/realtime-adsb-out.py +++ b/realtime-adsb-out.py @@ -27,7 +27,7 @@ def usage(msg=False): if msg:print(msg) - print("Usage: %s [options]\n" % sys.argv[0]) + print("[h] Usage: %s [options]\n" % sys.argv[0]) print("-h | --help Display help message") print("--scenario Scenario mode, argument is scenario JSON filepath") print("--icao Callsign in hex, default: 0x508035") @@ -50,7 +50,6 @@ def usage(msg=False): print("--sstatus Surveillance status, Default: 0") print("--nicsupplementb NIC supplement-B, Default: 0") print("--surface Aircraft located on ground, Default: False") - print("--waypoints Waypoints file for waypoints trajectory, argument is .txt filepath") print("--posrate Position frame broadcast period in µs, Default: 150000") print("") #print("see usage.md for additionnal information") @@ -120,7 +119,7 @@ def main(): elif opt in ('--surface'):on_surface = True elif opt in ('--posrate'):posrate = int(arg) else:usage("Unknown option %s\n" % opt) - print ("\n@@@@@@@ REALTIME-ADSB-OUT v0.2 core by Matioupi modified by six3oo @@@@@@@\n") + print ("\n==== ADS-B Track Player v0.1.2 | by six3oo | core by Matioupi ====\n") track_simulators = [] broadcast_thread = HackRfBroadcastThread(posrate) # posrate would usally be used with random mode to generate load of tracks @@ -157,7 +156,7 @@ def main(): for tsim in track_simulators: broadcast_thread.register_track_simulation_thread(tsim) - while(val:=input("Type \'s + Enter\' to start the adsb-out simulation, and type \'s + Enter\' again to stop it:\n") != 's'): + while(val:=input("[*] Type \'s + Enter\' to start ADS-B transmission, and type \'s + Enter\' again to stop:\n") != 's'): time.sleep(0.05) # start all threads @@ -166,7 +165,7 @@ def main(): broadcast_thread.start() - # user input loop. Todo : implement other commands? (in that case don't forget to check if mutex protection is needed) + # user input loop. TODO: Implement other commands? (in that case don't forget to check if mutex protection is needed) while(val:=input("") != 's'): time.sleep(0.05) @@ -181,7 +180,7 @@ def main(): tsim.join() broadcast_thread.join() - print("realtime-adsb-out simulation ended") + print("==== ADS-B transmission ended ====") if __name__ == "__main__": main() From 666c5cf7440d07a8e470be8933b503d4cf6f131e Mon Sep 17 00:00:00 2001 From: Anton Chua Date: Thu, 27 Apr 2023 17:21:12 +0800 Subject: [PATCH 04/22] Update README Update with new executable name --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 1915021..117f0e6 100755 --- a/README.md +++ b/README.md @@ -32,13 +32,14 @@ The message encoding is splitted into mode S "frame encoding" and "low level enc - Waypoint trajectory simulation is implemented - Circle and Random trajectory simulations have been removed - Increased verbosity and updated usage print +- HackRF configured for wireless transmission (Default: 1090MHz) [NOTE: It is illegal in most jurisdictions to transmit at 1090MHz!] ## Command Line Examples #### *Command line switches can be displayed with* ``` -six3oo@computer:~/realtime-adsb-out$ ./realtime-adsb-out.py -h +six3oo@computer:~/adsb-track-player$ ./adsb-track-player.py -h Usage: ./realtime-adsb-out.py [options] -h | --help Display help message @@ -63,20 +64,19 @@ Usage: ./realtime-adsb-out.py [options] --sstatus Surveillance status, Default: 0 --nicsupplementb NIC supplement-B, Default: 0 --surface Aircraft located on ground, Default: False ---waypoints Waypoints file for waypoints trajectory, argument is .txt filepath --posrate Position frame broadcast period in µs, Default: 150000 ``` #### *Single plane scenarios* -`./realtime-adsb-out.py --callsign 'TEST' --alt 4500 --speed 600 --trajectorytype fixed --maxloadfactor 1.03` +`./adsb-track-player.py --callsign 'TEST' --alt 4500 --speed 600 --trajectorytype fixed --maxloadfactor 1.03` will generate a fixed trajectory, flown at 4500 ft, 600 km/h and a load factor of 1.03. #### *JSON scenarios with multiple planes* -`./realtime-adsb-out.py --scenario ./examples/scenario.json` +`./adsb-track-player.py --scenario ./examples/scenario.json` ![4 planes scenario example](./images/adsb-out-scenario3.png "4 planes scenario example") From 582268e75714b18342ec0a099bbb715eafe9f0af Mon Sep 17 00:00:00 2001 From: Anton Chua Date: Thu, 27 Apr 2023 17:35:36 +0800 Subject: [PATCH 05/22] Update README Language fixes --- README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 117f0e6..71ccae9 100755 --- a/README.md +++ b/README.md @@ -23,16 +23,17 @@ As per the project 'realtime-adsb-out', the workflow is divided between 3 execut - Main thread wich performs all initializations and control user inputs (mainly start / stop simulation for now) - HackRF broadcasting thread which pump encoded messages and send them over the air with a predefined schedule -- Trajectory simulation thread which feed brodcasting thread with encoded messages matching a real time simulated trajectory +- Trajectory simulation thread which feeds the broadcasting thread with encoded messages matching a real time simulated trajectory -The message encoding is splitted into mode S "frame encoding" and "low level encoding" which handles PPM modulation and conversion to hackRF IQ sample format. Software source code structure tries to reflect those 2 different layers. +The message encoding is split into Mode S "frame encoding" and "low level encoding" which handles PPM modulation and conversion to HackRF IQ sample format. The source code structure tries to reflect these two layers. ## Modifications from 'realtime-adsb-out' - Waypoint trajectory simulation is implemented - Circle and Random trajectory simulations have been removed -- Increased verbosity and updated usage print -- HackRF configured for wireless transmission (Default: 1090MHz) [NOTE: It is illegal in most jurisdictions to transmit at 1090MHz!] +- Increased verbosity +- HackRF configured for wireless RF transmission (Default: 1090MHz) +[NOTE: It is illegal in most jurisdictions to transmit at 1090MHz!] ## Command Line Examples @@ -40,7 +41,7 @@ The message encoding is splitted into mode S "frame encoding" and "low level enc ``` six3oo@computer:~/adsb-track-player$ ./adsb-track-player.py -h -Usage: ./realtime-adsb-out.py [options] +Usage: ./adsb-track-player.py [options] -h | --help Display help message --scenario Scenario mode, argument is scenario JSON filepath From 65a60e42e7eee3c776c3850250714e55c2f88fee Mon Sep 17 00:00:00 2001 From: Anton Chua Date: Thu, 27 Apr 2023 17:38:24 +0800 Subject: [PATCH 06/22] Update README More language fixes --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 71ccae9..cd116c2 100755 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ This project is a highly modified fork of: -https://github.com/Matioupi/realtime-adsb-out +https://github.com/Matioupi/realtime-adsb-out (forked on 25 Apr 2023): It is thus important to read the README of that project. @@ -21,8 +21,8 @@ Please let me know if you have issues or require more explicit citations about r As per the project 'realtime-adsb-out', the workflow is divided between 3 execution threads: -- Main thread wich performs all initializations and control user inputs (mainly start / stop simulation for now) -- HackRF broadcasting thread which pump encoded messages and send them over the air with a predefined schedule +- Main thread which performs all initializations and control user inputs (mainly start / stop simulation for now) +- HackRF broadcasting thread which pumps encoded messages and sends them over the air with a predefined schedule - Trajectory simulation thread which feeds the broadcasting thread with encoded messages matching a real time simulated trajectory The message encoding is split into Mode S "frame encoding" and "low level encoding" which handles PPM modulation and conversion to HackRF IQ sample format. The source code structure tries to reflect these two layers. @@ -37,7 +37,7 @@ The message encoding is split into Mode S "frame encoding" and "low level encodi ## Command Line Examples -#### *Command line switches can be displayed with* +#### *Command line switches (accessed with '-h')* ``` six3oo@computer:~/adsb-track-player$ ./adsb-track-player.py -h From b428f28aa55a38ac47caa903ddbf35dd7c7ca099 Mon Sep 17 00:00:00 2001 From: Anton Chua Date: Thu, 27 Apr 2023 18:07:32 +0800 Subject: [PATCH 07/22] Delete old executable Language fixes in README Rearrange HackRF broadcast file --- HackRfBroadcastThread.py | 35 ++++---- README.md | 2 +- adsb-track-player.py | 7 +- realtime-adsb-out.py | 186 --------------------------------------- 4 files changed, 22 insertions(+), 208 deletions(-) delete mode 100644 realtime-adsb-out.py diff --git a/HackRfBroadcastThread.py b/HackRfBroadcastThread.py index 30d445b..709a90a 100644 --- a/HackRfBroadcastThread.py +++ b/HackRfBroadcastThread.py @@ -65,7 +65,6 @@ def __init__(self,airborne_position_refresh_period = 150000): self._messages_feed_threads = {} - # Initialize pyHackRF library result = HackRF.initialize() if (result != LibHackRfReturnCode.HACKRF_SUCCESS): @@ -79,37 +78,37 @@ def __init__(self,airborne_position_refresh_period = 150000): if (result != LibHackRfReturnCode.HACKRF_SUCCESS): print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) - #result = self._hackrf_broadcaster.setAmplifierMode(LibHackRfHwMode.HW_MODE_ON) # LNA Amplifier ON or OFF - #if (result != LibHackRfReturnCode.HACKRF_SUCCESS): - # print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) - - #result = self._hackrf_broadcaster.setLNAGain(10) # LNA Amplifier Gain - #if (result != LibHackRfReturnCode.HACKRF_SUCCESS): - # print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) - - result = self._hackrf_broadcaster.setAntennaPowerMode(LibHackRfHwMode.HW_MODE_ON) # Antenna Power Mode ON or OFF - if (result != LibHackRfReturnCode.HACKRF_SUCCESS): - print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) - self._hackrf_broadcaster.setCrystalPPM(0) - + # 2MHz sample rate to meet ADS-B spec of 0.5µs PPM symbol result = self._hackrf_broadcaster.setSampleRate(2000000) if (result != LibHackRfReturnCode.HACKRF_SUCCESS): print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) - + result = self._hackrf_broadcaster.setBasebandFilterBandwidth(HackRF.computeBaseBandFilterBw(2000000)) if (result != LibHackRfReturnCode.HACKRF_SUCCESS): print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) - + #result = self.hackrf_broadcaster.setFrequency(868000000) # 868MHz = Free frequency for over the air broadcast tests result = self._hackrf_broadcaster.setFrequency(1090000000) # Actual 1090MHz setting if (result != LibHackRfReturnCode.HACKRF_SUCCESS): print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) - + result = self._hackrf_broadcaster.setTXVGAGain(40) # TX VGA Gain (4 for wire feed + attenuators, 40 for wireless) if (result != LibHackRfReturnCode.HACKRF_SUCCESS): - print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) + print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) + + result = self._hackrf_broadcaster.setAmplifierMode(LibHackRfHwMode.HW_MODE_ON) # LNA Amplifier ON or OFF + if (result != LibHackRfReturnCode.HACKRF_SUCCESS): + print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) + + #result = self._hackrf_broadcaster.setLNAGain(10) # LNA Amplifier Gain + #if (result != LibHackRfReturnCode.HACKRF_SUCCESS): + # print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) + + #result = self._hackrf_broadcaster.setAntennaPowerMode(LibHackRfHwMode.HW_MODE_ON) # Antenna Power Mode ON or OFF + #if (result != LibHackRfReturnCode.HACKRF_SUCCESS): + # print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) self._tx_context = hackrf_tx_context() diff --git a/README.md b/README.md index cd116c2..f6b9963 100755 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ Usage: ./adsb-track-player.py [options] --trajectorytype Types of simulated trajectories: fixed : steady aircraft waypoints : fly long flight path - Default:fixed + Default: fixed --lat Latitude for the plane in decimal degrees, Default: 50.44994 --long Longitude for the plane in decimal degrees. Default: 30.5211 --altitude Altitude in decimal feet, Default: 1500.0 diff --git a/adsb-track-player.py b/adsb-track-player.py index 9f178b7..3b87927 100755 --- a/adsb-track-player.py +++ b/adsb-track-player.py @@ -36,7 +36,7 @@ def usage(msg=False): print("--trajectorytype Types of simulated trajectories:") print(" fixed : steady aircraft") print(" waypoints : fly long flight path") - print(" Default:fixed") + print(" Default: fixed") print("--lat Latitude for the plane in decimal degrees, Default: 50.44994") print("--long Longitude for the plane in decimal degrees. Default: 30.5211") print("--altitude Altitude in decimal feet, Default: 1500.0") @@ -120,6 +120,7 @@ def main(): elif opt in ('--posrate'):posrate = int(arg) else:usage("Unknown option %s\n" % opt) print ("\n==== ADS-B Track Player v0.1.2 | by six3oo | core by Matioupi ====\n") + track_simulators = [] broadcast_thread = HackRfBroadcastThread(posrate) # posrate would usally be used with random mode to generate load of tracks @@ -159,7 +160,7 @@ def main(): while(val:=input("[*] Type \'s + Enter\' to start ADS-B transmission, and type \'s + Enter\' again to stop:\n") != 's'): time.sleep(0.05) - # start all threads + # START all threads for tsim in track_simulators: tsim.start() @@ -169,7 +170,7 @@ def main(): while(val:=input("") != 's'): time.sleep(0.05) - # stop all threads + # STOP all threads for tsim in track_simulators: tsim.stop() diff --git a/realtime-adsb-out.py b/realtime-adsb-out.py deleted file mode 100644 index 352b6c7..0000000 --- a/realtime-adsb-out.py +++ /dev/null @@ -1,186 +0,0 @@ -#!/usr/bin/env python3 - -""" This file hold the main function which read user inputs -initialize and launch the simulation - -This program is free software: you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation, either version 3 of the License, or (at your option) any later -version. -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -You should have received a copy of the GNU General Public License along with -this program. If not, see . -""" - -import sys, time, math, os -import threading, json -import traceback - -from AircraftInfos import AircraftInfos -from FixedTrajectorySimulator import FixedTrajectorySimulator -from WaypointsTrajectorySimulator import WaypointsTrajectorySimulator -from HackRfBroadcastThread import HackRfBroadcastThread - -from getopt import getopt, GetoptError - -def usage(msg=False): - if msg:print(msg) - print("[h] Usage: %s [options]\n" % sys.argv[0]) - print("-h | --help Display help message") - print("--scenario Scenario mode, argument is scenario JSON filepath") - print("--icao Callsign in hex, default: 0x508035") - print("--callsign Callsign (8 chars max), Default: DEADBEEF") - print("--squawk 4-digit 4096 code squawk, Default: 7000") - print("--trajectorytype Types of simulated trajectories:") - print(" fixed : steady aircraft") - print(" waypoints : fly long flight path") - print(" Default:fixed") - print("--lat Latitude for the plane in decimal degrees, Default: 50.44994") - print("--long Longitude for the plane in decimal degrees. Default: 30.5211") - print("--altitude Altitude in decimal feet, Default: 1500.0") - print("--speed Airspeed in decimal kph, Default: 300.0") - print("--vspeed Vertical speed en ft/min, positive UP, Default: 0") - print("--maxloadfactor Specify the max load factor for aircraft simulation, Default: 1.45") - print("--trackangle Track angle in decimal degrees, Default: 0") - print("--timesync 0/1, 0 indicates time not synchronous with UTC, Default: 0") - print("--capability Capability, Default: 5") - print("--typecode ADS-B message type, Default: 11") - print("--sstatus Surveillance status, Default: 0") - print("--nicsupplementb NIC supplement-B, Default: 0") - print("--surface Aircraft located on ground, Default: False") - print("--posrate Position frame broadcast period in µs, Default: 150000") - print("") - #print("see usage.md for additionnal information") - - sys.exit(2) - -def getTrackSimulationThread(trajectory_type,broadcast_thread,aircraftinfos,waypoints_file): - if trajectory_type == 'fixed': - return FixedTrajectorySimulator(broadcast_thread.getMutex(),broadcast_thread,aircraftinfos) - elif trajectory_type == 'waypoints': - return WaypointsTrajectorySimulator(broadcast_thread.getMutex(),broadcast_thread,aircraftinfos,waypoints_file) - else: - return None - -def main(): - - # Default values - icao_aa = '0x508035' - callsign = 'DEADBEEF' - squawk = '7000' - alt_ft = 1500.0 - lat_deg = 50.44994 - lon_deg = 30.5211 - speed_kph = 300.0 - vspeed_ftpmin = 0.0 - maxloadfactor = 1.45 - track_angle_deg = 0.0 - capability = 5 - type_code = 11 - surveillance_status = 0 - timesync = 0 - nicsup = 0 - on_surface = False - trajectory_type = 'fixed' - waypoints_file = None - posrate = 150000 - scenariofile = None - waypoints_file = None - try: - (opts, args) = getopt(sys.argv[1:], 'h', \ - ['help','scenario=','icao=','callsign=','squawk=','trajectorytype=','lat=','long=','altitude=','speed=','vspeed=','maxloadfactor=','trackangle=', - 'timesync=','capability=','typecode=','sstatus=','nicsupplementb=','surface','posrate=' - ]) - except GetoptError as err: - usage("%s\n" % err) - - if len(opts) != 0: - for (opt, arg) in opts: - if opt in ('-h', '--help'):usage() - elif opt in ('--scenario'):scenariofile = arg - elif opt in ('--icao'):icao_aa = arg - elif opt in ('--callsign'):callsign = arg - elif opt in ('--squawk'):squawk = arg - elif opt in ('--trajectorytype'):trajectory_type = arg - elif opt in ('--lat'):lat_deg = float(arg) - elif opt in ('--long'):lon_deg = float(arg) - elif opt in ('--altitude'):alt_ft = float(arg) - elif opt in ('--speed'):speed_kph = float(arg) - elif opt in ('--vspeed'):vspeed_ftpmin = float(arg) - elif opt in ('--maxloadfactor'):maxloadfactor = float(arg) - elif opt in ('--trackangle'):track_angle_deg = float(arg) - elif opt in ('--timesync'):timesync = int(arg) - elif opt in ('--capability'):capability = int(arg) - elif opt in ('--typecode'):type_code = int(arg) - elif opt in ('--sstatus'):surveillance_status = int(arg) - elif opt in ('--nicsupplementb'):nicsup = int(arg) - elif opt in ('--surface'):on_surface = True - elif opt in ('--posrate'):posrate = int(arg) - else:usage("Unknown option %s\n" % opt) - print ("\n==== ADS-B Track Player v0.1.2 | by six3oo | core by Matioupi ====\n") - track_simulators = [] - broadcast_thread = HackRfBroadcastThread(posrate) # posrate would usally be used with random mode to generate load of tracks - - # Scenario file presence check - if scenariofile == None: - print("[*] Single plane CLI mode") - aircraftinfos = AircraftInfos(icao_aa,callsign,squawk, \ - lat_deg,lon_deg,alt_ft,speed_kph,vspeed_ftpmin,maxloadfactor,track_angle_deg, \ - timesync,capability,type_code,surveillance_status,nicsup,on_surface) - track_simulation = getTrackSimulationThread(trajectory_type,broadcast_thread,aircraftinfos,waypoints_file) - track_simulators.append(track_simulation) - - # Scenario file parsing - else: - print("[*] JSON Scenario mode: "+os.path.abspath(scenariofile)) - with open(scenariofile,'r') as json_file: - scenario = json.load(json_file) - - for plane in scenario.values(): - plane_info = AircraftInfos.from_json(plane["filename"]) - - if "waypoints_file" in plane: - waypoints_file = plane["waypoints_file"] - print("[!] Waypoints file detected: " +os.path.abspath(waypoints_file)) - - track_simulation = getTrackSimulationThread(plane["trajectory_type"],broadcast_thread,plane_info,waypoints_file) - - track_simulators.append(track_simulation) - - print("[*] Scenario contains track simulation instructions for "+str(len(track_simulators))+" plane(s):") - for tsim in track_simulators: - print(" [:] Callsign: "+tsim.aircraftinfos.callsign.ljust(9,' ')+"MSL altitude: "+"{:7.1f}".format(tsim.aircraftinfos.alt_msl_ft)+" ft") - - for tsim in track_simulators: - broadcast_thread.register_track_simulation_thread(tsim) - - while(val:=input("[*] Type \'s + Enter\' to start ADS-B transmission, and type \'s + Enter\' again to stop:\n") != 's'): - time.sleep(0.05) - - # start all threads - for tsim in track_simulators: - tsim.start() - - broadcast_thread.start() - - # user input loop. TODO: Implement other commands? (in that case don't forget to check if mutex protection is needed) - while(val:=input("") != 's'): - time.sleep(0.05) - - # stop all threads - for tsim in track_simulators: - tsim.stop() - - broadcast_thread.stop() - - # wait for all threads to terminate - for tsim in track_simulators: - tsim.join() - broadcast_thread.join() - - print("==== ADS-B transmission ended ====") - -if __name__ == "__main__": - main() From fdfb4ee20aa05182eb546b3f0a8066e5edac94ca Mon Sep 17 00:00:00 2001 From: Anton Chua Date: Fri, 5 May 2023 10:18:15 +0800 Subject: [PATCH 08/22] Change TX Amp Gain TX VGA gain to 47 LNA gain to 14 --- HackRfBroadcastThread.py | 33 +++++++++++++++++++-------------- adsb-track-player.py | 3 +-- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/HackRfBroadcastThread.py b/HackRfBroadcastThread.py index 709a90a..17bdc72 100644 --- a/HackRfBroadcastThread.py +++ b/HackRfBroadcastThread.py @@ -79,7 +79,15 @@ def __init__(self,airborne_position_refresh_period = 150000): print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) self._hackrf_broadcaster.setCrystalPPM(0) + + result = self._hackrf_broadcaster.setAmplifierMode(LibHackRfHwMode.HW_MODE_ON) # Amplifier ON or OFF + if (result != LibHackRfReturnCode.HACKRF_SUCCESS): + print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) + result = self._hackrf_broadcaster.setLNAGain(14) # LNA Amplifier Gain + if (result != LibHackRfReturnCode.HACKRF_SUCCESS): + print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) + # 2MHz sample rate to meet ADS-B spec of 0.5µs PPM symbol result = self._hackrf_broadcaster.setSampleRate(2000000) if (result != LibHackRfReturnCode.HACKRF_SUCCESS): @@ -94,22 +102,20 @@ def __init__(self,airborne_position_refresh_period = 150000): if (result != LibHackRfReturnCode.HACKRF_SUCCESS): print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) - result = self._hackrf_broadcaster.setTXVGAGain(40) # TX VGA Gain (4 for wire feed + attenuators, 40 for wireless) + result = self._hackrf_broadcaster.setTXVGAGain(47) # TX VGA Gain (4 for wire feed + attenuators, 40 for wireless) if (result != LibHackRfReturnCode.HACKRF_SUCCESS): print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) - result = self._hackrf_broadcaster.setAmplifierMode(LibHackRfHwMode.HW_MODE_ON) # LNA Amplifier ON or OFF - if (result != LibHackRfReturnCode.HACKRF_SUCCESS): - print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) + print("[*] HackRF Transciever Mode: "+str(self._hackrf_broadcaster.getTransceiverMode())) # Get Transceiver Mode - #result = self._hackrf_broadcaster.setLNAGain(10) # LNA Amplifier Gain - #if (result != LibHackRfReturnCode.HACKRF_SUCCESS): - # print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) - - #result = self._hackrf_broadcaster.setAntennaPowerMode(LibHackRfHwMode.HW_MODE_ON) # Antenna Power Mode ON or OFF + #print("[*] HackRF Transceiver Mode: "+str(self._hackrf_broadcaster.setTransceiverMode())) # Set Transceiver Mode #if (result != LibHackRfReturnCode.HACKRF_SUCCESS): # print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) - + + result = self._hackrf_broadcaster.setAntennaPowerMode(LibHackRfHwMode.HW_MODE_ON) # Antenna Power Mode ON or OFF + if (result != LibHackRfReturnCode.HACKRF_SUCCESS): + print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) + self._tx_context = hackrf_tx_context() self._do_stop = False @@ -175,10 +181,9 @@ def broadcast_data(self,data): self._mutex.release() result = self._hackrf_broadcaster.startTX(hackrfTXCB,self._tx_context) - if (result != LibHackRfReturnCode.HACKRF_SUCCESS): print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) - + while self._hackrf_broadcaster.isStreaming(): time.sleep(sleep_time) @@ -205,7 +210,7 @@ def run(self): else: remaining = -float('inf') sleep_time = 0.0 - # Time throttling: messages are broadcasted only at provided time intervall + # Time throttling: messages are broadcasted only at provided time interval # TODO : Implement UTC syncing mechanism (requires that the actual host clock is UTC synced) ? # which may be implemented to some accuracy level with ntp or GPS + PPS mechanisms in Python ? if (v[0] != None and len(v[0]) > 0) and remaining <= 0.0: @@ -215,7 +220,7 @@ def run(self): remaining = math.fmod(remaining,v2_sec) if remaining < sleep_time: sleep_time = remaining - + #print("sleep_time1",sleep_time) bc_length = len(plane_messages) if (bc_length > 0): diff --git a/adsb-track-player.py b/adsb-track-player.py index 3b87927..d724180 100755 --- a/adsb-track-player.py +++ b/adsb-track-player.py @@ -119,7 +119,7 @@ def main(): elif opt in ('--surface'):on_surface = True elif opt in ('--posrate'):posrate = int(arg) else:usage("Unknown option %s\n" % opt) - print ("\n==== ADS-B Track Player v0.1.2 | by six3oo | core by Matioupi ====\n") + print ("\n==== ADS-B Track Player v0.1.3 | by six3oo | core by Matioupi ====\n") track_simulators = [] broadcast_thread = HackRfBroadcastThread(posrate) # posrate would usally be used with random mode to generate load of tracks @@ -165,7 +165,6 @@ def main(): tsim.start() broadcast_thread.start() - # user input loop. Todo : implement other commands? (in that case don't forget to check if mutex protection is needed) while(val:=input("") != 's'): time.sleep(0.05) From 58959dcd7af64e67899f15ff8f1d926afa2e43ad Mon Sep 17 00:00:00 2001 From: Anton Chua Date: Tue, 6 Jun 2023 13:55:52 +0800 Subject: [PATCH 09/22] Feature update Update help, change waypoint file detection, add FlightPathSim --- FlightPathSimulator.py | 43 +++++++++++++++++++++++++ HackRfBroadcastThread.py | 16 ++++----- adsb-track-player.py | 22 +++++++------ scenario.json | 13 ++++++++ examples/waypoints.txt => waypoints.txt | 0 5 files changed, 75 insertions(+), 19 deletions(-) create mode 100644 FlightPathSimulator.py create mode 100644 scenario.json rename examples/waypoints.txt => waypoints.txt (100%) diff --git a/FlightPathSimulator.py b/FlightPathSimulator.py new file mode 100644 index 0000000..8f79b08 --- /dev/null +++ b/FlightPathSimulator.py @@ -0,0 +1,43 @@ +""" simplest implementation of a trajectory simulation where the simulated +aircraft is randomly distributed inside a circle +mutex protection occurs when calling replace_message +This program is free software: you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation, either version 3 of the License, or (at your option) any later +version. +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +You should have received a copy of the GNU General Public License along with +this program. If not, see . +""" + +import random +import datetime, math +from AbstractTrajectorySimulatorBase import AbstractTrajectorySimulatorBase + +class FlightPathSimulator(AbstractTrajectorySimulatorBase): + def __init__(self,mutex,broadcast_thread,aircrafinfos): + super().__init__(mutex,broadcast_thread,aircrafinfos) + self._starttime = datetime.datetime.now(datetime.timezone.utc) + + self._lat0 = aircrafinfos.lat_deg + self._lon0 = aircrafinfos.lon_deg + + self._max_alt_m = aircrafinfos.alt_msl_m + self._max_speed_mps = aircrafinfos.speed_mps + + def refresh_delay(self): + return 0.005 + + def update_aircraftinfos(self): + + d0 = self._max_speed_mps * 30.0 + Rlat = (d0/6371000.0)*(180.0/math.pi) + Rlon = Rlat/math.cos(self._lat0*math.pi/180.0) + self._aircraftinfos.track_angle_deg = random.uniform(0,360.0) + self._aircraftinfos.lat_deg = self._lat0 - random.uniform(-Rlat,Rlat) + self._aircraftinfos.lon_deg = self._lon0 + random.uniform(-Rlon,Rlon) + + self._aircraftinfos.alt_msl_m = random.uniform(1.0,self._max_alt_m) + self._aircraftinfos.speed_mps = random.uniform(0.0,self._max_speed_mps) diff --git a/HackRfBroadcastThread.py b/HackRfBroadcastThread.py index 17bdc72..05f32ee 100644 --- a/HackRfBroadcastThread.py +++ b/HackRfBroadcastThread.py @@ -80,7 +80,7 @@ def __init__(self,airborne_position_refresh_period = 150000): self._hackrf_broadcaster.setCrystalPPM(0) - result = self._hackrf_broadcaster.setAmplifierMode(LibHackRfHwMode.HW_MODE_ON) # Amplifier ON or OFF + result = self._hackrf_broadcaster.setAmplifierMode(LibHackRfHwMode.HW_MODE_ON) # LNA Amplifier ON or OFF if (result != LibHackRfReturnCode.HACKRF_SUCCESS): print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) @@ -98,23 +98,19 @@ def __init__(self,airborne_position_refresh_period = 150000): print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) #result = self.hackrf_broadcaster.setFrequency(868000000) # 868MHz = Free frequency for over the air broadcast tests - result = self._hackrf_broadcaster.setFrequency(1090000000) # Actual 1090MHz setting + result = self._hackrf_broadcaster.setFrequency(1090000000) # Actual 1090MHz frequency setting if (result != LibHackRfReturnCode.HACKRF_SUCCESS): print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) - result = self._hackrf_broadcaster.setTXVGAGain(47) # TX VGA Gain (4 for wire feed + attenuators, 40 for wireless) + result = self._hackrf_broadcaster.setTXVGAGain(47) # TX VGA Gain (4 for wire feed + attenuators, 47 for wireless) if (result != LibHackRfReturnCode.HACKRF_SUCCESS): print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) - print("[*] HackRF Transciever Mode: "+str(self._hackrf_broadcaster.getTransceiverMode())) # Get Transceiver Mode - - #print("[*] HackRF Transceiver Mode: "+str(self._hackrf_broadcaster.setTransceiverMode())) # Set Transceiver Mode + #print("[*] HackRF Transciever Mode: "+str(self._hackrf_broadcaster.getTransceiverMode())) # Get Transceiver Mode + + #result = self._hackrf_broadcaster.setAntennaPowerMode(LibHackRfHwMode.HW_MODE_ON) # Antenna Power Mode ON or OFF #if (result != LibHackRfReturnCode.HACKRF_SUCCESS): # print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) - - result = self._hackrf_broadcaster.setAntennaPowerMode(LibHackRfHwMode.HW_MODE_ON) # Antenna Power Mode ON or OFF - if (result != LibHackRfReturnCode.HACKRF_SUCCESS): - print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) self._tx_context = hackrf_tx_context() diff --git a/adsb-track-player.py b/adsb-track-player.py index d724180..48f3744 100755 --- a/adsb-track-player.py +++ b/adsb-track-player.py @@ -15,12 +15,14 @@ """ import sys, time, math, os +from os.path import exists import threading, json import traceback from AircraftInfos import AircraftInfos from FixedTrajectorySimulator import FixedTrajectorySimulator from WaypointsTrajectorySimulator import WaypointsTrajectorySimulator +from FlightPathSimulator import FlightPathSimulator from HackRfBroadcastThread import HackRfBroadcastThread from getopt import getopt, GetoptError @@ -30,12 +32,13 @@ def usage(msg=False): print("[h] Usage: %s [options]\n" % sys.argv[0]) print("-h | --help Display help message") print("--scenario Scenario mode, argument is scenario JSON filepath") + print(" Waypoints : Include waypoints.txt file in script directory") print("--icao Callsign in hex, default: 0x508035") print("--callsign Callsign (8 chars max), Default: DEADBEEF") print("--squawk 4-digit 4096 code squawk, Default: 7000") print("--trajectorytype Types of simulated trajectories:") print(" fixed : steady aircraft") - print(" waypoints : fly long flight path") + print(" flightsim : dynamically generated flight path") print(" Default: fixed") print("--lat Latitude for the plane in decimal degrees, Default: 50.44994") print("--long Longitude for the plane in decimal degrees. Default: 30.5211") @@ -61,6 +64,8 @@ def getTrackSimulationThread(trajectory_type,broadcast_thread,aircraftinfos,wayp return FixedTrajectorySimulator(broadcast_thread.getMutex(),broadcast_thread,aircraftinfos) elif trajectory_type == 'waypoints': return WaypointsTrajectorySimulator(broadcast_thread.getMutex(),broadcast_thread,aircraftinfos,waypoints_file) + elif trajectory_type == 'flightsim': + return FlightPathSimulator(broadcast_thread.getMutex(),broadcast_thread,aircraftinfos,scenariofile) else: return None @@ -119,7 +124,7 @@ def main(): elif opt in ('--surface'):on_surface = True elif opt in ('--posrate'):posrate = int(arg) else:usage("Unknown option %s\n" % opt) - print ("\n==== ADS-B Track Player v0.1.3 | by six3oo | core by Matioupi ====\n") + print ("\n==== ADS-B Track Player v0.2.0 | by six3oo | core by Matioupi ====\n") track_simulators = [] broadcast_thread = HackRfBroadcastThread(posrate) # posrate would usally be used with random mode to generate load of tracks @@ -138,16 +143,15 @@ def main(): print("[*] JSON Scenario mode: "+os.path.abspath(scenariofile)) with open(scenariofile,'r') as json_file: scenario = json.load(json_file) - + + if exists("waypoints.txt"): + waypoints_file = "waypoints.txt" + print("[!] Waypoints file detected: " +os.path.abspath(waypoints_file)) + for plane in scenario.values(): plane_info = AircraftInfos.from_json(plane["filename"]) - - if "waypoints_file" in plane: - waypoints_file = plane["waypoints_file"] - print("[!] Waypoints file detected: " +os.path.abspath(waypoints_file)) - + track_simulation = getTrackSimulationThread(plane["trajectory_type"],broadcast_thread,plane_info,waypoints_file) - track_simulators.append(track_simulation) print("[*] Scenario contains track simulation instructions for "+str(len(track_simulators))+" plane(s):") diff --git a/scenario.json b/scenario.json new file mode 100644 index 0000000..308db11 --- /dev/null +++ b/scenario.json @@ -0,0 +1,13 @@ +{ + "plane1": + { + "filename":"./examples/MRYIA.json", + "trajectory_type":"waypoints", + "waypoints_file":"./examples/waypoints.txt" + }, + "plane2": + { + "filename":"./examples/AN-IL78MP.json", + "trajectory_type":"fixed" + } +} diff --git a/examples/waypoints.txt b/waypoints.txt similarity index 100% rename from examples/waypoints.txt rename to waypoints.txt From f65b93569b1b76884522b286d32744fa2cc49e75 Mon Sep 17 00:00:00 2001 From: Anton Chua Date: Tue, 6 Jun 2023 14:44:41 +0800 Subject: [PATCH 10/22] Fix FlightPath feature Make waypoints_file optional --- AbstractTrajectorySimulatorBase.py | 2 +- FlightPathSimulator.py | 5 ++++- adsb-track-player.py | 6 +++--- examples/scenario.json | 5 +++++ 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/AbstractTrajectorySimulatorBase.py b/AbstractTrajectorySimulatorBase.py index ea4ae23..b402065 100644 --- a/AbstractTrajectorySimulatorBase.py +++ b/AbstractTrajectorySimulatorBase.py @@ -28,7 +28,7 @@ from ModeS import ModeS class AbstractTrajectorySimulatorBase(threading.Thread,abc.ABC): - def __init__(self,mutex,broadcast_thread,aircraftinfos,waypoints_file): + def __init__(self,mutex,broadcast_thread,aircraftinfos,waypoints_file=0): super().__init__() self._mutex = mutex self._broadcast_thread = broadcast_thread diff --git a/FlightPathSimulator.py b/FlightPathSimulator.py index 8f79b08..c3b59e2 100644 --- a/FlightPathSimulator.py +++ b/FlightPathSimulator.py @@ -28,7 +28,7 @@ def __init__(self,mutex,broadcast_thread,aircrafinfos): self._max_speed_mps = aircrafinfos.speed_mps def refresh_delay(self): - return 0.005 + return 0.2 def update_aircraftinfos(self): @@ -41,3 +41,6 @@ def update_aircraftinfos(self): self._aircraftinfos.alt_msl_m = random.uniform(1.0,self._max_alt_m) self._aircraftinfos.speed_mps = random.uniform(0.0,self._max_speed_mps) + + print("[!] FLIGHT SIM\t\tCallsign: "+self._aircraftinfos.callsign) + print(" [:] Lat: "+str(self._aircraftinfos.lat_deg)+" | Lon: "+str(self._aircraftinfos.lon_deg)+" | Alt: "+str(self._aircraftinfos.alt_msl_m)+" | Spd: "+str(self._aircraftinfos.speed_mps)+" | Trk Angle: "+str(self._aircraftinfos.track_angle_deg)) diff --git a/adsb-track-player.py b/adsb-track-player.py index 48f3744..a9b433d 100755 --- a/adsb-track-player.py +++ b/adsb-track-player.py @@ -32,12 +32,12 @@ def usage(msg=False): print("[h] Usage: %s [options]\n" % sys.argv[0]) print("-h | --help Display help message") print("--scenario Scenario mode, argument is scenario JSON filepath") - print(" Waypoints : Include waypoints.txt file in script directory") + print(" waypoints : Include waypoints.txt file in script directory") print("--icao Callsign in hex, default: 0x508035") print("--callsign Callsign (8 chars max), Default: DEADBEEF") print("--squawk 4-digit 4096 code squawk, Default: 7000") print("--trajectorytype Types of simulated trajectories:") - print(" fixed : steady aircraft") + print(" fixed : fixed broadcast") print(" flightsim : dynamically generated flight path") print(" Default: fixed") print("--lat Latitude for the plane in decimal degrees, Default: 50.44994") @@ -65,7 +65,7 @@ def getTrackSimulationThread(trajectory_type,broadcast_thread,aircraftinfos,wayp elif trajectory_type == 'waypoints': return WaypointsTrajectorySimulator(broadcast_thread.getMutex(),broadcast_thread,aircraftinfos,waypoints_file) elif trajectory_type == 'flightsim': - return FlightPathSimulator(broadcast_thread.getMutex(),broadcast_thread,aircraftinfos,scenariofile) + return FlightPathSimulator(broadcast_thread.getMutex(),broadcast_thread,aircraftinfos) else: return None diff --git a/examples/scenario.json b/examples/scenario.json index 308db11..1d3e879 100644 --- a/examples/scenario.json +++ b/examples/scenario.json @@ -9,5 +9,10 @@ { "filename":"./examples/AN-IL78MP.json", "trajectory_type":"fixed" + }, + "plane3": + { + "filename":"./examples/A400M-110.json", + "trajectory_type":"flightsim" } } From 1c9f61029df176ce2733b2dd7b1a30d8f3c4eec3 Mon Sep 17 00:00:00 2001 From: Anton Chua Date: Tue, 6 Jun 2023 16:04:47 +0800 Subject: [PATCH 11/22] Add FlightPath generation Now generates meandering flight path based on initial AircraftInfos values --- FixedTrajectorySimulator.py | 4 +-- FlightPathSimulator.py | 54 ++++++++++++++++++++++++++----------- 2 files changed, 40 insertions(+), 18 deletions(-) diff --git a/FixedTrajectorySimulator.py b/FixedTrajectorySimulator.py index 95dcf5a..9fde55e 100644 --- a/FixedTrajectorySimulator.py +++ b/FixedTrajectorySimulator.py @@ -17,8 +17,8 @@ from AbstractTrajectorySimulatorBase import AbstractTrajectorySimulatorBase class FixedTrajectorySimulator(AbstractTrajectorySimulatorBase): - def __init__(self,mutex,broadcast_thread,aircrafinfos,waypoints_file=None): - super().__init__(mutex,broadcast_thread,aircrafinfos,waypoints_file=None) + def __init__(self,mutex,broadcast_thread,aircraftinfos,waypoints_file=None): + super().__init__(mutex,broadcast_thread,aircraftinfos,waypoints_file=None) def refresh_delay(self): return 0.5 diff --git a/FlightPathSimulator.py b/FlightPathSimulator.py index c3b59e2..bd14097 100644 --- a/FlightPathSimulator.py +++ b/FlightPathSimulator.py @@ -14,33 +14,55 @@ import random import datetime, math +from math import asin, atan2, cos, degrees, radians, sin from AbstractTrajectorySimulatorBase import AbstractTrajectorySimulatorBase +REFRESH_RATE = 5 + +def get_point_at_distance(lat1, lon1, d, bearing, R=6371): + """ + lat: initial latitude, in degrees + lon: initial longitude, in degrees + d: target distance from initial + bearing: (true) heading in degrees + R: optional radius of sphere, defaults to mean radius of earth + Returns new lat/lon coordinate {d}km from initial, in degrees + """ + lat1 = radians(lat1) + lon1 = radians(lon1) + a = radians(bearing) + lat2 = asin(sin(lat1) * cos(d/R) + cos(lat1) * sin(d/R) * cos(a)) + lon2 = lon1 + atan2( + sin(a) * sin(d/R) * cos(lat1), + cos(d/R) - sin(lat1) * sin(lat2) + ) + return (degrees(lat2), degrees(lon2),) + class FlightPathSimulator(AbstractTrajectorySimulatorBase): - def __init__(self,mutex,broadcast_thread,aircrafinfos): - super().__init__(mutex,broadcast_thread,aircrafinfos) + def __init__(self,mutex,broadcast_thread,aircraftinfos): + super().__init__(mutex,broadcast_thread,aircraftinfos) self._starttime = datetime.datetime.now(datetime.timezone.utc) - self._lat0 = aircrafinfos.lat_deg - self._lon0 = aircrafinfos.lon_deg + self._lat0 = aircraftinfos.lat_deg + self._lon0 = aircraftinfos.lon_deg - self._max_alt_m = aircrafinfos.alt_msl_m - self._max_speed_mps = aircrafinfos.speed_mps + self._max_alt_m = aircraftinfos.alt_msl_m + self._max_speed_mps = aircraftinfos.speed_mps def refresh_delay(self): - return 0.2 + return REFRESH_RATE + + def update_aircraftinfos(self): - d0 = self._max_speed_mps * 30.0 - Rlat = (d0/6371000.0)*(180.0/math.pi) - Rlon = Rlat/math.cos(self._lat0*math.pi/180.0) - self._aircraftinfos.track_angle_deg = random.uniform(0,360.0) - self._aircraftinfos.lat_deg = self._lat0 - random.uniform(-Rlat,Rlat) - self._aircraftinfos.lon_deg = self._lon0 + random.uniform(-Rlon,Rlon) - - self._aircraftinfos.alt_msl_m = random.uniform(1.0,self._max_alt_m) - self._aircraftinfos.speed_mps = random.uniform(0.0,self._max_speed_mps) + dist_spd = ((self._max_speed_mps * 1.852)/3600)*REFRESH_RATE + + self._aircraftinfos.lat_deg, self._aircraftinfos.lon_deg = get_point_at_distance(self._aircraftinfos.lat_deg, self._aircraftinfos.lon_deg, dist_spd, self._aircraftinfos.track_angle_deg) + + #self._aircraftinfos.alt_msl_m = random.uniform(1.0,self._max_alt_m) + self._aircraftinfos.speed_mps += random.uniform(-5,5) + self._aircraftinfos.track_angle_deg += random.uniform(-4,4) print("[!] FLIGHT SIM\t\tCallsign: "+self._aircraftinfos.callsign) print(" [:] Lat: "+str(self._aircraftinfos.lat_deg)+" | Lon: "+str(self._aircraftinfos.lon_deg)+" | Alt: "+str(self._aircraftinfos.alt_msl_m)+" | Spd: "+str(self._aircraftinfos.speed_mps)+" | Trk Angle: "+str(self._aircraftinfos.track_angle_deg)) From abc66f5da56834d1fbe7012622ed84ce83d0446c Mon Sep 17 00:00:00 2001 From: Anton Chua Date: Wed, 7 Jun 2023 17:18:53 +0800 Subject: [PATCH 12/22] Add mass aircraft sim Simulate many generated aircraft from one source Included experimental Tkinter GUI element (commented out) --- FlightPathSimulator.py | 22 ++++++++++++++-------- adsb-track-player.py | 41 ++++++++++++++++++++++++++++++++++++----- 2 files changed, 50 insertions(+), 13 deletions(-) diff --git a/FlightPathSimulator.py b/FlightPathSimulator.py index bd14097..7a6a8e3 100644 --- a/FlightPathSimulator.py +++ b/FlightPathSimulator.py @@ -1,5 +1,7 @@ -""" simplest implementation of a trajectory simulation where the simulated -aircraft is randomly distributed inside a circle +""" Dynamically generates a randomized conical flight path from initial values +read from scenario file + +------------------------------------------------------- mutex protection occurs when calling replace_message This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -46,23 +48,27 @@ def __init__(self,mutex,broadcast_thread,aircraftinfos): self._lat0 = aircraftinfos.lat_deg self._lon0 = aircraftinfos.lon_deg - self._max_alt_m = aircraftinfos.alt_msl_m - self._max_speed_mps = aircraftinfos.speed_mps + self._alt_m = aircraftinfos.alt_msl_m + self._speed_mps = aircraftinfos.speed_mps def refresh_delay(self): return REFRESH_RATE - - def update_aircraftinfos(self): - dist_spd = ((self._max_speed_mps * 1.852)/3600)*REFRESH_RATE + dist_spd = ((self._speed_mps * 1.852)/3600)*REFRESH_RATE self._aircraftinfos.lat_deg, self._aircraftinfos.lon_deg = get_point_at_distance(self._aircraftinfos.lat_deg, self._aircraftinfos.lon_deg, dist_spd, self._aircraftinfos.track_angle_deg) - #self._aircraftinfos.alt_msl_m = random.uniform(1.0,self._max_alt_m) self._aircraftinfos.speed_mps += random.uniform(-5,5) self._aircraftinfos.track_angle_deg += random.uniform(-4,4) + self._aircraftinfos.alt_msl_m += random.uniform(-5,5) + + # Track angle 0-360 wrapping + if self._aircraftinfos.track_angle_deg < 0: + self._aircraftinfos.track_angle_deg += 360 + elif self._aircraftinfos.track_angle_deg > 360: + self._aircraftinfos.track_angle_deg -= 360 print("[!] FLIGHT SIM\t\tCallsign: "+self._aircraftinfos.callsign) print(" [:] Lat: "+str(self._aircraftinfos.lat_deg)+" | Lon: "+str(self._aircraftinfos.lon_deg)+" | Alt: "+str(self._aircraftinfos.alt_msl_m)+" | Spd: "+str(self._aircraftinfos.speed_mps)+" | Trk Angle: "+str(self._aircraftinfos.track_angle_deg)) diff --git a/adsb-track-player.py b/adsb-track-player.py index a9b433d..e04e85b 100755 --- a/adsb-track-player.py +++ b/adsb-track-player.py @@ -18,6 +18,7 @@ from os.path import exists import threading, json import traceback +from tkinter import * from AircraftInfos import AircraftInfos from FixedTrajectorySimulator import FixedTrajectorySimulator @@ -70,6 +71,25 @@ def getTrackSimulationThread(trajectory_type,broadcast_thread,aircraftinfos,wayp return None def main(): + """ + # GUI initialization + master = Tk() + master.title('ADS-B Track Player by six3oo') + intro = Label(master,text='Transmit ADS-B frames!') + intro.pack() + frame = Frame(master) + frame.pack() + bottomFrame = Frame(master) + bottomFrame.pack(side=BOTTOM) + fixedButton = Button(frame,text='Fixed',fg='red') + fixedButton.pack(side=LEFT) + flightSimButton = Button(frame,text='Flight Sim',fg='blue') + flightSimButton.pack(side=LEFT) + helpButton = Button(frame,text='Help',fg='black') + helpButton.pack(side=LEFT) + yeetButton = Button(frame,text='Yeet',fg='red') + yeetButton.pack(side=LEFT) + """ # Default values icao_aa = '0x508035' @@ -93,10 +113,11 @@ def main(): posrate = 150000 scenariofile = None waypoints_file = None + numac=1 try: (opts, args) = getopt(sys.argv[1:], 'h', \ ['help','scenario=','icao=','callsign=','squawk=','trajectorytype=','lat=','long=','altitude=','speed=','vspeed=','maxloadfactor=','trackangle=', - 'timesync=','capability=','typecode=','sstatus=','nicsupplementb=','surface','posrate=' + 'timesync=','capability=','typecode=','sstatus=','nicsupplementb=','surface','posrate=','numac=' ]) except GetoptError as err: usage("%s\n" % err) @@ -123,20 +144,30 @@ def main(): elif opt in ('--nicsupplementb'):nicsup = int(arg) elif opt in ('--surface'):on_surface = True elif opt in ('--posrate'):posrate = int(arg) + elif opt in ('--numac'):numac = int(arg) else:usage("Unknown option %s\n" % opt) - print ("\n==== ADS-B Track Player v0.2.0 | by six3oo | core by Matioupi ====\n") + print ("\n==== ADS-B Track Player v0.2.2 | by six3oo | core by Matioupi ====\n") + # GUI runtime + #master.mainloop() + + # Functional code track_simulators = [] broadcast_thread = HackRfBroadcastThread(posrate) # posrate would usally be used with random mode to generate load of tracks # Scenario file presence check if scenariofile == None: - print("[*] Single plane CLI mode") + print("[*] CLI mode") aircraftinfos = AircraftInfos(icao_aa,callsign,squawk, \ lat_deg,lon_deg,alt_ft,speed_kph,vspeed_ftpmin,maxloadfactor,track_angle_deg, \ timesync,capability,type_code,surveillance_status,nicsup,on_surface) - track_simulation = getTrackSimulationThread(trajectory_type,broadcast_thread,aircraftinfos,waypoints_file) - track_simulators.append(track_simulation) + + if numac>1: + print("[!] Generating "+str(numac)+" fuzzing aircraft") + + for i in range(numac): + track_simulation = getTrackSimulationThread(trajectory_type,broadcast_thread,aircraftinfos,waypoints_file) + track_simulators.append(track_simulation) # Scenario file parsing else: From cb1154e621bd32936ca5e06a12191f6742da393b Mon Sep 17 00:00:00 2001 From: Anton Chua Date: Wed, 7 Jun 2023 17:29:17 +0800 Subject: [PATCH 13/22] Update README, change FlightSim fuzz Slightly altered FlightSim fuzzing ranges Update help and README --- FlightPathSimulator.py | 4 ++-- README.md | 21 +++++++++++++++++---- adsb-track-player.py | 1 + 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/FlightPathSimulator.py b/FlightPathSimulator.py index 7a6a8e3..bf57fa8 100644 --- a/FlightPathSimulator.py +++ b/FlightPathSimulator.py @@ -60,8 +60,8 @@ def update_aircraftinfos(self): self._aircraftinfos.lat_deg, self._aircraftinfos.lon_deg = get_point_at_distance(self._aircraftinfos.lat_deg, self._aircraftinfos.lon_deg, dist_spd, self._aircraftinfos.track_angle_deg) - self._aircraftinfos.speed_mps += random.uniform(-5,5) - self._aircraftinfos.track_angle_deg += random.uniform(-4,4) + self._aircraftinfos.speed_mps += random.uniform(-10,10) + self._aircraftinfos.track_angle_deg += random.uniform(-3,3) self._aircraftinfos.alt_msl_m += random.uniform(-5,5) # Track angle 0-360 wrapping diff --git a/README.md b/README.md index f6b9963..5011a0b 100755 --- a/README.md +++ b/README.md @@ -45,13 +45,14 @@ Usage: ./adsb-track-player.py [options] -h | --help Display help message --scenario Scenario mode, argument is scenario JSON filepath + waypoints : Include waypoints.txt file in script directory --icao Callsign in hex, default: 0x508035 --callsign Callsign (8 chars max), Default: DEADBEEF --squawk 4-digit 4096 code squawk, Default: 7000 --trajectorytype Types of simulated trajectories: - fixed : steady aircraft - waypoints : fly long flight path - Default: fixed + fixed : fixed broadcast + flightsim : dynamically generated flight path + Default: fixed --lat Latitude for the plane in decimal degrees, Default: 50.44994 --long Longitude for the plane in decimal degrees. Default: 30.5211 --altitude Altitude in decimal feet, Default: 1500.0 @@ -66,6 +67,7 @@ Usage: ./adsb-track-player.py [options] --nicsupplementb NIC supplement-B, Default: 0 --surface Aircraft located on ground, Default: False --posrate Position frame broadcast period in µs, Default: 150000 +--numac Number of aircraft to simulate, Default: 1 ``` @@ -75,9 +77,20 @@ Usage: ./adsb-track-player.py [options] will generate a fixed trajectory, flown at 4500 ft, 600 km/h and a load factor of 1.03. +#### *Flight path track generation with multiple planes* + +`./adsb-track-player.py --numac 20 --trajectorytype flightsim` + +will generate 20 trajectories starting from the default ADS-B frame, slowly fuzzing out in the same general direction. + +Current fuzzing settings are 5 seconds between transmits, and a randomized modifier is applied as follows with each transmit: ++/- 10 knots for speed ++/- 5 feet for altitude ++/- 3 degrees for track angle + #### *JSON scenarios with multiple planes* -`./adsb-track-player.py --scenario ./examples/scenario.json` +`./adsb-track-player.py --scenario scenario.json` ![4 planes scenario example](./images/adsb-out-scenario3.png "4 planes scenario example") diff --git a/adsb-track-player.py b/adsb-track-player.py index e04e85b..10fe788 100755 --- a/adsb-track-player.py +++ b/adsb-track-player.py @@ -55,6 +55,7 @@ def usage(msg=False): print("--nicsupplementb NIC supplement-B, Default: 0") print("--surface Aircraft located on ground, Default: False") print("--posrate Position frame broadcast period in µs, Default: 150000") + print("--numac Number of aircraft to simulate, Default: 1") print("") #print("see usage.md for additionnal information") From ce1e1d1615599b1069dae40c047b2fdb1de853c7 Mon Sep 17 00:00:00 2001 From: Anton Chua Date: Thu, 8 Jun 2023 15:33:56 +0800 Subject: [PATCH 14/22] Add debug messages Add thread display to scenario mode Fix readme Add test cases to scenario file --- README.md | 2 +- adsb-track-player.py | 16 ++++++++-------- scenario.json | 5 +++++ 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 5011a0b..c503b62 100755 --- a/README.md +++ b/README.md @@ -84,7 +84,7 @@ will generate a fixed trajectory, flown at 4500 ft, 600 km/h and a load factor o will generate 20 trajectories starting from the default ADS-B frame, slowly fuzzing out in the same general direction. Current fuzzing settings are 5 seconds between transmits, and a randomized modifier is applied as follows with each transmit: -+/- 10 knots for speed ++/- 10 km/h for speed +/- 5 feet for altitude +/- 3 degrees for track angle diff --git a/adsb-track-player.py b/adsb-track-player.py index 10fe788..ffdea73 100755 --- a/adsb-track-player.py +++ b/adsb-track-player.py @@ -96,10 +96,10 @@ def main(): icao_aa = '0x508035' callsign = 'DEADBEEF' squawk = '7000' - alt_ft = 1500.0 - lat_deg = 50.44994 - lon_deg = 30.5211 - speed_kph = 300.0 + alt_ft = 2000.0 + lat_deg = 1.3521 + lon_deg = 103.8198 + speed_kph = 500.0 vspeed_ftpmin = 0.0 maxloadfactor = 1.45 track_angle_deg = 0.0 @@ -186,14 +186,14 @@ def main(): track_simulation = getTrackSimulationThread(plane["trajectory_type"],broadcast_thread,plane_info,waypoints_file) track_simulators.append(track_simulation) - print("[*] Scenario contains track simulation instructions for "+str(len(track_simulators))+" plane(s):") + print("[*] Scenario contains track simulations for "+str(len(track_simulators))+" plane(s):") for tsim in track_simulators: - print(" [:] Callsign: "+tsim.aircraftinfos.callsign.ljust(9,' ')+"MSL altitude: "+"{:7.1f}".format(tsim.aircraftinfos.alt_msl_ft)+" ft") - + print(" [:] Callsign: "+tsim.aircraftinfos.callsign.ljust(9,' ')+"MSL altitude: "+"{:7.1f}".format(tsim.aircraftinfos.alt_msl_ft)+" ft\t| Thread: "+str(tsim)) + for tsim in track_simulators: broadcast_thread.register_track_simulation_thread(tsim) - while(val:=input("[*] Type \'s + Enter\' to start ADS-B transmission, and type \'s + Enter\' again to stop:\n") != 's'): + while(val:=input("[*] Type \'s + Enter\' to start ADS-B transmission, and type \'s + Enter\' again to stop: ") != 's'): time.sleep(0.05) # START all threads diff --git a/scenario.json b/scenario.json index 308db11..1d3e879 100644 --- a/scenario.json +++ b/scenario.json @@ -9,5 +9,10 @@ { "filename":"./examples/AN-IL78MP.json", "trajectory_type":"fixed" + }, + "plane3": + { + "filename":"./examples/A400M-110.json", + "trajectory_type":"flightsim" } } From c21e049e33fcd08fb815a0ef11b41a85b39df977 Mon Sep 17 00:00:00 2001 From: Anton Chua Date: Fri, 23 Jun 2023 11:34:58 +0800 Subject: [PATCH 15/22] Add CSV file logging File logging adds variable to all simulator thread files, CSV format --- AbstractTrajectorySimulatorBase.py | 2 +- FixedTrajectorySimulator.py | 8 ++++-- FlightPathSimulator.py | 7 +++-- WaypointsTrajectorySimulator.py | 9 +++++-- adsb-track-player.py | 41 +++++++++++++----------------- 5 files changed, 37 insertions(+), 30 deletions(-) diff --git a/AbstractTrajectorySimulatorBase.py b/AbstractTrajectorySimulatorBase.py index b402065..634d1dd 100644 --- a/AbstractTrajectorySimulatorBase.py +++ b/AbstractTrajectorySimulatorBase.py @@ -28,7 +28,7 @@ from ModeS import ModeS class AbstractTrajectorySimulatorBase(threading.Thread,abc.ABC): - def __init__(self,mutex,broadcast_thread,aircraftinfos,waypoints_file=0): + def __init__(self,mutex,broadcast_thread,aircraftinfos,waypoints_file=0,logfile=0): super().__init__() self._mutex = mutex self._broadcast_thread = broadcast_thread diff --git a/FixedTrajectorySimulator.py b/FixedTrajectorySimulator.py index 9fde55e..e14b679 100644 --- a/FixedTrajectorySimulator.py +++ b/FixedTrajectorySimulator.py @@ -13,12 +13,13 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . """ +import datetime from AbstractTrajectorySimulatorBase import AbstractTrajectorySimulatorBase class FixedTrajectorySimulator(AbstractTrajectorySimulatorBase): - def __init__(self,mutex,broadcast_thread,aircraftinfos,waypoints_file=None): - super().__init__(mutex,broadcast_thread,aircraftinfos,waypoints_file=None) + def __init__(self,mutex,broadcast_thread,aircraftinfos,waypoints_file=None,logfile): + super().__init__(mutex,broadcast_thread,aircraftinfos,waypoints_file=None,logfile) def refresh_delay(self): return 0.5 @@ -26,3 +27,6 @@ def refresh_delay(self): def update_aircraftinfos(self): print("[!] FIXED TRAJECTORY\t\tCallsign: "+self._aircraftinfos.callsign) print(" [:] Lat: "+str(self._aircraftinfos.lat_deg)+" | Lon: "+str(self._aircraftinfos.lon_deg)+" | Alt: "+str(self._aircraftinfos.alt_msl_m)+" | Spd: "+str(self._aircraftinfos.speed_mps)+" | Trk Angle: "+str(self._aircraftinfos.track_angle_deg)) + + # Write to logfile -> CSV format: DATETIME,CALLSIGN,LAT,LONG,ALT,SPD,TRKANGLE + logfile.write(datetime.now()+","+self._aircraftinfos.callsign+","+str(self._aircraftinfos.lat_deg)+","+str(self._aircraftinfos.lon_deg)+","+str(self._aircraftinfos.alt_msl_m)+","+str(self._aircraftinfos.speed_mps)+","+str(self._aircraftinfos.track_angle_deg)) diff --git a/FlightPathSimulator.py b/FlightPathSimulator.py index bf57fa8..9278802 100644 --- a/FlightPathSimulator.py +++ b/FlightPathSimulator.py @@ -41,8 +41,8 @@ def get_point_at_distance(lat1, lon1, d, bearing, R=6371): return (degrees(lat2), degrees(lon2),) class FlightPathSimulator(AbstractTrajectorySimulatorBase): - def __init__(self,mutex,broadcast_thread,aircraftinfos): - super().__init__(mutex,broadcast_thread,aircraftinfos) + def __init__(self,mutex,broadcast_thread,aircraftinfos,logfile): + super().__init__(mutex,broadcast_thread,aircraftinfos,logfile) self._starttime = datetime.datetime.now(datetime.timezone.utc) self._lat0 = aircraftinfos.lat_deg @@ -72,3 +72,6 @@ def update_aircraftinfos(self): print("[!] FLIGHT SIM\t\tCallsign: "+self._aircraftinfos.callsign) print(" [:] Lat: "+str(self._aircraftinfos.lat_deg)+" | Lon: "+str(self._aircraftinfos.lon_deg)+" | Alt: "+str(self._aircraftinfos.alt_msl_m)+" | Spd: "+str(self._aircraftinfos.speed_mps)+" | Trk Angle: "+str(self._aircraftinfos.track_angle_deg)) + + # Write to logfile -> CSV format: DATETIME,CALLSIGN,LAT,LONG,ALT,SPD,TRKANGLE + logfile.write(datetime.now()+","+self._aircraftinfos.callsign+","+str(self._aircraftinfos.lat_deg)+","+str(self._aircraftinfos.lon_deg)+","+str(self._aircraftinfos.alt_msl_m)+","+str(self._aircraftinfos.speed_mps)+","+str(self._aircraftinfos.track_angle_deg)) diff --git a/WaypointsTrajectorySimulator.py b/WaypointsTrajectorySimulator.py index ef1faa6..2b10045 100644 --- a/WaypointsTrajectorySimulator.py +++ b/WaypointsTrajectorySimulator.py @@ -20,8 +20,8 @@ from AbstractTrajectorySimulatorBase import AbstractTrajectorySimulatorBase class WaypointsTrajectorySimulator(AbstractTrajectorySimulatorBase): - def __init__(self,mutex,broadcast_thread,aircraftinfos,waypoints_file): - super().__init__(mutex,broadcast_thread, aircraftinfos,waypoints_file) + def __init__(self,mutex,broadcast_thread,aircraftinfos,waypoints_file,logfile): + super().__init__(mutex,broadcast_thread,aircraftinfos,waypoints_file,logfile) self._starttime = datetime.datetime.now(datetime.timezone.utc) self._lat0 = aircraftinfos.lat_deg @@ -38,6 +38,11 @@ def update_aircraftinfos(self): posi = line.split() print("[!] WAYPOINTS TRAJECTORY\tCallsign: "+self._aircraftinfos.callsign) print(" [:] Lat: "+posi[0]+" | Lon: "+posi[1]+" | Alt: "+posi[2]+" | Spd: "+posi[3]+" | Trk Angle: "+posi[4]+" | ValidTime: "+posi[5]) + + # Write to logfile -> CSV format: DATETIME,CALLSIGN,LAT,LONG,ALT,SPD,TRKANGLE + logfile.write(datetime.now()+","+self._aircraftinfos.callsign+","+posi[0]+","+posi[1]+","+posi[2]+","+posi[3]+","+posi[4]) + + self._aircraftinfos.lat_deg = float(posi[0]) self._aircraftinfos.lon_deg = float(posi[1]) self._aircraftinfos.alt_msl_m = float(posi[2]) diff --git a/adsb-track-player.py b/adsb-track-player.py index ffdea73..6883c3f 100755 --- a/adsb-track-player.py +++ b/adsb-track-player.py @@ -18,7 +18,6 @@ from os.path import exists import threading, json import traceback -from tkinter import * from AircraftInfos import AircraftInfos from FixedTrajectorySimulator import FixedTrajectorySimulator @@ -61,7 +60,8 @@ def usage(msg=False): sys.exit(2) -def getTrackSimulationThread(trajectory_type,broadcast_thread,aircraftinfos,waypoints_file): +############ TRACK SIMULATION GENERATION FUNCTION ############ +def getTrackSimulationThread(trajectory_type,broadcast_thread,aircraftinfos,waypoints_file,logfile): if trajectory_type == 'fixed': return FixedTrajectorySimulator(broadcast_thread.getMutex(),broadcast_thread,aircraftinfos) elif trajectory_type == 'waypoints': @@ -71,26 +71,18 @@ def getTrackSimulationThread(trajectory_type,broadcast_thread,aircraftinfos,wayp else: return None +############ MAIN FUNCTION ############ def main(): - """ - # GUI initialization - master = Tk() - master.title('ADS-B Track Player by six3oo') - intro = Label(master,text='Transmit ADS-B frames!') - intro.pack() - frame = Frame(master) - frame.pack() - bottomFrame = Frame(master) - bottomFrame.pack(side=BOTTOM) - fixedButton = Button(frame,text='Fixed',fg='red') - fixedButton.pack(side=LEFT) - flightSimButton = Button(frame,text='Flight Sim',fg='blue') - flightSimButton.pack(side=LEFT) - helpButton = Button(frame,text='Help',fg='black') - helpButton.pack(side=LEFT) - yeetButton = Button(frame,text='Yeet',fg='red') - yeetButton.pack(side=LEFT) - """ + + logfile = r'logfile.csv' + if os.path.exists(logfile): + if os.path.isfile(logfile): + fLog = open(logfile,"w") + elif os.path.isdir(logfile): + print("[!] logfile is a directory, not a file!") + else: + print("[!] logfile not found, creating...") + fLog = open(logfile, "w") # Default values icao_aa = '0x508035' @@ -167,7 +159,7 @@ def main(): print("[!] Generating "+str(numac)+" fuzzing aircraft") for i in range(numac): - track_simulation = getTrackSimulationThread(trajectory_type,broadcast_thread,aircraftinfos,waypoints_file) + track_simulation = getTrackSimulationThread(trajectory_type,broadcast_thread,aircraftinfos,waypoints_file,logfile) track_simulators.append(track_simulation) # Scenario file parsing @@ -183,7 +175,7 @@ def main(): for plane in scenario.values(): plane_info = AircraftInfos.from_json(plane["filename"]) - track_simulation = getTrackSimulationThread(plane["trajectory_type"],broadcast_thread,plane_info,waypoints_file) + track_simulation = getTrackSimulationThread(plane["trajectory_type"],broadcast_thread,plane_info,waypoints_file,logfile) track_simulators.append(track_simulation) print("[*] Scenario contains track simulations for "+str(len(track_simulators))+" plane(s):") @@ -208,6 +200,9 @@ def main(): # STOP all threads for tsim in track_simulators: tsim.stop() + + # CLOSE LOGFILE + logfile.close() broadcast_thread.stop() From fef99c5a5aac6397a7908284f90a31b6831cf99b Mon Sep 17 00:00:00 2001 From: Anton Chua Date: Fri, 23 Jun 2023 15:33:20 +0800 Subject: [PATCH 16/22] Fix bugs with logfile implementation Overhaul logfile opening and formatting --- AbstractTrajectorySimulatorBase.py | 1 + FixedTrajectorySimulator.py | 10 ++++++---- FlightPathSimulator.py | 4 +++- WaypointsTrajectorySimulator.py | 4 +++- adsb-track-player.py | 30 ++++++++++++++++-------------- logfile.csv | 5 +++++ 6 files changed, 34 insertions(+), 20 deletions(-) create mode 100644 logfile.csv diff --git a/AbstractTrajectorySimulatorBase.py b/AbstractTrajectorySimulatorBase.py index 634d1dd..fc0c9d3 100644 --- a/AbstractTrajectorySimulatorBase.py +++ b/AbstractTrajectorySimulatorBase.py @@ -34,6 +34,7 @@ def __init__(self,mutex,broadcast_thread,aircraftinfos,waypoints_file=0,logfile= self._broadcast_thread = broadcast_thread self._aircraftinfos = aircraftinfos self._waypoints_file = waypoints_file + self._logfile = logfile self._modeSencoder = ModeS(df=17,icao=self._aircraftinfos.icao,ca=self._aircraftinfos.capability) diff --git a/FixedTrajectorySimulator.py b/FixedTrajectorySimulator.py index e14b679..cb0d008 100644 --- a/FixedTrajectorySimulator.py +++ b/FixedTrajectorySimulator.py @@ -13,13 +13,13 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . """ -import datetime +from datetime import datetime from AbstractTrajectorySimulatorBase import AbstractTrajectorySimulatorBase class FixedTrajectorySimulator(AbstractTrajectorySimulatorBase): - def __init__(self,mutex,broadcast_thread,aircraftinfos,waypoints_file=None,logfile): - super().__init__(mutex,broadcast_thread,aircraftinfos,waypoints_file=None,logfile) + def __init__(self,mutex,broadcast_thread,aircraftinfos,waypoints_file,logfile): + super().__init__(mutex,broadcast_thread,aircraftinfos,waypoints_file,logfile) def refresh_delay(self): return 0.5 @@ -29,4 +29,6 @@ def update_aircraftinfos(self): print(" [:] Lat: "+str(self._aircraftinfos.lat_deg)+" | Lon: "+str(self._aircraftinfos.lon_deg)+" | Alt: "+str(self._aircraftinfos.alt_msl_m)+" | Spd: "+str(self._aircraftinfos.speed_mps)+" | Trk Angle: "+str(self._aircraftinfos.track_angle_deg)) # Write to logfile -> CSV format: DATETIME,CALLSIGN,LAT,LONG,ALT,SPD,TRKANGLE - logfile.write(datetime.now()+","+self._aircraftinfos.callsign+","+str(self._aircraftinfos.lat_deg)+","+str(self._aircraftinfos.lon_deg)+","+str(self._aircraftinfos.alt_msl_m)+","+str(self._aircraftinfos.speed_mps)+","+str(self._aircraftinfos.track_angle_deg)) + with open(self._logfile,"a") as fLog: + now=str(datetime.now()) + fLog.write("\n"+now+","+self._aircraftinfos.callsign+","+str(self._aircraftinfos.lat_deg)+","+str(self._aircraftinfos.lon_deg)+","+str(self._aircraftinfos.alt_msl_m)+","+str(self._aircraftinfos.speed_mps)+","+str(self._aircraftinfos.track_angle_deg)) diff --git a/FlightPathSimulator.py b/FlightPathSimulator.py index 9278802..2f848fb 100644 --- a/FlightPathSimulator.py +++ b/FlightPathSimulator.py @@ -74,4 +74,6 @@ def update_aircraftinfos(self): print(" [:] Lat: "+str(self._aircraftinfos.lat_deg)+" | Lon: "+str(self._aircraftinfos.lon_deg)+" | Alt: "+str(self._aircraftinfos.alt_msl_m)+" | Spd: "+str(self._aircraftinfos.speed_mps)+" | Trk Angle: "+str(self._aircraftinfos.track_angle_deg)) # Write to logfile -> CSV format: DATETIME,CALLSIGN,LAT,LONG,ALT,SPD,TRKANGLE - logfile.write(datetime.now()+","+self._aircraftinfos.callsign+","+str(self._aircraftinfos.lat_deg)+","+str(self._aircraftinfos.lon_deg)+","+str(self._aircraftinfos.alt_msl_m)+","+str(self._aircraftinfos.speed_mps)+","+str(self._aircraftinfos.track_angle_deg)) + now=str(datetime.now()) + with open(self._logfile,"a") as fLog: + fLog.write.write("\n"+now,","+self._aircraftinfos.callsign+","+str(self._aircraftinfos.lat_deg)+","+str(self._aircraftinfos.lon_deg)+","+str(self._aircraftinfos.alt_msl_m)+","+str(self._aircraftinfos.speed_mps)+","+str(self._aircraftinfos.track_angle_deg)) diff --git a/WaypointsTrajectorySimulator.py b/WaypointsTrajectorySimulator.py index 2b10045..9e20cf2 100644 --- a/WaypointsTrajectorySimulator.py +++ b/WaypointsTrajectorySimulator.py @@ -40,7 +40,9 @@ def update_aircraftinfos(self): print(" [:] Lat: "+posi[0]+" | Lon: "+posi[1]+" | Alt: "+posi[2]+" | Spd: "+posi[3]+" | Trk Angle: "+posi[4]+" | ValidTime: "+posi[5]) # Write to logfile -> CSV format: DATETIME,CALLSIGN,LAT,LONG,ALT,SPD,TRKANGLE - logfile.write(datetime.now()+","+self._aircraftinfos.callsign+","+posi[0]+","+posi[1]+","+posi[2]+","+posi[3]+","+posi[4]) + now=str(datetime.now()) + with open(self._logfile,"a") as fLog: + fLog.write.write("\n"+now+","+self._aircraftinfos.callsign+","+posi[0]+","+posi[1]+","+posi[2]+","+posi[3]+","+posi[4]) self._aircraftinfos.lat_deg = float(posi[0]) diff --git a/adsb-track-player.py b/adsb-track-player.py index 6883c3f..bbdaefa 100755 --- a/adsb-track-player.py +++ b/adsb-track-player.py @@ -63,27 +63,30 @@ def usage(msg=False): ############ TRACK SIMULATION GENERATION FUNCTION ############ def getTrackSimulationThread(trajectory_type,broadcast_thread,aircraftinfos,waypoints_file,logfile): if trajectory_type == 'fixed': - return FixedTrajectorySimulator(broadcast_thread.getMutex(),broadcast_thread,aircraftinfos) + return FixedTrajectorySimulator(broadcast_thread.getMutex(),broadcast_thread,aircraftinfos,waypoints_file,logfile) elif trajectory_type == 'waypoints': - return WaypointsTrajectorySimulator(broadcast_thread.getMutex(),broadcast_thread,aircraftinfos,waypoints_file) + return WaypointsTrajectorySimulator(broadcast_thread.getMutex(),broadcast_thread,aircraftinfos,waypoints_file,logfile) elif trajectory_type == 'flightsim': - return FlightPathSimulator(broadcast_thread.getMutex(),broadcast_thread,aircraftinfos) + return FlightPathSimulator(broadcast_thread.getMutex(),broadcast_thread,aircraftinfos,logfile) else: return None ############ MAIN FUNCTION ############ def main(): - logfile = r'logfile.csv' + # Log file check + logfile = './logfile.csv' if os.path.exists(logfile): if os.path.isfile(logfile): - fLog = open(logfile,"w") + print("[*] logfile.csv found") elif os.path.isdir(logfile): print("[!] logfile is a directory, not a file!") else: - print("[!] logfile not found, creating...") - fLog = open(logfile, "w") - + print("[!] logfile not found, creating...") + with open(logfile,"w") as fLog: + fLog.write("DATETIME,CALLSIGN,LAT,LONG,ALT,SPD,TRKANGLE") + fLog.close() + # Default values icao_aa = '0x508035' callsign = 'DEADBEEF' @@ -159,8 +162,10 @@ def main(): print("[!] Generating "+str(numac)+" fuzzing aircraft") for i in range(numac): - track_simulation = getTrackSimulationThread(trajectory_type,broadcast_thread,aircraftinfos,waypoints_file,logfile) - track_simulators.append(track_simulation) + # TRACK SIMULATION CREATION + + track_simulation = getTrackSimulationThread(trajectory_type,broadcast_thread,aircraftinfos,waypoints_file,logfile) + track_simulators.append(track_simulation) # Scenario file parsing else: @@ -174,7 +179,7 @@ def main(): for plane in scenario.values(): plane_info = AircraftInfos.from_json(plane["filename"]) - + # TRACK SIMULATION CREATION track_simulation = getTrackSimulationThread(plane["trajectory_type"],broadcast_thread,plane_info,waypoints_file,logfile) track_simulators.append(track_simulation) @@ -201,9 +206,6 @@ def main(): for tsim in track_simulators: tsim.stop() - # CLOSE LOGFILE - logfile.close() - broadcast_thread.stop() # wait for all threads to terminate diff --git a/logfile.csv b/logfile.csv new file mode 100644 index 0000000..8c05bd8 --- /dev/null +++ b/logfile.csv @@ -0,0 +1,5 @@ +DATETIME,CALLSIGN,LAT,LONG,ALT,SPD,TRKANGLE +2023-06-23 14:01:19.025885,DEADBEEF,1.3521,103.8198,609.6,138.88888888888889,0.0 +2023-06-23 14:01:19.528708,DEADBEEF,1.3521,103.8198,609.6,138.88888888888889,0.0 +2023-06-23 14:02:04.323312,DEADBEEF,1.3521,103.8198,609.6,138.88888888888889,0.0 +2023-06-23 14:02:04.825011,DEADBEEF,1.3521,103.8198,609.6,138.88888888888889,0.0 \ No newline at end of file From afc1ccab82067f77c8727570124fa1e6d46ed152 Mon Sep 17 00:00:00 2001 From: Anton Chua Date: Wed, 28 Jun 2023 17:01:31 +0800 Subject: [PATCH 17/22] Overhaul architecture Convert inputs and outputs of track gen functions to .csv, add AIS function def file --- AbstractTrajectorySimulatorBase.py | 3 +- FixedTrajectorySimulator.py | 4 +- FlightPathSimulator.py | 21 +++++++++-- WaypointsTrajectorySimulator.py | 4 +- adsb-track-player.py | 23 +++++++----- ais_clonegen.py | 60 ++++++++++++++++++++++++++++++ logfile.csv | 7 +++- 7 files changed, 103 insertions(+), 19 deletions(-) create mode 100644 ais_clonegen.py diff --git a/AbstractTrajectorySimulatorBase.py b/AbstractTrajectorySimulatorBase.py index fc0c9d3..23fcfc6 100644 --- a/AbstractTrajectorySimulatorBase.py +++ b/AbstractTrajectorySimulatorBase.py @@ -28,13 +28,14 @@ from ModeS import ModeS class AbstractTrajectorySimulatorBase(threading.Thread,abc.ABC): - def __init__(self,mutex,broadcast_thread,aircraftinfos,waypoints_file=0,logfile=0): + def __init__(self,mutex,broadcast_thread,aircraftinfos,waypoints_file=0,logfile=0,duration=None): super().__init__() self._mutex = mutex self._broadcast_thread = broadcast_thread self._aircraftinfos = aircraftinfos self._waypoints_file = waypoints_file self._logfile = logfile + self._duration = duration self._modeSencoder = ModeS(df=17,icao=self._aircraftinfos.icao,ca=self._aircraftinfos.capability) diff --git a/FixedTrajectorySimulator.py b/FixedTrajectorySimulator.py index cb0d008..1505943 100644 --- a/FixedTrajectorySimulator.py +++ b/FixedTrajectorySimulator.py @@ -18,8 +18,8 @@ from AbstractTrajectorySimulatorBase import AbstractTrajectorySimulatorBase class FixedTrajectorySimulator(AbstractTrajectorySimulatorBase): - def __init__(self,mutex,broadcast_thread,aircraftinfos,waypoints_file,logfile): - super().__init__(mutex,broadcast_thread,aircraftinfos,waypoints_file,logfile) + def __init__(self,mutex,broadcast_thread,aircraftinfos,waypoints_file,logfile,duration): + super().__init__(mutex,broadcast_thread,aircraftinfos,waypoints_file,logfile,duration) def refresh_delay(self): return 0.5 diff --git a/FlightPathSimulator.py b/FlightPathSimulator.py index 2f848fb..33969b5 100644 --- a/FlightPathSimulator.py +++ b/FlightPathSimulator.py @@ -1,5 +1,4 @@ """ Dynamically generates a randomized conical flight path from initial values -read from scenario file ------------------------------------------------------- mutex protection occurs when calling replace_message @@ -16,6 +15,7 @@ import random import datetime, math +import os from math import asin, atan2, cos, degrees, radians, sin from AbstractTrajectorySimulatorBase import AbstractTrajectorySimulatorBase @@ -41,7 +41,7 @@ def get_point_at_distance(lat1, lon1, d, bearing, R=6371): return (degrees(lat2), degrees(lon2),) class FlightPathSimulator(AbstractTrajectorySimulatorBase): - def __init__(self,mutex,broadcast_thread,aircraftinfos,logfile): + def __init__(self,mutex,broadcast_thread,aircraftinfos,logfile,duration): super().__init__(mutex,broadcast_thread,aircraftinfos,logfile) self._starttime = datetime.datetime.now(datetime.timezone.utc) @@ -50,14 +50,29 @@ def __init__(self,mutex,broadcast_thread,aircraftinfos,logfile): self._alt_m = aircraftinfos.alt_msl_m self._speed_mps = aircraftinfos.speed_mps + self._duration = duration def refresh_delay(self): return REFRESH_RATE def update_aircraftinfos(self): - dist_spd = ((self._speed_mps * 1.852)/3600)*REFRESH_RATE + ##### PRE-GENERATION PROTOTYPE CODE ##### + """ + dist_spd = ((self._speed_mps * 1.852)/3600) + + genLat = self._aircraftinfos.lat_deg + genLon = self._aircraftinfos.lon_deg + genSpd = self._aircraftinfos.speed_mps + genTrk = self._aircraftinfos.track_angle_deg + flightPath = {} + + + for i from 1 to self._duration: + genLat = + """ + self._aircraftinfos.lat_deg, self._aircraftinfos.lon_deg = get_point_at_distance(self._aircraftinfos.lat_deg, self._aircraftinfos.lon_deg, dist_spd, self._aircraftinfos.track_angle_deg) self._aircraftinfos.speed_mps += random.uniform(-10,10) diff --git a/WaypointsTrajectorySimulator.py b/WaypointsTrajectorySimulator.py index 9e20cf2..45f4e08 100644 --- a/WaypointsTrajectorySimulator.py +++ b/WaypointsTrajectorySimulator.py @@ -33,9 +33,9 @@ def refresh_delay(self): def update_aircraftinfos(self): with open(self._waypoints_file, 'r') as wp: - # Line format: "<0:lat> <1:lon> <2:alt> <3:speed> <4:track angle> <5:iterate time>" + # Waypoint CSV format: "<0:callsign>,<1:lat>,<2:lon>,<3:alt>,<4:speed>,<5:track angle>,<6:iterate time>" for line in wp: - posi = line.split() + posi = line.split(",") print("[!] WAYPOINTS TRAJECTORY\tCallsign: "+self._aircraftinfos.callsign) print(" [:] Lat: "+posi[0]+" | Lon: "+posi[1]+" | Alt: "+posi[2]+" | Spd: "+posi[3]+" | Trk Angle: "+posi[4]+" | ValidTime: "+posi[5]) diff --git a/adsb-track-player.py b/adsb-track-player.py index bbdaefa..4a5a106 100755 --- a/adsb-track-player.py +++ b/adsb-track-player.py @@ -39,6 +39,8 @@ def usage(msg=False): print("--trajectorytype Types of simulated trajectories:") print(" fixed : fixed broadcast") print(" flightsim : dynamically generated flight path") + print("--numac Number of aircraft to simulate, Default: 1") + print("--duration Duration to simulate aircrafts in seconds, Default: 60") print(" Default: fixed") print("--lat Latitude for the plane in decimal degrees, Default: 50.44994") print("--long Longitude for the plane in decimal degrees. Default: 30.5211") @@ -54,20 +56,19 @@ def usage(msg=False): print("--nicsupplementb NIC supplement-B, Default: 0") print("--surface Aircraft located on ground, Default: False") print("--posrate Position frame broadcast period in µs, Default: 150000") - print("--numac Number of aircraft to simulate, Default: 1") print("") #print("see usage.md for additionnal information") sys.exit(2) ############ TRACK SIMULATION GENERATION FUNCTION ############ -def getTrackSimulationThread(trajectory_type,broadcast_thread,aircraftinfos,waypoints_file,logfile): +def getTrackSimulationThread(trajectory_type,broadcast_thread,aircraftinfos,waypoints_file,logfile,duration): if trajectory_type == 'fixed': - return FixedTrajectorySimulator(broadcast_thread.getMutex(),broadcast_thread,aircraftinfos,waypoints_file,logfile) + return FixedTrajectorySimulator(broadcast_thread.getMutex(),broadcast_thread,aircraftinfos,waypoints_file,logfile,duration) elif trajectory_type == 'waypoints': - return WaypointsTrajectorySimulator(broadcast_thread.getMutex(),broadcast_thread,aircraftinfos,waypoints_file,logfile) + return WaypointsTrajectorySimulator(broadcast_thread.getMutex(),broadcast_thread,aircraftinfos,waypoints_file,logfile,duration) elif trajectory_type == 'flightsim': - return FlightPathSimulator(broadcast_thread.getMutex(),broadcast_thread,aircraftinfos,logfile) + return FlightPathSimulator(broadcast_thread.getMutex(),broadcast_thread,aircraftinfos,logfile,duration) else: return None @@ -110,6 +111,7 @@ def main(): scenariofile = None waypoints_file = None numac=1 + duration=None try: (opts, args) = getopt(sys.argv[1:], 'h', \ ['help','scenario=','icao=','callsign=','squawk=','trajectorytype=','lat=','long=','altitude=','speed=','vspeed=','maxloadfactor=','trackangle=', @@ -141,8 +143,9 @@ def main(): elif opt in ('--surface'):on_surface = True elif opt in ('--posrate'):posrate = int(arg) elif opt in ('--numac'):numac = int(arg) + elif opt in ('--duration'):duration = int(arg) else:usage("Unknown option %s\n" % opt) - print ("\n==== ADS-B Track Player v0.2.2 | by six3oo | core by Matioupi ====\n") + print ("\n==== ADS-B Track Player v0.3 | by six3oo | core by Matioupi ====\n") # GUI runtime #master.mainloop() @@ -164,7 +167,7 @@ def main(): for i in range(numac): # TRACK SIMULATION CREATION - track_simulation = getTrackSimulationThread(trajectory_type,broadcast_thread,aircraftinfos,waypoints_file,logfile) + track_simulation = getTrackSimulationThread(trajectory_type,broadcast_thread,aircraftinfos,waypoints_file,logfile,duration) track_simulators.append(track_simulation) # Scenario file parsing @@ -173,14 +176,14 @@ def main(): with open(scenariofile,'r') as json_file: scenario = json.load(json_file) - if exists("waypoints.txt"): - waypoints_file = "waypoints.txt" + if exists("waypoints.csv"): + waypoints_file = "waypoints.csv" print("[!] Waypoints file detected: " +os.path.abspath(waypoints_file)) for plane in scenario.values(): plane_info = AircraftInfos.from_json(plane["filename"]) # TRACK SIMULATION CREATION - track_simulation = getTrackSimulationThread(plane["trajectory_type"],broadcast_thread,plane_info,waypoints_file,logfile) + track_simulation = getTrackSimulationThread(plane["trajectory_type"],broadcast_thread,plane_info,waypoints_file,logfile,duration) track_simulators.append(track_simulation) print("[*] Scenario contains track simulations for "+str(len(track_simulators))+" plane(s):") diff --git a/ais_clonegen.py b/ais_clonegen.py new file mode 100644 index 0000000..46db410 --- /dev/null +++ b/ais_clonegen.py @@ -0,0 +1,60 @@ +""" Dynamically generates a randomized conical ship courses from initial values +shipCloneGen() +------------------------------------------------------- +This program is free software: you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation, either version 3 of the License, or (at your option) any later +version. +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +You should have received a copy of the GNU General Public License along with +this program. If not, see . +""" + +import random +import datetime +import os +from math import asin, atan2, cos, degrees, radians, sin + +def get_point_at_distance(lat1, lon1, d, bearing, R=6371): + """ + lat: initial latitude, in degrees + lon: initial longitude, in degrees + d: target distance from initial + bearing: (true) heading in degrees + R: optional radius of sphere, defaults to mean radius of earth + Returns new lat/lon coordinate {d}km from initial, in degrees + """ + lat1 = radians(lat1) + lon1 = radians(lon1) + a = radians(bearing) + lat2 = asin(sin(lat1) * cos(d/R) + cos(lat1) * sin(d/R) * cos(a)) + lon2 = lon1 + atan2( + sin(a) * sin(d/R) * cos(lat1), + cos(d/R) - sin(lat1) * sin(lat2) + ) + return (degrees(lat2), degrees(lon2),) + +def shipCloneGen(ship_id, lat, lon, duration=60): + dist = 0.007716667 + outputFile = open("ship="+ship_id+".csv", "a") + outputFile.write("DATETIME,SHIP_ID,LAT,LON,HEADING") + + # WRITES 1 LINE PER FUNCTION + for time from 0 to duration: + # Write to logfile -> CSV format: DATETIME,SHIP_ID,LAT,LON,HEADING + now=str(datetime.now()) + dist += 0.00 + bearing = random.uniform(0,360) + lat,lon = get_point_at_distance(lat,lon,dist,bearing) + outputFile.write("\n"+now,","+ship_id+","+str(lat)+","+str(lon)) + +def main(): + ship_id = "BIGSHIP" + lat = 0 + lon = 0 + duration = 10 + + + diff --git a/logfile.csv b/logfile.csv index 8c05bd8..623c312 100644 --- a/logfile.csv +++ b/logfile.csv @@ -2,4 +2,9 @@ DATETIME,CALLSIGN,LAT,LONG,ALT,SPD,TRKANGLE 2023-06-23 14:01:19.025885,DEADBEEF,1.3521,103.8198,609.6,138.88888888888889,0.0 2023-06-23 14:01:19.528708,DEADBEEF,1.3521,103.8198,609.6,138.88888888888889,0.0 2023-06-23 14:02:04.323312,DEADBEEF,1.3521,103.8198,609.6,138.88888888888889,0.0 -2023-06-23 14:02:04.825011,DEADBEEF,1.3521,103.8198,609.6,138.88888888888889,0.0 \ No newline at end of file +2023-06-23 14:02:04.825011,DEADBEEF,1.3521,103.8198,609.6,138.88888888888889,0.0 +2023-06-26 11:55:43.196621,DEADBEEF,1.3521,103.8198,609.6,138.88888888888889,0.0 +2023-06-26 11:55:43.699468,DEADBEEF,1.3521,103.8198,609.6,138.88888888888889,0.0 +2023-06-27 16:47:15.889838,DEADBEEF,1.3521,103.8198,609.6,138.88888888888889,0.0 +2023-06-27 16:47:16.392003,DEADBEEF,1.3521,103.8198,609.6,138.88888888888889,0.0 +2023-06-27 16:47:16.893557,DEADBEEF,1.3521,103.8198,609.6,138.88888888888889,0.0 \ No newline at end of file From 8d038a3b2986e05c553447a4e4721e32f66f9ba9 Mon Sep 17 00:00:00 2001 From: Anton Chua Date: Wed, 2 Aug 2023 13:49:38 +0800 Subject: [PATCH 18/22] Overhaul to v0.4 (tx issues) - randomized fixed track gen - fix logging across the three track gens - update help text --- FixedTrajectorySimulator.py | 42 +- FlightPathSimulator.py | 127 +++--- HackRfBroadcastThread.py | 28 +- WaypointsTrajectorySimulator.py | 53 +-- adsb-track-player.py | 37 +- logfile.csv | 756 +++++++++++++++++++++++++++++++- pyhackrf.py | 11 +- waypoints.csv | 4 + waypoints.txt | 3 - 9 files changed, 901 insertions(+), 160 deletions(-) create mode 100644 waypoints.csv delete mode 100644 waypoints.txt diff --git a/FixedTrajectorySimulator.py b/FixedTrajectorySimulator.py index 1505943..336fd52 100644 --- a/FixedTrajectorySimulator.py +++ b/FixedTrajectorySimulator.py @@ -14,21 +14,39 @@ this program. If not, see . """ from datetime import datetime - +import random +import string from AbstractTrajectorySimulatorBase import AbstractTrajectorySimulatorBase +LAT_LON_SQUARE = 1.0000 + class FixedTrajectorySimulator(AbstractTrajectorySimulatorBase): - def __init__(self,mutex,broadcast_thread,aircraftinfos,waypoints_file,logfile,duration): - super().__init__(mutex,broadcast_thread,aircraftinfos,waypoints_file,logfile,duration) + def __init__(self,mutex,broadcast_thread,aircraftinfos,waypoints_file,logfile): + super().__init__(mutex,broadcast_thread,aircraftinfos,waypoints_file,logfile) + + def refresh_delay(self): + return 0.5 - def refresh_delay(self): - return 0.5 + def update_aircraftinfos(self): + chars = string.ascii_uppercase + string.digits + self._icao = '0x'+''.join(random.sample(string.digits,6)) + self._aircraftinfos.callsign = ''.join(random.sample(chars, 8)) + self._aircraftinfos.lat_deg += random.uniform(-LAT_LON_SQUARE,LAT_LON_SQUARE) + self._aircraftinfos.lon_deg += random.uniform(-1.0000,1.0000) + self._aircraftinfos.alt_msl_m += random.uniform(-self._aircraftinfos.alt_msl_m,self._aircraftinfos.alt_msl_m) + self._aircraftinfos.speed_mps += random.uniform(-self._aircraftinfos.speed_mps,self._aircraftinfos.speed_mps) + self._aircraftinfos.track_angle_deg += random.uniform(0,360) + + # Track angle 0-360 wrapping + if self._aircraftinfos.track_angle_deg < 0: + self._aircraftinfos.track_angle_deg += 360 + elif self._aircraftinfos.track_angle_deg > 360: + self._aircraftinfos.track_angle_deg -= 360 - def update_aircraftinfos(self): - print("[!] FIXED TRAJECTORY\t\tCallsign: "+self._aircraftinfos.callsign) - print(" [:] Lat: "+str(self._aircraftinfos.lat_deg)+" | Lon: "+str(self._aircraftinfos.lon_deg)+" | Alt: "+str(self._aircraftinfos.alt_msl_m)+" | Spd: "+str(self._aircraftinfos.speed_mps)+" | Trk Angle: "+str(self._aircraftinfos.track_angle_deg)) + print("[!] FIXED TRAJECTORY\t\tICAO: "+self._icao+"\t\tCallsign: "+self._aircraftinfos.callsign) + print(" [:] Lat: "+str(self._aircraftinfos.lat_deg)+" | Lon: "+str(self._aircraftinfos.lon_deg)+" | Alt: "+str(self._aircraftinfos.alt_msl_m)+" | Spd: "+str(self._aircraftinfos.speed_mps)+" | Trk Angle: "+str(self._aircraftinfos.track_angle_deg)) - # Write to logfile -> CSV format: DATETIME,CALLSIGN,LAT,LONG,ALT,SPD,TRKANGLE - with open(self._logfile,"a") as fLog: - now=str(datetime.now()) - fLog.write("\n"+now+","+self._aircraftinfos.callsign+","+str(self._aircraftinfos.lat_deg)+","+str(self._aircraftinfos.lon_deg)+","+str(self._aircraftinfos.alt_msl_m)+","+str(self._aircraftinfos.speed_mps)+","+str(self._aircraftinfos.track_angle_deg)) + # Write to logfile -> CSV format: DATETIME,CALLSIGN,LAT,LONG,ALT,SPD,TRKANGLE + with open(self._logfile,"a") as fLog: + now=str(datetime.now()) + fLog.write("\n"+now+","+self._aircraftinfos.callsign+","+str(self._aircraftinfos.lat_deg)+","+str(self._aircraftinfos.lon_deg)+","+str(self._aircraftinfos.alt_msl_m)+","+str(self._aircraftinfos.speed_mps)+","+str(self._aircraftinfos.track_angle_deg)) diff --git a/FlightPathSimulator.py b/FlightPathSimulator.py index 33969b5..b80a378 100644 --- a/FlightPathSimulator.py +++ b/FlightPathSimulator.py @@ -22,73 +22,74 @@ REFRESH_RATE = 5 def get_point_at_distance(lat1, lon1, d, bearing, R=6371): - """ - lat: initial latitude, in degrees - lon: initial longitude, in degrees - d: target distance from initial - bearing: (true) heading in degrees - R: optional radius of sphere, defaults to mean radius of earth - Returns new lat/lon coordinate {d}km from initial, in degrees - """ - lat1 = radians(lat1) - lon1 = radians(lon1) - a = radians(bearing) - lat2 = asin(sin(lat1) * cos(d/R) + cos(lat1) * sin(d/R) * cos(a)) - lon2 = lon1 + atan2( - sin(a) * sin(d/R) * cos(lat1), - cos(d/R) - sin(lat1) * sin(lat2) - ) - return (degrees(lat2), degrees(lon2),) + """ + lat: initial latitude, in degrees + lon: initial longitude, in degrees + d: target distance from initial + bearing: (true) heading in degrees + R: optional radius of sphere, defaults to mean radius of earth + Returns new lat/lon coordinate {d}km from initial, in degrees + """ + lat1 = radians(lat1) + lon1 = radians(lon1) + a = radians(bearing) + lat2 = asin(sin(lat1) * cos(d/R) + cos(lat1) * sin(d/R) * cos(a)) + lon2 = lon1 + atan2( + sin(a) * sin(d/R) * cos(lat1), + cos(d/R) - sin(lat1) * sin(lat2) + ) + return (degrees(lat2), degrees(lon2),) class FlightPathSimulator(AbstractTrajectorySimulatorBase): - def __init__(self,mutex,broadcast_thread,aircraftinfos,logfile,duration): - super().__init__(mutex,broadcast_thread,aircraftinfos,logfile) - self._starttime = datetime.datetime.now(datetime.timezone.utc) - - self._lat0 = aircraftinfos.lat_deg - self._lon0 = aircraftinfos.lon_deg + def __init__(self,mutex,broadcast_thread,aircraftinfos,waypoints_file,logfile,duration): + super().__init__(mutex,broadcast_thread,aircraftinfos,waypoints_file,logfile,duration) + self._starttime = datetime.datetime.now(datetime.timezone.utc) + self._icao = str(aircraftinfos.icao) + self._lat0 = aircraftinfos.lat_deg + self._lon0 = aircraftinfos.lon_deg - self._alt_m = aircraftinfos.alt_msl_m - self._speed_mps = aircraftinfos.speed_mps - self._duration = duration + self._alt_m = aircraftinfos.alt_msl_m + self._speed_mps = aircraftinfos.speed_mps + self._duration = duration - def refresh_delay(self): - return REFRESH_RATE + def refresh_delay(self): + return REFRESH_RATE - def update_aircraftinfos(self): - dist_spd = ((self._speed_mps * 1.852)/3600)*REFRESH_RATE - - ##### PRE-GENERATION PROTOTYPE CODE ##### - """ - dist_spd = ((self._speed_mps * 1.852)/3600) - - genLat = self._aircraftinfos.lat_deg - genLon = self._aircraftinfos.lon_deg - genSpd = self._aircraftinfos.speed_mps - genTrk = self._aircraftinfos.track_angle_deg - flightPath = {} - - - for i from 1 to self._duration: - genLat = - """ - - self._aircraftinfos.lat_deg, self._aircraftinfos.lon_deg = get_point_at_distance(self._aircraftinfos.lat_deg, self._aircraftinfos.lon_deg, dist_spd, self._aircraftinfos.track_angle_deg) + def update_aircraftinfos(self): + dist_spd = ((self._speed_mps * 1.852)/3600)*REFRESH_RATE - self._aircraftinfos.speed_mps += random.uniform(-10,10) - self._aircraftinfos.track_angle_deg += random.uniform(-3,3) - self._aircraftinfos.alt_msl_m += random.uniform(-5,5) - - # Track angle 0-360 wrapping - if self._aircraftinfos.track_angle_deg < 0: - self._aircraftinfos.track_angle_deg += 360 - elif self._aircraftinfos.track_angle_deg > 360: - self._aircraftinfos.track_angle_deg -= 360 - - print("[!] FLIGHT SIM\t\tCallsign: "+self._aircraftinfos.callsign) - print(" [:] Lat: "+str(self._aircraftinfos.lat_deg)+" | Lon: "+str(self._aircraftinfos.lon_deg)+" | Alt: "+str(self._aircraftinfos.alt_msl_m)+" | Spd: "+str(self._aircraftinfos.speed_mps)+" | Trk Angle: "+str(self._aircraftinfos.track_angle_deg)) + ##### PRE-GENERATION PROTOTYPE CODE ##### + """ + dist_spd = ((self._speed_mps * 1.852)/3600) + + genLat = self._aircraftinfos.lat_deg + genLon = self._aircraftinfos.lon_deg + genSpd = self._aircraftinfos.speed_mps + genTrk = self._aircraftinfos.track_angle_deg + flightPath = {} + + + for i from 1 to self._duration: + genLat = + """ + + # Calculate new Lat/Lon based on Speed+Track Angle + self._aircraftinfos.lat_deg, self._aircraftinfos.lon_deg = get_point_at_distance(self._aircraftinfos.lat_deg, self._aircraftinfos.lon_deg, dist_spd, self._aircraftinfos.track_angle_deg) + + self._aircraftinfos.speed_mps += random.uniform(-10,10) + self._aircraftinfos.track_angle_deg += random.uniform(-3,3) + self._aircraftinfos.alt_msl_m += random.uniform(-5,5) + + # Track Angle 0-360 wrapping + if self._aircraftinfos.track_angle_deg < 0: + self._aircraftinfos.track_angle_deg += 360 + elif self._aircraftinfos.track_angle_deg > 360: + self._aircraftinfos.track_angle_deg -= 360 - # Write to logfile -> CSV format: DATETIME,CALLSIGN,LAT,LONG,ALT,SPD,TRKANGLE - now=str(datetime.now()) - with open(self._logfile,"a") as fLog: - fLog.write.write("\n"+now,","+self._aircraftinfos.callsign+","+str(self._aircraftinfos.lat_deg)+","+str(self._aircraftinfos.lon_deg)+","+str(self._aircraftinfos.alt_msl_m)+","+str(self._aircraftinfos.speed_mps)+","+str(self._aircraftinfos.track_angle_deg)) + print("[!] FLIGHT SIM\t\tICAO: "+self._icao+"\t\tCallsign: "+self._aircraftinfos.callsign) + print(" [:] Lat: "+str(self._aircraftinfos.lat_deg)+" | Lon: "+str(self._aircraftinfos.lon_deg)+" | Alt: "+str(self._aircraftinfos.alt_msl_m)+" | Spd: "+str(self._aircraftinfos.speed_mps)+" | Trk Angle: "+str(self._aircraftinfos.track_angle_deg)) + + #Write to logfile -> CSV format: DATETIME,CALLSIGN,LAT,LONG,ALT,SPD,TRKANGLE + with open(self._logfile,"a") as fLog: + now=str(datetime.datetime.now()) + fLog.write("\n"+now+","+self._aircraftinfos.callsign+","+str(self._aircraftinfos.lat_deg)+","+str(self._aircraftinfos.lon_deg)+","+str(self._aircraftinfos.alt_msl_m)+","+str(self._aircraftinfos.speed_mps)+","+str(self._aircraftinfos.track_angle_deg)) diff --git a/HackRfBroadcastThread.py b/HackRfBroadcastThread.py index 05f32ee..fb19463 100644 --- a/HackRfBroadcastThread.py +++ b/HackRfBroadcastThread.py @@ -79,14 +79,18 @@ def __init__(self,airborne_position_refresh_period = 150000): print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) self._hackrf_broadcaster.setCrystalPPM(0) - + + #result = self._hackrf_broadcaster.setAntennaPowerMode(LibHackRfHwMode.HW_MODE_ON) # Antenna Power Mode ON or OFF + #if (result != LibHackRfReturnCode.HACKRF_SUCCESS): + # print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) + result = self._hackrf_broadcaster.setAmplifierMode(LibHackRfHwMode.HW_MODE_ON) # LNA Amplifier ON or OFF if (result != LibHackRfReturnCode.HACKRF_SUCCESS): print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) - result = self._hackrf_broadcaster.setLNAGain(14) # LNA Amplifier Gain - if (result != LibHackRfReturnCode.HACKRF_SUCCESS): - print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) + #result = self._hackrf_broadcaster.setLNAGain(14) # LNA Amplifier Gain + #if (result != LibHackRfReturnCode.HACKRF_SUCCESS): + # print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) # 2MHz sample rate to meet ADS-B spec of 0.5µs PPM symbol result = self._hackrf_broadcaster.setSampleRate(2000000) @@ -102,15 +106,9 @@ def __init__(self,airborne_position_refresh_period = 150000): if (result != LibHackRfReturnCode.HACKRF_SUCCESS): print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) - result = self._hackrf_broadcaster.setTXVGAGain(47) # TX VGA Gain (4 for wire feed + attenuators, 47 for wireless) + result = self._hackrf_broadcaster.setTXVGAGain(40) # TX VGA Gain (4 for wire feed + attenuators, 47 for wireless) if (result != LibHackRfReturnCode.HACKRF_SUCCESS): print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) - - #print("[*] HackRF Transciever Mode: "+str(self._hackrf_broadcaster.getTransceiverMode())) # Get Transceiver Mode - - #result = self._hackrf_broadcaster.setAntennaPowerMode(LibHackRfHwMode.HW_MODE_ON) # Antenna Power Mode ON or OFF - #if (result != LibHackRfReturnCode.HACKRF_SUCCESS): - # print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) self._tx_context = hackrf_tx_context() @@ -177,15 +175,15 @@ def broadcast_data(self,data): self._mutex.release() result = self._hackrf_broadcaster.startTX(hackrfTXCB,self._tx_context) - if (result != LibHackRfReturnCode.HACKRF_SUCCESS): - print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) + #if (result != LibHackRfReturnCode.HACKRF_SUCCESS): + # print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) while self._hackrf_broadcaster.isStreaming(): time.sleep(sleep_time) result = self._hackrf_broadcaster.stopTX() - if (result != LibHackRfReturnCode.HACKRF_SUCCESS): - print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) + #if (result != LibHackRfReturnCode.HACKRF_SUCCESS): + # print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) #self._mutex.release() diff --git a/WaypointsTrajectorySimulator.py b/WaypointsTrajectorySimulator.py index 45f4e08..0c7b3ac 100644 --- a/WaypointsTrajectorySimulator.py +++ b/WaypointsTrajectorySimulator.py @@ -20,34 +20,25 @@ from AbstractTrajectorySimulatorBase import AbstractTrajectorySimulatorBase class WaypointsTrajectorySimulator(AbstractTrajectorySimulatorBase): - def __init__(self,mutex,broadcast_thread,aircraftinfos,waypoints_file,logfile): - super().__init__(mutex,broadcast_thread,aircraftinfos,waypoints_file,logfile) - self._starttime = datetime.datetime.now(datetime.timezone.utc) - - self._lat0 = aircraftinfos.lat_deg - self._lon0 = aircraftinfos.lon_deg - - def refresh_delay(self): - return 0.005 - - def update_aircraftinfos(self): - - with open(self._waypoints_file, 'r') as wp: - # Waypoint CSV format: "<0:callsign>,<1:lat>,<2:lon>,<3:alt>,<4:speed>,<5:track angle>,<6:iterate time>" - for line in wp: - posi = line.split(",") - print("[!] WAYPOINTS TRAJECTORY\tCallsign: "+self._aircraftinfos.callsign) - print(" [:] Lat: "+posi[0]+" | Lon: "+posi[1]+" | Alt: "+posi[2]+" | Spd: "+posi[3]+" | Trk Angle: "+posi[4]+" | ValidTime: "+posi[5]) - - # Write to logfile -> CSV format: DATETIME,CALLSIGN,LAT,LONG,ALT,SPD,TRKANGLE - now=str(datetime.now()) - with open(self._logfile,"a") as fLog: - fLog.write.write("\n"+now+","+self._aircraftinfos.callsign+","+posi[0]+","+posi[1]+","+posi[2]+","+posi[3]+","+posi[4]) - - - self._aircraftinfos.lat_deg = float(posi[0]) - self._aircraftinfos.lon_deg = float(posi[1]) - self._aircraftinfos.alt_msl_m = float(posi[2]) - self._aircraftinfos.speed_mps = float(posi[3]) - self._aircraftinfos.track_angle_deg = float(posi[4]) #valid: 0.0-360.0 - time.sleep(int(posi[5])) #int, in seconds # TODO: Currently iterates whole file before user-quit takes effect + def __init__(self,mutex,broadcast_thread,aircraftinfos,waypoints_file,logfile): + super().__init__(mutex,broadcast_thread,aircraftinfos,waypoints_file,logfile) + self._starttime = datetime.datetime.now(datetime.timezone.utc) + self._lat0 = aircraftinfos.lat_deg + self._lon0 = aircraftinfos.lon_deg + self._logfile = logfile + + def refresh_delay(self): + return 0.005 + + def update_aircraftinfos(self): + with open(self._waypoints_file, 'r') as wp: + # waypoints CSV format: "<0:callsign>,<1:lat>,<2:lon>,<3:alt>,<4:speed>,<5:track angle>,<6:iterate time>" + for line in wp: + posi = line.split(",") + print("[!] WAYPOINTS TRAJECTORY\tCallsign: "+self._aircraftinfos.callsign) + print(" [:] Lat: "+posi[1]+" | Lon: "+posi[2]+" | Alt: "+posi[3]+" | Spd: "+posi[4]+" | Trk Angle: "+posi[5]+" | ValidTime: "+posi[6]) + + # Write to logfile -> CSV format: DATETIME,CALLSIGN,LAT,LONG,ALT,SPD,TRKANGLE + with open(self._logfile,"a") as fLog: + now=str(datetime.now()) + fLog.write("\n"+now+","+self._aircraftinfos.callsign+","+str(self._aircraftinfos.lat_deg)+","+str(self._aircraftinfos.lon_deg)+","+str(self._aircraftinfos.alt_msl_m)+","+str(self._aircraftinfos.speed_mps)+","+str(self._aircraftinfos.track_angle_deg)) diff --git a/adsb-track-player.py b/adsb-track-player.py index 4a5a106..5f8ca29 100755 --- a/adsb-track-player.py +++ b/adsb-track-player.py @@ -32,20 +32,20 @@ def usage(msg=False): print("[h] Usage: %s [options]\n" % sys.argv[0]) print("-h | --help Display help message") print("--scenario Scenario mode, argument is scenario JSON filepath") - print(" waypoints : Include waypoints.txt file in script directory") + print(" waypoints : Include waypoints file(s) in script directory") print("--icao Callsign in hex, default: 0x508035") print("--callsign Callsign (8 chars max), Default: DEADBEEF") print("--squawk 4-digit 4096 code squawk, Default: 7000") print("--trajectorytype Types of simulated trajectories:") - print(" fixed : fixed broadcast") - print(" flightsim : dynamically generated flight path") + print(" fixed : fixed broadcast") + print(" flightsim : dynamically generated flight path") print("--numac Number of aircraft to simulate, Default: 1") print("--duration Duration to simulate aircrafts in seconds, Default: 60") - print(" Default: fixed") - print("--lat Latitude for the plane in decimal degrees, Default: 50.44994") - print("--long Longitude for the plane in decimal degrees. Default: 30.5211") - print("--altitude Altitude in decimal feet, Default: 1500.0") - print("--speed Airspeed in decimal kph, Default: 300.0") + print(" Default: fixed") + print("--lat Latitude for the plane in decimal degrees, Default: 1.3521") + print("--long Longitude for the plane in decimal degrees. Default: 103.8198") + print("--altitude Altitude in decimal feet, Default: 16500.0") + print("--speed Airspeed in decimal kph, Default: 500.0") print("--vspeed Vertical speed en ft/min, positive UP, Default: 0") print("--maxloadfactor Specify the max load factor for aircraft simulation, Default: 1.45") print("--trackangle Track angle in decimal degrees, Default: 0") @@ -64,11 +64,11 @@ def usage(msg=False): ############ TRACK SIMULATION GENERATION FUNCTION ############ def getTrackSimulationThread(trajectory_type,broadcast_thread,aircraftinfos,waypoints_file,logfile,duration): if trajectory_type == 'fixed': - return FixedTrajectorySimulator(broadcast_thread.getMutex(),broadcast_thread,aircraftinfos,waypoints_file,logfile,duration) + return FixedTrajectorySimulator(broadcast_thread.getMutex(),broadcast_thread,aircraftinfos,waypoints_file,logfile) elif trajectory_type == 'waypoints': - return WaypointsTrajectorySimulator(broadcast_thread.getMutex(),broadcast_thread,aircraftinfos,waypoints_file,logfile,duration) + return WaypointsTrajectorySimulator(broadcast_thread.getMutex(),broadcast_thread,aircraftinfos,waypoints_file,logfile) elif trajectory_type == 'flightsim': - return FlightPathSimulator(broadcast_thread.getMutex(),broadcast_thread,aircraftinfos,logfile,duration) + return FlightPathSimulator(broadcast_thread.getMutex(),broadcast_thread,aircraftinfos,waypoints_file,logfile,duration=120) else: return None @@ -76,23 +76,20 @@ def getTrackSimulationThread(trajectory_type,broadcast_thread,aircraftinfos,wayp def main(): # Log file check - logfile = './logfile.csv' + logfile = '/home/anton/adsb-track-player/logfile.csv' if os.path.exists(logfile): if os.path.isfile(logfile): print("[*] logfile.csv found") - elif os.path.isdir(logfile): - print("[!] logfile is a directory, not a file!") else: print("[!] logfile not found, creating...") with open(logfile,"w") as fLog: fLog.write("DATETIME,CALLSIGN,LAT,LONG,ALT,SPD,TRKANGLE") - fLog.close() # Default values icao_aa = '0x508035' callsign = 'DEADBEEF' squawk = '7000' - alt_ft = 2000.0 + alt_ft = 16500.0 lat_deg = 1.3521 lon_deg = 103.8198 speed_kph = 500.0 @@ -145,10 +142,7 @@ def main(): elif opt in ('--numac'):numac = int(arg) elif opt in ('--duration'):duration = int(arg) else:usage("Unknown option %s\n" % opt) - print ("\n==== ADS-B Track Player v0.3 | by six3oo | core by Matioupi ====\n") - - # GUI runtime - #master.mainloop() + print ("\n==== ADS-B Track Player v0.4 | by six3oo | core by Matioupi ====\n") # Functional code track_simulators = [] @@ -160,13 +154,12 @@ def main(): aircraftinfos = AircraftInfos(icao_aa,callsign,squawk, \ lat_deg,lon_deg,alt_ft,speed_kph,vspeed_ftpmin,maxloadfactor,track_angle_deg, \ timesync,capability,type_code,surveillance_status,nicsup,on_surface) - + # Multiple aircraft option if numac>1: print("[!] Generating "+str(numac)+" fuzzing aircraft") for i in range(numac): # TRACK SIMULATION CREATION - track_simulation = getTrackSimulationThread(trajectory_type,broadcast_thread,aircraftinfos,waypoints_file,logfile,duration) track_simulators.append(track_simulation) diff --git a/logfile.csv b/logfile.csv index 623c312..83444ff 100644 --- a/logfile.csv +++ b/logfile.csv @@ -1,10 +1,748 @@ DATETIME,CALLSIGN,LAT,LONG,ALT,SPD,TRKANGLE -2023-06-23 14:01:19.025885,DEADBEEF,1.3521,103.8198,609.6,138.88888888888889,0.0 -2023-06-23 14:01:19.528708,DEADBEEF,1.3521,103.8198,609.6,138.88888888888889,0.0 -2023-06-23 14:02:04.323312,DEADBEEF,1.3521,103.8198,609.6,138.88888888888889,0.0 -2023-06-23 14:02:04.825011,DEADBEEF,1.3521,103.8198,609.6,138.88888888888889,0.0 -2023-06-26 11:55:43.196621,DEADBEEF,1.3521,103.8198,609.6,138.88888888888889,0.0 -2023-06-26 11:55:43.699468,DEADBEEF,1.3521,103.8198,609.6,138.88888888888889,0.0 -2023-06-27 16:47:15.889838,DEADBEEF,1.3521,103.8198,609.6,138.88888888888889,0.0 -2023-06-27 16:47:16.392003,DEADBEEF,1.3521,103.8198,609.6,138.88888888888889,0.0 -2023-06-27 16:47:16.893557,DEADBEEF,1.3521,103.8198,609.6,138.88888888888889,0.0 \ No newline at end of file +2023-08-01 18:03:41.670185,E2Z9L3FP,2.2250189954880697,103.72276796562527,4694.1796281796305,217.78731650772335,125.47427046182028 +2023-08-01 18:03:41.671740,NA7EKU9X,1.4385011228122226,104.38361049197542,3306.4708971398995,405.6953610425475,180.44340067026195 +2023-08-01 18:03:42.172464,6PMIXHJT,2.2677437330715,104.84560408563699,2694.1366089144854,359.4753160419444,210.63984109480393 +2023-08-01 18:03:42.174610,D15OF96T,1.724659324322683,105.81474208172459,1055.5191185225003,599.4058721493504,41.27387920943647 +2023-08-01 18:03:56.965684,2GJBK8PT,1.9214821925250234,103.76353618839198,11335.8270674902,12.099121680764194,293.0292823399805 +2023-08-01 18:03:56.966473,2GJBK8PT,1.9214821925250234,103.76353618839198,11335.8270674902,12.099121680764194,293.0292823399805 +2023-08-01 18:03:57.467993,2TNVZ8JM,1.2467377034617653,103.05102929284256,4955.199967707479,17.88656007302129,176.62125285499246 +2023-08-01 18:03:57.468806,HLRX3NPK,0.6804146084747968,103.52994303425679,8828.164423656934,20.12146540948352,258.3589789712566 +2023-08-01 18:03:57.970159,EJZBQ71O,0.24647883393958914,104.05672763291646,4204.129479192469,8.990196750825964,184.5581462755024 +2023-08-01 18:03:57.970850,CDJL3VE6,-0.4927976303667321,103.29358415968916,5006.133151096409,11.657749646061887,258.5734014415692 +2023-08-01 18:04:11.079338,DZW6S1K4,0.559824538510832,104.71108734298456,7757.179966228161,64.251415380456,58.36972961937709 +2023-08-01 18:04:11.080218,1GPS563E,-0.2805992953708949,103.98327915145427,10828.980903715214,31.834834123448147,95.27461172245391 +2023-08-01 18:06:55.046846,DEADBEEF,1.3553128541939843,103.8198,5031.487911870176,128.9310005984801,1.1314576628700488 +2023-08-01 18:10:49.400399,T21VIOM8,1.3419280184455076,104.09608632883912,5189.502751306865,27.243636280530637,302.8658981017185 +2023-08-01 18:10:49.903471,MZG2HW93,2.022378661671204,103.84722736012581,2118.5415728525113,1.651484184356164,40.84967319675968 +2023-08-01 18:10:50.405555,B2O810YX,2.7963969056298947,104.75357709937718,1231.1238432275873,1.3511260291577727,246.30264477692123 +2023-08-01 18:10:50.907684,0KDNAMVB,2.1043797869961143,104.99217794312096,745.0590097298715,1.0145522138130494,112.83363326925547 +2023-08-01 18:10:51.409855,38TMRSFO,2.717887329154606,105.34957998724953,1180.735858577367,0.8388805595359587,247.53592633721775 +2023-08-01 18:10:51.912081,5JKO8IZD,2.667319488202967,105.79727436397505,2038.1273666955979,1.3425335733234998,319.61014213688304 +2023-08-01 18:10:52.414229,KZH8NPDJ,3.1932160432688885,106.52015403721899,1903.3429936241844,1.7310861042729142,299.09378266630597 +2023-08-01 18:10:52.916354,CO2WEF1T,3.7628022656031157,107.18697889494887,103.47626652853228,1.2746291546056958,26.214454073410366 +2023-08-01 18:10:53.418492,VMX78KGA,3.6622640980493495,107.21985992036832,69.7042487213801,2.301263988147344,144.30362685638013 +2023-08-01 18:10:53.920580,A65NPTQZ,3.014431157958835,106.61197787154521,108.25181931735143,1.0163736634953486,47.50077902930468 +2023-08-01 18:10:54.422673,LPKGAOF1,3.9356095296692817,105.86878918772433,177.80510597551543,0.6928090679173848,160.36858330598338 +2023-08-01 18:10:54.899658,3M59U21Y,4.058294043114238,105.73262649843198,263.1740217535309,0.5602062398049488,259.25414701065847 +2023-08-01 18:10:55.401769,1KPTA637,4.580074809322968,105.13822807558869,458.2178375961549,0.8257876798824039,286.38453704990405 +2023-08-01 18:10:55.903987,ZIMSQW72,5.475434305289265,105.8740207753721,102.32740060814075,0.39616866607673096,198.71949221256136 +2023-08-01 18:10:56.406133,Q8MX4WP5,6.100998587143507,105.89779052271777,140.2795857844479,0.6857507464972259,95.51256822522481 +2023-08-01 18:10:56.908215,8347LSY2,6.131282534876139,106.84870089027835,145.25454190506326,0.7005382024434051,119.60427360754727 +2023-08-01 18:10:57.410565,7HLVN12Z,5.5258811992724,107.62054348037417,266.0858089885631,1.1195202581897268,315.4916985188715 +2023-08-01 18:10:57.912599,BOGKZYHW,4.904943838278558,107.95247108928555,402.9373447358816,0.7182889712272609,52.51556719432091 +2023-08-01 18:10:58.414733,1TX0SPL6,5.447116388221441,108.36073400265694,284.0379157274154,0.8660214586553542,82.70537382070245 +2023-08-01 18:10:58.916780,6SDKA9FQ,5.558855691479572,109.05008048112754,248.4992661856476,0.8797238600821624,21.715855228103806 +2023-08-01 18:10:59.419218,A5IJ6HCS,4.9088583136480946,109.7079603264894,26.84005767443412,1.0817108535446676,191.54593833285756 +2023-08-01 18:10:59.921598,96FCXQAB,4.936828216609626,110.08076008091263,35.80495030683661,0.5333993309739354,259.87146958214237 +2023-08-01 18:11:00.424027,I2GF30HY,4.850306414583998,109.69024316685442,47.02025698439452,0.9965706290811461,149.25885736324176 +2023-08-01 18:11:00.901021,S21J0DXE,5.064343040583304,108.94141561598171,39.7235359405451,1.1383189367428357,341.4323467621493 +2023-08-01 18:11:01.403313,N34L7QFV,5.290286120401765,109.24307992055749,62.269165011399636,1.8396034786135356,338.41275813046013 +2023-08-01 18:11:01.905676,56YWEV0I,4.3996027696097215,109.30961801445734,72.66298756100899,1.6765288460627725,296.24106654075797 +2023-08-01 18:11:02.408081,7PB2EGVQ,4.05722271855239,108.83530877595102,40.31749378383141,1.496543092911467,144.66029690401808 +2023-08-01 18:11:02.910408,2WHIMFJ6,4.552022378098599,108.06568175738116,36.64634924759153,1.350518743338877,274.15348077439444 +2023-08-01 18:11:03.412506,4J32CPAS,4.172819207923975,107.0674557087857,42.38849658373259,0.3623666465560893,329.15452488884165 +2023-08-01 18:11:03.914932,I8RQANMK,4.191560985626375,107.42107674944279,67.12080637813065,0.5945340461748252,250.0538102083633 +2023-08-01 18:11:04.416885,OZEMQ67J,4.911066647807208,107.60812219034801,10.154098687381627,0.3794688060013612,285.6568369392734 +2023-08-01 18:11:04.919187,Z0YBEA4J,5.780641830744597,108.51760997153352,19.466230482806406,0.7580753589842854,248.68880740280952 +2023-08-01 18:11:05.421540,ZY0OQTIP,5.118620796896918,108.08576527473959,35.92062533888129,1.1821555923579858,185.22984525464722 +2023-08-01 18:13:20.046711,EQYDFOMS,0.6690575278790614,102.90532590369143,66.08403934239959,159.27034886802366,275.78506662700306 +2023-08-01 18:13:20.549146,8DFP10G6,-0.3248959468856274,103.46754339469328,27.15362674907552,29.582121336173373,89.94817466621481 +2023-08-01 18:13:21.051229,X3HDA0IK,0.454868665062397,104.36132125721403,13.754346094366216,44.99234599562532,186.65523291401706 +2023-08-01 18:13:21.553242,7L6N3ZGA,-0.23502205890882344,104.24643612266779,16.65862003137148,44.23484242401174,20.520591196267787 +2023-08-01 18:13:22.055314,I6SDP1R5,-0.09658018116999534,105.03679572749495,6.386979361807846,33.16665257146826,325.7335772823415 +2023-08-01 18:13:22.557331,VGCHWE05,-0.8459282912433623,105.71189780926528,11.229631882428468,42.52683467554496,52.950242130579 +2023-08-01 18:13:23.058860,027UBRQA,-0.861391665089617,106.63801337864483,5.010926653239945,64.24029609881272,288.48981773262017 +2023-08-01 18:13:23.560506,J5O3PVNL,-1.2156865697502668,105.94307071819614,0.3715559284749945,12.519595581061196,88.96196437857822 +2023-08-01 18:13:24.062634,93SCKB1L,-1.4742423688630295,105.90819256007232,0.56001946823566,4.543215156350548,202.26059425153105 +2023-08-01 18:13:24.564291,9YW51INT,-0.9037829780369637,106.75698716200877,1.1002862624061334,0.7812434863426736,333.7859000167982 +2023-08-01 18:13:25.065903,MDCIJL9U,-1.6604302586009956,107.48481688855539,0.964634974340706,0.23853310852708132,326.9614606307757 +2023-08-01 18:13:25.567915,F09UBZN8,-1.6158399964110668,106.56006975927366,0.2236832622256021,0.47179867810373505,177.0123467391952 +2023-08-01 18:13:26.070072,J6425BZO,-2.3403283250058458,107.01532213529703,0.2054790423373524,0.04098662790194246,330.4688614264254 +2023-08-01 18:13:26.547013,IBL1VNS0,-2.197160587059649,107.13696607112087,0.18780399864276665,0.028088220635715942,248.196829765257 +2023-08-01 18:13:27.049186,XO09L852,-2.571269449393549,106.25883990592516,0.1433664611526793,0.03024110007337488,20.79801232906391 +2023-08-01 18:13:27.551158,V8YK5HBR,-2.6524019540690116,107.04738380224488,0.015058098259803837,0.02798655243333743,136.36949496510732 +2023-08-01 18:13:28.053269,U6CNYK1T,-3.381588129611269,106.48335654139488,0.02387671486663154,0.05298877664809545,260.2279876095295 +2023-08-01 18:13:28.555425,A9FK2LR3,-4.379833969496382,106.23957847326956,0.03306500290380813,0.0851348700744897,328.8922227286612 +2023-08-01 18:13:29.057630,0SZJFWNR,-4.275098613116646,106.48167615156487,0.027422455254572906,0.03097530736016374,93.27222576896321 +2023-08-01 18:13:29.559631,25LIPFZ9,-4.167269498095963,107.05740976371736,0.024675718468103267,0.039416897885873894,207.56665174867572 +2023-08-01 18:13:30.061663,57I318XJ,-3.657872563221038,107.48669049168049,0.0033771423042140945,0.02670447274397847,344.336000350611 +2023-08-01 18:13:30.563670,VP9NAJB3,-4.120910547455232,106.56179388562573,0.005208493726139044,0.0084168476244765,76.23684836295087 +2023-08-01 18:13:31.065875,4OVIWHBS,-3.991555840925311,107.3414424631775,0.0005773834320528604,0.0031395002044303563,46.79929172591761 +2023-08-01 18:13:31.567924,J85IN0VL,-4.052095809684332,107.97110602726222,0.0009749904147747539,0.0018399346332097733,144.06881641847082 +2023-08-01 18:13:32.069983,OIF9BDSK,-4.293146103185171,108.80937492816146,0.0013411882576799517,0.003495158002507407,192.41435123170447 +2023-08-01 18:13:32.546926,5VAGL7R2,-3.5631396965477937,108.26906974653848,0.0007354005430915751,0.0024261948122353636,296.93013565850265 +2023-08-01 18:13:33.049130,A4DQM1O7,-4.423339042670466,108.78545680808028,0.0010932018575622842,0.001867483802941938,210.93616368301923 +2023-08-01 18:13:33.551225,2FJOWUKX,-4.629776611997498,109.48472874021822,0.0010327639256305506,0.0020544195754879655,175.87623456446772 +2023-08-01 18:13:34.053176,LBNR4VZH,-4.618806916807247,109.99688028161899,0.0004749816759709051,0.0032140428100855714,321.95173439160055 +2023-08-01 18:13:34.554830,0DMXLN15,-5.334820386788261,109.25294889530278,0.00034961197849707487,0.002297993780574785,180.5086523379348 +2023-08-01 18:13:35.056319,58GZ1V73,-4.860551012899265,108.35519990429367,0.00017150322755236496,0.0032747417932945857,342.0460364945012 +2023-08-01 18:13:35.557849,ENXV3QYZ,-5.031575331094391,107.69029577884129,0.0001468042211147638,0.00570139754200468,158.3800481443676 +2023-08-01 18:13:36.059766,JIN6L5BM,-4.235454656860271,106.78381036447999,0.00027258145590487433,0.010854751650964493,53.81952686601028 +2023-08-01 18:13:36.561461,XQ5DBYF9,-3.940877571582835,106.26729516193824,0.0005206518672047621,0.015807677635312975,109.02916658542637 +2023-08-01 18:13:37.063690,1VEJWYAL,-4.584052090904317,106.94923952098335,0.0003889298016969573,0.0012719303241170918,315.97414120474645 +2023-08-01 18:13:37.565949,GWN43VS6,-4.070834577584093,107.74404038562646,0.0007401424354262064,0.0023874101600133276,317.46243000397226 +2023-08-01 18:13:38.068072,ZJ0BYK86,-4.71311868820129,107.71835112505683,0.0013395955259408328,0.0009315048691062847,167.29002488582455 +2023-08-01 18:13:38.570121,Z5IXL7EO,-5.151951485614189,107.76367378260039,0.0005360424726557824,1.885947282401657e-05,26.77883118906675 +2023-08-01 18:13:39.047191,9ZQDPXVF,-5.893924117189045,108.53814939429215,0.0006209750263711013,3.062115273124318e-05,327.8978587646264 +2023-08-01 18:13:39.549412,35L64UE7,-6.052021660897385,107.84269609441307,8.367268308490648e-05,1.5217914447924447e-05,184.46394447170098 +2023-08-01 18:13:40.051579,RPLDXQWU,-5.063418709621864,108.75250952062119,0.00016122279960988266,9.561140808576517e-06,205.41152786314055 +2023-08-01 18:13:40.553598,S71IQRT8,-5.869315817588508,109.11797479331689,0.0002795339373074808,1.5709473114934055e-05,279.12600210157143 +2023-08-01 18:13:41.055677,IWZB4JTO,-6.6268372412178715,109.6904391176494,7.4234323963566756e-06,4.84160977661267e-06,285.0281017719648 +2023-08-01 18:13:41.557751,17IFRO6C,-6.709528535814822,109.57706619183917,5.353727826394457e-06,2.7866340916056474e-06,164.25639070666273 +2023-08-01 18:13:42.059839,B9G6QI3W,-6.769481920850494,109.89202988520569,1.6415282396880037e-06,3.3387295137201242e-06,183.01696376566267 +2023-08-01 18:13:42.561944,DZLC392U,-6.320950618105673,110.10963798948534,2.3767011740275327e-06,3.071867470169047e-06,267.76480668880265 +2023-08-01 18:13:43.063936,Q8UTNX5F,-7.313172181940672,109.2704493447072,1.9040121294601686e-07,1.2821153445445394e-09,340.6118868734094 +2023-08-01 18:13:43.565899,FGWVJ21H,-7.017434837172709,108.65870577281719,2.67272954357708e-08,1.8798907383210134e-09,294.123871393082 +2023-08-01 18:13:44.068200,RABXYU8L,-7.856549717440329,109.2748775418209,2.5820414158268158e-08,2.2103984909939942e-09,178.48059202638672 +2023-08-01 18:13:44.570395,OMGEDY6K,-7.658779984433809,109.73942738874584,4.188832098647163e-08,4.449586039763592e-10,263.02140172450885 +2023-08-01 18:13:45.047458,73J425VM,-7.159887806402393,110.24498000983378,3.504639784433756e-09,8.030899053843356e-10,9.416173505720849 +2023-08-01 18:13:45.549557,LG8RIPU4,-7.44453858224692,110.91406182330223,6.112218155788803e-09,4.599015145242206e-10,266.4016541849971 +2023-08-01 18:13:46.051757,W3ZJRPB1,-7.964841438172023,110.06378789097587,8.497458718290226e-09,3.419762710742689e-10,286.2930652891217 +2023-08-01 18:13:46.553961,PN65LJ1H,-8.472873722558955,109.35264389883525,3.2265973890620985e-10,5.641162510917579e-10,228.24103561414745 +2023-08-01 18:13:47.056125,Q6VGK2SH,-8.736771462100855,110.20408870297503,2.454920739808456e-10,4.9845204692560365e-12,15.406191889662978 +2023-08-01 18:13:47.558224,W8Y7C19D,-8.560461512300407,110.17702067183188,4.2439525324166715e-10,7.876576029915923e-12,107.7618224776773 +2023-08-01 18:13:48.060363,GYJVRUWH,-9.308779539349626,109.86028646449364,4.867483254945405e-10,4.931241141341615e-12,62.606814223903086 +2023-08-01 18:13:48.562445,UND591BX,-9.294135879408548,110.07452997374986,3.8038220598642e-10,9.779748926647881e-12,70.68777555788472 +2023-08-01 18:13:49.064625,X4UODEKL,-9.678310106627812,110.91983698847179,2.7020956614433993e-10,1.897160699414759e-11,178.52115786333883 +2023-08-01 18:13:49.566715,M8UBK6VS,-9.780758461368311,111.64665546147016,1.9123547862475472e-10,1.8872844668750783e-11,203.76896430301665 +2023-08-01 18:13:50.068711,SOTEAL38,-9.85281784084009,112.18087987526155,9.536932493458675e-11,2.3963323715484892e-11,34.139808769606645 +2023-08-01 18:13:50.570761,1EBVQZC0,-10.47973166768349,112.57710815630554,1.7111964494234566e-10,7.735183019970517e-12,31.70041344978341 +2023-08-01 18:13:51.047738,LCOBE0DX,-9.716209235219495,112.004176490438,1.389893436698699e-10,1.5352656284963835e-12,224.51585928612303 +2023-08-01 18:13:51.549874,USFYQV73,-9.64233021356749,111.2877690302129,1.5217618071174518e-10,1.6107766494766057e-12,37.08525288619967 +2023-08-01 18:13:52.052097,IA6LK120,-10.611607115011548,110.56618416014345,2.2565940957155912e-10,4.160213443163726e-13,137.02140724710523 +2023-08-01 18:13:52.554187,7CFS50U4,-9.690608670386608,110.12138308026283,1.9662344205267507e-10,2.2915750707316207e-13,352.5498320525875 +2023-08-01 18:13:53.056335,Y582X7DC,-8.910698466255571,110.55350292714996,1.9937793114282854e-10,2.676456852721736e-13,29.35600290531096 +2023-08-01 18:13:53.558529,JMXSHL1R,-9.579804846430664,111.26397754144618,3.346448092641614e-10,1.9481594389081157e-13,227.42603412200026 +2023-08-01 18:13:54.060723,6EMKW108,-8.621398271899828,110.69895197883703,6.660393717950468e-10,3.4130301074470865e-13,255.62896193965855 +2023-08-01 18:13:54.562802,CEUY0T3P,-8.005289635475393,111.00195157045887,1.2006181402702175e-09,1.1686868199618243e-13,154.15548317426487 +2023-08-01 18:13:55.064978,PEA6T47J,-8.917559220995374,111.52060246265411,1.4275315075671812e-09,1.4376638475901333e-13,196.14407247514515 +2023-08-01 18:13:55.566871,LEVYHWBJ,-8.200703118874776,112.21303510132206,1.303634886402922e-09,1.635953904561187e-13,338.1341960453177 +2023-08-01 18:13:56.068742,CAS594JG,-8.952849821192045,111.37006668046149,1.8916910734316106e-09,3.02484178270341e-13,328.3891948827908 +2023-08-01 18:13:56.570904,0RL3MCA6,-9.133517853755103,112.30644629244195,2.798193437498422e-09,5.982952100374339e-13,332.4327539674791 +2023-08-01 18:13:57.048004,21Z596RM,-9.496569612735508,112.29076479549586,5.113515275702739e-10,9.54102310111109e-13,85.66826302555495 +2023-08-01 18:13:57.550082,XAMJ71SK,-8.974217103132695,111.64768301364904,2.0709481259737212e-10,4.486935457141337e-13,50.56044841686344 +2023-08-01 18:13:58.051979,672BPHUW,-9.358956636583908,112.28562515566082,2.3603631032788266e-10,4.0914042672300626e-13,57.59922122485654 +2023-08-01 18:13:58.554147,WGTNDE1L,-10.069532303311973,112.50856173188046,3.438142018091741e-10,7.916869750648357e-13,98.62897057033993 +2023-08-01 18:13:59.056314,6CS3VBHI,-10.808463671491621,112.8067582524545,6.086473225786179e-10,5.273556644670958e-13,219.47896405294173 +2023-08-01 18:13:59.558445,7A3SG2T9,-10.04462909777282,113.1939453541384,6.886713433504598e-10,9.841090249102024e-13,323.83283654959297 +2023-08-01 18:14:00.060438,ARXT251V,-10.100081452835028,112.43879158646462,1.0388750320403988e-09,1.4428584863853086e-12,242.97603687665492 +2023-08-01 18:14:00.562539,U32OTX46,-9.864283460379873,112.16611984545266,2.032800312854216e-09,1.9021464145906803e-12,223.94048862904037 +2023-08-01 18:14:01.064631,MPV0ESFD,-10.63797258557176,112.49420307934625,2.6520478209221463e-09,2.666357046462457e-12,59.99205397580829 +2023-08-01 18:14:01.566725,KWYVIE5G,-10.989256657531225,112.81152332269467,5.17772752323772e-10,3.5265230460396474e-12,60.78826219966147 +2023-08-01 18:14:02.068858,B6QUIFAN,-10.768881090395682,112.5851423168413,3.597499562032389e-10,5.30048804829803e-12,229.96244210038415 +2023-08-01 18:14:02.570924,3CK5EVX2,-10.373445025576405,113.15758167638877,2.3895921488270402e-11,1.577803302044588e-12,279.0340718845983 +2023-08-01 18:14:03.047933,UC5OPWJ7,-11.11305749019979,112.72604141777899,1.1075904661943695e-11,1.2524357334430753e-12,39.82970165316533 +2023-08-01 18:14:03.550025,K7VBJW0T,-10.95921108419819,113.26066266188258,9.351037109541982e-12,4.509290739237783e-13,274.5484402338117 +2023-08-01 18:14:04.052084,EVQWOX13,-10.17355690120914,112.87924008404434,1.5398127432886424e-11,8.915752106939639e-14,67.13588356724915 +2023-08-01 18:14:04.554177,TP06G5BI,-10.404637581781003,113.01488812878652,1.934069305809917e-11,8.680185270057207e-14,181.91333186575085 +2023-08-01 18:14:05.055995,QAX1W3MV,-10.28166160799043,112.40293810915938,1.4035827178727172e-11,3.2430948039311072e-15,47.11145655476389 +2023-08-01 18:14:05.557869,ZO32M91H,-11.017697108639089,112.22491996652809,1.8380325667212967e-11,1.3261064994995573e-15,129.24903762929256 +2023-08-01 18:14:06.059418,NMLI05Z4,-11.809722607212237,112.03118610876567,2.8464173586122517e-11,5.183591434688454e-16,296.54712881433886 +2023-08-01 18:14:06.561135,DHTV92NY,-10.966904891073083,112.9986966195729,5.0768297648330615e-11,4.121604460623105e-16,345.9530689152131 +2023-08-01 18:14:07.062753,JRC5L46B,-11.740816170380679,112.81584027970042,1.335475570056835e-11,4.918165071612034e-16,287.70701283631706 +2023-08-01 18:14:07.564867,85HQOF29,-11.415203712099421,113.74060954557443,4.353962474463834e-12,7.935724527069188e-16,155.38810248844925 +2023-08-01 18:14:08.066846,CLODV7AW,-11.216447282832505,113.8704197011961,8.304376450519404e-12,1.4746023705793944e-15,233.2753246038452 +2023-08-01 18:14:08.568338,20HEB9P1,-11.456255903204598,113.86036752678615,7.594216460587887e-12,2.2259800282552684e-15,37.504664138159455 +2023-08-01 18:14:09.070114,A1DRSC76,-11.729815135722694,114.54202963111487,4.283054701040356e-12,4.39164027977176e-15,147.64077737403278 +2023-08-01 18:14:09.546844,QN45CAKM,-12.536014611566843,114.52645225971723,3.5691656348990515e-12,7.364504641408066e-15,246.84323947366846 +2023-08-01 18:14:10.048863,2CUI5786,-12.193998225296404,114.40726943987144,6.133634728385708e-12,1.9936358215799777e-15,107.30089994349999 +2023-08-01 18:14:10.550845,6HB5NXY3,-12.884870350804801,114.30176252852006,1.169996447085345e-11,2.503069751198298e-15,244.1132671485783 +2023-08-01 18:14:11.052952,49C0I37J,-11.986041501560992,113.3708987668438,9.561533468162243e-12,4.4690629070081215e-15,34.18210003748993 +2023-08-01 18:14:11.555041,Y69ED30T,-12.560145285825637,114.31177350172628,1.3199774480512847e-11,7.183050366613537e-15,350.50575628697374 +2023-08-01 18:14:12.057167,F0HEW91D,-12.537622009995031,113.7378059367775,1.725364371552036e-11,4.627028350424729e-15,145.26926886438127 +2023-08-01 18:14:12.559228,0ITRO4L3,-12.839232786234273,113.11547721214964,1.8025047453612023e-11,2.781340009581261e-15,152.36059818409396 +2023-08-01 18:14:13.061341,WYB1X63G,-12.697554326747788,113.66472228210176,3.048718263732984e-11,2.64105694774529e-15,225.58228162572675 +2023-08-01 18:14:13.563487,84W9ECQ2,-12.884079039398582,112.6727711199104,3.08538628322624e-11,1.2331730842107586e-16,350.1422785384137 +2023-08-01 18:14:14.065570,DSQAUO3C,-13.156283548468732,112.0879745145389,4.1937491302789165e-11,1.0473920907812642e-16,162.5562239383106 +2023-08-01 18:14:14.567610,G3VFPNZI,-12.432921675152771,111.5886093068213,7.6347270311816e-11,3.395811543206816e-17,149.8214488276783 +2023-08-01 18:14:15.069641,4JOHIQ5V,-12.812137430912182,110.59840047732611,2.3658282058382552e-11,4.259949684758833e-17,281.1818213520937 +2023-08-01 18:14:15.546419,FIVOU2WH,-12.985133012236645,111.03894903044313,3.305065500877411e-11,8.171063396491455e-17,296.28968693405926 +2023-08-01 18:14:16.048438,86PIET0V,-12.598061326393976,111.95724048889896,6.013154159274553e-12,6.143810664990415e-17,274.23032403715297 +2023-08-01 18:14:16.550447,J4NDXUT9,-12.976774514171789,112.21759486541386,3.807088626509098e-12,1.1222774763100955e-16,15.446193414797563 +2023-08-01 18:14:17.052645,OQ1US40V,-13.647077504851271,112.36190770931532,3.3472918741706996e-13,1.7852685420812157e-16,36.53458271800218 +2023-08-01 18:14:17.554766,09D51XJE,-13.448970340603058,111.36226502175121,4.952102775546094e-13,3.397103112466973e-16,230.9362391897744 +2023-08-01 18:14:18.056942,AIBE2LDJ,-12.509200157296942,111.61059009267198,2.1556021693825117e-13,4.607649397769064e-16,221.7857642033399 +2023-08-01 18:14:18.558933,W0AFRGPX,-12.967177753490642,112.4457578406163,2.657077888068288e-13,7.030425883096171e-16,166.74002122706838 +2023-08-01 18:14:19.061158,E4QXFUY9,-13.614314520358905,111.67496602039215,6.775260544266693e-14,3.410019319647606e-16,104.36700880869807 +2023-08-01 18:14:19.563300,RM8X1Y4I,-13.642401129896236,112.35665172814751,2.217502549869375e-14,3.353762474096539e-16,39.025080725080954 +2023-08-01 18:14:20.065434,BHU5R9I1,-13.852449919704288,112.7359344119738,5.102357571956159e-15,3.031378661257052e-16,351.7295807449556 +2023-08-01 18:14:20.567459,LG218F4V,-14.285560330295594,113.25761786010183,6.526849809560546e-15,3.9683244191779125e-16,54.89535636752839 +2023-08-01 18:14:21.069635,SOKQE6IU,-14.69775190257132,112.43148658321165,9.024563803869466e-15,1.7246119509236854e-17,344.49944708404325 +2023-08-01 18:14:21.546716,JN3YHF6L,-15.34120132688482,113.12907176176152,1.573268305058458e-14,4.08922602461586e-18,189.63488413243033 +2023-08-01 18:14:22.048839,MCQSWZ5P,-14.700352089549302,113.75715420229278,2.0819157032580634e-14,2.6148592427172073e-18,246.394223576366 +2023-08-01 18:14:22.550911,VG14QZUC,-15.370526952737471,114.6048708979293,1.4885365225376518e-14,5.075565729534026e-18,175.63076316164825 +2023-08-01 18:14:23.053058,NOQH763J,-16.268837331879226,114.92274885223924,1.1320588275417464e-14,1.175163465499021e-18,161.08247970504203 +2023-08-01 18:14:23.555182,9CUBONT7,-15.411714914158784,114.71810168042315,1.0011309289829755e-14,1.4110555284799503e-18,209.34750998112636 +2023-08-01 18:14:24.057364,5RFQ976Z,-16.012016148111094,113.84690777444659,1.9538059989098473e-14,1.9218384047234935e-19,322.78335809216316 +2023-08-01 18:14:24.559675,ZXTEVY4W,-16.65625303812292,114.56230761401504,2.7391834417304202e-14,1.6287557376748727e-19,224.60176347303673 +2023-08-01 18:14:25.061844,XM9SUH54,-16.824284735952773,113.94002533709367,5.1404802357757004e-14,1.1257634287260877e-19,250.44407489163657 +2023-08-01 18:14:25.564029,2AGN5MI8,-16.717110046732518,114.29436978333523,6.564607344229869e-14,1.8989372638373553e-19,356.94647503964995 +2023-08-01 18:14:26.066229,0TI1YN2C,-15.914044495956574,113.383032217895,8.010326707991528e-14,3.323785315018474e-19,348.5950020459413 +2023-08-01 18:14:26.568419,9C65YFM1,-15.086530403597859,113.06208873759645,3.837465227091685e-14,6.104739528660779e-19,349.9367270697403 +2023-08-01 18:14:27.070613,2QIVPCR1,-15.612895632316095,113.90474722595582,5.819704863456069e-14,7.651156967630887e-19,67.63224326341935 +2023-08-01 18:14:27.547687,OT6SI7KG,-15.001872198748867,114.12348231830002,8.378464740650815e-14,9.14458626488859e-19,55.3263998249962 +2023-08-01 18:14:28.049808,NBP4Q103,-15.075080751291313,114.69514533547508,1.596043224174605e-13,9.868739309299298e-19,5.886130401668197 +2023-08-01 18:14:28.551988,NBFM7KQU,-14.084696338084457,114.1360261963056,2.1497864066059783e-13,6.635848010842708e-19,54.25906585268803 +2023-08-01 18:14:29.054210,UGYI762S,-13.499025562378687,114.78515639310814,3.6956643599680454e-13,6.624749062937857e-19,149.40129645355586 +2023-08-01 18:14:29.555916,YIEBKFU3,-12.903164122658602,115.1932044330648,3.948603825424286e-13,1.0050038022309082e-18,170.99538631086946 +2023-08-01 18:14:30.057818,IPV4H3XK,-13.621188799028912,114.82403997600899,6.555673286730731e-13,1.1676187407707114e-18,123.60004606278369 +2023-08-01 18:14:30.559650,BNAOYEG2,-13.127837140995616,115.39947321054453,1.2553539783924769e-12,2.1127009013389995e-18,351.4948553703297 +2023-08-01 18:14:31.061777,VRMJKPXZ,-13.017998905771247,114.7679687220032,1.8540106671494623e-12,1.2649683389492705e-18,247.70111803992995 +2023-08-01 18:14:31.563821,UF3CZTRK,-13.885665634193236,115.71034113048614,2.1343334558887798e-13,1.4159720061131122e-18,40.174712550635945 +2023-08-01 18:14:32.065979,C68B3DO4,-13.275243195315165,116.28254786755092,3.853098164530604e-13,2.0567529718843174e-18,342.47741555825877 +2023-08-01 18:14:32.567987,RO24NIXZ,-13.26941913971803,115.29162867041654,5.557789699318889e-13,1.9340806922353745e-20,34.883256544285075 +2023-08-01 18:14:33.069851,LY0GZ74C,-12.89923304679523,114.58818998151149,5.282781888250371e-13,2.1270548568507245e-20,313.3094014709906 +2023-08-01 18:14:33.546795,379VHLMD,-12.8161063646176,114.67641075583899,9.441521560774735e-13,3.159297665746393e-20,153.18022414774373 +2023-08-01 18:14:34.048975,S3WTQAVD,-13.546801171926033,115.24023129670834,1.252744932676595e-12,4.018073904420555e-20,163.57645592137715 +2023-08-01 18:14:34.551156,6V1SCX09,-12.613775057149597,115.5049523030701,7.01072216086746e-14,4.4623240853291506e-20,139.3578391717645 +2023-08-01 18:14:35.053337,O2JA1P5G,-13.03588446265986,116.290749577691,8.925429855883161e-14,7.845027097321192e-20,357.4628243703372 +2023-08-01 18:14:35.555525,WPMDBV0A,-13.130535412151078,116.56188393017102,1.7128807061677177e-13,3.8528428344208355e-20,141.78018176146747 +2023-08-01 18:14:36.057625,CPWEKO9A,-13.614979585535295,116.22458409027885,1.9905391199979777e-13,3.148322243887957e-20,98.74757339643207 +2023-08-01 18:14:36.559696,SU63H4GV,-14.252193286749689,116.63762046414558,3.7742265198150125e-13,1.0159194336291814e-20,328.23447429217754 +2023-08-01 18:14:37.061754,7C2R1VFA,-13.625990243540672,115.96820201667428,3.481079092341088e-13,5.475930255009548e-21,184.57113047605685 +2023-08-01 18:14:37.563956,6Q7YVS5M,-13.691257877880734,115.04778572189421,4.373971707837726e-13,7.098311474492182e-21,109.62413610173041 +2023-08-01 18:14:38.066092,FGXYOVHI,-12.730512737672802,114.23596067218216,2.6370063600499766e-13,3.03054278801837e-21,174.36617151851124 +2023-08-01 18:14:38.568124,7RBHPVM0,-12.175216304666726,114.40701218028865,3.7288023427848175e-13,1.5812342957044584e-21,194.0566055781166 +2023-08-01 18:14:39.070208,8G6S1M3Q,-12.302072013772055,114.57995419291404,3.655143231369634e-13,2.3787562214206653e-21,128.19307962259847 +2023-08-01 18:14:39.547372,PNO5VZF4,-12.84705412600944,115.47093572346157,5.23741401644439e-13,7.079683922109396e-22,91.47928366326374 +2023-08-01 18:14:40.049313,BCSFWUDG,-13.292637556696267,116.31522924700526,2.3399049215790267e-13,4.0120051421168174e-22,341.8055402897445 +2023-08-01 18:14:40.551118,69DEB0XF,-14.171466124734227,116.50319322242802,1.3928808692284547e-13,3.7926758750331737e-22,72.6013203239641 +2023-08-01 18:14:41.053225,7HYA3F5Z,-15.077513962847716,116.41259291161249,1.8307615743466015e-13,1.4347272436632803e-22,284.79399619933326 +2023-08-01 18:14:41.555373,J5YE6AOX,-15.563186388431482,116.27342961798192,3.661691154135902e-14,6.978249558294765e-23,129.23198682421446 +2023-08-01 18:14:42.057487,M8HLR6IO,-15.712837014887043,115.78991254759434,2.3848558379421334e-14,7.56400329068588e-23,87.19861655427599 +2023-08-01 18:14:42.559517,Q07W4DUI,-16.033045434486308,115.85988955309787,4.299044115321418e-14,9.188383530542381e-23,192.24468228399917 +2023-08-01 18:14:43.061534,HK4FXAC7,-15.384454599325826,115.80827538768446,7.312016228557714e-14,7.482671408847255e-23,284.0320495297446 +2023-08-01 18:14:43.563646,VOW8XDPT,-14.837115066465529,116.31595277783289,2.8831523972088554e-15,1.3642174336347425e-22,129.9408096300259 +2023-08-01 18:14:44.065800,PQZYLN95,-13.944428901398794,115.98500809249798,5.557367706972633e-15,1.2414812501287964e-22,203.7946784050515 +2023-08-01 18:14:44.567867,7V29SW80,-12.995035914832993,115.31523770349209,7.748175640271151e-15,1.026742722044786e-22,264.7027320498433 +2023-08-01 18:14:45.070095,XTFKH5ZG,-12.226312047579144,114.65274721867682,1.3612740732084466e-14,1.7816537921058908e-22,151.07762775297618 +2023-08-01 18:14:45.547167,51HCBTQ0,-12.552231930271715,115.54679137062116,1.6380576064833807e-14,2.5316839635556773e-22,172.046416783681 +2023-08-01 18:14:46.049316,C6JMZ8NE,-13.512151902049823,114.54817148123381,1.5979548084566124e-14,4.972678751706705e-22,325.02232745507575 +2023-08-01 18:14:46.551433,XT8KWL02,-13.272374037165447,115.3559902154328,1.4316958629842962e-15,7.863152742396046e-22,319.6922977467956 +2023-08-01 18:14:47.053594,6QZY7XFO,-12.272535001298085,114.6992186636615,1.0458755411924707e-15,9.928619485357966e-22,110.24663336335186 +2023-08-01 18:14:47.555832,S3QNF580,-12.615321165505874,115.1828207304001,1.2620542138534306e-16,8.618217549823818e-22,274.0816452931506 +2023-08-01 18:14:48.057951,XU0YSDBP,-12.975193698325324,114.67095658883748,4.205161871448884e-17,1.5235122757178819e-21,222.49230257180716 +2023-08-01 18:14:48.560063,A1NGUWSI,-13.377181274034575,113.76378116996689,3.306317637052214e-17,1.2470812412544175e-21,281.3685818743387 +2023-08-01 18:14:49.062159,8LWTXKD9,-14.176799915652683,114.59132124664434,1.7895023941817727e-17,6.624276479842807e-22,351.98075892077753 +2023-08-01 18:14:49.564201,ZYFS2Q0D,-14.933886506139505,114.95680031942234,3.3600636874216294e-17,1.1746873270062797e-21,228.7840573121664 +2023-08-01 18:14:50.066323,E94WSJUP,-15.262458725705542,114.06600361283203,5.4710717342443313e-17,2.0831649763479325e-21,317.1254360679451 +2023-08-01 18:14:50.568329,0UQIOC82,-15.259859930529036,114.60502301101415,3.3219253692002705e-17,3.414611296489726e-21,289.11615168041465 +2023-08-01 18:14:51.070479,B8ULWOHM,-14.780924087530366,114.46183260934218,2.6465936526012776e-17,6.5841496609107435e-21,222.46654436983158 +2023-08-01 18:14:51.547501,8G1DM0S6,-14.01981148524081,113.50247114131247,4.950311564259243e-17,8.631194202450263e-21,205.9778166622043 +2023-08-01 18:14:52.049645,Z1TUK3O4,-14.648942903345635,112.82961182361122,6.679544212382656e-17,8.664543858450705e-21,350.176042846512 +2023-08-01 18:14:52.551819,3HA8KT7G,-14.018651575870049,111.89197495007117,1.0198588676905356e-16,8.820919162044858e-21,159.19588067565928 +2023-08-01 18:14:53.053891,V1FATL69,-13.248632185689639,111.27533049533143,9.073878983555065e-17,9.349095460916248e-21,86.03215412627947 +2023-08-01 18:14:53.555956,GR3WLJ2A,-12.781889686991255,112.2748023484209,8.50646335113765e-17,1.4884863774297695e-20,4.5063543158921675 +2023-08-02 11:34:19.530637,1M2YVKG9,0.9523982474872874,103.13366004124043,5450.0956045171715,60.251849312285515,128.06003658414005 +2023-08-02 11:34:20.032689,RDME98SX,1.6579584779377932,103.87207099990252,7152.019033076542,34.05286240849466,198.90375450631166 +2023-08-02 11:34:20.534276,U8M5ZJ16,0.8996891272682286,102.88023668180283,14185.545388381683,21.065204380729018,220.76589135447128 +2023-08-02 11:34:21.036371,VSL71EPG,1.2899117897702241,103.87129815418116,9927.110476544147,28.823617934262124,170.8037231959628 +2023-08-02 11:34:21.538543,TMGXCI32,1.0664336503007386,103.10213978236307,13336.135601779688,29.63045890800509,350.9805328311031 +2023-08-02 11:34:22.040556,GBCH6XKM,0.11674703006362508,102.37045145162732,19312.919631582936,34.75000593140035,222.74784069999646 +2023-08-02 11:34:22.542774,BN37XD9M,0.8211663288739726,101.50192964909344,26777.35947650147,51.91452293355682,244.55533846579195 +2023-08-02 11:34:23.044939,U325G8TS,0.27406792738385954,101.16352981975135,32294.68699600797,56.447394061721226,290.22980866901145 +2023-08-02 11:34:23.547126,I9MXVBZ8,0.3225610600002564,101.45492612066113,28966.90812555822,58.71582411835771,162.60808118748764 +2023-08-02 11:34:24.048999,VI8N2FKM,0.5574844875398477,102.20111982411743,23516.2045371436,106.32144094133983,346.9712966750926 +2023-08-02 11:34:24.550723,BVS1KHT2,0.8849685506765428,102.74086248898521,6342.35135192543,80.65479430874824,289.6731732656792 +2023-08-02 11:34:25.052443,LRM48IPS,1.5691146601377783,101.77746588931792,7213.843852812341,56.92648051730266,2.1095156619894624 +2023-08-02 11:34:25.554270,NETDMO4W,1.8773711885035291,102.59226455032253,1830.9487065834637,82.76579494609055,344.1664041997715 +2023-08-02 11:34:26.030836,0O5DASIC,1.0466061317343587,103.44662307413778,3638.460892742387,4.464438632848072,260.30861948933784 +2023-08-02 11:34:26.532884,J7M6LA4F,1.5466902303857204,103.80528528260997,4718.449396255298,4.3819044513370375,142.1527161299523 +2023-08-02 11:34:27.034996,XG7ID2BA,1.0929262063911,103.62317287251201,9087.360942718356,0.92024033049058,222.26629227543927 +2023-08-02 11:34:27.537168,SR7VXM6T,1.7193548901121352,103.31537217887575,16969.1275179231,1.3661065616008428,307.6333517227256 +2023-08-02 11:34:28.039384,SA2BPC9O,0.7849128471345799,103.69971744925914,9577.619015773162,2.1575708180602615,92.97737983986099 +2023-08-02 11:34:28.541532,K2GH74X6,1.261822542677145,103.13396803079482,6831.396058020943,3.961145953041235,261.44634629332063 +2023-08-02 11:34:29.043582,BYRDT3JA,2.247704215554798,102.6302466111928,3723.676562645654,3.0775691627669395,92.39371664709267 +2023-08-02 11:34:29.545769,PANB9IEX,2.0197984295807094,101.64127680276029,3614.0192938500104,1.4194637755937705,358.0776130153584 +2023-08-02 11:34:30.047904,CTLM1QIV,2.6572687479113615,100.70319249754716,3661.4387315931476,1.5019881645064719,326.3921169639691 +2023-08-02 11:34:30.549987,O0VYIR6S,1.8895026930680516,101.31458692913331,1184.6370572374358,0.9086575704765832,164.3836000180952 +2023-08-02 11:34:31.052091,AW6IF3CH,2.5295298830824975,102.05254206853029,532.1131049525574,0.833106069940669,313.20732340210895 +2023-08-02 11:34:31.554169,BW2FR9CO,2.858478448876003,101.59414229193743,943.0561868176331,0.3699668544392122,138.13223791977208 +2023-08-02 11:34:32.031278,FVB0ZGN6,3.7422846671519268,101.41240815720515,934.6238162641333,0.32127524307851607,344.771859036543 +2023-08-02 11:34:48.864243,UZJR3V7X,2.05972527410721,103.80037111438789,951.100714258554,218.33877915143918,184.96803592461518 +2023-08-02 11:34:49.366782,A8YLGDZC,1.3546210150368196,102.89488328532926,1178.2993504990554,74.8697430153479,218.7048197788984 +2023-08-02 11:34:49.868960,NUK78IAM,1.6582310137979948,102.17321942604367,1478.764577379503,127.62743098174847,295.0994753350998 +2023-08-02 11:34:50.371142,4EKPD8JA,2.077394789321466,101.52772817469193,573.6029330977037,33.00542244790502,229.99183456374885 +2023-08-02 11:34:50.873218,GSCK5HZB,1.0939377415701592,101.93545932555784,212.29191927855868,1.0810759795032823,208.578173226201 +2023-08-02 11:34:51.375355,Q5IPZFU2,1.6039170278564374,101.35220707062747,228.4385752257,2.1051222137968897,330.1453709045417 +2023-08-02 11:35:24.452327,4LO8395I,1.9309103887311716,103.71801691005665,8483.733509145228,209.4617491641281,77.04356140522243 +2023-08-02 11:35:24.954496,1MVY8CZ6,1.5654402957793976,104.6133588329313,3917.632448865681,332.04473290436164,79.9865337040142 +2023-08-02 11:35:25.456488,1R79BQDX,1.3920095984944474,103.67103692276038,1421.5709869510792,592.220280693769,249.34677691249163 +2023-08-02 11:35:25.958443,KET4YZP3,1.6034230208976037,104.60293808735533,2120.5169910743525,391.0776054875564,68.80753689811996 +2023-08-02 11:35:39.986190,W5M2HQSU,1.3347670811756502,104.36134725392402,1386.947542639391,247.05602959293364,119.53066438707509 +2023-08-02 11:35:40.489269,C1MBLNVD,1.7655274899037043,103.7550612667077,118.84240977530658,427.8309330388413,246.5178589923727 +2023-08-02 11:35:40.991406,X4K621WE,2.382982406340571,102.83011473839014,144.95376618105468,418.5122418852167,250.35329677114836 +2023-08-02 11:35:41.493451,894LY1MD,3.101851864851176,102.2407370105587,38.221723478202506,21.03559701948336,211.5219720235117 +2023-08-02 11:35:41.995554,3CH1M4KZ,2.472930714148239,102.5937696877734,33.73361143540015,20.818109872430046,272.226339040375 +2023-08-02 11:35:42.497703,YTRZW9UF,1.6722013877488835,103.54716793752104,16.53775271557271,9.599748570870357,131.73833092927578 +2023-08-02 11:35:42.999862,E96FPMXW,1.255613807866418,104.43094910041418,20.995396064221133,13.641801247722835,154.209178817677 +2023-08-02 11:35:43.502025,TVFR61QK,1.2890373407670368,103.58153240840272,41.210317204232105,16.508254492440948,309.1963292705529 +2023-08-02 11:35:44.004016,LD36PTU5,1.0556966507478944,102.67354372609924,59.35361525238032,5.02755115350258,281.78143105396225 +2023-08-02 11:36:01.707900,UW3RF05M,0.3564925185471781,103.29881697748165,1032.3003420564328,131.8341147321367,319.8727362000475 +2023-08-02 11:36:02.210557,PYX2Q1HJ,1.1891683449328567,103.9515046680292,1249.8271188649708,169.50471569464597,344.80367708279584 +2023-08-02 11:36:02.712699,7AZOS2KL,1.2846182880775745,103.18148368734519,2454.785870940364,220.14359716532843,328.7934735123848 +2023-08-02 11:36:03.214632,76H49FTD,2.106649712623941,103.57745626300873,2762.8713869792737,343.59882805379306,212.99046751281992 +2023-08-02 11:36:03.716687,NOBSP42Z,1.1288546415137761,103.0998699433878,5004.450566199399,611.7736144435884,30.768022945137602 +2023-08-02 11:36:04.218714,SGJ6AVXR,0.3054926724569782,103.9988790867211,1353.0095082023327,408.50758768123865,148.04599252021166 +2023-08-02 11:36:04.720705,MIG4QRYF,-0.47175823780756687,103.19473847298569,875.9434728182905,528.779936122434,306.8234836989916 +2023-08-02 11:36:05.222759,5VDMUWGX,0.4406084738931386,102.31482564132858,903.6000917024487,1025.030237702186,96.33641475556641 +2023-08-02 11:36:05.724828,A8ETSH90,1.4294680880366029,102.27432737095491,582.7740584878891,458.4530606031209,252.49131420201468 +2023-08-02 11:36:06.226842,IX1AP56G,1.7323187256133505,102.04441413374943,605.8928657147848,324.9147935378026,152.30619750644075 +2023-08-02 11:36:06.728946,3D8CKJQS,1.5792443396301823,101.89498603734518,201.05128487135386,369.5963202916026,290.23697983819545 +2023-08-02 11:36:07.205887,UYVAE57Z,1.3324184430602133,101.05941316534064,330.5827413710508,237.38106306664702,35.71647240748746 +2023-08-02 11:36:20.199053,GX0H85ZN,2.0380860017683884,104.68790571182458,2511.128127450904,40.625080290999094,124.73090633453937 +2023-08-02 11:36:20.702132,O8QD12PE,1.5537914133347723,103.72130799555009,2441.7170298762508,58.1498552129934,63.566270653530296 +2023-08-02 11:36:21.204242,P3OIY0T2,1.7132818519997366,103.5748205635738,3349.6304087330304,14.303372809405673,317.06286110788426 +2023-08-02 11:36:21.706404,GYJLP75I,0.7401694956688476,104.32847212837112,5270.871076440372,17.359528156857607,314.1352537677842 +2023-08-02 11:36:22.208527,YSILU096,0.1789217301620447,103.97149544044234,2270.288874802661,23.535179188848712,267.2482010503534 +2023-08-02 11:36:22.710655,HA4N1DU7,0.45288705618690495,103.46864937739343,1653.5142116746513,22.402188706864344,155.54953479520316 +2023-08-02 11:45:33.578045,COIWZYQJ,2.189534051029752,103.92865144568835,435.9500680552428,262.6335318439691,190.99577664774975 +2023-08-02 11:45:34.080456,Y3695FCW,1.7351083208393085,103.64446533320559,392.82631599161095,439.2203745088758,197.89564881627155 +2023-08-02 11:45:34.582048,D93E7YLV,1.050776354697582,104.16740438282106,239.3881739598908,574.375549829722,141.4401406896016 +2023-08-02 11:45:35.084206,HLS1D9M0,1.3939944877516979,104.02920822934996,457.25614018023634,76.36290845448434,113.62785480943518 +2023-08-02 11:45:35.586433,A7UGXBW8,1.9404468394641126,104.3036393639024,659.817027842468,37.19299200361563,131.57543367360157 +2023-08-02 11:45:36.088608,AC0BMS23,1.1676812067068991,104.93527517062726,817.366795266083,17.12720085849997,187.61062360373174 +2023-08-02 11:45:36.590740,PF402RDM,0.7554094500335633,105.30113859693256,790.6350283509373,17.328858995142447,10.50616660961714 +2023-08-02 11:45:37.092875,X6EP5CQ4,1.089540464070414,106.15800809197448,1325.5575850485423,31.13850610236882,167.22846147814926 +2023-08-02 11:45:37.595013,6X19H83Y,1.2965828232992216,106.08298944717042,652.8648410914451,35.154239438119454,150.90924863100105 +2023-08-02 11:45:38.097047,G4TDJWXP,0.9078480721796343,106.41513264145215,566.1173722614976,60.29714830750311,88.56062969321613 +2023-08-02 11:45:38.599128,DW5AEFJC,1.3461362211657824,106.46112239830313,788.8188720281391,89.77806148602266,303.22573563976107 +2023-08-02 11:45:39.101119,2HS9M4E7,1.255775017906249,107.34597766622763,995.4548843060069,154.95158272051992,327.53929467560397 +2023-08-02 11:45:39.578158,G152Q0Y8,1.1437569749565906,106.66560001359268,520.2112595644988,278.5849246849541,147.9689755378198 +2023-08-02 11:45:40.080270,PHF8VSN7,0.5864267672031938,106.92242389600456,416.6559866918267,254.86672431972207,300.8714554557778 +2023-08-02 11:45:40.582285,UZ93EFTI,1.1673772589951275,107.210985690172,268.9708629785396,234.53887037912654,246.58704224327357 +2023-08-02 11:45:41.084105,XQTJO8GL,0.17275608039753654,107.83624617302273,354.53092805008595,114.38675444791198,45.97899900037339 +2023-08-02 11:45:41.585989,3GV5LSDF,-0.14032083379413685,107.85032184253247,300.61131477996054,5.021344875943839,252.15320927046977 +2023-08-02 11:45:42.087953,P243GHXR,-0.28067266024486504,107.90549681872382,314.4317629256324,1.6309190440221402,25.318895966156788 +2023-08-02 11:45:42.590021,QHNDBLY5,-0.8732507674698877,108.09834861708282,241.97878660786031,1.2549209543383506,334.80199990052404 +2023-08-02 11:45:45.236114,4WDJ9OKQ,1.1793361125873383,104.02734926499608,1514.4929427060306,206.5113502251249,30.007012376061873 +2023-08-02 11:45:45.739175,K1IXV2OM,0.4358087424835,103.62784699455065,2620.239835007076,224.99207965598623,133.39821789080418 +2023-08-02 11:45:46.241302,6DSVQW4Y,-0.08888120971486768,103.14812943869568,2773.893473589186,273.64545265489585,310.040044757533 +2023-08-02 11:45:46.743267,WFHI7UQ1,0.2744036346047811,102.73116161127442,5048.394301300845,378.41119732480803,85.19904013032226 +2023-08-02 11:45:47.245304,25VW9AY3,-0.47358320775105534,103.63387471657356,1198.3866650202108,575.4377267329946,195.14658203109258 +2023-08-02 11:45:47.747418,8EFYP60H,0.18453578091182776,103.45955774569195,582.2077952668427,1037.4053642645858,12.649969791419835 +2023-08-02 11:45:48.249472,TNZX2YRK,0.1464086902757471,102.62850826075328,11.658961298362101,2057.310347831269,65.41384691452696 +2023-08-02 11:45:48.751632,BCR0S2HV,-0.21173669712902954,102.68213996811419,20.95539769556174,3285.4911195569166,223.03589570558648 +2023-08-02 11:46:14.152267,B3PVA6JH,0.8785366689888596,103.47842424051906,3611.396038961101,141.92366118567398,228.25005716334522 +2023-08-02 11:46:14.654406,04NASQLH,1.268777957262688,103.01542179487456,452.02488708288183,157.37359716077736,196.65242431093156 +2023-08-02 11:46:15.156496,EOQCM3HZ,0.9948864523364023,103.04253231832317,366.40351216613107,217.56792361279665,299.40915865345164 +2023-08-02 11:46:15.658649,8JU0CNW2,0.013732132253641893,103.24965003354676,74.84694971053574,358.4618948930494,225.7649301540756 +2023-08-02 11:46:16.160655,7PHA8JV2,-0.7140107973634211,102.3720682435079,84.05708587268337,232.14947644950988,303.805513590645 +2023-08-02 11:46:16.662825,9EJQTVLP,-0.3729156868429955,103.22673527572323,106.3410577313909,340.90389519509006,221.46468662603752 +2023-08-02 11:46:17.164948,7MDOHXCQ,0.10737916248404433,103.54309830502037,150.1925408283114,621.5194970375444,233.61805523640675 +2023-08-02 11:46:17.667139,IPQC7OKG,0.9654961648106817,102.6659064301561,237.40984102260444,758.4194060315066,126.52436614033286 +2023-08-02 11:46:20.388212,6HE28XRB,1.771755617043089,104.129007518536,253.83185500158652,134.41094430439534,97.95118230062344 +2023-08-02 11:46:20.890339,P9T4EFK5,2.4248457075305376,103.61465557485843,418.1361298282776,116.92719974633529,335.688629784291 +2023-08-02 11:46:21.392439,AUEM0LHC,2.468322753063191,102.97357184924348,548.8402956585546,141.73730859359245,99.89787396852569 +2023-08-02 11:46:21.894513,FYRP5LAQ,3.137381758322966,103.8510293160533,575.2169731617099,145.53964899192212,105.11680501041492 +2023-08-02 11:46:38.242370,WRBTQ3PY,0.9334250531635309,104.25107427350066,4471.070939488759,16.315205028301975,108.79215732063109 +2023-08-02 11:46:38.744579,1HAJMS87,1.0501323998924286,105.13673408920566,1049.6405344004734,31.27594695191688,86.65825523884831 +2023-08-02 11:46:39.246651,H63ORJB1,0.9105260887854942,104.91831205234104,1987.3348657787913,11.109551848775421,286.8620662338401 +2023-08-02 11:46:39.748766,2DN54XLA,0.6828400046981138,103.98374934180106,162.04513230289785,18.55128805227482,79.7463410910184 +2023-08-02 11:46:40.250884,9KI2UJZG,1.5741522365817286,103.93810020049094,149.87412932118391,20.05573815181486,64.6297309252277 +2023-08-02 11:46:40.753097,TMN86HAD,2.251809138830439,104.00973759168242,113.80553575755462,0.8681960845338601,231.697228100786 +2023-08-02 11:46:41.255162,4X6GMNAW,1.725524066685984,104.45718280262845,81.27155768072647,1.622300815304409,16.123276070021973 +2023-08-02 11:46:41.757214,EK9AC6G3,1.4991712688273735,103.62228783782376,102.32732536622177,3.241882180737812,240.23458776832948 +2023-08-02 11:46:42.259341,JPSKN856,2.377950663782019,104.41364269618059,164.44711796300933,5.199534792679293,263.784736889841 +2023-08-02 11:46:42.761377,VOXPDUCT,2.7225594408181784,104.84234357367208,279.7557187727134,1.65823992892867,257.8151448875208 +2023-08-02 11:46:43.263505,OZ92FRAK,1.9548900853500273,104.11027192216655,478.50440865182,1.7140857576560573,103.76924436792422 +2023-08-02 11:46:43.765733,XPHOJ46A,2.685415476233314,103.52792792329188,923.9464464926159,2.0331079133059315,260.9094241425348 +2023-08-02 11:46:44.242854,2309MDZS,2.475594162867747,104.43244784998869,84.85519224327811,0.24369245238199833,207.56623746124342 +2023-08-02 11:46:44.744938,6NDVQ3TA,1.6826154133664362,104.23486346140864,94.95676324255638,0.11273802247113149,309.89125432225455 +2023-08-02 11:46:45.247031,9GSJOFUA,1.0957518430276632,104.9469157836463,91.61821708779657,0.2050794221665647,229.4360848231895 +2023-08-02 11:46:45.749085,YQBTZOXN,0.5998059868529035,104.619607459843,97.78930071593338,0.017683158303330754,8.793930778541721 +2023-08-02 11:46:46.251072,2ZVOGDEP,-0.0689725470253999,103.87226862245974,140.97177605370604,0.010394206826100255,253.57229495569112 +2023-08-02 11:46:46.753247,RTSXV9YD,0.2655016144598168,103.01594366889168,208.48655963082837,0.012698635787964822,281.97901106628365 +2023-08-02 11:46:47.255389,DHEWFSBR,1.0987228009671621,102.7566207211764,140.3679164765346,0.021391617360758897,331.59020580715486 +2023-08-02 11:46:47.757500,7L4ZN6Q3,0.19802747011886512,103.6799355405598,95.63724034245189,0.018222496769090626,50.4307598503554 +2023-08-02 11:46:48.259621,C3SGT5WY,-0.14192730362230233,104.01781306628375,77.96915609454558,0.007646722981081662,94.7344411717745 +2023-08-02 11:46:48.761806,BW0CNMAU,-0.30278972612437083,103.07998477406609,49.02261199680597,0.003045212847741433,25.580659838995757 +2023-08-02 11:46:49.263983,4WR90LMN,0.42270959142980913,103.79280310120272,60.464998327665214,0.005714266929842762,102.72061110048709 +2023-08-02 11:47:00.907443,XG213CLW,1.0684580044370746,104.38508288243739,940.6311619996472,202.33946318864793,52.59253072444145 +2023-08-02 11:47:01.409675,LWY4OM13,1.0111537091424663,105.06015296313782,1091.9770222658608,29.01781789172682,23.725697153378462 +2023-08-02 11:47:01.911762,U4GYXQEA,0.914585375501684,104.24304651416253,1397.965366603934,22.514950821004703,235.53603245502447 +2023-08-02 11:47:02.413928,21ZXEF0G,0.9228846349986648,104.00877167737288,8.928956005652026,36.80064975318778,326.6145112109476 +2023-08-02 11:47:02.916084,KPWSJYQI,1.1145259383724786,104.92915402329828,9.631164516997044,15.606319761692802,12.482851330168444 +2023-08-02 11:47:03.418098,9ROVXWYT,0.36955990755075163,104.60589823344739,12.98870580956019,30.63639249466316,96.93574982992027 +2023-08-02 11:47:03.920139,68BDKYX4,0.2822614385608755,105.01308390554625,6.985275968395997,1.8678329902030413,20.467329404778525 +2023-08-02 11:47:04.422209,HYUI68RM,0.956642616651296,105.85706930343784,12.65295483136881,1.5034753657248727,342.9385488013229 +2023-08-02 11:47:04.924247,0NTFROW3,0.09329323740000572,106.64780358146953,12.764678978933377,0.5916806310522025,198.02408420660618 +2023-08-02 11:47:05.426117,FR7BKXCD,-0.14296831951542477,107.1920074053766,21.828284537353337,0.030860416683131664,241.22506533403092 +2023-08-02 11:47:05.928153,4LXKD7OU,-0.7166003296781565,107.25959066240678,24.289600741474295,0.03349567120365813,39.40465919934229 +2023-08-02 11:47:06.430191,CTZHINW5,-0.941919541509449,107.15457784164586,6.1887355665861925,0.016813266852452186,165.94880247703406 +2023-08-02 11:47:06.907144,QEHVSDKP,-0.6769165991467638,106.51092149586776,3.718616230963957,0.030706286972991513,168.21760524161618 +2023-08-02 11:47:07.409169,IHSGVK9B,-0.6090148816027574,106.61220508059841,6.4985753051216,0.008596599039905166,9.585759308983143 +2023-08-02 11:47:07.911262,NEHC8OPU,-0.018419302120933123,106.51758179899738,5.216757146119443,0.0032407406124051004,191.12036700136287 +2023-08-02 11:47:08.413392,3HQRAIK9,0.4652434583901641,107.09182363228416,5.816353748623804,0.005406616815185047,158.94433643549246 +2023-08-02 11:47:08.915458,G7FZLXNA,1.2707537540683815,107.14157417777938,9.710629408142621,0.0003236368877366476,217.69730843868663 +2023-08-02 11:47:09.417612,LAXZTHJD,0.8075439571343495,106.35026140443178,3.095710854129706,0.0006408404374567283,38.08613810169783 +2023-08-02 11:47:09.919700,HC3EKS2G,0.08428036753673696,107.25694932770585,4.779247902010276,0.0009097735779533023,245.43120661546732 +2023-08-02 11:47:10.421773,8LGVFSNX,-0.4591674384936886,106.59578602369866,5.524927038266316,0.001648968184203615,92.15699075149689 +2023-08-02 11:47:10.923860,NEIQOSWJ,-0.7443174354634849,105.88422488446142,4.822219923332032,0.0028605318659050936,279.4664178955562 +2023-08-02 11:47:11.425981,OM1ZHGXU,-0.14310783053049847,104.96921535318263,8.985016402533699,0.002706981388674052,58.92706645666976 +2023-08-02 11:47:11.928089,EHI6QB5T,0.1997607942696975,105.78145161981006,8.734751163512268,0.002804539134259937,62.989482657384045 +2023-08-02 11:47:12.430168,FGPQ30YZ,-0.3181700179215172,106.602850060514,16.715314360203504,9.996502859066113e-05,74.65417312928697 +2023-08-02 11:47:12.932189,IGQ50VY4,-0.3078557781003446,106.93670397303464,8.008616446400518,0.00016051072902370067,269.0037800946304 +2023-08-02 11:47:13.409239,ZPUBKG1H,-1.0473810360181752,107.02772332135775,2.6844766392063626,0.0002512625513542297,10.123986432195352 +2023-08-02 11:47:13.911329,08CHJFVK,-0.773494525457503,107.85585609819209,0.745337519212619,0.00043808751071886643,126.32774509212427 +2023-08-02 11:47:14.413359,36812WXM,-0.9900049038060628,107.76217432670568,0.020290019194790232,0.0005527427024097723,340.9538455357332 +2023-08-02 11:47:14.915532,VI465SZG,-1.697263830292269,107.15463861641182,0.005997831377218132,3.8788918950486014e-05,249.89325060437636 +2023-08-02 11:47:15.417652,CHBY7KWE,-2.293793901383859,107.63081065312682,0.006877322057226386,1.91628721270662e-05,332.4123638257537 +2023-08-02 11:47:15.919740,K8A9I2HE,-2.241733356768875,107.48221415214654,0.012176855000197736,1.3245290607756698e-05,207.77861958588028 +2023-08-02 11:47:16.421829,MB7OJAHK,-3.041899858259156,106.99470884497818,0.017967182003386907,5.558255605726792e-06,268.37066906246963 +2023-08-02 11:47:16.923901,R5TJY78G,-2.7299369389345327,107.7424869556556,0.02586476164235405,1.0915834016909853e-05,180.6813513753034 +2023-08-02 11:47:17.425969,8ZYI4C5K,-2.9713609749437486,107.75952277677192,0.04477103905363189,1.0001450929218153e-05,155.48715678704605 +2023-08-02 11:47:17.928055,BNHW1SQK,-2.2789583231782418,107.66447856054491,0.07898190499558112,1.3971840434049854e-05,68.01386036540077 +2023-08-02 11:47:18.430085,7LP9O2Q6,-2.6177463887257275,106.80702985242277,0.1212018921952932,1.7962267479105232e-05,142.91641243060602 +2023-08-02 11:55:50.504389,7NT4FPH1,0.9749950332515209,104.61389557373185,5472.471676077667,115.28670897691434,226.71725483304888 +2023-08-02 11:55:51.007805,KTC0UV36,1.6552569256779301,104.6535948061598,8836.562522223758,30.6618563886947,163.40983916306266 +2023-08-02 11:55:51.510045,HL42N59S,2.4251747078492834,104.79413088907386,152.04493243035904,40.158457635812766,352.1278676265488 +2023-08-02 11:55:52.012300,CKSU3IQM,1.9247937696642055,105.20117153008655,82.42187546956278,55.61728850575987,207.76624465056352 +2023-08-02 11:56:12.319146,93NS7UIZ,1.2517557809711364,103.68146084461651,9452.000092958655,101.36054923146058,121.71531066397992 +2023-08-02 11:56:12.822409,829ECHYS,1.4772579554920566,103.10338844721363,16451.54727557961,95.51811534910293,38.73944203352812 +2023-08-02 11:56:13.324699,FWR2ZQPK,1.4859274236278441,103.97765379059211,23444.944179368267,188.92556465529057,107.48873968560457 +2023-08-02 11:56:13.826840,LY89S3OC,1.086371403876043,104.69871354025236,365.83336041466464,213.70716695764105,255.132294131395 +2023-08-02 11:56:14.328519,C8M7SOA5,1.795247860819947,105.12499562454596,550.589501554867,199.38416595705988,221.68413266839002 +2023-08-02 11:56:14.830226,QGEV12XU,1.474181250706683,105.48758711903639,338.3741079883782,197.48213335745083,298.0890817243059 +2023-08-02 11:56:15.332404,XJ471HPF,1.2901776119058017,105.19350138516116,256.28627733806854,361.4747036356434,1.7092359093029472 +2023-08-02 11:56:15.834609,CAPIZXKS,0.8162249351904451,104.51952922015572,33.3262742776935,469.72111568496524,289.30597016175085 +2023-08-02 11:56:21.526371,12G5JXTR,1.0704043196803457,104.80944178620112,7521.8694737396545,212.62096162341365,204.03664689734265 +2023-08-02 11:56:22.029729,I7DH3B92,0.14509068395371028,104.89521938061489,9.534549931697256,26.867865072283195,33.09763492828654 +2023-08-02 11:56:22.532035,EIAS963V,-0.26468098869825885,104.04225386686183,8.670713918840768,18.942684907289227,309.2459970207728 +2023-08-02 11:56:23.033800,H4WFN1B9,-0.14613249829857677,104.43267647713665,0.6731357424357336,9.914516148094116,290.2231770414227 +2023-08-02 11:56:23.535832,P16BDK7I,0.18401088098620777,104.64267545716845,0.9501868508739725,18.962798776864304,275.76299386759047 +2023-08-02 11:58:01.108235,4TZ8EXLF,0.8494156414939047,104.50261847557485,7344.373521209788,34.25920195367462,282.653295997006 +2023-08-02 11:58:01.610723,X0YLZOSP,-0.12013759359820542,105.33733490917001,11266.91737525547,61.67731638347634,57.92585546368991 +2023-08-02 11:58:04.450020,P2NR1IXB,0.4477029367348315,104.42022137175249,8742.24043533005,219.7914990464657,207.00736570048812 +2023-08-02 11:58:04.953309,MHCYVEAO,-0.5248723818507395,105.08247395580688,12442.76562566802,239.53324134902405,124.90525727544673 +2023-08-02 11:58:05.455747,A5VITRL6,-1.4302713960306461,104.27024967439736,10561.125926564908,326.42515310376757,29.83472699422191 +2023-08-02 11:58:28.302704,UGH3JSZQ,1.1654467718540027,103.39699168467158,10016.363349283925,62.01733851300992,151.49964052212164 +2023-08-02 11:58:28.805428,RS9EQVTU,1.3850923086109657,104.23058906878752,2576.3670649221995,117.2326877117104,217.43740017216885 +2023-08-02 11:58:29.307667,FVMZRP5W,1.6437348643119387,103.46774855609756,1943.4715030102882,225.0954422684136,112.45534087324461 +2023-08-02 11:58:40.469492,UCLYHXGW,0.41018535225990505,102.99977744083189,1339.727260358516,58.51799566932573,334.4247255783281 +2023-08-02 11:58:40.972457,KIDTYL3R,1.0962336310453955,102.1699857385219,1510.3584281922585,31.44787446493779,247.42992540082946 +2023-08-02 11:58:41.474599,YOAP2U3D,0.6329425209418891,102.73902910420215,1971.1357900410273,50.790771853571,309.5841804931094 +2023-08-02 11:58:41.976685,5Q7DO0Z2,0.8910377490122026,102.34078867043269,1924.002199806957,92.91427631877715,102.27039566088047 +2023-08-02 11:58:42.478657,T6S0YW7I,0.047825825016251544,102.80139207906599,1877.4245105984203,181.43604065712802,201.05645370031772 +2023-08-02 11:58:42.980813,LMGH7865,0.9379173636684415,102.05306109385033,2777.985459867226,334.8139755342166,37.338800961204925 +2023-08-02 11:58:43.482765,MACQ0ER8,1.0445082037774465,102.62681743856959,1498.0494669825532,379.9405899891958,164.0272446332442 +2023-08-02 11:58:43.984685,XR3JK8N5,1.9773609095021414,102.17542913035554,1187.2580651998437,89.96152258396876,136.14809110158086 +2023-08-02 11:58:50.203673,LD74RJ1M,0.9380777986980837,104.53110486306544,7593.704154790347,210.48305570242442,139.82468698015364 +2023-08-02 11:58:50.706077,A1UQGD6X,1.6707710270188545,104.75735529196758,13527.0524398158,47.95610510613966,62.54531155145776 +2023-08-02 11:58:51.208215,3GC86T07,1.2944454153953364,105.13607783084116,24009.826635060177,6.233128479029979,146.23813341670498 +2023-08-02 11:58:51.710367,5HVO7SW3,1.7973075853274105,105.47802525077802,29325.205391264662,3.5816760612610112,81.13967000152661 +2023-08-02 11:58:52.212272,Z5W7FQU6,1.2313414715930346,104.86241866310665,48224.599474623894,0.8735657499300147,234.42443829954908 +2023-08-02 12:01:25.432251,ZWA2R1J7,0.906526075043969,103.17299378049432,1768.8414370527712,175.82496216617403,182.6157251979444 +2023-08-02 12:01:25.934751,3UMFX92A,1.8436410446387033,103.59563537255625,2405.9045547389583,39.536195645170665,21.749979046973863 +2023-08-02 12:01:26.437000,6OQW59YZ,1.9245744458457428,103.59153111853954,1961.6448643871345,34.89899435104318,133.55361657443365 +2023-08-02 12:01:26.939137,XDRIQAW1,1.7917159456136327,104.10399657376159,2040.2969982568886,46.8971909923643,252.60591755470503 +2023-08-02 12:01:27.441283,YCZV21AK,2.033884164137014,103.53519480082895,3257.050247956517,69.66737282837528,218.9436603021369 +2023-08-02 12:01:27.943465,GWZ71L0I,1.885402036731607,103.1030609417406,4577.373367057944,51.0765669161044,282.9973800765501 +2023-08-02 12:01:28.445565,3V1KTAQ6,1.4058184707691845,103.53610223352683,149.0532633870398,76.26396180694394,334.68242087005194 +2023-08-02 12:01:28.947651,2WR398CB,1.264914542365858,102.85227489616483,128.49257105060258,35.54589570314239,153.25134526149895 +2023-08-02 12:01:29.449739,JQX13L5H,0.6990450894108537,101.92438044216978,97.98482514404621,41.39291570399096,207.46538548630065 +2023-08-02 12:01:29.951820,IBR7SDZU,0.3559783288698779,101.70313332265928,111.13380426124154,42.05586481279865,187.76019997562855 +2023-08-02 12:01:30.453978,N8KTPJH7,-0.24116511480029157,100.79162040140372,53.26775937821541,77.26682507588045,299.8649716003378 +2023-08-02 12:01:30.930825,CHL8RPE7,-0.06962159705565196,100.4323065426364,41.96445556482126,50.57181518264248,215.5582018760099 +2023-08-02 12:01:31.432863,AO6HV5T8,-0.480779500328089,99.49259792782267,63.28050369366691,33.2627974530426,85.20450078689407 +2023-08-02 12:01:31.934683,EWQ5U48Z,-0.7887371341268588,100.25902370919344,64.22164885305887,25.635362836901194,293.03874224236995 +2023-08-02 12:01:32.436609,2LRSKY6F,-1.696671258764405,100.34080162483673,80.90713003271412,48.3687134101666,70.89905552503666 +2023-08-02 12:01:32.938631,6JNRHMBG,-0.9788400010531328,99.58843704196633,75.05889909384923,72.26956077825243,129.3494892479289 +2023-08-02 12:01:33.440342,MZ0IBJ82,-0.6782086674473831,98.71490309513374,82.23290879750725,116.98548719604807,210.05325529161348 +2023-08-02 12:01:33.942400,JK3RCB5Y,-1.3519036983031105,97.91728790703215,116.19729325577748,225.8308296042013,197.78211686910254 +2023-08-02 12:01:34.444378,B24S0GRO,-1.2154760297413711,98.8164458531594,52.974655617669896,370.01001298066484,221.29918347249432 +2023-08-02 12:01:34.946517,RWOZQUSA,-1.4677706871421612,98.8796186722846,96.58757422822114,465.86420704563307,221.98853623864508 +2023-08-02 12:01:35.448591,QAM3L748,-1.8383853904699547,98.74716081587684,25.927806581888433,87.42795967877129,109.27659940694292 +2023-08-02 12:01:35.950578,HSZOT0WP,-0.9380709663054185,98.64271790491826,15.416576777686448,138.25766937316087,325.40749110205564 +2023-08-02 12:01:36.452573,H3KZ7B2Y,-1.5580262672786391,98.49089600006599,24.56824136238975,268.61303036752145,59.58788643496683 +2023-08-02 12:01:36.954543,ZVT8PY67,-2.1048689766467423,98.1369891140811,43.06905484611301,22.50653779689577,195.1763174368587 +2023-08-02 12:01:37.431587,H13EPS5O,-2.5062847050254335,97.77397129767988,57.98975443369486,17.5196478385024,172.19529606311653 +2023-08-02 12:01:37.933681,VIF37X8S,-1.8960418475050047,98.45557484336783,58.89503673623084,17.270243455556102,221.87156071969213 +2023-08-02 12:01:38.435732,Z01QFCKA,-1.2238816736904699,98.44860085779723,51.20301439564659,32.04918162883934,223.15371827170992 +2023-08-02 12:01:38.937795,I0WM5SAV,-1.079929734720591,97.7340614169293,46.15407031567734,9.738234851195877,55.13585630927696 +2023-08-02 12:01:39.439942,GVK6DIAT,-0.24018938300413528,98.62027858925694,70.9867000648027,15.665406706814442,116.87024078697814 +2023-08-02 12:01:39.941946,AEKDWXH0,-0.19679871967683682,97.7712074179842,118.73259023350097,16.179958968522584,254.28850674102733 +2023-08-02 12:01:40.443841,GW5OKA7B,0.12195804926914855,98.70785266048156,75.35373591352659,21.48117450149628,29.54670656046892 +2023-08-02 12:01:40.945990,H9DF2OQ5,-0.032323598440198165,99.21407384150876,88.97272400798076,28.89053068096665,82.09039061963497 +2023-08-02 12:01:41.448038,FNW9YO64,-0.38526030042784765,99.58427070648578,86.60490575349918,26.811442424493478,292.9627565804939 +2023-08-02 12:01:41.950153,6MRI0YUC,0.5236684371126488,100.0374434211395,55.27734150378572,11.847129958606855,219.32757386974185 +2023-08-02 12:01:42.452089,HQ3ED5A8,0.0817473754607132,100.43460501019995,66.23526023258674,21.608129258281192,264.05778464338573 +2023-08-02 12:01:42.954155,DAECTXLR,0.3611752793077341,100.28496006511885,23.29505329976805,16.890342003580905,31.375348466488617 +2023-08-02 12:01:45.818244,49S1VBH7,1.4079299174781434,104.14886451923176,9202.850450370599,108.69995210177522,177.2216362706162 +2023-08-02 12:01:46.320497,NSHPO7VF,0.96626141889535,104.00008405847893,14765.429812205764,69.4656128761917,357.3919259665777 +2023-08-02 12:01:46.822669,J9GTDEUY,1.8394280051203022,104.4182501029899,11194.067597340112,138.4010556086551,53.94627924844201 +2023-08-02 12:01:47.324801,NAKD42TU,1.5172004774353727,104.93349046247857,1654.9279246316928,243.5566796998519,232.2617307272068 +2023-08-02 12:01:47.826842,1Y5HODPI,1.358688120495376,104.17988343024672,2499.029288361751,90.30932542470353,223.29079772571265 +2023-08-02 12:01:48.328895,NK7F236S,2.358183531375561,104.83021748231906,4412.442499590906,66.50999224907925,101.2251279785142 +2023-08-02 12:01:48.831039,B1FQ8MJ7,2.0500928235720295,104.73481218170056,611.724385502499,11.261643831996516,170.6411262529324 +2023-08-02 12:01:49.333263,0CWGEB1M,1.6181986638352879,104.23739845508393,871.6045862685763,22.40226085108454,136.36808476076783 +2023-08-02 12:01:49.835408,HL0TF38R,1.4702118098063184,105.15246990753845,591.7309663413323,33.622774999432224,142.28209562259664 +2023-08-02 12:01:50.337289,E06Z7YPM,0.8750442514436303,104.42665037552797,904.099462309407,22.15407738219008,329.391683038991 +2023-08-02 12:01:50.839242,AV18JQ2S,0.47733293501110685,104.50702512725685,314.82130544878237,23.264164980277954,349.1633375652959 +2023-08-02 12:01:51.316113,HLN9PJGT,0.5443472957622768,104.57088498903549,378.61598682149224,45.84681883311012,293.0222441711783 +2023-08-02 12:01:51.818133,5TVXLYQ2,1.3782880072333283,105.4474834086773,371.6668286557855,45.45113583867221,48.81398181119556 +2023-08-02 12:01:52.320181,2WLG0I8O,0.996121371276691,106.44575592858531,659.5829288863073,5.9713783487621654,335.81487594373993 +2023-08-02 12:01:52.822136,0OVG5RC8,1.6017361872350895,106.67633238263384,1172.2142501881838,1.4989155394009588,203.58207628468745 +2023-08-02 12:01:53.324095,7503NLFU,2.4815495764031787,106.35598658005667,326.46586971441,2.5497053011302535,279.9003369619136 +2023-08-02 12:01:53.826138,2IEBY6JR,2.6556886435443925,106.59759640051357,376.9785456807627,0.7838979538184714,248.94396377260432 +2023-08-02 12:01:54.328294,DY93XBT6,3.086768404895655,105.8610967524801,7.709444234815578,0.4095268613108477,231.68289738376257 +2023-08-02 12:01:54.829957,V172RUGC,2.168729438334528,105.7229735283318,11.622176596631162,0.460583949032358,96.8729534012532 +2023-08-02 12:01:55.331668,GXTAB8RC,1.4335470473409675,105.03549707497328,16.76211173381155,0.5432174145695519,292.0309106570195 +2023-08-02 12:01:55.833588,NS053GIZ,0.6351673286534276,105.24358589869249,13.569555384587325,0.47962580006586036,240.80419425156015 +2023-08-02 12:01:56.335734,TVBOQ90U,-0.11377069611912694,105.0250849618839,12.035330360194935,0.6258666405038296,7.506710595870743 +2023-08-02 12:01:56.837843,G3R7YCDN,-0.5679547819799935,104.77914844065056,17.082133215428886,0.693854365583545,322.60039447049405 +2023-08-02 12:01:57.339956,87PCAYM2,-1.035375307479556,105.60429230588935,32.95715971139909,1.1534033016598084,52.68032059055912 +2023-08-02 12:01:57.816979,8UXW30DN,-1.2083884416381376,106.13016233595003,45.549658188579706,2.168463117433112,341.5442019284155 +2023-08-02 12:01:58.318840,S5RGAFQT,-1.6751087833464393,106.05525507519079,56.46343158150936,3.349842365928938,111.6649187662731 +2023-08-02 12:01:58.820588,VXM3B1TJ,-1.736523703268661,105.15734591312918,22.786707635000134,3.6913395670802345,186.90915122730541 +2023-08-02 12:02:25.060307,PV5LA2NS,0.874918701618489,104.7654405983974,7109.220397230558,176.26892435004447,184.28639865276938 +2023-08-02 12:02:25.563423,U32W8V1P,1.8012136549372786,104.90354363890535,2867.0525029663513,322.6915603179393,327.0686865524993 +2023-08-02 12:02:26.065594,6VZGNP9B,2.7236542923860485,104.37635669220673,3850.4293185511947,396.4817189586004,18.857763067991527 +2023-08-02 12:02:29.571949,FMCOPJIH,1.5307243215423336,102.84766312610225,8129.7867299862655,86.51001858039868,280.9604725840433 +2023-08-02 12:02:30.074169,KYVM5Q3G,2.3794559057618168,102.65914352746431,5558.772435018413,163.5041134269147,65.9839867346945 +2023-08-02 12:02:30.576291,3I7XCJ2B,1.5041189328531113,103.54171408755747,766.0840233289528,21.899901838895204,99.44175066758852 +2023-08-02 12:02:31.078318,J34A02OV,0.541156132760171,103.53686507821268,1448.0447533088127,15.178915000083418,46.312077629534826 +2023-08-02 12:02:31.580487,3ARTYJI8,0.8661725752986917,103.39008793042856,2272.870005144703,2.209199333952652,12.159629136475303 +2023-08-02 12:02:32.082715,S6NVWLOD,1.6838275774248381,103.77768215486007,1851.2697245460465,0.7896132260217921,253.14319734951442 +2023-08-02 12:02:32.584926,DREWCQUH,2.56836607472934,103.74549553901836,2323.0792947482746,1.1628212502192332,136.48673381847436 +2023-08-02 12:02:33.087083,Q98PDXSV,3.4949414836610715,103.25092028271155,4578.557752430669,1.074487351328775,9.696815255057572 +2023-08-02 12:02:33.588997,FPGJB015,3.809268364241331,102.31277687021505,1600.1493657180972,1.5954976232332478,270.9594368788763 +2023-08-02 12:02:34.091139,DSX2IK41,3.7322967971382868,102.80945979949767,659.0477713077972,2.6626257129611655,223.09994059467226 +2023-08-02 12:02:34.593354,0L9WUH1G,3.3270094519169127,102.89483431891675,814.763239734698,4.096418168495234,320.79758541082754 +2023-08-02 12:02:35.095576,1KU5ECOY,4.1830513869130455,103.05993868740009,1256.999236341683,0.9322936079204256,321.1217991177369 +2023-08-02 12:02:35.572671,F7NAPXDJ,3.2171260143447524,102.39766878813563,2211.543741309954,1.8458868665457622,194.0192555095465 +2023-08-02 12:02:36.074794,6WSFHK0D,2.78863451638596,102.43967904943366,56.54981422525134,1.0462064826227753,254.2793078157934 +2023-08-02 12:02:36.576940,CXPETOWQ,2.942031426021857,102.19719109635527,87.19022373968978,1.331298840510114,303.54420083928557 +2023-08-02 12:02:37.078903,KJXI34EG,2.9687089672964975,101.23356092494593,7.114944674466358,0.8167867003657043,11.39886984495024 +2023-08-02 12:02:37.580814,KXUCYM2D,3.887613657924355,101.44149244370396,13.123818438718457,0.08712295889215826,228.50145702483093 +2023-08-02 12:02:38.083016,U7S1O89K,2.9925374293383364,101.16577588095859,16.262899704408465,0.1138770811017098,345.829144511448 +2023-08-02 12:02:38.584954,3FVYHUSJ,3.198804827333388,102.08618654085943,17.991261642006368,0.22347218364053179,150.3613870124035 +2023-08-02 12:02:39.087117,J7DQHMGZ,4.087102004340589,102.19152482994208,28.02451556499737,0.2844048339883925,353.42789362956836 +2023-08-02 12:02:39.589186,K2WPE8GZ,4.293445915087014,101.82549510487351,38.78111906894335,0.10972229843471806,103.16006898713454 +2023-08-02 12:02:40.091172,J8YWARZK,4.698966359353122,102.35026287048848,45.13777984980821,0.07436655684658584,326.8811209372782 +2023-08-02 12:02:40.593295,O37AFRXW,5.285884248482244,102.71473410029549,87.94770572296109,0.115350898221356,219.37677357432221 +2023-08-02 12:02:41.095209,GMJANRQV,4.737399892359981,102.36699414396223,5.827402659329735,0.22980890088767533,221.2131167474326 +2023-08-02 12:03:07.232077,QY2WPG0M,1.1231961854084782,104.19033402704491,9858.229928006984,95.80944561531899,225.0633033607728 +2023-08-02 12:03:07.734663,T0OZ6K4P,1.3791291073686005,104.66593691239194,11545.284289864197,109.041321497205,236.00921266238626 +2023-08-02 12:03:08.236731,VWXFD9SB,0.5730099831993647,105.52671746223308,12857.19766814543,150.72157777413116,126.54363774143167 +2023-08-02 12:03:08.738805,Z7O0QJXP,0.7917154925190466,105.92209257095308,13659.383557082121,254.2583637346472,35.978931326629265 +2023-08-02 12:03:09.241124,5NOL2MHW,1.3164633139210384,105.38828241281388,2684.0316283374723,52.52870900238233,171.23216423169967 +2023-08-02 12:03:09.743383,2U3ZJGDX,1.4189957210060353,105.5267427005195,3060.660770119609,52.722515003085455,229.50545208412782 +2023-08-02 12:03:10.245576,QR5HW0X1,1.3959996031980657,105.27153537624257,724.4381177465939,4.890947433074949,119.21312898455415 +2023-08-02 12:03:10.747823,I0FMNCTB,0.7200569940807724,105.44588910857645,1316.4713814125528,1.4298302701271224,65.7794897894284 +2023-08-02 12:03:11.249976,GHIX8SUN,0.5889671274077442,105.3146431813531,98.56250846868352,0.2984279414326725,137.76256022827732 +2023-08-02 12:03:11.752151,O65MXQ8T,0.23003799789915025,106.06931050873607,130.66312760060052,0.21755860409670036,271.3369833490476 +2023-08-02 12:03:12.254188,FMLUA639,-0.12449809629675945,105.81142139096927,56.4176936407149,0.11992737272007235,37.25170819339502 +2023-08-02 12:03:12.756299,F6ZRP2TD,0.7347943616606905,105.09443943944967,7.188174580001899,0.15139147413712206,10.287367548086593 +2023-08-02 12:03:13.233389,6DEZJ9WB,-0.2120720442861237,105.98633385923796,6.196555120873926,0.2106135516956378,216.54290424592915 +2023-08-02 12:09:02.076332,60MA9KP3,0.4955849048314387,104.15359335486262,9402.974705863131,125.51861235565903,77.9347639994982 +2023-08-02 12:09:02.579577,IT57OK6F,0.1509955707773032,104.05691434044671,13533.465398987664,225.73559153334986,112.40945650450509 +2023-08-02 12:09:03.081896,92BQEZNC,1.1450734105389537,104.99584411509416,11070.086577879632,323.63901228802115,11.206229357076154 +2023-08-02 12:09:03.583994,XCN4GEJI,0.874883146629797,104.12220351052676,9437.841516119815,445.09023592390105,122.91452372109016 +2023-08-02 12:09:04.086041,9IWSH1Q6,0.07216384247502616,104.22328439414882,14090.882062824501,514.8256455700265,216.0902541123703 +2023-08-02 12:09:04.588149,CLWB26TP,0.6112998684186353,104.11050798424549,20579.47693629592,24.2525059395133,341.8912555190634 +2023-08-02 12:14:13.046429,UBJPHMN8,0.9525429984988425,104.16852262604836,4208.001863641907,81.82217469530613,139.46562296463608 +2023-08-02 12:14:13.549226,OG0N48IL,0.8224592781825053,103.51245348190669,3778.1532834833124,36.8937109093686,36.37042874213455 +2023-08-02 12:14:14.051461,YXA5ES3R,0.685563717612973,102.71528262349388,3094.8510914219605,18.415191723608626,314.0612779826594 +2023-08-02 12:14:52.715857,YTOSXPFE,0.7259129292175726,103.25661523970312,9057.109260696663,66.15952431892842,188.4947716340679 +2023-08-02 12:14:53.219132,GD1UW5TF,1.4739466288282574,104.19654672643831,1967.0529773909511,14.176323675712126,74.25365441336248 +2023-08-02 12:14:53.721437,IC5ANOX0,1.3569325551755238,104.14684809327416,2142.1104533397033,20.031468011409853,107.22808884331137 +2023-08-02 12:14:54.223637,DZEWJP7U,0.5153002750049618,104.00644057892299,26.283951765524307,33.602785506104176,165.29204035632935 +2023-08-02 12:14:54.725809,QZYW690P,0.921532802049565,103.41217214579609,29.604849780330238,43.01021363116584,173.235571123407 +2023-08-02 12:14:55.228007,47PAV6QT,1.7192443091413097,103.94661982892448,5.267436475643329,77.23782823939275,48.15889567473482 +2023-08-02 12:14:55.729978,IMGSO0JC,2.7096073628522674,104.7392645517528,8.132105788505058,113.21981754160356,12.136865746061176 +2023-08-02 12:14:56.231723,GC15V3FT,3.4939864727551737,105.2148404710979,11.645315821368948,51.29478770057006,171.3956544928517 +2023-08-02 12:14:56.733391,J34PLSMC,3.134588888242054,104.34621146007694,3.3075990691144614,27.047342426826017,303.86509327571434 +2023-08-02 12:14:57.235314,6RO3EIAZ,3.2247250994688943,104.37756524688778,4.391816696304246,19.513887809699636,23.665669578028314 +2023-08-02 12:14:57.737319,OZG03KWC,3.9552607595114004,103.68187893445777,2.6646342004210704,11.618470280937888,332.75023869673663 +2023-08-02 13:39:14.179798,YJBD6QWG,2.238419584469166,103.48136317865382,6942.759568839964,167.37680293085802,231.06072568556658 +2023-08-02 13:39:14.682882,IYPZKW8N,2.4296928673561062,104.38305115020749,11802.416926340056,31.139011213145608,119.39508294843756 +2023-08-02 13:39:15.185049,U5PKZ31H,2.9302338053122585,104.5784764732037,16926.214267572053,21.393747636635737,129.97886626013388 +2023-08-02 13:39:15.687438,RSDFZU3W,3.665520017935491,104.61982866089994,1681.3772540979444,15.414854534437888,310.48185447062014 +2023-08-02 13:39:16.189776,OMV9GBXA,3.7006563808450754,104.03944999525618,3087.814308707742,19.94874269849541,198.67352426915932 +2023-08-02 13:39:16.691917,TDFBWEMO,3.17535480036845,104.2940173880717,2176.0162715013917,26.687469729642487,272.54883295194463 +2023-08-02 13:39:17.194211,HRJO6MPA,2.309433526650305,104.88343308519488,669.4569551261752,41.41506180955115,221.26153917518377 +2023-08-02 13:39:17.696454,0A3B5F2R,2.2560791622832,104.57757365180467,1136.4081960506085,62.303687603085194,205.15319793239382 +2023-08-02 13:39:18.198824,TUZ7X2G0,2.8205462898456366,103.62798808728404,2008.546411768063,3.2089149968728634,89.18490129479528 +2023-08-02 13:39:18.701052,YC2AEL15,3.4245804400567073,104.03377485957668,3705.736565897582,1.898228213002038,32.86899288379408 +2023-08-02 13:39:19.202667,2578R0PL,3.4110608028560003,104.15866582984594,2136.733203071739,2.704424028469329,274.8690746844609 +2023-08-02 13:39:19.679553,49HBQMY8,2.448488105345115,103.87159172004857,2383.0589579005564,4.148198456141708,111.79230172147834 +2023-08-02 13:39:20.181325,CSMZTP79,2.1973631392157014,103.60802534288183,3740.4134977469607,1.78511355372062,33.893283697324875 +2023-08-02 13:39:20.683207,B6TJ5LYS,2.196495171730701,104.50954769798746,6448.377603511999,0.5402178281432968,94.53226483903308 +2023-08-02 13:39:21.184917,M96HBUT3,2.7689984269558607,103.72851545311795,3314.78536713254,1.0094123531898727,242.97529629169864 +2023-08-02 13:39:21.686994,4RWZ2FNA,2.6377223395320772,103.02821734807402,5183.833993754334,1.7046101513213048,250.04785919448747 +2023-08-02 13:39:22.188915,826MPGUK,2.835535211185607,103.09441209686854,9572.821274097554,0.716055598591813,226.92063988029724 +2023-08-02 13:39:22.691095,3Q8XK4AJ,1.9491227483800795,104.04927183407052,9320.013863397227,0.6376125067832317,114.33752848692848 +2023-08-02 13:39:23.193306,PH60QRGI,1.5542294708250786,103.22284229916372,3650.6771172525314,1.0596659964951303,331.3032399868722 +2023-08-02 13:39:23.695510,8EMIJXZF,1.7713416812444278,103.31051695277189,2588.1466193885967,1.6952886266004445,62.59671789759284 +2023-08-02 13:39:24.197397,OUPRD8SK,2.0585129802223943,102.49209520332487,4653.969270828213,2.9715479826550864,302.4394748819508 +2023-08-02 13:39:24.699673,8D6ZA321,1.8242572609431331,102.28602652436766,1618.366502534836,1.823908797175276,103.2762336645311 +2023-08-02 13:39:25.201991,3J50BV7Q,1.8370515414560107,101.46545838833786,3017.1439798214838,1.6053603818610889,31.34545686619225 +2023-08-02 13:39:25.679242,FL8A593S,1.8348929752551668,101.80045770959735,1912.7107243406513,0.5196379759676657,159.63079553083384 +2023-08-02 13:39:26.181534,8Z7D5NOR,0.957417246366159,100.99097534537142,381.22578613947326,1.0113271081618225,33.98924822743311 +2023-08-02 13:39:26.683685,V1H2Z7PU,1.7714784206446577,100.9577301892086,321.19422537280366,0.8310050508610834,49.45718720537592 +2023-08-02 13:39:27.185883,5NFX12WM,2.3071012858295283,101.04727106258454,389.94812829498795,1.1391308296852571,183.4633906619909 +2023-08-02 13:39:27.687893,WGSX8Q9U,2.2458908024761115,100.67539142171206,519.2550060499456,0.18667753349443805,311.8151819087034 +2023-08-02 13:39:28.190179,B1YLFEV4,2.2048228954886095,100.0324902398753,769.1584997863979,0.1201027856199121,240.0429170178527 +2023-08-02 13:39:28.692228,7GSKD2H8,1.885645966533735,100.1502273132073,961.0701286099936,0.18675340376520616,11.037433975062584 +2023-08-02 13:39:29.194248,6BQYS0I2,0.9990254651763457,100.19959402597108,1578.4246202349998,0.00953153749259622,137.0900504019075 +2023-08-02 13:39:29.696428,61KVRAOL,1.3924771482810716,100.9584299105227,2818.4472941709296,0.014293371135747666,287.9824311322693 +2023-08-02 13:39:30.198726,M1Z6SIQD,0.9412340910185701,100.63754189585063,4055.8499162928783,0.0036438605405338265,71.42652158918514 +2023-08-02 13:39:30.700997,KIEDAUL3,0.6318543175937024,100.43953084387383,4889.901089746767,0.005403302751597955,178.6011485401623 +2023-08-02 13:39:31.203212,US5YWFGR,0.9599150489245345,100.9534026099247,1140.2809257988965,0.00526885198528645,121.70456780881148 +2023-08-02 13:39:31.680318,61U5O7YZ,0.44961592281257423,101.01225096570232,457.2655605783708,0.008469710727882364,81.70773244469746 +2023-08-02 13:39:32.182450,74DQCH3E,-0.3361401127384316,101.60328146436147,754.4249808816866,0.005724751308516807,8.36940750314534 +2023-08-02 13:39:32.684527,O1GV0K2D,0.21821380811723534,101.85814891752348,433.1239000589016,0.009742001371143135,47.05693982310162 +2023-08-02 13:39:33.186691,PRT2J6AG,-0.6992275053554855,102.1941143615801,521.7210980171519,0.005443543897799229,215.70226740652808 +2023-08-02 13:39:33.688786,FXSVJ9W3,-0.9378387214657369,102.11469135585615,888.9137125753695,0.010555118408868804,277.79453302398423 +2023-08-02 13:39:34.190995,YPJOZNRU,-0.5079926744565584,101.29894134082534,544.9587933756316,0.0185693929875138,197.86468994904612 +2023-08-02 13:39:34.693201,DMO9JW78,-1.493394511074772,100.95554246218911,74.41420004009075,0.021691284794191697,97.40252007845368 +2023-08-02 13:39:35.195454,GARVZ805,-0.6938949044985232,101.40621042415846,7.970342006194798,0.009041696984617993,32.210244248436254 +2023-08-02 13:39:35.697811,ZW612EGQ,-0.0010762694562311825,100.78193317552974,7.678002092368294,0.006125027787415265,31.547673670838037 +2023-08-02 13:39:36.200123,LDS8UK2O,-0.7301438870923935,100.57152379290974,1.6232159555529808,0.011096194939088335,26.001384348665624 +2023-08-02 13:39:36.702393,0XY7S6PJ,-1.4613102813821919,99.62138399664374,2.2614575119972815,0.012523052888123977,341.0628162120827 +2023-08-02 13:40:32.338938,6QJK1VOS,1.6297274625637261,104.64877981713077,229.9145313843892,29.132549875107927,200.53739783011977 +2023-08-02 13:40:32.841821,PSG36U4O,1.0616079176893485,104.23749054225628,366.9226125529013,58.09531672884964,212.85995177827994 +2023-08-02 13:40:33.344209,I72NBSE9,1.345832781945071,104.11242727996363,513.8476160972515,75.9741203956081,168.26449509968438 +2023-08-02 13:40:33.846550,1KMATGVF,1.3762816874430082,105.05788206789049,438.16414277980624,89.49874869960877,179.88723547099107 +2023-08-02 13:40:34.348895,8YTHRMSF,1.147810320261705,104.82596024774945,621.6253406319582,46.14906148109804,100.52557966010687 +2023-08-02 13:40:34.851057,YDFAQN60,0.15726146199131708,103.99711840646562,968.5309305009625,39.657664399753244,340.53361075655613 +2023-08-02 13:40:35.353359,UO5CRDSN,-0.4993293503422629,104.43114790287811,1359.2296491565596,54.318484330105235,108.45953132996584 +2023-08-02 13:40:35.855702,18RSKY7L,0.4760780175421355,105.31273179059933,2324.028396417727,71.60774893930582,315.1628495873754 +2023-08-02 13:40:36.358097,RYU7P5CA,0.8696733777023746,105.01335790548026,675.1701980676794,34.38587452513735,148.70348125436715 +2023-08-02 13:40:36.860369,2LEV0KJ3,1.497241808515711,104.92101716435803,819.3031177377671,27.61861063376305,83.8994020371473 +2023-08-02 13:40:37.337589,CQVM4XLB,2.4322105084013135,104.44153956571282,1388.5005017513342,11.137417455702536,42.77364327870987 +2023-08-02 13:40:37.839782,HUI5CVZ9,1.4477116225712923,104.14924411680056,466.4741603327659,11.54919775686048,243.6703157875087 +2023-08-02 13:40:38.341698,M5E94J1Z,1.7279335869105095,103.60176577763552,92.30516752083281,17.084707592839692,149.81714111857048 +2023-08-02 13:40:38.843945,HRQDMP1C,0.7839932089577506,103.06987484271399,22.979602526607593,24.1317149600526,143.36396860683425 +2023-08-02 13:40:39.346039,6DHNVY0Q,1.2435846894090488,103.2304630252431,33.54090914962899,14.691314716179036,179.71388559224772 +2023-08-02 13:40:39.848361,FPT2MVWU,1.515471585908192,102.3358179888696,40.16294092726172,28.61595261304487,237.32246593366298 +2023-08-02 13:40:40.350590,WJQZBRXO,1.9066227174078347,101.35563650113737,19.67892037040184,28.820502658999306,26.335428467636177 +2023-08-02 13:40:40.852754,POCXSG6V,1.3321577541027896,101.25854581854055,4.750079446055079,54.13769608072574,264.2838850477035 +2023-08-02 13:40:41.355104,9R7OBV4H,1.4314701556144975,100.61686894637248,0.6561179031797959,18.886915796206516,230.82356698436195 +2023-08-02 13:40:41.857409,M5GJN86A,2.2255891861445543,100.33513553191295,1.1170880503502867,11.072573701240222,10.270813740611743 +2023-08-02 13:40:42.359782,ZFVYUQRE,2.7468629073198656,100.06855757443657,0.42747079898183693,4.499633467113764,92.7607211272179 +2023-08-02 13:40:42.862098,NB5O3EMV,1.908332479214832,99.97027859977513,0.3785647328336886,5.5926448888913285,301.2650253746584 +2023-08-02 13:40:43.339242,JVNERKHU,1.5708769975565033,99.92806746891378,0.12774230218102517,7.172189092392746,141.40485948221033 +2023-08-02 13:40:50.133673,NW69FQPH,0.8602988714526068,104.06090735730514,9149.119425134302,93.7268589179286,180.5461120907053 +2023-08-02 13:40:50.635900,NBUFAEVR,1.7866923459831086,103.546373230336,1813.4841201585177,136.57392593316823,106.59056177617856 +2023-08-02 13:40:51.138158,TZBEN7WP,1.1298455126111335,104.11135852096375,1514.6888395742233,208.82635282714813,13.068624007578876 +2023-08-02 13:40:51.640321,P7BQVMKR,1.4446855942178247,104.54816420481033,1023.693160005949,166.30261260491065,96.69410269439514 +2023-08-02 13:40:52.142634,XW97DOYH,1.2059856146758916,104.43962668856392,1208.6331882247039,279.7351827116111,12.579547389498089 +2023-08-02 13:40:52.644851,NATSYF6Q,1.2134782167671907,103.54627360598478,1049.581684537093,8.446879194132975,268.43524759592066 +2023-08-02 13:40:53.147141,SD9AJCVT,1.9527953205453574,103.45486067072433,329.18812404345067,14.519624262505397,123.85643485264137 +2023-08-02 13:40:53.649453,0NHT1PI7,1.7780912436905565,102.89931067250573,203.35332810600394,23.5781695357407,313.51272699574747 +2023-08-02 13:40:54.151755,JX4V7EGT,1.601186416609571,102.21724756312997,255.99761976804638,9.723265893258693,13.985189702363016 +2023-08-02 13:40:54.654059,PMHBRXS1,1.753563823759803,103.04859344246887,151.49220996984343,18.14013489924555,338.1348680264993 +2023-08-02 13:40:55.156130,G9PEUNFS,2.557192252943821,103.49210954795812,129.41487755010516,24.714785384246472,108.09984696694687 +2023-08-02 13:40:55.633010,OW3RFM71,3.413464036265753,103.62149240455233,46.656962404683185,14.85913897663766,9.418287235689945 +2023-08-02 13:43:34.903078,JB5KOCPE,1.2069982897108495,103.59639589576217,3791.0529926329127,263.4804070771034,280.4654314830628 +2023-08-02 13:43:35.407277,4N0MJWD8,1.8036718775127105,102.634162653769,607.1315180577631,222.56601454065256,307.88474783461726 +2023-08-02 13:43:35.910274,PCVL465B,0.819320865876765,102.04879429443352,95.38725840007965,15.152916719529827,201.08417166400386 +2023-08-02 13:43:36.412854,U4FVLOCZ,0.11900710429917716,102.30483689452215,142.9721218477267,1.5706776951667276,197.8231676902301 +2023-08-02 13:43:40.966011,U6HRVFL5,1.7386576337911719,104.54764752695907,5083.2148231154,216.5881469265607,272.91468769991974 +2023-08-02 13:43:41.470563,1WDOE0N3,2.1859299977962436,104.85137828718338,5609.61152926067,77.9118094045374,124.67893853867349 +2023-08-02 13:43:41.974595,WVRFGABO,1.5553185928852826,105.60766845945827,8236.056583303085,98.74484166362609,249.34619050941578 +2023-08-02 13:43:42.478756,N7D60FY2,2.0082849828079365,106.26194517225828,2164.477447777321,37.89960325986134,359.87367166252176 +2023-08-02 13:43:42.982521,4OIF56JA,1.817141022230231,107.17291844658779,1860.309044612979,56.505403232518034,5.813033460736506 +2023-08-02 13:43:43.486358,QC9X62LG,2.5057781181537138,107.94564965223424,3717.8666031185517,5.738500202316544,260.6455030873552 +2023-08-02 13:43:43.965047,TNHU9PWY,1.893464860728396,108.3740127242196,5119.828487583318,9.686092690938114,256.1238427854264 +2023-08-02 13:43:44.469381,AREDZ2HY,2.6350799688789346,108.03712443252613,153.78753326729657,6.400460237174705,313.0843402308832 +2023-08-02 13:43:44.973633,C6P532JF,3.2041511025335403,108.23219800665416,143.2213163196841,4.421991367461549,96.292546123595 +2023-08-02 13:43:45.477888,WOZAY72B,2.6350673791248314,107.49369693001341,202.8795401280776,6.386921628809543,155.86305262573802 +2023-08-02 13:43:45.982264,SYX1RZVQ,2.0275763751032034,107.30580298308362,188.81670448383218,12.562259783496154,310.1161179777059 +2023-08-02 13:43:46.486475,LH2OP0TA,2.21727685362689,106.64915499557146,287.95820163771515,25.013101389194233,148.75700124886532 +2023-08-02 13:43:46.965694,AP50L3B2,2.6743424321584586,106.67568824068621,61.52790036085415,19.3030662213849,115.82657310241075 +2023-08-02 13:43:57.557068,7WD5ZM4V,2.1037180990241353,103.90573077742651,4183.80685068752,58.76826595690366,140.95174431496886 +2023-08-02 13:43:58.061797,50GCTNDF,2.3229987701191623,103.95274618753096,6873.3296426004,114.56819424353311,227.85966893285314 +2023-08-02 13:43:58.566352,1745GD2T,1.5667057146630536,103.81619409237746,11253.394219511365,96.20515197527129,291.57949958335206 +2023-08-02 13:43:59.070311,T8BALK7S,2.175431177189962,103.20947915813288,21082.48392462787,60.82191483589065,52.14160544253929 +2023-08-02 13:43:59.574572,HVGFERX0,2.049594463862275,102.90052410177015,1949.4287478058905,98.23469077957289,359.67287419157975 +2023-08-02 13:44:00.079064,PLTFWO2R,2.9743452811078406,102.6277733748711,1761.0592011998372,118.96613651729356,240.92306580826425 +2023-08-02 13:44:00.558035,3JZ5YNBE,2.556987705205624,103.31297884303099,3005.7041724748296,224.99100844917498,243.4467371373845 +2023-08-02 13:44:01.062119,3YEWPHTN,3.430250385144664,104.28452463730102,1602.3416354229018,53.735663940318176,10.400399818341725 +2023-08-02 13:44:01.566494,MW9NYJRZ,3.6354802693145345,104.89731952282766,2608.7400436046173,40.95413149207891,42.73396586003615 +2023-08-02 13:44:02.070424,45HKNRL6,3.835493356260633,104.39368445476839,1628.9475004489582,65.51473268240056,1.1098585977388211 +2023-08-02 13:44:40.463689,G0TXJ1PY,0.6361830586459616,104.81632879217061,1082.045047013371,117.55100160800598,253.48189796142083 +2023-08-02 13:44:40.968309,EPU6KWF7,0.7506374786557317,105.36251680985278,109.97360205059874,47.114062999752576,43.26665631513674 +2023-08-02 13:44:41.472465,YGFUN8CP,1.5566946046008068,106.23060500423892,1.7618132155931931,76.20753101165222,153.31167333875317 +2023-08-02 13:44:41.976452,MQ8BUS67,2.4613348284004477,107.21116100650612,1.3625510796328113,141.23717738895672,296.32604409204066 +2023-08-02 13:44:42.480550,CBAE0KFX,3.144175328333227,108.11790654114414,2.2665988674431476,187.8665026619995,19.334963029260393 +2023-08-02 13:44:42.984663,IZW2SJO8,3.520683408516116,108.01640627302415,4.285254293879003,62.346983412174396,255.32617555517288 +2023-08-02 13:44:43.463616,HL7DVCOT,2.5287104372288782,108.24542012576961,3.7369610554712915,121.49509174521944,23.018122237125056 +2023-08-02 13:44:43.967724,YUL3Z5Q2,1.734229619148311,108.87935143705914,3.7239799652487275,152.98366754623842,276.4534865592975 +2023-08-02 13:44:46.683100,JHI7YURM,1.3862102769024853,103.96719853326174,4837.49190765027,77.20311644381414,305.9719609960284 +2023-08-02 13:44:47.187849,ZE1GDOBI,1.8854961288754688,104.21533121649053,7159.751188688472,85.09635393742279,258.826351615156 +2023-08-02 13:44:47.691689,W48F3LYT,2.073204459805435,103.48278163120331,8391.053444911377,48.65182332696786,144.27042065592343 +2023-08-02 13:44:48.196238,HPTRAZD1,2.281034289143884,102.65615942087916,1395.493593124169,64.7005480369072,50.95804384687102 +2023-08-02 13:44:48.700029,ZSLFT2X9,2.875622245155116,103.25995328477671,1730.8807644613153,57.54900447007833,117.0529807649245 +2023-08-02 13:45:08.518118,WBTV4Z31,1.676200135691566,103.54659805304517,1057.181690313837,232.41660587259398,281.37923766468276 +2023-08-02 13:45:09.022019,LA4DJVG8,1.994014874367955,104.43607444158206,43.4371688985259,429.8818654396164,260.95705928422126 +2023-08-02 13:45:09.525200,LIUXZ6C2,1.3134842202291959,104.7060795927793,63.49957095847272,434.9044909313264,69.69572755542782 +2023-08-02 13:45:25.237582,UDBM7L15,0.5687098731058926,103.12695893535643,8008.160225621159,213.99360451766208,115.65395076765188 +2023-08-02 13:45:52.119648,6VEZROSL,1.6135000839756504,102.97955654694721,8524.284069129757,20.822918579677875,251.8479922586543 +2023-08-02 13:46:12.173556,Z4AJNDRY,1.9480270195668912,104.0429323480713,5227.648137208026,275.65901889546046,342.1246441822645 +2023-08-02 13:46:22.319191,UAVTNF3D,2.174837058760973,103.5552569607122,8744.662405613024,71.18161843283603,268.946129598988 +2023-08-02 13:46:34.094698,3CJ9LH6X,0.42474684108158245,103.17958104987332,8166.728814816307,50.11588148393761,215.9065286277091 +2023-08-02 13:46:34.599160,KPUW8B5Y,1.0314200156679538,102.24989163169893,169.4055246011112,78.90580949288182,310.0713800564355 +2023-08-02 13:46:35.103238,358NEATP,1.369190157962281,101.6587975473823,297.31267703906826,139.66370527095637,318.00930534385367 +2023-08-02 13:46:35.607124,MO2ZAUD1,1.7148194094689664,102.04089717655057,543.040042919732,227.16695896052747,195.7218519803099 +2023-08-02 13:46:36.110627,9RSHUBV1,2.5092894887006416,102.02694032488294,648.6123184161422,193.9287849682742,228.52913597199307 +2023-08-02 13:46:36.614191,ZFAPX16Q,2.633682544154538,101.24563136252429,99.88307988555619,300.15824232576426,331.8879191314826 +2023-08-02 13:46:37.118074,T528AV07,3.2826226006745935,100.40293259475098,63.90887003279852,451.70312035627495,114.41858164476048 +2023-08-02 13:46:37.597184,ZGHMEWLY,3.9708142728910767,101.11044281699165,17.49209706833078,326.20232047369836,238.30176534163934 +2023-08-02 13:46:38.101239,WEN4XKOT,3.009351459575442,102.01748558429907,1.6487141704094395,617.270941032986,118.77449461273989 +2023-08-02 13:46:38.604953,NWVG9CT8,2.474943724072763,102.6795407865525,1.9222870628226443,248.72909902941313,167.66114545744026 +2023-08-02 13:46:39.109157,EYQ7U09S,2.674224933716267,103.58894606729542,3.2474522448829943,461.2736754836328,90.87977397188843 +2023-08-02 13:47:01.782474,14S3ZRMK,0.8420220860255738,104.62575316880547,2382.1952209433643,266.64909783298936,316.369967525308 +2023-08-02 13:47:02.286989,S1BTV6AL,1.808611456775166,104.1115264003035,4025.1535065337384,101.80842584230228,114.20828275851267 +2023-08-02 13:47:02.790559,DOABW78K,1.7576819804451755,103.94523871767517,4396.415605129472,198.14251820640266,73.46381318493258 +2023-08-02 13:47:03.293648,3WVD7YJM,2.4440854128179526,103.96275486225163,6073.950670735869,304.72069224912775,9.7735609364492 +2023-08-02 13:47:13.875402,5VIBRYPK,1.1161342771263667,103.71506811493435,7681.165446815004,211.06907670988917,169.1463915895956 +2023-08-02 13:47:14.377715,5V6CAURI,0.9439167892641678,104.0444407945405,1400.646041283263,138.99371765086696,117.43483421588985 +2023-08-02 13:47:14.880096,E43ORB0Z,0.5486218333426651,104.16687198663197,2560.7986971926507,158.2273518323616,304.22575966204676 +2023-08-02 13:47:23.063753,43DAP58U,2.0897327942796458,103.94457989211108,3482.1785661037316,48.72958683746526,299.59541726618255 +2023-08-02 13:47:23.566992,AQT0KFZD,2.12407438969747,104.88989019039491,5459.338862353478,94.33859503606739,100.71082729991127 +2023-08-02 13:47:24.069058,4B8V9K6T,2.8690027274466674,104.2936932798622,5996.712807680942,44.86498879192816,113.36769772046344 +2023-08-02 13:47:24.571112,RPKYJ4FE,2.920350081500019,104.54569721648463,4128.1203585107005,41.87857069482637,52.65294786045797 +2023-08-02 13:47:34.401043,9LTKVFDI,0.8523069456993111,103.43585941932251,7264.542472067766,189.4464406198038,331.4313388799628 +2023-08-02 13:47:34.904396,3L7HWTPQ,1.3331663639055626,103.97747964455716,3259.1496951785375,224.75151314688938,319.0075147867851 +2023-08-02 13:47:35.406632,6PKMGQTD,2.3018671377729816,103.62162211106975,3368.304699462384,415.3830878856996,0.1067471133702611 +2023-08-02 13:47:35.908835,SMKTBO3I,2.4456438372496776,104.45436096013428,4433.507146375216,209.26877399259715,327.1735067155617 +2023-08-02 13:48:08.700546,LGFDCUTK,1.1896110345003312,104.80517610302688,4111.196523779818,102.98035113086227,85.13689075323543 +2023-08-02 13:48:09.203817,IJYVA4TO,1.0693898015026868,104.45295043448569,575.1755423058353,148.48683000933653,158.67383838056872 +2023-08-02 13:48:09.706215,CAMTS6JX,0.14704951468701188,104.69284944409041,1049.6609102397942,43.18219210298723,292.960427499497 +2023-08-02 13:48:10.208392,UFK6HR0G,-0.004366237590559763,104.67045155046485,711.4795387723542,35.91133106537763,102.11826855840337 +2023-08-02 13:48:10.710623,6VPL2RM1,0.850096235073067,104.44011483060918,835.8192724422169,53.27326492082436,259.71113831639354 +2023-08-02 13:48:11.212891,XL6AJ5NE,1.6258013409354657,104.30625234698341,1117.6458168059803,73.11777815040661,76.04611118675871 +2023-08-02 13:48:11.715200,NZMKR7TC,1.3850146330149706,103.86710842134228,112.54894023947077,40.22165817814451,214.52258991784686 +2023-08-02 13:48:12.217472,YXH6FUCM,1.9376233345099108,103.4783471942704,16.900350391038813,57.00938928870998,84.60837122957503 +2023-08-02 13:48:14.704182,6VGL1CXS,1.6913470795856642,103.20791138494356,2395.4349803844375,245.731812021993,265.9098238430454 +2023-08-02 13:48:15.206590,IMVOB5GW,2.521855648158944,103.20481522204626,2997.290999855877,148.89184973917367,205.07926980614138 +2023-08-02 13:48:15.708910,74VKD31P,2.609788254917655,104.02342081276849,5954.993368515439,216.1492436395662,72.42806436664046 +2023-08-02 13:48:16.211194,2S06IWXE,2.5530126744539863,104.76539344994995,3615.4116824844623,120.77174552562637,75.0000332837841 +2023-08-02 13:48:16.713443,F74ESMOV,2.0985651209104925,105.71207403972221,6141.575283126233,31.476516707549266,173.7687839911424 +2023-08-02 13:48:17.215473,BD54Y0PT,2.7181396921465586,106.20700902848002,6052.210289669208,15.80358936709476,337.49526022389625 +2023-08-02 13:48:17.717732,EVHB4WM6,2.8267643831266014,106.56282874065636,12037.982632968047,9.979114358306168,152.84907972256667 +2023-08-02 13:48:18.219852,1SNFBMIA,3.7099954023323987,107.23333257048105,7864.262300368196,13.129565414445198,315.4941059809901 +2023-08-02 13:48:18.722027,43LNSGWM,2.879831878472072,107.30808285067233,10717.618966761744,5.2692511678640965,218.80456063578185 +2023-08-02 13:48:19.224011,AJMLIZTX,2.889725624551783,107.14416358301045,15882.836991140275,4.682507587396043,37.442847951068416 +2023-08-02 13:48:19.726344,1QACIS9U,2.4809694826638937,108.06213435681872,26111.613096053614,1.4526395135462158,295.13618436777807 +2023-08-02 13:48:20.228558,5QYF4ANK,2.6246845075950884,108.14605188969982,48397.924807562384,2.0570418760879865,327.33652520736916 +2023-08-02 13:48:34.040272,JAGTYHBM,0.6503947618245696,103.27428326127126,3545.281933684983,153.95295369570442,80.84161477971317 +2023-08-02 13:48:34.543531,6EUGZ8F4,0.9927843667010232,103.95622994850763,543.3048757834481,257.2839175388986,4.267950742241283 +2023-08-02 13:48:35.045750,GPBTV3KU,1.3059577805635616,103.87686075765109,369.29083563398734,100.7042843561531,330.94944300488726 +2023-08-02 13:49:11.000246,2TQ1MWZ4,1.5310152149277056,104.32390427094106,5700.635476496772,170.31840767705188,34.18246562270067 +2023-08-02 13:49:11.502500,EWRJL4T6,2.003881494219408,103.93527932169116,5958.849873818606,49.960742462777745,337.40578692673995 +2023-08-02 13:49:12.004619,ASZVX3N2,2.0688431176781172,103.85974004570913,7752.565321341293,79.71504451106102,224.2594326458102 +2023-08-02 13:49:12.506670,8J7GYCWA,1.7402808475220861,104.01014995909081,13023.933706252079,82.55644938623071,261.534205090672 +2023-08-02 13:49:13.008783,B1FDYV7E,1.3867087035118433,103.73082693508194,9853.657811288607,87.69435455401221,288.34659176841694 +2023-08-02 13:49:13.510948,GRMTBZP7,0.6137404158998336,103.95264776831253,6636.162315454761,71.784652833168,162.85022649818632 +2023-08-02 13:49:14.012963,VAWRC8LG,0.3433479984347916,104.81513837255113,298.9847871395514,23.857533691637123,308.0856778600993 +2023-08-02 13:49:14.515032,X0O1JHFK,1.3407024151785787,104.05119104640562,221.33773574530125,40.48650269139564,76.0632789073835 +2023-08-02 13:49:15.016904,IG1OPAJM,0.4554484300724295,103.55127835427979,384.01033297246215,58.22120219592701,7.082886884882441 +2023-08-02 13:49:15.519081,OSBE3ZUC,0.003220376717852247,103.16346864429569,127.85892524159158,19.882697925899556,291.82909415744587 +2023-08-02 13:49:16.021378,ZSB0FYEN,-0.7279499440004962,102.32532695268871,39.63607502862229,26.183893570418864,16.98511961831997 +2023-08-02 13:49:16.523630,5U8PI09S,-0.4863639967041198,103.08191015754213,57.35662063071939,10.275669091051869,200.77331545709956 +2023-08-02 13:49:17.000680,6B2JLW5H,-0.803391077411066,102.6061194500636,81.34155071755458,18.362020989171096,241.70138225388496 +2023-08-02 13:49:17.502895,QOZ2JE7B,-1.673779925093208,103.1986873048903,35.62286522150984,29.240527402490656,28.603952185403614 \ No newline at end of file diff --git a/pyhackrf.py b/pyhackrf.py index 62f5c60..1ec6bf4 100644 --- a/pyhackrf.py +++ b/pyhackrf.py @@ -52,6 +52,7 @@ class LibHackRfBoardIds(IntEnum): BOARD_ID_JELLYBEAN = 0 BOARD_ID_JAWBREAKER = 1 BOARD_ID_HACKRF_ONE = 2 + BOARD_ID_HACKRF_ONE_V9 = 4 BOARD_ID_RAD1O = 3 BOARD_ID_INVALID = 0xFF @@ -806,11 +807,11 @@ def isStreaming(self): __class__.__logger.debug(__class__.__name__ + " Trying to call isStreaming") if self.opened() and self.getTransceiverMode() != LibHackRfTransceiverMode.TRANSCEIVER_MODE_OFF: return __class__.__libhackrf.hackrf_is_streaming(self.__pDevice) == LibHackRfReturnCode.HACKRF_TRUE - else: - print("isStreaming corner case") - __class__.__logger.debug( - "Trying to call isStreaming for non-opened or non transmitting " + __class__.__name__) - return False + #else: + #print("isStreaming corner case") + #__class__.__logger.debug( + # "Trying to call isStreaming for non-opened or non transmitting " + __class__.__name__) + #return False def stopRX(self): __class__.__logger.debug(__class__.__name__ + " Trying to stop RX") diff --git a/waypoints.csv b/waypoints.csv new file mode 100644 index 0000000..05b9688 --- /dev/null +++ b/waypoints.csv @@ -0,0 +1,4 @@ +DEADBEEF,1.400,103.500,16250,400,90,10 +DEADBEEF,1.400,103.505,16250,400,90,10 +DEADBEEF,1.400,103.510,16250,400,90,10 +DEADBEEF,1.400,103.515,16250,400,90,10 diff --git a/waypoints.txt b/waypoints.txt deleted file mode 100644 index 8beea94..0000000 --- a/waypoints.txt +++ /dev/null @@ -1,3 +0,0 @@ -1 2 3 4 5 3 -11 12 13 14 15 3 -21 22 23 24 25 3 From cd337dd9f4c3b29ef70d63acfc30f380c3e5ba7c Mon Sep 17 00:00:00 2001 From: Anton Chua Date: Wed, 2 Aug 2023 15:13:21 +0800 Subject: [PATCH 19/22] Add feed1090 module feed1090 (uses paramiko): - SSHs to remote rPi to start dump1090 and log1090 (to be included in repo) - Regularly loops to scp ADS-B log file - includes kill function --- HackRfBroadcastThread.py | 22 +- feed1090/2023-08-02_1090ES.json | 489 ++++++++++++++++++++++++++++++++ feed1090/TODO | 0 feed1090/para_kill.py | 80 ++++++ feed1090/para_start.py | 86 ++++++ logfile.csv | 52 +++- 6 files changed, 717 insertions(+), 12 deletions(-) create mode 100644 feed1090/2023-08-02_1090ES.json create mode 100644 feed1090/TODO create mode 100644 feed1090/para_kill.py create mode 100644 feed1090/para_start.py diff --git a/HackRfBroadcastThread.py b/HackRfBroadcastThread.py index fb19463..5f58a73 100644 --- a/HackRfBroadcastThread.py +++ b/HackRfBroadcastThread.py @@ -80,17 +80,17 @@ def __init__(self,airborne_position_refresh_period = 150000): self._hackrf_broadcaster.setCrystalPPM(0) - #result = self._hackrf_broadcaster.setAntennaPowerMode(LibHackRfHwMode.HW_MODE_ON) # Antenna Power Mode ON or OFF - #if (result != LibHackRfReturnCode.HACKRF_SUCCESS): - # print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) - + result = self._hackrf_broadcaster.setAntennaPowerMode(LibHackRfHwMode.HW_MODE_ON) # Antenna Power Mode ON or OFF + if (result != LibHackRfReturnCode.HACKRF_SUCCESS): + print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) + result = self._hackrf_broadcaster.setAmplifierMode(LibHackRfHwMode.HW_MODE_ON) # LNA Amplifier ON or OFF if (result != LibHackRfReturnCode.HACKRF_SUCCESS): print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) - #result = self._hackrf_broadcaster.setLNAGain(14) # LNA Amplifier Gain - #if (result != LibHackRfReturnCode.HACKRF_SUCCESS): - # print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) + result = self._hackrf_broadcaster.setLNAGain(14) # LNA Amplifier Gain + if (result != LibHackRfReturnCode.HACKRF_SUCCESS): + print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) # 2MHz sample rate to meet ADS-B spec of 0.5µs PPM symbol result = self._hackrf_broadcaster.setSampleRate(2000000) @@ -175,15 +175,15 @@ def broadcast_data(self,data): self._mutex.release() result = self._hackrf_broadcaster.startTX(hackrfTXCB,self._tx_context) - #if (result != LibHackRfReturnCode.HACKRF_SUCCESS): - # print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) + if (result != LibHackRfReturnCode.HACKRF_SUCCESS): + print("startTXError:",result, ",", HackRF.getHackRfErrorCodeName(result)) while self._hackrf_broadcaster.isStreaming(): time.sleep(sleep_time) result = self._hackrf_broadcaster.stopTX() - #if (result != LibHackRfReturnCode.HACKRF_SUCCESS): - # print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) + if (result != LibHackRfReturnCode.HACKRF_SUCCESS): + print("stopTXError:",result, ",", HackRF.getHackRfErrorCodeName(result)) #self._mutex.release() diff --git a/feed1090/2023-08-02_1090ES.json b/feed1090/2023-08-02_1090ES.json new file mode 100644 index 0000000..3756dff --- /dev/null +++ b/feed1090/2023-08-02_1090ES.json @@ -0,0 +1,489 @@ +[ +{"datetime":"2023-08-02 14-09-00", "target": "", "latitude": 1.359418, "longitude": 104.016613, "altitude": 9675, "heading": 346, "speed": 280} +] +[ +{"datetime":"2023-08-02 14-20-43", "target": "CPJ007 ", "latitude": 1.484225, "longitude": 104.001933, "altitude": 11075, "heading": 274, "speed": 255} +] +[ +{"datetime":"2023-08-02 14-20-54", "target": "CPJ007 ", "latitude": 1.484365, "longitude": 103.999802, "altitude": 11000, "heading": 274, "speed": 255} +] +[ +{"datetime":"2023-08-02 14-21-04", "target": "CPJ007 ", "latitude": 1.485306, "longitude": 103.981359, "altitude": 10825, "heading": 274, "speed": 255} +] +[ +{"datetime":"2023-08-02 14-21-14", "target": "CPJ007 ", "latitude": 1.486084, "longitude": 103.965252, "altitude": 10625, "heading": 273, "speed": 253} +] +[ +{"datetime":"2023-08-02 14-21-25", "target": "CPJ007 ", "latitude": 1.486588, "longitude": 103.952683, "altitude": 10400, "heading": 273, "speed": 252} +] +[ +{"datetime":"2023-08-02 14-21-35", "target": "CPJ007 ", "latitude": 1.486954, "longitude": 103.943699, "altitude": 10225, "heading": 273, "speed": 250} +] +[ +{"datetime":"2023-08-02 14-21-46", "target": "CPJ007 ", "latitude": 1.487623, "longitude": 103.929622, "altitude": 10025, "heading": 274, "speed": 248} +] +[ +{"datetime":"2023-08-02 14-21-56", "target": "CPJ007 ", "latitude": 1.488556, "longitude": 103.917723, "altitude": 9850, "heading": 280, "speed": 244} +] +[ +{"datetime":"2023-08-02 14-22-07", "target": "CPJ007 ", "latitude": 1.489975, "longitude": 103.912555, "altitude": 9750, "heading": 295, "speed": 242} +] +[ +{"datetime":"2023-08-02 14-22-17", "target": "CPJ007 ", "latitude": 1.489975, "longitude": 103.912555, "altitude": 9425, "heading": 318, "speed": 240} +] +[ +{"datetime":"2023-08-02 14-22-28", "target": "CPJ007 ", "latitude": 1.502055, "longitude": 103.897279, "altitude": 9400, "heading": 318, "speed": 240} +] +[ +{"datetime":"2023-08-02 14-22-38", "target": "CPJ007 ", "latitude": 1.502055, "longitude": 103.897279, "altitude": 9400, "heading": 318, "speed": 240} +] +[ +{"datetime":"2023-08-02 14-22-49", "target": "MEDIC15 ", "latitude": 1.351458, "longitude": 103.824826, "altitude": 1425, "heading": 33, "speed": 153}, {"hex": "424846", "target": "CPJ007 ", "latitude": 1.502055, "longitude": 103.897279, "altitude": 9400, "heading": 318, "speed": 240} +] +[ +{"datetime":"2023-08-02 14-22-59", "target": "MEDIC15 ", "latitude": 1.360024, "longitude": 103.830272, "altitude": 1375, "heading": 32, "speed": 150}, {"hex": "424846", "target": "CPJ007 ", "latitude": 1.502055, "longitude": 103.897279, "altitude": 9400, "heading": 318, "speed": 240} +] +[ +{"datetime":"2023-08-02 14-23-10", "target": "MEDIC15 ", "latitude": 1.366262, "longitude": 103.834344, "altitude": 1250, "heading": 34, "speed": 154}, {"hex": "424846", "target": "CPJ007 ", "latitude": 1.502055, "longitude": 103.897279, "altitude": 9400, "heading": 318, "speed": 240} +] +[ +{"datetime":"2023-08-02 14-23-20", "target": "MEDIC15 ", "latitude": 1.371735, "longitude": 103.837979, "altitude": 1075, "heading": 33, "speed": 157}, {"hex": "424846", "target": "CPJ007 ", "latitude": 1.502055, "longitude": 103.897279, "altitude": 9400, "heading": 318, "speed": 240} +] +[ +{"datetime":"2023-08-02 14-23-31", "target": "MEDIC15 ", "latitude": 1.378189, "longitude": 103.842215, "altitude": 950, "heading": 33, "speed": 155}, {"hex": "424846", "target": "CPJ007 ", "latitude": 1.502055, "longitude": 103.897279, "altitude": 9400, "heading": 318, "speed": 240} +] +[ +{"datetime":"2023-08-02 14-23-41", "target": "MEDIC15 ", "latitude": 1.385115, "longitude": 103.846751, "altitude": 775, "heading": 33, "speed": 156} +] +[ +{"datetime":"2023-08-02 14-23-52", "target": "MEDIC15 ", "latitude": 1.388672, "longitude": 103.849011, "altitude": 600, "heading": 33, "speed": 156} +] +[ +{"datetime":"2023-08-02 14-24-02", "target": "MEDIC15 ", "latitude": 1.388672, "longitude": 103.849011, "altitude": 450, "heading": 34, "speed": 152} +] +[ +{"datetime":"2023-08-02 14-24-13", "target": "MEDIC15 ", "latitude": 1.401036, "longitude": 103.857169, "altitude": 275, "heading": 33, "speed": 152} +] +[ +{"datetime":"2023-08-02 14-24-23", "target": "MEDIC15 ", "latitude": 1.401036, "longitude": 103.857169, "altitude": 275, "heading": 33, "speed": 152} +] +[ +{"datetime":"2023-08-02 14-24-34", "target": "MEDIC15 ", "latitude": 1.401036, "longitude": 103.857169, "altitude": 275, "heading": 33, "speed": 152} +] +[ +{"datetime":"2023-08-02 14-24-44", "target": "MEDIC15 ", "latitude": 1.401036, "longitude": 103.857169, "altitude": 275, "heading": 33, "speed": 152} +] +[ +{"datetime":"2023-08-02 14-24-55", "target": "MEDIC15 ", "latitude": 1.401036, "longitude": 103.857169, "altitude": 275, "heading": 33, "speed": 152} +] +[ +{"datetime":"2023-08-02 14-25-05", "target": "MEDIC15 ", "latitude": 1.401036, "longitude": 103.857169, "altitude": 275, "heading": 33, "speed": 152} +] +[ +{"datetime":"2023-08-02 14-32-15", "target": "VHAVL ", "latitude": 1.352203, "longitude": 103.825157, "altitude": 1500, "heading": 35, "speed": 157} +] +[ +{"datetime":"2023-08-02 14-32-26", "target": "VHAVL ", "latitude": 1.357743, "longitude": 103.828851, "altitude": 1400, "heading": 33, "speed": 162} +] +[ +{"datetime":"2023-08-02 14-32-36", "target": "VHAVL ", "latitude": 1.3644, "longitude": 103.833255, "altitude": 1250, "heading": 33, "speed": 157} +] +[ +{"datetime":"2023-08-02 14-32-47", "target": "VHAVL ", "latitude": 1.370682, "longitude": 103.837373, "altitude": 1100, "heading": 33, "speed": 155} +] +[ +{"datetime":"2023-08-02 14-32-57", "target": "VHAVL ", "latitude": 1.375671, "longitude": 103.840772, "altitude": 1025, "heading": 34, "speed": 152} +] +[ +{"datetime":"2023-08-02 14-33-08", "target": "VHAVL ", "latitude": 1.375671, "longitude": 103.840772, "altitude": 800, "heading": 34, "speed": 152} +] +[ +{"datetime":"2023-08-02 14-33-18", "target": "VHAVL ", "latitude": 1.387908, "longitude": 103.848693, "altitude": 650, "heading": 34, "speed": 148} +] +[ +{"datetime":"2023-08-02 14-33-29", "target": "AXM5596 ", "latitude": 1.503021, "longitude": 103.950123, "altitude": 10825, "heading": 110, "speed": 360}, {"hex": "7c02ff", "target": "VHAVL ", "latitude": 1.387908, "longitude": 103.848693, "altitude": 550, "heading": 33, "speed": 150} +] +[ +{"datetime":"2023-08-02 14-33-39", "target": "AXM5596 ", "latitude": 1.497345, "longitude": 103.965113, "altitude": 11000, "heading": 110, "speed": 365}, {"hex": "7c02ff", "target": "VHAVL ", "latitude": 1.399658, "longitude": 103.85632, "altitude": 400, "heading": 33, "speed": 146} +] +[ +{"datetime":"2023-08-02 14-33-50", "target": "AXM5596 ", "latitude": 1.497345, "longitude": 103.965113, "altitude": 11350, "heading": 110, "speed": 369}, {"hex": "7c02ff", "target": "VHAVL ", "latitude": 1.399658, "longitude": 103.85632, "altitude": 400, "heading": 33, "speed": 146} +] +[ +{"datetime":"2023-08-02 14-34-00", "target": "AXM5596 ", "latitude": 1.497345, "longitude": 103.965113, "altitude": 11700, "heading": 110, "speed": 369}, {"hex": "7c02ff", "target": "VHAVL ", "latitude": 1.399658, "longitude": 103.85632, "altitude": 400, "heading": 33, "speed": 146} +] +[ +{"datetime":"2023-08-02 14-34-11", "target": "AXM5596 ", "latitude": 1.497345, "longitude": 103.965113, "altitude": 11700, "heading": 110, "speed": 369}, {"hex": "7c02ff", "target": "VHAVL ", "latitude": 1.399658, "longitude": 103.85632, "altitude": 400, "heading": 33, "speed": 146} +] +[ +{"datetime":"2023-08-02 14-34-21", "target": "AXM5596 ", "latitude": 1.497345, "longitude": 103.965113, "altitude": 11700, "heading": 110, "speed": 369}, {"hex": "7c02ff", "target": "VHAVL ", "latitude": 1.399658, "longitude": 103.85632, "altitude": 400, "heading": 33, "speed": 146} +] +[ +{"datetime":"2023-08-02 14-34-32", "target": "AXM5596 ", "latitude": 1.497345, "longitude": 103.965113, "altitude": 11700, "heading": 110, "speed": 369}, {"hex": "7c02ff", "target": "VHAVL ", "latitude": 1.399658, "longitude": 103.85632, "altitude": 400, "heading": 33, "speed": 146} +] +[ +{"datetime":"2023-08-02 14-34-42", "target": "AXM5596 ", "latitude": 1.497345, "longitude": 103.965113, "altitude": 11700, "heading": 110, "speed": 369} +] +[ +{"datetime":"2023-08-02 14-34-53", "target": "AXM5596 ", "latitude": 1.497345, "longitude": 103.965113, "altitude": 11700, "heading": 110, "speed": 369} +] +[ +{"datetime":"2023-08-02 14-35-03", "target": "AXM5596 ", "latitude": 1.497345, "longitude": 103.965113, "altitude": 11700, "heading": 110, "speed": 369} +] +[ +{"datetime":"2023-08-02 14-35-13", "target": "AXM5596 ", "latitude": 1.497345, "longitude": 103.965113, "altitude": 11700, "heading": 110, "speed": 369} +] +[ +{"datetime":"2023-08-02 14-35-24", "target": "AXM5596 ", "latitude": 1.432086, "longitude": 104.136563, "altitude": 14575, "heading": 110, "speed": 369} +] +[ +{"datetime":"2023-08-02 14-35-34", "target": "AXM5596 ", "latitude": 1.432086, "longitude": 104.136563, "altitude": 14575, "heading": 110, "speed": 369} +] +[ +{"datetime":"2023-08-02 14-35-45", "target": "AXM5596 ", "latitude": 1.432086, "longitude": 104.136563, "altitude": 14575, "heading": 110, "speed": 369} +] +[ +{"datetime":"2023-08-02 14-35-55", "target": "AXM5596 ", "latitude": 1.432086, "longitude": 104.136563, "altitude": 14575, "heading": 110, "speed": 369} +] +[ +{"datetime":"2023-08-02 14-36-06", "target": "AXM5596 ", "latitude": 1.432086, "longitude": 104.136563, "altitude": 14575, "heading": 110, "speed": 369} +] +[ +{"datetime":"2023-08-02 14-36-16", "target": "AXM5596 ", "latitude": 1.432086, "longitude": 104.136563, "altitude": 14575, "heading": 110, "speed": 369} +] +[ +{"datetime":"2023-08-02 14-36-58", "target": "", "latitude": 1.384836, "longitude": 104.193484, "altitude": 35975, "heading": 298, "speed": 478} +] +[ +{"datetime":"2023-08-02 14-37-09", "target": "", "latitude": 1.384836, "longitude": 104.193484, "altitude": 35975, "heading": 298, "speed": 479} +] +[ +{"datetime":"2023-08-02 14-37-19", "target": "", "latitude": 1.384836, "longitude": 104.193484, "altitude": 35975, "heading": 298, "speed": 479} +] +[ +{"datetime":"2023-08-02 14-37-30", "target": "", "latitude": 1.384836, "longitude": 104.193484, "altitude": 35975, "heading": 298, "speed": 479} +] +[ +{"datetime":"2023-08-02 14-37-40", "target": "", "latitude": 1.430786, "longitude": 104.106306, "altitude": 36000, "heading": 298, "speed": 479} +] +[ +{"datetime":"2023-08-02 14-37-51", "target": "", "latitude": 1.442093, "longitude": 104.084752, "altitude": 36000, "heading": 298, "speed": 479} +] +[ +{"datetime":"2023-08-02 14-38-01", "target": "", "latitude": 1.442093, "longitude": 104.084752, "altitude": 36000, "heading": 298, "speed": 479} +] +[ +{"datetime":"2023-08-02 14-38-12", "target": "", "latitude": 1.442093, "longitude": 104.084752, "altitude": 36000, "heading": 298, "speed": 479} +] +[ +{"datetime":"2023-08-02 14-38-22", "target": "", "latitude": 1.472946, "longitude": 104.02591, "altitude": 36000, "heading": 298, "speed": 479} +] +[ +{"datetime":"2023-08-02 14-38-33", "target": "AXM712 ", "latitude": 1.44405, "longitude": 104.007047, "altitude": 11175, "heading": 306, "speed": 282}, {"hex": "750451", "target": "", "latitude": 1.482456, "longitude": 104.007758, "altitude": 36000, "heading": 298, "speed": 480} +] +[ +{"datetime":"2023-08-02 14-38-43", "target": "AXM712 ", "latitude": 1.452484, "longitude": 103.992113, "altitude": 11625, "heading": 300, "speed": 289}, {"hex": "750451", "target": "", "latitude": 1.482456, "longitude": 104.007758, "altitude": 36000, "heading": 298, "speed": 480} +] +[ +{"datetime":"2023-08-02 14-38-54", "target": "AXM712 ", "latitude": 1.45903, "longitude": 103.980382, "altitude": 12050, "heading": 299, "speed": 294}, {"hex": "750451", "target": "", "latitude": 1.482456, "longitude": 104.007758, "altitude": 36000, "heading": 298, "speed": 480} +] +[ +{"datetime":"2023-08-02 14-39-04", "target": "AXM712 ", "latitude": 1.465759, "longitude": 103.968325, "altitude": 12525, "heading": 300, "speed": 296}, {"hex": "750451", "target": "", "latitude": 1.482456, "longitude": 104.007758, "altitude": 36025, "heading": 298, "speed": 480} +] +[ +{"datetime":"2023-08-02 14-39-15", "target": "AXM712 ", "latitude": 1.473358, "longitude": 103.954778, "altitude": 13050, "heading": 300, "speed": 299}, {"hex": "750451", "target": "", "latitude": 1.482456, "longitude": 104.007758, "altitude": 36025, "heading": 298, "speed": 480} +] +[ +{"datetime":"2023-08-02 14-39-25", "target": "AXM712 ", "latitude": 1.480637, "longitude": 103.941883, "altitude": 13450, "heading": 300, "speed": 304}, {"hex": "750451", "target": "", "latitude": 1.482456, "longitude": 104.007758, "altitude": 36025, "heading": 298, "speed": 480} +] +[ +{"datetime":"2023-08-02 14-39-36", "target": "AXM712 ", "latitude": 1.488042, "longitude": 103.928675, "altitude": 13775, "heading": 300, "speed": 310}, {"hex": "750451", "target": "", "latitude": 1.482456, "longitude": 104.007758, "altitude": 36025, "heading": 298, "speed": 480} +] +[ +{"datetime":"2023-08-02 14-39-46", "target": "AXM712 ", "latitude": 1.490112, "longitude": 103.924938, "altitude": 14225, "heading": 300, "speed": 310}, {"hex": "750451", "target": "", "latitude": 1.482456, "longitude": 104.007758, "altitude": 36025, "heading": 298, "speed": 480} +] +[ +{"datetime":"2023-08-02 14-39-57", "target": "AXM712 ", "latitude": 1.502287, "longitude": 103.90334, "altitude": 14700, "heading": 300, "speed": 314}, {"hex": "750451", "target": "", "latitude": 1.482456, "longitude": 104.007758, "altitude": 36025, "heading": 298, "speed": 480} +] +[ +{"datetime":"2023-08-02 14-40-07", "target": "AXM712 ", "latitude": 1.510899, "longitude": 103.88795, "altitude": 15225, "heading": 300, "speed": 314}, {"hex": "750451", "target": "", "latitude": 1.482456, "longitude": 104.007758, "altitude": 36025, "heading": 298, "speed": 480} +] +[ +{"datetime":"2023-08-02 14-40-18", "target": "AXM712 ", "latitude": 1.510899, "longitude": 103.88795, "altitude": 15325, "heading": 300, "speed": 316} +] +[ +{"datetime":"2023-08-02 14-40-28", "target": "AXM712 ", "latitude": 1.510899, "longitude": 103.88795, "altitude": 15575, "heading": 300, "speed": 316} +] +[ +{"datetime":"2023-08-02 14-40-39", "target": "AXM712 ", "latitude": 1.510899, "longitude": 103.88795, "altitude": 15575, "heading": 300, "speed": 316} +] +[ +{"datetime":"2023-08-02 14-40-50", "target": "AXM712 ", "latitude": 1.510899, "longitude": 103.88795, "altitude": 15575, "heading": 300, "speed": 316} +] +[ +{"datetime":"2023-08-02 14-41-00", "target": "AXM712 ", "latitude": 1.510899, "longitude": 103.88795, "altitude": 15575, "heading": 300, "speed": 316} +] +[ +{"datetime":"2023-08-02 14-41-11", "target": "AXM712 ", "latitude": 1.510899, "longitude": 103.88795, "altitude": 15575, "heading": 300, "speed": 316} +] +[ +{"datetime":"2023-08-02 14-43-06", "target": "CSN354 ", "latitude": 1.424011, "longitude": 104.055471, "altitude": 11625, "heading": 342, "speed": 314} +] +[ +{"datetime":"2023-08-02 14-43-16", "target": "CSN354 ", "latitude": 1.424011, "longitude": 104.055471, "altitude": 11775, "heading": 342, "speed": 314} +] +[ +{"datetime":"2023-08-02 14-43-27", "target": "CSN354 ", "latitude": 1.424011, "longitude": 104.055471, "altitude": 11975, "heading": 342, "speed": 332} +] +[ +{"datetime":"2023-08-02 14-43-37", "target": "CSN354 ", "latitude": 1.424011, "longitude": 104.055471, "altitude": 12125, "heading": 342, "speed": 332} +] +[ +{"datetime":"2023-08-02 14-43-48", "target": "CSN354 ", "latitude": 1.424011, "longitude": 104.055471, "altitude": 12425, "heading": 342, "speed": 359} +] +[ +{"datetime":"2023-08-02 14-43-58", "target": "CSN354 ", "latitude": 1.424011, "longitude": 104.055471, "altitude": 12700, "heading": 342, "speed": 359} +] +[ +{"datetime":"2023-08-02 14-44-09", "target": "CSN354 ", "latitude": 1.424011, "longitude": 104.055471, "altitude": 13225, "heading": 342, "speed": 359} +] +[ +{"datetime":"2023-08-02 14-44-19", "target": "CSN354 ", "latitude": 1.424011, "longitude": 104.055471, "altitude": 13550, "heading": 342, "speed": 368} +] +[ +{"datetime":"2023-08-02 14-44-30", "target": "CSN354 ", "latitude": 1.56071, "longitude": 104.010362, "altitude": 13875, "heading": 341, "speed": 373} +] +[ +{"datetime":"2023-08-02 14-44-40", "target": "CSN354 ", "latitude": 1.577087, "longitude": 104.004542, "altitude": 14325, "heading": 341, "speed": 373} +] +[ +{"datetime":"2023-08-02 14-44-51", "target": "CSN354 ", "latitude": 1.577087, "longitude": 104.004542, "altitude": 14325, "heading": 341, "speed": 373} +] +[ +{"datetime":"2023-08-02 14-45-01", "target": "CSN354 ", "latitude": 1.577087, "longitude": 104.004542, "altitude": 15325, "heading": 341, "speed": 370} +] +[ +{"datetime":"2023-08-02 14-45-12", "target": "CSN354 ", "latitude": 1.62149, "longitude": 103.988668, "altitude": 15525, "heading": 341, "speed": 373} +] +[ +{"datetime":"2023-08-02 14-45-22", "target": "CSN354 ", "latitude": 1.62149, "longitude": 103.988668, "altitude": 15525, "heading": 341, "speed": 373} +] +[ +{"datetime":"2023-08-02 14-45-33", "target": "MXD178 ", "latitude": 1.384232, "longitude": 104.013015, "altitude": 38000, "heading": 309, "speed": 482}, {"hex": "780492", "target": "CCA450 ", "latitude": 1.428549, "longitude": 104.025374, "altitude": 11175, "heading": 347, "speed": 299}, {"hex": "781620", "target": "CSN354 ", "latitude": 1.62149, "longitude": 103.988668, "altitude": 15525, "heading": 341, "speed": 373} +] +[ +{"datetime":"2023-08-02 14-45-43", "target": "MXD178 ", "latitude": 1.392242, "longitude": 104.002913, "altitude": 38000, "heading": 309, "speed": 482}, {"hex": "780492", "target": "CCA450 ", "latitude": 1.429825, "longitude": 104.025072, "altitude": 11375, "heading": 347, "speed": 307}, {"hex": "781620", "target": "CSN354 ", "latitude": 1.62149, "longitude": 103.988668, "altitude": 15525, "heading": 341, "speed": 373} +] +[ +{"datetime":"2023-08-02 14-45-54", "target": "MXD178 ", "latitude": 1.407647, "longitude": 103.983559, "altitude": 38000, "heading": 309, "speed": 483}, {"hex": "780492", "target": "CCA450 ", "latitude": 1.457737, "longitude": 104.018602, "altitude": 11550, "heading": 347, "speed": 317}, {"hex": "781620", "target": "CSN354 ", "latitude": 1.62149, "longitude": 103.988668, "altitude": 15525, "heading": 341, "speed": 373} +] +[ +{"datetime":"2023-08-02 14-46-04", "target": "MXD178 ", "latitude": 1.407647, "longitude": 103.983559, "altitude": 38000, "heading": 309, "speed": 483}, {"hex": "780492", "target": "CCA450 ", "latitude": 1.472351, "longitude": 104.01497, "altitude": 11825, "heading": 347, "speed": 327}, {"hex": "781620", "target": "CSN354 ", "latitude": 1.62149, "longitude": 103.988668, "altitude": 15525, "heading": 341, "speed": 373} +] +[ +{"datetime":"2023-08-02 14-46-15", "target": "MXD178 ", "latitude": 1.407647, "longitude": 103.983559, "altitude": 38000, "heading": 309, "speed": 483}, {"hex": "780492", "target": "CCA450 ", "latitude": 1.484299, "longitude": 104.010967, "altitude": 12175, "heading": 341, "speed": 332} +] +[ +{"datetime":"2023-08-02 14-46-25", "target": "MXD178 ", "latitude": 1.456604, "longitude": 103.922052, "altitude": 38000, "heading": 309, "speed": 486}, {"hex": "780492", "target": "CCA450 ", "latitude": 1.501236, "longitude": 104.004868, "altitude": 12575, "heading": 340, "speed": 336} +] +[ +{"datetime":"2023-08-02 14-46-36", "target": "MXD178 ", "latitude": 1.457748, "longitude": 103.920655, "altitude": 38000, "heading": 309, "speed": 486}, {"hex": "780492", "target": "CCA450 ", "latitude": 1.519226, "longitude": 103.998211, "altitude": 12975, "heading": 340, "speed": 339} +] +[ +{"datetime":"2023-08-02 14-46-46", "target": "MXD178 ", "latitude": 1.484756, "longitude": 103.886765, "altitude": 38000, "heading": 309, "speed": 488}, {"hex": "780492", "target": "CCA450 ", "latitude": 1.533371, "longitude": 103.992998, "altitude": 13425, "heading": 340, "speed": 341} +] +[ +{"datetime":"2023-08-02 14-46-57", "target": "MXD178 ", "latitude": 1.484756, "longitude": 103.886765, "altitude": 38000, "heading": 309, "speed": 488}, {"hex": "780492", "target": "CCA450 ", "latitude": 1.55072, "longitude": 103.986527, "altitude": 13800, "heading": 340, "speed": 346} +] +[ +{"datetime":"2023-08-02 14-47-07", "target": "MXD178 ", "latitude": 1.484756, "longitude": 103.886765, "altitude": 38000, "heading": 309, "speed": 488}, {"hex": "780492", "target": "CCA450 ", "latitude": 1.559407, "longitude": 103.983275, "altitude": 14025, "heading": 340, "speed": 348} +] +[ +{"datetime":"2023-08-02 14-47-18", "target": "MXD178 ", "latitude": 1.484756, "longitude": 103.886765, "altitude": 38000, "heading": 309, "speed": 488}, {"hex": "780492", "target": "CCA450 ", "latitude": 1.559407, "longitude": 103.983275, "altitude": 14775, "heading": 340, "speed": 348} +] +[ +{"datetime":"2023-08-02 14-47-28", "target": "MXD178 ", "latitude": 1.484756, "longitude": 103.886765, "altitude": 38000, "heading": 309, "speed": 488}, {"hex": "780492", "target": "CCA450 ", "latitude": 1.588394, "longitude": 103.972608, "altitude": 14975, "heading": 340, "speed": 346} +] +[ +{"datetime":"2023-08-02 14-47-39", "target": "MXD178 ", "latitude": 1.484756, "longitude": 103.886765, "altitude": 38000, "heading": 309, "speed": 488}, {"hex": "780492", "target": "CCA450 ", "latitude": 1.588394, "longitude": 103.972608, "altitude": 14975, "heading": 340, "speed": 346} +] +[ +{"datetime":"2023-08-02 14-47-49", "target": "CCA450 ", "latitude": 1.588394, "longitude": 103.972608, "altitude": 14975, "heading": 340, "speed": 346} +] +[ +{"datetime":"2023-08-02 14-48-00", "target": "CCA450 ", "latitude": 1.588394, "longitude": 103.972608, "altitude": 14975, "heading": 340, "speed": 346} +] +[ +{"datetime":"2023-08-02 14-48-10", "target": "CCA450 ", "latitude": 1.588394, "longitude": 103.972608, "altitude": 14975, "heading": 340, "speed": 346} +] +[ +{"datetime":"2023-08-02 14-48-21", "target": "CCA450 ", "latitude": 1.588394, "longitude": 103.972608, "altitude": 14975, "heading": 340, "speed": 346} +] +[ +{"datetime":"2023-08-02 14-49-44", "target": "", "latitude": 1.554932, "longitude": 103.989739, "altitude": 11400, "heading": 339, "speed": 385} +] +[ +{"datetime":"2023-08-02 14-49-55", "target": "SIA7862 ", "latitude": 1.560928, "longitude": 103.987411, "altitude": 11675, "heading": 339, "speed": 386} +] +[ +{"datetime":"2023-08-02 14-50-05", "target": "SIA7862 ", "latitude": 1.560928, "longitude": 103.987411, "altitude": 11675, "heading": 339, "speed": 386} +] +[ +{"datetime":"2023-08-02 14-50-16", "target": "SIA7862 ", "latitude": 1.560928, "longitude": 103.987411, "altitude": 11675, "heading": 339, "speed": 386} +] +[ +{"datetime":"2023-08-02 14-50-26", "target": "SIA7862 ", "latitude": 1.560928, "longitude": 103.987411, "altitude": 11675, "heading": 339, "speed": 386} +] +[ +{"datetime":"2023-08-02 14-50-37", "target": "SIA7862 ", "latitude": 1.560928, "longitude": 103.987411, "altitude": 11675, "heading": 339, "speed": 386} +] +[ +{"datetime":"2023-08-02 14-50-47", "target": "SIA7862 ", "latitude": 1.560928, "longitude": 103.987411, "altitude": 11675, "heading": 339, "speed": 386} +] +[ +{"datetime":"2023-08-02 14-50-58", "target": "CQN2096 ", "latitude": 1.356532, "longitude": 104.044695, "altitude": 8600, "heading": 348, "speed": 286}, {"hex": "76ccd0", "target": "SIA7862 ", "latitude": 1.560928, "longitude": 103.987411, "altitude": 11675, "heading": 339, "speed": 386} +] +[ +{"datetime":"2023-08-02 14-51-08", "target": "CQN2096 ", "latitude": 1.374222, "longitude": 104.040811, "altitude": 9750, "heading": 348, "speed": 280}, {"hex": "76ccd0", "target": "SIA7862 ", "latitude": 1.560928, "longitude": 103.987411, "altitude": 11675, "heading": 339, "speed": 386} +] +[ +{"datetime":"2023-08-02 14-51-19", "target": "CQN2096 ", "latitude": 1.391679, "longitude": 104.036976, "altitude": 10300, "heading": 348, "speed": 279} +] +[ +{"datetime":"2023-08-02 14-51-29", "target": "CQN2096 ", "latitude": 1.401352, "longitude": 104.034941, "altitude": 10500, "heading": 348, "speed": 279} +] +[ +{"datetime":"2023-08-02 14-51-40", "target": "CQN2096 ", "latitude": 1.401352, "longitude": 104.034941, "altitude": 10925, "heading": 343, "speed": 298} +] +[ +{"datetime":"2023-08-02 14-51-50", "target": "CQN2096 ", "latitude": 1.431342, "longitude": 104.026747, "altitude": 11250, "heading": 341, "speed": 304} +] +[ +{"datetime":"2023-08-02 14-52-01", "target": "CQN2096 ", "latitude": 1.447723, "longitude": 104.020929, "altitude": 11550, "heading": 341, "speed": 312} +] +[ +{"datetime":"2023-08-02 14-52-11", "target": "CQN2096 ", "latitude": 1.447723, "longitude": 104.020929, "altitude": 11875, "heading": 341, "speed": 316} +] +[ +{"datetime":"2023-08-02 14-52-22", "target": "CQN2096 ", "latitude": 1.481323, "longitude": 104.008965, "altitude": 12200, "heading": 341, "speed": 328} +] +[ +{"datetime":"2023-08-02 14-52-32", "target": "MXD158 ", "latitude": 1.409555, "longitude": 103.997861, "altitude": 36000, "heading": 307, "speed": 493}, {"hex": "7814e7", "target": "CQN2096 ", "latitude": 1.495972, "longitude": 104.003751, "altitude": 12500, "heading": 341, "speed": 332} +] +[ +{"datetime":"2023-08-02 14-52-43", "target": "MXD158 ", "latitude": 1.413652, "longitude": 103.992415, "altitude": 36000, "heading": 307, "speed": 493}, {"hex": "7814e7", "target": "CQN2096 ", "latitude": 1.509829, "longitude": 103.998855, "altitude": 12775, "heading": 341, "speed": 341} +] +[ +{"datetime":"2023-08-02 14-52-53", "target": "MXD158 ", "latitude": 1.413652, "longitude": 103.992415, "altitude": 36000, "heading": 307, "speed": 492}, {"hex": "7814e7", "target": "CQN2096 ", "latitude": 1.525681, "longitude": 103.993277, "altitude": 13100, "heading": 341, "speed": 348} +] +[ +{"datetime":"2023-08-02 14-53-04", "target": "MXD158 ", "latitude": 1.413652, "longitude": 103.992415, "altitude": 36000, "heading": 307, "speed": 492}, {"hex": "7814e7", "target": "CQN2096 ", "latitude": 1.543533, "longitude": 103.986992, "altitude": 13425, "heading": 341, "speed": 354} +] +[ +{"datetime":"2023-08-02 14-53-14", "target": "MXD158 ", "latitude": 1.413652, "longitude": 103.992415, "altitude": 36000, "heading": 307, "speed": 492}, {"hex": "7814e7", "target": "CQN2096 ", "latitude": 1.556288, "longitude": 103.982565, "altitude": 13700, "heading": 341, "speed": 359} +] +[ +{"datetime":"2023-08-02 14-53-25", "target": "MXD158 ", "latitude": 1.413652, "longitude": 103.992415, "altitude": 36000, "heading": 307, "speed": 492}, {"hex": "7814e7", "target": "CQN2096 ", "latitude": 1.561066, "longitude": 103.980894, "altitude": 14075, "heading": 341, "speed": 365} +] +[ +{"datetime":"2023-08-02 14-53-35", "target": "MXD158 ", "latitude": 1.485947, "longitude": 103.897042, "altitude": 36000, "heading": 307, "speed": 492}, {"hex": "7814e7", "target": "CQN2096 ", "latitude": 1.593384, "longitude": 103.969535, "altitude": 14375, "heading": 341, "speed": 369} +] +[ +{"datetime":"2023-08-02 14-53-46", "target": "MXD158 ", "latitude": 1.485947, "longitude": 103.897042, "altitude": 36000, "heading": 307, "speed": 492}, {"hex": "7814e7", "target": "CQN2096 ", "latitude": 1.600233, "longitude": 103.967127, "altitude": 14500, "heading": 341, "speed": 371} +] +[ +{"datetime":"2023-08-02 14-53-56", "target": "MXD158 ", "latitude": 1.485947, "longitude": 103.897042, "altitude": 36000, "heading": 307, "speed": 492}, {"hex": "7814e7", "target": "CQN2096 ", "latitude": 1.600233, "longitude": 103.967127, "altitude": 14500, "heading": 341, "speed": 371} +] +[ +{"datetime":"2023-08-02 14-54-07", "target": "MXD158 ", "latitude": 1.485947, "longitude": 103.897042, "altitude": 36000, "heading": 307, "speed": 492}, {"hex": "7814e7", "target": "CQN2096 ", "latitude": 1.600233, "longitude": 103.967127, "altitude": 14500, "heading": 341, "speed": 371} +] +[ +{"datetime":"2023-08-02 14-54-17", "target": "MXD158 ", "latitude": 1.485947, "longitude": 103.897042, "altitude": 36000, "heading": 307, "speed": 492}, {"hex": "7814e7", "target": "CQN2096 ", "latitude": 1.600233, "longitude": 103.967127, "altitude": 14500, "heading": 341, "speed": 371} +] +[ +{"datetime":"2023-08-02 14-54-28", "target": "MXD158 ", "latitude": 1.485947, "longitude": 103.897042, "altitude": 36000, "heading": 307, "speed": 492}, {"hex": "7814e7", "target": "CQN2096 ", "latitude": 1.600233, "longitude": 103.967127, "altitude": 14500, "heading": 341, "speed": 371} +] +[ +{"datetime":"2023-08-02 14-54-38", "target": "CQN2096 ", "latitude": 1.600233, "longitude": 103.967127, "altitude": 14500, "heading": 341, "speed": 371} +] +[ +{"datetime":"2023-08-02 14-59-22", "target": "", "latitude": 1.576678, "longitude": 103.965375, "altitude": 42975, "heading": 354, "speed": 467} +] +[ +{"datetime":"2023-08-02 14-59-32", "target": "", "latitude": 1.576678, "longitude": 103.965375, "altitude": 42975, "heading": 354, "speed": 467} +] +[ +{"datetime":"2023-08-02 14-59-43", "target": "", "latitude": 1.576678, "longitude": 103.965375, "altitude": 42975, "heading": 354, "speed": 467} +] +[ +{"datetime":"2023-08-02 14-59-54", "target": "", "latitude": 1.576678, "longitude": 103.965375, "altitude": 42975, "heading": 354, "speed": 467} +] +[ +{"datetime":"2023-08-02 15-00-04", "target": "", "latitude": 1.576678, "longitude": 103.965375, "altitude": 42975, "heading": 354, "speed": 467} +] +[ +{"datetime":"2023-08-02 15-00-15", "target": "", "latitude": 1.576678, "longitude": 103.965375, "altitude": 42975, "heading": 354, "speed": 467} +] +[ +{"datetime":"2023-08-02 15-00-25", "target": "", "latitude": 1.576678, "longitude": 103.965375, "altitude": 42975, "heading": 354, "speed": 467} +] +[ +{"datetime":"2023-08-02 15-00-36", "target": "", "latitude": 1.576678, "longitude": 103.965375, "altitude": 42975, "heading": 354, "speed": 467} +] +[ +{"datetime":"2023-08-02 15-04-58", "target": "BAV308 ", "latitude": 1.387253, "longitude": 104.042762, "altitude": 9950, "heading": 348, "speed": 281} +] +[ +{"datetime":"2023-08-02 15-05-08", "target": "BAV308 ", "latitude": 1.387253, "longitude": 104.042762, "altitude": 10150, "heading": 348, "speed": 281} +] +[ +{"datetime":"2023-08-02 15-05-19", "target": "BAV308 ", "latitude": 1.426361, "longitude": 104.034277, "altitude": 10825, "heading": 348, "speed": 300} +] +[ +{"datetime":"2023-08-02 15-05-29", "target": "BAV308 ", "latitude": 1.430643, "longitude": 104.033329, "altitude": 11050, "heading": 348, "speed": 306} +] +[ +{"datetime":"2023-08-02 15-05-40", "target": "BAV308 ", "latitude": 1.430643, "longitude": 104.033329, "altitude": 11175, "heading": 347, "speed": 321} +] +[ +{"datetime":"2023-08-02 15-05-50", "target": "BAV308 ", "latitude": 1.430643, "longitude": 104.033329, "altitude": 11425, "heading": 347, "speed": 321} +] +[ +{"datetime":"2023-08-02 15-06-01", "target": "BAV308 ", "latitude": 1.430643, "longitude": 104.033329, "altitude": 11650, "heading": 347, "speed": 321} +] +[ +{"datetime":"2023-08-02 15-06-11", "target": "BAV308 ", "latitude": 1.430643, "longitude": 104.033329, "altitude": 11975, "heading": 347, "speed": 357} +] +[ +{"datetime":"2023-08-02 15-06-22", "target": "BAV308 ", "latitude": 1.430643, "longitude": 104.033329, "altitude": 12425, "heading": 347, "speed": 357} +] +[ +{"datetime":"2023-08-02 15-06-32", "target": "BAV308 ", "latitude": 1.430643, "longitude": 104.033329, "altitude": 12850, "heading": 347, "speed": 364} +] +[ +{"datetime":"2023-08-02 15-06-43", "target": "BAV308 ", "latitude": 1.556986, "longitude": 104.003827, "altitude": 13350, "heading": 347, "speed": 365} +] +[ +{"datetime":"2023-08-02 15-06-53", "target": "BAV308 ", "latitude": 1.571594, "longitude": 104.000399, "altitude": 13700, "heading": 347, "speed": 369} +] +[ +{"datetime":"2023-08-02 15-07-04", "target": "BAV308 ", "latitude": 1.577935, "longitude": 103.998855, "altitude": 13825, "heading": 347, "speed": 369} +] +[ +{"datetime":"2023-08-02 15-07-14", "target": "BAV308 ", "latitude": 1.577935, "longitude": 103.998855, "altitude": 14675, "heading": 347, "speed": 369} +] +[ +{"datetime":"2023-08-02 15-07-25", "target": "BAV308 ", "latitude": 1.577935, "longitude": 103.998855, "altitude": 14700, "heading": 347, "speed": 369} +] +[ +{"datetime":"2023-08-02 15-07-35", "target": "BAV308 ", "latitude": 1.577935, "longitude": 103.998855, "altitude": 14700, "heading": 347, "speed": 369} +] +[ +{"datetime":"2023-08-02 15-07-46", "target": "BAV308 ", "latitude": 1.577935, "longitude": 103.998855, "altitude": 14700, "heading": 347, "speed": 369} +] +[ +{"datetime":"2023-08-02 15-07-56", "target": "BAV308 ", "latitude": 1.577935, "longitude": 103.998855, "altitude": 14700, "heading": 347, "speed": 369} +] +[ +{"datetime":"2023-08-02 15-08-07", "target": "BAV308 ", "latitude": 1.577935, "longitude": 103.998855, "altitude": 14700, "heading": 347, "speed": 369} +] diff --git a/feed1090/TODO b/feed1090/TODO new file mode 100644 index 0000000..e69de29 diff --git a/feed1090/para_kill.py b/feed1090/para_kill.py new file mode 100644 index 0000000..f186292 --- /dev/null +++ b/feed1090/para_kill.py @@ -0,0 +1,80 @@ + +import paramiko +import time +from icecream import ic +from subprocess import Popen, PIPE +from threading import Thread + +def dump_kill(): + pi_ip = '100.81.91.96' + pi_user = "pi" + pi_password = "raspberry" + time.sleep(1) + + try: + pi_client = paramiko.client.SSHClient() + pi_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + pi_client.connect(pi_ip, username=pi_user, password=pi_password, timeout=5) + + try: + ic('Killing dump1090...') + dump1090_kill = "ps -aux | grep ./dump1090/dump1090 | awk '{print $2}' | xargs kill -9" + _stdin, _stdout,_stderr = pi_client.exec_command(dump1090_kill) + time.sleep(2) + + ic('Killing all SSH stream data...') + kill_ssh_tail = "ps -aux | grep ConnectTimeout=5 | awk '{print $2}' | xargs kill -9" + Popen(kill_ssh_tail, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE) + + except Exception as e: + print(e) + except Exception as e: + print(e) + +def log_kill(): + pi_ip = '100.81.91.96' + pi_user = "pi" + pi_password = "raspberry" + time.sleep(1) + + try: + pi_client = paramiko.client.SSHClient() + pi_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + pi_client.connect(pi_ip, username=pi_user, password=pi_password, timeout=5) + + try: + ic('Killing log1090...') + log1090_kill = "ps -aux | grep log1090.py | awk '{print $2}' | xargs kill -9" + _stdin, _stdout,_stderr = pi_client.exec_command(log1090_kill) + time.sleep(2) + ic('Killing all SSH stream data...') + kill_ssh_tail = "ps -aux | grep ConnectTimeout=5 | awk '{print $2}' | xargs kill -9" + Popen(kill_ssh_tail, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE) + ic('Complete.') + + except Exception as e: + print(e) + except Exception as e: + print(e) + +def main(): + ic('Killing file sync loop...') + kill_read = "ps -aux | grep para_start.py | awk '{print $2}' | xargs kill -9" + Popen(kill_read, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE) + ic('Killing file read SSH 1/3...') + kill_ssh_tail = "ps -aux | grep ConnectTimeout=5 | awk '{print $2}' | xargs kill -9" + Popen(kill_ssh_tail, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE) + ic('Killing file read SSH 2/3...') + kill_ssh_tail = "ps -aux | grep ConnectTimeout=5 | awk '{print $2}' | xargs kill -9" + Popen(kill_ssh_tail, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE) + ic('Killing file read SSH 3/3...') + kill_ssh_tail = "ps -aux | grep ConnectTimeout=5 | awk '{print $2}' | xargs kill -9" + Popen(kill_ssh_tail, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE) + D = Thread(target=dump_kill) + L = Thread(target=log_kill) + D.start() + time.sleep(6) + ic('Re-SSHing to pi...') + L.start() + +main() diff --git a/feed1090/para_start.py b/feed1090/para_start.py new file mode 100644 index 0000000..9cefcee --- /dev/null +++ b/feed1090/para_start.py @@ -0,0 +1,86 @@ +import paramiko +import time +from icecream import ic +from subprocess import Popen, PIPE +from threading import Thread +import select + +pi_ip = '100.81.91.96' +pi_user = "pi" +pi_password = "raspberry" +local_user = 'anton' + +def dump_start(): + global pi_ip, pi_user, pi_password + + try: + pi_client = paramiko.client.SSHClient() + pi_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + pi_client.connect(pi_ip, username=pi_user, password=pi_password, timeout=5) + + try: + ic('Launching dump1090...') + dump1090_launch = "./dump1090/dump1090 --net" + _stdin, _stdout,_stderr = pi_client.exec_command(dump1090_launch) + time.sleep(5) + + ic('Killing all SSH stream data...') + kill_ssh_tail = "ps -aux | grep ConnectTimeout=5 | awk '{print $2}' | xargs kill -9" + Popen(kill_ssh_tail, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE) + + except Exception as e: + print(e) + except Exception as e: + print(e) + +def log_start(): + global pi_ip, pi_user, pi_password + + try: + pi_client = paramiko.client.SSHClient() + pi_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + pi_client.connect(pi_ip, username=pi_user, password=pi_password, timeout=5) + + try: + ic('Launching log1090...') + log1090_launch = "python ./log1090/log1090.py" + _stdin, _stdout,_stderr = pi_client.exec_command(log1090_launch) + time.sleep(2) + + ic('Killing all SSH stream data...') + kill_ssh_tail = "ps -aux | grep ConnectTimeout=5 | awk '{print $2}' | xargs kill -9" + Popen(kill_ssh_tail, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE) + time.sleep(1) + + except Exception as e: + print(e) + except Exception as e: + print(e) + +def log_sync(): + global pi_ip, pi_user, pi_password + dateString = time.strftime('%d-%m-%Y') + # before trying to to append, scp file over first + try: + copyFile = f'''sshpass -p {pi_password} scp {pi_user}@{pi_ip}:/home/pi/log1090/{dateString} /home/{local_user}/adsb-track-player/feed1090/{dateString}/feed1090.json''' + Popen(copyFile, shell=True, stdout=PIPE, stderr=PIPE, text=True) + syncUpdate = time.strftime('[%H-%M-%S] '+dateString+' synced') + ic(syncUpdate) + except Exception as e: + ic(e) + +def main(): + D = Thread(target=dump_start) + L = Thread(target=log_start) + D.start() + time.sleep(10) + ic('Re-SSHing to pi...') + L.start() + time.sleep(7) + ic('Starting file sync loop...') + while True: + log_sync() + time.sleep(10) + + +main() diff --git a/logfile.csv b/logfile.csv index 83444ff..0e96463 100644 --- a/logfile.csv +++ b/logfile.csv @@ -745,4 +745,54 @@ DATETIME,CALLSIGN,LAT,LONG,ALT,SPD,TRKANGLE 2023-08-02 13:49:16.021378,ZSB0FYEN,-0.7279499440004962,102.32532695268871,39.63607502862229,26.183893570418864,16.98511961831997 2023-08-02 13:49:16.523630,5U8PI09S,-0.4863639967041198,103.08191015754213,57.35662063071939,10.275669091051869,200.77331545709956 2023-08-02 13:49:17.000680,6B2JLW5H,-0.803391077411066,102.6061194500636,81.34155071755458,18.362020989171096,241.70138225388496 -2023-08-02 13:49:17.502895,QOZ2JE7B,-1.673779925093208,103.1986873048903,35.62286522150984,29.240527402490656,28.603952185403614 \ No newline at end of file +2023-08-02 13:49:17.502895,QOZ2JE7B,-1.673779925093208,103.1986873048903,35.62286522150984,29.240527402490656,28.603952185403614 +2023-08-02 14:21:58.247475,S63DJANG,0.4924431354366907,103.04930647754647,8391.391232708545,39.65588756833961,96.754226962162 +2023-08-02 14:21:58.749945,M6LJPCT4,1.0460849049666041,102.51643157909275,15387.83187636428,78.92484185152337,154.6118718708198 +2023-08-02 14:21:59.252128,BTFCWUS5,0.9056605828047091,103.0055361839461,8406.402232192582,78.57954085922603,253.84192664473417 +2023-08-02 14:21:59.754281,SOIDHM4L,0.005091189115043582,103.12057577345328,11275.879069133844,21.525123311720506,304.674423254995 +2023-08-02 14:22:00.256195,CEMFHZ42,0.3297635801983665,103.80856701449606,666.4862611095141,27.605505073759385,98.82605051792535 +2023-08-02 14:22:00.758287,4U3HJAPL,0.48071093599874115,103.9196222659165,1322.2881718147958,19.613066312091597,229.2800642068461 +2023-08-02 14:22:01.260476,C7AX2NWD,1.1375666048983455,103.21581899311329,1093.4503789419482,13.636856566802587,177.90176214768076 +2023-08-02 14:22:01.761994,UQ9EKYJ4,0.5996302805816967,103.20772724730611,939.0740234225691,2.0654153033961133,190.4992218469976 +2023-08-02 14:22:03.703330,QWOX0YR8,0.5009174280025095,104.24112153015811,1754.6565543255392,181.2827392329152,24.476739844092947 +2023-08-02 14:22:04.206167,D5M0JC81,1.4947546201367354,103.51393076536766,3159.706414503997,228.38623025363307,41.706765068207915 +2023-08-02 14:22:04.707950,8NBAFO0W,1.0434932121479195,103.6704490756502,1917.8278502301953,46.68604313790985,194.34643682409228 +2023-08-02 14:22:05.209795,MLRC2ED8,1.7125506191832371,103.79458389646493,1896.3725764804174,22.413263813442853,117.85112758701376 +2023-08-02 14:22:10.269927,E4UCD6HN,1.663352543091341,103.42849596146593,8864.024856459613,12.047569173198113,326.65065376497904 +2023-08-02 14:22:10.772211,I8Z0G9DT,1.6129289797865303,104.03276110313902,16082.774818372793,3.9208967248899906,79.64601164074156 +2023-08-02 14:22:11.274283,MGLOD9QU,1.4649693868975096,104.49485159369567,20126.626651679,3.7977152598380846,297.02587165183326 +2023-08-02 14:22:11.776429,5T3ENVU1,2.252977082613291,103.73059528499485,12613.30210993288,7.1342630471962565,35.95288041540431 +2023-08-02 14:22:12.278606,F9BUJ4NO,2.80717793460895,103.01028514344188,9505.238754414191,8.515214179911794,91.61231676790189 +2023-08-02 14:57:34.391345,0I9L8Y65,1.201219496691201,103.7205644053208,1833.5630380686434,147.1554202853344,332.27147138056205 +2023-08-02 14:57:34.897105,40CDWAZ5,1.3919453308127034,102.76209639631301,295.2107274003988,16.880959814988387,84.5425039481425 +2023-08-02 14:57:35.400510,Z342HQI0,0.9282904823473379,102.31939709519165,67.76574215187429,30.67883276900228,21.023168234189995 +2023-08-02 14:57:45.422724,NAM2F60L,2.17147948480906,103.12782150152618,7648.55151107502,125.18895741147935,130.40532691515347 +2023-08-02 14:57:45.925221,J1QC8PVY,1.8816461239590654,103.42213748463435,11670.94247496166,37.085814087079584,105.91348869862651 +2023-08-02 14:57:46.427515,4FLK3V0N,1.9580823880726281,102.75560136581456,21548.884574334825,11.20135584802658,265.94212528873663 +2023-08-02 14:57:46.929783,5UIFP4MD,2.670511565323741,102.51114299356273,30387.117855603945,3.5398251984448184,333.0208969225854 +2023-08-02 14:57:47.432002,FCHL4P1M,3.597350660675758,101.64982010523798,158.1883221355638,3.4523886752311106,29.793686546874824 +2023-08-02 14:57:47.934218,XDK53MGN,3.9975953295773463,101.42173062704741,33.70765334550441,2.7635814547999553,121.84969552047313 +2023-08-02 14:57:48.436514,LIX3PHV8,4.394616096732001,100.93107078300105,16.803064252945305,4.458312001478792,217.12347509146633 +2023-08-02 14:58:44.674375,OLCHF92N,2.3089638506994214,104.63149312257025,6966.140341328988,275.57484164312876,38.78087624949686 +2023-08-02 14:58:45.177669,USLYDRZ3,2.350406311937717,104.41393332239568,11646.338474246402,354.51041241351686,35.12072132410265 +2023-08-02 14:58:45.679894,CQUTZGDB,2.0782439576813587,103.85487559312946,22350.25863292125,635.4282892244678,277.2224117253877 +2023-08-02 14:58:46.182118,VNCFR3ST,2.099101728363144,103.1158757976811,12327.554453218478,129.82348196628288,252.85005786515467 +2023-08-02 14:58:46.684423,UWITX8K9,1.5513932525700842,102.31220068724184,18350.45464907165,112.1130439211657,176.703462341045 +2023-08-02 14:59:13.209041,0K6ZMQGB,1.696262129831172,103.12514661184,5539.285847495722,78.00855486255954,143.80309970883587 +2023-08-02 14:59:13.712173,KQC15L8J,2.3349763696126846,102.4362044977543,800.704575191301,69.85847981828114,352.0023115835161 +2023-08-02 14:59:14.214354,WUQ4VIFS,1.614996312905037,103.24815899678232,1284.0499265287551,12.952761697987349,5.302769828162127 +2023-08-02 14:59:14.716467,96JPTR3A,1.1269245368032876,104.05628879530421,990.3911459536495,19.954377383778947,85.40644328183163 +2023-08-02 14:59:16.847046,ENXQH213,1.3614613706577066,104.4529739042053,5358.426527333534,177.61798509590758,266.92149611735175 +2023-08-02 14:59:17.350329,R3FBZ60K,0.4025383497513122,104.59512234459243,1788.1647265277425,171.94607770238233,15.04263790214128 +2023-08-02 14:59:17.852686,6P4UDLW7,0.8916111945723353,104.17974429980794,3535.979996435535,7.960671291056855,318.54053041327955 +2023-08-02 14:59:52.326398,U8W5KS0J,1.4221503081437574,103.48247759983204,2481.970519566025,58.393924457165326,246.642687541039 +2023-08-02 14:59:52.829358,2UB3P7RF,0.554954808583922,104.07913764285448,4135.17415110551,39.097990303494,104.53779225676624 +2023-08-02 14:59:53.331494,DKJZV27O,0.6565623100471332,103.229022692173,7344.222735192604,58.839929455429235,347.6300534316264 +2023-08-02 14:59:53.833643,YW8GO7NM,-0.25805912914447293,102.77752926071857,3743.6987477914336,62.4479840862124,220.12677516300982 +2023-08-02 14:59:55.908912,E2B9PTN8,0.8223098873273682,103.20650289010806,7044.528117794101,37.04259526943082,157.88479190393159 +2023-08-02 14:59:56.411410,4YP9V0W1,0.11676397361386548,103.18200668103367,4163.214930664257,42.285839455103,334.79469848818917 +2023-08-02 14:59:56.913651,32T8X9WH,0.24534387304709826,103.4732153540419,4438.303213301147,26.235087615229173,39.68356803008487 +2023-08-02 14:59:57.415908,5T1CZDQA,0.6539384268502406,103.81454667649514,5296.220298963215,21.02144212258348,243.96007676530715 +2023-08-02 15:00:15.616815,7Z2IY06T,1.3463431641764123,103.62213586245083,3524.6420953130582,85.51492573590866,179.5742884492715 +2023-08-02 15:00:16.119327,PZJ846TN,2.19782767869354,104.00760992701257,2515.6497384149407,170.70613977833642,71.30461222575377 +2023-08-02 15:00:16.621429,A5HDU7QP,1.2650688596869637,103.73507508456144,4624.373286060124,173.99896367632644,279.5958717164698 \ No newline at end of file From ff988482367dfa28eeaf0c4aec2169aed3995587 Mon Sep 17 00:00:00 2001 From: Anton Chua Date: Fri, 4 Aug 2023 16:36:09 +0800 Subject: [PATCH 20/22] Fix feed1090 - feed1090 now works - log1090backup now shows what is running on the rPi - minor bug fixes --- FlightPathSimulator.py | 60 ++- HackRfBroadcastThread.py | 2 +- WaypointsTrajectorySimulator.py | 5 +- adsb-track-player.py | 2 +- feed1090/2023-08-02_1090ES.json | 489 ------------------ feed1090/feed1090.json | 22 + feed1090/json_process.py | 6 + .../2023-08-04_1090ES.json | 22 + feed1090/log1090backup_4aug23/2023-08-04_ufo | 1 + .../log1090backup_4aug23/dump1090_data.json | 3 + feed1090/log1090backup_4aug23/json_test.py | 4 + .../2023-07-26 10-39-06_1090ES | 1 + .../2023-07-26 10-51-10_1090ES | 1 + .../2023-07-26 10-51-42_1090ES | 1 + .../2023-07-26 10-53-47_1090ES | 1 + .../2023-07-26 10-54-19_1090ES | 1 + .../2023-07-26 11-06-29_1090ES | 1 + .../2023-07-26 11-07-00_1090ES | 1 + .../2023-07-26 11-07-32_1090ES | 1 + .../2023-07-26 11-12-15_1090ES | 1 + .../2023-07-26 11-12-46_1090ES | 1 + .../2023-07-26 11-13-49_1090ES | 1 + .../2023-07-26 11-14-20_1090ES | 1 + .../2023-07-26 11-21-41_1090ES | 1 + .../2023-07-26 11-22-12_1090ES | 1 + .../2023-07-26 15-30-28_1090ES | 1 + .../2023-07-26 15-31-00_1090ES | 1 + .../2023-07-26_1090ES_Log/live1090.json | 1 + feed1090/log1090backup_4aug23/live1090.json | 1 + feed1090/log1090backup_4aug23/log1090.py | 100 ++++ feed1090/log1090backup_4aug23/master1090.py | 45 ++ feed1090/log1090backup_4aug23/subprocess | 0 feed1090/para_kill.py | 11 +- feed1090/para_start.py | 180 ++++--- feed1090/para_start_test.py | 94 ++++ feed1090/read_loop.py | 24 + logfile.csv | 151 +++++- pyhackrf.py | 6 +- 38 files changed, 664 insertions(+), 581 deletions(-) delete mode 100644 feed1090/2023-08-02_1090ES.json create mode 100644 feed1090/feed1090.json create mode 100644 feed1090/json_process.py create mode 100644 feed1090/log1090backup_4aug23/2023-08-04_1090ES.json create mode 100644 feed1090/log1090backup_4aug23/2023-08-04_ufo create mode 100644 feed1090/log1090backup_4aug23/dump1090_data.json create mode 100644 feed1090/log1090backup_4aug23/json_test.py create mode 100644 feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 10-39-06_1090ES create mode 100644 feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 10-51-10_1090ES create mode 100644 feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 10-51-42_1090ES create mode 100644 feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 10-53-47_1090ES create mode 100644 feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 10-54-19_1090ES create mode 100644 feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 11-06-29_1090ES create mode 100644 feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 11-07-00_1090ES create mode 100644 feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 11-07-32_1090ES create mode 100644 feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 11-12-15_1090ES create mode 100644 feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 11-12-46_1090ES create mode 100644 feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 11-13-49_1090ES create mode 100644 feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 11-14-20_1090ES create mode 100644 feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 11-21-41_1090ES create mode 100644 feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 11-22-12_1090ES create mode 100644 feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 15-30-28_1090ES create mode 100644 feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 15-31-00_1090ES create mode 100644 feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/live1090.json create mode 100644 feed1090/log1090backup_4aug23/live1090.json create mode 100755 feed1090/log1090backup_4aug23/log1090.py create mode 100755 feed1090/log1090backup_4aug23/master1090.py create mode 100644 feed1090/log1090backup_4aug23/subprocess create mode 100644 feed1090/para_start_test.py create mode 100644 feed1090/read_loop.py diff --git a/FlightPathSimulator.py b/FlightPathSimulator.py index b80a378..c5e309a 100644 --- a/FlightPathSimulator.py +++ b/FlightPathSimulator.py @@ -15,7 +15,6 @@ import random import datetime, math -import os from math import asin, atan2, cos, degrees, radians, sin from AbstractTrajectorySimulatorBase import AbstractTrajectorySimulatorBase @@ -25,9 +24,9 @@ def get_point_at_distance(lat1, lon1, d, bearing, R=6371): """ lat: initial latitude, in degrees lon: initial longitude, in degrees - d: target distance from initial + d: target distance from initial, in km bearing: (true) heading in degrees - R: optional radius of sphere, defaults to mean radius of earth + R: optional radius of sphere, defaults to mean radius of earth in km Returns new lat/lon coordinate {d}km from initial, in degrees """ lat1 = radians(lat1) @@ -51,6 +50,8 @@ def __init__(self,mutex,broadcast_thread,aircraftinfos,waypoints_file,logfile,du self._alt_m = aircraftinfos.alt_msl_m self._speed_mps = aircraftinfos.speed_mps self._duration = duration + self._generate = True + self.counter = 0 def refresh_delay(self): return REFRESH_RATE @@ -60,27 +61,54 @@ def update_aircraftinfos(self): ##### PRE-GENERATION PROTOTYPE CODE ##### """ - dist_spd = ((self._speed_mps * 1.852)/3600) - - genLat = self._aircraftinfos.lat_deg - genLon = self._aircraftinfos.lon_deg - genSpd = self._aircraftinfos.speed_mps - genTrk = self._aircraftinfos.track_angle_deg - flightPath = {} - - - for i from 1 to self._duration: - genLat = + if self._generate: + dist_spd = ((self._speed_mps * 1.852)/3600) + genLat = self._aircraftinfos.lat_deg + genLon = self._aircraftinfos.lon_deg + genAlt = self._aircraftinfos.alt_msl_m + genSpd = self._aircraftinfos.speed_mps + genTrk = self._aircraftinfos.track_angle_deg + flightPath = [] + + # Pre-generate flight path strings to list + for i from 1 to self._duration: + dataFrame = self._aircraftinfos.callsign+','+(str)genLat+','+(str)genLon+','+(str)genAlt+','+(str)genSpd+','+(str)genTrk + flightPath.append(dataFrame) + # Calculate new Lat/Lon based on Speed+Track Angle + genLat, genLon = get_point_at_distance(genLat, genLon, dist_spd, genTrk) + # Randomized trajectory cone + genAlt += random.uniform(-5,5) + genSpd += random.uniform(-10,10) + genTrk+= random.uniform(-3,3) + + # Write generated flight path to temp file + with open('spoof.csv','a') as spoof: + for frame in flightPath: + spoof.write(frame) + + # temp file spoof.csv format: "<0:callsign>,<1:lat>,<2:lon>,<3:alt>,<4:speed>,<5:track angle>" + self._generate = False + else: + with open('spoof.csv', 'r') as spoof: + for self._counter in spoof: + posi = line.split(',') + self._aircraftinfos.lat_deg = posi[1] + self._aircraftinfos.lon_deg = posi[2] + self._aircraftinfos.alt_msl_m = posi[3] + self._aircraftinfos.speed_mps = posi[4] + self._aircraftinfos.track_angle_deg = posi[5] + """ - # Calculate new Lat/Lon based on Speed+Track Angle + self._aircraftinfos.lat_deg, self._aircraftinfos.lon_deg = get_point_at_distance(self._aircraftinfos.lat_deg, self._aircraftinfos.lon_deg, dist_spd, self._aircraftinfos.track_angle_deg) + # Randomized trajectory cone self._aircraftinfos.speed_mps += random.uniform(-10,10) self._aircraftinfos.track_angle_deg += random.uniform(-3,3) self._aircraftinfos.alt_msl_m += random.uniform(-5,5) - # Track Angle 0-360 wrapping + # Track Angle 0-360 wrapping if self._aircraftinfos.track_angle_deg < 0: self._aircraftinfos.track_angle_deg += 360 elif self._aircraftinfos.track_angle_deg > 360: diff --git a/HackRfBroadcastThread.py b/HackRfBroadcastThread.py index 5f58a73..4f71b05 100644 --- a/HackRfBroadcastThread.py +++ b/HackRfBroadcastThread.py @@ -106,7 +106,7 @@ def __init__(self,airborne_position_refresh_period = 150000): if (result != LibHackRfReturnCode.HACKRF_SUCCESS): print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) - result = self._hackrf_broadcaster.setTXVGAGain(40) # TX VGA Gain (4 for wire feed + attenuators, 47 for wireless) + result = self._hackrf_broadcaster.setTXVGAGain(47) # TX VGA Gain (4 for wire feed + attenuators, 47 for wireless) if (result != LibHackRfReturnCode.HACKRF_SUCCESS): print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) diff --git a/WaypointsTrajectorySimulator.py b/WaypointsTrajectorySimulator.py index 0c7b3ac..89ffd39 100644 --- a/WaypointsTrajectorySimulator.py +++ b/WaypointsTrajectorySimulator.py @@ -26,6 +26,7 @@ def __init__(self,mutex,broadcast_thread,aircraftinfos,waypoints_file,logfile): self._lat0 = aircraftinfos.lat_deg self._lon0 = aircraftinfos.lon_deg self._logfile = logfile + self._icao = str(aircraftinfos.icao) def refresh_delay(self): return 0.005 @@ -34,8 +35,8 @@ def update_aircraftinfos(self): with open(self._waypoints_file, 'r') as wp: # waypoints CSV format: "<0:callsign>,<1:lat>,<2:lon>,<3:alt>,<4:speed>,<5:track angle>,<6:iterate time>" for line in wp: - posi = line.split(",") - print("[!] WAYPOINTS TRAJECTORY\tCallsign: "+self._aircraftinfos.callsign) + posi = line.split(',') + print("[!] WAYPOINTS TRAJECTORYt\tICAO: "+self._icao+"\t\tCallsign: "+self._aircraftinfos.callsign) print(" [:] Lat: "+posi[1]+" | Lon: "+posi[2]+" | Alt: "+posi[3]+" | Spd: "+posi[4]+" | Trk Angle: "+posi[5]+" | ValidTime: "+posi[6]) # Write to logfile -> CSV format: DATETIME,CALLSIGN,LAT,LONG,ALT,SPD,TRKANGLE diff --git a/adsb-track-player.py b/adsb-track-player.py index 5f8ca29..182fef6 100755 --- a/adsb-track-player.py +++ b/adsb-track-player.py @@ -81,7 +81,7 @@ def main(): if os.path.isfile(logfile): print("[*] logfile.csv found") else: - print("[!] logfile not found, creating...") + print("[!] logfile.csv not found, creating...") with open(logfile,"w") as fLog: fLog.write("DATETIME,CALLSIGN,LAT,LONG,ALT,SPD,TRKANGLE") diff --git a/feed1090/2023-08-02_1090ES.json b/feed1090/2023-08-02_1090ES.json deleted file mode 100644 index 3756dff..0000000 --- a/feed1090/2023-08-02_1090ES.json +++ /dev/null @@ -1,489 +0,0 @@ -[ -{"datetime":"2023-08-02 14-09-00", "target": "", "latitude": 1.359418, "longitude": 104.016613, "altitude": 9675, "heading": 346, "speed": 280} -] -[ -{"datetime":"2023-08-02 14-20-43", "target": "CPJ007 ", "latitude": 1.484225, "longitude": 104.001933, "altitude": 11075, "heading": 274, "speed": 255} -] -[ -{"datetime":"2023-08-02 14-20-54", "target": "CPJ007 ", "latitude": 1.484365, "longitude": 103.999802, "altitude": 11000, "heading": 274, "speed": 255} -] -[ -{"datetime":"2023-08-02 14-21-04", "target": "CPJ007 ", "latitude": 1.485306, "longitude": 103.981359, "altitude": 10825, "heading": 274, "speed": 255} -] -[ -{"datetime":"2023-08-02 14-21-14", "target": "CPJ007 ", "latitude": 1.486084, "longitude": 103.965252, "altitude": 10625, "heading": 273, "speed": 253} -] -[ -{"datetime":"2023-08-02 14-21-25", "target": "CPJ007 ", "latitude": 1.486588, "longitude": 103.952683, "altitude": 10400, "heading": 273, "speed": 252} -] -[ -{"datetime":"2023-08-02 14-21-35", "target": "CPJ007 ", "latitude": 1.486954, "longitude": 103.943699, "altitude": 10225, "heading": 273, "speed": 250} -] -[ -{"datetime":"2023-08-02 14-21-46", "target": "CPJ007 ", "latitude": 1.487623, "longitude": 103.929622, "altitude": 10025, "heading": 274, "speed": 248} -] -[ -{"datetime":"2023-08-02 14-21-56", "target": "CPJ007 ", "latitude": 1.488556, "longitude": 103.917723, "altitude": 9850, "heading": 280, "speed": 244} -] -[ -{"datetime":"2023-08-02 14-22-07", "target": "CPJ007 ", "latitude": 1.489975, "longitude": 103.912555, "altitude": 9750, "heading": 295, "speed": 242} -] -[ -{"datetime":"2023-08-02 14-22-17", "target": "CPJ007 ", "latitude": 1.489975, "longitude": 103.912555, "altitude": 9425, "heading": 318, "speed": 240} -] -[ -{"datetime":"2023-08-02 14-22-28", "target": "CPJ007 ", "latitude": 1.502055, "longitude": 103.897279, "altitude": 9400, "heading": 318, "speed": 240} -] -[ -{"datetime":"2023-08-02 14-22-38", "target": "CPJ007 ", "latitude": 1.502055, "longitude": 103.897279, "altitude": 9400, "heading": 318, "speed": 240} -] -[ -{"datetime":"2023-08-02 14-22-49", "target": "MEDIC15 ", "latitude": 1.351458, "longitude": 103.824826, "altitude": 1425, "heading": 33, "speed": 153}, {"hex": "424846", "target": "CPJ007 ", "latitude": 1.502055, "longitude": 103.897279, "altitude": 9400, "heading": 318, "speed": 240} -] -[ -{"datetime":"2023-08-02 14-22-59", "target": "MEDIC15 ", "latitude": 1.360024, "longitude": 103.830272, "altitude": 1375, "heading": 32, "speed": 150}, {"hex": "424846", "target": "CPJ007 ", "latitude": 1.502055, "longitude": 103.897279, "altitude": 9400, "heading": 318, "speed": 240} -] -[ -{"datetime":"2023-08-02 14-23-10", "target": "MEDIC15 ", "latitude": 1.366262, "longitude": 103.834344, "altitude": 1250, "heading": 34, "speed": 154}, {"hex": "424846", "target": "CPJ007 ", "latitude": 1.502055, "longitude": 103.897279, "altitude": 9400, "heading": 318, "speed": 240} -] -[ -{"datetime":"2023-08-02 14-23-20", "target": "MEDIC15 ", "latitude": 1.371735, "longitude": 103.837979, "altitude": 1075, "heading": 33, "speed": 157}, {"hex": "424846", "target": "CPJ007 ", "latitude": 1.502055, "longitude": 103.897279, "altitude": 9400, "heading": 318, "speed": 240} -] -[ -{"datetime":"2023-08-02 14-23-31", "target": "MEDIC15 ", "latitude": 1.378189, "longitude": 103.842215, "altitude": 950, "heading": 33, "speed": 155}, {"hex": "424846", "target": "CPJ007 ", "latitude": 1.502055, "longitude": 103.897279, "altitude": 9400, "heading": 318, "speed": 240} -] -[ -{"datetime":"2023-08-02 14-23-41", "target": "MEDIC15 ", "latitude": 1.385115, "longitude": 103.846751, "altitude": 775, "heading": 33, "speed": 156} -] -[ -{"datetime":"2023-08-02 14-23-52", "target": "MEDIC15 ", "latitude": 1.388672, "longitude": 103.849011, "altitude": 600, "heading": 33, "speed": 156} -] -[ -{"datetime":"2023-08-02 14-24-02", "target": "MEDIC15 ", "latitude": 1.388672, "longitude": 103.849011, "altitude": 450, "heading": 34, "speed": 152} -] -[ -{"datetime":"2023-08-02 14-24-13", "target": "MEDIC15 ", "latitude": 1.401036, "longitude": 103.857169, "altitude": 275, "heading": 33, "speed": 152} -] -[ -{"datetime":"2023-08-02 14-24-23", "target": "MEDIC15 ", "latitude": 1.401036, "longitude": 103.857169, "altitude": 275, "heading": 33, "speed": 152} -] -[ -{"datetime":"2023-08-02 14-24-34", "target": "MEDIC15 ", "latitude": 1.401036, "longitude": 103.857169, "altitude": 275, "heading": 33, "speed": 152} -] -[ -{"datetime":"2023-08-02 14-24-44", "target": "MEDIC15 ", "latitude": 1.401036, "longitude": 103.857169, "altitude": 275, "heading": 33, "speed": 152} -] -[ -{"datetime":"2023-08-02 14-24-55", "target": "MEDIC15 ", "latitude": 1.401036, "longitude": 103.857169, "altitude": 275, "heading": 33, "speed": 152} -] -[ -{"datetime":"2023-08-02 14-25-05", "target": "MEDIC15 ", "latitude": 1.401036, "longitude": 103.857169, "altitude": 275, "heading": 33, "speed": 152} -] -[ -{"datetime":"2023-08-02 14-32-15", "target": "VHAVL ", "latitude": 1.352203, "longitude": 103.825157, "altitude": 1500, "heading": 35, "speed": 157} -] -[ -{"datetime":"2023-08-02 14-32-26", "target": "VHAVL ", "latitude": 1.357743, "longitude": 103.828851, "altitude": 1400, "heading": 33, "speed": 162} -] -[ -{"datetime":"2023-08-02 14-32-36", "target": "VHAVL ", "latitude": 1.3644, "longitude": 103.833255, "altitude": 1250, "heading": 33, "speed": 157} -] -[ -{"datetime":"2023-08-02 14-32-47", "target": "VHAVL ", "latitude": 1.370682, "longitude": 103.837373, "altitude": 1100, "heading": 33, "speed": 155} -] -[ -{"datetime":"2023-08-02 14-32-57", "target": "VHAVL ", "latitude": 1.375671, "longitude": 103.840772, "altitude": 1025, "heading": 34, "speed": 152} -] -[ -{"datetime":"2023-08-02 14-33-08", "target": "VHAVL ", "latitude": 1.375671, "longitude": 103.840772, "altitude": 800, "heading": 34, "speed": 152} -] -[ -{"datetime":"2023-08-02 14-33-18", "target": "VHAVL ", "latitude": 1.387908, "longitude": 103.848693, "altitude": 650, "heading": 34, "speed": 148} -] -[ -{"datetime":"2023-08-02 14-33-29", "target": "AXM5596 ", "latitude": 1.503021, "longitude": 103.950123, "altitude": 10825, "heading": 110, "speed": 360}, {"hex": "7c02ff", "target": "VHAVL ", "latitude": 1.387908, "longitude": 103.848693, "altitude": 550, "heading": 33, "speed": 150} -] -[ -{"datetime":"2023-08-02 14-33-39", "target": "AXM5596 ", "latitude": 1.497345, "longitude": 103.965113, "altitude": 11000, "heading": 110, "speed": 365}, {"hex": "7c02ff", "target": "VHAVL ", "latitude": 1.399658, "longitude": 103.85632, "altitude": 400, "heading": 33, "speed": 146} -] -[ -{"datetime":"2023-08-02 14-33-50", "target": "AXM5596 ", "latitude": 1.497345, "longitude": 103.965113, "altitude": 11350, "heading": 110, "speed": 369}, {"hex": "7c02ff", "target": "VHAVL ", "latitude": 1.399658, "longitude": 103.85632, "altitude": 400, "heading": 33, "speed": 146} -] -[ -{"datetime":"2023-08-02 14-34-00", "target": "AXM5596 ", "latitude": 1.497345, "longitude": 103.965113, "altitude": 11700, "heading": 110, "speed": 369}, {"hex": "7c02ff", "target": "VHAVL ", "latitude": 1.399658, "longitude": 103.85632, "altitude": 400, "heading": 33, "speed": 146} -] -[ -{"datetime":"2023-08-02 14-34-11", "target": "AXM5596 ", "latitude": 1.497345, "longitude": 103.965113, "altitude": 11700, "heading": 110, "speed": 369}, {"hex": "7c02ff", "target": "VHAVL ", "latitude": 1.399658, "longitude": 103.85632, "altitude": 400, "heading": 33, "speed": 146} -] -[ -{"datetime":"2023-08-02 14-34-21", "target": "AXM5596 ", "latitude": 1.497345, "longitude": 103.965113, "altitude": 11700, "heading": 110, "speed": 369}, {"hex": "7c02ff", "target": "VHAVL ", "latitude": 1.399658, "longitude": 103.85632, "altitude": 400, "heading": 33, "speed": 146} -] -[ -{"datetime":"2023-08-02 14-34-32", "target": "AXM5596 ", "latitude": 1.497345, "longitude": 103.965113, "altitude": 11700, "heading": 110, "speed": 369}, {"hex": "7c02ff", "target": "VHAVL ", "latitude": 1.399658, "longitude": 103.85632, "altitude": 400, "heading": 33, "speed": 146} -] -[ -{"datetime":"2023-08-02 14-34-42", "target": "AXM5596 ", "latitude": 1.497345, "longitude": 103.965113, "altitude": 11700, "heading": 110, "speed": 369} -] -[ -{"datetime":"2023-08-02 14-34-53", "target": "AXM5596 ", "latitude": 1.497345, "longitude": 103.965113, "altitude": 11700, "heading": 110, "speed": 369} -] -[ -{"datetime":"2023-08-02 14-35-03", "target": "AXM5596 ", "latitude": 1.497345, "longitude": 103.965113, "altitude": 11700, "heading": 110, "speed": 369} -] -[ -{"datetime":"2023-08-02 14-35-13", "target": "AXM5596 ", "latitude": 1.497345, "longitude": 103.965113, "altitude": 11700, "heading": 110, "speed": 369} -] -[ -{"datetime":"2023-08-02 14-35-24", "target": "AXM5596 ", "latitude": 1.432086, "longitude": 104.136563, "altitude": 14575, "heading": 110, "speed": 369} -] -[ -{"datetime":"2023-08-02 14-35-34", "target": "AXM5596 ", "latitude": 1.432086, "longitude": 104.136563, "altitude": 14575, "heading": 110, "speed": 369} -] -[ -{"datetime":"2023-08-02 14-35-45", "target": "AXM5596 ", "latitude": 1.432086, "longitude": 104.136563, "altitude": 14575, "heading": 110, "speed": 369} -] -[ -{"datetime":"2023-08-02 14-35-55", "target": "AXM5596 ", "latitude": 1.432086, "longitude": 104.136563, "altitude": 14575, "heading": 110, "speed": 369} -] -[ -{"datetime":"2023-08-02 14-36-06", "target": "AXM5596 ", "latitude": 1.432086, "longitude": 104.136563, "altitude": 14575, "heading": 110, "speed": 369} -] -[ -{"datetime":"2023-08-02 14-36-16", "target": "AXM5596 ", "latitude": 1.432086, "longitude": 104.136563, "altitude": 14575, "heading": 110, "speed": 369} -] -[ -{"datetime":"2023-08-02 14-36-58", "target": "", "latitude": 1.384836, "longitude": 104.193484, "altitude": 35975, "heading": 298, "speed": 478} -] -[ -{"datetime":"2023-08-02 14-37-09", "target": "", "latitude": 1.384836, "longitude": 104.193484, "altitude": 35975, "heading": 298, "speed": 479} -] -[ -{"datetime":"2023-08-02 14-37-19", "target": "", "latitude": 1.384836, "longitude": 104.193484, "altitude": 35975, "heading": 298, "speed": 479} -] -[ -{"datetime":"2023-08-02 14-37-30", "target": "", "latitude": 1.384836, "longitude": 104.193484, "altitude": 35975, "heading": 298, "speed": 479} -] -[ -{"datetime":"2023-08-02 14-37-40", "target": "", "latitude": 1.430786, "longitude": 104.106306, "altitude": 36000, "heading": 298, "speed": 479} -] -[ -{"datetime":"2023-08-02 14-37-51", "target": "", "latitude": 1.442093, "longitude": 104.084752, "altitude": 36000, "heading": 298, "speed": 479} -] -[ -{"datetime":"2023-08-02 14-38-01", "target": "", "latitude": 1.442093, "longitude": 104.084752, "altitude": 36000, "heading": 298, "speed": 479} -] -[ -{"datetime":"2023-08-02 14-38-12", "target": "", "latitude": 1.442093, "longitude": 104.084752, "altitude": 36000, "heading": 298, "speed": 479} -] -[ -{"datetime":"2023-08-02 14-38-22", "target": "", "latitude": 1.472946, "longitude": 104.02591, "altitude": 36000, "heading": 298, "speed": 479} -] -[ -{"datetime":"2023-08-02 14-38-33", "target": "AXM712 ", "latitude": 1.44405, "longitude": 104.007047, "altitude": 11175, "heading": 306, "speed": 282}, {"hex": "750451", "target": "", "latitude": 1.482456, "longitude": 104.007758, "altitude": 36000, "heading": 298, "speed": 480} -] -[ -{"datetime":"2023-08-02 14-38-43", "target": "AXM712 ", "latitude": 1.452484, "longitude": 103.992113, "altitude": 11625, "heading": 300, "speed": 289}, {"hex": "750451", "target": "", "latitude": 1.482456, "longitude": 104.007758, "altitude": 36000, "heading": 298, "speed": 480} -] -[ -{"datetime":"2023-08-02 14-38-54", "target": "AXM712 ", "latitude": 1.45903, "longitude": 103.980382, "altitude": 12050, "heading": 299, "speed": 294}, {"hex": "750451", "target": "", "latitude": 1.482456, "longitude": 104.007758, "altitude": 36000, "heading": 298, "speed": 480} -] -[ -{"datetime":"2023-08-02 14-39-04", "target": "AXM712 ", "latitude": 1.465759, "longitude": 103.968325, "altitude": 12525, "heading": 300, "speed": 296}, {"hex": "750451", "target": "", "latitude": 1.482456, "longitude": 104.007758, "altitude": 36025, "heading": 298, "speed": 480} -] -[ -{"datetime":"2023-08-02 14-39-15", "target": "AXM712 ", "latitude": 1.473358, "longitude": 103.954778, "altitude": 13050, "heading": 300, "speed": 299}, {"hex": "750451", "target": "", "latitude": 1.482456, "longitude": 104.007758, "altitude": 36025, "heading": 298, "speed": 480} -] -[ -{"datetime":"2023-08-02 14-39-25", "target": "AXM712 ", "latitude": 1.480637, "longitude": 103.941883, "altitude": 13450, "heading": 300, "speed": 304}, {"hex": "750451", "target": "", "latitude": 1.482456, "longitude": 104.007758, "altitude": 36025, "heading": 298, "speed": 480} -] -[ -{"datetime":"2023-08-02 14-39-36", "target": "AXM712 ", "latitude": 1.488042, "longitude": 103.928675, "altitude": 13775, "heading": 300, "speed": 310}, {"hex": "750451", "target": "", "latitude": 1.482456, "longitude": 104.007758, "altitude": 36025, "heading": 298, "speed": 480} -] -[ -{"datetime":"2023-08-02 14-39-46", "target": "AXM712 ", "latitude": 1.490112, "longitude": 103.924938, "altitude": 14225, "heading": 300, "speed": 310}, {"hex": "750451", "target": "", "latitude": 1.482456, "longitude": 104.007758, "altitude": 36025, "heading": 298, "speed": 480} -] -[ -{"datetime":"2023-08-02 14-39-57", "target": "AXM712 ", "latitude": 1.502287, "longitude": 103.90334, "altitude": 14700, "heading": 300, "speed": 314}, {"hex": "750451", "target": "", "latitude": 1.482456, "longitude": 104.007758, "altitude": 36025, "heading": 298, "speed": 480} -] -[ -{"datetime":"2023-08-02 14-40-07", "target": "AXM712 ", "latitude": 1.510899, "longitude": 103.88795, "altitude": 15225, "heading": 300, "speed": 314}, {"hex": "750451", "target": "", "latitude": 1.482456, "longitude": 104.007758, "altitude": 36025, "heading": 298, "speed": 480} -] -[ -{"datetime":"2023-08-02 14-40-18", "target": "AXM712 ", "latitude": 1.510899, "longitude": 103.88795, "altitude": 15325, "heading": 300, "speed": 316} -] -[ -{"datetime":"2023-08-02 14-40-28", "target": "AXM712 ", "latitude": 1.510899, "longitude": 103.88795, "altitude": 15575, "heading": 300, "speed": 316} -] -[ -{"datetime":"2023-08-02 14-40-39", "target": "AXM712 ", "latitude": 1.510899, "longitude": 103.88795, "altitude": 15575, "heading": 300, "speed": 316} -] -[ -{"datetime":"2023-08-02 14-40-50", "target": "AXM712 ", "latitude": 1.510899, "longitude": 103.88795, "altitude": 15575, "heading": 300, "speed": 316} -] -[ -{"datetime":"2023-08-02 14-41-00", "target": "AXM712 ", "latitude": 1.510899, "longitude": 103.88795, "altitude": 15575, "heading": 300, "speed": 316} -] -[ -{"datetime":"2023-08-02 14-41-11", "target": "AXM712 ", "latitude": 1.510899, "longitude": 103.88795, "altitude": 15575, "heading": 300, "speed": 316} -] -[ -{"datetime":"2023-08-02 14-43-06", "target": "CSN354 ", "latitude": 1.424011, "longitude": 104.055471, "altitude": 11625, "heading": 342, "speed": 314} -] -[ -{"datetime":"2023-08-02 14-43-16", "target": "CSN354 ", "latitude": 1.424011, "longitude": 104.055471, "altitude": 11775, "heading": 342, "speed": 314} -] -[ -{"datetime":"2023-08-02 14-43-27", "target": "CSN354 ", "latitude": 1.424011, "longitude": 104.055471, "altitude": 11975, "heading": 342, "speed": 332} -] -[ -{"datetime":"2023-08-02 14-43-37", "target": "CSN354 ", "latitude": 1.424011, "longitude": 104.055471, "altitude": 12125, "heading": 342, "speed": 332} -] -[ -{"datetime":"2023-08-02 14-43-48", "target": "CSN354 ", "latitude": 1.424011, "longitude": 104.055471, "altitude": 12425, "heading": 342, "speed": 359} -] -[ -{"datetime":"2023-08-02 14-43-58", "target": "CSN354 ", "latitude": 1.424011, "longitude": 104.055471, "altitude": 12700, "heading": 342, "speed": 359} -] -[ -{"datetime":"2023-08-02 14-44-09", "target": "CSN354 ", "latitude": 1.424011, "longitude": 104.055471, "altitude": 13225, "heading": 342, "speed": 359} -] -[ -{"datetime":"2023-08-02 14-44-19", "target": "CSN354 ", "latitude": 1.424011, "longitude": 104.055471, "altitude": 13550, "heading": 342, "speed": 368} -] -[ -{"datetime":"2023-08-02 14-44-30", "target": "CSN354 ", "latitude": 1.56071, "longitude": 104.010362, "altitude": 13875, "heading": 341, "speed": 373} -] -[ -{"datetime":"2023-08-02 14-44-40", "target": "CSN354 ", "latitude": 1.577087, "longitude": 104.004542, "altitude": 14325, "heading": 341, "speed": 373} -] -[ -{"datetime":"2023-08-02 14-44-51", "target": "CSN354 ", "latitude": 1.577087, "longitude": 104.004542, "altitude": 14325, "heading": 341, "speed": 373} -] -[ -{"datetime":"2023-08-02 14-45-01", "target": "CSN354 ", "latitude": 1.577087, "longitude": 104.004542, "altitude": 15325, "heading": 341, "speed": 370} -] -[ -{"datetime":"2023-08-02 14-45-12", "target": "CSN354 ", "latitude": 1.62149, "longitude": 103.988668, "altitude": 15525, "heading": 341, "speed": 373} -] -[ -{"datetime":"2023-08-02 14-45-22", "target": "CSN354 ", "latitude": 1.62149, "longitude": 103.988668, "altitude": 15525, "heading": 341, "speed": 373} -] -[ -{"datetime":"2023-08-02 14-45-33", "target": "MXD178 ", "latitude": 1.384232, "longitude": 104.013015, "altitude": 38000, "heading": 309, "speed": 482}, {"hex": "780492", "target": "CCA450 ", "latitude": 1.428549, "longitude": 104.025374, "altitude": 11175, "heading": 347, "speed": 299}, {"hex": "781620", "target": "CSN354 ", "latitude": 1.62149, "longitude": 103.988668, "altitude": 15525, "heading": 341, "speed": 373} -] -[ -{"datetime":"2023-08-02 14-45-43", "target": "MXD178 ", "latitude": 1.392242, "longitude": 104.002913, "altitude": 38000, "heading": 309, "speed": 482}, {"hex": "780492", "target": "CCA450 ", "latitude": 1.429825, "longitude": 104.025072, "altitude": 11375, "heading": 347, "speed": 307}, {"hex": "781620", "target": "CSN354 ", "latitude": 1.62149, "longitude": 103.988668, "altitude": 15525, "heading": 341, "speed": 373} -] -[ -{"datetime":"2023-08-02 14-45-54", "target": "MXD178 ", "latitude": 1.407647, "longitude": 103.983559, "altitude": 38000, "heading": 309, "speed": 483}, {"hex": "780492", "target": "CCA450 ", "latitude": 1.457737, "longitude": 104.018602, "altitude": 11550, "heading": 347, "speed": 317}, {"hex": "781620", "target": "CSN354 ", "latitude": 1.62149, "longitude": 103.988668, "altitude": 15525, "heading": 341, "speed": 373} -] -[ -{"datetime":"2023-08-02 14-46-04", "target": "MXD178 ", "latitude": 1.407647, "longitude": 103.983559, "altitude": 38000, "heading": 309, "speed": 483}, {"hex": "780492", "target": "CCA450 ", "latitude": 1.472351, "longitude": 104.01497, "altitude": 11825, "heading": 347, "speed": 327}, {"hex": "781620", "target": "CSN354 ", "latitude": 1.62149, "longitude": 103.988668, "altitude": 15525, "heading": 341, "speed": 373} -] -[ -{"datetime":"2023-08-02 14-46-15", "target": "MXD178 ", "latitude": 1.407647, "longitude": 103.983559, "altitude": 38000, "heading": 309, "speed": 483}, {"hex": "780492", "target": "CCA450 ", "latitude": 1.484299, "longitude": 104.010967, "altitude": 12175, "heading": 341, "speed": 332} -] -[ -{"datetime":"2023-08-02 14-46-25", "target": "MXD178 ", "latitude": 1.456604, "longitude": 103.922052, "altitude": 38000, "heading": 309, "speed": 486}, {"hex": "780492", "target": "CCA450 ", "latitude": 1.501236, "longitude": 104.004868, "altitude": 12575, "heading": 340, "speed": 336} -] -[ -{"datetime":"2023-08-02 14-46-36", "target": "MXD178 ", "latitude": 1.457748, "longitude": 103.920655, "altitude": 38000, "heading": 309, "speed": 486}, {"hex": "780492", "target": "CCA450 ", "latitude": 1.519226, "longitude": 103.998211, "altitude": 12975, "heading": 340, "speed": 339} -] -[ -{"datetime":"2023-08-02 14-46-46", "target": "MXD178 ", "latitude": 1.484756, "longitude": 103.886765, "altitude": 38000, "heading": 309, "speed": 488}, {"hex": "780492", "target": "CCA450 ", "latitude": 1.533371, "longitude": 103.992998, "altitude": 13425, "heading": 340, "speed": 341} -] -[ -{"datetime":"2023-08-02 14-46-57", "target": "MXD178 ", "latitude": 1.484756, "longitude": 103.886765, "altitude": 38000, "heading": 309, "speed": 488}, {"hex": "780492", "target": "CCA450 ", "latitude": 1.55072, "longitude": 103.986527, "altitude": 13800, "heading": 340, "speed": 346} -] -[ -{"datetime":"2023-08-02 14-47-07", "target": "MXD178 ", "latitude": 1.484756, "longitude": 103.886765, "altitude": 38000, "heading": 309, "speed": 488}, {"hex": "780492", "target": "CCA450 ", "latitude": 1.559407, "longitude": 103.983275, "altitude": 14025, "heading": 340, "speed": 348} -] -[ -{"datetime":"2023-08-02 14-47-18", "target": "MXD178 ", "latitude": 1.484756, "longitude": 103.886765, "altitude": 38000, "heading": 309, "speed": 488}, {"hex": "780492", "target": "CCA450 ", "latitude": 1.559407, "longitude": 103.983275, "altitude": 14775, "heading": 340, "speed": 348} -] -[ -{"datetime":"2023-08-02 14-47-28", "target": "MXD178 ", "latitude": 1.484756, "longitude": 103.886765, "altitude": 38000, "heading": 309, "speed": 488}, {"hex": "780492", "target": "CCA450 ", "latitude": 1.588394, "longitude": 103.972608, "altitude": 14975, "heading": 340, "speed": 346} -] -[ -{"datetime":"2023-08-02 14-47-39", "target": "MXD178 ", "latitude": 1.484756, "longitude": 103.886765, "altitude": 38000, "heading": 309, "speed": 488}, {"hex": "780492", "target": "CCA450 ", "latitude": 1.588394, "longitude": 103.972608, "altitude": 14975, "heading": 340, "speed": 346} -] -[ -{"datetime":"2023-08-02 14-47-49", "target": "CCA450 ", "latitude": 1.588394, "longitude": 103.972608, "altitude": 14975, "heading": 340, "speed": 346} -] -[ -{"datetime":"2023-08-02 14-48-00", "target": "CCA450 ", "latitude": 1.588394, "longitude": 103.972608, "altitude": 14975, "heading": 340, "speed": 346} -] -[ -{"datetime":"2023-08-02 14-48-10", "target": "CCA450 ", "latitude": 1.588394, "longitude": 103.972608, "altitude": 14975, "heading": 340, "speed": 346} -] -[ -{"datetime":"2023-08-02 14-48-21", "target": "CCA450 ", "latitude": 1.588394, "longitude": 103.972608, "altitude": 14975, "heading": 340, "speed": 346} -] -[ -{"datetime":"2023-08-02 14-49-44", "target": "", "latitude": 1.554932, "longitude": 103.989739, "altitude": 11400, "heading": 339, "speed": 385} -] -[ -{"datetime":"2023-08-02 14-49-55", "target": "SIA7862 ", "latitude": 1.560928, "longitude": 103.987411, "altitude": 11675, "heading": 339, "speed": 386} -] -[ -{"datetime":"2023-08-02 14-50-05", "target": "SIA7862 ", "latitude": 1.560928, "longitude": 103.987411, "altitude": 11675, "heading": 339, "speed": 386} -] -[ -{"datetime":"2023-08-02 14-50-16", "target": "SIA7862 ", "latitude": 1.560928, "longitude": 103.987411, "altitude": 11675, "heading": 339, "speed": 386} -] -[ -{"datetime":"2023-08-02 14-50-26", "target": "SIA7862 ", "latitude": 1.560928, "longitude": 103.987411, "altitude": 11675, "heading": 339, "speed": 386} -] -[ -{"datetime":"2023-08-02 14-50-37", "target": "SIA7862 ", "latitude": 1.560928, "longitude": 103.987411, "altitude": 11675, "heading": 339, "speed": 386} -] -[ -{"datetime":"2023-08-02 14-50-47", "target": "SIA7862 ", "latitude": 1.560928, "longitude": 103.987411, "altitude": 11675, "heading": 339, "speed": 386} -] -[ -{"datetime":"2023-08-02 14-50-58", "target": "CQN2096 ", "latitude": 1.356532, "longitude": 104.044695, "altitude": 8600, "heading": 348, "speed": 286}, {"hex": "76ccd0", "target": "SIA7862 ", "latitude": 1.560928, "longitude": 103.987411, "altitude": 11675, "heading": 339, "speed": 386} -] -[ -{"datetime":"2023-08-02 14-51-08", "target": "CQN2096 ", "latitude": 1.374222, "longitude": 104.040811, "altitude": 9750, "heading": 348, "speed": 280}, {"hex": "76ccd0", "target": "SIA7862 ", "latitude": 1.560928, "longitude": 103.987411, "altitude": 11675, "heading": 339, "speed": 386} -] -[ -{"datetime":"2023-08-02 14-51-19", "target": "CQN2096 ", "latitude": 1.391679, "longitude": 104.036976, "altitude": 10300, "heading": 348, "speed": 279} -] -[ -{"datetime":"2023-08-02 14-51-29", "target": "CQN2096 ", "latitude": 1.401352, "longitude": 104.034941, "altitude": 10500, "heading": 348, "speed": 279} -] -[ -{"datetime":"2023-08-02 14-51-40", "target": "CQN2096 ", "latitude": 1.401352, "longitude": 104.034941, "altitude": 10925, "heading": 343, "speed": 298} -] -[ -{"datetime":"2023-08-02 14-51-50", "target": "CQN2096 ", "latitude": 1.431342, "longitude": 104.026747, "altitude": 11250, "heading": 341, "speed": 304} -] -[ -{"datetime":"2023-08-02 14-52-01", "target": "CQN2096 ", "latitude": 1.447723, "longitude": 104.020929, "altitude": 11550, "heading": 341, "speed": 312} -] -[ -{"datetime":"2023-08-02 14-52-11", "target": "CQN2096 ", "latitude": 1.447723, "longitude": 104.020929, "altitude": 11875, "heading": 341, "speed": 316} -] -[ -{"datetime":"2023-08-02 14-52-22", "target": "CQN2096 ", "latitude": 1.481323, "longitude": 104.008965, "altitude": 12200, "heading": 341, "speed": 328} -] -[ -{"datetime":"2023-08-02 14-52-32", "target": "MXD158 ", "latitude": 1.409555, "longitude": 103.997861, "altitude": 36000, "heading": 307, "speed": 493}, {"hex": "7814e7", "target": "CQN2096 ", "latitude": 1.495972, "longitude": 104.003751, "altitude": 12500, "heading": 341, "speed": 332} -] -[ -{"datetime":"2023-08-02 14-52-43", "target": "MXD158 ", "latitude": 1.413652, "longitude": 103.992415, "altitude": 36000, "heading": 307, "speed": 493}, {"hex": "7814e7", "target": "CQN2096 ", "latitude": 1.509829, "longitude": 103.998855, "altitude": 12775, "heading": 341, "speed": 341} -] -[ -{"datetime":"2023-08-02 14-52-53", "target": "MXD158 ", "latitude": 1.413652, "longitude": 103.992415, "altitude": 36000, "heading": 307, "speed": 492}, {"hex": "7814e7", "target": "CQN2096 ", "latitude": 1.525681, "longitude": 103.993277, "altitude": 13100, "heading": 341, "speed": 348} -] -[ -{"datetime":"2023-08-02 14-53-04", "target": "MXD158 ", "latitude": 1.413652, "longitude": 103.992415, "altitude": 36000, "heading": 307, "speed": 492}, {"hex": "7814e7", "target": "CQN2096 ", "latitude": 1.543533, "longitude": 103.986992, "altitude": 13425, "heading": 341, "speed": 354} -] -[ -{"datetime":"2023-08-02 14-53-14", "target": "MXD158 ", "latitude": 1.413652, "longitude": 103.992415, "altitude": 36000, "heading": 307, "speed": 492}, {"hex": "7814e7", "target": "CQN2096 ", "latitude": 1.556288, "longitude": 103.982565, "altitude": 13700, "heading": 341, "speed": 359} -] -[ -{"datetime":"2023-08-02 14-53-25", "target": "MXD158 ", "latitude": 1.413652, "longitude": 103.992415, "altitude": 36000, "heading": 307, "speed": 492}, {"hex": "7814e7", "target": "CQN2096 ", "latitude": 1.561066, "longitude": 103.980894, "altitude": 14075, "heading": 341, "speed": 365} -] -[ -{"datetime":"2023-08-02 14-53-35", "target": "MXD158 ", "latitude": 1.485947, "longitude": 103.897042, "altitude": 36000, "heading": 307, "speed": 492}, {"hex": "7814e7", "target": "CQN2096 ", "latitude": 1.593384, "longitude": 103.969535, "altitude": 14375, "heading": 341, "speed": 369} -] -[ -{"datetime":"2023-08-02 14-53-46", "target": "MXD158 ", "latitude": 1.485947, "longitude": 103.897042, "altitude": 36000, "heading": 307, "speed": 492}, {"hex": "7814e7", "target": "CQN2096 ", "latitude": 1.600233, "longitude": 103.967127, "altitude": 14500, "heading": 341, "speed": 371} -] -[ -{"datetime":"2023-08-02 14-53-56", "target": "MXD158 ", "latitude": 1.485947, "longitude": 103.897042, "altitude": 36000, "heading": 307, "speed": 492}, {"hex": "7814e7", "target": "CQN2096 ", "latitude": 1.600233, "longitude": 103.967127, "altitude": 14500, "heading": 341, "speed": 371} -] -[ -{"datetime":"2023-08-02 14-54-07", "target": "MXD158 ", "latitude": 1.485947, "longitude": 103.897042, "altitude": 36000, "heading": 307, "speed": 492}, {"hex": "7814e7", "target": "CQN2096 ", "latitude": 1.600233, "longitude": 103.967127, "altitude": 14500, "heading": 341, "speed": 371} -] -[ -{"datetime":"2023-08-02 14-54-17", "target": "MXD158 ", "latitude": 1.485947, "longitude": 103.897042, "altitude": 36000, "heading": 307, "speed": 492}, {"hex": "7814e7", "target": "CQN2096 ", "latitude": 1.600233, "longitude": 103.967127, "altitude": 14500, "heading": 341, "speed": 371} -] -[ -{"datetime":"2023-08-02 14-54-28", "target": "MXD158 ", "latitude": 1.485947, "longitude": 103.897042, "altitude": 36000, "heading": 307, "speed": 492}, {"hex": "7814e7", "target": "CQN2096 ", "latitude": 1.600233, "longitude": 103.967127, "altitude": 14500, "heading": 341, "speed": 371} -] -[ -{"datetime":"2023-08-02 14-54-38", "target": "CQN2096 ", "latitude": 1.600233, "longitude": 103.967127, "altitude": 14500, "heading": 341, "speed": 371} -] -[ -{"datetime":"2023-08-02 14-59-22", "target": "", "latitude": 1.576678, "longitude": 103.965375, "altitude": 42975, "heading": 354, "speed": 467} -] -[ -{"datetime":"2023-08-02 14-59-32", "target": "", "latitude": 1.576678, "longitude": 103.965375, "altitude": 42975, "heading": 354, "speed": 467} -] -[ -{"datetime":"2023-08-02 14-59-43", "target": "", "latitude": 1.576678, "longitude": 103.965375, "altitude": 42975, "heading": 354, "speed": 467} -] -[ -{"datetime":"2023-08-02 14-59-54", "target": "", "latitude": 1.576678, "longitude": 103.965375, "altitude": 42975, "heading": 354, "speed": 467} -] -[ -{"datetime":"2023-08-02 15-00-04", "target": "", "latitude": 1.576678, "longitude": 103.965375, "altitude": 42975, "heading": 354, "speed": 467} -] -[ -{"datetime":"2023-08-02 15-00-15", "target": "", "latitude": 1.576678, "longitude": 103.965375, "altitude": 42975, "heading": 354, "speed": 467} -] -[ -{"datetime":"2023-08-02 15-00-25", "target": "", "latitude": 1.576678, "longitude": 103.965375, "altitude": 42975, "heading": 354, "speed": 467} -] -[ -{"datetime":"2023-08-02 15-00-36", "target": "", "latitude": 1.576678, "longitude": 103.965375, "altitude": 42975, "heading": 354, "speed": 467} -] -[ -{"datetime":"2023-08-02 15-04-58", "target": "BAV308 ", "latitude": 1.387253, "longitude": 104.042762, "altitude": 9950, "heading": 348, "speed": 281} -] -[ -{"datetime":"2023-08-02 15-05-08", "target": "BAV308 ", "latitude": 1.387253, "longitude": 104.042762, "altitude": 10150, "heading": 348, "speed": 281} -] -[ -{"datetime":"2023-08-02 15-05-19", "target": "BAV308 ", "latitude": 1.426361, "longitude": 104.034277, "altitude": 10825, "heading": 348, "speed": 300} -] -[ -{"datetime":"2023-08-02 15-05-29", "target": "BAV308 ", "latitude": 1.430643, "longitude": 104.033329, "altitude": 11050, "heading": 348, "speed": 306} -] -[ -{"datetime":"2023-08-02 15-05-40", "target": "BAV308 ", "latitude": 1.430643, "longitude": 104.033329, "altitude": 11175, "heading": 347, "speed": 321} -] -[ -{"datetime":"2023-08-02 15-05-50", "target": "BAV308 ", "latitude": 1.430643, "longitude": 104.033329, "altitude": 11425, "heading": 347, "speed": 321} -] -[ -{"datetime":"2023-08-02 15-06-01", "target": "BAV308 ", "latitude": 1.430643, "longitude": 104.033329, "altitude": 11650, "heading": 347, "speed": 321} -] -[ -{"datetime":"2023-08-02 15-06-11", "target": "BAV308 ", "latitude": 1.430643, "longitude": 104.033329, "altitude": 11975, "heading": 347, "speed": 357} -] -[ -{"datetime":"2023-08-02 15-06-22", "target": "BAV308 ", "latitude": 1.430643, "longitude": 104.033329, "altitude": 12425, "heading": 347, "speed": 357} -] -[ -{"datetime":"2023-08-02 15-06-32", "target": "BAV308 ", "latitude": 1.430643, "longitude": 104.033329, "altitude": 12850, "heading": 347, "speed": 364} -] -[ -{"datetime":"2023-08-02 15-06-43", "target": "BAV308 ", "latitude": 1.556986, "longitude": 104.003827, "altitude": 13350, "heading": 347, "speed": 365} -] -[ -{"datetime":"2023-08-02 15-06-53", "target": "BAV308 ", "latitude": 1.571594, "longitude": 104.000399, "altitude": 13700, "heading": 347, "speed": 369} -] -[ -{"datetime":"2023-08-02 15-07-04", "target": "BAV308 ", "latitude": 1.577935, "longitude": 103.998855, "altitude": 13825, "heading": 347, "speed": 369} -] -[ -{"datetime":"2023-08-02 15-07-14", "target": "BAV308 ", "latitude": 1.577935, "longitude": 103.998855, "altitude": 14675, "heading": 347, "speed": 369} -] -[ -{"datetime":"2023-08-02 15-07-25", "target": "BAV308 ", "latitude": 1.577935, "longitude": 103.998855, "altitude": 14700, "heading": 347, "speed": 369} -] -[ -{"datetime":"2023-08-02 15-07-35", "target": "BAV308 ", "latitude": 1.577935, "longitude": 103.998855, "altitude": 14700, "heading": 347, "speed": 369} -] -[ -{"datetime":"2023-08-02 15-07-46", "target": "BAV308 ", "latitude": 1.577935, "longitude": 103.998855, "altitude": 14700, "heading": 347, "speed": 369} -] -[ -{"datetime":"2023-08-02 15-07-56", "target": "BAV308 ", "latitude": 1.577935, "longitude": 103.998855, "altitude": 14700, "heading": 347, "speed": 369} -] -[ -{"datetime":"2023-08-02 15-08-07", "target": "BAV308 ", "latitude": 1.577935, "longitude": 103.998855, "altitude": 14700, "heading": 347, "speed": 369} -] diff --git a/feed1090/feed1090.json b/feed1090/feed1090.json new file mode 100644 index 0000000..0394936 --- /dev/null +++ b/feed1090/feed1090.json @@ -0,0 +1,22 @@ +{"1":{"time":"14-52-55","target":"TTTT","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0},"3":{"time":"14-52-59","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"5":{"time":"14-53-04","target":"TTTT","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0},"7":{"time":"14-53-09","target":"TTTT","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0},"9":{"time":"14-53-14","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"11":{"time":"14-53-20","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"13":{"time":"14-53-25","target":"PPPP","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0}, +"14":{"time":"14-53-25","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"16":{"time":"14-53-30","target":"PPPP","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0}, +"17":{"time":"14-53-30","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"19":{"time":"14-53-35","target":"PPPP","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0}, +"20":{"time":"14-53-35","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"22":{"time":"14-53-41","target":"PPPP","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0}, +"23":{"time":"14-53-41","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"25":{"time":"14-53-46","target":"PPPP","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0}, +"26":{"time":"14-53-46","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"28":{"time":"14-53-51","target":"PPPP","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0}, +"29":{"time":"14-53-51","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"31":{"time":"14-53-56","target":"PPPP","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0}, +"32":{"time":"14-53-56","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"34":{"time":"14-54-02","target":"PPPP","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0}, +"35":{"time":"14-54-02","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"37":{"time":"14-54-07","target":"PPPP","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0}, +"38":{"time":"14-54-07","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"40":{"time":"14-54-12","target":"PPPP","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0}, +"41":{"time":"14-54-12","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"43":{"time":"14-54-17","target":"PPPP","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0},"1":{"time":"15-09-24","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0}, +"2":{"time":"15-09-24","target":"TEST1234","latitude":6.0,"longitude":5.999978,"altitude":38500,"heading":0,"speed":0},"4":{"time":"15-09-30","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0}, +"5":{"time":"15-09-30","target":"TEST1234","latitude":6.0,"longitude":5.999978,"altitude":38500,"heading":0,"speed":0},"7":{"time":"15-09-35","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0}, +"8":{"time":"15-09-35","target":"TEST1234","latitude":6.0,"longitude":5.999978,"altitude":38500,"heading":0,"speed":0},"10":{"time":"15-09-40","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0}, +"11":{"time":"15-09-40","target":"TEST1234","latitude":6.0,"longitude":5.999978,"altitude":38500,"heading":0,"speed":0},"13":{"time":"15-09-45","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0}, +"14":{"time":"15-09-45","target":"TEST1234","latitude":6.0,"longitude":5.999978,"altitude":38500,"heading":0,"speed":0},"16":{"time":"15-09-51","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0}, +"17":{"time":"15-09-51","target":"TEST1234","latitude":6.0,"longitude":5.999978,"altitude":38500,"heading":0,"speed":0},"19":{"time":"15-09-56","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0}, +"20":{"time":"15-09-56","target":"TEST1234","latitude":6.0,"longitude":5.999978,"altitude":38500,"heading":0,"speed":0},"22":{"time":"15-10-01","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0}, +"23":{"time":"15-10-01","target":"TEST1234","latitude":6.0,"longitude":5.999978,"altitude":38500,"heading":0,"speed":0},"25":{"time":"15-10-06","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0}, +"26":{"time":"15-10-06","target":"TEST1234","latitude":6.0,"longitude":5.999978,"altitude":38500,"heading":0,"speed":0},"28":{"time":"15-10-12","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0}, +"29":{"time":"15-10-12","target":"TEST1234","latitude":6.0,"longitude":5.999978,"altitude":38500,"heading":0,"speed":0},"31":{"time":"15-10-17","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0}, +"32":{"time":"15-10-17","target":"TEST1234","latitude":6.0,"longitude":5.999978,"altitude":38500,"heading":0,"speed":0},"34":{"time":"15-10-22","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0},"36":{"time":"15-10-28","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0},"38":{"time":"15-10-33","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0},"40":{"time":"15-10-38","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0},"42":{"time":"15-10-43","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0},"44":{"time":"15-10-48","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0},"46":{"time":"15-10-54","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0},"48":{"time":"15-10-59","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0},"50":{"time":"15-11-04","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0},"52":{"time":"15-11-09","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0},"54":{"time":"15-11-15","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0},"56":{"time":"15-11-20","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0}} \ No newline at end of file diff --git a/feed1090/json_process.py b/feed1090/json_process.py new file mode 100644 index 0000000..720440e --- /dev/null +++ b/feed1090/json_process.py @@ -0,0 +1,6 @@ +import pandas as pd + +lf = open('feed1090.json','r+') +data = lf.readlines() +for i in data: + print(i) diff --git a/feed1090/log1090backup_4aug23/2023-08-04_1090ES.json b/feed1090/log1090backup_4aug23/2023-08-04_1090ES.json new file mode 100644 index 0000000..e801a69 --- /dev/null +++ b/feed1090/log1090backup_4aug23/2023-08-04_1090ES.json @@ -0,0 +1,22 @@ +"1":{"time":"14-52-55","target":"TTTT","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0},"3":{"time":"14-52-59","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"5":{"time":"14-53-04","target":"TTTT","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0},"7":{"time":"14-53-09","target":"TTTT","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0},"9":{"time":"14-53-14","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"11":{"time":"14-53-20","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"13":{"time":"14-53-25","target":"PPPP","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0}, +"14":{"time":"14-53-25","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"16":{"time":"14-53-30","target":"PPPP","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0}, +"17":{"time":"14-53-30","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"19":{"time":"14-53-35","target":"PPPP","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0}, +"20":{"time":"14-53-35","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"22":{"time":"14-53-41","target":"PPPP","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0}, +"23":{"time":"14-53-41","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"25":{"time":"14-53-46","target":"PPPP","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0}, +"26":{"time":"14-53-46","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"28":{"time":"14-53-51","target":"PPPP","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0}, +"29":{"time":"14-53-51","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"31":{"time":"14-53-56","target":"PPPP","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0}, +"32":{"time":"14-53-56","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"34":{"time":"14-54-02","target":"PPPP","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0}, +"35":{"time":"14-54-02","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"37":{"time":"14-54-07","target":"PPPP","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0}, +"38":{"time":"14-54-07","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"40":{"time":"14-54-12","target":"PPPP","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0}, +"41":{"time":"14-54-12","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"43":{"time":"14-54-17","target":"PPPP","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0},"1":{"time":"15-09-24","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0}, +"2":{"time":"15-09-24","target":"TEST1234","latitude":6.0,"longitude":5.999978,"altitude":38500,"heading":0,"speed":0},"4":{"time":"15-09-30","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0}, +"5":{"time":"15-09-30","target":"TEST1234","latitude":6.0,"longitude":5.999978,"altitude":38500,"heading":0,"speed":0},"7":{"time":"15-09-35","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0}, +"8":{"time":"15-09-35","target":"TEST1234","latitude":6.0,"longitude":5.999978,"altitude":38500,"heading":0,"speed":0},"10":{"time":"15-09-40","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0}, +"11":{"time":"15-09-40","target":"TEST1234","latitude":6.0,"longitude":5.999978,"altitude":38500,"heading":0,"speed":0},"13":{"time":"15-09-45","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0}, +"14":{"time":"15-09-45","target":"TEST1234","latitude":6.0,"longitude":5.999978,"altitude":38500,"heading":0,"speed":0},"16":{"time":"15-09-51","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0}, +"17":{"time":"15-09-51","target":"TEST1234","latitude":6.0,"longitude":5.999978,"altitude":38500,"heading":0,"speed":0},"19":{"time":"15-09-56","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0}, +"20":{"time":"15-09-56","target":"TEST1234","latitude":6.0,"longitude":5.999978,"altitude":38500,"heading":0,"speed":0},"22":{"time":"15-10-01","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0}, +"23":{"time":"15-10-01","target":"TEST1234","latitude":6.0,"longitude":5.999978,"altitude":38500,"heading":0,"speed":0},"25":{"time":"15-10-06","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0}, +"26":{"time":"15-10-06","target":"TEST1234","latitude":6.0,"longitude":5.999978,"altitude":38500,"heading":0,"speed":0},"28":{"time":"15-10-12","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0}, +"29":{"time":"15-10-12","target":"TEST1234","latitude":6.0,"longitude":5.999978,"altitude":38500,"heading":0,"speed":0},"31":{"time":"15-10-17","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0}, +"32":{"time":"15-10-17","target":"TEST1234","latitude":6.0,"longitude":5.999978,"altitude":38500,"heading":0,"speed":0},"34":{"time":"15-10-22","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0},"36":{"time":"15-10-28","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0},"38":{"time":"15-10-33","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0},"40":{"time":"15-10-38","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0},"42":{"time":"15-10-43","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0},"44":{"time":"15-10-48","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0},"46":{"time":"15-10-54","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0},"48":{"time":"15-10-59","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0},"50":{"time":"15-11-04","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0},"52":{"time":"15-11-09","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0},"54":{"time":"15-11-15","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0},"56":{"time":"15-11-20","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0},"1":{"time":"15-21-59","target":"UFO1","latitude":1.396637,"longitude":103.844403,"altitude":1000,"heading":256,"speed":77},"3":{"time":"15-22-05","target":"UFO2","latitude":1.396102,"longitude":103.842395,"altitude":1025,"heading":256,"speed":77},"5":{"time":"15-22-10","target":"UFO3","latitude":1.395447,"longitude":103.840167,"altitude":1050,"heading":256,"speed":77},"7":{"time":"15-22-15","target":"N5748E","latitude":1.394897,"longitude":103.838491,"altitude":1125,"heading":250,"speed":82},"9":{"time":"15-22-20","target":"N5748E","latitude":1.394119,"longitude":103.836442,"altitude":1200,"heading":250,"speed":82},"11":{"time":"15-22-26","target":"N5748E","latitude":1.393495,"longitude":103.834913,"altitude":1275,"heading":250,"speed":82},"13":{"time":"15-22-31","target":"N5748E","latitude":1.392843,"longitude":103.833302,"altitude":1325,"heading":250,"speed":82},"15":{"time":"15-22-36","target":"N5748E","latitude":1.392517,"longitude":103.832625,"altitude":1350,"heading":241,"speed":72},"17":{"time":"15-22-41","target":"N5748E","latitude":1.392517,"longitude":103.832625,"altitude":1350,"heading":241,"speed":72},"19":{"time":"15-22-47","target":"N5748E","latitude":1.392517,"longitude":103.832625,"altitude":1350,"heading":241,"speed":72},"21":{"time":"15-22-52","target":"N5748E","latitude":1.392517,"longitude":103.832625,"altitude":1350,"heading":241,"speed":72},"23":{"time":"15-22-57","target":"N5748E","latitude":1.392517,"longitude":103.832625,"altitude":1350,"heading":241,"speed":72},"25":{"time":"15-23-02","target":"N5748E","latitude":1.392517,"longitude":103.832625,"altitude":1350,"heading":241,"speed":72},"27":{"time":"15-23-08","target":"N5748E","latitude":1.392517,"longitude":103.832625,"altitude":1350,"heading":241,"speed":72},"29":{"time":"15-23-13","target":"N5748E","latitude":1.392517,"longitude":103.832625,"altitude":1600,"heading":241,"speed":72},"31":{"time":"15-23-18","target":"N5748E","latitude":1.392517,"longitude":103.832625,"altitude":1650,"heading":241,"speed":72},"33":{"time":"15-23-23","target":"N5748E","latitude":1.392517,"longitude":103.832625,"altitude":1650,"heading":241,"speed":72},"35":{"time":"15-23-29","target":"N5748E","latitude":1.392517,"longitude":103.832625,"altitude":1650,"heading":241,"speed":72},"37":{"time":"15-23-34","target":"N5748E","latitude":1.392517,"longitude":103.832625,"altitude":1650,"heading":241,"speed":72},"39":{"time":"15-23-39","target":"N5748E","latitude":1.392517,"longitude":103.832625,"altitude":1650,"heading":241,"speed":72},"41":{"time":"15-23-44","target":"N5748E","latitude":1.392517,"longitude":103.832625,"altitude":1650,"heading":241,"speed":72},"43":{"time":"15-23-50","target":"N5748E","latitude":1.392517,"longitude":103.832625,"altitude":1650,"heading":241,"speed":72},"45":{"time":"15-23-55","target":"N5748E","latitude":1.392517,"longitude":103.832625,"altitude":1650,"heading":241,"speed":72},"47":{"time":"15-24-00","target":"N5748E","latitude":1.392517,"longitude":103.832625,"altitude":1650,"heading":241,"speed":72},"49":{"time":"15-24-05","target":"N5748E","latitude":1.392517,"longitude":103.832625,"altitude":1650,"heading":241,"speed":72},"51":{"time":"15-24-10","target":"N5748E","latitude":1.392517,"longitude":103.832625,"altitude":1650,"heading":241,"speed":72},"1":{"time":"15-58-12","target":"POORS","latitude":12.000003,"longitude":6.999978,"altitude":31750,"heading":0,"speed":0},"3":{"time":"15-58-17","target":"POORS","latitude":12.000003,"longitude":6.999978,"altitude":31750,"heading":0,"speed":0},"5":{"time":"15-58-23","target":"POORS","latitude":12.000003,"longitude":6.999978,"altitude":31750,"heading":0,"speed":0},"7":{"time":"15-58-28","target":"POORS","latitude":12.000003,"longitude":6.999978,"altitude":31750,"heading":0,"speed":0},"9":{"time":"15-58-33","target":"POORS","latitude":12.000003,"longitude":6.999978,"altitude":31750,"heading":0,"speed":0},"11":{"time":"15-58-38","target":"POORS","latitude":12.000003,"longitude":6.999978,"altitude":31750,"heading":0,"speed":0},"13":{"time":"15-58-44","target":"POORS","latitude":12.000003,"longitude":6.999978,"altitude":31750,"heading":0,"speed":0},"15":{"time":"15-58-49","target":"POORS","latitude":12.000003,"longitude":6.999978,"altitude":31750,"heading":0,"speed":0},"17":{"time":"15-58-54","target":"POORS","latitude":12.000003,"longitude":6.999978,"altitude":31750,"heading":0,"speed":0},"19":{"time":"15-58-59","target":"POORS","latitude":12.000003,"longitude":6.999978,"altitude":31750,"heading":0,"speed":0},"21":{"time":"15-59-05","target":"POORS","latitude":12.000003,"longitude":6.999978,"altitude":31750,"heading":0,"speed":0},"23":{"time":"15-59-10","target":"POORS","latitude":12.000003,"longitude":6.999978,"altitude":31750,"heading":0,"speed":0},"1":{"time":"16-02-45","target":"UFO4","latitude":1.396545,"longitude":103.837327,"altitude":1350,"heading":31,"speed":102},"3":{"time":"16-02-50","target":"UFO5","latitude":1.397452,"longitude":103.837896,"altitude":1350,"heading":31,"speed":103},"5":{"time":"16-02-55","target":"UFO6","latitude":1.399872,"longitude":103.839317,"altitude":1375,"heading":31,"speed":100},"7":{"time":"16-03-00","target":"UFO7","latitude":1.402084,"longitude":103.840632,"altitude":1425,"heading":30,"speed":95},"9":{"time":"16-03-06","target":"UFO8","latitude":1.402084,"longitude":103.840632,"altitude":1450,"heading":30,"speed":92},"11":{"time":"16-03-11","target":"UFO9","latitude":1.406576,"longitude":103.8432,"altitude":1425,"heading":29,"speed":93},"13":{"time":"16-03-16","target":"UFO10","latitude":1.406576,"longitude":103.8432,"altitude":1400,"heading":29,"speed":95},"15":{"time":"16-03-21","target":"UFO11","latitude":1.410021,"longitude":103.845141,"altitude":1375,"heading":30,"speed":96},"17":{"time":"16-03-27","target":"UFO12","latitude":1.410021,"longitude":103.845141,"altitude":1375,"heading":30,"speed":96},"19":{"time":"16-03-32","target":"UFO13","latitude":1.410021,"longitude":103.845141,"altitude":1375,"heading":30,"speed":96},"21":{"time":"16-03-37","target":"UFO14","latitude":1.410021,"longitude":103.845141,"altitude":1375,"heading":30,"speed":96},"23":{"time":"16-03-42","target":"UFO15","latitude":1.410021,"longitude":103.845141,"altitude":1375,"heading":30,"speed":96},"25":{"time":"16-03-48","target":"UFO16","latitude":1.410021,"longitude":103.845141,"altitude":1375,"heading":30,"speed":96},"27":{"time":"16-03-53","target":"UFO17","latitude":1.410021,"longitude":103.845141,"altitude":1375,"heading":30,"speed":96},"29":{"time":"16-03-58","target":"UFO18","latitude":1.410021,"longitude":103.845141,"altitude":1375,"heading":30,"speed":96},"31":{"time":"16-04-03","target":"UFO19","latitude":1.410021,"longitude":103.845141,"altitude":1375,"heading":30,"speed":96},"33":{"time":"16-04-09","target":"UFO20","latitude":1.410021,"longitude":103.845141,"altitude":1375,"heading":30,"speed":96},"35":{"time":"16-04-14","target":"UFO21","latitude":1.410021,"longitude":103.845141,"altitude":1375,"heading":30,"speed":96},"37":{"time":"16-04-19","target":"UFO22","latitude":1.410021,"longitude":103.845141,"altitude":1375,"heading":30,"speed":96},"39":{"time":"16-04-24","target":"UFO23","latitude":1.410021,"longitude":103.845141,"altitude":1375,"heading":30,"speed":96}, \ No newline at end of file diff --git a/feed1090/log1090backup_4aug23/2023-08-04_ufo b/feed1090/log1090backup_4aug23/2023-08-04_ufo new file mode 100644 index 0000000..cabf43b --- /dev/null +++ b/feed1090/log1090backup_4aug23/2023-08-04_ufo @@ -0,0 +1 @@ +24 \ No newline at end of file diff --git a/feed1090/log1090backup_4aug23/dump1090_data.json b/feed1090/log1090backup_4aug23/dump1090_data.json new file mode 100644 index 0000000..3538f92 --- /dev/null +++ b/feed1090/log1090backup_4aug23/dump1090_data.json @@ -0,0 +1,3 @@ +[ +{"hex":"000000", "flight":"TEST1234", "lat":1.999977, "lon":5.000011, "altitude":36000, "track":0, "speed":0} +] diff --git a/feed1090/log1090backup_4aug23/json_test.py b/feed1090/log1090backup_4aug23/json_test.py new file mode 100644 index 0000000..3e45606 --- /dev/null +++ b/feed1090/log1090backup_4aug23/json_test.py @@ -0,0 +1,4 @@ +import pandas as pd +#with open('2023-08-03_1090ES.json','r') as f: +plane_df=pd.read_json('2023-08-03_1090ES.json') +plane_df.head() \ No newline at end of file diff --git a/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 10-39-06_1090ES b/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 10-39-06_1090ES new file mode 100644 index 0000000..263aa61 --- /dev/null +++ b/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 10-39-06_1090ES @@ -0,0 +1 @@ +[{'hex': '50031d', 'flight': 'T7PTL ', 'lat': 1.382675, 'lon': 103.84538, 'altitude': 750, 'track': 34, 'speed': 140}] \ No newline at end of file diff --git a/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 10-51-10_1090ES b/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 10-51-10_1090ES new file mode 100644 index 0000000..d611f28 --- /dev/null +++ b/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 10-51-10_1090ES @@ -0,0 +1 @@ +[{'hex': 'ab2a89', 'flight': '', 'lat': 1.542508, 'lon': 103.881841, 'altitude': 5075, 'track': 3, 'speed': 285}] \ No newline at end of file diff --git a/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 10-51-42_1090ES b/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 10-51-42_1090ES new file mode 100644 index 0000000..d611f28 --- /dev/null +++ b/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 10-51-42_1090ES @@ -0,0 +1 @@ +[{'hex': 'ab2a89', 'flight': '', 'lat': 1.542508, 'lon': 103.881841, 'altitude': 5075, 'track': 3, 'speed': 285}] \ No newline at end of file diff --git a/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 10-53-47_1090ES b/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 10-53-47_1090ES new file mode 100644 index 0000000..52614c2 --- /dev/null +++ b/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 10-53-47_1090ES @@ -0,0 +1 @@ +[{'hex': '3c4594', 'flight': '', 'lat': 1.653168, 'lon': 103.962832, 'altitude': 14250, 'track': 334, 'speed': 337}] \ No newline at end of file diff --git a/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 10-54-19_1090ES b/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 10-54-19_1090ES new file mode 100644 index 0000000..52614c2 --- /dev/null +++ b/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 10-54-19_1090ES @@ -0,0 +1 @@ +[{'hex': '3c4594', 'flight': '', 'lat': 1.653168, 'lon': 103.962832, 'altitude': 14250, 'track': 334, 'speed': 337}] \ No newline at end of file diff --git a/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 11-06-29_1090ES b/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 11-06-29_1090ES new file mode 100644 index 0000000..425c903 --- /dev/null +++ b/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 11-06-29_1090ES @@ -0,0 +1 @@ +[{'hex': '88596a', 'flight': '', 'lat': 1.653349, 'lon': 103.952873, 'altitude': 13275, 'track': 339, 'speed': 333}] \ No newline at end of file diff --git a/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 11-07-00_1090ES b/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 11-07-00_1090ES new file mode 100644 index 0000000..e74f72a --- /dev/null +++ b/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 11-07-00_1090ES @@ -0,0 +1 @@ +[{'hex': '88596a', 'flight': '', 'lat': 1.653349, 'lon': 103.952873, 'altitude': 13650, 'track': 339, 'speed': 337}] \ No newline at end of file diff --git a/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 11-07-32_1090ES b/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 11-07-32_1090ES new file mode 100644 index 0000000..e74f72a --- /dev/null +++ b/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 11-07-32_1090ES @@ -0,0 +1 @@ +[{'hex': '88596a', 'flight': '', 'lat': 1.653349, 'lon': 103.952873, 'altitude': 13650, 'track': 339, 'speed': 337}] \ No newline at end of file diff --git a/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 11-12-15_1090ES b/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 11-12-15_1090ES new file mode 100644 index 0000000..edad4da --- /dev/null +++ b/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 11-12-15_1090ES @@ -0,0 +1 @@ +[{'hex': '7504b5', 'flight': '', 'lat': 1.588036, 'lon': 103.910538, 'altitude': 14050, 'track': 319, 'speed': 354}] \ No newline at end of file diff --git a/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 11-12-46_1090ES b/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 11-12-46_1090ES new file mode 100644 index 0000000..edad4da --- /dev/null +++ b/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 11-12-46_1090ES @@ -0,0 +1 @@ +[{'hex': '7504b5', 'flight': '', 'lat': 1.588036, 'lon': 103.910538, 'altitude': 14050, 'track': 319, 'speed': 354}] \ No newline at end of file diff --git a/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 11-13-49_1090ES b/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 11-13-49_1090ES new file mode 100644 index 0000000..cb0bc79 --- /dev/null +++ b/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 11-13-49_1090ES @@ -0,0 +1 @@ +[{'hex': '76d1c6', 'flight': 'TGW174 ', 'lat': 1.634125, 'lon': 103.961295, 'altitude': 15625, 'track': 338, 'speed': 305}] \ No newline at end of file diff --git a/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 11-14-20_1090ES b/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 11-14-20_1090ES new file mode 100644 index 0000000..ef4e0c7 --- /dev/null +++ b/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 11-14-20_1090ES @@ -0,0 +1 @@ +[{'hex': '76d1c6', 'flight': 'TGW174 ', 'lat': 1.644737, 'lon': 103.957041, 'altitude': 15700, 'track': 338, 'speed': 305}] \ No newline at end of file diff --git a/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 11-21-41_1090ES b/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 11-21-41_1090ES new file mode 100644 index 0000000..340b2df --- /dev/null +++ b/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 11-21-41_1090ES @@ -0,0 +1 @@ +[{'hex': '8013ed', 'flight': '', 'lat': 1.57132, 'lon': 103.892491, 'altitude': 13250, 'track': 320, 'speed': 379}] \ No newline at end of file diff --git a/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 11-22-12_1090ES b/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 11-22-12_1090ES new file mode 100644 index 0000000..340b2df --- /dev/null +++ b/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 11-22-12_1090ES @@ -0,0 +1 @@ +[{'hex': '8013ed', 'flight': '', 'lat': 1.57132, 'lon': 103.892491, 'altitude': 13250, 'track': 320, 'speed': 379}] \ No newline at end of file diff --git a/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 15-30-28_1090ES b/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 15-30-28_1090ES new file mode 100644 index 0000000..63733c1 --- /dev/null +++ b/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 15-30-28_1090ES @@ -0,0 +1 @@ +[{'hex': '135232', 'flight': 'TEST1234', 'lat': 8.000015, 'lon': 9.999979, 'altitude': 36000, 'track': 0, 'speed': 0}] \ No newline at end of file diff --git a/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 15-31-00_1090ES b/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 15-31-00_1090ES new file mode 100644 index 0000000..63733c1 --- /dev/null +++ b/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/2023-07-26 15-31-00_1090ES @@ -0,0 +1 @@ +[{'hex': '135232', 'flight': 'TEST1234', 'lat': 8.000015, 'lon': 9.999979, 'altitude': 36000, 'track': 0, 'speed': 0}] \ No newline at end of file diff --git a/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/live1090.json b/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/live1090.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/feed1090/log1090backup_4aug23/live logs/2023-07-26_1090ES_Log/live1090.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/feed1090/log1090backup_4aug23/live1090.json b/feed1090/log1090backup_4aug23/live1090.json new file mode 100644 index 0000000..7063515 --- /dev/null +++ b/feed1090/log1090backup_4aug23/live1090.json @@ -0,0 +1 @@ +[{'hex': '442006', 'flight': 'EEE ', 'lat': 3.999985, 'lon': 5.999978, 'altitude': 37000, 'track': 0, 'speed': 0}] \ No newline at end of file diff --git a/feed1090/log1090backup_4aug23/log1090.py b/feed1090/log1090backup_4aug23/log1090.py new file mode 100755 index 0000000..e8c231f --- /dev/null +++ b/feed1090/log1090backup_4aug23/log1090.py @@ -0,0 +1,100 @@ +import json +import requests +import time +import sys, select, os + +DUMP1090_ENDPOINT = 'http://localhost:8080/data.json' +UFO_DATE = time.strftime('%Y-%m-%d_ufo') +JSON_FILE = time.strftime('%Y-%m-%d_1090ES.json') + +def ufoPersist(): + if not os.path.exists(UFO_DATE): + with open(UFO_DATE,'w') as ufof1: + ufof1.write('1') + with open(UFO_DATE,'r') as ufof2: + ufo = ufof2.read() + return int(ufo) + +def liveThread(): + global DUMP1090_ENDPOINT + ### LIVE FILE UPDATE ### + # Load the flight data from dump1090 endpoint + response = requests.get(DUMP1090_ENDPOINT) + data = response.json() + + # Time string generation + #timeString = time.strftime("{'date': '%Y-%m-%d %H-%M-%S'}]) + + # (Over)write live file + #with open('live1090.json','w') as liveFile: + #liveFile.write(str(data)) + #print('Overwrite live1090: '+timeString+str(data)) + #liveFile.close() + return data + +def logThread(data, ufo, index): + global JSON_FILE, UFO_DATE + ### LOG DIR/FILE GENERATION ### + # Skip logging if blank + ds=str(data) + if ds == '[]': + print('Blank log, skipping...') + return 0 + + # Write string generation + ds=ds[1:-1] + print(ds) + dsArray = ds.split() + + ### WRITE ARRAY OPERATIONS ### + wc = 0 + for word in dsArray: + if word == "{'hex':": + lineWriter = time.strftime('\n"'+str(index)+'":'+'{"time":"%H-%M-%S",') + index+=1 + del dsArray[wc] + dsArray[wc]=lineWriter + # UFO handling + if word == "'flight':": + if dsArray[wc+1] == "'',": + dsArray[wc+1] = "'UFO"+str(ufo)+"'," + ufo += 1 + wc+=1 + dsArray.append(',') + ds=''.join(dsArray) + ds=ds.strip() + ds=ds.replace("'",'"') + ds=ds.replace("flight","target") + ds=ds.replace("track","heading") + ds=ds.replace("lat","latitude") + ds=ds.replace("lon","longitude") + print(ds) + # Return to default pwd + os.chdir('/home/pi/log1090') + # Write log file + logFile = open(JSON_FILE,'a') + logFile.write(ds) + print('Write to log file: '+JSON_FILE) + logFile.close() + # Save UFO counter for persistence + with open(UFO_DATE,'w') as ufof1: + ufof1.write(str(ufo)) + return index + +### MAIN LOOP ### +def main(): + i=0 + index=1 + while True: + i+=1 + # Main thread refresh = 1 second + time.sleep(1) + os.chdir('/home/pi/log1090') + ufo = ufoPersist() + data = liveThread() + # i%N, log interval will be N seconds + if i%5==0 or i==1: + index=logThread(data, ufo, index) + index+=1 + +main() diff --git a/feed1090/log1090backup_4aug23/master1090.py b/feed1090/log1090backup_4aug23/master1090.py new file mode 100755 index 0000000..2e0b673 --- /dev/null +++ b/feed1090/log1090backup_4aug23/master1090.py @@ -0,0 +1,45 @@ +import subprocess +from time import sleep +import log1090 +import threading +import sys, select, os + +### Launch dump1090 ### +def dump(): + print('Launching dump1090 --net --interactive...') + subprocess.call(['lxterminal', '-e', '/home/pi/dump1090/dump1090 --net --interactive']) + + +### log1090 loop ### +def log(): + print('Launching log1090...') + #subprocess.call(['lxterminal', '-e', 'python /home/pi/log1090/log1090.py']) + print('Starting Log1090, press Enter to exit...') + i=0 + p = select.poll() + p.register(sys.stdin, 1) + while True: + print('Poll counter: '+str(i)) + i+=1 + #if sys.stdin in select.select([sys.stdin], [], [], 0)[0]: + # print('Enter detected, exiting...') + # break + # Main thread refresh = 0.5 seconds + sleep(0.5) + data = log1090.liveThread() + # i%N, log interval will be N/2 seconds (DEFAULT N=60, 30 seconds) + if i%60==0 or i==1: + log1090.logThread(data) + + +def main(): + D = threading.Thread(target=dump) + L = threading.Thread(target=log) + D.start() + sleep(10) + L.start() + +main() + + + diff --git a/feed1090/log1090backup_4aug23/subprocess b/feed1090/log1090backup_4aug23/subprocess new file mode 100644 index 0000000..e69de29 diff --git a/feed1090/para_kill.py b/feed1090/para_kill.py index f186292..dabe2b9 100644 --- a/feed1090/para_kill.py +++ b/feed1090/para_kill.py @@ -25,7 +25,7 @@ def dump_kill(): ic('Killing all SSH stream data...') kill_ssh_tail = "ps -aux | grep ConnectTimeout=5 | awk '{print $2}' | xargs kill -9" Popen(kill_ssh_tail, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE) - + ic('Complete.') except Exception as e: print(e) except Exception as e: @@ -50,7 +50,6 @@ def log_kill(): ic('Killing all SSH stream data...') kill_ssh_tail = "ps -aux | grep ConnectTimeout=5 | awk '{print $2}' | xargs kill -9" Popen(kill_ssh_tail, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE) - ic('Complete.') except Exception as e: print(e) @@ -70,11 +69,11 @@ def main(): ic('Killing file read SSH 3/3...') kill_ssh_tail = "ps -aux | grep ConnectTimeout=5 | awk '{print $2}' | xargs kill -9" Popen(kill_ssh_tail, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE) - D = Thread(target=dump_kill) + #D = Thread(target=dump_kill) L = Thread(target=log_kill) - D.start() - time.sleep(6) - ic('Re-SSHing to pi...') + #D.start() + #time.sleep(6) + #ic('Re-SSHing to pi...') L.start() main() diff --git a/feed1090/para_start.py b/feed1090/para_start.py index 9cefcee..dafdaa0 100644 --- a/feed1090/para_start.py +++ b/feed1090/para_start.py @@ -2,85 +2,139 @@ import time from icecream import ic from subprocess import Popen, PIPE -from threading import Thread import select +import os +import pandas as pd +#sshpass must be installed on host pi_ip = '100.81.91.96' pi_user = "pi" pi_password = "raspberry" local_user = 'anton' +dateString = time.strftime('%d-%m-%Y') +""" def dump_start(): - global pi_ip, pi_user, pi_password - - try: - pi_client = paramiko.client.SSHClient() - pi_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) - pi_client.connect(pi_ip, username=pi_user, password=pi_password, timeout=5) + global pi_ip, pi_user, pi_password + + try: + pi_client = paramiko.client.SSHClient() + pi_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + pi_client.connect(pi_ip, username=pi_user, password=pi_password, timeout=5) - try: - ic('Launching dump1090...') - dump1090_launch = "./dump1090/dump1090 --net" - _stdin, _stdout,_stderr = pi_client.exec_command(dump1090_launch) - time.sleep(5) + try: + ic('Launching dump1090...') + dump1090_launch = 'nice -n -20 ./dump1090/dump1090 --net &' + _stdin, _stdout,_stderr = pi_client.exec_command(dump1090_launch) + time.sleep(5) - ic('Killing all SSH stream data...') - kill_ssh_tail = "ps -aux | grep ConnectTimeout=5 | awk '{print $2}' | xargs kill -9" - Popen(kill_ssh_tail, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE) + ic('Killing all SSH stream data...') + kill_ssh_tail = "ps -aux | grep ConnectTimeout=5 | awk '{print $2}' | xargs kill -9" + Popen(kill_ssh_tail, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE) + time.sleep(1) + except Exception as e: + ic('ds1') + ic(e) + except Exception as e: + ic('ds2') + ic(e) +""" - except Exception as e: - print(e) - except Exception as e: - print(e) +def fPrepend(filename, insert): + with open(filename,'r') as f: + save = f.read() + with open(filename,'w') as f: + f.write(insert) + f.write(save) + +def fix_log(): + global dateString, local_user + try: + fileName=f'''/home/{local_user}/ais/ais/static/adsb/{dateString}/feed1090.json''' + with open(fileName,'r') as f: + if not f.read(1)=='{': + fPrepend(fileName,'{') + with open(fileName,'a') as f: + f.seek(f.seek(0, os.SEEK_END) - 2) + f.truncate() + f.write('}}') + except Exception as e: + ic('flog') + ic(e) def log_start(): - global pi_ip, pi_user, pi_password - - try: - pi_client = paramiko.client.SSHClient() - pi_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) - pi_client.connect(pi_ip, username=pi_user, password=pi_password, timeout=5) + global pi_ip, pi_user, pi_password + + try: + pi_client = paramiko.client.SSHClient() + pi_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + pi_client.connect(pi_ip, username=pi_user, password=pi_password, timeout=5) - try: - ic('Launching log1090...') - log1090_launch = "python ./log1090/log1090.py" - _stdin, _stdout,_stderr = pi_client.exec_command(log1090_launch) - time.sleep(2) - - ic('Killing all SSH stream data...') - kill_ssh_tail = "ps -aux | grep ConnectTimeout=5 | awk '{print $2}' | xargs kill -9" - Popen(kill_ssh_tail, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE) - time.sleep(1) - - except Exception as e: - print(e) - except Exception as e: - print(e) + try: + ic('Launching log1090...') + log1090_launch = 'python ./log1090/log1090.py &' + _stdin, _stdout,_stderr = pi_client.exec_command(log1090_launch) + time.sleep(3) + + ic('Killing all SSH stream data...') + kill_ssh_tail = "ps -aux | grep ConnectTimeout=5 | awk '{print $2}' | xargs kill -9" + Popen(kill_ssh_tail, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE) + time.sleep(1) + except Exception as e: + ic('ls1') + ic(e) + except Exception as e: + ic('ls2') + ic(e) def log_sync(): - global pi_ip, pi_user, pi_password - dateString = time.strftime('%d-%m-%Y') - # before trying to to append, scp file over first - try: - copyFile = f'''sshpass -p {pi_password} scp {pi_user}@{pi_ip}:/home/pi/log1090/{dateString} /home/{local_user}/adsb-track-player/feed1090/{dateString}/feed1090.json''' - Popen(copyFile, shell=True, stdout=PIPE, stderr=PIPE, text=True) - syncUpdate = time.strftime('[%H-%M-%S] '+dateString+' synced') - ic(syncUpdate) - except Exception as e: - ic(e) + global pi_ip, pi_user, pi_password, local_user, dateString + try: + dirPath=f'''/home/{local_user}/ais/ais/static/adsb/{dateString}''' + filePath=f'''/home/{local_user}/ais/ais/static/adsb/{dateString}/feed1090.json''' + # Local log directory creation + if not os.path.isdir(dirPath): + ic('Creating local log directory...') + mkdirStr = f'''mkdir -p /home/{local_user}/ais/ais/static/adsb/{dateString}''' + Popen(mkdirStr, shell=True, stdout=PIPE, stderr=PIPE, text=True) + time.sleep(2) + # scp file to host + logPullString = time.strftime('%Y-%m-%d_1090ES.json') + copyFile = f'''sshpass -p {pi_password} scp {pi_user}@{pi_ip}:/home/pi/log1090/{logPullString} /home/{local_user}/ais/ais/static/adsb/{dateString}/feed1090.json''' + Popen(copyFile, shell=True, stdout=PIPE, stderr=PIPE, text=True) + # JSON format fixing + time.sleep(4) + if os.path.isfile(filePath): + fix_log() + SyncedAt = time.strftime('[%H-%M-%S] '+dateString) + ic(SyncedAt) + except Exception as e: + ic('log') + ic(e) + +""" +import pandas as pd +import time +from time import sleep +def json_reader(): + local_user = 'anton' + dateString = time.strftime('%d-%m-%Y') + filePath = f'''/home/{local_user}/ais/ais/static/adsb/{dateString}/feed1090.json''' + try: + df=pd.read_json() + except Exception as e: + df=pd.read_json(filePath) + print(time.strftime('Timestamp: %H-%M-%S')) + print(df) +""" def main(): - D = Thread(target=dump_start) - L = Thread(target=log_start) - D.start() - time.sleep(10) - ic('Re-SSHing to pi...') - L.start() - time.sleep(7) - ic('Starting file sync loop...') - while True: - log_sync() - time.sleep(10) - - + log_start() + time.sleep(5) + ic('Starting file sync loop...') + while True: + log_sync() + time.sleep(8) + + main() diff --git a/feed1090/para_start_test.py b/feed1090/para_start_test.py new file mode 100644 index 0000000..d13fccc --- /dev/null +++ b/feed1090/para_start_test.py @@ -0,0 +1,94 @@ +import paramiko +import time +from icecream import ic +from subprocess import Popen, PIPE +from threading import Thread +import select + +pi_ip = '100.81.91.96' +pi_user = "pi" +pi_password = "raspberry" +local_user = 'anton' +dateString = time.strftime('%d-%m-%Y') + +def dump_start(): + global pi_ip, pi_user, pi_password + + try: + pi_client = paramiko.client.SSHClient() + pi_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + pi_client.connect(pi_ip, username=pi_user, password=pi_password, timeout=5) + + try: + ic('Launching dump1090...') + dump1090_launch = "./dump1090/dump1090 --net" + _stdin, _stdout,_stderr = pi_client.exec_command(dump1090_launch) + time.sleep(5) + + ic('Killing all SSH stream data...') + kill_ssh_tail = "ps -aux | grep ConnectTimeout=5 | awk '{print $2}' | xargs kill -9" + Popen(kill_ssh_tail, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE) + + except Exception as e: + print(e) + except Exception as e: + print(e) + +def log_start(): + global pi_ip, pi_user, pi_password + + try: + pi_client = paramiko.client.SSHClient() + pi_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + pi_client.connect(pi_ip, username=pi_user, password=pi_password, timeout=5) + + try: + ic('Launching log1090...') + log1090_launch = "python ./log1090/log1090.py" + _stdin, _stdout,_stderr = pi_client.exec_command(log1090_launch) + time.sleep(2) + + ic('Killing all SSH stream data...') + kill_ssh_tail = "ps -aux | grep ConnectTimeout=5 | awk '{print $2}' | xargs kill -9" + Popen(kill_ssh_tail, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE) + time.sleep(1) + + except Exception as e: + print(e) + except Exception as e: + print(e) + +def log_sync(): + global pi_ip, pi_user, pi_password, dateString + # before trying to to append, scp file over first + try: + copyFile = f'''sshpass -p {pi_password} scp {pi_user}@{pi_ip}:/home/pi/log1090/{dateString} /home/{local_user}/adsb-track-player/feed1090/{dateString}/feed1090.json''' + Popen(copyFile, shell=True, stdout=PIPE, stderr=PIPE, text=True) + syncUpdate = time.strftime('[%H-%M-%S] '+dateString+' synced') + ic(syncUpdate) + except Exception as e: + ic(e) + +def fix_log(dateString): + filePath=f'''/home/{local_user}/adsb-track-player/feed1090/{dateString}/feed1090.json''' + with open(filePath,'a') as jf: + jf.write('}') + +def main(): + global dateString + D = Thread(target=dump_start) + L = Thread(target=log_start) + D.start() + time.sleep(7) + ic('Re-SSHing to pi...') + L.start() + time.sleep(7) + ic('Starting file sync loop...') + while True: + log_sync() + time.sleep(3) + fix_log() + time.sleep(7) + + +main() diff --git a/feed1090/read_loop.py b/feed1090/read_loop.py new file mode 100644 index 0000000..2c79e94 --- /dev/null +++ b/feed1090/read_loop.py @@ -0,0 +1,24 @@ +import pandas as pd +import time +from time import sleep + +def json_reader(): + local_user = 'anton' + dateString = time.strftime('%d-%m-%Y') + filePath = f'''/home/{local_user}/ais/ais/static/adsb/{dateString}/feed1090.json''' + try: + sleep(2) + df=pd.read_json(filePath) + print(time.strftime('Timestamp: %H-%M-%S')) + print('[*] NORMAL DATA') + return True, df + except Exception as e: + print(time.strftime('Timestamp: %H-%M-%S')) + print('[!]INVALID JSON') + return False, None + + +while True: + df=json_reader() + if df[0]: + print(df[1]) diff --git a/logfile.csv b/logfile.csv index 0e96463..12be84c 100644 --- a/logfile.csv +++ b/logfile.csv @@ -795,4 +795,153 @@ DATETIME,CALLSIGN,LAT,LONG,ALT,SPD,TRKANGLE 2023-08-02 14:59:57.415908,5T1CZDQA,0.6539384268502406,103.81454667649514,5296.220298963215,21.02144212258348,243.96007676530715 2023-08-02 15:00:15.616815,7Z2IY06T,1.3463431641764123,103.62213586245083,3524.6420953130582,85.51492573590866,179.5742884492715 2023-08-02 15:00:16.119327,PZJ846TN,2.19782767869354,104.00760992701257,2515.6497384149407,170.70613977833642,71.30461222575377 -2023-08-02 15:00:16.621429,A5HDU7QP,1.2650688596869637,103.73507508456144,4624.373286060124,173.99896367632644,279.5958717164698 \ No newline at end of file +2023-08-02 15:00:16.621429,A5HDU7QP,1.2650688596869637,103.73507508456144,4624.373286060124,173.99896367632644,279.5958717164698 +2023-08-02 15:18:33.536173,J5PEWBSI,0.8487190947252277,103.42115244716007,422.6811345655715,9.328475557014116,182.1419189774642 +2023-08-02 15:18:34.039476,3X2YJKI8,0.8497181714907862,104.14980013353528,389.63689025635296,13.201325385412952,155.21982400168417 +2023-08-02 15:18:34.541907,MCYJ75EZ,0.10643715022419808,103.52937004006472,83.00704776989289,20.34661617766171,185.5343663012658 +2023-08-02 15:18:35.044085,2YS0XVF3,-0.15191588907958753,102.58384524823532,126.06621500376393,13.079498223512187,241.39844973290687 +2023-08-02 15:18:36.747764,Q28I4E5G,2.0031205230072597,104.0472610469552,1086.9455447370437,76.60801712180297,200.37516314688062 +2023-08-02 15:18:37.250182,7E3OF5D1,2.960115269535674,104.32099671206602,125.85108142009449,131.59391688459536,254.32613273654957 +2023-08-02 15:18:37.752578,3C8T1OMG,3.2750280283094737,105.0736417134964,243.40080389184018,237.34504448946745,211.01955172765383 +2023-08-02 15:18:51.826562,5VOW4B0H,0.9780065052504965,104.25326103802077,9277.925489421978,152.58228454965712,268.178252482607 +2023-08-02 15:18:52.329756,NHMEC2W3,1.2756376622788537,104.80422198893704,395.373681168634,65.87455384242007,188.00971750501049 +2023-08-02 15:18:52.831996,OIY4FPDE,0.6550170628345577,104.33247462808654,129.72609882825162,124.01116143235278,113.1193724225837 +2023-08-02 15:18:53.334209,E8A4BPOL,-0.23297293769584626,104.25483586658889,56.72870606461075,126.05222228369169,41.031529469421 +2023-08-02 15:18:53.836400,7YVWJ86F,0.07930461892382179,105.08465582757968,102.53818349551734,241.65579887975244,256.19743007662873 +2023-08-02 15:18:54.338610,9Q6YFX3G,0.38348831971259867,105.92620199388703,201.72576207651866,278.7762887659255,303.7089838080693 +2023-08-02 15:18:54.840805,ZWOTRAX9,0.25433665509398673,105.43382496227234,197.13631450675993,113.45563365243007,304.0935095933892 +2023-08-02 15:18:55.343105,NQFSWUZR,-0.33482151500033974,104.59303329837049,217.1653797894344,212.23592246429223,231.39106713334695 +2023-08-02 15:18:55.845391,M9NR0DYC,-1.0119044666019894,104.57458072253917,254.00558309692113,84.47436072286753,282.3689870630669 +2023-08-02 15:18:56.347697,8Y1H90KM,-0.21627673228438216,104.7273850236912,349.58517550600993,57.538908318541296,206.61050614207034 +2023-08-02 15:18:56.850046,XZGO7DCW,-0.15012972789974155,105.47532517949733,388.6006883802276,25.766485471030823,212.36062828892807 +2023-08-02 15:18:57.327309,Z645G1EM,-0.6501657502182299,105.47755730341653,660.9409440064537,32.06729614908091,286.4310735795072 +2023-08-02 15:18:57.829680,TO8E1756,-1.5589948690371467,105.28456932846105,649.4624356158877,15.786349098758478,193.91979157742264 +2023-08-02 15:18:58.332002,5IWKUVPT,-1.3795483414800553,104.95708003868545,37.62118273285205,28.95617791600547,282.69523139204495 +2023-08-02 15:18:58.834373,3KP9SWVX,-1.189699710351443,104.35283065144361,49.66470392352781,52.80445196710433,313.6234189445016 +2023-08-02 15:18:59.336699,ZN67XBS2,-1.5455077149294572,103.37536300769521,72.20402417460518,78.31448337804854,144.07514271999923 +2023-08-02 15:18:59.839052,1WHXCFQV,-1.5242915373296033,103.91896808458989,40.54919617907833,59.19365145954465,17.397769162981263 +2023-08-02 15:19:00.341388,2NIOSW6P,-2.226607765209522,104.69109045819975,41.99634124836202,54.665231503070174,344.27710955763285 +2023-08-02 15:19:00.843806,OF3R65HJ,-1.5087748914704044,103.8282259555623,63.736404903713506,14.195897527893152,269.3895435531974 +2023-08-02 15:19:01.346141,TGLMFZI4,-1.442226994197156,103.05924476919493,113.780022642097,24.49215631592719,40.165104077289016 +2023-08-02 15:19:01.848488,K3ZDRLPY,-1.3564257015150252,103.41277084520925,85.41539910361789,33.643386806523374,120.13572415636246 +2023-08-02 15:19:02.325718,PVQDYLSU,-1.6602016650117533,103.3962463633278,99.49979475300701,51.985953346998386,291.5297382006572 +2023-08-02 15:19:02.828093,M307NVPZ,-1.3715233278277186,103.12223549753062,70.394193791607,41.57357229110688,213.45547312267536 +2023-08-02 15:19:03.330390,0GECVHL9,-1.5587511899698412,103.55398544782626,78.70973728260873,32.1477329627032,325.2576280223561 +2023-08-02 15:19:03.832688,GQ4R213T,-2.034573206500392,103.61362315210387,39.07044472327804,27.959128812293084,13.95087164387894 +2023-08-02 15:19:04.334798,GUJYAITV,-1.2403048460075525,103.38923895275727,47.759549634453045,6.670084494987034,133.23792585924252 +2023-08-02 15:19:04.837017,PRBQIGTO,-1.789870598832421,102.82424370065728,53.72763436261798,9.469091048579068,168.83884343663306 +2023-08-02 15:19:05.339320,UCIAKXB7,-1.8346702114594875,101.9226406509973,63.78375645840372,11.79522185506989,218.73269738430778 +2023-08-02 15:19:05.841659,EJMRKP60,-0.977153378771612,102.89177631402667,97.75564174403631,10.819726321578525,56.483942324223676 +2023-08-02 15:19:06.343856,0YQ9MR1K,-1.514224985006436,102.77110903246844,138.61347975606108,13.201497722550119,215.98997743150503 +2023-08-02 15:19:06.845840,FSRNIZGQ,-0.9506139099190007,103.01974420531512,204.37462155996903,23.507226118469003,316.13465082515637 +2023-08-02 15:19:07.347891,LW9346IY,-0.897853879949907,103.74807323137595,233.93555251447148,45.13870225275697,203.14619566023134 +2023-08-02 15:19:07.850242,AZDFV5GY,-1.576893217962061,104.10723783482439,278.2739975236144,67.80671219183908,311.9558924356151 +2023-08-02 15:19:08.327536,M24FJSPN,-1.2261967816742152,104.37845492612871,335.69360971188445,66.30331493700442,99.07843391753778 +2023-08-02 15:19:08.829887,FNUR2V7Z,-1.6947566291467406,103.65970549490865,324.5804980938277,49.892231350211574,342.50797910113533 +2023-08-02 15:19:09.332156,07DXJEG2,-0.7355140108674116,104.21841200363457,280.41987513177787,24.692257828324003,270.45366106551626 +2023-08-02 15:19:09.834515,ZB84KYSG,-0.09041716653207743,104.16633589862737,137.96557100488894,2.6037142920412997,254.93002646784237 +2023-08-02 15:19:10.336824,N8R5LSYI,-0.1592495168574255,104.37843986213576,149.13057190103092,1.1066258783006362,8.765994129704609 +2023-08-02 15:19:10.839229,PFK4JRY7,-0.698944769261769,104.24739729397893,249.69072576411915,1.1993068092463208,87.00126586137 +2023-08-02 15:19:11.341318,Q34DZJC1,-0.1560389106391391,103.66678058509308,207.5392742116135,0.27339768230461803,90.12910328575462 +2023-08-02 15:19:11.843124,NV60BQ8K,0.42248881348956724,104.13211889829726,181.44534980585732,0.16724869122358882,104.46834065686033 +2023-08-02 15:19:12.344742,BENOK7AJ,1.2825308924078684,103.6884371924391,111.35013560656611,0.32368108698369397,3.4499852210469157 +2023-08-02 15:19:12.846847,BUPY27GK,1.5293870286731217,104.1887994926127,198.00828080699333,0.5105532233734044,153.90027641521266 +2023-08-02 15:19:13.348432,6SNYTMU5,1.8239331246771784,104.0325771110309,275.9354762408818,0.7973427597556975,153.63250064808472 +2023-08-02 15:19:13.850177,YG4C2ZWU,2.453131265724845,103.22165647352341,549.5548567536935,0.7977560916795655,298.78459630471394 +2023-08-02 15:19:14.326978,D7RMNUW3,2.2948659330210486,103.22300775407535,273.9220777962483,0.47400875689994115,296.29158101100177 +2023-08-02 15:19:14.828581,W6MYQO49,2.1186364404375393,102.6153148861407,440.3588724712754,0.6621266490939642,155.96923755194814 +2023-08-02 15:19:15.330593,2AECHG93,1.935893351283052,102.72979578105033,309.62751317008747,0.45765101267186215,345.29268925299345 +2023-08-02 15:19:15.832165,NMFSDIZT,1.7596594012783469,102.22354749749658,76.47555757096353,0.8230426114973669,306.70520625361837 +2023-08-02 15:19:16.333725,58FEQ1KN,2.607264304346865,102.17723235303141,141.85747579145843,0.12923940142413604,162.91801633610476 +2023-08-02 15:19:16.835307,FVD03H8S,2.0726445813925007,101.93633712044135,196.8617088176027,0.22071456380643387,79.33314979581132 +2023-08-02 15:19:17.336909,6TZX91IF,1.1510496624931204,102.60221917796595,144.9829547242503,0.03376278501903124,227.52535265372165 +2023-08-02 15:19:17.838466,PWCQ27XS,1.4422703729940636,101.65537858259722,203.91078925215953,0.04663688688514801,290.1567629367756 +2023-08-02 15:19:18.340248,SOIAVNEH,2.0462422812107963,100.76951695105677,51.93021498615286,0.0875122263037604,250.20021942390918 +2023-08-02 15:19:18.841782,4ZSHY3I0,2.374551566148052,101.67368845407104,98.22892809565865,0.09969453436917645,206.1230228005486 +2023-08-02 15:19:19.343431,TK76Q3XB,2.474266398794193,101.39266674936204,20.114277357332696,0.019458018096904284,20.53966129382661 +2023-08-02 15:19:19.844996,614QSKOL,1.5695863656783877,100.68696941333552,27.7894412435022,0.020151516779865333,148.75667562946774 +2023-08-02 15:19:20.347030,EY8HPNMV,2.1129417265469552,100.97379815692915,23.238132624445573,0.012774131653046854,144.28819835261106 +2023-08-02 15:19:20.848613,VD7O6PCM,2.214394635071172,100.1098354629752,3.5735642983781055,0.020302142248518736,121.32679639636297 +2023-08-02 15:19:21.325592,7NZU5TH2,3.19450396802959,99.44178921951158,7.122346999100674,0.02945229385966565,37.175986084739066 +2023-08-02 15:19:21.827184,0T7DLSPU,2.9184168865809728,99.20004903511568,12.051171174195714,0.037535152320646775,71.16130131010625 +2023-08-02 15:19:22.329416,ADO6NQ1S,2.7248828120752213,99.27068807301977,13.034765246923115,0.06872834007062303,265.4586616027918 +2023-08-02 15:19:22.831679,RK942N0I,1.7500040186728865,99.91102529185366,5.786229115529091,0.01076282497436943,283.7399343922268 +2023-08-02 15:19:23.333846,C8EK5PFB,0.9624728602957082,100.48069116684705,3.0653074012597727,0.004672734869261596,331.15876387739524 +2023-08-02 15:19:23.836118,SOU09I53,1.8877012175218097,101.0662822766865,1.2449859146997497,0.005158209691353323,166.8188948468054 +2023-08-02 15:19:25.669980,MKHZYNXS,1.1823954335464923,103.8286594739916,8296.646910861728,206.52338829367255,239.11671192483152 +2023-08-02 15:19:26.172513,JL8IAGPK,2.0757634163742056,103.12518383362664,12132.6916787617,256.38729989170037,49.11841847689186 +2023-08-02 15:19:26.674976,1GU5KOSD,1.5006575959562294,103.15088943546279,24228.581644156802,132.3868958168873,273.11546755219973 +2023-08-02 15:19:27.177384,26UIJSLT,2.2880761630609685,103.02117859818576,27365.561377093945,164.99133320507747,112.1520996580665 +2023-08-02 15:19:27.679781,6ENSJVTG,2.3774054925626604,103.73991783133049,5458.2393392270715,163.7563776144177,229.8513429631435 +2023-08-02 15:19:28.182116,XBPTAM2S,1.545230427338318,103.849165973147,9157.069867404998,98.23221740537821,100.36369210733142 +2023-08-02 15:19:28.684514,D62K074H,0.953490913701647,103.95444644429807,2240.8533163768125,135.90819558734862,208.2566733765837 +2023-08-02 15:19:37.510032,24WKSNA5,0.6139843598799661,103.88013452970371,7321.559033728017,127.13343804812534,177.53628963334708 +2023-08-02 15:19:38.012771,70KWPV9H,-0.09082568851647599,103.54019318332642,11008.144694834391,41.32842738737364,126.6412936376961 +2023-08-02 15:19:38.515075,UGQAX6SP,-0.272995166505829,102.75093240266244,11444.25767940541,13.228101755991592,337.9465071661975 +2023-08-02 15:19:39.017396,SH5XBFNC,-0.23287116617198977,101.86722153520658,13224.505825688171,26.27409950028493,120.66569308445025 +2023-08-02 15:19:49.958870,7ENYL5CR,0.8720911256759751,103.73983805286403,2510.275540425496,277.0123630958252,3.0656724058195595 +2023-08-02 15:19:50.462125,RVP5F6KW,0.44286639281323614,104.54095146542764,2865.4678735208345,285.05664510962947,60.82807165022349 +2023-08-02 15:19:50.964251,7S2K91IG,0.4950517182485159,104.25150552713625,3992.608191920112,25.912275572214128,174.1918089925171 +2023-08-02 15:19:51.466109,EWS8YDVK,0.45724033526857055,103.98125951116742,2809.15921115993,24.812813861035565,95.49458650542635 +2023-08-02 15:19:51.968507,G7UP4NIM,1.0291530250771195,103.4606936798395,3351.3486915919716,38.73494632019942,101.03726030279795 +2023-08-02 15:19:52.470898,2DQ9G8TZ,1.1479415968352757,103.43294071444448,5386.072217997133,48.35962063906844,299.2776549368976 +2023-08-02 15:19:52.973116,31SVZD04,0.9764928289693653,103.86956436753954,9426.859867179142,96.17738236229773,227.39430557742082 +2023-08-02 15:19:53.475422,QBRSCUTM,1.208979050842893,103.56032318360161,10343.471596937752,133.81407577583713,163.26676144912676 +2023-08-02 15:19:53.977793,TLXR91SN,1.0566029373786894,103.06567552860598,5888.625941987683,54.299956682143474,351.1892083308201 +2023-08-02 15:19:54.480149,KZPH51JE,0.8022203451386754,103.6764577960446,1904.8485871137682,13.857379836175468,253.80563952093405 +2023-08-02 15:19:54.982509,ZYCW7IPN,1.5584875283379942,103.63590398568974,147.74981001768083,5.081240251801782,226.3279158434908 +2023-08-02 15:19:55.459611,REDHCPTJ,2.079103266817677,104.28980850100133,122.60534313225757,3.4998646066783983,98.92920969816078 +2023-08-02 15:19:55.962004,BCUYS8XR,1.1999062826501692,104.49044894025202,226.28904731543918,0.8524142050221104,146.8893057721736 +2023-08-02 15:19:56.464340,0UAL1OSN,1.8055358405057673,103.8534009536481,102.5853970862483,0.45611825489614094,255.7098279560636 +2023-08-02 15:19:56.966647,VJB79XME,1.7607077879802249,103.00512212394716,84.54597727239252,0.6337214960458248,181.61027657204875 +2023-08-02 15:19:57.468827,4OM6VZ5W,0.9765221231863166,103.29043611906006,54.95599283732911,0.2849759078761513,66.26432603663625 +2023-08-02 15:19:57.971120,DO6WPHRM,1.4640666605951196,103.89552407570673,84.77426460789017,0.2065628824774883,189.92754080432627 +2023-08-02 15:19:58.473408,J0TBDVZL,0.6931859694604523,103.38994673047405,33.19336813286006,0.1632775745576377,214.97102594929748 +2023-08-02 15:19:58.975632,J284PRCA,0.1150647272246268,103.18069209602568,2.6410780744664955,0.08486917994583261,28.40993066104869 +2023-08-02 15:19:59.477971,EQ49COWJ,-0.7719889903625459,102.67035220977,0.060209575356183986,0.07102246458273721,89.2287558478435 +2023-08-02 15:19:59.980244,B5EAD7UZ,-0.4924164813521328,102.80983856693156,0.005476714911495088,0.04171943576146407,167.63223986596137 +2023-08-02 15:20:00.482569,GBP2E60Y,-0.8358575558042951,103.61414217753057,0.005686394152727216,0.05924726755731366,63.59607942475725 +2023-08-02 15:20:00.959650,NQAESBPM,-1.68136254793505,102.88547195890538,0.0005588092361921608,0.06201162200911302,196.19619024091045 +2023-08-02 15:20:01.461996,Z4SAG0BR,-2.0882681858950165,103.13847797373798,0.0005479683151587405,0.04769496777993533,110.78328267281108 +2023-08-02 15:20:01.964228,FAZ7UBLY,-1.9928486341216636,103.43101270727232,0.00010991976010560068,0.05178819187077947,191.50520895858028 +2023-08-02 15:20:02.466403,SBK5RA2U,-1.5854908403582957,103.20239530551889,0.00015274838192367261,0.09135089731828823,233.71692812324406 +2023-08-02 15:20:02.968595,LZ43WJ80,-1.0462537880402127,103.69202662115082,0.00022637668438834081,0.023908702319993314,233.2441212984619 +2023-08-02 15:20:03.470918,U1IQPS6F,-0.8372538463445169,103.22546231584676,0.0004378906316469845,0.03858857888442715,299.0621452552569 +2023-08-02 15:20:03.973005,Z9NI63SH,-1.7052685531666343,104.12619131230758,0.0006151676266864,0.06950122787496096,122.15600074623887 +2023-08-02 15:20:04.475128,GMTOWEQR,-2.5364660120440616,105.08015535532007,0.0006281042941234485,0.06849344574011615,61.19524659366243 +2023-08-02 15:20:04.977168,XS73WTD8,-3.4014004335429604,105.78310271648536,0.0005917036726407442,0.024788538725549418,229.94515379102273 +2023-08-02 15:20:05.479140,ARGYTCMX,-4.269758316478539,105.081901609038,0.0003637584610036073,0.024656341958287586,134.00261297804843 +2023-08-02 15:20:05.980774,74QLXR1J,-3.4218331619176583,104.67605494395322,0.00014817809991547886,0.048386519885554403,157.4528281014338 +2023-08-02 15:20:06.482438,8URQCSHG,-2.989326649007322,104.75010337395561,8.173752321633593e-05,0.06399100048042224,274.6363932595353 +2023-08-02 15:20:06.959656,Z95MY6FL,-2.2431649793888058,104.97195799638904,3.559695181502679e-05,0.08671042478047096,105.9512969041266 +2023-08-02 15:20:07.461983,83SL5RCJ,-2.7827353062384352,104.03759872657517,5.69149778620955e-05,0.03572300902787936,17.160848294226014 +2023-08-02 15:20:07.964254,VF49XCGY,-3.647954661317761,103.78960696124761,6.72024063585264e-05,0.01588749712069707,279.2687081313271 +2023-08-02 15:20:08.466729,O948LC6F,-2.798371494261296,104.0258232862863,2.766716730174529e-05,0.0018228055470762838,190.57854243305633 +2023-08-02 15:20:08.968977,AUV3QKDW,-3.4855452010107433,103.78506859752336,1.348159641189945e-05,0.0005287146416545346,333.41321560207155 +2023-08-02 15:20:09.471231,J3KEQ4CI,-2.958524073144363,103.0637828576138,5.096261976029347e-06,0.0009836603864643524,38.06893114474872 +2023-08-02 15:20:09.973564,7AU54HSF,-3.6469670727054035,103.2785074595917,7.424438022358314e-06,0.0010467839235971913,320.7332193113968 +2023-08-02 15:20:10.475915,XQGYR3WM,-3.099574915787979,104.220867997317,1.4243968834807541e-05,0.0019600857229927445,107.14300081363331 +2023-08-04 16:31:35.271780,BOW6VER9,0.6902199644110212,104.11159374524486,9173.01578160522,272.59495114500714,84.03694907966751 +2023-08-04 16:31:35.774340,75OKS9WU,-0.250695488766828,105.04306974111877,4308.070415859648,7.0019386734222735,176.45745384809072 +2023-08-04 16:31:36.276454,V6ANE7PD,-0.5527173152498777,104.30428671911875,2701.7944210290816,5.449314437589424,208.37913015528875 +2023-08-04 16:31:36.778621,5ETORNFQ,-0.09768092991524768,105.16586428159849,4554.060061884847,4.26051841332416,246.2302533735089 +2023-08-04 16:31:37.280824,TZ8Q15K3,0.6602713607266348,104.36998896755749,213.03928213707968,5.598630759908132,265.67349057431744 +2023-08-04 16:31:37.783077,HWZRG805,0.18646031423339116,104.01031319628436,311.7780660768312,3.958465990016695,21.820513791965823 +2023-08-04 16:31:38.285346,EWH7I3OT,-0.004455795237409355,104.11893159254802,464.16043947921327,3.1387318779758293,9.075393656571805 +2023-08-04 16:32:46.845719,Z4GT3QL1,1.2079775864769664,104.43820004558286,2198.7951930306394,34.04498174874854,194.78032744432235 +2023-08-04 16:32:47.348233,TS0K1BUD,0.3121416741028853,104.51928140103267,2100.2490200519483,12.146663513042032,349.24183093807244 +2023-08-04 16:32:47.850634,AS09HWJQ,-0.5809736704279569,104.22231343769857,1860.1178176665512,16.5223602296507,307.02997399781293 +2023-08-04 16:32:48.352980,XKJAPNHZ,-0.23852880063545845,104.56126673545221,3705.876613239036,17.782513571121406,68.3285884666384 +2023-08-04 16:32:48.855335,T41DGQZX,0.6157062035609064,104.64936264041853,562.1456752951103,4.223006704919037,219.06977484147382 +2023-08-04 16:33:21.647981,NR7IPL4U,0.37206440401132523,103.41819924127756,9501.712793295525,56.05734631510418,58.625141623102294 +2023-08-04 16:33:22.150308,07EW4APK,1.3173465039532462,102.70816083044052,14167.861020402428,33.27311642223497,165.55451171917892 +2023-08-04 16:33:22.652570,0DL2MWXG,0.46149149254743027,103.65349075944508,24164.73061173391,20.732751834301787,347.4710762471875 +2023-08-04 16:33:23.154864,VPK6ZACW,0.9472557271698769,103.55272359467801,46108.02014379444,33.43032691900261,281.0388202833998 +2023-08-04 16:33:23.657112,3VZLECAW,1.0685586155013982,103.22309960177482,32395.233845150113,7.574717528373014,260.9736315332675 +2023-08-04 16:33:24.159374,2CW3BZX1,1.4163128458330998,103.82467728089824,29826.81381528212,6.775606434366785,251.93456146571998 +2023-08-04 16:33:24.661723,ZIGD0K8F,0.6337467671369426,102.9994174547362,8206.413747118437,4.657465250745774,227.5789602608594 +2023-08-04 16:33:25.164063,1KZY3LDI,-0.04631207455942632,103.62766378192659,11808.660325245915,9.018496552990328,22.930724766164076 +2023-08-04 16:33:25.666440,QT12IX7O,0.6691933460888748,102.84281256306453,20430.147920531035,11.7539123741652,65.68472131111122 +2023-08-04 16:33:26.168672,53Y2968W,0.3631656592838677,102.2054409895526,1486.675971598008,15.9747144411655,230.89490161099778 +2023-08-04 16:33:28.169084,EW03S8RC,0.9911570379941999,104.66771001446875,7833.8915333735795,23.126016668808134,46.25920268013905 +2023-08-04 16:33:28.675577,30JZ9MR7,0.34348286884399815,105.62077398208878,13874.190341215053,0.14459097522660969,274.83418959286917 \ No newline at end of file diff --git a/pyhackrf.py b/pyhackrf.py index 1ec6bf4..7200603 100644 --- a/pyhackrf.py +++ b/pyhackrf.py @@ -51,8 +51,10 @@ class LibHackRfReturnCode(IntEnum): class LibHackRfBoardIds(IntEnum): BOARD_ID_JELLYBEAN = 0 BOARD_ID_JAWBREAKER = 1 - BOARD_ID_HACKRF_ONE = 2 - BOARD_ID_HACKRF_ONE_V9 = 4 + # For HackRF One V9, BoardId is 4 + BOARD_ID_HACKRF_ONE = 4 + # For older HackRF Ones + #BOARD_ID_HACKRF_ONE = 2 BOARD_ID_RAD1O = 3 BOARD_ID_INVALID = 0xFF From 49a8e8aa8bf09f1fe4e6aafcb3b9d85235811f24 Mon Sep 17 00:00:00 2001 From: Anton Chua Date: Wed, 16 Aug 2023 15:32:00 +0800 Subject: [PATCH 21/22] Fix feed1090, clean up HackRfBroadcastThread Still getting USB error on startTX --- HackRfBroadcastThread.py | 25 +- HackRfBroadcastThread_control.py | 234 +++++++ ais_clonegen.py | 60 -- feed1090/TODO | 0 feed1090/feed1090.json | 22 - feed1090/json_process.py | 2 +- feed1090/read_loop.py | 2 +- logfile.csv | 623 +++++++++++++++++- pyhackrf.py | 22 +- pyhackrf_backup.py | 1031 ++++++++++++++++++++++++++++++ 10 files changed, 1916 insertions(+), 105 deletions(-) create mode 100644 HackRfBroadcastThread_control.py delete mode 100644 ais_clonegen.py delete mode 100644 feed1090/TODO delete mode 100644 feed1090/feed1090.json create mode 100644 pyhackrf_backup.py diff --git a/HackRfBroadcastThread.py b/HackRfBroadcastThread.py index 4f71b05..dc8e31c 100644 --- a/HackRfBroadcastThread.py +++ b/HackRfBroadcastThread.py @@ -79,19 +79,17 @@ def __init__(self,airborne_position_refresh_period = 150000): print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) self._hackrf_broadcaster.setCrystalPPM(0) - - result = self._hackrf_broadcaster.setAntennaPowerMode(LibHackRfHwMode.HW_MODE_ON) # Antenna Power Mode ON or OFF + + result = self._hackrf_broadcaster.setAmplifierMode(LibHackRfHwMode.HW_MODE_ON) # LNA Amplifier ON or OFF if (result != LibHackRfReturnCode.HACKRF_SUCCESS): print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) - - result = self._hackrf_broadcaster.setAmplifierMode(LibHackRfHwMode.HW_MODE_ON) # LNA Amplifier ON or OFF + result = self._hackrf_broadcaster.setLNAGain(14) # LNA Amplifier Gain (default 14) if (result != LibHackRfReturnCode.HACKRF_SUCCESS): print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) - - result = self._hackrf_broadcaster.setLNAGain(14) # LNA Amplifier Gain + result = self._hackrf_broadcaster.setAntennaPowerMode(LibHackRfHwMode.HW_MODE_ON) # Antenna Power Mode ON or OFF if (result != LibHackRfReturnCode.HACKRF_SUCCESS): print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) - + # 2MHz sample rate to meet ADS-B spec of 0.5µs PPM symbol result = self._hackrf_broadcaster.setSampleRate(2000000) if (result != LibHackRfReturnCode.HACKRF_SUCCESS): @@ -108,8 +106,10 @@ def __init__(self,airborne_position_refresh_period = 150000): result = self._hackrf_broadcaster.setTXVGAGain(47) # TX VGA Gain (4 for wire feed + attenuators, 47 for wireless) if (result != LibHackRfReturnCode.HACKRF_SUCCESS): - print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) - + print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) + + self._hackrf_broadcaster.printBoardInfos() # Print HackRF Board Instance Info + self._tx_context = hackrf_tx_context() self._do_stop = False @@ -137,6 +137,9 @@ def replace_message(self,type,frame_even,frame_odd = []): # 1090ES Frame IQ modulating frame_IQ = self._lowlevelencoder.frame_1090es_ppm_modulate_IQ(frame_even, frame_odd) + #with open('temp.iq','wb') as iq: + # iq.write(frame_IQ) + # this will usually be called from another thread, so mutex lock mechanism is used during update self._mutex.acquire() @@ -176,14 +179,14 @@ def broadcast_data(self,data): result = self._hackrf_broadcaster.startTX(hackrfTXCB,self._tx_context) if (result != LibHackRfReturnCode.HACKRF_SUCCESS): - print("startTXError:",result, ",", HackRF.getHackRfErrorCodeName(result)) + print("[!] startTXError:",result, ",", HackRF.getHackRfErrorCodeName(result)) while self._hackrf_broadcaster.isStreaming(): time.sleep(sleep_time) result = self._hackrf_broadcaster.stopTX() if (result != LibHackRfReturnCode.HACKRF_SUCCESS): - print("stopTXError:",result, ",", HackRF.getHackRfErrorCodeName(result)) + print("[!] stopTXError:",result, ",", HackRF.getHackRfErrorCodeName(result)) #self._mutex.release() diff --git a/HackRfBroadcastThread_control.py b/HackRfBroadcastThread_control.py new file mode 100644 index 0000000..90cd004 --- /dev/null +++ b/HackRfBroadcastThread_control.py @@ -0,0 +1,234 @@ +""" This class holds the aircraft states from the ADS-B point of view + +It is refreshed by the simulation thread (or sensor feed thread) and will +be used to provide broadcasted informations + +This program is free software: you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation, either version 3 of the License, or (at your option) any later +version. +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +You should have received a copy of the GNU General Public License along with +this program. If not, see . +""" + +# +# This class overrides threading.Thread and provides service to broacast +# ADS-B message though a HackRF device +# message updates are performed from a separate thread which will +# update/push messages thanks to the replace_message method +# thread loop will pump and broacast updated message (soft realtime) +# +# mutex protection mecanism is implemented in +# replace_message() which is call from other thread +# broadcast_one_message() which is called from this thread +# in order to prevent concurrent access to broadcasted data buffers + +import time, datetime, math +import threading + +from CustomDecorators import * +from ADSBLowLevelEncoder import ADSBLowLevelEncoder +from pyhackrf import * +from ctypes import * + +class hackrf_tx_context(Structure): + _fields_ = [("buffer", POINTER(c_ubyte)), + ("last_tx_pos", c_int), + ("buffer_length", c_int) ] + +def hackrfTXCB(hackrf_transfer): + user_tx_context = cast(hackrf_transfer.contents.tx_ctx, POINTER(hackrf_tx_context)) + tx_buffer_length = hackrf_transfer.contents.valid_length + left = user_tx_context.contents.buffer_length - user_tx_context.contents.last_tx_pos + addr_dest = addressof(hackrf_transfer.contents.buffer.contents) + addr_src = addressof(user_tx_context.contents.buffer.contents) + + if (left > tx_buffer_length): + memmove(addr_dest,addr_src,tx_buffer_length) + user_tx_context.contents.last_tx_pos += tx_buffer_length + return 0 + else: + memmove(addr_dest,addr_src,left) + memset(addr_dest+left,0,tx_buffer_length-left) + return -1 + +@Singleton +class HackRfBroadcastThread(threading.Thread): + def __init__(self,airborne_position_refresh_period = 150000): + super().__init__() + self._mutex = threading.Lock() + + self._lowlevelencoder = ADSBLowLevelEncoder() + + self._messages_feed_threads = {} + + + # Initialize pyHackRF library + result = HackRF.initialize() + if (result != LibHackRfReturnCode.HACKRF_SUCCESS): + print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) + + # Initialize HackRF instance (could pass board serial or index if specific board is needed) + self._hackrf_broadcaster = HackRF() + + # Do requiered settings + # so far hard-coded e.g. gain and disabled amp are specific to hardware test setup + # with hackrf feeding a flight aware dongle through cable + attenuators (-50dB) + result = self._hackrf_broadcaster.open() + if (result != LibHackRfReturnCode.HACKRF_SUCCESS): + print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) + + self._hackrf_broadcaster.setCrystalPPM(0) + + result = self._hackrf_broadcaster.setSampleRate(2000000) + if (result != LibHackRfReturnCode.HACKRF_SUCCESS): + print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) + + result = self._hackrf_broadcaster.setBasebandFilterBandwidth(HackRF.computeBaseBandFilterBw(2000000)) + if (result != LibHackRfReturnCode.HACKRF_SUCCESS): + print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) + + #result = self.hackrf_broadcaster.setFrequency(868000000) # free frequency for over the air brodcast tests + result = self._hackrf_broadcaster.setFrequency(1090000000) # do not use 1090MHz for actual over the air broadcasting + # only if you use wire feed (you'll need attenuators in that case) + if (result != LibHackRfReturnCode.HACKRF_SUCCESS): + print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) + + result = self._hackrf_broadcaster.setAmplifierMode(LibHackRfHwMode.HW_MODE_ON) # LNA Amplifier ON or OFF + if (result != LibHackRfReturnCode.HACKRF_SUCCESS): + print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) + + result = self._hackrf_broadcaster.setTXVGAGain(47) # week gain (used for wire feed + attenuators) + if (result != LibHackRfReturnCode.HACKRF_SUCCESS): + print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) + + self._tx_context = hackrf_tx_context() + + self._do_stop = False + + # do hackRF lib and instance cleanup at object destruction time + def __del__(self): + result = self._hackrf_broadcaster.close() + if (result != LibHackRfReturnCode.HACKRF_SUCCESS): + print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) + + result = HackRF.deinitialize() + if (result != LibHackRfReturnCode.HACKRF_SUCCESS): + print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) + + def stop(self): + self._do_stop = True + + def getMutex(self): + return self._mutex + + # updates the next data to be broadcaster for a given message type + #@Timed + def replace_message(self,type,frame_even,frame_odd = []): + + frame_IQ = self._lowlevelencoder.frame_1090es_ppm_modulate_IQ(frame_even, frame_odd) + + # this will usually be called from another thread, so mutex lock mecanism is used during update + + self._mutex.acquire() + calling_thread = threading.current_thread() + if calling_thread in self._messages_feed_threads: + self._messages_feed_threads[calling_thread][type][0] = frame_IQ + self._mutex.release() + + def register_track_simulation_thread(self,feeder_thread): + if feeder_thread in self._messages_feed_threads: + print(feeder_thread,"already registred as a feeder") + else: + self._messages_feed_threads[feeder_thread] = {} + + # key : "name of message" value : ["data to be broadcasted", datetime of last broadcast, delay_between 2 messages of this type] + self._messages_feed_threads[feeder_thread]["identification"] = [None, None, feeder_thread.identitification_message_period_us] + self._messages_feed_threads[feeder_thread]["register_6116"] = [None, None, feeder_thread.squawk_message_period_us] + self._messages_feed_threads[feeder_thread]["airborne_position"] = [None, None, feeder_thread.position_message_period_us] + self._messages_feed_threads[feeder_thread]["surface_position"] = [None, None, feeder_thread.position_message_period_us] + self._messages_feed_threads[feeder_thread]["airborne_velocity"] = [None, None, feeder_thread.velocity_message_period_us] + + def broadcast_data(self,data): + length = len(data) + if length != 0: + sleep_time = length*0.50e-6*(1.0+1e-6*self._hackrf_broadcaster.getCrystalPPM()) + self._tx_context.last_tx_pos = 0 + self._mutex.acquire() + self._tx_context.buffer_length = length + self._tx_context.buffer = (c_ubyte*self._tx_context.buffer_length).from_buffer_copy(data) + + # TODO : need to evaluate if mutex protection is requiered during full broadcast or + # could be reduced to buffer filling (probably can be reduced) + # reduced version is when next line mutex.release() is uncommented and + # mutex release at the end of this method is commented + + self._mutex.release() + + result = self._hackrf_broadcaster.startTX(hackrfTXCB,self._tx_context) + + if (result != LibHackRfReturnCode.HACKRF_SUCCESS): + print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) + + while self._hackrf_broadcaster.isStreaming(): + time.sleep(sleep_time) + + result = self._hackrf_broadcaster.stopTX() + if (result != LibHackRfReturnCode.HACKRF_SUCCESS): + print("Error :",result, ",", HackRF.getHackRfErrorCodeName(result)) + + #self._mutex.release() + + def run(self): + + while not self._do_stop: + #self._mutex.acquire() + now = datetime.datetime.now(datetime.timezone.utc) + plane_messages = bytearray() + sleep_time = 10.0 + for thread_broadcast_schedule in self._messages_feed_threads.values(): + for v in thread_broadcast_schedule.values(): + #now = datetime.datetime.now(datetime.timezone.utc) + v2_sec = v[2]*1e-6 + if v[1] != None: + remaining = v2_sec - (now - v[1]).total_seconds() + else: + remaining = -float('inf') + sleep_time = 0.0 + # Time throttling : messages are broadcasted only at provided time intervall + # TODO : implement UTC syncing mecanism (requiered that the actual host clock is UTC synced) ? + # which may be implemented to some accuracy level with ntp or GPS + PPS mecanisms ? in Python ? + if (v[0] != None and len(v[0]) > 0) and remaining <= 0.0: + plane_messages.extend(v[0]) + v[1] = now + elif remaining > 0.0: + remaining = math.fmod(remaining,v2_sec) + if remaining < sleep_time: + sleep_time = remaining + + + #print("sleep_time1",sleep_time) + bc_length = len(plane_messages) + if (bc_length > 0): + self.broadcast_data(plane_messages) + + elasped = (datetime.datetime.now(datetime.timezone.utc) - now).total_seconds() + sleep_time -= elasped + + if sleep_time < 0.0: + sleep_time = 0.0 + elif sleep_time < 0.5: + sleep_time *= 0.1 + else: + sleep_time = 0.5 + + time.sleep(0.1*sleep_time) + else: + time.sleep(0.000001) + #self._mutex.release() + + # upon exit, reset _do_stop flag in case there is a new start + self._do_stop = False diff --git a/ais_clonegen.py b/ais_clonegen.py deleted file mode 100644 index 46db410..0000000 --- a/ais_clonegen.py +++ /dev/null @@ -1,60 +0,0 @@ -""" Dynamically generates a randomized conical ship courses from initial values -shipCloneGen() -------------------------------------------------------- -This program is free software: you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation, either version 3 of the License, or (at your option) any later -version. -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -You should have received a copy of the GNU General Public License along with -this program. If not, see . -""" - -import random -import datetime -import os -from math import asin, atan2, cos, degrees, radians, sin - -def get_point_at_distance(lat1, lon1, d, bearing, R=6371): - """ - lat: initial latitude, in degrees - lon: initial longitude, in degrees - d: target distance from initial - bearing: (true) heading in degrees - R: optional radius of sphere, defaults to mean radius of earth - Returns new lat/lon coordinate {d}km from initial, in degrees - """ - lat1 = radians(lat1) - lon1 = radians(lon1) - a = radians(bearing) - lat2 = asin(sin(lat1) * cos(d/R) + cos(lat1) * sin(d/R) * cos(a)) - lon2 = lon1 + atan2( - sin(a) * sin(d/R) * cos(lat1), - cos(d/R) - sin(lat1) * sin(lat2) - ) - return (degrees(lat2), degrees(lon2),) - -def shipCloneGen(ship_id, lat, lon, duration=60): - dist = 0.007716667 - outputFile = open("ship="+ship_id+".csv", "a") - outputFile.write("DATETIME,SHIP_ID,LAT,LON,HEADING") - - # WRITES 1 LINE PER FUNCTION - for time from 0 to duration: - # Write to logfile -> CSV format: DATETIME,SHIP_ID,LAT,LON,HEADING - now=str(datetime.now()) - dist += 0.00 - bearing = random.uniform(0,360) - lat,lon = get_point_at_distance(lat,lon,dist,bearing) - outputFile.write("\n"+now,","+ship_id+","+str(lat)+","+str(lon)) - -def main(): - ship_id = "BIGSHIP" - lat = 0 - lon = 0 - duration = 10 - - - diff --git a/feed1090/TODO b/feed1090/TODO deleted file mode 100644 index e69de29..0000000 diff --git a/feed1090/feed1090.json b/feed1090/feed1090.json deleted file mode 100644 index 0394936..0000000 --- a/feed1090/feed1090.json +++ /dev/null @@ -1,22 +0,0 @@ -{"1":{"time":"14-52-55","target":"TTTT","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0},"3":{"time":"14-52-59","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"5":{"time":"14-53-04","target":"TTTT","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0},"7":{"time":"14-53-09","target":"TTTT","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0},"9":{"time":"14-53-14","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"11":{"time":"14-53-20","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"13":{"time":"14-53-25","target":"PPPP","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0}, -"14":{"time":"14-53-25","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"16":{"time":"14-53-30","target":"PPPP","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0}, -"17":{"time":"14-53-30","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"19":{"time":"14-53-35","target":"PPPP","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0}, -"20":{"time":"14-53-35","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"22":{"time":"14-53-41","target":"PPPP","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0}, -"23":{"time":"14-53-41","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"25":{"time":"14-53-46","target":"PPPP","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0}, -"26":{"time":"14-53-46","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"28":{"time":"14-53-51","target":"PPPP","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0}, -"29":{"time":"14-53-51","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"31":{"time":"14-53-56","target":"PPPP","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0}, -"32":{"time":"14-53-56","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"34":{"time":"14-54-02","target":"PPPP","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0}, -"35":{"time":"14-54-02","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"37":{"time":"14-54-07","target":"PPPP","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0}, -"38":{"time":"14-54-07","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"40":{"time":"14-54-12","target":"PPPP","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0}, -"41":{"time":"14-54-12","target":"TTTT","latitude":2.000015,"longitude":1.999977,"altitude":36000,"heading":0,"speed":0},"43":{"time":"14-54-17","target":"PPPP","latitude":1.999977,"longitude":1.999985,"altitude":36000,"heading":0,"speed":0},"1":{"time":"15-09-24","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0}, -"2":{"time":"15-09-24","target":"TEST1234","latitude":6.0,"longitude":5.999978,"altitude":38500,"heading":0,"speed":0},"4":{"time":"15-09-30","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0}, -"5":{"time":"15-09-30","target":"TEST1234","latitude":6.0,"longitude":5.999978,"altitude":38500,"heading":0,"speed":0},"7":{"time":"15-09-35","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0}, -"8":{"time":"15-09-35","target":"TEST1234","latitude":6.0,"longitude":5.999978,"altitude":38500,"heading":0,"speed":0},"10":{"time":"15-09-40","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0}, -"11":{"time":"15-09-40","target":"TEST1234","latitude":6.0,"longitude":5.999978,"altitude":38500,"heading":0,"speed":0},"13":{"time":"15-09-45","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0}, -"14":{"time":"15-09-45","target":"TEST1234","latitude":6.0,"longitude":5.999978,"altitude":38500,"heading":0,"speed":0},"16":{"time":"15-09-51","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0}, -"17":{"time":"15-09-51","target":"TEST1234","latitude":6.0,"longitude":5.999978,"altitude":38500,"heading":0,"speed":0},"19":{"time":"15-09-56","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0}, -"20":{"time":"15-09-56","target":"TEST1234","latitude":6.0,"longitude":5.999978,"altitude":38500,"heading":0,"speed":0},"22":{"time":"15-10-01","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0}, -"23":{"time":"15-10-01","target":"TEST1234","latitude":6.0,"longitude":5.999978,"altitude":38500,"heading":0,"speed":0},"25":{"time":"15-10-06","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0}, -"26":{"time":"15-10-06","target":"TEST1234","latitude":6.0,"longitude":5.999978,"altitude":38500,"heading":0,"speed":0},"28":{"time":"15-10-12","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0}, -"29":{"time":"15-10-12","target":"TEST1234","latitude":6.0,"longitude":5.999978,"altitude":38500,"heading":0,"speed":0},"31":{"time":"15-10-17","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0}, -"32":{"time":"15-10-17","target":"TEST1234","latitude":6.0,"longitude":5.999978,"altitude":38500,"heading":0,"speed":0},"34":{"time":"15-10-22","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0},"36":{"time":"15-10-28","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0},"38":{"time":"15-10-33","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0},"40":{"time":"15-10-38","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0},"42":{"time":"15-10-43","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0},"44":{"time":"15-10-48","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0},"46":{"time":"15-10-54","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0},"48":{"time":"15-10-59","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0},"50":{"time":"15-11-04","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0},"52":{"time":"15-11-09","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0},"54":{"time":"15-11-15","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0},"56":{"time":"15-11-20","target":"BANG","latitude":9.999985,"longitude":9.999979,"altitude":40000,"heading":0,"speed":0}} \ No newline at end of file diff --git a/feed1090/json_process.py b/feed1090/json_process.py index 720440e..5fd0c69 100644 --- a/feed1090/json_process.py +++ b/feed1090/json_process.py @@ -1,6 +1,6 @@ import pandas as pd -lf = open('feed1090.json','r+') +lf = open('test_isaac.json','r+') data = lf.readlines() for i in data: print(i) diff --git a/feed1090/read_loop.py b/feed1090/read_loop.py index 2c79e94..3a4a4c7 100644 --- a/feed1090/read_loop.py +++ b/feed1090/read_loop.py @@ -5,7 +5,7 @@ def json_reader(): local_user = 'anton' dateString = time.strftime('%d-%m-%Y') - filePath = f'''/home/{local_user}/ais/ais/static/adsb/{dateString}/feed1090.json''' + filePath = f'''test_isaac.json''' try: sleep(2) df=pd.read_json(filePath) diff --git a/logfile.csv b/logfile.csv index 12be84c..ec3057d 100644 --- a/logfile.csv +++ b/logfile.csv @@ -944,4 +944,625 @@ DATETIME,CALLSIGN,LAT,LONG,ALT,SPD,TRKANGLE 2023-08-04 16:33:25.666440,QT12IX7O,0.6691933460888748,102.84281256306453,20430.147920531035,11.7539123741652,65.68472131111122 2023-08-04 16:33:26.168672,53Y2968W,0.3631656592838677,102.2054409895526,1486.675971598008,15.9747144411655,230.89490161099778 2023-08-04 16:33:28.169084,EW03S8RC,0.9911570379941999,104.66771001446875,7833.8915333735795,23.126016668808134,46.25920268013905 -2023-08-04 16:33:28.675577,30JZ9MR7,0.34348286884399815,105.62077398208878,13874.190341215053,0.14459097522660969,274.83418959286917 \ No newline at end of file +2023-08-04 16:33:28.675577,30JZ9MR7,0.34348286884399815,105.62077398208878,13874.190341215053,0.14459097522660969,274.83418959286917 +2023-08-07 10:54:50.905603,UV19K6WN,2.0491785428043405,103.52046781881157,2212.7737409428523,69.19202201148354,64.08104741523717 +2023-08-07 10:54:51.408818,5UA2VRMS,2.814065180093099,102.90142293177769,2645.2541230955653,53.35086175206122,4.486300655338653 +2023-08-07 11:06:56.087804,4NCMRS8Z,0.6012662781213045,104.14626124300818,1747.1706312674605,74.71765606316538,267.95486320149394 +2023-08-07 11:06:56.590957,FKDBQH7W,1.1193392998204172,103.53412571511308,3487.3951991791587,111.65548819815206,48.43029494196571 +2023-08-07 11:08:58.552657,CHD95GZL,1.5410718760977193,104.53381615487392,2077.3900230165086,51.23662284667846,93.14362436064208 +2023-08-07 11:08:59.055881,AWEO8UT5,1.11939073428533,104.43292171758189,2589.5610500345792,10.414977469077584,93.87952942303532 +2023-08-07 11:08:59.558146,AR4NDSZ5,1.1866823983852188,103.99285642225396,2879.7260806352365,4.213933774479759,175.06278958207076 +2023-08-07 11:09:01.028418,IGYWNVKJ,1.813502304611318,104.22102586265686,6788.023126214931,235.96495496927562,199.6319160885713 +2023-08-07 11:09:01.531731,QW32DTB7,1.9648443220088823,103.85969543842918,5394.458959832362,303.21073301968363,49.434582184720625 +2023-08-07 11:09:02.033857,R30GPJCX,2.4026704078083236,104.1787969970416,4500.5344432574475,369.59271405297375,351.86749604832016 +2023-08-07 11:12:08.444635,HL4W3CM2,1.3521,103.8198,1139.1999999999998,260.8888888888889,113.0 +2023-08-07 11:12:08.946550,MQAYU09O,1.3521,103.8198,681.1999999999998,271.8888888888889,8.0 +2023-08-07 11:12:09.448102,IJ0L1CYD,1.3521,103.8198,150.19999999999982,49.888888888888914,88.0 +2023-08-07 11:13:40.815309,J6LQK3FC,2.200363741873999,103.48448353659191,8623.008422474395,172.83294972185897,326.1500044990125 +2023-08-07 11:13:41.317989,XM75UHYR,3.0880216206565443,102.81704123603252,5972.648097016285,48.38889710657992,109.9527956738142 +2023-08-07 11:13:41.820271,29MFSG05,3.40471804089689,102.34145963740336,737.5019739685304,55.23783659909539,167.13122944656337 +2023-08-07 11:13:42.322556,6BMCE8IW,3.5292646431227466,102.17043018528392,717.102742060011,86.12874197356544,38.13489907586688 +2023-08-07 11:13:42.824891,1L7HXOJ8,3.9721599579990925,101.211774398596,771.9542384202307,106.13204530205608,64.02288683335229 +2023-08-07 11:13:43.327172,HSYVUEIP,3.739953842560384,102.07935714475444,1162.393272378177,182.78954368635547,88.99220067292009 +2023-08-07 11:13:43.829474,UG12CZ9D,4.37529501011714,102.37429611740319,182.42908259426417,154.4414604054198,12.968164039753105 +2023-08-07 11:13:44.331873,VLDB0743,3.614569589088079,103.03468717003094,23.195405409780477,140.0826498106268,335.1665938088575 +2023-08-07 11:13:44.834211,5FN7Y1JV,3.4437366474135906,103.47242161556012,9.007221293624529,88.36449614271432,330.42635770521326 +2023-08-07 11:13:45.336552,Q1UPHWTO,3.6088902391100666,103.3811807677419,1.1636240580940935,51.68931117730492,146.71749231591662 +2023-08-07 11:13:45.813808,9EGTHYXM,2.8996517055146978,104.00042537675363,0.10632236002589446,6.356526691463067,86.26096432888608 +2023-08-07 11:13:46.316121,GI59R6BU,2.621549992745146,103.92362110988246,0.187585450729401,4.365827577396224,65.74027303763017 +2023-08-07 11:13:46.818438,FZCG5SBM,1.8252774974537342,103.77914138167229,0.24371959992675604,3.819034074467985,307.63687417998943 +2023-08-07 11:13:47.320785,4XEALBMU,1.4651265280079873,103.93589613265118,0.3500887345824728,6.916836626822082,310.35376329717513 +2023-08-07 11:13:47.823068,JO9MYN3B,0.9528009355998301,103.10791345012113,0.3579548827299007,2.978793644801434,260.8182227475704 +2023-08-07 11:13:48.325344,E10OZ57Y,1.8170519111040908,103.61087952865056,0.14641919413556267,4.921225226146646,209.39745162735255 +2023-08-07 11:13:48.827698,AYKJ9HBU,2.383461214420082,103.29094455665772,0.27814885906811854,6.420358815809537,84.11855609062712 +2023-08-07 11:13:49.330049,SQLAIPMT,2.3051107630092376,103.58657082120207,0.01108629035198061,11.23279835239487,187.0247373282665 +2023-08-07 11:13:49.832397,0D1EQ4ZT,2.4947149972236184,102.88378204583091,0.013622969426553824,5.156326607131362,152.98767625692813 +2023-08-07 11:13:50.334778,EKM459SJ,2.0395279970194724,101.91748431079955,0.01400051533180704,8.822793091692613,8.508083856959274 +2023-08-07 11:13:50.837168,92OS043L,1.7977666088652449,101.6576331514823,0.009184322475123588,13.067784707049187,180.19501913144865 +2023-08-07 11:13:51.314377,WXSLHQOA,1.288486830687802,100.74277633254782,0.01751986153377263,23.535881300599932,23.844523016092694 +2023-08-07 11:17:26.130957,0WVRAF4H,1.3176546184931608,103.79113890603752,2934.3331000753183,59.98588131111306,9.220044795853397 +2023-08-07 11:17:26.634044,TZ4YS2CP,1.4208649280948336,102.79332013531655,2047.9942338592696,6.478346334091171,203.64931751412436 +2023-08-07 11:17:27.136369,M8UC5P32,0.6562540055632826,103.36775239767127,1224.3219484263432,2.9492044246735305,261.1396449749925 +2023-08-07 11:17:36.232507,SICJ1EZA,2.1796669922516667,104.81058876094978,444.495228843467,203.78211952070515,272.8724363372641 +2023-08-07 11:17:36.738001,538WOI1M,2.818966510628326,104.92471193646719,364.5908023196773,200.27443605409664,258.33001780059294 +2023-08-07 11:17:37.240203,AGS8CTDY,2.4797449883989664,104.40058253404501,641.3019378614698,59.23211609345478,67.64160625792204 +2023-08-07 11:17:37.742470,XSB8NLFW,2.2348671287991126,103.66412817533397,482.87233450717434,5.799548611138,41.821476546487816 +2023-08-07 11:17:38.244731,5IQTCX73,2.1048343254820994,103.64312702372231,685.1330982789206,9.44748526007213,251.35484024969307 +2023-08-07 11:17:38.746999,PC1VEYBR,2.938534739900838,103.60021382547154,959.2551861835062,17.324980267491526,85.16845377707062 +2023-08-07 11:17:39.249295,FQJM87GX,3.5297616598919896,103.22681864069018,189.54274557333213,24.882509076337413,300.8515510082325 +2023-08-07 11:17:39.751664,7B4JNRX3,3.9611621293992334,103.6192217158575,145.08020170235588,27.42145030870069,337.6015463864647 +2023-08-07 11:17:40.253987,TVNS8IPK,3.3251740398611678,103.06759381685868,11.701665030340735,18.941067104180807,342.58278408762556 +2023-08-07 11:17:40.756346,KQ9AJTBF,2.7521348371774286,103.3847144886879,6.447264941002986,4.861419994926964,114.56450876231736 +2023-08-07 11:17:41.233517,JK3FV7O2,2.827292013314217,102.50784774341454,6.218208314597949,8.343781646708171,228.068214441019 +2023-08-07 11:17:41.735800,ETBWS0K1,2.2330632449294257,103.08738714151242,11.47773806655437,2.8053743411290473,273.86738257012564 +2023-08-07 11:17:42.238056,IZD9BRQ1,3.181617800903337,103.21361683518383,16.016100377815196,0.6992635254771677,317.26681249376554 +2023-08-07 11:17:42.740299,5JDFHA7Z,4.068057113859431,102.26601122755831,2.4093039262054443,0.8963058887370572,43.70822742767632 +2023-08-07 11:17:43.242540,UR72ZHQL,3.7812514337639165,102.59192675888316,4.600335944855853,0.16600834168324674,348.31216488776624 +2023-08-07 11:17:43.744763,DMKUN2I8,3.6919467634813437,102.76060524218138,0.7879417807326692,0.17027891753114396,209.92012948949912 +2023-08-07 11:17:44.247084,PCQ7UR2E,3.887862595279267,102.75580394793006,0.8177324322103405,0.023653879775824255,135.7955964597162 +2023-08-07 11:17:44.749391,ZCNRKGJ6,4.355536503396657,102.48056765864732,1.247587835415091,0.04442767974333637,62.54484292412883 +2023-08-07 11:17:45.251723,791RLEWY,5.350060920425047,102.49156047238829,0.6007911986779461,0.02604555737813916,345.94863578948 +2023-08-07 11:17:45.754054,73JNU6MB,4.735534787842727,102.01478539194933,0.7822757959278018,0.044623036273588504,180.96868492203657 +2023-08-07 11:17:46.256382,63UWTKPD,5.334583006479669,102.84806868078351,0.6752716701255105,0.010327753133706943,21.530117853181196 +2023-08-07 11:17:46.743245,9TMI3YQS,4.571169532874709,102.45345545608048,1.0221584173073481,0.01744773002569094,309.35547794065263 +2023-08-07 11:17:47.245470,2SV46LJP,4.022557268381585,102.30716099400767,2.0134673417112,0.0016703178316966848,139.71225638421993 +2023-08-07 11:17:47.747717,MCZFBAYV,3.388297889397939,102.42634438730919,0.8349574948817173,0.0012407934201601333,6.058400575399105 +2023-08-07 11:17:48.249958,APVFZMKJ,2.6415644818293407,103.16037808824903,1.1028177582882042,0.0020297096011673435,0.39605232595494044 +2023-08-07 11:17:48.752216,NCM5TULP,2.421190468948068,102.2144293746889,1.5167021167970067,0.0035229583967661413,39.473163679443374 +2023-08-07 11:17:49.254476,INWF6G5T,2.7195099182349307,101.55225289084616,3.0071881039938115,0.004037818196071433,345.3482198599094 +2023-08-07 11:17:49.731651,K3IYESXW,2.5847353825005417,102.47739182644303,1.174558774168525,0.0021969425648676873,209.5708364738864 +2023-08-07 11:17:50.233897,8IULRQMC,2.6467855119208394,102.53060496131783,1.4848266219779345,0.0021953217117546956,285.65038174667643 +2023-08-07 11:17:50.736142,FR2D0GVC,3.5987286041831488,101.8801150739188,0.6260310086269938,0.00288070296523094,119.9674077626068 +2023-08-07 11:17:51.238403,FY798NCT,3.2411274464195294,100.9364960202004,1.1635322347916095,0.00015941151321039902,220.15514439131238 +2023-08-07 11:17:51.740664,9VSD8041,3.658171687906631,101.54843257606365,1.8462593997280115,0.00020797472774606104,305.59868282489856 +2023-08-07 11:17:52.242911,D816GKZ2,3.472724880567342,100.68109255221215,2.1241210902719914,0.00013292368536417683,56.31267144221823 +2023-08-07 11:17:52.745121,P4JVRM6U,3.5457194694777683,100.43143454713095,0.7509424952280577,3.917664162961891e-05,31.33630431120514 +2023-08-07 11:17:53.247380,5NJGODLP,4.260868035061867,99.66259131916188,0.3316354266999509,3.7143814045114906e-05,40.78297884961148 +2023-08-07 11:17:53.749623,AULR6QZW,4.2464897113585955,99.32580139094556,0.2682462380345517,6.428050691454108e-05,278.9708091808796 +2023-08-07 11:17:54.251883,TB1E0UXC,5.066106368616113,100.16961100101597,0.2734789551718411,5.5462420645802856e-05,164.145258492572 +2023-08-07 11:17:54.754173,ABVD5XTK,5.299552484319734,101.16895541286063,0.5274418872554343,3.104014410254012e-05,203.13159855573537 +2023-08-07 11:17:55.231372,C7E1WX8Y,4.6560714298570725,102.03397259446429,0.369010310556326,1.2476556557574608e-05,58.54848651790246 +2023-08-07 11:17:55.733632,W89OIABM,5.181140350414671,102.02399779159113,0.5111770742433864,1.401101176540695e-05,146.70357654589424 +2023-08-07 11:17:56.235911,XWA6MR5I,5.263860325506919,102.79758205858211,0.9363447231194992,6.630916913294061e-06,32.67184039502433 +2023-08-07 11:17:56.738168,7QK23OE8,5.497930097094759,102.55347493227755,1.79761613698284,7.394293391701742e-06,144.67700884728288 +2023-08-07 11:17:57.240380,8I9LZK7B,4.6480119328736915,101.67047342728581,1.070122680953378,1.3874220433297471e-05,154.92135857062337 +2023-08-07 11:17:57.742619,9I47MV52,4.832475850134538,101.6217491082952,0.926364134002938,1.576475856967703e-05,212.95483216728655 +2023-08-07 11:17:58.244935,OV5E6YS8,5.040729740443229,100.70385978213884,0.8670820777721048,2.9093337883568994e-05,129.6105265843056 +2023-08-07 11:17:58.747154,8CDZ3BI2,4.5261541491877235,100.33874265682715,0.4065408374225817,5.5159810893451824e-05,347.229399224648 +2023-08-07 11:17:59.249416,C0G3OMJL,5.432298431882937,101.0361154353447,0.48587460325387627,0.00010503279695514814,19.62347178465302 +2023-08-07 11:17:59.751631,1IR90FET,5.918478817327094,100.9513894576563,0.4350753062375253,1.157654914072394e-05,101.89440627089917 +2023-08-07 11:18:00.253991,3M6PFAH8,5.491709386240076,101.10252671639381,0.772036662958622,1.4455259104871952e-05,113.19886077323177 +2023-08-07 11:18:00.756298,P0VBNWE8,6.137151954552506,101.19851435137497,0.8903960120776492,2.1285304793164872e-07,182.2063034722047 +2023-08-07 11:18:01.233466,F69TZPMH,6.630682646505829,100.81631167325519,1.1669761078034424,9.134191865679447e-08,320.481549972888 +2023-08-07 11:18:01.735656,AQBXTHUK,7.382220802122178,100.88334863225383,0.7749096356755719,1.7741825406369794e-07,283.823584397001 +2023-08-07 11:18:02.237918,SVHM2RLY,6.866899658494091,101.3998140983618,1.2993636144030143,1.5510796124562148e-07,134.37750378468212 +2023-08-07 11:18:02.740173,HLDNAG4Y,6.251770434079205,100.739829606973,2.309817311050851,4.737223050990655e-08,294.59486557619454 +2023-08-07 11:18:03.242342,EMYH3J5A,5.290310195085674,100.8772134745051,0.5003167915000741,5.94893821960827e-08,292.46771122474865 +2023-08-07 11:18:03.744620,Q91GI7T3,5.7919163819296235,100.44937286417709,0.707534633388191,6.104802376821212e-08,74.30788998898743 +2023-08-07 11:18:04.246804,MZ12L6U4,6.6289224790786605,101.07059226476557,0.23218602001594502,3.662785546959333e-08,97.59857824303205 +2023-08-07 11:18:04.749049,52R6UXZF,7.464812091370448,100.13580987012847,0.272325689380771,1.9031410428234095e-08,14.590336179374617 +2023-08-07 11:18:05.251239,JXTYMWLC,6.688690478341014,100.26325129435105,0.37607375707904744,1.1881740232448644e-08,32.85881187482682 +2023-08-07 11:18:05.753390,TD1JQXA0,6.669861920840069,99.35060762892265,0.5777023434926419,2.145685812316193e-08,74.40112071911653 +2023-08-07 11:18:06.255650,G6HONUV3,6.485482114094952,98.48307399105387,0.4107442899185332,3.4896690816244086e-08,270.1714354942 +2023-08-07 11:18:06.732801,WZQSF38L,6.19482383692919,97.76681671756427,0.30216946371744,1.2446945573366731e-08,135.82671013653487 +2023-08-07 11:18:07.234912,UNXVMYZ2,5.493350081006857,97.69003694268908,0.4726230588704462,2.0674522951578308e-08,36.405152896146205 +2023-08-07 11:18:07.737130,U5V3QY8L,5.385629368534823,97.01890648961206,0.7048993161889948,3.878941323480005e-08,241.49810614071097 +2023-08-07 11:18:08.239376,BF6WVJS2,5.469480799128486,96.07918609362139,0.826747212762879,2.5526144557551274e-08,153.65412078859094 +2023-08-07 11:18:08.741584,IZ34V2K5,5.403911463456865,95.71603559374984,0.8743086192928343,2.480552993648189e-08,279.44574829282044 +2023-08-07 11:18:09.243786,5O1RMDQK,5.315184972953635,95.18119725228023,0.7174814254387261,3.7444789918758127e-08,100.20045820200738 +2023-08-07 11:18:09.746035,I81LYHFU,5.963374021229176,94.19375118419116,0.9723242737576208,3.827707010919018e-08,208.96564699653788 +2023-08-07 11:18:10.248181,6QFXZCA7,5.150004329480163,94.53159653863199,0.6252059165447758,1.3084783653287549e-08,86.20207737717192 +2023-08-07 11:18:10.750355,9TN5YP0A,5.473767905488227,95.16708747098244,1.2289575598939826,1.2344950765864086e-08,49.56283983485042 +2023-08-07 11:18:11.252561,W29D4ZGY,5.38415961287191,95.91323453177907,1.7692493506655576,1.1152704671927261e-08,264.8942213160487 +2023-08-07 11:18:11.754813,GP2LW5DK,4.403992197711688,95.98393422207441,1.727415804811819,1.3658803892131061e-08,355.61687596828597 +2023-08-07 11:18:12.231947,KQ0XP25M,4.277035506458413,95.5001791675586,2.5253378675965146,1.6254782200303465e-08,239.63445192282097 +2023-08-07 11:18:12.734183,6HJ2QXPO,5.153862147690652,95.27144486722038,3.484310220690143,4.357693585150397e-09,62.11518023083397 +2023-08-07 11:18:13.236451,Z6FU32YB,5.44351907787541,95.98779642501393,5.7226099830589705,4.606271691766271e-09,97.50853841256537 +2023-08-07 11:18:13.738641,68SLW9ED,4.593763152184978,95.05886839860106,0.2664034831014517,7.685174109521775e-10,105.28930369218462 +2023-08-07 11:18:14.240827,VATZCBNF,4.387282068477248,95.21088147443088,0.08423980009732315,1.0974741639245262e-09,291.51399300704895 +2023-08-07 11:18:14.742994,BPXWKI0V,5.316649544227039,95.06070257183107,0.1342270193331031,1.0946741250450753e-09,334.9752790758013 +2023-08-07 11:18:15.245149,LCN9Y138,5.635978948508664,94.33099968685376,0.2307363642595062,1.8457166501451107e-09,18.889209214206403 +2023-08-07 11:18:15.747406,MNLZVD9U,5.608336930741408,94.84168671102455,0.29246764529781843,1.0400913001356056e-09,303.33021737633806 +2023-08-07 11:18:16.249593,XUPH80NO,5.866502287864239,95.74372730390212,0.47121810546071086,1.718455789197735e-10,68.73752759850231 +2023-08-07 11:18:16.751746,7D0SWKIG,5.643247717911022,95.71412119587897,0.8527130481566325,1.6406044488632242e-10,208.32684927602477 +2023-08-07 11:18:17.253959,YDIPE2R3,6.28281870967314,96.5118705455215,0.8557882023823429,1.4857392309707156e-10,219.72602913697168 +2023-08-07 11:18:17.756129,6ALY93D0,7.199830140359286,96.53031624659168,1.4258344179098652,2.0923529565210773e-10,327.00370102301883 +2023-08-07 11:18:18.233288,QMJKXLT2,7.128954353754704,97.38600909572001,2.0026191874502755,5.879870230345662e-11,100.10987372612215 +2023-08-07 11:18:18.735364,VEGD34RM,7.646086495661898,96.41337047033058,1.5473116524918349,4.8338016797996456e-11,320.9194812731576 +2023-08-07 11:18:19.237483,B0H9IWR3,7.972092319654005,96.43353339446412,2.138600406975541,6.795394292798319e-12,193.26502530970345 +2023-08-07 11:18:19.739661,9F38DBR2,8.660556278961064,95.95565641226095,4.043965081325104,6.3402132445516484e-12,233.17094707000325 +2023-08-07 11:18:20.241916,9YRTJL7A,8.046629228097506,96.16411056317057,6.080171249603284,7.148986434351242e-12,51.48822586144274 +2023-08-07 11:18:20.744136,XTN8ZMIP,8.003898867720054,95.69365331437874,10.658273797971324,6.912211908198038e-12,285.9913101337904 +2023-08-07 11:18:21.246370,X6ZH1ST3,8.331052308933305,96.12355947721699,18.005046055323017,5.563185875602351e-12,334.1253801299665 +2023-08-07 11:18:21.748590,DL2VN41W,7.587723268458623,95.14364628359857,11.502648305491928,1.0190284363191124e-11,148.1829601078889 +2023-08-07 11:18:22.250792,VC9U6E2X,7.711640802562786,94.7342178995655,8.128110931431495,3.4557214299139874e-12,214.0408117093474 +2023-08-07 11:18:22.753000,W6ZSCIBH,7.3399173432162375,95.14688321850838,1.6786053712892528,5.0944386343952865e-12,262.317196547016 +2023-08-07 11:18:23.255178,4RT6OCIK,8.012520770004382,94.5031755720956,1.7035711892507261,5.102310833864846e-12,93.36622485574605 +2023-08-07 11:18:23.732285,Y6V8UMNB,7.2548048605939055,95.370760865248,1.1857947935015964,7.327584127086814e-12,93.84684525878247 +2023-08-07 11:18:24.234515,RBK9XEVZ,7.00833676886877,94.39511642949999,0.6251533183098446,6.652167201288664e-12,327.091369341841 +2023-08-07 11:18:24.736779,1VYF9JZM,6.507930231983718,93.92916547033379,1.0916234528582993,4.665133601811524e-12,68.00057125934154 +2023-08-07 11:18:25.239018,9AJCDQV8,7.35767887079392,93.05403609294937,1.8608071099672292,3.8860919242769245e-12,315.0390172791914 +2023-08-07 11:18:25.741223,U2HPRTCX,6.4338810590818625,92.53323482202465,1.0473930148412327,5.3019857655443705e-12,341.1710367257622 +2023-08-07 11:18:26.243452,EZNG89AD,6.081229099637389,93.48226409479214,1.4236513552237182,9.142891498209646e-12,20.709232587740416 +2023-08-07 11:18:26.745562,MWE2K1T9,5.160313184146828,93.62716588502747,0.39345600673547,8.301406843076664e-12,152.63304962533147 +2023-08-07 11:18:27.247624,TUYAELX3,5.138512481085208,93.6656002524709,0.5261632430661662,6.704156202447662e-12,146.8269866105079 +2023-08-07 11:18:27.749783,IX4DZL6U,5.740770085230532,94.57191651448457,0.14673569314330215,9.701491397440929e-12,105.83886592960033 +2023-08-07 11:18:28.252048,UWV1HBAK,6.3147408947091535,95.41237280357082,0.15615860819087962,1.660398292837698e-11,240.59823589248634 +2023-08-07 11:18:28.754163,YJG7B6SM,5.708091612639642,95.76554229262533,0.15968601563974158,2.553647645304863e-11,248.93469146614297 +2023-08-07 11:18:29.256275,JBRVYE5I,6.151508055040246,96.15739337797366,0.16119209079305974,1.3729114935569633e-11,325.834268916868 +2023-08-07 11:20:10.162807,3L98QRE2,1.8916869966471075,103.71055091261586,1594.0179157262373,40.837025349607984,318.1282648168087 +2023-08-07 11:20:10.665162,0FHEGQXS,1.3256246987569733,102.96984888645328,2786.171687204867,59.34359199988441,86.6494186854602 +2023-08-07 11:20:11.167227,6CJ1R0KA,1.086520062885689,101.97808578478225,2561.177115305169,62.998505695707586,181.1354865187327 +2023-08-07 11:20:11.669417,TX9Y1QR6,0.921543254129841,101.52092998486778,2132.532814894363,76.88036720545557,133.40918724457777 +2023-08-07 11:20:12.171636,9Q2A5XU0,0.2970721090390145,100.79506127363844,683.6299567264425,94.4937526139157,14.415813146895573 +2023-08-07 11:20:12.673875,XH7AKDT8,0.16456340114577483,100.72638989346058,972.0875492053906,118.08685496519972,227.94387773200953 +2023-08-07 11:20:13.176127,S1KI2R8W,-0.11135699046112779,100.15592222357603,35.25512295352746,72.19405972276363,256.8874831249845 +2023-08-07 11:20:13.678495,VIXK6FHN,0.5154379630434172,99.43884393417106,31.178584326532253,16.05312931363806,219.17301824661365 +2023-08-07 11:20:14.180757,LPJ6RHNY,-0.1671297899280213,99.07667299823618,34.119775645542546,22.822604239452232,310.4693075088462 +2023-08-07 11:20:14.683021,538XLSWZ,0.34358183278354315,99.8965776322984,63.06397387509466,15.534907378739904,195.38971396903423 +2023-08-07 11:20:15.185229,MKJUC163,0.2762836270023088,100.26541371306466,116.64532209978323,7.97402368628224,316.87225418318883 +2023-08-07 11:20:15.662321,MTXED8HZ,0.9206391759873005,101.09921542826811,24.71559720551852,14.304309259823691,327.3619963933424 +2023-08-07 11:20:16.164555,1JPE9BRH,0.42866208990923815,101.69889729128263,5.604641352912946,18.95259883808543,81.73459276855067 +2023-08-07 11:20:16.666811,OCKY8UNR,0.6648915617061326,102.62812945018189,6.900238862281777,21.302056024418103,261.0666783198094 +2023-08-07 11:20:17.168947,S5GDXMH6,-0.2544037865246884,102.49469376908687,11.52840608913494,38.243266573111356,55.26862159463201 +2023-08-07 11:20:17.671047,OTQ2IU64,-0.5556240736310141,101.71305233370826,14.342847438041947,56.912163185058965,147.83929137063532 +2023-08-07 11:20:18.173187,O2PGVA1M,-1.1495035910657838,101.26305514032546,6.407807345293944,23.91517583228365,338.5757888183085 +2023-08-07 11:20:18.675367,L043B1WA,-0.33098970181577725,102.08783462050476,12.458117039546577,25.049676596901115,187.04580080115932 +2023-08-07 11:20:19.177544,9VJMK58H,-1.0284339612024287,101.51725154996141,3.3876365132930797,23.26663346090306,287.0165283429232 +2023-08-07 11:20:19.679618,XT78FOG1,-1.5811883637459532,101.0116676177443,2.000377531195622,39.097979960682856,147.1098977263224 +2023-08-07 11:20:20.181862,FH867C0M,-2.455787587591913,101.46154287504677,3.4956510025631222,12.940924950277093,92.57150515936405 +2023-08-07 11:20:20.684014,4STJKUR0,-3.325761159659165,102.37640834620697,6.706321535424336,20.15260621530444,103.73186538839259 +2023-08-07 11:20:21.161157,X71C4TRY,-2.5942237517405884,101.41846214758384,8.615475800547433,7.89305810454864,199.2504817966073 +2023-08-07 11:20:21.663321,OS1RAF2B,-2.9847090566666425,101.7415175540428,11.87449256666056,11.486735451594049,206.30718901962362 +2023-08-07 11:20:22.165527,UGIFLZAJ,-2.356038445537025,100.88425241352407,22.546981188719972,13.028674169865623,30.0794080283913 +2023-08-07 11:20:22.667677,2HWL7K5I,-3.104409949356297,101.25376464679384,25.782903023268414,9.383880572294464,237.66211595401967 +2023-08-07 11:20:23.169814,TH1EIKWU,-2.3005577539085387,101.97982996261105,2.852224862281492,11.704371920272218,233.9596151509645 +2023-08-07 11:20:23.671960,PGTM7X92,-1.8679346505602135,101.6682756376658,1.488694519502058,8.987147038751065,6.299483669781921 +2023-08-07 11:20:24.174145,5DRXNVYS,-2.834644496652381,102.44815185645348,1.388742282359412,5.987438438846622,278.1960747791763 +2023-08-07 11:20:24.676329,9MDWHKZO,-2.4117957224229447,103.11497170734269,2.3574613406930363,8.208458621731776,209.34095126536636 +2023-08-07 11:20:25.178485,J9WVZMB8,-3.1932340811366897,103.19298657912933,3.0032068031129944,9.55552884979586,199.58893073820082 +2023-08-07 11:20:25.680581,BEXIPYWT,-3.2290874403543,103.05932465331881,1.7407191279424186,14.896183976843174,135.80872240177536 +2023-08-07 11:20:26.182859,NOJCXAP8,-2.5192265561041314,103.45157436728616,1.427744594044382,17.305687878460997,279.5803829167354 +2023-08-07 11:20:26.685027,PQBC5G98,-1.6613044805425716,103.96025927055705,0.4984809408262505,29.84990865929332,187.97400363091492 +2023-08-07 11:20:27.162168,XKUSZVO1,-1.1070077106118579,104.89911484200947,0.5867149275293048,9.876504829222927,148.93464465354953 +2023-08-07 11:20:27.664304,NFV2JTUX,-0.35927812295867567,105.03130305998079,0.4584309859517975,1.6338822053852802,86.69907555631232 +2023-08-07 11:20:28.166504,GR4LFUE7,0.3475911976755184,104.5426587597708,0.7119933648293619,1.1010190903297903,120.19027365815703 +2023-08-07 11:20:28.668620,3S78G0W1,1.1826574787061768,104.89653099429407,0.9581908606371748,0.06811038454883445,259.9518085195389 +2023-08-07 11:20:29.170729,0ZKVGJQT,0.35441162309071794,104.34518983863776,1.3498509655701552,0.021022240612483874,65.10515668244636 +2023-08-07 11:20:29.672901,ZO8KNPU3,1.1114446370007713,104.37986309232389,0.6564442347837322,0.024063078483674713,3.0339402531657242 +2023-08-07 11:20:30.175029,TNK5XGP2,1.4124861844767629,105.04078221701667,0.37005682969952003,0.028362087632381256,59.78138587699514 +2023-08-07 11:20:30.677100,VS0U9J26,1.731796037966734,105.37801631173927,0.13449136185215163,0.05103185824031609,212.7528113770097 +2023-08-07 11:20:31.179307,K6VZ4DW5,1.4081817404376835,104.49977017549703,0.24705055673828497,0.09340168474313552,236.32801324729374 +2023-08-07 11:20:31.681509,93O0HF8V,1.8983738989317505,103.9587524124789,0.2674177879533482,0.1445031137856223,28.402776909272006 +2023-08-07 11:20:32.183623,KT4W165F,1.186928768539778,103.94289064558332,0.4106003122188135,0.06206569291309877,211.88840322325706 +2023-08-07 11:20:32.685772,6EJZ340F,0.6636839816385749,102.99810095026405,0.5519199661037059,0.12072731535546169,250.80936586550075 +2023-08-07 11:20:33.162879,EUJHGY2A,0.33112925623346,102.16070543711666,0.13322159559271235,0.23150459970638768,5.193914285121252 +2023-08-07 11:20:33.664979,G1CNOBYR,-0.11675553794364157,102.11525182982314,0.07957750484689584,0.11911781349711181,318.07205544287524 +2023-08-07 11:20:34.167212,G9UVYPCO,0.03621126314645484,102.87541572465562,0.0389907707763953,0.05573755860721702,132.33087949827154 +2023-08-07 11:20:34.669319,6WG9Q0Z1,0.2522828386244791,102.23807442739447,0.04860635677968268,0.02690416546894471,53.62887277773319 +2023-08-07 11:20:35.171447,S1YA32ET,-0.3690254268762463,102.61597278959516,0.09681206030996409,0.03536431878679369,268.67050627647967 +2023-08-07 11:20:35.673627,6O8AKX5U,-1.1068866493226803,102.3812567767927,0.04341591918074583,0.04597890657304636,82.03569233341238 +2023-08-07 11:20:36.175765,V2OP64KU,-1.7549896888522318,102.15453616208534,0.07297584333320972,0.05212919165879933,129.20433817196556 +2023-08-07 11:20:36.677875,H893CUI7,-1.7822779255086783,101.93732948288388,0.12931768369432994,0.06317543407956766,149.7010401716602 +2023-08-07 11:20:37.180048,OQ2X8YH7,-2.6365225768290452,101.11830161903143,0.07603934891739687,0.10193829569421932,331.30250595178643 +2023-08-07 11:20:37.682297,O0VGW7EM,-2.6085124781310816,100.91942920554791,0.10474902376306738,0.0927281933391471,315.8663827830326 +2023-08-07 11:20:38.184528,0P8RDSB7,-2.3564135663513386,101.43893038830177,0.11463068740331792,0.15616497929903647,341.6114527270721 +2023-08-07 11:20:38.661679,C3JVBYDE,-2.4684981389188665,101.13110851603138,0.016392884993157997,0.007670163002207631,20.397478284870544 +2023-08-07 11:20:39.163872,EM8IO1CL,-2.1220343372684276,100.960158961795,0.004924154137392826,0.008710952243463577,107.41106714093208 +2023-08-07 11:20:39.666070,NGL1OYE7,-1.3286863868750374,100.6645088863849,0.008973703876747754,0.003211694030385597,24.944460559507263 +2023-08-07 11:20:40.168222,LRGSOB5F,-2.2005176847582035,100.92134368619422,0.003269066113572348,0.001412340390519303,169.9284021507598 +2023-08-07 11:20:40.670448,0DBYH8LG,-1.802045776723439,100.08369634756654,0.00583423666082738,0.001095011382657523,36.51649703910107 +2023-08-07 11:20:41.172556,ORDNZBFJ,-1.5175254984062643,99.428809199032,0.004006420826851977,0.0007737757471158862,112.54774221978684 +2023-08-07 11:20:41.674632,V5P0UDTM,-1.767388515026504,98.58797715355787,0.002356362334438097,0.0014775930243709275,188.83722026064405 +2023-08-07 11:20:42.176848,3ZUJAM56,-1.8828753642252563,98.51591420026328,0.00034028392505913285,0.0023830977271329583,208.7097830448614 +2023-08-07 11:20:42.679042,2UMBPZHX,-2.6700908814329427,99.45831115208628,6.386160189257735e-07,0.0002026448341333688,174.2791013726528 +2023-08-07 11:20:43.181242,OZU4MJIC,-1.7566259765044663,98.8787113161608,9.884660380760714e-07,0.00014607906727814654,3.936083778403372 +2023-08-07 11:20:43.683401,BY6JGZM8,-2.5708984347432544,98.43659322934414,1.3238514116284357e-06,5.923000474367373e-05,177.1527494197337 +2023-08-07 11:20:44.185632,UYJH9SEC,-2.1963591553840143,97.79115678033675,2.54349462803767e-06,4.8304413617843674e-05,281.5318836287439 +2023-08-07 11:20:44.662690,XH95GPN7,-1.7571139111696226,97.71524106153444,2.362425309070611e-06,2.58785596273731e-05,20.916185547149837 +2023-08-07 11:20:45.164847,YLK02VC6,-2.0861999759027317,97.3413433219359,1.0674801376294268e-06,4.401691471573786e-05,296.26758967493487 +2023-08-07 11:20:45.667079,4EC5O162,-2.7700071408209084,97.4952828486077,1.5167154539166318e-06,3.549319869020762e-05,90.65710735423255 +2023-08-07 11:20:46.169269,0Z5EDM7X,-2.4380202302252085,97.54121796083473,2.8158810468491125e-06,5.009385986536877e-06,353.29448583557024 +2023-08-07 11:20:46.671520,RWXJ7QH6,-1.6958055640776322,98.5274286057878,4.83386310453929e-06,6.657395129646094e-06,63.82720243083418 +2023-08-07 11:20:47.173757,KQ5W1JH2,-1.6447845306318538,97.851503881041,7.045671115661678e-06,5.5278300607803435e-06,280.92464847756526 +2023-08-07 11:20:47.675995,GDS6IV0J,-1.7793644489680265,98.23428847763533,5.717434482471845e-06,8.937774785939764e-07,194.94651888475914 +2023-08-07 11:20:48.178283,QSW6F9J1,-1.8943565485490625,98.65442605855364,4.067625144754213e-06,1.1679017438268822e-06,312.6137670294637 +2023-08-07 11:20:48.680523,BWQEI9SY,-1.8473720080486553,98.37651666293124,3.844353680366898e-06,1.0564792991495233e-06,122.26622961564703 +2023-08-07 11:20:49.182784,C5BGPVE7,-1.0623909082002343,98.67297048856155,5.926199537558963e-06,1.1629911280184068e-07,0.4603939058135893 +2023-08-07 11:20:49.685005,M6482S37,-1.7051857440806313,98.3961850135858,7.227339651501503e-06,8.980891178860499e-08,111.57763799555886 +2023-08-07 11:20:50.162266,AHZ9238G,-2.5566894667113425,98.60751606848254,1.27518107391319e-06,1.5604821603684745e-07,311.24772266788494 +2023-08-07 11:20:50.664532,CNOD0RBU,-2.369899892936285,98.37979404246812,2.4359462475122034e-06,1.9586040579497022e-08,237.02812520520558 +2023-08-07 11:20:51.166758,MVKUIH5F,-3.325814022763555,98.08937186395997,8.502611276493518e-07,1.4037678227091867e-08,264.686031271697 +2023-08-07 11:20:51.669044,LXOAM0FN,-2.789162474922856,98.93529109677706,1.2955664832098287e-06,2.0572875384016027e-08,117.33292686645837 +2023-08-07 11:20:52.171323,9I4A71XY,-2.30560169207356,99.01081101503804,1.3233544588798354e-06,4.617499916731025e-09,225.23954686576673 +2023-08-07 11:20:52.673583,IAJ43CU5,-2.5499245124963847,99.15468564984913,9.385269668347375e-07,2.3323310216064016e-09,188.78656382019335 +2023-08-07 11:20:53.175844,30ITCM2Y,-2.222616377504816,99.05309011106695,4.6633301948459614e-07,1.2659849623062405e-09,43.833947125114264 +2023-08-07 11:20:53.678033,9A4Q538J,-1.8582604022539018,99.91165327453187,3.450533146689934e-07,9.051277769960752e-10,64.72441786766949 +2023-08-07 11:20:54.180303,JO5169KX,-1.1363789503230044,99.25005722934758,2.1355732637282576e-07,1.7429981825023755e-09,296.49028884635595 +2023-08-07 11:20:54.682545,ZF0J9KUB,-0.39810859749685923,99.06450577227267,1.9553929791920913e-07,2.3698523095782423e-09,104.69820425278397 +2023-08-07 11:20:55.184872,6PHK1RTX,-0.8954217829478985,98.95634868191618,3.144553531550494e-07,2.617649832922754e-09,147.37326216959144 +2023-08-07 11:20:55.661970,BRYF175J,-1.246713339854777,98.9993286056709,2.398013164515791e-07,4.081415760105896e-10,184.9128931434226 +2023-08-07 11:20:56.164208,236RYKC4,-0.26182629815847447,98.13716669529207,2.1717389954659286e-07,3.577146558579479e-10,160.79444167642873 +2023-08-07 11:20:56.666430,V5MU17JP,-0.12242251935015935,98.51454391196503,1.8971169351894175e-07,6.580445701749582e-10,107.28699105785455 +2023-08-07 11:20:57.168553,L9VYUN3O,-0.9135609061237309,97.84007953043648,1.300114636883619e-07,1.1296524378700586e-09,352.4762742894104 +2023-08-07 11:20:57.670736,WY4R3Q6X,-1.2991824111637689,97.0067004538594,1.8047746340330388e-07,7.895522699184289e-10,299.1269529734943 +2023-08-07 11:20:58.173027,NXTIM3L0,-1.154399698810311,96.87892884772161,2.3314959547657627e-08,1.0391120126362503e-09,86.79530673811803 +2023-08-07 11:20:58.675226,24A3V76P,-2.043665206009069,97.25590921987016,3.810300078416656e-08,4.8478733162415e-10,110.76096893734733 +2023-08-07 11:20:59.177454,4QIJFLE8,-1.3656506240343487,98.10551859601085,4.146830118756459e-08,3.332721129386537e-10,249.5035686205557 +2023-08-07 11:20:59.679616,WPKAMLZR,-0.636991078093079,98.54954328962422,8.214564358362312e-08,1.0824487905704352e-10,329.2809824218687 +2023-08-07 11:21:00.181852,7CUWJ2Q1,-1.3597263104471033,98.99382239656958,2.0581425943635927e-08,2.849924061585262e-11,353.45223593775233 +2023-08-07 11:21:00.683678,4MUWZN78,-1.2360732100877114,99.49675870812324,1.203564301138823e-09,2.8290344378997023e-11,82.41277439227298 +2023-08-07 11:21:01.185481,G8MRNPXJ,-0.966532576899571,100.3453904457994,2.2656956104237628e-10,1.944735050702677e-12,177.6535801355568 +2023-08-07 11:21:01.662001,MPSVDXZ8,-1.2917476852175998,100.91562459351988,2.4585091298585494e-10,1.566378735382413e-12,324.9026836155582 +2023-08-07 11:21:02.163712,5370Y26W,-0.6269037817642795,100.56052783467901,4.703839223441481e-10,2.6383704575861878e-12,144.76283146751155 +2023-08-07 11:21:02.665270,8X24ITEN,-1.3735303075530567,100.86836068288414,5.687834969825278e-10,2.0751034342388015e-12,66.18172031488086 +2023-08-07 11:21:03.167194,YWZ2HP3U,-1.107754311327624,100.41944841900167,2.4002387284398295e-10,7.273915981570011e-13,297.3632008490291 +2023-08-07 11:21:03.668847,ANTX75L4,-1.0153486390204207,100.03958940121046,2.434853219870989e-10,1.0347647062761202e-12,316.6529258283162 +2023-08-07 11:21:04.170376,9AO5HF1X,-2.013547627207238,100.1565882847103,8.489350213950129e-11,1.839839284606066e-12,325.0304323034737 +2023-08-07 11:21:04.671904,U6XISCYP,-2.4199909270156166,99.21727364130834,8.204027360825383e-11,2.9394355894528237e-12,4.634731813260032 +2023-08-07 11:21:05.173413,6R7MGBFV,-2.51510801252999,100.034587964186,2.5556556339110727e-11,1.27765265260799e-12,85.86834364387505 +2023-08-07 11:21:05.675125,AV38BJ56,-2.5210587569761174,100.58495966415995,2.600541081435198e-11,2.4972489523849474e-12,293.6197780443031 +2023-08-07 11:21:06.177343,OHEA1J39,-1.637838118826773,100.79091476444286,2.5213070788089392e-11,6.572845817188941e-13,154.20424857133594 +2023-08-07 11:21:06.678961,3QT4YAU8,-0.6911081153363419,101.49144417738842,4.4129970064594575e-11,1.2171315861048018e-12,225.21139145132182 +2023-08-07 11:21:07.180978,2LGQIP83,-1.6309461481654728,101.35654180841051,4.3661280691157394e-11,9.114364640686707e-13,203.26230756368966 +2023-08-07 11:21:07.683188,8KMC3XHB,-2.491820042447862,101.27324431912521,2.2616020639140098e-11,1.031540083825492e-12,3.7093753384981483 +2023-08-07 11:21:08.185355,RFT8M3ZN,-2.528701838371494,102.13648602994421,8.176987134539922e-14,1.0769766086849602e-12,329.223915810698 +2023-08-07 11:21:08.662444,L3E4XBT5,-1.9445842156280038,101.37475539265847,1.451435622554274e-13,2.4728161291265494e-13,186.3893566612105 +2023-08-07 11:21:09.164697,I49NRTE3,-2.4668634816330983,101.5176366293438,1.9911573869932785e-14,2.6302294822211155e-13,292.56553314284594 +2023-08-07 11:21:09.666940,VJUAY98R,-2.8280676087965633,101.47310344975898,3.6627988492690645e-14,2.666496450803412e-13,183.73250065449076 +2023-08-07 11:21:10.169083,T5PVK7WN,-2.383060254447349,100.53359462342739,2.2873885790798132e-14,2.1892585812857e-13,217.8726631038289 +2023-08-07 11:21:10.671339,NMHFKALC,-1.883912115329519,100.14026898537551,1.2963465289533051e-14,2.0244096587142785e-13,119.21219651331728 +2023-08-07 11:21:11.173588,MVOAFHT3,-2.365510889403045,99.20255229386498,2.3021964177244707e-14,1.613276419391189e-13,259.80647951645875 +2023-08-07 11:21:11.675762,2UXJMF83,-1.9689500873597567,99.20292750496404,2.729345099240501e-14,2.9181672323865595e-13,330.68684287506676 +2023-08-07 11:21:12.178013,MGNWSFHP,-1.2009199926845697,99.41282013205762,3.6094190909139156e-14,3.6460077072052155e-13,124.87779932407989 +2023-08-07 11:21:12.680190,QIV16GC4,-0.9697172013874327,99.1824787054942,1.999317060718376e-14,5.707512934702087e-13,260.1342971833633 +2023-08-07 11:21:13.182421,XW6J2IUV,0.0164304447904291,99.21362582444279,1.1312937996367812e-16,8.491973098102002e-13,85.12248709504036 +2023-08-07 11:21:13.684549,ZIGQ2SR5,0.308267643680713,98.94952867734757,1.2363744451771651e-16,1.6875550930892516e-12,334.1521951976466 +2023-08-07 11:21:14.161624,S3G9X2CM,-0.3658023194796487,99.13674069215905,1.0746739952312591e-16,2.2072318364468362e-12,276.315585955467 +2023-08-07 11:21:14.663784,C234A1SQ,0.014845160817240632,98.24655139257786,1.632380296194844e-16,1.085020147125117e-12,331.5472675631591 +2023-08-07 11:21:23.956420,50JZHKV9,0.8017283770870691,104.40806162405727,8020.413472974577,151.70885125794206,123.91244043876077 +2023-08-07 11:21:24.459604,K2E38WLA,0.39300058240590996,104.10040384836921,7094.737619180933,148.0402381684786,107.21466696821562 +2023-08-07 11:21:24.961758,YPU7IQB5,-0.48279116535576727,105.0195312943839,1185.0352802169546,163.82715616559923,330.7756975598437 +2023-08-07 11:22:10.657110,W9RC3JHF,1.121972128468813,103.85930048653684,7701.8782394307955,267.4003135397906,348.93777326823187 +2023-08-07 11:22:11.160259,GFJ46DEL,0.9809942332955117,103.6764718937511,14545.227723132864,471.50635929534707,170.35570832966516 +2023-08-07 11:22:11.662492,MAHKQ2LP,0.5096708027407493,103.82108937879231,17202.867764008388,74.62071797325899,277.75956560719584 +2023-08-07 11:22:12.164708,GPCXMN5V,-0.04373497663952697,103.7839809142468,21025.542389120707,130.05851970609768,269.3476061123698 +2023-08-07 11:22:12.666952,YKBWC3LI,0.038198636639403816,103.96268251552348,30909.30961727731,13.894294712617636,25.349991984480823 +2023-08-07 11:22:13.169127,VNSK1LRD,-0.8128868542708445,104.92859082925546,34117.909186551966,8.21100281388942,234.48507656679323 +2023-08-07 11:22:13.671285,JMRNGX7Y,-1.3053178462163904,104.59550306556953,64172.39741572045,0.5103458123955944,289.662573204586 +2023-08-07 11:22:14.173472,6O18MFCN,-1.2133244647917936,103.87477635785712,112868.52632991492,0.014923882891629214,314.67982651004166 +2023-08-07 11:22:14.675725,ZW5RGELF,-2.0663916237785873,103.95382937945689,12982.166065862752,0.0013039624402630678,58.88647945971002 +2023-08-07 11:23:16.417949,OI2BY6L3,0.6831988054523903,103.10020056852598,7119.323858762506,169.584783384614,25.32445378810193 +2023-08-07 11:23:16.920293,R4AL8CHT,-0.2663172368789697,103.6935376704354,12148.237518622336,284.02555001578446,154.3494923747939 +2023-08-07 11:23:17.422622,H4DI59AY,-0.2516829550392441,103.2073431366843,19325.710780150996,541.1176774135809,186.2936350282892 +2023-08-07 11:23:17.924928,EWJA9ZSC,-0.629297964716723,102.26304582309224,7303.00224157812,618.0976050856399,71.43102565900938 +2023-08-07 11:23:18.427245,7OKZPWY9,-0.7563078918369306,102.33733349594425,5854.667414349557,630.9728445533148,344.0621266396012 +2023-08-07 11:23:18.929377,VHI52EP0,-1.0952796984726638,101.94764378876694,1600.7554137049938,606.4680249382131,209.39264132929827 +2023-08-07 11:23:19.431442,6N72TIKS,-1.2784767236556935,102.22844955467515,322.4720324632269,638.0924762194637,51.368021121496554 +2023-08-07 11:23:19.933645,7LXC4OZ0,-1.2292190564433212,101.53701364982385,5.715858831224523,401.3837220876645,13.003306201229009 +2023-08-07 11:23:20.435927,VYBCN245,-0.3412492425974014,102.39144716692311,4.641308550219615,718.7945189107179,222.48586455171343 +2023-08-07 11:23:20.938073,JAKHSB6P,-1.2866961282424907,102.86564292685779,4.51249133394066,1251.7965390513211,228.56246845104334 +2023-08-07 11:23:21.440232,LBQ780XW,-1.6186107483533962,102.91646921168164,1.1384711218323535,1680.896050176515,104.45987151178213 +2023-08-07 11:23:21.917300,YZL2E9X1,-1.3726609998698134,102.37600013154892,2.198101119327441,101.19535082831408,75.06453892401635 +2023-08-07 11:23:22.419502,89E3XWVN,-0.7768073699970861,102.42174319269628,3.533344702589075,149.95920935498344,346.2409892191012 +2023-08-07 11:23:22.921633,Q0HB8K4J,-0.5937326243691534,102.37755229643517,0.3320500501125401,295.44614237835333,183.75136712277913 +2023-08-07 11:23:23.423831,LDKJHM9N,-0.3009876067109729,103.34781638771396,0.040485109087230575,306.4105126566632,85.23816650262137 +2023-08-07 11:23:23.926075,4PG3AQXE,-0.6019394040870356,103.09370014651714,0.008900254708262813,609.0983911166076,252.83543864720866 +2023-08-07 11:23:24.428262,SC7YBHXF,-0.6104728912030182,102.65033409702744,0.006948466416260426,849.5905947841567,170.2215142404358 +2023-08-07 11:23:24.930435,DK9S8LAF,0.07335178067483872,102.59595140368316,0.005695621233809878,222.9422990295094,65.77404335454247 +2023-08-07 11:23:25.432736,QUYOK20M,0.7367272852926066,102.3256787785864,0.00026214291882855484,305.186109686962,43.73852728041021 +2023-08-07 11:23:25.934960,CIVQ8FUZ,1.6040495452767856,101.94271720296844,0.0005057591342922128,38.288961392696706,196.4835014466877 +2023-08-07 11:23:26.437234,JCHKAP3R,0.9246014130223192,101.22242028285558,0.0008912350097046228,39.577340603769784,318.2594051323987 +2023-08-07 11:23:26.939507,DKX246WN,0.8092250559565035,101.66826158961851,0.0013398932538423456,41.43606325005098,359.37118493468495 +2023-08-07 11:23:27.416641,KXRLB4DJ,1.1000925928157288,102.57362946223913,0.001010489890282322,34.946403309032654,310.0247690225218 +2023-08-07 11:23:27.918804,HOBP4QZ2,0.20534243741311098,102.60461379421469,0.0008772096555534873,61.01427929577029,206.24350960422555 +2023-08-07 11:23:28.421136,KLXEP3B0,0.6489805314277315,103.51681688830425,0.0009491615803520437,54.800203810440266,15.36531422978453 +2023-08-07 11:23:28.923361,P6GF50B4,-0.168501220570348,103.0565175004205,0.0004413594936330213,47.07582055433336,258.0172083399795 +2023-08-07 11:23:29.425620,SM3I2ZVJ,0.4860806842749157,102.47205442349845,0.0007671371038388032,32.92780275606377,4.058309555267897 +2023-08-07 11:23:29.927852,UXSTWEYR,-0.4182694420445965,103.32076607305216,0.00072270443273305,24.12569416142501,191.1418631091636 +2023-08-07 11:23:30.430095,ZXDOF3P5,-0.06920649855761751,104.25920012991581,0.0007445396487165638,3.3903548119287947,129.01474857914627 +2023-08-07 11:23:30.932276,LW9SUPG8,0.3543429002468286,103.48257842138402,0.0012646664377180246,5.388091343552294,110.94421335976347 +2023-08-07 11:23:31.434534,4BU0DL6P,1.1889947444567857,103.27415981316031,0.0003700262357505936,5.817808890088487,219.0383791827681 +2023-08-07 11:23:31.936803,YMT3IJNH,1.1056181666591025,103.59323605976556,0.000651778744184651,11.317880282402816,256.3898264962802 +2023-08-07 11:23:32.439074,7DV1XF3W,1.8843970914492305,104.02409003665548,0.00032494815130331914,15.318768182513042,348.0015525814578 +2023-08-07 11:23:32.916169,GHJEU1D7,2.4569511466713716,104.40254979351951,0.0005220732164649868,29.70943018435514,16.32209436703465 +2023-08-07 11:23:33.418360,1DA8NXYE,2.5835224709421736,103.67822761431975,0.00019195727258173635,55.24303294505171,96.58424010641441 +2023-08-07 11:23:33.920533,UO1JHYK5,2.656591662221451,103.7911603909181,0.00018919819767017977,68.47812670517847,304.7481101518061 +2023-08-07 11:23:34.422773,QE4Z9SRK,1.935675430035101,103.327999750234,0.0002043299107466493,24.337523926812636,190.86858715298115 +2023-08-07 11:23:34.924939,G3DIHXNC,1.638956036561839,103.70246185094922,0.00037199485597027215,30.38047285591014,151.9001589064082 +2023-08-07 11:23:35.427178,YTHDZB4C,1.1983546910102494,103.54671796640858,1.7113070749807295e-05,42.92471637725153,44.68874484404819 +2023-08-07 11:23:35.929340,741MNIUR,1.0643334186655524,103.8787052580902,3.107752321271006e-05,47.583646262602706,252.98838502061062 +2023-08-07 11:23:36.431581,VX7AIG54,0.3759455916423209,104.57477142503993,2.3810988801961155e-05,43.544046545342006,79.97395773659969 +2023-08-07 11:23:36.933743,8RX5PGNV,-0.27577231806547253,105.22219585575675,3.7686399233333016e-05,83.03508730067036,13.553516166060376 +2023-08-07 11:23:37.436034,7Z639U1M,-0.16309054366783937,104.44964133614837,3.265822927778116e-05,36.03548004674374,41.03329457315552 +2023-08-07 11:23:37.938324,CBNWMZDA,-0.3348402865017892,104.84786192481427,4.614465081866935e-05,63.49033017712968,60.748872884848 +2023-08-07 11:23:38.440563,RYCI2HMA,0.24563342565253854,103.98503798493975,4.0407927113381456e-05,106.95915180447699,292.057714767761 +2023-08-07 11:23:38.917694,H0Z6PV51,0.7890889887856714,104.48943139668434,4.694462416988533e-05,149.25973294640303,302.732434959113 +2023-08-07 11:23:39.419956,FSCIUOM6,0.6008223667551118,103.98109567399702,1.158337122436625e-05,145.46860832243394,137.08060292351195 +2023-08-07 11:23:39.922198,M5X6TJLD,1.101736595577509,103.62927766721388,9.64434733042909e-06,48.52769512789803,233.64136548340846 +2023-08-07 11:23:40.424369,DWR842H6,0.2940338456163578,104.30245705783977,1.1222795477111128e-06,61.83497378882688,106.85163516122668 +2023-08-07 11:23:40.926518,X1R4ZTAO,-0.1285746426906882,103.7253532049883,9.943732632122055e-07,100.54996558364924,98.95850149143865 +2023-08-07 11:23:41.428751,O1Q4VCRB,-0.05773495101594417,103.45899019139702,7.264927228370073e-08,46.39896460065677,55.82633286629863 +2023-08-07 11:23:41.930903,HLJ7MX5K,-0.048493063785965074,103.98665821286102,1.495146558841844e-08,76.09718130905327,102.50998743056337 +2023-08-07 11:23:42.433130,F9SKTP35,-0.3536957128111897,104.98018892658489,2.0683310827863503e-08,43.956397969645046,274.63604065556285 +2023-08-07 11:23:42.935423,UOL4JIH1,-0.17300071477003254,104.75436791497278,1.4203917509236171e-08,76.35312648252889,30.46845929118024 +2023-08-07 11:23:43.437694,MW9Y6O1R,-0.5531501790540259,104.94715330945583,1.327887487643246e-09,93.17764874517184,60.29223334398387 +2023-08-07 11:23:43.939938,C5FA3XPI,-0.4104134949439846,104.88464180766204,5.374168643841372e-10,152.3477578813245,290.0490862264373 +2023-08-07 11:23:44.417122,CZ6WH8IV,0.3618879754628912,105.00887754539589,3.509204293982797e-10,233.3117320179634,348.9697490704055 +2023-08-07 11:23:44.919353,9HG0DW2Z,1.0872699322544472,104.6599812523132,3.6889681934396025e-10,289.69356280857716,336.12529538106855 +2023-08-07 11:23:45.421592,KSO8JBZR,1.164775381416472,105.05331528181382,4.3673136381127253e-10,148.6328013813231,86.05479882264325 +2023-08-07 11:23:45.923722,2E97HX0O,1.9889860424507457,104.6322920398085,4.770256008912145e-11,81.7936029140826,227.1970667198953 +2023-08-07 11:23:46.425892,CM9AHXEG,1.0504629535778798,104.08422181333643,5.256487906731053e-11,17.117902886288874,73.35119158753156 +2023-08-07 11:23:46.928115,ZPD87CAS,0.4527215494859038,104.17091820329306,8.840530054907045e-11,18.0139741077098,64.80295063528763 +2023-08-07 11:23:47.430372,VS0E56PD,0.6263896803735016,103.97882860073017,8.425291492082426e-11,21.41234080498392,22.497239265814756 +2023-08-07 11:23:47.932525,PZ3W6LKX,1.3126896265429921,103.49742709535366,1.551676952422436e-10,32.640030630732156,200.95855604337328 +2023-08-07 11:23:48.434706,BGVUX0ON,1.2501809391732872,103.16986428276498,1.348331428471414e-10,26.62183562228548,348.9486559618905 +2023-08-07 11:24:19.174866,1B5SAXLG,0.6440148150353486,104.51871361394988,8490.417429036797,253.27727131570617,232.78771386116057 +2023-08-07 11:24:19.677615,L7HN1XCK,1.4807518896747087,103.96621676546852,14761.560823921958,477.32100167295033,286.0719221469265 +2023-08-07 11:24:20.179839,J7QKG84B,1.610705109066352,103.80429713275217,2989.571048893855,452.43733161925195,111.87446291385362 +2023-08-07 11:24:20.682026,9WXF63LY,2.2261785157712817,104.111440362181,5274.4884926085615,584.3251343555293,48.82660332554411 +2023-08-07 11:24:21.184247,5OYBRWJL,1.8977197656885918,103.99308781285848,1924.9369884422463,452.15020780835846,318.28984063157844 +2023-08-07 11:24:21.686488,WG65F2ZQ,2.267113303158143,103.42628233432589,3171.070777353863,366.04295049541577,210.9085890786331 +2023-08-07 11:24:22.188675,MFVRT948,2.9159485313298994,104.35259232329544,1284.414808421605,258.319276108467,287.2661565946256 +2023-08-07 11:24:22.690932,OCR43N6E,2.295117267614282,103.71194420387403,1345.8812380035695,468.0113417393991,119.22393276199386 +2023-08-07 11:24:28.791607,719VXO4P,0.5489362540760516,103.15698366991411,9195.828624480417,74.7175842738024,102.28026395626772 +2023-08-07 11:24:29.294811,DUI06ER7,0.3629307327598519,103.70696699417535,6392.808864171764,133.28144193084825,244.07709542945202 +2023-08-07 11:24:29.797025,3UH78E6C,-0.3757311039722868,103.88263114940617,2884.2924115850724,18.476435273482537,310.34722181978134 +2023-08-07 11:24:30.299222,LKRMVU70,-0.3763620008123496,103.16730379657331,863.691902227504,19.224508926267347,117.63106809316707 +2023-08-07 11:24:30.801377,G56049RD,-0.48927913853178073,103.22152335686047,558.13669448055,35.448441379019364,58.111707255724866 +2023-08-07 11:24:31.303547,2F6SJQ41,-0.22000662250498104,103.32540953920481,247.2622814293286,62.894519430471235,205.12895634023926 +2023-08-07 11:24:31.805756,T52QUSPR,-0.04907851028778287,103.15955129839759,9.811843357286051,77.94187959069355,331.479485601283 +2023-08-07 11:24:32.307922,G2Z5J8P6,-0.7765784196613204,102.36793759214758,8.158870380836367,81.5107431603022,202.61891040800663 +2023-08-07 11:24:32.810098,T7MDWU9V,-1.1699642055120674,102.10208248198461,15.419406902335,94.3453702608803,146.5149901840187 +2023-08-07 11:24:33.312332,PRLY9B4A,-0.8780284730101158,101.49770915959557,22.004747812594484,120.83525537591561,224.14210098009673 +2023-08-07 11:24:33.814486,FOS8PZ75,-0.5744013062249884,102.20736632587224,1.693630532171582,109.75080552258999,1.5398719021783336 +2023-08-07 11:24:34.291560,D8M6GZOL,0.323573145746169,102.61446439739257,1.6046156200835913,101.1959014498892,142.85105252862195 +2023-08-07 11:24:34.793820,T1JL7MCE,0.27972181027255383,101.73956458975071,1.0276501142752257,17.201100971730867,67.79115176213651 +2023-08-07 11:24:35.296046,P5HIKRSE,1.238080234029776,102.19635016662176,1.358870087054518,20.767784216335404,208.63835957705336 +2023-08-07 11:24:35.798181,C2IS3OXY,0.8483742086735286,103.06263672707357,2.348685139898178,18.9697902525337,330.15302006803137 +2023-08-07 11:24:36.300377,SQCAILBK,0.2568212240556156,102.27338360764155,3.4711275772216448,15.15331848723907,252.19299527877672 +2023-08-07 11:24:36.802556,8GCI1E4V,0.17211790541227967,101.88734899087468,2.2167708305327793,6.155529620160028,338.73764803699953 +2023-08-07 11:24:37.304693,4YUK5CO1,1.127739705564845,102.03827279502167,3.7758985440328345,5.149813662040694,147.8089437388124 +2023-08-07 11:24:37.807006,GV48J71M,1.4280148677812936,101.1901973705164,6.685534444613498,2.8711600788528124,46.68725449262945 +2023-08-07 11:24:38.309100,TS2U9F6E,1.7634223173831889,100.44477906836676,12.428280252572886,2.871872354093057,199.31732780831783 +2023-08-07 11:24:38.811363,AF3VLSEC,1.3698038830178894,100.11141275880618,6.992616967829076,2.156634143049269,104.78985615513216 +2023-08-07 11:24:39.313531,7T093ILO,1.1917231890525533,100.08528772613441,5.884932032991961,3.4289142115546483,151.53143925424573 +2023-08-07 11:24:39.790596,4DEX6P8A,1.2896567195663242,99.1603171101435,10.472900461739782,1.5080796912686723,192.4028669122646 +2023-08-07 11:24:40.292819,JZPMGD4R,1.4176332029847554,100.13386488635223,3.380702442907287,1.300848956865058,41.253959019985075 +2023-08-07 11:24:40.795088,XB86HG0C,1.0729900454069186,100.54597661786521,6.323528081389569,1.4112410095510526,333.67556886610475 +2023-08-07 11:24:41.297272,34VOPAKL,1.5332298642189577,101.3050493509705,10.643195525722907,1.8810365228140529,288.9011807212853 +2023-08-07 11:24:41.799514,XQ31U09M,1.1483520393924762,100.9483048625962,19.10560748971654,1.1812995231669878,350.3448098745881 +2023-08-07 11:24:42.301710,DX7WQGBL,0.3879869099198956,100.14966248066176,36.46219463162931,0.8367078692479694,152.87944771228342 +2023-08-07 11:24:42.803872,VBY4S0DU,-0.5454676506432896,100.40416390204123,24.664623141482515,0.5943732515521851,217.12798103444385 +2023-08-07 11:24:43.306048,XL19CN5O,0.18641868002372064,100.95270429835165,23.90812774318198,0.6062585204121812,84.0179223491375 +2023-08-07 11:24:43.808195,JWYU27CQ,0.841565834488927,100.60605488595161,42.252495690034614,0.7371737566626627,14.305353221848407 +2023-08-07 11:24:44.310435,3FBNEO4U,0.9430542173846961,100.5804396182923,10.017576499402011,1.1141354475292073,92.16634509453664 +2023-08-07 11:24:44.812651,7BFPUQH0,1.8280865575396334,101.4775850329421,9.17819654544236,1.8318934737273136,336.34476182755054 +2023-08-07 11:24:45.314876,N8BHUC4I,2.1269543734262975,101.96402985002206,5.120234167158306,3.573788219056908,246.3963348949601 +2023-08-07 11:24:45.791962,OME1YH07,1.722282521265822,102.27813161513713,7.143914479318377,1.7671446418697574,38.74410394064461 +2023-08-07 11:24:46.294161,FTCPUAML,1.133195813420111,102.38758802467636,10.579672589145963,0.6172424678160842,117.62421441484241 +2023-08-07 11:24:46.796418,BIL6FYQ9,2.0465517783095724,102.5952630941557,4.02020584456345,0.2524951980345592,121.66628631279023 +2023-08-07 11:24:47.298679,YPV7ZO19,1.0921097013158296,103.1086842839782,0.7676477766187677,0.008302835219187482,34.215161739892324 +2023-08-07 11:24:47.800898,Z450Q87E,2.0625449014448654,103.62894102360703,0.9274152050305208,0.012374945962767295,218.89775520593145 +2023-08-07 11:24:48.303157,SDQAE3JV,1.5762462683648628,103.93256995454061,1.4605220556856682,0.0187552699804323,226.41935279018026 +2023-08-07 11:24:48.805385,GRWC1BI6,2.1233388288781407,104.22567442200283,0.7952672528971421,0.028782343035598526,76.69344258001479 +2023-08-07 11:24:49.307585,ZFOU7JXG,1.8609202880268039,104.18784731717011,0.8170770425720034,0.0028340535255771473,145.54977339726884 +2023-08-07 11:24:49.809799,Q0V13OP8,2.3394520809234636,105.15344508690215,0.8218089177836617,0.0048239936168704926,153.05635356220367 +2023-08-07 11:24:50.311983,S61QLOHF,3.203414175145042,104.91446286549836,0.8046261412554488,0.009478937037067101,307.7557436207349 +2023-08-07 11:24:50.814171,IMHRLAV4,2.799850342019176,105.57394150999022,1.214312774921999,0.018948448734660395,25.077876841144985 +2023-08-07 11:24:51.291197,X642DV9R,2.371047507650618,104.99843933840066,1.164122591206681,0.01089155906256909,125.22868362155629 +2023-08-07 11:24:51.793348,SFEYWDPR,1.9741296117935,104.94237528855292,1.45586957654782,0.01399980080759642,255.6182845810791 +2023-08-07 11:24:52.295513,LI9FC5B2,1.8871913012867751,104.9838388196081,0.9302932247267722,0.008349449320916002,162.05308418490404 +2023-08-07 11:24:52.797672,8SGT51VU,2.520131252073347,104.11722407536517,0.2381437919661359,0.012516214472988181,219.17404923463152 +2023-08-07 11:24:55.546468,8KE7BRMI,0.760243702082263,104.61164642139518,3936.614803771002,136.15774312666213,15.90152289422873 +2023-08-07 11:24:56.048910,8KFTOQ4G,1.440007429113668,104.53019120798943,4285.33475677141,131.0245299500469,233.00745541652694 +2023-08-07 11:24:56.551205,72H8TIRV,1.0370572827186437,103.95253295307052,8502.616299157284,229.0290384360712,243.10813326188847 +2023-08-07 11:25:24.691407,XDHI9S65,2.0018809191270277,103.60599721144301,5797.221839892398,71.65773045106145,36.602670074785834 +2023-08-07 11:25:25.193917,4IRT0MBY,1.634391210355493,104.03661605049462,5877.184902758916,12.446038611103674,117.71789460729232 +2023-08-07 11:25:25.696058,D0AN69LO,1.7490919023252094,103.16795039968312,4733.631243935801,23.17179170518802,130.52768526627239 +2023-08-07 11:25:26.198134,PFIGRYJ8,1.290067481917901,102.55790746645106,3289.9225746301295,30.282419703239825,164.19976917094158 +2023-08-07 11:25:26.700218,KS1ZTFQN,1.632759229609391,102.01199061308856,2157.9962137915436,42.144320290849535,144.19708699135322 +2023-08-07 11:25:27.202128,7NLFW13Q,2.225106179175154,101.5388065486105,1410.6486814796594,26.51761037854207,325.3281562560205 +2023-08-07 11:25:27.704158,34Q7IJZ9,3.030826508463253,100.59356511399497,801.8053918965886,44.338075652332165,302.98760254522426 +2023-08-07 11:25:28.206329,476EYT0Q,3.4305885271673042,99.99233962651135,275.8238738499515,47.48197467053403,12.465488896591353 +2023-08-07 11:25:28.708412,3FZ1GXO8,4.4035994278874,99.88645158595406,439.8341709818157,9.043603848004246,329.1113177842453 +2023-08-07 11:25:29.210509,KYR2XJ7V,3.950935529739577,100.27716766658466,341.32645904959054,11.22077555781365,195.75083909225805 +2023-08-07 11:25:29.712595,VYK0PQ2G,4.34146760901023,99.44678593818239,485.5882874925198,13.08229805301195,249.47768833101085 +2023-08-07 11:25:30.189624,3PD2QKIF,4.8115197801876715,98.6533173194788,502.88582548135616,22.100273621573766,43.67824052543233 +2023-08-07 11:25:30.691797,O0Y54B9D,5.247211118406404,98.68439974379991,297.82156316053454,3.3607536330235703,293.46793603786415 +2023-08-07 11:25:31.193914,DASE9HY0,6.009716650980021,99.40764583615336,241.63980772345965,3.2774930869159764,43.426533862926306 +2023-08-07 11:25:31.696043,LI1CX342,6.109535444333293,100.27299224472085,335.5003189097681,4.621014298964087,114.45529589260484 +2023-08-07 11:25:32.198143,IT5Q1GW0,5.362228030971816,100.03846340170975,462.59370761757583,3.875407325850816,238.8540249249392 +2023-08-07 11:25:32.700263,6DIJBW71,5.038516537602694,100.76800496523828,191.3989247339611,2.1728382989146913,256.3080113248655 +2023-08-07 11:25:33.202391,6TCARJFP,5.264296253460474,100.23121391569958,354.05981630286516,4.249263392076901,245.22920617893305 +2023-08-07 11:25:33.704433,6DUF5O10,4.916845173810744,100.23813319106253,198.08121691201382,6.604094351212185,153.5790952122186 +2023-08-07 11:25:34.206636,WN2490YQ,5.53797443307119,100.97683734805297,20.463291134453954,9.675214646768627,295.2234264377856 +2023-08-07 11:25:34.708805,V2IAKPJY,5.309669810654603,100.30032854306268,26.32046110027957,12.25330596743059,203.87095348581556 +2023-08-07 11:25:35.211016,Y52CHVO8,5.8656240992882775,99.3998484674646,3.111503260415315,0.8546662500041009,338.2158164657807 +2023-08-07 11:25:35.713118,9O7NCR6K,6.52981519511031,99.16062362757764,2.644982407707872,0.9630846931414644,317.44172188297034 +2023-08-07 11:25:36.190111,8BDWHYNF,5.72441659070522,98.26734512352634,2.8820941660187733,1.7788068768984437,161.98966017109433 +2023-08-07 11:25:36.692298,4PUR3XQL,6.186640712421697,97.84336531853334,2.1263112747747037,1.4571683487517424,48.01646541666628 +2023-08-07 11:25:37.194247,WKVTA4PS,5.440648254597683,97.92455663024496,2.481849922705129,0.25520269072147794,345.8663718638547 +2023-08-07 11:25:37.696234,B4KSELG5,6.291266307788861,98.21238961984815,0.15618680633923443,0.5050107465787769,27.669891677383475 +2023-08-07 11:25:38.198511,DEA2FT5M,5.445556164380631,98.68207090228057,0.29042316020894915,0.21592694372274257,7.263573818860095 +2023-08-07 11:25:38.700772,8027E5DM,4.7826741171557074,97.70779674534732,0.5760481267194711,0.2912616603350956,139.13327837346768 +2023-08-07 11:25:39.202897,7ARE1OP5,3.9431379706755347,97.82821280750653,0.4357050865375443,0.4825969807823727,320.8107580724221 +2023-08-07 11:25:39.705135,1UQABZ8S,3.74903314938282,98.77341940192714,0.06824857916856425,0.9241398557280043,263.30727125224485 +2023-08-07 11:25:40.207405,EQNF1PRY,3.2089031841978053,98.26836630457852,0.03716015702195009,1.0197134761869477,220.51219221551185 +2023-08-07 11:25:40.709711,DMTPJOAZ,2.267577986523981,98.377147321837,0.004453336568507826,0.17412424082207922,81.03565442438139 +2023-08-07 11:25:41.212001,CJQRLMW2,2.854613956808519,97.84093020050315,0.001494527054449296,0.11034302609138358,31.968383898329762 +2023-08-07 11:25:41.689175,MW5GH180,3.6096782842427553,97.80011908823755,0.00010304154267118545,0.18044206889858183,86.3815167896681 +2023-08-07 11:25:42.191320,Y7TEHPDN,3.645503976477947,97.03932719573736,4.689098994204505e-05,0.0365242129479465,87.3162229952906 +2023-08-07 11:25:42.693477,QMR3N57D,3.2811800796806994,96.5445943377218,2.1555155891280444e-05,0.01883540906698989,153.8215049956366 +2023-08-07 11:25:43.195656,IXM0EO6T,3.5479164464357114,95.86689350622481,3.291180597697038e-05,0.017863404939044647,96.19458890403632 +2023-08-07 11:25:43.697857,OCGIRHXN,4.467324856600795,96.71130407091309,5.4828959931505674e-05,0.02177885656618918,90.47890634584155 +2023-08-07 16:11:26.286176,9FLG1JRN,0.6680191419553747,103.52251399414432,8741.689529091398,214.74759423672296,239.92065380129694 +2023-08-07 16:11:26.788786,7XDEKQR2,0.9628888049509559,103.9186455299113,16156.142808181623,95.76380703120215,192.18385170409022 +2023-08-07 16:11:27.290860,4LZK7HID,0.7511370944988989,103.54614602390498,25497.644763442506,92.65882306582672,214.8550440051323 +2023-08-07 16:11:27.793234,UAVTBIS3,1.142212724590501,103.62400535870313,34435.37781844453,145.52251156329513,172.4340964259693 +2023-08-07 16:21:26.319416,FSYQ870K,1.212557810164098,103.10542088091297,834.0518008501404,158.08359534301388,343.178123755573 +2023-08-07 16:21:26.821864,GYAJ6E3B,0.9840472105077018,102.26510711935329,959.0376872082867,157.3078479234038,217.57551721088294 +2023-08-07 16:21:27.324123,PX916782,0.1280040619694378,101.68884711696826,1487.2829955900095,39.303775790466574,296.4497763988225 +2023-08-07 16:21:27.826295,GYS7BD06,0.8484038852253688,102.07625770163077,917.8787962888671,8.910928400267341,198.89009760832255 +2023-08-07 16:21:28.328529,C07YZJ4N,1.8465055917687057,101.11765617873834,1154.4145035124056,8.985637358816666,285.99907637588336 +2023-08-07 16:21:28.830639,JZPNXOGB,2.0168328202158543,101.0581204438626,1543.8104172337432,9.828294425585934,171.41330780029534 +2023-08-07 16:21:29.332827,QBDY672T,1.7107234642405182,100.3531870184899,557.5217620870133,13.399114854577938,169.72512553437628 +2023-08-07 16:21:29.835205,C6NIXH0S,2.2881814371996736,101.21103755570472,22.876509734920887,9.158464550316973,253.98030122616265 +2023-08-07 16:21:30.337551,TL8UCM5I,2.4010793693409926,100.35974381799019,44.95917841466303,2.6376555721909423,19.210623097934445 +2023-08-07 16:21:30.839841,4L21YXEQ,1.5717101436564445,99.48657173458967,33.97776548782829,1.7120673810485663,302.4868525984195 +2023-08-07 16:21:31.342088,8U6LTPFY,1.9950463738556694,100.3418802754518,33.55178833439851,2.0149852692575156,49.7029592138835 +2023-08-07 16:21:31.819290,6H4LR3CF,2.7368592541822987,100.80061161916561,14.435207671778791,3.7641104129772347,27.09128698007345 +2023-08-07 16:21:32.321637,AZHY2PN5,3.6970650485732723,100.31152218170834,15.00317570941897,1.492622748846299,283.5235817824307 +2023-08-07 16:21:32.823879,0TES45L1,3.942817759530045,99.79186388692918,15.251993550476906,2.5362149349059933,222.22044761451218 +2023-08-07 16:21:33.326134,WGYRX9H8,3.6358117578529296,100.10535903776072,6.758423981305045,1.6605014025747726,329.65318990071023 +2023-08-07 16:21:33.828343,IUWTEM6B,2.7657092576762166,100.6799682326449,0.6777150707184187,0.515753499076725,249.0821174273019 +2023-08-07 16:21:34.330602,JECKU8BY,1.9235957183817045,100.78018314756518,0.3490115705356143,0.4992074751418871,22.67765054953054 +2023-08-07 16:21:34.832879,D4CF79RJ,2.021799368623114,101.42501975086313,0.14911581973507812,0.8445649769732703,82.60100042099006 +2023-08-07 16:21:35.335135,8CUN19WY,2.888065384104639,102.14721819651199,0.09380707608165686,1.4814559433230015,355.6072395000027 +2023-08-07 16:21:35.837379,K8JAQ5GY,2.6423785593486437,102.95337198432927,0.1682372845728426,2.4855601529132736,157.85442126932185 +2023-08-07 16:21:36.339624,5EKYP2AH,3.190233446861493,102.26133019512247,0.21730681215016612,0.7092926347394113,33.15455180789422 +2023-08-07 16:21:36.841946,489IRA7O,2.444957037136543,103.06856223778193,0.058150667511012694,0.059380379400607475,83.21184001699041 +2023-08-07 16:21:37.319046,82DAJVHW,1.8103031986319242,103.15861959919673,0.06451104488665094,0.0534202823483365,1.861010284661461 +2023-08-07 16:21:39.477076,8XZCNHJU,2.1426219742540145,104.2408212678295,2165.081809923124,145.91339330069133,182.7728840731978 +2023-08-07 16:21:39.979686,4WN96VH0,1.3980564379465832,104.18830501852787,901.065499487534,32.76872719047242,107.92322449541052 +2023-08-07 16:21:40.481858,08TX4QP3,0.6309400638465021,103.4643818939401,775.7869824249325,37.7609311131947,204.19135565925276 +2023-08-07 16:21:40.984133,JRVZ3P29,0.9777365694448932,102.55829591410055,28.51972780009328,27.947176014213287,193.56776139578574 +2023-08-07 16:21:41.486438,NIGCBAHY,1.8661670316759762,102.78805861122864,42.24345152823255,55.28032112462975,329.5077633526489 +2023-08-07 16:22:26.048453,1ZNYH6PB,2.19156299359983,103.89768274455004,6158.179472509008,139.10904557324278,239.50265746271788 +2023-08-07 16:22:26.551891,0L21TREQ,1.2661317439107649,103.78887495236825,409.6101108343091,205.53781949231805,98.49421506107569 +2023-08-07 16:22:27.054188,H0EID8GZ,0.3343091559285494,104.01836783130479,602.123914754223,201.7958777344975,15.547188632590348 +2023-08-07 16:22:27.556407,TZ43UFKM,0.23506097590555908,103.9513385968941,850.8514729700051,364.3702562653118,358.16800191423476 +2023-08-07 16:22:28.058713,X0M7CHAO,0.9992017570285938,104.07521544027202,337.63963639771407,441.6948787837479,244.99360049112613 +2023-08-07 16:22:28.560984,JRM3ZCFP,0.12676189108537295,104.35601317039493,518.557983129492,141.27904131284015,197.34215044483392 +2023-08-07 16:22:29.063337,YICN7O62,1.0500343785880728,105.00445185750681,377.1705243222495,163.74527563056597,312.0618759427087 +2023-08-07 16:22:29.565646,XIC0MBOG,0.2565939750150543,104.1794027871388,186.3357020998392,286.00375944317,133.2790444795782 +2023-08-07 16:22:30.068024,G74P1A2T,1.175049300327357,103.40288026452878,143.53596424730912,148.8239582115367,257.6831773388467 +2023-08-07 16:22:30.570340,BSM096V7,1.86517504056509,104.19970101485909,242.89357386756268,235.7638550204664,179.88264772179843 +2023-08-07 16:22:31.047484,97YCZ1UB,1.4260685736136387,104.21748334760635,431.41976589947535,209.45347732336177,122.37169989533317 +2023-08-07 16:22:32.827302,1VSZ9NGI,2.04174354484816,103.043365427443,8237.526908927963,37.922193906507374,202.93447697731665 +2023-08-07 16:22:33.329768,TV5HDNB6,1.5599849894657172,103.04908304937277,6858.765963227234,68.98179008427451,345.4341760179532 +2023-08-07 16:22:33.832097,YRITB1P4,1.7456914952692617,103.22568065124537,7148.1607817611775,123.09612051593462,192.90254377783424 +2023-08-07 16:25:23.116303,V7WJ2IZD,1.6132226556031748,103.41318785254339,2552.686828791146,109.15402167301565,6.658992674658926 +2023-08-07 16:25:23.619077,KDFU3XQM,0.861217833521295,103.77056638870148,2914.820555845281,28.152483284683626,289.07741406939294 +2023-08-07 16:25:24.121371,4IRX2Z5C,0.6364446384999796,104.59877511044043,1894.2158894905888,32.24064947434099,162.9615073382688 +2023-08-07 16:25:24.623596,O3X9RZUJ,0.19464176530791222,103.94800546497461,1442.8803710113602,59.21675842897595,255.78554387268082 +2023-08-07 16:25:25.125913,PD8IUVRS,-0.78982297271827,104.42066572235255,2704.5632767781462,58.303271583714405,198.52098925994915 +2023-08-07 16:25:25.627874,TO1NXRDW,0.1711791189795009,104.1883310366521,146.5670367032908,22.41202999686228,130.38053817330814 +2023-08-07 16:25:26.130140,8H0CUJGN,-0.5818298443558159,103.77263399174551,288.22959654444077,21.782411952891,66.98336185192892 +2023-08-07 16:25:26.632014,BI74XP5F,-1.1958188179493285,104.0847102219097,489.88637029588443,13.075009590934647,118.03912612299261 +2023-08-07 16:25:27.134244,6B30F8VA,-0.823649534375865,103.28175229041565,169.65912499929476,4.34293474223089,298.3411788419288 +2023-08-07 16:25:28.805521,DFCZJE0X,2.155047430892718,103.79142809378261,7268.349445016837,148.81804726014929,79.58971057810245 +2023-08-07 16:25:29.307916,3Y0HLERV,2.035742038124181,104.75392942739295,2003.1888094844626,75.7627580064459,30.180104789295683 +2023-08-07 16:25:29.810141,VIDSLYNZ,1.2929491294186481,104.20868609210004,3573.264584025445,38.98269511901932,249.54228623143754 +2023-08-07 16:25:30.312426,QA31N65I,0.4118094104682941,104.64988886961382,2779.2173099105453,5.1106061309194,233.67385356423608 +2023-08-07 16:26:34.180956,G96MF3XO,1.9544797172547381,102.90485501074987,9846.579002497385,33.93635623154016,251.35724472280242 +2023-08-07 16:26:34.684164,K6IYPUG8,2.2283903887300776,103.19710674993722,3080.970552434629,45.037401671680804,209.55609588774917 +2023-08-07 16:26:35.186431,RZ4W8IM3,2.756728969655849,102.98688232319428,4536.896292301289,68.54673959141485,65.25201581198462 +2023-08-07 16:26:35.688703,LEMJZ82P,2.364755295253246,102.71167712405934,864.509401693208,123.10327045967644,118.45961104733504 +2023-08-07 16:26:36.190919,98ABXDWK,3.0417512276988945,102.77463850820035,667.2034035208192,213.83604148585871,7.175050672021484 +2023-08-07 16:26:36.693242,7P4JEVYX,3.2255338384621606,102.18993296819883,1090.4292853588206,226.2859617194323,108.58344270469257 +2023-08-07 16:26:37.195490,PDRZTE5W,3.162668697349078,101.75697699941787,1325.5727879757394,324.2685907007072,295.63657714435146 +2023-08-07 16:26:38.836186,4U1DGJIF,1.702965496761083,103.43670785918872,6581.627868309889,180.30843424513674,75.8968723045889 +2023-08-07 16:26:39.338534,O7RSJNLB,1.5719308496217346,103.22908824819821,7325.2576827083385,172.43490477084939,337.72138146719345 +2023-08-07 16:26:39.840618,5Q8GPFT6,2.4895889677931824,103.25186624242575,637.932477551276,24.32629490270665,255.2461431251054 +2023-08-11 14:31:51.054413,YLNZE2KM,1.8995020333218817,104.58928948977122,8699.336632959668,112.4693836226996,138.72845032571516 +2023-08-11 14:31:51.556761,36E8O9V0,2.376202129341449,103.83496199143589,3496.4539096674616,200.64728234181385,272.084767182067 +2023-08-11 14:35:26.763568,BGX4KR9T,1.7167738746528403,102.9891803312302,257.9271874382539,265.68979848728804,85.76280181742403 +2023-08-11 14:35:27.266626,OEF0YK4X,1.4362271020129023,103.25339146139004,62.003514931428214,359.35025154532786,169.13156652771656 +2023-08-11 14:35:40.305261,VR8W1NYM,1.8440821579180198,104.5468689938441,8442.123033929713,15.707530735667504,318.91442839614876 +2023-08-11 14:35:40.808615,V9BOYQA1,1.4971030936242702,105.45047977133105,10104.204947421691,12.247092282875915,306.14973143462987 +2023-08-11 14:36:09.152449,XO865PGV,2.005462272197316,103.56931335526093,1732.9452395536882,222.70120705619138,293.9090898536274 +2023-08-11 14:36:09.655237,NOP1MV9X,2.588639867341877,103.40740662361725,829.5449737848704,216.6111111858535,290.6321116056238 +2023-08-11 14:36:11.433788,BXJWHPFG,1.8364609318924472,103.87852439208721,7918.693304277305,125.30413640099685,143.38510100764339 +2023-08-11 14:36:11.936178,SW15PRB8,2.404030597403527,103.0323638612413,4360.257684134397,121.7292224508216,260.29011227557316 +2023-08-11 14:36:12.438361,KJL29W6V,3.3506652583712606,102.69662988936561,1.0644286245260446,128.07524566083347,172.48144216469836 +2023-08-11 14:36:12.940558,B3G1PXFW,4.224690518795022,101.91821835781938,0.2046354763667816,120.07256324258898,20.914496765154013 +2023-08-11 14:36:27.550174,QPDBKG4A,0.9842373851696959,103.60389134190739,2956.766345845451,110.70110579750408,153.80529355356154 +2023-08-11 14:36:28.052575,NXT15OR8,0.8689330382987224,102.96761690409483,4411.17242561422,148.67456298348156,295.53455828339554 +2023-08-11 14:36:32.629189,S5OMH3Z0,1.7918320187483046,104.05627990534497,3017.540473509959,276.4730232728963,205.17844594449133 +2023-08-11 14:36:33.132158,ONHIDJ8Z,2.2112821555200046,104.67224754169465,3821.319683366879,8.633927160207861,146.72126792141506 +2023-08-11 14:36:33.634311,5RZ9EXB1,1.8077075091680836,104.08443176658689,4973.057084874834,2.9202356908559324,201.49444385119762 +2023-08-11 14:36:34.136486,HDR5XMSL,2.215685570761304,104.94655850550211,191.12408734021028,3.6660104895299535,75.2546735259665 +2023-08-11 14:36:56.428975,12PXK4BR,1.8107064172358012,102.85985707039077,5140.510859817992,54.21802072309052,193.7784066972923 +2023-08-11 14:36:56.931412,Q4YLWGJ1,2.2586370640998212,102.52184992999567,3782.022413009538,10.706814985035777,251.54952595502442 +2023-08-11 14:37:06.897467,Z5PDUFHJ,0.8370927469310159,103.38398792320996,1193.7059942262513,156.48440711590268,29.348272590794956 +2023-08-11 14:37:07.399334,2871AJM4,1.2378318256336838,103.07281658320736,564.7966067375175,251.2602220972526,9.31086745194051 +2023-08-11 14:37:07.901465,I1PX2HEK,0.5166902339696959,102.83556685374447,867.3055286999112,91.60615330700065,204.96537902932658 +2023-08-11 14:38:32.182677,KHMRWPJ4,0.4983767018193992,104.6550045240449,224.1372967459838,62.69362467475872,274.76395918184795 +2023-08-11 14:38:32.685022,JE0FXICS,1.0353343160494666,104.70867914467775,282.85363270672315,13.218182512645768,340.69691934044556 +2023-08-11 14:38:33.187215,CA3UORFM,1.8111511637613882,104.11126695805387,150.17065430153514,19.71028975946143,255.15922860021305 +2023-08-11 14:38:55.431831,V8HICWQZ,1.6161917420577323,104.76179923275139,1118.41276142679,130.55117335255878,78.27850153866434 +2023-08-11 14:38:55.934326,I50ONFCA,1.6726150404084448,104.74016176626822,1727.263503753729,41.059943940877275,229.0273385927827 +2023-08-11 14:38:56.436491,HEFZ97SY,1.8154043392317305,105.3113438179926,427.69281683085205,41.758048312197246,319.36217962574233 +2023-08-11 14:39:45.305002,RO3564WX,0.7178284246341455,103.7870227253418,4768.8932652561125,144.84997662477844,66.19759441884952 +2023-08-11 14:39:45.807397,B3VUY64K,0.7570465775803406,104.51985902759166,644.8206935387061,232.453122601573,86.1099815493269 +2023-08-11 14:39:47.922837,V01BSICX,2.3331442726660976,103.47233818898457,5159.641382283626,98.49093555301218,267.11991284073923 +2023-08-11 14:39:48.425220,XG6ZDNSW,2.6459285400813384,102.57891368678497,8996.483744128602,37.31699487271816,340.75689198420764 +2023-08-11 14:40:44.743658,8KA1CP4L,1.1312398201741156,103.52540518853651,6742.626200931055,180.68132696511438,88.71728038017854 +2023-08-11 14:40:45.247093,JW0MK3XL,0.9055325733476445,104.24064230174095,170.32098583425704,174.4123006201712,349.8016294092407 +2023-08-11 14:40:58.990995,XREQNTH6,2.188270016534732,104.36819152090827,7997.219103363579,241.45996376174278,297.8145054063311 +2023-08-11 14:40:59.493565,24OIT9Y5,1.7689934741135358,104.42016191892368,7862.078537981989,32.74995451877501,350.8132992982385 +2023-08-11 14:41:41.660164,6ALMHZXW,2.219480200815606,103.90816921778938,9565.989525085919,86.00595843206592,63.761605117585404 +2023-08-11 14:41:42.162697,JIAMNF0Z,3.0225805869081186,103.48623036423083,4452.237971098254,18.252827658237933,0.8356348602867456 +2023-08-11 14:41:42.665013,QI2S6PVL,2.1260154744046837,102.82062386270194,2516.4141921571227,25.61379659038776,35.031051962442 +2023-08-11 14:41:43.167063,63GYA4IB,1.949565474830804,102.42470814469864,14.876482296508584,42.15320993003504,291.81891944895375 +2023-08-11 14:41:43.669353,LJB5HGPW,1.346690250504228,102.27414717799432,25.379858564636514,12.00998762985163,202.26690978546367 +2023-08-11 14:42:17.865020,0KOD82W3,0.6355524498787208,103.98983399553123,9859.499642409188,271.9317934289684,318.66572412342435 +2023-08-11 14:42:18.367912,CBEWVLTO,0.009490294289078438,103.39375538611793,8163.732084222587,94.7945507060461,310.4656323429165 +2023-08-11 14:42:24.739837,FW0TL1MJ,2.2722371739249105,103.72452451857104,4791.9913070625325,158.01250284637166,198.95301563282294 +2023-08-11 14:42:25.242224,HGBCXQRL,1.922719184807189,104.06479154420654,6225.090065057328,22.54952050410543,308.3356528374578 +2023-08-11 14:42:25.744456,ILBN0G26,2.5470866420101346,103.88671755734896,9464.510751525477,14.288719151080949,316.3387395073925 +2023-08-11 14:42:26.246662,SC5OLDWU,2.1413096552466975,103.86765522258621,16207.806652129233,18.806563585047215,242.644242179127 +2023-08-11 14:42:26.748718,BV8FMDGY,2.6966968616460223,103.52853230095808,6084.020626879903,2.111631036999679,320.51523257610995 +2023-08-11 14:42:27.250884,57CJSEPZ,2.4014541715681923,103.51154160790529,8858.942016168066,0.2490662724372117,243.59682252089283 +2023-08-11 14:42:37.943410,ESNDCX1R,1.9872974484557107,104.47108124923655,2252.663312655,223.31408563065196,359.87242507343575 +2023-08-11 14:42:38.445812,DSYNHXFA,1.0925326830403226,104.9673899178989,2716.7125415906153,247.69198636862794,181.2578857411728 +2023-08-11 14:42:38.947761,6JCPFG0R,0.43536012637579624,104.79135830943717,2171.4356119108907,84.81762235039366,98.26840629219038 +2023-08-11 14:42:39.450013,3MVKCQH6,0.7342403235898909,104.19141107356857,1145.1573387269964,157.5866396854447,114.656648239268 +2023-08-11 14:43:46.842937,A9O0FTJ3,1.7300906510958476,103.09464870561656,5670.862273579077,101.80147089666238,40.74711893588857 +2023-08-11 14:43:47.345991,IACKG9V3,1.1212053389875114,102.19451954566486,6382.3504650635,26.83078833637748,294.75177380018 +2023-08-11 14:43:47.848300,DF5EX7MC,0.33052316686247174,101.55007267406033,8285.196629382484,1.1536228939136386,120.90477425677034 +2023-08-11 14:43:48.350617,YUATW0K1,0.810144890032025,102.13710265075754,3400.607502748495,0.7666041489604714,141.17780587332544 +2023-08-11 14:47:01.243711,DIRMUZP4,1.8627522878525695,104.05896286843262,2991.1819159688007,121.12139989670102,102.81295575226433 +2023-08-11 14:47:01.746734,SULOJARG,2.4960105335458698,104.79041611732927,963.9243164583945,50.58899800602278,328.7844035560258 +2023-08-11 14:47:10.905966,Q6ZCPAO0,1.8786252345171204,104.16509442381653,8602.764156970425,72.55840781641068,59.445958373312536 +2023-08-11 14:47:11.408380,WGNM5AUH,1.529627452793448,103.98113107029334,9831.229292434564,71.86425144381725,189.7559758658207 +2023-08-11 14:47:11.910572,UHOM062B,1.8372166191834431,103.61831090305114,13061.563043933187,121.50429192435725,216.3272243818407 +2023-08-11 14:48:00.464576,B2SAGP3L,1.7407055616562717,103.70123890535454,5341.127669345653,49.32358014419026,165.99677483435462 +2023-08-11 14:48:00.969614,ZNAQB3KJ,2.4582259275431215,103.20439345322762,8057.02451766512,89.86993778644725,10.962011734566033 +2023-08-11 14:48:01.473532,QJT8IF6H,2.607354451684156,102.87264402335994,9592.398451916764,179.5937045976157,299.9212132530012 +2023-08-11 14:48:01.978194,NJWB0IHT,1.65631366860846,103.25747043064321,1771.959055066207,276.83303189030727,69.40056299122045 +2023-08-11 14:48:02.482574,6H12O8GU,2.24470308911304,103.27825424649997,2109.0375708116867,310.1653562364115,237.4221625740304 +2023-08-11 14:48:15.476928,Y3Q2RSOP,1.008842474094067,102.91626155404609,4372.788752543259,51.89137908745013,60.508037115308866 +2023-08-11 14:48:15.979328,30FT18VU,1.1556726836950746,102.30398916240893,1550.018762811359,63.1586980691548,12.918492180452631 +2023-08-11 14:48:27.855689,1QE6ZSI3,0.7886595852917269,103.16950628071257,6513.358116629146,155.32015054621925,304.18767366692543 +2023-08-11 14:48:28.358019,3CPHSQ1K,0.23623401806020095,102.32127444277033,3788.0885338183125,263.9932359180593,63.38251643400986 +2023-08-11 14:49:20.928631,ZTNB40WY,2.307501724475551,104.55184767265865,23.209186737259188,173.59062151891362,176.49439118295228 +2023-08-11 14:49:21.431147,V0WNJOYL,2.982932281274674,105.41797311174768,23.40451968289048,335.83475439860024,314.42435071997045 +2023-08-11 14:50:13.897706,NUJ0KETL,1.3381948236449168,104.31977534477893,9837.589807757951,230.2152039274472,146.18100924630656 +2023-08-11 14:50:14.400178,I2XQS4CR,1.2367749429467392,105.06139792762143,4845.061882050308,62.35096274565342,213.70745472766728 +2023-08-11 14:50:24.184994,LUEQZT3K,0.5820536979784003,103.12118361785444,8685.587666987809,6.744408098836061,48.246820936320724 +2023-08-11 14:50:24.687303,DGJ149HB,1.0826555738625507,102.92202234741168,2569.1506934034423,7.081326245342095,339.3429446487865 +2023-08-11 14:55:12.128763,GLF9WEJ0,2.3074054911762527,103.24069228907891,2832.3963196899263,258.5040186302408,280.54007499138 +2023-08-11 14:55:12.631139,TDHL4NAW,1.7761512914735738,104.02281206848303,3815.291138713311,158.04971643205013,155.90396018983608 +2023-08-11 14:55:21.280565,A3DC7YBI,0.35778981891044515,103.1357195223603,5894.15361715314,160.49360643307938,241.25912575460137 +2023-08-11 14:55:21.782864,AVW9ZL0R,0.34959914745442733,102.1616242361928,2710.2474095519046,100.63832605949564,351.7424970236614 +2023-08-11 14:56:21.074050,F4DYB3N0,1.288044678617704,103.39885860467642,8871.329749097327,61.99200547289415,58.83688398008453 +2023-08-11 14:56:21.576151,PW3F9ME0,0.9233842872356228,104.08348458520433,7927.525263352071,64.16846567353564,152.599189825038 +2023-08-11 14:57:05.231324,FNGPJX5S,2.01324168079291,104.54234016836925,2676.001234545254,19.008721444006866,316.9814359367978 +2023-08-11 14:57:05.733850,B97GQZYH,2.53312623956631,104.04103244964364,4988.748428002863,13.520652764654455,265.08280413883347 +2023-08-11 14:57:19.743058,ELXQVP6M,1.704137082649641,103.29015303168018,6056.563144008637,185.91957811874943,86.05896961730316 +2023-08-11 14:57:20.245813,PMTFG3J0,1.9074272669049257,103.17270519973093,2649.108782016278,266.65403521961565,270.35370368963686 +2023-08-11 15:00:10.047316,O02GFPS6,1.277749101610194,104.26458898234817,4130.0734252209595,15.664292331581521,19.903384332726738 +2023-08-11 15:00:10.549669,3IKJP9MT,1.8124135218622144,104.57942826744241,5420.658077352466,20.740088643364363,283.8161773020808 +2023-08-11 15:01:33.934274,8BQLXUHE,1.5327567388645453,103.3863745470156,3372.279095522782,159.41347014788764,262.267904514094 +2023-08-11 15:01:34.437295,3LFSAM9H,1.8669818695353841,104.2866164757171,1961.8044788861139,241.99124310146675,143.3455785657137 +2023-08-11 15:07:52.126936,JT8DYR7N,1.4024160158636994,102.87552832323641,6042.330052767699,64.8487719192847,24.995737515790477 +2023-08-11 15:07:52.629362,2QBXVSMO,1.8634571530932547,103.3477849546587,147.82689567174384,0.7438864717812521,210.92321810535572 +2023-08-11 15:09:37.011550,Y9HAJG13,0.7621085535475214,104.5883340186613,6281.27648517384,254.0777179571405,2.591149704169009 +2023-08-11 15:09:37.514614,TC87105F,0.28799871315503567,104.4566035466536,326.8025629224476,334.81266379042364,205.8735351017741 +2023-08-11 18:47:39.324319,BTALR1SN,1.7185325787303525,104.23182762113206,4183.860142045951,232.05679041675768,208.4984296149201 +2023-08-11 18:47:39.831819,7W2UXQEC,0.848324073173931,103.63219829223075,5.225685461417925,240.50270578891752,193.5626899797196 +2023-08-16 14:11:16.162841,7FKN5HCA,1.3949368237496726,103.12567340384494,4514.507674967041,198.56942733498173,62.82676652049499 +2023-08-16 14:11:16.669623,YISATP65,1.8893401716942906,103.18275655920301,2453.0791390552445,213.93147961762696,9.490155929720345 +2023-08-16 14:22:28.992618,3QIJMBYN,1.4626433193360946,102.831420528882,4981.507608822616,168.4543602196054,263.1284789998873 \ No newline at end of file diff --git a/pyhackrf.py b/pyhackrf.py index 7200603..72e5b79 100644 --- a/pyhackrf.py +++ b/pyhackrf.py @@ -51,10 +51,7 @@ class LibHackRfReturnCode(IntEnum): class LibHackRfBoardIds(IntEnum): BOARD_ID_JELLYBEAN = 0 BOARD_ID_JAWBREAKER = 1 - # For HackRF One V9, BoardId is 4 - BOARD_ID_HACKRF_ONE = 4 - # For older HackRF Ones - #BOARD_ID_HACKRF_ONE = 2 + BOARD_ID_HACKRF_ONE = 4 # 4 for V9 and later, 2 for earlier BOARD_ID_RAD1O = 3 BOARD_ID_INVALID = 0xFF @@ -809,11 +806,12 @@ def isStreaming(self): __class__.__logger.debug(__class__.__name__ + " Trying to call isStreaming") if self.opened() and self.getTransceiverMode() != LibHackRfTransceiverMode.TRANSCEIVER_MODE_OFF: return __class__.__libhackrf.hackrf_is_streaming(self.__pDevice) == LibHackRfReturnCode.HACKRF_TRUE - #else: - #print("isStreaming corner case") - #__class__.__logger.debug( - # "Trying to call isStreaming for non-opened or non transmitting " + __class__.__name__) - #return False + else: + print("[*] isStreaming corner case") + print("[*] Trying to call isStreaming for non-opened or non transmitting " + __class__.__name__) + __class__.__logger.debug( + "Trying to call isStreaming for non-opened or non transmitting " + __class__.__name__) + return False def stopRX(self): __class__.__logger.debug(__class__.__name__ + " Trying to stop RX") @@ -875,16 +873,22 @@ def startTX(self, callback, tx_context): result = __class__.__libhackrf.hackrf_start_tx(self.__pDevice, self.__txCallback, None) else: + print("[*] tx_context:",tx_context) + print("[*] pDevice:",self.__pDevice) + print("[*] txCallback:",self.__txCallback) + # TX start is called HERE result = __class__.__libhackrf.hackrf_start_tx(self.__pDevice, self.__txCallback, byref(tx_context)) if (result == LibHackRfReturnCode.HACKRF_SUCCESS): __class__.__logger.info("Success starting TX") self.__transceiverMode = LibHackRfTransceiverMode.TRANSCEIVER_MODE_TX + print("[*] Success starting TX") else: __class__.__logger.error( "Error (%d," + __class__.getHackRfErrorCodeName(result) + ") while starting TX ", result) else: __class__.__logger.debug("Trying to start TX for non-opened or in transmission " + __class__.__name__) + print("[!] Trying to start TX for non-opened or in transmission " + __class__.__name__) return result def getTransceiverMode(self): diff --git a/pyhackrf_backup.py b/pyhackrf_backup.py new file mode 100644 index 0000000..d977a6e --- /dev/null +++ b/pyhackrf_backup.py @@ -0,0 +1,1031 @@ +# +# Python wrapper for libhackrf +# +# Copyright 2019 Mathieu Peyrega +# +# This file is part of HackRF. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# + +import logging +from ctypes import * +from enum import IntEnum + +logging.basicConfig() + + +# +# libhackrf enums +# +class LibHackRfReturnCode(IntEnum): + HACKRF_SUCCESS = 0 + HACKRF_TRUE = 1 + HACKRF_ERROR_INVALID_PARAM = -2 + HACKRF_ERROR_NOT_FOUND = -5 + HACKRF_ERROR_BUSY = -6 + HACKRF_ERROR_NO_MEM = -11 + HACKRF_ERROR_LIBUSB = -1000 + HACKRF_ERROR_THREAD = -1001 + HACKRF_ERROR_STREAMING_THREAD_ERR = -1002 + HACKRF_ERROR_STREAMING_STOPPED = -1003 + HACKRF_ERROR_STREAMING_EXIT_CALLED = -1004 + HACKRF_ERROR_USB_API_VERSION = -1005 + HACKRF_ERROR_NOT_LAST_DEVICE = -2000 + HACKRF_ERROR_OTHER = -9999 + + +class LibHackRfBoardIds(IntEnum): + BOARD_ID_JELLYBEAN = 0 + BOARD_ID_JAWBREAKER = 1 + # For HackRF One V9+, BoardId is 4 + BOARD_ID_HACKRF_ONE = 4 + # For older HackRF Ones + #BOARD_ID_HACKRF_ONE = 2 + BOARD_ID_RAD1O = 3 + BOARD_ID_INVALID = 0xFF + + +class LibHackRfUSBBoardIds(IntEnum): + USB_BOARD_ID_JAWBREAKER = 0x604B + USB_BOARD_ID_HACKRF_ONE = 0x6089 + USB_BOARD_ID_RAD1O = 0xCC15 + USB_BOARD_ID_INVALID = 0xFFFF + + +class LibHackRfPathFilter(IntEnum): + RF_PATH_FILTER_BYPASS = 0 + RF_PATH_FILTER_LOW_PASS = 1 + RF_PATH_FILTER_HIGH_PASS = 2 + + +class LibHackRfTransceiverMode(IntEnum): + TRANSCEIVER_MODE_OFF = 0 + TRANSCEIVER_MODE_RX = 1 + TRANSCEIVER_MODE_TX = 2 + TRANSCEIVER_MODE_SS = 3 + + +class LibHackRfHwMode(IntEnum): + HW_MODE_OFF = 0 + HW_MODE_ON = 1 + + +# +# C structs or datatypes needed to interface Python and C +# +hackrf_device_p = c_void_p + + +class hackrf_transfer(Structure): + _fields_ = [("device", hackrf_device_p), + ("buffer", POINTER(c_ubyte)), + ("buffer_length", c_int), + ("valid_length", c_int), + ("rx_ctx", c_void_p), + ("tx_ctx", c_void_p)] + + +class read_partid_serialno_t(Structure): + _fields_ = [("part_id", c_uint32 * 2), + ("serial_no", c_uint32 * 4)] + + +class hackrf_device_list_t(Structure): + _fields_ = [("serial_numbers", POINTER(c_char_p)), + ("usb_board_ids", POINTER(c_int)), + ("usb_device_index", POINTER(c_int)), + ("devicecount", c_int), + ("usb_devices", POINTER(c_void_p)), + ("usb_devicecount", c_int)] + + +hackrf_transfer_callback_t = CFUNCTYPE(c_int, POINTER(hackrf_transfer)) + + +# +# libhackrf Python wrapper class +# +class HackRF(object): + # Class attibutes + __libhackrf = None + __libhackrfpath = None + __libraryversion = None + __libraryrelease = None + __instances = list() + __openedInstances = dict() + __logger = logging.getLogger("pyHackRF") + __logger.setLevel(logging.CRITICAL) + + @classmethod + def setLogLevel(cls, level): + cls.__logger.setLevel(level) + + def __init__(self, libhackrf_path='libhackrf.so.0'): + if (not __class__.initialized()): + __class__.initialize(libhackrf_path) + else: + __class__.__logger.debug("Instanciating " + __class__.__name__ + " object number #%d", + len(__class__.__instances)) + + # Instances attributes + # Description, serial and internals + self.__pDevice = hackrf_device_p(None) + self.__boardId = None + self.__usbboardId = None + self.__usbIndex = None + self.__usbAPIVersion = None + self.__boardFwVersionString = None + self.__partId = None + self.__serialNo = None + self.__CPLDcrc = None + self.__txCallback = None + self.__rxCallback = None + # RF state and settings + self.__transceiverMode = LibHackRfTransceiverMode.TRANSCEIVER_MODE_OFF + self.__hwSyncMode = LibHackRfHwMode.HW_MODE_OFF + self.__clockOutMode = LibHackRfHwMode.HW_MODE_OFF + self.__amplificatorMode = LibHackRfHwMode.HW_MODE_OFF + self.__antennaPowerMode = LibHackRfHwMode.HW_MODE_OFF + + self.__crystalppm = 0. + + # trial to implement getters, but this would probably be better to + # have it done from the .c library rather than a DIY solution here + # relevant parts have been commented out + # self.__lnaGain = 0 + # self.__vgaGain = 0 + # self.__txvgaGain = 0 + # self.__basebandFilterBandwidth = 0 + # self.__frequency = 0 + # self.__loFrequency = 0 + # self.__rfFilterPath = LibHackRfPathFilter.RF_PATH_FILTER_BYPASS + + __class__.__instances.append(self) + + def __del__(self): + __class__.__instances.remove(self) + __class__.__logger.debug(__class__.__name__ + " __del__ being called") + if (len(__class__.__instances) == 0): + __class__.__logger.debug(__class__.__name__ + " __del__ being called on the last instance") + + @classmethod + def initialized(cls): + return cls.__libhackrf is not None + + @classmethod + def initialize(cls, libhackrf_path='libhackrf.so.0'): + result = LibHackRfReturnCode.HACKRF_ERROR_OTHER + if (not cls.initialized()): + cls.__libhackrfpath = libhackrf_path + cls.__libhackrf = CDLL(cls.__libhackrfpath) + + # + # begin of C to Python bindings + # + + # + # Library initialization / deinitialization + # + + # extern ADDAPI int ADDCALL hackrf_init(); + cls.__libhackrf.hackrf_init.restype = c_int + cls.__libhackrf.hackrf_init.argtypes = [] + + # extern ADDAPI int ADDCALL hackrf_exit(); + cls.__libhackrf.hackrf_exit.restype = c_int + cls.__libhackrf.hackrf_exit.argtypes = [] + + # extern ADDAPI const char* ADDCALL hackrf_library_version(); + cls.__libhackrf.hackrf_library_version.restype = c_char_p + cls.__libhackrf.hackrf_library_version.argtypes = [] + # extern ADDAPI const char* ADDCALL hackrf_library_release(); + cls.__libhackrf.hackrf_library_release.restype = c_char_p + cls.__libhackrf.hackrf_library_release.argtypes = [] + + # extern ADDAPI const char* ADDCALL hackrf_error_name(enum hackrf_error errcode); + cls.__libhackrf.hackrf_error_name.restype = c_char_p + cls.__libhackrf.hackrf_error_name.argtypes = [c_int] + + # extern ADDAPI int ADDCALL hackrf_open(hackrf_device** device); + # purposely not offered as a replacement logic is set-up + + # + # Not implemented yet + # + + # extern ADDAPI int ADDCALL hackrf_max2837_read(hackrf_device* device, uint8_t register_number, uint16_t* value); + # extern ADDAPI int ADDCALL hackrf_max2837_write(hackrf_device* device, uint8_t register_number, uint16_t value); + # extern ADDAPI int ADDCALL hackrf_si5351c_read(hackrf_device* device, uint16_t register_number, uint16_t* value); + # extern ADDAPI int ADDCALL hackrf_si5351c_write(hackrf_device* device, uint16_t register_number, uint16_t value); + # extern ADDAPI int ADDCALL hackrf_rffc5071_read(hackrf_device* device, uint8_t register_number, uint16_t* value); + # extern ADDAPI int ADDCALL hackrf_rffc5071_write(hackrf_device* device, uint8_t register_number, uint16_t value); + # extern ADDAPI int ADDCALL hackrf_spiflash_erase(hackrf_device* device); + # extern ADDAPI int ADDCALL hackrf_spiflash_write(hackrf_device* device, const uint32_t address, const uint16_t length, unsigned char* const data); + # extern ADDAPI int ADDCALL hackrf_spiflash_read(hackrf_device* device, const uint32_t address, const uint16_t length, unsigned char* data); + # extern ADDAPI int ADDCALL hackrf_spiflash_status(hackrf_device* device, uint8_t* data); + # extern ADDAPI int ADDCALL hackrf_spiflash_clear_status(hackrf_device* device); + # extern ADDAPI int ADDCALL hackrf_cpld_write(hackrf_device* device, unsigned char* const data, const unsigned int total_length); + # extern ADDAPI int ADDCALL hackrf_get_operacake_boards(hackrf_device* device, uint8_t* boards); + # extern ADDAPI int ADDCALL hackrf_set_operacake_ports(hackrf_device* device, uint8_t address, uint8_t port_a, uint8_t port_b); + # extern ADDAPI int ADDCALL hackrf_set_operacake_ranges(hackrf_device* device, uint8_t* ranges, uint8_t num_ranges); + # extern ADDAPI int ADDCALL hackrf_operacake_gpio_test(hackrf_device* device, uint8_t address, uint16_t* test_result); + + # + # General low level hardware management + # list, open, close + # + + # extern ADDAPI hackrf_device_list_t* ADDCALL hackrf_device_list(); + cls.__libhackrf.hackrf_device_list.restype = POINTER(hackrf_device_list_t) + cls.__libhackrf.hackrf_device_list.argtypes = [] + + # extern ADDAPI void ADDCALL hackrf_device_list_free(hackrf_device_list_t *list); + cls.__libhackrf.hackrf_device_list_free.restype = None + cls.__libhackrf.hackrf_device_list_free.argtypes = [POINTER(hackrf_device_list_t)] + + # extern ADDAPI int ADDCALL hackrf_open(hackrf_device** device); + cls.__libhackrf.hackrf_open.restype = c_int + cls.__libhackrf.hackrf_open.argtypes = [POINTER(hackrf_device_p)] + + # extern ADDAPI int ADDCALL hackrf_open_by_serial(const char* const desired_serial_number, hackrf_device** device); + cls.__libhackrf.hackrf_open_by_serial.restype = c_int + cls.__libhackrf.hackrf_open_by_serial.arg_types = [c_char_p, POINTER(hackrf_device_p)] + + # extern ADDAPI int ADDCALL hackrf_device_list_open(hackrf_device_list_t *list, int idx, hackrf_device** device); + cls.__libhackrf.hackrf_device_list_open.restype = c_int + cls.__libhackrf.hackrf_device_list_open.arg_types = [POINTER(hackrf_device_list_t), c_int, + POINTER(hackrf_device_p)] + + # extern ADDAPI int ADDCALL hackrf_close(hackrf_device* device); + cls.__libhackrf.hackrf_close.restype = c_int + cls.__libhackrf.hackrf_close.argtypes = [hackrf_device_p] + + # extern ADDAPI int ADDCALL hackrf_reset(hackrf_device* device); + cls.__libhackrf.hackrf_reset.restype = c_int + cls.__libhackrf.hackrf_reset.argtypes = [hackrf_device_p] + + # extern ADDAPI int ADDCALL hackrf_board_id_read(hackrf_device* device, uint8_t* value); + cls.__libhackrf.hackrf_board_id_read.restype = c_int + cls.__libhackrf.hackrf_board_id_read.argtypes = [hackrf_device_p, POINTER(c_uint8)] + + # extern ADDAPI int ADDCALL hackrf_version_string_read(hackrf_device* device, char* version, uint8_t length); + cls.__libhackrf.hackrf_version_string_read.restype = c_int + cls.__libhackrf.hackrf_version_string_read.argtypes = [hackrf_device_p, POINTER(c_char), c_uint8] + + # extern ADDAPI int ADDCALL hackrf_usb_api_version_read(hackrf_device* device, uint16_t* version); + cls.__libhackrf.hackrf_usb_api_version_read.restype = c_int + cls.__libhackrf.hackrf_usb_api_version_read.argtypes = [hackrf_device_p, POINTER(c_uint16)] + + # extern ADDAPI int ADDCALL hackrf_board_partid_serialno_read(hackrf_device* device, read_partid_serialno_t* read_partid_serialno); + cls.__libhackrf.hackrf_board_partid_serialno_read.restype = c_int + cls.__libhackrf.hackrf_board_partid_serialno_read.argtypes = [hackrf_device_p, + POINTER(read_partid_serialno_t)] + + # extern ADDAPI int ADDCALL hackrf_cpld_checksum(hackrf_device* device, uint32_t* crc); + # this is now disabled by default in libhackrf (see hackrf.h line 323) + #cls.__libhackrf.hackrf_cpld_checksum.restype = c_int + #cls.__libhackrf.hackrf_cpld_checksum.argtypes = [hackrf_device_p, POINTER(c_uint32)] + + # extern ADDAPI const char* ADDCALL hackrf_board_id_name(enum hackrf_board_id board_id); + cls.__libhackrf.hackrf_board_id_name.restype = c_char_p + cls.__libhackrf.hackrf_board_id_name.argtypes = [c_int] + # extern ADDAPI const char* ADDCALL hackrf_usb_board_id_name(enum hackrf_usb_board_id usb_board_id); + cls.__libhackrf.hackrf_usb_board_id_name.restype = c_char_p + cls.__libhackrf.hackrf_usb_board_id_name.argtypes = [c_int] + + # extern ADDAPI const char* ADDCALL hackrf_filter_path_name(const enum rf_path_filter path); + cls.__libhackrf.hackrf_filter_path_name.restype = c_char_p + cls.__libhackrf.hackrf_filter_path_name.argtypes = [c_int] + + # extern ADDAPI int ADDCALL hackrf_set_hw_sync_mode(hackrf_device* device, const uint8_t value); + cls.__libhackrf.hackrf_set_hw_sync_mode.restype = c_int + cls.__libhackrf.hackrf_set_hw_sync_mode.argtypes = [hackrf_device_p, c_uint8] + + # extern ADDAPI int ADDCALL hackrf_set_clkout_enable(hackrf_device* device, const uint8_t value); + cls.__libhackrf.hackrf_set_clkout_enable.restype = c_int + cls.__libhackrf.hackrf_set_clkout_enable.argtypes = [hackrf_device_p, c_uint8] + + # + # RF settings + # + # extern ADDAPI int ADDCALL hackrf_set_baseband_filter_bandwidth(hackrf_device* device, const uint32_t bandwidth_hz); + cls.__libhackrf.hackrf_set_baseband_filter_bandwidth.restype = c_int + cls.__libhackrf.hackrf_set_baseband_filter_bandwidth.argtypes = [hackrf_device_p, c_uint32] + + # extern ADDAPI int ADDCALL hackrf_set_freq(hackrf_device* device, const uint64_t freq_hz); + cls.__libhackrf.hackrf_set_freq.restype = c_int + cls.__libhackrf.hackrf_set_freq.argtypes = [hackrf_device_p, c_uint64] + + # extern ADDAPI int ADDCALL hackrf_set_freq_explicit(hackrf_device* device, const uint64_t if_freq_hz, const uint64_t lo_freq_hz, const enum rf_path_filter path); + cls.__libhackrf.hackrf_set_freq_explicit.restype = c_int + cls.__libhackrf.hackrf_set_freq_explicit.argtypes = [hackrf_device_p, c_uint64, c_uint64, c_uint32] + + # extern ADDAPI int ADDCALL hackrf_set_sample_rate_manual(hackrf_device* device, const uint32_t freq_hz, const uint32_t divider); + cls.__libhackrf.hackrf_set_sample_rate_manual.restype = c_int + cls.__libhackrf.hackrf_set_sample_rate_manual.argtypes = [hackrf_device_p, c_uint32, c_uint32] + + # extern ADDAPI int ADDCALL hackrf_set_sample_rate(hackrf_device* device, const double freq_hz); + cls.__libhackrf.hackrf_set_sample_rate.restype = c_int + cls.__libhackrf.hackrf_set_sample_rate.argtypes = [hackrf_device_p, c_double] + + # extern ADDAPI int ADDCALL hackrf_set_lna_gain(hackrf_device* device, uint32_t value); + cls.__libhackrf.hackrf_set_lna_gain.restype = c_int + cls.__libhackrf.hackrf_set_lna_gain.argtypes = [hackrf_device_p, c_uint32] + + # extern ADDAPI int ADDCALL hackrf_set_vga_gain(hackrf_device* device, uint32_t value); + cls.__libhackrf.hackrf_set_vga_gain.restype = c_int + cls.__libhackrf.hackrf_set_vga_gain.argtypes = [hackrf_device_p, c_uint32] + + # extern ADDAPI int ADDCALL hackrf_set_txvga_gain(hackrf_device* device, uint32_t value); + cls.__libhackrf.hackrf_set_txvga_gain.restype = c_int + cls.__libhackrf.hackrf_set_txvga_gain.argtypes = [hackrf_device_p, c_uint32] + + # extern ADDAPI int ADDCALL hackrf_set_amp_enable(hackrf_device* device, const uint8_t value); + cls.__libhackrf.hackrf_set_amp_enable.restype = c_int + cls.__libhackrf.hackrf_set_amp_enable.argtypes = [hackrf_device_p, c_uint8] + + # extern ADDAPI int ADDCALL hackrf_set_antenna_enable(hackrf_device* device, const uint8_t value); + cls.__libhackrf.hackrf_set_antenna_enable.restype = c_int + cls.__libhackrf.hackrf_set_antenna_enable.argtypes = [hackrf_device_p, c_uint8] + + # extern ADDAPI uint32_t ADDCALL hackrf_compute_baseband_filter_bw_round_down_lt(const uint32_t bandwidth_hz); + cls.__libhackrf.hackrf_compute_baseband_filter_bw_round_down_lt.restype = c_int + cls.__libhackrf.hackrf_compute_baseband_filter_bw_round_down_lt.argtypes = [c_uint32] + + # extern ADDAPI uint32_t ADDCALL hackrf_compute_baseband_filter_bw(const uint32_t bandwidth_hz); + cls.__libhackrf.hackrf_compute_baseband_filter_bw.restype = c_int + cls.__libhackrf.hackrf_compute_baseband_filter_bw.argtypes = [c_uint32] + + # + # Transfers management + # + + # extern ADDAPI int ADDCALL hackrf_is_streaming(hackrf_device* device); + cls.__libhackrf.hackrf_is_streaming.restype = c_int + cls.__libhackrf.hackrf_is_streaming.argtypes = [hackrf_device_p] + + # extern ADDAPI int ADDCALL hackrf_start_rx(hackrf_device* device, hackrf_sample_block_cb_fn callback, void* rx_ctx); + cls.__libhackrf.hackrf_start_rx.restype = c_int + cls.__libhackrf.hackrf_start_rx.argtypes = [hackrf_device_p, hackrf_transfer_callback_t, c_void_p] + + # extern ADDAPI int ADDCALL hackrf_start_tx(hackrf_device* device, hackrf_sample_block_cb_fn callback, void* tx_ctx); + cls.__libhackrf.hackrf_start_tx.restype = c_int + cls.__libhackrf.hackrf_start_tx.argtypes = [hackrf_device_p, hackrf_transfer_callback_t, c_void_p] + + # extern ADDAPI int ADDCALL hackrf_stop_rx(hackrf_device* device); + cls.__libhackrf.hackrf_stop_rx.restype = c_int + cls.__libhackrf.hackrf_stop_rx.argtypes = [hackrf_device_p] + + # extern ADDAPI int ADDCALL hackrf_stop_tx(hackrf_device* device); + cls.__libhackrf.hackrf_stop_tx.restype = c_int + cls.__libhackrf.hackrf_stop_tx.argtypes = [hackrf_device_p] + + # extern ADDAPI int ADDCALL hackrf_init_sweep(hackrf_device* device, const uint16_t* frequency_list, const int num_ranges, const uint32_t num_bytes, const uint32_t step_width, const uint32_t offset, const enum sweep_style style); + cls.__libhackrf.hackrf_init_sweep.restype = c_int + cls.__libhackrf.hackrf_init_sweep.argtypes = [hackrf_device_p, POINTER(c_uint16), c_int, c_uint32, c_uint32, + c_uint32, c_uint32] + + # + # end of C to Python bindings + # + + result = cls.__libhackrf.hackrf_init() + + if (result != LibHackRfReturnCode.HACKRF_SUCCESS): + cls.__logger.error( + cls.__name__ + " class initialization failed, error=(%d," + __class__.getHackRfErrorCodeName( + result) + ")", result) + else: + cls.__libraryversion = cls.__libhackrf.hackrf_library_version().decode("UTF-8") + cls.__logger.debug(cls.__name__ + " library version : " + cls.__libraryversion) + cls.__libraryrelease = cls.__libhackrf.hackrf_library_release().decode("UTF-8") + cls.__logger.debug(cls.__name__ + " library release : " + cls.__libraryrelease) + cls.__logger.debug(cls.__name__ + " class initialization successfull") + + else: + __class__.__logger.debug(cls.__name__ + " is already initialized") + return result + + @classmethod + def getInstanceByDeviceHandle(cls, pDevice): + return cls.__openedInstances.get(pDevice, None) + + @classmethod + def getDeviceListPointer(cls): + if (not __class__.initialized()): + __class__.initialize() + + pHackRfDeviceList = cls.__libhackrf.hackrf_device_list() + return pHackRfDeviceList + + @classmethod + def freeDeviceList(cls, pList): + if (not cls.initialized()): + cls.initialize() + + pHackRfDeviceList = cls.__libhackrf.hackrf_device_list_free(pList) + + @classmethod + def getHackRfErrorCodeName(cls, ec): + if (not cls.initialized()): + cls.initialize() + + return cls.__libhackrf.hackrf_error_name(ec).decode("UTF-8") + + @classmethod + def getBoardNameById(cls, bid): + if (not cls.initialized()): + cls.initialize() + + return cls.__libhackrf.hackrf_board_id_name(bid).decode("UTF-8") + + @classmethod + def getUsbBoardNameById(cls, usbbid): + if (not cls.initialized()): + cls.initialize() + + return cls.__libhackrf.hackrf_usb_board_id_name(usbbid).decode("UTF-8") + + @classmethod + def getHackRFFilterPathNameById(cls, rfpid): + if (not cls.initialized()): + cls.initialize() + + return cls.__libhackrf.hackrf_filter_path_name(rfpid).decode("UTF-8") + + @classmethod + def deinitialize(cls): + result = LibHackRfReturnCode.HACKRF_ERROR_OTHER + if (cls.initialized()): + for hackrf in cls.__instances: + hackrf.stop() + + result = cls.__libhackrf.hackrf_exit() + if (result == LibHackRfReturnCode.HACKRF_SUCCESS): + cls.__libhackrf = None + else: + cls.__logger.error( + cls.__name__ + " class deinitialization failed, error=(%d," + __class__.getHackRfErrorCodeName( + result) + ")", result) + + return result + + @classmethod + def getLibraryVersion(cls): + if (not cls.initialized()): + cls.initialize() + + return cls.__libraryversion + + @classmethod + def getLibraryRelease(cls): + if (not cls.initialized()): + cls.initialize() + + return cls.__libraryrelease + + @classmethod + def computeBaseBandFilterBw(cls, bandwidth): + if (not cls.initialized()): + cls.initialize() + + return cls.__libhackrf.hackrf_compute_baseband_filter_bw(bandwidth) + + @classmethod + def computeBaseBandFilterBwRoundDownLt(cls, bandwidth): + if (not cls.initialized()): + cls.initialize() + + return cls.__libhackrf.hackrf_compute_baseband_filter_bw_round_down_lt(bandwidth) + + def opened(self): + return self.__pDevice.value is not None + + def closed(self): + return self.__pDevice.value is None + + def open(self, openarg=-1): + result = LibHackRfReturnCode.HACKRF_ERROR_OTHER + if not self.opened(): + if (isinstance(openarg, int)): + result = self.__openByIndex(openarg) + elif (isinstance(openarg, str)): + result = self.__openBySerial(openarg.lower()) + else: + __class__.__logger.debug("Trying to open an already opened " + __class__.__name__) + if (result == LibHackRfReturnCode.HACKRF_SUCCESS): + __class__.__openedInstances[self.__pDevice.value] = self + return result + + def close(self): + __class__.__logger.debug("Trying to close a " + __class__.__name__) + result = LibHackRfReturnCode.HACKRF_ERROR_OTHER + if self.opened(): + result = __class__.__libhackrf.hackrf_close(self.__pDevice) + if (result != LibHackRfReturnCode.HACKRF_SUCCESS): + __class__.__logger.error( + "Error (%d," + __class__.getHackRfErrorCodeName(result) + ") while closing a " + __class__.__name__, + result) + else: + __class__.__logger.info("Success closing " + __class__.__name__) + __class__.__openedInstances.pop(self.__pDevice.value, None) + self.__pDevice.value = None + self.__boardId = None + self.__usbboardId = None + self.__usbIndex = None + self.__usbAPIVersion = None + self.__boardFwVersionString = None + self.__partId = None + self.__serialNo = None + self.__CPLDcrc = None + self.__txCallback = None + self.__rxCallback = None + self.__transceiverMode = LibHackRfTransceiverMode.TRANSCEIVER_MODE_OFF + self.__hwSyncMode = LibHackRfHwMode.HW_MODE_OFF + self.__clockOutMode = LibHackRfHwMode.HW_MODE_OFF + self.__amplificatorMode = LibHackRfHwMode.HW_MODE_OFF + self.__antennaPowerMode = LibHackRfHwMode.HW_MODE_OFF + self.__crystalppm = 0 + # self.__lnaGain = 0 + # self.__vgaGain = 0 + # self.__txvgaGain = 0 + # self.__basebandFilterBandwidth = 0 + # self.__frequency = 0 + # self.__loFrequency = 0 + # self.__rfFilterPath = LibHackRfPathFilter.RF_PATH_FILTER_BYPASS + + else: + __class__.__logger.debug("Trying to close a non-opened " + __class__.__name__) + return result + + def reset(self): + __class__.__logger.debug("Trying to reset a " + __class__.__name__) + result = LibHackRfReturnCode.HACKRF_ERROR_OTHER + if self.opened(): + result = __class__.__libhackrf.hackrf_reset(self.__pDevice) + else: + __class__.__logger.debug("Trying to reset a non-opened " + __class__.__name__) + return result + + def getBoardSerialNumberString(self, words_separator=''): + if not self.opened(): + __class__.__logger.error( + __class__.__name__ + " getBoardSerialNumberString() has been called on a closed instance") + raise Exception(__class__.__name__ + " getBoardSerialNumberString() has been called on a closed instance") + else: + return ( + "{:08x}" + words_separator + "{:08x}" + words_separator + "{:08x}" + words_separator + "{:08x}").format( + self.__serialNo[0], self.__serialNo[1], self.__serialNo[2], self.__serialNo[3]) + + def getBoardSerialNumber(self): + if not self.opened(): + __class__.__logger.error( + __class__.__name__ + " getBoardSerialNumber() has been called on a closed instance") + raise Exception(__class__.__name__ + " getBoardSerialNumber() has been called on a closed instance") + else: + return self.__serialNo + + def __readBoardSerialNumber(self): + # Board SerialNo and PartID + serinfo = read_partid_serialno_t((-1, -1), (-1, -1, -1, -1)) + result = __class__.__libhackrf.hackrf_board_partid_serialno_read(self.__pDevice, byref(serinfo)) + if (result != LibHackRfReturnCode.HACKRF_SUCCESS): + __class__.__logger.error( + "Error (%d," + __class__.getHackRfErrorCodeName(result) + ") on hackrf_board_partid_serialno_read", + result) + else: + self.__partId = (serinfo.part_id[0], serinfo.part_id[1]) + __class__.__logger.debug( + __class__.__name__ + " opened board part id : " + "{:08x}:{:08x}".format(self.__partId[0], + self.__partId[1])) + self.__serialNo = (serinfo.serial_no[0], serinfo.serial_no[1], serinfo.serial_no[2], serinfo.serial_no[3]) + __class__.__logger.debug( + __class__.__name__ + " opened board serial number : " + self.getBoardSerialNumberString(':')) + + def __openByIndex(self, deviceindex): + result = LibHackRfReturnCode.HACKRF_ERROR_OTHER + + pHDL = __class__.getDeviceListPointer() + + if (deviceindex == -1): + __class__.__logger.debug("Try to open first available HackRF") + __class__.__logger.debug("%d devices detected", pHDL.contents.devicecount) + for index in range(0, pHDL.contents.devicecount): + __class__.__logger.debug("trying to open device index %d", index) + result = self.open(index) + if (result == LibHackRfReturnCode.HACKRF_SUCCESS): + break + else: + __class__.__logger.debug("tested hackrf not available") + + else: + __class__.__logger.debug("Trying to open HackRF with index=%d", deviceindex) + + result = __class__.__libhackrf.hackrf_device_list_open(pHDL, deviceindex, byref(self.__pDevice)) + if (result != LibHackRfReturnCode.HACKRF_SUCCESS): + __class__.__logger.error("Error (%d," + __class__.getHackRfErrorCodeName( + result) + ") while opening " + __class__.__name__ + " with index=%d", result, deviceindex) + else: + self.__readBoardSerialNumber() + self.__usbboardId = pHDL.contents.usb_board_ids[deviceindex] + self.__usbIndex = pHDL.contents.usb_device_index[deviceindex] + self.__readBoardInfos() + __class__.__logger.info("Success opening " + __class__.__name__) + + __class__.freeDeviceList(pHDL) + return result + + def __openBySerial(self, deviceserial): + __class__.__logger.debug("Trying to open a HackRF by serial number: " + deviceserial) + result = LibHackRfReturnCode.HACKRF_ERROR_OTHER + result = __class__.__libhackrf.hackrf_open_by_serial(c_char_p(deviceserial.encode("UTF-8")), + byref(self.__pDevice)) + if (result != LibHackRfReturnCode.HACKRF_SUCCESS): + __class__.__logger.error("Error (%d," + __class__.getHackRfErrorCodeName( + result) + ") while opening " + __class__.__name__ + " with serial number=" + deviceserial, result) + else: + self.__readBoardSerialNumber() + pHDL = __class__.getDeviceListPointer() + for deviceindex in range(0, pHDL.contents.devicecount): + if pHDL.contents.serial_numbers[deviceindex].decode("UTF-8") == self.getBoardSerialNumberString(): + self.__usbboardId = pHDL.contents.usb_board_ids[deviceindex] + self.__usbIndex = pHDL.contents.usb_device_index[deviceindex] + break; + __class__.freeDeviceList(pHDL) + self.__readBoardInfos() + __class__.__logger.info("Success opening " + __class__.__name__) + + return result + + def __readBoardInfos(self): + if not self.opened(): + __class__.__logger.error(__class__.__name__ + " __readBoardInfos() has been called on a closed instance") + else: + # Board Id + bId = c_uint8(0) + result = __class__.__libhackrf.hackrf_board_id_read(self.__pDevice, byref(bId)) + if (result != LibHackRfReturnCode.HACKRF_SUCCESS): + __class__.__logger.error( + "Error (%d," + __class__.getHackRfErrorCodeName(result) + ") on hackrf_board_id_read", result) + else: + self.__boardId = LibHackRfBoardIds(bId.value) + __class__.__logger.debug( + __class__.__name__ + " opened board id : %d, " + self.__boardId.name + ", " + __class__.getBoardNameById( + self.__boardId), self.__boardId.value) + __class__.__logger.debug(__class__.__name__ + " opened usbboard id : " + "{:04x}, ".format( + self.__usbboardId) + __class__.getUsbBoardNameById(self.__usbboardId)) + + # Board Firmware Version + bfwversion_size = 128 + bfwversion = (c_char * bfwversion_size)() + result = __class__.__libhackrf.hackrf_version_string_read(self.__pDevice, bfwversion, bfwversion_size) + if (result != LibHackRfReturnCode.HACKRF_SUCCESS): + __class__.__logger.error( + "Error (%d," + __class__.getHackRfErrorCodeName(result) + ") on hackrf_version_string_read", result) + else: + self.__boardFwVersionString = bfwversion.value.decode("UTF-8") + __class__.__logger.debug( + __class__.__name__ + " opened board firmware version : " + self.__boardFwVersionString) + + # Board USB API version + bUSB_API_ver = c_uint16(0) + result = __class__.__libhackrf.hackrf_usb_api_version_read(self.__pDevice, byref(bUSB_API_ver)) + if (result != LibHackRfReturnCode.HACKRF_SUCCESS): + __class__.__logger.error( + "Error (%d," + __class__.getHackRfErrorCodeName(result) + ") on hackrf_usb_api_version_read", + result) + else: + self.__usbAPIVersion = bUSB_API_ver.value + __class__.__logger.debug( + __class__.__name__ + " opened board USB API version : " + "{:02x}:{:02x}".format( + self.__usbAPIVersion >> 8, self.__usbAPIVersion & 0xFF)) + + # Board CLPD checksum + #cpld_checsum = c_uint32(-1) + #result = __class__.__libhackrf.hackrf_cpld_checksum(self.__pDevice, byref(cpld_checsum)) + #if (result != LibHackRfReturnCode.HACKRF_SUCCESS): + # __class__.__logger.error( + # "Error (%d," + __class__.getHackRfErrorCodeName(result) + ") on hackrf_cpld_checksum", result) + #else: + # self.__CPLDcrc = cpld_checsum.value + # __class__.__logger.debug( + # __class__.__name__ + " opened board CPLD checksum : " + "{:08x}".format(self.__CPLDcrc)) + + def printBoardInfos(self): + if not self.opened(): + print(__class__.__name__ + " is closed and informations cannot be displayed") + else: + print(__class__.__name__ + " board id : " + "{:d}".format( + self.__boardId.value) + ", " + self.__boardId.name) + print(__class__.__name__ + " board name : " + __class__.getBoardNameById(self.__boardId)) + print(__class__.__name__ + " board USB id : " + "0x{:04x}".format( + self.__usbboardId) + ", " + __class__.getUsbBoardNameById(self.__usbboardId)) + print(__class__.__name__ + " board USB index : " + "0x{:04x}".format(self.__usbIndex)) + print(__class__.__name__ + " board USB API : " + "{:02x}:{:02x}".format(self.__usbAPIVersion >> 8, + self.__usbAPIVersion & 0xFF)) + print(__class__.__name__ + " board firmware : " + self.__boardFwVersionString) + print(__class__.__name__ + " board part id : " + "{:08x}:{:08x}".format(self.__partId[0], + self.__partId[1])) + print(__class__.__name__ + " board part id : " + self.getBoardSerialNumberString(':')) + #print(__class__.__name__ + " board CPLD checksum : " + "0x{:08x}".format(self.__CPLDcrc)) + + def stop(self): + # TODO : implement transfer stopping logics ? + self.close() + + def setHwSyncMode(self, mode): + __class__.__logger.debug(__class__.__name__ + " Trying to set HwSyncMode") + result = LibHackRfReturnCode.HACKRF_ERROR_OTHER + if self.opened(): + result = __class__.__libhackrf.hackrf_set_hw_sync_mode(self.__pDevice, c_uint8(LibHackRfHwMode(mode).value)) + if (result == LibHackRfReturnCode.HACKRF_SUCCESS): + self.__hwSyncMode = mode + else: + __class__.__logger.debug("Trying to set HwSyncMode for non-opened " + __class__.__name__) + return result + + def getHwSyncMode(self): + return self.__hwSyncMode + + def setClkOutMode(self, mode): + __class__.__logger.debug(__class__.__name__ + " Trying to set ClkOutMode") + result = LibHackRfReturnCode.HACKRF_ERROR_OTHER + if self.opened(): + result = __class__.__libhackrf.hackrf_set_clkout_enable(self.__pDevice, + c_uint8(LibHackRfHwMode(mode).value)) + if (result == LibHackRfReturnCode.HACKRF_SUCCESS): + self.__clockOutMode = mode + else: + __class__.__logger.debug("Trying to set ClkOutMode for non-opened " + __class__.__name__) + return result + + def getClkOutMode(self): + return self.__clockOutMode + + def setAmplifierMode(self, mode): + __class__.__logger.debug(__class__.__name__ + " Trying to set AmplifierMode") + result = LibHackRfReturnCode.HACKRF_ERROR_OTHER + if self.opened(): + result = __class__.__libhackrf.hackrf_set_amp_enable(self.__pDevice, c_uint8(LibHackRfHwMode(mode).value)) + if (result == LibHackRfReturnCode.HACKRF_SUCCESS): + self.__amplificatorMode = mode + else: + __class__.__logger.debug("Trying to set AmplifierMode for non-opened " + __class__.__name__) + return result + + def getAmplifierMode(self): + return self.__amplificatorMode + + def setAntennaPowerMode(self, mode): + __class__.__logger.debug(__class__.__name__ + " Trying to set AntennaPowerMode") + result = LibHackRfReturnCode.HACKRF_ERROR_OTHER + if self.opened(): + result = __class__.__libhackrf.hackrf_set_antenna_enable(self.__pDevice, + c_uint8(LibHackRfHwMode(mode).value)) + if (result == LibHackRfReturnCode.HACKRF_SUCCESS): + self.__antennaPowerMode = mode + else: + __class__.__logger.debug("Trying to set AntennaPowerMode for non-opened " + __class__.__name__) + return result + + def getAntennaPowerMode(self): + return self.__antennaPowerMode + + def isStreaming(self): + __class__.__logger.debug(__class__.__name__ + " Trying to call isStreaming") + if self.opened() and self.getTransceiverMode() != LibHackRfTransceiverMode.TRANSCEIVER_MODE_OFF: + return __class__.__libhackrf.hackrf_is_streaming(self.__pDevice) == LibHackRfReturnCode.HACKRF_TRUE + #else: + #print("isStreaming corner case") + #__class__.__logger.debug( + # "Trying to call isStreaming for non-opened or non transmitting " + __class__.__name__) + #return False + + def stopRX(self): + __class__.__logger.debug(__class__.__name__ + " Trying to stop RX") + result = LibHackRfReturnCode.HACKRF_ERROR_OTHER + if self.opened() and self.getTransceiverMode() != LibHackRfTransceiverMode.TRANSCEIVER_MODE_OFF: + result = __class__.__libhackrf.hackrf_stop_rx(self.__pDevice) + if (result == LibHackRfReturnCode.HACKRF_SUCCESS): + __class__.__logger.info("Success stopping RX") + self.__transceiverMode = LibHackRfTransceiverMode.TRANSCEIVER_MODE_OFF + else: + __class__.__logger.error( + "Error (%d," + __class__.getHackRfErrorCodeName(result) + ") while stopping RX ", result) + else: + __class__.__logger.debug("Trying to stop RX for non-opened or non transmitting " + __class__.__name__) + return result + + def stopTX(self): + __class__.__logger.debug(__class__.__name__ + " Trying to stop TX") + result = LibHackRfReturnCode.HACKRF_ERROR_OTHER + if self.opened() and self.getTransceiverMode() != LibHackRfTransceiverMode.TRANSCEIVER_MODE_OFF: + result = __class__.__libhackrf.hackrf_stop_tx(self.__pDevice) + if (result == LibHackRfReturnCode.HACKRF_SUCCESS): + __class__.__logger.info("Success stopping TX") + self.__transceiverMode = LibHackRfTransceiverMode.TRANSCEIVER_MODE_OFF + else: + __class__.__logger.error( + "Error (%d," + __class__.getHackRfErrorCodeName(result) + ") while stopping TX ", result) + else: + __class__.__logger.debug("Trying to stop TX for non-opened or non transmitting " + __class__.__name__) + return result + + def startRX(self, callback, rx_context): + __class__.__logger.debug(__class__.__name__ + " Trying to start RX") + result = LibHackRfReturnCode.HACKRF_ERROR_OTHER + if self.opened() and self.getTransceiverMode() == LibHackRfTransceiverMode.TRANSCEIVER_MODE_OFF: + self.__rxCallback = hackrf_transfer_callback_t(callback) + if rx_context is None: + result = __class__.__libhackrf.hackrf_start_rx(self.__pDevice, self.__rxCallback, + None) + else: + result = __class__.__libhackrf.hackrf_start_rx(self.__pDevice, self.__rxCallback, + byref(rx_context)) + if (result == LibHackRfReturnCode.HACKRF_SUCCESS): + __class__.__logger.info("Success starting RX") + self.__transceiverMode = LibHackRfTransceiverMode.TRANSCEIVER_MODE_RX + else: + __class__.__logger.error( + "Error (%d," + __class__.getHackRfErrorCodeName(result) + ") while starting RX ", result) + else: + __class__.__logger.debug("Trying to start RX for non-opened or in transmission " + __class__.__name__) + return result + + def startTX(self, callback, tx_context): + __class__.__logger.debug(__class__.__name__ + " Trying to start TX") + result = LibHackRfReturnCode.HACKRF_ERROR_OTHER + if self.opened() and self.getTransceiverMode() == LibHackRfTransceiverMode.TRANSCEIVER_MODE_OFF: + self.__txCallback = hackrf_transfer_callback_t(callback) + if tx_context is None: + result = __class__.__libhackrf.hackrf_start_tx(self.__pDevice, self.__txCallback, + None) + else: + result = __class__.__libhackrf.hackrf_start_tx(self.__pDevice, self.__txCallback, + byref(tx_context)) + if (result == LibHackRfReturnCode.HACKRF_SUCCESS): + __class__.__logger.info("Success starting TX") + self.__transceiverMode = LibHackRfTransceiverMode.TRANSCEIVER_MODE_TX + else: + __class__.__logger.error( + "Error (%d," + __class__.getHackRfErrorCodeName(result) + ") while starting TX ", result) + else: + __class__.__logger.debug("Trying to start TX for non-opened or in transmission " + __class__.__name__) + return result + + def getTransceiverMode(self): + return self.__transceiverMode + + def setLNAGain(self, gain): + __class__.__logger.debug(__class__.__name__ + " Trying to set LNA gain") + result = LibHackRfReturnCode.HACKRF_ERROR_OTHER + if self.opened(): + result = __class__.__libhackrf.hackrf_set_lna_gain(self.__pDevice, gain) + # if (result == LibHackRfReturnCode.HACKRF_SUCCESS): + # self.__lnaGain = gain + else: + __class__.__logger.debug("Trying to set LNA gain for non-opened " + __class__.__name__) + return result + + # def getLNAGain(self): + # return self.__lnaGain + + def setVGAGain(self, gain): + __class__.__logger.debug(__class__.__name__ + " Trying to set VGA gain") + result = LibHackRfReturnCode.HACKRF_ERROR_OTHER + if self.opened(): + result = __class__.__libhackrf.hackrf_set_vga_gain(self.__pDevice, gain) + # if (result == LibHackRfReturnCode.HACKRF_SUCCESS): + # self.__vgaGain = gain + else: + __class__.__logger.debug("Trying to set VGA gain for non-opened " + __class__.__name__) + return result + + # def getVGAGain(self): + # return self.__vgaGain + + def setTXVGAGain(self, gain): + __class__.__logger.debug(__class__.__name__ + " Trying to set TX VGA gain") + result = LibHackRfReturnCode.HACKRF_ERROR_OTHER + if self.opened(): + result = __class__.__libhackrf.hackrf_set_txvga_gain(self.__pDevice, gain) + # if (result == LibHackRfReturnCode.HACKRF_SUCCESS): + # self.__txvgaGain = gain + else: + __class__.__logger.debug("Trying to set TX VGA gain for non-opened " + __class__.__name__) + return result + + # def getTXVGAGain(self): + # return self.__txvgaGain + + def setBasebandFilterBandwidth(self, bandwidth): + __class__.__logger.debug(__class__.__name__ + " Trying to set baseband filter bandwidth") + result = LibHackRfReturnCode.HACKRF_ERROR_OTHER + if self.opened(): + result = __class__.__libhackrf.hackrf_set_baseband_filter_bandwidth(self.__pDevice, bandwidth) + # if (result == LibHackRfReturnCode.HACKRF_SUCCESS): + # self.__basebandFilterBandwidth = bandwidth + else: + __class__.__logger.debug("Trying to set baseband filter bandwidth " + __class__.__name__) + return result + + # def getBasebandFilterBandwidth(self): + # return self.__basebandFilterBandwidth + + def setFrequency(self, frequency): + __class__.__logger.debug(__class__.__name__ + " Trying to set frequency") + result = LibHackRfReturnCode.HACKRF_ERROR_OTHER + if self.opened(): + result = __class__.__libhackrf.hackrf_set_freq(self.__pDevice, self.__correctFrequency(frequency)) + # if (result == LibHackRfReturnCode.HACKRF_SUCCESS): + # self.__frequency = frequency + else: + __class__.__logger.debug("Trying to set frequency " + __class__.__name__) + return result + + def __correctFrequency(self, frequency): + return int(frequency * (1.0 - (self.__crystalppm / 1000000.0))) + + def __correctSampleRate(self, samplerate): + # + # Not sure why the +0.5 is there. I copied it from hackrf_transfer + # equivalent source code but this is probably not necessary, especially + # because there is already a +0.5 done in hackrf.c hackrf_set_sample_rate + # + return int(samplerate * (1.0 - (self.__crystalppm / 1000000.0)) + 0.5) + + # def getFrequency(self): + # return self.__frequency + + def setFrequencyExplicit(self, if_frequency, lo_frequency, rf_path): + __class__.__logger.debug(__class__.__name__ + " Trying to set frequency with details") + result = LibHackRfReturnCode.HACKRF_ERROR_OTHER + if self.opened(): + result = __class__.__libhackrf.hackrf_set_freq_explicit(self.__pDevice, + self.__correctFrequency(if_frequency), + self.__correctFrequency(lo_frequency), + LibHackRfPathFilter(rf_path).value) + # if (result == LibHackRfReturnCode.HACKRF_SUCCESS): + # self.__ifFrequency = if_frequency + # self.__loFrequency = lo_frequency + # self.__rfFilterPath = LibHackRfPathFilter(rf_path) + else: + __class__.__logger.debug("Trying to set frequency with details " + __class__.__name__) + return result + + # def getIntermediateFrequency(self): + # return self.__ifFrequency + + # def getLocalOscillatorFrequency(self): + # return self.__loFrequency + + # def getRfFilterPath(self): + # return self.__rfFilterPath + + # + # This method should be called before setting frequency or baseband as in state + # it acts by modifying the values passed to libhackrf functions + # + def setCrystalPPM(self, ppm): + __class__.__logger.debug("This method must be called before setting frequency or samplerate") + self.__crystalppm = ppm + + def getCrystalPPM(self): + return self.__crystalppm + + def setSampleRate(self, samplerate): + __class__.__logger.debug(__class__.__name__ + " Trying to set samplerate") + result = LibHackRfReturnCode.HACKRF_ERROR_OTHER + if self.opened(): + result = __class__.__libhackrf.hackrf_set_sample_rate(self.__pDevice, self.__correctSampleRate(samplerate)) + # if (result == LibHackRfReturnCode.HACKRF_SUCCESS): + # self.__sampleRate = samplerate + else: + __class__.__logger.debug("Trying to set samplerate " + __class__.__name__) + return result + + def setSampleRateManual(self, samplerate, divider): + __class__.__logger.debug(__class__.__name__ + " Trying to set samplerate") + result = LibHackRfReturnCode.HACKRF_ERROR_OTHER + if self.opened(): + result = __class__.__libhackrf.hackrf_set_sample_rate_manual(self.__pDevice, + self.__correctSampleRate(samplerate), divider) + # if (result == LibHackRfReturnCode.HACKRF_SUCCESS): + # self.__sampleRate = samplerate + else: + __class__.__logger.debug("Trying to set samplerate " + __class__.__name__) + return result From dc980ecebb7c4f6c0094eebb45f2661536fc762f Mon Sep 17 00:00:00 2001 From: Anton Chua Date: Thu, 21 Sep 2023 11:59:46 +0800 Subject: [PATCH 22/22] Minor syntax fixes --- FlightPathSimulator.py | 2 +- feed1090/para_start.py | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/FlightPathSimulator.py b/FlightPathSimulator.py index c5e309a..999a31c 100644 --- a/FlightPathSimulator.py +++ b/FlightPathSimulator.py @@ -37,7 +37,7 @@ def get_point_at_distance(lat1, lon1, d, bearing, R=6371): sin(a) * sin(d/R) * cos(lat1), cos(d/R) - sin(lat1) * sin(lat2) ) - return (degrees(lat2), degrees(lon2),) + return (degrees(lat2), degrees(lon2)) class FlightPathSimulator(AbstractTrajectorySimulatorBase): def __init__(self,mutex,broadcast_thread,aircraftinfos,waypoints_file,logfile,duration): diff --git a/feed1090/para_start.py b/feed1090/para_start.py index dafdaa0..f541c8f 100644 --- a/feed1090/para_start.py +++ b/feed1090/para_start.py @@ -10,7 +10,7 @@ pi_ip = '100.81.91.96' pi_user = "pi" pi_password = "raspberry" -local_user = 'anton' +local_user = os.getenv("USERNAME") dateString = time.strftime('%d-%m-%Y') """ @@ -103,9 +103,9 @@ def log_sync(): copyFile = f'''sshpass -p {pi_password} scp {pi_user}@{pi_ip}:/home/pi/log1090/{logPullString} /home/{local_user}/ais/ais/static/adsb/{dateString}/feed1090.json''' Popen(copyFile, shell=True, stdout=PIPE, stderr=PIPE, text=True) # JSON format fixing - time.sleep(4) - if os.path.isfile(filePath): - fix_log() + #time.sleep(4) + #if os.path.isfile(filePath): + # fix_log() SyncedAt = time.strftime('[%H-%M-%S] '+dateString) ic(SyncedAt) except Exception as e: @@ -135,6 +135,5 @@ def main(): while True: log_sync() time.sleep(8) - - + main()