package main import ( "fmt" "os" "time" gps "hnyfkj.com.cn/rtu/linux/air530z" baseapp "hnyfkj.com.cn/rtu/linux/baseapp" camera1 "hnyfkj.com.cn/rtu/linux/hk_takephoto" // 海康相机 netmgrd "hnyfkj.com.cn/rtu/linux/netmgrd" "hnyfkj.com.cn/rtu/linux/sshd" ) const ( rcLocalTxt = ` #!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing. #设置系统主频 echo userspace > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor echo 528000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed #设置一秒落盘(是低功耗产品时, RTU数据板可能随时掉电, 长供电产品, 不需要设置) #echo 100 > /proc/sys/vm/dirty_writeback_centisecs #echo 100 > /proc/sys/vm/dirty_expire_centisecs #启动运行程序 /home/root/rtu_linux_modules/script/stop /home/root/rtu_linux_modules/script/start exit 0 ` rcLocalFile = "/etc/rc.local" ) func enableAutoStartOnBoot() error { if _, err := os.Stat(rcLocalFile); err == nil { bakFile := rcLocalFile + "." + time.Now().Format("20060102150405") err = os.Rename(rcLocalFile, bakFile) if err != nil { return err } } f, err := os.OpenFile(rcLocalFile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0755) if err != nil { return err } defer f.Close() _, err = f.WriteString(rcLocalTxt) if err != nil { return err } err = os.Chmod(rcLocalFile, 0755) if err != nil { return err } return nil } func main() { if baseapp.IsArgsParam("-h") { help() return } if baseapp.IsArgsParam("-v") { fmt.Println("程序版本:", baseapp.Version, "\n构建时间:", baseapp.BuildTime) return } if baseapp.GetArgsParamStr("-install", "") == "boot" { err := enableAutoStartOnBoot() if err != nil { fmt.Printf("设置开机自启动失败: %v", err) } else { fmt.Println("设置开机自启动成功") } return } baseapp.ModuleInit() baseapp.SingleInstanceRun() // 异步非阻塞 baseapp.Logger.Infof("程序版本: %s 构建时间: %s\n程序开始运行...", baseapp.Version, baseapp.BuildTime) // 01, 初始化卫星定位模块 gps.ModuleInit() // 02, 初始化4G调制解调器 if !netmgrd.ModemInit() { goto end_p } // 03, 初始化网络管理模块 netmgrd.ModuleInit() netmgrd.WaitAllOK(time.Duration(10) * time.Second) // 等待联网成功和网路时间同步成功 // 04, 初始化远程运维模块, Todo: 根据项目不同, 远程运维连接的MQTT服务器不同, 具体看情况 sshd.ModuleInit("", "", "") // 05, 初始化相机拍照模块 if !camera1.ModuleInit() { goto end_p } // 06, 初始化与控制板通信, Todo: 根据项目不同, 使用的控制版硬件和协议都不同, 具体看情况 // 07, 后台服务器业务交互, Todo: 根据项目不同, 实现具体的业务逻辑协议都不同, 具体看情况 // 08, 阻塞等待退出信号量 <-baseapp.IsExit2() // 09, 退出程序并释放资源 end_p: sshd.ModuleExit() netmgrd.ModemExit() gps.ModuleExit() baseapp.Logger.Info("程序退出") baseapp.ExitLogger() // 安全的关闭日志模块 baseapp.SafeExit() // 安全的关闭退出程序 } func help() { h := ` -h 显示帮助提示 -v 当前程序版本 -install boot 设置程序开机自启动 ` fmt.Println(h) }