uploaddata.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package main
  2. import (
  3. "lc/common/models"
  4. "math"
  5. "sync"
  6. "time"
  7. "github.com/thinkgos/timing/v3"
  8. "lc/common/protocol"
  9. "lc/common/util"
  10. )
  11. func Precision(f float64, prec int, round bool) float64 {
  12. pow10N := math.Pow10(prec)
  13. if round {
  14. return math.Trunc((f+0.5/pow10N)*pow10N) / pow10N
  15. }
  16. return math.Trunc((f)*pow10N) / pow10N
  17. }
  18. var mapRtuUploadManager sync.Map
  19. type RtuUploadManager struct {
  20. DataLock sync.Mutex
  21. DevInfo *protocol.DevInfo
  22. DateTime time.Time
  23. Data map[uint16]float64
  24. Timer *timing.Timing
  25. }
  26. func NewRtuUploadManager(rtuinfo *protocol.DevInfo) *RtuUploadManager {
  27. o := RtuUploadManager{
  28. DevInfo: rtuinfo,
  29. Data: make(map[uint16]float64),
  30. Timer: timing.New().Run(),
  31. }
  32. o.Timer.AddJobFunc(o.SendData, time.Duration(o.DevInfo.SendCloud)*time.Millisecond)
  33. return &o
  34. }
  35. func (o *RtuUploadManager) Stop() {
  36. o.Timer.Close()
  37. o.DataLock.Lock()
  38. defer o.DataLock.Unlock()
  39. o.DevInfo = nil
  40. o.Data = nil
  41. }
  42. func (o *RtuUploadManager) AddData(data map[uint16]float64) {
  43. o.DataLock.Lock()
  44. defer o.DataLock.Unlock()
  45. for k, v := range data {
  46. o.Data[k] = v
  47. }
  48. o.DateTime = util.MlNow()
  49. }
  50. func (o *RtuUploadManager) SendData() {
  51. o.DataLock.Lock()
  52. defer func() {
  53. o.Data = make(map[uint16]float64)
  54. o.DataLock.Unlock()
  55. o.Timer.AddJobFunc(o.SendData, time.Duration(o.DevInfo.SendCloud)*time.Millisecond)
  56. }()
  57. if len(o.Data) == 0 {
  58. return
  59. }
  60. var obj protocol.Pack_UploadData
  61. if str, err := obj.EnCode(o.DevInfo.DevCode, appConfig.GID, GetNextUint64(), nil, o.DevInfo.TID, o.Data); err == nil {
  62. topic := GetTopic(o.GetDevType(), o.DevInfo.DevCode, protocol.TP_MODBUS_DATA)
  63. GetMQTTMgr().Publish(topic, str, 0, ToAll) //上传消息 modbus rtu
  64. }
  65. }
  66. func (o *RtuUploadManager) GetDevType() string {
  67. if o.DevInfo.DevType == 1 {
  68. return protocol.DT_CONCENTRATOR
  69. } else if o.DevInfo.DevType == 2 {
  70. return protocol.DT_ENVIRONMENT
  71. } else if o.DevInfo.DevType == 4 {
  72. return protocol.DT_LIQUID
  73. } else if o.DevInfo.DevType == 5 {
  74. return protocol.DT_ROAD_COND
  75. } else if o.DevInfo.DevType == uint8(models.CableGuardian) {
  76. return protocol.DT_CableGuardian
  77. }
  78. return "unknown"
  79. }