Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 
 

163 rader
3.7 KiB

  1. package main
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fmt"
  6. "strings"
  7. "time"
  8. "github.com/AFASystems/presence/internal/pkg/model"
  9. "github.com/AFASystems/presence/internal/pkg/mqttclient"
  10. "github.com/redis/go-redis/v9"
  11. "github.com/segmentio/kafka-go"
  12. )
  13. func main() {
  14. // Load global context to init beacons and latest list
  15. appCtx := model.AppContext{
  16. Beacons: model.BeaconsList{
  17. Beacons: make(map[string]model.Beacon),
  18. },
  19. LatestList: model.LatestBeaconsList{
  20. LatestList: make(map[string]model.Beacon),
  21. },
  22. }
  23. // Kafka writer idk why yet
  24. writer := kafkaWriter("127.0.0.1:9092", "beacons")
  25. // Kafka reader for Raw MQTT beacons
  26. rawReader := kafkaReader("127.0.0.1:9092", "rawbeacons", "someID")
  27. defer rawReader.Close()
  28. // Kafka reader for API server updates
  29. apiReader := kafkaReader("127.0.0.1:9092", "apibeacons", "someID")
  30. defer apiReader.Close()
  31. // Kafka reader for latest list updates
  32. latestReader := kafkaReader("127.0.0.1:9092", "latestbeacons", "someID")
  33. defer latestReader.Close()
  34. defer writer.Close()
  35. ctx := context.Background()
  36. // Init Redis Client
  37. client := redis.NewClient(&redis.Options{
  38. Addr: "127.0.0.1:6379",
  39. Password: "",
  40. })
  41. // Initialize list values from Redis
  42. beaconsList, err := client.Get(ctx, "beaconsList").Result()
  43. if err == redis.Nil {
  44. fmt.Println("no beacons list, starting empty")
  45. } else if err != nil {
  46. panic(err)
  47. } else {
  48. json.Unmarshal([]byte(beaconsList), &appCtx.Beacons.Beacons)
  49. }
  50. // Initialize list values from Redis
  51. latestList, err := client.Get(ctx, "latestList").Result()
  52. if err == redis.Nil {
  53. fmt.Println("no latest list, starting empty")
  54. } else if err != nil {
  55. panic(err)
  56. } else {
  57. json.Unmarshal([]byte(latestList), &appCtx.LatestList.LatestList)
  58. }
  59. // declare channel for collecting Kafka messages
  60. chRaw := make(chan model.Incoming_json, 2000)
  61. chApi := make(chan model.Incoming_json, 2000)
  62. chLatest := make(chan model.Incoming_json, 2000)
  63. go consume(rawReader, chRaw)
  64. go consume(apiReader, chApi)
  65. go consume(latestReader, chLatest)
  66. for {
  67. select {
  68. case msg := <-chRaw:
  69. processIncoming(msg, &appCtx)
  70. case msg := <-chApi:
  71. fmt.Println("api msg: ", msg)
  72. case msg := <-chLatest:
  73. fmt.Println("latest msg: ", msg)
  74. }
  75. }
  76. }
  77. func kafkaWriter(kafkaURL, topic string) *kafka.Writer {
  78. return &kafka.Writer{
  79. Addr: kafka.TCP(kafkaURL),
  80. Topic: topic,
  81. Balancer: &kafka.LeastBytes{},
  82. BatchSize: 100,
  83. BatchTimeout: 10 * time.Millisecond,
  84. }
  85. }
  86. func kafkaReader(kafkaURL, topic, groupID string) *kafka.Reader {
  87. brokers := strings.Split(kafkaURL, ",")
  88. return kafka.NewReader(kafka.ReaderConfig{
  89. Brokers: brokers,
  90. GroupID: groupID,
  91. Topic: topic,
  92. MinBytes: 1,
  93. MaxBytes: 10e6,
  94. })
  95. }
  96. func consume(r *kafka.Reader, ch chan<- model.Incoming_json) {
  97. for {
  98. msg, err := r.ReadMessage(context.Background())
  99. if err != nil {
  100. fmt.Println("error reading message:", err)
  101. continue
  102. }
  103. var incoming model.Incoming_json
  104. if err := json.Unmarshal(msg.Value, &incoming); err != nil {
  105. fmt.Println("error in decoding string: ", err)
  106. continue
  107. }
  108. ch <- incoming
  109. }
  110. }
  111. func processIncoming(incoming model.Incoming_json, ctx *model.AppContext) {
  112. defer func() {
  113. if err := recover(); err != nil {
  114. fmt.Println("work failed:", err)
  115. }
  116. }()
  117. incoming = mqttclient.IncomingBeaconFilter(incoming)
  118. id := mqttclient.GetBeaconID(incoming)
  119. now := time.Now().Unix()
  120. beacons := &ctx.Beacons
  121. beacons.Lock.Lock()
  122. defer beacons.Lock.Unlock()
  123. latestList := &ctx.LatestList
  124. latestList.Lock.Lock()
  125. defer latestList.Lock.Unlock()
  126. beacon, exists := beacons.Beacons[id]
  127. if !exists {
  128. fmt.Println("beacon does not yet exist")
  129. fmt.Println("time now: ", now)
  130. return
  131. }
  132. fmt.Println("Beacon does exist: ", beacon)
  133. }