main.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  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. gnss "hnyfkj.com.cn/rtu/linux/air530z"
  13. "hnyfkj.com.cn/rtu/linux/baseapp"
  14. "hnyfkj.com.cn/rtu/linux/utils/jsonrpc2"
  15. )
  16. var (
  17. Version = "0.0.0.1"
  18. BuildTime = ""
  19. )
  20. const (
  21. network = "tcp" // http -> tcp
  22. listenAddr = "127.0.0.1:7002"
  23. )
  24. type program struct {
  25. name string
  26. core_server *jsonrpc2.RPCServer
  27. http_server *http.Server
  28. }
  29. // Start should not block. Do the actual work async.
  30. func (p *program) Start(s service.Service) error {
  31. logCfgFile, err := servicelib.EnsureDefaultLogConfig()
  32. if err != nil {
  33. return err
  34. }
  35. baseapp.InitLogger(logCfgFile)
  36. baseapp.Logger.Infof("App Version: %s, Build Time: %s", Version, BuildTime)
  37. err = gnss.ModuleInit2()
  38. if err != nil {
  39. return err
  40. }
  41. p.core_server, err = jsonrpc2.NewRPCServer(p.name, baseapp.Logger)
  42. if err != nil {
  43. return err
  44. }
  45. methods := make(jsonrpc2.MethodMap)
  46. //////////////////////////////////////////////////////////
  47. _getBuildVer := servicelib.MakeGetBuildVer(
  48. Version, BuildTime)
  49. methods["basic.getBuildVer"] = _getBuildVer // 获取软件版本
  50. _getLogLevel := servicelib.GetLogLevel
  51. methods["basic.getLogLevel"] = _getLogLevel // 获取日志级别
  52. _setLogLevel := servicelib.SetLogLevel
  53. methods["basic.setLogLevel"] = _setLogLevel // 设置日志级别
  54. _saveLogConf := servicelib.SaveLogConf
  55. methods["basic.saveLogConf"] = _saveLogConf // 保存日志设置
  56. //////////////////////////////////////////////////////////
  57. methods["core.getPositionInfo"] = getPositionInfo
  58. err = p.core_server.RegisterMethods(methods)
  59. if err != nil {
  60. return err
  61. }
  62. mux := http.NewServeMux()
  63. mux.Handle("/rpc", p.core_server)
  64. p.http_server = &http.Server{
  65. Addr: listenAddr,
  66. Handler: mux,
  67. }
  68. go p.run()
  69. return nil
  70. }
  71. // Do work here
  72. func (p *program) run() {
  73. baseapp.Logger.Infof(
  74. "[%s] Http server starting on %s...",
  75. p.name,
  76. p.http_server.Addr,
  77. )
  78. err := p.http_server.ListenAndServe() // 同步阻塞
  79. if err != nil && !errors.Is(err, http.ErrServerClosed) {
  80. baseapp.Logger.Errorf("[%s] Start http server error: %v!!", p.name, err)
  81. return
  82. }
  83. }
  84. // Stop should not block. Return with a few seconds.
  85. func (p *program) Stop(s service.Service) error {
  86. if p.core_server != nil {
  87. p.core_server.Stop()
  88. }
  89. if p.http_server != nil {
  90. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  91. defer cancel()
  92. _ = p.http_server.Shutdown(ctx)
  93. }
  94. gnss.ModuleExit()
  95. baseapp.ExitLogger()
  96. return nil
  97. }
  98. func main() {
  99. baseapp.SetOptDirs(true, false, false, false)
  100. baseapp.InitPath()
  101. svcFlag := flag.String("service", "", "Control the system service.")
  102. flag.Parse()
  103. svcConfig := &service.Config{
  104. Name: "yfkj-gnss",
  105. DisplayName: "yfkj-gnss",
  106. Description: "Location acquisition",
  107. Option: map[string]any{
  108. "Restart": "always", // 无条件重启
  109. },
  110. }
  111. servicelib.WriteVersionFile(baseapp.EXEC_DIR, Version) //-> for 升级
  112. prg := &program{
  113. name: "GNSS",
  114. }
  115. svc, err := service.New(prg, svcConfig)
  116. if err != nil {
  117. fmt.Printf("%s.service creation failed: %v\n",
  118. svcConfig.Name, err)
  119. os.Exit(1)
  120. }
  121. if len(*svcFlag) != 0 {
  122. err := service.Control(svc, *svcFlag)
  123. if err != nil {
  124. fmt.Printf("%v\n Valid actions: %q\n", err, service.ControlAction)
  125. }
  126. os.Exit(0)
  127. }
  128. if servicelib.IsAddrInUse(network, listenAddr) { // 查询端口占用,避免运行多份实例
  129. fmt.Printf(
  130. "%s.service start failed: listen addr %s already in use\n",
  131. svcConfig.Name, listenAddr,
  132. )
  133. os.Exit(1)
  134. }
  135. if err := svc.Run(); err != nil {
  136. fmt.Printf("%s.service run failed: %v\n",
  137. svcConfig.Name, err)
  138. os.Exit(1)
  139. }
  140. }