Skip to content

Commit 4318721

Browse files
committed
Make location and altitude optional.
1 parent e900475 commit 4318721

File tree

7 files changed

+79
-26
lines changed

7 files changed

+79
-26
lines changed

docs/changelog.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Changelog
22

3+
## 2.1.4
4+
5+
* Retry connecting to MQTT broker on startup (thanks @jcampanell-cablelabs).
6+
* Make latitude, longitude and altitude optional as this data is not always
7+
provided by the packet_forwarder and would else incorrectly be set to `0`.
8+
39
## 2.1.3
410

511
* Provide `TXPacketsReceived` and `TXPacketsEmitted` in stats.

docs/topics.md

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,14 @@ Topic for gateway statistics. Example payload:
2121

2222
```json
2323
{
24-
"altitude": 0,
25-
"latitude": 0,
26-
"longitude": 0,
24+
"altitude": 10, // only available when gateway has gps
25+
"latitude": 52.3740364, // only available when gateway has gps
26+
"longitude": 4.9144401, // only available when gateway has gps
2727
"mac": "1dee08d0b691d149",
28-
"rxPacketsReceived": 2,
29-
"rxPacketsReceivedOK": 1,
28+
"rxPacketsReceived": 20,
29+
"rxPacketsReceivedOK": 15,
30+
"txPacketsReceived": 10,
31+
"txPacketsEmitted": 9,
3032
"time": "2016-06-10T14:04:53Z"
3133
}
3234
```

