mirror of
https://github.com/chirpstack/chirpstack.git
synced 2025-06-14 21:48:07 +00:00
Integrate Gateway Mesh feature.
This adds a Gateway Mesh section to the web-interface (+ API endpoints) to see the status op each Relay Gateway within the Gateway Mesh. The Gateway Mesh (https://github.com/chirpstack/chirpstack-gateway-mesh) is an experimental feature to extend LoRaWAN coverage throug Relay Gateways.
This commit is contained in:
10
Cargo.lock
generated
10
Cargo.lock
generated
@ -570,7 +570,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "backend"
|
name = "backend"
|
||||||
version = "4.8.1"
|
version = "4.9.0-test.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"aes-kw",
|
"aes-kw",
|
||||||
"anyhow",
|
"anyhow",
|
||||||
@ -800,7 +800,7 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "chirpstack"
|
name = "chirpstack"
|
||||||
version = "4.8.1"
|
version = "4.9.0-test.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"aes",
|
"aes",
|
||||||
"anyhow",
|
"anyhow",
|
||||||
@ -891,7 +891,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "chirpstack_api"
|
name = "chirpstack_api"
|
||||||
version = "4.8.1"
|
version = "4.9.0-test.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"diesel",
|
"diesel",
|
||||||
"hex",
|
"hex",
|
||||||
@ -2582,7 +2582,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lrwn"
|
name = "lrwn"
|
||||||
version = "4.8.1"
|
version = "4.9.0-test.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"aes",
|
"aes",
|
||||||
"anyhow",
|
"anyhow",
|
||||||
@ -2596,7 +2596,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lrwn_filters"
|
name = "lrwn_filters"
|
||||||
version = "4.8.1"
|
version = "4.9.0-test.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"hex",
|
"hex",
|
||||||
"lrwn",
|
"lrwn",
|
||||||
|
21
api/go/api/application.pb.go
vendored
21
api/go/api/application.pb.go
vendored
@ -1,6 +1,6 @@
|
|||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
// versions:
|
// versions:
|
||||||
// protoc-gen-go v1.31.0
|
// protoc-gen-go v1.34.1
|
||||||
// protoc v4.24.4
|
// protoc v4.24.4
|
||||||
// source: api/application.proto
|
// source: api/application.proto
|
||||||
|
|
||||||
@ -5622,14 +5622,17 @@ var file_api_application_proto_rawDesc = []byte{
|
|||||||
0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69,
|
0x73, 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69,
|
||||||
0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f,
|
0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f,
|
||||||
0x6d, 0x71, 0x74, 0x74, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65,
|
0x6d, 0x71, 0x74, 0x74, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65,
|
||||||
0x42, 0x68, 0x0a, 0x11, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63,
|
0x42, 0x96, 0x01, 0x0a, 0x11, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61,
|
||||||
0x6b, 0x2e, 0x61, 0x70, 0x69, 0x42, 0x10, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69,
|
0x63, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x42, 0x10, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74,
|
||||||
0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75,
|
0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68,
|
||||||
0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b,
|
0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63,
|
||||||
0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x61, 0x70, 0x69, 0x2f,
|
0x6b, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x61, 0x70, 0x69,
|
||||||
0x67, 0x6f, 0x2f, 0x76, 0x34, 0x2f, 0x61, 0x70, 0x69, 0xaa, 0x02, 0x0e, 0x43, 0x68, 0x69, 0x72,
|
0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x34, 0x2f, 0x61, 0x70, 0x69, 0xaa, 0x02, 0x0e, 0x43, 0x68, 0x69,
|
||||||
0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
|
0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x70, 0x69, 0xca, 0x02, 0x0e, 0x43, 0x68,
|
||||||
0x6f, 0x33,
|
0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5c, 0x41, 0x70, 0x69, 0xe2, 0x02, 0x1a, 0x47,
|
||||||
|
0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5c, 0x43, 0x68, 0x69, 0x72, 0x70,
|
||||||
|
0x73, 0x74, 0x61, 0x63, 0x6b, 0x5c, 0x41, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
|
||||||
|
0x33,
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
19
api/go/api/device.pb.go
vendored
19
api/go/api/device.pb.go
vendored
@ -1,6 +1,6 @@
|
|||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
// versions:
|
// versions:
|
||||||
// protoc-gen-go v1.31.0
|
// protoc-gen-go v1.34.1
|
||||||
// protoc v4.24.4
|
// protoc v4.24.4
|
||||||
// source: api/device.proto
|
// source: api/device.proto
|
||||||
|
|
||||||
@ -2888,13 +2888,16 @@ var file_api_device_proto_rawDesc = []byte{
|
|||||||
0xe4, 0x93, 0x02, 0x2f, 0x3a, 0x01, 0x2a, 0x22, 0x2a, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65,
|
0xe4, 0x93, 0x02, 0x2f, 0x3a, 0x01, 0x2a, 0x22, 0x2a, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65,
|
||||||
0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x7d, 0x2f,
|
0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x7d, 0x2f,
|
||||||
0x67, 0x65, 0x74, 0x2d, 0x6e, 0x65, 0x78, 0x74, 0x2d, 0x66, 0x2d, 0x63, 0x6e, 0x74, 0x2d, 0x64,
|
0x67, 0x65, 0x74, 0x2d, 0x6e, 0x65, 0x78, 0x74, 0x2d, 0x66, 0x2d, 0x63, 0x6e, 0x74, 0x2d, 0x64,
|
||||||
0x6f, 0x77, 0x6e, 0x42, 0x63, 0x0a, 0x11, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73,
|
0x6f, 0x77, 0x6e, 0x42, 0x91, 0x01, 0x0a, 0x11, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72, 0x70,
|
||||||
0x74, 0x61, 0x63, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x42, 0x0b, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65,
|
0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x42, 0x0b, 0x44, 0x65, 0x76, 0x69, 0x63,
|
||||||
0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e,
|
0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,
|
||||||
0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x63,
|
0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f,
|
||||||
0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f,
|
0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67,
|
||||||
0x2f, 0x76, 0x34, 0x2f, 0x61, 0x70, 0x69, 0xaa, 0x02, 0x0e, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73,
|
0x6f, 0x2f, 0x76, 0x34, 0x2f, 0x61, 0x70, 0x69, 0xaa, 0x02, 0x0e, 0x43, 0x68, 0x69, 0x72, 0x70,
|
||||||
0x74, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x70, 0x69, 0xca, 0x02, 0x0e, 0x43, 0x68, 0x69, 0x72,
|
||||||
|
0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5c, 0x41, 0x70, 0x69, 0xe2, 0x02, 0x1a, 0x47, 0x50, 0x42,
|
||||||
|
0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5c, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74,
|
||||||
|
0x61, 0x63, 0x6b, 0x5c, 0x41, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
21
api/go/api/device_profile.pb.go
vendored
21
api/go/api/device_profile.pb.go
vendored
@ -1,6 +1,6 @@
|
|||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
// versions:
|
// versions:
|
||||||
// protoc-gen-go v1.31.0
|
// protoc-gen-go v1.34.1
|
||||||
// protoc v4.24.4
|
// protoc v4.24.4
|
||||||
// source: api/device_profile.proto
|
// source: api/device_profile.proto
|
||||||
|
|
||||||
@ -2054,14 +2054,17 @@ var file_api_device_profile_proto_rawDesc = []byte{
|
|||||||
0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x12, 0x23, 0x2f,
|
0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x12, 0x23, 0x2f,
|
||||||
0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2d, 0x70, 0x72, 0x6f, 0x66, 0x69,
|
0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2d, 0x70, 0x72, 0x6f, 0x66, 0x69,
|
||||||
0x6c, 0x65, 0x73, 0x2f, 0x61, 0x64, 0x72, 0x2d, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68,
|
0x6c, 0x65, 0x73, 0x2f, 0x61, 0x64, 0x72, 0x2d, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68,
|
||||||
0x6d, 0x73, 0x42, 0x6a, 0x0a, 0x11, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74,
|
0x6d, 0x73, 0x42, 0x98, 0x01, 0x0a, 0x11, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73,
|
||||||
0x61, 0x63, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x42, 0x12, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x50,
|
0x74, 0x61, 0x63, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x42, 0x12, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65,
|
||||||
0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2e, 0x67,
|
0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2e,
|
||||||
0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73,
|
0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70,
|
||||||
0x74, 0x61, 0x63, 0x6b, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f,
|
0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b,
|
||||||
0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x34, 0x2f, 0x61, 0x70, 0x69, 0xaa, 0x02, 0x0e,
|
0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x34, 0x2f, 0x61, 0x70, 0x69, 0xaa, 0x02,
|
||||||
0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x70, 0x69, 0x62, 0x06,
|
0x0e, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x70, 0x69, 0xca,
|
||||||
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
0x02, 0x0e, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5c, 0x41, 0x70, 0x69,
|
||||||
|
0xe2, 0x02, 0x1a, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5c, 0x43,
|
||||||
|
0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5c, 0x41, 0x70, 0x69, 0x62, 0x06, 0x70,
|
||||||
|
0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
21
api/go/api/device_profile_template.pb.go
vendored
21
api/go/api/device_profile_template.pb.go
vendored
@ -1,6 +1,6 @@
|
|||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
// versions:
|
// versions:
|
||||||
// protoc-gen-go v1.31.0
|
// protoc-gen-go v1.34.1
|
||||||
// protoc v4.24.4
|
// protoc v4.24.4
|
||||||
// source: api/device_profile_template.proto
|
// source: api/device_profile_template.proto
|
||||||
|
|
||||||
@ -1088,14 +1088,17 @@ var file_api_device_profile_template_proto_rawDesc = []byte{
|
|||||||
0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82,
|
0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82,
|
||||||
0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x12, 0x1d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69,
|
0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x12, 0x1d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69,
|
||||||
0x63, 0x65, 0x2d, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2d, 0x74, 0x65, 0x6d, 0x70, 0x6c,
|
0x63, 0x65, 0x2d, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2d, 0x74, 0x65, 0x6d, 0x70, 0x6c,
|
||||||
0x61, 0x74, 0x65, 0x73, 0x42, 0x72, 0x0a, 0x11, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72, 0x70,
|
0x61, 0x74, 0x65, 0x73, 0x42, 0xa0, 0x01, 0x0a, 0x11, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72,
|
||||||
0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x42, 0x1a, 0x44, 0x65, 0x76, 0x69, 0x63,
|
0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x42, 0x1a, 0x44, 0x65, 0x76, 0x69,
|
||||||
0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65,
|
0x63, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74,
|
||||||
0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e,
|
0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,
|
||||||
0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x63,
|
0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f,
|
||||||
0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f,
|
0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67,
|
||||||
0x2f, 0x76, 0x34, 0x2f, 0x61, 0x70, 0x69, 0xaa, 0x02, 0x0e, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73,
|
0x6f, 0x2f, 0x76, 0x34, 0x2f, 0x61, 0x70, 0x69, 0xaa, 0x02, 0x0e, 0x43, 0x68, 0x69, 0x72, 0x70,
|
||||||
0x74, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x70, 0x69, 0xca, 0x02, 0x0e, 0x43, 0x68, 0x69, 0x72,
|
||||||
|
0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5c, 0x41, 0x70, 0x69, 0xe2, 0x02, 0x1a, 0x47, 0x50, 0x42,
|
||||||
|
0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5c, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74,
|
||||||
|
0x61, 0x63, 0x6b, 0x5c, 0x41, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
1074
api/go/api/gateway.pb.go
vendored
1074
api/go/api/gateway.pb.go
vendored
File diff suppressed because it is too large
Load Diff
156
api/go/api/gateway_grpc.pb.go
vendored
156
api/go/api/gateway_grpc.pb.go
vendored
@ -28,6 +28,10 @@ const (
|
|||||||
GatewayService_GenerateClientCertificate_FullMethodName = "/api.GatewayService/GenerateClientCertificate"
|
GatewayService_GenerateClientCertificate_FullMethodName = "/api.GatewayService/GenerateClientCertificate"
|
||||||
GatewayService_GetMetrics_FullMethodName = "/api.GatewayService/GetMetrics"
|
GatewayService_GetMetrics_FullMethodName = "/api.GatewayService/GetMetrics"
|
||||||
GatewayService_GetDutyCycleMetrics_FullMethodName = "/api.GatewayService/GetDutyCycleMetrics"
|
GatewayService_GetDutyCycleMetrics_FullMethodName = "/api.GatewayService/GetDutyCycleMetrics"
|
||||||
|
GatewayService_GetRelayGateway_FullMethodName = "/api.GatewayService/GetRelayGateway"
|
||||||
|
GatewayService_ListRelayGateways_FullMethodName = "/api.GatewayService/ListRelayGateways"
|
||||||
|
GatewayService_UpdateRelayGateway_FullMethodName = "/api.GatewayService/UpdateRelayGateway"
|
||||||
|
GatewayService_DeleteRelayGateway_FullMethodName = "/api.GatewayService/DeleteRelayGateway"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GatewayServiceClient is the client API for GatewayService service.
|
// GatewayServiceClient is the client API for GatewayService service.
|
||||||
@ -51,6 +55,14 @@ type GatewayServiceClient interface {
|
|||||||
// GetDutyCycleMetrics returns the duty-cycle metrics.
|
// GetDutyCycleMetrics returns the duty-cycle metrics.
|
||||||
// Note that only the last 2 hours of data are stored. Currently only per minute aggregation is available.
|
// Note that only the last 2 hours of data are stored. Currently only per minute aggregation is available.
|
||||||
GetDutyCycleMetrics(ctx context.Context, in *GetGatewayDutyCycleMetricsRequest, opts ...grpc.CallOption) (*GetGatewayDutyCycleMetricsResponse, error)
|
GetDutyCycleMetrics(ctx context.Context, in *GetGatewayDutyCycleMetricsRequest, opts ...grpc.CallOption) (*GetGatewayDutyCycleMetricsResponse, error)
|
||||||
|
// Get the given Relay Gateway.
|
||||||
|
GetRelayGateway(ctx context.Context, in *GetRelayGatewayRequest, opts ...grpc.CallOption) (*GetRelayGatewayResponse, error)
|
||||||
|
// List the detected Relay Gateways.
|
||||||
|
ListRelayGateways(ctx context.Context, in *ListRelayGatewaysRequest, opts ...grpc.CallOption) (*ListRelayGatewaysResponse, error)
|
||||||
|
// Update the given Relay Gateway.
|
||||||
|
UpdateRelayGateway(ctx context.Context, in *UpdateRelayGatewayRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
|
||||||
|
// Delete the given Relay Gateway.
|
||||||
|
DeleteRelayGateway(ctx context.Context, in *DeleteRelayGatewayRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type gatewayServiceClient struct {
|
type gatewayServiceClient struct {
|
||||||
@ -133,6 +145,42 @@ func (c *gatewayServiceClient) GetDutyCycleMetrics(ctx context.Context, in *GetG
|
|||||||
return out, nil
|
return out, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *gatewayServiceClient) GetRelayGateway(ctx context.Context, in *GetRelayGatewayRequest, opts ...grpc.CallOption) (*GetRelayGatewayResponse, error) {
|
||||||
|
out := new(GetRelayGatewayResponse)
|
||||||
|
err := c.cc.Invoke(ctx, GatewayService_GetRelayGateway_FullMethodName, in, out, opts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *gatewayServiceClient) ListRelayGateways(ctx context.Context, in *ListRelayGatewaysRequest, opts ...grpc.CallOption) (*ListRelayGatewaysResponse, error) {
|
||||||
|
out := new(ListRelayGatewaysResponse)
|
||||||
|
err := c.cc.Invoke(ctx, GatewayService_ListRelayGateways_FullMethodName, in, out, opts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *gatewayServiceClient) UpdateRelayGateway(ctx context.Context, in *UpdateRelayGatewayRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
|
||||||
|
out := new(emptypb.Empty)
|
||||||
|
err := c.cc.Invoke(ctx, GatewayService_UpdateRelayGateway_FullMethodName, in, out, opts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *gatewayServiceClient) DeleteRelayGateway(ctx context.Context, in *DeleteRelayGatewayRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
|
||||||
|
out := new(emptypb.Empty)
|
||||||
|
err := c.cc.Invoke(ctx, GatewayService_DeleteRelayGateway_FullMethodName, in, out, opts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
// GatewayServiceServer is the server API for GatewayService service.
|
// GatewayServiceServer is the server API for GatewayService service.
|
||||||
// All implementations must embed UnimplementedGatewayServiceServer
|
// All implementations must embed UnimplementedGatewayServiceServer
|
||||||
// for forward compatibility
|
// for forward compatibility
|
||||||
@ -154,6 +202,14 @@ type GatewayServiceServer interface {
|
|||||||
// GetDutyCycleMetrics returns the duty-cycle metrics.
|
// GetDutyCycleMetrics returns the duty-cycle metrics.
|
||||||
// Note that only the last 2 hours of data are stored. Currently only per minute aggregation is available.
|
// Note that only the last 2 hours of data are stored. Currently only per minute aggregation is available.
|
||||||
GetDutyCycleMetrics(context.Context, *GetGatewayDutyCycleMetricsRequest) (*GetGatewayDutyCycleMetricsResponse, error)
|
GetDutyCycleMetrics(context.Context, *GetGatewayDutyCycleMetricsRequest) (*GetGatewayDutyCycleMetricsResponse, error)
|
||||||
|
// Get the given Relay Gateway.
|
||||||
|
GetRelayGateway(context.Context, *GetRelayGatewayRequest) (*GetRelayGatewayResponse, error)
|
||||||
|
// List the detected Relay Gateways.
|
||||||
|
ListRelayGateways(context.Context, *ListRelayGatewaysRequest) (*ListRelayGatewaysResponse, error)
|
||||||
|
// Update the given Relay Gateway.
|
||||||
|
UpdateRelayGateway(context.Context, *UpdateRelayGatewayRequest) (*emptypb.Empty, error)
|
||||||
|
// Delete the given Relay Gateway.
|
||||||
|
DeleteRelayGateway(context.Context, *DeleteRelayGatewayRequest) (*emptypb.Empty, error)
|
||||||
mustEmbedUnimplementedGatewayServiceServer()
|
mustEmbedUnimplementedGatewayServiceServer()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -185,6 +241,18 @@ func (UnimplementedGatewayServiceServer) GetMetrics(context.Context, *GetGateway
|
|||||||
func (UnimplementedGatewayServiceServer) GetDutyCycleMetrics(context.Context, *GetGatewayDutyCycleMetricsRequest) (*GetGatewayDutyCycleMetricsResponse, error) {
|
func (UnimplementedGatewayServiceServer) GetDutyCycleMetrics(context.Context, *GetGatewayDutyCycleMetricsRequest) (*GetGatewayDutyCycleMetricsResponse, error) {
|
||||||
return nil, status.Errorf(codes.Unimplemented, "method GetDutyCycleMetrics not implemented")
|
return nil, status.Errorf(codes.Unimplemented, "method GetDutyCycleMetrics not implemented")
|
||||||
}
|
}
|
||||||
|
func (UnimplementedGatewayServiceServer) GetRelayGateway(context.Context, *GetRelayGatewayRequest) (*GetRelayGatewayResponse, error) {
|
||||||
|
return nil, status.Errorf(codes.Unimplemented, "method GetRelayGateway not implemented")
|
||||||
|
}
|
||||||
|
func (UnimplementedGatewayServiceServer) ListRelayGateways(context.Context, *ListRelayGatewaysRequest) (*ListRelayGatewaysResponse, error) {
|
||||||
|
return nil, status.Errorf(codes.Unimplemented, "method ListRelayGateways not implemented")
|
||||||
|
}
|
||||||
|
func (UnimplementedGatewayServiceServer) UpdateRelayGateway(context.Context, *UpdateRelayGatewayRequest) (*emptypb.Empty, error) {
|
||||||
|
return nil, status.Errorf(codes.Unimplemented, "method UpdateRelayGateway not implemented")
|
||||||
|
}
|
||||||
|
func (UnimplementedGatewayServiceServer) DeleteRelayGateway(context.Context, *DeleteRelayGatewayRequest) (*emptypb.Empty, error) {
|
||||||
|
return nil, status.Errorf(codes.Unimplemented, "method DeleteRelayGateway not implemented")
|
||||||
|
}
|
||||||
func (UnimplementedGatewayServiceServer) mustEmbedUnimplementedGatewayServiceServer() {}
|
func (UnimplementedGatewayServiceServer) mustEmbedUnimplementedGatewayServiceServer() {}
|
||||||
|
|
||||||
// UnsafeGatewayServiceServer may be embedded to opt out of forward compatibility for this service.
|
// UnsafeGatewayServiceServer may be embedded to opt out of forward compatibility for this service.
|
||||||
@ -342,6 +410,78 @@ func _GatewayService_GetDutyCycleMetrics_Handler(srv interface{}, ctx context.Co
|
|||||||
return interceptor(ctx, in, info, handler)
|
return interceptor(ctx, in, info, handler)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func _GatewayService_GetRelayGateway_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||||
|
in := new(GetRelayGatewayRequest)
|
||||||
|
if err := dec(in); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if interceptor == nil {
|
||||||
|
return srv.(GatewayServiceServer).GetRelayGateway(ctx, in)
|
||||||
|
}
|
||||||
|
info := &grpc.UnaryServerInfo{
|
||||||
|
Server: srv,
|
||||||
|
FullMethod: GatewayService_GetRelayGateway_FullMethodName,
|
||||||
|
}
|
||||||
|
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
|
return srv.(GatewayServiceServer).GetRelayGateway(ctx, req.(*GetRelayGatewayRequest))
|
||||||
|
}
|
||||||
|
return interceptor(ctx, in, info, handler)
|
||||||
|
}
|
||||||
|
|
||||||
|
func _GatewayService_ListRelayGateways_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||||
|
in := new(ListRelayGatewaysRequest)
|
||||||
|
if err := dec(in); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if interceptor == nil {
|
||||||
|
return srv.(GatewayServiceServer).ListRelayGateways(ctx, in)
|
||||||
|
}
|
||||||
|
info := &grpc.UnaryServerInfo{
|
||||||
|
Server: srv,
|
||||||
|
FullMethod: GatewayService_ListRelayGateways_FullMethodName,
|
||||||
|
}
|
||||||
|
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
|
return srv.(GatewayServiceServer).ListRelayGateways(ctx, req.(*ListRelayGatewaysRequest))
|
||||||
|
}
|
||||||
|
return interceptor(ctx, in, info, handler)
|
||||||
|
}
|
||||||
|
|
||||||
|
func _GatewayService_UpdateRelayGateway_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||||
|
in := new(UpdateRelayGatewayRequest)
|
||||||
|
if err := dec(in); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if interceptor == nil {
|
||||||
|
return srv.(GatewayServiceServer).UpdateRelayGateway(ctx, in)
|
||||||
|
}
|
||||||
|
info := &grpc.UnaryServerInfo{
|
||||||
|
Server: srv,
|
||||||
|
FullMethod: GatewayService_UpdateRelayGateway_FullMethodName,
|
||||||
|
}
|
||||||
|
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
|
return srv.(GatewayServiceServer).UpdateRelayGateway(ctx, req.(*UpdateRelayGatewayRequest))
|
||||||
|
}
|
||||||
|
return interceptor(ctx, in, info, handler)
|
||||||
|
}
|
||||||
|
|
||||||
|
func _GatewayService_DeleteRelayGateway_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||||
|
in := new(DeleteRelayGatewayRequest)
|
||||||
|
if err := dec(in); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if interceptor == nil {
|
||||||
|
return srv.(GatewayServiceServer).DeleteRelayGateway(ctx, in)
|
||||||
|
}
|
||||||
|
info := &grpc.UnaryServerInfo{
|
||||||
|
Server: srv,
|
||||||
|
FullMethod: GatewayService_DeleteRelayGateway_FullMethodName,
|
||||||
|
}
|
||||||
|
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
|
return srv.(GatewayServiceServer).DeleteRelayGateway(ctx, req.(*DeleteRelayGatewayRequest))
|
||||||
|
}
|
||||||
|
return interceptor(ctx, in, info, handler)
|
||||||
|
}
|
||||||
|
|
||||||
// GatewayService_ServiceDesc is the grpc.ServiceDesc for GatewayService service.
|
// GatewayService_ServiceDesc is the grpc.ServiceDesc for GatewayService service.
|
||||||
// It's only intended for direct use with grpc.RegisterService,
|
// It's only intended for direct use with grpc.RegisterService,
|
||||||
// and not to be introspected or modified (even as a copy)
|
// and not to be introspected or modified (even as a copy)
|
||||||
@ -381,6 +521,22 @@ var GatewayService_ServiceDesc = grpc.ServiceDesc{
|
|||||||
MethodName: "GetDutyCycleMetrics",
|
MethodName: "GetDutyCycleMetrics",
|
||||||
Handler: _GatewayService_GetDutyCycleMetrics_Handler,
|
Handler: _GatewayService_GetDutyCycleMetrics_Handler,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
MethodName: "GetRelayGateway",
|
||||||
|
Handler: _GatewayService_GetRelayGateway_Handler,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
MethodName: "ListRelayGateways",
|
||||||
|
Handler: _GatewayService_ListRelayGateways_Handler,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
MethodName: "UpdateRelayGateway",
|
||||||
|
Handler: _GatewayService_UpdateRelayGateway_Handler,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
MethodName: "DeleteRelayGateway",
|
||||||
|
Handler: _GatewayService_DeleteRelayGateway_Handler,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
Streams: []grpc.StreamDesc{},
|
Streams: []grpc.StreamDesc{},
|
||||||
Metadata: "api/gateway.proto",
|
Metadata: "api/gateway.proto",
|
||||||
|
19
api/go/api/internal.pb.go
vendored
19
api/go/api/internal.pb.go
vendored
@ -1,6 +1,6 @@
|
|||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
// versions:
|
// versions:
|
||||||
// protoc-gen-go v1.31.0
|
// protoc-gen-go v1.34.1
|
||||||
// protoc v4.24.4
|
// protoc v4.24.4
|
||||||
// source: api/internal.proto
|
// source: api/internal.proto
|
||||||
|
|
||||||
@ -2530,13 +2530,16 @@ var file_api_internal_proto_rawDesc = []byte{
|
|||||||
0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
|
0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
|
||||||
0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74,
|
0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74,
|
||||||
0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
|
0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
|
||||||
0x00, 0x42, 0x65, 0x0a, 0x11, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61,
|
0x00, 0x42, 0x93, 0x01, 0x0a, 0x11, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74,
|
||||||
0x63, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x42, 0x0d, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c,
|
0x61, 0x63, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x42, 0x0d, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61,
|
||||||
0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e,
|
0x6c, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,
|
||||||
0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x63,
|
0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f,
|
||||||
0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f,
|
0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67,
|
||||||
0x2f, 0x76, 0x34, 0x2f, 0x61, 0x70, 0x69, 0xaa, 0x02, 0x0e, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73,
|
0x6f, 0x2f, 0x76, 0x34, 0x2f, 0x61, 0x70, 0x69, 0xaa, 0x02, 0x0e, 0x43, 0x68, 0x69, 0x72, 0x70,
|
||||||
0x74, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x70, 0x69, 0xca, 0x02, 0x0e, 0x43, 0x68, 0x69, 0x72,
|
||||||
|
0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5c, 0x41, 0x70, 0x69, 0xe2, 0x02, 0x1a, 0x47, 0x50, 0x42,
|
||||||
|
0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5c, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74,
|
||||||
|
0x61, 0x63, 0x6b, 0x5c, 0x41, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
21
api/go/api/multicast_group.pb.go
vendored
21
api/go/api/multicast_group.pb.go
vendored
@ -1,6 +1,6 @@
|
|||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
// versions:
|
// versions:
|
||||||
// protoc-gen-go v1.31.0
|
// protoc-gen-go v1.34.1
|
||||||
// protoc v4.24.4
|
// protoc v4.24.4
|
||||||
// source: api/multicast_group.proto
|
// source: api/multicast_group.proto
|
||||||
|
|
||||||
@ -1654,14 +1654,17 @@ var file_api_multicast_group_proto_rawDesc = []byte{
|
|||||||
0x32, 0x12, 0x30, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x63, 0x61, 0x73,
|
0x32, 0x12, 0x30, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x63, 0x61, 0x73,
|
||||||
0x74, 0x2d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x7b, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x63,
|
0x74, 0x2d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x7b, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x63,
|
||||||
0x61, 0x73, 0x74, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x71, 0x75,
|
0x61, 0x73, 0x74, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x71, 0x75,
|
||||||
0x65, 0x75, 0x65, 0x42, 0x6b, 0x0a, 0x11, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73,
|
0x65, 0x75, 0x65, 0x42, 0x99, 0x01, 0x0a, 0x11, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72, 0x70,
|
||||||
0x74, 0x61, 0x63, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x42, 0x13, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x63,
|
0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x42, 0x13, 0x4d, 0x75, 0x6c, 0x74, 0x69,
|
||||||
0x61, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a,
|
0x63, 0x61, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01,
|
||||||
0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x69, 0x72,
|
0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x69,
|
||||||
0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63,
|
0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61,
|
||||||
0x6b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x34, 0x2f, 0x61, 0x70, 0x69, 0xaa,
|
0x63, 0x6b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x34, 0x2f, 0x61, 0x70, 0x69,
|
||||||
0x02, 0x0e, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x70, 0x69,
|
0xaa, 0x02, 0x0e, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x70,
|
||||||
0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
0x69, 0xca, 0x02, 0x0e, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5c, 0x41,
|
||||||
|
0x70, 0x69, 0xe2, 0x02, 0x1a, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,
|
||||||
|
0x5c, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5c, 0x41, 0x70, 0x69, 0x62,
|
||||||
|
0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
21
api/go/api/relay.pb.go
vendored
21
api/go/api/relay.pb.go
vendored
@ -1,6 +1,6 @@
|
|||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
// versions:
|
// versions:
|
||||||
// protoc-gen-go v1.31.0
|
// protoc-gen-go v1.34.1
|
||||||
// protoc v4.24.4
|
// protoc v4.24.4
|
||||||
// source: api/relay.proto
|
// source: api/relay.proto
|
||||||
|
|
||||||
@ -595,14 +595,17 @@ var file_api_relay_proto_rawDesc = []byte{
|
|||||||
0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4,
|
0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4,
|
||||||
0x93, 0x02, 0x25, 0x12, 0x23, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x73,
|
0x93, 0x02, 0x25, 0x12, 0x23, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x73,
|
||||||
0x2f, 0x7b, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x7d,
|
0x2f, 0x7b, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x7d,
|
||||||
0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x42, 0x62, 0x0a, 0x11, 0x69, 0x6f, 0x2e, 0x63,
|
0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x42, 0x90, 0x01, 0x0a, 0x11, 0x69, 0x6f, 0x2e,
|
||||||
0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x42, 0x0a, 0x52,
|
0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x42, 0x0a,
|
||||||
0x65, 0x6c, 0x61, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2e, 0x67, 0x69, 0x74,
|
0x52, 0x65, 0x6c, 0x61, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2e, 0x67, 0x69,
|
||||||
0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61,
|
0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74,
|
||||||
0x63, 0x6b, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x61, 0x70,
|
0x61, 0x63, 0x6b, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x61,
|
||||||
0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x34, 0x2f, 0x61, 0x70, 0x69, 0xaa, 0x02, 0x0e, 0x43, 0x68,
|
0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x34, 0x2f, 0x61, 0x70, 0x69, 0xaa, 0x02, 0x0e, 0x43,
|
||||||
0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72,
|
0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x70, 0x69, 0xca, 0x02, 0x0e,
|
||||||
0x6f, 0x74, 0x6f, 0x33,
|
0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5c, 0x41, 0x70, 0x69, 0xe2, 0x02,
|
||||||
|
0x1a, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5c, 0x43, 0x68, 0x69,
|
||||||
|
0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5c, 0x41, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f,
|
||||||
|
0x74, 0x6f, 0x33,
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
20
api/go/api/tenant.pb.go
vendored
20
api/go/api/tenant.pb.go
vendored
@ -1,6 +1,6 @@
|
|||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
// versions:
|
// versions:
|
||||||
// protoc-gen-go v1.31.0
|
// protoc-gen-go v1.34.1
|
||||||
// protoc v4.24.4
|
// protoc v4.24.4
|
||||||
// source: api/tenant.proto
|
// source: api/tenant.proto
|
||||||
|
|
||||||
@ -1565,14 +1565,16 @@ var file_api_tenant_proto_rawDesc = []byte{
|
|||||||
0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3,
|
0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3,
|
||||||
0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x74, 0x65, 0x6e, 0x61, 0x6e,
|
0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x74, 0x65, 0x6e, 0x61, 0x6e,
|
||||||
0x74, 0x73, 0x2f, 0x7b, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x75,
|
0x74, 0x73, 0x2f, 0x7b, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x75,
|
||||||
0x73, 0x65, 0x72, 0x73, 0x42, 0x63, 0x0a, 0x11, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72, 0x70,
|
0x73, 0x65, 0x72, 0x73, 0x42, 0x91, 0x01, 0x0a, 0x11, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72,
|
||||||
0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x42, 0x0b, 0x54, 0x65, 0x6e, 0x61, 0x6e,
|
0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x42, 0x0b, 0x54, 0x65, 0x6e, 0x61,
|
||||||
0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,
|
0x6e, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75,
|
||||||
0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f,
|
0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b,
|
||||||
0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67,
|
0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x61, 0x70, 0x69, 0x2f,
|
||||||
0x6f, 0x2f, 0x76, 0x34, 0x2f, 0x61, 0x70, 0x69, 0xaa, 0x02, 0x0e, 0x43, 0x68, 0x69, 0x72, 0x70,
|
0x67, 0x6f, 0x2f, 0x76, 0x34, 0x2f, 0x61, 0x70, 0x69, 0xaa, 0x02, 0x0e, 0x43, 0x68, 0x69, 0x72,
|
||||||
0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
|
0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x70, 0x69, 0xca, 0x02, 0x0e, 0x43, 0x68, 0x69,
|
||||||
0x33,
|
0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5c, 0x41, 0x70, 0x69, 0xe2, 0x02, 0x1a, 0x47, 0x50,
|
||||||
|
0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5c, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73,
|
||||||
|
0x74, 0x61, 0x63, 0x6b, 0x5c, 0x41, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
21
api/go/api/user.pb.go
vendored
21
api/go/api/user.pb.go
vendored
@ -1,6 +1,6 @@
|
|||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
// versions:
|
// versions:
|
||||||
// protoc-gen-go v1.31.0
|
// protoc-gen-go v1.34.1
|
||||||
// protoc v4.24.4
|
// protoc v4.24.4
|
||||||
// source: api/user.proto
|
// source: api/user.proto
|
||||||
|
|
||||||
@ -891,14 +891,17 @@ var file_api_user_proto_rawDesc = []byte{
|
|||||||
0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d,
|
0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d,
|
||||||
0x70, 0x74, 0x79, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x3a, 0x01, 0x2a, 0x22, 0x1d,
|
0x70, 0x74, 0x79, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x3a, 0x01, 0x2a, 0x22, 0x1d,
|
||||||
0x2f, 0x61, 0x70, 0x69, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72,
|
0x2f, 0x61, 0x70, 0x69, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72,
|
||||||
0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x42, 0x61, 0x0a,
|
0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x42, 0x8f, 0x01,
|
||||||
0x11, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x61,
|
0x0a, 0x11, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e,
|
||||||
0x70, 0x69, 0x42, 0x09, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a,
|
0x61, 0x70, 0x69, 0x42, 0x09, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01,
|
||||||
0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x69, 0x72,
|
0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x69,
|
||||||
0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63,
|
0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61,
|
||||||
0x6b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x34, 0x2f, 0x61, 0x70, 0x69, 0xaa,
|
0x63, 0x6b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x34, 0x2f, 0x61, 0x70, 0x69,
|
||||||
0x02, 0x0e, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x70, 0x69,
|
0xaa, 0x02, 0x0e, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x70,
|
||||||
0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
0x69, 0xca, 0x02, 0x0e, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5c, 0x41,
|
||||||
|
0x70, 0x69, 0xe2, 0x02, 0x1a, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,
|
||||||
|
0x5c, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5c, 0x41, 0x70, 0x69, 0x62,
|
||||||
|
0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
21
api/go/common/common.pb.go
vendored
21
api/go/common/common.pb.go
vendored
@ -1,6 +1,6 @@
|
|||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
// versions:
|
// versions:
|
||||||
// protoc-gen-go v1.31.0
|
// protoc-gen-go v1.34.1
|
||||||
// protoc v4.24.4
|
// protoc v4.24.4
|
||||||
// source: common/common.proto
|
// source: common/common.proto
|
||||||
|
|
||||||
@ -1076,14 +1076,17 @@ var file_common_common_proto_rawDesc = []byte{
|
|||||||
0x01, 0x2a, 0x34, 0x0a, 0x0b, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73,
|
0x01, 0x2a, 0x34, 0x0a, 0x0b, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73,
|
||||||
0x12, 0x0b, 0x0a, 0x07, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x5f, 0x41, 0x10, 0x00, 0x12, 0x0b, 0x0a,
|
0x12, 0x0b, 0x0a, 0x07, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x5f, 0x41, 0x10, 0x00, 0x12, 0x0b, 0x0a,
|
||||||
0x07, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x5f, 0x42, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x4c,
|
0x07, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x5f, 0x42, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x4c,
|
||||||
0x41, 0x53, 0x53, 0x5f, 0x43, 0x10, 0x02, 0x42, 0x69, 0x0a, 0x11, 0x69, 0x6f, 0x2e, 0x63, 0x68,
|
0x41, 0x53, 0x53, 0x5f, 0x43, 0x10, 0x02, 0x42, 0x9d, 0x01, 0x0a, 0x11, 0x69, 0x6f, 0x2e, 0x63,
|
||||||
0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x42, 0x0b, 0x43, 0x6f,
|
0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x42, 0x0b, 0x43,
|
||||||
0x6d, 0x6d, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x31, 0x67, 0x69, 0x74,
|
0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x31, 0x67, 0x69,
|
||||||
0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61,
|
0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74,
|
||||||
0x63, 0x6b, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x61, 0x70,
|
0x61, 0x63, 0x6b, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x61,
|
||||||
0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x34, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0xaa, 0x02,
|
0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x34, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0xaa,
|
||||||
0x11, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x43, 0x6f, 0x6d, 0x6d,
|
0x02, 0x11, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x43, 0x6f, 0x6d,
|
||||||
0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
0x6d, 0x6f, 0x6e, 0xca, 0x02, 0x11, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b,
|
||||||
|
0x5c, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0xe2, 0x02, 0x1d, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74,
|
||||||
|
0x61, 0x64, 0x61, 0x74, 0x61, 0x5c, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b,
|
||||||
|
0x5c, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
374
api/go/gw/gw.pb.go
vendored
374
api/go/gw/gw.pb.go
vendored
@ -1,6 +1,6 @@
|
|||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
// versions:
|
// versions:
|
||||||
// protoc-gen-go v1.31.0
|
// protoc-gen-go v1.34.1
|
||||||
// protoc v4.24.4
|
// protoc v4.24.4
|
||||||
// source: gw/gw.proto
|
// source: gw/gw.proto
|
||||||
|
|
||||||
@ -3548,6 +3548,148 @@ func (x *ConnState) GetState() ConnState_State {
|
|||||||
return ConnState_OFFLINE
|
return ConnState_OFFLINE
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Gateway Mesh heartbeat (sent periodically by the Relay Gateways).
|
||||||
|
type MeshHeartbeat struct {
|
||||||
|
state protoimpl.MessageState
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
|
// Gateway ID (of the Border Gateway).
|
||||||
|
GatewayId string `protobuf:"bytes,1,opt,name=gateway_id,json=gatewayId,proto3" json:"gateway_id,omitempty"`
|
||||||
|
// Relay ID.
|
||||||
|
RelayId string `protobuf:"bytes,2,opt,name=relay_id,json=relayId,proto3" json:"relay_id,omitempty"`
|
||||||
|
// Timestamp (second precision).
|
||||||
|
Time *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=time,proto3" json:"time,omitempty"`
|
||||||
|
// Relay path.
|
||||||
|
RelayPath []*MeshHeartbeatRelayPath `protobuf:"bytes,4,rep,name=relay_path,json=relayPath,proto3" json:"relay_path,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *MeshHeartbeat) Reset() {
|
||||||
|
*x = MeshHeartbeat{}
|
||||||
|
if protoimpl.UnsafeEnabled {
|
||||||
|
mi := &file_gw_gw_proto_msgTypes[35]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *MeshHeartbeat) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*MeshHeartbeat) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *MeshHeartbeat) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_gw_gw_proto_msgTypes[35]
|
||||||
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
if ms.LoadMessageInfo() == nil {
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
return ms
|
||||||
|
}
|
||||||
|
return mi.MessageOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use MeshHeartbeat.ProtoReflect.Descriptor instead.
|
||||||
|
func (*MeshHeartbeat) Descriptor() ([]byte, []int) {
|
||||||
|
return file_gw_gw_proto_rawDescGZIP(), []int{35}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *MeshHeartbeat) GetGatewayId() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.GatewayId
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *MeshHeartbeat) GetRelayId() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.RelayId
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *MeshHeartbeat) GetTime() *timestamppb.Timestamp {
|
||||||
|
if x != nil {
|
||||||
|
return x.Time
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *MeshHeartbeat) GetRelayPath() []*MeshHeartbeatRelayPath {
|
||||||
|
if x != nil {
|
||||||
|
return x.RelayPath
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type MeshHeartbeatRelayPath struct {
|
||||||
|
state protoimpl.MessageState
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
|
// Relay ID.
|
||||||
|
RelayId string `protobuf:"bytes,1,opt,name=relay_id,json=relayId,proto3" json:"relay_id,omitempty"`
|
||||||
|
// RSSI.
|
||||||
|
Rssi int32 `protobuf:"varint,2,opt,name=rssi,proto3" json:"rssi,omitempty"`
|
||||||
|
// SNR.
|
||||||
|
Snr int32 `protobuf:"varint,3,opt,name=snr,proto3" json:"snr,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *MeshHeartbeatRelayPath) Reset() {
|
||||||
|
*x = MeshHeartbeatRelayPath{}
|
||||||
|
if protoimpl.UnsafeEnabled {
|
||||||
|
mi := &file_gw_gw_proto_msgTypes[36]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *MeshHeartbeatRelayPath) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*MeshHeartbeatRelayPath) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *MeshHeartbeatRelayPath) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_gw_gw_proto_msgTypes[36]
|
||||||
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
if ms.LoadMessageInfo() == nil {
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
return ms
|
||||||
|
}
|
||||||
|
return mi.MessageOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use MeshHeartbeatRelayPath.ProtoReflect.Descriptor instead.
|
||||||
|
func (*MeshHeartbeatRelayPath) Descriptor() ([]byte, []int) {
|
||||||
|
return file_gw_gw_proto_rawDescGZIP(), []int{36}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *MeshHeartbeatRelayPath) GetRelayId() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.RelayId
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *MeshHeartbeatRelayPath) GetRssi() int32 {
|
||||||
|
if x != nil {
|
||||||
|
return x.Rssi
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *MeshHeartbeatRelayPath) GetSnr() int32 {
|
||||||
|
if x != nil {
|
||||||
|
return x.Snr
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
var File_gw_gw_proto protoreflect.FileDescriptor
|
var File_gw_gw_proto protoreflect.FileDescriptor
|
||||||
|
|
||||||
var file_gw_gw_proto_rawDesc = []byte{
|
var file_gw_gw_proto_rawDesc = []byte{
|
||||||
@ -4116,50 +4258,70 @@ var file_gw_gw_proto_rawDesc = []byte{
|
|||||||
0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74,
|
0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74,
|
||||||
0x61, 0x74, 0x65, 0x22, 0x20, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0b, 0x0a, 0x07,
|
0x61, 0x74, 0x65, 0x22, 0x20, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0b, 0x0a, 0x07,
|
||||||
0x4f, 0x46, 0x46, 0x4c, 0x49, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x4f, 0x4e, 0x4c,
|
0x4f, 0x46, 0x46, 0x4c, 0x49, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x4f, 0x4e, 0x4c,
|
||||||
0x49, 0x4e, 0x45, 0x10, 0x01, 0x2a, 0xb5, 0x01, 0x0a, 0x08, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x61,
|
0x49, 0x4e, 0x45, 0x10, 0x01, 0x22, 0xb4, 0x01, 0x0a, 0x0d, 0x4d, 0x65, 0x73, 0x68, 0x48, 0x65,
|
||||||
0x74, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x52, 0x5f, 0x55, 0x4e, 0x44, 0x45, 0x46, 0x49, 0x4e,
|
0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x61, 0x74, 0x65, 0x77,
|
||||||
0x45, 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x52, 0x5f, 0x34, 0x5f, 0x35, 0x10, 0x01,
|
0x61, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x61, 0x74,
|
||||||
0x12, 0x0a, 0x0a, 0x06, 0x43, 0x52, 0x5f, 0x34, 0x5f, 0x36, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06,
|
0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f,
|
||||||
0x43, 0x52, 0x5f, 0x34, 0x5f, 0x37, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x52, 0x5f, 0x34,
|
0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x49,
|
||||||
0x5f, 0x38, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x52, 0x5f, 0x33, 0x5f, 0x38, 0x10, 0x05,
|
0x64, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32,
|
||||||
0x12, 0x0a, 0x0a, 0x06, 0x43, 0x52, 0x5f, 0x32, 0x5f, 0x36, 0x10, 0x06, 0x12, 0x0a, 0x0a, 0x06,
|
0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
|
||||||
0x43, 0x52, 0x5f, 0x31, 0x5f, 0x34, 0x10, 0x07, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x52, 0x5f, 0x31,
|
0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x74, 0x69, 0x6d,
|
||||||
0x5f, 0x36, 0x10, 0x08, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x52, 0x5f, 0x35, 0x5f, 0x36, 0x10, 0x09,
|
0x65, 0x12, 0x39, 0x0a, 0x0a, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18,
|
||||||
0x12, 0x0d, 0x0a, 0x09, 0x43, 0x52, 0x5f, 0x4c, 0x49, 0x5f, 0x34, 0x5f, 0x35, 0x10, 0x0a, 0x12,
|
0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x77, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x48,
|
||||||
0x0d, 0x0a, 0x09, 0x43, 0x52, 0x5f, 0x4c, 0x49, 0x5f, 0x34, 0x5f, 0x36, 0x10, 0x0b, 0x12, 0x0d,
|
0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x50, 0x61, 0x74,
|
||||||
0x0a, 0x09, 0x43, 0x52, 0x5f, 0x4c, 0x49, 0x5f, 0x34, 0x5f, 0x38, 0x10, 0x0c, 0x2a, 0x3b, 0x0a,
|
0x68, 0x52, 0x09, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x50, 0x61, 0x74, 0x68, 0x22, 0x59, 0x0a, 0x16,
|
||||||
0x0e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x12,
|
0x4d, 0x65, 0x73, 0x68, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x52, 0x65, 0x6c,
|
||||||
0x0f, 0x0a, 0x0b, 0x49, 0x4d, 0x4d, 0x45, 0x44, 0x49, 0x41, 0x54, 0x45, 0x4c, 0x59, 0x10, 0x00,
|
0x61, 0x79, 0x50, 0x61, 0x74, 0x68, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f,
|
||||||
0x12, 0x09, 0x0a, 0x05, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x47,
|
0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x49,
|
||||||
0x50, 0x53, 0x5f, 0x45, 0x50, 0x4f, 0x43, 0x48, 0x10, 0x02, 0x2a, 0x37, 0x0a, 0x11, 0x46, 0x69,
|
0x64, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x73, 0x73, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52,
|
||||||
0x6e, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x54, 0x79, 0x70, 0x65, 0x12,
|
0x04, 0x72, 0x73, 0x73, 0x69, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x6e, 0x72, 0x18, 0x03, 0x20, 0x01,
|
||||||
0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x45, 0x4e, 0x43,
|
0x28, 0x05, 0x52, 0x03, 0x73, 0x6e, 0x72, 0x2a, 0xb5, 0x01, 0x0a, 0x08, 0x43, 0x6f, 0x64, 0x65,
|
||||||
0x52, 0x59, 0x50, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x4c, 0x41, 0x49,
|
0x52, 0x61, 0x74, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x52, 0x5f, 0x55, 0x4e, 0x44, 0x45, 0x46,
|
||||||
0x4e, 0x10, 0x02, 0x2a, 0x30, 0x0a, 0x09, 0x43, 0x52, 0x43, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
|
0x49, 0x4e, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x52, 0x5f, 0x34, 0x5f, 0x35,
|
||||||
0x12, 0x0a, 0x0a, 0x06, 0x4e, 0x4f, 0x5f, 0x43, 0x52, 0x43, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07,
|
0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x52, 0x5f, 0x34, 0x5f, 0x36, 0x10, 0x02, 0x12, 0x0a,
|
||||||
0x42, 0x41, 0x44, 0x5f, 0x43, 0x52, 0x43, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x52, 0x43,
|
0x0a, 0x06, 0x43, 0x52, 0x5f, 0x34, 0x5f, 0x37, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x52,
|
||||||
0x5f, 0x4f, 0x4b, 0x10, 0x02, 0x2a, 0xd5, 0x01, 0x0a, 0x0b, 0x54, 0x78, 0x41, 0x63, 0x6b, 0x53,
|
0x5f, 0x34, 0x5f, 0x38, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x52, 0x5f, 0x33, 0x5f, 0x38,
|
||||||
0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x47, 0x4e, 0x4f, 0x52, 0x45, 0x44,
|
0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x52, 0x5f, 0x32, 0x5f, 0x36, 0x10, 0x06, 0x12, 0x0a,
|
||||||
0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4f, 0x4b, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x54, 0x4f,
|
0x0a, 0x06, 0x43, 0x52, 0x5f, 0x31, 0x5f, 0x34, 0x10, 0x07, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x52,
|
||||||
0x4f, 0x5f, 0x4c, 0x41, 0x54, 0x45, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x4f, 0x4f, 0x5f,
|
0x5f, 0x31, 0x5f, 0x36, 0x10, 0x08, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x52, 0x5f, 0x35, 0x5f, 0x36,
|
||||||
0x45, 0x41, 0x52, 0x4c, 0x59, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x43, 0x4f, 0x4c, 0x4c, 0x49,
|
0x10, 0x09, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x52, 0x5f, 0x4c, 0x49, 0x5f, 0x34, 0x5f, 0x35, 0x10,
|
||||||
0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x10, 0x04, 0x12, 0x14, 0x0a,
|
0x0a, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x52, 0x5f, 0x4c, 0x49, 0x5f, 0x34, 0x5f, 0x36, 0x10, 0x0b,
|
||||||
0x10, 0x43, 0x4f, 0x4c, 0x4c, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f,
|
0x12, 0x0d, 0x0a, 0x09, 0x43, 0x52, 0x5f, 0x4c, 0x49, 0x5f, 0x34, 0x5f, 0x38, 0x10, 0x0c, 0x2a,
|
||||||
0x4e, 0x10, 0x05, 0x12, 0x0b, 0x0a, 0x07, 0x54, 0x58, 0x5f, 0x46, 0x52, 0x45, 0x51, 0x10, 0x06,
|
0x3b, 0x0a, 0x0e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x54, 0x69, 0x6d, 0x69, 0x6e,
|
||||||
0x12, 0x0c, 0x0a, 0x08, 0x54, 0x58, 0x5f, 0x50, 0x4f, 0x57, 0x45, 0x52, 0x10, 0x07, 0x12, 0x10,
|
0x67, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4d, 0x4d, 0x45, 0x44, 0x49, 0x41, 0x54, 0x45, 0x4c, 0x59,
|
||||||
0x0a, 0x0c, 0x47, 0x50, 0x53, 0x5f, 0x55, 0x4e, 0x4c, 0x4f, 0x43, 0x4b, 0x45, 0x44, 0x10, 0x08,
|
0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x10, 0x01, 0x12, 0x0d, 0x0a,
|
||||||
0x12, 0x0e, 0x0a, 0x0a, 0x51, 0x55, 0x45, 0x55, 0x45, 0x5f, 0x46, 0x55, 0x4c, 0x4c, 0x10, 0x09,
|
0x09, 0x47, 0x50, 0x53, 0x5f, 0x45, 0x50, 0x4f, 0x43, 0x48, 0x10, 0x02, 0x2a, 0x37, 0x0a, 0x11,
|
||||||
0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52,
|
0x46, 0x69, 0x6e, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x54, 0x79, 0x70,
|
||||||
0x4f, 0x52, 0x10, 0x0a, 0x12, 0x17, 0x0a, 0x13, 0x44, 0x55, 0x54, 0x59, 0x5f, 0x43, 0x59, 0x43,
|
0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x45,
|
||||||
0x4c, 0x45, 0x5f, 0x4f, 0x56, 0x45, 0x52, 0x46, 0x4c, 0x4f, 0x57, 0x10, 0x0b, 0x42, 0x6a, 0x0a,
|
0x4e, 0x43, 0x52, 0x59, 0x50, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x4c,
|
||||||
0x14, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x61,
|
0x41, 0x49, 0x4e, 0x10, 0x02, 0x2a, 0x30, 0x0a, 0x09, 0x43, 0x52, 0x43, 0x53, 0x74, 0x61, 0x74,
|
||||||
0x70, 0x69, 0x2e, 0x67, 0x77, 0x42, 0x0c, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x50, 0x72,
|
0x75, 0x73, 0x12, 0x0a, 0x0a, 0x06, 0x4e, 0x4f, 0x5f, 0x43, 0x52, 0x43, 0x10, 0x00, 0x12, 0x0b,
|
||||||
0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f,
|
0x0a, 0x07, 0x42, 0x41, 0x44, 0x5f, 0x43, 0x52, 0x43, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x43,
|
||||||
0x6d, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x63, 0x68, 0x69,
|
0x52, 0x43, 0x5f, 0x4f, 0x4b, 0x10, 0x02, 0x2a, 0xd5, 0x01, 0x0a, 0x0b, 0x54, 0x78, 0x41, 0x63,
|
||||||
0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x76,
|
0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x47, 0x4e, 0x4f, 0x52,
|
||||||
0x34, 0x2f, 0x67, 0x77, 0xaa, 0x02, 0x12, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63,
|
0x45, 0x44, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4f, 0x4b, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08,
|
||||||
0x6b, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
|
0x54, 0x4f, 0x4f, 0x5f, 0x4c, 0x41, 0x54, 0x45, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x4f,
|
||||||
0x33,
|
0x4f, 0x5f, 0x45, 0x41, 0x52, 0x4c, 0x59, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x43, 0x4f, 0x4c,
|
||||||
|
0x4c, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x10, 0x04, 0x12,
|
||||||
|
0x14, 0x0a, 0x10, 0x43, 0x4f, 0x4c, 0x4c, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x42, 0x45, 0x41,
|
||||||
|
0x43, 0x4f, 0x4e, 0x10, 0x05, 0x12, 0x0b, 0x0a, 0x07, 0x54, 0x58, 0x5f, 0x46, 0x52, 0x45, 0x51,
|
||||||
|
0x10, 0x06, 0x12, 0x0c, 0x0a, 0x08, 0x54, 0x58, 0x5f, 0x50, 0x4f, 0x57, 0x45, 0x52, 0x10, 0x07,
|
||||||
|
0x12, 0x10, 0x0a, 0x0c, 0x47, 0x50, 0x53, 0x5f, 0x55, 0x4e, 0x4c, 0x4f, 0x43, 0x4b, 0x45, 0x44,
|
||||||
|
0x10, 0x08, 0x12, 0x0e, 0x0a, 0x0a, 0x51, 0x55, 0x45, 0x55, 0x45, 0x5f, 0x46, 0x55, 0x4c, 0x4c,
|
||||||
|
0x10, 0x09, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x45,
|
||||||
|
0x52, 0x52, 0x4f, 0x52, 0x10, 0x0a, 0x12, 0x17, 0x0a, 0x13, 0x44, 0x55, 0x54, 0x59, 0x5f, 0x43,
|
||||||
|
0x59, 0x43, 0x4c, 0x45, 0x5f, 0x4f, 0x56, 0x45, 0x52, 0x46, 0x4c, 0x4f, 0x57, 0x10, 0x0b, 0x42,
|
||||||
|
0xa0, 0x01, 0x0a, 0x14, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63,
|
||||||
|
0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x67, 0x77, 0x42, 0x0c, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61,
|
||||||
|
0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,
|
||||||
|
0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f,
|
||||||
|
0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67,
|
||||||
|
0x6f, 0x2f, 0x76, 0x34, 0x2f, 0x67, 0x77, 0xaa, 0x02, 0x12, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73,
|
||||||
|
0x74, 0x61, 0x63, 0x6b, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0xca, 0x02, 0x12, 0x43,
|
||||||
|
0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5c, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61,
|
||||||
|
0x79, 0xe2, 0x02, 0x1e, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5c,
|
||||||
|
0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5c, 0x47, 0x61, 0x74, 0x65, 0x77,
|
||||||
|
0x61, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -4175,7 +4337,7 @@ func file_gw_gw_proto_rawDescGZIP() []byte {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var file_gw_gw_proto_enumTypes = make([]protoimpl.EnumInfo, 6)
|
var file_gw_gw_proto_enumTypes = make([]protoimpl.EnumInfo, 6)
|
||||||
var file_gw_gw_proto_msgTypes = make([]protoimpl.MessageInfo, 42)
|
var file_gw_gw_proto_msgTypes = make([]protoimpl.MessageInfo, 44)
|
||||||
var file_gw_gw_proto_goTypes = []interface{}{
|
var file_gw_gw_proto_goTypes = []interface{}{
|
||||||
(CodeRate)(0), // 0: gw.CodeRate
|
(CodeRate)(0), // 0: gw.CodeRate
|
||||||
(DownlinkTiming)(0), // 1: gw.DownlinkTiming
|
(DownlinkTiming)(0), // 1: gw.DownlinkTiming
|
||||||
@ -4218,62 +4380,64 @@ var file_gw_gw_proto_goTypes = []interface{}{
|
|||||||
(*RawPacketForwarderEvent)(nil), // 38: gw.RawPacketForwarderEvent
|
(*RawPacketForwarderEvent)(nil), // 38: gw.RawPacketForwarderEvent
|
||||||
(*RawPacketForwarderCommand)(nil), // 39: gw.RawPacketForwarderCommand
|
(*RawPacketForwarderCommand)(nil), // 39: gw.RawPacketForwarderCommand
|
||||||
(*ConnState)(nil), // 40: gw.ConnState
|
(*ConnState)(nil), // 40: gw.ConnState
|
||||||
nil, // 41: gw.GatewayStats.MetadataEntry
|
(*MeshHeartbeat)(nil), // 41: gw.MeshHeartbeat
|
||||||
nil, // 42: gw.GatewayStats.TxPacketsPerFrequencyEntry
|
(*MeshHeartbeatRelayPath)(nil), // 42: gw.MeshHeartbeatRelayPath
|
||||||
nil, // 43: gw.GatewayStats.RxPacketsPerFrequencyEntry
|
nil, // 43: gw.GatewayStats.MetadataEntry
|
||||||
nil, // 44: gw.GatewayStats.TxPacketsPerStatusEntry
|
nil, // 44: gw.GatewayStats.TxPacketsPerFrequencyEntry
|
||||||
nil, // 45: gw.UplinkRxInfoLegacy.MetadataEntry
|
nil, // 45: gw.GatewayStats.RxPacketsPerFrequencyEntry
|
||||||
nil, // 46: gw.UplinkRxInfo.MetadataEntry
|
nil, // 46: gw.GatewayStats.TxPacketsPerStatusEntry
|
||||||
nil, // 47: gw.GatewayCommandExecRequest.EnvironmentEntry
|
nil, // 47: gw.UplinkRxInfoLegacy.MetadataEntry
|
||||||
(common.Modulation)(0), // 48: common.Modulation
|
nil, // 48: gw.UplinkRxInfo.MetadataEntry
|
||||||
(*timestamppb.Timestamp)(nil), // 49: google.protobuf.Timestamp
|
nil, // 49: gw.GatewayCommandExecRequest.EnvironmentEntry
|
||||||
(*common.Location)(nil), // 50: common.Location
|
(common.Modulation)(0), // 50: common.Modulation
|
||||||
(common.Regulation)(0), // 51: common.Regulation
|
(*timestamppb.Timestamp)(nil), // 51: google.protobuf.Timestamp
|
||||||
(*durationpb.Duration)(nil), // 52: google.protobuf.Duration
|
(*common.Location)(nil), // 52: common.Location
|
||||||
|
(common.Regulation)(0), // 53: common.Regulation
|
||||||
|
(*durationpb.Duration)(nil), // 54: google.protobuf.Duration
|
||||||
}
|
}
|
||||||
var file_gw_gw_proto_depIdxs = []int32{
|
var file_gw_gw_proto_depIdxs = []int32{
|
||||||
9, // 0: gw.Modulation.lora:type_name -> gw.LoraModulationInfo
|
9, // 0: gw.Modulation.lora:type_name -> gw.LoraModulationInfo
|
||||||
10, // 1: gw.Modulation.fsk:type_name -> gw.FskModulationInfo
|
10, // 1: gw.Modulation.fsk:type_name -> gw.FskModulationInfo
|
||||||
11, // 2: gw.Modulation.lr_fhss:type_name -> gw.LrFhssModulationInfo
|
11, // 2: gw.Modulation.lr_fhss:type_name -> gw.LrFhssModulationInfo
|
||||||
48, // 3: gw.UplinkTxInfoLegacy.modulation:type_name -> common.Modulation
|
50, // 3: gw.UplinkTxInfoLegacy.modulation:type_name -> common.Modulation
|
||||||
9, // 4: gw.UplinkTxInfoLegacy.lora_modulation_info:type_name -> gw.LoraModulationInfo
|
9, // 4: gw.UplinkTxInfoLegacy.lora_modulation_info:type_name -> gw.LoraModulationInfo
|
||||||
10, // 5: gw.UplinkTxInfoLegacy.fsk_modulation_info:type_name -> gw.FskModulationInfo
|
10, // 5: gw.UplinkTxInfoLegacy.fsk_modulation_info:type_name -> gw.FskModulationInfo
|
||||||
11, // 6: gw.UplinkTxInfoLegacy.lr_fhss_modulation_info:type_name -> gw.LrFhssModulationInfo
|
11, // 6: gw.UplinkTxInfoLegacy.lr_fhss_modulation_info:type_name -> gw.LrFhssModulationInfo
|
||||||
6, // 7: gw.UplinkTxInfo.modulation:type_name -> gw.Modulation
|
6, // 7: gw.UplinkTxInfo.modulation:type_name -> gw.Modulation
|
||||||
0, // 8: gw.LoraModulationInfo.code_rate:type_name -> gw.CodeRate
|
0, // 8: gw.LoraModulationInfo.code_rate:type_name -> gw.CodeRate
|
||||||
0, // 9: gw.LrFhssModulationInfo.code_rate:type_name -> gw.CodeRate
|
0, // 9: gw.LrFhssModulationInfo.code_rate:type_name -> gw.CodeRate
|
||||||
49, // 10: gw.PlainFineTimestamp.time:type_name -> google.protobuf.Timestamp
|
51, // 10: gw.PlainFineTimestamp.time:type_name -> google.protobuf.Timestamp
|
||||||
49, // 11: gw.GatewayStats.time:type_name -> google.protobuf.Timestamp
|
51, // 11: gw.GatewayStats.time:type_name -> google.protobuf.Timestamp
|
||||||
50, // 12: gw.GatewayStats.location:type_name -> common.Location
|
52, // 12: gw.GatewayStats.location:type_name -> common.Location
|
||||||
41, // 13: gw.GatewayStats.metadata:type_name -> gw.GatewayStats.MetadataEntry
|
43, // 13: gw.GatewayStats.metadata:type_name -> gw.GatewayStats.MetadataEntry
|
||||||
42, // 14: gw.GatewayStats.tx_packets_per_frequency:type_name -> gw.GatewayStats.TxPacketsPerFrequencyEntry
|
44, // 14: gw.GatewayStats.tx_packets_per_frequency:type_name -> gw.GatewayStats.TxPacketsPerFrequencyEntry
|
||||||
43, // 15: gw.GatewayStats.rx_packets_per_frequency:type_name -> gw.GatewayStats.RxPacketsPerFrequencyEntry
|
45, // 15: gw.GatewayStats.rx_packets_per_frequency:type_name -> gw.GatewayStats.RxPacketsPerFrequencyEntry
|
||||||
15, // 16: gw.GatewayStats.tx_packets_per_modulation:type_name -> gw.PerModulationCount
|
15, // 16: gw.GatewayStats.tx_packets_per_modulation:type_name -> gw.PerModulationCount
|
||||||
15, // 17: gw.GatewayStats.rx_packets_per_modulation:type_name -> gw.PerModulationCount
|
15, // 17: gw.GatewayStats.rx_packets_per_modulation:type_name -> gw.PerModulationCount
|
||||||
44, // 18: gw.GatewayStats.tx_packets_per_status:type_name -> gw.GatewayStats.TxPacketsPerStatusEntry
|
46, // 18: gw.GatewayStats.tx_packets_per_status:type_name -> gw.GatewayStats.TxPacketsPerStatusEntry
|
||||||
16, // 19: gw.GatewayStats.duty_cycle_stats:type_name -> gw.DutyCycleStats
|
16, // 19: gw.GatewayStats.duty_cycle_stats:type_name -> gw.DutyCycleStats
|
||||||
6, // 20: gw.PerModulationCount.modulation:type_name -> gw.Modulation
|
6, // 20: gw.PerModulationCount.modulation:type_name -> gw.Modulation
|
||||||
51, // 21: gw.DutyCycleStats.regulation:type_name -> common.Regulation
|
53, // 21: gw.DutyCycleStats.regulation:type_name -> common.Regulation
|
||||||
52, // 22: gw.DutyCycleStats.window:type_name -> google.protobuf.Duration
|
54, // 22: gw.DutyCycleStats.window:type_name -> google.protobuf.Duration
|
||||||
17, // 23: gw.DutyCycleStats.bands:type_name -> gw.DutyCycleBand
|
17, // 23: gw.DutyCycleStats.bands:type_name -> gw.DutyCycleBand
|
||||||
52, // 24: gw.DutyCycleBand.load_max:type_name -> google.protobuf.Duration
|
54, // 24: gw.DutyCycleBand.load_max:type_name -> google.protobuf.Duration
|
||||||
52, // 25: gw.DutyCycleBand.load_tracked:type_name -> google.protobuf.Duration
|
54, // 25: gw.DutyCycleBand.load_tracked:type_name -> google.protobuf.Duration
|
||||||
49, // 26: gw.UplinkRxInfoLegacy.time:type_name -> google.protobuf.Timestamp
|
51, // 26: gw.UplinkRxInfoLegacy.time:type_name -> google.protobuf.Timestamp
|
||||||
52, // 27: gw.UplinkRxInfoLegacy.time_since_gps_epoch:type_name -> google.protobuf.Duration
|
54, // 27: gw.UplinkRxInfoLegacy.time_since_gps_epoch:type_name -> google.protobuf.Duration
|
||||||
50, // 28: gw.UplinkRxInfoLegacy.location:type_name -> common.Location
|
52, // 28: gw.UplinkRxInfoLegacy.location:type_name -> common.Location
|
||||||
2, // 29: gw.UplinkRxInfoLegacy.fine_timestamp_type:type_name -> gw.FineTimestampType
|
2, // 29: gw.UplinkRxInfoLegacy.fine_timestamp_type:type_name -> gw.FineTimestampType
|
||||||
12, // 30: gw.UplinkRxInfoLegacy.encrypted_fine_timestamp:type_name -> gw.EncryptedFineTimestamp
|
12, // 30: gw.UplinkRxInfoLegacy.encrypted_fine_timestamp:type_name -> gw.EncryptedFineTimestamp
|
||||||
13, // 31: gw.UplinkRxInfoLegacy.plain_fine_timestamp:type_name -> gw.PlainFineTimestamp
|
13, // 31: gw.UplinkRxInfoLegacy.plain_fine_timestamp:type_name -> gw.PlainFineTimestamp
|
||||||
3, // 32: gw.UplinkRxInfoLegacy.crc_status:type_name -> gw.CRCStatus
|
3, // 32: gw.UplinkRxInfoLegacy.crc_status:type_name -> gw.CRCStatus
|
||||||
45, // 33: gw.UplinkRxInfoLegacy.metadata:type_name -> gw.UplinkRxInfoLegacy.MetadataEntry
|
47, // 33: gw.UplinkRxInfoLegacy.metadata:type_name -> gw.UplinkRxInfoLegacy.MetadataEntry
|
||||||
49, // 34: gw.UplinkRxInfo.gw_time:type_name -> google.protobuf.Timestamp
|
51, // 34: gw.UplinkRxInfo.gw_time:type_name -> google.protobuf.Timestamp
|
||||||
49, // 35: gw.UplinkRxInfo.ns_time:type_name -> google.protobuf.Timestamp
|
51, // 35: gw.UplinkRxInfo.ns_time:type_name -> google.protobuf.Timestamp
|
||||||
52, // 36: gw.UplinkRxInfo.time_since_gps_epoch:type_name -> google.protobuf.Duration
|
54, // 36: gw.UplinkRxInfo.time_since_gps_epoch:type_name -> google.protobuf.Duration
|
||||||
52, // 37: gw.UplinkRxInfo.fine_time_since_gps_epoch:type_name -> google.protobuf.Duration
|
54, // 37: gw.UplinkRxInfo.fine_time_since_gps_epoch:type_name -> google.protobuf.Duration
|
||||||
50, // 38: gw.UplinkRxInfo.location:type_name -> common.Location
|
52, // 38: gw.UplinkRxInfo.location:type_name -> common.Location
|
||||||
46, // 39: gw.UplinkRxInfo.metadata:type_name -> gw.UplinkRxInfo.MetadataEntry
|
48, // 39: gw.UplinkRxInfo.metadata:type_name -> gw.UplinkRxInfo.MetadataEntry
|
||||||
3, // 40: gw.UplinkRxInfo.crc_status:type_name -> gw.CRCStatus
|
3, // 40: gw.UplinkRxInfo.crc_status:type_name -> gw.CRCStatus
|
||||||
48, // 41: gw.DownlinkTxInfoLegacy.modulation:type_name -> common.Modulation
|
50, // 41: gw.DownlinkTxInfoLegacy.modulation:type_name -> common.Modulation
|
||||||
9, // 42: gw.DownlinkTxInfoLegacy.lora_modulation_info:type_name -> gw.LoraModulationInfo
|
9, // 42: gw.DownlinkTxInfoLegacy.lora_modulation_info:type_name -> gw.LoraModulationInfo
|
||||||
10, // 43: gw.DownlinkTxInfoLegacy.fsk_modulation_info:type_name -> gw.FskModulationInfo
|
10, // 43: gw.DownlinkTxInfoLegacy.fsk_modulation_info:type_name -> gw.FskModulationInfo
|
||||||
1, // 44: gw.DownlinkTxInfoLegacy.timing:type_name -> gw.DownlinkTiming
|
1, // 44: gw.DownlinkTxInfoLegacy.timing:type_name -> gw.DownlinkTiming
|
||||||
@ -4285,8 +4449,8 @@ var file_gw_gw_proto_depIdxs = []int32{
|
|||||||
23, // 50: gw.Timing.immediately:type_name -> gw.ImmediatelyTimingInfo
|
23, // 50: gw.Timing.immediately:type_name -> gw.ImmediatelyTimingInfo
|
||||||
24, // 51: gw.Timing.delay:type_name -> gw.DelayTimingInfo
|
24, // 51: gw.Timing.delay:type_name -> gw.DelayTimingInfo
|
||||||
25, // 52: gw.Timing.gps_epoch:type_name -> gw.GPSEpochTimingInfo
|
25, // 52: gw.Timing.gps_epoch:type_name -> gw.GPSEpochTimingInfo
|
||||||
52, // 53: gw.DelayTimingInfo.delay:type_name -> google.protobuf.Duration
|
54, // 53: gw.DelayTimingInfo.delay:type_name -> google.protobuf.Duration
|
||||||
52, // 54: gw.GPSEpochTimingInfo.time_since_gps_epoch:type_name -> google.protobuf.Duration
|
54, // 54: gw.GPSEpochTimingInfo.time_since_gps_epoch:type_name -> google.protobuf.Duration
|
||||||
7, // 55: gw.UplinkFrame.tx_info_legacy:type_name -> gw.UplinkTxInfoLegacy
|
7, // 55: gw.UplinkFrame.tx_info_legacy:type_name -> gw.UplinkTxInfoLegacy
|
||||||
18, // 56: gw.UplinkFrame.rx_info_legacy:type_name -> gw.UplinkRxInfoLegacy
|
18, // 56: gw.UplinkFrame.rx_info_legacy:type_name -> gw.UplinkRxInfoLegacy
|
||||||
8, // 57: gw.UplinkFrame.tx_info:type_name -> gw.UplinkTxInfo
|
8, // 57: gw.UplinkFrame.tx_info:type_name -> gw.UplinkTxInfo
|
||||||
@ -4299,17 +4463,19 @@ var file_gw_gw_proto_depIdxs = []int32{
|
|||||||
31, // 64: gw.DownlinkTxAck.items:type_name -> gw.DownlinkTxAckItem
|
31, // 64: gw.DownlinkTxAck.items:type_name -> gw.DownlinkTxAckItem
|
||||||
4, // 65: gw.DownlinkTxAckItem.status:type_name -> gw.TxAckStatus
|
4, // 65: gw.DownlinkTxAckItem.status:type_name -> gw.TxAckStatus
|
||||||
33, // 66: gw.GatewayConfiguration.channels:type_name -> gw.ChannelConfiguration
|
33, // 66: gw.GatewayConfiguration.channels:type_name -> gw.ChannelConfiguration
|
||||||
52, // 67: gw.GatewayConfiguration.stats_interval:type_name -> google.protobuf.Duration
|
54, // 67: gw.GatewayConfiguration.stats_interval:type_name -> google.protobuf.Duration
|
||||||
48, // 68: gw.ChannelConfiguration.modulation_legacy:type_name -> common.Modulation
|
50, // 68: gw.ChannelConfiguration.modulation_legacy:type_name -> common.Modulation
|
||||||
34, // 69: gw.ChannelConfiguration.lora_modulation_config:type_name -> gw.LoraModulationConfig
|
34, // 69: gw.ChannelConfiguration.lora_modulation_config:type_name -> gw.LoraModulationConfig
|
||||||
35, // 70: gw.ChannelConfiguration.fsk_modulation_config:type_name -> gw.FskModulationConfig
|
35, // 70: gw.ChannelConfiguration.fsk_modulation_config:type_name -> gw.FskModulationConfig
|
||||||
47, // 71: gw.GatewayCommandExecRequest.environment:type_name -> gw.GatewayCommandExecRequest.EnvironmentEntry
|
49, // 71: gw.GatewayCommandExecRequest.environment:type_name -> gw.GatewayCommandExecRequest.EnvironmentEntry
|
||||||
5, // 72: gw.ConnState.state:type_name -> gw.ConnState.State
|
5, // 72: gw.ConnState.state:type_name -> gw.ConnState.State
|
||||||
73, // [73:73] is the sub-list for method output_type
|
51, // 73: gw.MeshHeartbeat.time:type_name -> google.protobuf.Timestamp
|
||||||
73, // [73:73] is the sub-list for method input_type
|
42, // 74: gw.MeshHeartbeat.relay_path:type_name -> gw.MeshHeartbeatRelayPath
|
||||||
73, // [73:73] is the sub-list for extension type_name
|
75, // [75:75] is the sub-list for method output_type
|
||||||
73, // [73:73] is the sub-list for extension extendee
|
75, // [75:75] is the sub-list for method input_type
|
||||||
0, // [0:73] is the sub-list for field type_name
|
75, // [75:75] is the sub-list for extension type_name
|
||||||
|
75, // [75:75] is the sub-list for extension extendee
|
||||||
|
0, // [0:75] is the sub-list for field type_name
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() { file_gw_gw_proto_init() }
|
func init() { file_gw_gw_proto_init() }
|
||||||
@ -4738,6 +4904,30 @@ func file_gw_gw_proto_init() {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
file_gw_gw_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
|
||||||
|
switch v := v.(*MeshHeartbeat); i {
|
||||||
|
case 0:
|
||||||
|
return &v.state
|
||||||
|
case 1:
|
||||||
|
return &v.sizeCache
|
||||||
|
case 2:
|
||||||
|
return &v.unknownFields
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
file_gw_gw_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {
|
||||||
|
switch v := v.(*MeshHeartbeatRelayPath); i {
|
||||||
|
case 0:
|
||||||
|
return &v.state
|
||||||
|
case 1:
|
||||||
|
return &v.sizeCache
|
||||||
|
case 2:
|
||||||
|
return &v.unknownFields
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
file_gw_gw_proto_msgTypes[0].OneofWrappers = []interface{}{
|
file_gw_gw_proto_msgTypes[0].OneofWrappers = []interface{}{
|
||||||
(*Modulation_Lora)(nil),
|
(*Modulation_Lora)(nil),
|
||||||
@ -4775,7 +4965,7 @@ func file_gw_gw_proto_init() {
|
|||||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||||
RawDescriptor: file_gw_gw_proto_rawDesc,
|
RawDescriptor: file_gw_gw_proto_rawDesc,
|
||||||
NumEnums: 6,
|
NumEnums: 6,
|
||||||
NumMessages: 42,
|
NumMessages: 44,
|
||||||
NumExtensions: 0,
|
NumExtensions: 0,
|
||||||
NumServices: 0,
|
NumServices: 0,
|
||||||
},
|
},
|
||||||
|
12
api/go/integration/integration.pb.go
vendored
12
api/go/integration/integration.pb.go
vendored
@ -1,6 +1,6 @@
|
|||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
// versions:
|
// versions:
|
||||||
// protoc-gen-go v1.31.0
|
// protoc-gen-go v1.34.1
|
||||||
// protoc v4.24.4
|
// protoc v4.24.4
|
||||||
// source: integration/integration.proto
|
// source: integration/integration.proto
|
||||||
|
|
||||||
@ -1581,7 +1581,7 @@ var file_integration_integration_proto_rawDesc = []byte{
|
|||||||
0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x47, 0x41, 0x54, 0x45, 0x57, 0x41, 0x59, 0x10, 0x08, 0x12, 0x18,
|
0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x47, 0x41, 0x54, 0x45, 0x57, 0x41, 0x59, 0x10, 0x08, 0x12, 0x18,
|
||||||
0x0a, 0x14, 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x4e, 0x45, 0x57, 0x5f, 0x45, 0x4e, 0x44, 0x5f,
|
0x0a, 0x14, 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x4e, 0x45, 0x57, 0x5f, 0x45, 0x4e, 0x44, 0x5f,
|
||||||
0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x10, 0x09, 0x12, 0x0e, 0x0a, 0x0a, 0x46, 0x5f, 0x43, 0x4e,
|
0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x10, 0x09, 0x12, 0x0e, 0x0a, 0x0a, 0x46, 0x5f, 0x43, 0x4e,
|
||||||
0x54, 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x0a, 0x42, 0x81, 0x01, 0x0a, 0x1d, 0x69, 0x6f, 0x2e,
|
0x54, 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x0a, 0x42, 0xbf, 0x01, 0x0a, 0x1d, 0x69, 0x6f, 0x2e,
|
||||||
0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x69,
|
0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x69,
|
||||||
0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x10, 0x49, 0x6e, 0x74, 0x65,
|
0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x10, 0x49, 0x6e, 0x74, 0x65,
|
||||||
0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x33,
|
0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x33,
|
||||||
@ -1589,8 +1589,12 @@ var file_integration_integration_proto_rawDesc = []byte{
|
|||||||
0x61, 0x72, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x61, 0x70,
|
0x61, 0x72, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x61, 0x70,
|
||||||
0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x34, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74,
|
0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x34, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74,
|
||||||
0x69, 0x6f, 0x6e, 0xaa, 0x02, 0x16, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b,
|
0x69, 0x6f, 0x6e, 0xaa, 0x02, 0x16, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b,
|
||||||
0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72,
|
0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xca, 0x02, 0x16, 0x43,
|
||||||
0x6f, 0x74, 0x6f, 0x33,
|
0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72,
|
||||||
|
0x61, 0x74, 0x69, 0x6f, 0x6e, 0xe2, 0x02, 0x22, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64,
|
||||||
|
0x61, 0x74, 0x61, 0x5c, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5c, 0x49,
|
||||||
|
0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
|
||||||
|
0x6f, 0x33,
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
23
api/go/stream/api_request.pb.go
vendored
23
api/go/stream/api_request.pb.go
vendored
@ -1,6 +1,6 @@
|
|||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
// versions:
|
// versions:
|
||||||
// protoc-gen-go v1.31.0
|
// protoc-gen-go v1.34.1
|
||||||
// protoc v4.24.4
|
// protoc v4.24.4
|
||||||
// source: stream/api_request.proto
|
// source: stream/api_request.proto
|
||||||
|
|
||||||
@ -110,15 +110,18 @@ var file_stream_api_request_proto_rawDesc = []byte{
|
|||||||
0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b,
|
0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b,
|
||||||
0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a,
|
0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a,
|
||||||
0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61,
|
0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61,
|
||||||
0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x74, 0x0a, 0x18, 0x69, 0x6f, 0x2e, 0x63, 0x68,
|
0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0xa8, 0x01, 0x0a, 0x18, 0x69, 0x6f, 0x2e, 0x63,
|
||||||
0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x73, 0x74, 0x72,
|
0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x73, 0x74,
|
||||||
0x65, 0x61, 0x6d, 0x42, 0x0f, 0x41, 0x70, 0x69, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50,
|
0x72, 0x65, 0x61, 0x6d, 0x42, 0x0f, 0x41, 0x70, 0x69, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
|
||||||
0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,
|
0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e,
|
||||||
0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x63, 0x68,
|
0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x63,
|
||||||
0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f,
|
0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f,
|
||||||
0x76, 0x34, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0xaa, 0x02, 0x11, 0x43, 0x68, 0x69, 0x72,
|
0x2f, 0x76, 0x34, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0xaa, 0x02, 0x11, 0x43, 0x68, 0x69,
|
||||||
0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x62, 0x06, 0x70,
|
0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0xca, 0x02,
|
||||||
0x72, 0x6f, 0x74, 0x6f, 0x33,
|
0x11, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5c, 0x53, 0x74, 0x72, 0x65,
|
||||||
|
0x61, 0x6d, 0xe2, 0x02, 0x1d, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,
|
||||||
|
0x5c, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5c, 0x53, 0x74, 0x72, 0x65,
|
||||||
|
0x61, 0x6d, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
25
api/go/stream/backend_interfaces.pb.go
vendored
25
api/go/stream/backend_interfaces.pb.go
vendored
@ -1,6 +1,6 @@
|
|||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
// versions:
|
// versions:
|
||||||
// protoc-gen-go v1.31.0
|
// protoc-gen-go v1.34.1
|
||||||
// protoc v4.24.4
|
// protoc v4.24.4
|
||||||
// source: stream/backend_interfaces.proto
|
// source: stream/backend_interfaces.proto
|
||||||
|
|
||||||
@ -170,16 +170,19 @@ var file_stream_backend_interfaces_proto_rawDesc = []byte{
|
|||||||
0x72, 0x72, 0x6f, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x71, 0x75,
|
0x72, 0x72, 0x6f, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x71, 0x75,
|
||||||
0x65, 0x73, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x70,
|
0x65, 0x73, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x70,
|
||||||
0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52,
|
0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52,
|
||||||
0x0c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x6f, 0x64, 0x79, 0x42, 0x7b, 0x0a,
|
0x0c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x6f, 0x64, 0x79, 0x42, 0xaf, 0x01,
|
||||||
0x18, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x61,
|
0x0a, 0x18, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e,
|
||||||
0x70, 0x69, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x42, 0x16, 0x42, 0x61, 0x63, 0x6b, 0x65,
|
0x61, 0x70, 0x69, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x42, 0x16, 0x42, 0x61, 0x63, 0x6b,
|
||||||
0x6e, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x74,
|
0x65, 0x6e, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x50, 0x72, 0x6f,
|
||||||
0x6f, 0x50, 0x01, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,
|
0x74, 0x6f, 0x50, 0x01, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,
|
||||||
0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70,
|
0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x63, 0x68, 0x69, 0x72,
|
||||||
0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x34, 0x2f,
|
0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x34,
|
||||||
0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0xaa, 0x02, 0x11, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74,
|
0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0xaa, 0x02, 0x11, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73,
|
||||||
0x61, 0x63, 0x6b, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
|
0x74, 0x61, 0x63, 0x6b, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0xca, 0x02, 0x11, 0x43, 0x68,
|
||||||
0x6f, 0x33,
|
0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5c, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0xe2,
|
||||||
|
0x02, 0x1d, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5c, 0x43, 0x68,
|
||||||
|
0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5c, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x62,
|
||||||
|
0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
23
api/go/stream/frame.pb.go
vendored
23
api/go/stream/frame.pb.go
vendored
@ -1,6 +1,6 @@
|
|||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
// versions:
|
// versions:
|
||||||
// protoc-gen-go v1.31.0
|
// protoc-gen-go v1.34.1
|
||||||
// protoc v4.24.4
|
// protoc v4.24.4
|
||||||
// source: stream/frame.proto
|
// source: stream/frame.proto
|
||||||
|
|
||||||
@ -328,15 +328,18 @@ var file_stream_frame_proto_rawDesc = []byte{
|
|||||||
0x65, 0x78, 0x74, 0x46, 0x4f, 0x70, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x6c, 0x61, 0x69,
|
0x65, 0x78, 0x74, 0x46, 0x4f, 0x70, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x6c, 0x61, 0x69,
|
||||||
0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, 0x72, 0x6d, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61,
|
0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, 0x72, 0x6d, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61,
|
||||||
0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65,
|
0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65,
|
||||||
0x78, 0x74, 0x46, 0x72, 0x6d, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x6f, 0x0a, 0x18,
|
0x78, 0x74, 0x46, 0x72, 0x6d, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0xa3, 0x01, 0x0a,
|
||||||
0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x61, 0x70,
|
0x18, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x61,
|
||||||
0x69, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x42, 0x0a, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x50,
|
0x70, 0x69, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x42, 0x0a, 0x46, 0x72, 0x61, 0x6d, 0x65,
|
||||||
0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,
|
0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e,
|
||||||
0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x63, 0x68,
|
0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x63,
|
||||||
0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f,
|
0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f,
|
||||||
0x76, 0x34, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0xaa, 0x02, 0x11, 0x43, 0x68, 0x69, 0x72,
|
0x2f, 0x76, 0x34, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0xaa, 0x02, 0x11, 0x43, 0x68, 0x69,
|
||||||
0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x62, 0x06, 0x70,
|
0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0xca, 0x02,
|
||||||
0x72, 0x6f, 0x74, 0x6f, 0x33,
|
0x11, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5c, 0x53, 0x74, 0x72, 0x65,
|
||||||
|
0x61, 0x6d, 0xe2, 0x02, 0x1d, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,
|
||||||
|
0x5c, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5c, 0x53, 0x74, 0x72, 0x65,
|
||||||
|
0x61, 0x6d, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
21
api/go/stream/meta.pb.go
vendored
21
api/go/stream/meta.pb.go
vendored
@ -1,6 +1,6 @@
|
|||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
// versions:
|
// versions:
|
||||||
// protoc-gen-go v1.31.0
|
// protoc-gen-go v1.34.1
|
||||||
// protoc v4.24.4
|
// protoc v4.24.4
|
||||||
// source: stream/meta.proto
|
// source: stream/meta.proto
|
||||||
|
|
||||||
@ -288,14 +288,17 @@ var file_stream_meta_proto_rawDesc = []byte{
|
|||||||
0x4d, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79,
|
0x4d, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79,
|
||||||
0x70, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x64,
|
0x70, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x64,
|
||||||
0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49,
|
0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49,
|
||||||
0x64, 0x42, 0x6e, 0x0a, 0x18, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61,
|
0x64, 0x42, 0xa2, 0x01, 0x0a, 0x18, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74,
|
||||||
0x63, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x42, 0x09, 0x4d,
|
0x61, 0x63, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x42, 0x09,
|
||||||
0x65, 0x74, 0x61, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68,
|
0x4d, 0x65, 0x74, 0x61, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x31, 0x67, 0x69, 0x74,
|
||||||
0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63,
|
0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61,
|
||||||
0x6b, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x61, 0x70, 0x69,
|
0x63, 0x6b, 0x2f, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x61, 0x70,
|
||||||
0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x34, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0xaa, 0x02, 0x11,
|
0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x34, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0xaa, 0x02,
|
||||||
0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61,
|
0x11, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x53, 0x74, 0x72, 0x65,
|
||||||
0x6d, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
0x61, 0x6d, 0xca, 0x02, 0x11, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5c,
|
||||||
|
0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0xe2, 0x02, 0x1d, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61,
|
||||||
|
0x64, 0x61, 0x74, 0x61, 0x5c, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5c,
|
||||||
|
0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
2
api/grpc-web/package.json
vendored
2
api/grpc-web/package.json
vendored
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@chirpstack/chirpstack-api-grpc-web",
|
"name": "@chirpstack/chirpstack-api-grpc-web",
|
||||||
"version": "4.8.1",
|
"version": "4.9.0-test.1",
|
||||||
"description": "Chirpstack gRPC-web API",
|
"description": "Chirpstack gRPC-web API",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
2
api/java/build.gradle.kts
vendored
2
api/java/build.gradle.kts
vendored
@ -8,7 +8,7 @@ plugins {
|
|||||||
}
|
}
|
||||||
|
|
||||||
group = "io.chirpstack"
|
group = "io.chirpstack"
|
||||||
version = "4.8.1"
|
version = "4.9.0-test.1"
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
|
2
api/js/package.json
vendored
2
api/js/package.json
vendored
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@chirpstack/chirpstack-api",
|
"name": "@chirpstack/chirpstack-api",
|
||||||
"version": "4.8.1",
|
"version": "4.9.0-test.1",
|
||||||
"description": "Chirpstack JS and TS API",
|
"description": "Chirpstack JS and TS API",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
2
api/kotlin/build.gradle.kts
vendored
2
api/kotlin/build.gradle.kts
vendored
@ -9,7 +9,7 @@ plugins {
|
|||||||
}
|
}
|
||||||
|
|
||||||
group = "io.chirpstack"
|
group = "io.chirpstack"
|
||||||
version = "4.8.1"
|
version = "4.9.0-test.1"
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
|
137
api/proto/api/gateway.proto
vendored
137
api/proto/api/gateway.proto
vendored
@ -75,6 +75,35 @@ service GatewayService {
|
|||||||
get: "/api/gateways/{gateway_id}/duty-cycle-metrics"
|
get: "/api/gateways/{gateway_id}/duty-cycle-metrics"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get the given Relay Gateway.
|
||||||
|
rpc GetRelayGateway(GetRelayGatewayRequest) returns (GetRelayGatewayResponse) {
|
||||||
|
option(google.api.http) = {
|
||||||
|
get: "/api/gateways/relay-gateways/{tenant_id}/{relay_id}"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// List the detected Relay Gateways.
|
||||||
|
rpc ListRelayGateways(ListRelayGatewaysRequest) returns (ListRelayGatewaysResponse) {
|
||||||
|
option(google.api.http) = {
|
||||||
|
get: "/api/gateways/relay-gateways"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update the given Relay Gateway.
|
||||||
|
rpc UpdateRelayGateway(UpdateRelayGatewayRequest) returns (google.protobuf.Empty) {
|
||||||
|
option(google.api.http) = {
|
||||||
|
put: "/api/gateways/relay-gateways/{relay_gateway.tenant_id}/{relay_gateway.relay_id}"
|
||||||
|
body: "*"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete the given Relay Gateway.
|
||||||
|
rpc DeleteRelayGateway(DeleteRelayGatewayRequest) returns (google.protobuf.Empty) {
|
||||||
|
option(google.api.http) = {
|
||||||
|
delete: "/api/gateways/relay-gateways/{tenant_id}/{relay_id}"
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enum GatewayState {
|
enum GatewayState {
|
||||||
@ -284,3 +313,111 @@ message GetGatewayDutyCycleMetricsResponse {
|
|||||||
// Percentage relative to tracking window.
|
// Percentage relative to tracking window.
|
||||||
common.Metric window_percentage = 2;
|
common.Metric window_percentage = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
message GetRelayGatewayRequest {
|
||||||
|
// Tenant ID (UUID).
|
||||||
|
string tenant_id = 1;
|
||||||
|
|
||||||
|
// Relay ID (4 byte HEX).
|
||||||
|
string relay_id = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message GetRelayGatewayResponse {
|
||||||
|
// Relay Gateway object.
|
||||||
|
RelayGateway relay_gateway = 1;
|
||||||
|
|
||||||
|
// Created at timestamp.
|
||||||
|
google.protobuf.Timestamp created_at = 2;
|
||||||
|
|
||||||
|
// Last update timestamp.
|
||||||
|
google.protobuf.Timestamp updated_at = 3;
|
||||||
|
|
||||||
|
// Last seen at timestamp.
|
||||||
|
google.protobuf.Timestamp last_seen_at = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
message ListRelayGatewaysRequest {
|
||||||
|
// Max number of relay-gateways to return in the result-set.
|
||||||
|
uint32 limit = 1;
|
||||||
|
|
||||||
|
// Offset in the result-set (for pagination).
|
||||||
|
uint32 offset = 2;
|
||||||
|
|
||||||
|
// Tenant ID (UUID) to filter relay-gateways on.
|
||||||
|
// To list all relay-gateways as a global admin user, this field can be left blank.
|
||||||
|
string tenant_id = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
message ListRelayGatewaysResponse {
|
||||||
|
// Total number of relay-gateways.
|
||||||
|
uint32 total_count = 1;
|
||||||
|
|
||||||
|
// Result-set.
|
||||||
|
repeated RelayGatewayListItem result = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message RelayGatewayListItem {
|
||||||
|
// Tenant ID.
|
||||||
|
string tenant_id = 1;
|
||||||
|
|
||||||
|
// Relay ID (4 byte HEX).
|
||||||
|
string relay_id = 2;
|
||||||
|
|
||||||
|
// Name.
|
||||||
|
string name = 3;
|
||||||
|
|
||||||
|
// Description.
|
||||||
|
string description = 4;
|
||||||
|
|
||||||
|
// Created at timestamp.
|
||||||
|
google.protobuf.Timestamp created_at = 5;
|
||||||
|
|
||||||
|
// Last update timestamp.
|
||||||
|
google.protobuf.Timestamp updated_at = 6;
|
||||||
|
|
||||||
|
// Last seen at timestamp.
|
||||||
|
google.protobuf.Timestamp last_seen_at = 7;
|
||||||
|
|
||||||
|
// Gateway state.
|
||||||
|
// Please note that the state of the relay is driven by the last
|
||||||
|
// received stats packet sent by the relay-gateway.
|
||||||
|
GatewayState state = 10;
|
||||||
|
|
||||||
|
// Region configuration ID.
|
||||||
|
string region_config_id = 11;
|
||||||
|
}
|
||||||
|
|
||||||
|
message UpdateRelayGatewayRequest {
|
||||||
|
// Relay Gateway object.
|
||||||
|
RelayGateway relay_gateway = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message DeleteRelayGatewayRequest {
|
||||||
|
// Tenant ID.
|
||||||
|
string tenant_id = 1;
|
||||||
|
|
||||||
|
// Relay ID (4 byte HEX).
|
||||||
|
string relay_id = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message RelayGateway {
|
||||||
|
// Tenant ID.
|
||||||
|
string tenant_id = 1;
|
||||||
|
|
||||||
|
// Relay ID (4 byte HEX).
|
||||||
|
string relay_id = 2;
|
||||||
|
|
||||||
|
// Name.
|
||||||
|
string name = 3;
|
||||||
|
|
||||||
|
// Description.
|
||||||
|
string description = 4;
|
||||||
|
|
||||||
|
// Stats interval (seconds).
|
||||||
|
// This defines the expected interval in which the gateway sends its
|
||||||
|
// statistics.
|
||||||
|
uint32 stats_interval = 5;
|
||||||
|
|
||||||
|
// Region configuration ID.
|
||||||
|
string region_config_id = 6;
|
||||||
|
}
|
||||||
|
26
api/proto/gw/gw.proto
vendored
26
api/proto/gw/gw.proto
vendored
@ -749,3 +749,29 @@ message ConnState {
|
|||||||
|
|
||||||
State state = 2;
|
State state = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Gateway Mesh heartbeat (sent periodically by the Relay Gateways).
|
||||||
|
message MeshHeartbeat {
|
||||||
|
// Gateway ID (of the Border Gateway).
|
||||||
|
string gateway_id = 1;
|
||||||
|
|
||||||
|
// Relay ID.
|
||||||
|
string relay_id = 2;
|
||||||
|
|
||||||
|
// Timestamp (second precision).
|
||||||
|
google.protobuf.Timestamp time = 3;
|
||||||
|
|
||||||
|
// Relay path.
|
||||||
|
repeated MeshHeartbeatRelayPath relay_path = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
message MeshHeartbeatRelayPath {
|
||||||
|
// Relay ID.
|
||||||
|
string relay_id = 1;
|
||||||
|
|
||||||
|
// RSSI.
|
||||||
|
int32 rssi = 2;
|
||||||
|
|
||||||
|
// SNR.
|
||||||
|
int32 snr = 3;
|
||||||
|
}
|
||||||
|
2
api/python/src/setup.py
vendored
2
api/python/src/setup.py
vendored
@ -18,7 +18,7 @@ CLASSIFIERS = [
|
|||||||
|
|
||||||
setup(
|
setup(
|
||||||
name='chirpstack-api',
|
name='chirpstack-api',
|
||||||
version = "4.8.1.post1",
|
version = "4.9.0-test.1",
|
||||||
url='https://github.com/brocaar/chirpstack-api',
|
url='https://github.com/brocaar/chirpstack-api',
|
||||||
author='Orne Brocaar',
|
author='Orne Brocaar',
|
||||||
author_email='info@brocaar.com',
|
author_email='info@brocaar.com',
|
||||||
|
2
api/rust/Cargo.toml
vendored
2
api/rust/Cargo.toml
vendored
@ -1,7 +1,7 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "chirpstack_api"
|
name = "chirpstack_api"
|
||||||
description = "ChirpStack Protobuf / gRPC API definitions."
|
description = "ChirpStack Protobuf / gRPC API definitions."
|
||||||
version = "4.8.1"
|
version = "4.9.0-test.1"
|
||||||
authors = ["Orne Brocaar <info@brocaar.com>"]
|
authors = ["Orne Brocaar <info@brocaar.com>"]
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
homepage = "https://www.chirpstack.io"
|
homepage = "https://www.chirpstack.io"
|
||||||
|
@ -7,6 +7,8 @@ option java_package = "io.chirpstack.api";
|
|||||||
option java_multiple_files = true;
|
option java_multiple_files = true;
|
||||||
option java_outer_classname = "ApplicationProto";
|
option java_outer_classname = "ApplicationProto";
|
||||||
option csharp_namespace = "Chirpstack.Api";
|
option csharp_namespace = "Chirpstack.Api";
|
||||||
|
option php_namespace = "Chirpstack\\Api";
|
||||||
|
option php_metadata_namespace = "GPBMetadata\\Chirpstack\\Api";
|
||||||
|
|
||||||
import "google/api/annotations.proto";
|
import "google/api/annotations.proto";
|
||||||
import "google/protobuf/timestamp.proto";
|
import "google/protobuf/timestamp.proto";
|
||||||
|
2
api/rust/proto/chirpstack/api/device.proto
vendored
2
api/rust/proto/chirpstack/api/device.proto
vendored
@ -7,6 +7,8 @@ option java_package = "io.chirpstack.api";
|
|||||||
option java_multiple_files = true;
|
option java_multiple_files = true;
|
||||||
option java_outer_classname = "DeviceProto";
|
option java_outer_classname = "DeviceProto";
|
||||||
option csharp_namespace = "Chirpstack.Api";
|
option csharp_namespace = "Chirpstack.Api";
|
||||||
|
option php_namespace = "Chirpstack\\Api";
|
||||||
|
option php_metadata_namespace = "GPBMetadata\\Chirpstack\\Api";
|
||||||
|
|
||||||
import "common/common.proto";
|
import "common/common.proto";
|
||||||
import "google/api/annotations.proto";
|
import "google/api/annotations.proto";
|
||||||
|
@ -7,6 +7,8 @@ option java_package = "io.chirpstack.api";
|
|||||||
option java_multiple_files = true;
|
option java_multiple_files = true;
|
||||||
option java_outer_classname = "DeviceProfileProto";
|
option java_outer_classname = "DeviceProfileProto";
|
||||||
option csharp_namespace = "Chirpstack.Api";
|
option csharp_namespace = "Chirpstack.Api";
|
||||||
|
option php_namespace = "Chirpstack\\Api";
|
||||||
|
option php_metadata_namespace = "GPBMetadata\\Chirpstack\\Api";
|
||||||
|
|
||||||
import "google/api/annotations.proto";
|
import "google/api/annotations.proto";
|
||||||
import "google/protobuf/timestamp.proto";
|
import "google/protobuf/timestamp.proto";
|
||||||
|
@ -7,6 +7,8 @@ option java_package = "io.chirpstack.api";
|
|||||||
option java_multiple_files = true;
|
option java_multiple_files = true;
|
||||||
option java_outer_classname = "DeviceProfileTemplateProto";
|
option java_outer_classname = "DeviceProfileTemplateProto";
|
||||||
option csharp_namespace = "Chirpstack.Api";
|
option csharp_namespace = "Chirpstack.Api";
|
||||||
|
option php_namespace = "Chirpstack\\Api";
|
||||||
|
option php_metadata_namespace = "GPBMetadata\\Chirpstack\\Api";
|
||||||
|
|
||||||
import "google/api/annotations.proto";
|
import "google/api/annotations.proto";
|
||||||
import "google/protobuf/timestamp.proto";
|
import "google/protobuf/timestamp.proto";
|
||||||
|
139
api/rust/proto/chirpstack/api/gateway.proto
vendored
139
api/rust/proto/chirpstack/api/gateway.proto
vendored
@ -7,6 +7,8 @@ option java_package = "io.chirpstack.api";
|
|||||||
option java_multiple_files = true;
|
option java_multiple_files = true;
|
||||||
option java_outer_classname = "GatewayProto";
|
option java_outer_classname = "GatewayProto";
|
||||||
option csharp_namespace = "Chirpstack.Api";
|
option csharp_namespace = "Chirpstack.Api";
|
||||||
|
option php_namespace = "Chirpstack\\Api";
|
||||||
|
option php_metadata_namespace = "GPBMetadata\\Chirpstack\\Api";
|
||||||
|
|
||||||
import "google/api/annotations.proto";
|
import "google/api/annotations.proto";
|
||||||
import "google/protobuf/timestamp.proto";
|
import "google/protobuf/timestamp.proto";
|
||||||
@ -73,6 +75,35 @@ service GatewayService {
|
|||||||
get: "/api/gateways/{gateway_id}/duty-cycle-metrics"
|
get: "/api/gateways/{gateway_id}/duty-cycle-metrics"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get the given Relay Gateway.
|
||||||
|
rpc GetRelayGateway(GetRelayGatewayRequest) returns (GetRelayGatewayResponse) {
|
||||||
|
option(google.api.http) = {
|
||||||
|
get: "/api/gateways/relay-gateways/{tenant_id}/{relay_id}"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// List the detected Relay Gateways.
|
||||||
|
rpc ListRelayGateways(ListRelayGatewaysRequest) returns (ListRelayGatewaysResponse) {
|
||||||
|
option(google.api.http) = {
|
||||||
|
get: "/api/gateways/relay-gateways"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update the given Relay Gateway.
|
||||||
|
rpc UpdateRelayGateway(UpdateRelayGatewayRequest) returns (google.protobuf.Empty) {
|
||||||
|
option(google.api.http) = {
|
||||||
|
put: "/api/gateways/relay-gateways/{relay_gateway.tenant_id}/{relay_gateway.relay_id}"
|
||||||
|
body: "*"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete the given Relay Gateway.
|
||||||
|
rpc DeleteRelayGateway(DeleteRelayGatewayRequest) returns (google.protobuf.Empty) {
|
||||||
|
option(google.api.http) = {
|
||||||
|
delete: "/api/gateways/relay-gateways/{tenant_id}/{relay_id}"
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enum GatewayState {
|
enum GatewayState {
|
||||||
@ -282,3 +313,111 @@ message GetGatewayDutyCycleMetricsResponse {
|
|||||||
// Percentage relative to tracking window.
|
// Percentage relative to tracking window.
|
||||||
common.Metric window_percentage = 2;
|
common.Metric window_percentage = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
message GetRelayGatewayRequest {
|
||||||
|
// Tenant ID (UUID).
|
||||||
|
string tenant_id = 1;
|
||||||
|
|
||||||
|
// Relay ID (4 byte HEX).
|
||||||
|
string relay_id = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message GetRelayGatewayResponse {
|
||||||
|
// Relay Gateway object.
|
||||||
|
RelayGateway relay_gateway = 1;
|
||||||
|
|
||||||
|
// Created at timestamp.
|
||||||
|
google.protobuf.Timestamp created_at = 2;
|
||||||
|
|
||||||
|
// Last update timestamp.
|
||||||
|
google.protobuf.Timestamp updated_at = 3;
|
||||||
|
|
||||||
|
// Last seen at timestamp.
|
||||||
|
google.protobuf.Timestamp last_seen_at = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
message ListRelayGatewaysRequest {
|
||||||
|
// Max number of relay-gateways to return in the result-set.
|
||||||
|
uint32 limit = 1;
|
||||||
|
|
||||||
|
// Offset in the result-set (for pagination).
|
||||||
|
uint32 offset = 2;
|
||||||
|
|
||||||
|
// Tenant ID (UUID) to filter relay-gateways on.
|
||||||
|
// To list all relay-gateways as a global admin user, this field can be left blank.
|
||||||
|
string tenant_id = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
message ListRelayGatewaysResponse {
|
||||||
|
// Total number of relay-gateways.
|
||||||
|
uint32 total_count = 1;
|
||||||
|
|
||||||
|
// Result-set.
|
||||||
|
repeated RelayGatewayListItem result = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message RelayGatewayListItem {
|
||||||
|
// Tenant ID.
|
||||||
|
string tenant_id = 1;
|
||||||
|
|
||||||
|
// Relay ID (4 byte HEX).
|
||||||
|
string relay_id = 2;
|
||||||
|
|
||||||
|
// Name.
|
||||||
|
string name = 3;
|
||||||
|
|
||||||
|
// Description.
|
||||||
|
string description = 4;
|
||||||
|
|
||||||
|
// Created at timestamp.
|
||||||
|
google.protobuf.Timestamp created_at = 5;
|
||||||
|
|
||||||
|
// Last update timestamp.
|
||||||
|
google.protobuf.Timestamp updated_at = 6;
|
||||||
|
|
||||||
|
// Last seen at timestamp.
|
||||||
|
google.protobuf.Timestamp last_seen_at = 7;
|
||||||
|
|
||||||
|
// Gateway state.
|
||||||
|
// Please note that the state of the relay is driven by the last
|
||||||
|
// received stats packet sent by the relay-gateway.
|
||||||
|
GatewayState state = 10;
|
||||||
|
|
||||||
|
// Region configuration ID.
|
||||||
|
string region_config_id = 11;
|
||||||
|
}
|
||||||
|
|
||||||
|
message UpdateRelayGatewayRequest {
|
||||||
|
// Relay Gateway object.
|
||||||
|
RelayGateway relay_gateway = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message DeleteRelayGatewayRequest {
|
||||||
|
// Tenant ID.
|
||||||
|
string tenant_id = 1;
|
||||||
|
|
||||||
|
// Relay ID (4 byte HEX).
|
||||||
|
string relay_id = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message RelayGateway {
|
||||||
|
// Tenant ID.
|
||||||
|
string tenant_id = 1;
|
||||||
|
|
||||||
|
// Relay ID (4 byte HEX).
|
||||||
|
string relay_id = 2;
|
||||||
|
|
||||||
|
// Name.
|
||||||
|
string name = 3;
|
||||||
|
|
||||||
|
// Description.
|
||||||
|
string description = 4;
|
||||||
|
|
||||||
|
// Stats interval (seconds).
|
||||||
|
// This defines the expected interval in which the gateway sends its
|
||||||
|
// statistics.
|
||||||
|
uint32 stats_interval = 5;
|
||||||
|
|
||||||
|
// Region configuration ID.
|
||||||
|
string region_config_id = 6;
|
||||||
|
}
|
||||||
|
2
api/rust/proto/chirpstack/api/internal.proto
vendored
2
api/rust/proto/chirpstack/api/internal.proto
vendored
@ -7,6 +7,8 @@ option java_package = "io.chirpstack.api";
|
|||||||
option java_multiple_files = true;
|
option java_multiple_files = true;
|
||||||
option java_outer_classname = "InternalProto";
|
option java_outer_classname = "InternalProto";
|
||||||
option csharp_namespace = "Chirpstack.Api";
|
option csharp_namespace = "Chirpstack.Api";
|
||||||
|
option php_namespace = "Chirpstack\\Api";
|
||||||
|
option php_metadata_namespace = "GPBMetadata\\Chirpstack\\Api";
|
||||||
|
|
||||||
import "google/protobuf/timestamp.proto";
|
import "google/protobuf/timestamp.proto";
|
||||||
import "google/protobuf/empty.proto";
|
import "google/protobuf/empty.proto";
|
||||||
|
@ -7,6 +7,8 @@ option java_package = "io.chirpstack.api";
|
|||||||
option java_multiple_files = true;
|
option java_multiple_files = true;
|
||||||
option java_outer_classname = "MulticastGroupProto";
|
option java_outer_classname = "MulticastGroupProto";
|
||||||
option csharp_namespace = "Chirpstack.Api";
|
option csharp_namespace = "Chirpstack.Api";
|
||||||
|
option php_namespace = "Chirpstack\\Api";
|
||||||
|
option php_metadata_namespace = "GPBMetadata\\Chirpstack\\Api";
|
||||||
|
|
||||||
import "google/api/annotations.proto";
|
import "google/api/annotations.proto";
|
||||||
import "google/protobuf/timestamp.proto";
|
import "google/protobuf/timestamp.proto";
|
||||||
|
2
api/rust/proto/chirpstack/api/relay.proto
vendored
2
api/rust/proto/chirpstack/api/relay.proto
vendored
@ -7,6 +7,8 @@ option java_package = "io.chirpstack.api";
|
|||||||
option java_multiple_files = true;
|
option java_multiple_files = true;
|
||||||
option java_outer_classname = "RelayProto";
|
option java_outer_classname = "RelayProto";
|
||||||
option csharp_namespace = "Chirpstack.Api";
|
option csharp_namespace = "Chirpstack.Api";
|
||||||
|
option php_namespace = "Chirpstack\\Api";
|
||||||
|
option php_metadata_namespace = "GPBMetadata\\Chirpstack\\Api";
|
||||||
|
|
||||||
import "google/api/annotations.proto";
|
import "google/api/annotations.proto";
|
||||||
import "google/protobuf/timestamp.proto";
|
import "google/protobuf/timestamp.proto";
|
||||||
|
2
api/rust/proto/chirpstack/api/tenant.proto
vendored
2
api/rust/proto/chirpstack/api/tenant.proto
vendored
@ -7,6 +7,8 @@ option java_package = "io.chirpstack.api";
|
|||||||
option java_multiple_files = true;
|
option java_multiple_files = true;
|
||||||
option java_outer_classname = "TenantProto";
|
option java_outer_classname = "TenantProto";
|
||||||
option csharp_namespace = "Chirpstack.Api";
|
option csharp_namespace = "Chirpstack.Api";
|
||||||
|
option php_namespace = "Chirpstack\\Api";
|
||||||
|
option php_metadata_namespace = "GPBMetadata\\Chirpstack\\Api";
|
||||||
|
|
||||||
import "google/api/annotations.proto";
|
import "google/api/annotations.proto";
|
||||||
import "google/protobuf/timestamp.proto";
|
import "google/protobuf/timestamp.proto";
|
||||||
|
2
api/rust/proto/chirpstack/api/user.proto
vendored
2
api/rust/proto/chirpstack/api/user.proto
vendored
@ -7,6 +7,8 @@ option java_package = "io.chirpstack.api";
|
|||||||
option java_multiple_files = true;
|
option java_multiple_files = true;
|
||||||
option java_outer_classname = "UserProto";
|
option java_outer_classname = "UserProto";
|
||||||
option csharp_namespace = "Chirpstack.Api";
|
option csharp_namespace = "Chirpstack.Api";
|
||||||
|
option php_namespace = "Chirpstack\\Api";
|
||||||
|
option php_metadata_namespace = "GPBMetadata\\Chirpstack\\Api";
|
||||||
|
|
||||||
import "google/api/annotations.proto";
|
import "google/api/annotations.proto";
|
||||||
import "google/protobuf/timestamp.proto";
|
import "google/protobuf/timestamp.proto";
|
||||||
|
@ -7,6 +7,8 @@ option java_package = "io.chirpstack.api";
|
|||||||
option java_multiple_files = true;
|
option java_multiple_files = true;
|
||||||
option java_outer_classname = "CommonProto";
|
option java_outer_classname = "CommonProto";
|
||||||
option csharp_namespace = "Chirpstack.Common";
|
option csharp_namespace = "Chirpstack.Common";
|
||||||
|
option php_namespace = "Chirpstack\\Common";
|
||||||
|
option php_metadata_namespace = "GPBMetadata\\Chirpstack\\Common";
|
||||||
|
|
||||||
import "google/protobuf/timestamp.proto";
|
import "google/protobuf/timestamp.proto";
|
||||||
|
|
||||||
|
28
api/rust/proto/chirpstack/gw/gw.proto
vendored
28
api/rust/proto/chirpstack/gw/gw.proto
vendored
@ -7,6 +7,8 @@ option java_package = "io.chirpstack.api.gw";
|
|||||||
option java_multiple_files = true;
|
option java_multiple_files = true;
|
||||||
option java_outer_classname = "GatewayProto";
|
option java_outer_classname = "GatewayProto";
|
||||||
option csharp_namespace = "Chirpstack.Gateway";
|
option csharp_namespace = "Chirpstack.Gateway";
|
||||||
|
option php_namespace = "Chirpstack\\Gateway";
|
||||||
|
option php_metadata_namespace = "GPBMetadata\\Chirpstack\\Gateway";
|
||||||
|
|
||||||
import "common/common.proto";
|
import "common/common.proto";
|
||||||
import "google/protobuf/timestamp.proto";
|
import "google/protobuf/timestamp.proto";
|
||||||
@ -747,3 +749,29 @@ message ConnState {
|
|||||||
|
|
||||||
State state = 2;
|
State state = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Gateway Mesh heartbeat (sent periodically by the Relay Gateways).
|
||||||
|
message MeshHeartbeat {
|
||||||
|
// Gateway ID (of the Border Gateway).
|
||||||
|
string gateway_id = 1;
|
||||||
|
|
||||||
|
// Relay ID.
|
||||||
|
string relay_id = 2;
|
||||||
|
|
||||||
|
// Timestamp (second precision).
|
||||||
|
google.protobuf.Timestamp time = 3;
|
||||||
|
|
||||||
|
// Relay path.
|
||||||
|
repeated MeshHeartbeatRelayPath relay_path = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
message MeshHeartbeatRelayPath {
|
||||||
|
// Relay ID.
|
||||||
|
string relay_id = 1;
|
||||||
|
|
||||||
|
// RSSI.
|
||||||
|
int32 rssi = 2;
|
||||||
|
|
||||||
|
// SNR.
|
||||||
|
int32 snr = 3;
|
||||||
|
}
|
||||||
|
@ -7,6 +7,8 @@ option java_package = "io.chirpstack.api.integration";
|
|||||||
option java_multiple_files = true;
|
option java_multiple_files = true;
|
||||||
option java_outer_classname = "IntegrationProto";
|
option java_outer_classname = "IntegrationProto";
|
||||||
option csharp_namespace = "Chirpstack.Integration";
|
option csharp_namespace = "Chirpstack.Integration";
|
||||||
|
option php_namespace = "Chirpstack\\Integration";
|
||||||
|
option php_metadata_namespace = "GPBMetadata\\Chirpstack\\Integration";
|
||||||
|
|
||||||
import "common/common.proto";
|
import "common/common.proto";
|
||||||
import "gw/gw.proto";
|
import "gw/gw.proto";
|
||||||
|
@ -7,6 +7,8 @@ option java_package = "io.chirpstack.api.stream";
|
|||||||
option java_multiple_files = true;
|
option java_multiple_files = true;
|
||||||
option java_outer_classname = "ApiRequestProto";
|
option java_outer_classname = "ApiRequestProto";
|
||||||
option csharp_namespace = "Chirpstack.Stream";
|
option csharp_namespace = "Chirpstack.Stream";
|
||||||
|
option php_namespace = "Chirpstack\\Stream";
|
||||||
|
option php_metadata_namespace = "GPBMetadata\\Chirpstack\\Stream";
|
||||||
|
|
||||||
import "google/protobuf/timestamp.proto";
|
import "google/protobuf/timestamp.proto";
|
||||||
import "common/common.proto";
|
import "common/common.proto";
|
||||||
|
@ -7,6 +7,8 @@ option java_package = "io.chirpstack.api.stream";
|
|||||||
option java_multiple_files = true;
|
option java_multiple_files = true;
|
||||||
option java_outer_classname = "BackendInterfacesProto";
|
option java_outer_classname = "BackendInterfacesProto";
|
||||||
option csharp_namespace = "Chirpstack.Stream";
|
option csharp_namespace = "Chirpstack.Stream";
|
||||||
|
option php_namespace = "Chirpstack\\Stream";
|
||||||
|
option php_metadata_namespace = "GPBMetadata\\Chirpstack\\Stream";
|
||||||
|
|
||||||
import "google/protobuf/timestamp.proto";
|
import "google/protobuf/timestamp.proto";
|
||||||
|
|
||||||
|
2
api/rust/proto/chirpstack/stream/frame.proto
vendored
2
api/rust/proto/chirpstack/stream/frame.proto
vendored
@ -7,6 +7,8 @@ option java_package = "io.chirpstack.api.stream";
|
|||||||
option java_multiple_files = true;
|
option java_multiple_files = true;
|
||||||
option java_outer_classname = "FrameProto";
|
option java_outer_classname = "FrameProto";
|
||||||
option csharp_namespace = "Chirpstack.Stream";
|
option csharp_namespace = "Chirpstack.Stream";
|
||||||
|
option php_namespace = "Chirpstack\\Stream";
|
||||||
|
option php_metadata_namespace = "GPBMetadata\\Chirpstack\\Stream";
|
||||||
|
|
||||||
import "google/protobuf/timestamp.proto";
|
import "google/protobuf/timestamp.proto";
|
||||||
import "common/common.proto";
|
import "common/common.proto";
|
||||||
|
2
api/rust/proto/chirpstack/stream/meta.proto
vendored
2
api/rust/proto/chirpstack/stream/meta.proto
vendored
@ -7,6 +7,8 @@ option java_package = "io.chirpstack.api.stream";
|
|||||||
option java_multiple_files = true;
|
option java_multiple_files = true;
|
||||||
option java_outer_classname = "MetaProto";
|
option java_outer_classname = "MetaProto";
|
||||||
option csharp_namespace = "Chirpstack.Stream";
|
option csharp_namespace = "Chirpstack.Stream";
|
||||||
|
option php_namespace = "Chirpstack\\Stream";
|
||||||
|
option php_metadata_namespace = "GPBMetadata\\Chirpstack\\Stream";
|
||||||
|
|
||||||
import "common/common.proto";
|
import "common/common.proto";
|
||||||
import "gw/gw.proto";
|
import "gw/gw.proto";
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "backend"
|
name = "backend"
|
||||||
version = "4.8.1"
|
version = "4.9.0-test.1"
|
||||||
authors = ["Orne Brocaar <info@brocaar.com>"]
|
authors = ["Orne Brocaar <info@brocaar.com>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
publish = false
|
publish = false
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
repository = "https://github.com/chirpstack/chirpstack"
|
repository = "https://github.com/chirpstack/chirpstack"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
chirpstack_api = { path = "../api/rust", version = "4.8.0" }
|
chirpstack_api = { path = "../api/rust", version = "4.9.0-test.1" }
|
||||||
redis = { version = "0.25", features = [
|
redis = { version = "0.25", features = [
|
||||||
"cluster-async",
|
"cluster-async",
|
||||||
"tokio-rustls-comp",
|
"tokio-rustls-comp",
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
description = "ChirpStack is an open-source LoRaWAN(TM) Network Server"
|
description = "ChirpStack is an open-source LoRaWAN(TM) Network Server"
|
||||||
repository = "https://github.com/chirpstack/chirpstack"
|
repository = "https://github.com/chirpstack/chirpstack"
|
||||||
homepage = "https://www.chirpstack.io/"
|
homepage = "https://www.chirpstack.io/"
|
||||||
version = "4.8.1"
|
version = "4.9.0-test.1"
|
||||||
authors = ["Orne Brocaar <info@brocaar.com>"]
|
authors = ["Orne Brocaar <info@brocaar.com>"]
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
publish = false
|
publish = false
|
||||||
|
@ -0,0 +1 @@
|
|||||||
|
drop table relay_gateway;
|
@ -0,0 +1,13 @@
|
|||||||
|
create table relay_gateway (
|
||||||
|
tenant_id uuid not null references tenant on delete cascade,
|
||||||
|
relay_id bytea not null,
|
||||||
|
created_at timestamp with time zone not null,
|
||||||
|
updated_at timestamp with time zone not null,
|
||||||
|
last_seen_at timestamp with time zone,
|
||||||
|
name varchar(100) not null,
|
||||||
|
description text not null,
|
||||||
|
stats_interval_secs integer not null,
|
||||||
|
region_config_id varchar(100) not null,
|
||||||
|
|
||||||
|
primary key (tenant_id, relay_id)
|
||||||
|
);
|
@ -14,7 +14,11 @@ use super::auth::validator;
|
|||||||
use super::error::ToStatus;
|
use super::error::ToStatus;
|
||||||
use super::helpers::{self, FromProto};
|
use super::helpers::{self, FromProto};
|
||||||
use crate::certificate;
|
use crate::certificate;
|
||||||
use crate::storage::{fields, gateway, metrics};
|
use crate::storage::{
|
||||||
|
fields,
|
||||||
|
gateway::{self, RelayId},
|
||||||
|
metrics,
|
||||||
|
};
|
||||||
|
|
||||||
pub struct Gateway {
|
pub struct Gateway {
|
||||||
validator: validator::RequestValidator,
|
validator: validator::RequestValidator,
|
||||||
@ -783,6 +787,194 @@ impl GatewayService for Gateway {
|
|||||||
|
|
||||||
Ok(resp)
|
Ok(resp)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn get_relay_gateway(
|
||||||
|
&self,
|
||||||
|
request: Request<api::GetRelayGatewayRequest>,
|
||||||
|
) -> Result<Response<api::GetRelayGatewayResponse>, Status> {
|
||||||
|
let req = request.get_ref();
|
||||||
|
let tenant_id = Uuid::from_str(&req.tenant_id).map_err(|e| e.status())?;
|
||||||
|
let relay_id = RelayId::from_str(&req.relay_id).map_err(|e| e.status())?;
|
||||||
|
|
||||||
|
// The tenant_id is part of the relay PK.
|
||||||
|
self.validator
|
||||||
|
.validate(
|
||||||
|
request.extensions(),
|
||||||
|
validator::ValidateGatewaysAccess::new(validator::Flag::List, tenant_id),
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
let relay = gateway::get_relay_gateway(tenant_id, relay_id)
|
||||||
|
.await
|
||||||
|
.map_err(|e| e.status())?;
|
||||||
|
|
||||||
|
let mut resp = Response::new(api::GetRelayGatewayResponse {
|
||||||
|
relay_gateway: Some(api::RelayGateway {
|
||||||
|
tenant_id: relay.tenant_id.to_string(),
|
||||||
|
relay_id: relay.relay_id.to_string(),
|
||||||
|
name: relay.name,
|
||||||
|
description: relay.description,
|
||||||
|
stats_interval: relay.stats_interval_secs as u32,
|
||||||
|
region_config_id: relay.region_config_id.to_string(),
|
||||||
|
}),
|
||||||
|
created_at: Some(helpers::datetime_to_prost_timestamp(&relay.created_at)),
|
||||||
|
updated_at: Some(helpers::datetime_to_prost_timestamp(&relay.updated_at)),
|
||||||
|
last_seen_at: relay
|
||||||
|
.last_seen_at
|
||||||
|
.as_ref()
|
||||||
|
.map(helpers::datetime_to_prost_timestamp),
|
||||||
|
});
|
||||||
|
|
||||||
|
resp.metadata_mut()
|
||||||
|
.insert("x-log-tenant_id", req.tenant_id.parse().unwrap());
|
||||||
|
resp.metadata_mut()
|
||||||
|
.insert("x-log-relay_id", req.relay_id.parse().unwrap());
|
||||||
|
|
||||||
|
Ok(resp)
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn update_relay_gateway(
|
||||||
|
&self,
|
||||||
|
request: Request<api::UpdateRelayGatewayRequest>,
|
||||||
|
) -> Result<Response<()>, Status> {
|
||||||
|
let req_relay = match &request.get_ref().relay_gateway {
|
||||||
|
Some(v) => v,
|
||||||
|
None => {
|
||||||
|
return Err(Status::invalid_argument("relay_gateway is missing"));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let tenant_id = Uuid::from_str(&req_relay.tenant_id).map_err(|e| e.status())?;
|
||||||
|
let relay_id = RelayId::from_str(&req_relay.relay_id).map_err(|e| e.status())?;
|
||||||
|
|
||||||
|
// The tenant_id is part of the relay PK.
|
||||||
|
self.validator
|
||||||
|
.validate(
|
||||||
|
request.extensions(),
|
||||||
|
validator::ValidateGatewaysAccess::new(validator::Flag::List, tenant_id),
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
let _ = gateway::update_relay_gateway(gateway::RelayGateway {
|
||||||
|
tenant_id,
|
||||||
|
relay_id,
|
||||||
|
name: req_relay.name.clone(),
|
||||||
|
description: req_relay.description.clone(),
|
||||||
|
stats_interval_secs: req_relay.stats_interval as i32,
|
||||||
|
region_config_id: req_relay.region_config_id.clone(),
|
||||||
|
..Default::default()
|
||||||
|
})
|
||||||
|
.await
|
||||||
|
.map_err(|e| e.status())?;
|
||||||
|
|
||||||
|
let mut resp = Response::new(());
|
||||||
|
resp.metadata_mut()
|
||||||
|
.insert("x-log-tenant_id", req_relay.tenant_id.parse().unwrap());
|
||||||
|
resp.metadata_mut()
|
||||||
|
.insert("x-log-relay_id", req_relay.relay_id.parse().unwrap());
|
||||||
|
|
||||||
|
Ok(resp)
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn delete_relay_gateway(
|
||||||
|
&self,
|
||||||
|
request: Request<api::DeleteRelayGatewayRequest>,
|
||||||
|
) -> Result<Response<()>, Status> {
|
||||||
|
let req = request.get_ref();
|
||||||
|
let tenant_id = Uuid::from_str(&req.tenant_id).map_err(|e| e.status())?;
|
||||||
|
let relay_id = RelayId::from_str(&req.relay_id).map_err(|e| e.status())?;
|
||||||
|
|
||||||
|
// The tenant_id is part of the relay PK.
|
||||||
|
self.validator
|
||||||
|
.validate(
|
||||||
|
request.extensions(),
|
||||||
|
validator::ValidateGatewaysAccess::new(validator::Flag::List, tenant_id),
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
gateway::delete_relay_gateway(tenant_id, relay_id)
|
||||||
|
.await
|
||||||
|
.map_err(|e| e.status())?;
|
||||||
|
|
||||||
|
let mut resp = Response::new(());
|
||||||
|
resp.metadata_mut()
|
||||||
|
.insert("x-log-tenant_id", req.tenant_id.parse().unwrap());
|
||||||
|
resp.metadata_mut()
|
||||||
|
.insert("x-log-relay_id", req.relay_id.parse().unwrap());
|
||||||
|
|
||||||
|
Ok(resp)
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn list_relay_gateways(
|
||||||
|
&self,
|
||||||
|
request: Request<api::ListRelayGatewaysRequest>,
|
||||||
|
) -> Result<Response<api::ListRelayGatewaysResponse>, Status> {
|
||||||
|
let req = request.get_ref();
|
||||||
|
let tenant_id = if req.tenant_id.is_empty() {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(Uuid::from_str(&req.tenant_id).map_err(|e| e.status())?)
|
||||||
|
};
|
||||||
|
|
||||||
|
self.validator
|
||||||
|
.validate(
|
||||||
|
request.extensions(),
|
||||||
|
validator::ValidateGatewaysAccess::new(
|
||||||
|
validator::Flag::List,
|
||||||
|
tenant_id.unwrap_or(Uuid::nil()),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
let filters = gateway::RelayGatewayFilters { tenant_id };
|
||||||
|
|
||||||
|
let count = gateway::get_relay_gateway_count(&filters)
|
||||||
|
.await
|
||||||
|
.map_err(|e| e.status())?;
|
||||||
|
let result = gateway::list_relay_gateways(req.limit as i64, req.offset as i64, &filters)
|
||||||
|
.await
|
||||||
|
.map_err(|e| e.status())?;
|
||||||
|
|
||||||
|
let mut resp = Response::new(api::ListRelayGatewaysResponse {
|
||||||
|
total_count: count as u32,
|
||||||
|
result: result
|
||||||
|
.iter()
|
||||||
|
.map(|r| api::RelayGatewayListItem {
|
||||||
|
tenant_id: r.tenant_id.to_string(),
|
||||||
|
relay_id: r.relay_id.to_string(),
|
||||||
|
name: r.name.clone(),
|
||||||
|
description: r.description.clone(),
|
||||||
|
created_at: Some(helpers::datetime_to_prost_timestamp(&r.created_at)),
|
||||||
|
updated_at: Some(helpers::datetime_to_prost_timestamp(&r.updated_at)),
|
||||||
|
last_seen_at: r
|
||||||
|
.last_seen_at
|
||||||
|
.as_ref()
|
||||||
|
.map(helpers::datetime_to_prost_timestamp),
|
||||||
|
state: {
|
||||||
|
if let Some(ts) = r.last_seen_at {
|
||||||
|
if (Utc::now() - ts)
|
||||||
|
> Duration::try_seconds((r.stats_interval_secs * 2).into())
|
||||||
|
.unwrap_or_default()
|
||||||
|
{
|
||||||
|
api::GatewayState::Offline
|
||||||
|
} else {
|
||||||
|
api::GatewayState::Online
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
api::GatewayState::NeverSeen
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.into(),
|
||||||
|
region_config_id: r.region_config_id.to_string(),
|
||||||
|
})
|
||||||
|
.collect(),
|
||||||
|
});
|
||||||
|
if !req.tenant_id.is_empty() {
|
||||||
|
resp.metadata_mut()
|
||||||
|
.insert("x-log-tenant_id", req.tenant_id.parse().unwrap());
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(resp)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
@ -1162,5 +1354,103 @@ pub mod test {
|
|||||||
}),
|
}),
|
||||||
stats_resp.window_percentage
|
stats_resp.window_percentage
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// create relay gateway
|
||||||
|
let _ = gateway::create_relay_gateway(gateway::RelayGateway {
|
||||||
|
tenant_id: t.id,
|
||||||
|
relay_id: gateway::RelayId::from_be_bytes([1, 2, 3, 4]),
|
||||||
|
name: "test-relay".into(),
|
||||||
|
description: "test relay".into(),
|
||||||
|
region_config_id: "eu868".into(),
|
||||||
|
..Default::default()
|
||||||
|
})
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
// get relay gateway
|
||||||
|
let get_relay_req = api::GetRelayGatewayRequest {
|
||||||
|
tenant_id: t.id.to_string(),
|
||||||
|
relay_id: "01020304".into(),
|
||||||
|
};
|
||||||
|
let mut get_relay_req = Request::new(get_relay_req);
|
||||||
|
get_relay_req.extensions_mut().insert(AuthID::User(u.id));
|
||||||
|
let get_relay_resp = service.get_relay_gateway(get_relay_req).await.unwrap();
|
||||||
|
assert_eq!(
|
||||||
|
Some(api::RelayGateway {
|
||||||
|
tenant_id: t.id.to_string(),
|
||||||
|
relay_id: "01020304".into(),
|
||||||
|
name: "test-relay".into(),
|
||||||
|
description: "test relay".into(),
|
||||||
|
stats_interval: 900,
|
||||||
|
region_config_id: "eu868".into(),
|
||||||
|
}),
|
||||||
|
get_relay_resp.get_ref().relay_gateway
|
||||||
|
);
|
||||||
|
|
||||||
|
// update
|
||||||
|
let up_relay_req = api::UpdateRelayGatewayRequest {
|
||||||
|
relay_gateway: Some(api::RelayGateway {
|
||||||
|
tenant_id: t.id.to_string(),
|
||||||
|
relay_id: "01020304".into(),
|
||||||
|
name: "updated-relay".into(),
|
||||||
|
description: "updated relay".into(),
|
||||||
|
stats_interval: 600,
|
||||||
|
region_config_id: "us915_0".into(),
|
||||||
|
}),
|
||||||
|
};
|
||||||
|
let mut up_relay_req = Request::new(up_relay_req);
|
||||||
|
up_relay_req.extensions_mut().insert(AuthID::User(u.id));
|
||||||
|
let _ = service.update_relay_gateway(up_relay_req).await.unwrap();
|
||||||
|
|
||||||
|
// get relay gateway
|
||||||
|
let get_relay_req = api::GetRelayGatewayRequest {
|
||||||
|
tenant_id: t.id.to_string(),
|
||||||
|
relay_id: "01020304".into(),
|
||||||
|
};
|
||||||
|
let mut get_relay_req = Request::new(get_relay_req);
|
||||||
|
get_relay_req.extensions_mut().insert(AuthID::User(u.id));
|
||||||
|
let get_relay_resp = service.get_relay_gateway(get_relay_req).await.unwrap();
|
||||||
|
assert_eq!(
|
||||||
|
Some(api::RelayGateway {
|
||||||
|
tenant_id: t.id.to_string(),
|
||||||
|
relay_id: "01020304".into(),
|
||||||
|
name: "updated-relay".into(),
|
||||||
|
description: "updated relay".into(),
|
||||||
|
stats_interval: 600,
|
||||||
|
region_config_id: "us915_0".into(),
|
||||||
|
}),
|
||||||
|
get_relay_resp.get_ref().relay_gateway
|
||||||
|
);
|
||||||
|
|
||||||
|
// list
|
||||||
|
let list_relay_req = api::ListRelayGatewaysRequest {
|
||||||
|
tenant_id: t.id.to_string(),
|
||||||
|
limit: 10,
|
||||||
|
offset: 0,
|
||||||
|
};
|
||||||
|
let mut list_relay_req = Request::new(list_relay_req);
|
||||||
|
list_relay_req.extensions_mut().insert(AuthID::User(u.id));
|
||||||
|
let list_relay_resp = service.list_relay_gateways(list_relay_req).await.unwrap();
|
||||||
|
assert_eq!(1, list_relay_resp.get_ref().total_count);
|
||||||
|
assert_eq!(1, list_relay_resp.get_ref().result.len());
|
||||||
|
|
||||||
|
// delete
|
||||||
|
let del_relay_req = api::DeleteRelayGatewayRequest {
|
||||||
|
tenant_id: t.id.to_string(),
|
||||||
|
relay_id: "01020304".into(),
|
||||||
|
};
|
||||||
|
let mut del_relay_req = Request::new(del_relay_req);
|
||||||
|
del_relay_req.extensions_mut().insert(AuthID::User(u.id));
|
||||||
|
let del_relay_resp = service.delete_relay_gateway(del_relay_req).await;
|
||||||
|
assert!(del_relay_resp.is_ok());
|
||||||
|
|
||||||
|
let del_relay_req = api::DeleteRelayGatewayRequest {
|
||||||
|
tenant_id: t.id.to_string(),
|
||||||
|
relay_id: "01020304".into(),
|
||||||
|
};
|
||||||
|
let mut del_relay_req = Request::new(del_relay_req);
|
||||||
|
del_relay_req.extensions_mut().insert(AuthID::User(u.id));
|
||||||
|
let del_relay_resp = service.delete_relay_gateway(del_relay_req).await;
|
||||||
|
assert!(del_relay_resp.is_err());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -414,6 +414,18 @@ async fn message_callback(
|
|||||||
|
|
||||||
set_gateway_json(&event.gateway_id, json);
|
set_gateway_json(&event.gateway_id, json);
|
||||||
tokio::spawn(downlink::tx_ack::TxAck::handle(event));
|
tokio::spawn(downlink::tx_ack::TxAck::handle(event));
|
||||||
|
} else if topic.ends_with("/mesh-stats") {
|
||||||
|
EVENT_COUNTER
|
||||||
|
.get_or_create(&EventLabels {
|
||||||
|
event: "mesh-stats".to_string(),
|
||||||
|
})
|
||||||
|
.inc();
|
||||||
|
let event = match json {
|
||||||
|
true => serde_json::from_slice(&p.payload)?,
|
||||||
|
false => chirpstack_api::gw::MeshHeartbeat::decode(&mut Cursor::new(&p.payload))?,
|
||||||
|
};
|
||||||
|
|
||||||
|
tokio::spawn(uplink::mesh::MeshHeartbeat::handle(event));
|
||||||
} else {
|
} else {
|
||||||
return Err(anyhow!("Unknown event type"));
|
return Err(anyhow!("Unknown event type"));
|
||||||
}
|
}
|
||||||
|
@ -7,11 +7,13 @@ use diesel_async::RunQueryDsl;
|
|||||||
use tracing::info;
|
use tracing::info;
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
|
||||||
use lrwn::EUI64;
|
use lrwn::{DevAddr, EUI64};
|
||||||
|
|
||||||
use super::schema::{gateway, multicast_group_gateway, tenant};
|
use super::schema::{gateway, multicast_group_gateway, relay_gateway, tenant};
|
||||||
use super::{error::Error, fields, get_async_db_conn};
|
use super::{error::Error, fields, get_async_db_conn};
|
||||||
|
|
||||||
|
pub type RelayId = DevAddr;
|
||||||
|
|
||||||
#[derive(Queryable, Insertable, PartialEq, Debug)]
|
#[derive(Queryable, Insertable, PartialEq, Debug)]
|
||||||
#[diesel(table_name = gateway)]
|
#[diesel(table_name = gateway)]
|
||||||
pub struct Gateway {
|
pub struct Gateway {
|
||||||
@ -40,6 +42,29 @@ impl Gateway {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Default for Gateway {
|
||||||
|
fn default() -> Self {
|
||||||
|
let now = Utc::now();
|
||||||
|
|
||||||
|
Gateway {
|
||||||
|
gateway_id: EUI64::from_be_bytes([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]),
|
||||||
|
tenant_id: Uuid::nil(),
|
||||||
|
created_at: now,
|
||||||
|
updated_at: now,
|
||||||
|
last_seen_at: None,
|
||||||
|
name: "".into(),
|
||||||
|
description: "".into(),
|
||||||
|
latitude: 0.0,
|
||||||
|
longitude: 0.0,
|
||||||
|
altitude: 0.0,
|
||||||
|
tls_certificate: None,
|
||||||
|
stats_interval_secs: 30,
|
||||||
|
tags: fields::KeyValue::new(HashMap::new()),
|
||||||
|
properties: fields::KeyValue::new(HashMap::new()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(AsChangeset, Debug, Clone, Default)]
|
#[derive(AsChangeset, Debug, Clone, Default)]
|
||||||
#[diesel(table_name = gateway)]
|
#[diesel(table_name = gateway)]
|
||||||
pub struct GatewayChangeset {
|
pub struct GatewayChangeset {
|
||||||
@ -95,29 +120,56 @@ pub struct GatewayCountsByState {
|
|||||||
pub offline_count: i64,
|
pub offline_count: i64,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for Gateway {
|
#[derive(Queryable, Insertable, PartialEq, Debug)]
|
||||||
|
#[diesel(table_name = relay_gateway)]
|
||||||
|
pub struct RelayGateway {
|
||||||
|
pub tenant_id: Uuid,
|
||||||
|
pub relay_id: RelayId,
|
||||||
|
pub created_at: DateTime<Utc>,
|
||||||
|
pub updated_at: DateTime<Utc>,
|
||||||
|
pub last_seen_at: Option<DateTime<Utc>>,
|
||||||
|
pub name: String,
|
||||||
|
pub description: String,
|
||||||
|
pub stats_interval_secs: i32,
|
||||||
|
pub region_config_id: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for RelayGateway {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
let now = Utc::now();
|
let now = Utc::now();
|
||||||
|
|
||||||
Gateway {
|
RelayGateway {
|
||||||
gateway_id: EUI64::from_be_bytes([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]),
|
relay_id: RelayId::from_be_bytes([1, 2, 3, 4]),
|
||||||
tenant_id: Uuid::nil(),
|
tenant_id: Uuid::nil(),
|
||||||
created_at: now,
|
created_at: now,
|
||||||
updated_at: now,
|
updated_at: now,
|
||||||
last_seen_at: None,
|
last_seen_at: None,
|
||||||
name: "".into(),
|
name: "".into(),
|
||||||
description: "".into(),
|
description: "".into(),
|
||||||
latitude: 0.0,
|
stats_interval_secs: 900,
|
||||||
longitude: 0.0,
|
region_config_id: "".into(),
|
||||||
altitude: 0.0,
|
|
||||||
tls_certificate: None,
|
|
||||||
stats_interval_secs: 30,
|
|
||||||
tags: fields::KeyValue::new(HashMap::new()),
|
|
||||||
properties: fields::KeyValue::new(HashMap::new()),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Default, Clone)]
|
||||||
|
pub struct RelayGatewayFilters {
|
||||||
|
pub tenant_id: Option<Uuid>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Queryable, PartialEq, Debug)]
|
||||||
|
pub struct RelayGatewayListItem {
|
||||||
|
pub relay_id: RelayId,
|
||||||
|
pub tenant_id: Uuid,
|
||||||
|
pub created_at: DateTime<Utc>,
|
||||||
|
pub updated_at: DateTime<Utc>,
|
||||||
|
pub last_seen_at: Option<DateTime<Utc>>,
|
||||||
|
pub name: String,
|
||||||
|
pub description: String,
|
||||||
|
pub stats_interval_secs: i32,
|
||||||
|
pub region_config_id: String,
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn create(gw: Gateway) -> Result<Gateway, Error> {
|
pub async fn create(gw: Gateway) -> Result<Gateway, Error> {
|
||||||
gw.validate()?;
|
gw.validate()?;
|
||||||
let mut c = get_async_db_conn().await?;
|
let mut c = get_async_db_conn().await?;
|
||||||
@ -322,6 +374,103 @@ pub async fn get_counts_by_state(tenant_id: &Option<Uuid>) -> Result<GatewayCoun
|
|||||||
Ok(counts)
|
Ok(counts)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn create_relay_gateway(relay: RelayGateway) -> Result<RelayGateway, Error> {
|
||||||
|
let relay: RelayGateway = diesel::insert_into(relay_gateway::table)
|
||||||
|
.values(&relay)
|
||||||
|
.get_result(&mut get_async_db_conn().await?)
|
||||||
|
.await
|
||||||
|
.map_err(|e| Error::from_diesel(e, relay.relay_id.to_string()))?;
|
||||||
|
|
||||||
|
info!(relay_id = %relay.relay_id, "Relay Gateway created");
|
||||||
|
|
||||||
|
Ok(relay)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn get_relay_gateway(tenant_id: Uuid, relay_id: RelayId) -> Result<RelayGateway, Error> {
|
||||||
|
let relay = relay_gateway::dsl::relay_gateway
|
||||||
|
.find((&tenant_id, &relay_id))
|
||||||
|
.first(&mut get_async_db_conn().await?)
|
||||||
|
.await
|
||||||
|
.map_err(|e| Error::from_diesel(e, relay_id.to_string()))?;
|
||||||
|
Ok(relay)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn update_relay_gateway(relay: RelayGateway) -> Result<RelayGateway, Error> {
|
||||||
|
let relay: RelayGateway =
|
||||||
|
diesel::update(relay_gateway::dsl::relay_gateway.find((&relay.tenant_id, &relay.relay_id)))
|
||||||
|
.set((
|
||||||
|
relay_gateway::updated_at.eq(&relay.updated_at),
|
||||||
|
relay_gateway::name.eq(&relay.name),
|
||||||
|
relay_gateway::description.eq(&relay.description),
|
||||||
|
relay_gateway::stats_interval_secs.eq(&relay.stats_interval_secs),
|
||||||
|
relay_gateway::region_config_id.eq(&relay.region_config_id),
|
||||||
|
))
|
||||||
|
.get_result(&mut get_async_db_conn().await?)
|
||||||
|
.await
|
||||||
|
.map_err(|e| Error::from_diesel(e, relay.relay_id.to_string()))?;
|
||||||
|
|
||||||
|
info!(relay_id = %relay.relay_id, "Relay Gateway updated");
|
||||||
|
|
||||||
|
Ok(relay)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn get_relay_gateway_count(filters: &RelayGatewayFilters) -> Result<i64, Error> {
|
||||||
|
let mut q = relay_gateway::dsl::relay_gateway
|
||||||
|
.select(dsl::count_star())
|
||||||
|
.into_boxed();
|
||||||
|
|
||||||
|
if let Some(tenant_id) = &filters.tenant_id {
|
||||||
|
q = q.filter(relay_gateway::dsl::tenant_id.eq(tenant_id));
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(q.first(&mut get_async_db_conn().await?).await?)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn delete_relay_gateway(tenant_id: Uuid, relay_id: RelayId) -> Result<(), Error> {
|
||||||
|
let ra = diesel::delete(relay_gateway::dsl::relay_gateway.find((&tenant_id, &relay_id)))
|
||||||
|
.execute(&mut get_async_db_conn().await?)
|
||||||
|
.await?;
|
||||||
|
if ra == 0 {
|
||||||
|
return Err(Error::NotFound(relay_id.to_string()));
|
||||||
|
}
|
||||||
|
|
||||||
|
info!(relay_id = %relay_id, "Relay Gateway deleted");
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn list_relay_gateways(
|
||||||
|
limit: i64,
|
||||||
|
offset: i64,
|
||||||
|
filters: &RelayGatewayFilters,
|
||||||
|
) -> Result<Vec<RelayGatewayListItem>, Error> {
|
||||||
|
let mut q = relay_gateway::dsl::relay_gateway
|
||||||
|
.select((
|
||||||
|
relay_gateway::relay_id,
|
||||||
|
relay_gateway::tenant_id,
|
||||||
|
relay_gateway::created_at,
|
||||||
|
relay_gateway::updated_at,
|
||||||
|
relay_gateway::last_seen_at,
|
||||||
|
relay_gateway::name,
|
||||||
|
relay_gateway::description,
|
||||||
|
relay_gateway::stats_interval_secs,
|
||||||
|
relay_gateway::region_config_id,
|
||||||
|
))
|
||||||
|
.into_boxed();
|
||||||
|
|
||||||
|
if let Some(tenant_id) = &filters.tenant_id {
|
||||||
|
q = q.filter(relay_gateway::dsl::tenant_id.eq(tenant_id));
|
||||||
|
}
|
||||||
|
|
||||||
|
let items = q
|
||||||
|
.order_by(relay_gateway::dsl::name)
|
||||||
|
.limit(limit)
|
||||||
|
.offset(offset)
|
||||||
|
.load(&mut get_async_db_conn().await?)
|
||||||
|
.await?;
|
||||||
|
Ok(items)
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
pub mod test {
|
pub mod test {
|
||||||
use super::*;
|
use super::*;
|
||||||
@ -337,6 +486,14 @@ pub mod test {
|
|||||||
offset: i64,
|
offset: i64,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct RelayGatewayFilterTest<'a> {
|
||||||
|
filters: RelayGatewayFilters,
|
||||||
|
relay_gateways: Vec<&'a RelayGateway>,
|
||||||
|
count: usize,
|
||||||
|
limit: i64,
|
||||||
|
offset: i64,
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn create_gateway(id: EUI64) -> Gateway {
|
pub async fn create_gateway(id: EUI64) -> Gateway {
|
||||||
let tenant_id = {
|
let tenant_id = {
|
||||||
let t = storage::tenant::test::create_tenant().await;
|
let t = storage::tenant::test::create_tenant().await;
|
||||||
@ -498,4 +655,93 @@ pub mod test {
|
|||||||
delete(&gw.gateway_id).await.unwrap();
|
delete(&gw.gateway_id).await.unwrap();
|
||||||
assert_eq!(true, delete(&gw.gateway_id).await.is_err());
|
assert_eq!(true, delete(&gw.gateway_id).await.is_err());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn test_relay_gateway() {
|
||||||
|
let _guard = test::prepare().await;
|
||||||
|
let gw = create_gateway(EUI64::from_be_bytes([1, 2, 3, 4, 5, 6, 7, 8])).await;
|
||||||
|
|
||||||
|
// create
|
||||||
|
let mut relay = create_relay_gateway(RelayGateway {
|
||||||
|
relay_id: RelayId::from_be_bytes([1, 2, 3, 4]),
|
||||||
|
tenant_id: gw.tenant_id,
|
||||||
|
name: "test-relay".into(),
|
||||||
|
description: "test relay".into(),
|
||||||
|
region_config_id: "eu868".into(),
|
||||||
|
..Default::default()
|
||||||
|
})
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
// get
|
||||||
|
let relay_get = get_relay_gateway(relay.tenant_id, relay.relay_id)
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
assert_eq!(relay, relay_get);
|
||||||
|
|
||||||
|
// update
|
||||||
|
relay.name = "updated-relay".into();
|
||||||
|
relay.region_config_id = "us915_0".into();
|
||||||
|
relay = update_relay_gateway(relay).await.unwrap();
|
||||||
|
let relay_get = get_relay_gateway(relay.tenant_id, relay.relay_id)
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
assert_eq!(relay, relay_get);
|
||||||
|
|
||||||
|
// test count and list
|
||||||
|
let tests = vec![
|
||||||
|
RelayGatewayFilterTest {
|
||||||
|
filters: RelayGatewayFilters { tenant_id: None },
|
||||||
|
relay_gateways: vec![&relay],
|
||||||
|
count: 1,
|
||||||
|
limit: 10,
|
||||||
|
offset: 0,
|
||||||
|
},
|
||||||
|
RelayGatewayFilterTest {
|
||||||
|
filters: RelayGatewayFilters {
|
||||||
|
tenant_id: Some(gw.tenant_id),
|
||||||
|
},
|
||||||
|
relay_gateways: vec![&relay],
|
||||||
|
count: 1,
|
||||||
|
limit: 10,
|
||||||
|
offset: 0,
|
||||||
|
},
|
||||||
|
RelayGatewayFilterTest {
|
||||||
|
filters: RelayGatewayFilters {
|
||||||
|
tenant_id: Some(gw.tenant_id),
|
||||||
|
},
|
||||||
|
relay_gateways: vec![&relay],
|
||||||
|
count: 1,
|
||||||
|
limit: 10,
|
||||||
|
offset: 0,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
for tst in tests {
|
||||||
|
let count = get_relay_gateway_count(&tst.filters).await.unwrap() as usize;
|
||||||
|
assert_eq!(tst.count, count);
|
||||||
|
|
||||||
|
let items = list_relay_gateways(tst.limit, tst.offset, &tst.filters)
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
assert_eq!(
|
||||||
|
tst.relay_gateways
|
||||||
|
.iter()
|
||||||
|
.map(|r| r.relay_id.to_string())
|
||||||
|
.collect::<String>(),
|
||||||
|
items
|
||||||
|
.iter()
|
||||||
|
.map(|r| r.relay_id.to_string())
|
||||||
|
.collect::<String>(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// delete
|
||||||
|
delete_relay_gateway(relay.tenant_id, relay.relay_id)
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
assert!(delete_relay_gateway(relay.tenant_id, relay.relay_id)
|
||||||
|
.await
|
||||||
|
.is_err());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -288,6 +288,22 @@ diesel::table! {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
diesel::table! {
|
||||||
|
relay_gateway (tenant_id, relay_id) {
|
||||||
|
tenant_id -> Uuid,
|
||||||
|
relay_id -> Bytea,
|
||||||
|
created_at -> Timestamptz,
|
||||||
|
updated_at -> Timestamptz,
|
||||||
|
last_seen_at -> Nullable<Timestamptz>,
|
||||||
|
#[max_length = 100]
|
||||||
|
name -> Varchar,
|
||||||
|
description -> Text,
|
||||||
|
stats_interval_secs -> Int4,
|
||||||
|
#[max_length = 100]
|
||||||
|
region_config_id -> Varchar,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
diesel::table! {
|
diesel::table! {
|
||||||
tenant (id) {
|
tenant (id) {
|
||||||
id -> Uuid,
|
id -> Uuid,
|
||||||
@ -349,6 +365,7 @@ diesel::joinable!(multicast_group_gateway -> gateway (gateway_id));
|
|||||||
diesel::joinable!(multicast_group_gateway -> multicast_group (multicast_group_id));
|
diesel::joinable!(multicast_group_gateway -> multicast_group (multicast_group_id));
|
||||||
diesel::joinable!(multicast_group_queue_item -> gateway (gateway_id));
|
diesel::joinable!(multicast_group_queue_item -> gateway (gateway_id));
|
||||||
diesel::joinable!(multicast_group_queue_item -> multicast_group (multicast_group_id));
|
diesel::joinable!(multicast_group_queue_item -> multicast_group (multicast_group_id));
|
||||||
|
diesel::joinable!(relay_gateway -> tenant (tenant_id));
|
||||||
diesel::joinable!(tenant_user -> tenant (tenant_id));
|
diesel::joinable!(tenant_user -> tenant (tenant_id));
|
||||||
diesel::joinable!(tenant_user -> user (user_id));
|
diesel::joinable!(tenant_user -> user (user_id));
|
||||||
|
|
||||||
@ -367,6 +384,7 @@ diesel::allow_tables_to_appear_in_same_query!(
|
|||||||
multicast_group_gateway,
|
multicast_group_gateway,
|
||||||
multicast_group_queue_item,
|
multicast_group_queue_item,
|
||||||
relay_device,
|
relay_device,
|
||||||
|
relay_gateway,
|
||||||
tenant,
|
tenant,
|
||||||
tenant_user,
|
tenant_user,
|
||||||
user,
|
user,
|
||||||
|
119
chirpstack/src/uplink/mesh.rs
Normal file
119
chirpstack/src/uplink/mesh.rs
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
|
use anyhow::Result;
|
||||||
|
use chrono::{DateTime, Utc};
|
||||||
|
use tracing::{error, span, trace, warn, Instrument, Level};
|
||||||
|
|
||||||
|
use chirpstack_api::gw;
|
||||||
|
|
||||||
|
use crate::config;
|
||||||
|
use crate::helpers::errors::PrintFullError;
|
||||||
|
use crate::storage::{
|
||||||
|
error::Error,
|
||||||
|
gateway::{self, RelayId},
|
||||||
|
};
|
||||||
|
use lrwn::EUI64;
|
||||||
|
|
||||||
|
pub struct MeshHeartbeat {
|
||||||
|
gateway_id: EUI64,
|
||||||
|
relay_id: RelayId,
|
||||||
|
mesh_stats: gw::MeshHeartbeat,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MeshHeartbeat {
|
||||||
|
pub async fn handle(s: gw::MeshHeartbeat) {
|
||||||
|
let gateway_id = match EUI64::from_str(&s.gateway_id) {
|
||||||
|
Ok(v) => v,
|
||||||
|
Err(e) => {
|
||||||
|
warn!(error = %e.full(), "Decode gateway_id error");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let relay_id = match RelayId::from_str(&s.relay_id) {
|
||||||
|
Ok(v) => v,
|
||||||
|
Err(e) => {
|
||||||
|
warn!(error = %e.full(), "Decode relay_id error");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let span = span!(Level::INFO, "mesh_stats", gateway_id = %gateway_id, relay_id = %relay_id);
|
||||||
|
|
||||||
|
if let Err(e) = MeshHeartbeat::_handle(gateway_id, relay_id, s)
|
||||||
|
.instrument(span)
|
||||||
|
.await
|
||||||
|
{
|
||||||
|
match e.downcast_ref::<Error>() {
|
||||||
|
Some(Error::NotFound(_)) => {
|
||||||
|
let conf = config::get();
|
||||||
|
if !conf.gateway.allow_unknown_gateways {
|
||||||
|
error!(error = %e.full(), "Handle mesh-stats error");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Some(_) | None => {
|
||||||
|
error!(error = %e.full(), "Handle mesh-stats error");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn _handle(gateway_id: EUI64, relay_id: RelayId, s: gw::MeshHeartbeat) -> Result<()> {
|
||||||
|
let mut ctx = MeshHeartbeat {
|
||||||
|
gateway_id,
|
||||||
|
relay_id,
|
||||||
|
mesh_stats: s,
|
||||||
|
};
|
||||||
|
|
||||||
|
ctx.update_or_create_relay_gateway().await?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn update_or_create_relay_gateway(&mut self) -> Result<()> {
|
||||||
|
trace!("Getting Border Gateway");
|
||||||
|
let border_gw = gateway::get(&self.gateway_id).await?;
|
||||||
|
|
||||||
|
let ts: DateTime<Utc> = match &self.mesh_stats.time {
|
||||||
|
Some(v) => v
|
||||||
|
.clone()
|
||||||
|
.try_into()
|
||||||
|
.map_err(|e| anyhow!("Convert time error: {}", e))?,
|
||||||
|
None => {
|
||||||
|
warn!("Stats message does not have time field set");
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
match gateway::get_relay_gateway(border_gw.tenant_id, self.relay_id).await {
|
||||||
|
Ok(mut v) => {
|
||||||
|
if let Some(last_seen_at) = v.last_seen_at {
|
||||||
|
if last_seen_at > ts {
|
||||||
|
warn!("Time is less than last seen timestamp, ignoring stats");
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
v.last_seen_at = Some(ts);
|
||||||
|
v.region_config_id = border_gw
|
||||||
|
.properties
|
||||||
|
.get("region_config_id")
|
||||||
|
.cloned()
|
||||||
|
.unwrap_or_default();
|
||||||
|
gateway::update_relay_gateway(v).await?;
|
||||||
|
}
|
||||||
|
Err(_) => {
|
||||||
|
let _ = gateway::create_relay_gateway(gateway::RelayGateway {
|
||||||
|
tenant_id: border_gw.tenant_id,
|
||||||
|
relay_id: self.relay_id,
|
||||||
|
name: self.relay_id.to_string(),
|
||||||
|
last_seen_at: Some(ts),
|
||||||
|
..Default::default()
|
||||||
|
})
|
||||||
|
.await?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
@ -33,6 +33,7 @@ pub mod helpers;
|
|||||||
pub mod join;
|
pub mod join;
|
||||||
pub mod join_fns;
|
pub mod join_fns;
|
||||||
pub mod join_sns;
|
pub mod join_sns;
|
||||||
|
pub mod mesh;
|
||||||
pub mod stats;
|
pub mod stats;
|
||||||
|
|
||||||
#[derive(Clone, Hash, PartialEq, Eq, EncodeLabelSet, Debug)]
|
#[derive(Clone, Hash, PartialEq, Eq, EncodeLabelSet, Debug)]
|
||||||
|
@ -3,7 +3,7 @@ name = "lrwn_filters"
|
|||||||
description = "Library for filtering LoRaWAN payloads on DevAddr and JoinEUIs prefixes"
|
description = "Library for filtering LoRaWAN payloads on DevAddr and JoinEUIs prefixes"
|
||||||
homepage = "https://www.chirpstack.io/"
|
homepage = "https://www.chirpstack.io/"
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
version = "4.8.1"
|
version = "4.9.0-test.1"
|
||||||
authors = ["Orne Brocaar <info@brocaar.com>"]
|
authors = ["Orne Brocaar <info@brocaar.com>"]
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
repository = "https://github.com/chirpstack/chirpstack"
|
repository = "https://github.com/chirpstack/chirpstack"
|
||||||
|
@ -3,7 +3,7 @@ name = "lrwn"
|
|||||||
description = "Library for encoding / decoding LoRaWAN frames."
|
description = "Library for encoding / decoding LoRaWAN frames."
|
||||||
homepage = "https://www.chirpstack.io"
|
homepage = "https://www.chirpstack.io"
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
version = "4.8.1"
|
version = "4.9.0-test.1"
|
||||||
authors = ["Orne Brocaar <info@brocaar.com>"]
|
authors = ["Orne Brocaar <info@brocaar.com>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
repository = "https://github.com/chirpstack/chirpstack"
|
repository = "https://github.com/chirpstack/chirpstack"
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "chirpstack-ui",
|
"name": "chirpstack-ui",
|
||||||
"version": "4.8.1",
|
"version": "4.9.0-test.1",
|
||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ant-design/colors": "^7.0.0",
|
"@ant-design/colors": "^7.0.0",
|
||||||
|
@ -12,6 +12,7 @@ import {
|
|||||||
ControlOutlined,
|
ControlOutlined,
|
||||||
AppstoreOutlined,
|
AppstoreOutlined,
|
||||||
CompassOutlined,
|
CompassOutlined,
|
||||||
|
RadarChartOutlined,
|
||||||
} from "@ant-design/icons";
|
} from "@ant-design/icons";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
@ -130,6 +131,11 @@ function SideMenu() {
|
|||||||
setSelectedKey("tenant-gateways");
|
setSelectedKey("tenant-gateways");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// tenant gateway-mesh
|
||||||
|
if (/\/tenants\/[\w-]{36}\/gateways\/mesh.*/g.exec(path)) {
|
||||||
|
setSelectedKey("tenant-gateways-mesh");
|
||||||
|
}
|
||||||
|
|
||||||
// tenant applications
|
// tenant applications
|
||||||
if (/\/tenants\/[\w-]{36}\/applications.*/g.exec(path)) {
|
if (/\/tenants\/[\w-]{36}\/applications.*/g.exec(path)) {
|
||||||
setSelectedKey("tenant-applications");
|
setSelectedKey("tenant-applications");
|
||||||
@ -242,6 +248,11 @@ function SideMenu() {
|
|||||||
icon: <WifiOutlined />,
|
icon: <WifiOutlined />,
|
||||||
label: <Link to={`/tenants/${tenantId}/gateways`}>Gateways</Link>,
|
label: <Link to={`/tenants/${tenantId}/gateways`}>Gateways</Link>,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
key: "tenant-gateways-mesh",
|
||||||
|
icon: <RadarChartOutlined />,
|
||||||
|
label: <Link to={`/tenants/${tenantId}/gateways/mesh/relays`}>Gateway Mesh</Link>,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
key: "tenant-applications",
|
key: "tenant-applications",
|
||||||
icon: <AppstoreOutlined />,
|
icon: <AppstoreOutlined />,
|
||||||
|
202
ui/src/components/RelayIdInput.tsx
Normal file
202
ui/src/components/RelayIdInput.tsx
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
|
||||||
|
import React, { useState, useEffect } from "react";
|
||||||
|
|
||||||
|
import { notification, Input, Select, Button, Space, Form, Dropdown, Menu } from "antd";
|
||||||
|
import { ReloadOutlined, CopyOutlined } from "@ant-design/icons";
|
||||||
|
import { Buffer } from "buffer";
|
||||||
|
|
||||||
|
interface IProps {
|
||||||
|
label: string;
|
||||||
|
name: string;
|
||||||
|
required?: boolean;
|
||||||
|
value?: string;
|
||||||
|
disabled?: boolean;
|
||||||
|
tooltip?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
function RelayIdInput(props: IProps) {
|
||||||
|
const form = Form.useFormInstance();
|
||||||
|
const [byteOrder, setByteOrder] = useState<string>("msb");
|
||||||
|
const [value, setValue] = useState<string>("");
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (props.value) {
|
||||||
|
setValue(props.value);
|
||||||
|
}
|
||||||
|
}, [props]);
|
||||||
|
|
||||||
|
const updateField = (v: string) => {
|
||||||
|
if (byteOrder === "lsb") {
|
||||||
|
const bytes = v.match(/[A-Fa-f0-9]{2}/g) || [];
|
||||||
|
v = bytes.reverse().join("");
|
||||||
|
}
|
||||||
|
|
||||||
|
form.setFieldsValue({
|
||||||
|
[props.name]: v,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const onChange = (e: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
|
let v = e.target.value;
|
||||||
|
const match = v.match(/[A-Fa-f0-9]/g);
|
||||||
|
|
||||||
|
let value = "";
|
||||||
|
if (match) {
|
||||||
|
if (match.length > 8) {
|
||||||
|
value = match.slice(0, 8).join("");
|
||||||
|
} else {
|
||||||
|
value = match.join("");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
setValue(value);
|
||||||
|
updateField(value);
|
||||||
|
};
|
||||||
|
|
||||||
|
const onByteOrderSelect = (v: string) => {
|
||||||
|
if (v === byteOrder) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
setByteOrder(v);
|
||||||
|
|
||||||
|
const current = value;
|
||||||
|
const bytes = current.match(/[A-Fa-f0-9]{2}/g) || [];
|
||||||
|
const vv = bytes.reverse().join("");
|
||||||
|
|
||||||
|
setValue(vv);
|
||||||
|
updateField(vv);
|
||||||
|
};
|
||||||
|
|
||||||
|
const generateRandom = () => {
|
||||||
|
let cryptoObj = window.crypto || window.Crypto;
|
||||||
|
let b = new Uint8Array(4);
|
||||||
|
cryptoObj.getRandomValues(b);
|
||||||
|
|
||||||
|
let key = Buffer.from(b).toString("hex");
|
||||||
|
setValue(key);
|
||||||
|
updateField(key);
|
||||||
|
};
|
||||||
|
|
||||||
|
const copyToClipboard = () => {
|
||||||
|
const bytes = value.match(/[A-Fa-f0-9]{2}/g);
|
||||||
|
|
||||||
|
if (bytes !== null && navigator.clipboard !== undefined) {
|
||||||
|
navigator.clipboard
|
||||||
|
.writeText(bytes.join("").toUpperCase())
|
||||||
|
.then(() => {
|
||||||
|
notification.success({
|
||||||
|
message: "Copied to clipboard",
|
||||||
|
duration: 3,
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.catch(e => {
|
||||||
|
notification.error({
|
||||||
|
message: "Error",
|
||||||
|
description: e,
|
||||||
|
duration: 3,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
notification.error({
|
||||||
|
message: "Error",
|
||||||
|
description: "Clipboard functionality is not available.",
|
||||||
|
duration: 3,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const copyToClipboardHexArray = () => {
|
||||||
|
const bytes = value.match(/[A-Fa-f0-9]{2}/g);
|
||||||
|
|
||||||
|
if (bytes !== null && navigator.clipboard !== undefined) {
|
||||||
|
navigator.clipboard
|
||||||
|
.writeText(
|
||||||
|
bytes
|
||||||
|
.join(", ")
|
||||||
|
.toUpperCase()
|
||||||
|
.replace(/[A-Fa-f0-9]{2}/g, "0x$&"),
|
||||||
|
)
|
||||||
|
.then(() => {
|
||||||
|
notification.success({
|
||||||
|
message: "Copied to clipboard",
|
||||||
|
duration: 3,
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.catch(e => {
|
||||||
|
notification.error({
|
||||||
|
message: "Error",
|
||||||
|
description: e,
|
||||||
|
duration: 3,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const copyMenu = (
|
||||||
|
<Menu
|
||||||
|
items={[
|
||||||
|
{
|
||||||
|
key: "1",
|
||||||
|
label: (
|
||||||
|
<Button type="text" onClick={copyToClipboard}>
|
||||||
|
HEX string
|
||||||
|
</Button>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "2",
|
||||||
|
label: (
|
||||||
|
<Button type="text" onClick={copyToClipboardHexArray}>
|
||||||
|
HEX array
|
||||||
|
</Button>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
|
||||||
|
const addon = (
|
||||||
|
<Space size="large">
|
||||||
|
<Select value={byteOrder} onChange={onByteOrderSelect}>
|
||||||
|
<Select.Option value="msb">MSB</Select.Option>
|
||||||
|
<Select.Option value="lsb">LSB</Select.Option>
|
||||||
|
</Select>
|
||||||
|
<Button type="text" size="small" onClick={generateRandom}>
|
||||||
|
<ReloadOutlined />
|
||||||
|
</Button>
|
||||||
|
<Dropdown overlay={copyMenu}>
|
||||||
|
<Button type="text" size="small">
|
||||||
|
<CopyOutlined />
|
||||||
|
</Button>
|
||||||
|
</Dropdown>
|
||||||
|
</Space>
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Form.Item
|
||||||
|
rules={[
|
||||||
|
{
|
||||||
|
required: props.required,
|
||||||
|
message: `Please enter a valid ${props.label}`,
|
||||||
|
pattern: new RegExp(/[A-Fa-f0-9]{8}/g),
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
label={props.label}
|
||||||
|
name={props.name}
|
||||||
|
tooltip={props.tooltip}
|
||||||
|
>
|
||||||
|
<Input hidden />
|
||||||
|
<Input
|
||||||
|
id={`${props.name}Render`}
|
||||||
|
onChange={onChange}
|
||||||
|
addonAfter={!props.disabled && addon}
|
||||||
|
className="input-code"
|
||||||
|
value={value}
|
||||||
|
disabled={props.disabled}
|
||||||
|
/>
|
||||||
|
</Form.Item>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default RelayIdInput;
|
@ -15,6 +15,12 @@ import {
|
|||||||
GetGatewayDutyCycleMetricsResponse,
|
GetGatewayDutyCycleMetricsResponse,
|
||||||
GenerateGatewayClientCertificateRequest,
|
GenerateGatewayClientCertificateRequest,
|
||||||
GenerateGatewayClientCertificateResponse,
|
GenerateGatewayClientCertificateResponse,
|
||||||
|
GetRelayGatewayRequest,
|
||||||
|
GetRelayGatewayResponse,
|
||||||
|
ListRelayGatewaysRequest,
|
||||||
|
ListRelayGatewaysResponse,
|
||||||
|
UpdateRelayGatewayRequest,
|
||||||
|
DeleteRelayGatewayRequest,
|
||||||
} from "@chirpstack/chirpstack-api-grpc-web/api/gateway_pb";
|
} from "@chirpstack/chirpstack-api-grpc-web/api/gateway_pb";
|
||||||
|
|
||||||
import SessionStore from "./SessionStore";
|
import SessionStore from "./SessionStore";
|
||||||
@ -136,6 +142,60 @@ class GatewayStore extends EventEmitter {
|
|||||||
callbackFunc(resp);
|
callbackFunc(resp);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
getRelayGateway = (req: GetRelayGatewayRequest, callbackFunc: (resp: GetRelayGatewayResponse) => void) => {
|
||||||
|
this.client.getRelayGateway(req, SessionStore.getMetadata(), (err, resp) => {
|
||||||
|
if (err !== null) {
|
||||||
|
HandleError(err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
callbackFunc(resp);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
listRelayGateways = (req: ListRelayGatewaysRequest, callbackFunc: (resp: ListRelayGatewaysResponse) => void) => {
|
||||||
|
this.client.listRelayGateways(req, SessionStore.getMetadata(), (err, resp) => {
|
||||||
|
if (err !== null) {
|
||||||
|
HandleError(err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
callbackFunc(resp);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
updateRelayGateway = (req: UpdateRelayGatewayRequest, callbackFunc: () => void) => {
|
||||||
|
this.client.updateRelayGateway(req, SessionStore.getMetadata(), (err) => {
|
||||||
|
if (err !== null) {
|
||||||
|
HandleError(err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
notification.success({
|
||||||
|
message: "Relay Gateway updated",
|
||||||
|
duration: 3,
|
||||||
|
});
|
||||||
|
|
||||||
|
callbackFunc();
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
deleteRelayGateway = (req: DeleteRelayGatewayRequest, callbackFunc: () => void) => {
|
||||||
|
this.client.deleteRelayGateway(req, SessionStore.getMetadata(), (err) => {
|
||||||
|
if (err !== null) {
|
||||||
|
HandleError(err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
notification.success({
|
||||||
|
message: "Relay Gateway deleted",
|
||||||
|
duration: 3,
|
||||||
|
});
|
||||||
|
|
||||||
|
callbackFunc();
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const gatewayStore = new GatewayStore();
|
const gatewayStore = new GatewayStore();
|
||||||
|
34
ui/src/views/gateways/mesh/EditRelayGateway.tsx
Normal file
34
ui/src/views/gateways/mesh/EditRelayGateway.tsx
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
import { useNavigate } from "react-router-dom";
|
||||||
|
|
||||||
|
import { RelayGateway, UpdateRelayGatewayRequest } from "@chirpstack/chirpstack-api-grpc-web/api/gateway_pb";
|
||||||
|
|
||||||
|
import RelayGatewayForm from "./RelayGatewayForm";
|
||||||
|
import GatewayStore from "../../../stores/GatewayStore";
|
||||||
|
import SessionStore from "../../../stores/SessionStore";
|
||||||
|
|
||||||
|
interface IProps {
|
||||||
|
relayGateway: RelayGateway;
|
||||||
|
}
|
||||||
|
|
||||||
|
function EditRelayGateway(props: IProps) {
|
||||||
|
const navigate = useNavigate();
|
||||||
|
|
||||||
|
const onFinish = (obj: RelayGateway) => {
|
||||||
|
let req = new UpdateRelayGatewayRequest();
|
||||||
|
req.setRelayGateway(obj);
|
||||||
|
|
||||||
|
GatewayStore.updateRelayGateway(req, () => {
|
||||||
|
navigate(`/tenants/${obj.getTenantId()}/gateways/mesh/relays`);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const disabled = !(
|
||||||
|
SessionStore.isAdmin() ||
|
||||||
|
SessionStore.isTenantAdmin(props.relayGateway.getTenantId()) ||
|
||||||
|
SessionStore.isTenantGatewayAdmin(props.relayGateway.getTenantId())
|
||||||
|
);
|
||||||
|
|
||||||
|
return <RelayGatewayForm initialValues={props.relayGateway} onFinish={onFinish} disabled={disabled} update />;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default EditRelayGateway;
|
119
ui/src/views/gateways/mesh/ListRelayGateways.tsx
Normal file
119
ui/src/views/gateways/mesh/ListRelayGateways.tsx
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
import React from "react";
|
||||||
|
import { Link } from "react-router-dom";
|
||||||
|
|
||||||
|
import moment from "moment";
|
||||||
|
import { Space, Breadcrumb, Badge } from "antd";
|
||||||
|
import { ColumnsType } from "antd/es/table";
|
||||||
|
import { PageHeader } from "@ant-design/pro-layout";
|
||||||
|
|
||||||
|
import {
|
||||||
|
ListRelayGatewaysRequest,
|
||||||
|
ListRelayGatewaysResponse,
|
||||||
|
RelayGatewayListItem,
|
||||||
|
GatewayState,
|
||||||
|
} from "@chirpstack/chirpstack-api-grpc-web/api/gateway_pb";
|
||||||
|
import { Tenant } from "@chirpstack/chirpstack-api-grpc-web/api/tenant_pb";
|
||||||
|
|
||||||
|
import DataTable, { GetPageCallbackFunc } from "../../../components/DataTable";
|
||||||
|
import GatewayStore from "../../../stores/GatewayStore";
|
||||||
|
|
||||||
|
interface IProps {
|
||||||
|
tenant: Tenant;
|
||||||
|
}
|
||||||
|
|
||||||
|
function ListRelayGateways(props: IProps) {
|
||||||
|
const columns: ColumnsType<RelayGatewayListItem.AsObject> = [
|
||||||
|
{
|
||||||
|
title: "",
|
||||||
|
dataIndex: "state",
|
||||||
|
key: "state",
|
||||||
|
width: 150,
|
||||||
|
render: (text, record) => {
|
||||||
|
if (record.state === GatewayState.NEVER_SEEN) {
|
||||||
|
return <Badge status="warning" text="Never seen" />;
|
||||||
|
} else if (record.state === GatewayState.OFFLINE) {
|
||||||
|
return <Badge status="error" text="Offline" />;
|
||||||
|
} else if (record.state === GatewayState.ONLINE) {
|
||||||
|
return <Badge status="success" text="Online" />;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Last seen",
|
||||||
|
dataIndex: "lastSeenAt",
|
||||||
|
key: "lastSeenAt",
|
||||||
|
width: 250,
|
||||||
|
render: (text, record) => {
|
||||||
|
if (record.lastSeenAt !== undefined) {
|
||||||
|
let ts = new Date(0);
|
||||||
|
ts.setUTCSeconds(record.lastSeenAt.seconds);
|
||||||
|
return moment(ts).format("YYYY-MM-DD HH:mm:ss");
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Relay ID",
|
||||||
|
dataIndex: "relayId",
|
||||||
|
key: "relayId",
|
||||||
|
width: 250,
|
||||||
|
render: (text, record) => (
|
||||||
|
<Link to={`/tenants/${props.tenant.getId()}/gateways/mesh/relays/${record.relayId}/edit`}>{text}</Link>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Name",
|
||||||
|
dataIndex: "name",
|
||||||
|
key: "name",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Region ID",
|
||||||
|
dataIndex: "regionConfigId",
|
||||||
|
key: "regionConfigId",
|
||||||
|
width: 150,
|
||||||
|
render: (text) => {
|
||||||
|
return <Link to={`/regions/${text}`}>{text}</Link>;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const getPage = (limit: number, offset: number, callbackFunc: GetPageCallbackFunc) => {
|
||||||
|
let req = new ListRelayGatewaysRequest();
|
||||||
|
req.setTenantId(props.tenant.getId());
|
||||||
|
req.setLimit(limit);
|
||||||
|
req.setOffset(offset);
|
||||||
|
|
||||||
|
GatewayStore.listRelayGateways(req, (resp: ListRelayGatewaysResponse) => {
|
||||||
|
const obj = resp.toObject();
|
||||||
|
callbackFunc(obj.totalCount, obj.resultList);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Space direction="vertical" style={{ width: "100%" }} size="large">
|
||||||
|
<PageHeader
|
||||||
|
title="Relay Gateways"
|
||||||
|
breadcrumbRender={() => (
|
||||||
|
<Breadcrumb>
|
||||||
|
<Breadcrumb.Item>
|
||||||
|
<span>Tenants</span>
|
||||||
|
</Breadcrumb.Item>
|
||||||
|
<Breadcrumb.Item>
|
||||||
|
<span>
|
||||||
|
<Link to={`/tenants/${props.tenant.getId()}`}>{props.tenant.getName()}</Link>
|
||||||
|
</span>
|
||||||
|
</Breadcrumb.Item>
|
||||||
|
<Breadcrumb.Item>
|
||||||
|
<span>Gateway Mesh</span>
|
||||||
|
</Breadcrumb.Item>
|
||||||
|
<Breadcrumb.Item>
|
||||||
|
<span>Relay Gateways</span>
|
||||||
|
</Breadcrumb.Item>
|
||||||
|
</Breadcrumb>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
<DataTable columns={columns} getPage={getPage} rowKey="relayId" />
|
||||||
|
</Space>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ListRelayGateways;
|
76
ui/src/views/gateways/mesh/RelayGatewayForm.tsx
Normal file
76
ui/src/views/gateways/mesh/RelayGatewayForm.tsx
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
|
||||||
|
import React from "react";
|
||||||
|
|
||||||
|
import { Form, Input, InputNumber, Row, Col, Button } from "antd";
|
||||||
|
|
||||||
|
import { RelayGateway } from "@chirpstack/chirpstack-api-grpc-web/api/gateway_pb";
|
||||||
|
|
||||||
|
import { onFinishFailed } from "../../helpers";
|
||||||
|
import RelayIdInput from "../../../components/RelayIdInput";
|
||||||
|
|
||||||
|
interface IProps {
|
||||||
|
initialValues: RelayGateway;
|
||||||
|
onFinish: (obj: RelayGateway) => void;
|
||||||
|
update?: boolean;
|
||||||
|
disabled?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
function RelayGatewayForm(props: IProps) {
|
||||||
|
const onFinish = (values: RelayGateway.AsObject) => {
|
||||||
|
const v = Object.assign(props.initialValues.toObject(), values);
|
||||||
|
let relay = new RelayGateway();
|
||||||
|
|
||||||
|
relay.setTenantId(v.tenantId);
|
||||||
|
relay.setRelayId(v.relayId);
|
||||||
|
relay.setName(v.name);
|
||||||
|
relay.setDescription(v.description);
|
||||||
|
relay.setStatsInterval(v.statsInterval);
|
||||||
|
relay.setRegionConfigId(v.regionConfigId);
|
||||||
|
|
||||||
|
props.onFinish(relay);
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Form
|
||||||
|
layout="vertical"
|
||||||
|
initialValues={props.initialValues.toObject()}
|
||||||
|
onFinish={onFinish}
|
||||||
|
onFinishFailed={onFinishFailed}
|
||||||
|
>
|
||||||
|
<Form.Item label="Name" name="name" rules={[{ required: true, message: "Please enter a name!" }]}>
|
||||||
|
<Input disabled={props.disabled} />
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item label="Description" name="description">
|
||||||
|
<Input.TextArea disabled={props.disabled} />
|
||||||
|
</Form.Item>
|
||||||
|
<Row gutter={24}>
|
||||||
|
<Col span={12}>
|
||||||
|
<RelayIdInput
|
||||||
|
label="Relay ID (4 bytes)"
|
||||||
|
name="relayId"
|
||||||
|
value={props.initialValues.getRelayId()}
|
||||||
|
disabled={props.update || props.disabled}
|
||||||
|
required
|
||||||
|
/>
|
||||||
|
</Col>
|
||||||
|
<Col span={12}>
|
||||||
|
<Form.Item
|
||||||
|
label="Stats interval (secs)"
|
||||||
|
tooltip="The expected interval in seconds in which the relay gateway sends its statistics"
|
||||||
|
name="statsInterval"
|
||||||
|
rules={[{ required: true, message: "Please enter a stats interval!" }]}
|
||||||
|
>
|
||||||
|
<InputNumber min={0} disabled={props.disabled} />
|
||||||
|
</Form.Item>
|
||||||
|
</Col>
|
||||||
|
</Row>
|
||||||
|
<Form.Item>
|
||||||
|
<Button type="primary" htmlType="submit" disabled={props.disabled}>
|
||||||
|
Submit
|
||||||
|
</Button>
|
||||||
|
</Form.Item>
|
||||||
|
</Form>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default RelayGatewayForm;
|
108
ui/src/views/gateways/mesh/RelayGatewayLayout.tsx
Normal file
108
ui/src/views/gateways/mesh/RelayGatewayLayout.tsx
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
import React, { useState, useEffect } from "react";
|
||||||
|
|
||||||
|
import { Route, Routes, Link, useParams, useNavigate } from "react-router-dom";
|
||||||
|
|
||||||
|
import { Space, Breadcrumb, Card, Button } from "antd";
|
||||||
|
import { PageHeader } from "@ant-design/pro-layout";
|
||||||
|
|
||||||
|
import { Tenant } from "@chirpstack/chirpstack-api-grpc-web/api/tenant_pb";
|
||||||
|
import {
|
||||||
|
RelayGateway,
|
||||||
|
GetRelayGatewayRequest,
|
||||||
|
GetRelayGatewayResponse,
|
||||||
|
DeleteRelayGatewayRequest,
|
||||||
|
} from "@chirpstack/chirpstack-api-grpc-web/api/gateway_pb";
|
||||||
|
|
||||||
|
import Admin from "../../../components/Admin";
|
||||||
|
import SessionStore from "../../../stores/SessionStore";
|
||||||
|
import GatewayStore from "../../../stores/GatewayStore";
|
||||||
|
import DeleteConfirm from "../../../components/DeleteConfirm";
|
||||||
|
|
||||||
|
import EditRelayGateway from "./EditRelayGateway";
|
||||||
|
|
||||||
|
interface IProps {
|
||||||
|
tenant: Tenant;
|
||||||
|
}
|
||||||
|
|
||||||
|
function RelayGatewayLayout(props: IProps) {
|
||||||
|
const { relayId } = useParams();
|
||||||
|
const navigate = useNavigate();
|
||||||
|
const [relayGateway, setRelayGateway] = useState<RelayGateway | undefined>(undefined);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
let req = new GetRelayGatewayRequest();
|
||||||
|
req.setTenantId(props.tenant.getId());
|
||||||
|
req.setRelayId(relayId!);
|
||||||
|
|
||||||
|
GatewayStore.getRelayGateway(req, (resp: GetRelayGatewayResponse) => {
|
||||||
|
setRelayGateway(resp.getRelayGateway());
|
||||||
|
});
|
||||||
|
}, [props, relayId]);
|
||||||
|
|
||||||
|
const deleteRelayGateway = () => {
|
||||||
|
let req = new DeleteRelayGatewayRequest();
|
||||||
|
req.setTenantId(props.tenant.getId());
|
||||||
|
req.setRelayId(relayId!);
|
||||||
|
|
||||||
|
GatewayStore.deleteRelayGateway(req, () => {
|
||||||
|
navigate(`/tenants/${props.tenant.getId()}/gateways/mesh/relays`);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!relayGateway) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
let isGatewayAdmin =
|
||||||
|
SessionStore.isAdmin() ||
|
||||||
|
SessionStore.isTenantAdmin(props.tenant.getId()) ||
|
||||||
|
SessionStore.isTenantGatewayAdmin(props.tenant.getId());
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Space direction="vertical" style={{ width: "100%" }} size="large">
|
||||||
|
<PageHeader
|
||||||
|
breadcrumbRender={() => (
|
||||||
|
<Breadcrumb>
|
||||||
|
<Breadcrumb.Item>
|
||||||
|
<span>Tenants</span>
|
||||||
|
</Breadcrumb.Item>
|
||||||
|
<Breadcrumb.Item>
|
||||||
|
<span>
|
||||||
|
<Link to={`/tenants/${props.tenant.getId()}`}>{props.tenant.getName()}</Link>
|
||||||
|
</span>
|
||||||
|
</Breadcrumb.Item>
|
||||||
|
<Breadcrumb.Item>
|
||||||
|
<span>Gateway Mesh</span>
|
||||||
|
</Breadcrumb.Item>
|
||||||
|
<Breadcrumb.Item>
|
||||||
|
<span>
|
||||||
|
<Link to={`/tenants/${props.tenant.getId()}/gateways/mesh/relays`}>Relay Gateways</Link>
|
||||||
|
</span>
|
||||||
|
</Breadcrumb.Item>
|
||||||
|
<Breadcrumb.Item>
|
||||||
|
<span>{relayGateway.getName()}</span>
|
||||||
|
</Breadcrumb.Item>
|
||||||
|
</Breadcrumb>
|
||||||
|
)}
|
||||||
|
title={relayGateway.getName()}
|
||||||
|
subTitle={`relay id: ${relayGateway.getRelayId()}`}
|
||||||
|
extra={[
|
||||||
|
<Admin tenantId={props.tenant.getId()} isGatewayAdmin>
|
||||||
|
<DeleteConfirm confirm={relayGateway.getName()} typ="relay gateway" onConfirm={deleteRelayGateway}>
|
||||||
|
<Button danger type="primary">
|
||||||
|
Delete Relay Gateway
|
||||||
|
</Button>
|
||||||
|
</DeleteConfirm>
|
||||||
|
</Admin>,
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
<Card>
|
||||||
|
<Routes>
|
||||||
|
<Route path="/edit" element={<EditRelayGateway relayGateway={relayGateway} />} />
|
||||||
|
</Routes>
|
||||||
|
</Card>
|
||||||
|
</Space>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default RelayGatewayLayout;
|
@ -19,8 +19,10 @@ import CreateDeviceProfile from "../device-profiles/CreateDeviceProfile";
|
|||||||
import EditDeviceProfile from "../device-profiles/EditDeviceProfile";
|
import EditDeviceProfile from "../device-profiles/EditDeviceProfile";
|
||||||
|
|
||||||
import ListGateways from "../gateways/ListGateways";
|
import ListGateways from "../gateways/ListGateways";
|
||||||
|
import ListRelayGateways from "../gateways/mesh/ListRelayGateways";
|
||||||
import CreateGateway from "../gateways/CreateGateway";
|
import CreateGateway from "../gateways/CreateGateway";
|
||||||
import GatewayLayout from "../gateways/GatewayLayout";
|
import GatewayLayout from "../gateways/GatewayLayout";
|
||||||
|
import RelayGatewayLayout from "../gateways/mesh/RelayGatewayLayout";
|
||||||
|
|
||||||
import ListApplications from "../applications/ListApplications";
|
import ListApplications from "../applications/ListApplications";
|
||||||
import CreateApplication from "../applications/CreateApplication";
|
import CreateApplication from "../applications/CreateApplication";
|
||||||
@ -65,6 +67,8 @@ function TenantLoader() {
|
|||||||
|
|
||||||
<Route path="/gateways" element={<ListGateways tenant={tenant} />} />
|
<Route path="/gateways" element={<ListGateways tenant={tenant} />} />
|
||||||
<Route path="/gateways/create" element={<CreateGateway tenant={tenant} />} />
|
<Route path="/gateways/create" element={<CreateGateway tenant={tenant} />} />
|
||||||
|
<Route path="/gateways/mesh/relays" element={<ListRelayGateways tenant={tenant} />} />
|
||||||
|
<Route path="/gateways/mesh/relays/:relayId/*" element={<RelayGatewayLayout tenant={tenant} />} />
|
||||||
<Route path="/gateways/:gatewayId/*" element={<GatewayLayout tenant={tenant} />} />
|
<Route path="/gateways/:gatewayId/*" element={<GatewayLayout tenant={tenant} />} />
|
||||||
|
|
||||||
<Route path="/applications" element={<ListApplications tenant={tenant} />} />
|
<Route path="/applications" element={<ListApplications tenant={tenant} />} />
|
||||||
|
Reference in New Issue
Block a user