uemis.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. package drviers
  2. import (
  3. "bytes"
  4. "errors"
  5. "time"
  6. bus "github.com/ammeter/Bus"
  7. "github.com/yuguorong/go/log"
  8. )
  9. type SAirModel struct {
  10. Id string `json:"id"`
  11. DevName string `json:"devName"`
  12. Code string `json:"code"`
  13. Protocol string `json:"protocol"`
  14. GwDevId string `json:"gwDevId"`
  15. Type string `json:"-" `
  16. }
  17. type Uemis struct {
  18. baseDevice
  19. chnExit chan bool
  20. loopserver bool
  21. }
  22. func (u *Uemis) ChannelDispatch(stream []byte, args interface{}) bus.ChnDispResult {
  23. devName := ""
  24. buf := bytes.NewBuffer(stream)
  25. mret := u.Route[1].iproto.ParsePacket(buf.Bytes(), &devName)
  26. if mret != nil && devName != "" {
  27. devN := devName[8:]
  28. devN = "SA10" + "-00000000" + devN
  29. if devN == u.DeviceName {
  30. log.Info(u.DeviceName+" Dispatch ["+devN+"]: ", string(stream))
  31. return bus.DispatchSingle
  32. }
  33. }
  34. return bus.DispatchNone
  35. }
  36. func (u *Uemis) Run() error {
  37. u.loopserver = true
  38. for u.loopserver {
  39. select {
  40. case msg := <-u.Route[1].router[0]:
  41. b := msg.([]byte)
  42. devName := ""
  43. mret := u.Route[1].iproto.ParsePacket(b, &devName)
  44. if mret != nil && devName != "" {
  45. v := mret.(map[string]interface{})
  46. dev := devName[8:]
  47. dev = "SA10" + "-00000000" + dev
  48. log.Info(u.baseDevice.Id+"/"+dev, v)
  49. telemetry := u.Route[0].iproto.PackageCmd(dev, mret)
  50. u.Route[0].ibus.Send(u.Route[0].iChn, telemetry)
  51. u.tsSample = time.Now().Unix()
  52. }
  53. case <-u.chnExit:
  54. u.loopserver = false
  55. }
  56. }
  57. return nil
  58. }
  59. func (u *Uemis) Open(...interface{}) error {
  60. lenr := len(u.Route)
  61. if lenr < 1 {
  62. return errors.New("wrong route config")
  63. } else if lenr < 2 {
  64. u.SetRoute(u, "HJ212", "dtuFtpServer", "HJ212-"+u.Id, 0)
  65. }
  66. if !u.loopserver {
  67. go u.Run()
  68. }
  69. return nil
  70. }
  71. func (u *Uemis) Close() error {
  72. u.loopserver = false
  73. u.chnExit <- true
  74. return nil
  75. }
  76. func (u *Uemis) GetDevice(s string) interface{} {
  77. return u
  78. }
  79. type UemisDrv struct {
  80. baseDriver
  81. }
  82. func (drv *UemisDrv) GetModel() interface{} {
  83. return &[]SAirModel{}
  84. }
  85. func (drv *UemisDrv) CreateDevice(model interface{}) (int, []IDevice) {
  86. ts := time.Now().UnixMilli()
  87. devlist := make([]IDevice, 0)
  88. mlist := model.(*[]SAirModel)
  89. var dev *Uemis = nil
  90. for _, mod := range *mlist {
  91. mt, has := (drv.DevList[mod.Id])
  92. if !has {
  93. dev = &Uemis{}
  94. dev.Id = mod.Id
  95. dev.DeviceName = mod.DevName
  96. dev.loopserver = false
  97. dev.Probe(dev.DeviceName, drv)
  98. devlist = append(devlist, dev)
  99. drv.DevList[mod.Id] = dev
  100. } else {
  101. dev = mt.(*Uemis)
  102. }
  103. dev.tsUpdate = ts
  104. }
  105. return len(devlist), devlist
  106. }
  107. func NewUemis(param interface{}) IDriver {
  108. drv := new(UemisDrv)
  109. return drv
  110. }
  111. func init() {
  112. driverReg["SA10"] = NewUemis
  113. }