gateway/backend.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -387,17 +387,23 @@ func (b *Backend) handleTXACK(addr *net.UDPAddr, data []byte) error {
387387
// newGatewayStatsPacket from Stat transforms a Semtech Stat packet into a
388388
// gw.GatewayStatsPacket.
389389
func newGatewayStatsPacket(mac lorawan.EUI64, stat Stat) gw.GatewayStatsPacket {
390-
return gw.GatewayStatsPacket{
390+
gwStat := gw.GatewayStatsPacket{
391391
Time: time.Time(stat.Time),
392392
MAC: mac,
393393
Latitude: stat.Lati,
394394
Longitude: stat.Long,
395-
Altitude: float64(stat.Alti),
396395
RXPacketsReceived: int(stat.RXNb),
397396
RXPacketsReceivedOK: int(stat.RXOK),
398397
TXPacketsReceived: int(stat.DWNb),
399398
TXPacketsEmitted: int(stat.TXNb),
400399
}
400+
401+
if stat.Alti != nil {
402+
alt := float64(*stat.Alti)
403+
gwStat.Altitude = &alt
404+
}
405+
406+
return gwStat
401407
}
402408

403409
// newRXPacketFromRXPK transforms a Semtech packet into a gw.RXPacketBytes.

gateway/backend_test.go

Lines changed: 49 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ func TestBackend(t *testing.T) {
2020
backendAddr, err := net.ResolveUDPAddr("udp", backend.conn.LocalAddr().String())
2121
So(err, ShouldBeNil)
2222

23+
latitude := float64(1.234)
24+
longitude := float64(2.123)
25+
altitude := int32(123)
26+
2327
Convey("Given a fake gateway UDP publisher", func() {
2428
gwAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:0")
2529
So(err, ShouldBeNil)
@@ -58,9 +62,9 @@ func TestBackend(t *testing.T) {
5862
Payload: PushDataPayload{
5963
Stat: &Stat{
6064
Time: ExpandedTime(time.Time{}.UTC()),
61-
Lati: 1.234,
62-
Long: 2.123,
63-
Alti: 123,
65+
Lati: &latitude,
66+
Long: &longitude,
67+
Alti: &altitude,
6468
RXNb: 1,
6569
RXOK: 2,
6670
RXFW: 3,
@@ -375,13 +379,17 @@ func TestBackend(t *testing.T) {
375379
}
376380

377381
func TestNewGatewayStatPacket(t *testing.T) {
378-
Convey("Given a (Semtech) Stat struct and gateway MAC", t, func() {
382+
Convey("Given a (Semtech) Stat struct and gateway MAC with GPS data", t, func() {
383+
latitude := float64(1.234)
384+
longitude := float64(2.123)
385+
altitude := int32(123)
386+
379387
now := time.Now().UTC()
380388
stat := Stat{
381389
Time: ExpandedTime(now),
382-
Lati: 1.234,
383-
Long: 2.123,
384-
Alti: 234,
390+
Lati: &latitude,
391+
Long: &longitude,
392+
Alti: &altitude,
385393
RXNb: 1,
386394
RXOK: 2,
387395
RXFW: 3,
@@ -392,22 +400,53 @@ func TestNewGatewayStatPacket(t *testing.T) {
392400
mac := [8]byte{1, 2, 3, 4, 5, 6, 7, 8}
393401

394402
Convey("When calling newGatewayStatsPacket", func() {
403+
latitude := float64(1.234)
404+
longitude := float64(2.123)
405+
altitude := float64(123)
406+
395407
gwStats := newGatewayStatsPacket(mac, stat)
396408
Convey("Then all fields are set correctly", func() {
397409
So(gwStats, ShouldResemble, gw.GatewayStatsPacket{
398410
Time: now,
399411
MAC: mac,
400-
Latitude: 1.234,
401-
Longitude: 2.123,
402-
Altitude: 234,
412+
Latitude: &latitude,
413+
Longitude: &longitude,
414+
Altitude: &altitude,
403415
RXPacketsReceived: 1,
404416
RXPacketsReceivedOK: 2,
405417
TXPacketsReceived: 4,
406418
TXPacketsEmitted: 3,
407419
})
408420
})
409421
})
422+
})
410423

424+
Convey("Given a (Semtech) Stat struct and gateway MAC without GPS data", t, func() {
425+
now := time.Now().UTC()
426+
stat := Stat{
427+
Time: ExpandedTime(now),
428+
RXNb: 1,
429+
RXOK: 2,
430+
RXFW: 3,
431+
ACKR: 33.3,
432+
DWNb: 4,
433+
TXNb: 3,
434+
}
435+
mac := [8]byte{1, 2, 3, 4, 5, 6, 7, 8}
436+
437+
Convey("When calling newGatewayStatsPacket", func() {
438+
gwStats := newGatewayStatsPacket(mac, stat)
439+
Convey("Then all fields are set correctly", func() {
440+
So(gwStats, ShouldResemble, gw.GatewayStatsPacket{
441+
Time: now,
442+
MAC: mac,
443+
RXPacketsReceived: 1,
444+
RXPacketsReceivedOK: 2,
445+
TXPacketsReceived: 4,
446+
TXPacketsEmitted: 3,
447+
})
448+
})
449+
})
411450
})
412451
}
413452

gateway/structs.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -394,9 +394,9 @@ type RXPK struct {
394394
// Stat contains the status of the gateway.
395395
type Stat struct {
396396
Time ExpandedTime `json:"time"` // UTC 'system' time of the gateway, ISO 8601 'expanded' format (e.g 2014-01-12 08:59:28 GMT)
397-
Lati float64 `json:"lati"` // GPS latitude of the gateway in degree (float, N is +)
398-
Long float64 `json:"long"` // GPS latitude of the gateway in degree (float, E is +)
399-
Alti int32 `json:"alti"` // GPS altitude of the gateway in meter RX (integer)
397+
Lati *float64 `json:"lati"` // GPS latitude of the gateway in degree (float, N is +)
398+
Long *float64 `json:"long"` // GPS latitude of the gateway in degree (float, E is +)
399+
Alti *int32 `json:"alti"` // GPS altitude of the gateway in meter RX (integer)
400400
RXNb uint32 `json:"rxnb"` // Number of radio packets received (unsigned integer)
401401
RXOK uint32 `json:"rxok"` // Number of radio packets received with a valid PHY CRC
402402
RXFW uint32 `json:"rxfw"` // Number of radio packets forwarded (unsigned integer)

vendor/github.com/brocaar/loraserver/api/gw/gw.go

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/vendor.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@
99
"revisionTime": "2016-06-01T11:32:10Z"
1010
},
1111
{
12-
"checksumSHA1": "OczmUysWM7nRgR3w/90QktARp1A=",
12+
"checksumSHA1": "6EjJ4tPAes1IG51evTGi4DMLoSc=",
1313
"path": "github.com/brocaar/loraserver/api/gw",
14-
"revision": "dc0fea616507659ec7272203a8c2caae817aea08",
15-
"revisionTime": "2017-02-15T08:45:58Z"
14+
"revision": "09db862703abb0923cc842d0e54e201de47df219",
15+
"revisionTime": "2017-03-24T09:36:17Z"
1616
},
1717
{
1818
"checksumSHA1": "ya7tMk+wexXh1cmbdp0Sw0lbM1k=",

0 commit comments

Comments
 (0)