uemis.go 2.7 KB

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