diff --git a/bbit_ai/app/routers/Iot.py b/bbit_ai/app/routers/Iot.py index 51924f4..3804398 100644 --- a/bbit_ai/app/routers/Iot.py +++ b/bbit_ai/app/routers/Iot.py @@ -258,7 +258,6 @@ def updateGetMaxCodeByDeptId( def getUploadUrl( deviceID: str | None = None, ): - # 生成唯一文件名,避免覆盖 return BaseResponse(data=get_update_package(deviceID)) diff --git a/sentinel/.idea/dictionaries/project.xml b/sentinel/.idea/dictionaries/project.xml index 0cad634..42156b6 100644 --- a/sentinel/.idea/dictionaries/project.xml +++ b/sentinel/.idea/dictionaries/project.xml @@ -1,6 +1,7 @@ + linux 从海康sdk获取图片以及信息 diff --git a/sentinel/.idea/sentinel.iml b/sentinel/.idea/sentinel.iml index 5e764c4..2848ab9 100644 --- a/sentinel/.idea/sentinel.iml +++ b/sentinel/.idea/sentinel.iml @@ -1,6 +1,12 @@ - + + + + diff --git a/sentinel/bin/main.exe b/sentinel/bin/main.exe deleted file mode 100644 index 6785d53..0000000 Binary files a/sentinel/bin/main.exe and /dev/null differ diff --git a/sentinel/bin/tmp/licensePlateImage_test1.jpg b/sentinel/bin/tmp/licensePlateImage_test1.jpg deleted file mode 100644 index aa0fd72..0000000 Binary files a/sentinel/bin/tmp/licensePlateImage_test1.jpg and /dev/null differ diff --git a/sentinel/bin/tmp/old_app/main_1.bak b/sentinel/bin/tmp/old_app/main_1.bak deleted file mode 100644 index 6785d53..0000000 Binary files a/sentinel/bin/tmp/old_app/main_1.bak and /dev/null differ diff --git a/sentinel/bin/tmp/vehicleImage_test1.jpg b/sentinel/bin/tmp/vehicleImage_test1.jpg deleted file mode 100644 index 7b7046a..0000000 Binary files a/sentinel/bin/tmp/vehicleImage_test1.jpg and /dev/null differ diff --git a/sentinel/bin/updater.exe b/sentinel/bin/updater.exe deleted file mode 100644 index fe65104..0000000 Binary files a/sentinel/bin/updater.exe and /dev/null differ diff --git a/sentinel/build_all.ps1 b/sentinel/build_all.ps1 new file mode 100644 index 0000000..df279d4 --- /dev/null +++ b/sentinel/build_all.ps1 @@ -0,0 +1,44 @@ +# build_all.ps1 +# 一键打包 main 和 updater,三平台: Windows 64, Linux amd64, Linux arm64 + +# ------------------------- +# 项目根目录 +$RootDir = Split-Path -Parent $MyInvocation.MyCommand.Definition +Set-Location $RootDir + +# ------------------------- +# 定义要打包的平台 +$targets = @( + @{ OS="windows"; ARCH="amd64"; Dir="build/win"; MainOut="main.exe"; UpdaterOut="updater.exe" }, + @{ OS="linux"; ARCH="amd64"; Dir="build/linux_amd64"; MainOut="main"; UpdaterOut="updater" }, + @{ OS="linux"; ARCH="arm64"; Dir="build/linux_arm64"; MainOut="main"; UpdaterOut="updater" } +) + +# ------------------------- +# 循环打包 +foreach ($t in $targets) { + Write-Host "=== Build $($t.OS)-$($t.ARCH) Version ===" + + # 设置环境变量 + $env:GOOS = $t.OS + $env:GOARCH = $t.ARCH + $env:CGO_ENABLED = "0" + + # 创建输出目录 + if (!(Test-Path $t.Dir)) { + New-Item -ItemType Directory -Path $t.Dir | Out-Null + } + + # 编译 main + Write-Host "Building main..." + go build -ldflags="-s -w" -o "$($t.Dir)/$($t.MainOut)" ./main + + # 编译 updater + Write-Host "Building updater..." + go build -ldflags="-s -w" -o "$($t.Dir)/$($t.UpdaterOut)" ./updater + + Write-Host "$($t.OS)-$($t.ARCH) Build complete, Output dir: $($t.Dir)" + Write-Host "" +} + +Write-Host "All builds finished." diff --git a/sentinel/main.exe1024276949 b/sentinel/main.exe1024276949 deleted file mode 100644 index 4fd5691..0000000 Binary files a/sentinel/main.exe1024276949 and /dev/null differ diff --git a/sentinel/main.exe519136910 b/sentinel/main.exe519136910 deleted file mode 100644 index 4fd5691..0000000 Binary files a/sentinel/main.exe519136910 and /dev/null differ diff --git a/sentinel/main/business_service.go b/sentinel/main/business_service.go index b29b9c2..0292456 100644 --- a/sentinel/main/business_service.go +++ b/sentinel/main/business_service.go @@ -4,13 +4,11 @@ import ( "encoding/json" "os" "os/exec" - "runtime" "sentinel/pkg/config" "sentinel/pkg/log" model2 "sentinel/pkg/model" "sentinel/pkg/utils" "strconv" - "syscall" "time" ) @@ -154,38 +152,58 @@ func (b *BusinessService) handleRestart() { _ = cmd.Start() os.Exit(0) } - -// handleCheckUpdate 触发更新流程(主程序侧) func (b *BusinessService) handleCheckUpdate() { args := []string{ "--version", strconv.Itoa(config.APP_VERSION), } - cmd := exec.Command("./updater.exe", args...) - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr + launcher := newUpdaterLauncher() - // OS 级脱离父进程 - switch runtime.GOOS { - case "windows": - cmd.SysProcAttr = &syscall.SysProcAttr{ - CreationFlags: syscall.CREATE_NEW_PROCESS_GROUP, - } - } - - if err := cmd.Start(); err != nil { + if err := launcher.Start(args); err != nil { log.Println("[BUS] failed to start updater:", err) return } log.Println( - "[BUS] updater started (pid=%d), exiting main program\n", - cmd.Process.Pid, + "[BUS] updater started, exiting main program", ) - // 给 updater 留出启动窗口(尤其是 systemd / docker 环境) time.Sleep(500 * time.Millisecond) - os.Exit(0) } + +// handleCheckUpdate 触发更新流程(主程序侧) +//func (b *BusinessService) handleCheckUpdate() { +// +// args := []string{ +// "--version", strconv.Itoa(config.APP_VERSION), +// } +// +// cmd := exec.Command("./updater.exe", args...) +// cmd.Stdout = os.Stdout +// cmd.Stderr = os.Stderr +// +// // OS 级脱离父进程 +// switch runtime.GOOS { +// case "windows": +// cmd.SysProcAttr = &syscall.SysProcAttr{ +// CreationFlags: syscall.CREATE_NEW_PROCESS_GROUP, +// } +// } +// +// if err := cmd.Start(); err != nil { +// log.Println("[BUS] failed to start updater:", err) +// return +// } +// +// log.Println( +// "[BUS] updater started (pid=%d), exiting main program\n", +// cmd.Process.Pid, +// ) +// +// // 给 updater 留出启动窗口(尤其是 systemd / docker 环境) +// time.Sleep(500 * time.Millisecond) +// +// os.Exit(0) +//} diff --git a/sentinel/main/main.go b/sentinel/main/main.go index ea60f7d..3efee24 100644 --- a/sentinel/main/main.go +++ b/sentinel/main/main.go @@ -23,8 +23,8 @@ func main() { fmt.Println(banner) deviceID := device.GetDeviceID() - log.Init(config.Log_file_dic) // 初始化日志目录 - log.Info("Device id: " + deviceID) // 第一次启动记录 + log.Init(config.Log_file_dic) // 初始化日志目录 + log.Info("Device id: " + deviceID) // 第一次启动记录 log.Println("版本号: ", config.APP_VERSION) // 第一次启动记录 var mqttSvc *MQTTService diff --git a/sentinel/main/main_factory.go b/sentinel/main/main_factory.go new file mode 100644 index 0000000..8112abb --- /dev/null +++ b/sentinel/main/main_factory.go @@ -0,0 +1,7 @@ +package main + +import "sentinel/pkg/platform" + +func newUpdaterLauncher() platform.UpdaterLauncher { + return &updaterLauncher{} +} diff --git a/sentinel/main/main_linux.go b/sentinel/main/main_linux.go new file mode 100644 index 0000000..a79f490 --- /dev/null +++ b/sentinel/main/main_linux.go @@ -0,0 +1,20 @@ +//go:build linux +// +build linux + +package main + +import ( + "os" + "os/exec" +) + +type updaterLauncher struct{} + +func (u *updaterLauncher) Start(args []string) error { + cmd := exec.Command("./updater", args...) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + + // Linux 下先不做进程组处理,保证能跑 + return cmd.Start() +} diff --git a/sentinel/main/main_windows.go b/sentinel/main/main_windows.go new file mode 100644 index 0000000..94206df --- /dev/null +++ b/sentinel/main/main_windows.go @@ -0,0 +1,24 @@ +//go:build windows +// +build windows + +package main + +import ( + "os" + "os/exec" + "syscall" +) + +type updaterLauncher struct{} + +func (u *updaterLauncher) Start(args []string) error { + cmd := exec.Command("./updater.exe", args...) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + + cmd.SysProcAttr = &syscall.SysProcAttr{ + CreationFlags: syscall.CREATE_NEW_PROCESS_GROUP, + } + + return cmd.Start() +} diff --git a/sentinel/pkg/net/httpclient.go b/sentinel/pkg/net/httpclient.go index 2af72c4..f3b7f64 100644 --- a/sentinel/pkg/net/httpclient.go +++ b/sentinel/pkg/net/httpclient.go @@ -12,7 +12,8 @@ import ( "sentinel/pkg/log" ) -const baseURL = "http://127.0.0.1:13011" +// const baseURL = "http://127.0.0.1:13011" +const baseURL = "https://ai.ronsunny.cn:8090" var client = &http.Client{ Timeout: 5 * time.Second, @@ -59,6 +60,7 @@ func do(method, path string, query map[string]string, body any, out any) error { return err } req.Header.Set("Content-Type", "application/json") + req.Header.Set("apikey", "NzusyzcLIUoZ22tflHN2sOjHrry3W7zJ") resp, err := client.Do(req) if err != nil { diff --git a/sentinel/pkg/platform/Platform_interface.go b/sentinel/pkg/platform/Platform_interface.go new file mode 100644 index 0000000..5016f05 --- /dev/null +++ b/sentinel/pkg/platform/Platform_interface.go @@ -0,0 +1,11 @@ +package platform + +type UpdaterLauncher interface { + Start(args []string) error +} + +type MainProgramStarter interface { + Start(targetExe string) error + + GetMainName() string +} diff --git a/sentinel/tmp/licensePlateImage_test1.jpg b/sentinel/tmp/licensePlateImage_test1.jpg deleted file mode 100644 index aa0fd72..0000000 Binary files a/sentinel/tmp/licensePlateImage_test1.jpg and /dev/null differ diff --git a/sentinel/tmp/vehicleImage_test1.jpg b/sentinel/tmp/vehicleImage_test1.jpg deleted file mode 100644 index 7b7046a..0000000 Binary files a/sentinel/tmp/vehicleImage_test1.jpg and /dev/null differ diff --git a/sentinel/updater/update.go b/sentinel/updater/main.go similarity index 80% rename from sentinel/updater/update.go rename to sentinel/updater/main.go index 57ec5f0..ce1f5bf 100644 --- a/sentinel/updater/update.go +++ b/sentinel/updater/main.go @@ -7,14 +7,11 @@ import ( "net/http" "net/url" "os" - "os/exec" "path/filepath" - "runtime" "sentinel/pkg/device" "sentinel/pkg/log" "sentinel/pkg/net" "strconv" - "syscall" "time" ) @@ -60,20 +57,14 @@ func RunUpdate(deviceID string, version int) error { return err } selfDir := filepath.Dir(selfPath) - targetExe := filepath.Join(selfDir, "main.exe") // Windows 固定名,可根据实际改 + + starter := newMainProgramStarter() + targetExe := filepath.Join(selfDir, starter.GetMainName()) // 2. 对比版本号,没有新版本则直接启动原程序 if info.Version <= version { fmt.Println("[updater] 暂未发现新版本,启动原程序") - cmd := exec.Command(targetExe) - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - if runtime.GOOS == "windows" { - cmd.SysProcAttr = &syscall.SysProcAttr{ - CreationFlags: syscall.CREATE_NEW_PROCESS_GROUP, - } - } - if err := cmd.Start(); err != nil { + if err := starter.Start(targetExe); err != nil { return err } os.Exit(0) @@ -131,19 +122,11 @@ func RunUpdate(deviceID string, version int) error { } // 6. 启动主程序,同时完全退出自己 - cmd := exec.Command(targetExe) - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - if runtime.GOOS == "windows" { - cmd.SysProcAttr = &syscall.SysProcAttr{ - CreationFlags: syscall.CREATE_NEW_PROCESS_GROUP, - } - } - if err := cmd.Start(); err != nil { + if err := starter.Start(targetExe); err != nil { return err } - - fmt.Printf("[updater] 更新完成,新程序已启动 (pid=%d),退出更新程序\n", cmd.Process.Pid) + fmt.Printf("[updater] 更新完成,新程序已启动,退出更新程序") os.Exit(0) + return nil } diff --git a/sentinel/updater/main_factory.go b/sentinel/updater/main_factory.go new file mode 100644 index 0000000..3792836 --- /dev/null +++ b/sentinel/updater/main_factory.go @@ -0,0 +1,7 @@ +package main + +import "sentinel/pkg/platform" + +func newMainProgramStarter() platform.MainProgramStarter { + return &mainProgramStarter{} +} diff --git a/sentinel/updater/main_linux.go b/sentinel/updater/main_linux.go new file mode 100644 index 0000000..ee65bd6 --- /dev/null +++ b/sentinel/updater/main_linux.go @@ -0,0 +1,27 @@ +//go:build linux +// +build linux + +package main + +import ( + "os" + "os/exec" +) + +type mainProgramStarter struct{} + +func (s *mainProgramStarter) GetMainName() string { + return "main" +} + +func (s *mainProgramStarter) Start(targetExe string) error { + if err := os.Chmod(targetExe, 0755); err != nil { + return err + } + cmd := exec.Command(targetExe) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + + // Linux 下:先保持最简单,保证能跑 + return cmd.Start() +} diff --git a/sentinel/updater/main_windows.go b/sentinel/updater/main_windows.go new file mode 100644 index 0000000..8e1bf69 --- /dev/null +++ b/sentinel/updater/main_windows.go @@ -0,0 +1,29 @@ +//go:build windows +// +build windows + +package main + +import ( + "os" + "os/exec" + "syscall" +) + +type mainProgramStarter struct{} + +func (s *mainProgramStarter) GetMainName() string { + return "main.exe" +} + +func (s *mainProgramStarter) Start(targetExe string) error { + cmd := exec.Command(targetExe) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + + // Windows:新进程组,脱离 Ctrl+C / 父进程 + cmd.SysProcAttr = &syscall.SysProcAttr{ + CreationFlags: syscall.CREATE_NEW_PROCESS_GROUP, + } + + return cmd.Start() +}