main.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. package main
  2. import (
  3. "context"
  4. "errors"
  5. "flag"
  6. "fmt"
  7. "net/http"
  8. "os"
  9. "rtu_linux_services/servicelib"
  10. "time"
  11. "github.com/kardianos/service"
  12. "hnyfkj.com.cn/rtu/linux/baseapp"
  13. "hnyfkj.com.cn/rtu/linux/camera"
  14. "hnyfkj.com.cn/rtu/linux/dh_takephoto"
  15. "hnyfkj.com.cn/rtu/linux/hk_takephoto"
  16. "hnyfkj.com.cn/rtu/linux/utils/jsonrpc2"
  17. )
  18. var (
  19. Version = "0.0.0.1"
  20. BuildTime = ""
  21. )
  22. const (
  23. eth1AddrCIDR = "192.168.100.1/24"
  24. network = "tcp" // http -> tcp
  25. listenAddr = "127.0.0.1:7003"
  26. )
  27. type program struct {
  28. name string
  29. core_server *jsonrpc2.RPCServer
  30. http_server *http.Server
  31. }
  32. // Start should not block. Do the actual work async.
  33. func (p *program) Start(s service.Service) error {
  34. logCfgFile, err := servicelib.EnsureDefaultLogConfig()
  35. if err != nil {
  36. return err
  37. }
  38. baseapp.InitLogger(logCfgFile)
  39. baseapp.Logger.Infof("[%s] 开始运行, 程序版本: %s, 构建时间: %s", p.name, Version, BuildTime)
  40. if !hk_takephoto.ModuleInit() {
  41. return errors.New("hk camera module init failed")
  42. }
  43. if !dh_takephoto.ModuleInit() {
  44. return errors.New("dh camera module init failed")
  45. }
  46. if err := camera.SetupEth1ForGigeCamera(eth1AddrCIDR); err != nil {
  47. return errors.New("failed to setup eth1 address")
  48. }
  49. p.core_server, err = jsonrpc2.NewRPCServer(p.name, baseapp.Logger)
  50. if err != nil {
  51. return err
  52. }
  53. methods := make(jsonrpc2.MethodMap)
  54. //////////////////////////基础功能//////////////////////////
  55. _getBuildVer := servicelib.MakeGetBuildVer(
  56. Version, BuildTime)
  57. methods["basic.getBuildVer"] = _getBuildVer // 获取软件版本
  58. _getLogLevel := servicelib.GetLogLevel
  59. methods["basic.getLogLevel"] = _getLogLevel // 获取日志级别
  60. _setLogLevel := servicelib.SetLogLevel
  61. methods["basic.setLogLevel"] = _setLogLevel // 设置日志级别
  62. _saveLogConf := servicelib.SaveLogConf
  63. methods["basic.saveLogConf"] = _saveLogConf // 保存日志设置
  64. //////////////////////////网口相机//////////////////////////
  65. methods["core.getGigeCameraPower"] = getGigeCameraPower
  66. methods["core.setGigeCameraPower"] = setGigeCameraPower
  67. methods["core.checkGigeCamera"] = checkGigeCamera
  68. //////////////////////////相机数量//////////////////////////
  69. methods["core.getSupportedCameraCount"] = getSupportedCameraCount
  70. //////////////////////////拍照取图//////////////////////////
  71. methods["core.setWaitAEDoneForTakePhoto"] = setWaitAEDoneForTakePhoto
  72. methods["core.takePhoto"] = takePhoto
  73. err = p.core_server.RegisterMethods(methods)
  74. if err != nil {
  75. return err
  76. }
  77. mux := http.NewServeMux()
  78. mux.Handle("/rpc", p.core_server)
  79. p.http_server = &http.Server{
  80. Addr: listenAddr,
  81. Handler: mux,
  82. }
  83. go p.run()
  84. return nil
  85. }
  86. // Do work here
  87. func (p *program) run() {
  88. baseapp.Logger.Infof(
  89. "[%s] Http server starting on %s...",
  90. p.name,
  91. p.http_server.Addr,
  92. )
  93. err := p.http_server.ListenAndServe() // 同步阻塞
  94. if err != nil && !errors.Is(err, http.ErrServerClosed) {
  95. baseapp.Logger.Errorf("[%s] Start http server error: %v!!", p.name, err)
  96. return
  97. }
  98. }
  99. // Stop should not block. Return with a few seconds.
  100. func (p *program) Stop(s service.Service) error {
  101. if p.core_server != nil {
  102. p.core_server.Stop()
  103. }
  104. if p.http_server != nil {
  105. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  106. defer cancel()
  107. _ = p.http_server.Shutdown(ctx)
  108. }
  109. baseapp.Logger.Infof("[%s] 程序退出", p.name)
  110. baseapp.ExitLogger()
  111. return nil
  112. }
  113. func main() {
  114. baseapp.SetOptDirs(true, false, false, false)
  115. baseapp.InitPath()
  116. svcFlag := flag.String("service", "", "Control the yfkj-camera-capture service.")
  117. flag.Parse()
  118. svcConfig := &service.Config{
  119. Name: "yfkj-camera-capture",
  120. DisplayName: "yfkj-camera-capture",
  121. Description: "Yunfei Camera Capture Service",
  122. Option: map[string]any{
  123. "Restart": "always", // 无条件重启
  124. },
  125. }
  126. servicelib.WriteVersionFile(baseapp.EXEC_DIR, Version) //-> for 升级
  127. prg := &program{
  128. name: "CameraCapture",
  129. }
  130. svc, err := service.New(prg, svcConfig)
  131. if err != nil {
  132. fmt.Printf("%s.service creation failed: %v\n",
  133. svcConfig.Name, err)
  134. os.Exit(1)
  135. }
  136. if len(*svcFlag) != 0 {
  137. err := service.Control(svc, *svcFlag)
  138. if err != nil {
  139. fmt.Printf("%v\n Valid actions: %q\n", err, service.ControlAction)
  140. }
  141. os.Exit(0)
  142. }
  143. if servicelib.IsAddrInUse(network, listenAddr) { // 查询端口占用,避免运行多份实例
  144. fmt.Printf(
  145. "%s.service start failed: listen addr %s already in use\n",
  146. svcConfig.Name, listenAddr,
  147. )
  148. os.Exit(1)
  149. }
  150. if err := svc.Run(); err != nil {
  151. fmt.Printf("%s.service run failed: %v\n",
  152. svcConfig.Name, err)
  153. os.Exit(1)
  154. }
  155. }