Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 
 

63 rindas
1.5 KiB

  1. package mqttclient
  2. import (
  3. "fmt"
  4. "log"
  5. "time"
  6. "github.com/AFASystems/presence/internal/pkg/model"
  7. "github.com/AFASystems/presence/internal/pkg/persistence"
  8. "github.com/boltdb/bolt"
  9. "github.com/yosssi/gmq/mqtt/client"
  10. )
  11. func IncomingMQTTProcessor(updateInterval time.Duration, cl *client.Client, db *bolt.DB, ctx *model.AppContext) chan<- model.Incoming_json {
  12. ch := make(chan model.Incoming_json, 2000)
  13. persistence.CreateBucketIfNotExists(db)
  14. ticker := time.NewTicker(updateInterval)
  15. go runProcessor(ticker, cl, ch, ctx)
  16. return ch
  17. }
  18. func runProcessor(ticker *time.Ticker, cl *client.Client, ch <-chan model.Incoming_json, ctx *model.AppContext) {
  19. for {
  20. select {
  21. case <-ticker.C:
  22. getLikelyLocations(&ctx.Settings, ctx, cl)
  23. case incoming := <-ch:
  24. ProcessIncoming(incoming, cl, ctx)
  25. }
  26. }
  27. }
  28. func ProcessIncoming(incoming model.Incoming_json, cl *client.Client, ctx *model.AppContext) {
  29. defer func() {
  30. if err := recover(); err != nil {
  31. log.Println("work failed:", err)
  32. }
  33. }()
  34. incoming = IncomingBeaconFilter(incoming)
  35. id := GetBeaconID(incoming)
  36. now := time.Now().Unix()
  37. beacons := &ctx.Beacons
  38. beacons.Lock.Lock()
  39. defer beacons.Lock.Unlock()
  40. latestList := &ctx.LatestList
  41. settings := &ctx.Settings
  42. beacon, ok := beacons.Beacons[id]
  43. if !ok {
  44. updateLatestList(incoming, now, latestList)
  45. return
  46. }
  47. fmt.Println("updating beacon data")
  48. updateBeaconData(&beacon, incoming, now, cl, settings)
  49. beacons.Beacons[beacon.Beacon_id] = beacon
  50. }