|
|
import pandas as pd
|
|
|
import numpy as np
|
|
|
|
|
|
def generate_adsb_test_data(normal_count=120, attack_count=80):
|
|
|
"""
|
|
|
生成ADS-B测试数据
|
|
|
normal_count: 正常数据条数
|
|
|
attack_count: 攻击数据条数
|
|
|
"""
|
|
|
data = []
|
|
|
|
|
|
# ====================== 1. 生成正常飞行数据 ======================
|
|
|
# 模拟几架真实飞机的ICAO地址
|
|
|
normal_icaos = ["a1b2c3", "d4e5f6", "789abc", "def012"]
|
|
|
|
|
|
base_time = 1656292550 # 起始时间戳
|
|
|
|
|
|
for i in range(normal_count):
|
|
|
icao = np.random.choice(normal_icaos)
|
|
|
time = base_time + i * 2 # 每2秒一条数据
|
|
|
|
|
|
# 正常的经纬度:缓慢变化
|
|
|
lat = 40.0 + np.random.normal(0, 0.01) + (i * 0.001)
|
|
|
lon = -90.0 + np.random.normal(0, 0.01) + (i * 0.001)
|
|
|
|
|
|
# 正常的航向:0-360度,缓慢变化
|
|
|
heading = 180 + np.random.normal(0, 5)
|
|
|
|
|
|
# 正常的速度:200-300节
|
|
|
velocity = 250 + np.random.normal(0, 10)
|
|
|
|
|
|
# 正常的高度:10000米左右
|
|
|
baroaltitude = 10000 + np.random.normal(0, 50)
|
|
|
geoaltitude = baroaltitude + 100 + np.random.normal(0, 20)
|
|
|
|
|
|
label = 0 # 正常
|
|
|
|
|
|
data.append([icao, time, lat, lon, heading, velocity, baroaltitude, geoaltitude, label])
|
|
|
|
|
|
# ====================== 2. 生成攻击数据 ======================
|
|
|
attack_icaos = ["fake01", "ghost02", "attack03"]
|
|
|
|
|
|
for i in range(attack_count):
|
|
|
icao = np.random.choice(attack_icaos)
|
|
|
time = base_time + (normal_count + i) * 2
|
|
|
|
|
|
# 随机选择一种攻击类型
|
|
|
attack_type = np.random.choice(["speed", "altitude", "position", "ghost"])
|
|
|
|
|
|
if attack_type == "speed":
|
|
|
# 攻击1:速度异常(突然变得极快或极慢)
|
|
|
lat = 40.0 + np.random.normal(0, 0.01)
|
|
|
lon = -90.0 + np.random.normal(0, 0.01)
|
|
|
heading = 180
|
|
|
velocity = np.random.choice([50, 500]) # 要么极慢,要么极快
|
|
|
baroaltitude = 10000
|
|
|
geoaltitude = 10100
|
|
|
|
|
|
elif attack_type == "altitude":
|
|
|
# 攻击2:高度异常(突然跳到0或极高)
|
|
|
lat = 40.0 + np.random.normal(0, 0.01)
|
|
|
lon = -90.0 + np.random.normal(0, 0.01)
|
|
|
heading = 180
|
|
|
velocity = 250
|
|
|
baroaltitude = np.random.choice([0, 20000]) # 要么0,要么2万米
|
|
|
geoaltitude = baroaltitude
|
|
|
|
|
|
elif attack_type == "position":
|
|
|
# 攻击3:位置异常(经纬度突然跳变)
|
|
|
lat = np.random.uniform(-90, 90) # 随机全球位置
|
|
|
lon = np.random.uniform(-180, 180)
|
|
|
heading = 180
|
|
|
velocity = 250
|
|
|
baroaltitude = 10000
|
|
|
geoaltitude = 10100
|
|
|
|
|
|
else:
|
|
|
# 攻击4:幽灵飞机(所有参数都不合理)
|
|
|
lat = 0.0
|
|
|
lon = 0.0
|
|
|
heading = 999 # 不合理的航向
|
|
|
velocity = 1000 # 超音速
|
|
|
baroaltitude = 50000 # 不可能的高度
|
|
|
geoaltitude = 50000
|
|
|
|
|
|
label = 1 # 攻击
|
|
|
data.append([icao, time, lat, lon, heading, velocity, baroaltitude, geoaltitude, label])
|
|
|
|
|
|
# ====================== 3. 打乱并保存 ======================
|
|
|
df = pd.DataFrame(data, columns=[
|
|
|
"icao24", "time", "lat", "lon", "heading",
|
|
|
"velocity", "baroaltitude", "geoaltitude", "label"
|
|
|
])
|
|
|
|
|
|
# 打乱顺序,让正常和攻击混在一起
|
|
|
df = df.sample(frac=1).reset_index(drop=True)
|
|
|
|
|
|
# 保存为CSV
|
|
|
output_file = "test_adsb_data.csv"
|
|
|
df.to_csv(output_file, index=False)
|
|
|
print(f"✅ 测试数据生成成功!")
|
|
|
print(f" 文件:{output_file}")
|
|
|
print(f" 总数据:{len(df)} 条")
|
|
|
print(f" 正常数据:{len(df[df['label']==0])} 条")
|
|
|
print(f" 攻击数据:{len(df[df['label']==1])} 条")
|
|
|
print(f"\n现在你可以上传 {output_file} 到你的系统测试了!")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
generate_adsb_test_data(normal_count=120, attack_count=80) |