2 Commit

4 ha cambiato i file con 33 aggiunte e 70410 eliminazioni
  1. +0
    -70299
      cmd/decoder/analysis.txt
  2. +0
    -32
      cmd/decoder/examples.txt
  3. +10
    -27
      cmd/decoder/main.go
  4. +23
    -52
      cmd/location/main.go

+ 0
- 70299
cmd/decoder/analysis.txt
File diff soppresso perché troppo grande
Vedi File


+ 0
- 32
cmd/decoder/examples.txt Vedi File

@@ -1,32 +0,0 @@
Ingics iBS01G
id: C83F8F17DB35
020106 12 FF590080BC240100FFFFFFFF000000000000
id: C83F8F17DB35
020106 12 FF590080BC240100FFFFFFFF000000000000


type 0x16 - service Data

Minew B7
id: C300003947C4
020106 0303E1FF 1216E1FFA1031AFFFEFEFB0000C447390000C3
id: C300003947C4
0201061AFF4C000215FDA50693A4E24FB1AFCFC6EB0764782500000000EC - iBeacon
id: C300003947C4
020106 0303AAFE 1516AAFE00E800112233445566778899ABCDE7280002 - eddystone
id: C300003947C4
0201060303E1FF1216E1FFA1031AFFFEFEFB0000C447390000C3
id: C300003947C4
0201060303E1FF0E16E1FFA1081AC447390000C34237

Minew MWB01
id: C7AE561E38B7
02010617FF0001000000000000000000005F0700006F4C0000640003095336
id: C7AE561E38B7
02010617FF00020000FF0000FF0000FF0006001D005200000B200803095336

Minew MWC01
id: E01F9A7A47D2
02010617FF00020000FF0000FF0000FF0006001D005200000A242D03095332
id: E01F9A7A47D2
02010617FF000100000000000000000000780700006F4C0000640003095332

+ 10
- 27
cmd/decoder/main.go Vedi File

