Implement adding gws to multicast-group + Class-C scheduling config.

This makes it possible to add gateways to a multicast-group, which in
case configured will always be used for transmitting the multicast
downlinks.

This also moves the multicast class-c scheduling to the multicast-group
configuration. Options are delay between multiple gateways, or GPS time
synchronized transmission.
This commit is contained in:
Orne Brocaar 2023-02-09 15:11:06 +00:00
parent 8d34bb0d0c
commit f657c3e971
96 changed files with 3337 additions and 604 deletions

View File

@ -5568,13 +5568,14 @@ var file_api_application_proto_rawDesc = []byte{
0x74, 0x69, 0x6f, 0x6e, 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, 0x6d, 0x71, 0x74, 0x74, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69,
0x63, 0x61, 0x74, 0x65, 0x42, 0x57, 0x0a, 0x11, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72, 0x70,
0x63, 0x61, 0x74, 0x65, 0x42, 0x68, 0x0a, 0x11, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72, 0x70,
0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x42, 0x10, 0x41, 0x70, 0x70, 0x6c, 0x69,
0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2e, 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, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70,
0x72, 0x6f, 0x74, 0x6f, 0x33,
0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x34, 0x2f, 0x61, 0x70, 0x69, 0xaa, 0x02, 0x0e,
0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x70, 0x69, 0x62, 0x06,
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (

View File

@ -2714,13 +2714,14 @@ var file_api_device_proto_rawDesc = []byte{
0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x12, 0x1c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65,
0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x7d, 0x2f,
0x71, 0x75, 0x65, 0x75, 0x65, 0x42, 0x52, 0x0a, 0x11, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72,
0x71, 0x75, 0x65, 0x75, 0x65, 0x42, 0x63, 0x0a, 0x11, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72,
0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x42, 0x0b, 0x44, 0x65, 0x76, 0x69,
0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2e, 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, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
0x33,
0x67, 0x6f, 0x2f, 0x76, 0x34, 0x2f, 0x61, 0x70, 0x69, 0xaa, 0x02, 0x0e, 0x43, 0x68, 0x69, 0x72,
0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
0x6f, 0x33,
}
var (

View File

@ -1443,13 +1443,14 @@ var file_api_device_profile_proto_rawDesc = []byte{
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, 0x6c, 0x65, 0x73,
0x2f, 0x61, 0x64, 0x72, 0x2d, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x73, 0x42,
0x59, 0x0a, 0x11, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b,
0x6a, 0x0a, 0x11, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b,
0x2e, 0x61, 0x70, 0x69, 0x42, 0x12, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x66,
0x69, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2e, 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, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
0x6f, 0x33,
0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x34, 0x2f, 0x61, 0x70, 0x69, 0xaa, 0x02, 0x0e, 0x43, 0x68, 0x69,
0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f,
0x74, 0x6f, 0x33,
}
var (

View File

@ -1088,13 +1088,14 @@ 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,
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,
0x61, 0x74, 0x65, 0x73, 0x42, 0x61, 0x0a, 0x11, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72, 0x70,
0x61, 0x74, 0x65, 0x73, 0x42, 0x72, 0x0a, 0x11, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72, 0x70,
0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x42, 0x1a, 0x44, 0x65, 0x76, 0x69, 0x63,
0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65,
0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2e, 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, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
0x2f, 0x76, 0x34, 0x2f, 0x61, 0x70, 0x69, 0xaa, 0x02, 0x0e, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73,
0x74, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (

View File

@ -305,13 +305,14 @@ var file_api_frame_log_proto_rawDesc = []byte{
0x76, 0x45, 0x75, 0x69, 0x12, 0x34, 0x0a, 0x16, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78,
0x74, 0x5f, 0x6d, 0x61, 0x63, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x09,
0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4d,
0x61, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x42, 0x54, 0x0a, 0x11, 0x69, 0x6f,
0x61, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x42, 0x65, 0x0a, 0x11, 0x69, 0x6f,
0x2e, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x42,
0x0d, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x4c, 0x6f, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01,
0x5a, 0x2e, 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, 0x61, 0x70, 0x69,
0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
0xaa, 0x02, 0x0e, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x70,
0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (

View File

@ -601,6 +601,8 @@ type ListGatewaysRequest struct {
// Tenant ID (UUID) to filter gateways on.
// To list all gateways as a global admin user, this field can be left blank.
TenantId string `protobuf:"bytes,4,opt,name=tenant_id,json=tenantId,proto3" json:"tenant_id,omitempty"`
// Multicast-group ID (UUID) to filter gateways on.
MulticastGroupId string `protobuf:"bytes,5,opt,name=multicast_group_id,json=multicastGroupId,proto3" json:"multicast_group_id,omitempty"`
}
func (x *ListGatewaysRequest) Reset() {
@ -663,6 +665,13 @@ func (x *ListGatewaysRequest) GetTenantId() string {
return ""
}
func (x *ListGatewaysRequest) GetMulticastGroupId() string {
if x != nil {
return x.MulticastGroupId
}
return ""
}
type ListGatewaysResponse struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@ -1121,135 +1130,139 @@ var file_api_gateway_proto_rawDesc = []byte{
0x77, 0x61, 0x79, 0x22, 0x35, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x61, 0x74,
0x65, 0x77, 0x61, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x67,
0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
0x09, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x22, 0x78, 0x0a, 0x13, 0x4c, 0x69,
0x73, 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d,
0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65,
0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12,
0x16, 0x0a, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x65, 0x6e, 0x61, 0x6e,
0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6e, 0x61,
0x6e, 0x74, 0x49, 0x64, 0x22, 0x65, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x61, 0x74, 0x65,
0x77, 0x61, 0x79, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b,
0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,
0x0d, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a,
0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e,
0x61, 0x70, 0x69, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x49,
0x74, 0x65, 0x6d, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x48, 0x0a, 0x27, 0x47,
0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6c,
0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52,
0x09, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x22, 0xa6, 0x01, 0x0a, 0x13, 0x4c,
0x69, 0x73, 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,
0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73,
0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74,
0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
0x52, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x65, 0x6e, 0x61,
0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6e,
0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x12, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x63, 0x61,
0x73, 0x74, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28,
0x09, 0x52, 0x10, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x63, 0x61, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75,
0x70, 0x49, 0x64, 0x22, 0x65, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x61, 0x74, 0x65, 0x77,
0x61, 0x79, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74,
0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d,
0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x06,
0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61,
0x70, 0x69, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x74,
0x65, 0x6d, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x48, 0x0a, 0x27, 0x47, 0x65,
0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6c, 0x69,
0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65,
0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79,
0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x61, 0x74, 0x65, 0x77,
0x61, 0x79, 0x49, 0x64, 0x22, 0xb2, 0x01, 0x0a, 0x28, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,
0x65, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65,
0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
0x65, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x01, 0x20,
0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07,
0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74,
0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x63, 0x61, 0x5f, 0x63, 0x65, 0x72, 0x74,
0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x12, 0x39,
0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01,
0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09,
0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x22, 0xd0, 0x01, 0x0a, 0x18, 0x47, 0x65,
0x74, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52,
0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61,
0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x61, 0x74, 0x65,
0x77, 0x61, 0x79, 0x49, 0x64, 0x22, 0xb2, 0x01, 0x0a, 0x28, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61,
0x74, 0x65, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43,
0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
0x73, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x01,
0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a,
0x07, 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x63, 0x61, 0x5f, 0x63, 0x65, 0x72,
0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x12,
0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20,
0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52,
0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x22, 0xd0, 0x01, 0x0a, 0x18, 0x47,
0x65, 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73,
0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x61, 0x74, 0x65, 0x77,
0x61, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x61, 0x74,
0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18,
0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
0x70, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x2c, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18,
0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
0x70, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x35, 0x0a, 0x0b, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x63, 0x6f,
0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e,
0x52, 0x0b, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xb0, 0x03,
0x0a, 0x19, 0x47, 0x65, 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x65, 0x74, 0x72,
0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x0a, 0x72,
0x78, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52,
0x09, 0x72, 0x78, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x2d, 0x0a, 0x0a, 0x74, 0x78,
0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e,
0x77, 0x61, 0x79, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x02,
0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x2c, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x03,
0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x35, 0x0a, 0x0b, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61,
0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6d,
0x6d, 0x6f, 0x6e, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52,
0x0b, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xb0, 0x03, 0x0a,
0x19, 0x47, 0x65, 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x65, 0x74, 0x72, 0x69,
0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x0a, 0x72, 0x78,
0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e,
0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x09,
0x74, 0x78, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x3d, 0x0a, 0x13, 0x74, 0x78, 0x5f,
0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x66, 0x72, 0x65, 0x71,
0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e,
0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x10, 0x74, 0x78, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74,
0x73, 0x50, 0x65, 0x72, 0x46, 0x72, 0x65, 0x71, 0x12, 0x3d, 0x0a, 0x13, 0x72, 0x78, 0x5f, 0x70,
0x72, 0x78, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x2d, 0x0a, 0x0a, 0x74, 0x78, 0x5f,
0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e,
0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x09, 0x74,
0x78, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x3d, 0x0a, 0x13, 0x74, 0x78, 0x5f, 0x70,
0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x18,
0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d,
0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x10, 0x72, 0x78, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73,
0x50, 0x65, 0x72, 0x46, 0x72, 0x65, 0x71, 0x12, 0x39, 0x0a, 0x11, 0x74, 0x78, 0x5f, 0x70, 0x61,
0x63, 0x6b, 0x65, 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x64, 0x72, 0x18, 0x05, 0x20, 0x01,
0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72,
0x69, 0x63, 0x52, 0x0e, 0x74, 0x78, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x50, 0x65, 0x72,
0x44, 0x72, 0x12, 0x39, 0x0a, 0x11, 0x72, 0x78, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73,
0x5f, 0x70, 0x65, 0x72, 0x5f, 0x64, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e,
0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x0e, 0x72,
0x78, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x50, 0x65, 0x72, 0x44, 0x72, 0x12, 0x41, 0x0a,
0x15, 0x74, 0x78, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f,
0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63,
0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x12, 0x74, 0x78,
0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x50, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
0x2a, 0x37, 0x0a, 0x0c, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65,
0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x45, 0x56, 0x45, 0x52, 0x5f, 0x53, 0x45, 0x45, 0x4e, 0x10, 0x00,
0x12, 0x0a, 0x0a, 0x06, 0x4f, 0x4e, 0x4c, 0x49, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07,
0x4f, 0x46, 0x46, 0x4c, 0x49, 0x4e, 0x45, 0x10, 0x02, 0x32, 0x91, 0x06, 0x0a, 0x0e, 0x47, 0x61,
0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x55, 0x0a, 0x06,
0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65,
0x61, 0x74, 0x65, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02,
0x12, 0x22, 0x0d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73,
0x3a, 0x01, 0x2a, 0x12, 0x5a, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x16, 0x2e, 0x61, 0x70, 0x69,
0x2e, 0x47, 0x65, 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65,
0x73, 0x74, 0x1a, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x61, 0x74, 0x65,
0x77, 0x61, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4,
0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61,
0x79, 0x73, 0x2f, 0x7b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x64, 0x7d, 0x12,
0x6a, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e,
0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x52, 0x65, 0x71,
0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2d, 0x82, 0xd3,
0xe4, 0x93, 0x02, 0x27, 0x1a, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77,
0x61, 0x79, 0x73, 0x2f, 0x7b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x67, 0x61, 0x74,
0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x64, 0x7d, 0x3a, 0x01, 0x2a, 0x12, 0x5f, 0x0a, 0x06, 0x44,
0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x6c, 0x65,
0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d,
0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x10, 0x74, 0x78, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73,
0x50, 0x65, 0x72, 0x46, 0x72, 0x65, 0x71, 0x12, 0x3d, 0x0a, 0x13, 0x72, 0x78, 0x5f, 0x70, 0x61,
0x63, 0x6b, 0x65, 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x18, 0x04,
0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65,
0x74, 0x72, 0x69, 0x63, 0x52, 0x10, 0x72, 0x78, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x50,
0x65, 0x72, 0x46, 0x72, 0x65, 0x71, 0x12, 0x39, 0x0a, 0x11, 0x74, 0x78, 0x5f, 0x70, 0x61, 0x63,
0x6b, 0x65, 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x64, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28,
0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69,
0x63, 0x52, 0x0e, 0x74, 0x78, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x50, 0x65, 0x72, 0x44,
0x72, 0x12, 0x39, 0x0a, 0x11, 0x72, 0x78, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x5f,
0x70, 0x65, 0x72, 0x5f, 0x64, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63,
0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x0e, 0x72, 0x78,
0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x50, 0x65, 0x72, 0x44, 0x72, 0x12, 0x41, 0x0a, 0x15,
0x74, 0x78, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x73,
0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f,
0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x12, 0x74, 0x78, 0x50,
0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x50, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2a,
0x37, 0x0a, 0x0c, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12,
0x0e, 0x0a, 0x0a, 0x4e, 0x45, 0x56, 0x45, 0x52, 0x5f, 0x53, 0x45, 0x45, 0x4e, 0x10, 0x00, 0x12,
0x0a, 0x0a, 0x06, 0x4f, 0x4e, 0x4c, 0x49, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x4f,
0x46, 0x46, 0x4c, 0x49, 0x4e, 0x45, 0x10, 0x02, 0x32, 0x91, 0x06, 0x0a, 0x0e, 0x47, 0x61, 0x74,
0x65, 0x77, 0x61, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x55, 0x0a, 0x06, 0x43,
0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61,
0x74, 0x65, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c,
0x2a, 0x1a, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x2f,
0x7b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x52, 0x0a, 0x04,
0x4c, 0x69, 0x73, 0x74, 0x12, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47,
0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19,
0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79,
0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02,
0x0f, 0x12, 0x0d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73,
0x12, 0xb1, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x69,
0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x2c,
0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x47, 0x61, 0x74,
0x65, 0x77, 0x61, 0x79, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66,
0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61,
0x70, 0x69, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x47, 0x61, 0x74, 0x65, 0x77,
0x61, 0x79, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63,
0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x37, 0x82, 0xd3, 0xe4,
0x93, 0x02, 0x31, 0x22, 0x2f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61,
0x79, 0x73, 0x2f, 0x7b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x64, 0x7d, 0x2f,
0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x2d, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69,
0x63, 0x61, 0x74, 0x65, 0x12, 0x77, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69,
0x63, 0x73, 0x12, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x61, 0x74, 0x65,
0x77, 0x61, 0x79, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
0x74, 0x1a, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x61, 0x74, 0x65, 0x77,
0x61, 0x79, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x12, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f,
0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x2f, 0x7b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61,
0x79, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x42, 0x53, 0x0a,
0x11, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x61,
0x70, 0x69, 0x42, 0x0c, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f,
0x50, 0x01, 0x5a, 0x2e, 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, 0x61,
0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12,
0x22, 0x0d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x3a,
0x01, 0x2a, 0x12, 0x5a, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e,
0x47, 0x65, 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
0x74, 0x1a, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x61, 0x74, 0x65, 0x77,
0x61, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93,
0x02, 0x1c, 0x12, 0x1a, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79,
0x73, 0x2f, 0x7b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x6a,
0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55,
0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x52, 0x65, 0x71, 0x75,
0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2d, 0x82, 0xd3, 0xe4,
0x93, 0x02, 0x27, 0x1a, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61,
0x79, 0x73, 0x2f, 0x7b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x67, 0x61, 0x74, 0x65,
0x77, 0x61, 0x79, 0x5f, 0x69, 0x64, 0x7d, 0x3a, 0x01, 0x2a, 0x12, 0x5f, 0x0a, 0x06, 0x44, 0x65,
0x6c, 0x65, 0x74, 0x65, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74,
0x65, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x2a,
0x1a, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x2f, 0x7b,
0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x52, 0x0a, 0x04, 0x4c,
0x69, 0x73, 0x74, 0x12, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x61,
0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e,
0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73,
0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f,
0x12, 0x0d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x12,
0xb1, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x69, 0x65,
0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x2e,
0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x47, 0x61, 0x74, 0x65,
0x77, 0x61, 0x79, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69,
0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70,
0x69, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61,
0x79, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61,
0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x37, 0x82, 0xd3, 0xe4, 0x93,
0x02, 0x31, 0x22, 0x2f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79,
0x73, 0x2f, 0x7b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67,
0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x2d, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63,
0x61, 0x74, 0x65, 0x12, 0x77, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63,
0x73, 0x12, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x61, 0x74, 0x65, 0x77,
0x61, 0x79, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
0x1a, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61,
0x79, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x12, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67,
0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x2f, 0x7b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79,
0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x42, 0x64, 0x0a, 0x11,
0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x61, 0x70,
0x69, 0x42, 0x0c, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50,
0x01, 0x5a, 0x2e, 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, 0x61, 0x70,
0x69, 0xaa, 0x02, 0x0e, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x41,
0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

View File

@ -2241,13 +2241,14 @@ var file_api_internal_proto_rawDesc = []byte{
0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e,
0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
0x1a, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e,
0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x11, 0x69, 0x6f,
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, 0x63, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x42,
0x0d, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01,
0x5a, 0x2e, 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, 0x61, 0x70, 0x69,
0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
0xaa, 0x02, 0x0e, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x70,
0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (

File diff suppressed because it is too large Load Diff

View File

@ -37,7 +37,11 @@ type MulticastGroupServiceClient interface {
AddDevice(ctx context.Context, in *AddDeviceToMulticastGroupRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
// Remove a device from the multicast group.
RemoveDevice(ctx context.Context, in *RemoveDeviceFromMulticastGroupRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
// Add the given item to the multcast group queue.
// Add a gateway to the multicast group.
AddGateway(ctx context.Context, in *AddGatewayToMulticastGroupRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
// Remove a gateway from the multicast group.
RemoveGateway(ctx context.Context, in *RemoveGatewayFromMulticastGroupRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
// Add the given item to the multicast group queue.
Enqueue(ctx context.Context, in *EnqueueMulticastGroupQueueItemRequest, opts ...grpc.CallOption) (*EnqueueMulticastGroupQueueItemResponse, error)
// Flush the queue for the given multicast group.
FlushQueue(ctx context.Context, in *FlushMulticastGroupQueueRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
@ -116,6 +120,24 @@ func (c *multicastGroupServiceClient) RemoveDevice(ctx context.Context, in *Remo
return out, nil
}
func (c *multicastGroupServiceClient) AddGateway(ctx context.Context, in *AddGatewayToMulticastGroupRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
out := new(emptypb.Empty)
err := c.cc.Invoke(ctx, "/api.MulticastGroupService/AddGateway", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *multicastGroupServiceClient) RemoveGateway(ctx context.Context, in *RemoveGatewayFromMulticastGroupRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
out := new(emptypb.Empty)
err := c.cc.Invoke(ctx, "/api.MulticastGroupService/RemoveGateway", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *multicastGroupServiceClient) Enqueue(ctx context.Context, in *EnqueueMulticastGroupQueueItemRequest, opts ...grpc.CallOption) (*EnqueueMulticastGroupQueueItemResponse, error) {
out := new(EnqueueMulticastGroupQueueItemResponse)
err := c.cc.Invoke(ctx, "/api.MulticastGroupService/Enqueue", in, out, opts...)
@ -161,7 +183,11 @@ type MulticastGroupServiceServer interface {
AddDevice(context.Context, *AddDeviceToMulticastGroupRequest) (*emptypb.Empty, error)
// Remove a device from the multicast group.
RemoveDevice(context.Context, *RemoveDeviceFromMulticastGroupRequest) (*emptypb.Empty, error)
// Add the given item to the multcast group queue.
// Add a gateway to the multicast group.
AddGateway(context.Context, *AddGatewayToMulticastGroupRequest) (*emptypb.Empty, error)
// Remove a gateway from the multicast group.
RemoveGateway(context.Context, *RemoveGatewayFromMulticastGroupRequest) (*emptypb.Empty, error)
// Add the given item to the multicast group queue.
Enqueue(context.Context, *EnqueueMulticastGroupQueueItemRequest) (*EnqueueMulticastGroupQueueItemResponse, error)
// Flush the queue for the given multicast group.
FlushQueue(context.Context, *FlushMulticastGroupQueueRequest) (*emptypb.Empty, error)
@ -195,6 +221,12 @@ func (UnimplementedMulticastGroupServiceServer) AddDevice(context.Context, *AddD
func (UnimplementedMulticastGroupServiceServer) RemoveDevice(context.Context, *RemoveDeviceFromMulticastGroupRequest) (*emptypb.Empty, error) {
return nil, status.Errorf(codes.Unimplemented, "method RemoveDevice not implemented")
}
func (UnimplementedMulticastGroupServiceServer) AddGateway(context.Context, *AddGatewayToMulticastGroupRequest) (*emptypb.Empty, error) {
return nil, status.Errorf(codes.Unimplemented, "method AddGateway not implemented")
}
func (UnimplementedMulticastGroupServiceServer) RemoveGateway(context.Context, *RemoveGatewayFromMulticastGroupRequest) (*emptypb.Empty, error) {
return nil, status.Errorf(codes.Unimplemented, "method RemoveGateway not implemented")
}
func (UnimplementedMulticastGroupServiceServer) Enqueue(context.Context, *EnqueueMulticastGroupQueueItemRequest) (*EnqueueMulticastGroupQueueItemResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method Enqueue not implemented")
}
@ -343,6 +375,42 @@ func _MulticastGroupService_RemoveDevice_Handler(srv interface{}, ctx context.Co
return interceptor(ctx, in, info, handler)
}
func _MulticastGroupService_AddGateway_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(AddGatewayToMulticastGroupRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(MulticastGroupServiceServer).AddGateway(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/api.MulticastGroupService/AddGateway",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(MulticastGroupServiceServer).AddGateway(ctx, req.(*AddGatewayToMulticastGroupRequest))
}
return interceptor(ctx, in, info, handler)
}
func _MulticastGroupService_RemoveGateway_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(RemoveGatewayFromMulticastGroupRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(MulticastGroupServiceServer).RemoveGateway(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/api.MulticastGroupService/RemoveGateway",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(MulticastGroupServiceServer).RemoveGateway(ctx, req.(*RemoveGatewayFromMulticastGroupRequest))
}
return interceptor(ctx, in, info, handler)
}
func _MulticastGroupService_Enqueue_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(EnqueueMulticastGroupQueueItemRequest)
if err := dec(in); err != nil {
@ -432,6 +500,14 @@ var MulticastGroupService_ServiceDesc = grpc.ServiceDesc{
MethodName: "RemoveDevice",
Handler: _MulticastGroupService_RemoveDevice_Handler,
},
{
MethodName: "AddGateway",
Handler: _MulticastGroupService_AddGateway_Handler,
},
{
MethodName: "RemoveGateway",
Handler: _MulticastGroupService_RemoveGateway_Handler,
},
{
MethodName: "Enqueue",
Handler: _MulticastGroupService_Enqueue_Handler,

View File

@ -109,13 +109,14 @@ var file_api_request_log_proto_rawDesc = []byte{
0x65, 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, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76,
0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x56, 0x0a, 0x11, 0x69, 0x6f, 0x2e, 0x63,
0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x67, 0x0a, 0x11, 0x69, 0x6f, 0x2e, 0x63,
0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x42, 0x0f, 0x52,
0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4c, 0x6f, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01,
0x5a, 0x2e, 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, 0x61, 0x70, 0x69,
0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
0xaa, 0x02, 0x0e, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x70,
0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (

View File

@ -1518,13 +1518,14 @@ var file_api_tenant_proto_rawDesc = []byte{
0x69, 0x73, 0x74, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x55, 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, 0x74, 0x73, 0x2f, 0x7b, 0x74, 0x65,
0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x42, 0x52,
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, 0x74, 0x61, 0x63, 0x6b, 0x2e,
0x61, 0x70, 0x69, 0x42, 0x0b, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f,
0x50, 0x01, 0x5a, 0x2e, 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, 0x61,
0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
0x70, 0x69, 0xaa, 0x02, 0x0e, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e,
0x41, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (

View File

@ -891,13 +891,14 @@ var file_api_user_proto_rawDesc = []byte{
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, 0x22, 0x1d, 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, 0x3a, 0x01, 0x2a, 0x42, 0x50, 0x0a,
0x7d, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x01, 0x2a, 0x42, 0x61, 0x0a,
0x11, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x61,
0x70, 0x69, 0x42, 0x09, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a,
0x2e, 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, 0x61, 0x70, 0x69, 0x62,
0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
0x6b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x34, 0x2f, 0x61, 0x70, 0x69, 0xaa,
0x02, 0x0e, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x41, 0x70, 0x69,
0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (

View File

@ -894,13 +894,14 @@ var file_common_common_proto_rawDesc = []byte{
0x0a, 0x05, 0x4d, 0x4f, 0x4e, 0x54, 0x48, 0x10, 0x02, 0x2a, 0x32, 0x0a, 0x0a, 0x4d, 0x65, 0x74,
0x72, 0x69, 0x63, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x4f, 0x55, 0x4e, 0x54,
0x45, 0x52, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x42, 0x53, 0x4f, 0x4c, 0x55, 0x54, 0x45,
0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x41, 0x55, 0x47, 0x45, 0x10, 0x02, 0x42, 0x55, 0x0a,
0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x41, 0x55, 0x47, 0x45, 0x10, 0x02, 0x42, 0x69, 0x0a,
0x11, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x61,
0x70, 0x69, 0x42, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50,
0x01, 0x5a, 0x31, 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, 0x63, 0x6f,
0x6d, 0x6d, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
0x6d, 0x6d, 0x6f, 0x6e, 0xaa, 0x02, 0x11, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63,
0x6b, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (

7
api/go/gw/gw.pb.go vendored
View File

@ -3918,13 +3918,14 @@ var file_gw_gw_proto_rawDesc = []byte{
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, 0x42, 0x55, 0x0a, 0x14, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74,
0x10, 0x0a, 0x42, 0x6a, 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, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
0x33,
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, 0x62, 0x06,
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (

View File

@ -1392,14 +1392,16 @@ var file_integration_integration_proto_rawDesc = []byte{
0x0a, 0x1b, 0x55, 0x50, 0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x46, 0x5f, 0x43, 0x4e, 0x54, 0x5f, 0x52,
0x45, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x07, 0x12,
0x14, 0x0a, 0x10, 0x44, 0x4f, 0x57, 0x4e, 0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x47, 0x41, 0x54, 0x45,
0x57, 0x41, 0x59, 0x10, 0x08, 0x42, 0x68, 0x0a, 0x1d, 0x69, 0x6f, 0x2e, 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, 0x67, 0x72, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68,
0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x72, 0x6f, 0x63, 0x61, 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, 0x6f, 0x6e, 0x62,
0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
0x57, 0x41, 0x59, 0x10, 0x08, 0x42, 0x81, 0x01, 0x0a, 0x1d, 0x69, 0x6f, 0x2e, 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, 0x67, 0x72, 0x61,
0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74,
0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x72, 0x6f, 0x63, 0x61, 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, 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, 0x6f, 0x74, 0x6f,
0x33,
}
var (

View File

@ -287,13 +287,14 @@ var file_meta_meta_proto_rawDesc = []byte{
0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 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, 0x18, 0x08, 0x20, 0x01,
0x28, 0x09, 0x52, 0x09, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x42, 0x56, 0x0a,
0x28, 0x09, 0x52, 0x09, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x42, 0x68, 0x0a,
0x16, 0x69, 0x6f, 0x2e, 0x63, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x61,
0x70, 0x69, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x42, 0x09, 0x4d, 0x65, 0x74, 0x61, 0x50, 0x72, 0x6f,
0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2f, 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, 0x6d, 0x65, 0x74, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
0x2f, 0x6d, 0x65, 0x74, 0x61, 0xaa, 0x02, 0x0f, 0x43, 0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61,
0x63, 0x6b, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (

View File

@ -243,6 +243,9 @@ export class ListGatewaysRequest extends jspb.Message {
getTenantId(): string;
setTenantId(value: string): ListGatewaysRequest;
getMulticastGroupId(): string;
setMulticastGroupId(value: string): ListGatewaysRequest;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): ListGatewaysRequest.AsObject;
static toObject(includeInstance: boolean, msg: ListGatewaysRequest): ListGatewaysRequest.AsObject;
@ -257,6 +260,7 @@ export namespace ListGatewaysRequest {
offset: number,
search: string,
tenantId: string,
multicastGroupId: string,
}
}

View File

@ -2062,7 +2062,8 @@ proto.api.ListGatewaysRequest.toObject = function(includeInstance, msg) {
limit: jspb.Message.getFieldWithDefault(msg, 1, 0),
offset: jspb.Message.getFieldWithDefault(msg, 2, 0),
search: jspb.Message.getFieldWithDefault(msg, 3, ""),
tenantId: jspb.Message.getFieldWithDefault(msg, 4, "")
tenantId: jspb.Message.getFieldWithDefault(msg, 4, ""),
multicastGroupId: jspb.Message.getFieldWithDefault(msg, 5, "")
};
if (includeInstance) {
@ -2115,6 +2116,10 @@ proto.api.ListGatewaysRequest.deserializeBinaryFromReader = function(msg, reader
var value = /** @type {string} */ (reader.readString());
msg.setTenantId(value);
break;
case 5:
var value = /** @type {string} */ (reader.readString());
msg.setMulticastGroupId(value);
break;
default:
reader.skipField();
break;
@ -2172,6 +2177,13 @@ proto.api.ListGatewaysRequest.serializeBinaryToWriter = function(message, writer
f
);
}
f = message.getMulticastGroupId();
if (f.length > 0) {
writer.writeString(
5,
f
);
}
};
@ -2247,6 +2259,24 @@ proto.api.ListGatewaysRequest.prototype.setTenantId = function(value) {
};
/**
* optional string multicast_group_id = 5;
* @return {string}
*/
proto.api.ListGatewaysRequest.prototype.getMulticastGroupId = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, ""));
};
/**
* @param {string} value
* @return {!proto.api.ListGatewaysRequest} returns this
*/
proto.api.ListGatewaysRequest.prototype.setMulticastGroupId = function(value) {
return jspb.Message.setProto3StringField(this, 5, value);
};
/**
* List of repeated fields within this message type.

View File

@ -58,6 +58,20 @@ export class MulticastGroupServiceClient {
response: google_protobuf_empty_pb.Empty) => void
): grpcWeb.ClientReadableStream<google_protobuf_empty_pb.Empty>;
addGateway(
request: api_multicast_group_pb.AddGatewayToMulticastGroupRequest,
metadata: grpcWeb.Metadata | undefined,
callback: (err: grpcWeb.RpcError,
response: google_protobuf_empty_pb.Empty) => void
): grpcWeb.ClientReadableStream<google_protobuf_empty_pb.Empty>;
removeGateway(
request: api_multicast_group_pb.RemoveGatewayFromMulticastGroupRequest,
metadata: grpcWeb.Metadata | undefined,
callback: (err: grpcWeb.RpcError,
response: google_protobuf_empty_pb.Empty) => void
): grpcWeb.ClientReadableStream<google_protobuf_empty_pb.Empty>;
enqueue(
request: api_multicast_group_pb.EnqueueMulticastGroupQueueItemRequest,
metadata: grpcWeb.Metadata | undefined,
@ -121,6 +135,16 @@ export class MulticastGroupServicePromiseClient {
metadata?: grpcWeb.Metadata
): Promise<google_protobuf_empty_pb.Empty>;
addGateway(
request: api_multicast_group_pb.AddGatewayToMulticastGroupRequest,
metadata?: grpcWeb.Metadata
): Promise<google_protobuf_empty_pb.Empty>;
removeGateway(
request: api_multicast_group_pb.RemoveGatewayFromMulticastGroupRequest,
metadata?: grpcWeb.Metadata
): Promise<google_protobuf_empty_pb.Empty>;
enqueue(
request: api_multicast_group_pb.EnqueueMulticastGroupQueueItemRequest,
metadata?: grpcWeb.Metadata

View File

@ -509,6 +509,128 @@ proto.api.MulticastGroupServicePromiseClient.prototype.removeDevice =
};
/**
* @const
* @type {!grpc.web.MethodDescriptor<
* !proto.api.AddGatewayToMulticastGroupRequest,
* !proto.google.protobuf.Empty>}
*/
const methodDescriptor_MulticastGroupService_AddGateway = new grpc.web.MethodDescriptor(
'/api.MulticastGroupService/AddGateway',
grpc.web.MethodType.UNARY,
proto.api.AddGatewayToMulticastGroupRequest,
google_protobuf_empty_pb.Empty,
/**
* @param {!proto.api.AddGatewayToMulticastGroupRequest} request
* @return {!Uint8Array}
*/
function(request) {
return request.serializeBinary();
},
google_protobuf_empty_pb.Empty.deserializeBinary
);
/**
* @param {!proto.api.AddGatewayToMulticastGroupRequest} request The
* request proto
* @param {?Object<string, string>} metadata User defined
* call metadata
* @param {function(?grpc.web.RpcError, ?proto.google.protobuf.Empty)}
* callback The callback function(error, response)
* @return {!grpc.web.ClientReadableStream<!proto.google.protobuf.Empty>|undefined}
* The XHR Node Readable Stream
*/
proto.api.MulticastGroupServiceClient.prototype.addGateway =
function(request, metadata, callback) {
return this.client_.rpcCall(this.hostname_ +
'/api.MulticastGroupService/AddGateway',
request,
metadata || {},
methodDescriptor_MulticastGroupService_AddGateway,
callback);
};
/**
* @param {!proto.api.AddGatewayToMulticastGroupRequest} request The
* request proto
* @param {?Object<string, string>=} metadata User defined
* call metadata
* @return {!Promise<!proto.google.protobuf.Empty>}
* Promise that resolves to the response
*/
proto.api.MulticastGroupServicePromiseClient.prototype.addGateway =
function(request, metadata) {
return this.client_.unaryCall(this.hostname_ +
'/api.MulticastGroupService/AddGateway',
request,
metadata || {},
methodDescriptor_MulticastGroupService_AddGateway);
};
/**
* @const
* @type {!grpc.web.MethodDescriptor<
* !proto.api.RemoveGatewayFromMulticastGroupRequest,
* !proto.google.protobuf.Empty>}
*/
const methodDescriptor_MulticastGroupService_RemoveGateway = new grpc.web.MethodDescriptor(
'/api.MulticastGroupService/RemoveGateway',
grpc.web.MethodType.UNARY,
proto.api.RemoveGatewayFromMulticastGroupRequest,
google_protobuf_empty_pb.Empty,
/**
* @param {!proto.api.RemoveGatewayFromMulticastGroupRequest} request
* @return {!Uint8Array}
*/
function(request) {
return request.serializeBinary();
},
google_protobuf_empty_pb.Empty.deserializeBinary
);
/**
* @param {!proto.api.RemoveGatewayFromMulticastGroupRequest} request The
* request proto
* @param {?Object<string, string>} metadata User defined
* call metadata
* @param {function(?grpc.web.RpcError, ?proto.google.protobuf.Empty)}
* callback The callback function(error, response)
* @return {!grpc.web.ClientReadableStream<!proto.google.protobuf.Empty>|undefined}
* The XHR Node Readable Stream
*/
proto.api.MulticastGroupServiceClient.prototype.removeGateway =
function(request, metadata, callback) {
return this.client_.rpcCall(this.hostname_ +
'/api.MulticastGroupService/RemoveGateway',
request,
metadata || {},
methodDescriptor_MulticastGroupService_RemoveGateway,
callback);
};
/**
* @param {!proto.api.RemoveGatewayFromMulticastGroupRequest} request The
* request proto
* @param {?Object<string, string>=} metadata User defined
* call metadata
* @return {!Promise<!proto.google.protobuf.Empty>}
* Promise that resolves to the response
*/
proto.api.MulticastGroupServicePromiseClient.prototype.removeGateway =
function(request, metadata) {
return this.client_.unaryCall(this.hostname_ +
'/api.MulticastGroupService/RemoveGateway',
request,
metadata || {},
methodDescriptor_MulticastGroupService_RemoveGateway);
};
/**
* @const
* @type {!grpc.web.MethodDescriptor<

View File

@ -43,6 +43,9 @@ export class MulticastGroup extends jspb.Message {
getClassBPingSlotPeriod(): number;
setClassBPingSlotPeriod(value: number): MulticastGroup;
getClassCSchedulingType(): MulticastGroupSchedulingType;
setClassCSchedulingType(value: MulticastGroupSchedulingType): MulticastGroup;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): MulticastGroup.AsObject;
static toObject(includeInstance: boolean, msg: MulticastGroup): MulticastGroup.AsObject;
@ -65,6 +68,7 @@ export namespace MulticastGroup {
dr: number,
frequency: number,
classBPingSlotPeriod: number,
classCSchedulingType: MulticastGroupSchedulingType,
}
}
@ -334,6 +338,50 @@ export namespace RemoveDeviceFromMulticastGroupRequest {
}
}
export class AddGatewayToMulticastGroupRequest extends jspb.Message {
getMulticastGroupId(): string;
setMulticastGroupId(value: string): AddGatewayToMulticastGroupRequest;
getGatewayId(): string;
setGatewayId(value: string): AddGatewayToMulticastGroupRequest;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): AddGatewayToMulticastGroupRequest.AsObject;
static toObject(includeInstance: boolean, msg: AddGatewayToMulticastGroupRequest): AddGatewayToMulticastGroupRequest.AsObject;
static serializeBinaryToWriter(message: AddGatewayToMulticastGroupRequest, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): AddGatewayToMulticastGroupRequest;
static deserializeBinaryFromReader(message: AddGatewayToMulticastGroupRequest, reader: jspb.BinaryReader): AddGatewayToMulticastGroupRequest;
}
export namespace AddGatewayToMulticastGroupRequest {
export type AsObject = {
multicastGroupId: string,
gatewayId: string,
}
}
export class RemoveGatewayFromMulticastGroupRequest extends jspb.Message {
getMulticastGroupId(): string;
setMulticastGroupId(value: string): RemoveGatewayFromMulticastGroupRequest;
getGatewayId(): string;
setGatewayId(value: string): RemoveGatewayFromMulticastGroupRequest;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): RemoveGatewayFromMulticastGroupRequest.AsObject;
static toObject(includeInstance: boolean, msg: RemoveGatewayFromMulticastGroupRequest): RemoveGatewayFromMulticastGroupRequest.AsObject;
static serializeBinaryToWriter(message: RemoveGatewayFromMulticastGroupRequest, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): RemoveGatewayFromMulticastGroupRequest;
static deserializeBinaryFromReader(message: RemoveGatewayFromMulticastGroupRequest, reader: jspb.BinaryReader): RemoveGatewayFromMulticastGroupRequest;
}
export namespace RemoveGatewayFromMulticastGroupRequest {
export type AsObject = {
multicastGroupId: string,
gatewayId: string,
}
}
export class MulticastGroupQueueItem extends jspb.Message {
getMulticastGroupId(): string;
setMulticastGroupId(value: string): MulticastGroupQueueItem;
@ -464,3 +512,7 @@ export enum MulticastGroupType {
CLASS_C = 0,
CLASS_B = 1,
}
export enum MulticastGroupSchedulingType {
DELAY = 0,
GPS_TIME = 1,
}

View File

@ -21,6 +21,7 @@ goog.object.extend(proto, google_protobuf_empty_pb);
var common_common_pb = require('../common/common_pb.js');
goog.object.extend(proto, common_common_pb);
goog.exportSymbol('proto.api.AddDeviceToMulticastGroupRequest', null, global);
goog.exportSymbol('proto.api.AddGatewayToMulticastGroupRequest', null, global);
goog.exportSymbol('proto.api.CreateMulticastGroupRequest', null, global);
goog.exportSymbol('proto.api.CreateMulticastGroupResponse', null, global);
goog.exportSymbol('proto.api.DeleteMulticastGroupRequest', null, global);
@ -36,8 +37,10 @@ goog.exportSymbol('proto.api.ListMulticastGroupsResponse', null, global);
goog.exportSymbol('proto.api.MulticastGroup', null, global);
goog.exportSymbol('proto.api.MulticastGroupListItem', null, global);
goog.exportSymbol('proto.api.MulticastGroupQueueItem', null, global);
goog.exportSymbol('proto.api.MulticastGroupSchedulingType', null, global);
goog.exportSymbol('proto.api.MulticastGroupType', null, global);
goog.exportSymbol('proto.api.RemoveDeviceFromMulticastGroupRequest', null, global);
goog.exportSymbol('proto.api.RemoveGatewayFromMulticastGroupRequest', null, global);
goog.exportSymbol('proto.api.UpdateMulticastGroupRequest', null, global);
/**
* Generated by JsPbCodeGenerator.
@ -291,6 +294,48 @@ if (goog.DEBUG && !COMPILED) {
*/
proto.api.RemoveDeviceFromMulticastGroupRequest.displayName = 'proto.api.RemoveDeviceFromMulticastGroupRequest';
}
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
* server response, or constructed directly in Javascript. The array is used
* in place and becomes part of the constructed object. It is not cloned.
* If no data is provided, the constructed object will be empty, but still
* valid.
* @extends {jspb.Message}
* @constructor
*/
proto.api.AddGatewayToMulticastGroupRequest = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.api.AddGatewayToMulticastGroupRequest, jspb.Message);
if (goog.DEBUG && !COMPILED) {
/**
* @public
* @override
*/
proto.api.AddGatewayToMulticastGroupRequest.displayName = 'proto.api.AddGatewayToMulticastGroupRequest';
}
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
* server response, or constructed directly in Javascript. The array is used
* in place and becomes part of the constructed object. It is not cloned.
* If no data is provided, the constructed object will be empty, but still
* valid.
* @extends {jspb.Message}
* @constructor
*/
proto.api.RemoveGatewayFromMulticastGroupRequest = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.api.RemoveGatewayFromMulticastGroupRequest, jspb.Message);
if (goog.DEBUG && !COMPILED) {
/**
* @public
* @override
*/
proto.api.RemoveGatewayFromMulticastGroupRequest.displayName = 'proto.api.RemoveGatewayFromMulticastGroupRequest';
}
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
@ -460,7 +505,8 @@ proto.api.MulticastGroup.toObject = function(includeInstance, msg) {
groupType: jspb.Message.getFieldWithDefault(msg, 9, 0),
dr: jspb.Message.getFieldWithDefault(msg, 10, 0),
frequency: jspb.Message.getFieldWithDefault(msg, 11, 0),
classBPingSlotPeriod: jspb.Message.getFieldWithDefault(msg, 12, 0)
classBPingSlotPeriod: jspb.Message.getFieldWithDefault(msg, 12, 0),
classCSchedulingType: jspb.Message.getFieldWithDefault(msg, 13, 0)
};
if (includeInstance) {
@ -545,6 +591,10 @@ proto.api.MulticastGroup.deserializeBinaryFromReader = function(msg, reader) {
var value = /** @type {number} */ (reader.readUint32());
msg.setClassBPingSlotPeriod(value);
break;
case 13:
var value = /** @type {!proto.api.MulticastGroupSchedulingType} */ (reader.readEnum());
msg.setClassCSchedulingType(value);
break;
default:
reader.skipField();
break;
@ -658,6 +708,13 @@ proto.api.MulticastGroup.serializeBinaryToWriter = function(message, writer) {
f
);
}
f = message.getClassCSchedulingType();
if (f !== 0.0) {
writer.writeEnum(
13,
f
);
}
};
@ -877,6 +934,24 @@ proto.api.MulticastGroup.prototype.setClassBPingSlotPeriod = function(value) {
};
/**
* optional MulticastGroupSchedulingType class_c_scheduling_type = 13;
* @return {!proto.api.MulticastGroupSchedulingType}
*/
proto.api.MulticastGroup.prototype.getClassCSchedulingType = function() {
return /** @type {!proto.api.MulticastGroupSchedulingType} */ (jspb.Message.getFieldWithDefault(this, 13, 0));
};
/**
* @param {!proto.api.MulticastGroupSchedulingType} value
* @return {!proto.api.MulticastGroup} returns this
*/
proto.api.MulticastGroup.prototype.setClassCSchedulingType = function(value) {
return jspb.Message.setProto3EnumField(this, 13, value);
};
@ -2877,6 +2952,326 @@ proto.api.RemoveDeviceFromMulticastGroupRequest.prototype.setDevEui = function(v
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
* Field names that are reserved in JavaScript and will be renamed to pb_name.
* Optional fields that are not set will be set to undefined.
* To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
* For the list of reserved names please see:
* net/proto2/compiler/js/internal/generator.cc#kKeyword.
* @param {boolean=} opt_includeInstance Deprecated. whether to include the
* JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @return {!Object}
*/
proto.api.AddGatewayToMulticastGroupRequest.prototype.toObject = function(opt_includeInstance) {
return proto.api.AddGatewayToMulticastGroupRequest.toObject(opt_includeInstance, this);
};
/**
* Static version of the {@see toObject} method.
* @param {boolean|undefined} includeInstance Deprecated. Whether to include
* the JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @param {!proto.api.AddGatewayToMulticastGroupRequest} msg The msg instance to transform.
* @return {!Object}
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.api.AddGatewayToMulticastGroupRequest.toObject = function(includeInstance, msg) {
var f, obj = {
multicastGroupId: jspb.Message.getFieldWithDefault(msg, 1, ""),
gatewayId: jspb.Message.getFieldWithDefault(msg, 2, "")
};
if (includeInstance) {
obj.$jspbMessageInstance = msg;
}
return obj;
};
}
/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
* @return {!proto.api.AddGatewayToMulticastGroupRequest}
*/
proto.api.AddGatewayToMulticastGroupRequest.deserializeBinary = function(bytes) {
var reader = new jspb.BinaryReader(bytes);
var msg = new proto.api.AddGatewayToMulticastGroupRequest;
return proto.api.AddGatewayToMulticastGroupRequest.deserializeBinaryFromReader(msg, reader);
};
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
* @param {!proto.api.AddGatewayToMulticastGroupRequest} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
* @return {!proto.api.AddGatewayToMulticastGroupRequest}
*/
proto.api.AddGatewayToMulticastGroupRequest.deserializeBinaryFromReader = function(msg, reader) {
while (reader.nextField()) {
if (reader.isEndGroup()) {
break;
}
var field = reader.getFieldNumber();
switch (field) {
case 1:
var value = /** @type {string} */ (reader.readString());
msg.setMulticastGroupId(value);
break;
case 2:
var value = /** @type {string} */ (reader.readString());
msg.setGatewayId(value);
break;
default:
reader.skipField();
break;
}
}
return msg;
};
/**
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
proto.api.AddGatewayToMulticastGroupRequest.prototype.serializeBinary = function() {
var writer = new jspb.BinaryWriter();
proto.api.AddGatewayToMulticastGroupRequest.serializeBinaryToWriter(this, writer);
return writer.getResultBuffer();
};
/**
* Serializes the given message to binary data (in protobuf wire
* format), writing to the given BinaryWriter.
* @param {!proto.api.AddGatewayToMulticastGroupRequest} message
* @param {!jspb.BinaryWriter} writer
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.api.AddGatewayToMulticastGroupRequest.serializeBinaryToWriter = function(message, writer) {
var f = undefined;
f = message.getMulticastGroupId();
if (f.length > 0) {
writer.writeString(
1,
f
);
}
f = message.getGatewayId();
if (f.length > 0) {
writer.writeString(
2,
f
);
}
};
/**
* optional string multicast_group_id = 1;
* @return {string}
*/
proto.api.AddGatewayToMulticastGroupRequest.prototype.getMulticastGroupId = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
};
/**
* @param {string} value
* @return {!proto.api.AddGatewayToMulticastGroupRequest} returns this
*/
proto.api.AddGatewayToMulticastGroupRequest.prototype.setMulticastGroupId = function(value) {
return jspb.Message.setProto3StringField(this, 1, value);
};
/**
* optional string gateway_id = 2;
* @return {string}
*/
proto.api.AddGatewayToMulticastGroupRequest.prototype.getGatewayId = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
};
/**
* @param {string} value
* @return {!proto.api.AddGatewayToMulticastGroupRequest} returns this
*/
proto.api.AddGatewayToMulticastGroupRequest.prototype.setGatewayId = function(value) {
return jspb.Message.setProto3StringField(this, 2, value);
};
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
* Field names that are reserved in JavaScript and will be renamed to pb_name.
* Optional fields that are not set will be set to undefined.
* To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
* For the list of reserved names please see:
* net/proto2/compiler/js/internal/generator.cc#kKeyword.
* @param {boolean=} opt_includeInstance Deprecated. whether to include the
* JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @return {!Object}
*/
proto.api.RemoveGatewayFromMulticastGroupRequest.prototype.toObject = function(opt_includeInstance) {
return proto.api.RemoveGatewayFromMulticastGroupRequest.toObject(opt_includeInstance, this);
};
/**
* Static version of the {@see toObject} method.
* @param {boolean|undefined} includeInstance Deprecated. Whether to include
* the JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @param {!proto.api.RemoveGatewayFromMulticastGroupRequest} msg The msg instance to transform.
* @return {!Object}
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.api.RemoveGatewayFromMulticastGroupRequest.toObject = function(includeInstance, msg) {
var f, obj = {
multicastGroupId: jspb.Message.getFieldWithDefault(msg, 1, ""),
gatewayId: jspb.Message.getFieldWithDefault(msg, 2, "")
};
if (includeInstance) {
obj.$jspbMessageInstance = msg;
}
return obj;
};
}
/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
* @return {!proto.api.RemoveGatewayFromMulticastGroupRequest}
*/
proto.api.RemoveGatewayFromMulticastGroupRequest.deserializeBinary = function(bytes) {
var reader = new jspb.BinaryReader(bytes);
var msg = new proto.api.RemoveGatewayFromMulticastGroupRequest;
return proto.api.RemoveGatewayFromMulticastGroupRequest.deserializeBinaryFromReader(msg, reader);
};
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
* @param {!proto.api.RemoveGatewayFromMulticastGroupRequest} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
* @return {!proto.api.RemoveGatewayFromMulticastGroupRequest}
*/
proto.api.RemoveGatewayFromMulticastGroupRequest.deserializeBinaryFromReader = function(msg, reader) {
while (reader.nextField()) {
if (reader.isEndGroup()) {
break;
}
var field = reader.getFieldNumber();
switch (field) {
case 1:
var value = /** @type {string} */ (reader.readString());
msg.setMulticastGroupId(value);
break;
case 2:
var value = /** @type {string} */ (reader.readString());
msg.setGatewayId(value);
break;
default:
reader.skipField();
break;
}
}
return msg;
};
/**
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
proto.api.RemoveGatewayFromMulticastGroupRequest.prototype.serializeBinary = function() {
var writer = new jspb.BinaryWriter();
proto.api.RemoveGatewayFromMulticastGroupRequest.serializeBinaryToWriter(this, writer);
return writer.getResultBuffer();
};
/**
* Serializes the given message to binary data (in protobuf wire
* format), writing to the given BinaryWriter.
* @param {!proto.api.RemoveGatewayFromMulticastGroupRequest} message
* @param {!jspb.BinaryWriter} writer
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.api.RemoveGatewayFromMulticastGroupRequest.serializeBinaryToWriter = function(message, writer) {
var f = undefined;
f = message.getMulticastGroupId();
if (f.length > 0) {
writer.writeString(
1,
f
);
}
f = message.getGatewayId();
if (f.length > 0) {
writer.writeString(
2,
f
);
}
};
/**
* optional string multicast_group_id = 1;
* @return {string}
*/
proto.api.RemoveGatewayFromMulticastGroupRequest.prototype.getMulticastGroupId = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
};
/**
* @param {string} value
* @return {!proto.api.RemoveGatewayFromMulticastGroupRequest} returns this
*/
proto.api.RemoveGatewayFromMulticastGroupRequest.prototype.setMulticastGroupId = function(value) {
return jspb.Message.setProto3StringField(this, 1, value);
};
/**
* optional string gateway_id = 2;
* @return {string}
*/
proto.api.RemoveGatewayFromMulticastGroupRequest.prototype.getGatewayId = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
};
/**
* @param {string} value
* @return {!proto.api.RemoveGatewayFromMulticastGroupRequest} returns this
*/
proto.api.RemoveGatewayFromMulticastGroupRequest.prototype.setGatewayId = function(value) {
return jspb.Message.setProto3StringField(this, 2, value);
};
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
@ -3827,4 +4222,12 @@ proto.api.MulticastGroupType = {
CLASS_B: 1
};
/**
* @enum {number}
*/
proto.api.MulticastGroupSchedulingType = {
DELAY: 0,
GPS_TIME: 1
};
goog.object.extend(exports, proto.api);

View File

@ -255,6 +255,9 @@ export class ListGatewaysRequest extends jspb.Message {
getTenantId(): string;
setTenantId(value: string): void;
getMulticastGroupId(): string;
setMulticastGroupId(value: string): void;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): ListGatewaysRequest.AsObject;
static toObject(includeInstance: boolean, msg: ListGatewaysRequest): ListGatewaysRequest.AsObject;
@ -271,6 +274,7 @@ export namespace ListGatewaysRequest {
offset: number,
search: string,
tenantId: string,
multicastGroupId: string,
}
}

View File

@ -2062,7 +2062,8 @@ proto.api.ListGatewaysRequest.toObject = function(includeInstance, msg) {
limit: jspb.Message.getFieldWithDefault(msg, 1, 0),
offset: jspb.Message.getFieldWithDefault(msg, 2, 0),
search: jspb.Message.getFieldWithDefault(msg, 3, ""),
tenantId: jspb.Message.getFieldWithDefault(msg, 4, "")
tenantId: jspb.Message.getFieldWithDefault(msg, 4, ""),
multicastGroupId: jspb.Message.getFieldWithDefault(msg, 5, "")
};
if (includeInstance) {
@ -2115,6 +2116,10 @@ proto.api.ListGatewaysRequest.deserializeBinaryFromReader = function(msg, reader
var value = /** @type {string} */ (reader.readString());
msg.setTenantId(value);
break;
case 5:
var value = /** @type {string} */ (reader.readString());
msg.setMulticastGroupId(value);
break;
default:
reader.skipField();
break;
@ -2172,6 +2177,13 @@ proto.api.ListGatewaysRequest.serializeBinaryToWriter = function(message, writer
f
);
}
f = message.getMulticastGroupId();
if (f.length > 0) {
writer.writeString(
5,
f
);
}
};
@ -2247,6 +2259,24 @@ proto.api.ListGatewaysRequest.prototype.setTenantId = function(value) {
};
/**
* optional string multicast_group_id = 5;
* @return {string}
*/
proto.api.ListGatewaysRequest.prototype.getMulticastGroupId = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, ""));
};
/**
* @param {string} value
* @return {!proto.api.ListGatewaysRequest} returns this
*/
proto.api.ListGatewaysRequest.prototype.setMulticastGroupId = function(value) {
return jspb.Message.setProto3StringField(this, 5, value);
};
/**
* List of repeated fields within this message type.

View File

@ -15,6 +15,8 @@ interface IMulticastGroupServiceService extends grpc.ServiceDefinition<grpc.Unty
list: grpc.MethodDefinition<api_multicast_group_pb.ListMulticastGroupsRequest, api_multicast_group_pb.ListMulticastGroupsResponse>;
addDevice: grpc.MethodDefinition<api_multicast_group_pb.AddDeviceToMulticastGroupRequest, google_protobuf_empty_pb.Empty>;
removeDevice: grpc.MethodDefinition<api_multicast_group_pb.RemoveDeviceFromMulticastGroupRequest, google_protobuf_empty_pb.Empty>;
addGateway: grpc.MethodDefinition<api_multicast_group_pb.AddGatewayToMulticastGroupRequest, google_protobuf_empty_pb.Empty>;
removeGateway: grpc.MethodDefinition<api_multicast_group_pb.RemoveGatewayFromMulticastGroupRequest, google_protobuf_empty_pb.Empty>;
enqueue: grpc.MethodDefinition<api_multicast_group_pb.EnqueueMulticastGroupQueueItemRequest, api_multicast_group_pb.EnqueueMulticastGroupQueueItemResponse>;
flushQueue: grpc.MethodDefinition<api_multicast_group_pb.FlushMulticastGroupQueueRequest, google_protobuf_empty_pb.Empty>;
listQueue: grpc.MethodDefinition<api_multicast_group_pb.ListMulticastGroupQueueRequest, api_multicast_group_pb.ListMulticastGroupQueueResponse>;
@ -30,6 +32,8 @@ export interface IMulticastGroupServiceServer extends grpc.UntypedServiceImpleme
list: grpc.handleUnaryCall<api_multicast_group_pb.ListMulticastGroupsRequest, api_multicast_group_pb.ListMulticastGroupsResponse>;
addDevice: grpc.handleUnaryCall<api_multicast_group_pb.AddDeviceToMulticastGroupRequest, google_protobuf_empty_pb.Empty>;
removeDevice: grpc.handleUnaryCall<api_multicast_group_pb.RemoveDeviceFromMulticastGroupRequest, google_protobuf_empty_pb.Empty>;
addGateway: grpc.handleUnaryCall<api_multicast_group_pb.AddGatewayToMulticastGroupRequest, google_protobuf_empty_pb.Empty>;
removeGateway: grpc.handleUnaryCall<api_multicast_group_pb.RemoveGatewayFromMulticastGroupRequest, google_protobuf_empty_pb.Empty>;
enqueue: grpc.handleUnaryCall<api_multicast_group_pb.EnqueueMulticastGroupQueueItemRequest, api_multicast_group_pb.EnqueueMulticastGroupQueueItemResponse>;
flushQueue: grpc.handleUnaryCall<api_multicast_group_pb.FlushMulticastGroupQueueRequest, google_protobuf_empty_pb.Empty>;
listQueue: grpc.handleUnaryCall<api_multicast_group_pb.ListMulticastGroupQueueRequest, api_multicast_group_pb.ListMulticastGroupQueueResponse>;
@ -58,6 +62,12 @@ export class MulticastGroupServiceClient extends grpc.Client {
removeDevice(argument: api_multicast_group_pb.RemoveDeviceFromMulticastGroupRequest, callback: grpc.requestCallback<google_protobuf_empty_pb.Empty>): grpc.ClientUnaryCall;
removeDevice(argument: api_multicast_group_pb.RemoveDeviceFromMulticastGroupRequest, metadataOrOptions: grpc.Metadata | grpc.CallOptions | null, callback: grpc.requestCallback<google_protobuf_empty_pb.Empty>): grpc.ClientUnaryCall;
removeDevice(argument: api_multicast_group_pb.RemoveDeviceFromMulticastGroupRequest, metadata: grpc.Metadata | null, options: grpc.CallOptions | null, callback: grpc.requestCallback<google_protobuf_empty_pb.Empty>): grpc.ClientUnaryCall;
addGateway(argument: api_multicast_group_pb.AddGatewayToMulticastGroupRequest, callback: grpc.requestCallback<google_protobuf_empty_pb.Empty>): grpc.ClientUnaryCall;
addGateway(argument: api_multicast_group_pb.AddGatewayToMulticastGroupRequest, metadataOrOptions: grpc.Metadata | grpc.CallOptions | null, callback: grpc.requestCallback<google_protobuf_empty_pb.Empty>): grpc.ClientUnaryCall;
addGateway(argument: api_multicast_group_pb.AddGatewayToMulticastGroupRequest, metadata: grpc.Metadata | null, options: grpc.CallOptions | null, callback: grpc.requestCallback<google_protobuf_empty_pb.Empty>): grpc.ClientUnaryCall;
removeGateway(argument: api_multicast_group_pb.RemoveGatewayFromMulticastGroupRequest, callback: grpc.requestCallback<google_protobuf_empty_pb.Empty>): grpc.ClientUnaryCall;
removeGateway(argument: api_multicast_group_pb.RemoveGatewayFromMulticastGroupRequest, metadataOrOptions: grpc.Metadata | grpc.CallOptions | null, callback: grpc.requestCallback<google_protobuf_empty_pb.Empty>): grpc.ClientUnaryCall;
removeGateway(argument: api_multicast_group_pb.RemoveGatewayFromMulticastGroupRequest, metadata: grpc.Metadata | null, options: grpc.CallOptions | null, callback: grpc.requestCallback<google_protobuf_empty_pb.Empty>): grpc.ClientUnaryCall;
enqueue(argument: api_multicast_group_pb.EnqueueMulticastGroupQueueItemRequest, callback: grpc.requestCallback<api_multicast_group_pb.EnqueueMulticastGroupQueueItemResponse>): grpc.ClientUnaryCall;
enqueue(argument: api_multicast_group_pb.EnqueueMulticastGroupQueueItemRequest, metadataOrOptions: grpc.Metadata | grpc.CallOptions | null, callback: grpc.requestCallback<api_multicast_group_pb.EnqueueMulticastGroupQueueItemResponse>): grpc.ClientUnaryCall;
enqueue(argument: api_multicast_group_pb.EnqueueMulticastGroupQueueItemRequest, metadata: grpc.Metadata | null, options: grpc.CallOptions | null, callback: grpc.requestCallback<api_multicast_group_pb.EnqueueMulticastGroupQueueItemResponse>): grpc.ClientUnaryCall;

View File

@ -19,6 +19,17 @@ function deserialize_api_AddDeviceToMulticastGroupRequest(buffer_arg) {
return api_multicast_group_pb.AddDeviceToMulticastGroupRequest.deserializeBinary(new Uint8Array(buffer_arg));
}
function serialize_api_AddGatewayToMulticastGroupRequest(arg) {
if (!(arg instanceof api_multicast_group_pb.AddGatewayToMulticastGroupRequest)) {
throw new Error('Expected argument of type api.AddGatewayToMulticastGroupRequest');
}
return Buffer.from(arg.serializeBinary());
}
function deserialize_api_AddGatewayToMulticastGroupRequest(buffer_arg) {
return api_multicast_group_pb.AddGatewayToMulticastGroupRequest.deserializeBinary(new Uint8Array(buffer_arg));
}
function serialize_api_CreateMulticastGroupRequest(arg) {
if (!(arg instanceof api_multicast_group_pb.CreateMulticastGroupRequest)) {
throw new Error('Expected argument of type api.CreateMulticastGroupRequest');
@ -162,6 +173,17 @@ function deserialize_api_RemoveDeviceFromMulticastGroupRequest(buffer_arg) {
return api_multicast_group_pb.RemoveDeviceFromMulticastGroupRequest.deserializeBinary(new Uint8Array(buffer_arg));
}
function serialize_api_RemoveGatewayFromMulticastGroupRequest(arg) {
if (!(arg instanceof api_multicast_group_pb.RemoveGatewayFromMulticastGroupRequest)) {
throw new Error('Expected argument of type api.RemoveGatewayFromMulticastGroupRequest');
}
return Buffer.from(arg.serializeBinary());
}
function deserialize_api_RemoveGatewayFromMulticastGroupRequest(buffer_arg) {
return api_multicast_group_pb.RemoveGatewayFromMulticastGroupRequest.deserializeBinary(new Uint8Array(buffer_arg));
}
function serialize_api_UpdateMulticastGroupRequest(arg) {
if (!(arg instanceof api_multicast_group_pb.UpdateMulticastGroupRequest)) {
throw new Error('Expected argument of type api.UpdateMulticastGroupRequest');
@ -271,7 +293,31 @@ removeDevice: {
responseSerialize: serialize_google_protobuf_Empty,
responseDeserialize: deserialize_google_protobuf_Empty,
},
// Add the given item to the multcast group queue.
// Add a gateway to the multicast group.
addGateway: {
path: '/api.MulticastGroupService/AddGateway',
requestStream: false,
responseStream: false,
requestType: api_multicast_group_pb.AddGatewayToMulticastGroupRequest,
responseType: google_protobuf_empty_pb.Empty,
requestSerialize: serialize_api_AddGatewayToMulticastGroupRequest,
requestDeserialize: deserialize_api_AddGatewayToMulticastGroupRequest,
responseSerialize: serialize_google_protobuf_Empty,
responseDeserialize: deserialize_google_protobuf_Empty,
},
// Remove a gateway from the multicast group.
removeGateway: {
path: '/api.MulticastGroupService/RemoveGateway',
requestStream: false,
responseStream: false,
requestType: api_multicast_group_pb.RemoveGatewayFromMulticastGroupRequest,
responseType: google_protobuf_empty_pb.Empty,
requestSerialize: serialize_api_RemoveGatewayFromMulticastGroupRequest,
requestDeserialize: deserialize_api_RemoveGatewayFromMulticastGroupRequest,
responseSerialize: serialize_google_protobuf_Empty,
responseDeserialize: deserialize_google_protobuf_Empty,
},
// Add the given item to the multicast group queue.
enqueue: {
path: '/api.MulticastGroupService/Enqueue',
requestStream: false,

View File

@ -44,6 +44,9 @@ export class MulticastGroup extends jspb.Message {
getClassBPingSlotPeriod(): number;
setClassBPingSlotPeriod(value: number): void;
getClassCSchedulingType(): MulticastGroupSchedulingTypeMap[keyof MulticastGroupSchedulingTypeMap];
setClassCSchedulingType(value: MulticastGroupSchedulingTypeMap[keyof MulticastGroupSchedulingTypeMap]): void;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): MulticastGroup.AsObject;
static toObject(includeInstance: boolean, msg: MulticastGroup): MulticastGroup.AsObject;
@ -68,6 +71,7 @@ export namespace MulticastGroup {
dr: number,
frequency: number,
classBPingSlotPeriod: number,
classCSchedulingType: MulticastGroupSchedulingTypeMap[keyof MulticastGroupSchedulingTypeMap],
}
}
@ -359,6 +363,54 @@ export namespace RemoveDeviceFromMulticastGroupRequest {
}
}
export class AddGatewayToMulticastGroupRequest extends jspb.Message {
getMulticastGroupId(): string;
setMulticastGroupId(value: string): void;
getGatewayId(): string;
setGatewayId(value: string): void;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): AddGatewayToMulticastGroupRequest.AsObject;
static toObject(includeInstance: boolean, msg: AddGatewayToMulticastGroupRequest): AddGatewayToMulticastGroupRequest.AsObject;
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: AddGatewayToMulticastGroupRequest, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): AddGatewayToMulticastGroupRequest;
static deserializeBinaryFromReader(message: AddGatewayToMulticastGroupRequest, reader: jspb.BinaryReader): AddGatewayToMulticastGroupRequest;
}
export namespace AddGatewayToMulticastGroupRequest {
export type AsObject = {
multicastGroupId: string,
gatewayId: string,
}
}
export class RemoveGatewayFromMulticastGroupRequest extends jspb.Message {
getMulticastGroupId(): string;
setMulticastGroupId(value: string): void;
getGatewayId(): string;
setGatewayId(value: string): void;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): RemoveGatewayFromMulticastGroupRequest.AsObject;
static toObject(includeInstance: boolean, msg: RemoveGatewayFromMulticastGroupRequest): RemoveGatewayFromMulticastGroupRequest.AsObject;
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: RemoveGatewayFromMulticastGroupRequest, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): RemoveGatewayFromMulticastGroupRequest;
static deserializeBinaryFromReader(message: RemoveGatewayFromMulticastGroupRequest, reader: jspb.BinaryReader): RemoveGatewayFromMulticastGroupRequest;
}
export namespace RemoveGatewayFromMulticastGroupRequest {
export type AsObject = {
multicastGroupId: string,
gatewayId: string,
}
}
export class MulticastGroupQueueItem extends jspb.Message {
getMulticastGroupId(): string;
setMulticastGroupId(value: string): void;
@ -504,3 +556,10 @@ export interface MulticastGroupTypeMap {
export const MulticastGroupType: MulticastGroupTypeMap;
export interface MulticastGroupSchedulingTypeMap {
DELAY: 0;
GPS_TIME: 1;
}
export const MulticastGroupSchedulingType: MulticastGroupSchedulingTypeMap;

View File

@ -21,6 +21,7 @@ goog.object.extend(proto, google_protobuf_empty_pb);
var common_common_pb = require('../common/common_pb.js');
goog.object.extend(proto, common_common_pb);
goog.exportSymbol('proto.api.AddDeviceToMulticastGroupRequest', null, global);
goog.exportSymbol('proto.api.AddGatewayToMulticastGroupRequest', null, global);
goog.exportSymbol('proto.api.CreateMulticastGroupRequest', null, global);
goog.exportSymbol('proto.api.CreateMulticastGroupResponse', null, global);
goog.exportSymbol('proto.api.DeleteMulticastGroupRequest', null, global);
@ -36,8 +37,10 @@ goog.exportSymbol('proto.api.ListMulticastGroupsResponse', null, global);
goog.exportSymbol('proto.api.MulticastGroup', null, global);
goog.exportSymbol('proto.api.MulticastGroupListItem', null, global);
goog.exportSymbol('proto.api.MulticastGroupQueueItem', null, global);
goog.exportSymbol('proto.api.MulticastGroupSchedulingType', null, global);
goog.exportSymbol('proto.api.MulticastGroupType', null, global);
goog.exportSymbol('proto.api.RemoveDeviceFromMulticastGroupRequest', null, global);
goog.exportSymbol('proto.api.RemoveGatewayFromMulticastGroupRequest', null, global);
goog.exportSymbol('proto.api.UpdateMulticastGroupRequest', null, global);
/**
* Generated by JsPbCodeGenerator.
@ -291,6 +294,48 @@ if (goog.DEBUG && !COMPILED) {
*/
proto.api.RemoveDeviceFromMulticastGroupRequest.displayName = 'proto.api.RemoveDeviceFromMulticastGroupRequest';
}
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
* server response, or constructed directly in Javascript. The array is used
* in place and becomes part of the constructed object. It is not cloned.
* If no data is provided, the constructed object will be empty, but still
* valid.
* @extends {jspb.Message}
* @constructor
*/
proto.api.AddGatewayToMulticastGroupRequest = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.api.AddGatewayToMulticastGroupRequest, jspb.Message);
if (goog.DEBUG && !COMPILED) {
/**
* @public
* @override
*/
proto.api.AddGatewayToMulticastGroupRequest.displayName = 'proto.api.AddGatewayToMulticastGroupRequest';
}
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
* server response, or constructed directly in Javascript. The array is used
* in place and becomes part of the constructed object. It is not cloned.
* If no data is provided, the constructed object will be empty, but still
* valid.
* @extends {jspb.Message}
* @constructor
*/
proto.api.RemoveGatewayFromMulticastGroupRequest = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.api.RemoveGatewayFromMulticastGroupRequest, jspb.Message);
if (goog.DEBUG && !COMPILED) {
/**
* @public
* @override
*/
proto.api.RemoveGatewayFromMulticastGroupRequest.displayName = 'proto.api.RemoveGatewayFromMulticastGroupRequest';
}
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
@ -460,7 +505,8 @@ proto.api.MulticastGroup.toObject = function(includeInstance, msg) {
groupType: jspb.Message.getFieldWithDefault(msg, 9, 0),
dr: jspb.Message.getFieldWithDefault(msg, 10, 0),
frequency: jspb.Message.getFieldWithDefault(msg, 11, 0),
classBPingSlotPeriod: jspb.Message.getFieldWithDefault(msg, 12, 0)
classBPingSlotPeriod: jspb.Message.getFieldWithDefault(msg, 12, 0),
classCSchedulingType: jspb.Message.getFieldWithDefault(msg, 13, 0)
};
if (includeInstance) {
@ -545,6 +591,10 @@ proto.api.MulticastGroup.deserializeBinaryFromReader = function(msg, reader) {
var value = /** @type {number} */ (reader.readUint32());
msg.setClassBPingSlotPeriod(value);
break;
case 13:
var value = /** @type {!proto.api.MulticastGroupSchedulingType} */ (reader.readEnum());
msg.setClassCSchedulingType(value);
break;
default:
reader.skipField();
break;
@ -658,6 +708,13 @@ proto.api.MulticastGroup.serializeBinaryToWriter = function(message, writer) {
f
);
}
f = message.getClassCSchedulingType();
if (f !== 0.0) {
writer.writeEnum(
13,
f
);
}
};
@ -877,6 +934,24 @@ proto.api.MulticastGroup.prototype.setClassBPingSlotPeriod = function(value) {
};
/**
* optional MulticastGroupSchedulingType class_c_scheduling_type = 13;
* @return {!proto.api.MulticastGroupSchedulingType}
*/
proto.api.MulticastGroup.prototype.getClassCSchedulingType = function() {
return /** @type {!proto.api.MulticastGroupSchedulingType} */ (jspb.Message.getFieldWithDefault(this, 13, 0));
};
/**
* @param {!proto.api.MulticastGroupSchedulingType} value
* @return {!proto.api.MulticastGroup} returns this
*/
proto.api.MulticastGroup.prototype.setClassCSchedulingType = function(value) {
return jspb.Message.setProto3EnumField(this, 13, value);
};
@ -2877,6 +2952,326 @@ proto.api.RemoveDeviceFromMulticastGroupRequest.prototype.setDevEui = function(v
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
* Field names that are reserved in JavaScript and will be renamed to pb_name.
* Optional fields that are not set will be set to undefined.
* To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
* For the list of reserved names please see:
* net/proto2/compiler/js/internal/generator.cc#kKeyword.
* @param {boolean=} opt_includeInstance Deprecated. whether to include the
* JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @return {!Object}
*/
proto.api.AddGatewayToMulticastGroupRequest.prototype.toObject = function(opt_includeInstance) {
return proto.api.AddGatewayToMulticastGroupRequest.toObject(opt_includeInstance, this);
};
/**
* Static version of the {@see toObject} method.
* @param {boolean|undefined} includeInstance Deprecated. Whether to include
* the JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @param {!proto.api.AddGatewayToMulticastGroupRequest} msg The msg instance to transform.
* @return {!Object}
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.api.AddGatewayToMulticastGroupRequest.toObject = function(includeInstance, msg) {
var f, obj = {
multicastGroupId: jspb.Message.getFieldWithDefault(msg, 1, ""),
gatewayId: jspb.Message.getFieldWithDefault(msg, 2, "")
};
if (includeInstance) {
obj.$jspbMessageInstance = msg;
}
return obj;
};
}
/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
* @return {!proto.api.AddGatewayToMulticastGroupRequest}
*/
proto.api.AddGatewayToMulticastGroupRequest.deserializeBinary = function(bytes) {
var reader = new jspb.BinaryReader(bytes);
var msg = new proto.api.AddGatewayToMulticastGroupRequest;
return proto.api.AddGatewayToMulticastGroupRequest.deserializeBinaryFromReader(msg, reader);
};
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
* @param {!proto.api.AddGatewayToMulticastGroupRequest} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
* @return {!proto.api.AddGatewayToMulticastGroupRequest}
*/
proto.api.AddGatewayToMulticastGroupRequest.deserializeBinaryFromReader = function(msg, reader) {
while (reader.nextField()) {
if (reader.isEndGroup()) {
break;
}
var field = reader.getFieldNumber();
switch (field) {
case 1:
var value = /** @type {string} */ (reader.readString());
msg.setMulticastGroupId(value);
break;
case 2:
var value = /** @type {string} */ (reader.readString());
msg.setGatewayId(value);
break;
default:
reader.skipField();
break;
}
}
return msg;
};
/**
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
proto.api.AddGatewayToMulticastGroupRequest.prototype.serializeBinary = function() {
var writer = new jspb.BinaryWriter();
proto.api.AddGatewayToMulticastGroupRequest.serializeBinaryToWriter(this, writer);
return writer.getResultBuffer();
};
/**
* Serializes the given message to binary data (in protobuf wire
* format), writing to the given BinaryWriter.
* @param {!proto.api.AddGatewayToMulticastGroupRequest} message
* @param {!jspb.BinaryWriter} writer
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.api.AddGatewayToMulticastGroupRequest.serializeBinaryToWriter = function(message, writer) {
var f = undefined;
f = message.getMulticastGroupId();
if (f.length > 0) {
writer.writeString(
1,
f
);
}
f = message.getGatewayId();
if (f.length > 0) {
writer.writeString(
2,
f
);
}
};
/**
* optional string multicast_group_id = 1;
* @return {string}
*/
proto.api.AddGatewayToMulticastGroupRequest.prototype.getMulticastGroupId = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
};
/**
* @param {string} value
* @return {!proto.api.AddGatewayToMulticastGroupRequest} returns this
*/
proto.api.AddGatewayToMulticastGroupRequest.prototype.setMulticastGroupId = function(value) {
return jspb.Message.setProto3StringField(this, 1, value);
};
/**
* optional string gateway_id = 2;
* @return {string}
*/
proto.api.AddGatewayToMulticastGroupRequest.prototype.getGatewayId = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
};
/**
* @param {string} value
* @return {!proto.api.AddGatewayToMulticastGroupRequest} returns this
*/
proto.api.AddGatewayToMulticastGroupRequest.prototype.setGatewayId = function(value) {
return jspb.Message.setProto3StringField(this, 2, value);
};
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
* Field names that are reserved in JavaScript and will be renamed to pb_name.
* Optional fields that are not set will be set to undefined.
* To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
* For the list of reserved names please see:
* net/proto2/compiler/js/internal/generator.cc#kKeyword.
* @param {boolean=} opt_includeInstance Deprecated. whether to include the
* JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @return {!Object}
*/
proto.api.RemoveGatewayFromMulticastGroupRequest.prototype.toObject = function(opt_includeInstance) {
return proto.api.RemoveGatewayFromMulticastGroupRequest.toObject(opt_includeInstance, this);
};
/**
* Static version of the {@see toObject} method.
* @param {boolean|undefined} includeInstance Deprecated. Whether to include
* the JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @param {!proto.api.RemoveGatewayFromMulticastGroupRequest} msg The msg instance to transform.
* @return {!Object}
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.api.RemoveGatewayFromMulticastGroupRequest.toObject = function(includeInstance, msg) {
var f, obj = {
multicastGroupId: jspb.Message.getFieldWithDefault(msg, 1, ""),
gatewayId: jspb.Message.getFieldWithDefault(msg, 2, "")
};
if (includeInstance) {
obj.$jspbMessageInstance = msg;
}
return obj;
};
}
/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
* @return {!proto.api.RemoveGatewayFromMulticastGroupRequest}
*/
proto.api.RemoveGatewayFromMulticastGroupRequest.deserializeBinary = function(bytes) {
var reader = new jspb.BinaryReader(bytes);
var msg = new proto.api.RemoveGatewayFromMulticastGroupRequest;
return proto.api.RemoveGatewayFromMulticastGroupRequest.deserializeBinaryFromReader(msg, reader);
};
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
* @param {!proto.api.RemoveGatewayFromMulticastGroupRequest} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
* @return {!proto.api.RemoveGatewayFromMulticastGroupRequest}
*/
proto.api.RemoveGatewayFromMulticastGroupRequest.deserializeBinaryFromReader = function(msg, reader) {
while (reader.nextField()) {
if (reader.isEndGroup()) {
break;
}
var field = reader.getFieldNumber();
switch (field) {
case 1:
var value = /** @type {string} */ (reader.readString());
msg.setMulticastGroupId(value);
break;
case 2:
var value = /** @type {string} */ (reader.readString());
msg.setGatewayId(value);
break;
default:
reader.skipField();
break;
}
}
return msg;
};
/**
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
proto.api.RemoveGatewayFromMulticastGroupRequest.prototype.serializeBinary = function() {
var writer = new jspb.BinaryWriter();
proto.api.RemoveGatewayFromMulticastGroupRequest.serializeBinaryToWriter(this, writer);
return writer.getResultBuffer();
};
/**
* Serializes the given message to binary data (in protobuf wire
* format), writing to the given BinaryWriter.
* @param {!proto.api.RemoveGatewayFromMulticastGroupRequest} message
* @param {!jspb.BinaryWriter} writer
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.api.RemoveGatewayFromMulticastGroupRequest.serializeBinaryToWriter = function(message, writer) {
var f = undefined;
f = message.getMulticastGroupId();
if (f.length > 0) {
writer.writeString(
1,
f
);
}
f = message.getGatewayId();
if (f.length > 0) {
writer.writeString(
2,
f
);
}
};
/**
* optional string multicast_group_id = 1;
* @return {string}
*/
proto.api.RemoveGatewayFromMulticastGroupRequest.prototype.getMulticastGroupId = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
};
/**
* @param {string} value
* @return {!proto.api.RemoveGatewayFromMulticastGroupRequest} returns this
*/
proto.api.RemoveGatewayFromMulticastGroupRequest.prototype.setMulticastGroupId = function(value) {
return jspb.Message.setProto3StringField(this, 1, value);
};
/**
* optional string gateway_id = 2;
* @return {string}
*/
proto.api.RemoveGatewayFromMulticastGroupRequest.prototype.getGatewayId = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
};
/**
* @param {string} value
* @return {!proto.api.RemoveGatewayFromMulticastGroupRequest} returns this
*/
proto.api.RemoveGatewayFromMulticastGroupRequest.prototype.setGatewayId = function(value) {
return jspb.Message.setProto3StringField(this, 2, value);
};
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
@ -3827,4 +4222,12 @@ proto.api.MulticastGroupType = {
CLASS_B: 1
};
/**
* @enum {number}
*/
proto.api.MulticastGroupSchedulingType = {
DELAY: 0,
GPS_TIME: 1
};
goog.object.extend(exports, proto.api);

53
api/md/api/api.md vendored
View File

@ -182,6 +182,7 @@
- [api/multicast_group.proto](#api_multicast_group-proto)
- [AddDeviceToMulticastGroupRequest](#api-AddDeviceToMulticastGroupRequest)
- [AddGatewayToMulticastGroupRequest](#api-AddGatewayToMulticastGroupRequest)
- [CreateMulticastGroupRequest](#api-CreateMulticastGroupRequest)
- [CreateMulticastGroupResponse](#api-CreateMulticastGroupResponse)
- [DeleteMulticastGroupRequest](#api-DeleteMulticastGroupRequest)
@ -198,8 +199,10 @@
- [MulticastGroupListItem](#api-MulticastGroupListItem)
- [MulticastGroupQueueItem](#api-MulticastGroupQueueItem)
- [RemoveDeviceFromMulticastGroupRequest](#api-RemoveDeviceFromMulticastGroupRequest)
- [RemoveGatewayFromMulticastGroupRequest](#api-RemoveGatewayFromMulticastGroupRequest)
- [UpdateMulticastGroupRequest](#api-UpdateMulticastGroupRequest)
- [MulticastGroupSchedulingType](#api-MulticastGroupSchedulingType)
- [MulticastGroupType](#api-MulticastGroupType)
- [MulticastGroupService](#api-MulticastGroupService)
@ -2939,6 +2942,7 @@ DeviceProfileService is the service providing API methods for managing device-pr
| offset | [uint32](#uint32) | | Offset in the result-set (for pagination). |
| search | [string](#string) | | If set, the given string will be used to search on name (optional). |
| tenant_id | [string](#string) | | Tenant ID (UUID) to filter gateways on. To list all gateways as a global admin user, this field can be left blank. |
| multicast_group_id | [string](#string) | | Multicast-group ID (UUID) to filter gateways on. |
@ -3037,6 +3041,22 @@ GatewayService is the service providing API methods for managing gateways.
<a name="api-AddGatewayToMulticastGroupRequest"></a>
### AddGatewayToMulticastGroupRequest
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| multicast_group_id | [string](#string) | | Multicast group ID. |
| gateway_id | [string](#string) | | Gateway ID (HEX encoded). |
<a name="api-CreateMulticastGroupRequest"></a>
### CreateMulticastGroupRequest
@ -3243,6 +3263,7 @@ GatewayService is the service providing API methods for managing gateways.
| dr | [uint32](#uint32) | | Data-rate. |
| frequency | [uint32](#uint32) | | Frequency (Hz). |
| class_b_ping_slot_period | [uint32](#uint32) | | Ping-slot period (only for Class-B). |
| class_c_scheduling_type | [MulticastGroupSchedulingType](#api-MulticastGroupSchedulingType) | | Scheduling type (only for Class-C). |
@ -3303,6 +3324,22 @@ GatewayService is the service providing API methods for managing gateways.
<a name="api-RemoveGatewayFromMulticastGroupRequest"></a>
### RemoveGatewayFromMulticastGroupRequest
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| multicast_group_id | [string](#string) | | Multicast group ID. |
| gateway_id | [string](#string) | | Gateway ID (HEX encoded). |
<a name="api-UpdateMulticastGroupRequest"></a>
### UpdateMulticastGroupRequest
@ -3320,6 +3357,18 @@ GatewayService is the service providing API methods for managing gateways.
<a name="api-MulticastGroupSchedulingType"></a>
### MulticastGroupSchedulingType
| Name | Number | Description |
| ---- | ------ | ----------- |
| DELAY | 0 | Delay. If multicast downlinks must be sent through multiple gateways, then these will be sent one by one with a delay between each gateway. |
| GPS_TIME | 1 | Time. If multicast downlinks must be sent through multiple gateways, then these will be sent simultaneously using GPS time synchronization. Note that this does require GPS time-synchronized LoRa gateways. |
<a name="api-MulticastGroupType"></a>
### MulticastGroupType
@ -3350,7 +3399,9 @@ MulticastGroupService is the service managing multicast-groups.
| List | [ListMulticastGroupsRequest](#api-ListMulticastGroupsRequest) | [ListMulticastGroupsResponse](#api-ListMulticastGroupsResponse) | List the available multicast groups. |
| AddDevice | [AddDeviceToMulticastGroupRequest](#api-AddDeviceToMulticastGroupRequest) | [.google.protobuf.Empty](#google-protobuf-Empty) | Add a device to the multicast group. |
| RemoveDevice | [RemoveDeviceFromMulticastGroupRequest](#api-RemoveDeviceFromMulticastGroupRequest) | [.google.protobuf.Empty](#google-protobuf-Empty) | Remove a device from the multicast group. |
| Enqueue | [EnqueueMulticastGroupQueueItemRequest](#api-EnqueueMulticastGroupQueueItemRequest) | [EnqueueMulticastGroupQueueItemResponse](#api-EnqueueMulticastGroupQueueItemResponse) | Add the given item to the multcast group queue. |
| AddGateway | [AddGatewayToMulticastGroupRequest](#api-AddGatewayToMulticastGroupRequest) | [.google.protobuf.Empty](#google-protobuf-Empty) | Add a gateway to the multicast group. |
| RemoveGateway | [RemoveGatewayFromMulticastGroupRequest](#api-RemoveGatewayFromMulticastGroupRequest) | [.google.protobuf.Empty](#google-protobuf-Empty) | Remove a gateway from the multicast group. |
| Enqueue | [EnqueueMulticastGroupQueueItemRequest](#api-EnqueueMulticastGroupQueueItemRequest) | [EnqueueMulticastGroupQueueItemResponse](#api-EnqueueMulticastGroupQueueItemResponse) | Add the given item to the multicast group queue. |
| FlushQueue | [FlushMulticastGroupQueueRequest](#api-FlushMulticastGroupQueueRequest) | [.google.protobuf.Empty](#google-protobuf-Empty) | Flush the queue for the given multicast group. |
| ListQueue | [ListMulticastGroupQueueRequest](#api-ListMulticastGroupQueueRequest) | [ListMulticastGroupQueueResponse](#api-ListMulticastGroupQueueResponse) | List the items in the multicast group queue. |

View File

@ -187,6 +187,9 @@ message ListGatewaysRequest {
// Tenant ID (UUID) to filter gateways on.
// To list all gateways as a global admin user, this field can be left blank.
string tenant_id = 4;
// Multicast-group ID (UUID) to filter gateways on.
string multicast_group_id = 5;
}
message ListGatewaysResponse {

View File

@ -68,6 +68,21 @@ service MulticastGroupService {
};
}
// Add a gateway to the multicast group.
rpc AddGateway(AddGatewayToMulticastGroupRequest) returns (google.protobuf.Empty) {
option(google.api.http) = {
post: "/api/multicast-groups/{multicast_group_id}/gateways"
body: "*"
};
}
// Remove a gateway from the multicast group.
rpc RemoveGateway(RemoveGatewayFromMulticastGroupRequest) returns (google.protobuf.Empty) {
option(google.api.http) = {
delete: "/api/multicast-groups/{multicast_group_id}/gateways/{gateway_id}"
};
}
// Add the given item to the multicast group queue.
rpc Enqueue(EnqueueMulticastGroupQueueItemRequest) returns (EnqueueMulticastGroupQueueItemResponse) {
option(google.api.http) = {
@ -99,6 +114,19 @@ enum MulticastGroupType {
CLASS_B = 1;
}
enum MulticastGroupSchedulingType {
// Delay.
// If multicast downlinks must be sent through multiple gateways, then
// these will be sent one by one with a delay between each gateway.
DELAY = 0;
// Time.
// If multicast downlinks must be sent through multiple gateways, then
// these will be sent simultaneously using GPS time synchronization.
// Note that this does require GPS time-synchronized LoRa gateways.
GPS_TIME = 1;
}
message MulticastGroup {
// ID (UUID).
// This will be generated automatically on create.
@ -137,6 +165,9 @@ message MulticastGroup {
// Ping-slot period (only for Class-B).
uint32 class_b_ping_slot_period = 12;
// Scheduling type (only for Class-C).
MulticastGroupSchedulingType class_c_scheduling_type = 13;
}
message MulticastGroupListItem {
@ -233,6 +264,22 @@ message RemoveDeviceFromMulticastGroupRequest {
string dev_eui = 2;
}
message AddGatewayToMulticastGroupRequest {
// Multicast group ID.
string multicast_group_id = 1;
// Gateway ID (HEX encoded).
string gateway_id = 2;
}
message RemoveGatewayFromMulticastGroupRequest {
// Multicast group ID.
string multicast_group_id = 1;
// Gateway ID (HEX encoded).
string gateway_id = 2;
}
message MulticastGroupQueueItem {
// Multicast group ID.
string multicast_group_id = 1;

View File

@ -6,6 +6,7 @@ option go_package = "github.com/chirpstack/chirpstack/api/go/v4/api";
option java_package = "io.chirpstack.api";
option java_multiple_files = true;
option java_outer_classname = "ApplicationProto";
option csharp_namespace = "Chirpstack.Api";
import "google/api/annotations.proto";
import "google/protobuf/timestamp.proto";

View File

@ -6,6 +6,7 @@ option go_package = "github.com/chirpstack/chirpstack/api/go/v4/api";
option java_package = "io.chirpstack.api";
option java_multiple_files = true;
option java_outer_classname = "DeviceProto";
option csharp_namespace = "Chirpstack.Api";
import "chirpstack-api/common/common.proto";
import "google/api/annotations.proto";

View File

@ -6,6 +6,7 @@ option go_package = "github.com/chirpstack/chirpstack/api/go/v4/api";
option java_package = "io.chirpstack.api";
option java_multiple_files = true;
option java_outer_classname = "DeviceProfileProto";
option csharp_namespace = "Chirpstack.Api";
import "google/api/annotations.proto";
import "google/protobuf/timestamp.proto";

View File

@ -6,6 +6,7 @@ option go_package = "github.com/chirpstack/chirpstack/api/go/v4/api";
option java_package = "io.chirpstack.api";
option java_multiple_files = true;
option java_outer_classname = "DeviceProfileTemplateProto";
option csharp_namespace = "Chirpstack.Api";
import "google/api/annotations.proto";
import "google/protobuf/timestamp.proto";

View File

@ -6,6 +6,7 @@ option go_package = "github.com/chirpstack/chirpstack/api/go/v4/api";
option java_package = "io.chirpstack.api";
option java_multiple_files = true;
option java_outer_classname = "FrameLogProto";
option csharp_namespace = "Chirpstack.Api";
import "google/protobuf/timestamp.proto";
import "chirpstack-api/common/common.proto";

View File

@ -6,6 +6,7 @@ option go_package = "github.com/chirpstack/chirpstack/api/go/v4/api";
option java_package = "io.chirpstack.api";
option java_multiple_files = true;
option java_outer_classname = "GatewayProto";
option csharp_namespace = "Chirpstack.Api";
import "google/api/annotations.proto";
import "google/protobuf/timestamp.proto";
@ -186,6 +187,9 @@ message ListGatewaysRequest {
// Tenant ID (UUID) to filter gateways on.
// To list all gateways as a global admin user, this field can be left blank.
string tenant_id = 4;
// Multicast-group ID (UUID) to filter gateways on.
string multicast_group_id = 5;
}
message ListGatewaysResponse {

View File

@ -6,6 +6,7 @@ option go_package = "github.com/chirpstack/chirpstack/api/go/v4/api";
option java_package = "io.chirpstack.api";
option java_multiple_files = true;
option java_outer_classname = "InternalProto";
option csharp_namespace = "Chirpstack.Api";
import "google/protobuf/timestamp.proto";
import "google/protobuf/empty.proto";

View File

@ -6,6 +6,7 @@ option go_package = "github.com/chirpstack/chirpstack/api/go/v4/api";
option java_package = "io.chirpstack.api";
option java_multiple_files = true;
option java_outer_classname = "MulticastGroupProto";
option csharp_namespace = "Chirpstack.Api";
import "google/api/annotations.proto";
import "google/protobuf/timestamp.proto";
@ -67,10 +68,25 @@ service MulticastGroupService {
};
}
// Add the given item to the multcast group queue.
// Add a gateway to the multicast group.
rpc AddGateway(AddGatewayToMulticastGroupRequest) returns (google.protobuf.Empty) {
option(google.api.http) = {
post: "/api/multicast-groups/{multicast_group_id}/gateways"
body: "*"
};
}
// Remove a gateway from the multicast group.
rpc RemoveGateway(RemoveGatewayFromMulticastGroupRequest) returns (google.protobuf.Empty) {
option(google.api.http) = {
delete: "/api/multicast-groups/{multicast_group_id}/gateways/{gateway_id}"
};
}
// Add the given item to the multicast group queue.
rpc Enqueue(EnqueueMulticastGroupQueueItemRequest) returns (EnqueueMulticastGroupQueueItemResponse) {
option(google.api.http) = {
post: "/api/multcast-groups/{queue_item.multicast_group_id}/queue"
post: "/api/multicast-groups/{queue_item.multicast_group_id}/queue"
body: "*"
};
}
@ -98,6 +114,19 @@ enum MulticastGroupType {
CLASS_B = 1;
}
enum MulticastGroupSchedulingType {
// Delay.
// If multicast downlinks must be sent through multiple gateways, then
// these will be sent one by one with a delay between each gateway.
DELAY = 0;
// Time.
// If multicast downlinks must be sent through multiple gateways, then
// these will be sent simultaneously using GPS time synchronization.
// Note that this does require GPS time-synchronized LoRa gateways.
GPS_TIME = 1;
}
message MulticastGroup {
// ID (UUID).
// This will be generated automatically on create.
@ -136,6 +165,9 @@ message MulticastGroup {
// Ping-slot period (only for Class-B).
uint32 class_b_ping_slot_period = 12;
// Scheduling type (only for Class-C).
MulticastGroupSchedulingType class_c_scheduling_type = 13;
}
message MulticastGroupListItem {
@ -232,6 +264,22 @@ message RemoveDeviceFromMulticastGroupRequest {
string dev_eui = 2;
}
message AddGatewayToMulticastGroupRequest {
// Multicast group ID.
string multicast_group_id = 1;
// Gateway ID (HEX encoded).
string gateway_id = 2;
}
message RemoveGatewayFromMulticastGroupRequest {
// Multicast group ID.
string multicast_group_id = 1;
// Gateway ID (HEX encoded).
string gateway_id = 2;
}
message MulticastGroupQueueItem {
// Multicast group ID.
string multicast_group_id = 1;

View File

@ -6,6 +6,7 @@ option go_package = "github.com/chirpstack/chirpstack/api/go/v4/api";
option java_package = "io.chirpstack.api";
option java_multiple_files = true;
option java_outer_classname = "RequestLogProto";
option csharp_namespace = "Chirpstack.Api";
import "google/protobuf/timestamp.proto";
import "chirpstack-api/common/common.proto";

View File

@ -6,6 +6,7 @@ option go_package = "github.com/chirpstack/chirpstack/api/go/v4/api";
option java_package = "io.chirpstack.api";
option java_multiple_files = true;
option java_outer_classname = "TenantProto";
option csharp_namespace = "Chirpstack.Api";
import "google/api/annotations.proto";
import "google/protobuf/timestamp.proto";

View File

@ -6,6 +6,7 @@ option go_package = "github.com/chirpstack/chirpstack/api/go/v4/api";
option java_package = "io.chirpstack.api";
option java_multiple_files = true;
option java_outer_classname = "UserProto";
option csharp_namespace = "Chirpstack.Api";
import "google/api/annotations.proto";
import "google/protobuf/timestamp.proto";

View File

@ -6,6 +6,7 @@ option go_package = "github.com/chirpstack/chirpstack/api/go/v4/common";
option java_package = "io.chirpstack.api";
option java_multiple_files = true;
option java_outer_classname = "CommonProto";
option csharp_namespace = "Chirpstack.Common";
import "google/protobuf/timestamp.proto";

View File

@ -6,6 +6,7 @@ option go_package = "github.com/chirpstack/chirpstack/api/go/v4/gw";
option java_package = "io.chirpstack.api.gw";
option java_multiple_files = true;
option java_outer_classname = "GatewayProto";
option csharp_namespace = "Chirpstack.Gateway";
import "chirpstack-api/common/common.proto";
import "google/protobuf/timestamp.proto";

View File

@ -6,6 +6,7 @@ option go_package = "github.com/brocaar/chirpstack/api/go/v4/integration";
option java_package = "io.chirpstack.api.integration";
option java_multiple_files = true;
option java_outer_classname = "IntegrationProto";
option csharp_namespace = "Chirpstack.Integration";
import "chirpstack-api/common/common.proto";
import "chirpstack-api/gw/gw.proto";

View File

@ -6,6 +6,7 @@ option go_package = "github.com/chirpstack/chirpstack/api/go/v4/meta";
option java_package = "io.chirpstack.api.meta";
option java_multiple_files = true;
option java_outer_classname = "MetaProto";
option csharp_namespace = "Chirpstack.Meta";
import "chirpstack-api/common/common.proto";
import "chirpstack-api/gw/gw.proto";

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -18,14 +18,14 @@ from chirpstack_api.common import common_pb2 as chirpstack__api_dot_common_dot_c
from chirpstack_api.api import device_profile_pb2 as chirpstack__api_dot_api_dot_device__profile__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n0chirpstack-api/api/device_profile_template.proto\x12\x03\x61pi\x1a\x1cgoogle/api/annotations.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\"chirpstack-api/common/common.proto\x1a\'chirpstack-api/api/device_profile.proto\"\xf6\x07\n\x15\x44\x65viceProfileTemplate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\x0e\n\x06vendor\x18\x04 \x01(\t\x12\x10\n\x08\x66irmware\x18\x05 \x01(\t\x12\x1e\n\x06region\x18\x06 \x01(\x0e\x32\x0e.common.Region\x12\'\n\x0bmac_version\x18\x07 \x01(\x0e\x32\x12.common.MacVersion\x12\x36\n\x13reg_params_revision\x18\x08 \x01(\x0e\x32\x19.common.RegParamsRevision\x12\x18\n\x10\x61\x64r_algorithm_id\x18\t \x01(\t\x12\x30\n\x15payload_codec_runtime\x18\n \x01(\x0e\x32\x11.api.CodecRuntime\x12\x1c\n\x14payload_codec_script\x18\x0b \x01(\t\x12\x1f\n\x17\x66lush_queue_on_activate\x18\x0c \x01(\x08\x12\x17\n\x0fuplink_interval\x18\r \x01(\r\x12\"\n\x1a\x64\x65vice_status_req_interval\x18\x0e \x01(\r\x12\x15\n\rsupports_otaa\x18\x0f \x01(\x08\x12\x18\n\x10supports_class_b\x18\x10 \x01(\x08\x12\x18\n\x10supports_class_c\x18\x11 \x01(\x08\x12\x17\n\x0f\x63lass_b_timeout\x18\x12 \x01(\r\x12\x1e\n\x16\x63lass_b_ping_slot_nb_k\x18\x13 \x01(\r\x12\x1c\n\x14\x63lass_b_ping_slot_dr\x18\x14 \x01(\r\x12\x1e\n\x16\x63lass_b_ping_slot_freq\x18\x15 \x01(\r\x12\x17\n\x0f\x63lass_c_timeout\x18\x16 \x01(\r\x12\x15\n\rabp_rx1_delay\x18\x17 \x01(\r\x12\x19\n\x11\x61\x62p_rx1_dr_offset\x18\x18 \x01(\r\x12\x12\n\nabp_rx2_dr\x18\x19 \x01(\r\x12\x14\n\x0c\x61\x62p_rx2_freq\x18\x1a \x01(\r\x12\x32\n\x04tags\x18\x1b \x03(\x0b\x32$.api.DeviceProfileTemplate.TagsEntry\x12\x42\n\x0cmeasurements\x18\x1c \x03(\x0b\x32,.api.DeviceProfileTemplate.MeasurementsEntry\x12 \n\x18\x61uto_detect_measurements\x18\x1d \x01(\x08\x1a+\n\tTagsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a\x45\n\x11MeasurementsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1f\n\x05value\x18\x02 \x01(\x0b\x32\x10.api.Measurement:\x02\x38\x01\"\x87\x03\n\x1d\x44\x65viceProfileTemplateListItem\x12\n\n\x02id\x18\x01 \x01(\t\x12.\n\ncreated_at\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nupdated_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\x0e\n\x06vendor\x18\x05 \x01(\t\x12\x10\n\x08\x66irmware\x18\x06 \x01(\t\x12\x1e\n\x06region\x18\x07 \x01(\x0e\x32\x0e.common.Region\x12\'\n\x0bmac_version\x18\x08 \x01(\x0e\x32\x12.common.MacVersion\x12\x36\n\x13reg_params_revision\x18\t \x01(\x0e\x32\x19.common.RegParamsRevision\x12\x15\n\rsupports_otaa\x18\n \x01(\x08\x12\x18\n\x10supports_class_b\x18\x0b \x01(\x08\x12\x18\n\x10supports_class_c\x18\x0c \x01(\x08\"a\n\"CreateDeviceProfileTemplateRequest\x12;\n\x17\x64\x65vice_profile_template\x18\x01 \x01(\x0b\x32\x1a.api.DeviceProfileTemplate\"-\n\x1fGetDeviceProfileTemplateRequest\x12\n\n\x02id\x18\x01 \x01(\t\"\xbf\x01\n GetDeviceProfileTemplateResponse\x12;\n\x17\x64\x65vice_profile_template\x18\x01 \x01(\x0b\x32\x1a.api.DeviceProfileTemplate\x12.\n\ncreated_at\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nupdated_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"a\n\"UpdateDeviceProfileTemplateRequest\x12;\n\x17\x64\x65vice_profile_template\x18\x01 \x01(\x0b\x32\x1a.api.DeviceProfileTemplate\"0\n\"DeleteDeviceProfileTemplateRequest\x12\n\n\x02id\x18\x01 \x01(\t\"B\n!ListDeviceProfileTemplatesRequest\x12\r\n\x05limit\x18\x01 \x01(\r\x12\x0e\n\x06offset\x18\x02 \x01(\r\"m\n\"ListDeviceProfileTemplatesResponse\x12\x13\n\x0btotal_count\x18\x01 \x01(\r\x12\x32\n\x06result\x18\x02 \x03(\x0b\x32\".api.DeviceProfileTemplateListItem2\x9d\x05\n\x1c\x44\x65viceProfileTemplateService\x12s\n\x06\x43reate\x12\'.api.CreateDeviceProfileTemplateRequest\x1a\x16.google.protobuf.Empty\"(\x82\xd3\xe4\x93\x02\"\"\x1d/api/device-profile-templates:\x01*\x12~\n\x03Get\x12$.api.GetDeviceProfileTemplateRequest\x1a%.api.GetDeviceProfileTemplateResponse\"*\x82\xd3\xe4\x93\x02$\x12\"/api/device-profile-templates/{id}\x12\x90\x01\n\x06Update\x12\'.api.UpdateDeviceProfileTemplateRequest\x1a\x16.google.protobuf.Empty\"E\x82\xd3\xe4\x93\x02?\x1a:/api/device-profile-templates/{device_profile_template.id}:\x01*\x12u\n\x06\x44\x65lete\x12\'.api.DeleteDeviceProfileTemplateRequest\x1a\x16.google.protobuf.Empty\"*\x82\xd3\xe4\x93\x02$*\"/api/device-profile-templates/{id}\x12~\n\x04List\x12&.api.ListDeviceProfileTemplatesRequest\x1a\'.api.ListDeviceProfileTemplatesResponse\"%\x82\xd3\xe4\x93\x02\x1f\x12\x1d/api/device-profile-templatesBa\n\x11io.chirpstack.apiB\x1a\x44\x65viceProfileTemplateProtoP\x01Z.github.com/chirpstack/chirpstack/api/go/v4/apib\x06proto3')
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n0chirpstack-api/api/device_profile_template.proto\x12\x03\x61pi\x1a\x1cgoogle/api/annotations.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\"chirpstack-api/common/common.proto\x1a\'chirpstack-api/api/device_profile.proto\"\xf6\x07\n\x15\x44\x65viceProfileTemplate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\x0e\n\x06vendor\x18\x04 \x01(\t\x12\x10\n\x08\x66irmware\x18\x05 \x01(\t\x12\x1e\n\x06region\x18\x06 \x01(\x0e\x32\x0e.common.Region\x12\'\n\x0bmac_version\x18\x07 \x01(\x0e\x32\x12.common.MacVersion\x12\x36\n\x13reg_params_revision\x18\x08 \x01(\x0e\x32\x19.common.RegParamsRevision\x12\x18\n\x10\x61\x64r_algorithm_id\x18\t \x01(\t\x12\x30\n\x15payload_codec_runtime\x18\n \x01(\x0e\x32\x11.api.CodecRuntime\x12\x1c\n\x14payload_codec_script\x18\x0b \x01(\t\x12\x1f\n\x17\x66lush_queue_on_activate\x18\x0c \x01(\x08\x12\x17\n\x0fuplink_interval\x18\r \x01(\r\x12\"\n\x1a\x64\x65vice_status_req_interval\x18\x0e \x01(\r\x12\x15\n\rsupports_otaa\x18\x0f \x01(\x08\x12\x18\n\x10supports_class_b\x18\x10 \x01(\x08\x12\x18\n\x10supports_class_c\x18\x11 \x01(\x08\x12\x17\n\x0f\x63lass_b_timeout\x18\x12 \x01(\r\x12\x1e\n\x16\x63lass_b_ping_slot_nb_k\x18\x13 \x01(\r\x12\x1c\n\x14\x63lass_b_ping_slot_dr\x18\x14 \x01(\r\x12\x1e\n\x16\x63lass_b_ping_slot_freq\x18\x15 \x01(\r\x12\x17\n\x0f\x63lass_c_timeout\x18\x16 \x01(\r\x12\x15\n\rabp_rx1_delay\x18\x17 \x01(\r\x12\x19\n\x11\x61\x62p_rx1_dr_offset\x18\x18 \x01(\r\x12\x12\n\nabp_rx2_dr\x18\x19 \x01(\r\x12\x14\n\x0c\x61\x62p_rx2_freq\x18\x1a \x01(\r\x12\x32\n\x04tags\x18\x1b \x03(\x0b\x32$.api.DeviceProfileTemplate.TagsEntry\x12\x42\n\x0cmeasurements\x18\x1c \x03(\x0b\x32,.api.DeviceProfileTemplate.MeasurementsEntry\x12 \n\x18\x61uto_detect_measurements\x18\x1d \x01(\x08\x1a+\n\tTagsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a\x45\n\x11MeasurementsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1f\n\x05value\x18\x02 \x01(\x0b\x32\x10.api.Measurement:\x02\x38\x01\"\x87\x03\n\x1d\x44\x65viceProfileTemplateListItem\x12\n\n\x02id\x18\x01 \x01(\t\x12.\n\ncreated_at\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nupdated_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\x0e\n\x06vendor\x18\x05 \x01(\t\x12\x10\n\x08\x66irmware\x18\x06 \x01(\t\x12\x1e\n\x06region\x18\x07 \x01(\x0e\x32\x0e.common.Region\x12\'\n\x0bmac_version\x18\x08 \x01(\x0e\x32\x12.common.MacVersion\x12\x36\n\x13reg_params_revision\x18\t \x01(\x0e\x32\x19.common.RegParamsRevision\x12\x15\n\rsupports_otaa\x18\n \x01(\x08\x12\x18\n\x10supports_class_b\x18\x0b \x01(\x08\x12\x18\n\x10supports_class_c\x18\x0c \x01(\x08\"a\n\"CreateDeviceProfileTemplateRequest\x12;\n\x17\x64\x65vice_profile_template\x18\x01 \x01(\x0b\x32\x1a.api.DeviceProfileTemplate\"-\n\x1fGetDeviceProfileTemplateRequest\x12\n\n\x02id\x18\x01 \x01(\t\"\xbf\x01\n GetDeviceProfileTemplateResponse\x12;\n\x17\x64\x65vice_profile_template\x18\x01 \x01(\x0b\x32\x1a.api.DeviceProfileTemplate\x12.\n\ncreated_at\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nupdated_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"a\n\"UpdateDeviceProfileTemplateRequest\x12;\n\x17\x64\x65vice_profile_template\x18\x01 \x01(\x0b\x32\x1a.api.DeviceProfileTemplate\"0\n\"DeleteDeviceProfileTemplateRequest\x12\n\n\x02id\x18\x01 \x01(\t\"B\n!ListDeviceProfileTemplatesRequest\x12\r\n\x05limit\x18\x01 \x01(\r\x12\x0e\n\x06offset\x18\x02 \x01(\r\"m\n\"ListDeviceProfileTemplatesResponse\x12\x13\n\x0btotal_count\x18\x01 \x01(\r\x12\x32\n\x06result\x18\x02 \x03(\x0b\x32\".api.DeviceProfileTemplateListItem2\x9d\x05\n\x1c\x44\x65viceProfileTemplateService\x12s\n\x06\x43reate\x12\'.api.CreateDeviceProfileTemplateRequest\x1a\x16.google.protobuf.Empty\"(\x82\xd3\xe4\x93\x02\"\"\x1d/api/device-profile-templates:\x01*\x12~\n\x03Get\x12$.api.GetDeviceProfileTemplateRequest\x1a%.api.GetDeviceProfileTemplateResponse\"*\x82\xd3\xe4\x93\x02$\x12\"/api/device-profile-templates/{id}\x12\x90\x01\n\x06Update\x12\'.api.UpdateDeviceProfileTemplateRequest\x1a\x16.google.protobuf.Empty\"E\x82\xd3\xe4\x93\x02?\x1a:/api/device-profile-templates/{device_profile_template.id}:\x01*\x12u\n\x06\x44\x65lete\x12\'.api.DeleteDeviceProfileTemplateRequest\x1a\x16.google.protobuf.Empty\"*\x82\xd3\xe4\x93\x02$*\"/api/device-profile-templates/{id}\x12~\n\x04List\x12&.api.ListDeviceProfileTemplatesRequest\x1a\'.api.ListDeviceProfileTemplatesResponse\"%\x82\xd3\xe4\x93\x02\x1f\x12\x1d/api/device-profile-templatesBr\n\x11io.chirpstack.apiB\x1a\x44\x65viceProfileTemplateProtoP\x01Z.github.com/chirpstack/chirpstack/api/go/v4/api\xaa\x02\x0e\x43hirpstack.Apib\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'chirpstack_api.api.device_profile_template_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\021io.chirpstack.apiB\032DeviceProfileTemplateProtoP\001Z.github.com/chirpstack/chirpstack/api/go/v4/api'
DESCRIPTOR._serialized_options = b'\n\021io.chirpstack.apiB\032DeviceProfileTemplateProtoP\001Z.github.com/chirpstack/chirpstack/api/go/v4/api\252\002\016Chirpstack.Api'
_DEVICEPROFILETEMPLATE_TAGSENTRY._options = None
_DEVICEPROFILETEMPLATE_TAGSENTRY._serialized_options = b'8\001'
_DEVICEPROFILETEMPLATE_MEASUREMENTSENTRY._options = None

View File

@ -16,14 +16,14 @@ from chirpstack_api.common import common_pb2 as chirpstack__api_dot_common_dot_c
from chirpstack_api.gw import gw_pb2 as chirpstack__api_dot_gw_dot_gw__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\"chirpstack-api/api/frame_log.proto\x12\x03\x61pi\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\"chirpstack-api/common/common.proto\x1a\x1a\x63hirpstack-api/gw/gw.proto\"\xf7\x01\n\x0eUplinkFrameLog\x12\x13\n\x0bphy_payload\x18\x01 \x01(\x0c\x12!\n\x07tx_info\x18\x02 \x01(\x0b\x32\x10.gw.UplinkTxInfo\x12!\n\x07rx_info\x18\x03 \x03(\x0b\x32\x10.gw.UplinkRxInfo\x12\x1d\n\x06m_type\x18\x04 \x01(\x0e\x32\r.common.MType\x12\x10\n\x08\x64\x65v_addr\x18\x05 \x01(\t\x12\x0f\n\x07\x64\x65v_eui\x18\x06 \x01(\t\x12(\n\x04time\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1e\n\x16plaintext_mac_commands\x18\x08 \x01(\x08\"\x81\x02\n\x10\x44ownlinkFrameLog\x12(\n\x04time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x13\n\x0bphy_payload\x18\x02 \x01(\x0c\x12#\n\x07tx_info\x18\x03 \x01(\x0b\x32\x12.gw.DownlinkTxInfo\x12\x13\n\x0b\x64ownlink_id\x18\x04 \x01(\r\x12\x12\n\ngateway_id\x18\x05 \x01(\t\x12\x1d\n\x06m_type\x18\x06 \x01(\x0e\x32\r.common.MType\x12\x10\n\x08\x64\x65v_addr\x18\x07 \x01(\t\x12\x0f\n\x07\x64\x65v_eui\x18\x08 \x01(\t\x12\x1e\n\x16plaintext_mac_commands\x18\t \x01(\x08\x42T\n\x11io.chirpstack.apiB\rFrameLogProtoP\x01Z.github.com/chirpstack/chirpstack/api/go/v4/apib\x06proto3')
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\"chirpstack-api/api/frame_log.proto\x12\x03\x61pi\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\"chirpstack-api/common/common.proto\x1a\x1a\x63hirpstack-api/gw/gw.proto\"\xf7\x01\n\x0eUplinkFrameLog\x12\x13\n\x0bphy_payload\x18\x01 \x01(\x0c\x12!\n\x07tx_info\x18\x02 \x01(\x0b\x32\x10.gw.UplinkTxInfo\x12!\n\x07rx_info\x18\x03 \x03(\x0b\x32\x10.gw.UplinkRxInfo\x12\x1d\n\x06m_type\x18\x04 \x01(\x0e\x32\r.common.MType\x12\x10\n\x08\x64\x65v_addr\x18\x05 \x01(\t\x12\x0f\n\x07\x64\x65v_eui\x18\x06 \x01(\t\x12(\n\x04time\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1e\n\x16plaintext_mac_commands\x18\x08 \x01(\x08\"\x81\x02\n\x10\x44ownlinkFrameLog\x12(\n\x04time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x13\n\x0bphy_payload\x18\x02 \x01(\x0c\x12#\n\x07tx_info\x18\x03 \x01(\x0b\x32\x12.gw.DownlinkTxInfo\x12\x13\n\x0b\x64ownlink_id\x18\x04 \x01(\r\x12\x12\n\ngateway_id\x18\x05 \x01(\t\x12\x1d\n\x06m_type\x18\x06 \x01(\x0e\x32\r.common.MType\x12\x10\n\x08\x64\x65v_addr\x18\x07 \x01(\t\x12\x0f\n\x07\x64\x65v_eui\x18\x08 \x01(\t\x12\x1e\n\x16plaintext_mac_commands\x18\t \x01(\x08\x42\x65\n\x11io.chirpstack.apiB\rFrameLogProtoP\x01Z.github.com/chirpstack/chirpstack/api/go/v4/api\xaa\x02\x0e\x43hirpstack.Apib\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'chirpstack_api.api.frame_log_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\021io.chirpstack.apiB\rFrameLogProtoP\001Z.github.com/chirpstack/chirpstack/api/go/v4/api'
DESCRIPTOR._serialized_options = b'\n\021io.chirpstack.apiB\rFrameLogProtoP\001Z.github.com/chirpstack/chirpstack/api/go/v4/api\252\002\016Chirpstack.Api'
_UPLINKFRAMELOG._serialized_start=141
_UPLINKFRAMELOG._serialized_end=388
_DOWNLINKFRAMELOG._serialized_start=391

File diff suppressed because one or more lines are too long

View File

@ -157,16 +157,18 @@ class GetGatewayResponse(_message.Message):
def __init__(self, gateway: _Optional[_Union[Gateway, _Mapping]] = ..., created_at: _Optional[_Union[_timestamp_pb2.Timestamp, _Mapping]] = ..., updated_at: _Optional[_Union[_timestamp_pb2.Timestamp, _Mapping]] = ..., last_seen_at: _Optional[_Union[_timestamp_pb2.Timestamp, _Mapping]] = ...) -> None: ...
class ListGatewaysRequest(_message.Message):
__slots__ = ["limit", "offset", "search", "tenant_id"]
__slots__ = ["limit", "multicast_group_id", "offset", "search", "tenant_id"]
LIMIT_FIELD_NUMBER: _ClassVar[int]
MULTICAST_GROUP_ID_FIELD_NUMBER: _ClassVar[int]
OFFSET_FIELD_NUMBER: _ClassVar[int]
SEARCH_FIELD_NUMBER: _ClassVar[int]
TENANT_ID_FIELD_NUMBER: _ClassVar[int]
limit: int
multicast_group_id: str
offset: int
search: str
tenant_id: str
def __init__(self, limit: _Optional[int] = ..., offset: _Optional[int] = ..., search: _Optional[str] = ..., tenant_id: _Optional[str] = ...) -> None: ...
def __init__(self, limit: _Optional[int] = ..., offset: _Optional[int] = ..., search: _Optional[str] = ..., tenant_id: _Optional[str] = ..., multicast_group_id: _Optional[str] = ...) -> None: ...
class ListGatewaysResponse(_message.Message):
__slots__ = ["result", "total_count"]

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -10,7 +10,9 @@ from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Map
CLASS_B: MulticastGroupType
CLASS_C: MulticastGroupType
DELAY: MulticastGroupSchedulingType
DESCRIPTOR: _descriptor.FileDescriptor
GPS_TIME: MulticastGroupSchedulingType
class AddDeviceToMulticastGroupRequest(_message.Message):
__slots__ = ["dev_eui", "multicast_group_id"]
@ -20,6 +22,14 @@ class AddDeviceToMulticastGroupRequest(_message.Message):
multicast_group_id: str
def __init__(self, multicast_group_id: _Optional[str] = ..., dev_eui: _Optional[str] = ...) -> None: ...
class AddGatewayToMulticastGroupRequest(_message.Message):
__slots__ = ["gateway_id", "multicast_group_id"]
GATEWAY_ID_FIELD_NUMBER: _ClassVar[int]
MULTICAST_GROUP_ID_FIELD_NUMBER: _ClassVar[int]
gateway_id: str
multicast_group_id: str
def __init__(self, multicast_group_id: _Optional[str] = ..., gateway_id: _Optional[str] = ...) -> None: ...
class CreateMulticastGroupRequest(_message.Message):
__slots__ = ["multicast_group"]
MULTICAST_GROUP_FIELD_NUMBER: _ClassVar[int]
@ -105,9 +115,10 @@ class ListMulticastGroupsResponse(_message.Message):
def __init__(self, total_count: _Optional[int] = ..., result: _Optional[_Iterable[_Union[MulticastGroupListItem, _Mapping]]] = ...) -> None: ...
class MulticastGroup(_message.Message):
__slots__ = ["application_id", "class_b_ping_slot_period", "dr", "f_cnt", "frequency", "group_type", "id", "mc_addr", "mc_app_s_key", "mc_nwk_s_key", "name", "region"]
__slots__ = ["application_id", "class_b_ping_slot_period", "class_c_scheduling_type", "dr", "f_cnt", "frequency", "group_type", "id", "mc_addr", "mc_app_s_key", "mc_nwk_s_key", "name", "region"]
APPLICATION_ID_FIELD_NUMBER: _ClassVar[int]
CLASS_B_PING_SLOT_PERIOD_FIELD_NUMBER: _ClassVar[int]
CLASS_C_SCHEDULING_TYPE_FIELD_NUMBER: _ClassVar[int]
DR_FIELD_NUMBER: _ClassVar[int]
FREQUENCY_FIELD_NUMBER: _ClassVar[int]
F_CNT_FIELD_NUMBER: _ClassVar[int]
@ -120,6 +131,7 @@ class MulticastGroup(_message.Message):
REGION_FIELD_NUMBER: _ClassVar[int]
application_id: str
class_b_ping_slot_period: int
class_c_scheduling_type: MulticastGroupSchedulingType
dr: int
f_cnt: int
frequency: int
@ -130,7 +142,7 @@ class MulticastGroup(_message.Message):
mc_nwk_s_key: str
name: str
region: _common_pb2.Region
def __init__(self, id: _Optional[str] = ..., name: _Optional[str] = ..., application_id: _Optional[str] = ..., region: _Optional[_Union[_common_pb2.Region, str]] = ..., mc_addr: _Optional[str] = ..., mc_nwk_s_key: _Optional[str] = ..., mc_app_s_key: _Optional[str] = ..., f_cnt: _Optional[int] = ..., group_type: _Optional[_Union[MulticastGroupType, str]] = ..., dr: _Optional[int] = ..., frequency: _Optional[int] = ..., class_b_ping_slot_period: _Optional[int] = ...) -> None: ...
def __init__(self, id: _Optional[str] = ..., name: _Optional[str] = ..., application_id: _Optional[str] = ..., region: _Optional[_Union[_common_pb2.Region, str]] = ..., mc_addr: _Optional[str] = ..., mc_nwk_s_key: _Optional[str] = ..., mc_app_s_key: _Optional[str] = ..., f_cnt: _Optional[int] = ..., group_type: _Optional[_Union[MulticastGroupType, str]] = ..., dr: _Optional[int] = ..., frequency: _Optional[int] = ..., class_b_ping_slot_period: _Optional[int] = ..., class_c_scheduling_type: _Optional[_Union[MulticastGroupSchedulingType, str]] = ...) -> None: ...
class MulticastGroupListItem(_message.Message):
__slots__ = ["created_at", "group_type", "id", "name", "region", "updated_at"]
@ -168,6 +180,14 @@ class RemoveDeviceFromMulticastGroupRequest(_message.Message):
multicast_group_id: str
def __init__(self, multicast_group_id: _Optional[str] = ..., dev_eui: _Optional[str] = ...) -> None: ...
class RemoveGatewayFromMulticastGroupRequest(_message.Message):
__slots__ = ["gateway_id", "multicast_group_id"]
GATEWAY_ID_FIELD_NUMBER: _ClassVar[int]
MULTICAST_GROUP_ID_FIELD_NUMBER: _ClassVar[int]
gateway_id: str
multicast_group_id: str
def __init__(self, multicast_group_id: _Optional[str] = ..., gateway_id: _Optional[str] = ...) -> None: ...
class UpdateMulticastGroupRequest(_message.Message):
__slots__ = ["multicast_group"]
MULTICAST_GROUP_FIELD_NUMBER: _ClassVar[int]
@ -176,3 +196,6 @@ class UpdateMulticastGroupRequest(_message.Message):
class MulticastGroupType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class MulticastGroupSchedulingType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []

View File

@ -51,6 +51,16 @@ class MulticastGroupServiceStub(object):
request_serializer=chirpstack__api_dot_api_dot_multicast__group__pb2.RemoveDeviceFromMulticastGroupRequest.SerializeToString,
response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
)
self.AddGateway = channel.unary_unary(
'/api.MulticastGroupService/AddGateway',
request_serializer=chirpstack__api_dot_api_dot_multicast__group__pb2.AddGatewayToMulticastGroupRequest.SerializeToString,
response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
)
self.RemoveGateway = channel.unary_unary(
'/api.MulticastGroupService/RemoveGateway',
request_serializer=chirpstack__api_dot_api_dot_multicast__group__pb2.RemoveGatewayFromMulticastGroupRequest.SerializeToString,
response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
)
self.Enqueue = channel.unary_unary(
'/api.MulticastGroupService/Enqueue',
request_serializer=chirpstack__api_dot_api_dot_multicast__group__pb2.EnqueueMulticastGroupQueueItemRequest.SerializeToString,
@ -121,8 +131,22 @@ class MulticastGroupServiceServicer(object):
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def AddGateway(self, request, context):
"""Add a gateway to the multicast group.
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def RemoveGateway(self, request, context):
"""Remove a gateway from the multicast group.
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def Enqueue(self, request, context):
"""Add the given item to the multcast group queue.
"""Add the given item to the multicast group queue.
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
@ -180,6 +204,16 @@ def add_MulticastGroupServiceServicer_to_server(servicer, server):
request_deserializer=chirpstack__api_dot_api_dot_multicast__group__pb2.RemoveDeviceFromMulticastGroupRequest.FromString,
response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
),
'AddGateway': grpc.unary_unary_rpc_method_handler(
servicer.AddGateway,
request_deserializer=chirpstack__api_dot_api_dot_multicast__group__pb2.AddGatewayToMulticastGroupRequest.FromString,
response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
),
'RemoveGateway': grpc.unary_unary_rpc_method_handler(
servicer.RemoveGateway,
request_deserializer=chirpstack__api_dot_api_dot_multicast__group__pb2.RemoveGatewayFromMulticastGroupRequest.FromString,
response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
),
'Enqueue': grpc.unary_unary_rpc_method_handler(
servicer.Enqueue,
request_deserializer=chirpstack__api_dot_api_dot_multicast__group__pb2.EnqueueMulticastGroupQueueItemRequest.FromString,
@ -325,6 +359,40 @@ class MulticastGroupService(object):
options, channel_credentials,
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
@staticmethod
def AddGateway(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(request, target, '/api.MulticastGroupService/AddGateway',
chirpstack__api_dot_api_dot_multicast__group__pb2.AddGatewayToMulticastGroupRequest.SerializeToString,
google_dot_protobuf_dot_empty__pb2.Empty.FromString,
options, channel_credentials,
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
@staticmethod
def RemoveGateway(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(request, target, '/api.MulticastGroupService/RemoveGateway',
chirpstack__api_dot_api_dot_multicast__group__pb2.RemoveGatewayFromMulticastGroupRequest.SerializeToString,
google_dot_protobuf_dot_empty__pb2.Empty.FromString,
options, channel_credentials,
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
@staticmethod
def Enqueue(request,
target,

View File

@ -16,14 +16,14 @@ from chirpstack_api.common import common_pb2 as chirpstack__api_dot_common_dot_c
from chirpstack_api.gw import gw_pb2 as chirpstack__api_dot_gw_dot_gw__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$chirpstack-api/api/request_log.proto\x12\x03\x61pi\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\"chirpstack-api/common/common.proto\x1a\x1a\x63hirpstack-api/gw/gw.proto\"\x8f\x01\n\nRequestLog\x12\x0f\n\x07service\x18\x01 \x01(\t\x12\x0e\n\x06method\x18\x02 \x01(\t\x12/\n\x08metadata\x18\x03 \x03(\x0b\x32\x1d.api.RequestLog.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42V\n\x11io.chirpstack.apiB\x0fRequestLogProtoP\x01Z.github.com/chirpstack/chirpstack/api/go/v4/apib\x06proto3')
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$chirpstack-api/api/request_log.proto\x12\x03\x61pi\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\"chirpstack-api/common/common.proto\x1a\x1a\x63hirpstack-api/gw/gw.proto\"\x8f\x01\n\nRequestLog\x12\x0f\n\x07service\x18\x01 \x01(\t\x12\x0e\n\x06method\x18\x02 \x01(\t\x12/\n\x08metadata\x18\x03 \x03(\x0b\x32\x1d.api.RequestLog.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42g\n\x11io.chirpstack.apiB\x0fRequestLogProtoP\x01Z.github.com/chirpstack/chirpstack/api/go/v4/api\xaa\x02\x0e\x43hirpstack.Apib\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'chirpstack_api.api.request_log_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\021io.chirpstack.apiB\017RequestLogProtoP\001Z.github.com/chirpstack/chirpstack/api/go/v4/api'
DESCRIPTOR._serialized_options = b'\n\021io.chirpstack.apiB\017RequestLogProtoP\001Z.github.com/chirpstack/chirpstack/api/go/v4/api\252\002\016Chirpstack.Api'
_REQUESTLOG_METADATAENTRY._options = None
_REQUESTLOG_METADATAENTRY._serialized_options = b'8\001'
_REQUESTLOG._serialized_start=143

File diff suppressed because one or more lines are too long

View File

@ -16,14 +16,14 @@ from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__
from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1d\x63hirpstack-api/api/user.proto\x12\x03\x61pi\x1a\x1cgoogle/api/annotations.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\"T\n\x04User\x12\n\n\x02id\x18\x01 \x01(\t\x12\x10\n\x08is_admin\x18\x04 \x01(\x08\x12\x11\n\tis_active\x18\x05 \x01(\x08\x12\r\n\x05\x65mail\x18\x06 \x01(\t\x12\x0c\n\x04note\x18\x07 \x01(\t\"\xae\x01\n\x0cUserListItem\x12\n\n\x02id\x18\x01 \x01(\t\x12.\n\ncreated_at\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nupdated_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\r\n\x05\x65mail\x18\x04 \x01(\t\x12\x10\n\x08is_admin\x18\x05 \x01(\x08\x12\x11\n\tis_active\x18\x06 \x01(\x08\"d\n\nUserTenant\x12\x11\n\ttenant_id\x18\x01 \x01(\t\x12\x10\n\x08is_admin\x18\x02 \x01(\x08\x12\x17\n\x0fis_device_admin\x18\x03 \x01(\x08\x12\x18\n\x10is_gateway_admin\x18\x04 \x01(\x08\"`\n\x11\x43reateUserRequest\x12\x17\n\x04user\x18\x01 \x01(\x0b\x32\t.api.User\x12\x10\n\x08password\x18\x02 \x01(\t\x12 \n\x07tenants\x18\x03 \x03(\x0b\x32\x0f.api.UserTenant\" \n\x12\x43reateUserResponse\x12\n\n\x02id\x18\x01 \x01(\t\"\x1c\n\x0eGetUserRequest\x12\n\n\x02id\x18\x01 \x01(\t\"\x8a\x01\n\x0fGetUserResponse\x12\x17\n\x04user\x18\x01 \x01(\x0b\x32\t.api.User\x12.\n\ncreated_at\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nupdated_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\",\n\x11UpdateUserRequest\x12\x17\n\x04user\x18\x01 \x01(\x0b\x32\t.api.User\"\x1f\n\x11\x44\x65leteUserRequest\x12\n\n\x02id\x18\x01 \x01(\t\"1\n\x10ListUsersRequest\x12\r\n\x05limit\x18\x01 \x01(\r\x12\x0e\n\x06offset\x18\x02 \x01(\r\"K\n\x11ListUsersResponse\x12\x13\n\x0btotal_count\x18\x01 \x01(\r\x12!\n\x06result\x18\x02 \x03(\x0b\x32\x11.api.UserListItem\">\n\x19UpdateUserPasswordRequest\x12\x0f\n\x07user_id\x18\x01 \x01(\t\x12\x10\n\x08password\x18\x02 \x01(\t2\x97\x04\n\x0bUserService\x12P\n\x06\x43reate\x12\x16.api.CreateUserRequest\x1a\x17.api.CreateUserResponse\"\x15\x82\xd3\xe4\x93\x02\x0f\"\n/api/users:\x01*\x12I\n\x03Get\x12\x13.api.GetUserRequest\x1a\x14.api.GetUserResponse\"\x17\x82\xd3\xe4\x93\x02\x11\x12\x0f/api/users/{id}\x12Y\n\x06Update\x12\x16.api.UpdateUserRequest\x1a\x16.google.protobuf.Empty\"\x1f\x82\xd3\xe4\x93\x02\x19\x1a\x14/api/users/{user.id}:\x01*\x12Q\n\x06\x44\x65lete\x12\x16.api.DeleteUserRequest\x1a\x16.google.protobuf.Empty\"\x17\x82\xd3\xe4\x93\x02\x11*\x0f/api/users/{id}\x12I\n\x04List\x12\x15.api.ListUsersRequest\x1a\x16.api.ListUsersResponse\"\x12\x82\xd3\xe4\x93\x02\x0c\x12\n/api/users\x12r\n\x0eUpdatePassword\x12\x1e.api.UpdateUserPasswordRequest\x1a\x16.google.protobuf.Empty\"(\x82\xd3\xe4\x93\x02\"\"\x1d/api/users/{user_id}/password:\x01*BP\n\x11io.chirpstack.apiB\tUserProtoP\x01Z.github.com/chirpstack/chirpstack/api/go/v4/apib\x06proto3')
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1d\x63hirpstack-api/api/user.proto\x12\x03\x61pi\x1a\x1cgoogle/api/annotations.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\"T\n\x04User\x12\n\n\x02id\x18\x01 \x01(\t\x12\x10\n\x08is_admin\x18\x04 \x01(\x08\x12\x11\n\tis_active\x18\x05 \x01(\x08\x12\r\n\x05\x65mail\x18\x06 \x01(\t\x12\x0c\n\x04note\x18\x07 \x01(\t\"\xae\x01\n\x0cUserListItem\x12\n\n\x02id\x18\x01 \x01(\t\x12.\n\ncreated_at\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nupdated_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\r\n\x05\x65mail\x18\x04 \x01(\t\x12\x10\n\x08is_admin\x18\x05 \x01(\x08\x12\x11\n\tis_active\x18\x06 \x01(\x08\"d\n\nUserTenant\x12\x11\n\ttenant_id\x18\x01 \x01(\t\x12\x10\n\x08is_admin\x18\x02 \x01(\x08\x12\x17\n\x0fis_device_admin\x18\x03 \x01(\x08\x12\x18\n\x10is_gateway_admin\x18\x04 \x01(\x08\"`\n\x11\x43reateUserRequest\x12\x17\n\x04user\x18\x01 \x01(\x0b\x32\t.api.User\x12\x10\n\x08password\x18\x02 \x01(\t\x12 \n\x07tenants\x18\x03 \x03(\x0b\x32\x0f.api.UserTenant\" \n\x12\x43reateUserResponse\x12\n\n\x02id\x18\x01 \x01(\t\"\x1c\n\x0eGetUserRequest\x12\n\n\x02id\x18\x01 \x01(\t\"\x8a\x01\n\x0fGetUserResponse\x12\x17\n\x04user\x18\x01 \x01(\x0b\x32\t.api.User\x12.\n\ncreated_at\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nupdated_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\",\n\x11UpdateUserRequest\x12\x17\n\x04user\x18\x01 \x01(\x0b\x32\t.api.User\"\x1f\n\x11\x44\x65leteUserRequest\x12\n\n\x02id\x18\x01 \x01(\t\"1\n\x10ListUsersRequest\x12\r\n\x05limit\x18\x01 \x01(\r\x12\x0e\n\x06offset\x18\x02 \x01(\r\"K\n\x11ListUsersResponse\x12\x13\n\x0btotal_count\x18\x01 \x01(\r\x12!\n\x06result\x18\x02 \x03(\x0b\x32\x11.api.UserListItem\">\n\x19UpdateUserPasswordRequest\x12\x0f\n\x07user_id\x18\x01 \x01(\t\x12\x10\n\x08password\x18\x02 \x01(\t2\x97\x04\n\x0bUserService\x12P\n\x06\x43reate\x12\x16.api.CreateUserRequest\x1a\x17.api.CreateUserResponse\"\x15\x82\xd3\xe4\x93\x02\x0f\"\n/api/users:\x01*\x12I\n\x03Get\x12\x13.api.GetUserRequest\x1a\x14.api.GetUserResponse\"\x17\x82\xd3\xe4\x93\x02\x11\x12\x0f/api/users/{id}\x12Y\n\x06Update\x12\x16.api.UpdateUserRequest\x1a\x16.google.protobuf.Empty\"\x1f\x82\xd3\xe4\x93\x02\x19\x1a\x14/api/users/{user.id}:\x01*\x12Q\n\x06\x44\x65lete\x12\x16.api.DeleteUserRequest\x1a\x16.google.protobuf.Empty\"\x17\x82\xd3\xe4\x93\x02\x11*\x0f/api/users/{id}\x12I\n\x04List\x12\x15.api.ListUsersRequest\x1a\x16.api.ListUsersResponse\"\x12\x82\xd3\xe4\x93\x02\x0c\x12\n/api/users\x12r\n\x0eUpdatePassword\x12\x1e.api.UpdateUserPasswordRequest\x1a\x16.google.protobuf.Empty\"(\x82\xd3\xe4\x93\x02\"\"\x1d/api/users/{user_id}/password:\x01*Ba\n\x11io.chirpstack.apiB\tUserProtoP\x01Z.github.com/chirpstack/chirpstack/api/go/v4/api\xaa\x02\x0e\x43hirpstack.Apib\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'chirpstack_api.api.user_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\021io.chirpstack.apiB\tUserProtoP\001Z.github.com/chirpstack/chirpstack/api/go/v4/api'
DESCRIPTOR._serialized_options = b'\n\021io.chirpstack.apiB\tUserProtoP\001Z.github.com/chirpstack/chirpstack/api/go/v4/api\252\002\016Chirpstack.Api'
_USERSERVICE.methods_by_name['Create']._options = None
_USERSERVICE.methods_by_name['Create']._serialized_options = b'\202\323\344\223\002\017\"\n/api/users:\001*'
_USERSERVICE.methods_by_name['Get']._options = None

View File

@ -14,14 +14,14 @@ _sym_db = _symbol_database.Default()
from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\"chirpstack-api/common/common.proto\x12\x06\x63ommon\x1a\x1fgoogle/protobuf/timestamp.proto\"{\n\x08Location\x12\x10\n\x08latitude\x18\x01 \x01(\x01\x12\x11\n\tlongitude\x18\x02 \x01(\x01\x12\x10\n\x08\x61ltitude\x18\x03 \x01(\x01\x12&\n\x06source\x18\x04 \x01(\x0e\x32\x16.common.LocationSource\x12\x10\n\x08\x61\x63\x63uracy\x18\x05 \x01(\x02\"1\n\x0bKeyEnvelope\x12\x11\n\tkek_label\x18\x01 \x01(\t\x12\x0f\n\x07\x61\x65s_key\x18\x02 \x01(\x0c\"\x91\x01\n\x06Metric\x12\x0c\n\x04name\x18\x01 \x01(\t\x12.\n\ntimestamps\x18\x02 \x03(\x0b\x32\x1a.google.protobuf.Timestamp\x12\'\n\x08\x64\x61tasets\x18\x03 \x03(\x0b\x32\x15.common.MetricDataset\x12 \n\x04kind\x18\x04 \x01(\x0e\x32\x12.common.MetricKind\",\n\rMetricDataset\x12\r\n\x05label\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x03(\x02*,\n\nModulation\x12\x08\n\x04LORA\x10\x00\x12\x07\n\x03\x46SK\x10\x01\x12\x0b\n\x07LR_FHSS\x10\x02*\xaa\x01\n\x06Region\x12\t\n\x05\x45U868\x10\x00\x12\t\n\x05US915\x10\x02\x12\t\n\x05\x43N779\x10\x03\x12\t\n\x05\x45U433\x10\x04\x12\t\n\x05\x41U915\x10\x05\x12\t\n\x05\x43N470\x10\x06\x12\t\n\x05\x41S923\x10\x07\x12\x0b\n\x07\x41S923_2\x10\x0c\x12\x0b\n\x07\x41S923_3\x10\r\x12\x0b\n\x07\x41S923_4\x10\x0e\x12\t\n\x05KR920\x10\x08\x12\t\n\x05IN865\x10\t\x12\t\n\x05RU864\x10\n\x12\x0b\n\x07ISM2400\x10\x0b*\xb3\x01\n\x05MType\x12\x10\n\x0cJOIN_REQUEST\x10\x00\x12\x0f\n\x0bJOIN_ACCEPT\x10\x01\x12\x17\n\x13UNCONFIRMED_DATA_UP\x10\x02\x12\x19\n\x15UNCONFIRMED_DATA_DOWN\x10\x03\x12\x15\n\x11\x43ONFIRMED_DATA_UP\x10\x04\x12\x17\n\x13\x43ONFIRMED_DATA_DOWN\x10\x05\x12\x12\n\x0eREJOIN_REQUEST\x10\x06\x12\x0f\n\x0bPROPRIETARY\x10\x07*~\n\nMacVersion\x12\x11\n\rLORAWAN_1_0_0\x10\x00\x12\x11\n\rLORAWAN_1_0_1\x10\x01\x12\x11\n\rLORAWAN_1_0_2\x10\x02\x12\x11\n\rLORAWAN_1_0_3\x10\x03\x12\x11\n\rLORAWAN_1_0_4\x10\x04\x12\x11\n\rLORAWAN_1_1_0\x10\x05*e\n\x11RegParamsRevision\x12\x05\n\x01\x41\x10\x00\x12\x05\n\x01\x42\x10\x01\x12\x0f\n\x0bRP002_1_0_0\x10\x02\x12\x0f\n\x0bRP002_1_0_1\x10\x03\x12\x0f\n\x0bRP002_1_0_2\x10\x04\x12\x0f\n\x0bRP002_1_0_3\x10\x05*\x8e\x01\n\x0eLocationSource\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x07\n\x03GPS\x10\x01\x12\n\n\x06\x43ONFIG\x10\x02\x12\x15\n\x11GEO_RESOLVER_TDOA\x10\x03\x12\x15\n\x11GEO_RESOLVER_RSSI\x10\x04\x12\x15\n\x11GEO_RESOLVER_GNSS\x10\x05\x12\x15\n\x11GEO_RESOLVER_WIFI\x10\x06*+\n\x0b\x41ggregation\x12\x08\n\x04HOUR\x10\x00\x12\x07\n\x03\x44\x41Y\x10\x01\x12\t\n\x05MONTH\x10\x02*2\n\nMetricKind\x12\x0b\n\x07\x43OUNTER\x10\x00\x12\x0c\n\x08\x41\x42SOLUTE\x10\x01\x12\t\n\x05GAUGE\x10\x02\x42U\n\x11io.chirpstack.apiB\x0b\x43ommonProtoP\x01Z1github.com/chirpstack/chirpstack/api/go/v4/commonb\x06proto3')
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\"chirpstack-api/common/common.proto\x12\x06\x63ommon\x1a\x1fgoogle/protobuf/timestamp.proto\"{\n\x08Location\x12\x10\n\x08latitude\x18\x01 \x01(\x01\x12\x11\n\tlongitude\x18\x02 \x01(\x01\x12\x10\n\x08\x61ltitude\x18\x03 \x01(\x01\x12&\n\x06source\x18\x04 \x01(\x0e\x32\x16.common.LocationSource\x12\x10\n\x08\x61\x63\x63uracy\x18\x05 \x01(\x02\"1\n\x0bKeyEnvelope\x12\x11\n\tkek_label\x18\x01 \x01(\t\x12\x0f\n\x07\x61\x65s_key\x18\x02 \x01(\x0c\"\x91\x01\n\x06Metric\x12\x0c\n\x04name\x18\x01 \x01(\t\x12.\n\ntimestamps\x18\x02 \x03(\x0b\x32\x1a.google.protobuf.Timestamp\x12\'\n\x08\x64\x61tasets\x18\x03 \x03(\x0b\x32\x15.common.MetricDataset\x12 \n\x04kind\x18\x04 \x01(\x0e\x32\x12.common.MetricKind\",\n\rMetricDataset\x12\r\n\x05label\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x03(\x02*,\n\nModulation\x12\x08\n\x04LORA\x10\x00\x12\x07\n\x03\x46SK\x10\x01\x12\x0b\n\x07LR_FHSS\x10\x02*\xaa\x01\n\x06Region\x12\t\n\x05\x45U868\x10\x00\x12\t\n\x05US915\x10\x02\x12\t\n\x05\x43N779\x10\x03\x12\t\n\x05\x45U433\x10\x04\x12\t\n\x05\x41U915\x10\x05\x12\t\n\x05\x43N470\x10\x06\x12\t\n\x05\x41S923\x10\x07\x12\x0b\n\x07\x41S923_2\x10\x0c\x12\x0b\n\x07\x41S923_3\x10\r\x12\x0b\n\x07\x41S923_4\x10\x0e\x12\t\n\x05KR920\x10\x08\x12\t\n\x05IN865\x10\t\x12\t\n\x05RU864\x10\n\x12\x0b\n\x07ISM2400\x10\x0b*\xb3\x01\n\x05MType\x12\x10\n\x0cJOIN_REQUEST\x10\x00\x12\x0f\n\x0bJOIN_ACCEPT\x10\x01\x12\x17\n\x13UNCONFIRMED_DATA_UP\x10\x02\x12\x19\n\x15UNCONFIRMED_DATA_DOWN\x10\x03\x12\x15\n\x11\x43ONFIRMED_DATA_UP\x10\x04\x12\x17\n\x13\x43ONFIRMED_DATA_DOWN\x10\x05\x12\x12\n\x0eREJOIN_REQUEST\x10\x06\x12\x0f\n\x0bPROPRIETARY\x10\x07*~\n\nMacVersion\x12\x11\n\rLORAWAN_1_0_0\x10\x00\x12\x11\n\rLORAWAN_1_0_1\x10\x01\x12\x11\n\rLORAWAN_1_0_2\x10\x02\x12\x11\n\rLORAWAN_1_0_3\x10\x03\x12\x11\n\rLORAWAN_1_0_4\x10\x04\x12\x11\n\rLORAWAN_1_1_0\x10\x05*e\n\x11RegParamsRevision\x12\x05\n\x01\x41\x10\x00\x12\x05\n\x01\x42\x10\x01\x12\x0f\n\x0bRP002_1_0_0\x10\x02\x12\x0f\n\x0bRP002_1_0_1\x10\x03\x12\x0f\n\x0bRP002_1_0_2\x10\x04\x12\x0f\n\x0bRP002_1_0_3\x10\x05*\x8e\x01\n\x0eLocationSource\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x07\n\x03GPS\x10\x01\x12\n\n\x06\x43ONFIG\x10\x02\x12\x15\n\x11GEO_RESOLVER_TDOA\x10\x03\x12\x15\n\x11GEO_RESOLVER_RSSI\x10\x04\x12\x15\n\x11GEO_RESOLVER_GNSS\x10\x05\x12\x15\n\x11GEO_RESOLVER_WIFI\x10\x06*+\n\x0b\x41ggregation\x12\x08\n\x04HOUR\x10\x00\x12\x07\n\x03\x44\x41Y\x10\x01\x12\t\n\x05MONTH\x10\x02*2\n\nMetricKind\x12\x0b\n\x07\x43OUNTER\x10\x00\x12\x0c\n\x08\x41\x42SOLUTE\x10\x01\x12\t\n\x05GAUGE\x10\x02\x42i\n\x11io.chirpstack.apiB\x0b\x43ommonProtoP\x01Z1github.com/chirpstack/chirpstack/api/go/v4/common\xaa\x02\x11\x43hirpstack.Commonb\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'chirpstack_api.common.common_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\021io.chirpstack.apiB\013CommonProtoP\001Z1github.com/chirpstack/chirpstack/api/go/v4/common'
DESCRIPTOR._serialized_options = b'\n\021io.chirpstack.apiB\013CommonProtoP\001Z1github.com/chirpstack/chirpstack/api/go/v4/common\252\002\021Chirpstack.Common'
_MODULATION._serialized_start=449
_MODULATION._serialized_end=493
_REGION._serialized_start=496

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -15,14 +15,14 @@ from chirpstack_api.common import common_pb2 as chirpstack__api_dot_common_dot_c
from chirpstack_api.gw import gw_pb2 as chirpstack__api_dot_gw_dot_gw__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1e\x63hirpstack-api/meta/meta.proto\x12\x04meta\x1a\"chirpstack-api/common/common.proto\x1a\x1a\x63hirpstack-api/gw/gw.proto\"\xf0\x01\n\nUplinkMeta\x12\x0f\n\x07\x64\x65v_eui\x18\x01 \x01(\t\x12!\n\x07tx_info\x18\x02 \x01(\x0b\x32\x10.gw.UplinkTxInfo\x12!\n\x07rx_info\x18\x03 \x03(\x0b\x32\x10.gw.UplinkRxInfo\x12\x1e\n\x16phy_payload_byte_count\x18\x04 \x01(\r\x12\x1e\n\x16mac_command_byte_count\x18\x05 \x01(\r\x12&\n\x1e\x61pplication_payload_byte_count\x18\x06 \x01(\r\x12#\n\x0cmessage_type\x18\x07 \x01(\x0e\x32\r.common.MType\"\x81\x02\n\x0c\x44ownlinkMeta\x12\x0f\n\x07\x64\x65v_eui\x18\x01 \x01(\t\x12\x1a\n\x12multicast_group_id\x18\x02 \x01(\t\x12#\n\x07tx_info\x18\x03 \x01(\x0b\x32\x12.gw.DownlinkTxInfo\x12\x1e\n\x16phy_payload_byte_count\x18\x04 \x01(\r\x12\x1e\n\x16mac_command_byte_count\x18\x05 \x01(\r\x12&\n\x1e\x61pplication_payload_byte_count\x18\x06 \x01(\r\x12#\n\x0cmessage_type\x18\x07 \x01(\x0e\x32\r.common.MType\x12\x12\n\ngateway_id\x18\x08 \x01(\tBV\n\x16io.chirpstack.api.metaB\tMetaProtoP\x01Z/github.com/chirpstack/chirpstack/api/go/v4/metab\x06proto3')
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1e\x63hirpstack-api/meta/meta.proto\x12\x04meta\x1a\"chirpstack-api/common/common.proto\x1a\x1a\x63hirpstack-api/gw/gw.proto\"\xf0\x01\n\nUplinkMeta\x12\x0f\n\x07\x64\x65v_eui\x18\x01 \x01(\t\x12!\n\x07tx_info\x18\x02 \x01(\x0b\x32\x10.gw.UplinkTxInfo\x12!\n\x07rx_info\x18\x03 \x03(\x0b\x32\x10.gw.UplinkRxInfo\x12\x1e\n\x16phy_payload_byte_count\x18\x04 \x01(\r\x12\x1e\n\x16mac_command_byte_count\x18\x05 \x01(\r\x12&\n\x1e\x61pplication_payload_byte_count\x18\x06 \x01(\r\x12#\n\x0cmessage_type\x18\x07 \x01(\x0e\x32\r.common.MType\"\x81\x02\n\x0c\x44ownlinkMeta\x12\x0f\n\x07\x64\x65v_eui\x18\x01 \x01(\t\x12\x1a\n\x12multicast_group_id\x18\x02 \x01(\t\x12#\n\x07tx_info\x18\x03 \x01(\x0b\x32\x12.gw.DownlinkTxInfo\x12\x1e\n\x16phy_payload_byte_count\x18\x04 \x01(\r\x12\x1e\n\x16mac_command_byte_count\x18\x05 \x01(\r\x12&\n\x1e\x61pplication_payload_byte_count\x18\x06 \x01(\r\x12#\n\x0cmessage_type\x18\x07 \x01(\x0e\x32\r.common.MType\x12\x12\n\ngateway_id\x18\x08 \x01(\tBh\n\x16io.chirpstack.api.metaB\tMetaProtoP\x01Z/github.com/chirpstack/chirpstack/api/go/v4/meta\xaa\x02\x0f\x43hirpstack.Metab\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'chirpstack_api.meta.meta_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\026io.chirpstack.api.metaB\tMetaProtoP\001Z/github.com/chirpstack/chirpstack/api/go/v4/meta'
DESCRIPTOR._serialized_options = b'\n\026io.chirpstack.api.metaB\tMetaProtoP\001Z/github.com/chirpstack/chirpstack/api/go/v4/meta\252\002\017Chirpstack.Meta'
_UPLINKMETA._serialized_start=105
_UPLINKMETA._serialized_end=345
_DOWNLINKMETA._serialized_start=348

View File

@ -6,6 +6,7 @@ option go_package = "github.com/chirpstack/chirpstack/api/go/v4/api";
option java_package = "io.chirpstack.api";
option java_multiple_files = true;
option java_outer_classname = "ApplicationProto";
option csharp_namespace = "Chirpstack.Api";
import "google/api/annotations.proto";
import "google/protobuf/timestamp.proto";

View File

@ -6,6 +6,7 @@ option go_package = "github.com/chirpstack/chirpstack/api/go/v4/api";
option java_package = "io.chirpstack.api";
option java_multiple_files = true;
option java_outer_classname = "DeviceProto";
option csharp_namespace = "Chirpstack.Api";
import "common/common.proto";
import "google/api/annotations.proto";

View File

@ -6,6 +6,7 @@ option go_package = "github.com/chirpstack/chirpstack/api/go/v4/api";
option java_package = "io.chirpstack.api";
option java_multiple_files = true;
option java_outer_classname = "DeviceProfileProto";
option csharp_namespace = "Chirpstack.Api";
import "google/api/annotations.proto";
import "google/protobuf/timestamp.proto";

View File

@ -6,6 +6,7 @@ option go_package = "github.com/chirpstack/chirpstack/api/go/v4/api";
option java_package = "io.chirpstack.api";
option java_multiple_files = true;
option java_outer_classname = "DeviceProfileTemplateProto";
option csharp_namespace = "Chirpstack.Api";
import "google/api/annotations.proto";
import "google/protobuf/timestamp.proto";

View File

@ -6,6 +6,7 @@ option go_package = "github.com/chirpstack/chirpstack/api/go/v4/api";
option java_package = "io.chirpstack.api";
option java_multiple_files = true;
option java_outer_classname = "FrameLogProto";
option csharp_namespace = "Chirpstack.Api";
import "google/protobuf/timestamp.proto";
import "common/common.proto";

View File

@ -6,6 +6,7 @@ option go_package = "github.com/chirpstack/chirpstack/api/go/v4/api";
option java_package = "io.chirpstack.api";
option java_multiple_files = true;
option java_outer_classname = "GatewayProto";
option csharp_namespace = "Chirpstack.Api";
import "google/api/annotations.proto";
import "google/protobuf/timestamp.proto";
@ -186,6 +187,9 @@ message ListGatewaysRequest {
// Tenant ID (UUID) to filter gateways on.
// To list all gateways as a global admin user, this field can be left blank.
string tenant_id = 4;
// Multicast-group ID (UUID) to filter gateways on.
string multicast_group_id = 5;
}
message ListGatewaysResponse {

View File

@ -6,6 +6,7 @@ option go_package = "github.com/chirpstack/chirpstack/api/go/v4/api";
option java_package = "io.chirpstack.api";
option java_multiple_files = true;
option java_outer_classname = "InternalProto";
option csharp_namespace = "Chirpstack.Api";
import "google/protobuf/timestamp.proto";
import "google/protobuf/empty.proto";

View File

@ -6,6 +6,7 @@ option go_package = "github.com/chirpstack/chirpstack/api/go/v4/api";
option java_package = "io.chirpstack.api";
option java_multiple_files = true;
option java_outer_classname = "MulticastGroupProto";
option csharp_namespace = "Chirpstack.Api";
import "google/api/annotations.proto";
import "google/protobuf/timestamp.proto";
@ -67,10 +68,25 @@ service MulticastGroupService {
};
}
// Add the given item to the multcast group queue.
// Add a gateway to the multicast group.
rpc AddGateway(AddGatewayToMulticastGroupRequest) returns (google.protobuf.Empty) {
option(google.api.http) = {
post: "/api/multicast-groups/{multicast_group_id}/gateways"
body: "*"
};
}
// Remove a gateway from the multicast group.
rpc RemoveGateway(RemoveGatewayFromMulticastGroupRequest) returns (google.protobuf.Empty) {
option(google.api.http) = {
delete: "/api/multicast-groups/{multicast_group_id}/gateways/{gateway_id}"
};
}
// Add the given item to the multicast group queue.
rpc Enqueue(EnqueueMulticastGroupQueueItemRequest) returns (EnqueueMulticastGroupQueueItemResponse) {
option(google.api.http) = {
post: "/api/multcast-groups/{queue_item.multicast_group_id}/queue"
post: "/api/multicast-groups/{queue_item.multicast_group_id}/queue"
body: "*"
};
}
@ -98,6 +114,19 @@ enum MulticastGroupType {
CLASS_B = 1;
}
enum MulticastGroupSchedulingType {
// Delay.
// If multicast downlinks must be sent through multiple gateways, then
// these will be sent one by one with a delay between each gateway.
DELAY = 0;
// Time.
// If multicast downlinks must be sent through multiple gateways, then
// these will be sent simultaneously using GPS time synchronization.
// Note that this does require GPS time-synchronized LoRa gateways.
GPS_TIME = 1;
}
message MulticastGroup {
// ID (UUID).
// This will be generated automatically on create.
@ -136,6 +165,9 @@ message MulticastGroup {
// Ping-slot period (only for Class-B).
uint32 class_b_ping_slot_period = 12;
// Scheduling type (only for Class-C).
MulticastGroupSchedulingType class_c_scheduling_type = 13;
}
message MulticastGroupListItem {
@ -232,6 +264,22 @@ message RemoveDeviceFromMulticastGroupRequest {
string dev_eui = 2;
}
message AddGatewayToMulticastGroupRequest {
// Multicast group ID.
string multicast_group_id = 1;
// Gateway ID (HEX encoded).
string gateway_id = 2;
}
message RemoveGatewayFromMulticastGroupRequest {
// Multicast group ID.
string multicast_group_id = 1;
// Gateway ID (HEX encoded).
string gateway_id = 2;
}
message MulticastGroupQueueItem {
// Multicast group ID.
string multicast_group_id = 1;

View File

@ -6,6 +6,7 @@ option go_package = "github.com/chirpstack/chirpstack/api/go/v4/api";
option java_package = "io.chirpstack.api";
option java_multiple_files = true;
option java_outer_classname = "RequestLogProto";
option csharp_namespace = "Chirpstack.Api";
import "google/protobuf/timestamp.proto";
import "common/common.proto";

View File

@ -6,6 +6,7 @@ option go_package = "github.com/chirpstack/chirpstack/api/go/v4/api";
option java_package = "io.chirpstack.api";
option java_multiple_files = true;
option java_outer_classname = "TenantProto";
option csharp_namespace = "Chirpstack.Api";
import "google/api/annotations.proto";
import "google/protobuf/timestamp.proto";

View File

@ -6,6 +6,7 @@ option go_package = "github.com/chirpstack/chirpstack/api/go/v4/api";
option java_package = "io.chirpstack.api";
option java_multiple_files = true;
option java_outer_classname = "UserProto";
option csharp_namespace = "Chirpstack.Api";
import "google/api/annotations.proto";
import "google/protobuf/timestamp.proto";

View File

@ -6,6 +6,7 @@ option go_package = "github.com/chirpstack/chirpstack/api/go/v4/common";
option java_package = "io.chirpstack.api";
option java_multiple_files = true;
option java_outer_classname = "CommonProto";
option csharp_namespace = "Chirpstack.Common";
import "google/protobuf/timestamp.proto";

View File

@ -6,6 +6,7 @@ option go_package = "github.com/chirpstack/chirpstack/api/go/v4/gw";
option java_package = "io.chirpstack.api.gw";
option java_multiple_files = true;
option java_outer_classname = "GatewayProto";
option csharp_namespace = "Chirpstack.Gateway";
import "common/common.proto";
import "google/protobuf/timestamp.proto";

View File

@ -6,6 +6,7 @@ option go_package = "github.com/brocaar/chirpstack/api/go/v4/integration";
option java_package = "io.chirpstack.api.integration";
option java_multiple_files = true;
option java_outer_classname = "IntegrationProto";
option csharp_namespace = "Chirpstack.Integration";
import "common/common.proto";
import "gw/gw.proto";

View File

@ -6,6 +6,7 @@ option go_package = "github.com/chirpstack/chirpstack/api/go/v4/meta";
option java_package = "io.chirpstack.api.meta";
option java_multiple_files = true;
option java_outer_classname = "MetaProto";
option csharp_namespace = "Chirpstack.Meta";
import "common/common.proto";
import "gw/gw.proto";

View File

@ -0,0 +1,4 @@
alter table multicast_group
drop column class_c_scheduling_type;
drop table multicast_group_gateway;

View File

@ -0,0 +1,12 @@
create table multicast_group_gateway (
multicast_group_id uuid not null references multicast_group on delete cascade,
gateway_id bytea not null references gateway on delete cascade,
created_at timestamp with time zone not null,
primary key (multicast_group_id, gateway_id)
);
alter table multicast_group
add column class_c_scheduling_type varchar(20) not null default 'DELAY';
alter table multicast_group
alter column class_c_scheduling_type drop default;

View File

@ -198,6 +198,11 @@ impl GatewayService for Gateway {
} else {
Some(Uuid::from_str(&req.tenant_id).map_err(|e| e.status())?)
};
let mg_id: Option<Uuid> = if req.multicast_group_id.is_empty() {
None
} else {
Some(Uuid::from_str(&req.multicast_group_id).map_err(|e| e.status())?)
};
self.validator
.validate(
@ -209,8 +214,18 @@ impl GatewayService for Gateway {
)
.await?;
if let Some(mg_id) = mg_id {
self.validator
.validate(
request.extensions(),
validator::ValidateMulticastGroupAccess::new(validator::Flag::Read, mg_id),
)
.await?;
}
let filters = gateway::Filters {
tenant_id,
multicast_group_id: mg_id,
search: if req.search.is_empty() {
None
} else {
@ -725,6 +740,7 @@ pub mod test {
tenant_id: t.id.to_string(),
limit: 10,
offset: 0,
..Default::default()
};
let mut list_req = Request::new(list_req);
list_req.extensions_mut().insert(AuthID::User(u.id.clone()));

View File

@ -1,7 +1,7 @@
use chrono::{DateTime, Utc};
use crate::codec::Codec;
use crate::storage::fields::MeasurementKind;
use crate::storage::fields::{MeasurementKind, MulticastGroupSchedulingType};
use crate::storage::metrics::Aggregation;
use chirpstack_api::{api, common};
use lrwn::region::{CommonName, MacVersion, Revision};
@ -201,6 +201,24 @@ impl ToProto<common::MType> for lrwn::MType {
}
}
impl ToProto<api::MulticastGroupSchedulingType> for MulticastGroupSchedulingType {
fn to_proto(self) -> api::MulticastGroupSchedulingType {
match self {
MulticastGroupSchedulingType::DELAY => api::MulticastGroupSchedulingType::Delay,
MulticastGroupSchedulingType::GPS_TIME => api::MulticastGroupSchedulingType::GpsTime,
}
}
}
impl FromProto<MulticastGroupSchedulingType> for api::MulticastGroupSchedulingType {
fn from_proto(self) -> MulticastGroupSchedulingType {
match self {
api::MulticastGroupSchedulingType::Delay => MulticastGroupSchedulingType::DELAY,
api::MulticastGroupSchedulingType::GpsTime => MulticastGroupSchedulingType::GPS_TIME,
}
}
}
pub fn datetime_to_prost_timestamp(dt: &DateTime<Utc>) -> prost_types::Timestamp {
let ts = dt.timestamp_nanos();

View File

@ -62,6 +62,7 @@ impl MulticastGroupService for MulticastGroup {
dr: req_mg.dr as i16,
frequency: req_mg.frequency as i64,
class_b_ping_slot_period: req_mg.class_b_ping_slot_period as i32,
class_c_scheduling_type: req_mg.class_c_scheduling_type().from_proto(),
..Default::default()
};
let mg = multicast::create(mg).await.map_err(|e| e.status())?;
@ -114,6 +115,7 @@ impl MulticastGroupService for MulticastGroup {
dr: mg.dr as u32,
frequency: mg.frequency as u32,
class_b_ping_slot_period: mg.class_b_ping_slot_period as u32,
class_c_scheduling_type: mg.class_c_scheduling_type.to_proto().into(),
}),
created_at: Some(helpers::datetime_to_prost_timestamp(&mg.created_at)),
updated_at: Some(helpers::datetime_to_prost_timestamp(&mg.updated_at)),
@ -159,6 +161,7 @@ impl MulticastGroupService for MulticastGroup {
dr: req_mg.dr as i16,
frequency: req_mg.frequency as i64,
class_b_ping_slot_period: req_mg.class_b_ping_slot_period as i32,
class_c_scheduling_type: req_mg.class_c_scheduling_type().from_proto(),
..Default::default()
})
.await
@ -309,6 +312,66 @@ impl MulticastGroupService for MulticastGroup {
Ok(resp)
}
async fn add_gateway(
&self,
request: Request<api::AddGatewayToMulticastGroupRequest>,
) -> Result<Response<()>, Status> {
let req = request.get_ref();
let mg_id = Uuid::from_str(&req.multicast_group_id).map_err(|e| e.status())?;
let gateway_id = EUI64::from_str(&req.gateway_id).map_err(|e| e.status())?;
self.validator
.validate(
request.extensions(),
validator::ValidateMulticastGroupAccess::new(validator::Flag::Update, mg_id),
)
.await?;
multicast::add_gateway(&mg_id, &gateway_id)
.await
.map_err(|e| e.status())?;
let mut resp = Response::new(());
resp.metadata_mut().insert(
"x-log-multicast_group_id",
req.multicast_group_id.parse().unwrap(),
);
resp.metadata_mut()
.insert("x-log-gateway_id", req.gateway_id.parse().unwrap());
Ok(resp)
}
async fn remove_gateway(
&self,
request: Request<api::RemoveGatewayFromMulticastGroupRequest>,
) -> Result<Response<()>, Status> {
let req = request.get_ref();
let mg_id = Uuid::from_str(&req.multicast_group_id).map_err(|e| e.status())?;
let gateway_id = EUI64::from_str(&req.gateway_id).map_err(|e| e.status())?;
self.validator
.validate(
request.extensions(),
validator::ValidateMulticastGroupAccess::new(validator::Flag::Update, mg_id),
)
.await?;
multicast::remove_gateway(&mg_id, &gateway_id)
.await
.map_err(|e| e.status())?;
let mut resp = Response::new(());
resp.metadata_mut().insert(
"x-log-multicast_group_id",
req.multicast_group_id.parse().unwrap(),
);
resp.metadata_mut()
.insert("x-log-gateway_id", req.gateway_id.parse().unwrap());
Ok(resp)
}
async fn enqueue(
&self,
request: Request<api::EnqueueMulticastGroupQueueItemRequest>,
@ -422,7 +485,7 @@ pub mod test {
use crate::api::auth::validator::RequestValidator;
use crate::api::auth::AuthID;
use crate::storage::{
application, device, device_gateway, device_profile, gateway, tenant, user,
application, device, device_gateway, device_profile, gateway, multicast, tenant, user,
};
use crate::test;
use chirpstack_api::{common, internal};
@ -451,15 +514,23 @@ pub mod test {
.await
.unwrap();
// create gw
let gw = gateway::create(gateway::Gateway {
name: "test-gw".into(),
// create gws
let gw1 = gateway::create(gateway::Gateway {
name: "test-gw-1".into(),
tenant_id: t.id,
gateway_id: EUI64::from_be_bytes([8, 7, 6, 54, 4, 3, 2, 1]),
..Default::default()
})
.await
.unwrap();
let gw2 = gateway::create(gateway::Gateway {
name: "test-gw-2".into(),
tenant_id: t.id,
gateway_id: EUI64::from_be_bytes([8, 7, 6, 54, 4, 3, 2, 2]),
..Default::default()
})
.await
.unwrap();
// create application
let app = application::create(application::Application {
@ -509,6 +580,7 @@ pub mod test {
dr: 3,
frequency: 868300000,
class_b_ping_slot_period: 1,
class_c_scheduling_type: api::MulticastGroupSchedulingType::GpsTime.into(),
..Default::default()
}),
},
@ -538,6 +610,7 @@ pub mod test {
dr: 3,
frequency: 868300000,
class_b_ping_slot_period: 1,
class_c_scheduling_type: api::MulticastGroupSchedulingType::GpsTime.into(),
}),
get_resp.get_ref().multicast_group
);
@ -559,6 +632,7 @@ pub mod test {
dr: 2,
frequency: 868200000,
class_b_ping_slot_period: 2,
class_c_scheduling_type: api::MulticastGroupSchedulingType::Delay.into(),
}),
},
);
@ -586,6 +660,7 @@ pub mod test {
dr: 2,
frequency: 868200000,
class_b_ping_slot_period: 2,
class_c_scheduling_type: api::MulticastGroupSchedulingType::Delay.into(),
}),
get_resp.get_ref().multicast_group
);
@ -645,7 +720,7 @@ pub mod test {
device_gateway::save_rx_info(&internal::DeviceGatewayRxInfo {
dev_eui: d.dev_eui.to_vec(),
items: vec![internal::DeviceGatewayRxInfoItem {
gateway_id: gw.gateway_id.to_vec(),
gateway_id: gw1.gateway_id.to_vec(),
..Default::default()
}],
..Default::default()
@ -689,6 +764,55 @@ pub mod test {
list_queue_resp.items[0]
);
// flush queue
let flush_queue_req = get_request(
&u.id,
api::FlushMulticastGroupQueueRequest {
multicast_group_id: create_resp.id.clone(),
},
);
service.flush_queue(flush_queue_req).await.unwrap();
// add gateways
let add_gw_req = get_request(
&u.id,
api::AddGatewayToMulticastGroupRequest {
multicast_group_id: create_resp.id.clone(),
gateway_id: gw1.gateway_id.to_string(),
},
);
let _ = service.add_gateway(add_gw_req).await.unwrap();
let add_gw_req = get_request(
&u.id,
api::AddGatewayToMulticastGroupRequest {
multicast_group_id: create_resp.id.clone(),
gateway_id: gw2.gateway_id.to_string(),
},
);
let _ = service.add_gateway(add_gw_req).await.unwrap();
// enqueue (the two multicast-group gateways will be used)
let enqueue_req = get_request(
&u.id,
api::EnqueueMulticastGroupQueueItemRequest {
queue_item: Some(api::MulticastGroupQueueItem {
multicast_group_id: create_resp.id.clone(),
f_port: 10,
data: vec![1, 2, 3],
..Default::default()
}),
},
);
let enqueue_resp = service.enqueue(enqueue_req).await.unwrap();
let enqueue_resp = enqueue_resp.get_ref();
assert_eq!(32, enqueue_resp.f_cnt);
// we expect two queue items (for each gateway one)
let queue_items = multicast::get_queue(&Uuid::from_str(&create_resp.id).unwrap())
.await
.unwrap();
assert_eq!(2, queue_items.len());
// remove device
let remove_dev_req = get_request(
&u.id,
@ -699,6 +823,16 @@ pub mod test {
);
let _ = service.remove_device(remove_dev_req).await.unwrap();
// remove gateway
let remove_gw_req = get_request(
&u.id,
api::RemoveGatewayFromMulticastGroupRequest {
multicast_group_id: create_resp.id.clone(),
gateway_id: gw1.gateway_id.to_string(),
},
);
let _ = service.remove_gateway(remove_gw_req).await.unwrap();
// delete
let del_req = get_request(
&u.id,

View File

@ -205,15 +205,6 @@ pub fn run() {
# downlink capacity load on the gateway.
class_c_lock_duration="{{ network.scheduler.class_c_lock_duration }}"
# Multicast Class-C use GPS time.
#
# Use GPS time for scheduling multicast class-c downlinks. If this is enabled
# and the downlink must be send by multiple gateways to cover all devices
# within the multicast-group, these downlinks will be sent at exactly the same
# time by these gateways. If disabled, ChirpStack will use the configured
# margin. Only enable this features when all gateways have GNSS support.
multicast_class_c_use_gps_time={{ network.scheduler.multicast_class_c_use_gps_time }}
# Multicast Class-C margin.
#
# This defines the minimum margin between scheduling multiple multicast downlinks

View File

@ -189,7 +189,6 @@ pub struct Scheduler {
pub class_a_lock_duration: Duration,
#[serde(with = "humantime_serde")]
pub class_c_lock_duration: Duration,
pub multicast_class_c_use_gps_time: bool,
#[serde(with = "humantime_serde")]
pub multicast_class_c_margin: Duration,
#[serde(with = "humantime_serde")]
@ -203,7 +202,6 @@ impl Default for Scheduler {
batch_size: 100,
class_a_lock_duration: Duration::from_secs(5),
class_c_lock_duration: Duration::from_secs(5),
multicast_class_c_use_gps_time: false,
multicast_class_c_margin: Duration::from_secs(5),
multicast_class_b_margin: Duration::from_secs(5),
}

View File

@ -233,17 +233,23 @@ impl Multicast {
}
pub async fn enqueue(qi: multicast::MulticastGroupQueueItem) -> Result<u32> {
// get deveuis for multicast-group
let dev_euis = multicast::get_dev_euis(&qi.multicast_group_id).await?;
// Try first to get configured gateways for multicast-group.
let mut gateway_ids = multicast::get_gateway_ids(&qi.multicast_group_id).await?;
// get DeviceGatewayRxInfo for all devices.
let dev_gw_set = device_gateway::get_rx_info_for_dev_euis(&dev_euis).await?;
// Fallback to automatic gateway-set detection.
if gateway_ids.is_empty() {
// get deveuis for multicast-group
let dev_euis = multicast::get_dev_euis(&qi.multicast_group_id).await?;
// get minimum gateway set to cover all devices
let min_gateway_set = get_minimum_gateway_set(&dev_gw_set)?;
// get DeviceGatewayRxInfo for all devices.
let dev_gw_set = device_gateway::get_rx_info_for_dev_euis(&dev_euis).await?;
// get minimum gateway set to cover all devices
gateway_ids = get_minimum_gateway_set(&dev_gw_set)?;
}
// Enqueue multicast downlink for the given gw set.
let (_, f_cnt) = multicast::enqueue(qi, &min_gateway_set).await?;
let (_, f_cnt) = multicast::enqueue(qi, &gateway_ids).await?;
Ok(f_cnt)
}

View File

@ -1,9 +1,11 @@
use std::collections::HashMap;
use std::fmt;
use std::ops::{Deref, DerefMut};
use std::str::FromStr;
use diesel::backend;
use diesel::backend::{self, Backend};
use diesel::pg::Pg;
use diesel::sql_types::Jsonb;
use diesel::sql_types::{Jsonb, Text};
use diesel::{deserialize, serialize};
use serde::{Deserialize, Serialize};
@ -116,3 +118,60 @@ pub enum MeasurementKind {
// E.g. a firmware version, true / false value.
STRING,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize, AsExpression, FromSqlRow)]
#[allow(clippy::upper_case_acronyms)]
#[allow(non_camel_case_types)]
#[diesel(sql_type = diesel::sql_types::Text)]
pub enum MulticastGroupSchedulingType {
// Delay.
DELAY,
// GPS time.
GPS_TIME,
}
impl fmt::Display for MulticastGroupSchedulingType {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{:?}", self)
}
}
impl<DB> deserialize::FromSql<Text, DB> for MulticastGroupSchedulingType
where
DB: Backend,
*const str: deserialize::FromSql<Text, DB>,
{
fn from_sql(value: backend::RawValue<DB>) -> deserialize::Result<Self> {
let string = String::from_sql(value)?;
Ok(MulticastGroupSchedulingType::from_str(&string)?)
}
}
impl serialize::ToSql<Text, diesel::pg::Pg> for MulticastGroupSchedulingType
where
str: serialize::ToSql<Text, diesel::pg::Pg>,
{
fn to_sql<'b>(
&'b self,
out: &mut serialize::Output<'b, '_, diesel::pg::Pg>,
) -> serialize::Result {
<str as serialize::ToSql<Text, diesel::pg::Pg>>::to_sql(
&self.to_string(),
&mut out.reborrow(),
)
}
}
impl FromStr for MulticastGroupSchedulingType {
type Err = anyhow::Error;
fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
Ok(match s {
"DELAY" => MulticastGroupSchedulingType::DELAY,
"GPS_TIME" => MulticastGroupSchedulingType::GPS_TIME,
_ => {
return Err(anyhow!("Unexpected MulticastGroupSchedulingType: {}", s));
}
})
}
}

View File

@ -10,7 +10,7 @@ use uuid::Uuid;
use lrwn::EUI64;
use super::schema::{gateway, tenant};
use super::schema::{gateway, multicast_group_gateway, tenant};
use super::{error::Error, fields, get_db_conn};
#[derive(Queryable, Insertable, PartialEq, Debug)]
@ -70,6 +70,7 @@ pub struct GatewayMeta {
#[derive(Default, Clone)]
pub struct Filters {
pub tenant_id: Option<Uuid>,
pub multicast_group_id: Option<Uuid>,
pub search: Option<String>,
}
@ -303,12 +304,22 @@ pub async fn get_count(filters: &Filters) -> Result<i64, Error> {
let filters = filters.clone();
move || -> Result<i64, Error> {
let mut c = get_db_conn()?;
let mut q = gateway::dsl::gateway.select(dsl::count_star()).into_boxed();
let mut q = gateway::dsl::gateway
.select(dsl::count_star())
.distinct()
.left_join(multicast_group_gateway::table)
.into_boxed();
if let Some(tenant_id) = &filters.tenant_id {
q = q.filter(gateway::dsl::tenant_id.eq(tenant_id));
}
if let Some(multicast_group_id) = &filters.multicast_group_id {
q = q.filter(
multicast_group_gateway::dsl::multicast_group_id.eq(multicast_group_id),
);
}
if let Some(search) = &filters.search {
q = q.filter(gateway::dsl::name.ilike(format!("%{}%", search)));
}
@ -329,6 +340,7 @@ pub async fn list(
move || -> Result<Vec<GatewayListItem>, Error> {
let mut c = get_db_conn()?;
let mut q = gateway::dsl::gateway
.left_join(multicast_group_gateway::table)
.select((
gateway::tenant_id,
gateway::gateway_id,
@ -343,6 +355,7 @@ pub async fn list(
gateway::properties,
gateway::stats_interval_secs,
))
.distinct()
.into_boxed();
if let Some(tenant_id) = &filters.tenant_id {
@ -353,6 +366,12 @@ pub async fn list(
q = q.filter(gateway::dsl::name.ilike(format!("%{}%", search)));
}
if let Some(multicast_group_id) = &filters.multicast_group_id {
q = q.filter(
multicast_group_gateway::dsl::multicast_group_id.eq(multicast_group_id),
);
}
let items = q
.order_by(gateway::dsl::name)
.limit(limit)
@ -413,6 +432,8 @@ pub async fn get_counts_by_state(tenant_id: &Option<Uuid>) -> Result<GatewayCoun
pub mod test {
use super::*;
use crate::{storage, test};
use lrwn::region::CommonName;
use lrwn::{AES128Key, DevAddr};
struct FilterTest<'a> {
filters: Filters,
@ -443,6 +464,34 @@ pub mod test {
let _guard = test::prepare().await;
let mut gw = create_gateway(EUI64::from_be_bytes([1, 2, 3, 4, 5, 6, 7, 8])).await;
let app = storage::application::create(storage::application::Application {
tenant_id: gw.tenant_id,
name: "test-app".into(),
..Default::default()
})
.await
.unwrap();
let mg = storage::multicast::create(storage::multicast::MulticastGroup {
application_id: app.id,
name: "test-mg".into(),
region: CommonName::EU868,
mc_addr: DevAddr::from_be_bytes([1, 2, 3, 4]),
mc_nwk_s_key: AES128Key::from_bytes([1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8]),
f_cnt: 10,
group_type: "C".into(),
dr: 1,
frequency: 868100000,
class_b_ping_slot_period: 1,
..Default::default()
})
.await
.unwrap();
storage::multicast::add_gateway(&mg.id, &gw.gateway_id)
.await
.unwrap();
// get
let gw_get = get(&gw.gateway_id).await.unwrap();
assert_eq!(gw, gw_get);
@ -458,6 +507,7 @@ pub mod test {
FilterTest {
filters: Filters {
tenant_id: None,
multicast_group_id: None,
search: None,
},
gws: vec![&gw],
@ -468,6 +518,7 @@ pub mod test {
FilterTest {
filters: Filters {
tenant_id: None,
multicast_group_id: None,
search: Some("uup".into()),
},
gws: vec![],
@ -478,6 +529,7 @@ pub mod test {
FilterTest {
filters: Filters {
tenant_id: None,
multicast_group_id: None,
search: Some("upd".into()),
},
gws: vec![&gw],
@ -488,6 +540,7 @@ pub mod test {
FilterTest {
filters: Filters {
tenant_id: Some(gw.tenant_id),
multicast_group_id: None,
search: None,
},
gws: vec![&gw],
@ -498,6 +551,29 @@ pub mod test {
FilterTest {
filters: Filters {
tenant_id: Some(Uuid::new_v4()),
multicast_group_id: None,
search: None,
},
gws: vec![],
count: 0,
limit: 10,
offset: 0,
},
FilterTest {
filters: Filters {
tenant_id: None,
multicast_group_id: Some(mg.id),
search: None,
},
gws: vec![&gw],
count: 1,
limit: 10,
offset: 0,
},
FilterTest {
filters: Filters {
tenant_id: None,
multicast_group_id: Some(Uuid::new_v4()),
search: None,
},
gws: vec![],

View File

@ -10,8 +10,11 @@ use lrwn::region::CommonName;
use lrwn::{AES128Key, DevAddr, EUI64};
use super::error::Error;
use super::get_db_conn;
use super::schema::{device, multicast_group, multicast_group_device, multicast_group_queue_item};
use super::schema::{
application, device, gateway, multicast_group, multicast_group_device, multicast_group_gateway,
multicast_group_queue_item,
};
use super::{fields, get_db_conn};
use crate::downlink::classb;
use crate::{config, gpstime::ToDateTime, gpstime::ToGpsTime};
@ -32,6 +35,7 @@ pub struct MulticastGroup {
pub dr: i16,
pub frequency: i64,
pub class_b_ping_slot_period: i32,
pub class_c_scheduling_type: fields::MulticastGroupSchedulingType,
}
impl MulticastGroup {
@ -62,6 +66,7 @@ impl Default for MulticastGroup {
dr: 0,
frequency: 0,
class_b_ping_slot_period: 0,
class_c_scheduling_type: fields::MulticastGroupSchedulingType::DELAY,
}
}
}
@ -163,6 +168,7 @@ pub async fn update(mg: MulticastGroup) -> Result<MulticastGroup, Error> {
multicast_group::dr.eq(&mg.dr),
multicast_group::frequency.eq(&mg.frequency),
multicast_group::class_b_ping_slot_period.eq(&mg.class_b_ping_slot_period),
multicast_group::class_c_scheduling_type.eq(&mg.class_c_scheduling_type),
))
.get_result(&mut c)
.map_err(|e| Error::from_diesel(e, mg.id.to_string()))
@ -320,6 +326,79 @@ pub async fn remove_device(group_id: &Uuid, dev_eui: &EUI64) -> Result<(), Error
Ok(())
}
pub async fn add_gateway(group_id: &Uuid, gateway_id: &EUI64) -> Result<(), Error> {
task::spawn_blocking({
let group_id = *group_id;
let gateway_id = *gateway_id;
move || -> Result<(), Error> {
let mut c = get_db_conn()?;
c.transaction::<(), Error, _>(|c| {
let gw: super::gateway::Gateway = gateway::dsl::gateway
.find(&gateway_id)
.for_update()
.get_result(c)
.map_err(|e| Error::from_diesel(e, gateway_id.to_string()))?;
let mg: MulticastGroup = multicast_group::dsl::multicast_group
.find(&group_id)
.for_update()
.get_result(c)
.map_err(|e| Error::from_diesel(e, group_id.to_string()))?;
let a: super::application::Application = application::dsl::application
.find(&mg.application_id)
.for_update()
.get_result(c)
.map_err(|e| Error::from_diesel(e, mg.application_id.to_string()))?;
if a.tenant_id != gw.tenant_id {
// Gateway and multicast-group are not under same tenant.
return Err(Error::NotFound(gateway_id.to_string()));
}
let _ = diesel::insert_into(multicast_group_gateway::table)
.values((
multicast_group_gateway::multicast_group_id.eq(&group_id),
multicast_group_gateway::gateway_id.eq(&gateway_id),
multicast_group_gateway::created_at.eq(Utc::now()),
))
.execute(c)
.map_err(|e| Error::from_diesel(e, "".into()))?;
Ok(())
})
}
})
.await??;
info!(multicast_group_id = %group_id, gateway_id = %gateway_id, "Gateway added to multicast-group");
Ok(())
}
pub async fn remove_gateway(group_id: &Uuid, gateway_id: &EUI64) -> Result<(), Error> {
task::spawn_blocking({
let group_id = *group_id;
let gateway_id = *gateway_id;
move || -> Result<(), Error> {
let mut c = get_db_conn()?;
let ra = diesel::delete(
multicast_group_gateway::dsl::multicast_group_gateway
.filter(multicast_group_gateway::multicast_group_id.eq(&group_id))
.filter(multicast_group_gateway::gateway_id.eq(&gateway_id)),
)
.execute(&mut c)?;
if ra == 0 {
return Err(Error::NotFound(format!(
"multicast-group: {}, gateway: {}",
group_id, gateway_id
)));
}
Ok(())
}
})
.await??;
info!(multicast_group_id = %group_id, gateway_id = %gateway_id, "Gateway removed from multicast-group");
Ok(())
}
pub async fn get_dev_euis(group_id: &Uuid) -> Result<Vec<EUI64>, Error> {
task::spawn_blocking({
let group_id = *group_id;
@ -335,6 +414,21 @@ pub async fn get_dev_euis(group_id: &Uuid) -> Result<Vec<EUI64>, Error> {
.await?
}
pub async fn get_gateway_ids(group_id: &Uuid) -> Result<Vec<EUI64>, Error> {
task::spawn_blocking({
let group_id = *group_id;
move || -> Result<Vec<EUI64>, Error> {
let mut c = get_db_conn()?;
multicast_group_gateway::dsl::multicast_group_gateway
.select(multicast_group_gateway::gateway_id)
.filter(multicast_group_gateway::dsl::multicast_group_id.eq(&group_id))
.load(&mut c)
.map_err(|e| Error::from_diesel(e, group_id.to_string()))
}
})
.await?
}
// This enqueues a multicast-group queue item for the given gateways and returns the frame-counter
// of the multicast downlink.
// This function locks the multicast-group to avoid race-conditions with scheduling time and
@ -442,19 +536,18 @@ pub async fn enqueue(
None => Utc::now(),
};
let emit_at_time_since_gps_epoch =
match conf.network.scheduler.multicast_class_c_use_gps_time {
false => None,
true => {
// Increment with margin as requesting the gateway to send the
// downlink 'now' will result in a too late error from the gateway.
scheduler_run_after_ts += Duration::from_std(
conf.network.scheduler.multicast_class_c_margin,
)
let emit_at_time_since_gps_epoch = if mg.class_c_scheduling_type
== fields::MulticastGroupSchedulingType::GPS_TIME
{
// Increment with margin as requesting the gateway to send the
// downlink 'now' will result in a too late error from the gateway.
scheduler_run_after_ts +=
Duration::from_std(conf.network.scheduler.multicast_class_c_margin)
.unwrap();
Some(scheduler_run_after_ts.to_gps_time().num_milliseconds())
}
};
Some(scheduler_run_after_ts.to_gps_time().num_milliseconds())
} else {
None
};
for gateway_id in &gateway_ids {
let qi = MulticastGroupQueueItem {
@ -475,7 +568,9 @@ pub async fn enqueue(
.map_err(|e| Error::from_diesel(e, mg.id.to_string()))?;
ids.push(qi.id);
if !conf.network.scheduler.multicast_class_c_use_gps_time {
if mg.class_c_scheduling_type
== fields::MulticastGroupSchedulingType::DELAY
{
// Increment timing for each gateway to avoid colissions.
scheduler_run_after_ts += Duration::from_std(
conf.network.scheduler.multicast_class_c_margin,
@ -818,6 +913,64 @@ pub mod test {
assert!(dev_euis.is_empty());
}
#[tokio::test]
async fn test_gateway() {
let _guard = test::prepare().await;
let t = tenant::create(tenant::Tenant {
name: "test-tenant".into(),
can_have_gateways: true,
..Default::default()
})
.await
.unwrap();
let app = application::create(application::Application {
name: "test-app".into(),
tenant_id: t.id,
..Default::default()
})
.await
.unwrap();
let gw = gateway::create(gateway::Gateway {
gateway_id: EUI64::from_be_bytes([1, 2, 3, 4, 5, 6, 7, 8]),
tenant_id: t.id,
name: "test-gw".into(),
..Default::default()
})
.await
.unwrap();
let mg = create(MulticastGroup {
application_id: app.id,
name: "test-mg".into(),
region: CommonName::EU868,
mc_addr: DevAddr::from_be_bytes([1, 2, 3, 4]),
mc_nwk_s_key: AES128Key::from_bytes([1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8]),
f_cnt: 10,
group_type: "C".into(),
dr: 1,
frequency: 868100000,
class_b_ping_slot_period: 1,
..Default::default()
})
.await
.unwrap();
// add gateway
add_gateway(&mg.id, &gw.gateway_id).await.unwrap();
// get gateway ids
let gw_ids = get_gateway_ids(&mg.id).await.unwrap();
assert_eq!(vec![gw.gateway_id], gw_ids);
// remove gateway
remove_gateway(&mg.id, &gw.gateway_id).await.unwrap();
let gw_ids = get_gateway_ids(&mg.id).await.unwrap();
assert!(gw_ids.is_empty());
}
#[tokio::test]
async fn test_queue() {
let _guard = test::prepare().await;
@ -858,12 +1011,13 @@ pub mod test {
dr: 1,
frequency: 868100000,
class_b_ping_slot_period: 1,
class_c_scheduling_type: fields::MulticastGroupSchedulingType::DELAY,
..Default::default()
})
.await
.unwrap();
// Enqueue (Class-C)
// Enqueue (Class-C) (delay)
let (ids, f_cnt) = enqueue(
MulticastGroupQueueItem {
multicast_group_id: mg.id,
@ -891,6 +1045,33 @@ pub mod test {
delete_queue_item(&ids[0]).await.unwrap();
assert!(delete_queue_item(&ids[0]).await.is_err());
// Enqueue (Class-C) (GPS time)
mg.class_c_scheduling_type = fields::MulticastGroupSchedulingType::GPS_TIME;
let mut mg = update(mg).await.unwrap();
let (ids, f_cnt) = enqueue(
MulticastGroupQueueItem {
multicast_group_id: mg.id,
gateway_id: gw.gateway_id,
f_cnt: 1,
f_port: 2,
data: vec![3, 2, 1],
..Default::default()
},
&[gw.gateway_id],
)
.await
.unwrap();
assert_eq!(1, ids.len());
assert_eq!(10, f_cnt);
// get
let qi_get = get_queue_item(&ids[0]).await.unwrap();
assert!(qi_get.emit_at_time_since_gps_epoch.is_some());
// delete
delete_queue_item(&ids[0]).await.unwrap();
assert!(delete_queue_item(&ids[0]).await.is_err());
// Enqueue (Class-B)
mg.group_type = "B".into();
let mg = update(mg).await.unwrap();

View File

@ -192,6 +192,7 @@ diesel::table! {
dr -> Int2,
frequency -> Int8,
class_b_ping_slot_period -> Int4,
class_c_scheduling_type -> Varchar,
}
}
@ -203,6 +204,14 @@ diesel::table! {
}
}
diesel::table! {
multicast_group_gateway (multicast_group_id, gateway_id) {
multicast_group_id -> Uuid,
gateway_id -> Bytea,
created_at -> Timestamptz,
}
}
diesel::table! {
multicast_group_queue_item (id) {
id -> Uuid,
@ -270,6 +279,8 @@ diesel::joinable!(gateway -> tenant (tenant_id));
diesel::joinable!(multicast_group -> application (application_id));
diesel::joinable!(multicast_group_device -> device (dev_eui));
diesel::joinable!(multicast_group_device -> multicast_group (multicast_group_id));
diesel::joinable!(multicast_group_gateway -> gateway (gateway_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 -> multicast_group (multicast_group_id));
diesel::joinable!(tenant_user -> tenant (tenant_id));
@ -287,6 +298,7 @@ diesel::allow_tables_to_appear_in_same_query!(
gateway,
multicast_group,
multicast_group_device,
multicast_group_gateway,
multicast_group_queue_item,
tenant,
tenant_user,

View File

@ -13,6 +13,8 @@ import {
ListMulticastGroupsResponse,
AddDeviceToMulticastGroupRequest,
RemoveDeviceFromMulticastGroupRequest,
AddGatewayToMulticastGroupRequest,
RemoveGatewayFromMulticastGroupRequest,
ListMulticastGroupQueueRequest,
ListMulticastGroupQueueResponse,
} from "@chirpstack/chirpstack-api-grpc-web/api/multicast_group_pb";
@ -125,6 +127,33 @@ class MulticastGroupStore extends EventEmitter {
});
};
addGateway = (req: AddGatewayToMulticastGroupRequest, callbackFunc: () => void) => {
this.client.addGateway(req, SessionStore.getMetadata(), err => {
if (err !== null) {
HandleError(err);
return;
}
notification.success({
message: "Gateway has been added to multicast-group",
duration: 3,
});
callbackFunc();
});
};
removeGateway = (req: RemoveGatewayFromMulticastGroupRequest, callbackFunc: () => void) => {
this.client.removeGateway(req, SessionStore.getMetadata(), err => {
if (err !== null) {
HandleError(err);
return;
}
callbackFunc();
});
};
listQueue = (req: ListMulticastGroupQueueRequest, callbackFunc: (resp: ListMulticastGroupQueueResponse) => void) => {
this.client.listQueue(req, SessionStore.getMetadata(), (err, resp) => {
if (err !== null) {

View File

@ -2,7 +2,7 @@ import React, { Component } from "react";
import { Link } from "react-router-dom";
import moment from "moment";
import { Space, Breadcrumb, Button, PageHeader, Badge } from "antd";
import { Space, Breadcrumb, Button, PageHeader, Badge, Menu, Modal, TreeSelect, Dropdown } from "antd";
import { ColumnsType } from "antd/es/table";
import {
@ -11,17 +11,76 @@ import {
GatewayListItem,
GatewayState,
} from "@chirpstack/chirpstack-api-grpc-web/api/gateway_pb";
import {
ListApplicationsRequest,
ListApplicationsResponse,
} from "@chirpstack/chirpstack-api-grpc-web/api/application_pb";
import {
ListMulticastGroupsRequest,
ListMulticastGroupsResponse,
AddGatewayToMulticastGroupRequest,
} from "@chirpstack/chirpstack-api-grpc-web/api/multicast_group_pb";
import { Tenant } from "@chirpstack/chirpstack-api-grpc-web/api/tenant_pb";
import DataTable, { GetPageCallbackFunc } from "../../components/DataTable";
import GatewayStore from "../../stores/GatewayStore";
import ApplicationStore from "../../stores/ApplicationStore";
import MulticastGroupStore from "../../stores/MulticastGroupStore";
import Admin from "../../components/Admin";
interface IProps {
tenant: Tenant;
}
class ListGateways extends Component<IProps> {
interface IState {
selectedRowIds: string[];
multicastGroups: any[];
mgModalVisible: boolean;
mgSelected: string;
}
class ListGateways extends Component<IProps, IState> {
constructor(props: IProps) {
super(props);
this.state = {
selectedRowIds: [],
multicastGroups: [],
mgModalVisible: false,
mgSelected: "",
};
}
componentDidMount() {
let req = new ListApplicationsRequest();
req.setLimit(999);
req.setTenantId(this.props.tenant.getId());
ApplicationStore.list(req, (resp: ListApplicationsResponse) => {
for (const app of resp.getResultList()) {
let req = new ListMulticastGroupsRequest();
req.setLimit(999);
req.setApplicationId(app.getId());
MulticastGroupStore.list(req, (resp: ListMulticastGroupsResponse) => {
let multicastGroups = this.state.multicastGroups;
multicastGroups.push({
title: app.getName(),
value: "",
disabled: true,
children: resp.getResultList().map((mg, i) => ({
title: mg.getName(),
value: mg.getId(),
})),
});
this.setState({
multicastGroups: multicastGroups,
});
});
}
});
}
columns = (): ColumnsType<GatewayListItem.AsObject> => {
return [
{
@ -111,9 +170,71 @@ class ListGateways extends Component<IProps> {
});
};
onRowsSelectChange = (ids: string[]) => {
this.setState({
selectedRowIds: ids,
});
};
showMgModal = () => {
this.setState({
mgModalVisible: true,
});
};
hideMgModal = () => {
this.setState({
mgModalVisible: false,
});
};
onMgSelected = (value: string) => {
this.setState({
mgSelected: value,
});
};
handleMgModalOk = () => {
for (let gatewayId of this.state.selectedRowIds) {
let req = new AddGatewayToMulticastGroupRequest();
req.setMulticastGroupId(this.state.mgSelected);
req.setGatewayId(gatewayId);
MulticastGroupStore.addGateway(req, () => {});
}
this.setState({
mgModalVisible: false,
});
};
render() {
const menu = (
<Menu>
<Menu.Item onClick={this.showMgModal}>Add to multicast-group</Menu.Item>
</Menu>
);
return (
<Space direction="vertical" style={{ width: "100%" }} size="large">
<Modal
title="Add selected gateways to multicast-group"
visible={this.state.mgModalVisible}
onOk={this.handleMgModalOk}
onCancel={this.hideMgModal}
okButtonProps={{ disabled: this.state.mgSelected === "" }}
bodyStyle={{ height: 300 }}
>
<Space direction="vertical" size="large" style={{ width: "100%" }}>
<TreeSelect
style={{ width: "100%" }}
placeholder="Select multicast-group"
treeData={this.state.multicastGroups}
onChange={this.onMgSelected}
treeDefaultExpandAll
/>
</Space>
</Modal>
<PageHeader
title="Gateways"
breadcrumbRender={() => (
@ -133,13 +254,28 @@ class ListGateways extends Component<IProps> {
)}
extra={[
<Admin tenantId={this.props.tenant.getId()} isGatewayAdmin>
<Button type="primary">
<Link to={`/tenants/${this.props.tenant.getId()}/gateways/create`}>Add gateway</Link>
</Button>
<Space direction="horizontal" style={{ float: "right" }}>
<Button type="primary">
<Link to={`/tenants/${this.props.tenant.getId()}/gateways/create`}>Add gateway</Link>
</Button>
<Dropdown
placement="bottomRight"
overlay={menu}
trigger={["click"]}
disabled={this.state.selectedRowIds.length === 0}
>
<Button>Selected gateways</Button>
</Dropdown>
</Space>
</Admin>,
]}
/>
<DataTable columns={this.columns()} getPage={this.getPage} rowKey="gatewayId" />
<DataTable
columns={this.columns()}
getPage={this.getPage}
onRowsSelectChange={this.onRowsSelectChange}
rowKey="gatewayId"
/>
</Space>
);
}

View File

@ -0,0 +1,127 @@
import React, { Component } from "react";
import { Space, Button } from "antd";
import { ColumnsType } from "antd/es/table";
import {
ListGatewaysRequest,
ListGatewaysResponse,
GatewayListItem,
} from "@chirpstack/chirpstack-api-grpc-web/api/gateway_pb";
import { Application } from "@chirpstack/chirpstack-api-grpc-web/api/application_pb";
import {
MulticastGroup,
RemoveGatewayFromMulticastGroupRequest,
} from "@chirpstack/chirpstack-api-grpc-web/api/multicast_group_pb";
import DataTable, { GetPageCallbackFunc } from "../../components/DataTable";
import GatewayStore from "../../stores/GatewayStore";
import MulticastGroupStore from "../../stores/MulticastGroupStore";
interface IProps {
application: Application;
multicastGroup: MulticastGroup;
}
interface IState {
selectedRowIds: string[];
refreshKey: number;
}
class ListMulticastGroupGateways extends Component<IProps, IState> {
columns = (): ColumnsType<GatewayListItem.AsObject> => {
return [
{
title: "Name",
dataIndex: "name",
key: "name",
},
{
title: "Gateway ID",
dataIndex: "gatewayId",
key: "gatewayId",
width: 250,
},
];
};
constructor(props: IProps) {
super(props);
this.state = {
selectedRowIds: [],
refreshKey: 1,
};
}
onRowsSelectChange = (ids: string[]) => {
this.setState({
selectedRowIds: ids,
});
};
getPage = (limit: number, offset: number, callbackFunc: GetPageCallbackFunc) => {
let req = new ListGatewaysRequest();
req.setTenantId(this.props.application.getTenantId());
req.setMulticastGroupId(this.props.multicastGroup.getId());
req.setLimit(limit);
req.setOffset(offset);
GatewayStore.list(req, (resp: ListGatewaysResponse) => {
const obj = resp.toObject();
callbackFunc(obj.totalCount, obj.resultList);
});
};
removeGatewaysFromMulticastGroup = () => {
if (!window.confirm("Are you sure you want to remove the selected gateways from the multicast-group?")) {
return;
}
let count = 0;
let self = this;
for (let gatewayId of this.state.selectedRowIds) {
count++;
let req = new RemoveGatewayFromMulticastGroupRequest();
req.setMulticastGroupId(this.props.multicastGroup.getId());
req.setGatewayId(gatewayId);
let cbFunc = (cnt: number) => {
return () => {
if (cnt === self.state.selectedRowIds.length) {
self.setState({
refreshKey: self.state.refreshKey + 1,
});
}
};
};
MulticastGroupStore.removeGateway(req, cbFunc(count));
}
};
render() {
return (
<Space direction="vertical" size="large" style={{ width: "100%" }}>
<Space direction="horizontal" style={{ float: "right" }}>
<Button onClick={this.removeGatewaysFromMulticastGroup} disabled={this.state.selectedRowIds.length === 0}>
Remove from multicast-group
</Button>
</Space>
<DataTable
columns={this.columns()}
getPage={this.getPage}
onRowsSelectChange={this.onRowsSelectChange}
rowKey="gatewayId"
refreshKey={this.state.refreshKey}
/>
</Space>
);
}
}
export default ListMulticastGroupGateways;

View File

@ -2,8 +2,16 @@ import React, { Component } from "react";
import { Form, Input, InputNumber, Select, Row, Col, Button } from "antd";
import { MulticastGroup, MulticastGroupType } from "@chirpstack/chirpstack-api-grpc-web/api/multicast_group_pb";
import { Region } from "@chirpstack/chirpstack-api-grpc-web/common/common_pb";
import {
MulticastGroup,
MulticastGroupType,
MulticastGroupSchedulingType,
} from "@chirpstack/chirpstack-api-grpc-web/api/multicast_group_pb";
import { ListRegionsResponse, RegionListItem } from "@chirpstack/chirpstack-api-grpc-web/api/internal_pb";
import { getEnumName } from "../helpers";
import InternalStore from "../../stores/InternalStore";
import AesKeyInput from "../../components/AesKeyInput";
import DevAddrInput from "../../components/DevAddrInput";
@ -15,6 +23,7 @@ interface IProps {
interface IState {
selectPingSlotPeriod: boolean;
regionConfigurations: RegionListItem[];
}
class MulticastGroupForm extends Component<IProps, IState> {
@ -24,9 +33,18 @@ class MulticastGroupForm extends Component<IProps, IState> {
super(props);
this.state = {
selectPingSlotPeriod: false,
regionConfigurations: [],
};
}
componentDidMount() {
InternalStore.listRegions((resp: ListRegionsResponse) => {
this.setState({
regionConfigurations: resp.getRegionsList(),
});
});
}
onFinish = (values: MulticastGroup.AsObject) => {
const v = Object.assign(this.props.initialValues.toObject(), values);
let mg = new MulticastGroup();
@ -40,8 +58,10 @@ class MulticastGroupForm extends Component<IProps, IState> {
mg.setDr(v.dr);
mg.setFCnt(v.fCnt);
mg.setFrequency(v.frequency);
mg.setRegion(v.region);
mg.setGroupType(v.groupType);
mg.setClassBPingSlotPeriod(v.classBPingSlotPeriod);
mg.setClassCSchedulingType(v.classCSchedulingType);
this.props.onFinish(mg);
};
@ -53,6 +73,11 @@ class MulticastGroupForm extends Component<IProps, IState> {
};
render() {
const regionConfigurations = this.state.regionConfigurations
.map(v => v.getRegion())
.filter((v, i, a) => a.indexOf(v) === i)
.map(v => <Select.Option value={v}>{getEnumName(Region, v).replace("_", "-")}</Select.Option>);
return (
<Form
layout="vertical"
@ -94,22 +119,27 @@ class MulticastGroupForm extends Component<IProps, IState> {
/>
<Row gutter={24}>
<Col span={8}>
<Form.Item label="Region" name="region" rules={[{ required: true, message: "Please select a region!" }]}>
<Select disabled={this.props.disabled}>{regionConfigurations}</Select>
</Form.Item>
</Col>
<Col span={4}>
<Form.Item
label="Data-rate"
name="dr"
rules={[{ required: true, message: "Please enter a data-rate!" }]}
tooltip="The data-rate to use when transmitting the multicast frames. Please refer to the LoRaWAN Regional Parameters specification for valid values."
>
<InputNumber min={0} max={15} disabled={this.props.disabled} />
<InputNumber min={0} max={15} disabled={this.props.disabled} style={{ width: "100%" }} />
</Form.Item>
</Col>
<Col span={8}>
<Col span={4}>
<Form.Item
label="Frame-counter"
name="fCnt"
rules={[{ required: true, message: "Please enter a frame-counter!" }]}
>
<InputNumber min={0} disabled={this.props.disabled} />
<InputNumber min={0} disabled={this.props.disabled} style={{ width: "100%" }} />
</Form.Item>
</Col>
<Col span={8}>
@ -119,12 +149,12 @@ class MulticastGroupForm extends Component<IProps, IState> {
tooltip="The frequency to use when transmitting the multicast frames. Please refer to the LoRaWAN Regional Parameters specification for valid values."
rules={[{ required: true, message: "Please enter a frequency!" }]}
>
<InputNumber min={0} disabled={this.props.disabled} style={{ width: "200px" }} />
<InputNumber min={0} disabled={this.props.disabled} style={{ width: "100%" }} />
</Form.Item>
</Col>
</Row>
<Row gutter={24}>
<Col span={12}>
<Col span={8}>
<Form.Item
label="Group type"
name="groupType"
@ -137,7 +167,7 @@ class MulticastGroupForm extends Component<IProps, IState> {
</Select>
</Form.Item>
</Col>
<Col span={12}>
<Col span={8}>
<Form.Item label="Class-B ping-slot periodicity" name="classBPingSlotPeriod">
<Select disabled={!this.state.selectPingSlotPeriod || this.props.disabled}>
<Select.Option value={32 * 1}>Every second</Select.Option>
@ -151,6 +181,18 @@ class MulticastGroupForm extends Component<IProps, IState> {
</Select>
</Form.Item>
</Col>
<Col span={8}>
<Form.Item
label="Class-C scheduling type"
name="classCSchedulingType"
tooltip="In order to reach all devices, it might be needed to transmit a downlink through multiple gateways. In case of Delay each gateway will transmit one by one, in case of GPS Time all required gateways will transmit at the same GPS time."
>
<Select disabled={this.state.selectPingSlotPeriod || this.props.disabled}>
<Select.Option value={MulticastGroupSchedulingType.DELAY}>Delay</Select.Option>
<Select.Option value={MulticastGroupSchedulingType.GPS_TIME}>GPS Time</Select.Option>
</Select>
</Form.Item>
</Col>
</Row>
<Form.Item>
<Button type="primary" htmlType="submit" disabled={this.props.disabled}>

View File

@ -15,6 +15,7 @@ import {
import MulticastGroupStore from "../../stores/MulticastGroupStore";
import DeleteConfirm from "../../components/DeleteConfirm";
import ListMulticastGroupDevices from "./ListMulticastGroupDevices";
import ListMulticastGroupGateways from "./ListMulticastGroupGateways";
import EditMulticastGroup from "./EditMulticastGroup";
import Admin from "../../components/Admin";
@ -71,6 +72,9 @@ class MulticastGroupLayout extends Component<IProps, IState> {
let tab = "devices";
const path = this.props.history.location.pathname;
if (path.endsWith("gateways")) {
tab = "gateways";
}
if (path.endsWith("edit")) {
tab = "edit";
}
@ -127,6 +131,13 @@ class MulticastGroupLayout extends Component<IProps, IState> {
Devices
</Link>
</Menu.Item>
<Menu.Item key="gateways">
<Link
to={`/tenants/${tenant.getId()}/applications/${app.getId()}/multicast-groups/${mg.getId()}/gateways`}
>
Gateways
</Link>
</Menu.Item>
<Menu.Item key="edit">
<Link to={`/tenants/${tenant.getId()}/applications/${app.getId()}/multicast-groups/${mg.getId()}/edit`}>
Configuration
@ -139,6 +150,11 @@ class MulticastGroupLayout extends Component<IProps, IState> {
path={this.props.match.path}
render={props => <ListMulticastGroupDevices multicastGroup={mg} {...props} />}
/>
<Route
exact
path={`${this.props.match.path}/gateways`}
render={props => <ListMulticastGroupGateways application={app} multicastGroup={mg} {...props} />}
/>
<Route
exact
path={`${this.props.match.path}/edit`}