hj212.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package protocol
  2. import (
  3. "reflect"
  4. "strconv"
  5. "strings"
  6. "github.com/yuguorong/go/log"
  7. )
  8. type HJ212 struct {
  9. Name string
  10. }
  11. /*
  12. [2021-10-06 03:05:26]rev data from 221.216.136.161:1114 msg(171):[23233031353953543d32323b434e3d323031313b50573d3132333435363b4d4e3d383838383838383832363436323238353b43503d26264461746154696d653d32303231313030363033303532373b54454d502d5274643d32322e303b48554d492d5274643d34332e353b504d32352d5274643d322e303b434f322d5274643d3430352e303b4348324f2d5274643d302e3030383b564f432d5274643d302e3035323b2626386566370d0a]
  13. &{0xc000010050 [35 35 48 49 53 57 83 84 61 50 50 59 67 78 61 50 48 49 49 59 80 87 61 49 50 51 52 53 54 59 77 78 61 56 56 56 56 56 56 56 56 50 54 52 54 50 50 56 53 59 67 80 61 38 38 68 97 116 97 84 105 109 101 61 50 48 50 49 49 48 48 54 48 51 48 53 50 55 59 84 69 77 80 45 82 116 100 61 50 50 46 48 59 72 85 77 73 45 82 116 100 61 52 51 46 53 59 80 77 50 53 45 82 116 100 61 50 46 48 59 67 79 50 45 82 116 100 61 52 48 53 46 48 59 67 72 50 79 45 82 116 100 61 48 46 48 48 56 59 86 79 67 45 82 116 100 61 48 46 48 53 50 59 38 38 56 101 102 55 13 10]}
  14. ##0159ST=22;CN=2011;PW=123456;MN=8888888826462285;CP=&&DataTime=20211006030527;TEMP-Rtd=22.0;HUMI-Rtd=43.5;PM25-Rtd=2.0;CO2-Rtd=405.0;CH2O-Rtd=0.008;VOC-Rtd=0.052;&&8ef7
  15. 61748803
  16. 8888888826462285
  17. 8888888861748803
  18. ##
  19. 0159
  20. ST=22;CN=2011;PW=123456;MN=8888888826462285;CP=
  21. &&
  22. DataTime=20211006030527;TEMP-Rtd=22.0;HUMI-Rtd=43.5;PM25-Rtd=2.0;CO2-Rtd=405.0;CH2O-Rtd=0.008;VOC-Rtd=0.052;
  23. &&
  24. 8ef7
  25. */
  26. //232330313539
  27. //53543d32323b434e3d323031313b50573d3132333435363b4d4e3d383838383838383836313734383830333b43503d26264461746154696d653d32303231313030363031353434353b54454d502d5274643d32302e363b48554d492d5274643d34312e343b504d32352d5274643d352e303b434f322d5274643d3339332e303b4348324f2d5274643d302e3030373b564f432d5274643d302e3030383b2626393330380d0a
  28. func (hj *HJ212) Init(name string) error {
  29. return nil
  30. }
  31. func (hj *HJ212) Uninit() {
  32. }
  33. func (hj *HJ212) ChannelDispatch(b []byte) int {
  34. if b[0] == 0x23 && b[1] == 0x23 {
  35. return 1
  36. }
  37. return 0
  38. }
  39. func parseField(sfileds string, sinfo *map[string]interface{}, bintv bool, skip ...string) error {
  40. sTelemtry := strings.Split(sfileds, ";")
  41. for _, v := range sTelemtry {
  42. kv := strings.Split(v, "=")
  43. if len(kv) == 2 && len(kv[1]) > 0 {
  44. bskiped := false
  45. for _, s := range skip {
  46. if s == kv[0] {
  47. bskiped = true
  48. }
  49. }
  50. if !bskiped {
  51. v := kv[1]
  52. if bintv {
  53. fv, err := strconv.ParseFloat(v, 64)
  54. if err == nil {
  55. skey := strings.Split(kv[0], "-")
  56. (*sinfo)[skey[0]] = fv
  57. continue
  58. }
  59. }
  60. (*sinfo)[kv[0]] = kv[1]
  61. }
  62. }
  63. }
  64. return nil
  65. }
  66. func (hj *HJ212) ParsePacket(buff []byte, param ...interface{}) interface{} {
  67. if buff[0] != 0x23 || buff[1] != 0x23 {
  68. return nil
  69. }
  70. blen := buff[2:6]
  71. plen, err := strconv.Atoi(string(blen))
  72. if err != nil {
  73. return nil
  74. }
  75. log.Info(plen)
  76. data := buff[6:]
  77. szPayload := string(data)
  78. sFields := strings.Split(szPayload, "&&")
  79. if len(sFields) < 1 {
  80. return nil
  81. }
  82. sinfo := make(map[string]interface{})
  83. parseField(sFields[0], &sinfo, false, "PW")
  84. if v, ok := sinfo["ST"]; !ok || v != "22" { //ST=22 ==> air qulity
  85. return nil
  86. }
  87. if v, ok := sinfo["CN"]; !ok || v != "2011" { //CN=2011 ==> air 实时分钟数据上传
  88. return nil
  89. }
  90. delete(sinfo, "ST")
  91. delete(sinfo, "CN")
  92. parseField(sFields[1], &sinfo, true, "DataTime")
  93. if len(param) > 0 && reflect.TypeOf(param[0]).Kind() == reflect.Ptr {
  94. if mn, has := sinfo["MN"]; has {
  95. *param[0].(*string) = mn.(string)
  96. delete(sinfo, "MN")
  97. }
  98. }
  99. return sinfo
  100. }
  101. func (hj *HJ212) PackageCmd(cmd string, param ...interface{}) interface{} {
  102. return nil
  103. }
  104. func NewHJ212() IProtocol {
  105. p := &HJ212{}
  106. p.Init("HJ212")
  107. return p
  108. }
  109. func init() {
  110. ProtReg["HJ212"] = NewHJ212
  111. }