envdata.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. package reporter
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fmt"
  6. "time"
  7. modem "hnyfkj.com.cn/rtu/bxs-sy/air720u"
  8. "hnyfkj.com.cn/rtu/bxs-sy/baseapp"
  9. mcu "hnyfkj.com.cn/rtu/bxs-sy/mcu_ctrl_board"
  10. )
  11. type StrEnv struct {
  12. Timestamp string `json:"timestamp"` // 时间戳(秒, 存在"​​2038-01-19 03:14:07 UTC​​"溢出风险)
  13. Temperature string `json:"temperature"` // 温度(0.1°C)
  14. Humidity string `json:"humidity"` // 湿度(0.1%)
  15. Illuminance string `json:"illuminance"` // 照度(0.1 Lux)
  16. Voltage string `json:"voltage"` // 电压(0.1V)
  17. }
  18. func LoopRecvEnvDataGrp(ctx context.Context) {
  19. for {
  20. select {
  21. case grpData := <-mcu.Board.EnvDataGrpCh:
  22. // 1, 已经读取环境数据
  23. mcu.MCBSetEnvStateBit(mcu.ParsingEnvData)
  24. strEnvGrp := make([]StrEnv, len(grpData))
  25. for idx, envData := range grpData {
  26. strEnvGrp[idx].Timestamp, strEnvGrp[idx].Temperature, strEnvGrp[idx].Humidity,
  27. strEnvGrp[idx].Illuminance, strEnvGrp[idx].Voltage = envData.StringWithoutUnit()
  28. baseapp.Logger.Infof("[%s] 收到一组环境数据: [%02d]: %s", MODULE_NAME, idx+1, envData.LogString())
  29. }
  30. // 2, 上报到后端服务器
  31. if !Reporter.IsLogin() {
  32. baseapp.Logger.Warnf("[%s] 未登录, 无法上报环境数据!", MODULE_NAME)
  33. mcu.MCBSetEnvStateBit(mcu.Idle)
  34. continue
  35. }
  36. mcu.MCBSetEnvStateBit(mcu.EnvDataUploading)
  37. now := time.Now()
  38. baseapp.Logger.Infof("[%s] 正在上报环境数据到服务器...", MODULE_NAME)
  39. type notify struct {
  40. IMEI string `json:"imei"`
  41. EnvDataGrp []StrEnv `json:"envDataGroup"`
  42. }
  43. notifyVar := notify{
  44. IMEI: modem.GetIMEI(),
  45. EnvDataGrp: strEnvGrp,
  46. }
  47. notifyBytes, err := json.Marshal(notifyVar)
  48. if err != nil {
  49. baseapp.Logger.Errorf("[%s] 上报环境数据到服务器失败: %v!!", MODULE_NAME, err)
  50. mcu.MCBSetEnvStateBit(mcu.Idle)
  51. continue
  52. }
  53. topic := fmt.Sprintf("/yfkj/bxs-sy/notify/%s/envData24h", Reporter.dui)
  54. token := Reporter.client.Publish(topic, Reporter.msgQos, false, notifyBytes)
  55. select {
  56. case <-ctx.Done():
  57. return
  58. case <-token.Done():
  59. }
  60. if token.Error() != nil {
  61. baseapp.Logger.Errorf("[%s] 上报环境数据到服务器失败: %v!!", MODULE_NAME, token.Error())
  62. mcu.MCBSetEnvStateBit(mcu.Idle)
  63. continue
  64. }
  65. elapsed := time.Since(now).Milliseconds()
  66. // 3, 上报服务器已完成
  67. baseapp.Logger.Infof("[%s] 上报环境数据到服务器成功完成, 用时: %d毫秒", MODULE_NAME, elapsed)
  68. mcu.MCBSetEnvStateBit(mcu.Idle)
  69. case <-ctx.Done():
  70. return
  71. }
  72. }
  73. }
  74. func LoopRecvEnvDataOne(ctx context.Context) {
  75. for {
  76. select {
  77. case envData := <-mcu.Board.EnvDataOneCh:
  78. // 1, 已经读取环境数据
  79. mcu.MCBSetEnvStateBit(mcu.ParsingEnvData)
  80. var strEnv StrEnv
  81. strEnv.Timestamp, strEnv.Temperature, strEnv.Humidity,
  82. strEnv.Illuminance, strEnv.Voltage = envData.StringWithoutUnit()
  83. baseapp.Logger.Infof("[%s] 收到一条环境数据: %s", MODULE_NAME, envData.LogString())
  84. // 2, 上报到后端服务器
  85. if !Reporter.IsLogin() {
  86. baseapp.Logger.Warnf("[%s] 未登录, 无法上报环境数据!", MODULE_NAME)
  87. mcu.MCBSetEnvStateBit(mcu.Idle)
  88. continue
  89. }
  90. mcu.MCBSetEnvStateBit(mcu.EnvDataUploading)
  91. now := time.Now()
  92. baseapp.Logger.Infof("[%s] 正在上报环境数据到服务器...", MODULE_NAME)
  93. type notify struct {
  94. IMEI string `json:"imei"`
  95. EnvData StrEnv `json:"envData"`
  96. }
  97. notifyVar := notify{
  98. IMEI: modem.GetIMEI(),
  99. EnvData: strEnv,
  100. }
  101. notifyBytes, err := json.Marshal(notifyVar)
  102. if err != nil {
  103. baseapp.Logger.Errorf("[%s] 上报环境数据到服务器失败: %v!!", MODULE_NAME, err)
  104. mcu.MCBSetEnvStateBit(mcu.Idle)
  105. continue
  106. }
  107. topic := fmt.Sprintf("/yfkj/bxs-sy/notify/%s/envDataNow", Reporter.dui)
  108. token := Reporter.client.Publish(topic, Reporter.msgQos, false, notifyBytes)
  109. select {
  110. case <-ctx.Done():
  111. return
  112. case <-token.Done():
  113. }
  114. if token.Error() != nil {
  115. baseapp.Logger.Errorf("[%s] 上报环境数据到服务器失败: %v!!", MODULE_NAME, token.Error())
  116. mcu.MCBSetEnvStateBit(mcu.Idle)
  117. continue
  118. }
  119. elapsed := time.Since(now).Milliseconds()
  120. // 3, 上报服务器已完成
  121. mcu.MCBSetEnvStateBit(mcu.Idle)
  122. baseapp.Logger.Infof("[%s] 上报环境数据到服务器成功完成, 用时: %d毫秒", MODULE_NAME, elapsed)
  123. case <-ctx.Done():
  124. return
  125. }
  126. }
  127. }