@@ -9,6 +9,7 @@ import (
"fmt"
"strings"

"github.com/AFASystems/presence/internal/pkg/common/appcontext"
"github.com/AFASystems/presence/internal/pkg/config"
"github.com/AFASystems/presence/internal/pkg/kafkaclient"
"github.com/AFASystems/presence/internal/pkg/model"
@@ -17,25 +18,7 @@ import (

func main() {
// Load global context to init beacons and latest list
appCtx := model.AppContext{
Beacons: model.BeaconsList{
Beacons: make(map[string]model.Beacon),
},
Settings: model.Settings{
Settings: model.SettingsVal{
LocationConfidence: 4,
LastSeenThreshold: 15,
BeaconMetricSize: 30,
HASendInterval: 5,
HASendChangesOnly: false,
},
},
BeaconEvents: model.BeaconEventList{
Beacons: make(map[string]model.BeaconEvent),
},
BeaconsLookup: make(map[string]struct{}),
}

appState := appcontext.NewAppState()
cfg := config.Load()

// Kafka reader for Raw MQTT beacons
@@ -59,12 +42,12 @@ func main() {
for {
select {
case msg := <-chRaw:
processIncoming(msg, &appCtx, alertWriter)
processIncoming(msg, appState, alertWriter)
case msg := <-chApi:
switch msg.Method {
case "POST":
id := msg.Beacon.ID
appCtx.BeaconsLookup[id] = struct{}{}
appState.AddBeaconToLookup(id)
case "DELETE":
fmt.Println("Incoming delete message")
}
@@ -72,21 +55,21 @@ func main() {
}
}

func processIncoming(adv model.BeaconAdvertisement, ctx *model.AppContext, writer *kafka.Writer) {
func processIncoming(adv model.BeaconAdvertisement, appState *appcontext.AppState, writer *kafka.Writer) {
id := adv.MAC
_, ok := ctx.BeaconsLookup[id]
ok := appState.BeaconExists(id)
if !ok {
return
}

err := decodeBeacon(adv, ctx, writer)
err := decodeBeacon(adv, appState, writer)
if err != nil {
fmt.Println("error in decoding")
return
}
}

func decodeBeacon(adv model.BeaconAdvertisement, ctx *model.AppContext, writer *kafka.Writer) error {
func decodeBeacon(adv model.BeaconAdvertisement, appState *appcontext.AppState, writer *kafka.Writer) error {
beacon := strings.TrimSpace(adv.Data)
id := adv.MAC
if beacon == "" {
@@ -127,8 +110,8 @@ func decodeBeacon(adv model.BeaconAdvertisement, ctx *model.AppContext, writer *
}

if event.ID != "" {
prevEvent, ok := ctx.BeaconEvents.Beacons[id]
ctx.BeaconEvents.Beacons[id] = event
prevEvent, ok := appState.GetBeaconEvent(id)
appState.UpdateBeaconEvent(id, event)
if ok && bytes.Equal(prevEvent.Hash(), event.Hash()) {
return nil
}


+ 23
- 52
cmd/location/main.go Vedi File

@@ -8,6 +8,7 @@ import (
"strconv"
"time"

"github.com/AFASystems/presence/internal/pkg/common/appcontext"
"github.com/AFASystems/presence/internal/pkg/config"
"github.com/AFASystems/presence/internal/pkg/kafkaclient"
"github.com/AFASystems/presence/internal/pkg/model"
@@ -16,27 +17,7 @@ import (

func main() {
// Load global context to init beacons and latest list
appCtx := model.AppContext{
Settings: model.Settings{
Settings: model.SettingsVal{
LocationConfidence: 4,
LastSeenThreshold: 15,
BeaconMetricSize: 30,
HASendInterval: 5,
HASendChangesOnly: false,
RSSIEnforceThreshold: false,
RSSIMinThreshold: 100,
},
},
BeaconsLookup: make(map[string]struct{}),
LatestList: model.LatestBeaconsList{
LatestList: make(map[string]model.Beacon),
},
Beacons: model.BeaconsList{
Beacons: make(map[string]model.Beacon),
},
}

appState := appcontext.NewAppState()
cfg := config.Load()

// Kafka reader for Raw MQTT beacons
@@ -64,14 +45,14 @@ func main() {
for {
select {
case <-locTicker.C:
getLikelyLocations(&appCtx, writer)
getLikelyLocations(appState, writer)
case msg := <-chRaw:
assignBeaconToList(msg, &appCtx)
assignBeaconToList(msg, appState)
case msg := <-chApi:
switch msg.Method {
case "POST":
id := msg.Beacon.ID
appCtx.BeaconsLookup[id] = struct{}{}
appState.AddBeaconToLookup(id)
case "DELETE":
fmt.Println("Incoming delete message")
}
@@ -79,11 +60,10 @@ func main() {
}
}

func getLikelyLocations(ctx *model.AppContext, writer *kafka.Writer) {
func getLikelyLocations(appState *appcontext.AppState, writer *kafka.Writer) {
fmt.Println("get likely locations called")
ctx.Beacons.Lock.Lock()
beacons := ctx.Beacons.Beacons
ctx.Beacons.Lock.Unlock()
beacons := appState.GetAllBeacons()
settings := appState.GetSettingsValue()

for _, beacon := range beacons {
// Shrinking the model because other properties have nothing to do with the location
@@ -97,7 +77,7 @@ func getLikelyLocations(ctx *model.AppContext, writer *kafka.Writer) {

mSize := len(beacon.BeaconMetrics)

if (int64(time.Now().Unix()) - (beacon.BeaconMetrics[mSize-1].Timestamp)) > ctx.Settings.Settings.LastSeenThreshold {
if (int64(time.Now().Unix()) - (beacon.BeaconMetrics[mSize-1].Timestamp)) > settings.LastSeenThreshold {
continue
}

@@ -128,7 +108,7 @@ func getLikelyLocations(ctx *model.AppContext, writer *kafka.Writer) {
r.Location = bestLocName
r.LastSeen = beacon.BeaconMetrics[mSize-1].Timestamp

if beacon.LocationConfidence == ctx.Settings.Settings.LocationConfidence && beacon.PreviousConfidentLocation != bestLocName {
if beacon.LocationConfidence == settings.LocationConfidence && beacon.PreviousConfidentLocation != bestLocName {
beacon.LocationConfidence = 0

// Who do I need this if I am sending entire structure anyways? who knows
@@ -144,9 +124,7 @@ func getLikelyLocations(ctx *model.AppContext, writer *kafka.Writer) {
if err != nil {
beacon.PreviousConfidentLocation = bestLocName
beacon.PreviousLocation = bestLocName
ctx.Beacons.Lock.Lock()
ctx.Beacons.Beacons[beacon.ID] = beacon
ctx.Beacons.Lock.Unlock()
appState.UpdateBeacon(beacon.ID, beacon)
continue
}

@@ -161,9 +139,7 @@ func getLikelyLocations(ctx *model.AppContext, writer *kafka.Writer) {
}

beacon.PreviousLocation = bestLocName
ctx.Beacons.Lock.Lock()
ctx.Beacons.Beacons[beacon.ID] = beacon
ctx.Beacons.Lock.Unlock()
appState.UpdateBeacon(beacon.ID, beacon)

js, err := json.Marshal(r)
if err != nil {
@@ -181,38 +157,35 @@ func getLikelyLocations(ctx *model.AppContext, writer *kafka.Writer) {
}
}

func assignBeaconToList(adv model.BeaconAdvertisement, ctx *model.AppContext) {
func assignBeaconToList(adv model.BeaconAdvertisement, appState *appcontext.AppState) {
id := adv.MAC
_, ok := ctx.BeaconsLookup[id]

ok := appState.BeaconExists(id)
now := time.Now().Unix()

if !ok {
ctx.LatestList.Lock.Lock()
ctx.LatestList.LatestList[id] = model.Beacon{ID: id, BeaconType: adv.BeaconType, LastSeen: now, IncomingJSON: adv, BeaconLocation: adv.Hostname, Distance: getBeaconDistance(adv)}
ctx.LatestList.Lock.Unlock()
appState.UpdateLatestBeacon(id, model.Beacon{ID: id, BeaconType: adv.BeaconType, LastSeen: now, IncomingJSON: adv, BeaconLocation: adv.Hostname, Distance: getBeaconDistance(adv)})
return
}

settings := appState.GetSettingsValue()

fmt.Println("RSSI: ", adv.RSSI)
if ctx.Settings.Settings.RSSIEnforceThreshold && (int64(adv.RSSI) < ctx.Settings.Settings.RSSIMinThreshold) {
if settings.RSSIEnforceThreshold && (int64(adv.RSSI) < settings.RSSIMinThreshold) {
return
}

ctx.Beacons.Lock.Lock()
beacon, ok := ctx.Beacons.Beacons[id]
beacon, ok := appState.GetBeacon(id)
if !ok {
beacon = model.Beacon{
ID: id,
}
}
ctx.Beacons.Lock.Unlock()

beacon.IncomingJSON = adv
beacon.LastSeen = now

if beacon.BeaconMetrics == nil {
beacon.BeaconMetrics = make([]model.BeaconMetric, 0, ctx.Settings.Settings.BeaconMetricSize)
beacon.BeaconMetrics = make([]model.BeaconMetric, 0, settings.BeaconMetricSize)
}

metric := model.BeaconMetric{
@@ -222,16 +195,14 @@ func assignBeaconToList(adv model.BeaconAdvertisement, ctx *model.AppContext) {
Location: adv.Hostname,
}

if len(beacon.BeaconMetrics) >= ctx.Settings.Settings.BeaconMetricSize {
if len(beacon.BeaconMetrics) >= settings.BeaconMetricSize {
copy(beacon.BeaconMetrics, beacon.BeaconMetrics[1:])
beacon.BeaconMetrics[ctx.Settings.Settings.BeaconMetricSize-1] = metric
beacon.BeaconMetrics[settings.BeaconMetricSize-1] = metric
} else {
beacon.BeaconMetrics = append(beacon.BeaconMetrics, metric)
}

ctx.Beacons.Lock.Lock()
ctx.Beacons.Beacons[id] = beacon
ctx.Beacons.Lock.Unlock()
appState.UpdateBeacon(id, beacon)
}

func getBeaconDistance(adv model.BeaconAdvertisement) float64 {


Caricamento…
Annulla
Salva