gateway.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package platform
  2. import (
  3. "errors"
  4. "strings"
  5. bus "github.com/ammeter/Bus"
  6. "github.com/ammeter/cloudserver"
  7. "github.com/ammeter/config"
  8. drviers "github.com/ammeter/drivers"
  9. )
  10. /*
  11. gZdomIS9Hz3d7HxvcoNx
  12. data [{"accessToken":"AZM7QSPRqsV4CUxIGldn",
  13. "id":"1ec23004b88a020bf52b38d8579115b",
  14. "mqttServer":"test-sbuilding.pacom.cn:1885",
  15. "name":"FGGW10-202110020001"}]
  16. */
  17. var debugName = true
  18. const (
  19. DEF_VERDOR = "GW4G"
  20. DEF_INF_NAME = "eth0"
  21. )
  22. type Gateway struct {
  23. ID int `gorm:"not null"`
  24. Mqttcfg bus.QMqtt
  25. Name string `gorm:"not null"`
  26. Uid string `gorm:"not null"`
  27. modelList map[string]string
  28. tsUpdate int64
  29. NorthRoute interface{} `json:"-" gorm:"-"`
  30. drvList map[string]drviers.IDriver
  31. }
  32. //https://test-admin.pacom.cn/platform/dev/get-sair-list
  33. func (gw *Gateway) SyncCloudModelDevice(url string, model interface{}) error {
  34. var err = errors.New("Nil model?")
  35. if model != nil {
  36. prof := config.GetSysConfig().GetProfile("remote_config", cloudserver.GetCloudConfig())
  37. cs := cloudserver.GetCloudServer(prof)
  38. param := map[string]string{
  39. "gwDevId": gw.Uid,
  40. }
  41. err = cs.GetClientData(url, model, &param)
  42. //log.Info(model)
  43. }
  44. return err
  45. }
  46. type netinfo struct {
  47. name string
  48. uuid string
  49. prority int
  50. }
  51. func priotyInf(ni *netinfo, name string) bool {
  52. name = strings.ToUpper(name)
  53. ifnames := []string{"WLAN", "ETH", "ENS", "ENO", "本地连接"}
  54. for i := 0; i < ni.prority && i < len(ifnames); i++ {
  55. if strings.Contains(name, ifnames[i]) {
  56. ni.name = name
  57. ni.prority = i
  58. return true
  59. }
  60. }
  61. return false
  62. }
  63. func (gw *Gateway) InitGateway() {
  64. //gw.GetGatewayName()
  65. }
  66. func (gw *Gateway) Remove(uid string) {
  67. for _, drv := range gw.drvList {
  68. drv.Uninstall()
  69. }
  70. gw.drvList = nil
  71. gw.modelList = nil
  72. gw.Mqttcfg = bus.QMqtt{}
  73. }
  74. //
  75. func (gw *Gateway) InstallDrivers(uid string) {
  76. //tsUpdate := time.Now().UnixMilli()
  77. for name, _ := range gw.modelList { //model name + model cloud api url
  78. drv, has := gw.drvList[name]
  79. if !has || drv == nil {
  80. drv = drviers.Install(name, nil) //If already installed ,return installed instance.
  81. gw.drvList[name] = drv
  82. }
  83. model := drv.GetModel() //model: cloud information of device, create exact device absctrace from model
  84. config.GetDB().Find(model, `gw_dev_id="`+gw.Uid+`"`)
  85. if sz, devlist := drv.CreateDevice(model); sz > 0 {
  86. for _, dev := range devlist {
  87. dev.SetRoute(nil, "ThingsBoards", "mqtt", "v1/gateway/telemetry", &gw.Mqttcfg)
  88. dev.Open() //open specail Route here
  89. }
  90. }
  91. }
  92. }
  93. func InitGateway(mqttcfg *bus.QMqtt, extname string, models map[string]string) *Gateway {
  94. gw := &Gateway{
  95. Uid: mqttcfg.Uid,
  96. Mqttcfg: *mqttcfg,
  97. tsUpdate: 0,
  98. drvList: make(map[string]drviers.IDriver),
  99. Name: extname,
  100. modelList: models,
  101. }
  102. return gw
  103. }