package camera import ( "fmt" "os" "os/exec" "syscall" "time" "github.com/vishvananda/netlink" "hnyfkj.com.cn/rtu/linux/baseapp" ) // 相机模块的名称 const MODULE_NAME = "Camera" // 配置连接网口相机的网卡ip func SetupEth1ForGigeCamera(cidr string) error { link, err := netlink.LinkByName("eth1") if err != nil { return err } if err = netlink.LinkSetUp(link); err != nil { return err } addr, err := netlink.ParseAddr(cidr) if err != nil { return err } if err = netlink.AddrAdd(link, addr); err != nil && err != syscall.EEXIST { return err } return nil } // 打开或关闭网口相机的电源 func PowerOnGigeCamera(on bool) error { _ = os.WriteFile("/sys/class/gpio/unexport", []byte("22"), 0644) if err := os.WriteFile("/sys/class/gpio/export", []byte("22"), 0644); err != nil { return err } time.Sleep(50 * time.Millisecond) if err := os.WriteFile("/sys/class/gpio/gpio22/direction", []byte("out"), 0644); err != nil { return err } val := "0" if on { val = "1" } if err := os.WriteFile("/sys/class/gpio/gpio22/value", []byte(val), 0644); err != nil { return err } return nil } func PingOnce(host string, timeoutSec int) error { cmd := exec.Command("ping", "-c", "1", "-W", fmt.Sprint(timeoutSec), host) return cmd.Run() } func ModuleInit(supportsGigeCamera bool, eth1CIDR, gigeCameraIP string) bool { var err error if !supportsGigeCamera { goto initOK } if err := SetupEth1ForGigeCamera(eth1CIDR); err != nil { baseapp.Logger.Errorf("[%s] 网口相机初始化失败: 设置\"eth1\"地址失败: %v!!", MODULE_NAME, err) return false } err = PingOnce(gigeCameraIP, 1) if err == nil { goto initOK } PowerOnGigeCamera(false) err = PowerOnGigeCamera(true) if err != nil { baseapp.Logger.Errorf("[%s] 网口相机初始化失败: 通过 GPIO22 上电失败: %v!!", MODULE_NAME, err) return false } for range 15 { if baseapp.IsExit1() { return false } err = PingOnce(gigeCameraIP, 1) if err == nil { break } time.Sleep(1 * time.Second) } if err != nil { baseapp.Logger.Errorf("[%s] 网口相机初始化失败: 连通性检测(ping)失败: %v!!", MODULE_NAME, err) return false } initOK: // Todo: return true }