main.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package main
  2. import (
  3. _ "net/http/pprof"
  4. "os/exec"
  5. "runtime"
  6. "time"
  7. jsoniter "github.com/json-iterator/go"
  8. "github.com/sirupsen/logrus"
  9. "github.com/thinkgos/timing/v3"
  10. "lc/common/util"
  11. )
  12. var json = jsoniter.ConfigCompatibleWithStandardLibrary
  13. var pool *util.Pool
  14. var IDGen util.IdWorker
  15. var version = "1.4.1"
  16. var appName = "ipole"
  17. func Stat(args ...interface{}) interface{} {
  18. lastGC := time.Now()
  19. for {
  20. if time.Now().Sub(lastGC) > time.Minute {
  21. timing.Count()
  22. runtime.GC()
  23. lastGC = time.Now()
  24. }
  25. time.Sleep(time.Second)
  26. }
  27. }
  28. func GetNextUint64() uint64 {
  29. u64, err := IDGen.NextId()
  30. if err != nil {
  31. logrus.Errorf("IDGen.NextId发生错误:%s", err.Error())
  32. u64 = util.MlNow().Unix()
  33. }
  34. return uint64(u64)
  35. }
  36. // SyncTime 每半小时同步一次时间
  37. func SyncTime(args ...interface{}) interface{} {
  38. for {
  39. err := exec.Command("ntpclient", "-h", "106.52.134.22", "-s").Run()
  40. if err != nil {
  41. logrus.Errorf("时间同步失败:%s", err.Error())
  42. } else {
  43. logrus.Info("时间同步成功,当前时间:", util.MlNow().String())
  44. }
  45. time.Sleep(30 * time.Minute)
  46. }
  47. }
  48. func main() {
  49. runtime.GOMAXPROCS(runtime.NumCPU() * 2)
  50. util.InitLogrus("release")
  51. logrus.Infof("当前程序版本:%s", appName+" "+version)
  52. if err := loadAppConfig(); err != nil {
  53. logrus.Errorf("loadAppConfig错误:%s", err.Error())
  54. return
  55. }
  56. if err := loadSerialConfig(); err != nil {
  57. logrus.Errorf("loadAppConfig错误:%s", err.Error())
  58. return
  59. }
  60. _ = IDGen.InitIdWorker(1000, 1)
  61. GetMQTTMgr()
  62. InitRedis(&util.RedisConfig{Redis_Address: appConfig.Edge.Redis.Server, Redis_Password: appConfig.Edge.Redis.Password})
  63. defer UnInitRedis()
  64. //打开串口
  65. GetSerialMgr().AddSerialPorts(serialConfig.Serial)
  66. //创建设备并启动数据处理流程
  67. for k := range serialConfig.Serial {
  68. if devinfos, err := LoadDev(k); err == nil {
  69. GetDeviceMgr().AddDevices(devinfos)
  70. }
  71. }
  72. pool = util.NewPool(10)
  73. pool.Add(SyncTime, 0)
  74. pool.Add(WatchDevConfig, 1)
  75. pool.Add(WatchModelConfig, 2)
  76. pool.Add(WatchConfConfig, 3)
  77. pool.Add(GetMQTTMgr().MQTTMessageHandle, 4)
  78. pool.Add(GetMQTTMgr().MQTTConnectMgr, 5)
  79. pool.Add(Stat, 6)
  80. pool.Run()
  81. pool.Wait()
  82. }