package main import ( "log" "os" "os/signal" "syscall" "time" ) // dockSpec 描述机巢及其直接模拟上报的绑定无人机。 type dockSpec struct { DockID string Name string Location string DroneSN string DroneName string Latitude float64 Longitude float64 DroneLat float64 DroneLon float64 Flying bool Battery int Alarm bool } func main() { broker := envOr("MOCK_MQTT_BROKER", "tcp://127.0.0.1:1883") username := envOr("MOCK_MQTT_USERNAME", "laic") password := envOr("MOCK_MQTT_PASSWORD", "") specs := []dockSpec{ { DockID: "dock-1", Name: "青山湖 01 号机巢", Location: "青山湖科技城 A 区", DroneSN: "JG-UAV-001", DroneName: "巡检无人机 001", Latitude: 30.262438, Longitude: 119.802631, DroneLat: 30.262438, DroneLon: 119.802631, Battery: 86, }, { DockID: "dock-2", Name: "青山湖 02 号机巢", Location: "青山湖科技城 B 区", DroneSN: "JG-UAV-002", DroneName: "巡检无人机 002", Latitude: 30.255917, Longitude: 119.818264, DroneLat: 30.256500, DroneLon: 119.818900, Flying: true, Battery: 72, }, { DockID: "dock-3", Name: "青山湖 03 号机巢", Location: "青山湖科技城 C 区", DroneSN: "JG-UAV-003", DroneName: "巡检无人机 003", Latitude: 30.248610, Longitude: 119.791450, DroneLat: 30.248610, DroneLon: 119.791450, Battery: 41, Alarm: true, }, } for _, spec := range specs { dock := newMockDock(spec) if err := dock.start(broker, username, password); err != nil { log.Fatalf("启动机巢 %s 失败: %v", spec.DockID, err) } } log.Println("模拟设备已启动(机巢 MQTT 直接上报机巢与无人机数据),按 Ctrl+C 退出") quit := make(chan os.Signal, 1) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) <-quit log.Println("正在退出...") time.Sleep(200 * time.Millisecond) } func envOr(key, def string) string { if v := os.Getenv(key); v != "" { return v } return def }