Initial Relay support implementation (TS011).

Closes #59.
This commit is contained in:
Orne Brocaar 2023-05-22 11:04:13 +01:00
parent 513aa7804d
commit cefe61072d
138 changed files with 28259 additions and 5157 deletions

View File

@ -20,6 +20,7 @@
<Protobuf Include="../proto/api/frame_log.proto" ProtoRoot="../proto/" OutputDir="Chirpstack/" CompileOutputs="false" AdditionalImportDirs="/googleproto" />
<Protobuf Include="../proto/api/multicast_group.proto" ProtoRoot="../proto/" OutputDir="Chirpstack/" CompileOutputs="false" AdditionalImportDirs="/googleproto" />
<Protobuf Include="../proto/api/request_log.proto" ProtoRoot="../proto/" OutputDir="Chirpstack/" CompileOutputs="false" AdditionalImportDirs="/googleproto" />
<Protobuf Include="../proto/api/relay.proto" ProtoRoot="../proto/" OutputDir="Chirpstack/" CompileOutputs="false" AdditionalImportDirs="/googleproto" />
<Protobuf Include="../proto/integration/integration.proto" ProtoRoot="../proto/" OutputDir="Chirpstack/" CompileOutputs="false" AdditionalImportDirs="/googleproto" />
<Protobuf Include="../proto/meta/meta.proto" ProtoRoot="../proto/" OutputDir="Chirpstack/" CompileOutputs="false" AdditionalImportDirs="/googleproto" />
<Protobuf Include="/googleproto/google/api/*.proto" ProtoRoot="/googleproto" OutputDir="Chirpstack/" CompileOutputs="false" />

View File

@ -27,146 +27,146 @@ namespace Chirpstack.Api {
"ChBhcGkvZGV2aWNlLnByb3RvEgNhcGkaE2NvbW1vbi9jb21tb24ucHJvdG8a",
"HGdvb2dsZS9hcGkvYW5ub3RhdGlvbnMucHJvdG8aH2dvb2dsZS9wcm90b2J1",
"Zi90aW1lc3RhbXAucHJvdG8aHGdvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucHJv",
"dG8aG2dvb2dsZS9wcm90b2J1Zi9lbXB0eS5wcm90byLQAgoGRGV2aWNlEg8K",
"dG8aG2dvb2dsZS9wcm90b2J1Zi9lbXB0eS5wcm90byLiAgoGRGV2aWNlEg8K",
"B2Rldl9ldWkYASABKAkSDAoEbmFtZRgCIAEoCRITCgtkZXNjcmlwdGlvbhgD",
"IAEoCRIWCg5hcHBsaWNhdGlvbl9pZBgEIAEoCRIZChFkZXZpY2VfcHJvZmls",
"ZV9pZBgFIAEoCRIXCg9za2lwX2ZjbnRfY2hlY2sYBiABKAgSEwoLaXNfZGlz",
"YWJsZWQYByABKAgSLQoJdmFyaWFibGVzGAggAygLMhouYXBpLkRldmljZS5W",
"YXJpYWJsZXNFbnRyeRIjCgR0YWdzGAkgAygLMhUuYXBpLkRldmljZS5UYWdz",
"RW50cnkaMAoOVmFyaWFibGVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVl",
"GAIgASgJOgI4ARorCglUYWdzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVl",
"GAIgASgJOgI4ASJUCgxEZXZpY2VTdGF0dXMSDgoGbWFyZ2luGAEgASgFEh0K",
"FWV4dGVybmFsX3Bvd2VyX3NvdXJjZRgCIAEoCBIVCg1iYXR0ZXJ5X2xldmVs",
"GAMgASgCIrgCCg5EZXZpY2VMaXN0SXRlbRIPCgdkZXZfZXVpGAEgASgJEi4K",
"CmNyZWF0ZWRfYXQYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1w",
"Ei4KCnVwZGF0ZWRfYXQYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0",
"YW1wEjAKDGxhc3Rfc2Vlbl9hdBgEIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5U",
"aW1lc3RhbXASDAoEbmFtZRgFIAEoCRITCgtkZXNjcmlwdGlvbhgGIAEoCRIZ",
"ChFkZXZpY2VfcHJvZmlsZV9pZBgHIAEoCRIbChNkZXZpY2VfcHJvZmlsZV9u",
"YW1lGAggASgJEigKDWRldmljZV9zdGF0dXMYCSABKAsyES5hcGkuRGV2aWNl",
"U3RhdHVzIj8KCkRldmljZUtleXMSDwoHZGV2X2V1aRgBIAEoCRIPCgdud2tf",
"a2V5GAIgASgJEg8KB2FwcF9rZXkYAyABKAkiMgoTQ3JlYXRlRGV2aWNlUmVx",
"dWVzdBIbCgZkZXZpY2UYASABKAsyCy5hcGkuRGV2aWNlIiMKEEdldERldmlj",
"ZVJlcXVlc3QSDwoHZGV2X2V1aRgBIAEoCSLsAQoRR2V0RGV2aWNlUmVzcG9u",
"c2USGwoGZGV2aWNlGAEgASgLMgsuYXBpLkRldmljZRIuCgpjcmVhdGVkX2F0",
"GAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIuCgp1cGRhdGVk",
"X2F0GAMgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIwCgxsYXN0",
"X3NlZW5fYXQYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEigK",
"DWRldmljZV9zdGF0dXMYBSABKAsyES5hcGkuRGV2aWNlU3RhdHVzIjIKE1Vw",
"ZGF0ZURldmljZVJlcXVlc3QSGwoGZGV2aWNlGAEgASgLMgsuYXBpLkRldmlj",
"ZSImChNEZWxldGVEZXZpY2VSZXF1ZXN0Eg8KB2Rldl9ldWkYASABKAkidwoS",
"TGlzdERldmljZXNSZXF1ZXN0Eg0KBWxpbWl0GAEgASgNEg4KBm9mZnNldBgC",
"IAEoDRIOCgZzZWFyY2gYAyABKAkSFgoOYXBwbGljYXRpb25faWQYBCABKAkS",
"GgoSbXVsdGljYXN0X2dyb3VwX2lkGAUgASgJIk8KE0xpc3REZXZpY2VzUmVz",
"cG9uc2USEwoLdG90YWxfY291bnQYASABKA0SIwoGcmVzdWx0GAIgAygLMhMu",
"YXBpLkRldmljZUxpc3RJdGVtIj8KF0NyZWF0ZURldmljZUtleXNSZXF1ZXN0",
"EiQKC2RldmljZV9rZXlzGAEgASgLMg8uYXBpLkRldmljZUtleXMiJwoUR2V0",
"RGV2aWNlS2V5c1JlcXVlc3QSDwoHZGV2X2V1aRgBIAEoCSKdAQoVR2V0RGV2",
"aWNlS2V5c1Jlc3BvbnNlEiQKC2RldmljZV9rZXlzGAEgASgLMg8uYXBpLkRl",
"dmljZUtleXMSLgoKY3JlYXRlZF9hdBgCIAEoCzIaLmdvb2dsZS5wcm90b2J1",
"Zi5UaW1lc3RhbXASLgoKdXBkYXRlZF9hdBgDIAEoCzIaLmdvb2dsZS5wcm90",
"b2J1Zi5UaW1lc3RhbXAiPwoXVXBkYXRlRGV2aWNlS2V5c1JlcXVlc3QSJAoL",
"ZGV2aWNlX2tleXMYASABKAsyDy5hcGkuRGV2aWNlS2V5cyIqChdEZWxldGVE",
"ZXZpY2VLZXlzUmVxdWVzdBIPCgdkZXZfZXVpGAEgASgJIs8BChBEZXZpY2VB",
"Y3RpdmF0aW9uEg8KB2Rldl9ldWkYASABKAkSEAoIZGV2X2FkZHIYAiABKAkS",
"EQoJYXBwX3Nfa2V5GAMgASgJEhUKDW53a19zX2VuY19rZXkYBCABKAkSFwoP",
"c19ud2tfc19pbnRfa2V5GAggASgJEhcKD2ZfbndrX3NfaW50X2tleRgJIAEo",
"CRIQCghmX2NudF91cBgFIAEoDRIUCgxuX2ZfY250X2Rvd24YBiABKA0SFAoM",
"YV9mX2NudF9kb3duGAogASgNIkkKFUFjdGl2YXRlRGV2aWNlUmVxdWVzdBIw",
"ChFkZXZpY2VfYWN0aXZhdGlvbhgBIAEoCzIVLmFwaS5EZXZpY2VBY3RpdmF0",
"aW9uIioKF0RlYWN0aXZhdGVEZXZpY2VSZXF1ZXN0Eg8KB2Rldl9ldWkYASAB",
"KAkiLQoaR2V0RGV2aWNlQWN0aXZhdGlvblJlcXVlc3QSDwoHZGV2X2V1aRgB",
"IAEoCSJPChtHZXREZXZpY2VBY3RpdmF0aW9uUmVzcG9uc2USMAoRZGV2aWNl",
"X2FjdGl2YXRpb24YASABKAsyFS5hcGkuRGV2aWNlQWN0aXZhdGlvbiIqChdH",
"ZXRSYW5kb21EZXZBZGRyUmVxdWVzdBIPCgdkZXZfZXVpGAEgASgJIiwKGEdl",
"dFJhbmRvbURldkFkZHJSZXNwb25zZRIQCghkZXZfYWRkchgBIAEoCSKoAQoX",
"R2V0RGV2aWNlTWV0cmljc1JlcXVlc3QSDwoHZGV2X2V1aRgBIAEoCRIpCgVz",
"dGFydBgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASJwoDZW5k",
"GAMgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIoCgthZ2dyZWdh",
"dGlvbhgEIAEoDjITLmNvbW1vbi5BZ2dyZWdhdGlvbiKTAgoYR2V0RGV2aWNl",
"TWV0cmljc1Jlc3BvbnNlEjsKB21ldHJpY3MYASADKAsyKi5hcGkuR2V0RGV2",
"aWNlTWV0cmljc1Jlc3BvbnNlLk1ldHJpY3NFbnRyeRI5CgZzdGF0ZXMYAiAD",
"KAsyKS5hcGkuR2V0RGV2aWNlTWV0cmljc1Jlc3BvbnNlLlN0YXRlc0VudHJ5",
"Gj4KDE1ldHJpY3NFbnRyeRILCgNrZXkYASABKAkSHQoFdmFsdWUYAiABKAsy",
"Di5jb21tb24uTWV0cmljOgI4ARo/CgtTdGF0ZXNFbnRyeRILCgNrZXkYASAB",
"KAkSHwoFdmFsdWUYAiABKAsyEC5hcGkuRGV2aWNlU3RhdGU6AjgBIioKC0Rl",
"dmljZVN0YXRlEgwKBG5hbWUYAiABKAkSDQoFdmFsdWUYAyABKAkirAEKG0dl",
"dERldmljZUxpbmtNZXRyaWNzUmVxdWVzdBIPCgdkZXZfZXVpGAEgASgJEikK",
"BXN0YXJ0GAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBInCgNl",
"bmQYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEigKC2FnZ3Jl",
"Z2F0aW9uGAQgASgOMhMuY29tbW9uLkFnZ3JlZ2F0aW9uIvsBChxHZXREZXZp",
"Y2VMaW5rTWV0cmljc1Jlc3BvbnNlEiIKCnJ4X3BhY2tldHMYASABKAsyDi5j",
"b21tb24uTWV0cmljEh8KB2d3X3Jzc2kYAiABKAsyDi5jb21tb24uTWV0cmlj",
"Eh4KBmd3X3NuchgDIAEoCzIOLmNvbW1vbi5NZXRyaWMSKwoTcnhfcGFja2V0",
"c19wZXJfZnJlcRgEIAEoCzIOLmNvbW1vbi5NZXRyaWMSKQoRcnhfcGFja2V0",
"c19wZXJfZHIYBSABKAsyDi5jb21tb24uTWV0cmljEh4KBmVycm9ycxgGIAEo",
"CzIOLmNvbW1vbi5NZXRyaWMisAEKD0RldmljZVF1ZXVlSXRlbRIKCgJpZBgB",
"IAEoCRIPCgdkZXZfZXVpGAIgASgJEhEKCWNvbmZpcm1lZBgDIAEoCBIOCgZm",
"X3BvcnQYBCABKA0SDAoEZGF0YRgFIAEoDBInCgZvYmplY3QYBiABKAsyFy5n",
"b29nbGUucHJvdG9idWYuU3RydWN0EhIKCmlzX3BlbmRpbmcYByABKAgSEgoK",
"Zl9jbnRfZG93bhgIIAEoDSJJCh1FbnF1ZXVlRGV2aWNlUXVldWVJdGVtUmVx",
"dWVzdBIoCgpxdWV1ZV9pdGVtGAEgASgLMhQuYXBpLkRldmljZVF1ZXVlSXRl",
"bSIsCh5FbnF1ZXVlRGV2aWNlUXVldWVJdGVtUmVzcG9uc2USCgoCaWQYASAB",
"KAkiKgoXRmx1c2hEZXZpY2VRdWV1ZVJlcXVlc3QSDwoHZGV2X2V1aRgBIAEo",
"CSJBChpHZXREZXZpY2VRdWV1ZUl0ZW1zUmVxdWVzdBIPCgdkZXZfZXVpGAEg",
"ASgJEhIKCmNvdW50X29ubHkYAiABKAgiWAobR2V0RGV2aWNlUXVldWVJdGVt",
"c1Jlc3BvbnNlEhMKC3RvdGFsX2NvdW50GAEgASgNEiQKBnJlc3VsdBgCIAMo",
"CzIULmFwaS5EZXZpY2VRdWV1ZUl0ZW0iKAoVRmx1c2hEZXZOb25jZXNSZXF1",
"ZXN0Eg8KB2Rldl9ldWkYASABKAky0BAKDURldmljZVNlcnZpY2USUwoGQ3Jl",
"YXRlEhguYXBpLkNyZWF0ZURldmljZVJlcXVlc3QaFi5nb29nbGUucHJvdG9i",
"dWYuRW1wdHkiF4LT5JMCESIML2FwaS9kZXZpY2VzOgEqElQKA0dldBIVLmFw",
"aS5HZXREZXZpY2VSZXF1ZXN0GhYuYXBpLkdldERldmljZVJlc3BvbnNlIh6C",
"0+STAhgSFi9hcGkvZGV2aWNlcy97ZGV2X2V1aX0SZAoGVXBkYXRlEhguYXBp",
"LlVwZGF0ZURldmljZVJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHki",
"KILT5JMCIhodL2FwaS9kZXZpY2VzL3tkZXZpY2UuZGV2X2V1aX06ASoSWgoG",
"RGVsZXRlEhguYXBpLkRlbGV0ZURldmljZVJlcXVlc3QaFi5nb29nbGUucHJv",
"dG9idWYuRW1wdHkiHoLT5JMCGCoWL2FwaS9kZXZpY2VzL3tkZXZfZXVpfRJP",
"CgRMaXN0EhcuYXBpLkxpc3REZXZpY2VzUmVxdWVzdBoYLmFwaS5MaXN0RGV2",
"aWNlc1Jlc3BvbnNlIhSC0+STAg4SDC9hcGkvZGV2aWNlcxJ2CgpDcmVhdGVL",
"ZXlzEhwuYXBpLkNyZWF0ZURldmljZUtleXNSZXF1ZXN0GhYuZ29vZ2xlLnBy",
"b3RvYnVmLkVtcHR5IjKC0+STAiwiJy9hcGkvZGV2aWNlcy97ZGV2aWNlX2tl",
"eXMuZGV2X2V1aX0va2V5czoBKhJlCgdHZXRLZXlzEhkuYXBpLkdldERldmlj",
"ZUtleXNSZXF1ZXN0GhouYXBpLkdldERldmljZUtleXNSZXNwb25zZSIjgtPk",
"kwIdEhsvYXBpL2RldmljZXMve2Rldl9ldWl9L2tleXMSdgoKVXBkYXRlS2V5",
"cxIcLmFwaS5VcGRhdGVEZXZpY2VLZXlzUmVxdWVzdBoWLmdvb2dsZS5wcm90",
"b2J1Zi5FbXB0eSIygtPkkwIsGicvYXBpL2RldmljZXMve2RldmljZV9rZXlz",
"LmRldl9ldWl9L2tleXM6ASoSZwoKRGVsZXRlS2V5cxIcLmFwaS5EZWxldGVE",
"ZXZpY2VLZXlzUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSIjgtPk",
"kwIdKhsvYXBpL2RldmljZXMve2Rldl9ldWl9L2tleXMSbwoORmx1c2hEZXZO",
"b25jZXMSGi5hcGkuRmx1c2hEZXZOb25jZXNSZXF1ZXN0GhYuZ29vZ2xlLnBy",
"b3RvYnVmLkVtcHR5IimC0+STAiMqIS9hcGkvZGV2aWNlcy97ZGV2X2V1aX0v",
"ZGV2LW5vbmNlcxJ8CghBY3RpdmF0ZRIaLmFwaS5BY3RpdmF0ZURldmljZVJl",
"cXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiPILT5JMCNiIxL2FwaS9k",
"ZXZpY2VzL3tkZXZpY2VfYWN0aXZhdGlvbi5kZXZfZXVpfS9hY3RpdmF0ZToB",
"KhJtCgpEZWFjdGl2YXRlEhwuYXBpLkRlYWN0aXZhdGVEZXZpY2VSZXF1ZXN0",
"GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IimC0+STAiMqIS9hcGkvZGV2aWNl",
"cy97ZGV2X2V1aX0vYWN0aXZhdGlvbhJ9Cg1HZXRBY3RpdmF0aW9uEh8uYXBp",
"LkdldERldmljZUFjdGl2YXRpb25SZXF1ZXN0GiAuYXBpLkdldERldmljZUFj",
"dGl2YXRpb25SZXNwb25zZSIpgtPkkwIjEiEvYXBpL2RldmljZXMve2Rldl9l",
"dWl9L2FjdGl2YXRpb24SgwEKEEdldFJhbmRvbURldkFkZHISHC5hcGkuR2V0",
"UmFuZG9tRGV2QWRkclJlcXVlc3QaHS5hcGkuR2V0UmFuZG9tRGV2QWRkclJl",
"c3BvbnNlIjKC0+STAiwiKi9hcGkvZGV2aWNlcy97ZGV2X2V1aX0vZ2V0LXJh",
"bmRvbS1kZXYtYWRkchJxCgpHZXRNZXRyaWNzEhwuYXBpLkdldERldmljZU1l",
"dHJpY3NSZXF1ZXN0Gh0uYXBpLkdldERldmljZU1ldHJpY3NSZXNwb25zZSIm",
"gtPkkwIgEh4vYXBpL2RldmljZXMve2Rldl9ldWl9L21ldHJpY3MSggEKDkdl",
"dExpbmtNZXRyaWNzEiAuYXBpLkdldERldmljZUxpbmtNZXRyaWNzUmVxdWVz",
"dBohLmFwaS5HZXREZXZpY2VMaW5rTWV0cmljc1Jlc3BvbnNlIiuC0+STAiUS",
"Iy9hcGkvZGV2aWNlcy97ZGV2X2V1aX0vbGluay1tZXRyaWNzEoYBCgdFbnF1",
"ZXVlEiIuYXBpLkVucXVldWVEZXZpY2VRdWV1ZUl0ZW1SZXF1ZXN0GiMuYXBp",
"LkVucXVldWVEZXZpY2VRdWV1ZUl0ZW1SZXNwb25zZSIygtPkkwIsIicvYXBp",
"L2RldmljZXMve3F1ZXVlX2l0ZW0uZGV2X2V1aX0vcXVldWU6ASoSaAoKRmx1",
"c2hRdWV1ZRIcLmFwaS5GbHVzaERldmljZVF1ZXVlUmVxdWVzdBoWLmdvb2ds",
"ZS5wcm90b2J1Zi5FbXB0eSIkgtPkkwIeKhwvYXBpL2RldmljZXMve2Rldl9l",
"dWl9L3F1ZXVlEnMKCEdldFF1ZXVlEh8uYXBpLkdldERldmljZVF1ZXVlSXRl",
"bXNSZXF1ZXN0GiAuYXBpLkdldERldmljZVF1ZXVlSXRlbXNSZXNwb25zZSIk",
"gtPkkwIeEhwvYXBpL2RldmljZXMve2Rldl9ldWl9L3F1ZXVlQmMKEWlvLmNo",
"aXJwc3RhY2suYXBpQgtEZXZpY2VQcm90b1ABWi5naXRodWIuY29tL2NoaXJw",
"c3RhY2svY2hpcnBzdGFjay9hcGkvZ28vdjQvYXBpqgIOQ2hpcnBzdGFjay5B",
"cGliBnByb3RvMw=="));
"RW50cnkSEAoIam9pbl9ldWkYCiABKAkaMAoOVmFyaWFibGVzRW50cnkSCwoD",
"a2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ARorCglUYWdzRW50cnkSCwoD",
"a2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASJUCgxEZXZpY2VTdGF0dXMS",
"DgoGbWFyZ2luGAEgASgFEh0KFWV4dGVybmFsX3Bvd2VyX3NvdXJjZRgCIAEo",
"CBIVCg1iYXR0ZXJ5X2xldmVsGAMgASgCIrgCCg5EZXZpY2VMaXN0SXRlbRIP",
"CgdkZXZfZXVpGAEgASgJEi4KCmNyZWF0ZWRfYXQYAiABKAsyGi5nb29nbGUu",
"cHJvdG9idWYuVGltZXN0YW1wEi4KCnVwZGF0ZWRfYXQYAyABKAsyGi5nb29n",
"bGUucHJvdG9idWYuVGltZXN0YW1wEjAKDGxhc3Rfc2Vlbl9hdBgEIAEoCzIa",
"Lmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASDAoEbmFtZRgFIAEoCRITCgtk",
"ZXNjcmlwdGlvbhgGIAEoCRIZChFkZXZpY2VfcHJvZmlsZV9pZBgHIAEoCRIb",
"ChNkZXZpY2VfcHJvZmlsZV9uYW1lGAggASgJEigKDWRldmljZV9zdGF0dXMY",
"CSABKAsyES5hcGkuRGV2aWNlU3RhdHVzIj8KCkRldmljZUtleXMSDwoHZGV2",
"X2V1aRgBIAEoCRIPCgdud2tfa2V5GAIgASgJEg8KB2FwcF9rZXkYAyABKAki",
"MgoTQ3JlYXRlRGV2aWNlUmVxdWVzdBIbCgZkZXZpY2UYASABKAsyCy5hcGku",
"RGV2aWNlIiMKEEdldERldmljZVJlcXVlc3QSDwoHZGV2X2V1aRgBIAEoCSLs",
"AQoRR2V0RGV2aWNlUmVzcG9uc2USGwoGZGV2aWNlGAEgASgLMgsuYXBpLkRl",
"dmljZRIuCgpjcmVhdGVkX2F0GAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRp",
"bWVzdGFtcBIuCgp1cGRhdGVkX2F0GAMgASgLMhouZ29vZ2xlLnByb3RvYnVm",
"LlRpbWVzdGFtcBIwCgxsYXN0X3NlZW5fYXQYBCABKAsyGi5nb29nbGUucHJv",
"dG9idWYuVGltZXN0YW1wEigKDWRldmljZV9zdGF0dXMYBSABKAsyES5hcGku",
"RGV2aWNlU3RhdHVzIjIKE1VwZGF0ZURldmljZVJlcXVlc3QSGwoGZGV2aWNl",
"GAEgASgLMgsuYXBpLkRldmljZSImChNEZWxldGVEZXZpY2VSZXF1ZXN0Eg8K",
"B2Rldl9ldWkYASABKAkidwoSTGlzdERldmljZXNSZXF1ZXN0Eg0KBWxpbWl0",
"GAEgASgNEg4KBm9mZnNldBgCIAEoDRIOCgZzZWFyY2gYAyABKAkSFgoOYXBw",
"bGljYXRpb25faWQYBCABKAkSGgoSbXVsdGljYXN0X2dyb3VwX2lkGAUgASgJ",
"Ik8KE0xpc3REZXZpY2VzUmVzcG9uc2USEwoLdG90YWxfY291bnQYASABKA0S",
"IwoGcmVzdWx0GAIgAygLMhMuYXBpLkRldmljZUxpc3RJdGVtIj8KF0NyZWF0",
"ZURldmljZUtleXNSZXF1ZXN0EiQKC2RldmljZV9rZXlzGAEgASgLMg8uYXBp",
"LkRldmljZUtleXMiJwoUR2V0RGV2aWNlS2V5c1JlcXVlc3QSDwoHZGV2X2V1",
"aRgBIAEoCSKdAQoVR2V0RGV2aWNlS2V5c1Jlc3BvbnNlEiQKC2RldmljZV9r",
"ZXlzGAEgASgLMg8uYXBpLkRldmljZUtleXMSLgoKY3JlYXRlZF9hdBgCIAEo",
"CzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLgoKdXBkYXRlZF9hdBgD",
"IAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAiPwoXVXBkYXRlRGV2",
"aWNlS2V5c1JlcXVlc3QSJAoLZGV2aWNlX2tleXMYASABKAsyDy5hcGkuRGV2",
"aWNlS2V5cyIqChdEZWxldGVEZXZpY2VLZXlzUmVxdWVzdBIPCgdkZXZfZXVp",
"GAEgASgJIs8BChBEZXZpY2VBY3RpdmF0aW9uEg8KB2Rldl9ldWkYASABKAkS",
"EAoIZGV2X2FkZHIYAiABKAkSEQoJYXBwX3Nfa2V5GAMgASgJEhUKDW53a19z",
"X2VuY19rZXkYBCABKAkSFwoPc19ud2tfc19pbnRfa2V5GAggASgJEhcKD2Zf",
"bndrX3NfaW50X2tleRgJIAEoCRIQCghmX2NudF91cBgFIAEoDRIUCgxuX2Zf",
"Y250X2Rvd24YBiABKA0SFAoMYV9mX2NudF9kb3duGAogASgNIkkKFUFjdGl2",
"YXRlRGV2aWNlUmVxdWVzdBIwChFkZXZpY2VfYWN0aXZhdGlvbhgBIAEoCzIV",
"LmFwaS5EZXZpY2VBY3RpdmF0aW9uIioKF0RlYWN0aXZhdGVEZXZpY2VSZXF1",
"ZXN0Eg8KB2Rldl9ldWkYASABKAkiLQoaR2V0RGV2aWNlQWN0aXZhdGlvblJl",
"cXVlc3QSDwoHZGV2X2V1aRgBIAEoCSJPChtHZXREZXZpY2VBY3RpdmF0aW9u",
"UmVzcG9uc2USMAoRZGV2aWNlX2FjdGl2YXRpb24YASABKAsyFS5hcGkuRGV2",
"aWNlQWN0aXZhdGlvbiIqChdHZXRSYW5kb21EZXZBZGRyUmVxdWVzdBIPCgdk",
"ZXZfZXVpGAEgASgJIiwKGEdldFJhbmRvbURldkFkZHJSZXNwb25zZRIQCghk",
"ZXZfYWRkchgBIAEoCSKoAQoXR2V0RGV2aWNlTWV0cmljc1JlcXVlc3QSDwoH",
"ZGV2X2V1aRgBIAEoCRIpCgVzdGFydBgCIAEoCzIaLmdvb2dsZS5wcm90b2J1",
"Zi5UaW1lc3RhbXASJwoDZW5kGAMgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRp",
"bWVzdGFtcBIoCgthZ2dyZWdhdGlvbhgEIAEoDjITLmNvbW1vbi5BZ2dyZWdh",
"dGlvbiKTAgoYR2V0RGV2aWNlTWV0cmljc1Jlc3BvbnNlEjsKB21ldHJpY3MY",
"ASADKAsyKi5hcGkuR2V0RGV2aWNlTWV0cmljc1Jlc3BvbnNlLk1ldHJpY3NF",
"bnRyeRI5CgZzdGF0ZXMYAiADKAsyKS5hcGkuR2V0RGV2aWNlTWV0cmljc1Jl",
"c3BvbnNlLlN0YXRlc0VudHJ5Gj4KDE1ldHJpY3NFbnRyeRILCgNrZXkYASAB",
"KAkSHQoFdmFsdWUYAiABKAsyDi5jb21tb24uTWV0cmljOgI4ARo/CgtTdGF0",
"ZXNFbnRyeRILCgNrZXkYASABKAkSHwoFdmFsdWUYAiABKAsyEC5hcGkuRGV2",
"aWNlU3RhdGU6AjgBIioKC0RldmljZVN0YXRlEgwKBG5hbWUYAiABKAkSDQoF",
"dmFsdWUYAyABKAkirAEKG0dldERldmljZUxpbmtNZXRyaWNzUmVxdWVzdBIP",
"CgdkZXZfZXVpGAEgASgJEikKBXN0YXJ0GAIgASgLMhouZ29vZ2xlLnByb3Rv",
"YnVmLlRpbWVzdGFtcBInCgNlbmQYAyABKAsyGi5nb29nbGUucHJvdG9idWYu",
"VGltZXN0YW1wEigKC2FnZ3JlZ2F0aW9uGAQgASgOMhMuY29tbW9uLkFnZ3Jl",
"Z2F0aW9uIvsBChxHZXREZXZpY2VMaW5rTWV0cmljc1Jlc3BvbnNlEiIKCnJ4",
"X3BhY2tldHMYASABKAsyDi5jb21tb24uTWV0cmljEh8KB2d3X3Jzc2kYAiAB",
"KAsyDi5jb21tb24uTWV0cmljEh4KBmd3X3NuchgDIAEoCzIOLmNvbW1vbi5N",
"ZXRyaWMSKwoTcnhfcGFja2V0c19wZXJfZnJlcRgEIAEoCzIOLmNvbW1vbi5N",
"ZXRyaWMSKQoRcnhfcGFja2V0c19wZXJfZHIYBSABKAsyDi5jb21tb24uTWV0",
"cmljEh4KBmVycm9ycxgGIAEoCzIOLmNvbW1vbi5NZXRyaWMisAEKD0Rldmlj",
"ZVF1ZXVlSXRlbRIKCgJpZBgBIAEoCRIPCgdkZXZfZXVpGAIgASgJEhEKCWNv",
"bmZpcm1lZBgDIAEoCBIOCgZmX3BvcnQYBCABKA0SDAoEZGF0YRgFIAEoDBIn",
"CgZvYmplY3QYBiABKAsyFy5nb29nbGUucHJvdG9idWYuU3RydWN0EhIKCmlz",
"X3BlbmRpbmcYByABKAgSEgoKZl9jbnRfZG93bhgIIAEoDSJJCh1FbnF1ZXVl",
"RGV2aWNlUXVldWVJdGVtUmVxdWVzdBIoCgpxdWV1ZV9pdGVtGAEgASgLMhQu",
"YXBpLkRldmljZVF1ZXVlSXRlbSIsCh5FbnF1ZXVlRGV2aWNlUXVldWVJdGVt",
"UmVzcG9uc2USCgoCaWQYASABKAkiKgoXRmx1c2hEZXZpY2VRdWV1ZVJlcXVl",
"c3QSDwoHZGV2X2V1aRgBIAEoCSJBChpHZXREZXZpY2VRdWV1ZUl0ZW1zUmVx",
"dWVzdBIPCgdkZXZfZXVpGAEgASgJEhIKCmNvdW50X29ubHkYAiABKAgiWAob",
"R2V0RGV2aWNlUXVldWVJdGVtc1Jlc3BvbnNlEhMKC3RvdGFsX2NvdW50GAEg",
"ASgNEiQKBnJlc3VsdBgCIAMoCzIULmFwaS5EZXZpY2VRdWV1ZUl0ZW0iKAoV",
"Rmx1c2hEZXZOb25jZXNSZXF1ZXN0Eg8KB2Rldl9ldWkYASABKAky0BAKDURl",
"dmljZVNlcnZpY2USUwoGQ3JlYXRlEhguYXBpLkNyZWF0ZURldmljZVJlcXVl",
"c3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiF4LT5JMCESIML2FwaS9kZXZp",
"Y2VzOgEqElQKA0dldBIVLmFwaS5HZXREZXZpY2VSZXF1ZXN0GhYuYXBpLkdl",
"dERldmljZVJlc3BvbnNlIh6C0+STAhgSFi9hcGkvZGV2aWNlcy97ZGV2X2V1",
"aX0SZAoGVXBkYXRlEhguYXBpLlVwZGF0ZURldmljZVJlcXVlc3QaFi5nb29n",
"bGUucHJvdG9idWYuRW1wdHkiKILT5JMCIhodL2FwaS9kZXZpY2VzL3tkZXZp",
"Y2UuZGV2X2V1aX06ASoSWgoGRGVsZXRlEhguYXBpLkRlbGV0ZURldmljZVJl",
"cXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiHoLT5JMCGCoWL2FwaS9k",
"ZXZpY2VzL3tkZXZfZXVpfRJPCgRMaXN0EhcuYXBpLkxpc3REZXZpY2VzUmVx",
"dWVzdBoYLmFwaS5MaXN0RGV2aWNlc1Jlc3BvbnNlIhSC0+STAg4SDC9hcGkv",
"ZGV2aWNlcxJ2CgpDcmVhdGVLZXlzEhwuYXBpLkNyZWF0ZURldmljZUtleXNS",
"ZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IjKC0+STAiwiJy9hcGkv",
"ZGV2aWNlcy97ZGV2aWNlX2tleXMuZGV2X2V1aX0va2V5czoBKhJlCgdHZXRL",
"ZXlzEhkuYXBpLkdldERldmljZUtleXNSZXF1ZXN0GhouYXBpLkdldERldmlj",
"ZUtleXNSZXNwb25zZSIjgtPkkwIdEhsvYXBpL2RldmljZXMve2Rldl9ldWl9",
"L2tleXMSdgoKVXBkYXRlS2V5cxIcLmFwaS5VcGRhdGVEZXZpY2VLZXlzUmVx",
"dWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSIygtPkkwIsGicvYXBpL2Rl",
"dmljZXMve2RldmljZV9rZXlzLmRldl9ldWl9L2tleXM6ASoSZwoKRGVsZXRl",
"S2V5cxIcLmFwaS5EZWxldGVEZXZpY2VLZXlzUmVxdWVzdBoWLmdvb2dsZS5w",
"cm90b2J1Zi5FbXB0eSIjgtPkkwIdKhsvYXBpL2RldmljZXMve2Rldl9ldWl9",
"L2tleXMSbwoORmx1c2hEZXZOb25jZXMSGi5hcGkuRmx1c2hEZXZOb25jZXNS",
"ZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IimC0+STAiMqIS9hcGkv",
"ZGV2aWNlcy97ZGV2X2V1aX0vZGV2LW5vbmNlcxJ8CghBY3RpdmF0ZRIaLmFw",
"aS5BY3RpdmF0ZURldmljZVJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1w",
"dHkiPILT5JMCNiIxL2FwaS9kZXZpY2VzL3tkZXZpY2VfYWN0aXZhdGlvbi5k",
"ZXZfZXVpfS9hY3RpdmF0ZToBKhJtCgpEZWFjdGl2YXRlEhwuYXBpLkRlYWN0",
"aXZhdGVEZXZpY2VSZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IimC",
"0+STAiMqIS9hcGkvZGV2aWNlcy97ZGV2X2V1aX0vYWN0aXZhdGlvbhJ9Cg1H",
"ZXRBY3RpdmF0aW9uEh8uYXBpLkdldERldmljZUFjdGl2YXRpb25SZXF1ZXN0",
"GiAuYXBpLkdldERldmljZUFjdGl2YXRpb25SZXNwb25zZSIpgtPkkwIjEiEv",
"YXBpL2RldmljZXMve2Rldl9ldWl9L2FjdGl2YXRpb24SgwEKEEdldFJhbmRv",
"bURldkFkZHISHC5hcGkuR2V0UmFuZG9tRGV2QWRkclJlcXVlc3QaHS5hcGku",
"R2V0UmFuZG9tRGV2QWRkclJlc3BvbnNlIjKC0+STAiwiKi9hcGkvZGV2aWNl",
"cy97ZGV2X2V1aX0vZ2V0LXJhbmRvbS1kZXYtYWRkchJxCgpHZXRNZXRyaWNz",
"EhwuYXBpLkdldERldmljZU1ldHJpY3NSZXF1ZXN0Gh0uYXBpLkdldERldmlj",
"ZU1ldHJpY3NSZXNwb25zZSImgtPkkwIgEh4vYXBpL2RldmljZXMve2Rldl9l",
"dWl9L21ldHJpY3MSggEKDkdldExpbmtNZXRyaWNzEiAuYXBpLkdldERldmlj",
"ZUxpbmtNZXRyaWNzUmVxdWVzdBohLmFwaS5HZXREZXZpY2VMaW5rTWV0cmlj",
"c1Jlc3BvbnNlIiuC0+STAiUSIy9hcGkvZGV2aWNlcy97ZGV2X2V1aX0vbGlu",
"ay1tZXRyaWNzEoYBCgdFbnF1ZXVlEiIuYXBpLkVucXVldWVEZXZpY2VRdWV1",
"ZUl0ZW1SZXF1ZXN0GiMuYXBpLkVucXVldWVEZXZpY2VRdWV1ZUl0ZW1SZXNw",
"b25zZSIygtPkkwIsIicvYXBpL2RldmljZXMve3F1ZXVlX2l0ZW0uZGV2X2V1",
"aX0vcXVldWU6ASoSaAoKRmx1c2hRdWV1ZRIcLmFwaS5GbHVzaERldmljZVF1",
"ZXVlUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSIkgtPkkwIeKhwv",
"YXBpL2RldmljZXMve2Rldl9ldWl9L3F1ZXVlEnMKCEdldFF1ZXVlEh8uYXBp",
"LkdldERldmljZVF1ZXVlSXRlbXNSZXF1ZXN0GiAuYXBpLkdldERldmljZVF1",
"ZXVlSXRlbXNSZXNwb25zZSIkgtPkkwIeEhwvYXBpL2RldmljZXMve2Rldl9l",
"dWl9L3F1ZXVlQmMKEWlvLmNoaXJwc3RhY2suYXBpQgtEZXZpY2VQcm90b1AB",
"Wi5naXRodWIuY29tL2NoaXJwc3RhY2svY2hpcnBzdGFjay9hcGkvZ28vdjQv",
"YXBpqgIOQ2hpcnBzdGFjay5BcGliBnByb3RvMw=="));
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
new pbr::FileDescriptor[] { global::Chirpstack.Common.CommonReflection.Descriptor, global::Google.Api.AnnotationsReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.TimestampReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.StructReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.EmptyReflection.Descriptor, },
new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] {
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.Device), global::Chirpstack.Api.Device.Parser, new[]{ "DevEui", "Name", "Description", "ApplicationId", "DeviceProfileId", "SkipFcntCheck", "IsDisabled", "Variables", "Tags" }, null, null, null, new pbr::GeneratedClrTypeInfo[] { null, null, }),
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.Device), global::Chirpstack.Api.Device.Parser, new[]{ "DevEui", "Name", "Description", "ApplicationId", "DeviceProfileId", "SkipFcntCheck", "IsDisabled", "Variables", "Tags", "JoinEui" }, null, null, null, new pbr::GeneratedClrTypeInfo[] { null, null, }),
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.DeviceStatus), global::Chirpstack.Api.DeviceStatus.Parser, new[]{ "Margin", "ExternalPowerSource", "BatteryLevel" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.DeviceListItem), global::Chirpstack.Api.DeviceListItem.Parser, new[]{ "DevEui", "CreatedAt", "UpdatedAt", "LastSeenAt", "Name", "Description", "DeviceProfileId", "DeviceProfileName", "DeviceStatus" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.DeviceKeys), global::Chirpstack.Api.DeviceKeys.Parser, new[]{ "DevEui", "NwkKey", "AppKey" }, null, null, null, null),
@ -250,6 +250,7 @@ namespace Chirpstack.Api {
isDisabled_ = other.isDisabled_;
variables_ = other.variables_.Clone();
tags_ = other.tags_.Clone();
joinEui_ = other.joinEui_;
_unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
}
@ -397,6 +398,25 @@ namespace Chirpstack.Api {
get { return tags_; }
}
/// <summary>Field number for the "join_eui" field.</summary>
public const int JoinEuiFieldNumber = 10;
private string joinEui_ = "";
/// <summary>
/// JoinEUI (optional, EUI64).
/// This field will be automatically set / updated on OTAA. However, in some
/// cases it must be pre-configured. For example to allow OTAA using a Relay.
/// In this case the Relay needs to know the JoinEUI + DevEUI combinations
/// of the devices for which it needs to forward uplinks.
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public string JoinEui {
get { return joinEui_; }
set {
joinEui_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
}
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public override bool Equals(object other) {
@ -421,6 +441,7 @@ namespace Chirpstack.Api {
if (IsDisabled != other.IsDisabled) return false;
if (!Variables.Equals(other.Variables)) return false;
if (!Tags.Equals(other.Tags)) return false;
if (JoinEui != other.JoinEui) return false;
return Equals(_unknownFields, other._unknownFields);
}
@ -437,6 +458,7 @@ namespace Chirpstack.Api {
if (IsDisabled != false) hash ^= IsDisabled.GetHashCode();
hash ^= Variables.GetHashCode();
hash ^= Tags.GetHashCode();
if (JoinEui.Length != 0) hash ^= JoinEui.GetHashCode();
if (_unknownFields != null) {
hash ^= _unknownFields.GetHashCode();
}
@ -485,6 +507,10 @@ namespace Chirpstack.Api {
}
variables_.WriteTo(output, _map_variables_codec);
tags_.WriteTo(output, _map_tags_codec);
if (JoinEui.Length != 0) {
output.WriteRawTag(82);
output.WriteString(JoinEui);
}
if (_unknownFields != null) {
_unknownFields.WriteTo(output);
}
@ -525,6 +551,10 @@ namespace Chirpstack.Api {
}
variables_.WriteTo(ref output, _map_variables_codec);
tags_.WriteTo(ref output, _map_tags_codec);
if (JoinEui.Length != 0) {
output.WriteRawTag(82);
output.WriteString(JoinEui);
}
if (_unknownFields != null) {
_unknownFields.WriteTo(ref output);
}
@ -558,6 +588,9 @@ namespace Chirpstack.Api {
}
size += variables_.CalculateSize(_map_variables_codec);
size += tags_.CalculateSize(_map_tags_codec);
if (JoinEui.Length != 0) {
size += 1 + pb::CodedOutputStream.ComputeStringSize(JoinEui);
}
if (_unknownFields != null) {
size += _unknownFields.CalculateSize();
}
@ -593,6 +626,9 @@ namespace Chirpstack.Api {
}
variables_.Add(other.variables_);
tags_.Add(other.tags_);
if (other.JoinEui.Length != 0) {
JoinEui = other.JoinEui;
}
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
}
@ -644,6 +680,10 @@ namespace Chirpstack.Api {
tags_.AddEntriesFrom(input, _map_tags_codec);
break;
}
case 82: {
JoinEui = input.ReadString();
break;
}
}
}
#endif
@ -695,6 +735,10 @@ namespace Chirpstack.Api {
tags_.AddEntriesFrom(ref input, _map_tags_codec);
break;
}
case 82: {
JoinEui = input.ReadString();
break;
}
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -26,25 +26,26 @@ namespace Chirpstack.Api {
string.Concat(
"ChNhcGkvZnJhbWVfbG9nLnByb3RvEgNhcGkaH2dvb2dsZS9wcm90b2J1Zi90",
"aW1lc3RhbXAucHJvdG8aE2NvbW1vbi9jb21tb24ucHJvdG8aC2d3L2d3LnBy",
"b3RvIvcBCg5VcGxpbmtGcmFtZUxvZxITCgtwaHlfcGF5bG9hZBgBIAEoDBIh",
"b3RvIpACCg5VcGxpbmtGcmFtZUxvZxITCgtwaHlfcGF5bG9hZBgBIAEoDBIh",
"Cgd0eF9pbmZvGAIgASgLMhAuZ3cuVXBsaW5rVHhJbmZvEiEKB3J4X2luZm8Y",
"AyADKAsyEC5ndy5VcGxpbmtSeEluZm8SHQoGbV90eXBlGAQgASgOMg0uY29t",
"bW9uLk1UeXBlEhAKCGRldl9hZGRyGAUgASgJEg8KB2Rldl9ldWkYBiABKAkS",
"KAoEdGltZRgHIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASHgoW",
"cGxhaW50ZXh0X21hY19jb21tYW5kcxgIIAEoCCKBAgoQRG93bmxpbmtGcmFt",
"ZUxvZxIoCgR0aW1lGAEgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFt",
"cBITCgtwaHlfcGF5bG9hZBgCIAEoDBIjCgd0eF9pbmZvGAMgASgLMhIuZ3cu",
"RG93bmxpbmtUeEluZm8SEwoLZG93bmxpbmtfaWQYBCABKA0SEgoKZ2F0ZXdh",
"eV9pZBgFIAEoCRIdCgZtX3R5cGUYBiABKA4yDS5jb21tb24uTVR5cGUSEAoI",
"ZGV2X2FkZHIYByABKAkSDwoHZGV2X2V1aRgIIAEoCRIeChZwbGFpbnRleHRf",
"bWFjX2NvbW1hbmRzGAkgASgIQmUKEWlvLmNoaXJwc3RhY2suYXBpQg1GcmFt",
"ZUxvZ1Byb3RvUAFaLmdpdGh1Yi5jb20vY2hpcnBzdGFjay9jaGlycHN0YWNr",
"L2FwaS9nby92NC9hcGmqAg5DaGlycHN0YWNrLkFwaWIGcHJvdG8z"));
"KAoEdGltZRgHIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASGAoQ",
"cGxhaW50ZXh0X2Zfb3B0cxgIIAEoCBIdChVwbGFpbnRleHRfZnJtX3BheWxv",
"YWQYCSABKAgimgIKEERvd25saW5rRnJhbWVMb2cSKAoEdGltZRgBIAEoCzIa",
"Lmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASEwoLcGh5X3BheWxvYWQYAiAB",
"KAwSIwoHdHhfaW5mbxgDIAEoCzISLmd3LkRvd25saW5rVHhJbmZvEhMKC2Rv",
"d25saW5rX2lkGAQgASgNEhIKCmdhdGV3YXlfaWQYBSABKAkSHQoGbV90eXBl",
"GAYgASgOMg0uY29tbW9uLk1UeXBlEhAKCGRldl9hZGRyGAcgASgJEg8KB2Rl",
"dl9ldWkYCCABKAkSGAoQcGxhaW50ZXh0X2Zfb3B0cxgJIAEoCBIdChVwbGFp",
"bnRleHRfZnJtX3BheWxvYWQYCiABKAhCZQoRaW8uY2hpcnBzdGFjay5hcGlC",
"DUZyYW1lTG9nUHJvdG9QAVouZ2l0aHViLmNvbS9jaGlycHN0YWNrL2NoaXJw",
"c3RhY2svYXBpL2dvL3Y0L2FwaaoCDkNoaXJwc3RhY2suQXBpYgZwcm90bzM="));
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
new pbr::FileDescriptor[] { global::Google.Protobuf.WellKnownTypes.TimestampReflection.Descriptor, global::Chirpstack.Common.CommonReflection.Descriptor, global::Chirpstack.Gateway.GwReflection.Descriptor, },
new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] {
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.UplinkFrameLog), global::Chirpstack.Api.UplinkFrameLog.Parser, new[]{ "PhyPayload", "TxInfo", "RxInfo", "MType", "DevAddr", "DevEui", "Time", "PlaintextMacCommands" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.DownlinkFrameLog), global::Chirpstack.Api.DownlinkFrameLog.Parser, new[]{ "Time", "PhyPayload", "TxInfo", "DownlinkId", "GatewayId", "MType", "DevAddr", "DevEui", "PlaintextMacCommands" }, null, null, null, null)
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.UplinkFrameLog), global::Chirpstack.Api.UplinkFrameLog.Parser, new[]{ "PhyPayload", "TxInfo", "RxInfo", "MType", "DevAddr", "DevEui", "Time", "PlaintextFOpts", "PlaintextFrmPayload" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.DownlinkFrameLog), global::Chirpstack.Api.DownlinkFrameLog.Parser, new[]{ "Time", "PhyPayload", "TxInfo", "DownlinkId", "GatewayId", "MType", "DevAddr", "DevEui", "PlaintextFOpts", "PlaintextFrmPayload" }, null, null, null, null)
}));
}
#endregion
@ -92,7 +93,8 @@ namespace Chirpstack.Api {
devAddr_ = other.devAddr_;
devEui_ = other.devEui_;
time_ = other.time_ != null ? other.time_.Clone() : null;
plaintextMacCommands_ = other.plaintextMacCommands_;
plaintextFOpts_ = other.plaintextFOpts_;
plaintextFrmPayload_ = other.plaintextFrmPayload_;
_unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
}
@ -206,18 +208,33 @@ namespace Chirpstack.Api {
}
}
/// <summary>Field number for the "plaintext_mac_commands" field.</summary>
public const int PlaintextMacCommandsFieldNumber = 8;
private bool plaintextMacCommands_;
/// <summary>Field number for the "plaintext_f_opts" field.</summary>
public const int PlaintextFOptsFieldNumber = 8;
private bool plaintextFOpts_;
/// <summary>
/// Plaintext mac-commands.
/// Plaintext f_opts mac-commands.
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public bool PlaintextMacCommands {
get { return plaintextMacCommands_; }
public bool PlaintextFOpts {
get { return plaintextFOpts_; }
set {
plaintextMacCommands_ = value;
plaintextFOpts_ = value;
}
}
/// <summary>Field number for the "plaintext_frm_payload" field.</summary>
public const int PlaintextFrmPayloadFieldNumber = 9;
private bool plaintextFrmPayload_;
/// <summary>
/// Plaintext frm_payload.
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public bool PlaintextFrmPayload {
get { return plaintextFrmPayload_; }
set {
plaintextFrmPayload_ = value;
}
}
@ -243,7 +260,8 @@ namespace Chirpstack.Api {
if (DevAddr != other.DevAddr) return false;
if (DevEui != other.DevEui) return false;
if (!object.Equals(Time, other.Time)) return false;
if (PlaintextMacCommands != other.PlaintextMacCommands) return false;
if (PlaintextFOpts != other.PlaintextFOpts) return false;
if (PlaintextFrmPayload != other.PlaintextFrmPayload) return false;
return Equals(_unknownFields, other._unknownFields);
}
@ -258,7 +276,8 @@ namespace Chirpstack.Api {
if (DevAddr.Length != 0) hash ^= DevAddr.GetHashCode();
if (DevEui.Length != 0) hash ^= DevEui.GetHashCode();
if (time_ != null) hash ^= Time.GetHashCode();
if (PlaintextMacCommands != false) hash ^= PlaintextMacCommands.GetHashCode();
if (PlaintextFOpts != false) hash ^= PlaintextFOpts.GetHashCode();
if (PlaintextFrmPayload != false) hash ^= PlaintextFrmPayload.GetHashCode();
if (_unknownFields != null) {
hash ^= _unknownFields.GetHashCode();
}
@ -302,9 +321,13 @@ namespace Chirpstack.Api {
output.WriteRawTag(58);
output.WriteMessage(Time);
}
if (PlaintextMacCommands != false) {
if (PlaintextFOpts != false) {
output.WriteRawTag(64);
output.WriteBool(PlaintextMacCommands);
output.WriteBool(PlaintextFOpts);
}
if (PlaintextFrmPayload != false) {
output.WriteRawTag(72);
output.WriteBool(PlaintextFrmPayload);
}
if (_unknownFields != null) {
_unknownFields.WriteTo(output);
@ -341,9 +364,13 @@ namespace Chirpstack.Api {
output.WriteRawTag(58);
output.WriteMessage(Time);
}
if (PlaintextMacCommands != false) {
if (PlaintextFOpts != false) {
output.WriteRawTag(64);
output.WriteBool(PlaintextMacCommands);
output.WriteBool(PlaintextFOpts);
}
if (PlaintextFrmPayload != false) {
output.WriteRawTag(72);
output.WriteBool(PlaintextFrmPayload);
}
if (_unknownFields != null) {
_unknownFields.WriteTo(ref output);
@ -374,7 +401,10 @@ namespace Chirpstack.Api {
if (time_ != null) {
size += 1 + pb::CodedOutputStream.ComputeMessageSize(Time);
}
if (PlaintextMacCommands != false) {
if (PlaintextFOpts != false) {
size += 1 + 1;
}
if (PlaintextFrmPayload != false) {
size += 1 + 1;
}
if (_unknownFields != null) {
@ -414,8 +444,11 @@ namespace Chirpstack.Api {
}
Time.MergeFrom(other.Time);
}
if (other.PlaintextMacCommands != false) {
PlaintextMacCommands = other.PlaintextMacCommands;
if (other.PlaintextFOpts != false) {
PlaintextFOpts = other.PlaintextFOpts;
}
if (other.PlaintextFrmPayload != false) {
PlaintextFrmPayload = other.PlaintextFrmPayload;
}
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
}
@ -467,7 +500,11 @@ namespace Chirpstack.Api {
break;
}
case 64: {
PlaintextMacCommands = input.ReadBool();
PlaintextFOpts = input.ReadBool();
break;
}
case 72: {
PlaintextFrmPayload = input.ReadBool();
break;
}
}
@ -520,7 +557,11 @@ namespace Chirpstack.Api {
break;
}
case 64: {
PlaintextMacCommands = input.ReadBool();
PlaintextFOpts = input.ReadBool();
break;
}
case 72: {
PlaintextFrmPayload = input.ReadBool();
break;
}
}
@ -572,7 +613,8 @@ namespace Chirpstack.Api {
mType_ = other.mType_;
devAddr_ = other.devAddr_;
devEui_ = other.devEui_;
plaintextMacCommands_ = other.plaintextMacCommands_;
plaintextFOpts_ = other.plaintextFOpts_;
plaintextFrmPayload_ = other.plaintextFrmPayload_;
_unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
}
@ -702,18 +744,33 @@ namespace Chirpstack.Api {
}
}
/// <summary>Field number for the "plaintext_mac_commands" field.</summary>
public const int PlaintextMacCommandsFieldNumber = 9;
private bool plaintextMacCommands_;
/// <summary>Field number for the "plaintext_f_opts" field.</summary>
public const int PlaintextFOptsFieldNumber = 9;
private bool plaintextFOpts_;
/// <summary>
/// Plaintext mac-commands.
/// Plaintext f_opts mac-commands.
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public bool PlaintextMacCommands {
get { return plaintextMacCommands_; }
public bool PlaintextFOpts {
get { return plaintextFOpts_; }
set {
plaintextMacCommands_ = value;
plaintextFOpts_ = value;
}
}
/// <summary>Field number for the "plaintext_frm_payload" field.</summary>
public const int PlaintextFrmPayloadFieldNumber = 10;
private bool plaintextFrmPayload_;
/// <summary>
/// Plaintext frm_payload.
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public bool PlaintextFrmPayload {
get { return plaintextFrmPayload_; }
set {
plaintextFrmPayload_ = value;
}
}
@ -740,7 +797,8 @@ namespace Chirpstack.Api {
if (MType != other.MType) return false;
if (DevAddr != other.DevAddr) return false;
if (DevEui != other.DevEui) return false;
if (PlaintextMacCommands != other.PlaintextMacCommands) return false;
if (PlaintextFOpts != other.PlaintextFOpts) return false;
if (PlaintextFrmPayload != other.PlaintextFrmPayload) return false;
return Equals(_unknownFields, other._unknownFields);
}
@ -756,7 +814,8 @@ namespace Chirpstack.Api {
if (MType != global::Chirpstack.Common.MType.JoinRequest) hash ^= MType.GetHashCode();
if (DevAddr.Length != 0) hash ^= DevAddr.GetHashCode();
if (DevEui.Length != 0) hash ^= DevEui.GetHashCode();
if (PlaintextMacCommands != false) hash ^= PlaintextMacCommands.GetHashCode();
if (PlaintextFOpts != false) hash ^= PlaintextFOpts.GetHashCode();
if (PlaintextFrmPayload != false) hash ^= PlaintextFrmPayload.GetHashCode();
if (_unknownFields != null) {
hash ^= _unknownFields.GetHashCode();
}
@ -807,9 +866,13 @@ namespace Chirpstack.Api {
output.WriteRawTag(66);
output.WriteString(DevEui);
}
if (PlaintextMacCommands != false) {
if (PlaintextFOpts != false) {
output.WriteRawTag(72);
output.WriteBool(PlaintextMacCommands);
output.WriteBool(PlaintextFOpts);
}
if (PlaintextFrmPayload != false) {
output.WriteRawTag(80);
output.WriteBool(PlaintextFrmPayload);
}
if (_unknownFields != null) {
_unknownFields.WriteTo(output);
@ -853,9 +916,13 @@ namespace Chirpstack.Api {
output.WriteRawTag(66);
output.WriteString(DevEui);
}
if (PlaintextMacCommands != false) {
if (PlaintextFOpts != false) {
output.WriteRawTag(72);
output.WriteBool(PlaintextMacCommands);
output.WriteBool(PlaintextFOpts);
}
if (PlaintextFrmPayload != false) {
output.WriteRawTag(80);
output.WriteBool(PlaintextFrmPayload);
}
if (_unknownFields != null) {
_unknownFields.WriteTo(ref output);
@ -891,7 +958,10 @@ namespace Chirpstack.Api {
if (DevEui.Length != 0) {
size += 1 + pb::CodedOutputStream.ComputeStringSize(DevEui);
}
if (PlaintextMacCommands != false) {
if (PlaintextFOpts != false) {
size += 1 + 1;
}
if (PlaintextFrmPayload != false) {
size += 1 + 1;
}
if (_unknownFields != null) {
@ -936,8 +1006,11 @@ namespace Chirpstack.Api {
if (other.DevEui.Length != 0) {
DevEui = other.DevEui;
}
if (other.PlaintextMacCommands != false) {
PlaintextMacCommands = other.PlaintextMacCommands;
if (other.PlaintextFOpts != false) {
PlaintextFOpts = other.PlaintextFOpts;
}
if (other.PlaintextFrmPayload != false) {
PlaintextFrmPayload = other.PlaintextFrmPayload;
}
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
}
@ -993,7 +1066,11 @@ namespace Chirpstack.Api {
break;
}
case 72: {
PlaintextMacCommands = input.ReadBool();
PlaintextFOpts = input.ReadBool();
break;
}
case 80: {
PlaintextFrmPayload = input.ReadBool();
break;
}
}
@ -1050,7 +1127,11 @@ namespace Chirpstack.Api {
break;
}
case 72: {
PlaintextMacCommands = input.ReadBool();
PlaintextFOpts = input.ReadBool();
break;
}
case 80: {
PlaintextFrmPayload = input.ReadBool();
break;
}
}

2040
api/csharp/Chirpstack/api/Relay.cs vendored Normal file

File diff suppressed because it is too large Load Diff

412
api/csharp/Chirpstack/api/RelayGrpc.cs vendored Normal file
View File

@ -0,0 +1,412 @@
// <auto-generated>
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: api/relay.proto
// </auto-generated>
#pragma warning disable 0414, 1591, 8981
#region Designer generated code
using grpc = global::Grpc.Core;
namespace Chirpstack.Api {
/// <summary>
/// RelayService is the service providing API methos for managing relays.
/// </summary>
public static partial class RelayService
{
static readonly string __ServiceName = "api.RelayService";
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
static void __Helper_SerializeMessage(global::Google.Protobuf.IMessage message, grpc::SerializationContext context)
{
#if !GRPC_DISABLE_PROTOBUF_BUFFER_SERIALIZATION
if (message is global::Google.Protobuf.IBufferMessage)
{
context.SetPayloadLength(message.CalculateSize());
global::Google.Protobuf.MessageExtensions.WriteTo(message, context.GetBufferWriter());
context.Complete();
return;
}
#endif
context.Complete(global::Google.Protobuf.MessageExtensions.ToByteArray(message));
}
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
static class __Helper_MessageCache<T>
{
public static readonly bool IsBufferMessage = global::System.Reflection.IntrospectionExtensions.GetTypeInfo(typeof(global::Google.Protobuf.IBufferMessage)).IsAssignableFrom(typeof(T));
}
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
static T __Helper_DeserializeMessage<T>(grpc::DeserializationContext context, global::Google.Protobuf.MessageParser<T> parser) where T : global::Google.Protobuf.IMessage<T>
{
#if !GRPC_DISABLE_PROTOBUF_BUFFER_SERIALIZATION
if (__Helper_MessageCache<T>.IsBufferMessage)
{
return parser.ParseFrom(context.PayloadAsReadOnlySequence());
}
#endif
return parser.ParseFrom(context.PayloadAsNewBuffer());
}
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
static readonly grpc::Marshaller<global::Chirpstack.Api.ListRelaysRequest> __Marshaller_api_ListRelaysRequest = grpc::Marshallers.Create(__Helper_SerializeMessage, context => __Helper_DeserializeMessage(context, global::Chirpstack.Api.ListRelaysRequest.Parser));
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
static readonly grpc::Marshaller<global::Chirpstack.Api.ListRelaysResponse> __Marshaller_api_ListRelaysResponse = grpc::Marshallers.Create(__Helper_SerializeMessage, context => __Helper_DeserializeMessage(context, global::Chirpstack.Api.ListRelaysResponse.Parser));
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
static readonly grpc::Marshaller<global::Chirpstack.Api.AddRelayDeviceRequest> __Marshaller_api_AddRelayDeviceRequest = grpc::Marshallers.Create(__Helper_SerializeMessage, context => __Helper_DeserializeMessage(context, global::Chirpstack.Api.AddRelayDeviceRequest.Parser));
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
static readonly grpc::Marshaller<global::Google.Protobuf.WellKnownTypes.Empty> __Marshaller_google_protobuf_Empty = grpc::Marshallers.Create(__Helper_SerializeMessage, context => __Helper_DeserializeMessage(context, global::Google.Protobuf.WellKnownTypes.Empty.Parser));
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
static readonly grpc::Marshaller<global::Chirpstack.Api.RemoveRelayDeviceRequest> __Marshaller_api_RemoveRelayDeviceRequest = grpc::Marshallers.Create(__Helper_SerializeMessage, context => __Helper_DeserializeMessage(context, global::Chirpstack.Api.RemoveRelayDeviceRequest.Parser));
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
static readonly grpc::Marshaller<global::Chirpstack.Api.ListRelayDevicesRequest> __Marshaller_api_ListRelayDevicesRequest = grpc::Marshallers.Create(__Helper_SerializeMessage, context => __Helper_DeserializeMessage(context, global::Chirpstack.Api.ListRelayDevicesRequest.Parser));
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
static readonly grpc::Marshaller<global::Chirpstack.Api.ListRelayDevicesResponse> __Marshaller_api_ListRelayDevicesResponse = grpc::Marshallers.Create(__Helper_SerializeMessage, context => __Helper_DeserializeMessage(context, global::Chirpstack.Api.ListRelayDevicesResponse.Parser));
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
static readonly grpc::Method<global::Chirpstack.Api.ListRelaysRequest, global::Chirpstack.Api.ListRelaysResponse> __Method_List = new grpc::Method<global::Chirpstack.Api.ListRelaysRequest, global::Chirpstack.Api.ListRelaysResponse>(
grpc::MethodType.Unary,
__ServiceName,
"List",
__Marshaller_api_ListRelaysRequest,
__Marshaller_api_ListRelaysResponse);
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
static readonly grpc::Method<global::Chirpstack.Api.AddRelayDeviceRequest, global::Google.Protobuf.WellKnownTypes.Empty> __Method_AddDevice = new grpc::Method<global::Chirpstack.Api.AddRelayDeviceRequest, global::Google.Protobuf.WellKnownTypes.Empty>(
grpc::MethodType.Unary,
__ServiceName,
"AddDevice",
__Marshaller_api_AddRelayDeviceRequest,
__Marshaller_google_protobuf_Empty);
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
static readonly grpc::Method<global::Chirpstack.Api.RemoveRelayDeviceRequest, global::Google.Protobuf.WellKnownTypes.Empty> __Method_RemoveDevice = new grpc::Method<global::Chirpstack.Api.RemoveRelayDeviceRequest, global::Google.Protobuf.WellKnownTypes.Empty>(
grpc::MethodType.Unary,
__ServiceName,
"RemoveDevice",
__Marshaller_api_RemoveRelayDeviceRequest,
__Marshaller_google_protobuf_Empty);
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
static readonly grpc::Method<global::Chirpstack.Api.ListRelayDevicesRequest, global::Chirpstack.Api.ListRelayDevicesResponse> __Method_ListDevices = new grpc::Method<global::Chirpstack.Api.ListRelayDevicesRequest, global::Chirpstack.Api.ListRelayDevicesResponse>(
grpc::MethodType.Unary,
__ServiceName,
"ListDevices",
__Marshaller_api_ListRelayDevicesRequest,
__Marshaller_api_ListRelayDevicesResponse);
/// <summary>Service descriptor</summary>
public static global::Google.Protobuf.Reflection.ServiceDescriptor Descriptor
{
get { return global::Chirpstack.Api.RelayReflection.Descriptor.Services[0]; }
}
/// <summary>Base class for server-side implementations of RelayService</summary>
[grpc::BindServiceMethod(typeof(RelayService), "BindService")]
public abstract partial class RelayServiceBase
{
/// <summary>
/// List lists the relays for the given application id.
/// </summary>
/// <param name="request">The request received from the client.</param>
/// <param name="context">The context of the server-side call handler being invoked.</param>
/// <returns>The response to send back to the client (wrapped by a task).</returns>
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
public virtual global::System.Threading.Tasks.Task<global::Chirpstack.Api.ListRelaysResponse> List(global::Chirpstack.Api.ListRelaysRequest request, grpc::ServerCallContext context)
{
throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, ""));
}
/// <summary>
/// AddDevice adds the given device to the relay.
/// </summary>
/// <param name="request">The request received from the client.</param>
/// <param name="context">The context of the server-side call handler being invoked.</param>
/// <returns>The response to send back to the client (wrapped by a task).</returns>
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
public virtual global::System.Threading.Tasks.Task<global::Google.Protobuf.WellKnownTypes.Empty> AddDevice(global::Chirpstack.Api.AddRelayDeviceRequest request, grpc::ServerCallContext context)
{
throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, ""));
}
/// <summary>
/// RemoveDevice removes the given device from the relay.
/// </summary>
/// <param name="request">The request received from the client.</param>
/// <param name="context">The context of the server-side call handler being invoked.</param>
/// <returns>The response to send back to the client (wrapped by a task).</returns>
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
public virtual global::System.Threading.Tasks.Task<global::Google.Protobuf.WellKnownTypes.Empty> RemoveDevice(global::Chirpstack.Api.RemoveRelayDeviceRequest request, grpc::ServerCallContext context)
{
throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, ""));
}
/// <summary>
/// ListDevices lists the devices for the given relay.
/// </summary>
/// <param name="request">The request received from the client.</param>
/// <param name="context">The context of the server-side call handler being invoked.</param>
/// <returns>The response to send back to the client (wrapped by a task).</returns>
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
public virtual global::System.Threading.Tasks.Task<global::Chirpstack.Api.ListRelayDevicesResponse> ListDevices(global::Chirpstack.Api.ListRelayDevicesRequest request, grpc::ServerCallContext context)
{
throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, ""));
}
}
/// <summary>Client for RelayService</summary>
public partial class RelayServiceClient : grpc::ClientBase<RelayServiceClient>
{
/// <summary>Creates a new client for RelayService</summary>
/// <param name="channel">The channel to use to make remote calls.</param>
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
public RelayServiceClient(grpc::ChannelBase channel) : base(channel)
{
}
/// <summary>Creates a new client for RelayService that uses a custom <c>CallInvoker</c>.</summary>
/// <param name="callInvoker">The callInvoker to use to make remote calls.</param>
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
public RelayServiceClient(grpc::CallInvoker callInvoker) : base(callInvoker)
{
}
/// <summary>Protected parameterless constructor to allow creation of test doubles.</summary>
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
protected RelayServiceClient() : base()
{
}
/// <summary>Protected constructor to allow creation of configured clients.</summary>
/// <param name="configuration">The client configuration.</param>
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
protected RelayServiceClient(ClientBaseConfiguration configuration) : base(configuration)
{
}
/// <summary>
/// List lists the relays for the given application id.
/// </summary>
/// <param name="request">The request to send to the server.</param>
/// <param name="headers">The initial metadata to send with the call. This parameter is optional.</param>
/// <param name="deadline">An optional deadline for the call. The call will be cancelled if deadline is hit.</param>
/// <param name="cancellationToken">An optional token for canceling the call.</param>
/// <returns>The response received from the server.</returns>
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
public virtual global::Chirpstack.Api.ListRelaysResponse List(global::Chirpstack.Api.ListRelaysRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
{
return List(request, new grpc::CallOptions(headers, deadline, cancellationToken));
}
/// <summary>
/// List lists the relays for the given application id.
/// </summary>
/// <param name="request">The request to send to the server.</param>
/// <param name="options">The options for the call.</param>
/// <returns>The response received from the server.</returns>
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
public virtual global::Chirpstack.Api.ListRelaysResponse List(global::Chirpstack.Api.ListRelaysRequest request, grpc::CallOptions options)
{
return CallInvoker.BlockingUnaryCall(__Method_List, null, options, request);
}
/// <summary>
/// List lists the relays for the given application id.
/// </summary>
/// <param name="request">The request to send to the server.</param>
/// <param name="headers">The initial metadata to send with the call. This parameter is optional.</param>
/// <param name="deadline">An optional deadline for the call. The call will be cancelled if deadline is hit.</param>
/// <param name="cancellationToken">An optional token for canceling the call.</param>
/// <returns>The call object.</returns>
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
public virtual grpc::AsyncUnaryCall<global::Chirpstack.Api.ListRelaysResponse> ListAsync(global::Chirpstack.Api.ListRelaysRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
{
return ListAsync(request, new grpc::CallOptions(headers, deadline, cancellationToken));
}
/// <summary>
/// List lists the relays for the given application id.
/// </summary>
/// <param name="request">The request to send to the server.</param>
/// <param name="options">The options for the call.</param>
/// <returns>The call object.</returns>
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
public virtual grpc::AsyncUnaryCall<global::Chirpstack.Api.ListRelaysResponse> ListAsync(global::Chirpstack.Api.ListRelaysRequest request, grpc::CallOptions options)
{
return CallInvoker.AsyncUnaryCall(__Method_List, null, options, request);
}
/// <summary>
/// AddDevice adds the given device to the relay.
/// </summary>
/// <param name="request">The request to send to the server.</param>
/// <param name="headers">The initial metadata to send with the call. This parameter is optional.</param>
/// <param name="deadline">An optional deadline for the call. The call will be cancelled if deadline is hit.</param>
/// <param name="cancellationToken">An optional token for canceling the call.</param>
/// <returns>The response received from the server.</returns>
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
public virtual global::Google.Protobuf.WellKnownTypes.Empty AddDevice(global::Chirpstack.Api.AddRelayDeviceRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
{
return AddDevice(request, new grpc::CallOptions(headers, deadline, cancellationToken));
}
/// <summary>
/// AddDevice adds the given device to the relay.
/// </summary>
/// <param name="request">The request to send to the server.</param>
/// <param name="options">The options for the call.</param>
/// <returns>The response received from the server.</returns>
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
public virtual global::Google.Protobuf.WellKnownTypes.Empty AddDevice(global::Chirpstack.Api.AddRelayDeviceRequest request, grpc::CallOptions options)
{
return CallInvoker.BlockingUnaryCall(__Method_AddDevice, null, options, request);
}
/// <summary>
/// AddDevice adds the given device to the relay.
/// </summary>
/// <param name="request">The request to send to the server.</param>
/// <param name="headers">The initial metadata to send with the call. This parameter is optional.</param>
/// <param name="deadline">An optional deadline for the call. The call will be cancelled if deadline is hit.</param>
/// <param name="cancellationToken">An optional token for canceling the call.</param>
/// <returns>The call object.</returns>
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
public virtual grpc::AsyncUnaryCall<global::Google.Protobuf.WellKnownTypes.Empty> AddDeviceAsync(global::Chirpstack.Api.AddRelayDeviceRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
{
return AddDeviceAsync(request, new grpc::CallOptions(headers, deadline, cancellationToken));
}
/// <summary>
/// AddDevice adds the given device to the relay.
/// </summary>
/// <param name="request">The request to send to the server.</param>
/// <param name="options">The options for the call.</param>
/// <returns>The call object.</returns>
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
public virtual grpc::AsyncUnaryCall<global::Google.Protobuf.WellKnownTypes.Empty> AddDeviceAsync(global::Chirpstack.Api.AddRelayDeviceRequest request, grpc::CallOptions options)
{
return CallInvoker.AsyncUnaryCall(__Method_AddDevice, null, options, request);
}
/// <summary>
/// RemoveDevice removes the given device from the relay.
/// </summary>
/// <param name="request">The request to send to the server.</param>
/// <param name="headers">The initial metadata to send with the call. This parameter is optional.</param>
/// <param name="deadline">An optional deadline for the call. The call will be cancelled if deadline is hit.</param>
/// <param name="cancellationToken">An optional token for canceling the call.</param>
/// <returns>The response received from the server.</returns>
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
public virtual global::Google.Protobuf.WellKnownTypes.Empty RemoveDevice(global::Chirpstack.Api.RemoveRelayDeviceRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
{
return RemoveDevice(request, new grpc::CallOptions(headers, deadline, cancellationToken));
}
/// <summary>
/// RemoveDevice removes the given device from the relay.
/// </summary>
/// <param name="request">The request to send to the server.</param>
/// <param name="options">The options for the call.</param>
/// <returns>The response received from the server.</returns>
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
public virtual global::Google.Protobuf.WellKnownTypes.Empty RemoveDevice(global::Chirpstack.Api.RemoveRelayDeviceRequest request, grpc::CallOptions options)
{
return CallInvoker.BlockingUnaryCall(__Method_RemoveDevice, null, options, request);
}
/// <summary>
/// RemoveDevice removes the given device from the relay.
/// </summary>
/// <param name="request">The request to send to the server.</param>
/// <param name="headers">The initial metadata to send with the call. This parameter is optional.</param>
/// <param name="deadline">An optional deadline for the call. The call will be cancelled if deadline is hit.</param>
/// <param name="cancellationToken">An optional token for canceling the call.</param>
/// <returns>The call object.</returns>
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
public virtual grpc::AsyncUnaryCall<global::Google.Protobuf.WellKnownTypes.Empty> RemoveDeviceAsync(global::Chirpstack.Api.RemoveRelayDeviceRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
{
return RemoveDeviceAsync(request, new grpc::CallOptions(headers, deadline, cancellationToken));
}
/// <summary>
/// RemoveDevice removes the given device from the relay.
/// </summary>
/// <param name="request">The request to send to the server.</param>
/// <param name="options">The options for the call.</param>
/// <returns>The call object.</returns>
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
public virtual grpc::AsyncUnaryCall<global::Google.Protobuf.WellKnownTypes.Empty> RemoveDeviceAsync(global::Chirpstack.Api.RemoveRelayDeviceRequest request, grpc::CallOptions options)
{
return CallInvoker.AsyncUnaryCall(__Method_RemoveDevice, null, options, request);
}
/// <summary>
/// ListDevices lists the devices for the given relay.
/// </summary>
/// <param name="request">The request to send to the server.</param>
/// <param name="headers">The initial metadata to send with the call. This parameter is optional.</param>
/// <param name="deadline">An optional deadline for the call. The call will be cancelled if deadline is hit.</param>
/// <param name="cancellationToken">An optional token for canceling the call.</param>
/// <returns>The response received from the server.</returns>
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
public virtual global::Chirpstack.Api.ListRelayDevicesResponse ListDevices(global::Chirpstack.Api.ListRelayDevicesRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
{
return ListDevices(request, new grpc::CallOptions(headers, deadline, cancellationToken));
}
/// <summary>
/// ListDevices lists the devices for the given relay.
/// </summary>
/// <param name="request">The request to send to the server.</param>
/// <param name="options">The options for the call.</param>
/// <returns>The response received from the server.</returns>
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
public virtual global::Chirpstack.Api.ListRelayDevicesResponse ListDevices(global::Chirpstack.Api.ListRelayDevicesRequest request, grpc::CallOptions options)
{
return CallInvoker.BlockingUnaryCall(__Method_ListDevices, null, options, request);
}
/// <summary>
/// ListDevices lists the devices for the given relay.
/// </summary>
/// <param name="request">The request to send to the server.</param>
/// <param name="headers">The initial metadata to send with the call. This parameter is optional.</param>
/// <param name="deadline">An optional deadline for the call. The call will be cancelled if deadline is hit.</param>
/// <param name="cancellationToken">An optional token for canceling the call.</param>
/// <returns>The call object.</returns>
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
public virtual grpc::AsyncUnaryCall<global::Chirpstack.Api.ListRelayDevicesResponse> ListDevicesAsync(global::Chirpstack.Api.ListRelayDevicesRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
{
return ListDevicesAsync(request, new grpc::CallOptions(headers, deadline, cancellationToken));
}
/// <summary>
/// ListDevices lists the devices for the given relay.
/// </summary>
/// <param name="request">The request to send to the server.</param>
/// <param name="options">The options for the call.</param>
/// <returns>The call object.</returns>
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
public virtual grpc::AsyncUnaryCall<global::Chirpstack.Api.ListRelayDevicesResponse> ListDevicesAsync(global::Chirpstack.Api.ListRelayDevicesRequest request, grpc::CallOptions options)
{
return CallInvoker.AsyncUnaryCall(__Method_ListDevices, null, options, request);
}
/// <summary>Creates a new instance of client from given <c>ClientBaseConfiguration</c>.</summary>
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
protected override RelayServiceClient NewInstance(ClientBaseConfiguration configuration)
{
return new RelayServiceClient(configuration);
}
}
/// <summary>Creates service definition that can be registered with a server</summary>
/// <param name="serviceImpl">An object implementing the server-side handling logic.</param>
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
public static grpc::ServerServiceDefinition BindService(RelayServiceBase serviceImpl)
{
return grpc::ServerServiceDefinition.CreateBuilder()
.AddMethod(__Method_List, serviceImpl.List)
.AddMethod(__Method_AddDevice, serviceImpl.AddDevice)
.AddMethod(__Method_RemoveDevice, serviceImpl.RemoveDevice)
.AddMethod(__Method_ListDevices, serviceImpl.ListDevices).Build();
}
/// <summary>Register service method with a service binder with or without implementation. Useful when customizing the service binding logic.
/// Note: this method is part of an experimental API that can change or be removed without any prior notice.</summary>
/// <param name="serviceBinder">Service methods will be bound by calling <c>AddMethod</c> on this object.</param>
/// <param name="serviceImpl">An object implementing the server-side handling logic.</param>
[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
public static void BindService(grpc::ServiceBinderBase serviceBinder, RelayServiceBase serviceImpl)
{
serviceBinder.AddMethod(__Method_List, serviceImpl == null ? null : new grpc::UnaryServerMethod<global::Chirpstack.Api.ListRelaysRequest, global::Chirpstack.Api.ListRelaysResponse>(serviceImpl.List));
serviceBinder.AddMethod(__Method_AddDevice, serviceImpl == null ? null : new grpc::UnaryServerMethod<global::Chirpstack.Api.AddRelayDeviceRequest, global::Google.Protobuf.WellKnownTypes.Empty>(serviceImpl.AddDevice));
serviceBinder.AddMethod(__Method_RemoveDevice, serviceImpl == null ? null : new grpc::UnaryServerMethod<global::Chirpstack.Api.RemoveRelayDeviceRequest, global::Google.Protobuf.WellKnownTypes.Empty>(serviceImpl.RemoveDevice));
serviceBinder.AddMethod(__Method_ListDevices, serviceImpl == null ? null : new grpc::UnaryServerMethod<global::Chirpstack.Api.ListRelayDevicesRequest, global::Chirpstack.Api.ListRelayDevicesResponse>(serviceImpl.ListDevices));
}
}
}
#endregion

View File

@ -304,7 +304,8 @@ namespace Chirpstack.Gateway {
/// </summary>
[pbr::OriginalName("OK")] Ok = 1,
/// <summary>
/// Rejected because it was already too late to program this packet for downlink.
/// Rejected because it was already too late to program this packet for
/// downlink.
/// </summary>
[pbr::OriginalName("TOO_LATE")] TooLate = 2,
/// <summary>
@ -312,7 +313,8 @@ namespace Chirpstack.Gateway {
/// </summary>
[pbr::OriginalName("TOO_EARLY")] TooEarly = 3,
/// <summary>
/// Rejected because there was already a packet programmed in requested timeframe.
/// Rejected because there was already a packet programmed in requested
/// timeframe.
/// </summary>
[pbr::OriginalName("COLLISION_PACKET")] CollisionPacket = 4,
/// <summary>
@ -3958,7 +3960,8 @@ namespace Chirpstack.Gateway {
private pb::ByteString uplinkId_ = pb::ByteString.Empty;
/// <summary>
/// Uplink ID (UUID bytes).
/// Unique and random ID which can be used to correlate the uplink across multiple logs.
/// Unique and random ID which can be used to correlate the uplink across
/// multiple logs.
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
@ -7174,7 +7177,8 @@ namespace Chirpstack.Gateway {
private global::Google.Protobuf.WellKnownTypes.Duration delay_;
/// <summary>
/// Delay (duration).
/// The delay will be added to the gateway internal timing, provided by the context object.
/// The delay will be added to the gateway internal timing, provided by the
/// context object.
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
@ -10783,7 +10787,8 @@ namespace Chirpstack.Gateway {
private string command_ = "";
/// <summary>
/// Command to execute.
/// This command must be pre-configured in the LoRa Gateway Bridge configuration.
/// This command must be pre-configured in the LoRa Gateway Bridge
/// configuration.
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]

View File

@ -33,65 +33,72 @@ namespace Chirpstack.Integration {
"ASgJEhsKE2RldmljZV9wcm9maWxlX25hbWUYBiABKAkSEwoLZGV2aWNlX25h",
"bWUYByABKAkSDwoHZGV2X2V1aRgIIAEoCRIvCgR0YWdzGAkgAygLMiEuaW50",
"ZWdyYXRpb24uRGV2aWNlSW5mby5UYWdzRW50cnkaKwoJVGFnc0VudHJ5EgsK",
"A2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEi2QIKC1VwbGlua0V2ZW50",
"EhgKEGRlZHVwbGljYXRpb25faWQYASABKAkSKAoEdGltZRgCIAEoCzIaLmdv",
"b2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLAoLZGV2aWNlX2luZm8YAyABKAsy",
"Fy5pbnRlZ3JhdGlvbi5EZXZpY2VJbmZvEhAKCGRldl9hZGRyGAQgASgJEgsK",
"A2FkchgFIAEoCBIKCgJkchgGIAEoDRINCgVmX2NudBgHIAEoDRIOCgZmX3Bv",
"cnQYCCABKA0SEQoJY29uZmlybWVkGAkgASgIEgwKBGRhdGEYCiABKAwSJwoG",
"b2JqZWN0GAsgASgLMhcuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdBIhCgdyeF9p",
"bmZvGAwgAygLMhAuZ3cuVXBsaW5rUnhJbmZvEiEKB3R4X2luZm8YDSABKAsy",
"EC5ndy5VcGxpbmtUeEluZm8ijwEKCUpvaW5FdmVudBIYChBkZWR1cGxpY2F0",
"aW9uX2lkGAEgASgJEigKBHRpbWUYAiABKAsyGi5nb29nbGUucHJvdG9idWYu",
"VGltZXN0YW1wEiwKC2RldmljZV9pbmZvGAMgASgLMhcuaW50ZWdyYXRpb24u",
"RGV2aWNlSW5mbxIQCghkZXZfYWRkchgEIAEoCSK9AQoIQWNrRXZlbnQSGAoQ",
"ZGVkdXBsaWNhdGlvbl9pZBgBIAEoCRIoCgR0aW1lGAIgASgLMhouZ29vZ2xl",
"LnByb3RvYnVmLlRpbWVzdGFtcBIsCgtkZXZpY2VfaW5mbxgDIAEoCzIXLmlu",
"dGVncmF0aW9uLkRldmljZUluZm8SFQoNcXVldWVfaXRlbV9pZBgEIAEoCRIU",
"CgxhY2tub3dsZWRnZWQYBSABKAgSEgoKZl9jbnRfZG93bhgGIAEoDSLdAQoK",
"VHhBY2tFdmVudBITCgtkb3dubGlua19pZBgBIAEoDRIoCgR0aW1lGAIgASgL",
"MhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIsCgtkZXZpY2VfaW5mbxgD",
"IAEoCzIXLmludGVncmF0aW9uLkRldmljZUluZm8SFQoNcXVldWVfaXRlbV9p",
"ZBgEIAEoCRISCgpmX2NudF9kb3duGAUgASgNEhIKCmdhdGV3YXlfaWQYBiAB",
"KAkSIwoHdHhfaW5mbxgHIAEoCzISLmd3LkRvd25saW5rVHhJbmZvIqYCCghM",
"b2dFdmVudBIoCgR0aW1lGAEgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVz",
"dGFtcBIsCgtkZXZpY2VfaW5mbxgCIAEoCzIXLmludGVncmF0aW9uLkRldmlj",
"ZUluZm8SJAoFbGV2ZWwYAyABKA4yFS5pbnRlZ3JhdGlvbi5Mb2dMZXZlbBIi",
"CgRjb2RlGAQgASgOMhQuaW50ZWdyYXRpb24uTG9nQ29kZRITCgtkZXNjcmlw",
"dGlvbhgFIAEoCRIzCgdjb250ZXh0GAYgAygLMiIuaW50ZWdyYXRpb24uTG9n",
"RXZlbnQuQ29udGV4dEVudHJ5Gi4KDENvbnRleHRFbnRyeRILCgNrZXkYASAB",
"KAkSDQoFdmFsdWUYAiABKAk6AjgBIugBCgtTdGF0dXNFdmVudBIYChBkZWR1",
"cGxpY2F0aW9uX2lkGAEgASgJEigKBHRpbWUYAiABKAsyGi5nb29nbGUucHJv",
"dG9idWYuVGltZXN0YW1wEiwKC2RldmljZV9pbmZvGAMgASgLMhcuaW50ZWdy",
"YXRpb24uRGV2aWNlSW5mbxIOCgZtYXJnaW4YBSABKAUSHQoVZXh0ZXJuYWxf",
"cG93ZXJfc291cmNlGAYgASgIEiEKGWJhdHRlcnlfbGV2ZWxfdW5hdmFpbGFi",
"bGUYByABKAgSFQoNYmF0dGVyeV9sZXZlbBgIIAEoAiKlAQoNTG9jYXRpb25F",
"dmVudBIYChBkZWR1cGxpY2F0aW9uX2lkGAEgASgJEigKBHRpbWUYAiABKAsy",
"Gi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEiwKC2RldmljZV9pbmZvGAMg",
"ASgLMhcuaW50ZWdyYXRpb24uRGV2aWNlSW5mbxIiCghsb2NhdGlvbhgEIAEo",
"CzIQLmNvbW1vbi5Mb2NhdGlvbiLbAQoQSW50ZWdyYXRpb25FdmVudBIYChBk",
"ZWR1cGxpY2F0aW9uX2lkGAEgASgJEigKBHRpbWUYAiABKAsyGi5nb29nbGUu",
"cHJvdG9idWYuVGltZXN0YW1wEiwKC2RldmljZV9pbmZvGAMgASgLMhcuaW50",
"ZWdyYXRpb24uRGV2aWNlSW5mbxIYChBpbnRlZ3JhdGlvbl9uYW1lGAQgASgJ",
"EhIKCmV2ZW50X3R5cGUYBSABKAkSJwoGb2JqZWN0GAYgASgLMhcuZ29vZ2xl",
"LnByb3RvYnVmLlN0cnVjdCKIAQoPRG93bmxpbmtDb21tYW5kEgoKAmlkGAEg",
"ASgJEg8KB2Rldl9ldWkYAiABKAkSEQoJY29uZmlybWVkGAMgASgIEg4KBmZf",
"cG9ydBgEIAEoDRIMCgRkYXRhGAUgASgMEicKBm9iamVjdBgGIAEoCzIXLmdv",
"b2dsZS5wcm90b2J1Zi5TdHJ1Y3QqLAoITG9nTGV2ZWwSCAoESU5GTxAAEgsK",
"B1dBUk5JTkcQARIJCgVFUlJPUhACKsABCgdMb2dDb2RlEgsKB1VOS05PV04Q",
"ABIZChVET1dOTElOS19QQVlMT0FEX1NJWkUQARIQCgxVUExJTktfQ09ERUMQ",
"AhISCg5ET1dOTElOS19DT0RFQxADEggKBE9UQUEQBBIWChJVUExJTktfRl9D",
"TlRfUkVTRVQQBRIOCgpVUExJTktfTUlDEAYSHwobVVBMSU5LX0ZfQ05UX1JF",
"VFJBTlNNSVNTSU9OEAcSFAoQRE9XTkxJTktfR0FURVdBWRAIQoEBCh1pby5j",
"aGlycHN0YWNrLmFwaS5pbnRlZ3JhdGlvbkIQSW50ZWdyYXRpb25Qcm90b1AB",
"WjNnaXRodWIuY29tL2Jyb2NhYXIvY2hpcnBzdGFjay9hcGkvZ28vdjQvaW50",
"ZWdyYXRpb26qAhZDaGlycHN0YWNrLkludGVncmF0aW9uYgZwcm90bzM="));
"A2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEicwoRVXBsaW5rUmVsYXlS",
"eEluZm8SDwoHZGV2X2V1aRgBIAEoCRIRCglmcmVxdWVuY3kYAiABKA0SCgoC",
"ZHIYAyABKA0SCwoDc25yGAQgASgFEgwKBHJzc2kYBSABKAUSEwoLd29yX2No",
"YW5uZWwYBiABKA0ikAMKC1VwbGlua0V2ZW50EhgKEGRlZHVwbGljYXRpb25f",
"aWQYASABKAkSKAoEdGltZRgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1l",
"c3RhbXASLAoLZGV2aWNlX2luZm8YAyABKAsyFy5pbnRlZ3JhdGlvbi5EZXZp",
"Y2VJbmZvEhAKCGRldl9hZGRyGAQgASgJEgsKA2FkchgFIAEoCBIKCgJkchgG",
"IAEoDRINCgVmX2NudBgHIAEoDRIOCgZmX3BvcnQYCCABKA0SEQoJY29uZmly",
"bWVkGAkgASgIEgwKBGRhdGEYCiABKAwSJwoGb2JqZWN0GAsgASgLMhcuZ29v",
"Z2xlLnByb3RvYnVmLlN0cnVjdBIhCgdyeF9pbmZvGAwgAygLMhAuZ3cuVXBs",
"aW5rUnhJbmZvEiEKB3R4X2luZm8YDSABKAsyEC5ndy5VcGxpbmtUeEluZm8S",
"NQoNcmVsYXlfcnhfaW5mbxgOIAEoCzIeLmludGVncmF0aW9uLlVwbGlua1Jl",
"bGF5UnhJbmZvIsYBCglKb2luRXZlbnQSGAoQZGVkdXBsaWNhdGlvbl9pZBgB",
"IAEoCRIoCgR0aW1lGAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFt",
"cBIsCgtkZXZpY2VfaW5mbxgDIAEoCzIXLmludGVncmF0aW9uLkRldmljZUlu",
"Zm8SEAoIZGV2X2FkZHIYBCABKAkSNQoNcmVsYXlfcnhfaW5mbxgFIAEoCzIe",
"LmludGVncmF0aW9uLlVwbGlua1JlbGF5UnhJbmZvIr0BCghBY2tFdmVudBIY",
"ChBkZWR1cGxpY2F0aW9uX2lkGAEgASgJEigKBHRpbWUYAiABKAsyGi5nb29n",
"bGUucHJvdG9idWYuVGltZXN0YW1wEiwKC2RldmljZV9pbmZvGAMgASgLMhcu",
"aW50ZWdyYXRpb24uRGV2aWNlSW5mbxIVCg1xdWV1ZV9pdGVtX2lkGAQgASgJ",
"EhQKDGFja25vd2xlZGdlZBgFIAEoCBISCgpmX2NudF9kb3duGAYgASgNIt0B",
"CgpUeEFja0V2ZW50EhMKC2Rvd25saW5rX2lkGAEgASgNEigKBHRpbWUYAiAB",
"KAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEiwKC2RldmljZV9pbmZv",
"GAMgASgLMhcuaW50ZWdyYXRpb24uRGV2aWNlSW5mbxIVCg1xdWV1ZV9pdGVt",
"X2lkGAQgASgJEhIKCmZfY250X2Rvd24YBSABKA0SEgoKZ2F0ZXdheV9pZBgG",
"IAEoCRIjCgd0eF9pbmZvGAcgASgLMhIuZ3cuRG93bmxpbmtUeEluZm8ipgIK",
"CExvZ0V2ZW50EigKBHRpbWUYASABKAsyGi5nb29nbGUucHJvdG9idWYuVGlt",
"ZXN0YW1wEiwKC2RldmljZV9pbmZvGAIgASgLMhcuaW50ZWdyYXRpb24uRGV2",
"aWNlSW5mbxIkCgVsZXZlbBgDIAEoDjIVLmludGVncmF0aW9uLkxvZ0xldmVs",
"EiIKBGNvZGUYBCABKA4yFC5pbnRlZ3JhdGlvbi5Mb2dDb2RlEhMKC2Rlc2Ny",
"aXB0aW9uGAUgASgJEjMKB2NvbnRleHQYBiADKAsyIi5pbnRlZ3JhdGlvbi5M",
"b2dFdmVudC5Db250ZXh0RW50cnkaLgoMQ29udGV4dEVudHJ5EgsKA2tleRgB",
"IAEoCRINCgV2YWx1ZRgCIAEoCToCOAEi6AEKC1N0YXR1c0V2ZW50EhgKEGRl",
"ZHVwbGljYXRpb25faWQYASABKAkSKAoEdGltZRgCIAEoCzIaLmdvb2dsZS5w",
"cm90b2J1Zi5UaW1lc3RhbXASLAoLZGV2aWNlX2luZm8YAyABKAsyFy5pbnRl",
"Z3JhdGlvbi5EZXZpY2VJbmZvEg4KBm1hcmdpbhgFIAEoBRIdChVleHRlcm5h",
"bF9wb3dlcl9zb3VyY2UYBiABKAgSIQoZYmF0dGVyeV9sZXZlbF91bmF2YWls",
"YWJsZRgHIAEoCBIVCg1iYXR0ZXJ5X2xldmVsGAggASgCIqUBCg1Mb2NhdGlv",
"bkV2ZW50EhgKEGRlZHVwbGljYXRpb25faWQYASABKAkSKAoEdGltZRgCIAEo",
"CzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLAoLZGV2aWNlX2luZm8Y",
"AyABKAsyFy5pbnRlZ3JhdGlvbi5EZXZpY2VJbmZvEiIKCGxvY2F0aW9uGAQg",
"ASgLMhAuY29tbW9uLkxvY2F0aW9uItsBChBJbnRlZ3JhdGlvbkV2ZW50EhgK",
"EGRlZHVwbGljYXRpb25faWQYASABKAkSKAoEdGltZRgCIAEoCzIaLmdvb2ds",
"ZS5wcm90b2J1Zi5UaW1lc3RhbXASLAoLZGV2aWNlX2luZm8YAyABKAsyFy5p",
"bnRlZ3JhdGlvbi5EZXZpY2VJbmZvEhgKEGludGVncmF0aW9uX25hbWUYBCAB",
"KAkSEgoKZXZlbnRfdHlwZRgFIAEoCRInCgZvYmplY3QYBiABKAsyFy5nb29n",
"bGUucHJvdG9idWYuU3RydWN0IogBCg9Eb3dubGlua0NvbW1hbmQSCgoCaWQY",
"ASABKAkSDwoHZGV2X2V1aRgCIAEoCRIRCgljb25maXJtZWQYAyABKAgSDgoG",
"Zl9wb3J0GAQgASgNEgwKBGRhdGEYBSABKAwSJwoGb2JqZWN0GAYgASgLMhcu",
"Z29vZ2xlLnByb3RvYnVmLlN0cnVjdCosCghMb2dMZXZlbBIICgRJTkZPEAAS",
"CwoHV0FSTklORxABEgkKBUVSUk9SEAIq2gEKB0xvZ0NvZGUSCwoHVU5LTk9X",
"ThAAEhkKFURPV05MSU5LX1BBWUxPQURfU0laRRABEhAKDFVQTElOS19DT0RF",
"QxACEhIKDkRPV05MSU5LX0NPREVDEAMSCAoET1RBQRAEEhYKElVQTElOS19G",
"X0NOVF9SRVNFVBAFEg4KClVQTElOS19NSUMQBhIfChtVUExJTktfRl9DTlRf",
"UkVUUkFOU01JU1NJT04QBxIUChBET1dOTElOS19HQVRFV0FZEAgSGAoUUkVM",
"QVlfTkVXX0VORF9ERVZJQ0UQCUKBAQodaW8uY2hpcnBzdGFjay5hcGkuaW50",
"ZWdyYXRpb25CEEludGVncmF0aW9uUHJvdG9QAVozZ2l0aHViLmNvbS9icm9j",
"YWFyL2NoaXJwc3RhY2svYXBpL2dvL3Y0L2ludGVncmF0aW9uqgIWQ2hpcnBz",
"dGFjay5JbnRlZ3JhdGlvbmIGcHJvdG8z"));
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
new pbr::FileDescriptor[] { global::Chirpstack.Common.CommonReflection.Descriptor, global::Chirpstack.Gateway.GwReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.TimestampReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.StructReflection.Descriptor, },
new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Chirpstack.Integration.LogLevel), typeof(global::Chirpstack.Integration.LogCode), }, null, new pbr::GeneratedClrTypeInfo[] {
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Integration.DeviceInfo), global::Chirpstack.Integration.DeviceInfo.Parser, new[]{ "TenantId", "TenantName", "ApplicationId", "ApplicationName", "DeviceProfileId", "DeviceProfileName", "DeviceName", "DevEui", "Tags" }, null, null, null, new pbr::GeneratedClrTypeInfo[] { null, }),
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Integration.UplinkEvent), global::Chirpstack.Integration.UplinkEvent.Parser, new[]{ "DeduplicationId", "Time", "DeviceInfo", "DevAddr", "Adr", "Dr", "FCnt", "FPort", "Confirmed", "Data", "Object", "RxInfo", "TxInfo" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Integration.JoinEvent), global::Chirpstack.Integration.JoinEvent.Parser, new[]{ "DeduplicationId", "Time", "DeviceInfo", "DevAddr" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Integration.UplinkRelayRxInfo), global::Chirpstack.Integration.UplinkRelayRxInfo.Parser, new[]{ "DevEui", "Frequency", "Dr", "Snr", "Rssi", "WorChannel" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Integration.UplinkEvent), global::Chirpstack.Integration.UplinkEvent.Parser, new[]{ "DeduplicationId", "Time", "DeviceInfo", "DevAddr", "Adr", "Dr", "FCnt", "FPort", "Confirmed", "Data", "Object", "RxInfo", "TxInfo", "RelayRxInfo" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Integration.JoinEvent), global::Chirpstack.Integration.JoinEvent.Parser, new[]{ "DeduplicationId", "Time", "DeviceInfo", "DevAddr", "RelayRxInfo" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Integration.AckEvent), global::Chirpstack.Integration.AckEvent.Parser, new[]{ "DeduplicationId", "Time", "DeviceInfo", "QueueItemId", "Acknowledged", "FCntDown" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Integration.TxAckEvent), global::Chirpstack.Integration.TxAckEvent.Parser, new[]{ "DownlinkId", "Time", "DeviceInfo", "QueueItemId", "FCntDown", "GatewayId", "TxInfo" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Integration.LogEvent), global::Chirpstack.Integration.LogEvent.Parser, new[]{ "Time", "DeviceInfo", "Level", "Code", "Description", "Context" }, null, null, null, new pbr::GeneratedClrTypeInfo[] { null, }),
@ -158,6 +165,10 @@ namespace Chirpstack.Integration {
/// Downlink gateway error.
/// </summary>
[pbr::OriginalName("DOWNLINK_GATEWAY")] DownlinkGateway = 8,
/// <summary>
/// Relay new end-device.
/// </summary>
[pbr::OriginalName("RELAY_NEW_END_DEVICE")] RelayNewEndDevice = 9,
}
#endregion
@ -667,6 +678,401 @@ namespace Chirpstack.Integration {
}
/// <summary>
/// Uplink relay RX information.
/// </summary>
public sealed partial class UplinkRelayRxInfo : pb::IMessage<UplinkRelayRxInfo>
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
, pb::IBufferMessage
#endif
{
private static readonly pb::MessageParser<UplinkRelayRxInfo> _parser = new pb::MessageParser<UplinkRelayRxInfo>(() => new UplinkRelayRxInfo());
private pb::UnknownFieldSet _unknownFields;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static pb::MessageParser<UplinkRelayRxInfo> Parser { get { return _parser; } }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static pbr::MessageDescriptor Descriptor {
get { return global::Chirpstack.Integration.IntegrationReflection.Descriptor.MessageTypes[1]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
pbr::MessageDescriptor pb::IMessage.Descriptor {
get { return Descriptor; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public UplinkRelayRxInfo() {
OnConstruction();
}
partial void OnConstruction();
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public UplinkRelayRxInfo(UplinkRelayRxInfo other) : this() {
devEui_ = other.devEui_;
frequency_ = other.frequency_;
dr_ = other.dr_;
snr_ = other.snr_;
rssi_ = other.rssi_;
worChannel_ = other.worChannel_;
_unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public UplinkRelayRxInfo Clone() {
return new UplinkRelayRxInfo(this);
}
/// <summary>Field number for the "dev_eui" field.</summary>
public const int DevEuiFieldNumber = 1;
private string devEui_ = "";
/// <summary>
/// Relay DevEUI.
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public string DevEui {
get { return devEui_; }
set {
devEui_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
}
}
/// <summary>Field number for the "frequency" field.</summary>
public const int FrequencyFieldNumber = 2;
private uint frequency_;
/// <summary>
/// Frequency.
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public uint Frequency {
get { return frequency_; }
set {
frequency_ = value;
}
}
/// <summary>Field number for the "dr" field.</summary>
public const int DrFieldNumber = 3;
private uint dr_;
/// <summary>
/// Data-rate.
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public uint Dr {
get { return dr_; }
set {
dr_ = value;
}
}
/// <summary>Field number for the "snr" field.</summary>
public const int SnrFieldNumber = 4;
private int snr_;
/// <summary>
/// SNR.
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public int Snr {
get { return snr_; }
set {
snr_ = value;
}
}
/// <summary>Field number for the "rssi" field.</summary>
public const int RssiFieldNumber = 5;
private int rssi_;
/// <summary>
/// RSSI.
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public int Rssi {
get { return rssi_; }
set {
rssi_ = value;
}
}
/// <summary>Field number for the "wor_channel" field.</summary>
public const int WorChannelFieldNumber = 6;
private uint worChannel_;
/// <summary>
/// WOR channel.
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public uint WorChannel {
get { return worChannel_; }
set {
worChannel_ = value;
}
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public override bool Equals(object other) {
return Equals(other as UplinkRelayRxInfo);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public bool Equals(UplinkRelayRxInfo other) {
if (ReferenceEquals(other, null)) {
return false;
}
if (ReferenceEquals(other, this)) {
return true;
}
if (DevEui != other.DevEui) return false;
if (Frequency != other.Frequency) return false;
if (Dr != other.Dr) return false;
if (Snr != other.Snr) return false;
if (Rssi != other.Rssi) return false;
if (WorChannel != other.WorChannel) return false;
return Equals(_unknownFields, other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public override int GetHashCode() {
int hash = 1;
if (DevEui.Length != 0) hash ^= DevEui.GetHashCode();
if (Frequency != 0) hash ^= Frequency.GetHashCode();
if (Dr != 0) hash ^= Dr.GetHashCode();
if (Snr != 0) hash ^= Snr.GetHashCode();
if (Rssi != 0) hash ^= Rssi.GetHashCode();
if (WorChannel != 0) hash ^= WorChannel.GetHashCode();
if (_unknownFields != null) {
hash ^= _unknownFields.GetHashCode();
}
return hash;
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public override string ToString() {
return pb::JsonFormatter.ToDiagnosticString(this);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public void WriteTo(pb::CodedOutputStream output) {
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
output.WriteRawMessage(this);
#else
if (DevEui.Length != 0) {
output.WriteRawTag(10);
output.WriteString(DevEui);
}
if (Frequency != 0) {
output.WriteRawTag(16);
output.WriteUInt32(Frequency);
}
if (Dr != 0) {
output.WriteRawTag(24);
output.WriteUInt32(Dr);
}
if (Snr != 0) {
output.WriteRawTag(32);
output.WriteInt32(Snr);
}
if (Rssi != 0) {
output.WriteRawTag(40);
output.WriteInt32(Rssi);
}
if (WorChannel != 0) {
output.WriteRawTag(48);
output.WriteUInt32(WorChannel);
}
if (_unknownFields != null) {
_unknownFields.WriteTo(output);
}
#endif
}
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
if (DevEui.Length != 0) {
output.WriteRawTag(10);
output.WriteString(DevEui);
}
if (Frequency != 0) {
output.WriteRawTag(16);
output.WriteUInt32(Frequency);
}
if (Dr != 0) {
output.WriteRawTag(24);
output.WriteUInt32(Dr);
}
if (Snr != 0) {
output.WriteRawTag(32);
output.WriteInt32(Snr);
}
if (Rssi != 0) {
output.WriteRawTag(40);
output.WriteInt32(Rssi);
}
if (WorChannel != 0) {
output.WriteRawTag(48);
output.WriteUInt32(WorChannel);
}
if (_unknownFields != null) {
_unknownFields.WriteTo(ref output);
}
}
#endif
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public int CalculateSize() {
int size = 0;
if (DevEui.Length != 0) {
size += 1 + pb::CodedOutputStream.ComputeStringSize(DevEui);
}
if (Frequency != 0) {
size += 1 + pb::CodedOutputStream.ComputeUInt32Size(Frequency);
}
if (Dr != 0) {
size += 1 + pb::CodedOutputStream.ComputeUInt32Size(Dr);
}
if (Snr != 0) {
size += 1 + pb::CodedOutputStream.ComputeInt32Size(Snr);
}
if (Rssi != 0) {
size += 1 + pb::CodedOutputStream.ComputeInt32Size(Rssi);
}
if (WorChannel != 0) {
size += 1 + pb::CodedOutputStream.ComputeUInt32Size(WorChannel);
}
if (_unknownFields != null) {
size += _unknownFields.CalculateSize();
}
return size;
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public void MergeFrom(UplinkRelayRxInfo other) {
if (other == null) {
return;
}
if (other.DevEui.Length != 0) {
DevEui = other.DevEui;
}
if (other.Frequency != 0) {
Frequency = other.Frequency;
}
if (other.Dr != 0) {
Dr = other.Dr;
}
if (other.Snr != 0) {
Snr = other.Snr;
}
if (other.Rssi != 0) {
Rssi = other.Rssi;
}
if (other.WorChannel != 0) {
WorChannel = other.WorChannel;
}
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public void MergeFrom(pb::CodedInputStream input) {
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
input.ReadRawMessage(this);
#else
uint tag;
while ((tag = input.ReadTag()) != 0) {
switch(tag) {
default:
_unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
break;
case 10: {
DevEui = input.ReadString();
break;
}
case 16: {
Frequency = input.ReadUInt32();
break;
}
case 24: {
Dr = input.ReadUInt32();
break;
}
case 32: {
Snr = input.ReadInt32();
break;
}
case 40: {
Rssi = input.ReadInt32();
break;
}
case 48: {
WorChannel = input.ReadUInt32();
break;
}
}
}
#endif
}
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
uint tag;
while ((tag = input.ReadTag()) != 0) {
switch(tag) {
default:
_unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
break;
case 10: {
DevEui = input.ReadString();
break;
}
case 16: {
Frequency = input.ReadUInt32();
break;
}
case 24: {
Dr = input.ReadUInt32();
break;
}
case 32: {
Snr = input.ReadInt32();
break;
}
case 40: {
Rssi = input.ReadInt32();
break;
}
case 48: {
WorChannel = input.ReadUInt32();
break;
}
}
}
}
#endif
}
/// <summary>
/// UplinkEvent is the message sent when an uplink payload has been received.
/// </summary>
@ -684,7 +1090,7 @@ namespace Chirpstack.Integration {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static pbr::MessageDescriptor Descriptor {
get { return global::Chirpstack.Integration.IntegrationReflection.Descriptor.MessageTypes[1]; }
get { return global::Chirpstack.Integration.IntegrationReflection.Descriptor.MessageTypes[2]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@ -717,6 +1123,7 @@ namespace Chirpstack.Integration {
object_ = other.object_ != null ? other.object_.Clone() : null;
rxInfo_ = other.rxInfo_.Clone();
txInfo_ = other.txInfo_ != null ? other.txInfo_.Clone() : null;
relayRxInfo_ = other.relayRxInfo_ != null ? other.relayRxInfo_.Clone() : null;
_unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
}
@ -880,7 +1287,8 @@ namespace Chirpstack.Integration {
public const int ObjectFieldNumber = 11;
private global::Google.Protobuf.WellKnownTypes.Struct object_;
/// <summary>
/// Note that this is only set when a codec is configured in the Device Profile.
/// Note that this is only set when a codec is configured in the Device
/// Profile.
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
@ -920,6 +1328,21 @@ namespace Chirpstack.Integration {
}
}
/// <summary>Field number for the "relay_rx_info" field.</summary>
public const int RelayRxInfoFieldNumber = 14;
private global::Chirpstack.Integration.UplinkRelayRxInfo relayRxInfo_;
/// <summary>
/// Relay info.
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public global::Chirpstack.Integration.UplinkRelayRxInfo RelayRxInfo {
get { return relayRxInfo_; }
set {
relayRxInfo_ = value;
}
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public override bool Equals(object other) {
@ -948,6 +1371,7 @@ namespace Chirpstack.Integration {
if (!object.Equals(Object, other.Object)) return false;
if(!rxInfo_.Equals(other.rxInfo_)) return false;
if (!object.Equals(TxInfo, other.TxInfo)) return false;
if (!object.Equals(RelayRxInfo, other.RelayRxInfo)) return false;
return Equals(_unknownFields, other._unknownFields);
}
@ -968,6 +1392,7 @@ namespace Chirpstack.Integration {
if (object_ != null) hash ^= Object.GetHashCode();
hash ^= rxInfo_.GetHashCode();
if (txInfo_ != null) hash ^= TxInfo.GetHashCode();
if (relayRxInfo_ != null) hash ^= RelayRxInfo.GetHashCode();
if (_unknownFields != null) {
hash ^= _unknownFields.GetHashCode();
}
@ -1035,6 +1460,10 @@ namespace Chirpstack.Integration {
output.WriteRawTag(106);
output.WriteMessage(TxInfo);
}
if (relayRxInfo_ != null) {
output.WriteRawTag(114);
output.WriteMessage(RelayRxInfo);
}
if (_unknownFields != null) {
_unknownFields.WriteTo(output);
}
@ -1094,6 +1523,10 @@ namespace Chirpstack.Integration {
output.WriteRawTag(106);
output.WriteMessage(TxInfo);
}
if (relayRxInfo_ != null) {
output.WriteRawTag(114);
output.WriteMessage(RelayRxInfo);
}
if (_unknownFields != null) {
_unknownFields.WriteTo(ref output);
}
@ -1141,6 +1574,9 @@ namespace Chirpstack.Integration {
if (txInfo_ != null) {
size += 1 + pb::CodedOutputStream.ComputeMessageSize(TxInfo);
}
if (relayRxInfo_ != null) {
size += 1 + pb::CodedOutputStream.ComputeMessageSize(RelayRxInfo);
}
if (_unknownFields != null) {
size += _unknownFields.CalculateSize();
}
@ -1202,6 +1638,12 @@ namespace Chirpstack.Integration {
}
TxInfo.MergeFrom(other.TxInfo);
}
if (other.relayRxInfo_ != null) {
if (relayRxInfo_ == null) {
RelayRxInfo = new global::Chirpstack.Integration.UplinkRelayRxInfo();
}
RelayRxInfo.MergeFrom(other.RelayRxInfo);
}
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
}
@ -1281,6 +1723,13 @@ namespace Chirpstack.Integration {
input.ReadMessage(TxInfo);
break;
}
case 114: {
if (relayRxInfo_ == null) {
RelayRxInfo = new global::Chirpstack.Integration.UplinkRelayRxInfo();
}
input.ReadMessage(RelayRxInfo);
break;
}
}
}
#endif
@ -1360,6 +1809,13 @@ namespace Chirpstack.Integration {
input.ReadMessage(TxInfo);
break;
}
case 114: {
if (relayRxInfo_ == null) {
RelayRxInfo = new global::Chirpstack.Integration.UplinkRelayRxInfo();
}
input.ReadMessage(RelayRxInfo);
break;
}
}
}
}
@ -1385,7 +1841,7 @@ namespace Chirpstack.Integration {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static pbr::MessageDescriptor Descriptor {
get { return global::Chirpstack.Integration.IntegrationReflection.Descriptor.MessageTypes[2]; }
get { return global::Chirpstack.Integration.IntegrationReflection.Descriptor.MessageTypes[3]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@ -1409,6 +1865,7 @@ namespace Chirpstack.Integration {
time_ = other.time_ != null ? other.time_.Clone() : null;
deviceInfo_ = other.deviceInfo_ != null ? other.deviceInfo_.Clone() : null;
devAddr_ = other.devAddr_;
relayRxInfo_ = other.relayRxInfo_ != null ? other.relayRxInfo_.Clone() : null;
_unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
}
@ -1478,6 +1935,21 @@ namespace Chirpstack.Integration {
}
}
/// <summary>Field number for the "relay_rx_info" field.</summary>
public const int RelayRxInfoFieldNumber = 5;
private global::Chirpstack.Integration.UplinkRelayRxInfo relayRxInfo_;
/// <summary>
/// Relay info.
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public global::Chirpstack.Integration.UplinkRelayRxInfo RelayRxInfo {
get { return relayRxInfo_; }
set {
relayRxInfo_ = value;
}
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public override bool Equals(object other) {
@ -1497,6 +1969,7 @@ namespace Chirpstack.Integration {
if (!object.Equals(Time, other.Time)) return false;
if (!object.Equals(DeviceInfo, other.DeviceInfo)) return false;
if (DevAddr != other.DevAddr) return false;
if (!object.Equals(RelayRxInfo, other.RelayRxInfo)) return false;
return Equals(_unknownFields, other._unknownFields);
}
@ -1508,6 +1981,7 @@ namespace Chirpstack.Integration {
if (time_ != null) hash ^= Time.GetHashCode();
if (deviceInfo_ != null) hash ^= DeviceInfo.GetHashCode();
if (DevAddr.Length != 0) hash ^= DevAddr.GetHashCode();
if (relayRxInfo_ != null) hash ^= RelayRxInfo.GetHashCode();
if (_unknownFields != null) {
hash ^= _unknownFields.GetHashCode();
}
@ -1542,6 +2016,10 @@ namespace Chirpstack.Integration {
output.WriteRawTag(34);
output.WriteString(DevAddr);
}
if (relayRxInfo_ != null) {
output.WriteRawTag(42);
output.WriteMessage(RelayRxInfo);
}
if (_unknownFields != null) {
_unknownFields.WriteTo(output);
}
@ -1568,6 +2046,10 @@ namespace Chirpstack.Integration {
output.WriteRawTag(34);
output.WriteString(DevAddr);
}
if (relayRxInfo_ != null) {
output.WriteRawTag(42);
output.WriteMessage(RelayRxInfo);
}
if (_unknownFields != null) {
_unknownFields.WriteTo(ref output);
}
@ -1590,6 +2072,9 @@ namespace Chirpstack.Integration {
if (DevAddr.Length != 0) {
size += 1 + pb::CodedOutputStream.ComputeStringSize(DevAddr);
}
if (relayRxInfo_ != null) {
size += 1 + pb::CodedOutputStream.ComputeMessageSize(RelayRxInfo);
}
if (_unknownFields != null) {
size += _unknownFields.CalculateSize();
}
@ -1620,6 +2105,12 @@ namespace Chirpstack.Integration {
if (other.DevAddr.Length != 0) {
DevAddr = other.DevAddr;
}
if (other.relayRxInfo_ != null) {
if (relayRxInfo_ == null) {
RelayRxInfo = new global::Chirpstack.Integration.UplinkRelayRxInfo();
}
RelayRxInfo.MergeFrom(other.RelayRxInfo);
}
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
}
@ -1657,6 +2148,13 @@ namespace Chirpstack.Integration {
DevAddr = input.ReadString();
break;
}
case 42: {
if (relayRxInfo_ == null) {
RelayRxInfo = new global::Chirpstack.Integration.UplinkRelayRxInfo();
}
input.ReadMessage(RelayRxInfo);
break;
}
}
}
#endif
@ -1694,6 +2192,13 @@ namespace Chirpstack.Integration {
DevAddr = input.ReadString();
break;
}
case 42: {
if (relayRxInfo_ == null) {
RelayRxInfo = new global::Chirpstack.Integration.UplinkRelayRxInfo();
}
input.ReadMessage(RelayRxInfo);
break;
}
}
}
}
@ -1719,7 +2224,7 @@ namespace Chirpstack.Integration {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static pbr::MessageDescriptor Descriptor {
get { return global::Chirpstack.Integration.IntegrationReflection.Descriptor.MessageTypes[3]; }
get { return global::Chirpstack.Integration.IntegrationReflection.Descriptor.MessageTypes[4]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@ -2116,9 +2621,9 @@ namespace Chirpstack.Integration {
}
/// <summary>
/// TxAckEvent is the message sent when a downlink was acknowledged by the gateway
/// for transmission. As a downlink can be scheduled in the future, this event
/// does not confirm that the message has already been transmitted.
/// TxAckEvent is the message sent when a downlink was acknowledged by the
/// gateway for transmission. As a downlink can be scheduled in the future, this
/// event does not confirm that the message has already been transmitted.
/// </summary>
public sealed partial class TxAckEvent : pb::IMessage<TxAckEvent>
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
@ -2134,7 +2639,7 @@ namespace Chirpstack.Integration {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static pbr::MessageDescriptor Descriptor {
get { return global::Chirpstack.Integration.IntegrationReflection.Descriptor.MessageTypes[4]; }
get { return global::Chirpstack.Integration.IntegrationReflection.Descriptor.MessageTypes[5]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@ -2596,7 +3101,7 @@ namespace Chirpstack.Integration {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static pbr::MessageDescriptor Descriptor {
get { return global::Chirpstack.Integration.IntegrationReflection.Descriptor.MessageTypes[5]; }
get { return global::Chirpstack.Integration.IntegrationReflection.Descriptor.MessageTypes[6]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@ -2999,7 +3504,7 @@ namespace Chirpstack.Integration {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static pbr::MessageDescriptor Descriptor {
get { return global::Chirpstack.Integration.IntegrationReflection.Descriptor.MessageTypes[6]; }
get { return global::Chirpstack.Integration.IntegrationReflection.Descriptor.MessageTypes[7]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@ -3453,7 +3958,7 @@ namespace Chirpstack.Integration {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static pbr::MessageDescriptor Descriptor {
get { return global::Chirpstack.Integration.IntegrationReflection.Descriptor.MessageTypes[7]; }
get { return global::Chirpstack.Integration.IntegrationReflection.Descriptor.MessageTypes[8]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@ -3797,7 +4302,7 @@ namespace Chirpstack.Integration {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static pbr::MessageDescriptor Descriptor {
get { return global::Chirpstack.Integration.IntegrationReflection.Descriptor.MessageTypes[8]; }
get { return global::Chirpstack.Integration.IntegrationReflection.Descriptor.MessageTypes[9]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@ -4220,7 +4725,7 @@ namespace Chirpstack.Integration {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static pbr::MessageDescriptor Descriptor {
get { return global::Chirpstack.Integration.IntegrationReflection.Descriptor.MessageTypes[9]; }
get { return global::Chirpstack.Integration.IntegrationReflection.Descriptor.MessageTypes[10]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]

1
api/go/Makefile vendored
View File

@ -27,6 +27,7 @@ api:
protoc ${PROTOC_ARGS} api/frame_log.proto
protoc ${PROTOC_ARGS} api/multicast_group.proto
protoc ${PROTOC_ARGS} api/request_log.proto
protoc ${PROTOC_ARGS} api/relay.proto
integration:
protoc ${PROTOC_ARGS} integration/integration.proto

View File

@ -53,6 +53,12 @@ type Device struct {
// These tags are exposed in the event payloads or to integration. Tags are
// intended for aggregation and filtering.
Tags map[string]string `protobuf:"bytes,9,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
// JoinEUI (optional, EUI64).
// This field will be automatically set / updated on OTAA. However, in some
// cases it must be pre-configured. For example to allow OTAA using a Relay.
// In this case the Relay needs to know the JoinEUI + DevEUI combinations
// of the devices for which it needs to forward uplinks.
JoinEui string `protobuf:"bytes,10,opt,name=join_eui,json=joinEui,proto3" json:"join_eui,omitempty"`
}
func (x *Device) Reset() {
@ -150,6 +156,13 @@ func (x *Device) GetTags() map[string]string {
return nil
}
func (x *Device) GetJoinEui() string {
if x != nil {
return x.JoinEui
}
return ""
}
type DeviceStatus struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@ -2278,7 +2291,7 @@ var file_api_device_proto_rawDesc = []byte{
0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72,
0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79,
0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xcf, 0x03, 0x0a, 0x06, 0x44, 0x65, 0x76, 0x69, 0x63,
0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xea, 0x03, 0x0a, 0x06, 0x44, 0x65, 0x76, 0x69, 0x63,
0x65, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x18, 0x01, 0x20, 0x01,
0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x76, 0x45, 0x75, 0x69, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,
0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20,
@ -2300,64 +2313,26 @@ var file_api_device_proto_rawDesc = []byte{
0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x09,
0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63,
0x65, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67,
0x73, 0x1a, 0x3c, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 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, 0x1a,
0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 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, 0x22, 0x7f, 0x0a, 0x0c, 0x44, 0x65, 0x76, 0x69,
0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x72, 0x67,
0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e,
0x12, 0x32, 0x0a, 0x15, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x6f, 0x77,
0x65, 0x72, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52,
0x13, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x53, 0x6f,
0x75, 0x72, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x5f,
0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x62, 0x61, 0x74,
0x74, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0xa7, 0x03, 0x0a, 0x0e, 0x44, 0x65,
0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x17, 0x0a, 0x07,
0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64,
0x65, 0x76, 0x45, 0x75, 0x69, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
0x5f, 0x61, 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, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74,
0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 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, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x6c,
0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 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, 0x0a, 0x6c,
0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x41, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d,
0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a,
0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01,
0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12,
0x2a, 0x0a, 0x11, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c,
0x65, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x76, 0x69,
0x63, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x64,
0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61,
0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65,
0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x0d, 0x64,
0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x09, 0x20, 0x01,
0x28, 0x0b, 0x32, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53,
0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0c, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61,
0x74, 0x75, 0x73, 0x22, 0x57, 0x0a, 0x0a, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4b, 0x65, 0x79,
0x73, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x18, 0x01, 0x20, 0x01,
0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x76, 0x45, 0x75, 0x69, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x77,
0x6b, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x77, 0x6b,
0x4b, 0x65, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x70, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03,
0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x22, 0x3a, 0x0a, 0x13,
0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75,
0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x06, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20,
0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65,
0x52, 0x06, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x22, 0x2b, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x44,
0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07,
0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64,
0x65, 0x76, 0x45, 0x75, 0x69, 0x22, 0xa4, 0x02, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76,
0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x06, 0x64,
0x65, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x61, 0x70,
0x69, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x06, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65,
0x73, 0x12, 0x19, 0x0a, 0x08, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x65, 0x75, 0x69, 0x18, 0x0a, 0x20,
0x01, 0x28, 0x09, 0x52, 0x07, 0x6a, 0x6f, 0x69, 0x6e, 0x45, 0x75, 0x69, 0x1a, 0x3c, 0x0a, 0x0e,
0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 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, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61,
0x67, 0x73, 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, 0x22, 0x7f, 0x0a, 0x0c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61,
0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20,
0x01, 0x28, 0x05, 0x52, 0x06, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x12, 0x32, 0x0a, 0x15, 0x65,
0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x73, 0x6f,
0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x65, 0x78, 0x74, 0x65,
0x72, 0x6e, 0x61, 0x6c, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12,
0x23, 0x0a, 0x0d, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c,
0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x4c,
0x65, 0x76, 0x65, 0x6c, 0x22, 0xa7, 0x03, 0x0a, 0x0e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4c,
0x69, 0x73, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x5f, 0x65,
0x75, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x76, 0x45, 0x75, 0x69,
0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 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,
@ -2369,359 +2344,398 @@ var file_api_device_proto_rawDesc = []byte{
0x65, 0x65, 0x6e, 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, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65,
0x65, 0x6e, 0x41, 0x74, 0x12, 0x36, 0x0a, 0x0d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x73,
0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x61, 0x70,
0x69, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0c,
0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x3a, 0x0a, 0x13,
0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75,
0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x06, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20,
0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65,
0x52, 0x06, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x22, 0x2e, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65,
0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
0x17, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
0x52, 0x06, 0x64, 0x65, 0x76, 0x45, 0x75, 0x69, 0x22, 0xaf, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73,
0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 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, 0x25, 0x0a, 0x0e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61,
0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61,
0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x63, 0x0a, 0x13, 0x4c, 0x69,
0x73, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 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, 0x2b, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x03,
0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4c,
0x69, 0x73, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22,
0x4b, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4b,
0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x0b, 0x64, 0x65,
0x76, 0x69, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73,
0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x22, 0x2f, 0x0a, 0x14,
0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71,
0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x18,
0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x76, 0x45, 0x75, 0x69, 0x22, 0xbf, 0x01,
0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52,
0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63,
0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61,
0x70, 0x69, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x0a, 0x64,
0x65, 0x76, 0x69, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65,
0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 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, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74,
0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f,
0x61, 0x74, 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, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22,
0x4b, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4b,
0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x0b, 0x64, 0x65,
0x76, 0x69, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73,
0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x22, 0x32, 0x0a, 0x17,
0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73,
0x65, 0x6e, 0x41, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01,
0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63,
0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64,
0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x11, 0x64, 0x65,
0x76, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18,
0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f,
0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65,
0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20,
0x01, 0x28, 0x09, 0x52, 0x11, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69,
0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x0d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65,
0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e,
0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
0x52, 0x0c, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x57,
0x0a, 0x0a, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x17, 0x0a, 0x07,
0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64,
0x65, 0x76, 0x45, 0x75, 0x69, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x77, 0x6b, 0x5f, 0x6b, 0x65, 0x79,
0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x77, 0x6b, 0x4b, 0x65, 0x79, 0x12, 0x17,
0x0a, 0x07, 0x61, 0x70, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
0x06, 0x61, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x22, 0x3a, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74,
0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23,
0x0a, 0x06, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b,
0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x06, 0x64, 0x65, 0x76,
0x69, 0x63, 0x65, 0x22, 0x2b, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65,
0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x5f, 0x65,
0x75, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x76, 0x45, 0x75, 0x69,
0x22, 0xad, 0x02, 0x0a, 0x10, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69,
0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x76, 0x45, 0x75, 0x69, 0x12, 0x19,
0x0a, 0x08, 0x64, 0x65, 0x76, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
0x52, 0x07, 0x64, 0x65, 0x76, 0x41, 0x64, 0x64, 0x72, 0x12, 0x1a, 0x0a, 0x09, 0x61, 0x70, 0x70,
0x5f, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70,
0x70, 0x53, 0x4b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0d, 0x6e, 0x77, 0x6b, 0x5f, 0x73, 0x5f, 0x65,
0x6e, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x77,
0x6b, 0x53, 0x45, 0x6e, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x0f, 0x73, 0x5f, 0x6e, 0x77,
0x6b, 0x5f, 0x73, 0x5f, 0x69, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28,
0x09, 0x52, 0x0b, 0x73, 0x4e, 0x77, 0x6b, 0x53, 0x49, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x24,
0x0a, 0x0f, 0x66, 0x5f, 0x6e, 0x77, 0x6b, 0x5f, 0x73, 0x5f, 0x69, 0x6e, 0x74, 0x5f, 0x6b, 0x65,
0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x4e, 0x77, 0x6b, 0x53, 0x49, 0x6e,
0x74, 0x4b, 0x65, 0x79, 0x12, 0x18, 0x0a, 0x08, 0x66, 0x5f, 0x63, 0x6e, 0x74, 0x5f, 0x75, 0x70,
0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x66, 0x43, 0x6e, 0x74, 0x55, 0x70, 0x12, 0x1f,
0x0a, 0x0c, 0x6e, 0x5f, 0x66, 0x5f, 0x63, 0x6e, 0x74, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x18, 0x06,
0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6e, 0x46, 0x43, 0x6e, 0x74, 0x44, 0x6f, 0x77, 0x6e, 0x12,
0x1f, 0x0a, 0x0c, 0x61, 0x5f, 0x66, 0x5f, 0x63, 0x6e, 0x74, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x18,
0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x61, 0x46, 0x43, 0x6e, 0x74, 0x44, 0x6f, 0x77, 0x6e,
0x22, 0x5b, 0x0a, 0x15, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69,
0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x11, 0x64, 0x65, 0x76,
0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01,
0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63,
0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x64, 0x65, 0x76,
0x69, 0x63, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x32, 0x0a,
0x17, 0x44, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63,
0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x5f,
0x65, 0x75, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x76, 0x45, 0x75,
0x69, 0x22, 0x35, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63,
0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
0x22, 0xa4, 0x02, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65,
0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x06, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65,
0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x76,
0x69, 0x63, 0x65, 0x52, 0x06, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63,
0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 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, 0x09, 0x63, 0x72, 0x65,
0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65,
0x64, 0x5f, 0x61, 0x74, 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, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41,
0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 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, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x41, 0x74, 0x12,
0x36, 0x0a, 0x0d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x76,
0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0c, 0x64, 0x65, 0x76, 0x69, 0x63,
0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x3a, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74,
0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23,
0x0a, 0x06, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b,
0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x06, 0x64, 0x65, 0x76,
0x69, 0x63, 0x65, 0x22, 0x2e, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x76,
0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x65,
0x76, 0x5f, 0x65, 0x75, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x76,
0x45, 0x75, 0x69, 0x22, 0xaf, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x76, 0x69,
0x63, 0x65, 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, 0x25, 0x0a, 0x0e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63,
0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x63, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x76,
0x69, 0x63, 0x65, 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, 0x2b, 0x0a,
0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e,
0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x74,
0x65, 0x6d, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x4b, 0x0a, 0x17, 0x43, 0x72,
0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65,
0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f,
0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69,
0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x0a, 0x64, 0x65, 0x76,
0x69, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x22, 0x2f, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x44, 0x65,
0x76, 0x69, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
0x17, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
0x52, 0x06, 0x64, 0x65, 0x76, 0x45, 0x75, 0x69, 0x22, 0x61, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x44,
0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52,
0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x11, 0x64, 0x65, 0x76, 0x69, 0x63,
0x65, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01,
0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41,
0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x64, 0x65, 0x76, 0x69, 0x63,
0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x32, 0x0a, 0x17, 0x47,
0x65, 0x74, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x44, 0x65, 0x76, 0x41, 0x64, 0x64, 0x72, 0x52,
0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75,
0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x76, 0x45, 0x75, 0x69, 0x22,
0x35, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x44, 0x65, 0x76, 0x41,
0x64, 0x64, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x64,
0x65, 0x76, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64,
0x65, 0x76, 0x41, 0x64, 0x64, 0x72, 0x22, 0xc9, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x44, 0x65,
0x76, 0x69, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
0x52, 0x06, 0x64, 0x65, 0x76, 0x45, 0x75, 0x69, 0x22, 0xbf, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74,
0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
0x73, 0x65, 0x12, 0x30, 0x0a, 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79,
0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65,
0x76, 0x69, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65,
0x4b, 0x65, 0x79, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f,
0x61, 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, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12,
0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 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,
0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x4b, 0x0a, 0x17, 0x55, 0x70,
0x64, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65,
0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f,
0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69,
0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x0a, 0x64, 0x65, 0x76,
0x69, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x22, 0x32, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74,
0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x18, 0x01, 0x20,
0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x76, 0x45, 0x75, 0x69, 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, 0xbc, 0x02, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65,
0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
0x44, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
0x32, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65,
0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e,
0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x6d, 0x65,
0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x41, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x65, 0x73, 0x18,
0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x44,
0x65, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70,
0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79,
0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x65, 0x73, 0x1a, 0x4a, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x72,
0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18,
0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x05, 0x76, 0x61,
0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d,
0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
0x3a, 0x02, 0x38, 0x01, 0x1a, 0x4b, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x45, 0x6e,
0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x26, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02,
0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63,
0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38,
0x01, 0x22, 0x37, 0x0a, 0x0b, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65,
0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20,
0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xcd, 0x01, 0x0a, 0x1b, 0x47,
0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x4d, 0x65, 0x74, 0x72,
0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x65,
0x76, 0x5f, 0x65, 0x75, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x76,
0x45, 0x75, 0x69, 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, 0xbf, 0x02, 0x0a, 0x1c, 0x47,
0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 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, 0x27, 0x0a, 0x07, 0x67, 0x77,
0x5f, 0x72, 0x73, 0x73, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f,
0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x06, 0x67, 0x77, 0x52,
0x73, 0x73, 0x69, 0x12, 0x25, 0x0a, 0x06, 0x67, 0x77, 0x5f, 0x73, 0x6e, 0x72, 0x18, 0x03, 0x20,
0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74,
0x72, 0x69, 0x63, 0x52, 0x05, 0x67, 0x77, 0x53, 0x6e, 0x72, 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, 0x72, 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, 0x72, 0x78, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x50,
0x65, 0x72, 0x44, 0x72, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x06,
0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65,
0x74, 0x72, 0x69, 0x63, 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0xf1, 0x01, 0x0a,
0x0f, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x51, 0x75, 0x65, 0x75, 0x65, 0x49, 0x74, 0x65, 0x6d,
0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64,
0x12, 0x17, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28,
0x09, 0x52, 0x06, 0x64, 0x65, 0x76, 0x45, 0x75, 0x69, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6e,
0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6f,
0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x66, 0x5f, 0x70, 0x6f, 0x72,
0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x66, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12,
0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61,
0x74, 0x61, 0x12, 0x2f, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x06, 0x20, 0x01,
0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x6f, 0x62, 0x6a,
0x65, 0x63, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e,
0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x50, 0x65, 0x6e, 0x64, 0x69,
0x6e, 0x67, 0x12, 0x1c, 0x0a, 0x0a, 0x66, 0x5f, 0x63, 0x6e, 0x74, 0x5f, 0x64, 0x6f, 0x77, 0x6e,
0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x66, 0x43, 0x6e, 0x74, 0x44, 0x6f, 0x77, 0x6e,
0x22, 0x54, 0x0a, 0x1d, 0x45, 0x6e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63,
0x65, 0x51, 0x75, 0x65, 0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
0x74, 0x12, 0x33, 0x0a, 0x0a, 0x71, 0x75, 0x65, 0x75, 0x65, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x18,
0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x76, 0x69,
0x63, 0x65, 0x51, 0x75, 0x65, 0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x09, 0x71, 0x75, 0x65,
0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x22, 0x30, 0x0a, 0x1e, 0x45, 0x6e, 0x71, 0x75, 0x65, 0x75,
0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x51, 0x75, 0x65, 0x75, 0x65, 0x49, 0x74, 0x65, 0x6d,
0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,
0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x32, 0x0a, 0x17, 0x46, 0x6c, 0x75, 0x73,
0x68, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x51, 0x75, 0x65, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75,
0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x76, 0x45, 0x75, 0x69, 0x22, 0xad, 0x02, 0x0a, 0x10,
0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e,
0x12, 0x17, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28,
0x09, 0x52, 0x06, 0x64, 0x65, 0x76, 0x45, 0x75, 0x69, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x65, 0x76,
0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x76,
0x41, 0x64, 0x64, 0x72, 0x12, 0x1a, 0x0a, 0x09, 0x61, 0x70, 0x70, 0x5f, 0x73, 0x5f, 0x6b, 0x65,
0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x53, 0x4b, 0x65, 0x79,
0x12, 0x21, 0x0a, 0x0d, 0x6e, 0x77, 0x6b, 0x5f, 0x73, 0x5f, 0x65, 0x6e, 0x63, 0x5f, 0x6b, 0x65,
0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x77, 0x6b, 0x53, 0x45, 0x6e, 0x63,
0x4b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x0f, 0x73, 0x5f, 0x6e, 0x77, 0x6b, 0x5f, 0x73, 0x5f, 0x69,
0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x4e,
0x77, 0x6b, 0x53, 0x49, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x0f, 0x66, 0x5f, 0x6e,
0x77, 0x6b, 0x5f, 0x73, 0x5f, 0x69, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01,
0x28, 0x09, 0x52, 0x0b, 0x66, 0x4e, 0x77, 0x6b, 0x53, 0x49, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x12,
0x18, 0x0a, 0x08, 0x66, 0x5f, 0x63, 0x6e, 0x74, 0x5f, 0x75, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28,
0x0d, 0x52, 0x06, 0x66, 0x43, 0x6e, 0x74, 0x55, 0x70, 0x12, 0x1f, 0x0a, 0x0c, 0x6e, 0x5f, 0x66,
0x5f, 0x63, 0x6e, 0x74, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52,
0x09, 0x6e, 0x46, 0x43, 0x6e, 0x74, 0x44, 0x6f, 0x77, 0x6e, 0x12, 0x1f, 0x0a, 0x0c, 0x61, 0x5f,
0x66, 0x5f, 0x63, 0x6e, 0x74, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d,
0x52, 0x09, 0x61, 0x46, 0x43, 0x6e, 0x74, 0x44, 0x6f, 0x77, 0x6e, 0x22, 0x5b, 0x0a, 0x15, 0x41,
0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71,
0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x11, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61,
0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x74, 0x69,
0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63,
0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x32, 0x0a, 0x17, 0x44, 0x65, 0x61, 0x63,
0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75,
0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x18, 0x01,
0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x76, 0x45, 0x75, 0x69, 0x22, 0x54, 0x0a, 0x1a,
0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x51, 0x75, 0x65, 0x75, 0x65, 0x49, 0x74,
0x65, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x65,
0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x76, 0x45, 0x75, 0x69, 0x22, 0x35, 0x0a, 0x1a,
0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x65,
0x76, 0x5f, 0x65, 0x75, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x76,
0x45, 0x75, 0x69, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6f, 0x6e, 0x6c,
0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4f, 0x6e,
0x6c, 0x79, 0x22, 0x6c, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x51,
0x75, 0x65, 0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, 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, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x51,
0x75, 0x65, 0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74,
0x22, 0x30, 0x0a, 0x15, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x44, 0x65, 0x76, 0x4e, 0x6f, 0x6e, 0x63,
0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x65, 0x76,
0x5f, 0x65, 0x75, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x76, 0x45,
0x75, 0x69, 0x32, 0xd0, 0x10, 0x0a, 0x0d, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x65, 0x72,
0x76, 0x69, 0x63, 0x65, 0x12, 0x53, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x18,
0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63,
0x45, 0x75, 0x69, 0x22, 0x61, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65,
0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
0x73, 0x65, 0x12, 0x42, 0x0a, 0x11, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x74,
0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e,
0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61,
0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x74, 0x69,
0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x32, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x52, 0x61, 0x6e,
0x64, 0x6f, 0x6d, 0x44, 0x65, 0x76, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
0x74, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x18, 0x01, 0x20, 0x01,
0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x76, 0x45, 0x75, 0x69, 0x22, 0x35, 0x0a, 0x18, 0x47, 0x65,
0x74, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x44, 0x65, 0x76, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65,
0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x65, 0x76, 0x5f, 0x61, 0x64,
0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x76, 0x41, 0x64, 0x64,
0x72, 0x22, 0xc9, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4d,
0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a,
0x07, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
0x64, 0x65, 0x76, 0x45, 0x75, 0x69, 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, 0xbc, 0x02,
0x0a, 0x18, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69,
0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x07, 0x6d, 0x65,
0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x61, 0x70,
0x69, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69,
0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69,
0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73,
0x12, 0x41, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,
0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65,
0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e,
0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x73, 0x74, 0x61,
0x74, 0x65, 0x73, 0x1a, 0x4a, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e,
0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02,
0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65,
0x74, 0x72, 0x69, 0x63, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a,
0x4b, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10,
0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79,
0x12, 0x26, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74,
0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x37, 0x0a, 0x0b,
0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e,
0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,
0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,
0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xcd, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76,
0x69, 0x63, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65,
0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69,
0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x76, 0x45, 0x75, 0x69, 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, 0xbf, 0x02, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76,
0x69, 0x63, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 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, 0x27, 0x0a, 0x07, 0x67, 0x77, 0x5f, 0x72, 0x73, 0x73, 0x69,
0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e,
0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x06, 0x67, 0x77, 0x52, 0x73, 0x73, 0x69, 0x12, 0x25,
0x0a, 0x06, 0x67, 0x77, 0x5f, 0x73, 0x6e, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e,
0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x05,
0x67, 0x77, 0x53, 0x6e, 0x72, 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, 0x72, 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, 0x72, 0x78, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x50, 0x65, 0x72, 0x44, 0x72, 0x12,
0x26, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32,
0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52,
0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0xf1, 0x01, 0x0a, 0x0f, 0x44, 0x65, 0x76, 0x69,
0x63, 0x65, 0x51, 0x75, 0x65, 0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x69,
0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x64,
0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65,
0x76, 0x45, 0x75, 0x69, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65,
0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d,
0x65, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x66, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01,
0x28, 0x0d, 0x52, 0x05, 0x66, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74,
0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2f, 0x0a,
0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e,
0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1d,
0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x07, 0x20, 0x01,
0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x1c, 0x0a,
0x0a, 0x66, 0x5f, 0x63, 0x6e, 0x74, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28,
0x0d, 0x52, 0x08, 0x66, 0x43, 0x6e, 0x74, 0x44, 0x6f, 0x77, 0x6e, 0x22, 0x54, 0x0a, 0x1d, 0x45,
0x6e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x51, 0x75, 0x65, 0x75,
0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33, 0x0a, 0x0a,
0x71, 0x75, 0x65, 0x75, 0x65, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x51, 0x75, 0x65,
0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x09, 0x71, 0x75, 0x65, 0x75, 0x65, 0x49, 0x74, 0x65,
0x6d, 0x22, 0x30, 0x0a, 0x1e, 0x45, 0x6e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x44, 0x65, 0x76, 0x69,
0x63, 0x65, 0x51, 0x75, 0x65, 0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f,
0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
0x02, 0x69, 0x64, 0x22, 0x32, 0x0a, 0x17, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x44, 0x65, 0x76, 0x69,
0x63, 0x65, 0x51, 0x75, 0x65, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17,
0x0a, 0x07, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
0x06, 0x64, 0x65, 0x76, 0x45, 0x75, 0x69, 0x22, 0x54, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x44, 0x65,
0x76, 0x69, 0x63, 0x65, 0x51, 0x75, 0x65, 0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x52, 0x65,
0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69,
0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x76, 0x45, 0x75, 0x69, 0x12, 0x1d,
0x0a, 0x0a, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x02, 0x20, 0x01,
0x28, 0x08, 0x52, 0x09, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x6c, 0x0a,
0x1b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x51, 0x75, 0x65, 0x75, 0x65, 0x49,
0x74, 0x65, 0x6d, 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, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x51, 0x75, 0x65, 0x75, 0x65, 0x49,
0x74, 0x65, 0x6d, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x30, 0x0a, 0x15, 0x46,
0x6c, 0x75, 0x73, 0x68, 0x44, 0x65, 0x76, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71,
0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x18,
0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x76, 0x45, 0x75, 0x69, 0x32, 0xd0, 0x10,
0x0a, 0x0d, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12,
0x53, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e,
0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 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, 0x17, 0x82, 0xd3, 0xe4,
0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65,
0x73, 0x3a, 0x01, 0x2a, 0x12, 0x54, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x15, 0x2e, 0x61, 0x70,
0x69, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
0x73, 0x74, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69,
0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93,
0x02, 0x18, 0x12, 0x16, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73,
0x2f, 0x7b, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x7d, 0x12, 0x64, 0x0a, 0x06, 0x55, 0x70,
0x64, 0x61, 0x74, 0x65, 0x12, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74,
0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 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, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x1a, 0x1d,
0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65,
0x76, 0x69, 0x63, 0x65, 0x2e, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x7d, 0x3a, 0x01, 0x2a,
0x12, 0x5a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x18, 0x2e, 0x61, 0x70, 0x69,
0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 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, 0x1e, 0x82, 0xd3,
0xe4, 0x93, 0x02, 0x18, 0x2a, 0x16, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63,
0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x7d, 0x12, 0x4f, 0x0a, 0x04,
0x4c, 0x69, 0x73, 0x74, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44,
0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e,
0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52,
0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12,
0x0c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x76, 0x0a,
0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x1c, 0x2e, 0x61, 0x70,
0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4b, 0x65,
0x79, 0x73, 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, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x22, 0x27, 0x2f, 0x61, 0x70, 0x69, 0x2f,
0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f,
0x6b, 0x65, 0x79, 0x73, 0x2e, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x7d, 0x2f, 0x6b, 0x65,
0x79, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x65, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73,
0x12, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65,
0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70,
0x69, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52,
0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x12,
0x1b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64,
0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x7d, 0x2f, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x76, 0x0a, 0x0a,
0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x1c, 0x2e, 0x61, 0x70, 0x69,
0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4b, 0x65, 0x79,
0x73, 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, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x1a, 0x27, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64,
0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6b,
0x65, 0x79, 0x73, 0x2e, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x7d, 0x2f, 0x6b, 0x65, 0x79,
0x73, 0x3a, 0x01, 0x2a, 0x12, 0x67, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65,
0x79, 0x73, 0x12, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44,
0x65, 0x76, 0x69, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 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, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d,
0x2a, 0x1b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b,
0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x7d, 0x2f, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x6f, 0x0a,
0x0e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x44, 0x65, 0x76, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x73, 0x12,
0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x44, 0x65, 0x76, 0x4e, 0x6f,
0x6e, 0x63, 0x65, 0x73, 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, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x2a, 0x21, 0x2f, 0x61, 0x70,
0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x5f, 0x65,
0x75, 0x69, 0x7d, 0x2f, 0x64, 0x65, 0x76, 0x2d, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x7c,
0x0a, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x61, 0x70, 0x69,
0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 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, 0x3c,
0x82, 0xd3, 0xe4, 0x93, 0x02, 0x36, 0x22, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76,
0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x74,
0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x7d,
0x2f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x6d, 0x0a, 0x0a,
0x44, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x2e, 0x61, 0x70, 0x69,
0x2e, 0x44, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63,
0x65, 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, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64,
0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x54, 0x0a, 0x03, 0x47, 0x65, 0x74,
0x12, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65,
0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65,
0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65,
0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x7d, 0x12,
0x64, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e,
0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 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, 0x28, 0x82, 0xd3, 0xe4,
0x93, 0x02, 0x22, 0x1a, 0x1d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65,
0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75,
0x69, 0x7d, 0x3a, 0x01, 0x2a, 0x12, 0x5a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12,
0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69,
0x63, 0x65, 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, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x2a, 0x16, 0x2f, 0x61, 0x70, 0x69, 0x2f,
0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69,
0x7d, 0x12, 0x4f, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e,
0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
0x73, 0x74, 0x1a, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x76,
0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3,
0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63,
0x65, 0x73, 0x12, 0x76, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73,
0x12, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76,
0x69, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 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, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x22, 0x27,
0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65,
0x76, 0x69, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75,
0x69, 0x7d, 0x2f, 0x6b, 0x65, 0x79, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x65, 0x0a, 0x07, 0x47, 0x65,
0x74, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x44,
0x65, 0x76, 0x69, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65,
0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3,
0xe4, 0x93, 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63,
0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x7d, 0x2f, 0x6b, 0x65, 0x79,
0x73, 0x12, 0x76, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x12,
0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69,
0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 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, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x1a, 0x27, 0x2f,
0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76,
0x69, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69,
0x7d, 0x2f, 0x6b, 0x65, 0x79, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x67, 0x0a, 0x0a, 0x44, 0x65, 0x6c,
0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65,
0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 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, 0x23, 0x82,
0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x2a, 0x1b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69,
0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x7d, 0x2f, 0x6b, 0x65,
0x79, 0x73, 0x12, 0x6f, 0x0a, 0x0e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x44, 0x65, 0x76, 0x4e, 0x6f,
0x6e, 0x63, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68,
0x44, 0x65, 0x76, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x73, 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, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23,
0x2a, 0x21, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b,
0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x7d, 0x2f, 0x64, 0x65, 0x76, 0x2d, 0x6e, 0x6f, 0x6e,
0x63, 0x65, 0x73, 0x12, 0x7c, 0x0a, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12,
0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x44, 0x65,
0x76, 0x69, 0x63, 0x65, 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, 0x3c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x36, 0x22, 0x31, 0x2f, 0x61, 0x70,
0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63,
0x65, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x64, 0x65, 0x76,
0x5f, 0x65, 0x75, 0x69, 0x7d, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x3a, 0x01,
0x2a, 0x12, 0x6d, 0x0a, 0x0a, 0x44, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12,
0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65,
0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 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, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x2a, 0x21, 0x2f,
0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76,
0x5f, 0x65, 0x75, 0x69, 0x7d, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e,
0x12, 0x7d, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f,
0x6e, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63,
0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65,
0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69,
0x63, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70,
0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x12, 0x21, 0x2f, 0x61,
0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x5f,
0x65, 0x75, 0x69, 0x7d, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12,
0x83, 0x01, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x44, 0x65, 0x76,
0x41, 0x64, 0x64, 0x72, 0x12, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x61,
0x6e, 0x64, 0x6f, 0x6d, 0x44, 0x65, 0x76, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65,
0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x61, 0x6e, 0x64,
0x6f, 0x6d, 0x44, 0x65, 0x76, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x22, 0x2a, 0x2f, 0x61, 0x70, 0x69, 0x2f,
0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69,
0x7d, 0x2f, 0x67, 0x65, 0x74, 0x2d, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x2d, 0x64, 0x65, 0x76,
0x2d, 0x61, 0x64, 0x64, 0x72, 0x12, 0x71, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x72,
0x69, 0x63, 0x73, 0x12, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76,
0x69, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
0x74, 0x1a, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63,
0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64,
0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x2a, 0x21, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64,
0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x7d,
0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x82, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74,
0x4c, 0x69, 0x6e, 0x6b, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x20, 0x2e, 0x61, 0x70,
0x69, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x4d,
0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e,
0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x6e,
0x6b, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x12, 0x23, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64,
0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x7d,
0x2f, 0x6c, 0x69, 0x6e, 0x6b, 0x2d, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x86, 0x01,
0x0a, 0x07, 0x45, 0x6e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e,
0x45, 0x6e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x51, 0x75, 0x65,
0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e,
0x61, 0x70, 0x69, 0x2e, 0x45, 0x6e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63,
0x65, 0x51, 0x75, 0x65, 0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x22, 0x27, 0x2f, 0x61, 0x70, 0x69,
0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x71, 0x75, 0x65, 0x75, 0x65, 0x5f,
0x69, 0x74, 0x65, 0x6d, 0x2e, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x7d, 0x2f, 0x71, 0x75,
0x65, 0x75, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x68, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x51,
0x75, 0x65, 0x75, 0x65, 0x12, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68,
0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x51, 0x75, 0x65, 0x75, 0x65, 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, 0x24, 0x82, 0xd3, 0xe4, 0x93,
0x02, 0x1e, 0x2a, 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,
0x12, 0x73, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x51, 0x75, 0x65, 0x75, 0x65, 0x12, 0x1f, 0x2e, 0x61,
0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x51, 0x75, 0x65, 0x75,
0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e,
0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x51, 0x75, 0x65,
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,
0x2f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x7d, 0x0a, 0x0d, 0x47,
0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x2e, 0x61,
0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x74, 0x69,
0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e,
0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x74,
0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x12, 0x21, 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, 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, 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,
0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x83, 0x01, 0x0a, 0x10, 0x47,
0x65, 0x74, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x44, 0x65, 0x76, 0x41, 0x64, 0x64, 0x72, 0x12,
0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x44,
0x65, 0x76, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e,
0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x44, 0x65, 0x76,
0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3,
0xe4, 0x93, 0x02, 0x2c, 0x22, 0x2a, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63,
0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x7d, 0x2f, 0x67, 0x65, 0x74,
0x2d, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x2d, 0x64, 0x65, 0x76, 0x2d, 0x61, 0x64, 0x64, 0x72,
0x12, 0x71, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x1c,
0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x65,
0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x61,
0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72,
0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4,
0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65,
0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x7d, 0x2f, 0x6d, 0x65, 0x74, 0x72,
0x69, 0x63, 0x73, 0x12, 0x82, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x6e, 0x6b, 0x4d,
0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74,
0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63,
0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47,
0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x4d, 0x65, 0x74, 0x72,
0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4,
0x93, 0x02, 0x25, 0x12, 0x23, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65,
0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x7d, 0x2f, 0x6c, 0x69, 0x6e, 0x6b,
0x2d, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x86, 0x01, 0x0a, 0x07, 0x45, 0x6e, 0x71,
0x75, 0x65, 0x75, 0x65, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x45, 0x6e, 0x71, 0x75, 0x65,
0x75, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x51, 0x75, 0x65, 0x75, 0x65, 0x49, 0x74, 0x65,
0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x45,
0x6e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x51, 0x75, 0x65, 0x75,
0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82,
0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x22, 0x27, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69,
0x63, 0x65, 0x73, 0x2f, 0x7b, 0x71, 0x75, 0x65, 0x75, 0x65, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x2e,
0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x7d, 0x2f, 0x71, 0x75, 0x65, 0x75, 0x65, 0x3a, 0x01,
0x2a, 0x12, 0x68, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x51, 0x75, 0x65, 0x75, 0x65, 0x12,
0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x44, 0x65, 0x76, 0x69, 0x63,
0x65, 0x51, 0x75, 0x65, 0x75, 0x65, 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, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x2a, 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, 0x12, 0x73, 0x0a, 0x08, 0x47,
0x65, 0x74, 0x51, 0x75, 0x65, 0x75, 0x65, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65,
0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x51, 0x75, 0x65, 0x75, 0x65, 0x49, 0x74, 0x65, 0x6d,
0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47,
0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x51, 0x75, 0x65, 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, 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, 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

@ -42,8 +42,10 @@ type UplinkFrameLog struct {
DevEui string `protobuf:"bytes,6,opt,name=dev_eui,json=devEui,proto3" json:"dev_eui,omitempty"`
// Time.
Time *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=time,proto3" json:"time,omitempty"`
// Plaintext mac-commands.
PlaintextMacCommands bool `protobuf:"varint,8,opt,name=plaintext_mac_commands,json=plaintextMacCommands,proto3" json:"plaintext_mac_commands,omitempty"`
// Plaintext f_opts mac-commands.
PlaintextFOpts bool `protobuf:"varint,8,opt,name=plaintext_f_opts,json=plaintextFOpts,proto3" json:"plaintext_f_opts,omitempty"`
// Plaintext frm_payload.
PlaintextFrmPayload bool `protobuf:"varint,9,opt,name=plaintext_frm_payload,json=plaintextFrmPayload,proto3" json:"plaintext_frm_payload,omitempty"`
}
func (x *UplinkFrameLog) Reset() {
@ -127,9 +129,16 @@ func (x *UplinkFrameLog) GetTime() *timestamppb.Timestamp {
return nil
}
func (x *UplinkFrameLog) GetPlaintextMacCommands() bool {
func (x *UplinkFrameLog) GetPlaintextFOpts() bool {
if x != nil {
return x.PlaintextMacCommands
return x.PlaintextFOpts
}
return false
}
func (x *UplinkFrameLog) GetPlaintextFrmPayload() bool {
if x != nil {
return x.PlaintextFrmPayload
}
return false
}
@ -155,8 +164,10 @@ type DownlinkFrameLog struct {
DevAddr string `protobuf:"bytes,7,opt,name=dev_addr,json=devAddr,proto3" json:"dev_addr,omitempty"`
// Device EUI (optional).
DevEui string `protobuf:"bytes,8,opt,name=dev_eui,json=devEui,proto3" json:"dev_eui,omitempty"`
// Plaintext mac-commands.
PlaintextMacCommands bool `protobuf:"varint,9,opt,name=plaintext_mac_commands,json=plaintextMacCommands,proto3" json:"plaintext_mac_commands,omitempty"`
// Plaintext f_opts mac-commands.
PlaintextFOpts bool `protobuf:"varint,9,opt,name=plaintext_f_opts,json=plaintextFOpts,proto3" json:"plaintext_f_opts,omitempty"`
// Plaintext frm_payload.
PlaintextFrmPayload bool `protobuf:"varint,10,opt,name=plaintext_frm_payload,json=plaintextFrmPayload,proto3" json:"plaintext_frm_payload,omitempty"`
}
func (x *DownlinkFrameLog) Reset() {
@ -247,9 +258,16 @@ func (x *DownlinkFrameLog) GetDevEui() string {
return ""
}
func (x *DownlinkFrameLog) GetPlaintextMacCommands() bool {
func (x *DownlinkFrameLog) GetPlaintextFOpts() bool {
if x != nil {
return x.PlaintextMacCommands
return x.PlaintextFOpts
}
return false
}
func (x *DownlinkFrameLog) GetPlaintextFrmPayload() bool {
if x != nil {
return x.PlaintextFrmPayload
}
return false
}
@ -262,7 +280,7 @@ var file_api_frame_log_proto_rawDesc = []byte{
0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65,
0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x13, 0x63, 0x6f, 0x6d,
0x6d, 0x6f, 0x6e, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
0x1a, 0x0b, 0x67, 0x77, 0x2f, 0x67, 0x77, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc7, 0x02,
0x1a, 0x0b, 0x67, 0x77, 0x2f, 0x67, 0x77, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xef, 0x02,
0x0a, 0x0e, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x4c, 0x6f, 0x67,
0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x68, 0x79, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18,
0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x70, 0x68, 0x79, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61,
@ -280,32 +298,37 @@ var file_api_frame_log_proto_rawDesc = []byte{
0x69, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 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, 0x04, 0x74, 0x69, 0x6d,
0x65, 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, 0x08, 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, 0x22, 0xe0, 0x02, 0x0a, 0x10, 0x44, 0x6f, 0x77, 0x6e,
0x6c, 0x69, 0x6e, 0x6b, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x4c, 0x6f, 0x67, 0x12, 0x2e, 0x0a, 0x04,
0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 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, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b,
0x70, 0x68, 0x79, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28,
0x0c, 0x52, 0x0a, 0x70, 0x68, 0x79, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2b, 0x0a,
0x07, 0x74, 0x78, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12,
0x2e, 0x67, 0x77, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x54, 0x78, 0x49, 0x6e,
0x66, 0x6f, 0x52, 0x06, 0x74, 0x78, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x6f,
0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52,
0x0a, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x67,
0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52,
0x09, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x06, 0x6d, 0x5f,
0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x63, 0x6f, 0x6d,
0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x6d, 0x54, 0x79, 0x70, 0x65,
0x12, 0x19, 0x0a, 0x08, 0x64, 0x65, 0x76, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x07, 0x20, 0x01,
0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x76, 0x41, 0x64, 0x64, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x64,
0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65,
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, 0x65, 0x0a, 0x11, 0x69, 0x6f,
0x65, 0x12, 0x28, 0x0a, 0x10, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66,
0x5f, 0x6f, 0x70, 0x74, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x70, 0x6c, 0x61,
0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x46, 0x4f, 0x70, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x70,
0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, 0x72, 0x6d, 0x5f, 0x70, 0x61, 0x79,
0x6c, 0x6f, 0x61, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x70, 0x6c, 0x61, 0x69,
0x6e, 0x74, 0x65, 0x78, 0x74, 0x46, 0x72, 0x6d, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22,
0x88, 0x03, 0x0a, 0x10, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x46, 0x72, 0x61, 0x6d,
0x65, 0x4c, 0x6f, 0x67, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 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, 0x04,
0x74, 0x69, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x68, 0x79, 0x5f, 0x70, 0x61, 0x79, 0x6c,
0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x70, 0x68, 0x79, 0x50, 0x61,
0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2b, 0x0a, 0x07, 0x74, 0x78, 0x5f, 0x69, 0x6e, 0x66, 0x6f,
0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x77, 0x2e, 0x44, 0x6f, 0x77, 0x6e,
0x6c, 0x69, 0x6e, 0x6b, 0x54, 0x78, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x74, 0x78, 0x49, 0x6e,
0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x69,
0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e,
0x6b, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69,
0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79,
0x49, 0x64, 0x12, 0x24, 0x0a, 0x06, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01,
0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x54, 0x79, 0x70,
0x65, 0x52, 0x05, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x65, 0x76, 0x5f,
0x61, 0x64, 0x64, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x76, 0x41,
0x64, 0x64, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x18, 0x08,
0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x76, 0x45, 0x75, 0x69, 0x12, 0x28, 0x0a, 0x10,
0x70, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, 0x5f, 0x6f, 0x70, 0x74, 0x73,
0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78,
0x74, 0x46, 0x4f, 0x70, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x74,
0x65, 0x78, 0x74, 0x5f, 0x66, 0x72, 0x6d, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18,
0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74,
0x46, 0x72, 0x6d, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x42, 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,

773
api/go/api/relay.pb.go vendored Normal file
View File

@ -0,0 +1,773 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.28.0
// protoc v3.21.9
// source: api/relay.proto
package api
import (
_ "google.golang.org/genproto/googleapis/api/annotations"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
emptypb "google.golang.org/protobuf/types/known/emptypb"
timestamppb "google.golang.org/protobuf/types/known/timestamppb"
reflect "reflect"
sync "sync"
)
const (
// Verify that this generated code is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
// Verify that runtime/protoimpl is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)
type RelayListItem struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// DevEUI (EUI64).
DevEui string `protobuf:"bytes,1,opt,name=dev_eui,json=devEui,proto3" json:"dev_eui,omitempty"`
// Name.
Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
}
func (x *RelayListItem) Reset() {
*x = RelayListItem{}
if protoimpl.UnsafeEnabled {
mi := &file_api_relay_proto_msgTypes[0]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *RelayListItem) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*RelayListItem) ProtoMessage() {}
func (x *RelayListItem) ProtoReflect() protoreflect.Message {
mi := &file_api_relay_proto_msgTypes[0]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use RelayListItem.ProtoReflect.Descriptor instead.
func (*RelayListItem) Descriptor() ([]byte, []int) {
return file_api_relay_proto_rawDescGZIP(), []int{0}
}
func (x *RelayListItem) GetDevEui() string {
if x != nil {
return x.DevEui
}
return ""
}
func (x *RelayListItem) GetName() string {
if x != nil {
return x.Name
}
return ""
}
type ListRelaysRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Max number of devices to return in the result-set.
Limit uint32 `protobuf:"varint,1,opt,name=limit,proto3" json:"limit,omitempty"`
// Offset in the result-set (for pagination).
Offset uint32 `protobuf:"varint,2,opt,name=offset,proto3" json:"offset,omitempty"`
// Application ID (UUID).
ApplicationId string `protobuf:"bytes,3,opt,name=application_id,json=applicationId,proto3" json:"application_id,omitempty"`
}
func (x *ListRelaysRequest) Reset() {
*x = ListRelaysRequest{}
if protoimpl.UnsafeEnabled {
mi := &file_api_relay_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *ListRelaysRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ListRelaysRequest) ProtoMessage() {}
func (x *ListRelaysRequest) ProtoReflect() protoreflect.Message {
mi := &file_api_relay_proto_msgTypes[1]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use ListRelaysRequest.ProtoReflect.Descriptor instead.
func (*ListRelaysRequest) Descriptor() ([]byte, []int) {
return file_api_relay_proto_rawDescGZIP(), []int{1}
}
func (x *ListRelaysRequest) GetLimit() uint32 {
if x != nil {
return x.Limit
}
return 0
}
func (x *ListRelaysRequest) GetOffset() uint32 {
if x != nil {
return x.Offset
}
return 0
}
func (x *ListRelaysRequest) GetApplicationId() string {
if x != nil {
return x.ApplicationId
}
return ""
}
type ListRelaysResponse struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Total number of relays.
TotalCount uint32 `protobuf:"varint,1,opt,name=total_count,json=totalCount,proto3" json:"total_count,omitempty"`
// Result-set.
Result []*RelayListItem `protobuf:"bytes,2,rep,name=result,proto3" json:"result,omitempty"`
}
func (x *ListRelaysResponse) Reset() {
*x = ListRelaysResponse{}
if protoimpl.UnsafeEnabled {
mi := &file_api_relay_proto_msgTypes[2]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *ListRelaysResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ListRelaysResponse) ProtoMessage() {}
func (x *ListRelaysResponse) ProtoReflect() protoreflect.Message {
mi := &file_api_relay_proto_msgTypes[2]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use ListRelaysResponse.ProtoReflect.Descriptor instead.
func (*ListRelaysResponse) Descriptor() ([]byte, []int) {
return file_api_relay_proto_rawDescGZIP(), []int{2}
}
func (x *ListRelaysResponse) GetTotalCount() uint32 {
if x != nil {
return x.TotalCount
}
return 0
}
func (x *ListRelaysResponse) GetResult() []*RelayListItem {
if x != nil {
return x.Result
}
return nil
}
type AddRelayDeviceRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Relay DevEUI (EUI64).
RelayDevEui string `protobuf:"bytes,1,opt,name=relay_dev_eui,json=relayDevEui,proto3" json:"relay_dev_eui,omitempty"`
// Device DevEUI (EUI64).
DeviceDevEui string `protobuf:"bytes,2,opt,name=device_dev_eui,json=deviceDevEui,proto3" json:"device_dev_eui,omitempty"`
}
func (x *AddRelayDeviceRequest) Reset() {
*x = AddRelayDeviceRequest{}
if protoimpl.UnsafeEnabled {
mi := &file_api_relay_proto_msgTypes[3]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *AddRelayDeviceRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*AddRelayDeviceRequest) ProtoMessage() {}
func (x *AddRelayDeviceRequest) ProtoReflect() protoreflect.Message {
mi := &file_api_relay_proto_msgTypes[3]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use AddRelayDeviceRequest.ProtoReflect.Descriptor instead.
func (*AddRelayDeviceRequest) Descriptor() ([]byte, []int) {
return file_api_relay_proto_rawDescGZIP(), []int{3}
}
func (x *AddRelayDeviceRequest) GetRelayDevEui() string {
if x != nil {
return x.RelayDevEui
}
return ""
}
func (x *AddRelayDeviceRequest) GetDeviceDevEui() string {
if x != nil {
return x.DeviceDevEui
}
return ""
}
type RemoveRelayDeviceRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Relay DevEUI (EUI64).
RelayDevEui string `protobuf:"bytes,1,opt,name=relay_dev_eui,json=relayDevEui,proto3" json:"relay_dev_eui,omitempty"`
// Device DevEUI (EUI64).
DeviceDevEui string `protobuf:"bytes,2,opt,name=device_dev_eui,json=deviceDevEui,proto3" json:"device_dev_eui,omitempty"`
}
func (x *RemoveRelayDeviceRequest) Reset() {
*x = RemoveRelayDeviceRequest{}
if protoimpl.UnsafeEnabled {
mi := &file_api_relay_proto_msgTypes[4]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *RemoveRelayDeviceRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*RemoveRelayDeviceRequest) ProtoMessage() {}
func (x *RemoveRelayDeviceRequest) ProtoReflect() protoreflect.Message {
mi := &file_api_relay_proto_msgTypes[4]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use RemoveRelayDeviceRequest.ProtoReflect.Descriptor instead.
func (*RemoveRelayDeviceRequest) Descriptor() ([]byte, []int) {
return file_api_relay_proto_rawDescGZIP(), []int{4}
}
func (x *RemoveRelayDeviceRequest) GetRelayDevEui() string {
if x != nil {
return x.RelayDevEui
}
return ""
}
func (x *RemoveRelayDeviceRequest) GetDeviceDevEui() string {
if x != nil {
return x.DeviceDevEui
}
return ""
}
type ListRelayDevicesRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Max number of multicast groups to return in the result-set.
Limit uint32 `protobuf:"varint,1,opt,name=limit,proto3" json:"limit,omitempty"`
// Offset in the result-set (for pagination).
Offset uint32 `protobuf:"varint,2,opt,name=offset,proto3" json:"offset,omitempty"`
// Relay DevEUI (EUI64).
RelayDevEui string `protobuf:"bytes,3,opt,name=relay_dev_eui,json=relayDevEui,proto3" json:"relay_dev_eui,omitempty"`
}
func (x *ListRelayDevicesRequest) Reset() {
*x = ListRelayDevicesRequest{}
if protoimpl.UnsafeEnabled {
mi := &file_api_relay_proto_msgTypes[5]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *ListRelayDevicesRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ListRelayDevicesRequest) ProtoMessage() {}
func (x *ListRelayDevicesRequest) ProtoReflect() protoreflect.Message {
mi := &file_api_relay_proto_msgTypes[5]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use ListRelayDevicesRequest.ProtoReflect.Descriptor instead.
func (*ListRelayDevicesRequest) Descriptor() ([]byte, []int) {
return file_api_relay_proto_rawDescGZIP(), []int{5}
}
func (x *ListRelayDevicesRequest) GetLimit() uint32 {
if x != nil {
return x.Limit
}
return 0
}
func (x *ListRelayDevicesRequest) GetOffset() uint32 {
if x != nil {
return x.Offset
}
return 0
}
func (x *ListRelayDevicesRequest) GetRelayDevEui() string {
if x != nil {
return x.RelayDevEui
}
return ""
}
type RelayDeviceListItem struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// DevEUI (EUI64).
DevEui string `protobuf:"bytes,1,opt,name=dev_eui,json=devEui,proto3" json:"dev_eui,omitempty"`
// Created at timestamp.
CreatedAt *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"`
// Device name.
Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
}
func (x *RelayDeviceListItem) Reset() {
*x = RelayDeviceListItem{}
if protoimpl.UnsafeEnabled {
mi := &file_api_relay_proto_msgTypes[6]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *RelayDeviceListItem) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*RelayDeviceListItem) ProtoMessage() {}
func (x *RelayDeviceListItem) ProtoReflect() protoreflect.Message {
mi := &file_api_relay_proto_msgTypes[6]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use RelayDeviceListItem.ProtoReflect.Descriptor instead.
func (*RelayDeviceListItem) Descriptor() ([]byte, []int) {
return file_api_relay_proto_rawDescGZIP(), []int{6}
}
func (x *RelayDeviceListItem) GetDevEui() string {
if x != nil {
return x.DevEui
}
return ""
}
func (x *RelayDeviceListItem) GetCreatedAt() *timestamppb.Timestamp {
if x != nil {
return x.CreatedAt
}
return nil
}
func (x *RelayDeviceListItem) GetName() string {
if x != nil {
return x.Name
}
return ""
}
type ListRelayDevicesResponse struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Total number of devices.
TotalCount uint32 `protobuf:"varint,1,opt,name=total_count,json=totalCount,proto3" json:"total_count,omitempty"`
// Result-set.
Result []*RelayDeviceListItem `protobuf:"bytes,2,rep,name=result,proto3" json:"result,omitempty"`
}
func (x *ListRelayDevicesResponse) Reset() {
*x = ListRelayDevicesResponse{}
if protoimpl.UnsafeEnabled {
mi := &file_api_relay_proto_msgTypes[7]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *ListRelayDevicesResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ListRelayDevicesResponse) ProtoMessage() {}
func (x *ListRelayDevicesResponse) ProtoReflect() protoreflect.Message {
mi := &file_api_relay_proto_msgTypes[7]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use ListRelayDevicesResponse.ProtoReflect.Descriptor instead.
func (*ListRelayDevicesResponse) Descriptor() ([]byte, []int) {
return file_api_relay_proto_rawDescGZIP(), []int{7}
}
func (x *ListRelayDevicesResponse) GetTotalCount() uint32 {
if x != nil {
return x.TotalCount
}
return 0
}
func (x *ListRelayDevicesResponse) GetResult() []*RelayDeviceListItem {
if x != nil {
return x.Result
}
return nil
}
var File_api_relay_proto protoreflect.FileDescriptor
var file_api_relay_proto_rawDesc = []byte{
0x0a, 0x0f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74,
0x6f, 0x12, 0x03, 0x61, 0x70, 0x69, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61,
0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70,
0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f,
0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e,
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72,
0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f,
0x74, 0x6f, 0x22, 0x3c, 0x0a, 0x0d, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x49,
0x74, 0x65, 0x6d, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x18, 0x01,
0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x76, 0x45, 0x75, 0x69, 0x12, 0x12, 0x0a, 0x04,
0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,
0x22, 0x68, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x6c, 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, 0x25, 0x0a, 0x0e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69,
0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x70, 0x70,
0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x61, 0x0a, 0x12, 0x4c, 0x69,
0x73, 0x74, 0x52, 0x65, 0x6c, 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, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28,
0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x4c, 0x69, 0x73,
0x74, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x61, 0x0a,
0x15, 0x41, 0x64, 0x64, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52,
0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0d, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f,
0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72,
0x65, 0x6c, 0x61, 0x79, 0x44, 0x65, 0x76, 0x45, 0x75, 0x69, 0x12, 0x24, 0x0a, 0x0e, 0x64, 0x65,
0x76, 0x69, 0x63, 0x65, 0x5f, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x18, 0x02, 0x20, 0x01,
0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x76, 0x45, 0x75, 0x69,
0x22, 0x64, 0x0a, 0x18, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x44,
0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0d,
0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x18, 0x01, 0x20,
0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x65, 0x76, 0x45, 0x75, 0x69,
0x12, 0x24, 0x0a, 0x0e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x64, 0x65, 0x76, 0x5f, 0x65,
0x75, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65,
0x44, 0x65, 0x76, 0x45, 0x75, 0x69, 0x22, 0x6b, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65,
0x6c, 0x61, 0x79, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 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,
0x22, 0x0a, 0x0d, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69,
0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x65, 0x76,
0x45, 0x75, 0x69, 0x22, 0x7d, 0x0a, 0x13, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x65, 0x76, 0x69,
0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x65,
0x76, 0x5f, 0x65, 0x75, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x76,
0x45, 0x75, 0x69, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61,
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, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x12,
0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,
0x6d, 0x65, 0x22, 0x6d, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x44,
0x65, 0x76, 0x69, 0x63, 0x65, 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,
0x30, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32,
0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x65, 0x76, 0x69, 0x63,
0x65, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c,
0x74, 0x32, 0xc4, 0x03, 0x0a, 0x0c, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69,
0x63, 0x65, 0x12, 0x4c, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x61, 0x70, 0x69,
0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
0x73, 0x74, 0x1a, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x6c,
0x61, 0x79, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4,
0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x73,
0x12, 0x6f, 0x0a, 0x09, 0x41, 0x64, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1a, 0x2e,
0x61, 0x70, 0x69, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x65, 0x76, 0x69,
0x63, 0x65, 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, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x22, 0x23, 0x2f, 0x61, 0x70, 0x69, 0x2f,
0x72, 0x65, 0x6c, 0x61, 0x79, 0x73, 0x2f, 0x7b, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x64, 0x65,
0x76, 0x5f, 0x65, 0x75, 0x69, 0x7d, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x3a, 0x01,
0x2a, 0x12, 0x7c, 0x0a, 0x0c, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63,
0x65, 0x12, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65,
0x6c, 0x61, 0x79, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 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, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f,
0x2a, 0x2d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x73, 0x2f, 0x7b, 0x72,
0x65, 0x6c, 0x61, 0x79, 0x5f, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x7d, 0x2f, 0x64, 0x65,
0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x7d, 0x12,
0x77, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x1c,
0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x65,
0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x61,
0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x65, 0x76, 0x69,
0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4,
0x93, 0x02, 0x25, 0x12, 0x23, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x73,
0x2f, 0x7b, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x7d,
0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x42, 0x62, 0x0a, 0x11, 0x69, 0x6f, 0x2e, 0x63,
0x68, 0x69, 0x72, 0x70, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x61, 0x70, 0x69, 0x42, 0x0a, 0x52,
0x65, 0x6c, 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,
}
var (
file_api_relay_proto_rawDescOnce sync.Once
file_api_relay_proto_rawDescData = file_api_relay_proto_rawDesc
)
func file_api_relay_proto_rawDescGZIP() []byte {
file_api_relay_proto_rawDescOnce.Do(func() {
file_api_relay_proto_rawDescData = protoimpl.X.CompressGZIP(file_api_relay_proto_rawDescData)
})
return file_api_relay_proto_rawDescData
}
var file_api_relay_proto_msgTypes = make([]protoimpl.MessageInfo, 8)
var file_api_relay_proto_goTypes = []interface{}{
(*RelayListItem)(nil), // 0: api.RelayListItem
(*ListRelaysRequest)(nil), // 1: api.ListRelaysRequest
(*ListRelaysResponse)(nil), // 2: api.ListRelaysResponse
(*AddRelayDeviceRequest)(nil), // 3: api.AddRelayDeviceRequest
(*RemoveRelayDeviceRequest)(nil), // 4: api.RemoveRelayDeviceRequest
(*ListRelayDevicesRequest)(nil), // 5: api.ListRelayDevicesRequest
(*RelayDeviceListItem)(nil), // 6: api.RelayDeviceListItem
(*ListRelayDevicesResponse)(nil), // 7: api.ListRelayDevicesResponse
(*timestamppb.Timestamp)(nil), // 8: google.protobuf.Timestamp
(*emptypb.Empty)(nil), // 9: google.protobuf.Empty
}
var file_api_relay_proto_depIdxs = []int32{
0, // 0: api.ListRelaysResponse.result:type_name -> api.RelayListItem
8, // 1: api.RelayDeviceListItem.created_at:type_name -> google.protobuf.Timestamp
6, // 2: api.ListRelayDevicesResponse.result:type_name -> api.RelayDeviceListItem
1, // 3: api.RelayService.List:input_type -> api.ListRelaysRequest
3, // 4: api.RelayService.AddDevice:input_type -> api.AddRelayDeviceRequest
4, // 5: api.RelayService.RemoveDevice:input_type -> api.RemoveRelayDeviceRequest
5, // 6: api.RelayService.ListDevices:input_type -> api.ListRelayDevicesRequest
2, // 7: api.RelayService.List:output_type -> api.ListRelaysResponse
9, // 8: api.RelayService.AddDevice:output_type -> google.protobuf.Empty
9, // 9: api.RelayService.RemoveDevice:output_type -> google.protobuf.Empty
7, // 10: api.RelayService.ListDevices:output_type -> api.ListRelayDevicesResponse
7, // [7:11] is the sub-list for method output_type
3, // [3:7] is the sub-list for method input_type
3, // [3:3] is the sub-list for extension type_name
3, // [3:3] is the sub-list for extension extendee
0, // [0:3] is the sub-list for field type_name
}
func init() { file_api_relay_proto_init() }
func file_api_relay_proto_init() {
if File_api_relay_proto != nil {
return
}
if !protoimpl.UnsafeEnabled {
file_api_relay_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*RelayListItem); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_api_relay_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ListRelaysRequest); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_api_relay_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ListRelaysResponse); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_api_relay_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*AddRelayDeviceRequest); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_api_relay_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*RemoveRelayDeviceRequest); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_api_relay_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ListRelayDevicesRequest); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_api_relay_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*RelayDeviceListItem); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_api_relay_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ListRelayDevicesResponse); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
}
type x struct{}
out := protoimpl.TypeBuilder{
File: protoimpl.DescBuilder{
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_api_relay_proto_rawDesc,
NumEnums: 0,
NumMessages: 8,
NumExtensions: 0,
NumServices: 1,
},
GoTypes: file_api_relay_proto_goTypes,
DependencyIndexes: file_api_relay_proto_depIdxs,
MessageInfos: file_api_relay_proto_msgTypes,
}.Build()
File_api_relay_proto = out.File
file_api_relay_proto_rawDesc = nil
file_api_relay_proto_goTypes = nil
file_api_relay_proto_depIdxs = nil
}

222
api/go/api/relay_grpc.pb.go vendored Normal file
View File

@ -0,0 +1,222 @@
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
// versions:
// - protoc-gen-go-grpc v1.2.0
// - protoc v3.21.9
// source: api/relay.proto
package api
import (
context "context"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
emptypb "google.golang.org/protobuf/types/known/emptypb"
)
// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
// Requires gRPC-Go v1.32.0 or later.
const _ = grpc.SupportPackageIsVersion7
// RelayServiceClient is the client API for RelayService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
type RelayServiceClient interface {
// List lists the relays for the given application id.
List(ctx context.Context, in *ListRelaysRequest, opts ...grpc.CallOption) (*ListRelaysResponse, error)
// AddDevice adds the given device to the relay.
AddDevice(ctx context.Context, in *AddRelayDeviceRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
// RemoveDevice removes the given device from the relay.
RemoveDevice(ctx context.Context, in *RemoveRelayDeviceRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
// ListDevices lists the devices for the given relay.
ListDevices(ctx context.Context, in *ListRelayDevicesRequest, opts ...grpc.CallOption) (*ListRelayDevicesResponse, error)
}
type relayServiceClient struct {
cc grpc.ClientConnInterface
}
func NewRelayServiceClient(cc grpc.ClientConnInterface) RelayServiceClient {
return &relayServiceClient{cc}
}
func (c *relayServiceClient) List(ctx context.Context, in *ListRelaysRequest, opts ...grpc.CallOption) (*ListRelaysResponse, error) {
out := new(ListRelaysResponse)
err := c.cc.Invoke(ctx, "/api.RelayService/List", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *relayServiceClient) AddDevice(ctx context.Context, in *AddRelayDeviceRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
out := new(emptypb.Empty)
err := c.cc.Invoke(ctx, "/api.RelayService/AddDevice", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *relayServiceClient) RemoveDevice(ctx context.Context, in *RemoveRelayDeviceRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
out := new(emptypb.Empty)
err := c.cc.Invoke(ctx, "/api.RelayService/RemoveDevice", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *relayServiceClient) ListDevices(ctx context.Context, in *ListRelayDevicesRequest, opts ...grpc.CallOption) (*ListRelayDevicesResponse, error) {
out := new(ListRelayDevicesResponse)
err := c.cc.Invoke(ctx, "/api.RelayService/ListDevices", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// RelayServiceServer is the server API for RelayService service.
// All implementations must embed UnimplementedRelayServiceServer
// for forward compatibility
type RelayServiceServer interface {
// List lists the relays for the given application id.
List(context.Context, *ListRelaysRequest) (*ListRelaysResponse, error)
// AddDevice adds the given device to the relay.
AddDevice(context.Context, *AddRelayDeviceRequest) (*emptypb.Empty, error)
// RemoveDevice removes the given device from the relay.
RemoveDevice(context.Context, *RemoveRelayDeviceRequest) (*emptypb.Empty, error)
// ListDevices lists the devices for the given relay.
ListDevices(context.Context, *ListRelayDevicesRequest) (*ListRelayDevicesResponse, error)
mustEmbedUnimplementedRelayServiceServer()
}
// UnimplementedRelayServiceServer must be embedded to have forward compatible implementations.
type UnimplementedRelayServiceServer struct {
}
func (UnimplementedRelayServiceServer) List(context.Context, *ListRelaysRequest) (*ListRelaysResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method List not implemented")
}
func (UnimplementedRelayServiceServer) AddDevice(context.Context, *AddRelayDeviceRequest) (*emptypb.Empty, error) {
return nil, status.Errorf(codes.Unimplemented, "method AddDevice not implemented")
}
func (UnimplementedRelayServiceServer) RemoveDevice(context.Context, *RemoveRelayDeviceRequest) (*emptypb.Empty, error) {
return nil, status.Errorf(codes.Unimplemented, "method RemoveDevice not implemented")
}
func (UnimplementedRelayServiceServer) ListDevices(context.Context, *ListRelayDevicesRequest) (*ListRelayDevicesResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method ListDevices not implemented")
}
func (UnimplementedRelayServiceServer) mustEmbedUnimplementedRelayServiceServer() {}
// UnsafeRelayServiceServer may be embedded to opt out of forward compatibility for this service.
// Use of this interface is not recommended, as added methods to RelayServiceServer will
// result in compilation errors.
type UnsafeRelayServiceServer interface {
mustEmbedUnimplementedRelayServiceServer()
}
func RegisterRelayServiceServer(s grpc.ServiceRegistrar, srv RelayServiceServer) {
s.RegisterService(&RelayService_ServiceDesc, srv)
}
func _RelayService_List_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(ListRelaysRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(RelayServiceServer).List(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/api.RelayService/List",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(RelayServiceServer).List(ctx, req.(*ListRelaysRequest))
}
return interceptor(ctx, in, info, handler)
}
func _RelayService_AddDevice_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(AddRelayDeviceRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(RelayServiceServer).AddDevice(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/api.RelayService/AddDevice",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(RelayServiceServer).AddDevice(ctx, req.(*AddRelayDeviceRequest))
}
return interceptor(ctx, in, info, handler)
}
func _RelayService_RemoveDevice_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(RemoveRelayDeviceRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(RelayServiceServer).RemoveDevice(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/api.RelayService/RemoveDevice",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(RelayServiceServer).RemoveDevice(ctx, req.(*RemoveRelayDeviceRequest))
}
return interceptor(ctx, in, info, handler)
}
func _RelayService_ListDevices_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(ListRelayDevicesRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(RelayServiceServer).ListDevices(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/api.RelayService/ListDevices",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(RelayServiceServer).ListDevices(ctx, req.(*ListRelayDevicesRequest))
}
return interceptor(ctx, in, info, handler)
}
// RelayService_ServiceDesc is the grpc.ServiceDesc for RelayService service.
// It's only intended for direct use with grpc.RegisterService,
// and not to be introspected or modified (even as a copy)
var RelayService_ServiceDesc = grpc.ServiceDesc{
ServiceName: "api.RelayService",
HandlerType: (*RelayServiceServer)(nil),
Methods: []grpc.MethodDesc{
{
MethodName: "List",
Handler: _RelayService_List_Handler,
},
{
MethodName: "AddDevice",
Handler: _RelayService_AddDevice_Handler,
},
{
MethodName: "RemoveDevice",
Handler: _RelayService_RemoveDevice_Handler,
},
{
MethodName: "ListDevices",
Handler: _RelayService_ListDevices_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "api/relay.proto",
}

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

@ -266,11 +266,13 @@ const (
TxAckStatus_IGNORED TxAckStatus = 0
// Packet has been programmed for downlink.
TxAckStatus_OK TxAckStatus = 1
// Rejected because it was already too late to program this packet for downlink.
// Rejected because it was already too late to program this packet for
// downlink.
TxAckStatus_TOO_LATE TxAckStatus = 2
// Rejected because downlink packet timestamp is too much in advance.
TxAckStatus_TOO_EARLY TxAckStatus = 3
// Rejected because there was already a packet programmed in requested timeframe.
// Rejected because there was already a packet programmed in requested
// timeframe.
TxAckStatus_COLLISION_PACKET TxAckStatus = 4
// Rejected because there was already a beacon planned in requested timeframe.
TxAckStatus_COLLISION_BEACON TxAckStatus = 5
@ -1261,7 +1263,8 @@ type UplinkRxInfoLegacy struct {
// Gateway specific context.
Context []byte `protobuf:"bytes,15,opt,name=context,proto3" json:"context,omitempty"`
// Uplink ID (UUID bytes).
// Unique and random ID which can be used to correlate the uplink across multiple logs.
// Unique and random ID which can be used to correlate the uplink across
// multiple logs.
UplinkId []byte `protobuf:"bytes,16,opt,name=uplink_id,json=uplinkId,proto3" json:"uplink_id,omitempty"`
// CRC status.
CrcStatus CRCStatus `protobuf:"varint,17,opt,name=crc_status,json=crcStatus,proto3,enum=gw.CRCStatus" json:"crc_status,omitempty"`
@ -2083,7 +2086,8 @@ type DelayTimingInfo struct {
unknownFields protoimpl.UnknownFields
// Delay (duration).
// The delay will be added to the gateway internal timing, provided by the context object.
// The delay will be added to the gateway internal timing, provided by the
// context object.
Delay *durationpb.Duration `protobuf:"bytes,1,opt,name=delay,proto3" json:"delay,omitempty"`
}
@ -2964,7 +2968,8 @@ type GatewayCommandExecRequest struct {
// Gateway ID.
GatewayId string `protobuf:"bytes,6,opt,name=gateway_id,json=gatewayId,proto3" json:"gateway_id,omitempty"`
// Command to execute.
// This command must be pre-configured in the LoRa Gateway Bridge configuration.
// This command must be pre-configured in the LoRa Gateway Bridge
// configuration.
Command string `protobuf:"bytes,2,opt,name=command,proto3" json:"command,omitempty"`
// Execution request ID.
// The same will be returned when the execution of the command has

View File

@ -98,6 +98,8 @@ const (
LogCode_UPLINK_F_CNT_RETRANSMISSION LogCode = 7
// Downlink gateway error.
LogCode_DOWNLINK_GATEWAY LogCode = 8
// Relay new end-device.
LogCode_RELAY_NEW_END_DEVICE LogCode = 9
)
// Enum value maps for LogCode.
@ -112,6 +114,7 @@ var (
6: "UPLINK_MIC",
7: "UPLINK_F_CNT_RETRANSMISSION",
8: "DOWNLINK_GATEWAY",
9: "RELAY_NEW_END_DEVICE",
}
LogCode_value = map[string]int32{
"UNKNOWN": 0,
@ -123,6 +126,7 @@ var (
"UPLINK_MIC": 6,
"UPLINK_F_CNT_RETRANSMISSION": 7,
"DOWNLINK_GATEWAY": 8,
"RELAY_NEW_END_DEVICE": 9,
}
)
@ -274,6 +278,100 @@ func (x *DeviceInfo) GetTags() map[string]string {
return nil
}
// Uplink relay RX information.
type UplinkRelayRxInfo struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Relay DevEUI.
DevEui string `protobuf:"bytes,1,opt,name=dev_eui,json=devEui,proto3" json:"dev_eui,omitempty"`
// Frequency.
Frequency uint32 `protobuf:"varint,2,opt,name=frequency,proto3" json:"frequency,omitempty"`
// Data-rate.
Dr uint32 `protobuf:"varint,3,opt,name=dr,proto3" json:"dr,omitempty"`
// SNR.
Snr int32 `protobuf:"varint,4,opt,name=snr,proto3" json:"snr,omitempty"`
// RSSI.
Rssi int32 `protobuf:"varint,5,opt,name=rssi,proto3" json:"rssi,omitempty"`
// WOR channel.
WorChannel uint32 `protobuf:"varint,6,opt,name=wor_channel,json=worChannel,proto3" json:"wor_channel,omitempty"`
}
func (x *UplinkRelayRxInfo) Reset() {
*x = UplinkRelayRxInfo{}
if protoimpl.UnsafeEnabled {
mi := &file_integration_integration_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *UplinkRelayRxInfo) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*UplinkRelayRxInfo) ProtoMessage() {}
func (x *UplinkRelayRxInfo) ProtoReflect() protoreflect.Message {
mi := &file_integration_integration_proto_msgTypes[1]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use UplinkRelayRxInfo.ProtoReflect.Descriptor instead.
func (*UplinkRelayRxInfo) Descriptor() ([]byte, []int) {
return file_integration_integration_proto_rawDescGZIP(), []int{1}
}
func (x *UplinkRelayRxInfo) GetDevEui() string {
if x != nil {
return x.DevEui
}
return ""
}
func (x *UplinkRelayRxInfo) GetFrequency() uint32 {
if x != nil {
return x.Frequency
}
return 0
}
func (x *UplinkRelayRxInfo) GetDr() uint32 {
if x != nil {
return x.Dr
}
return 0
}
func (x *UplinkRelayRxInfo) GetSnr() int32 {
if x != nil {
return x.Snr
}
return 0
}
func (x *UplinkRelayRxInfo) GetRssi() int32 {
if x != nil {
return x.Rssi
}
return 0
}
func (x *UplinkRelayRxInfo) GetWorChannel() uint32 {
if x != nil {
return x.WorChannel
}
return 0
}
// UplinkEvent is the message sent when an uplink payload has been received.
type UplinkEvent struct {
state protoimpl.MessageState
@ -300,18 +398,21 @@ type UplinkEvent struct {
Confirmed bool `protobuf:"varint,9,opt,name=confirmed,proto3" json:"confirmed,omitempty"`
// FRMPayload data.
Data []byte `protobuf:"bytes,10,opt,name=data,proto3" json:"data,omitempty"`
// Note that this is only set when a codec is configured in the Device Profile.
// Note that this is only set when a codec is configured in the Device
// Profile.
Object *structpb.Struct `protobuf:"bytes,11,opt,name=object,proto3" json:"object,omitempty"`
// Receiving gateway RX info.
RxInfo []*gw.UplinkRxInfo `protobuf:"bytes,12,rep,name=rx_info,json=rxInfo,proto3" json:"rx_info,omitempty"`
// TX info.
TxInfo *gw.UplinkTxInfo `protobuf:"bytes,13,opt,name=tx_info,json=txInfo,proto3" json:"tx_info,omitempty"`
// Relay info.
RelayRxInfo *UplinkRelayRxInfo `protobuf:"bytes,14,opt,name=relay_rx_info,json=relayRxInfo,proto3" json:"relay_rx_info,omitempty"`
}
func (x *UplinkEvent) Reset() {
*x = UplinkEvent{}
if protoimpl.UnsafeEnabled {
mi := &file_integration_integration_proto_msgTypes[1]
mi := &file_integration_integration_proto_msgTypes[2]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -324,7 +425,7 @@ func (x *UplinkEvent) String() string {
func (*UplinkEvent) ProtoMessage() {}
func (x *UplinkEvent) ProtoReflect() protoreflect.Message {
mi := &file_integration_integration_proto_msgTypes[1]
mi := &file_integration_integration_proto_msgTypes[2]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -337,7 +438,7 @@ func (x *UplinkEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use UplinkEvent.ProtoReflect.Descriptor instead.
func (*UplinkEvent) Descriptor() ([]byte, []int) {
return file_integration_integration_proto_rawDescGZIP(), []int{1}
return file_integration_integration_proto_rawDescGZIP(), []int{2}
}
func (x *UplinkEvent) GetDeduplicationId() string {
@ -431,6 +532,13 @@ func (x *UplinkEvent) GetTxInfo() *gw.UplinkTxInfo {
return nil
}
func (x *UplinkEvent) GetRelayRxInfo() *UplinkRelayRxInfo {
if x != nil {
return x.RelayRxInfo
}
return nil
}
// JoinEvent is the message sent when a device joined the network.
// Note: this event is sent at the first uplink after OTAA.
type JoinEvent struct {
@ -446,12 +554,14 @@ type JoinEvent struct {
DeviceInfo *DeviceInfo `protobuf:"bytes,3,opt,name=device_info,json=deviceInfo,proto3" json:"device_info,omitempty"`
// Device address.
DevAddr string `protobuf:"bytes,4,opt,name=dev_addr,json=devAddr,proto3" json:"dev_addr,omitempty"`
// Relay info.
RelayRxInfo *UplinkRelayRxInfo `protobuf:"bytes,5,opt,name=relay_rx_info,json=relayRxInfo,proto3" json:"relay_rx_info,omitempty"`
}
func (x *JoinEvent) Reset() {
*x = JoinEvent{}
if protoimpl.UnsafeEnabled {
mi := &file_integration_integration_proto_msgTypes[2]
mi := &file_integration_integration_proto_msgTypes[3]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -464,7 +574,7 @@ func (x *JoinEvent) String() string {
func (*JoinEvent) ProtoMessage() {}
func (x *JoinEvent) ProtoReflect() protoreflect.Message {
mi := &file_integration_integration_proto_msgTypes[2]
mi := &file_integration_integration_proto_msgTypes[3]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -477,7 +587,7 @@ func (x *JoinEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use JoinEvent.ProtoReflect.Descriptor instead.
func (*JoinEvent) Descriptor() ([]byte, []int) {
return file_integration_integration_proto_rawDescGZIP(), []int{2}
return file_integration_integration_proto_rawDescGZIP(), []int{3}
}
func (x *JoinEvent) GetDeduplicationId() string {
@ -508,6 +618,13 @@ func (x *JoinEvent) GetDevAddr() string {
return ""
}
func (x *JoinEvent) GetRelayRxInfo() *UplinkRelayRxInfo {
if x != nil {
return x.RelayRxInfo
}
return nil
}
// AckEvent is the message sent when a confirmation on a confirmed downlink
// has been received -or- when the downlink timed out.
type AckEvent struct {
@ -532,7 +649,7 @@ type AckEvent struct {
func (x *AckEvent) Reset() {
*x = AckEvent{}
if protoimpl.UnsafeEnabled {
mi := &file_integration_integration_proto_msgTypes[3]
mi := &file_integration_integration_proto_msgTypes[4]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -545,7 +662,7 @@ func (x *AckEvent) String() string {
func (*AckEvent) ProtoMessage() {}
func (x *AckEvent) ProtoReflect() protoreflect.Message {
mi := &file_integration_integration_proto_msgTypes[3]
mi := &file_integration_integration_proto_msgTypes[4]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -558,7 +675,7 @@ func (x *AckEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use AckEvent.ProtoReflect.Descriptor instead.
func (*AckEvent) Descriptor() ([]byte, []int) {
return file_integration_integration_proto_rawDescGZIP(), []int{3}
return file_integration_integration_proto_rawDescGZIP(), []int{4}
}
func (x *AckEvent) GetDeduplicationId() string {
@ -603,9 +720,9 @@ func (x *AckEvent) GetFCntDown() uint32 {
return 0
}
// TxAckEvent is the message sent when a downlink was acknowledged by the gateway
// for transmission. As a downlink can be scheduled in the future, this event
// does not confirm that the message has already been transmitted.
// TxAckEvent is the message sent when a downlink was acknowledged by the
// gateway for transmission. As a downlink can be scheduled in the future, this
// event does not confirm that the message has already been transmitted.
type TxAckEvent struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@ -630,7 +747,7 @@ type TxAckEvent struct {
func (x *TxAckEvent) Reset() {
*x = TxAckEvent{}
if protoimpl.UnsafeEnabled {
mi := &file_integration_integration_proto_msgTypes[4]
mi := &file_integration_integration_proto_msgTypes[5]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -643,7 +760,7 @@ func (x *TxAckEvent) String() string {
func (*TxAckEvent) ProtoMessage() {}
func (x *TxAckEvent) ProtoReflect() protoreflect.Message {
mi := &file_integration_integration_proto_msgTypes[4]
mi := &file_integration_integration_proto_msgTypes[5]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -656,7 +773,7 @@ func (x *TxAckEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use TxAckEvent.ProtoReflect.Descriptor instead.
func (*TxAckEvent) Descriptor() ([]byte, []int) {
return file_integration_integration_proto_rawDescGZIP(), []int{4}
return file_integration_integration_proto_rawDescGZIP(), []int{5}
}
func (x *TxAckEvent) GetDownlinkId() uint32 {
@ -731,7 +848,7 @@ type LogEvent struct {
func (x *LogEvent) Reset() {
*x = LogEvent{}
if protoimpl.UnsafeEnabled {
mi := &file_integration_integration_proto_msgTypes[5]
mi := &file_integration_integration_proto_msgTypes[6]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -744,7 +861,7 @@ func (x *LogEvent) String() string {
func (*LogEvent) ProtoMessage() {}
func (x *LogEvent) ProtoReflect() protoreflect.Message {
mi := &file_integration_integration_proto_msgTypes[5]
mi := &file_integration_integration_proto_msgTypes[6]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -757,7 +874,7 @@ func (x *LogEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use LogEvent.ProtoReflect.Descriptor instead.
func (*LogEvent) Descriptor() ([]byte, []int) {
return file_integration_integration_proto_rawDescGZIP(), []int{5}
return file_integration_integration_proto_rawDescGZIP(), []int{6}
}
func (x *LogEvent) GetTime() *timestamppb.Timestamp {
@ -829,7 +946,7 @@ type StatusEvent struct {
func (x *StatusEvent) Reset() {
*x = StatusEvent{}
if protoimpl.UnsafeEnabled {
mi := &file_integration_integration_proto_msgTypes[6]
mi := &file_integration_integration_proto_msgTypes[7]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -842,7 +959,7 @@ func (x *StatusEvent) String() string {
func (*StatusEvent) ProtoMessage() {}
func (x *StatusEvent) ProtoReflect() protoreflect.Message {
mi := &file_integration_integration_proto_msgTypes[6]
mi := &file_integration_integration_proto_msgTypes[7]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -855,7 +972,7 @@ func (x *StatusEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use StatusEvent.ProtoReflect.Descriptor instead.
func (*StatusEvent) Descriptor() ([]byte, []int) {
return file_integration_integration_proto_rawDescGZIP(), []int{6}
return file_integration_integration_proto_rawDescGZIP(), []int{7}
}
func (x *StatusEvent) GetDeduplicationId() string {
@ -926,7 +1043,7 @@ type LocationEvent struct {
func (x *LocationEvent) Reset() {
*x = LocationEvent{}
if protoimpl.UnsafeEnabled {
mi := &file_integration_integration_proto_msgTypes[7]
mi := &file_integration_integration_proto_msgTypes[8]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -939,7 +1056,7 @@ func (x *LocationEvent) String() string {
func (*LocationEvent) ProtoMessage() {}
func (x *LocationEvent) ProtoReflect() protoreflect.Message {
mi := &file_integration_integration_proto_msgTypes[7]
mi := &file_integration_integration_proto_msgTypes[8]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -952,7 +1069,7 @@ func (x *LocationEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use LocationEvent.ProtoReflect.Descriptor instead.
func (*LocationEvent) Descriptor() ([]byte, []int) {
return file_integration_integration_proto_rawDescGZIP(), []int{7}
return file_integration_integration_proto_rawDescGZIP(), []int{8}
}
func (x *LocationEvent) GetDeduplicationId() string {
@ -1008,7 +1125,7 @@ type IntegrationEvent struct {
func (x *IntegrationEvent) Reset() {
*x = IntegrationEvent{}
if protoimpl.UnsafeEnabled {
mi := &file_integration_integration_proto_msgTypes[8]
mi := &file_integration_integration_proto_msgTypes[9]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -1021,7 +1138,7 @@ func (x *IntegrationEvent) String() string {
func (*IntegrationEvent) ProtoMessage() {}
func (x *IntegrationEvent) ProtoReflect() protoreflect.Message {
mi := &file_integration_integration_proto_msgTypes[8]
mi := &file_integration_integration_proto_msgTypes[9]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -1034,7 +1151,7 @@ func (x *IntegrationEvent) ProtoReflect() protoreflect.Message {
// Deprecated: Use IntegrationEvent.ProtoReflect.Descriptor instead.
func (*IntegrationEvent) Descriptor() ([]byte, []int) {
return file_integration_integration_proto_rawDescGZIP(), []int{8}
return file_integration_integration_proto_rawDescGZIP(), []int{9}
}
func (x *IntegrationEvent) GetDeduplicationId() string {
@ -1106,7 +1223,7 @@ type DownlinkCommand struct {
func (x *DownlinkCommand) Reset() {
*x = DownlinkCommand{}
if protoimpl.UnsafeEnabled {
mi := &file_integration_integration_proto_msgTypes[9]
mi := &file_integration_integration_proto_msgTypes[10]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -1119,7 +1236,7 @@ func (x *DownlinkCommand) String() string {
func (*DownlinkCommand) ProtoMessage() {}
func (x *DownlinkCommand) ProtoReflect() protoreflect.Message {
mi := &file_integration_integration_proto_msgTypes[9]
mi := &file_integration_integration_proto_msgTypes[10]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -1132,7 +1249,7 @@ func (x *DownlinkCommand) ProtoReflect() protoreflect.Message {
// Deprecated: Use DownlinkCommand.ProtoReflect.Descriptor instead.
func (*DownlinkCommand) Descriptor() ([]byte, []int) {
return file_integration_integration_proto_rawDescGZIP(), []int{9}
return file_integration_integration_proto_rawDescGZIP(), []int{10}
}
func (x *DownlinkCommand) GetId() string {
@ -1215,140 +1332,124 @@ var file_integration_integration_proto_rawDesc = []byte{
0x73, 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, 0x22, 0xc4, 0x03, 0x0a, 0x0b, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x45, 0x76, 0x65,
0x6e, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x64, 0x65, 0x64, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65,
0x64, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2e, 0x0a,
0x04, 0x74, 0x69, 0x6d, 0x65, 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, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x38, 0x0a,
0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01,
0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x64, 0x65, 0x76,
0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x65, 0x76, 0x5f, 0x61,
0x64, 0x64, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x76, 0x41, 0x64,
0x64, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x64, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52,
0x03, 0x61, 0x64, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x64, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d,
0x52, 0x02, 0x64, 0x72, 0x12, 0x13, 0x0a, 0x05, 0x66, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x07, 0x20,
0x01, 0x28, 0x0d, 0x52, 0x04, 0x66, 0x43, 0x6e, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x66, 0x5f, 0x70,
0x6f, 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x66, 0x50, 0x6f, 0x72, 0x74,
0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x18, 0x09, 0x20,
0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x12, 0x12,
0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61,
0x74, 0x61, 0x12, 0x2f, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x0b, 0x20, 0x01,
0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x6f, 0x62, 0x6a,
0x65, 0x63, 0x74, 0x12, 0x29, 0x0a, 0x07, 0x72, 0x78, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x0c,
0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x67, 0x77, 0x2e, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b,
0x52, 0x78, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x72, 0x78, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x29,
0x0a, 0x07, 0x74, 0x78, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32,
0x10, 0x2e, 0x67, 0x77, 0x2e, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x54, 0x78, 0x49, 0x6e, 0x66,
0x6f, 0x52, 0x06, 0x74, 0x78, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xbb, 0x01, 0x0a, 0x09, 0x4a, 0x6f,
0x69, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x64, 0x65, 0x64, 0x75, 0x70,
0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
0x09, 0x52, 0x0f, 0x64, 0x65, 0x64, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
0x49, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 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, 0x04, 0x74, 0x69,
0x6d, 0x65, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66,
0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f,
0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x19, 0x0a, 0x08,
0x64, 0x65, 0x76, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
0x64, 0x65, 0x76, 0x41, 0x64, 0x64, 0x72, 0x22, 0x85, 0x02, 0x0a, 0x08, 0x41, 0x63, 0x6b, 0x45,
0x76, 0x65, 0x6e, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x64, 0x65, 0x64, 0x75, 0x70, 0x6c, 0x69, 0x63,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f,
0x64, 0x65, 0x64, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12,
0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 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, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12,
0x38, 0x0a, 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03,
0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69,
0x6f, 0x6e, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x64,
0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x0a, 0x0d, 0x71, 0x75, 0x65,
0x75, 0x65, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,
0x52, 0x0b, 0x71, 0x75, 0x65, 0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x49, 0x64, 0x12, 0x22, 0x0a,
0x0c, 0x61, 0x63, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x64, 0x18, 0x05, 0x20,
0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x63, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65,
0x64, 0x12, 0x1c, 0x0a, 0x0a, 0x66, 0x5f, 0x63, 0x6e, 0x74, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x18,
0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x66, 0x43, 0x6e, 0x74, 0x44, 0x6f, 0x77, 0x6e, 0x22,
0xa5, 0x02, 0x0a, 0x0a, 0x54, 0x78, 0x41, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1f,
0x0a, 0x0b, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,
0x01, 0x28, 0x0d, 0x52, 0x0a, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x49, 0x64, 0x12,
0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 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, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12,
0x38, 0x0a, 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03,
0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69,
0x6f, 0x6e, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x64,
0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x0a, 0x0d, 0x71, 0x75, 0x65,
0x75, 0x65, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,
0x52, 0x0b, 0x71, 0x75, 0x65, 0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x49, 0x64, 0x12, 0x1c, 0x0a,
0x0a, 0x66, 0x5f, 0x63, 0x6e, 0x74, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28,
0x0d, 0x52, 0x08, 0x66, 0x43, 0x6e, 0x74, 0x44, 0x6f, 0x77, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x67,
0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52,
0x09, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x07, 0x74, 0x78,
0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x77,
0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x54, 0x78, 0x49, 0x6e, 0x66, 0x6f, 0x52,
0x06, 0x74, 0x78, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xe7, 0x02, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x45,
0x76, 0x65, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 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, 0x04,
0x74, 0x69, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69,
0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6e, 0x74, 0x65,
0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e,
0x66, 0x6f, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2b,
0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e,
0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4c, 0x6f, 0x67, 0x4c,
0x65, 0x76, 0x65, 0x6c, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x28, 0x0a, 0x04, 0x63,
0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x69, 0x6e, 0x74, 0x65,
0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4c, 0x6f, 0x67, 0x43, 0x6f, 0x64, 0x65, 0x52,
0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70,
0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63,
0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65,
0x78, 0x74, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67,
0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4c, 0x6f, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e,
0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x63, 0x6f,
0x6e, 0x74, 0x65, 0x78, 0x74, 0x1a, 0x3a, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74,
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, 0x22, 0xcf, 0x02, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x45, 0x76, 0x65, 0x6e,
0x74, 0x12, 0x29, 0x0a, 0x10, 0x64, 0x65, 0x64, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69,
0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x64,
0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x04,
0x74, 0x69, 0x6d, 0x65, 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, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x0b,
0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28,
0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69,
0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e,
0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x12, 0x32,
0x0a, 0x15, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x6f, 0x77, 0x65, 0x72,
0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x65,
0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72,
0x63, 0x65, 0x12, 0x3a, 0x0a, 0x19, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65,
0x76, 0x65, 0x6c, 0x5f, 0x75, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18,
0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x4c, 0x65,
0x76, 0x65, 0x6c, 0x55, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x23,
0x0a, 0x0d, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18,
0x08, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x4c, 0x65,
0x76, 0x65, 0x6c, 0x22, 0xd2, 0x01, 0x0a, 0x0d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x64, 0x65, 0x64, 0x75, 0x70, 0x6c, 0x69,
0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
0x0f, 0x64, 0x65, 0x64, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64,
0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a,
0x38, 0x01, 0x22, 0xa1, 0x01, 0x0a, 0x11, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x52, 0x65, 0x6c,
0x61, 0x79, 0x52, 0x78, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x5f,
0x65, 0x75, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x76, 0x45, 0x75,
0x69, 0x12, 0x1c, 0x0a, 0x09, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x02,
0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12,
0x0e, 0x0a, 0x02, 0x64, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x64, 0x72, 0x12,
0x10, 0x0a, 0x03, 0x73, 0x6e, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x73, 0x6e,
0x72, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x73, 0x73, 0x69, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52,
0x04, 0x72, 0x73, 0x73, 0x69, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, 0x72, 0x5f, 0x63, 0x68, 0x61,
0x6e, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x43,
0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x22, 0x88, 0x04, 0x0a, 0x0b, 0x55, 0x70, 0x6c, 0x69, 0x6e,
0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x64, 0x65, 0x64, 0x75, 0x70, 0x6c,
0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
0x52, 0x0f, 0x64, 0x65, 0x64, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49,
0x64, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 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, 0x04, 0x74, 0x69, 0x6d,
0x65, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f,
0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61,
0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52,
0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x19, 0x0a, 0x08, 0x64,
0x65, 0x76, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64,
0x65, 0x76, 0x41, 0x64, 0x64, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x64, 0x72, 0x18, 0x05, 0x20,
0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x64, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x64, 0x72, 0x18, 0x06,
0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x64, 0x72, 0x12, 0x13, 0x0a, 0x05, 0x66, 0x5f, 0x63, 0x6e,
0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x66, 0x43, 0x6e, 0x74, 0x12, 0x15, 0x0a,
0x06, 0x66, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x66,
0x50, 0x6f, 0x72, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65,
0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d,
0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c,
0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2f, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52,
0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x29, 0x0a, 0x07, 0x72, 0x78, 0x5f, 0x69, 0x6e,
0x66, 0x6f, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x67, 0x77, 0x2e, 0x55, 0x70,
0x6c, 0x69, 0x6e, 0x6b, 0x52, 0x78, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x72, 0x78, 0x49, 0x6e,
0x66, 0x6f, 0x12, 0x29, 0x0a, 0x07, 0x74, 0x78, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x0d, 0x20,
0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x67, 0x77, 0x2e, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x54,
0x78, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x74, 0x78, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x42, 0x0a,
0x0d, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x72, 0x78, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x0e,
0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69,
0x6f, 0x6e, 0x2e, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x52, 0x78,
0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x52, 0x78, 0x49, 0x6e, 0x66,
0x6f, 0x22, 0xff, 0x01, 0x0a, 0x09, 0x4a, 0x6f, 0x69, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12,
0x29, 0x0a, 0x10, 0x64, 0x65, 0x64, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x64, 0x75, 0x70,
0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69,
0x6d, 0x65, 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, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x65,
0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32,
0x17, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x65,
0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65,
0x49, 0x6e, 0x66, 0x6f, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x65, 0x76, 0x5f, 0x61, 0x64, 0x64, 0x72,
0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x76, 0x41, 0x64, 0x64, 0x72, 0x12,
0x42, 0x0a, 0x0d, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x72, 0x78, 0x5f, 0x69, 0x6e, 0x66, 0x6f,
0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61,
0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x52, 0x65, 0x6c, 0x61, 0x79,
0x52, 0x78, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x52, 0x78, 0x49,
0x6e, 0x66, 0x6f, 0x22, 0x85, 0x02, 0x0a, 0x08, 0x41, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74,
0x12, 0x29, 0x0a, 0x10, 0x64, 0x65, 0x64, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x64, 0x75,
0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x74,
0x69, 0x6d, 0x65, 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, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x0b, 0x64,
0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
0x32, 0x17, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44,
0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63,
0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x0a, 0x0d, 0x71, 0x75, 0x65, 0x75, 0x65, 0x5f, 0x69,
0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x71, 0x75,
0x65, 0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x63, 0x6b,
0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52,
0x0c, 0x61, 0x63, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x64, 0x12, 0x1c, 0x0a,
0x0a, 0x66, 0x5f, 0x63, 0x6e, 0x74, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28,
0x0d, 0x52, 0x08, 0x66, 0x43, 0x6e, 0x74, 0x44, 0x6f, 0x77, 0x6e, 0x22, 0xa5, 0x02, 0x0a, 0x0a,
0x54, 0x78, 0x41, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x6f,
0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52,
0x0a, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x74,
0x69, 0x6d, 0x65, 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, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x0b, 0x64,
0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
0x32, 0x17, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44,
0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63,
0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x0a, 0x0d, 0x71, 0x75, 0x65, 0x75, 0x65, 0x5f, 0x69,
0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x71, 0x75,
0x65, 0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x0a, 0x66, 0x5f, 0x63,
0x6e, 0x74, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x66,
0x43, 0x6e, 0x74, 0x44, 0x6f, 0x77, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x61, 0x74, 0x65, 0x77,
0x61, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x61, 0x74,
0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x07, 0x74, 0x78, 0x5f, 0x69, 0x6e, 0x66,
0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x77, 0x2e, 0x44, 0x6f, 0x77,
0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x54, 0x78, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x74, 0x78, 0x49,
0x6e, 0x66, 0x6f, 0x22, 0xe7, 0x02, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74,
0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 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, 0x04, 0x74, 0x69, 0x6d, 0x65,
0x12, 0x38, 0x0a, 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18,
0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74,
0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a,
0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x08, 0x6c, 0x6f,
0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63,
0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08,
0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa2, 0x02, 0x0a, 0x10, 0x49, 0x6e, 0x74,
0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x29, 0x0a,
0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2b, 0x0a, 0x05, 0x6c, 0x65,
0x76, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6e, 0x74, 0x65,
0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c,
0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x28, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18,
0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x2e, 0x4c, 0x6f, 0x67, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x63, 0x6f, 0x64,
0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e,
0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x06,
0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69,
0x6f, 0x6e, 0x2e, 0x4c, 0x6f, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74,
0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78,
0x74, 0x1a, 0x3a, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 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, 0x22, 0xcf, 0x02,
0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x29, 0x0a,
0x10, 0x64, 0x65, 0x64, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69,
0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x64, 0x75, 0x70, 0x6c, 0x69,
0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65,
@ -1358,50 +1459,86 @@ var file_integration_integration_proto_rawDesc = []byte{
0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e,
0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x65, 0x76, 0x69,
0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e,
0x66, 0x6f, 0x12, 0x29, 0x0a, 0x10, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f,
0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x69, 0x6e,
0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a,
0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28,
0x09, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2f, 0x0a, 0x06,
0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67,
0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53,
0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0xb4, 0x01,
0x0a, 0x0f, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e,
0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,
0x64, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x18, 0x02, 0x20, 0x01,
0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x76, 0x45, 0x75, 0x69, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f,
0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63,
0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x66, 0x5f, 0x70, 0x6f,
0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x66, 0x50, 0x6f, 0x72, 0x74, 0x12,
0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64,
0x61, 0x74, 0x61, 0x12, 0x2f, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x06, 0x20,
0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x6f, 0x62,
0x6a, 0x65, 0x63, 0x74, 0x2a, 0x2c, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c,
0x12, 0x08, 0x0a, 0x04, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x41,
0x52, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52,
0x10, 0x02, 0x2a, 0xc0, 0x01, 0x0a, 0x07, 0x4c, 0x6f, 0x67, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x0b,
0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x44,
0x4f, 0x57, 0x4e, 0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x50, 0x41, 0x59, 0x4c, 0x4f, 0x41, 0x44, 0x5f,
0x53, 0x49, 0x5a, 0x45, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x55, 0x50, 0x4c, 0x49, 0x4e, 0x4b,
0x5f, 0x43, 0x4f, 0x44, 0x45, 0x43, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x4f, 0x57, 0x4e,
0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x43, 0x10, 0x03, 0x12, 0x08, 0x0a, 0x04,
0x4f, 0x54, 0x41, 0x41, 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x55, 0x50, 0x4c, 0x49, 0x4e, 0x4b,
0x5f, 0x46, 0x5f, 0x43, 0x4e, 0x54, 0x5f, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x05, 0x12, 0x0e,
0x0a, 0x0a, 0x55, 0x50, 0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x4d, 0x49, 0x43, 0x10, 0x06, 0x12, 0x1f,
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, 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,
0x66, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01,
0x28, 0x05, 0x52, 0x06, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x12, 0x32, 0x0a, 0x15, 0x65, 0x78,
0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x73, 0x6f, 0x75,
0x72, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x65, 0x78, 0x74, 0x65, 0x72,
0x6e, 0x61, 0x6c, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x3a,
0x0a, 0x19, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x5f,
0x75, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28,
0x08, 0x52, 0x17, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x55,
0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x61,
0x74, 0x74, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28,
0x02, 0x52, 0x0c, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x22,
0xd2, 0x01, 0x0a, 0x0d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e,
0x74, 0x12, 0x29, 0x0a, 0x10, 0x64, 0x65, 0x64, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69,
0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x64,
0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x04,
0x74, 0x69, 0x6d, 0x65, 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, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x0b,
0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28,
0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69,
0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69,
0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,
0x6e, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61,
0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa2, 0x02, 0x0a, 0x10, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61,
0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x64, 0x65, 0x64,
0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,
0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x64, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69,
0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 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, 0x04,
0x74, 0x69, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69,
0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6e, 0x74, 0x65,
0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e,
0x66, 0x6f, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x29,
0x0a, 0x10, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61,
0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x76, 0x65,
0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65,
0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65,
0x63, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63,
0x74, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0xb4, 0x01, 0x0a, 0x0f, 0x44, 0x6f,
0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x0e, 0x0a,
0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a,
0x07, 0x64, 0x65, 0x76, 0x5f, 0x65, 0x75, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
0x64, 0x65, 0x76, 0x45, 0x75, 0x69, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72,
0x6d, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69,
0x72, 0x6d, 0x65, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x66, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04,
0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x66, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64,
0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12,
0x2f, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32,
0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
0x2a, 0x2c, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x08, 0x0a, 0x04,
0x49, 0x4e, 0x46, 0x4f, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e,
0x47, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x2a, 0xda,
0x01, 0x0a, 0x07, 0x4c, 0x6f, 0x67, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e,
0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x44, 0x4f, 0x57, 0x4e, 0x4c,
0x49, 0x4e, 0x4b, 0x5f, 0x50, 0x41, 0x59, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x53, 0x49, 0x5a, 0x45,
0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x55, 0x50, 0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x43, 0x4f, 0x44,
0x45, 0x43, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x4f, 0x57, 0x4e, 0x4c, 0x49, 0x4e, 0x4b,
0x5f, 0x43, 0x4f, 0x44, 0x45, 0x43, 0x10, 0x03, 0x12, 0x08, 0x0a, 0x04, 0x4f, 0x54, 0x41, 0x41,
0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x55, 0x50, 0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x46, 0x5f, 0x43,
0x4e, 0x54, 0x5f, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x05, 0x12, 0x0e, 0x0a, 0x0a, 0x55, 0x50,
0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x4d, 0x49, 0x43, 0x10, 0x06, 0x12, 0x1f, 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, 0x12, 0x18, 0x0a, 0x14, 0x52, 0x45, 0x4c, 0x41, 0x59, 0x5f, 0x4e, 0x45, 0x57, 0x5f, 0x45,
0x4e, 0x44, 0x5f, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x10, 0x09, 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 (
@ -1417,62 +1554,65 @@ func file_integration_integration_proto_rawDescGZIP() []byte {
}
var file_integration_integration_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
var file_integration_integration_proto_msgTypes = make([]protoimpl.MessageInfo, 12)
var file_integration_integration_proto_msgTypes = make([]protoimpl.MessageInfo, 13)
var file_integration_integration_proto_goTypes = []interface{}{
(LogLevel)(0), // 0: integration.LogLevel
(LogCode)(0), // 1: integration.LogCode
(*DeviceInfo)(nil), // 2: integration.DeviceInfo
(*UplinkEvent)(nil), // 3: integration.UplinkEvent
(*JoinEvent)(nil), // 4: integration.JoinEvent
(*AckEvent)(nil), // 5: integration.AckEvent
(*TxAckEvent)(nil), // 6: integration.TxAckEvent
(*LogEvent)(nil), // 7: integration.LogEvent
(*StatusEvent)(nil), // 8: integration.StatusEvent
(*LocationEvent)(nil), // 9: integration.LocationEvent
(*IntegrationEvent)(nil), // 10: integration.IntegrationEvent
(*DownlinkCommand)(nil), // 11: integration.DownlinkCommand
nil, // 12: integration.DeviceInfo.TagsEntry
nil, // 13: integration.LogEvent.ContextEntry
(*timestamppb.Timestamp)(nil), // 14: google.protobuf.Timestamp
(*structpb.Struct)(nil), // 15: google.protobuf.Struct
(*gw.UplinkRxInfo)(nil), // 16: gw.UplinkRxInfo
(*gw.UplinkTxInfo)(nil), // 17: gw.UplinkTxInfo
(*gw.DownlinkTxInfo)(nil), // 18: gw.DownlinkTxInfo
(*common.Location)(nil), // 19: common.Location
(*UplinkRelayRxInfo)(nil), // 3: integration.UplinkRelayRxInfo
(*UplinkEvent)(nil), // 4: integration.UplinkEvent
(*JoinEvent)(nil), // 5: integration.JoinEvent
(*AckEvent)(nil), // 6: integration.AckEvent
(*TxAckEvent)(nil), // 7: integration.TxAckEvent
(*LogEvent)(nil), // 8: integration.LogEvent
(*StatusEvent)(nil), // 9: integration.StatusEvent
(*LocationEvent)(nil), // 10: integration.LocationEvent
(*IntegrationEvent)(nil), // 11: integration.IntegrationEvent
(*DownlinkCommand)(nil), // 12: integration.DownlinkCommand
nil, // 13: integration.DeviceInfo.TagsEntry
nil, // 14: integration.LogEvent.ContextEntry
(*timestamppb.Timestamp)(nil), // 15: google.protobuf.Timestamp
(*structpb.Struct)(nil), // 16: google.protobuf.Struct
(*gw.UplinkRxInfo)(nil), // 17: gw.UplinkRxInfo
(*gw.UplinkTxInfo)(nil), // 18: gw.UplinkTxInfo
(*gw.DownlinkTxInfo)(nil), // 19: gw.DownlinkTxInfo
(*common.Location)(nil), // 20: common.Location
}
var file_integration_integration_proto_depIdxs = []int32{
12, // 0: integration.DeviceInfo.tags:type_name -> integration.DeviceInfo.TagsEntry
14, // 1: integration.UplinkEvent.time:type_name -> google.protobuf.Timestamp
13, // 0: integration.DeviceInfo.tags:type_name -> integration.DeviceInfo.TagsEntry
15, // 1: integration.UplinkEvent.time:type_name -> google.protobuf.Timestamp
2, // 2: integration.UplinkEvent.device_info:type_name -> integration.DeviceInfo
15, // 3: integration.UplinkEvent.object:type_name -> google.protobuf.Struct
16, // 4: integration.UplinkEvent.rx_info:type_name -> gw.UplinkRxInfo
17, // 5: integration.UplinkEvent.tx_info:type_name -> gw.UplinkTxInfo
14, // 6: integration.JoinEvent.time:type_name -> google.protobuf.Timestamp
2, // 7: integration.JoinEvent.device_info:type_name -> integration.DeviceInfo
14, // 8: integration.AckEvent.time:type_name -> google.protobuf.Timestamp
2, // 9: integration.AckEvent.device_info:type_name -> integration.DeviceInfo
14, // 10: integration.TxAckEvent.time:type_name -> google.protobuf.Timestamp
2, // 11: integration.TxAckEvent.device_info:type_name -> integration.DeviceInfo
18, // 12: integration.TxAckEvent.tx_info:type_name -> gw.DownlinkTxInfo
14, // 13: integration.LogEvent.time:type_name -> google.protobuf.Timestamp
2, // 14: integration.LogEvent.device_info:type_name -> integration.DeviceInfo
0, // 15: integration.LogEvent.level:type_name -> integration.LogLevel
1, // 16: integration.LogEvent.code:type_name -> integration.LogCode
13, // 17: integration.LogEvent.context:type_name -> integration.LogEvent.ContextEntry
14, // 18: integration.StatusEvent.time:type_name -> google.protobuf.Timestamp
2, // 19: integration.StatusEvent.device_info:type_name -> integration.DeviceInfo
14, // 20: integration.LocationEvent.time:type_name -> google.protobuf.Timestamp
2, // 21: integration.LocationEvent.device_info:type_name -> integration.DeviceInfo
19, // 22: integration.LocationEvent.location:type_name -> common.Location
14, // 23: integration.IntegrationEvent.time:type_name -> google.protobuf.Timestamp
2, // 24: integration.IntegrationEvent.device_info:type_name -> integration.DeviceInfo
15, // 25: integration.IntegrationEvent.object:type_name -> google.protobuf.Struct
15, // 26: integration.DownlinkCommand.object:type_name -> google.protobuf.Struct
27, // [27:27] is the sub-list for method output_type
27, // [27:27] is the sub-list for method input_type
27, // [27:27] is the sub-list for extension type_name
27, // [27:27] is the sub-list for extension extendee
0, // [0:27] is the sub-list for field type_name
16, // 3: integration.UplinkEvent.object:type_name -> google.protobuf.Struct
17, // 4: integration.UplinkEvent.rx_info:type_name -> gw.UplinkRxInfo
18, // 5: integration.UplinkEvent.tx_info:type_name -> gw.UplinkTxInfo
3, // 6: integration.UplinkEvent.relay_rx_info:type_name -> integration.UplinkRelayRxInfo
15, // 7: integration.JoinEvent.time:type_name -> google.protobuf.Timestamp
2, // 8: integration.JoinEvent.device_info:type_name -> integration.DeviceInfo
3, // 9: integration.JoinEvent.relay_rx_info:type_name -> integration.UplinkRelayRxInfo
15, // 10: integration.AckEvent.time:type_name -> google.protobuf.Timestamp
2, // 11: integration.AckEvent.device_info:type_name -> integration.DeviceInfo
15, // 12: integration.TxAckEvent.time:type_name -> google.protobuf.Timestamp
2, // 13: integration.TxAckEvent.device_info:type_name -> integration.DeviceInfo
19, // 14: integration.TxAckEvent.tx_info:type_name -> gw.DownlinkTxInfo
15, // 15: integration.LogEvent.time:type_name -> google.protobuf.Timestamp
2, // 16: integration.LogEvent.device_info:type_name -> integration.DeviceInfo
0, // 17: integration.LogEvent.level:type_name -> integration.LogLevel
1, // 18: integration.LogEvent.code:type_name -> integration.LogCode
14, // 19: integration.LogEvent.context:type_name -> integration.LogEvent.ContextEntry
15, // 20: integration.StatusEvent.time:type_name -> google.protobuf.Timestamp
2, // 21: integration.StatusEvent.device_info:type_name -> integration.DeviceInfo
15, // 22: integration.LocationEvent.time:type_name -> google.protobuf.Timestamp
2, // 23: integration.LocationEvent.device_info:type_name -> integration.DeviceInfo
20, // 24: integration.LocationEvent.location:type_name -> common.Location
15, // 25: integration.IntegrationEvent.time:type_name -> google.protobuf.Timestamp
2, // 26: integration.IntegrationEvent.device_info:type_name -> integration.DeviceInfo
16, // 27: integration.IntegrationEvent.object:type_name -> google.protobuf.Struct
16, // 28: integration.DownlinkCommand.object:type_name -> google.protobuf.Struct
29, // [29:29] is the sub-list for method output_type
29, // [29:29] is the sub-list for method input_type
29, // [29:29] is the sub-list for extension type_name
29, // [29:29] is the sub-list for extension extendee
0, // [0:29] is the sub-list for field type_name
}
func init() { file_integration_integration_proto_init() }
@ -1494,7 +1634,7 @@ func file_integration_integration_proto_init() {
}
}
file_integration_integration_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*UplinkEvent); i {
switch v := v.(*UplinkRelayRxInfo); i {
case 0:
return &v.state
case 1:
@ -1506,7 +1646,7 @@ func file_integration_integration_proto_init() {
}
}
file_integration_integration_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*JoinEvent); i {
switch v := v.(*UplinkEvent); i {
case 0:
return &v.state
case 1:
@ -1518,7 +1658,7 @@ func file_integration_integration_proto_init() {
}
}
file_integration_integration_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*AckEvent); i {
switch v := v.(*JoinEvent); i {
case 0:
return &v.state
case 1:
@ -1530,7 +1670,7 @@ func file_integration_integration_proto_init() {
}
}
file_integration_integration_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*TxAckEvent); i {
switch v := v.(*AckEvent); i {
case 0:
return &v.state
case 1:
@ -1542,7 +1682,7 @@ func file_integration_integration_proto_init() {
}
}
file_integration_integration_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*LogEvent); i {
switch v := v.(*TxAckEvent); i {
case 0:
return &v.state
case 1:
@ -1554,7 +1694,7 @@ func file_integration_integration_proto_init() {
}
}
file_integration_integration_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*StatusEvent); i {
switch v := v.(*LogEvent); i {
case 0:
return &v.state
case 1:
@ -1566,7 +1706,7 @@ func file_integration_integration_proto_init() {
}
}
file_integration_integration_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*LocationEvent); i {
switch v := v.(*StatusEvent); i {
case 0:
return &v.state
case 1:
@ -1578,7 +1718,7 @@ func file_integration_integration_proto_init() {
}
}
file_integration_integration_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*IntegrationEvent); i {
switch v := v.(*LocationEvent); i {
case 0:
return &v.state
case 1:
@ -1590,6 +1730,18 @@ func file_integration_integration_proto_init() {
}
}
file_integration_integration_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*IntegrationEvent); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_integration_integration_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*DownlinkCommand); i {
case 0:
return &v.state
@ -1608,7 +1760,7 @@ func file_integration_integration_proto_init() {
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_integration_integration_proto_rawDesc,
NumEnums: 2,
NumMessages: 12,
NumMessages: 13,
NumExtensions: 0,
NumServices: 0,
},

View File

@ -28,6 +28,7 @@ api:
protoc $(PROTOC_ARGS) ../proto/api/frame_log.proto
protoc $(PROTOC_ARGS) ../proto/api/multicast_group.proto
protoc $(PROTOC_ARGS) ../proto/api/request_log.proto
protoc $(PROTOC_ARGS) ../proto/api/relay.proto
integration:
mkdir -p integration

View File

@ -35,6 +35,9 @@ export class Device extends jspb.Message {
getTagsMap(): jspb.Map<string, string>;
clearTagsMap(): Device;
getJoinEui(): string;
setJoinEui(value: string): Device;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): Device.AsObject;
static toObject(includeInstance: boolean, msg: Device): Device.AsObject;
@ -54,6 +57,7 @@ export namespace Device {
isDisabled: boolean,
variablesMap: Array<[string, string]>,
tagsMap: Array<[string, string]>,
joinEui: string,
}
}

View File

@ -832,7 +832,8 @@ proto.api.Device.toObject = function(includeInstance, msg) {
skipFcntCheck: jspb.Message.getBooleanFieldWithDefault(msg, 6, false),
isDisabled: jspb.Message.getBooleanFieldWithDefault(msg, 7, false),
variablesMap: (f = msg.getVariablesMap()) ? f.toObject(includeInstance, undefined) : [],
tagsMap: (f = msg.getTagsMap()) ? f.toObject(includeInstance, undefined) : []
tagsMap: (f = msg.getTagsMap()) ? f.toObject(includeInstance, undefined) : [],
joinEui: jspb.Message.getFieldWithDefault(msg, 10, "")
};
if (includeInstance) {
@ -909,6 +910,10 @@ proto.api.Device.deserializeBinaryFromReader = function(msg, reader) {
jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readString, null, "", "");
});
break;
case 10:
var value = /** @type {string} */ (reader.readString());
msg.setJoinEui(value);
break;
default:
reader.skipField();
break;
@ -995,6 +1000,13 @@ proto.api.Device.serializeBinaryToWriter = function(message, writer) {
if (f && f.getLength() > 0) {
f.serializeBinary(9, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeString);
}
f = message.getJoinEui();
if (f.length > 0) {
writer.writeString(
10,
f
);
}
};
@ -1168,6 +1180,24 @@ proto.api.Device.prototype.clearTagsMap = function() {
return this;};
/**
* optional string join_eui = 10;
* @return {string}
*/
proto.api.Device.prototype.getJoinEui = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 10, ""));
};
/**
* @param {string} value
* @return {!proto.api.Device} returns this
*/
proto.api.Device.prototype.setJoinEui = function(value) {
return jspb.Message.setProto3StringField(this, 10, value);
};

View File

@ -94,6 +94,72 @@ export class DeviceProfile extends jspb.Message {
getRegionConfigId(): string;
setRegionConfigId(value: string): DeviceProfile;
getIsRelay(): boolean;
setIsRelay(value: boolean): DeviceProfile;
getIsRelayEd(): boolean;
setIsRelayEd(value: boolean): DeviceProfile;
getRelayEdRelayOnly(): boolean;
setRelayEdRelayOnly(value: boolean): DeviceProfile;
getRelayEnabled(): boolean;
setRelayEnabled(value: boolean): DeviceProfile;
getRelayCadPeriodicity(): CadPeriodicity;
setRelayCadPeriodicity(value: CadPeriodicity): DeviceProfile;
getRelayDefaultChannelIndex(): number;
setRelayDefaultChannelIndex(value: number): DeviceProfile;
getRelaySecondChannelFreq(): number;
setRelaySecondChannelFreq(value: number): DeviceProfile;
getRelaySecondChannelDr(): number;
setRelaySecondChannelDr(value: number): DeviceProfile;
getRelaySecondChannelAckOffset(): SecondChAckOffset;
setRelaySecondChannelAckOffset(value: SecondChAckOffset): DeviceProfile;
getRelayEdActivationMode(): RelayModeActivation;
setRelayEdActivationMode(value: RelayModeActivation): DeviceProfile;
getRelayEdSmartEnableLevel(): number;
setRelayEdSmartEnableLevel(value: number): DeviceProfile;
getRelayEdBackOff(): number;
setRelayEdBackOff(value: number): DeviceProfile;
getRelayEdUplinkLimitBucketSize(): number;
setRelayEdUplinkLimitBucketSize(value: number): DeviceProfile;
getRelayEdUplinkLimitReloadRate(): number;
setRelayEdUplinkLimitReloadRate(value: number): DeviceProfile;
getRelayJoinReqLimitReloadRate(): number;
setRelayJoinReqLimitReloadRate(value: number): DeviceProfile;
getRelayNotifyLimitReloadRate(): number;
setRelayNotifyLimitReloadRate(value: number): DeviceProfile;
getRelayGlobalUplinkLimitReloadRate(): number;
setRelayGlobalUplinkLimitReloadRate(value: number): DeviceProfile;
getRelayOverallLimitReloadRate(): number;
setRelayOverallLimitReloadRate(value: number): DeviceProfile;
getRelayJoinReqLimitBucketSize(): number;
setRelayJoinReqLimitBucketSize(value: number): DeviceProfile;
getRelayNotifyLimitBucketSize(): number;
setRelayNotifyLimitBucketSize(value: number): DeviceProfile;
getRelayGlobalUplinkLimitBucketSize(): number;
setRelayGlobalUplinkLimitBucketSize(value: number): DeviceProfile;
getRelayOverallLimitBucketSize(): number;
setRelayOverallLimitBucketSize(value: number): DeviceProfile;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): DeviceProfile.AsObject;
static toObject(includeInstance: boolean, msg: DeviceProfile): DeviceProfile.AsObject;
@ -133,6 +199,28 @@ export namespace DeviceProfile {
measurementsMap: Array<[string, Measurement.AsObject]>,
autoDetectMeasurements: boolean,
regionConfigId: string,
isRelay: boolean,
isRelayEd: boolean,
relayEdRelayOnly: boolean,
relayEnabled: boolean,
relayCadPeriodicity: CadPeriodicity,
relayDefaultChannelIndex: number,
relaySecondChannelFreq: number,
relaySecondChannelDr: number,
relaySecondChannelAckOffset: SecondChAckOffset,
relayEdActivationMode: RelayModeActivation,
relayEdSmartEnableLevel: number,
relayEdBackOff: number,
relayEdUplinkLimitBucketSize: number,
relayEdUplinkLimitReloadRate: number,
relayJoinReqLimitReloadRate: number,
relayNotifyLimitReloadRate: number,
relayGlobalUplinkLimitReloadRate: number,
relayOverallLimitReloadRate: number,
relayJoinReqLimitBucketSize: number,
relayNotifyLimitBucketSize: number,
relayGlobalUplinkLimitBucketSize: number,
relayOverallLimitBucketSize: number,
}
}
@ -454,3 +542,25 @@ export enum MeasurementKind {
GAUGE = 3,
STRING = 4,
}
export enum CadPeriodicity {
SEC_1 = 0,
MS_500 = 1,
MS_250 = 2,
MS_100 = 3,
MS_50 = 4,
MS_20 = 5,
}
export enum SecondChAckOffset {
KHZ_0 = 0,
KHZ_200 = 1,
KHZ_400 = 2,
KHZ_800 = 3,
KHZ_1600 = 4,
KHZ_3200 = 5,
}
export enum RelayModeActivation {
DISABLE_RELAY_MODE = 0,
ENABLE_RELAY_MODE = 1,
DYNAMIC = 2,
END_DEVICE_CONTROLLED = 3,
}

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.AdrAlgorithmListItem', null, global);
goog.exportSymbol('proto.api.CadPeriodicity', null, global);
goog.exportSymbol('proto.api.CodecRuntime', null, global);
goog.exportSymbol('proto.api.CreateDeviceProfileRequest', null, global);
goog.exportSymbol('proto.api.CreateDeviceProfileResponse', null, global);
@ -34,6 +35,8 @@ goog.exportSymbol('proto.api.ListDeviceProfilesRequest', null, global);
goog.exportSymbol('proto.api.ListDeviceProfilesResponse', null, global);
goog.exportSymbol('proto.api.Measurement', null, global);
goog.exportSymbol('proto.api.MeasurementKind', null, global);
goog.exportSymbol('proto.api.RelayModeActivation', null, global);
goog.exportSymbol('proto.api.SecondChAckOffset', null, global);
goog.exportSymbol('proto.api.UpdateDeviceProfileRequest', null, global);
/**
* Generated by JsPbCodeGenerator.
@ -368,7 +371,29 @@ proto.api.DeviceProfile.toObject = function(includeInstance, msg) {
tagsMap: (f = msg.getTagsMap()) ? f.toObject(includeInstance, undefined) : [],
measurementsMap: (f = msg.getMeasurementsMap()) ? f.toObject(includeInstance, proto.api.Measurement.toObject) : [],
autoDetectMeasurements: jspb.Message.getBooleanFieldWithDefault(msg, 28, false),
regionConfigId: jspb.Message.getFieldWithDefault(msg, 29, "")
regionConfigId: jspb.Message.getFieldWithDefault(msg, 29, ""),
isRelay: jspb.Message.getBooleanFieldWithDefault(msg, 30, false),
isRelayEd: jspb.Message.getBooleanFieldWithDefault(msg, 31, false),
relayEdRelayOnly: jspb.Message.getBooleanFieldWithDefault(msg, 32, false),
relayEnabled: jspb.Message.getBooleanFieldWithDefault(msg, 33, false),
relayCadPeriodicity: jspb.Message.getFieldWithDefault(msg, 34, 0),
relayDefaultChannelIndex: jspb.Message.getFieldWithDefault(msg, 35, 0),
relaySecondChannelFreq: jspb.Message.getFieldWithDefault(msg, 36, 0),
relaySecondChannelDr: jspb.Message.getFieldWithDefault(msg, 37, 0),
relaySecondChannelAckOffset: jspb.Message.getFieldWithDefault(msg, 38, 0),
relayEdActivationMode: jspb.Message.getFieldWithDefault(msg, 39, 0),
relayEdSmartEnableLevel: jspb.Message.getFieldWithDefault(msg, 40, 0),
relayEdBackOff: jspb.Message.getFieldWithDefault(msg, 41, 0),
relayEdUplinkLimitBucketSize: jspb.Message.getFieldWithDefault(msg, 42, 0),
relayEdUplinkLimitReloadRate: jspb.Message.getFieldWithDefault(msg, 43, 0),
relayJoinReqLimitReloadRate: jspb.Message.getFieldWithDefault(msg, 44, 0),
relayNotifyLimitReloadRate: jspb.Message.getFieldWithDefault(msg, 45, 0),
relayGlobalUplinkLimitReloadRate: jspb.Message.getFieldWithDefault(msg, 46, 0),
relayOverallLimitReloadRate: jspb.Message.getFieldWithDefault(msg, 47, 0),
relayJoinReqLimitBucketSize: jspb.Message.getFieldWithDefault(msg, 48, 0),
relayNotifyLimitBucketSize: jspb.Message.getFieldWithDefault(msg, 49, 0),
relayGlobalUplinkLimitBucketSize: jspb.Message.getFieldWithDefault(msg, 50, 0),
relayOverallLimitBucketSize: jspb.Message.getFieldWithDefault(msg, 51, 0)
};
if (includeInstance) {
@ -525,6 +550,94 @@ proto.api.DeviceProfile.deserializeBinaryFromReader = function(msg, reader) {
var value = /** @type {string} */ (reader.readString());
msg.setRegionConfigId(value);
break;
case 30:
var value = /** @type {boolean} */ (reader.readBool());
msg.setIsRelay(value);
break;
case 31:
var value = /** @type {boolean} */ (reader.readBool());
msg.setIsRelayEd(value);
break;
case 32:
var value = /** @type {boolean} */ (reader.readBool());
msg.setRelayEdRelayOnly(value);
break;
case 33:
var value = /** @type {boolean} */ (reader.readBool());
msg.setRelayEnabled(value);
break;
case 34:
var value = /** @type {!proto.api.CadPeriodicity} */ (reader.readEnum());
msg.setRelayCadPeriodicity(value);
break;
case 35:
var value = /** @type {number} */ (reader.readUint32());
msg.setRelayDefaultChannelIndex(value);
break;
case 36:
var value = /** @type {number} */ (reader.readUint32());
msg.setRelaySecondChannelFreq(value);
break;
case 37:
var value = /** @type {number} */ (reader.readUint32());
msg.setRelaySecondChannelDr(value);
break;
case 38:
var value = /** @type {!proto.api.SecondChAckOffset} */ (reader.readEnum());
msg.setRelaySecondChannelAckOffset(value);
break;
case 39:
var value = /** @type {!proto.api.RelayModeActivation} */ (reader.readEnum());
msg.setRelayEdActivationMode(value);
break;
case 40:
var value = /** @type {number} */ (reader.readUint32());
msg.setRelayEdSmartEnableLevel(value);
break;
case 41:
var value = /** @type {number} */ (reader.readUint32());
msg.setRelayEdBackOff(value);
break;
case 42:
var value = /** @type {number} */ (reader.readUint32());
msg.setRelayEdUplinkLimitBucketSize(value);
break;
case 43:
var value = /** @type {number} */ (reader.readUint32());
msg.setRelayEdUplinkLimitReloadRate(value);
break;
case 44:
var value = /** @type {number} */ (reader.readUint32());
msg.setRelayJoinReqLimitReloadRate(value);
break;
case 45:
var value = /** @type {number} */ (reader.readUint32());
msg.setRelayNotifyLimitReloadRate(value);
break;
case 46:
var value = /** @type {number} */ (reader.readUint32());
msg.setRelayGlobalUplinkLimitReloadRate(value);
break;
case 47:
var value = /** @type {number} */ (reader.readUint32());
msg.setRelayOverallLimitReloadRate(value);
break;
case 48:
var value = /** @type {number} */ (reader.readUint32());
msg.setRelayJoinReqLimitBucketSize(value);
break;
case 49:
var value = /** @type {number} */ (reader.readUint32());
msg.setRelayNotifyLimitBucketSize(value);
break;
case 50:
var value = /** @type {number} */ (reader.readUint32());
msg.setRelayGlobalUplinkLimitBucketSize(value);
break;
case 51:
var value = /** @type {number} */ (reader.readUint32());
msg.setRelayOverallLimitBucketSize(value);
break;
default:
reader.skipField();
break;
@ -751,6 +864,160 @@ proto.api.DeviceProfile.serializeBinaryToWriter = function(message, writer) {
f
);
}
f = message.getIsRelay();
if (f) {
writer.writeBool(
30,
f
);
}
f = message.getIsRelayEd();
if (f) {
writer.writeBool(
31,
f
);
}
f = message.getRelayEdRelayOnly();
if (f) {
writer.writeBool(
32,
f
);
}
f = message.getRelayEnabled();
if (f) {
writer.writeBool(
33,
f
);
}
f = message.getRelayCadPeriodicity();
if (f !== 0.0) {
writer.writeEnum(
34,
f
);
}
f = message.getRelayDefaultChannelIndex();
if (f !== 0) {
writer.writeUint32(
35,
f
);
}
f = message.getRelaySecondChannelFreq();
if (f !== 0) {
writer.writeUint32(
36,
f
);
}
f = message.getRelaySecondChannelDr();
if (f !== 0) {
writer.writeUint32(
37,
f
);
}
f = message.getRelaySecondChannelAckOffset();
if (f !== 0.0) {
writer.writeEnum(
38,
f
);
}
f = message.getRelayEdActivationMode();
if (f !== 0.0) {
writer.writeEnum(
39,
f
);
}
f = message.getRelayEdSmartEnableLevel();
if (f !== 0) {
writer.writeUint32(
40,
f
);
}
f = message.getRelayEdBackOff();
if (f !== 0) {
writer.writeUint32(
41,
f
);
}
f = message.getRelayEdUplinkLimitBucketSize();
if (f !== 0) {
writer.writeUint32(
42,
f
);
}
f = message.getRelayEdUplinkLimitReloadRate();
if (f !== 0) {
writer.writeUint32(
43,
f
);
}
f = message.getRelayJoinReqLimitReloadRate();
if (f !== 0) {
writer.writeUint32(
44,
f
);
}
f = message.getRelayNotifyLimitReloadRate();
if (f !== 0) {
writer.writeUint32(
45,
f
);
}
f = message.getRelayGlobalUplinkLimitReloadRate();
if (f !== 0) {
writer.writeUint32(
46,
f
);
}
f = message.getRelayOverallLimitReloadRate();
if (f !== 0) {
writer.writeUint32(
47,
f
);
}
f = message.getRelayJoinReqLimitBucketSize();
if (f !== 0) {
writer.writeUint32(
48,
f
);
}
f = message.getRelayNotifyLimitBucketSize();
if (f !== 0) {
writer.writeUint32(
49,
f
);
}
f = message.getRelayGlobalUplinkLimitBucketSize();
if (f !== 0) {
writer.writeUint32(
50,
f
);
}
f = message.getRelayOverallLimitBucketSize();
if (f !== 0) {
writer.writeUint32(
51,
f
);
}
};
@ -1284,6 +1551,402 @@ proto.api.DeviceProfile.prototype.setRegionConfigId = function(value) {
};
/**
* optional bool is_relay = 30;
* @return {boolean}
*/
proto.api.DeviceProfile.prototype.getIsRelay = function() {
return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 30, false));
};
/**
* @param {boolean} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setIsRelay = function(value) {
return jspb.Message.setProto3BooleanField(this, 30, value);
};
/**
* optional bool is_relay_ed = 31;
* @return {boolean}
*/
proto.api.DeviceProfile.prototype.getIsRelayEd = function() {
return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 31, false));
};
/**
* @param {boolean} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setIsRelayEd = function(value) {
return jspb.Message.setProto3BooleanField(this, 31, value);
};
/**
* optional bool relay_ed_relay_only = 32;
* @return {boolean}
*/
proto.api.DeviceProfile.prototype.getRelayEdRelayOnly = function() {
return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 32, false));
};
/**
* @param {boolean} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelayEdRelayOnly = function(value) {
return jspb.Message.setProto3BooleanField(this, 32, value);
};
/**
* optional bool relay_enabled = 33;
* @return {boolean}
*/
proto.api.DeviceProfile.prototype.getRelayEnabled = function() {
return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 33, false));
};
/**
* @param {boolean} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelayEnabled = function(value) {
return jspb.Message.setProto3BooleanField(this, 33, value);
};
/**
* optional CadPeriodicity relay_cad_periodicity = 34;
* @return {!proto.api.CadPeriodicity}
*/
proto.api.DeviceProfile.prototype.getRelayCadPeriodicity = function() {
return /** @type {!proto.api.CadPeriodicity} */ (jspb.Message.getFieldWithDefault(this, 34, 0));
};
/**
* @param {!proto.api.CadPeriodicity} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelayCadPeriodicity = function(value) {
return jspb.Message.setProto3EnumField(this, 34, value);
};
/**
* optional uint32 relay_default_channel_index = 35;
* @return {number}
*/
proto.api.DeviceProfile.prototype.getRelayDefaultChannelIndex = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 35, 0));
};
/**
* @param {number} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelayDefaultChannelIndex = function(value) {
return jspb.Message.setProto3IntField(this, 35, value);
};
/**
* optional uint32 relay_second_channel_freq = 36;
* @return {number}
*/
proto.api.DeviceProfile.prototype.getRelaySecondChannelFreq = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 36, 0));
};
/**
* @param {number} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelaySecondChannelFreq = function(value) {
return jspb.Message.setProto3IntField(this, 36, value);
};
/**
* optional uint32 relay_second_channel_dr = 37;
* @return {number}
*/
proto.api.DeviceProfile.prototype.getRelaySecondChannelDr = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 37, 0));
};
/**
* @param {number} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelaySecondChannelDr = function(value) {
return jspb.Message.setProto3IntField(this, 37, value);
};
/**
* optional SecondChAckOffset relay_second_channel_ack_offset = 38;
* @return {!proto.api.SecondChAckOffset}
*/
proto.api.DeviceProfile.prototype.getRelaySecondChannelAckOffset = function() {
return /** @type {!proto.api.SecondChAckOffset} */ (jspb.Message.getFieldWithDefault(this, 38, 0));
};
/**
* @param {!proto.api.SecondChAckOffset} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelaySecondChannelAckOffset = function(value) {
return jspb.Message.setProto3EnumField(this, 38, value);
};
/**
* optional RelayModeActivation relay_ed_activation_mode = 39;
* @return {!proto.api.RelayModeActivation}
*/
proto.api.DeviceProfile.prototype.getRelayEdActivationMode = function() {
return /** @type {!proto.api.RelayModeActivation} */ (jspb.Message.getFieldWithDefault(this, 39, 0));
};
/**
* @param {!proto.api.RelayModeActivation} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelayEdActivationMode = function(value) {
return jspb.Message.setProto3EnumField(this, 39, value);
};
/**
* optional uint32 relay_ed_smart_enable_level = 40;
* @return {number}
*/
proto.api.DeviceProfile.prototype.getRelayEdSmartEnableLevel = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 40, 0));
};
/**
* @param {number} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelayEdSmartEnableLevel = function(value) {
return jspb.Message.setProto3IntField(this, 40, value);
};
/**
* optional uint32 relay_ed_back_off = 41;
* @return {number}
*/
proto.api.DeviceProfile.prototype.getRelayEdBackOff = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 41, 0));
};
/**
* @param {number} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelayEdBackOff = function(value) {
return jspb.Message.setProto3IntField(this, 41, value);
};
/**
* optional uint32 relay_ed_uplink_limit_bucket_size = 42;
* @return {number}
*/
proto.api.DeviceProfile.prototype.getRelayEdUplinkLimitBucketSize = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 42, 0));
};
/**
* @param {number} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelayEdUplinkLimitBucketSize = function(value) {
return jspb.Message.setProto3IntField(this, 42, value);
};
/**
* optional uint32 relay_ed_uplink_limit_reload_rate = 43;
* @return {number}
*/
proto.api.DeviceProfile.prototype.getRelayEdUplinkLimitReloadRate = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 43, 0));
};
/**
* @param {number} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelayEdUplinkLimitReloadRate = function(value) {
return jspb.Message.setProto3IntField(this, 43, value);
};
/**
* optional uint32 relay_join_req_limit_reload_rate = 44;
* @return {number}
*/
proto.api.DeviceProfile.prototype.getRelayJoinReqLimitReloadRate = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 44, 0));
};
/**
* @param {number} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelayJoinReqLimitReloadRate = function(value) {
return jspb.Message.setProto3IntField(this, 44, value);
};
/**
* optional uint32 relay_notify_limit_reload_rate = 45;
* @return {number}
*/
proto.api.DeviceProfile.prototype.getRelayNotifyLimitReloadRate = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 45, 0));
};
/**
* @param {number} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelayNotifyLimitReloadRate = function(value) {
return jspb.Message.setProto3IntField(this, 45, value);
};
/**
* optional uint32 relay_global_uplink_limit_reload_rate = 46;
* @return {number}
*/
proto.api.DeviceProfile.prototype.getRelayGlobalUplinkLimitReloadRate = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 46, 0));
};
/**
* @param {number} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelayGlobalUplinkLimitReloadRate = function(value) {
return jspb.Message.setProto3IntField(this, 46, value);
};
/**
* optional uint32 relay_overall_limit_reload_rate = 47;
* @return {number}
*/
proto.api.DeviceProfile.prototype.getRelayOverallLimitReloadRate = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 47, 0));
};
/**
* @param {number} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelayOverallLimitReloadRate = function(value) {
return jspb.Message.setProto3IntField(this, 47, value);
};
/**
* optional uint32 relay_join_req_limit_bucket_size = 48;
* @return {number}
*/
proto.api.DeviceProfile.prototype.getRelayJoinReqLimitBucketSize = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 48, 0));
};
/**
* @param {number} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelayJoinReqLimitBucketSize = function(value) {
return jspb.Message.setProto3IntField(this, 48, value);
};
/**
* optional uint32 relay_notify_limit_bucket_size = 49;
* @return {number}
*/
proto.api.DeviceProfile.prototype.getRelayNotifyLimitBucketSize = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 49, 0));
};
/**
* @param {number} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelayNotifyLimitBucketSize = function(value) {
return jspb.Message.setProto3IntField(this, 49, value);
};
/**
* optional uint32 relay_global_uplink_limit_bucket_size = 50;
* @return {number}
*/
proto.api.DeviceProfile.prototype.getRelayGlobalUplinkLimitBucketSize = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 50, 0));
};
/**
* @param {number} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelayGlobalUplinkLimitBucketSize = function(value) {
return jspb.Message.setProto3IntField(this, 50, value);
};
/**
* optional uint32 relay_overall_limit_bucket_size = 51;
* @return {number}
*/
proto.api.DeviceProfile.prototype.getRelayOverallLimitBucketSize = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 51, 0));
};
/**
* @param {number} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelayOverallLimitBucketSize = function(value) {
return jspb.Message.setProto3IntField(this, 51, value);
};
@ -3611,4 +4274,38 @@ proto.api.MeasurementKind = {
STRING: 4
};
/**
* @enum {number}
*/
proto.api.CadPeriodicity = {
SEC_1: 0,
MS_500: 1,
MS_250: 2,
MS_100: 3,
MS_50: 4,
MS_20: 5
};
/**
* @enum {number}
*/
proto.api.SecondChAckOffset = {
KHZ_0: 0,
KHZ_200: 1,
KHZ_400: 2,
KHZ_800: 3,
KHZ_1600: 4,
KHZ_3200: 5
};
/**
* @enum {number}
*/
proto.api.RelayModeActivation = {
DISABLE_RELAY_MODE: 0,
ENABLE_RELAY_MODE: 1,
DYNAMIC: 2,
END_DEVICE_CONTROLLED: 3
};
goog.object.extend(exports, proto.api);

View File

@ -35,8 +35,11 @@ export class UplinkFrameLog extends jspb.Message {
hasTime(): boolean;
clearTime(): UplinkFrameLog;
getPlaintextMacCommands(): boolean;
setPlaintextMacCommands(value: boolean): UplinkFrameLog;
getPlaintextFOpts(): boolean;
setPlaintextFOpts(value: boolean): UplinkFrameLog;
getPlaintextFrmPayload(): boolean;
setPlaintextFrmPayload(value: boolean): UplinkFrameLog;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): UplinkFrameLog.AsObject;
@ -55,7 +58,8 @@ export namespace UplinkFrameLog {
devAddr: string,
devEui: string,
time?: google_protobuf_timestamp_pb.Timestamp.AsObject,
plaintextMacCommands: boolean,
plaintextFOpts: boolean,
plaintextFrmPayload: boolean,
}
}
@ -90,8 +94,11 @@ export class DownlinkFrameLog extends jspb.Message {
getDevEui(): string;
setDevEui(value: string): DownlinkFrameLog;
getPlaintextMacCommands(): boolean;
setPlaintextMacCommands(value: boolean): DownlinkFrameLog;
getPlaintextFOpts(): boolean;
setPlaintextFOpts(value: boolean): DownlinkFrameLog;
getPlaintextFrmPayload(): boolean;
setPlaintextFrmPayload(value: boolean): DownlinkFrameLog;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): DownlinkFrameLog.AsObject;
@ -111,7 +118,8 @@ export namespace DownlinkFrameLog {
mType: common_common_pb.MType,
devAddr: string,
devEui: string,
plaintextMacCommands: boolean,
plaintextFOpts: boolean,
plaintextFrmPayload: boolean,
}
}

View File

@ -109,7 +109,8 @@ proto.api.UplinkFrameLog.toObject = function(includeInstance, msg) {
devAddr: jspb.Message.getFieldWithDefault(msg, 5, ""),
devEui: jspb.Message.getFieldWithDefault(msg, 6, ""),
time: (f = msg.getTime()) && google_protobuf_timestamp_pb.Timestamp.toObject(includeInstance, f),
plaintextMacCommands: jspb.Message.getBooleanFieldWithDefault(msg, 8, false)
plaintextFOpts: jspb.Message.getBooleanFieldWithDefault(msg, 8, false),
plaintextFrmPayload: jspb.Message.getBooleanFieldWithDefault(msg, 9, false)
};
if (includeInstance) {
@ -179,7 +180,11 @@ proto.api.UplinkFrameLog.deserializeBinaryFromReader = function(msg, reader) {
break;
case 8:
var value = /** @type {boolean} */ (reader.readBool());
msg.setPlaintextMacCommands(value);
msg.setPlaintextFOpts(value);
break;
case 9:
var value = /** @type {boolean} */ (reader.readBool());
msg.setPlaintextFrmPayload(value);
break;
default:
reader.skipField();
@ -262,13 +267,20 @@ proto.api.UplinkFrameLog.serializeBinaryToWriter = function(message, writer) {
google_protobuf_timestamp_pb.Timestamp.serializeBinaryToWriter
);
}
f = message.getPlaintextMacCommands();
f = message.getPlaintextFOpts();
if (f) {
writer.writeBool(
8,
f
);
}
f = message.getPlaintextFrmPayload();
if (f) {
writer.writeBool(
9,
f
);
}
};
@ -481,10 +493,10 @@ proto.api.UplinkFrameLog.prototype.hasTime = function() {
/**
* optional bool plaintext_mac_commands = 8;
* optional bool plaintext_f_opts = 8;
* @return {boolean}
*/
proto.api.UplinkFrameLog.prototype.getPlaintextMacCommands = function() {
proto.api.UplinkFrameLog.prototype.getPlaintextFOpts = function() {
return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 8, false));
};
@ -493,11 +505,29 @@ proto.api.UplinkFrameLog.prototype.getPlaintextMacCommands = function() {
* @param {boolean} value
* @return {!proto.api.UplinkFrameLog} returns this
*/
proto.api.UplinkFrameLog.prototype.setPlaintextMacCommands = function(value) {
proto.api.UplinkFrameLog.prototype.setPlaintextFOpts = function(value) {
return jspb.Message.setProto3BooleanField(this, 8, value);
};
/**
* optional bool plaintext_frm_payload = 9;
* @return {boolean}
*/
proto.api.UplinkFrameLog.prototype.getPlaintextFrmPayload = function() {
return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 9, false));
};
/**
* @param {boolean} value
* @return {!proto.api.UplinkFrameLog} returns this
*/
proto.api.UplinkFrameLog.prototype.setPlaintextFrmPayload = function(value) {
return jspb.Message.setProto3BooleanField(this, 9, value);
};
@ -538,7 +568,8 @@ proto.api.DownlinkFrameLog.toObject = function(includeInstance, msg) {
mType: jspb.Message.getFieldWithDefault(msg, 6, 0),
devAddr: jspb.Message.getFieldWithDefault(msg, 7, ""),
devEui: jspb.Message.getFieldWithDefault(msg, 8, ""),
plaintextMacCommands: jspb.Message.getBooleanFieldWithDefault(msg, 9, false)
plaintextFOpts: jspb.Message.getBooleanFieldWithDefault(msg, 9, false),
plaintextFrmPayload: jspb.Message.getBooleanFieldWithDefault(msg, 10, false)
};
if (includeInstance) {
@ -611,7 +642,11 @@ proto.api.DownlinkFrameLog.deserializeBinaryFromReader = function(msg, reader) {
break;
case 9:
var value = /** @type {boolean} */ (reader.readBool());
msg.setPlaintextMacCommands(value);
msg.setPlaintextFOpts(value);
break;
case 10:
var value = /** @type {boolean} */ (reader.readBool());
msg.setPlaintextFrmPayload(value);
break;
default:
reader.skipField();
@ -700,13 +735,20 @@ proto.api.DownlinkFrameLog.serializeBinaryToWriter = function(message, writer) {
f
);
}
f = message.getPlaintextMacCommands();
f = message.getPlaintextFOpts();
if (f) {
writer.writeBool(
9,
f
);
}
f = message.getPlaintextFrmPayload();
if (f) {
writer.writeBool(
10,
f
);
}
};
@ -917,10 +959,10 @@ proto.api.DownlinkFrameLog.prototype.setDevEui = function(value) {
/**
* optional bool plaintext_mac_commands = 9;
* optional bool plaintext_f_opts = 9;
* @return {boolean}
*/
proto.api.DownlinkFrameLog.prototype.getPlaintextMacCommands = function() {
proto.api.DownlinkFrameLog.prototype.getPlaintextFOpts = function() {
return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 9, false));
};
@ -929,9 +971,27 @@ proto.api.DownlinkFrameLog.prototype.getPlaintextMacCommands = function() {
* @param {boolean} value
* @return {!proto.api.DownlinkFrameLog} returns this
*/
proto.api.DownlinkFrameLog.prototype.setPlaintextMacCommands = function(value) {
proto.api.DownlinkFrameLog.prototype.setPlaintextFOpts = function(value) {
return jspb.Message.setProto3BooleanField(this, 9, value);
};
/**
* optional bool plaintext_frm_payload = 10;
* @return {boolean}
*/
proto.api.DownlinkFrameLog.prototype.getPlaintextFrmPayload = function() {
return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 10, false));
};
/**
* @param {boolean} value
* @return {!proto.api.DownlinkFrameLog} returns this
*/
proto.api.DownlinkFrameLog.prototype.setPlaintextFrmPayload = function(value) {
return jspb.Message.setProto3BooleanField(this, 10, value);
};
goog.object.extend(exports, proto.api);

68
api/grpc-web/api/relay_grpc_web_pb.d.ts vendored Normal file
View File

@ -0,0 +1,68 @@
import * as grpcWeb from 'grpc-web';
import * as api_relay_pb from '../api/relay_pb';
import * as google_protobuf_empty_pb from 'google-protobuf/google/protobuf/empty_pb';
export class RelayServiceClient {
constructor (hostname: string,
credentials?: null | { [index: string]: string; },
options?: null | { [index: string]: any; });
list(
request: api_relay_pb.ListRelaysRequest,
metadata: grpcWeb.Metadata | undefined,
callback: (err: grpcWeb.RpcError,
response: api_relay_pb.ListRelaysResponse) => void
): grpcWeb.ClientReadableStream<api_relay_pb.ListRelaysResponse>;
addDevice(
request: api_relay_pb.AddRelayDeviceRequest,
metadata: grpcWeb.Metadata | undefined,
callback: (err: grpcWeb.RpcError,
response: google_protobuf_empty_pb.Empty) => void
): grpcWeb.ClientReadableStream<google_protobuf_empty_pb.Empty>;
removeDevice(
request: api_relay_pb.RemoveRelayDeviceRequest,
metadata: grpcWeb.Metadata | undefined,
callback: (err: grpcWeb.RpcError,
response: google_protobuf_empty_pb.Empty) => void
): grpcWeb.ClientReadableStream<google_protobuf_empty_pb.Empty>;
listDevices(
request: api_relay_pb.ListRelayDevicesRequest,
metadata: grpcWeb.Metadata | undefined,
callback: (err: grpcWeb.RpcError,
response: api_relay_pb.ListRelayDevicesResponse) => void
): grpcWeb.ClientReadableStream<api_relay_pb.ListRelayDevicesResponse>;
}
export class RelayServicePromiseClient {
constructor (hostname: string,
credentials?: null | { [index: string]: string; },
options?: null | { [index: string]: any; });
list(
request: api_relay_pb.ListRelaysRequest,
metadata?: grpcWeb.Metadata
): Promise<api_relay_pb.ListRelaysResponse>;
addDevice(
request: api_relay_pb.AddRelayDeviceRequest,
metadata?: grpcWeb.Metadata
): Promise<google_protobuf_empty_pb.Empty>;
removeDevice(
request: api_relay_pb.RemoveRelayDeviceRequest,
metadata?: grpcWeb.Metadata
): Promise<google_protobuf_empty_pb.Empty>;
listDevices(
request: api_relay_pb.ListRelayDevicesRequest,
metadata?: grpcWeb.Metadata
): Promise<api_relay_pb.ListRelayDevicesResponse>;
}

328
api/grpc-web/api/relay_grpc_web_pb.js vendored Normal file
View File

@ -0,0 +1,328 @@
/**
* @fileoverview gRPC-Web generated client stub for api
* @enhanceable
* @public
*/
// Code generated by protoc-gen-grpc-web. DO NOT EDIT.
// versions:
// protoc-gen-grpc-web v1.4.2
// protoc v3.12.4
// source: api/relay.proto
/* eslint-disable */
// @ts-nocheck
const grpc = {};
grpc.web = require('grpc-web');
var google_api_annotations_pb = require('../google/api/annotations_pb.js')
var google_protobuf_timestamp_pb = require('google-protobuf/google/protobuf/timestamp_pb.js')
var google_protobuf_empty_pb = require('google-protobuf/google/protobuf/empty_pb.js')
const proto = {};
proto.api = require('./relay_pb.js');
/**
* @param {string} hostname
* @param {?Object} credentials
* @param {?grpc.web.ClientOptions} options
* @constructor
* @struct
* @final
*/
proto.api.RelayServiceClient =
function(hostname, credentials, options) {
if (!options) options = {};
options.format = 'text';
/**
* @private @const {!grpc.web.GrpcWebClientBase} The client
*/
this.client_ = new grpc.web.GrpcWebClientBase(options);
/**
* @private @const {string} The hostname
*/
this.hostname_ = hostname.replace(/\/+$/, '');
};
/**
* @param {string} hostname
* @param {?Object} credentials
* @param {?grpc.web.ClientOptions} options
* @constructor
* @struct
* @final
*/
proto.api.RelayServicePromiseClient =
function(hostname, credentials, options) {
if (!options) options = {};
options.format = 'text';
/**
* @private @const {!grpc.web.GrpcWebClientBase} The client
*/
this.client_ = new grpc.web.GrpcWebClientBase(options);
/**
* @private @const {string} The hostname
*/
this.hostname_ = hostname.replace(/\/+$/, '');
};
/**
* @const
* @type {!grpc.web.MethodDescriptor<
* !proto.api.ListRelaysRequest,
* !proto.api.ListRelaysResponse>}
*/
const methodDescriptor_RelayService_List = new grpc.web.MethodDescriptor(
'/api.RelayService/List',
grpc.web.MethodType.UNARY,
proto.api.ListRelaysRequest,
proto.api.ListRelaysResponse,
/**
* @param {!proto.api.ListRelaysRequest} request
* @return {!Uint8Array}
*/
function(request) {
return request.serializeBinary();
},
proto.api.ListRelaysResponse.deserializeBinary
);
/**
* @param {!proto.api.ListRelaysRequest} request The
* request proto
* @param {?Object<string, string>} metadata User defined
* call metadata
* @param {function(?grpc.web.RpcError, ?proto.api.ListRelaysResponse)}
* callback The callback function(error, response)
* @return {!grpc.web.ClientReadableStream<!proto.api.ListRelaysResponse>|undefined}
* The XHR Node Readable Stream
*/
proto.api.RelayServiceClient.prototype.list =
function(request, metadata, callback) {
return this.client_.rpcCall(this.hostname_ +
'/api.RelayService/List',
request,
metadata || {},
methodDescriptor_RelayService_List,
callback);
};
/**
* @param {!proto.api.ListRelaysRequest} request The
* request proto
* @param {?Object<string, string>=} metadata User defined
* call metadata
* @return {!Promise<!proto.api.ListRelaysResponse>}
* Promise that resolves to the response
*/
proto.api.RelayServicePromiseClient.prototype.list =
function(request, metadata) {
return this.client_.unaryCall(this.hostname_ +
'/api.RelayService/List',
request,
metadata || {},
methodDescriptor_RelayService_List);
};
/**
* @const
* @type {!grpc.web.MethodDescriptor<
* !proto.api.AddRelayDeviceRequest,
* !proto.google.protobuf.Empty>}
*/
const methodDescriptor_RelayService_AddDevice = new grpc.web.MethodDescriptor(
'/api.RelayService/AddDevice',
grpc.web.MethodType.UNARY,
proto.api.AddRelayDeviceRequest,
google_protobuf_empty_pb.Empty,
/**
* @param {!proto.api.AddRelayDeviceRequest} request
* @return {!Uint8Array}
*/
function(request) {
return request.serializeBinary();
},
google_protobuf_empty_pb.Empty.deserializeBinary
);
/**
* @param {!proto.api.AddRelayDeviceRequest} 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.RelayServiceClient.prototype.addDevice =
function(request, metadata, callback) {
return this.client_.rpcCall(this.hostname_ +
'/api.RelayService/AddDevice',
request,
metadata || {},
methodDescriptor_RelayService_AddDevice,
callback);
};
/**
* @param {!proto.api.AddRelayDeviceRequest} 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.RelayServicePromiseClient.prototype.addDevice =
function(request, metadata) {
return this.client_.unaryCall(this.hostname_ +
'/api.RelayService/AddDevice',
request,
metadata || {},
methodDescriptor_RelayService_AddDevice);
};
/**
* @const
* @type {!grpc.web.MethodDescriptor<
* !proto.api.RemoveRelayDeviceRequest,
* !proto.google.protobuf.Empty>}
*/
const methodDescriptor_RelayService_RemoveDevice = new grpc.web.MethodDescriptor(
'/api.RelayService/RemoveDevice',
grpc.web.MethodType.UNARY,
proto.api.RemoveRelayDeviceRequest,
google_protobuf_empty_pb.Empty,
/**
* @param {!proto.api.RemoveRelayDeviceRequest} request
* @return {!Uint8Array}
*/
function(request) {
return request.serializeBinary();
},
google_protobuf_empty_pb.Empty.deserializeBinary
);
/**
* @param {!proto.api.RemoveRelayDeviceRequest} 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.RelayServiceClient.prototype.removeDevice =
function(request, metadata, callback) {
return this.client_.rpcCall(this.hostname_ +
'/api.RelayService/RemoveDevice',
request,
metadata || {},
methodDescriptor_RelayService_RemoveDevice,
callback);
};
/**
* @param {!proto.api.RemoveRelayDeviceRequest} 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.RelayServicePromiseClient.prototype.removeDevice =
function(request, metadata) {
return this.client_.unaryCall(this.hostname_ +
'/api.RelayService/RemoveDevice',
request,
metadata || {},
methodDescriptor_RelayService_RemoveDevice);
};
/**
* @const
* @type {!grpc.web.MethodDescriptor<
* !proto.api.ListRelayDevicesRequest,
* !proto.api.ListRelayDevicesResponse>}
*/
const methodDescriptor_RelayService_ListDevices = new grpc.web.MethodDescriptor(
'/api.RelayService/ListDevices',
grpc.web.MethodType.UNARY,
proto.api.ListRelayDevicesRequest,
proto.api.ListRelayDevicesResponse,
/**
* @param {!proto.api.ListRelayDevicesRequest} request
* @return {!Uint8Array}
*/
function(request) {
return request.serializeBinary();
},
proto.api.ListRelayDevicesResponse.deserializeBinary
);
/**
* @param {!proto.api.ListRelayDevicesRequest} request The
* request proto
* @param {?Object<string, string>} metadata User defined
* call metadata
* @param {function(?grpc.web.RpcError, ?proto.api.ListRelayDevicesResponse)}
* callback The callback function(error, response)
* @return {!grpc.web.ClientReadableStream<!proto.api.ListRelayDevicesResponse>|undefined}
* The XHR Node Readable Stream
*/
proto.api.RelayServiceClient.prototype.listDevices =
function(request, metadata, callback) {
return this.client_.rpcCall(this.hostname_ +
'/api.RelayService/ListDevices',
request,
metadata || {},
methodDescriptor_RelayService_ListDevices,
callback);
};
/**
* @param {!proto.api.ListRelayDevicesRequest} request The
* request proto
* @param {?Object<string, string>=} metadata User defined
* call metadata
* @return {!Promise<!proto.api.ListRelayDevicesResponse>}
* Promise that resolves to the response
*/
proto.api.RelayServicePromiseClient.prototype.listDevices =
function(request, metadata) {
return this.client_.unaryCall(this.hostname_ +
'/api.RelayService/ListDevices',
request,
metadata || {},
methodDescriptor_RelayService_ListDevices);
};
module.exports = proto.api;

201
api/grpc-web/api/relay_pb.d.ts vendored Normal file
View File

@ -0,0 +1,201 @@
import * as jspb from 'google-protobuf'
import * as google_api_annotations_pb from '../google/api/annotations_pb';
import * as google_protobuf_timestamp_pb from 'google-protobuf/google/protobuf/timestamp_pb';
import * as google_protobuf_empty_pb from 'google-protobuf/google/protobuf/empty_pb';
export class RelayListItem extends jspb.Message {
getDevEui(): string;
setDevEui(value: string): RelayListItem;
getName(): string;
setName(value: string): RelayListItem;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): RelayListItem.AsObject;
static toObject(includeInstance: boolean, msg: RelayListItem): RelayListItem.AsObject;
static serializeBinaryToWriter(message: RelayListItem, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): RelayListItem;
static deserializeBinaryFromReader(message: RelayListItem, reader: jspb.BinaryReader): RelayListItem;
}
export namespace RelayListItem {
export type AsObject = {
devEui: string,
name: string,
}
}
export class ListRelaysRequest extends jspb.Message {
getLimit(): number;
setLimit(value: number): ListRelaysRequest;
getOffset(): number;
setOffset(value: number): ListRelaysRequest;
getApplicationId(): string;
setApplicationId(value: string): ListRelaysRequest;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): ListRelaysRequest.AsObject;
static toObject(includeInstance: boolean, msg: ListRelaysRequest): ListRelaysRequest.AsObject;
static serializeBinaryToWriter(message: ListRelaysRequest, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): ListRelaysRequest;
static deserializeBinaryFromReader(message: ListRelaysRequest, reader: jspb.BinaryReader): ListRelaysRequest;
}
export namespace ListRelaysRequest {
export type AsObject = {
limit: number,
offset: number,
applicationId: string,
}
}
export class ListRelaysResponse extends jspb.Message {
getTotalCount(): number;
setTotalCount(value: number): ListRelaysResponse;
getResultList(): Array<RelayListItem>;
setResultList(value: Array<RelayListItem>): ListRelaysResponse;
clearResultList(): ListRelaysResponse;
addResult(value?: RelayListItem, index?: number): RelayListItem;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): ListRelaysResponse.AsObject;
static toObject(includeInstance: boolean, msg: ListRelaysResponse): ListRelaysResponse.AsObject;
static serializeBinaryToWriter(message: ListRelaysResponse, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): ListRelaysResponse;
static deserializeBinaryFromReader(message: ListRelaysResponse, reader: jspb.BinaryReader): ListRelaysResponse;
}
export namespace ListRelaysResponse {
export type AsObject = {
totalCount: number,
resultList: Array<RelayListItem.AsObject>,
}
}
export class AddRelayDeviceRequest extends jspb.Message {
getRelayDevEui(): string;
setRelayDevEui(value: string): AddRelayDeviceRequest;
getDeviceDevEui(): string;
setDeviceDevEui(value: string): AddRelayDeviceRequest;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): AddRelayDeviceRequest.AsObject;
static toObject(includeInstance: boolean, msg: AddRelayDeviceRequest): AddRelayDeviceRequest.AsObject;
static serializeBinaryToWriter(message: AddRelayDeviceRequest, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): AddRelayDeviceRequest;
static deserializeBinaryFromReader(message: AddRelayDeviceRequest, reader: jspb.BinaryReader): AddRelayDeviceRequest;
}
export namespace AddRelayDeviceRequest {
export type AsObject = {
relayDevEui: string,
deviceDevEui: string,
}
}
export class RemoveRelayDeviceRequest extends jspb.Message {
getRelayDevEui(): string;
setRelayDevEui(value: string): RemoveRelayDeviceRequest;
getDeviceDevEui(): string;
setDeviceDevEui(value: string): RemoveRelayDeviceRequest;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): RemoveRelayDeviceRequest.AsObject;
static toObject(includeInstance: boolean, msg: RemoveRelayDeviceRequest): RemoveRelayDeviceRequest.AsObject;
static serializeBinaryToWriter(message: RemoveRelayDeviceRequest, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): RemoveRelayDeviceRequest;
static deserializeBinaryFromReader(message: RemoveRelayDeviceRequest, reader: jspb.BinaryReader): RemoveRelayDeviceRequest;
}
export namespace RemoveRelayDeviceRequest {
export type AsObject = {
relayDevEui: string,
deviceDevEui: string,
}
}
export class ListRelayDevicesRequest extends jspb.Message {
getLimit(): number;
setLimit(value: number): ListRelayDevicesRequest;
getOffset(): number;
setOffset(value: number): ListRelayDevicesRequest;
getRelayDevEui(): string;
setRelayDevEui(value: string): ListRelayDevicesRequest;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): ListRelayDevicesRequest.AsObject;
static toObject(includeInstance: boolean, msg: ListRelayDevicesRequest): ListRelayDevicesRequest.AsObject;
static serializeBinaryToWriter(message: ListRelayDevicesRequest, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): ListRelayDevicesRequest;
static deserializeBinaryFromReader(message: ListRelayDevicesRequest, reader: jspb.BinaryReader): ListRelayDevicesRequest;
}
export namespace ListRelayDevicesRequest {
export type AsObject = {
limit: number,
offset: number,
relayDevEui: string,
}
}
export class RelayDeviceListItem extends jspb.Message {
getDevEui(): string;
setDevEui(value: string): RelayDeviceListItem;
getCreatedAt(): google_protobuf_timestamp_pb.Timestamp | undefined;
setCreatedAt(value?: google_protobuf_timestamp_pb.Timestamp): RelayDeviceListItem;
hasCreatedAt(): boolean;
clearCreatedAt(): RelayDeviceListItem;
getName(): string;
setName(value: string): RelayDeviceListItem;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): RelayDeviceListItem.AsObject;
static toObject(includeInstance: boolean, msg: RelayDeviceListItem): RelayDeviceListItem.AsObject;
static serializeBinaryToWriter(message: RelayDeviceListItem, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): RelayDeviceListItem;
static deserializeBinaryFromReader(message: RelayDeviceListItem, reader: jspb.BinaryReader): RelayDeviceListItem;
}
export namespace RelayDeviceListItem {
export type AsObject = {
devEui: string,
createdAt?: google_protobuf_timestamp_pb.Timestamp.AsObject,
name: string,
}
}
export class ListRelayDevicesResponse extends jspb.Message {
getTotalCount(): number;
setTotalCount(value: number): ListRelayDevicesResponse;
getResultList(): Array<RelayDeviceListItem>;
setResultList(value: Array<RelayDeviceListItem>): ListRelayDevicesResponse;
clearResultList(): ListRelayDevicesResponse;
addResult(value?: RelayDeviceListItem, index?: number): RelayDeviceListItem;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): ListRelayDevicesResponse.AsObject;
static toObject(includeInstance: boolean, msg: ListRelayDevicesResponse): ListRelayDevicesResponse.AsObject;
static serializeBinaryToWriter(message: ListRelayDevicesResponse, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): ListRelayDevicesResponse;
static deserializeBinaryFromReader(message: ListRelayDevicesResponse, reader: jspb.BinaryReader): ListRelayDevicesResponse;
}
export namespace ListRelayDevicesResponse {
export type AsObject = {
totalCount: number,
resultList: Array<RelayDeviceListItem.AsObject>,
}
}

1648
api/grpc-web/api/relay_pb.js vendored Normal file

File diff suppressed because it is too large Load Diff

1
api/js/Makefile vendored
View File

@ -29,6 +29,7 @@ api:
protoc ${PROTOC_GRPC_ARGS} ../proto/api/frame_log.proto
protoc ${PROTOC_GRPC_ARGS} ../proto/api/multicast_group.proto
protoc ${PROTOC_GRPC_ARGS} ../proto/api/request_log.proto
protoc ${PROTOC_GRPC_ARGS} ../proto/api/relay.proto
integration:
protoc ${PROTOC_ARGS} ../proto/integration/integration.proto

View File

@ -34,6 +34,9 @@ export class Device extends jspb.Message {
clearVariablesMap(): void;
getTagsMap(): jspb.Map<string, string>;
clearTagsMap(): void;
getJoinEui(): string;
setJoinEui(value: string): void;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): Device.AsObject;
static toObject(includeInstance: boolean, msg: Device): Device.AsObject;
@ -55,6 +58,7 @@ export namespace Device {
isDisabled: boolean,
variablesMap: Array<[string, string]>,
tagsMap: Array<[string, string]>,
joinEui: string,
}
}

View File

@ -832,7 +832,8 @@ proto.api.Device.toObject = function(includeInstance, msg) {
skipFcntCheck: jspb.Message.getBooleanFieldWithDefault(msg, 6, false),
isDisabled: jspb.Message.getBooleanFieldWithDefault(msg, 7, false),
variablesMap: (f = msg.getVariablesMap()) ? f.toObject(includeInstance, undefined) : [],
tagsMap: (f = msg.getTagsMap()) ? f.toObject(includeInstance, undefined) : []
tagsMap: (f = msg.getTagsMap()) ? f.toObject(includeInstance, undefined) : [],
joinEui: jspb.Message.getFieldWithDefault(msg, 10, "")
};
if (includeInstance) {
@ -909,6 +910,10 @@ proto.api.Device.deserializeBinaryFromReader = function(msg, reader) {
jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readString, null, "", "");
});
break;
case 10:
var value = /** @type {string} */ (reader.readString());
msg.setJoinEui(value);
break;
default:
reader.skipField();
break;
@ -995,6 +1000,13 @@ proto.api.Device.serializeBinaryToWriter = function(message, writer) {
if (f && f.getLength() > 0) {
f.serializeBinary(9, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeString);
}
f = message.getJoinEui();
if (f.length > 0) {
writer.writeString(
10,
f
);
}
};
@ -1168,6 +1180,24 @@ proto.api.Device.prototype.clearTagsMap = function() {
return this;};
/**
* optional string join_eui = 10;
* @return {string}
*/
proto.api.Device.prototype.getJoinEui = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 10, ""));
};
/**
* @param {string} value
* @return {!proto.api.Device} returns this
*/
proto.api.Device.prototype.setJoinEui = function(value) {
return jspb.Message.setProto3StringField(this, 10, value);
};

View File

@ -93,6 +93,72 @@ export class DeviceProfile extends jspb.Message {
getRegionConfigId(): string;
setRegionConfigId(value: string): void;
getIsRelay(): boolean;
setIsRelay(value: boolean): void;
getIsRelayEd(): boolean;
setIsRelayEd(value: boolean): void;
getRelayEdRelayOnly(): boolean;
setRelayEdRelayOnly(value: boolean): void;
getRelayEnabled(): boolean;
setRelayEnabled(value: boolean): void;
getRelayCadPeriodicity(): CadPeriodicityMap[keyof CadPeriodicityMap];
setRelayCadPeriodicity(value: CadPeriodicityMap[keyof CadPeriodicityMap]): void;
getRelayDefaultChannelIndex(): number;
setRelayDefaultChannelIndex(value: number): void;
getRelaySecondChannelFreq(): number;
setRelaySecondChannelFreq(value: number): void;
getRelaySecondChannelDr(): number;
setRelaySecondChannelDr(value: number): void;
getRelaySecondChannelAckOffset(): SecondChAckOffsetMap[keyof SecondChAckOffsetMap];
setRelaySecondChannelAckOffset(value: SecondChAckOffsetMap[keyof SecondChAckOffsetMap]): void;
getRelayEdActivationMode(): RelayModeActivationMap[keyof RelayModeActivationMap];
setRelayEdActivationMode(value: RelayModeActivationMap[keyof RelayModeActivationMap]): void;
getRelayEdSmartEnableLevel(): number;
setRelayEdSmartEnableLevel(value: number): void;
getRelayEdBackOff(): number;
setRelayEdBackOff(value: number): void;
getRelayEdUplinkLimitBucketSize(): number;
setRelayEdUplinkLimitBucketSize(value: number): void;
getRelayEdUplinkLimitReloadRate(): number;
setRelayEdUplinkLimitReloadRate(value: number): void;
getRelayJoinReqLimitReloadRate(): number;
setRelayJoinReqLimitReloadRate(value: number): void;
getRelayNotifyLimitReloadRate(): number;
setRelayNotifyLimitReloadRate(value: number): void;
getRelayGlobalUplinkLimitReloadRate(): number;
setRelayGlobalUplinkLimitReloadRate(value: number): void;
getRelayOverallLimitReloadRate(): number;
setRelayOverallLimitReloadRate(value: number): void;
getRelayJoinReqLimitBucketSize(): number;
setRelayJoinReqLimitBucketSize(value: number): void;
getRelayNotifyLimitBucketSize(): number;
setRelayNotifyLimitBucketSize(value: number): void;
getRelayGlobalUplinkLimitBucketSize(): number;
setRelayGlobalUplinkLimitBucketSize(value: number): void;
getRelayOverallLimitBucketSize(): number;
setRelayOverallLimitBucketSize(value: number): void;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): DeviceProfile.AsObject;
static toObject(includeInstance: boolean, msg: DeviceProfile): DeviceProfile.AsObject;
@ -134,6 +200,28 @@ export namespace DeviceProfile {
measurementsMap: Array<[string, Measurement.AsObject]>,
autoDetectMeasurements: boolean,
regionConfigId: string,
isRelay: boolean,
isRelayEd: boolean,
relayEdRelayOnly: boolean,
relayEnabled: boolean,
relayCadPeriodicity: CadPeriodicityMap[keyof CadPeriodicityMap],
relayDefaultChannelIndex: number,
relaySecondChannelFreq: number,
relaySecondChannelDr: number,
relaySecondChannelAckOffset: SecondChAckOffsetMap[keyof SecondChAckOffsetMap],
relayEdActivationMode: RelayModeActivationMap[keyof RelayModeActivationMap],
relayEdSmartEnableLevel: number,
relayEdBackOff: number,
relayEdUplinkLimitBucketSize: number,
relayEdUplinkLimitReloadRate: number,
relayJoinReqLimitReloadRate: number,
relayNotifyLimitReloadRate: number,
relayGlobalUplinkLimitReloadRate: number,
relayOverallLimitReloadRate: number,
relayJoinReqLimitBucketSize: number,
relayNotifyLimitBucketSize: number,
relayGlobalUplinkLimitBucketSize: number,
relayOverallLimitBucketSize: number,
}
}
@ -485,3 +573,34 @@ export interface MeasurementKindMap {
export const MeasurementKind: MeasurementKindMap;
export interface CadPeriodicityMap {
SEC_1: 0;
MS_500: 1;
MS_250: 2;
MS_100: 3;
MS_50: 4;
MS_20: 5;
}
export const CadPeriodicity: CadPeriodicityMap;
export interface SecondChAckOffsetMap {
KHZ_0: 0;
KHZ_200: 1;
KHZ_400: 2;
KHZ_800: 3;
KHZ_1600: 4;
KHZ_3200: 5;
}
export const SecondChAckOffset: SecondChAckOffsetMap;
export interface RelayModeActivationMap {
DISABLE_RELAY_MODE: 0;
ENABLE_RELAY_MODE: 1;
DYNAMIC: 2;
END_DEVICE_CONTROLLED: 3;
}
export const RelayModeActivation: RelayModeActivationMap;

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.AdrAlgorithmListItem', null, global);
goog.exportSymbol('proto.api.CadPeriodicity', null, global);
goog.exportSymbol('proto.api.CodecRuntime', null, global);
goog.exportSymbol('proto.api.CreateDeviceProfileRequest', null, global);
goog.exportSymbol('proto.api.CreateDeviceProfileResponse', null, global);
@ -34,6 +35,8 @@ goog.exportSymbol('proto.api.ListDeviceProfilesRequest', null, global);
goog.exportSymbol('proto.api.ListDeviceProfilesResponse', null, global);
goog.exportSymbol('proto.api.Measurement', null, global);
goog.exportSymbol('proto.api.MeasurementKind', null, global);
goog.exportSymbol('proto.api.RelayModeActivation', null, global);
goog.exportSymbol('proto.api.SecondChAckOffset', null, global);
goog.exportSymbol('proto.api.UpdateDeviceProfileRequest', null, global);
/**
* Generated by JsPbCodeGenerator.
@ -368,7 +371,29 @@ proto.api.DeviceProfile.toObject = function(includeInstance, msg) {
tagsMap: (f = msg.getTagsMap()) ? f.toObject(includeInstance, undefined) : [],
measurementsMap: (f = msg.getMeasurementsMap()) ? f.toObject(includeInstance, proto.api.Measurement.toObject) : [],
autoDetectMeasurements: jspb.Message.getBooleanFieldWithDefault(msg, 28, false),
regionConfigId: jspb.Message.getFieldWithDefault(msg, 29, "")
regionConfigId: jspb.Message.getFieldWithDefault(msg, 29, ""),
isRelay: jspb.Message.getBooleanFieldWithDefault(msg, 30, false),
isRelayEd: jspb.Message.getBooleanFieldWithDefault(msg, 31, false),
relayEdRelayOnly: jspb.Message.getBooleanFieldWithDefault(msg, 32, false),
relayEnabled: jspb.Message.getBooleanFieldWithDefault(msg, 33, false),
relayCadPeriodicity: jspb.Message.getFieldWithDefault(msg, 34, 0),
relayDefaultChannelIndex: jspb.Message.getFieldWithDefault(msg, 35, 0),
relaySecondChannelFreq: jspb.Message.getFieldWithDefault(msg, 36, 0),
relaySecondChannelDr: jspb.Message.getFieldWithDefault(msg, 37, 0),
relaySecondChannelAckOffset: jspb.Message.getFieldWithDefault(msg, 38, 0),
relayEdActivationMode: jspb.Message.getFieldWithDefault(msg, 39, 0),
relayEdSmartEnableLevel: jspb.Message.getFieldWithDefault(msg, 40, 0),
relayEdBackOff: jspb.Message.getFieldWithDefault(msg, 41, 0),
relayEdUplinkLimitBucketSize: jspb.Message.getFieldWithDefault(msg, 42, 0),
relayEdUplinkLimitReloadRate: jspb.Message.getFieldWithDefault(msg, 43, 0),
relayJoinReqLimitReloadRate: jspb.Message.getFieldWithDefault(msg, 44, 0),
relayNotifyLimitReloadRate: jspb.Message.getFieldWithDefault(msg, 45, 0),
relayGlobalUplinkLimitReloadRate: jspb.Message.getFieldWithDefault(msg, 46, 0),
relayOverallLimitReloadRate: jspb.Message.getFieldWithDefault(msg, 47, 0),
relayJoinReqLimitBucketSize: jspb.Message.getFieldWithDefault(msg, 48, 0),
relayNotifyLimitBucketSize: jspb.Message.getFieldWithDefault(msg, 49, 0),
relayGlobalUplinkLimitBucketSize: jspb.Message.getFieldWithDefault(msg, 50, 0),
relayOverallLimitBucketSize: jspb.Message.getFieldWithDefault(msg, 51, 0)
};
if (includeInstance) {
@ -525,6 +550,94 @@ proto.api.DeviceProfile.deserializeBinaryFromReader = function(msg, reader) {
var value = /** @type {string} */ (reader.readString());
msg.setRegionConfigId(value);
break;
case 30:
var value = /** @type {boolean} */ (reader.readBool());
msg.setIsRelay(value);
break;
case 31:
var value = /** @type {boolean} */ (reader.readBool());
msg.setIsRelayEd(value);
break;
case 32:
var value = /** @type {boolean} */ (reader.readBool());
msg.setRelayEdRelayOnly(value);
break;
case 33:
var value = /** @type {boolean} */ (reader.readBool());
msg.setRelayEnabled(value);
break;
case 34:
var value = /** @type {!proto.api.CadPeriodicity} */ (reader.readEnum());
msg.setRelayCadPeriodicity(value);
break;
case 35:
var value = /** @type {number} */ (reader.readUint32());
msg.setRelayDefaultChannelIndex(value);
break;
case 36:
var value = /** @type {number} */ (reader.readUint32());
msg.setRelaySecondChannelFreq(value);
break;
case 37:
var value = /** @type {number} */ (reader.readUint32());
msg.setRelaySecondChannelDr(value);
break;
case 38:
var value = /** @type {!proto.api.SecondChAckOffset} */ (reader.readEnum());
msg.setRelaySecondChannelAckOffset(value);
break;
case 39:
var value = /** @type {!proto.api.RelayModeActivation} */ (reader.readEnum());
msg.setRelayEdActivationMode(value);
break;
case 40:
var value = /** @type {number} */ (reader.readUint32());
msg.setRelayEdSmartEnableLevel(value);
break;
case 41:
var value = /** @type {number} */ (reader.readUint32());
msg.setRelayEdBackOff(value);
break;
case 42:
var value = /** @type {number} */ (reader.readUint32());
msg.setRelayEdUplinkLimitBucketSize(value);
break;
case 43:
var value = /** @type {number} */ (reader.readUint32());
msg.setRelayEdUplinkLimitReloadRate(value);
break;
case 44:
var value = /** @type {number} */ (reader.readUint32());
msg.setRelayJoinReqLimitReloadRate(value);
break;
case 45:
var value = /** @type {number} */ (reader.readUint32());
msg.setRelayNotifyLimitReloadRate(value);
break;
case 46:
var value = /** @type {number} */ (reader.readUint32());
msg.setRelayGlobalUplinkLimitReloadRate(value);
break;
case 47:
var value = /** @type {number} */ (reader.readUint32());
msg.setRelayOverallLimitReloadRate(value);
break;
case 48:
var value = /** @type {number} */ (reader.readUint32());
msg.setRelayJoinReqLimitBucketSize(value);
break;
case 49:
var value = /** @type {number} */ (reader.readUint32());
msg.setRelayNotifyLimitBucketSize(value);
break;
case 50:
var value = /** @type {number} */ (reader.readUint32());
msg.setRelayGlobalUplinkLimitBucketSize(value);
break;
case 51:
var value = /** @type {number} */ (reader.readUint32());
msg.setRelayOverallLimitBucketSize(value);
break;
default:
reader.skipField();
break;
@ -751,6 +864,160 @@ proto.api.DeviceProfile.serializeBinaryToWriter = function(message, writer) {
f
);
}
f = message.getIsRelay();
if (f) {
writer.writeBool(
30,
f
);
}
f = message.getIsRelayEd();
if (f) {
writer.writeBool(
31,
f
);
}
f = message.getRelayEdRelayOnly();
if (f) {
writer.writeBool(
32,
f
);
}
f = message.getRelayEnabled();
if (f) {
writer.writeBool(
33,
f
);
}
f = message.getRelayCadPeriodicity();
if (f !== 0.0) {
writer.writeEnum(
34,
f
);
}
f = message.getRelayDefaultChannelIndex();
if (f !== 0) {
writer.writeUint32(
35,
f
);
}
f = message.getRelaySecondChannelFreq();
if (f !== 0) {
writer.writeUint32(
36,
f
);
}
f = message.getRelaySecondChannelDr();
if (f !== 0) {
writer.writeUint32(
37,
f
);
}
f = message.getRelaySecondChannelAckOffset();
if (f !== 0.0) {
writer.writeEnum(
38,
f
);
}
f = message.getRelayEdActivationMode();
if (f !== 0.0) {
writer.writeEnum(
39,
f
);
}
f = message.getRelayEdSmartEnableLevel();
if (f !== 0) {
writer.writeUint32(
40,
f
);
}
f = message.getRelayEdBackOff();
if (f !== 0) {
writer.writeUint32(
41,
f
);
}
f = message.getRelayEdUplinkLimitBucketSize();
if (f !== 0) {
writer.writeUint32(
42,
f
);
}
f = message.getRelayEdUplinkLimitReloadRate();
if (f !== 0) {
writer.writeUint32(
43,
f
);
}
f = message.getRelayJoinReqLimitReloadRate();
if (f !== 0) {
writer.writeUint32(
44,
f
);
}
f = message.getRelayNotifyLimitReloadRate();
if (f !== 0) {
writer.writeUint32(
45,
f
);
}
f = message.getRelayGlobalUplinkLimitReloadRate();
if (f !== 0) {
writer.writeUint32(
46,
f
);
}
f = message.getRelayOverallLimitReloadRate();
if (f !== 0) {
writer.writeUint32(
47,
f
);
}
f = message.getRelayJoinReqLimitBucketSize();
if (f !== 0) {
writer.writeUint32(
48,
f
);
}
f = message.getRelayNotifyLimitBucketSize();
if (f !== 0) {
writer.writeUint32(
49,
f
);
}
f = message.getRelayGlobalUplinkLimitBucketSize();
if (f !== 0) {
writer.writeUint32(
50,
f
);
}
f = message.getRelayOverallLimitBucketSize();
if (f !== 0) {
writer.writeUint32(
51,
f
);
}
};
@ -1284,6 +1551,402 @@ proto.api.DeviceProfile.prototype.setRegionConfigId = function(value) {
};
/**
* optional bool is_relay = 30;
* @return {boolean}
*/
proto.api.DeviceProfile.prototype.getIsRelay = function() {
return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 30, false));
};
/**
* @param {boolean} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setIsRelay = function(value) {
return jspb.Message.setProto3BooleanField(this, 30, value);
};
/**
* optional bool is_relay_ed = 31;
* @return {boolean}
*/
proto.api.DeviceProfile.prototype.getIsRelayEd = function() {
return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 31, false));
};
/**
* @param {boolean} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setIsRelayEd = function(value) {
return jspb.Message.setProto3BooleanField(this, 31, value);
};
/**
* optional bool relay_ed_relay_only = 32;
* @return {boolean}
*/
proto.api.DeviceProfile.prototype.getRelayEdRelayOnly = function() {
return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 32, false));
};
/**
* @param {boolean} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelayEdRelayOnly = function(value) {
return jspb.Message.setProto3BooleanField(this, 32, value);
};
/**
* optional bool relay_enabled = 33;
* @return {boolean}
*/
proto.api.DeviceProfile.prototype.getRelayEnabled = function() {
return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 33, false));
};
/**
* @param {boolean} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelayEnabled = function(value) {
return jspb.Message.setProto3BooleanField(this, 33, value);
};
/**
* optional CadPeriodicity relay_cad_periodicity = 34;
* @return {!proto.api.CadPeriodicity}
*/
proto.api.DeviceProfile.prototype.getRelayCadPeriodicity = function() {
return /** @type {!proto.api.CadPeriodicity} */ (jspb.Message.getFieldWithDefault(this, 34, 0));
};
/**
* @param {!proto.api.CadPeriodicity} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelayCadPeriodicity = function(value) {
return jspb.Message.setProto3EnumField(this, 34, value);
};
/**
* optional uint32 relay_default_channel_index = 35;
* @return {number}
*/
proto.api.DeviceProfile.prototype.getRelayDefaultChannelIndex = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 35, 0));
};
/**
* @param {number} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelayDefaultChannelIndex = function(value) {
return jspb.Message.setProto3IntField(this, 35, value);
};
/**
* optional uint32 relay_second_channel_freq = 36;
* @return {number}
*/
proto.api.DeviceProfile.prototype.getRelaySecondChannelFreq = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 36, 0));
};
/**
* @param {number} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelaySecondChannelFreq = function(value) {
return jspb.Message.setProto3IntField(this, 36, value);
};
/**
* optional uint32 relay_second_channel_dr = 37;
* @return {number}
*/
proto.api.DeviceProfile.prototype.getRelaySecondChannelDr = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 37, 0));
};
/**
* @param {number} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelaySecondChannelDr = function(value) {
return jspb.Message.setProto3IntField(this, 37, value);
};
/**
* optional SecondChAckOffset relay_second_channel_ack_offset = 38;
* @return {!proto.api.SecondChAckOffset}
*/
proto.api.DeviceProfile.prototype.getRelaySecondChannelAckOffset = function() {
return /** @type {!proto.api.SecondChAckOffset} */ (jspb.Message.getFieldWithDefault(this, 38, 0));
};
/**
* @param {!proto.api.SecondChAckOffset} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelaySecondChannelAckOffset = function(value) {
return jspb.Message.setProto3EnumField(this, 38, value);
};
/**
* optional RelayModeActivation relay_ed_activation_mode = 39;
* @return {!proto.api.RelayModeActivation}
*/
proto.api.DeviceProfile.prototype.getRelayEdActivationMode = function() {
return /** @type {!proto.api.RelayModeActivation} */ (jspb.Message.getFieldWithDefault(this, 39, 0));
};
/**
* @param {!proto.api.RelayModeActivation} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelayEdActivationMode = function(value) {
return jspb.Message.setProto3EnumField(this, 39, value);
};
/**
* optional uint32 relay_ed_smart_enable_level = 40;
* @return {number}
*/
proto.api.DeviceProfile.prototype.getRelayEdSmartEnableLevel = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 40, 0));
};
/**
* @param {number} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelayEdSmartEnableLevel = function(value) {
return jspb.Message.setProto3IntField(this, 40, value);
};
/**
* optional uint32 relay_ed_back_off = 41;
* @return {number}
*/
proto.api.DeviceProfile.prototype.getRelayEdBackOff = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 41, 0));
};
/**
* @param {number} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelayEdBackOff = function(value) {
return jspb.Message.setProto3IntField(this, 41, value);
};
/**
* optional uint32 relay_ed_uplink_limit_bucket_size = 42;
* @return {number}
*/
proto.api.DeviceProfile.prototype.getRelayEdUplinkLimitBucketSize = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 42, 0));
};
/**
* @param {number} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelayEdUplinkLimitBucketSize = function(value) {
return jspb.Message.setProto3IntField(this, 42, value);
};
/**
* optional uint32 relay_ed_uplink_limit_reload_rate = 43;
* @return {number}
*/
proto.api.DeviceProfile.prototype.getRelayEdUplinkLimitReloadRate = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 43, 0));
};
/**
* @param {number} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelayEdUplinkLimitReloadRate = function(value) {
return jspb.Message.setProto3IntField(this, 43, value);
};
/**
* optional uint32 relay_join_req_limit_reload_rate = 44;
* @return {number}
*/
proto.api.DeviceProfile.prototype.getRelayJoinReqLimitReloadRate = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 44, 0));
};
/**
* @param {number} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelayJoinReqLimitReloadRate = function(value) {
return jspb.Message.setProto3IntField(this, 44, value);
};
/**
* optional uint32 relay_notify_limit_reload_rate = 45;
* @return {number}
*/
proto.api.DeviceProfile.prototype.getRelayNotifyLimitReloadRate = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 45, 0));
};
/**
* @param {number} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelayNotifyLimitReloadRate = function(value) {
return jspb.Message.setProto3IntField(this, 45, value);
};
/**
* optional uint32 relay_global_uplink_limit_reload_rate = 46;
* @return {number}
*/
proto.api.DeviceProfile.prototype.getRelayGlobalUplinkLimitReloadRate = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 46, 0));
};
/**
* @param {number} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelayGlobalUplinkLimitReloadRate = function(value) {
return jspb.Message.setProto3IntField(this, 46, value);
};
/**
* optional uint32 relay_overall_limit_reload_rate = 47;
* @return {number}
*/
proto.api.DeviceProfile.prototype.getRelayOverallLimitReloadRate = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 47, 0));
};
/**
* @param {number} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelayOverallLimitReloadRate = function(value) {
return jspb.Message.setProto3IntField(this, 47, value);
};
/**
* optional uint32 relay_join_req_limit_bucket_size = 48;
* @return {number}
*/
proto.api.DeviceProfile.prototype.getRelayJoinReqLimitBucketSize = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 48, 0));
};
/**
* @param {number} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelayJoinReqLimitBucketSize = function(value) {
return jspb.Message.setProto3IntField(this, 48, value);
};
/**
* optional uint32 relay_notify_limit_bucket_size = 49;
* @return {number}
*/
proto.api.DeviceProfile.prototype.getRelayNotifyLimitBucketSize = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 49, 0));
};
/**
* @param {number} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelayNotifyLimitBucketSize = function(value) {
return jspb.Message.setProto3IntField(this, 49, value);
};
/**
* optional uint32 relay_global_uplink_limit_bucket_size = 50;
* @return {number}
*/
proto.api.DeviceProfile.prototype.getRelayGlobalUplinkLimitBucketSize = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 50, 0));
};
/**
* @param {number} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelayGlobalUplinkLimitBucketSize = function(value) {
return jspb.Message.setProto3IntField(this, 50, value);
};
/**
* optional uint32 relay_overall_limit_bucket_size = 51;
* @return {number}
*/
proto.api.DeviceProfile.prototype.getRelayOverallLimitBucketSize = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 51, 0));
};
/**
* @param {number} value
* @return {!proto.api.DeviceProfile} returns this
*/
proto.api.DeviceProfile.prototype.setRelayOverallLimitBucketSize = function(value) {
return jspb.Message.setProto3IntField(this, 51, value);
};
@ -3611,4 +4274,38 @@ proto.api.MeasurementKind = {
STRING: 4
};
/**
* @enum {number}
*/
proto.api.CadPeriodicity = {
SEC_1: 0,
MS_500: 1,
MS_250: 2,
MS_100: 3,
MS_50: 4,
MS_20: 5
};
/**
* @enum {number}
*/
proto.api.SecondChAckOffset = {
KHZ_0: 0,
KHZ_200: 1,
KHZ_400: 2,
KHZ_800: 3,
KHZ_1600: 4,
KHZ_3200: 5
};
/**
* @enum {number}
*/
proto.api.RelayModeActivation = {
DISABLE_RELAY_MODE: 0,
ENABLE_RELAY_MODE: 1,
DYNAMIC: 2,
END_DEVICE_CONTROLLED: 3
};
goog.object.extend(exports, proto.api);

View File

@ -36,8 +36,11 @@ export class UplinkFrameLog extends jspb.Message {
getTime(): google_protobuf_timestamp_pb.Timestamp | undefined;
setTime(value?: google_protobuf_timestamp_pb.Timestamp): void;
getPlaintextMacCommands(): boolean;
setPlaintextMacCommands(value: boolean): void;
getPlaintextFOpts(): boolean;
setPlaintextFOpts(value: boolean): void;
getPlaintextFrmPayload(): boolean;
setPlaintextFrmPayload(value: boolean): void;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): UplinkFrameLog.AsObject;
@ -58,7 +61,8 @@ export namespace UplinkFrameLog {
devAddr: string,
devEui: string,
time?: google_protobuf_timestamp_pb.Timestamp.AsObject,
plaintextMacCommands: boolean,
plaintextFOpts: boolean,
plaintextFrmPayload: boolean,
}
}
@ -93,8 +97,11 @@ export class DownlinkFrameLog extends jspb.Message {
getDevEui(): string;
setDevEui(value: string): void;
getPlaintextMacCommands(): boolean;
setPlaintextMacCommands(value: boolean): void;
getPlaintextFOpts(): boolean;
setPlaintextFOpts(value: boolean): void;
getPlaintextFrmPayload(): boolean;
setPlaintextFrmPayload(value: boolean): void;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): DownlinkFrameLog.AsObject;
@ -116,7 +123,8 @@ export namespace DownlinkFrameLog {
mType: common_common_pb.MTypeMap[keyof common_common_pb.MTypeMap],
devAddr: string,
devEui: string,
plaintextMacCommands: boolean,
plaintextFOpts: boolean,
plaintextFrmPayload: boolean,
}
}

View File

@ -109,7 +109,8 @@ proto.api.UplinkFrameLog.toObject = function(includeInstance, msg) {
devAddr: jspb.Message.getFieldWithDefault(msg, 5, ""),
devEui: jspb.Message.getFieldWithDefault(msg, 6, ""),
time: (f = msg.getTime()) && google_protobuf_timestamp_pb.Timestamp.toObject(includeInstance, f),
plaintextMacCommands: jspb.Message.getBooleanFieldWithDefault(msg, 8, false)
plaintextFOpts: jspb.Message.getBooleanFieldWithDefault(msg, 8, false),
plaintextFrmPayload: jspb.Message.getBooleanFieldWithDefault(msg, 9, false)
};
if (includeInstance) {
@ -179,7 +180,11 @@ proto.api.UplinkFrameLog.deserializeBinaryFromReader = function(msg, reader) {
break;
case 8:
var value = /** @type {boolean} */ (reader.readBool());
msg.setPlaintextMacCommands(value);
msg.setPlaintextFOpts(value);
break;
case 9:
var value = /** @type {boolean} */ (reader.readBool());
msg.setPlaintextFrmPayload(value);
break;
default:
reader.skipField();
@ -262,13 +267,20 @@ proto.api.UplinkFrameLog.serializeBinaryToWriter = function(message, writer) {
google_protobuf_timestamp_pb.Timestamp.serializeBinaryToWriter
);
}
f = message.getPlaintextMacCommands();
f = message.getPlaintextFOpts();
if (f) {
writer.writeBool(
8,
f
);
}
f = message.getPlaintextFrmPayload();
if (f) {
writer.writeBool(
9,
f
);
}
};
@ -481,10 +493,10 @@ proto.api.UplinkFrameLog.prototype.hasTime = function() {
/**
* optional bool plaintext_mac_commands = 8;
* optional bool plaintext_f_opts = 8;
* @return {boolean}
*/
proto.api.UplinkFrameLog.prototype.getPlaintextMacCommands = function() {
proto.api.UplinkFrameLog.prototype.getPlaintextFOpts = function() {
return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 8, false));
};
@ -493,11 +505,29 @@ proto.api.UplinkFrameLog.prototype.getPlaintextMacCommands = function() {
* @param {boolean} value
* @return {!proto.api.UplinkFrameLog} returns this
*/
proto.api.UplinkFrameLog.prototype.setPlaintextMacCommands = function(value) {
proto.api.UplinkFrameLog.prototype.setPlaintextFOpts = function(value) {
return jspb.Message.setProto3BooleanField(this, 8, value);
};
/**
* optional bool plaintext_frm_payload = 9;
* @return {boolean}
*/
proto.api.UplinkFrameLog.prototype.getPlaintextFrmPayload = function() {
return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 9, false));
};
/**
* @param {boolean} value
* @return {!proto.api.UplinkFrameLog} returns this
*/
proto.api.UplinkFrameLog.prototype.setPlaintextFrmPayload = function(value) {
return jspb.Message.setProto3BooleanField(this, 9, value);
};
@ -538,7 +568,8 @@ proto.api.DownlinkFrameLog.toObject = function(includeInstance, msg) {
mType: jspb.Message.getFieldWithDefault(msg, 6, 0),
devAddr: jspb.Message.getFieldWithDefault(msg, 7, ""),
devEui: jspb.Message.getFieldWithDefault(msg, 8, ""),
plaintextMacCommands: jspb.Message.getBooleanFieldWithDefault(msg, 9, false)
plaintextFOpts: jspb.Message.getBooleanFieldWithDefault(msg, 9, false),
plaintextFrmPayload: jspb.Message.getBooleanFieldWithDefault(msg, 10, false)
};
if (includeInstance) {
@ -611,7 +642,11 @@ proto.api.DownlinkFrameLog.deserializeBinaryFromReader = function(msg, reader) {
break;
case 9:
var value = /** @type {boolean} */ (reader.readBool());
msg.setPlaintextMacCommands(value);
msg.setPlaintextFOpts(value);
break;
case 10:
var value = /** @type {boolean} */ (reader.readBool());
msg.setPlaintextFrmPayload(value);
break;
default:
reader.skipField();
@ -700,13 +735,20 @@ proto.api.DownlinkFrameLog.serializeBinaryToWriter = function(message, writer) {
f
);
}
f = message.getPlaintextMacCommands();
f = message.getPlaintextFOpts();
if (f) {
writer.writeBool(
9,
f
);
}
f = message.getPlaintextFrmPayload();
if (f) {
writer.writeBool(
10,
f
);
}
};
@ -917,10 +959,10 @@ proto.api.DownlinkFrameLog.prototype.setDevEui = function(value) {
/**
* optional bool plaintext_mac_commands = 9;
* optional bool plaintext_f_opts = 9;
* @return {boolean}
*/
proto.api.DownlinkFrameLog.prototype.getPlaintextMacCommands = function() {
proto.api.DownlinkFrameLog.prototype.getPlaintextFOpts = function() {
return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 9, false));
};
@ -929,9 +971,27 @@ proto.api.DownlinkFrameLog.prototype.getPlaintextMacCommands = function() {
* @param {boolean} value
* @return {!proto.api.DownlinkFrameLog} returns this
*/
proto.api.DownlinkFrameLog.prototype.setPlaintextMacCommands = function(value) {
proto.api.DownlinkFrameLog.prototype.setPlaintextFOpts = function(value) {
return jspb.Message.setProto3BooleanField(this, 9, value);
};
/**
* optional bool plaintext_frm_payload = 10;
* @return {boolean}
*/
proto.api.DownlinkFrameLog.prototype.getPlaintextFrmPayload = function() {
return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 10, false));
};
/**
* @param {boolean} value
* @return {!proto.api.DownlinkFrameLog} returns this
*/
proto.api.DownlinkFrameLog.prototype.setPlaintextFrmPayload = function(value) {
return jspb.Message.setProto3BooleanField(this, 10, value);
};
goog.object.extend(exports, proto.api);

40
api/js/api/relay_grpc_pb.d.ts vendored Normal file
View File

@ -0,0 +1,40 @@
// GENERATED CODE -- DO NOT EDIT!
// package: api
// file: api/relay.proto
import * as api_relay_pb from "../api/relay_pb";
import * as google_protobuf_empty_pb from "google-protobuf/google/protobuf/empty_pb";
import * as grpc from "@grpc/grpc-js";
interface IRelayServiceService extends grpc.ServiceDefinition<grpc.UntypedServiceImplementation> {
list: grpc.MethodDefinition<api_relay_pb.ListRelaysRequest, api_relay_pb.ListRelaysResponse>;
addDevice: grpc.MethodDefinition<api_relay_pb.AddRelayDeviceRequest, google_protobuf_empty_pb.Empty>;
removeDevice: grpc.MethodDefinition<api_relay_pb.RemoveRelayDeviceRequest, google_protobuf_empty_pb.Empty>;
listDevices: grpc.MethodDefinition<api_relay_pb.ListRelayDevicesRequest, api_relay_pb.ListRelayDevicesResponse>;
}
export const RelayServiceService: IRelayServiceService;
export interface IRelayServiceServer extends grpc.UntypedServiceImplementation {
list: grpc.handleUnaryCall<api_relay_pb.ListRelaysRequest, api_relay_pb.ListRelaysResponse>;
addDevice: grpc.handleUnaryCall<api_relay_pb.AddRelayDeviceRequest, google_protobuf_empty_pb.Empty>;
removeDevice: grpc.handleUnaryCall<api_relay_pb.RemoveRelayDeviceRequest, google_protobuf_empty_pb.Empty>;
listDevices: grpc.handleUnaryCall<api_relay_pb.ListRelayDevicesRequest, api_relay_pb.ListRelayDevicesResponse>;
}
export class RelayServiceClient extends grpc.Client {
constructor(address: string, credentials: grpc.ChannelCredentials, options?: object);
list(argument: api_relay_pb.ListRelaysRequest, callback: grpc.requestCallback<api_relay_pb.ListRelaysResponse>): grpc.ClientUnaryCall;
list(argument: api_relay_pb.ListRelaysRequest, metadataOrOptions: grpc.Metadata | grpc.CallOptions | null, callback: grpc.requestCallback<api_relay_pb.ListRelaysResponse>): grpc.ClientUnaryCall;
list(argument: api_relay_pb.ListRelaysRequest, metadata: grpc.Metadata | null, options: grpc.CallOptions | null, callback: grpc.requestCallback<api_relay_pb.ListRelaysResponse>): grpc.ClientUnaryCall;
addDevice(argument: api_relay_pb.AddRelayDeviceRequest, callback: grpc.requestCallback<google_protobuf_empty_pb.Empty>): grpc.ClientUnaryCall;
addDevice(argument: api_relay_pb.AddRelayDeviceRequest, metadataOrOptions: grpc.Metadata | grpc.CallOptions | null, callback: grpc.requestCallback<google_protobuf_empty_pb.Empty>): grpc.ClientUnaryCall;
addDevice(argument: api_relay_pb.AddRelayDeviceRequest, metadata: grpc.Metadata | null, options: grpc.CallOptions | null, callback: grpc.requestCallback<google_protobuf_empty_pb.Empty>): grpc.ClientUnaryCall;
removeDevice(argument: api_relay_pb.RemoveRelayDeviceRequest, callback: grpc.requestCallback<google_protobuf_empty_pb.Empty>): grpc.ClientUnaryCall;
removeDevice(argument: api_relay_pb.RemoveRelayDeviceRequest, metadataOrOptions: grpc.Metadata | grpc.CallOptions | null, callback: grpc.requestCallback<google_protobuf_empty_pb.Empty>): grpc.ClientUnaryCall;
removeDevice(argument: api_relay_pb.RemoveRelayDeviceRequest, metadata: grpc.Metadata | null, options: grpc.CallOptions | null, callback: grpc.requestCallback<google_protobuf_empty_pb.Empty>): grpc.ClientUnaryCall;
listDevices(argument: api_relay_pb.ListRelayDevicesRequest, callback: grpc.requestCallback<api_relay_pb.ListRelayDevicesResponse>): grpc.ClientUnaryCall;
listDevices(argument: api_relay_pb.ListRelayDevicesRequest, metadataOrOptions: grpc.Metadata | grpc.CallOptions | null, callback: grpc.requestCallback<api_relay_pb.ListRelayDevicesResponse>): grpc.ClientUnaryCall;
listDevices(argument: api_relay_pb.ListRelayDevicesRequest, metadata: grpc.Metadata | null, options: grpc.CallOptions | null, callback: grpc.requestCallback<api_relay_pb.ListRelayDevicesResponse>): grpc.ClientUnaryCall;
}

140
api/js/api/relay_grpc_pb.js vendored Normal file
View File

@ -0,0 +1,140 @@
// GENERATED CODE -- DO NOT EDIT!
'use strict';
var grpc = require('@grpc/grpc-js');
var api_relay_pb = require('../api/relay_pb.js');
var google_api_annotations_pb = require('../google/api/annotations_pb.js');
var google_protobuf_timestamp_pb = require('google-protobuf/google/protobuf/timestamp_pb.js');
var google_protobuf_empty_pb = require('google-protobuf/google/protobuf/empty_pb.js');
function serialize_api_AddRelayDeviceRequest(arg) {
if (!(arg instanceof api_relay_pb.AddRelayDeviceRequest)) {
throw new Error('Expected argument of type api.AddRelayDeviceRequest');
}
return Buffer.from(arg.serializeBinary());
}
function deserialize_api_AddRelayDeviceRequest(buffer_arg) {
return api_relay_pb.AddRelayDeviceRequest.deserializeBinary(new Uint8Array(buffer_arg));
}
function serialize_api_ListRelayDevicesRequest(arg) {
if (!(arg instanceof api_relay_pb.ListRelayDevicesRequest)) {
throw new Error('Expected argument of type api.ListRelayDevicesRequest');
}
return Buffer.from(arg.serializeBinary());
}
function deserialize_api_ListRelayDevicesRequest(buffer_arg) {
return api_relay_pb.ListRelayDevicesRequest.deserializeBinary(new Uint8Array(buffer_arg));
}
function serialize_api_ListRelayDevicesResponse(arg) {
if (!(arg instanceof api_relay_pb.ListRelayDevicesResponse)) {
throw new Error('Expected argument of type api.ListRelayDevicesResponse');
}
return Buffer.from(arg.serializeBinary());
}
function deserialize_api_ListRelayDevicesResponse(buffer_arg) {
return api_relay_pb.ListRelayDevicesResponse.deserializeBinary(new Uint8Array(buffer_arg));
}
function serialize_api_ListRelaysRequest(arg) {
if (!(arg instanceof api_relay_pb.ListRelaysRequest)) {
throw new Error('Expected argument of type api.ListRelaysRequest');
}
return Buffer.from(arg.serializeBinary());
}
function deserialize_api_ListRelaysRequest(buffer_arg) {
return api_relay_pb.ListRelaysRequest.deserializeBinary(new Uint8Array(buffer_arg));
}
function serialize_api_ListRelaysResponse(arg) {
if (!(arg instanceof api_relay_pb.ListRelaysResponse)) {
throw new Error('Expected argument of type api.ListRelaysResponse');
}
return Buffer.from(arg.serializeBinary());
}
function deserialize_api_ListRelaysResponse(buffer_arg) {
return api_relay_pb.ListRelaysResponse.deserializeBinary(new Uint8Array(buffer_arg));
}
function serialize_api_RemoveRelayDeviceRequest(arg) {
if (!(arg instanceof api_relay_pb.RemoveRelayDeviceRequest)) {
throw new Error('Expected argument of type api.RemoveRelayDeviceRequest');
}
return Buffer.from(arg.serializeBinary());
}
function deserialize_api_RemoveRelayDeviceRequest(buffer_arg) {
return api_relay_pb.RemoveRelayDeviceRequest.deserializeBinary(new Uint8Array(buffer_arg));
}
function serialize_google_protobuf_Empty(arg) {
if (!(arg instanceof google_protobuf_empty_pb.Empty)) {
throw new Error('Expected argument of type google.protobuf.Empty');
}
return Buffer.from(arg.serializeBinary());
}
function deserialize_google_protobuf_Empty(buffer_arg) {
return google_protobuf_empty_pb.Empty.deserializeBinary(new Uint8Array(buffer_arg));
}
// RelayService is the service providing API methos for managing relays.
var RelayServiceService = exports.RelayServiceService = {
// List lists the relays for the given application id.
list: {
path: '/api.RelayService/List',
requestStream: false,
responseStream: false,
requestType: api_relay_pb.ListRelaysRequest,
responseType: api_relay_pb.ListRelaysResponse,
requestSerialize: serialize_api_ListRelaysRequest,
requestDeserialize: deserialize_api_ListRelaysRequest,
responseSerialize: serialize_api_ListRelaysResponse,
responseDeserialize: deserialize_api_ListRelaysResponse,
},
// AddDevice adds the given device to the relay.
addDevice: {
path: '/api.RelayService/AddDevice',
requestStream: false,
responseStream: false,
requestType: api_relay_pb.AddRelayDeviceRequest,
responseType: google_protobuf_empty_pb.Empty,
requestSerialize: serialize_api_AddRelayDeviceRequest,
requestDeserialize: deserialize_api_AddRelayDeviceRequest,
responseSerialize: serialize_google_protobuf_Empty,
responseDeserialize: deserialize_google_protobuf_Empty,
},
// RemoveDevice removes the given device from the relay.
removeDevice: {
path: '/api.RelayService/RemoveDevice',
requestStream: false,
responseStream: false,
requestType: api_relay_pb.RemoveRelayDeviceRequest,
responseType: google_protobuf_empty_pb.Empty,
requestSerialize: serialize_api_RemoveRelayDeviceRequest,
requestDeserialize: deserialize_api_RemoveRelayDeviceRequest,
responseSerialize: serialize_google_protobuf_Empty,
responseDeserialize: deserialize_google_protobuf_Empty,
},
// ListDevices lists the devices for the given relay.
listDevices: {
path: '/api.RelayService/ListDevices',
requestStream: false,
responseStream: false,
requestType: api_relay_pb.ListRelayDevicesRequest,
responseType: api_relay_pb.ListRelayDevicesResponse,
requestSerialize: serialize_api_ListRelayDevicesRequest,
requestDeserialize: deserialize_api_ListRelayDevicesRequest,
responseSerialize: serialize_api_ListRelayDevicesResponse,
responseDeserialize: deserialize_api_ListRelayDevicesResponse,
},
};
exports.RelayServiceClient = grpc.makeGenericClientConstructor(RelayServiceService);

218
api/js/api/relay_pb.d.ts vendored Normal file
View File

@ -0,0 +1,218 @@
// package: api
// file: api/relay.proto
import * as jspb from "google-protobuf";
import * as google_api_annotations_pb from "../google/api/annotations_pb";
import * as google_protobuf_timestamp_pb from "google-protobuf/google/protobuf/timestamp_pb";
import * as google_protobuf_empty_pb from "google-protobuf/google/protobuf/empty_pb";
export class RelayListItem extends jspb.Message {
getDevEui(): string;
setDevEui(value: string): void;
getName(): string;
setName(value: string): void;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): RelayListItem.AsObject;
static toObject(includeInstance: boolean, msg: RelayListItem): RelayListItem.AsObject;
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: RelayListItem, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): RelayListItem;
static deserializeBinaryFromReader(message: RelayListItem, reader: jspb.BinaryReader): RelayListItem;
}
export namespace RelayListItem {
export type AsObject = {
devEui: string,
name: string,
}
}
export class ListRelaysRequest extends jspb.Message {
getLimit(): number;
setLimit(value: number): void;
getOffset(): number;
setOffset(value: number): void;
getApplicationId(): string;
setApplicationId(value: string): void;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): ListRelaysRequest.AsObject;
static toObject(includeInstance: boolean, msg: ListRelaysRequest): ListRelaysRequest.AsObject;
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: ListRelaysRequest, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): ListRelaysRequest;
static deserializeBinaryFromReader(message: ListRelaysRequest, reader: jspb.BinaryReader): ListRelaysRequest;
}
export namespace ListRelaysRequest {
export type AsObject = {
limit: number,
offset: number,
applicationId: string,
}
}
export class ListRelaysResponse extends jspb.Message {
getTotalCount(): number;
setTotalCount(value: number): void;
clearResultList(): void;
getResultList(): Array<RelayListItem>;
setResultList(value: Array<RelayListItem>): void;
addResult(value?: RelayListItem, index?: number): RelayListItem;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): ListRelaysResponse.AsObject;
static toObject(includeInstance: boolean, msg: ListRelaysResponse): ListRelaysResponse.AsObject;
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: ListRelaysResponse, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): ListRelaysResponse;
static deserializeBinaryFromReader(message: ListRelaysResponse, reader: jspb.BinaryReader): ListRelaysResponse;
}
export namespace ListRelaysResponse {
export type AsObject = {
totalCount: number,
resultList: Array<RelayListItem.AsObject>,
}
}
export class AddRelayDeviceRequest extends jspb.Message {
getRelayDevEui(): string;
setRelayDevEui(value: string): void;
getDeviceDevEui(): string;
setDeviceDevEui(value: string): void;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): AddRelayDeviceRequest.AsObject;
static toObject(includeInstance: boolean, msg: AddRelayDeviceRequest): AddRelayDeviceRequest.AsObject;
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: AddRelayDeviceRequest, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): AddRelayDeviceRequest;
static deserializeBinaryFromReader(message: AddRelayDeviceRequest, reader: jspb.BinaryReader): AddRelayDeviceRequest;
}
export namespace AddRelayDeviceRequest {
export type AsObject = {
relayDevEui: string,
deviceDevEui: string,
}
}
export class RemoveRelayDeviceRequest extends jspb.Message {
getRelayDevEui(): string;
setRelayDevEui(value: string): void;
getDeviceDevEui(): string;
setDeviceDevEui(value: string): void;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): RemoveRelayDeviceRequest.AsObject;
static toObject(includeInstance: boolean, msg: RemoveRelayDeviceRequest): RemoveRelayDeviceRequest.AsObject;
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: RemoveRelayDeviceRequest, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): RemoveRelayDeviceRequest;
static deserializeBinaryFromReader(message: RemoveRelayDeviceRequest, reader: jspb.BinaryReader): RemoveRelayDeviceRequest;
}
export namespace RemoveRelayDeviceRequest {
export type AsObject = {
relayDevEui: string,
deviceDevEui: string,
}
}
export class ListRelayDevicesRequest extends jspb.Message {
getLimit(): number;
setLimit(value: number): void;
getOffset(): number;
setOffset(value: number): void;
getRelayDevEui(): string;
setRelayDevEui(value: string): void;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): ListRelayDevicesRequest.AsObject;
static toObject(includeInstance: boolean, msg: ListRelayDevicesRequest): ListRelayDevicesRequest.AsObject;
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: ListRelayDevicesRequest, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): ListRelayDevicesRequest;
static deserializeBinaryFromReader(message: ListRelayDevicesRequest, reader: jspb.BinaryReader): ListRelayDevicesRequest;
}
export namespace ListRelayDevicesRequest {
export type AsObject = {
limit: number,
offset: number,
relayDevEui: string,
}
}
export class RelayDeviceListItem extends jspb.Message {
getDevEui(): string;
setDevEui(value: string): void;
hasCreatedAt(): boolean;
clearCreatedAt(): void;
getCreatedAt(): google_protobuf_timestamp_pb.Timestamp | undefined;
setCreatedAt(value?: google_protobuf_timestamp_pb.Timestamp): void;
getName(): string;
setName(value: string): void;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): RelayDeviceListItem.AsObject;
static toObject(includeInstance: boolean, msg: RelayDeviceListItem): RelayDeviceListItem.AsObject;
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: RelayDeviceListItem, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): RelayDeviceListItem;
static deserializeBinaryFromReader(message: RelayDeviceListItem, reader: jspb.BinaryReader): RelayDeviceListItem;
}
export namespace RelayDeviceListItem {
export type AsObject = {
devEui: string,
createdAt?: google_protobuf_timestamp_pb.Timestamp.AsObject,
name: string,
}
}
export class ListRelayDevicesResponse extends jspb.Message {
getTotalCount(): number;
setTotalCount(value: number): void;
clearResultList(): void;
getResultList(): Array<RelayDeviceListItem>;
setResultList(value: Array<RelayDeviceListItem>): void;
addResult(value?: RelayDeviceListItem, index?: number): RelayDeviceListItem;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): ListRelayDevicesResponse.AsObject;
static toObject(includeInstance: boolean, msg: ListRelayDevicesResponse): ListRelayDevicesResponse.AsObject;
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: ListRelayDevicesResponse, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): ListRelayDevicesResponse;
static deserializeBinaryFromReader(message: ListRelayDevicesResponse, reader: jspb.BinaryReader): ListRelayDevicesResponse;
}
export namespace ListRelayDevicesResponse {
export type AsObject = {
totalCount: number,
resultList: Array<RelayDeviceListItem.AsObject>,
}
}

1648
api/js/api/relay_pb.js vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@ -58,6 +58,46 @@ export namespace DeviceInfo {
}
}
export class UplinkRelayRxInfo extends jspb.Message {
getDevEui(): string;
setDevEui(value: string): void;
getFrequency(): number;
setFrequency(value: number): void;
getDr(): number;
setDr(value: number): void;
getSnr(): number;
setSnr(value: number): void;
getRssi(): number;
setRssi(value: number): void;
getWorChannel(): number;
setWorChannel(value: number): void;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): UplinkRelayRxInfo.AsObject;
static toObject(includeInstance: boolean, msg: UplinkRelayRxInfo): UplinkRelayRxInfo.AsObject;
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: UplinkRelayRxInfo, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): UplinkRelayRxInfo;
static deserializeBinaryFromReader(message: UplinkRelayRxInfo, reader: jspb.BinaryReader): UplinkRelayRxInfo;
}
export namespace UplinkRelayRxInfo {
export type AsObject = {
devEui: string,
frequency: number,
dr: number,
snr: number,
rssi: number,
worChannel: number,
}
}
export class UplinkEvent extends jspb.Message {
getDeduplicationId(): string;
setDeduplicationId(value: string): void;
@ -110,6 +150,11 @@ export class UplinkEvent extends jspb.Message {
getTxInfo(): gw_gw_pb.UplinkTxInfo | undefined;
setTxInfo(value?: gw_gw_pb.UplinkTxInfo): void;
hasRelayRxInfo(): boolean;
clearRelayRxInfo(): void;
getRelayRxInfo(): UplinkRelayRxInfo | undefined;
setRelayRxInfo(value?: UplinkRelayRxInfo): void;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): UplinkEvent.AsObject;
static toObject(includeInstance: boolean, msg: UplinkEvent): UplinkEvent.AsObject;
@ -135,6 +180,7 @@ export namespace UplinkEvent {
object?: google_protobuf_struct_pb.Struct.AsObject,
rxInfoList: Array<gw_gw_pb.UplinkRxInfo.AsObject>,
txInfo?: gw_gw_pb.UplinkTxInfo.AsObject,
relayRxInfo?: UplinkRelayRxInfo.AsObject,
}
}
@ -155,6 +201,11 @@ export class JoinEvent extends jspb.Message {
getDevAddr(): string;
setDevAddr(value: string): void;
hasRelayRxInfo(): boolean;
clearRelayRxInfo(): void;
getRelayRxInfo(): UplinkRelayRxInfo | undefined;
setRelayRxInfo(value?: UplinkRelayRxInfo): void;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): JoinEvent.AsObject;
static toObject(includeInstance: boolean, msg: JoinEvent): JoinEvent.AsObject;
@ -171,6 +222,7 @@ export namespace JoinEvent {
time?: google_protobuf_timestamp_pb.Timestamp.AsObject,
deviceInfo?: DeviceInfo.AsObject,
devAddr: string,
relayRxInfo?: UplinkRelayRxInfo.AsObject,
}
}
@ -505,6 +557,7 @@ export interface LogCodeMap {
UPLINK_MIC: 6;
UPLINK_F_CNT_RETRANSMISSION: 7;
DOWNLINK_GATEWAY: 8;
RELAY_NEW_END_DEVICE: 9;
}
export const LogCode: LogCodeMap;

View File

@ -32,6 +32,7 @@ goog.exportSymbol('proto.integration.LogLevel', null, global);
goog.exportSymbol('proto.integration.StatusEvent', null, global);
goog.exportSymbol('proto.integration.TxAckEvent', null, global);
goog.exportSymbol('proto.integration.UplinkEvent', null, global);
goog.exportSymbol('proto.integration.UplinkRelayRxInfo', null, global);
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
@ -53,6 +54,27 @@ if (goog.DEBUG && !COMPILED) {
*/
proto.integration.DeviceInfo.displayName = 'proto.integration.DeviceInfo';
}
/**
* 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.integration.UplinkRelayRxInfo = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.integration.UplinkRelayRxInfo, jspb.Message);
if (goog.DEBUG && !COMPILED) {
/**
* @public
* @override
*/
proto.integration.UplinkRelayRxInfo.displayName = 'proto.integration.UplinkRelayRxInfo';
}
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
@ -616,6 +638,286 @@ proto.integration.DeviceInfo.prototype.clearTagsMap = function() {
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.integration.UplinkRelayRxInfo.prototype.toObject = function(opt_includeInstance) {
return proto.integration.UplinkRelayRxInfo.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.integration.UplinkRelayRxInfo} msg The msg instance to transform.
* @return {!Object}
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.integration.UplinkRelayRxInfo.toObject = function(includeInstance, msg) {
var f, obj = {
devEui: jspb.Message.getFieldWithDefault(msg, 1, ""),
frequency: jspb.Message.getFieldWithDefault(msg, 2, 0),
dr: jspb.Message.getFieldWithDefault(msg, 3, 0),
snr: jspb.Message.getFieldWithDefault(msg, 4, 0),
rssi: jspb.Message.getFieldWithDefault(msg, 5, 0),
worChannel: jspb.Message.getFieldWithDefault(msg, 6, 0)
};
if (includeInstance) {
obj.$jspbMessageInstance = msg;
}
return obj;
};
}
/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
* @return {!proto.integration.UplinkRelayRxInfo}
*/
proto.integration.UplinkRelayRxInfo.deserializeBinary = function(bytes) {
var reader = new jspb.BinaryReader(bytes);
var msg = new proto.integration.UplinkRelayRxInfo;
return proto.integration.UplinkRelayRxInfo.deserializeBinaryFromReader(msg, reader);
};
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
* @param {!proto.integration.UplinkRelayRxInfo} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
* @return {!proto.integration.UplinkRelayRxInfo}
*/
proto.integration.UplinkRelayRxInfo.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.setDevEui(value);
break;
case 2:
var value = /** @type {number} */ (reader.readUint32());
msg.setFrequency(value);
break;
case 3:
var value = /** @type {number} */ (reader.readUint32());
msg.setDr(value);
break;
case 4:
var value = /** @type {number} */ (reader.readInt32());
msg.setSnr(value);
break;
case 5:
var value = /** @type {number} */ (reader.readInt32());
msg.setRssi(value);
break;
case 6:
var value = /** @type {number} */ (reader.readUint32());
msg.setWorChannel(value);
break;
default:
reader.skipField();
break;
}
}
return msg;
};
/**
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
proto.integration.UplinkRelayRxInfo.prototype.serializeBinary = function() {
var writer = new jspb.BinaryWriter();
proto.integration.UplinkRelayRxInfo.serializeBinaryToWriter(this, writer);
return writer.getResultBuffer();
};
/**
* Serializes the given message to binary data (in protobuf wire
* format), writing to the given BinaryWriter.
* @param {!proto.integration.UplinkRelayRxInfo} message
* @param {!jspb.BinaryWriter} writer
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.integration.UplinkRelayRxInfo.serializeBinaryToWriter = function(message, writer) {
var f = undefined;
f = message.getDevEui();
if (f.length > 0) {
writer.writeString(
1,
f
);
}
f = message.getFrequency();
if (f !== 0) {
writer.writeUint32(
2,
f
);
}
f = message.getDr();
if (f !== 0) {
writer.writeUint32(
3,
f
);
}
f = message.getSnr();
if (f !== 0) {
writer.writeInt32(
4,
f
);
}
f = message.getRssi();
if (f !== 0) {
writer.writeInt32(
5,
f
);
}
f = message.getWorChannel();
if (f !== 0) {
writer.writeUint32(
6,
f
);
}
};
/**
* optional string dev_eui = 1;
* @return {string}
*/
proto.integration.UplinkRelayRxInfo.prototype.getDevEui = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
};
/**
* @param {string} value
* @return {!proto.integration.UplinkRelayRxInfo} returns this
*/
proto.integration.UplinkRelayRxInfo.prototype.setDevEui = function(value) {
return jspb.Message.setProto3StringField(this, 1, value);
};
/**
* optional uint32 frequency = 2;
* @return {number}
*/
proto.integration.UplinkRelayRxInfo.prototype.getFrequency = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0));
};
/**
* @param {number} value
* @return {!proto.integration.UplinkRelayRxInfo} returns this
*/
proto.integration.UplinkRelayRxInfo.prototype.setFrequency = function(value) {
return jspb.Message.setProto3IntField(this, 2, value);
};
/**
* optional uint32 dr = 3;
* @return {number}
*/
proto.integration.UplinkRelayRxInfo.prototype.getDr = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0));
};
/**
* @param {number} value
* @return {!proto.integration.UplinkRelayRxInfo} returns this
*/
proto.integration.UplinkRelayRxInfo.prototype.setDr = function(value) {
return jspb.Message.setProto3IntField(this, 3, value);
};
/**
* optional int32 snr = 4;
* @return {number}
*/
proto.integration.UplinkRelayRxInfo.prototype.getSnr = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0));
};
/**
* @param {number} value
* @return {!proto.integration.UplinkRelayRxInfo} returns this
*/
proto.integration.UplinkRelayRxInfo.prototype.setSnr = function(value) {
return jspb.Message.setProto3IntField(this, 4, value);
};
/**
* optional int32 rssi = 5;
* @return {number}
*/
proto.integration.UplinkRelayRxInfo.prototype.getRssi = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 5, 0));
};
/**
* @param {number} value
* @return {!proto.integration.UplinkRelayRxInfo} returns this
*/
proto.integration.UplinkRelayRxInfo.prototype.setRssi = function(value) {
return jspb.Message.setProto3IntField(this, 5, value);
};
/**
* optional uint32 wor_channel = 6;
* @return {number}
*/
proto.integration.UplinkRelayRxInfo.prototype.getWorChannel = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 6, 0));
};
/**
* @param {number} value
* @return {!proto.integration.UplinkRelayRxInfo} returns this
*/
proto.integration.UplinkRelayRxInfo.prototype.setWorChannel = function(value) {
return jspb.Message.setProto3IntField(this, 6, value);
};
/**
* List of repeated fields within this message type.
* @private {!Array<number>}
@ -667,7 +969,8 @@ proto.integration.UplinkEvent.toObject = function(includeInstance, msg) {
object: (f = msg.getObject()) && google_protobuf_struct_pb.Struct.toObject(includeInstance, f),
rxInfoList: jspb.Message.toObjectList(msg.getRxInfoList(),
gw_gw_pb.UplinkRxInfo.toObject, includeInstance),
txInfo: (f = msg.getTxInfo()) && gw_gw_pb.UplinkTxInfo.toObject(includeInstance, f)
txInfo: (f = msg.getTxInfo()) && gw_gw_pb.UplinkTxInfo.toObject(includeInstance, f),
relayRxInfo: (f = msg.getRelayRxInfo()) && proto.integration.UplinkRelayRxInfo.toObject(includeInstance, f)
};
if (includeInstance) {
@ -761,6 +1064,11 @@ proto.integration.UplinkEvent.deserializeBinaryFromReader = function(msg, reader
reader.readMessage(value,gw_gw_pb.UplinkTxInfo.deserializeBinaryFromReader);
msg.setTxInfo(value);
break;
case 14:
var value = new proto.integration.UplinkRelayRxInfo;
reader.readMessage(value,proto.integration.UplinkRelayRxInfo.deserializeBinaryFromReader);
msg.setRelayRxInfo(value);
break;
default:
reader.skipField();
break;
@ -886,6 +1194,14 @@ proto.integration.UplinkEvent.serializeBinaryToWriter = function(message, writer
gw_gw_pb.UplinkTxInfo.serializeBinaryToWriter
);
}
f = message.getRelayRxInfo();
if (f != null) {
writer.writeMessage(
14,
f,
proto.integration.UplinkRelayRxInfo.serializeBinaryToWriter
);
}
};
@ -1243,6 +1559,43 @@ proto.integration.UplinkEvent.prototype.hasTxInfo = function() {
};
/**
* optional UplinkRelayRxInfo relay_rx_info = 14;
* @return {?proto.integration.UplinkRelayRxInfo}
*/
proto.integration.UplinkEvent.prototype.getRelayRxInfo = function() {
return /** @type{?proto.integration.UplinkRelayRxInfo} */ (
jspb.Message.getWrapperField(this, proto.integration.UplinkRelayRxInfo, 14));
};
/**
* @param {?proto.integration.UplinkRelayRxInfo|undefined} value
* @return {!proto.integration.UplinkEvent} returns this
*/
proto.integration.UplinkEvent.prototype.setRelayRxInfo = function(value) {
return jspb.Message.setWrapperField(this, 14, value);
};
/**
* Clears the message field making it undefined.
* @return {!proto.integration.UplinkEvent} returns this
*/
proto.integration.UplinkEvent.prototype.clearRelayRxInfo = function() {
return this.setRelayRxInfo(undefined);
};
/**
* Returns whether this field is set.
* @return {boolean}
*/
proto.integration.UplinkEvent.prototype.hasRelayRxInfo = function() {
return jspb.Message.getField(this, 14) != null;
};
@ -1278,7 +1631,8 @@ proto.integration.JoinEvent.toObject = function(includeInstance, msg) {
deduplicationId: jspb.Message.getFieldWithDefault(msg, 1, ""),
time: (f = msg.getTime()) && google_protobuf_timestamp_pb.Timestamp.toObject(includeInstance, f),
deviceInfo: (f = msg.getDeviceInfo()) && proto.integration.DeviceInfo.toObject(includeInstance, f),
devAddr: jspb.Message.getFieldWithDefault(msg, 4, "")
devAddr: jspb.Message.getFieldWithDefault(msg, 4, ""),
relayRxInfo: (f = msg.getRelayRxInfo()) && proto.integration.UplinkRelayRxInfo.toObject(includeInstance, f)
};
if (includeInstance) {
@ -1333,6 +1687,11 @@ proto.integration.JoinEvent.deserializeBinaryFromReader = function(msg, reader)
var value = /** @type {string} */ (reader.readString());
msg.setDevAddr(value);
break;
case 5:
var value = new proto.integration.UplinkRelayRxInfo;
reader.readMessage(value,proto.integration.UplinkRelayRxInfo.deserializeBinaryFromReader);
msg.setRelayRxInfo(value);
break;
default:
reader.skipField();
break;
@ -1392,6 +1751,14 @@ proto.integration.JoinEvent.serializeBinaryToWriter = function(message, writer)
f
);
}
f = message.getRelayRxInfo();
if (f != null) {
writer.writeMessage(
5,
f,
proto.integration.UplinkRelayRxInfo.serializeBinaryToWriter
);
}
};
@ -1505,6 +1872,43 @@ proto.integration.JoinEvent.prototype.setDevAddr = function(value) {
};
/**
* optional UplinkRelayRxInfo relay_rx_info = 5;
* @return {?proto.integration.UplinkRelayRxInfo}
*/
proto.integration.JoinEvent.prototype.getRelayRxInfo = function() {
return /** @type{?proto.integration.UplinkRelayRxInfo} */ (
jspb.Message.getWrapperField(this, proto.integration.UplinkRelayRxInfo, 5));
};
/**
* @param {?proto.integration.UplinkRelayRxInfo|undefined} value
* @return {!proto.integration.JoinEvent} returns this
*/
proto.integration.JoinEvent.prototype.setRelayRxInfo = function(value) {
return jspb.Message.setWrapperField(this, 5, value);
};
/**
* Clears the message field making it undefined.
* @return {!proto.integration.JoinEvent} returns this
*/
proto.integration.JoinEvent.prototype.clearRelayRxInfo = function() {
return this.setRelayRxInfo(undefined);
};
/**
* Returns whether this field is set.
* @return {boolean}
*/
proto.integration.JoinEvent.prototype.hasRelayRxInfo = function() {
return jspb.Message.getField(this, 5) != null;
};
@ -3849,7 +4253,8 @@ proto.integration.LogCode = {
UPLINK_F_CNT_RESET: 5,
UPLINK_MIC: 6,
UPLINK_F_CNT_RETRANSMISSION: 7,
DOWNLINK_GATEWAY: 8
DOWNLINK_GATEWAY: 8,
RELAY_NEW_END_DEVICE: 9
};
goog.object.extend(exports, proto.integration);

108
api/md/api/api.md vendored
View File

@ -149,8 +149,11 @@
- [Measurement](#api-Measurement)
- [UpdateDeviceProfileRequest](#api-UpdateDeviceProfileRequest)
- [CadPeriodicity](#api-CadPeriodicity)
- [CodecRuntime](#api-CodecRuntime)
- [MeasurementKind](#api-MeasurementKind)
- [RelayModeActivation](#api-RelayModeActivation)
- [SecondChAckOffset](#api-SecondChAckOffset)
- [DeviceProfileService](#api-DeviceProfileService)
@ -1722,6 +1725,7 @@ applications.
| is_disabled | [bool](#bool) | | Device is disabled. |
| variables | [Device.VariablesEntry](#api-Device-VariablesEntry) | repeated | Variables (user defined). These variables can be used together with integrations to store tokens / secrets that must be configured per device. These variables are not exposed in the event payloads. |
| tags | [Device.TagsEntry](#api-Device-TagsEntry) | repeated | Tags (user defined). These tags are exposed in the event payloads or to integration. Tags are intended for aggregation and filtering. |
| join_eui | [string](#string) | | JoinEUI (optional, EUI64). This field will be automatically set / updated on OTAA. However, in some cases it must be pre-configured. For example to allow OTAA using a Relay. In this case the Relay needs to know the JoinEUI &#43; DevEUI combinations of the devices for which it needs to forward uplinks. |
@ -2409,6 +2413,58 @@ The actual number of ping-slots per beacon period equals to 2^k. |
| measurements | [DeviceProfile.MeasurementsEntry](#api-DeviceProfile-MeasurementsEntry) | repeated | Measurements. If defined, ChirpStack will visualize these metrics in the web-interface. |
| auto_detect_measurements | [bool](#bool) | | Auto-detect measurements. If set to true, measurements will be automatically added based on the keys of the decoded payload. In cases where the decoded payload contains random keys in the data, you want to set this to false. |
| region_config_id | [string](#string) | | Region configuration ID. If set, devices will only use the associated region. If let blank, then devices will use all regions matching the selected common-name. Note that multiple region configurations can exist for the same common-name, e.g. to provide an 8 channel and 16 channel configuration for the US915 band. |
| is_relay | [bool](#bool) | | Device is a Relay device. Enable this in case the device is a Relay. A Relay device implements TS011 and is able to relay data from relay capable devices. See for more information the TS011 specification. |
| is_relay_ed | [bool](#bool) | | Device is a Relay end-device. Enable this in case the device is an end-device that can operate under a Relay. Please refer to the TS011 specification for more information. |
| relay_ed_relay_only | [bool](#bool) | | End-device only accept data through relay. Only accept data for this device through a relay. This setting is useful for testing as in case of a test-setup, the end-device is usually within range of the gateway. |
| relay_enabled | [bool](#bool) | | Relay must be enabled. |
| relay_cad_periodicity | [CadPeriodicity](#api-CadPeriodicity) | | Relay CAD periodicity. |
| relay_default_channel_index | [uint32](#uint32) | | Relay default channel index. Valid values are 0 and 1, please refer to the RP002 specification for the meaning of these values. |
| relay_second_channel_freq | [uint32](#uint32) | | Relay second channel frequency (Hz). |
| relay_second_channel_dr | [uint32](#uint32) | | Relay second channel DR. |
| relay_second_channel_ack_offset | [SecondChAckOffset](#api-SecondChAckOffset) | | Relay second channel ACK offset. |
| relay_ed_activation_mode | [RelayModeActivation](#api-RelayModeActivation) | | Relay end-device activation mode. |
| relay_ed_smart_enable_level | [uint32](#uint32) | | Relay end-device smart-enable level. |
| relay_ed_back_off | [uint32](#uint32) | | Relay end-device back-off (in case it does not receive WOR ACK frame). 0 = Always send a LoRaWAN uplink 1..63 = Send a LoRaWAN uplink after X WOR frames without a WOR ACK |
| relay_ed_uplink_limit_bucket_size | [uint32](#uint32) | | Relay end-device uplink limit bucket size.
This field indicates the multiplier to determine the bucket size according to the following formula: BucketSize TOKEN = _reload_rate x _bucket_size
Valid values (0 - 3): 0 = 1 1 = 2 2 = 4 3 = 12 |
| relay_ed_uplink_limit_reload_rate | [uint32](#uint32) | | Relay end-device uplink limit reload rate.
Valid values: * 0 - 62 = X tokens every hour * 63 = no limitation |
| relay_join_req_limit_reload_rate | [uint32](#uint32) | | Relay join-request limit reload rate.
Valid values: * 0 - 126 = X tokens every hour * 127 = no limitation |
| relay_notify_limit_reload_rate | [uint32](#uint32) | | Relay notify limit reload rate.
Valid values: * 0 - 126 = X tokens every hour * 127 = no limitation |
| relay_global_uplink_limit_reload_rate | [uint32](#uint32) | | Relay global uplink limit reload rate.
Valid values: * 0 - 126 = X tokens every hour * 127 = no limitation |
| relay_overall_limit_reload_rate | [uint32](#uint32) | | Relay overall limit reload rate.
Valid values: * 0 - 126 = X tokens every hour * 127 = no limitation |
| relay_join_req_limit_bucket_size | [uint32](#uint32) | | Relay join-request limit bucket size.
This field indicates the multiplier to determine the bucket size according to the following formula: BucketSize TOKEN = _reload_rate x _bucket_size
Valid values (0 - 3): 0 = 1 1 = 2 2 = 4 3 = 12 |
| relay_notify_limit_bucket_size | [uint32](#uint32) | | Relay notify limit bucket size.
This field indicates the multiplier to determine the bucket size according to the following formula: BucketSize TOKEN = _reload_rate x _bucket_size
Valid values (0 - 3): 0 = 1 1 = 2 2 = 4 3 = 12 |
| relay_global_uplink_limit_bucket_size | [uint32](#uint32) | | Relay globak uplink limit bucket size.
This field indicates the multiplier to determine the bucket size according to the following formula: BucketSize TOKEN = _reload_rate x _bucket_size
Valid values (0 - 3): 0 = 1 1 = 2 2 = 4 3 = 12 |
| relay_overall_limit_bucket_size | [uint32](#uint32) | | Relay overall limit bucket size.
This field indicates the multiplier to determine the bucket size according to the following formula: BucketSize TOKEN = _reload_rate x _bucket_size
Valid values (0 - 3): 0 = 1 1 = 2 2 = 4 3 = 12 |
@ -2586,6 +2642,22 @@ The actual number of ping-slots per beacon period equals to 2^k. |
<a name="api-CadPeriodicity"></a>
### CadPeriodicity
| Name | Number | Description |
| ---- | ------ | ----------- |
| SEC_1 | 0 | 1 second. |
| MS_500 | 1 | 500 milliseconds |
| MS_250 | 2 | 250 milliseconds |
| MS_100 | 3 | 100 milliseconds |
| MS_50 | 4 | 50 milliseconds |
| MS_20 | 5 | 20 milliseconds |
<a name="api-CodecRuntime"></a>
### CodecRuntime
@ -2614,6 +2686,36 @@ The actual number of ping-slots per beacon period equals to 2^k. |
<a name="api-RelayModeActivation"></a>
### RelayModeActivation
| Name | Number | Description |
| ---- | ------ | ----------- |
| DISABLE_RELAY_MODE | 0 | Disable the relay mode. |
| ENABLE_RELAY_MODE | 1 | Enable the relay model. |
| DYNAMIC | 2 | Dynamic. |
| END_DEVICE_CONTROLLED | 3 | End-device controlled. |
<a name="api-SecondChAckOffset"></a>
### SecondChAckOffset
| Name | Number | Description |
| ---- | ------ | ----------- |
| KHZ_0 | 0 | 0 kHz. |
| KHZ_200 | 1 | 200 kHz. |
| KHZ_400 | 2 | 400 kHz. |
| KHZ_800 | 3 | 800 kHz. |
| KHZ_1600 | 4 | 1600 kHz. |
| KHZ_3200 | 5 | 3200 kHz. |
@ -2659,7 +2761,8 @@ DeviceProfileService is the service providing API methods for managing device-pr
| m_type | [common.MType](#common-MType) | | Message type. |
| dev_addr | [string](#string) | | Device address (optional). |
| dev_eui | [string](#string) | | Device EUI (optional). |
| plaintext_mac_commands | [bool](#bool) | | Plaintext mac-commands. |
| plaintext_f_opts | [bool](#bool) | | Plaintext f_opts mac-commands. |
| plaintext_frm_payload | [bool](#bool) | | Plaintext frm_payload. |
@ -2681,7 +2784,8 @@ DeviceProfileService is the service providing API methods for managing device-pr
| dev_addr | [string](#string) | | Device address (optional). |
| dev_eui | [string](#string) | | Device EUI (optional). |
| time | [google.protobuf.Timestamp](#google-protobuf-Timestamp) | | Time. |
| plaintext_mac_commands | [bool](#bool) | | Plaintext mac-commands. |
| plaintext_f_opts | [bool](#bool) | | Plaintext f_opts mac-commands. |
| plaintext_frm_payload | [bool](#bool) | | Plaintext frm_payload. |

View File

@ -190,6 +190,13 @@ message Device {
// These tags are exposed in the event payloads or to integration. Tags are
// intended for aggregation and filtering.
map<string, string> tags = 9;
// JoinEUI (optional, EUI64).
// This field will be automatically set / updated on OTAA. However, in some
// cases it must be pre-configured. For example to allow OTAA using a Relay.
// In this case the Relay needs to know the JoinEUI + DevEUI combinations
// of the devices for which it needs to forward uplinks.
string join_eui = 10;
}
message DeviceStatus {

View File

@ -41,6 +41,61 @@ enum MeasurementKind {
STRING = 4;
}
enum CadPeriodicity {
// 1 second.
SEC_1 = 0;
// 500 milliseconds
MS_500 = 1;
// 250 milliseconds
MS_250 = 2;
// 100 milliseconds
MS_100 = 3;
// 50 milliseconds
MS_50 = 4;
// 20 milliseconds
MS_20 = 5;
}
enum SecondChAckOffset {
// 0 kHz.
KHZ_0 = 0;
// 200 kHz.
KHZ_200 = 1;
// 400 kHz.
KHZ_400 = 2;
// 800 kHz.
KHZ_800 = 3;
// 1600 kHz.
KHZ_1600 = 4;
// 3200 kHz.
KHZ_3200 = 5;
}
enum RelayModeActivation {
// Disable the relay mode.
DISABLE_RELAY_MODE = 0;
// Enable the relay model.
ENABLE_RELAY_MODE = 1;
// Dynamic.
DYNAMIC = 2;
// End-device controlled.
END_DEVICE_CONTROLLED = 3;
}
// DeviceProfileService is the service providing API methods for managing device-profiles.
service DeviceProfileService {
// Create the given device-profile.
@ -195,6 +250,154 @@ message DeviceProfile {
// e.g. to provide an 8 channel and 16 channel configuration for the US915
// band.
string region_config_id = 29;
// Device is a Relay device.
// Enable this in case the device is a Relay. A Relay device implements TS011
// and is able to relay data from relay capable devices.
// See for more information the TS011 specification.
bool is_relay = 30;
// Device is a Relay end-device.
// Enable this in case the device is an end-device that can operate under a
// Relay. Please refer to the TS011 specification for more information.
bool is_relay_ed = 31;
// End-device only accept data through relay.
// Only accept data for this device through a relay. This setting is useful
// for testing as in case of a test-setup, the end-device is usually within
// range of the gateway.
bool relay_ed_relay_only = 32;
// Relay must be enabled.
bool relay_enabled = 33;
// Relay CAD periodicity.
CadPeriodicity relay_cad_periodicity = 34;
// Relay default channel index.
// Valid values are 0 and 1, please refer to the RP002 specification for
// the meaning of these values.
uint32 relay_default_channel_index = 35;
// Relay second channel frequency (Hz).
uint32 relay_second_channel_freq = 36;
// Relay second channel DR.
uint32 relay_second_channel_dr = 37;
// Relay second channel ACK offset.
SecondChAckOffset relay_second_channel_ack_offset = 38;
// Relay end-device activation mode.
RelayModeActivation relay_ed_activation_mode = 39;
// Relay end-device smart-enable level.
uint32 relay_ed_smart_enable_level = 40;
// Relay end-device back-off (in case it does not receive WOR ACK frame).
// 0 = Always send a LoRaWAN uplink
// 1..63 = Send a LoRaWAN uplink after X WOR frames without a WOR ACK
uint32 relay_ed_back_off = 41;
// Relay end-device uplink limit bucket size.
//
// This field indicates the multiplier to determine the bucket size
// according to the following formula:
// BucketSize TOKEN = _reload_rate x _bucket_size
//
// Valid values (0 - 3):
// 0 = 1
// 1 = 2
// 2 = 4
// 3 = 12
uint32 relay_ed_uplink_limit_bucket_size = 42;
// Relay end-device uplink limit reload rate.
//
// Valid values:
// * 0 - 62 = X tokens every hour
// * 63 = no limitation
uint32 relay_ed_uplink_limit_reload_rate = 43;
// Relay join-request limit reload rate.
//
// Valid values:
// * 0 - 126 = X tokens every hour
// * 127 = no limitation
uint32 relay_join_req_limit_reload_rate = 44;
// Relay notify limit reload rate.
//
// Valid values:
// * 0 - 126 = X tokens every hour
// * 127 = no limitation
uint32 relay_notify_limit_reload_rate = 45;
// Relay global uplink limit reload rate.
//
// Valid values:
// * 0 - 126 = X tokens every hour
// * 127 = no limitation
uint32 relay_global_uplink_limit_reload_rate = 46;
// Relay overall limit reload rate.
//
// Valid values:
// * 0 - 126 = X tokens every hour
// * 127 = no limitation
uint32 relay_overall_limit_reload_rate = 47;
// Relay join-request limit bucket size.
//
// This field indicates the multiplier to determine the bucket size
// according to the following formula:
// BucketSize TOKEN = _reload_rate x _bucket_size
//
// Valid values (0 - 3):
// 0 = 1
// 1 = 2
// 2 = 4
// 3 = 12
uint32 relay_join_req_limit_bucket_size = 48;
// Relay notify limit bucket size.
//
// This field indicates the multiplier to determine the bucket size
// according to the following formula:
// BucketSize TOKEN = _reload_rate x _bucket_size
//
// Valid values (0 - 3):
// 0 = 1
// 1 = 2
// 2 = 4
// 3 = 12
uint32 relay_notify_limit_bucket_size = 49;
// Relay globak uplink limit bucket size.
//
// This field indicates the multiplier to determine the bucket size
// according to the following formula:
// BucketSize TOKEN = _reload_rate x _bucket_size
//
// Valid values (0 - 3):
// 0 = 1
// 1 = 2
// 2 = 4
// 3 = 12
uint32 relay_global_uplink_limit_bucket_size = 50;
// Relay overall limit bucket size.
//
// This field indicates the multiplier to determine the bucket size
// according to the following formula:
// BucketSize TOKEN = _reload_rate x _bucket_size
//
// Valid values (0 - 3):
// 0 = 1
// 1 = 2
// 2 = 4
// 3 = 12
uint32 relay_overall_limit_bucket_size = 51;
}
message Measurement {

View File

@ -34,8 +34,11 @@ message UplinkFrameLog {
// Time.
google.protobuf.Timestamp time = 7;
// Plaintext mac-commands.
bool plaintext_mac_commands = 8;
// Plaintext f_opts mac-commands.
bool plaintext_f_opts = 8;
// Plaintext frm_payload.
bool plaintext_frm_payload = 9;
}
message DownlinkFrameLog {
@ -63,6 +66,9 @@ message DownlinkFrameLog {
// Device EUI (optional).
string dev_eui = 8;
// Plaintext mac-commands.
bool plaintext_mac_commands = 9;
// Plaintext f_opts mac-commands.
bool plaintext_f_opts = 9;
// Plaintext frm_payload.
bool plaintext_frm_payload = 10;
}

119
api/proto/api/relay.proto vendored Normal file
View File

@ -0,0 +1,119 @@
syntax = "proto3";
package api;
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 = "RelayProto";
option csharp_namespace = "Chirpstack.Api";
import "google/api/annotations.proto";
import "google/protobuf/timestamp.proto";
import "google/protobuf/empty.proto";
// RelayService is the service providing API methos for managing relays.
service RelayService {
// List lists the relays for the given application id.
rpc List(ListRelaysRequest) returns (ListRelaysResponse) {
option(google.api.http) = {
get: "/api/relays"
};
}
// AddDevice adds the given device to the relay.
rpc AddDevice(AddRelayDeviceRequest) returns (google.protobuf.Empty) {
option(google.api.http) = {
post: "/api/relays/{relay_dev_eui}/devices"
body: "*"
};
}
// RemoveDevice removes the given device from the relay.
rpc RemoveDevice(RemoveRelayDeviceRequest) returns (google.protobuf.Empty) {
option(google.api.http) = {
delete: "/api/relays/{relay_dev_eui}/devices/{dev_eui}"
};
};
// ListDevices lists the devices for the given relay.
rpc ListDevices(ListRelayDevicesRequest) returns (ListRelayDevicesResponse) {
option(google.api.http) = {
get: "/api/relays/{relay_dev_eui}/devices"
};
};
}
message RelayListItem {
// DevEUI (EUI64).
string dev_eui = 1;
// Name.
string name = 2;
}
message ListRelaysRequest {
// Max number of devices to return in the result-set.
uint32 limit = 1;
// Offset in the result-set (for pagination).
uint32 offset = 2;
// Application ID (UUID).
string application_id = 3;
}
message ListRelaysResponse {
// Total number of relays.
uint32 total_count = 1;
// Result-set.
repeated RelayListItem result = 2;
}
message AddRelayDeviceRequest {
// Relay DevEUI (EUI64).
string relay_dev_eui = 1;
// Device DevEUI (EUI64).
string device_dev_eui = 2;
}
message RemoveRelayDeviceRequest {
// Relay DevEUI (EUI64).
string relay_dev_eui = 1;
// Device DevEUI (EUI64).
string device_dev_eui = 2;
}
message ListRelayDevicesRequest {
// Max number of multicast groups to return in the result-set.
uint32 limit = 1;
// Offset in the result-set (for pagination).
uint32 offset = 2;
// Relay DevEUI (EUI64).
string relay_dev_eui = 3;
}
message RelayDeviceListItem {
// DevEUI (EUI64).
string dev_eui = 1;
// Created at timestamp.
google.protobuf.Timestamp created_at = 2;
// Device name.
string name = 3;
}
message ListRelayDevicesResponse {
// Total number of devices.
uint32 total_count = 1;
// Result-set.
repeated RelayDeviceListItem result = 2;
}

17
api/proto/gw/gw.proto vendored
View File

@ -13,7 +13,6 @@ import "google/protobuf/timestamp.proto";
import "google/protobuf/duration.proto";
import "google/protobuf/struct.proto";
enum CodeRate {
CR_UNDEFINED = 0;
CR_4_5 = 1; // LoRa
@ -70,13 +69,15 @@ enum TxAckStatus {
// Packet has been programmed for downlink.
OK = 1;
// Rejected because it was already too late to program this packet for downlink.
// Rejected because it was already too late to program this packet for
// downlink.
TOO_LATE = 2;
// Rejected because downlink packet timestamp is too much in advance.
TOO_EARLY = 3;
// Rejected because there was already a packet programmed in requested timeframe.
// Rejected because there was already a packet programmed in requested
// timeframe.
COLLISION_PACKET = 4;
// Rejected because there was already a beacon planned in requested timeframe.
@ -298,7 +299,8 @@ message UplinkRxInfoLegacy {
bytes context = 15;
// Uplink ID (UUID bytes).
// Unique and random ID which can be used to correlate the uplink across multiple logs.
// Unique and random ID which can be used to correlate the uplink across
// multiple logs.
bytes uplink_id = 16;
// CRC status.
@ -446,10 +448,10 @@ message ImmediatelyTimingInfo {
// Not implemented yet.
}
message DelayTimingInfo {
// Delay (duration).
// The delay will be added to the gateway internal timing, provided by the context object.
// The delay will be added to the gateway internal timing, provided by the
// context object.
google.protobuf.Duration delay = 1;
}
@ -618,7 +620,8 @@ message GatewayCommandExecRequest {
string gateway_id = 6;
// Command to execute.
// This command must be pre-configured in the LoRa Gateway Bridge configuration.
// This command must be pre-configured in the LoRa Gateway Bridge
// configuration.
string command = 2;
// Execution request ID.

View File

@ -52,6 +52,9 @@ enum LogCode {
// Downlink gateway error.
DOWNLINK_GATEWAY = 8;
// Relay new end-device.
RELAY_NEW_END_DEVICE = 9;
}
// Device information.
@ -84,6 +87,27 @@ message DeviceInfo {
map<string, string> tags = 9;
}
// Uplink relay RX information.
message UplinkRelayRxInfo {
// Relay DevEUI.
string dev_eui = 1;
// Frequency.
uint32 frequency = 2;
// Data-rate.
uint32 dr = 3;
// SNR.
int32 snr = 4;
// RSSI.
int32 rssi = 5;
// WOR channel.
uint32 wor_channel = 6;
}
// UplinkEvent is the message sent when an uplink payload has been received.
message UplinkEvent {
// Deduplication ID (UUID).
@ -116,7 +140,8 @@ message UplinkEvent {
// FRMPayload data.
bytes data = 10;
// Note that this is only set when a codec is configured in the Device Profile.
// Note that this is only set when a codec is configured in the Device
// Profile.
google.protobuf.Struct object = 11;
// Receiving gateway RX info.
@ -124,6 +149,9 @@ message UplinkEvent {
// TX info.
gw.UplinkTxInfo tx_info = 13;
// Relay info.
UplinkRelayRxInfo relay_rx_info = 14;
}
// JoinEvent is the message sent when a device joined the network.
@ -140,6 +168,9 @@ message JoinEvent {
// Device address.
string dev_addr = 4;
// Relay info.
UplinkRelayRxInfo relay_rx_info = 5;
}
// AckEvent is the message sent when a confirmation on a confirmed downlink
@ -164,9 +195,9 @@ message AckEvent {
uint32 f_cnt_down = 6;
}
// TxAckEvent is the message sent when a downlink was acknowledged by the gateway
// for transmission. As a downlink can be scheduled in the future, this event
// does not confirm that the message has already been transmitted.
// TxAckEvent is the message sent when a downlink was acknowledged by the
// gateway for transmission. As a downlink can be scheduled in the future, this
// event does not confirm that the message has already been transmitted.
message TxAckEvent {
// Downlink ID.
uint32 downlink_id = 1;

View File

@ -40,7 +40,8 @@ message DeviceSession {
// Downlink frame-counter (as).
uint32 a_f_cnt_down = 11;
// Frame-counter holding the last confirmed downlink frame (n_f_cnt_down or a_f_cnt_down).
// Frame-counter holding the last confirmed downlink frame (n_f_cnt_down or
// a_f_cnt_down).
uint32 conf_f_cnt = 12;
// Skip uplink frame-counter validation.
@ -137,6 +138,9 @@ message DeviceSession {
// Region configuration ID.
string region_config_id = 40;
// Relay state.
Relay relay = 41;
}
message UplinkAdrHistory {
@ -156,6 +160,127 @@ message UplinkAdrHistory {
uint32 gateway_count = 4;
}
message Relay {
// Devices provisioned on the relay.
repeated RelayDevice devices = 1;
// Filter list.
repeated RelayFilter filters = 2;
// Relay is enabled.
bool enabled = 3;
// CAD periodicity.
uint32 cad_periodicity = 4;
// Default channel index.
uint32 default_channel_index = 5;
// Second channel freq.
uint32 second_channel_freq = 6;
// Second channel DR.
uint32 second_channel_dr = 7;
// Second channel ACK offset.
uint32 second_channel_ack_offset = 8;
// End-device activation mode.
uint32 ed_activation_mode = 9;
// End-device smart-enable level.
uint32 ed_smart_enable_level = 10;
// End-device back-off.
uint32 ed_back_off = 11;
// Join-request limit reload rate.
uint32 join_req_limit_reload_rate = 12;
// Notify limit reload rate.
uint32 notify_limit_reload_rate = 13;
// Global uplink limit reload rate.
uint32 global_uplink_limit_reload_rate = 14;
// Overall limit reload rate.
uint32 overall_limit_reload_rate = 15;
// Join-request limit bucket size.
uint32 join_req_limit_bucket_size = 16;
// Notify limit bucket size.
uint32 notify_limit_bucket_size = 17;
// Global uplink limit bucket size.
uint32 global_uplink_limit_bucket_size = 18;
// Overall limit bucket size.
uint32 overall_limit_bucket_size = 19;
// End-device must communicate through relay only.
// This is stored in the device-session as we need to validate on retrieving
// the device-session.
bool ed_relay_only = 20;
// End-device WFCnt.
// This holds the last known WFCnt value. ChirpStack will periodically read
// this value from the Relay.
uint32 w_f_cnt = 21;
}
message RelayDevice {
// Index (used for filter and uplink filters).
// This must be between 0 - 15.
uint32 index = 1;
// JoinEUI (EUI64).
bytes join_eui = 2;
// DevEUI (EUI64).
bytes dev_eui = 3;
// DevAddr.
bytes dev_addr = 4;
// RootWorSKey.
bytes root_wor_s_key = 5;
// Provisioned.
bool provisioned = 6;
// Uplink limit bucket size.
uint32 uplink_limit_bucket_size = 7;
// Uplink limit reload rate.
uint32 uplink_limit_reload_rate = 8;
// Timestamp of the last WFCnt request.
// Note that ChirpStack periodically requests the WFCnt from the relay.
google.protobuf.Timestamp w_f_cnt_last_request = 9;
}
message RelayFilter {
// Index.
// This must be between 0 - 15.
uint32 index = 1;
// Action.
// * 0: No Rule
// * 1: Forward
// * 2: Filter
uint32 action = 2;
// DevEUI (EUI64).
bytes dev_eui = 3;
// JoinEUI (EUI64).
bytes join_eui = 4;
// Provisioned.
bool provisioned = 5;
}
message DeviceSessionChannel {
// Frequency Hz.
uint32 frequency = 1;
@ -234,6 +359,12 @@ message DownlinkFrame {
// NFCntDown (for decrypting mac-commands).
uint32 n_f_cnt_down = 10;
// AFCntDown (for decrypting FRMPayload in case of Relay).
uint32 a_f_cnt_down = 11;
// DevEUI of relayed device.
bytes dev_eui_relayed = 12;
}
message LoraCloudGeolocBuffer {

1
api/python/Makefile vendored
View File

@ -38,6 +38,7 @@ api:
$(PROTOC) ${PROTOC_ARGS} chirpstack-api/api/frame_log.proto
$(PROTOC) ${PROTOC_ARGS} chirpstack-api/api/multicast_group.proto
$(PROTOC) ${PROTOC_ARGS} chirpstack-api/api/request_log.proto
$(PROTOC) ${PROTOC_ARGS} chirpstack-api/api/relay.proto
integration:
$(PROTOC) ${PROTOC_ARGS} chirpstack-api/integration/integration.proto

View File

@ -190,6 +190,13 @@ message Device {
// These tags are exposed in the event payloads or to integration. Tags are
// intended for aggregation and filtering.
map<string, string> tags = 9;
// JoinEUI (optional, EUI64).
// This field will be automatically set / updated on OTAA. However, in some
// cases it must be pre-configured. For example to allow OTAA using a Relay.
// In this case the Relay needs to know the JoinEUI + DevEUI combinations
// of the devices for which it needs to forward uplinks.
string join_eui = 10;
}
message DeviceStatus {

View File

@ -41,6 +41,61 @@ enum MeasurementKind {
STRING = 4;
}
enum CadPeriodicity {
// 1 second.
SEC_1 = 0;
// 500 milliseconds
MS_500 = 1;
// 250 milliseconds
MS_250 = 2;
// 100 milliseconds
MS_100 = 3;
// 50 milliseconds
MS_50 = 4;
// 20 milliseconds
MS_20 = 5;
}
enum SecondChAckOffset {
// 0 kHz.
KHZ_0 = 0;
// 200 kHz.
KHZ_200 = 1;
// 400 kHz.
KHZ_400 = 2;
// 800 kHz.
KHZ_800 = 3;
// 1600 kHz.
KHZ_1600 = 4;
// 3200 kHz.
KHZ_3200 = 5;
}
enum RelayModeActivation {
// Disable the relay mode.
DISABLE_RELAY_MODE = 0;
// Enable the relay model.
ENABLE_RELAY_MODE = 1;
// Dynamic.
DYNAMIC = 2;
// End-device controlled.
END_DEVICE_CONTROLLED = 3;
}
// DeviceProfileService is the service providing API methods for managing device-profiles.
service DeviceProfileService {
// Create the given device-profile.
@ -195,6 +250,154 @@ message DeviceProfile {
// e.g. to provide an 8 channel and 16 channel configuration for the US915
// band.
string region_config_id = 29;
// Device is a Relay device.
// Enable this in case the device is a Relay. A Relay device implements TS011
// and is able to relay data from relay capable devices.
// See for more information the TS011 specification.
bool is_relay = 30;
// Device is a Relay end-device.
// Enable this in case the device is an end-device that can operate under a
// Relay. Please refer to the TS011 specification for more information.
bool is_relay_ed = 31;
// End-device only accept data through relay.
// Only accept data for this device through a relay. This setting is useful
// for testing as in case of a test-setup, the end-device is usually within
// range of the gateway.
bool relay_ed_relay_only = 32;
// Relay must be enabled.
bool relay_enabled = 33;
// Relay CAD periodicity.
CadPeriodicity relay_cad_periodicity = 34;
// Relay default channel index.
// Valid values are 0 and 1, please refer to the RP002 specification for
// the meaning of these values.
uint32 relay_default_channel_index = 35;
// Relay second channel frequency (Hz).
uint32 relay_second_channel_freq = 36;
// Relay second channel DR.
uint32 relay_second_channel_dr = 37;
// Relay second channel ACK offset.
SecondChAckOffset relay_second_channel_ack_offset = 38;
// Relay end-device activation mode.
RelayModeActivation relay_ed_activation_mode = 39;
// Relay end-device smart-enable level.
uint32 relay_ed_smart_enable_level = 40;
// Relay end-device back-off (in case it does not receive WOR ACK frame).
// 0 = Always send a LoRaWAN uplink
// 1..63 = Send a LoRaWAN uplink after X WOR frames without a WOR ACK
uint32 relay_ed_back_off = 41;
// Relay end-device uplink limit bucket size.
//
// This field indicates the multiplier to determine the bucket size
// according to the following formula:
// BucketSize TOKEN = _reload_rate x _bucket_size
//
// Valid values (0 - 3):
// 0 = 1
// 1 = 2
// 2 = 4
// 3 = 12
uint32 relay_ed_uplink_limit_bucket_size = 42;
// Relay end-device uplink limit reload rate.
//
// Valid values:
// * 0 - 62 = X tokens every hour
// * 63 = no limitation
uint32 relay_ed_uplink_limit_reload_rate = 43;
// Relay join-request limit reload rate.
//
// Valid values:
// * 0 - 126 = X tokens every hour
// * 127 = no limitation
uint32 relay_join_req_limit_reload_rate = 44;
// Relay notify limit reload rate.
//
// Valid values:
// * 0 - 126 = X tokens every hour
// * 127 = no limitation
uint32 relay_notify_limit_reload_rate = 45;
// Relay global uplink limit reload rate.
//
// Valid values:
// * 0 - 126 = X tokens every hour
// * 127 = no limitation
uint32 relay_global_uplink_limit_reload_rate = 46;
// Relay overall limit reload rate.
//
// Valid values:
// * 0 - 126 = X tokens every hour
// * 127 = no limitation
uint32 relay_overall_limit_reload_rate = 47;
// Relay join-request limit bucket size.
//
// This field indicates the multiplier to determine the bucket size
// according to the following formula:
// BucketSize TOKEN = _reload_rate x _bucket_size
//
// Valid values (0 - 3):
// 0 = 1
// 1 = 2
// 2 = 4
// 3 = 12
uint32 relay_join_req_limit_bucket_size = 48;
// Relay notify limit bucket size.
//
// This field indicates the multiplier to determine the bucket size
// according to the following formula:
// BucketSize TOKEN = _reload_rate x _bucket_size
//
// Valid values (0 - 3):
// 0 = 1
// 1 = 2
// 2 = 4
// 3 = 12
uint32 relay_notify_limit_bucket_size = 49;
// Relay globak uplink limit bucket size.
//
// This field indicates the multiplier to determine the bucket size
// according to the following formula:
// BucketSize TOKEN = _reload_rate x _bucket_size
//
// Valid values (0 - 3):
// 0 = 1
// 1 = 2
// 2 = 4
// 3 = 12
uint32 relay_global_uplink_limit_bucket_size = 50;
// Relay overall limit bucket size.
//
// This field indicates the multiplier to determine the bucket size
// according to the following formula:
// BucketSize TOKEN = _reload_rate x _bucket_size
//
// Valid values (0 - 3):
// 0 = 1
// 1 = 2
// 2 = 4
// 3 = 12
uint32 relay_overall_limit_bucket_size = 51;
}
message Measurement {

View File

@ -34,8 +34,11 @@ message UplinkFrameLog {
// Time.
google.protobuf.Timestamp time = 7;
// Plaintext mac-commands.
bool plaintext_mac_commands = 8;
// Plaintext f_opts mac-commands.
bool plaintext_f_opts = 8;
// Plaintext frm_payload.
bool plaintext_frm_payload = 9;
}
message DownlinkFrameLog {
@ -63,6 +66,9 @@ message DownlinkFrameLog {
// Device EUI (optional).
string dev_eui = 8;
// Plaintext mac-commands.
bool plaintext_mac_commands = 9;
// Plaintext f_opts mac-commands.
bool plaintext_f_opts = 9;
// Plaintext frm_payload.
bool plaintext_frm_payload = 10;
}

View File

@ -0,0 +1,119 @@
syntax = "proto3";
package api;
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 = "RelayProto";
option csharp_namespace = "Chirpstack.Api";
import "google/api/annotations.proto";
import "google/protobuf/timestamp.proto";
import "google/protobuf/empty.proto";
// RelayService is the service providing API methos for managing relays.
service RelayService {
// List lists the relays for the given application id.
rpc List(ListRelaysRequest) returns (ListRelaysResponse) {
option(google.api.http) = {
get: "/api/relays"
};
}
// AddDevice adds the given device to the relay.
rpc AddDevice(AddRelayDeviceRequest) returns (google.protobuf.Empty) {
option(google.api.http) = {
post: "/api/relays/{relay_dev_eui}/devices"
body: "*"
};
}
// RemoveDevice removes the given device from the relay.
rpc RemoveDevice(RemoveRelayDeviceRequest) returns (google.protobuf.Empty) {
option(google.api.http) = {
delete: "/api/relays/{relay_dev_eui}/devices/{dev_eui}"
};
};
// ListDevices lists the devices for the given relay.
rpc ListDevices(ListRelayDevicesRequest) returns (ListRelayDevicesResponse) {
option(google.api.http) = {
get: "/api/relays/{relay_dev_eui}/devices"
};
};
}
message RelayListItem {
// DevEUI (EUI64).
string dev_eui = 1;
// Name.
string name = 2;
}
message ListRelaysRequest {
// Max number of devices to return in the result-set.
uint32 limit = 1;
// Offset in the result-set (for pagination).
uint32 offset = 2;
// Application ID (UUID).
string application_id = 3;
}
message ListRelaysResponse {
// Total number of relays.
uint32 total_count = 1;
// Result-set.
repeated RelayListItem result = 2;
}
message AddRelayDeviceRequest {
// Relay DevEUI (EUI64).
string relay_dev_eui = 1;
// Device DevEUI (EUI64).
string device_dev_eui = 2;
}
message RemoveRelayDeviceRequest {
// Relay DevEUI (EUI64).
string relay_dev_eui = 1;
// Device DevEUI (EUI64).
string device_dev_eui = 2;
}
message ListRelayDevicesRequest {
// Max number of multicast groups to return in the result-set.
uint32 limit = 1;
// Offset in the result-set (for pagination).
uint32 offset = 2;
// Relay DevEUI (EUI64).
string relay_dev_eui = 3;
}
message RelayDeviceListItem {
// DevEUI (EUI64).
string dev_eui = 1;
// Created at timestamp.
google.protobuf.Timestamp created_at = 2;
// Device name.
string name = 3;
}
message ListRelayDevicesResponse {
// Total number of devices.
uint32 total_count = 1;
// Result-set.
repeated RelayDeviceListItem result = 2;
}

View File

@ -13,7 +13,6 @@ import "google/protobuf/timestamp.proto";
import "google/protobuf/duration.proto";
import "google/protobuf/struct.proto";
enum CodeRate {
CR_UNDEFINED = 0;
CR_4_5 = 1; // LoRa
@ -70,13 +69,15 @@ enum TxAckStatus {
// Packet has been programmed for downlink.
OK = 1;
// Rejected because it was already too late to program this packet for downlink.
// Rejected because it was already too late to program this packet for
// downlink.
TOO_LATE = 2;
// Rejected because downlink packet timestamp is too much in advance.
TOO_EARLY = 3;
// Rejected because there was already a packet programmed in requested timeframe.
// Rejected because there was already a packet programmed in requested
// timeframe.
COLLISION_PACKET = 4;
// Rejected because there was already a beacon planned in requested timeframe.
@ -298,7 +299,8 @@ message UplinkRxInfoLegacy {
bytes context = 15;
// Uplink ID (UUID bytes).
// Unique and random ID which can be used to correlate the uplink across multiple logs.
// Unique and random ID which can be used to correlate the uplink across
// multiple logs.
bytes uplink_id = 16;
// CRC status.
@ -446,10 +448,10 @@ message ImmediatelyTimingInfo {
// Not implemented yet.
}
message DelayTimingInfo {
// Delay (duration).
// The delay will be added to the gateway internal timing, provided by the context object.
// The delay will be added to the gateway internal timing, provided by the
// context object.
google.protobuf.Duration delay = 1;
}
@ -618,7 +620,8 @@ message GatewayCommandExecRequest {
string gateway_id = 6;
// Command to execute.
// This command must be pre-configured in the LoRa Gateway Bridge configuration.
// This command must be pre-configured in the LoRa Gateway Bridge
// configuration.
string command = 2;
// Execution request ID.

View File

@ -52,6 +52,9 @@ enum LogCode {
// Downlink gateway error.
DOWNLINK_GATEWAY = 8;
// Relay new end-device.
RELAY_NEW_END_DEVICE = 9;
}
// Device information.
@ -84,6 +87,27 @@ message DeviceInfo {
map<string, string> tags = 9;
}
// Uplink relay RX information.
message UplinkRelayRxInfo {
// Relay DevEUI.
string dev_eui = 1;
// Frequency.
uint32 frequency = 2;
// Data-rate.
uint32 dr = 3;
// SNR.
int32 snr = 4;
// RSSI.
int32 rssi = 5;
// WOR channel.
uint32 wor_channel = 6;
}
// UplinkEvent is the message sent when an uplink payload has been received.
message UplinkEvent {
// Deduplication ID (UUID).
@ -116,7 +140,8 @@ message UplinkEvent {
// FRMPayload data.
bytes data = 10;
// Note that this is only set when a codec is configured in the Device Profile.
// Note that this is only set when a codec is configured in the Device
// Profile.
google.protobuf.Struct object = 11;
// Receiving gateway RX info.
@ -124,6 +149,9 @@ message UplinkEvent {
// TX info.
gw.UplinkTxInfo tx_info = 13;
// Relay info.
UplinkRelayRxInfo relay_rx_info = 14;
}
// JoinEvent is the message sent when a device joined the network.
@ -140,6 +168,9 @@ message JoinEvent {
// Device address.
string dev_addr = 4;
// Relay info.
UplinkRelayRxInfo relay_rx_info = 5;
}
// AckEvent is the message sent when a confirmation on a confirmed downlink
@ -164,9 +195,9 @@ message AckEvent {
uint32 f_cnt_down = 6;
}
// TxAckEvent is the message sent when a downlink was acknowledged by the gateway
// for transmission. As a downlink can be scheduled in the future, this event
// does not confirm that the message has already been transmitted.
// TxAckEvent is the message sent when a downlink was acknowledged by the
// gateway for transmission. As a downlink can be scheduled in the future, this
// event does not confirm that the message has already been transmitted.
message TxAckEvent {
// Downlink ID.
uint32 downlink_id = 1;

View File

@ -40,7 +40,8 @@ message DeviceSession {
// Downlink frame-counter (as).
uint32 a_f_cnt_down = 11;
// Frame-counter holding the last confirmed downlink frame (n_f_cnt_down or a_f_cnt_down).
// Frame-counter holding the last confirmed downlink frame (n_f_cnt_down or
// a_f_cnt_down).
uint32 conf_f_cnt = 12;
// Skip uplink frame-counter validation.
@ -137,6 +138,9 @@ message DeviceSession {
// Region configuration ID.
string region_config_id = 40;
// Relay state.
Relay relay = 41;
}
message UplinkAdrHistory {
@ -156,6 +160,127 @@ message UplinkAdrHistory {
uint32 gateway_count = 4;
}
message Relay {
// Devices provisioned on the relay.
repeated RelayDevice devices = 1;
// Filter list.
repeated RelayFilter filters = 2;
// Relay is enabled.
bool enabled = 3;
// CAD periodicity.
uint32 cad_periodicity = 4;
// Default channel index.
uint32 default_channel_index = 5;
// Second channel freq.
uint32 second_channel_freq = 6;
// Second channel DR.
uint32 second_channel_dr = 7;
// Second channel ACK offset.
uint32 second_channel_ack_offset = 8;
// End-device activation mode.
uint32 ed_activation_mode = 9;
// End-device smart-enable level.
uint32 ed_smart_enable_level = 10;
// End-device back-off.
uint32 ed_back_off = 11;
// Join-request limit reload rate.
uint32 join_req_limit_reload_rate = 12;
// Notify limit reload rate.
uint32 notify_limit_reload_rate = 13;
// Global uplink limit reload rate.
uint32 global_uplink_limit_reload_rate = 14;
// Overall limit reload rate.
uint32 overall_limit_reload_rate = 15;
// Join-request limit bucket size.
uint32 join_req_limit_bucket_size = 16;
// Notify limit bucket size.
uint32 notify_limit_bucket_size = 17;
// Global uplink limit bucket size.
uint32 global_uplink_limit_bucket_size = 18;
// Overall limit bucket size.
uint32 overall_limit_bucket_size = 19;
// End-device must communicate through relay only.
// This is stored in the device-session as we need to validate on retrieving
// the device-session.
bool ed_relay_only = 20;
// End-device WFCnt.
// This holds the last known WFCnt value. ChirpStack will periodically read
// this value from the Relay.
uint32 w_f_cnt = 21;
}
message RelayDevice {
// Index (used for filter and uplink filters).
// This must be between 0 - 15.
uint32 index = 1;
// JoinEUI (EUI64).
bytes join_eui = 2;
// DevEUI (EUI64).
bytes dev_eui = 3;
// DevAddr.
bytes dev_addr = 4;
// RootWorSKey.
bytes root_wor_s_key = 5;
// Provisioned.
bool provisioned = 6;
// Uplink limit bucket size.
uint32 uplink_limit_bucket_size = 7;
// Uplink limit reload rate.
uint32 uplink_limit_reload_rate = 8;
// Timestamp of the last WFCnt request.
// Note that ChirpStack periodically requests the WFCnt from the relay.
google.protobuf.Timestamp w_f_cnt_last_request = 9;
}
message RelayFilter {
// Index.
// This must be between 0 - 15.
uint32 index = 1;
// Action.
// * 0: No Rule
// * 1: Forward
// * 2: Filter
uint32 action = 2;
// DevEUI (EUI64).
bytes dev_eui = 3;
// JoinEUI (EUI64).
bytes join_eui = 4;
// Provisioned.
bool provisioned = 5;
}
message DeviceSessionChannel {
// Frequency Hz.
uint32 frequency = 1;
@ -234,6 +359,12 @@ message DownlinkFrame {
// NFCntDown (for decrypting mac-commands).
uint32 n_f_cnt_down = 10;
// AFCntDown (for decrypting FRMPayload in case of Relay).
uint32 a_f_cnt_down = 11;
// DevEUI of relayed device.
bytes dev_eui_relayed = 12;
}
message LoraCloudGeolocBuffer {

View File

@ -19,3 +19,5 @@ from .tenant_pb2_grpc import *
from .user_pb2 import *
from .user_pb2_grpc import *
from .request_log_pb2 import *
from .relay_pb2 import *
from .relay_pb2_grpc import *

File diff suppressed because one or more lines are too long

View File

@ -47,7 +47,7 @@ class DeleteDeviceRequest(_message.Message):
def __init__(self, dev_eui: _Optional[str] = ...) -> None: ...
class Device(_message.Message):
__slots__ = ["application_id", "description", "dev_eui", "device_profile_id", "is_disabled", "name", "skip_fcnt_check", "tags", "variables"]
__slots__ = ["application_id", "description", "dev_eui", "device_profile_id", "is_disabled", "join_eui", "name", "skip_fcnt_check", "tags", "variables"]
class TagsEntry(_message.Message):
__slots__ = ["key", "value"]
KEY_FIELD_NUMBER: _ClassVar[int]
@ -67,6 +67,7 @@ class Device(_message.Message):
DEVICE_PROFILE_ID_FIELD_NUMBER: _ClassVar[int]
DEV_EUI_FIELD_NUMBER: _ClassVar[int]
IS_DISABLED_FIELD_NUMBER: _ClassVar[int]
JOIN_EUI_FIELD_NUMBER: _ClassVar[int]
NAME_FIELD_NUMBER: _ClassVar[int]
SKIP_FCNT_CHECK_FIELD_NUMBER: _ClassVar[int]
TAGS_FIELD_NUMBER: _ClassVar[int]
@ -76,11 +77,12 @@ class Device(_message.Message):
dev_eui: str
device_profile_id: str
is_disabled: bool
join_eui: str
name: str
skip_fcnt_check: bool
tags: _containers.ScalarMap[str, str]
variables: _containers.ScalarMap[str, str]
def __init__(self, dev_eui: _Optional[str] = ..., name: _Optional[str] = ..., description: _Optional[str] = ..., application_id: _Optional[str] = ..., device_profile_id: _Optional[str] = ..., skip_fcnt_check: bool = ..., is_disabled: bool = ..., variables: _Optional[_Mapping[str, str]] = ..., tags: _Optional[_Mapping[str, str]] = ...) -> None: ...
def __init__(self, dev_eui: _Optional[str] = ..., name: _Optional[str] = ..., description: _Optional[str] = ..., application_id: _Optional[str] = ..., device_profile_id: _Optional[str] = ..., skip_fcnt_check: bool = ..., is_disabled: bool = ..., variables: _Optional[_Mapping[str, str]] = ..., tags: _Optional[_Mapping[str, str]] = ..., join_eui: _Optional[str] = ...) -> None: ...
class DeviceActivation(_message.Message):
__slots__ = ["a_f_cnt_down", "app_s_key", "dev_addr", "dev_eui", "f_cnt_up", "f_nwk_s_int_key", "n_f_cnt_down", "nwk_s_enc_key", "s_nwk_s_int_key"]

File diff suppressed because one or more lines are too long

View File

@ -12,9 +12,25 @@ ABSOLUTE: MeasurementKind
CAYENNE_LPP: CodecRuntime
COUNTER: MeasurementKind
DESCRIPTOR: _descriptor.FileDescriptor
DISABLE_RELAY_MODE: RelayModeActivation
DYNAMIC: RelayModeActivation
ENABLE_RELAY_MODE: RelayModeActivation
END_DEVICE_CONTROLLED: RelayModeActivation
GAUGE: MeasurementKind
JS: CodecRuntime
KHZ_0: SecondChAckOffset
KHZ_1600: SecondChAckOffset
KHZ_200: SecondChAckOffset
KHZ_3200: SecondChAckOffset
KHZ_400: SecondChAckOffset
KHZ_800: SecondChAckOffset
MS_100: CadPeriodicity
MS_20: CadPeriodicity
MS_250: CadPeriodicity
MS_50: CadPeriodicity
MS_500: CadPeriodicity
NONE: CodecRuntime
SEC_1: CadPeriodicity
STRING: MeasurementKind
UNKNOWN: MeasurementKind
@ -45,7 +61,7 @@ class DeleteDeviceProfileRequest(_message.Message):
def __init__(self, id: _Optional[str] = ...) -> None: ...
class DeviceProfile(_message.Message):
__slots__ = ["abp_rx1_delay", "abp_rx1_dr_offset", "abp_rx2_dr", "abp_rx2_freq", "adr_algorithm_id", "auto_detect_measurements", "class_b_ping_slot_dr", "class_b_ping_slot_freq", "class_b_ping_slot_nb_k", "class_b_timeout", "class_c_timeout", "description", "device_status_req_interval", "flush_queue_on_activate", "id", "mac_version", "measurements", "name", "payload_codec_runtime", "payload_codec_script", "reg_params_revision", "region", "region_config_id", "supports_class_b", "supports_class_c", "supports_otaa", "tags", "tenant_id", "uplink_interval"]
__slots__ = ["abp_rx1_delay", "abp_rx1_dr_offset", "abp_rx2_dr", "abp_rx2_freq", "adr_algorithm_id", "auto_detect_measurements", "class_b_ping_slot_dr", "class_b_ping_slot_freq", "class_b_ping_slot_nb_k", "class_b_timeout", "class_c_timeout", "description", "device_status_req_interval", "flush_queue_on_activate", "id", "is_relay", "is_relay_ed", "mac_version", "measurements", "name", "payload_codec_runtime", "payload_codec_script", "reg_params_revision", "region", "region_config_id", "relay_cad_periodicity", "relay_default_channel_index", "relay_ed_activation_mode", "relay_ed_back_off", "relay_ed_relay_only", "relay_ed_smart_enable_level", "relay_ed_uplink_limit_bucket_size", "relay_ed_uplink_limit_reload_rate", "relay_enabled", "relay_global_uplink_limit_bucket_size", "relay_global_uplink_limit_reload_rate", "relay_join_req_limit_bucket_size", "relay_join_req_limit_reload_rate", "relay_notify_limit_bucket_size", "relay_notify_limit_reload_rate", "relay_overall_limit_bucket_size", "relay_overall_limit_reload_rate", "relay_second_channel_ack_offset", "relay_second_channel_dr", "relay_second_channel_freq", "supports_class_b", "supports_class_c", "supports_otaa", "tags", "tenant_id", "uplink_interval"]
class MeasurementsEntry(_message.Message):
__slots__ = ["key", "value"]
KEY_FIELD_NUMBER: _ClassVar[int]
@ -75,6 +91,8 @@ class DeviceProfile(_message.Message):
DEVICE_STATUS_REQ_INTERVAL_FIELD_NUMBER: _ClassVar[int]
FLUSH_QUEUE_ON_ACTIVATE_FIELD_NUMBER: _ClassVar[int]
ID_FIELD_NUMBER: _ClassVar[int]
IS_RELAY_ED_FIELD_NUMBER: _ClassVar[int]
IS_RELAY_FIELD_NUMBER: _ClassVar[int]
MAC_VERSION_FIELD_NUMBER: _ClassVar[int]
MEASUREMENTS_FIELD_NUMBER: _ClassVar[int]
NAME_FIELD_NUMBER: _ClassVar[int]
@ -83,6 +101,26 @@ class DeviceProfile(_message.Message):
REGION_CONFIG_ID_FIELD_NUMBER: _ClassVar[int]
REGION_FIELD_NUMBER: _ClassVar[int]
REG_PARAMS_REVISION_FIELD_NUMBER: _ClassVar[int]
RELAY_CAD_PERIODICITY_FIELD_NUMBER: _ClassVar[int]
RELAY_DEFAULT_CHANNEL_INDEX_FIELD_NUMBER: _ClassVar[int]
RELAY_ED_ACTIVATION_MODE_FIELD_NUMBER: _ClassVar[int]
RELAY_ED_BACK_OFF_FIELD_NUMBER: _ClassVar[int]
RELAY_ED_RELAY_ONLY_FIELD_NUMBER: _ClassVar[int]
RELAY_ED_SMART_ENABLE_LEVEL_FIELD_NUMBER: _ClassVar[int]
RELAY_ED_UPLINK_LIMIT_BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int]
RELAY_ED_UPLINK_LIMIT_RELOAD_RATE_FIELD_NUMBER: _ClassVar[int]
RELAY_ENABLED_FIELD_NUMBER: _ClassVar[int]
RELAY_GLOBAL_UPLINK_LIMIT_BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int]
RELAY_GLOBAL_UPLINK_LIMIT_RELOAD_RATE_FIELD_NUMBER: _ClassVar[int]
RELAY_JOIN_REQ_LIMIT_BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int]
RELAY_JOIN_REQ_LIMIT_RELOAD_RATE_FIELD_NUMBER: _ClassVar[int]
RELAY_NOTIFY_LIMIT_BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int]
RELAY_NOTIFY_LIMIT_RELOAD_RATE_FIELD_NUMBER: _ClassVar[int]
RELAY_OVERALL_LIMIT_BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int]
RELAY_OVERALL_LIMIT_RELOAD_RATE_FIELD_NUMBER: _ClassVar[int]
RELAY_SECOND_CHANNEL_ACK_OFFSET_FIELD_NUMBER: _ClassVar[int]
RELAY_SECOND_CHANNEL_DR_FIELD_NUMBER: _ClassVar[int]
RELAY_SECOND_CHANNEL_FREQ_FIELD_NUMBER: _ClassVar[int]
SUPPORTS_CLASS_B_FIELD_NUMBER: _ClassVar[int]
SUPPORTS_CLASS_C_FIELD_NUMBER: _ClassVar[int]
SUPPORTS_OTAA_FIELD_NUMBER: _ClassVar[int]
@ -104,6 +142,8 @@ class DeviceProfile(_message.Message):
device_status_req_interval: int
flush_queue_on_activate: bool
id: str
is_relay: bool
is_relay_ed: bool
mac_version: _common_pb2.MacVersion
measurements: _containers.MessageMap[str, Measurement]
name: str
@ -112,13 +152,33 @@ class DeviceProfile(_message.Message):
reg_params_revision: _common_pb2.RegParamsRevision
region: _common_pb2.Region
region_config_id: str
relay_cad_periodicity: CadPeriodicity
relay_default_channel_index: int
relay_ed_activation_mode: RelayModeActivation
relay_ed_back_off: int
relay_ed_relay_only: bool
relay_ed_smart_enable_level: int
relay_ed_uplink_limit_bucket_size: int
relay_ed_uplink_limit_reload_rate: int
relay_enabled: bool
relay_global_uplink_limit_bucket_size: int
relay_global_uplink_limit_reload_rate: int
relay_join_req_limit_bucket_size: int
relay_join_req_limit_reload_rate: int
relay_notify_limit_bucket_size: int
relay_notify_limit_reload_rate: int
relay_overall_limit_bucket_size: int
relay_overall_limit_reload_rate: int
relay_second_channel_ack_offset: SecondChAckOffset
relay_second_channel_dr: int
relay_second_channel_freq: int
supports_class_b: bool
supports_class_c: bool
supports_otaa: bool
tags: _containers.ScalarMap[str, str]
tenant_id: str
uplink_interval: int
def __init__(self, id: _Optional[str] = ..., tenant_id: _Optional[str] = ..., name: _Optional[str] = ..., description: _Optional[str] = ..., region: _Optional[_Union[_common_pb2.Region, str]] = ..., mac_version: _Optional[_Union[_common_pb2.MacVersion, str]] = ..., reg_params_revision: _Optional[_Union[_common_pb2.RegParamsRevision, str]] = ..., adr_algorithm_id: _Optional[str] = ..., payload_codec_runtime: _Optional[_Union[CodecRuntime, str]] = ..., payload_codec_script: _Optional[str] = ..., flush_queue_on_activate: bool = ..., uplink_interval: _Optional[int] = ..., device_status_req_interval: _Optional[int] = ..., supports_otaa: bool = ..., supports_class_b: bool = ..., supports_class_c: bool = ..., class_b_timeout: _Optional[int] = ..., class_b_ping_slot_nb_k: _Optional[int] = ..., class_b_ping_slot_dr: _Optional[int] = ..., class_b_ping_slot_freq: _Optional[int] = ..., class_c_timeout: _Optional[int] = ..., abp_rx1_delay: _Optional[int] = ..., abp_rx1_dr_offset: _Optional[int] = ..., abp_rx2_dr: _Optional[int] = ..., abp_rx2_freq: _Optional[int] = ..., tags: _Optional[_Mapping[str, str]] = ..., measurements: _Optional[_Mapping[str, Measurement]] = ..., auto_detect_measurements: bool = ..., region_config_id: _Optional[str] = ...) -> None: ...
def __init__(self, id: _Optional[str] = ..., tenant_id: _Optional[str] = ..., name: _Optional[str] = ..., description: _Optional[str] = ..., region: _Optional[_Union[_common_pb2.Region, str]] = ..., mac_version: _Optional[_Union[_common_pb2.MacVersion, str]] = ..., reg_params_revision: _Optional[_Union[_common_pb2.RegParamsRevision, str]] = ..., adr_algorithm_id: _Optional[str] = ..., payload_codec_runtime: _Optional[_Union[CodecRuntime, str]] = ..., payload_codec_script: _Optional[str] = ..., flush_queue_on_activate: bool = ..., uplink_interval: _Optional[int] = ..., device_status_req_interval: _Optional[int] = ..., supports_otaa: bool = ..., supports_class_b: bool = ..., supports_class_c: bool = ..., class_b_timeout: _Optional[int] = ..., class_b_ping_slot_nb_k: _Optional[int] = ..., class_b_ping_slot_dr: _Optional[int] = ..., class_b_ping_slot_freq: _Optional[int] = ..., class_c_timeout: _Optional[int] = ..., abp_rx1_delay: _Optional[int] = ..., abp_rx1_dr_offset: _Optional[int] = ..., abp_rx2_dr: _Optional[int] = ..., abp_rx2_freq: _Optional[int] = ..., tags: _Optional[_Mapping[str, str]] = ..., measurements: _Optional[_Mapping[str, Measurement]] = ..., auto_detect_measurements: bool = ..., region_config_id: _Optional[str] = ..., is_relay: bool = ..., is_relay_ed: bool = ..., relay_ed_relay_only: bool = ..., relay_enabled: bool = ..., relay_cad_periodicity: _Optional[_Union[CadPeriodicity, str]] = ..., relay_default_channel_index: _Optional[int] = ..., relay_second_channel_freq: _Optional[int] = ..., relay_second_channel_dr: _Optional[int] = ..., relay_second_channel_ack_offset: _Optional[_Union[SecondChAckOffset, str]] = ..., relay_ed_activation_mode: _Optional[_Union[RelayModeActivation, str]] = ..., relay_ed_smart_enable_level: _Optional[int] = ..., relay_ed_back_off: _Optional[int] = ..., relay_ed_uplink_limit_bucket_size: _Optional[int] = ..., relay_ed_uplink_limit_reload_rate: _Optional[int] = ..., relay_join_req_limit_reload_rate: _Optional[int] = ..., relay_notify_limit_reload_rate: _Optional[int] = ..., relay_global_uplink_limit_reload_rate: _Optional[int] = ..., relay_overall_limit_reload_rate: _Optional[int] = ..., relay_join_req_limit_bucket_size: _Optional[int] = ..., relay_notify_limit_bucket_size: _Optional[int] = ..., relay_global_uplink_limit_bucket_size: _Optional[int] = ..., relay_overall_limit_bucket_size: _Optional[int] = ...) -> None: ...
class DeviceProfileListItem(_message.Message):
__slots__ = ["created_at", "id", "mac_version", "name", "reg_params_revision", "region", "supports_class_b", "supports_class_c", "supports_otaa", "updated_at"]
@ -207,3 +267,12 @@ class CodecRuntime(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
class MeasurementKind(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class CadPeriodicity(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class SecondChAckOffset(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class RelayModeActivation(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []

View File

@ -16,7 +16,7 @@ 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\x42\x65\n\x11io.chirpstack.apiB\rFrameLogProtoP\x01Z.github.com/chirpstack/chirpstack/api/go/v4/api\xaa\x02\x0e\x43hirpstack.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\"\x90\x02\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\x18\n\x10plaintext_f_opts\x18\x08 \x01(\x08\x12\x1d\n\x15plaintext_frm_payload\x18\t \x01(\x08\"\x9a\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\x18\n\x10plaintext_f_opts\x18\t \x01(\x08\x12\x1d\n\x15plaintext_frm_payload\x18\n \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())
@ -25,7 +25,7 @@ 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\252\002\016Chirpstack.Api'
_UPLINKFRAMELOG._serialized_start=141
_UPLINKFRAMELOG._serialized_end=388
_DOWNLINKFRAMELOG._serialized_start=391
_DOWNLINKFRAMELOG._serialized_end=648
_UPLINKFRAMELOG._serialized_end=413
_DOWNLINKFRAMELOG._serialized_start=416
_DOWNLINKFRAMELOG._serialized_end=698
# @@protoc_insertion_point(module_scope)

View File

@ -9,14 +9,15 @@ from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Map
DESCRIPTOR: _descriptor.FileDescriptor
class DownlinkFrameLog(_message.Message):
__slots__ = ["dev_addr", "dev_eui", "downlink_id", "gateway_id", "m_type", "phy_payload", "plaintext_mac_commands", "time", "tx_info"]
__slots__ = ["dev_addr", "dev_eui", "downlink_id", "gateway_id", "m_type", "phy_payload", "plaintext_f_opts", "plaintext_frm_payload", "time", "tx_info"]
DEV_ADDR_FIELD_NUMBER: _ClassVar[int]
DEV_EUI_FIELD_NUMBER: _ClassVar[int]
DOWNLINK_ID_FIELD_NUMBER: _ClassVar[int]
GATEWAY_ID_FIELD_NUMBER: _ClassVar[int]
M_TYPE_FIELD_NUMBER: _ClassVar[int]
PHY_PAYLOAD_FIELD_NUMBER: _ClassVar[int]
PLAINTEXT_MAC_COMMANDS_FIELD_NUMBER: _ClassVar[int]
PLAINTEXT_FRM_PAYLOAD_FIELD_NUMBER: _ClassVar[int]
PLAINTEXT_F_OPTS_FIELD_NUMBER: _ClassVar[int]
TIME_FIELD_NUMBER: _ClassVar[int]
TX_INFO_FIELD_NUMBER: _ClassVar[int]
dev_addr: str
@ -25,18 +26,20 @@ class DownlinkFrameLog(_message.Message):
gateway_id: str
m_type: _common_pb2.MType
phy_payload: bytes
plaintext_mac_commands: bool
plaintext_f_opts: bool
plaintext_frm_payload: bool
time: _timestamp_pb2.Timestamp
tx_info: _gw_pb2.DownlinkTxInfo
def __init__(self, time: _Optional[_Union[_timestamp_pb2.Timestamp, _Mapping]] = ..., phy_payload: _Optional[bytes] = ..., tx_info: _Optional[_Union[_gw_pb2.DownlinkTxInfo, _Mapping]] = ..., downlink_id: _Optional[int] = ..., gateway_id: _Optional[str] = ..., m_type: _Optional[_Union[_common_pb2.MType, str]] = ..., dev_addr: _Optional[str] = ..., dev_eui: _Optional[str] = ..., plaintext_mac_commands: bool = ...) -> None: ...
def __init__(self, time: _Optional[_Union[_timestamp_pb2.Timestamp, _Mapping]] = ..., phy_payload: _Optional[bytes] = ..., tx_info: _Optional[_Union[_gw_pb2.DownlinkTxInfo, _Mapping]] = ..., downlink_id: _Optional[int] = ..., gateway_id: _Optional[str] = ..., m_type: _Optional[_Union[_common_pb2.MType, str]] = ..., dev_addr: _Optional[str] = ..., dev_eui: _Optional[str] = ..., plaintext_f_opts: bool = ..., plaintext_frm_payload: bool = ...) -> None: ...
class UplinkFrameLog(_message.Message):
__slots__ = ["dev_addr", "dev_eui", "m_type", "phy_payload", "plaintext_mac_commands", "rx_info", "time", "tx_info"]
__slots__ = ["dev_addr", "dev_eui", "m_type", "phy_payload", "plaintext_f_opts", "plaintext_frm_payload", "rx_info", "time", "tx_info"]
DEV_ADDR_FIELD_NUMBER: _ClassVar[int]
DEV_EUI_FIELD_NUMBER: _ClassVar[int]
M_TYPE_FIELD_NUMBER: _ClassVar[int]
PHY_PAYLOAD_FIELD_NUMBER: _ClassVar[int]
PLAINTEXT_MAC_COMMANDS_FIELD_NUMBER: _ClassVar[int]
PLAINTEXT_FRM_PAYLOAD_FIELD_NUMBER: _ClassVar[int]
PLAINTEXT_F_OPTS_FIELD_NUMBER: _ClassVar[int]
RX_INFO_FIELD_NUMBER: _ClassVar[int]
TIME_FIELD_NUMBER: _ClassVar[int]
TX_INFO_FIELD_NUMBER: _ClassVar[int]
@ -44,8 +47,9 @@ class UplinkFrameLog(_message.Message):
dev_eui: str
m_type: _common_pb2.MType
phy_payload: bytes
plaintext_mac_commands: bool
plaintext_f_opts: bool
plaintext_frm_payload: bool
rx_info: _containers.RepeatedCompositeFieldContainer[_gw_pb2.UplinkRxInfo]
time: _timestamp_pb2.Timestamp
tx_info: _gw_pb2.UplinkTxInfo
def __init__(self, phy_payload: _Optional[bytes] = ..., tx_info: _Optional[_Union[_gw_pb2.UplinkTxInfo, _Mapping]] = ..., rx_info: _Optional[_Iterable[_Union[_gw_pb2.UplinkRxInfo, _Mapping]]] = ..., m_type: _Optional[_Union[_common_pb2.MType, str]] = ..., dev_addr: _Optional[str] = ..., dev_eui: _Optional[str] = ..., time: _Optional[_Union[_timestamp_pb2.Timestamp, _Mapping]] = ..., plaintext_mac_commands: bool = ...) -> None: ...
def __init__(self, phy_payload: _Optional[bytes] = ..., tx_info: _Optional[_Union[_gw_pb2.UplinkTxInfo, _Mapping]] = ..., rx_info: _Optional[_Iterable[_Union[_gw_pb2.UplinkRxInfo, _Mapping]]] = ..., m_type: _Optional[_Union[_common_pb2.MType, str]] = ..., dev_addr: _Optional[str] = ..., dev_eui: _Optional[str] = ..., time: _Optional[_Union[_timestamp_pb2.Timestamp, _Mapping]] = ..., plaintext_f_opts: bool = ..., plaintext_frm_payload: bool = ...) -> None: ...

View File

@ -0,0 +1,53 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: chirpstack-api/api/relay.proto
"""Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2
from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1e\x63hirpstack-api/api/relay.proto\x12\x03\x61pi\x1a\x1cgoogle/api/annotations.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\".\n\rRelayListItem\x12\x0f\n\x07\x64\x65v_eui\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"J\n\x11ListRelaysRequest\x12\r\n\x05limit\x18\x01 \x01(\r\x12\x0e\n\x06offset\x18\x02 \x01(\r\x12\x16\n\x0e\x61pplication_id\x18\x03 \x01(\t\"M\n\x12ListRelaysResponse\x12\x13\n\x0btotal_count\x18\x01 \x01(\r\x12\"\n\x06result\x18\x02 \x03(\x0b\x32\x12.api.RelayListItem\"F\n\x15\x41\x64\x64RelayDeviceRequest\x12\x15\n\rrelay_dev_eui\x18\x01 \x01(\t\x12\x16\n\x0e\x64\x65vice_dev_eui\x18\x02 \x01(\t\"I\n\x18RemoveRelayDeviceRequest\x12\x15\n\rrelay_dev_eui\x18\x01 \x01(\t\x12\x16\n\x0e\x64\x65vice_dev_eui\x18\x02 \x01(\t\"O\n\x17ListRelayDevicesRequest\x12\r\n\x05limit\x18\x01 \x01(\r\x12\x0e\n\x06offset\x18\x02 \x01(\r\x12\x15\n\rrelay_dev_eui\x18\x03 \x01(\t\"d\n\x13RelayDeviceListItem\x12\x0f\n\x07\x64\x65v_eui\x18\x01 \x01(\t\x12.\n\ncreated_at\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0c\n\x04name\x18\x03 \x01(\t\"Y\n\x18ListRelayDevicesResponse\x12\x13\n\x0btotal_count\x18\x01 \x01(\r\x12(\n\x06result\x18\x02 \x03(\x0b\x32\x18.api.RelayDeviceListItem2\xc4\x03\n\x0cRelayService\x12L\n\x04List\x12\x16.api.ListRelaysRequest\x1a\x17.api.ListRelaysResponse\"\x13\x82\xd3\xe4\x93\x02\r\x12\x0b/api/relays\x12o\n\tAddDevice\x12\x1a.api.AddRelayDeviceRequest\x1a\x16.google.protobuf.Empty\".\x82\xd3\xe4\x93\x02(\"#/api/relays/{relay_dev_eui}/devices:\x01*\x12|\n\x0cRemoveDevice\x12\x1d.api.RemoveRelayDeviceRequest\x1a\x16.google.protobuf.Empty\"5\x82\xd3\xe4\x93\x02/*-/api/relays/{relay_dev_eui}/devices/{dev_eui}\x12w\n\x0bListDevices\x12\x1c.api.ListRelayDevicesRequest\x1a\x1d.api.ListRelayDevicesResponse\"+\x82\xd3\xe4\x93\x02%\x12#/api/relays/{relay_dev_eui}/devicesBb\n\x11io.chirpstack.apiB\nRelayProtoP\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.relay_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\021io.chirpstack.apiB\nRelayProtoP\001Z.github.com/chirpstack/chirpstack/api/go/v4/api\252\002\016Chirpstack.Api'
_RELAYSERVICE.methods_by_name['List']._options = None
_RELAYSERVICE.methods_by_name['List']._serialized_options = b'\202\323\344\223\002\r\022\013/api/relays'
_RELAYSERVICE.methods_by_name['AddDevice']._options = None
_RELAYSERVICE.methods_by_name['AddDevice']._serialized_options = b'\202\323\344\223\002(\"#/api/relays/{relay_dev_eui}/devices:\001*'
_RELAYSERVICE.methods_by_name['RemoveDevice']._options = None
_RELAYSERVICE.methods_by_name['RemoveDevice']._serialized_options = b'\202\323\344\223\002/*-/api/relays/{relay_dev_eui}/devices/{dev_eui}'
_RELAYSERVICE.methods_by_name['ListDevices']._options = None
_RELAYSERVICE.methods_by_name['ListDevices']._serialized_options = b'\202\323\344\223\002%\022#/api/relays/{relay_dev_eui}/devices'
_RELAYLISTITEM._serialized_start=131
_RELAYLISTITEM._serialized_end=177
_LISTRELAYSREQUEST._serialized_start=179
_LISTRELAYSREQUEST._serialized_end=253
_LISTRELAYSRESPONSE._serialized_start=255
_LISTRELAYSRESPONSE._serialized_end=332
_ADDRELAYDEVICEREQUEST._serialized_start=334
_ADDRELAYDEVICEREQUEST._serialized_end=404
_REMOVERELAYDEVICEREQUEST._serialized_start=406
_REMOVERELAYDEVICEREQUEST._serialized_end=479
_LISTRELAYDEVICESREQUEST._serialized_start=481
_LISTRELAYDEVICESREQUEST._serialized_end=560
_RELAYDEVICELISTITEM._serialized_start=562
_RELAYDEVICELISTITEM._serialized_end=662
_LISTRELAYDEVICESRESPONSE._serialized_start=664
_LISTRELAYDEVICESRESPONSE._serialized_end=753
_RELAYSERVICE._serialized_start=756
_RELAYSERVICE._serialized_end=1208
# @@protoc_insertion_point(module_scope)

View File

@ -0,0 +1,79 @@
from google.api import annotations_pb2 as _annotations_pb2
from google.protobuf import timestamp_pb2 as _timestamp_pb2
from google.protobuf import empty_pb2 as _empty_pb2
from google.protobuf.internal import containers as _containers
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union
DESCRIPTOR: _descriptor.FileDescriptor
class AddRelayDeviceRequest(_message.Message):
__slots__ = ["device_dev_eui", "relay_dev_eui"]
DEVICE_DEV_EUI_FIELD_NUMBER: _ClassVar[int]
RELAY_DEV_EUI_FIELD_NUMBER: _ClassVar[int]
device_dev_eui: str
relay_dev_eui: str
def __init__(self, relay_dev_eui: _Optional[str] = ..., device_dev_eui: _Optional[str] = ...) -> None: ...
class ListRelayDevicesRequest(_message.Message):
__slots__ = ["limit", "offset", "relay_dev_eui"]
LIMIT_FIELD_NUMBER: _ClassVar[int]
OFFSET_FIELD_NUMBER: _ClassVar[int]
RELAY_DEV_EUI_FIELD_NUMBER: _ClassVar[int]
limit: int
offset: int
relay_dev_eui: str
def __init__(self, limit: _Optional[int] = ..., offset: _Optional[int] = ..., relay_dev_eui: _Optional[str] = ...) -> None: ...
class ListRelayDevicesResponse(_message.Message):
__slots__ = ["result", "total_count"]
RESULT_FIELD_NUMBER: _ClassVar[int]
TOTAL_COUNT_FIELD_NUMBER: _ClassVar[int]
result: _containers.RepeatedCompositeFieldContainer[RelayDeviceListItem]
total_count: int
def __init__(self, total_count: _Optional[int] = ..., result: _Optional[_Iterable[_Union[RelayDeviceListItem, _Mapping]]] = ...) -> None: ...
class ListRelaysRequest(_message.Message):
__slots__ = ["application_id", "limit", "offset"]
APPLICATION_ID_FIELD_NUMBER: _ClassVar[int]
LIMIT_FIELD_NUMBER: _ClassVar[int]
OFFSET_FIELD_NUMBER: _ClassVar[int]
application_id: str
limit: int
offset: int
def __init__(self, limit: _Optional[int] = ..., offset: _Optional[int] = ..., application_id: _Optional[str] = ...) -> None: ...
class ListRelaysResponse(_message.Message):
__slots__ = ["result", "total_count"]
RESULT_FIELD_NUMBER: _ClassVar[int]
TOTAL_COUNT_FIELD_NUMBER: _ClassVar[int]
result: _containers.RepeatedCompositeFieldContainer[RelayListItem]
total_count: int
def __init__(self, total_count: _Optional[int] = ..., result: _Optional[_Iterable[_Union[RelayListItem, _Mapping]]] = ...) -> None: ...
class RelayDeviceListItem(_message.Message):
__slots__ = ["created_at", "dev_eui", "name"]
CREATED_AT_FIELD_NUMBER: _ClassVar[int]
DEV_EUI_FIELD_NUMBER: _ClassVar[int]
NAME_FIELD_NUMBER: _ClassVar[int]
created_at: _timestamp_pb2.Timestamp
dev_eui: str
name: str
def __init__(self, dev_eui: _Optional[str] = ..., created_at: _Optional[_Union[_timestamp_pb2.Timestamp, _Mapping]] = ..., name: _Optional[str] = ...) -> None: ...
class RelayListItem(_message.Message):
__slots__ = ["dev_eui", "name"]
DEV_EUI_FIELD_NUMBER: _ClassVar[int]
NAME_FIELD_NUMBER: _ClassVar[int]
dev_eui: str
name: str
def __init__(self, dev_eui: _Optional[str] = ..., name: _Optional[str] = ...) -> None: ...
class RemoveRelayDeviceRequest(_message.Message):
__slots__ = ["device_dev_eui", "relay_dev_eui"]
DEVICE_DEV_EUI_FIELD_NUMBER: _ClassVar[int]
RELAY_DEV_EUI_FIELD_NUMBER: _ClassVar[int]
device_dev_eui: str
relay_dev_eui: str
def __init__(self, relay_dev_eui: _Optional[str] = ..., device_dev_eui: _Optional[str] = ...) -> None: ...

View File

@ -0,0 +1,173 @@
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
"""Client and server classes corresponding to protobuf-defined services."""
import grpc
from chirpstack_api.api import relay_pb2 as chirpstack__api_dot_api_dot_relay__pb2
from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
class RelayServiceStub(object):
"""RelayService is the service providing API methos for managing relays.
"""
def __init__(self, channel):
"""Constructor.
Args:
channel: A grpc.Channel.
"""
self.List = channel.unary_unary(
'/api.RelayService/List',
request_serializer=chirpstack__api_dot_api_dot_relay__pb2.ListRelaysRequest.SerializeToString,
response_deserializer=chirpstack__api_dot_api_dot_relay__pb2.ListRelaysResponse.FromString,
)
self.AddDevice = channel.unary_unary(
'/api.RelayService/AddDevice',
request_serializer=chirpstack__api_dot_api_dot_relay__pb2.AddRelayDeviceRequest.SerializeToString,
response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
)
self.RemoveDevice = channel.unary_unary(
'/api.RelayService/RemoveDevice',
request_serializer=chirpstack__api_dot_api_dot_relay__pb2.RemoveRelayDeviceRequest.SerializeToString,
response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
)
self.ListDevices = channel.unary_unary(
'/api.RelayService/ListDevices',
request_serializer=chirpstack__api_dot_api_dot_relay__pb2.ListRelayDevicesRequest.SerializeToString,
response_deserializer=chirpstack__api_dot_api_dot_relay__pb2.ListRelayDevicesResponse.FromString,
)
class RelayServiceServicer(object):
"""RelayService is the service providing API methos for managing relays.
"""
def List(self, request, context):
"""List lists the relays for the given application id.
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def AddDevice(self, request, context):
"""AddDevice adds the given device to the relay.
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def RemoveDevice(self, request, context):
"""RemoveDevice removes the given device from the relay.
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def ListDevices(self, request, context):
"""ListDevices lists the devices for the given relay.
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def add_RelayServiceServicer_to_server(servicer, server):
rpc_method_handlers = {
'List': grpc.unary_unary_rpc_method_handler(
servicer.List,
request_deserializer=chirpstack__api_dot_api_dot_relay__pb2.ListRelaysRequest.FromString,
response_serializer=chirpstack__api_dot_api_dot_relay__pb2.ListRelaysResponse.SerializeToString,
),
'AddDevice': grpc.unary_unary_rpc_method_handler(
servicer.AddDevice,
request_deserializer=chirpstack__api_dot_api_dot_relay__pb2.AddRelayDeviceRequest.FromString,
response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
),
'RemoveDevice': grpc.unary_unary_rpc_method_handler(
servicer.RemoveDevice,
request_deserializer=chirpstack__api_dot_api_dot_relay__pb2.RemoveRelayDeviceRequest.FromString,
response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
),
'ListDevices': grpc.unary_unary_rpc_method_handler(
servicer.ListDevices,
request_deserializer=chirpstack__api_dot_api_dot_relay__pb2.ListRelayDevicesRequest.FromString,
response_serializer=chirpstack__api_dot_api_dot_relay__pb2.ListRelayDevicesResponse.SerializeToString,
),
}
generic_handler = grpc.method_handlers_generic_handler(
'api.RelayService', rpc_method_handlers)
server.add_generic_rpc_handlers((generic_handler,))
# This class is part of an EXPERIMENTAL API.
class RelayService(object):
"""RelayService is the service providing API methos for managing relays.
"""
@staticmethod
def List(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.RelayService/List',
chirpstack__api_dot_api_dot_relay__pb2.ListRelaysRequest.SerializeToString,
chirpstack__api_dot_api_dot_relay__pb2.ListRelaysResponse.FromString,
options, channel_credentials,
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
@staticmethod
def AddDevice(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.RelayService/AddDevice',
chirpstack__api_dot_api_dot_relay__pb2.AddRelayDeviceRequest.SerializeToString,
google_dot_protobuf_dot_empty__pb2.Empty.FromString,
options, channel_credentials,
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
@staticmethod
def RemoveDevice(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.RelayService/RemoveDevice',
chirpstack__api_dot_api_dot_relay__pb2.RemoveRelayDeviceRequest.SerializeToString,
google_dot_protobuf_dot_empty__pb2.Empty.FromString,
options, channel_credentials,
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
@staticmethod
def ListDevices(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.RelayService/ListDevices',
chirpstack__api_dot_api_dot_relay__pb2.ListRelayDevicesRequest.SerializeToString,
chirpstack__api_dot_api_dot_relay__pb2.ListRelayDevicesResponse.FromString,
options, channel_credentials,
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)

File diff suppressed because one or more lines are too long

View File

@ -15,6 +15,7 @@ DOWNLINK_PAYLOAD_SIZE: LogCode
ERROR: LogLevel
INFO: LogLevel
OTAA: LogCode
RELAY_NEW_END_DEVICE: LogCode
UNKNOWN: LogCode
UPLINK_CODEC: LogCode
UPLINK_F_CNT_RESET: LogCode
@ -100,16 +101,18 @@ class IntegrationEvent(_message.Message):
def __init__(self, deduplication_id: _Optional[str] = ..., time: _Optional[_Union[_timestamp_pb2.Timestamp, _Mapping]] = ..., device_info: _Optional[_Union[DeviceInfo, _Mapping]] = ..., integration_name: _Optional[str] = ..., event_type: _Optional[str] = ..., object: _Optional[_Union[_struct_pb2.Struct, _Mapping]] = ...) -> None: ...
class JoinEvent(_message.Message):
__slots__ = ["deduplication_id", "dev_addr", "device_info", "time"]
__slots__ = ["deduplication_id", "dev_addr", "device_info", "relay_rx_info", "time"]
DEDUPLICATION_ID_FIELD_NUMBER: _ClassVar[int]
DEVICE_INFO_FIELD_NUMBER: _ClassVar[int]
DEV_ADDR_FIELD_NUMBER: _ClassVar[int]
RELAY_RX_INFO_FIELD_NUMBER: _ClassVar[int]
TIME_FIELD_NUMBER: _ClassVar[int]
deduplication_id: str
dev_addr: str
device_info: DeviceInfo
relay_rx_info: UplinkRelayRxInfo
time: _timestamp_pb2.Timestamp
def __init__(self, deduplication_id: _Optional[str] = ..., time: _Optional[_Union[_timestamp_pb2.Timestamp, _Mapping]] = ..., device_info: _Optional[_Union[DeviceInfo, _Mapping]] = ..., dev_addr: _Optional[str] = ...) -> None: ...
def __init__(self, deduplication_id: _Optional[str] = ..., time: _Optional[_Union[_timestamp_pb2.Timestamp, _Mapping]] = ..., device_info: _Optional[_Union[DeviceInfo, _Mapping]] = ..., dev_addr: _Optional[str] = ..., relay_rx_info: _Optional[_Union[UplinkRelayRxInfo, _Mapping]] = ...) -> None: ...
class LocationEvent(_message.Message):
__slots__ = ["deduplication_id", "device_info", "location", "time"]
@ -183,7 +186,7 @@ class TxAckEvent(_message.Message):
def __init__(self, downlink_id: _Optional[int] = ..., time: _Optional[_Union[_timestamp_pb2.Timestamp, _Mapping]] = ..., device_info: _Optional[_Union[DeviceInfo, _Mapping]] = ..., queue_item_id: _Optional[str] = ..., f_cnt_down: _Optional[int] = ..., gateway_id: _Optional[str] = ..., tx_info: _Optional[_Union[_gw_pb2.DownlinkTxInfo, _Mapping]] = ...) -> None: ...
class UplinkEvent(_message.Message):
__slots__ = ["adr", "confirmed", "data", "deduplication_id", "dev_addr", "device_info", "dr", "f_cnt", "f_port", "object", "rx_info", "time", "tx_info"]
__slots__ = ["adr", "confirmed", "data", "deduplication_id", "dev_addr", "device_info", "dr", "f_cnt", "f_port", "object", "relay_rx_info", "rx_info", "time", "tx_info"]
ADR_FIELD_NUMBER: _ClassVar[int]
CONFIRMED_FIELD_NUMBER: _ClassVar[int]
DATA_FIELD_NUMBER: _ClassVar[int]
@ -194,6 +197,7 @@ class UplinkEvent(_message.Message):
F_CNT_FIELD_NUMBER: _ClassVar[int]
F_PORT_FIELD_NUMBER: _ClassVar[int]
OBJECT_FIELD_NUMBER: _ClassVar[int]
RELAY_RX_INFO_FIELD_NUMBER: _ClassVar[int]
RX_INFO_FIELD_NUMBER: _ClassVar[int]
TIME_FIELD_NUMBER: _ClassVar[int]
TX_INFO_FIELD_NUMBER: _ClassVar[int]
@ -207,10 +211,27 @@ class UplinkEvent(_message.Message):
f_cnt: int
f_port: int
object: _struct_pb2.Struct
relay_rx_info: UplinkRelayRxInfo
rx_info: _containers.RepeatedCompositeFieldContainer[_gw_pb2.UplinkRxInfo]
time: _timestamp_pb2.Timestamp
tx_info: _gw_pb2.UplinkTxInfo
def __init__(self, deduplication_id: _Optional[str] = ..., time: _Optional[_Union[_timestamp_pb2.Timestamp, _Mapping]] = ..., device_info: _Optional[_Union[DeviceInfo, _Mapping]] = ..., dev_addr: _Optional[str] = ..., adr: bool = ..., dr: _Optional[int] = ..., f_cnt: _Optional[int] = ..., f_port: _Optional[int] = ..., confirmed: bool = ..., data: _Optional[bytes] = ..., object: _Optional[_Union[_struct_pb2.Struct, _Mapping]] = ..., rx_info: _Optional[_Iterable[_Union[_gw_pb2.UplinkRxInfo, _Mapping]]] = ..., tx_info: _Optional[_Union[_gw_pb2.UplinkTxInfo, _Mapping]] = ...) -> None: ...
def __init__(self, deduplication_id: _Optional[str] = ..., time: _Optional[_Union[_timestamp_pb2.Timestamp, _Mapping]] = ..., device_info: _Optional[_Union[DeviceInfo, _Mapping]] = ..., dev_addr: _Optional[str] = ..., adr: bool = ..., dr: _Optional[int] = ..., f_cnt: _Optional[int] = ..., f_port: _Optional[int] = ..., confirmed: bool = ..., data: _Optional[bytes] = ..., object: _Optional[_Union[_struct_pb2.Struct, _Mapping]] = ..., rx_info: _Optional[_Iterable[_Union[_gw_pb2.UplinkRxInfo, _Mapping]]] = ..., tx_info: _Optional[_Union[_gw_pb2.UplinkTxInfo, _Mapping]] = ..., relay_rx_info: _Optional[_Union[UplinkRelayRxInfo, _Mapping]] = ...) -> None: ...
class UplinkRelayRxInfo(_message.Message):
__slots__ = ["dev_eui", "dr", "frequency", "rssi", "snr", "wor_channel"]
DEV_EUI_FIELD_NUMBER: _ClassVar[int]
DR_FIELD_NUMBER: _ClassVar[int]
FREQUENCY_FIELD_NUMBER: _ClassVar[int]
RSSI_FIELD_NUMBER: _ClassVar[int]
SNR_FIELD_NUMBER: _ClassVar[int]
WOR_CHANNEL_FIELD_NUMBER: _ClassVar[int]
dev_eui: str
dr: int
frequency: int
rssi: int
snr: int
wor_channel: int
def __init__(self, dev_eui: _Optional[str] = ..., frequency: _Optional[int] = ..., dr: _Optional[int] = ..., snr: _Optional[int] = ..., rssi: _Optional[int] = ..., wor_channel: _Optional[int] = ...) -> None: ...
class LogLevel(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []

1
api/rust/build.rs vendored
View File

@ -194,6 +194,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
.join("request_log.proto")
.to_str()
.unwrap(),
cs_dir.join("api").join("relay.proto").to_str().unwrap(),
],
&[
proto_dir.join("chirpstack").to_str().unwrap(),

View File

@ -190,6 +190,13 @@ message Device {
// These tags are exposed in the event payloads or to integration. Tags are
// intended for aggregation and filtering.
map<string, string> tags = 9;
// JoinEUI (optional, EUI64).
// This field will be automatically set / updated on OTAA. However, in some
// cases it must be pre-configured. For example to allow OTAA using a Relay.
// In this case the Relay needs to know the JoinEUI + DevEUI combinations
// of the devices for which it needs to forward uplinks.
string join_eui = 10;
}
message DeviceStatus {

View File

@ -41,6 +41,61 @@ enum MeasurementKind {
STRING = 4;
}
enum CadPeriodicity {
// 1 second.
SEC_1 = 0;
// 500 milliseconds
MS_500 = 1;
// 250 milliseconds
MS_250 = 2;
// 100 milliseconds
MS_100 = 3;
// 50 milliseconds
MS_50 = 4;
// 20 milliseconds
MS_20 = 5;
}
enum SecondChAckOffset {
// 0 kHz.
KHZ_0 = 0;
// 200 kHz.
KHZ_200 = 1;
// 400 kHz.
KHZ_400 = 2;
// 800 kHz.
KHZ_800 = 3;
// 1600 kHz.
KHZ_1600 = 4;
// 3200 kHz.
KHZ_3200 = 5;
}
enum RelayModeActivation {
// Disable the relay mode.
DISABLE_RELAY_MODE = 0;
// Enable the relay model.
ENABLE_RELAY_MODE = 1;
// Dynamic.
DYNAMIC = 2;
// End-device controlled.
END_DEVICE_CONTROLLED = 3;
}
// DeviceProfileService is the service providing API methods for managing device-profiles.
service DeviceProfileService {
// Create the given device-profile.
@ -195,6 +250,154 @@ message DeviceProfile {
// e.g. to provide an 8 channel and 16 channel configuration for the US915
// band.
string region_config_id = 29;
// Device is a Relay device.
// Enable this in case the device is a Relay. A Relay device implements TS011
// and is able to relay data from relay capable devices.
// See for more information the TS011 specification.
bool is_relay = 30;
// Device is a Relay end-device.
// Enable this in case the device is an end-device that can operate under a
// Relay. Please refer to the TS011 specification for more information.
bool is_relay_ed = 31;
// End-device only accept data through relay.
// Only accept data for this device through a relay. This setting is useful
// for testing as in case of a test-setup, the end-device is usually within
// range of the gateway.
bool relay_ed_relay_only = 32;
// Relay must be enabled.
bool relay_enabled = 33;
// Relay CAD periodicity.
CadPeriodicity relay_cad_periodicity = 34;
// Relay default channel index.
// Valid values are 0 and 1, please refer to the RP002 specification for
// the meaning of these values.
uint32 relay_default_channel_index = 35;
// Relay second channel frequency (Hz).
uint32 relay_second_channel_freq = 36;
// Relay second channel DR.
uint32 relay_second_channel_dr = 37;
// Relay second channel ACK offset.
SecondChAckOffset relay_second_channel_ack_offset = 38;
// Relay end-device activation mode.
RelayModeActivation relay_ed_activation_mode = 39;
// Relay end-device smart-enable level.
uint32 relay_ed_smart_enable_level = 40;
// Relay end-device back-off (in case it does not receive WOR ACK frame).
// 0 = Always send a LoRaWAN uplink
// 1..63 = Send a LoRaWAN uplink after X WOR frames without a WOR ACK
uint32 relay_ed_back_off = 41;
// Relay end-device uplink limit bucket size.
//
// This field indicates the multiplier to determine the bucket size
// according to the following formula:
// BucketSize TOKEN = _reload_rate x _bucket_size
//
// Valid values (0 - 3):
// 0 = 1
// 1 = 2
// 2 = 4
// 3 = 12
uint32 relay_ed_uplink_limit_bucket_size = 42;
// Relay end-device uplink limit reload rate.
//
// Valid values:
// * 0 - 62 = X tokens every hour
// * 63 = no limitation
uint32 relay_ed_uplink_limit_reload_rate = 43;
// Relay join-request limit reload rate.
//
// Valid values:
// * 0 - 126 = X tokens every hour
// * 127 = no limitation
uint32 relay_join_req_limit_reload_rate = 44;
// Relay notify limit reload rate.
//
// Valid values:
// * 0 - 126 = X tokens every hour
// * 127 = no limitation
uint32 relay_notify_limit_reload_rate = 45;
// Relay global uplink limit reload rate.
//
// Valid values:
// * 0 - 126 = X tokens every hour
// * 127 = no limitation
uint32 relay_global_uplink_limit_reload_rate = 46;
// Relay overall limit reload rate.
//
// Valid values:
// * 0 - 126 = X tokens every hour
// * 127 = no limitation
uint32 relay_overall_limit_reload_rate = 47;
// Relay join-request limit bucket size.
//
// This field indicates the multiplier to determine the bucket size
// according to the following formula:
// BucketSize TOKEN = _reload_rate x _bucket_size
//
// Valid values (0 - 3):
// 0 = 1
// 1 = 2
// 2 = 4
// 3 = 12
uint32 relay_join_req_limit_bucket_size = 48;
// Relay notify limit bucket size.
//
// This field indicates the multiplier to determine the bucket size
// according to the following formula:
// BucketSize TOKEN = _reload_rate x _bucket_size
//
// Valid values (0 - 3):
// 0 = 1
// 1 = 2
// 2 = 4
// 3 = 12
uint32 relay_notify_limit_bucket_size = 49;
// Relay globak uplink limit bucket size.
//
// This field indicates the multiplier to determine the bucket size
// according to the following formula:
// BucketSize TOKEN = _reload_rate x _bucket_size
//
// Valid values (0 - 3):
// 0 = 1
// 1 = 2
// 2 = 4
// 3 = 12
uint32 relay_global_uplink_limit_bucket_size = 50;
// Relay overall limit bucket size.
//
// This field indicates the multiplier to determine the bucket size
// according to the following formula:
// BucketSize TOKEN = _reload_rate x _bucket_size
//
// Valid values (0 - 3):
// 0 = 1
// 1 = 2
// 2 = 4
// 3 = 12
uint32 relay_overall_limit_bucket_size = 51;
}
message Measurement {

View File

@ -34,8 +34,11 @@ message UplinkFrameLog {
// Time.
google.protobuf.Timestamp time = 7;
// Plaintext mac-commands.
bool plaintext_mac_commands = 8;
// Plaintext f_opts mac-commands.
bool plaintext_f_opts = 8;
// Plaintext frm_payload.
bool plaintext_frm_payload = 9;
}
message DownlinkFrameLog {
@ -63,6 +66,9 @@ message DownlinkFrameLog {
// Device EUI (optional).
string dev_eui = 8;
// Plaintext mac-commands.
bool plaintext_mac_commands = 9;
// Plaintext f_opts mac-commands.
bool plaintext_f_opts = 9;
// Plaintext frm_payload.
bool plaintext_frm_payload = 10;
}

View File

@ -0,0 +1,119 @@
syntax = "proto3";
package api;
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 = "RelayProto";
option csharp_namespace = "Chirpstack.Api";
import "google/api/annotations.proto";
import "google/protobuf/timestamp.proto";
import "google/protobuf/empty.proto";
// RelayService is the service providing API methos for managing relays.
service RelayService {
// List lists the relays for the given application id.
rpc List(ListRelaysRequest) returns (ListRelaysResponse) {
option(google.api.http) = {
get: "/api/relays"
};
}
// AddDevice adds the given device to the relay.
rpc AddDevice(AddRelayDeviceRequest) returns (google.protobuf.Empty) {
option(google.api.http) = {
post: "/api/relays/{relay_dev_eui}/devices"
body: "*"
};
}
// RemoveDevice removes the given device from the relay.
rpc RemoveDevice(RemoveRelayDeviceRequest) returns (google.protobuf.Empty) {
option(google.api.http) = {
delete: "/api/relays/{relay_dev_eui}/devices/{dev_eui}"
};
};
// ListDevices lists the devices for the given relay.
rpc ListDevices(ListRelayDevicesRequest) returns (ListRelayDevicesResponse) {
option(google.api.http) = {
get: "/api/relays/{relay_dev_eui}/devices"
};
};
}
message RelayListItem {
// DevEUI (EUI64).
string dev_eui = 1;
// Name.
string name = 2;
}
message ListRelaysRequest {
// Max number of devices to return in the result-set.
uint32 limit = 1;
// Offset in the result-set (for pagination).
uint32 offset = 2;
// Application ID (UUID).
string application_id = 3;
}
message ListRelaysResponse {
// Total number of relays.
uint32 total_count = 1;
// Result-set.
repeated RelayListItem result = 2;
}
message AddRelayDeviceRequest {
// Relay DevEUI (EUI64).
string relay_dev_eui = 1;
// Device DevEUI (EUI64).
string device_dev_eui = 2;
}
message RemoveRelayDeviceRequest {
// Relay DevEUI (EUI64).
string relay_dev_eui = 1;
// Device DevEUI (EUI64).
string device_dev_eui = 2;
}
message ListRelayDevicesRequest {
// Max number of multicast groups to return in the result-set.
uint32 limit = 1;
// Offset in the result-set (for pagination).
uint32 offset = 2;
// Relay DevEUI (EUI64).
string relay_dev_eui = 3;
}
message RelayDeviceListItem {
// DevEUI (EUI64).
string dev_eui = 1;
// Created at timestamp.
google.protobuf.Timestamp created_at = 2;
// Device name.
string name = 3;
}
message ListRelayDevicesResponse {
// Total number of devices.
uint32 total_count = 1;
// Result-set.
repeated RelayDeviceListItem result = 2;
}

View File

@ -13,7 +13,6 @@ import "google/protobuf/timestamp.proto";
import "google/protobuf/duration.proto";
import "google/protobuf/struct.proto";
enum CodeRate {
CR_UNDEFINED = 0;
CR_4_5 = 1; // LoRa
@ -70,13 +69,15 @@ enum TxAckStatus {
// Packet has been programmed for downlink.
OK = 1;
// Rejected because it was already too late to program this packet for downlink.
// Rejected because it was already too late to program this packet for
// downlink.
TOO_LATE = 2;
// Rejected because downlink packet timestamp is too much in advance.
TOO_EARLY = 3;
// Rejected because there was already a packet programmed in requested timeframe.
// Rejected because there was already a packet programmed in requested
// timeframe.
COLLISION_PACKET = 4;
// Rejected because there was already a beacon planned in requested timeframe.
@ -298,7 +299,8 @@ message UplinkRxInfoLegacy {
bytes context = 15;
// Uplink ID (UUID bytes).
// Unique and random ID which can be used to correlate the uplink across multiple logs.
// Unique and random ID which can be used to correlate the uplink across
// multiple logs.
bytes uplink_id = 16;
// CRC status.
@ -446,10 +448,10 @@ message ImmediatelyTimingInfo {
// Not implemented yet.
}
message DelayTimingInfo {
// Delay (duration).
// The delay will be added to the gateway internal timing, provided by the context object.
// The delay will be added to the gateway internal timing, provided by the
// context object.
google.protobuf.Duration delay = 1;
}
@ -618,7 +620,8 @@ message GatewayCommandExecRequest {
string gateway_id = 6;
// Command to execute.
// This command must be pre-configured in the LoRa Gateway Bridge configuration.
// This command must be pre-configured in the LoRa Gateway Bridge
// configuration.
string command = 2;
// Execution request ID.

View File

@ -52,6 +52,9 @@ enum LogCode {
// Downlink gateway error.
DOWNLINK_GATEWAY = 8;
// Relay new end-device.
RELAY_NEW_END_DEVICE = 9;
}
// Device information.
@ -84,6 +87,27 @@ message DeviceInfo {
map<string, string> tags = 9;
}
// Uplink relay RX information.
message UplinkRelayRxInfo {
// Relay DevEUI.
string dev_eui = 1;
// Frequency.
uint32 frequency = 2;
// Data-rate.
uint32 dr = 3;
// SNR.
int32 snr = 4;
// RSSI.
int32 rssi = 5;
// WOR channel.
uint32 wor_channel = 6;
}
// UplinkEvent is the message sent when an uplink payload has been received.
message UplinkEvent {
// Deduplication ID (UUID).
@ -116,7 +140,8 @@ message UplinkEvent {
// FRMPayload data.
bytes data = 10;
// Note that this is only set when a codec is configured in the Device Profile.
// Note that this is only set when a codec is configured in the Device
// Profile.
google.protobuf.Struct object = 11;
// Receiving gateway RX info.
@ -124,6 +149,9 @@ message UplinkEvent {
// TX info.
gw.UplinkTxInfo tx_info = 13;
// Relay info.
UplinkRelayRxInfo relay_rx_info = 14;
}
// JoinEvent is the message sent when a device joined the network.
@ -140,6 +168,9 @@ message JoinEvent {
// Device address.
string dev_addr = 4;
// Relay info.
UplinkRelayRxInfo relay_rx_info = 5;
}
// AckEvent is the message sent when a confirmation on a confirmed downlink
@ -164,9 +195,9 @@ message AckEvent {
uint32 f_cnt_down = 6;
}
// TxAckEvent is the message sent when a downlink was acknowledged by the gateway
// for transmission. As a downlink can be scheduled in the future, this event
// does not confirm that the message has already been transmitted.
// TxAckEvent is the message sent when a downlink was acknowledged by the
// gateway for transmission. As a downlink can be scheduled in the future, this
// event does not confirm that the message has already been transmitted.
message TxAckEvent {
// Downlink ID.
uint32 downlink_id = 1;

View File

@ -40,7 +40,8 @@ message DeviceSession {
// Downlink frame-counter (as).
uint32 a_f_cnt_down = 11;
// Frame-counter holding the last confirmed downlink frame (n_f_cnt_down or a_f_cnt_down).
// Frame-counter holding the last confirmed downlink frame (n_f_cnt_down or
// a_f_cnt_down).
uint32 conf_f_cnt = 12;
// Skip uplink frame-counter validation.
@ -137,6 +138,9 @@ message DeviceSession {
// Region configuration ID.
string region_config_id = 40;
// Relay state.
Relay relay = 41;
}
message UplinkAdrHistory {
@ -156,6 +160,127 @@ message UplinkAdrHistory {
uint32 gateway_count = 4;
}
message Relay {
// Devices provisioned on the relay.
repeated RelayDevice devices = 1;
// Filter list.
repeated RelayFilter filters = 2;
// Relay is enabled.
bool enabled = 3;
// CAD periodicity.
uint32 cad_periodicity = 4;
// Default channel index.
uint32 default_channel_index = 5;
// Second channel freq.
uint32 second_channel_freq = 6;
// Second channel DR.
uint32 second_channel_dr = 7;
// Second channel ACK offset.
uint32 second_channel_ack_offset = 8;
// End-device activation mode.
uint32 ed_activation_mode = 9;
// End-device smart-enable level.
uint32 ed_smart_enable_level = 10;
// End-device back-off.
uint32 ed_back_off = 11;
// Join-request limit reload rate.
uint32 join_req_limit_reload_rate = 12;
// Notify limit reload rate.
uint32 notify_limit_reload_rate = 13;
// Global uplink limit reload rate.
uint32 global_uplink_limit_reload_rate = 14;
// Overall limit reload rate.
uint32 overall_limit_reload_rate = 15;
// Join-request limit bucket size.
uint32 join_req_limit_bucket_size = 16;
// Notify limit bucket size.
uint32 notify_limit_bucket_size = 17;
// Global uplink limit bucket size.
uint32 global_uplink_limit_bucket_size = 18;
// Overall limit bucket size.
uint32 overall_limit_bucket_size = 19;
// End-device must communicate through relay only.
// This is stored in the device-session as we need to validate on retrieving
// the device-session.
bool ed_relay_only = 20;
// End-device WFCnt.
// This holds the last known WFCnt value. ChirpStack will periodically read
// this value from the Relay.
uint32 w_f_cnt = 21;
}
message RelayDevice {
// Index (used for filter and uplink filters).
// This must be between 0 - 15.
uint32 index = 1;
// JoinEUI (EUI64).
bytes join_eui = 2;
// DevEUI (EUI64).
bytes dev_eui = 3;
// DevAddr.
bytes dev_addr = 4;
// RootWorSKey.
bytes root_wor_s_key = 5;
// Provisioned.
bool provisioned = 6;
// Uplink limit bucket size.
uint32 uplink_limit_bucket_size = 7;
// Uplink limit reload rate.
uint32 uplink_limit_reload_rate = 8;
// Timestamp of the last WFCnt request.
// Note that ChirpStack periodically requests the WFCnt from the relay.
google.protobuf.Timestamp w_f_cnt_last_request = 9;
}
message RelayFilter {
// Index.
// This must be between 0 - 15.
uint32 index = 1;
// Action.
// * 0: No Rule
// * 1: Forward
// * 2: Filter
uint32 action = 2;
// DevEUI (EUI64).
bytes dev_eui = 3;
// JoinEUI (EUI64).
bytes join_eui = 4;
// Provisioned.
bool provisioned = 5;
}
message DeviceSessionChannel {
// Frequency Hz.
uint32 frequency = 1;
@ -234,6 +359,12 @@ message DownlinkFrame {
// NFCntDown (for decrypting mac-commands).
uint32 n_f_cnt_down = 10;
// AFCntDown (for decrypting FRMPayload in case of Relay).
uint32 a_f_cnt_down = 11;
// DevEUI of relayed device.
bytes dev_eui_relayed = 12;
}
message LoraCloudGeolocBuffer {

View File

@ -30,6 +30,7 @@ impl Into<String> for LogCode {
LogCode::UplinkMic => "UPLINK_MIC",
LogCode::UplinkFCntRetransmission => "UPLINK_F_CNT_RETRANSMISSION",
LogCode::DownlinkGateway => "DOWNLINK_GATEWAY",
LogCode::RelayNewEndDevice => "RELAY_NEW_END_DEVICE",
}
.to_string()
}

View File

@ -1,3 +1,25 @@
include!(concat!(env!("OUT_DIR"), "/internal/internal.rs"));
#[cfg(feature = "json")]
include!(concat!(env!("OUT_DIR"), "/internal/internal.serde.rs"));
impl DeviceSession {
pub fn get_a_f_cnt_down(&self) -> u32 {
if self.mac_version().to_string().starts_with("1.0") {
// LoRaWAN 1.0
self.n_f_cnt_down
} else {
// LoRaWAN 1.1
self.a_f_cnt_down
}
}
pub fn set_a_f_cnt_down(&mut self, f_cnt: u32) {
if self.mac_version().to_string().starts_with("1.0") {
// LoRaWAN 1.0
self.n_f_cnt_down = f_cnt;
} else {
// LoRaWAN 1.1
self.a_f_cnt_down = f_cnt;
}
}
}

View File

@ -30,6 +30,7 @@ diesel = { version = "2.0", features = [
"uuid",
"serde_json",
"numeric",
"64-column-tables",
] }
diesel_migrations = { version = "2.0" }
r2d2 = "0.8"

View File

@ -0,0 +1,29 @@
alter table device
drop column join_eui;
drop table relay_device;
alter table device_profile
drop column is_relay,
drop column is_relay_ed,
drop column relay_ed_relay_only,
drop column relay_enabled,
drop column relay_cad_periodicity,
drop column relay_default_channel_index,
drop column relay_second_channel_freq,
drop column relay_second_channel_dr,
drop column relay_second_channel_ack_offset,
drop column relay_ed_activation_mode,
drop column relay_ed_smart_enable_level,
drop column relay_ed_back_off,
drop column relay_ed_uplink_limit_bucket_size,
drop column relay_ed_uplink_limit_reload_rate,
drop column relay_join_req_limit_reload_rate,
drop column relay_notify_limit_reload_rate,
drop column relay_global_uplink_limit_reload_rate,
drop column relay_overall_limit_reload_rate,
drop column relay_join_req_limit_bucket_size,
drop column relay_notify_limit_bucket_size,
drop column relay_global_uplink_limit_bucket_size,
drop column relay_overall_limit_bucket_size;

View File

@ -0,0 +1,60 @@
alter table device_profile
add column is_relay boolean not null default false,
add column is_relay_ed boolean not null default false,
add column relay_ed_relay_only boolean not null default false,
add column relay_enabled boolean not null default false,
add column relay_cad_periodicity smallint not null default 0,
add column relay_default_channel_index smallint not null default 0,
add column relay_second_channel_freq bigint not null default 0,
add column relay_second_channel_dr smallint not null default 0,
add column relay_second_channel_ack_offset smallint not null default 0,
add column relay_ed_activation_mode smallint not null default 0,
add column relay_ed_smart_enable_level smallint not null default 0,
add column relay_ed_back_off smallint not null default 0,
add column relay_ed_uplink_limit_bucket_size smallint not null default 0,
add column relay_ed_uplink_limit_reload_rate smallint not null default 0,
add column relay_join_req_limit_reload_rate smallint not null default 0,
add column relay_notify_limit_reload_rate smallint not null default 0,
add column relay_global_uplink_limit_reload_rate smallint not null default 0,
add column relay_overall_limit_reload_rate smallint not null default 0,
add column relay_join_req_limit_bucket_size smallint not null default 0,
add column relay_notify_limit_bucket_size smallint not null default 0,
add column relay_global_uplink_limit_bucket_size smallint not null default 0,
add column relay_overall_limit_bucket_size smallint not null default 0;
alter table device_profile
alter column is_relay drop default,
alter column is_relay_ed drop default,
alter column relay_ed_relay_only drop default,
alter column relay_enabled drop default,
alter column relay_cad_periodicity drop default,
alter column relay_default_channel_index drop default,
alter column relay_second_channel_freq drop default,
alter column relay_second_channel_dr drop default,
alter column relay_second_channel_ack_offset drop default,
alter column relay_ed_activation_mode drop default,
alter column relay_ed_smart_enable_level drop default,
alter column relay_ed_back_off drop default,
alter column relay_ed_uplink_limit_bucket_size drop default,
alter column relay_ed_uplink_limit_reload_rate drop default,
alter column relay_join_req_limit_reload_rate drop default,
alter column relay_notify_limit_reload_rate drop default,
alter column relay_global_uplink_limit_reload_rate drop default,
alter column relay_overall_limit_reload_rate drop default,
alter column relay_join_req_limit_bucket_size drop default,
alter column relay_notify_limit_bucket_size drop default,
alter column relay_global_uplink_limit_bucket_size drop default,
alter column relay_overall_limit_bucket_size drop default;
create table relay_device (
relay_dev_eui bytea not null references device on delete cascade,
dev_eui bytea not null references device on delete cascade,
created_at timestamp with time zone not null,
primary key (relay_dev_eui, dev_eui)
);
alter table device
add column join_eui bytea not null default decode('0000000000000000', 'hex');
alter table device
alter column join_eui drop default;

View File

@ -46,6 +46,11 @@ impl DeviceService for Device {
let dev_eui = EUI64::from_str(&req_d.dev_eui).map_err(|e| e.status())?;
let app_id = Uuid::from_str(&req_d.application_id).map_err(|e| e.status())?;
let dp_id = Uuid::from_str(&req_d.device_profile_id).map_err(|e| e.status())?;
let join_eui = if req_d.join_eui.is_empty() {
EUI64::default()
} else {
EUI64::from_str(&req_d.join_eui).map_err(|e| e.status())?
};
self.validator
.validate(
@ -64,6 +69,7 @@ impl DeviceService for Device {
is_disabled: req_d.is_disabled,
tags: fields::KeyValue::new(req_d.tags.clone()),
variables: fields::KeyValue::new(req_d.variables.clone()),
join_eui,
..Default::default()
};
@ -107,6 +113,7 @@ impl DeviceService for Device {
is_disabled: d.is_disabled,
variables: d.variables.into_hashmap(),
tags: d.tags.into_hashmap(),
join_eui: d.join_eui.to_string(),
}),
created_at: Some(helpers::datetime_to_prost_timestamp(&d.created_at)),
updated_at: Some(helpers::datetime_to_prost_timestamp(&d.updated_at)),
@ -145,6 +152,11 @@ impl DeviceService for Device {
let dev_eui = EUI64::from_str(&req_d.dev_eui).map_err(|e| e.status())?;
let app_id = Uuid::from_str(&req_d.application_id).map_err(|e| e.status())?;
let dp_id = Uuid::from_str(&req_d.device_profile_id).map_err(|e| e.status())?;
let join_eui = if req_d.join_eui.is_empty() {
EUI64::default()
} else {
EUI64::from_str(&req_d.join_eui).map_err(|e| e.status())?
};
// Does the user have access to the device?
self.validator
@ -183,6 +195,7 @@ impl DeviceService for Device {
is_disabled: req_d.is_disabled,
tags: fields::KeyValue::new(req_d.tags.clone()),
variables: fields::KeyValue::new(req_d.variables.clone()),
join_eui,
..Default::default()
})
.await
@ -1191,6 +1204,7 @@ pub mod test {
device_profile_id: dp.id.to_string(),
name: "test-device".into(),
dev_eui: "0102030405060708".into(),
join_eui: "0000000000000000".into(),
..Default::default()
}),
get_resp.get_ref().device
@ -1205,6 +1219,7 @@ pub mod test {
device_profile_id: dp.id.to_string(),
name: "test-device-updated".into(),
dev_eui: "0102030405060708".into(),
join_eui: "0807060504030201".into(),
..Default::default()
}),
},
@ -1225,6 +1240,7 @@ pub mod test {
device_profile_id: dp.id.to_string(),
name: "test-device-updated".into(),
dev_eui: "0102030405060708".into(),
join_eui: "0807060504030201".into(),
..Default::default()
}),
get_resp.get_ref().device

View File

@ -88,6 +88,30 @@ impl DeviceProfileService for DeviceProfile {
auto_detect_measurements: req_dp.auto_detect_measurements,
region_config_id: (!req_dp.region_config_id.is_empty())
.then(|| req_dp.region_config_id.clone()),
is_relay: req_dp.is_relay,
is_relay_ed: req_dp.is_relay_ed,
relay_ed_relay_only: req_dp.relay_ed_relay_only,
relay_enabled: req_dp.relay_enabled,
relay_cad_periodicity: req_dp.relay_cad_periodicity as i16,
relay_default_channel_index: req_dp.relay_default_channel_index as i16,
relay_second_channel_freq: req_dp.relay_second_channel_freq as i64,
relay_second_channel_dr: req_dp.relay_second_channel_dr as i16,
relay_second_channel_ack_offset: req_dp.relay_second_channel_ack_offset as i16,
relay_ed_activation_mode: req_dp.relay_ed_activation_mode().from_proto(),
relay_ed_smart_enable_level: req_dp.relay_ed_smart_enable_level as i16,
relay_ed_back_off: req_dp.relay_ed_back_off as i16,
relay_ed_uplink_limit_bucket_size: req_dp.relay_ed_uplink_limit_bucket_size as i16,
relay_ed_uplink_limit_reload_rate: req_dp.relay_ed_uplink_limit_reload_rate as i16,
relay_join_req_limit_reload_rate: req_dp.relay_join_req_limit_reload_rate as i16,
relay_notify_limit_reload_rate: req_dp.relay_notify_limit_reload_rate as i16,
relay_global_uplink_limit_reload_rate: req_dp.relay_global_uplink_limit_reload_rate
as i16,
relay_overall_limit_reload_rate: req_dp.relay_overall_limit_reload_rate as i16,
relay_join_req_limit_bucket_size: req_dp.relay_join_req_limit_bucket_size as i16,
relay_notify_limit_bucket_size: req_dp.relay_notify_limit_bucket_size as i16,
relay_global_uplink_limit_bucket_size: req_dp.relay_global_uplink_limit_bucket_size
as i16,
relay_overall_limit_bucket_size: req_dp.relay_overall_limit_bucket_size as i16,
..Default::default()
};
@ -164,6 +188,30 @@ impl DeviceProfileService for DeviceProfile {
.collect(),
auto_detect_measurements: dp.auto_detect_measurements,
region_config_id: dp.region_config_id.clone().unwrap_or_default(),
is_relay: dp.is_relay,
is_relay_ed: dp.is_relay_ed,
relay_ed_relay_only: dp.relay_ed_relay_only,
relay_enabled: dp.relay_enabled,
relay_cad_periodicity: dp.relay_cad_periodicity as i32,
relay_default_channel_index: dp.relay_default_channel_index as u32,
relay_second_channel_freq: dp.relay_second_channel_freq as u32,
relay_second_channel_dr: dp.relay_second_channel_dr as u32,
relay_second_channel_ack_offset: dp.relay_second_channel_ack_offset as i32,
relay_ed_activation_mode: dp.relay_ed_activation_mode.to_proto().into(),
relay_ed_smart_enable_level: dp.relay_ed_smart_enable_level as u32,
relay_ed_back_off: dp.relay_ed_back_off as u32,
relay_ed_uplink_limit_bucket_size: dp.relay_ed_uplink_limit_bucket_size as u32,
relay_ed_uplink_limit_reload_rate: dp.relay_ed_uplink_limit_reload_rate as u32,
relay_join_req_limit_reload_rate: dp.relay_join_req_limit_reload_rate as u32,
relay_notify_limit_reload_rate: dp.relay_notify_limit_reload_rate as u32,
relay_global_uplink_limit_reload_rate: dp.relay_global_uplink_limit_reload_rate
as u32,
relay_overall_limit_reload_rate: dp.relay_overall_limit_reload_rate as u32,
relay_join_req_limit_bucket_size: dp.relay_join_req_limit_bucket_size as u32,
relay_notify_limit_bucket_size: dp.relay_notify_limit_bucket_size as u32,
relay_global_uplink_limit_bucket_size: dp.relay_global_uplink_limit_bucket_size
as u32,
relay_overall_limit_bucket_size: dp.relay_overall_limit_bucket_size as u32,
}),
created_at: Some(helpers::datetime_to_prost_timestamp(&dp.created_at)),
updated_at: Some(helpers::datetime_to_prost_timestamp(&dp.updated_at)),
@ -238,6 +286,30 @@ impl DeviceProfileService for DeviceProfile {
auto_detect_measurements: req_dp.auto_detect_measurements,
region_config_id: (!req_dp.region_config_id.is_empty())
.then(|| req_dp.region_config_id.clone()),
is_relay: req_dp.is_relay,
is_relay_ed: req_dp.is_relay_ed,
relay_ed_relay_only: req_dp.relay_ed_relay_only,
relay_enabled: req_dp.relay_enabled,
relay_cad_periodicity: req_dp.relay_cad_periodicity as i16,
relay_default_channel_index: req_dp.relay_default_channel_index as i16,
relay_second_channel_freq: req_dp.relay_second_channel_freq as i64,
relay_second_channel_dr: req_dp.relay_second_channel_dr as i16,
relay_second_channel_ack_offset: req_dp.relay_second_channel_ack_offset as i16,
relay_ed_activation_mode: req_dp.relay_ed_activation_mode().from_proto(),
relay_ed_smart_enable_level: req_dp.relay_ed_smart_enable_level as i16,
relay_ed_back_off: req_dp.relay_ed_back_off as i16,
relay_ed_uplink_limit_bucket_size: req_dp.relay_ed_uplink_limit_bucket_size as i16,
relay_ed_uplink_limit_reload_rate: req_dp.relay_ed_uplink_limit_reload_rate as i16,
relay_join_req_limit_reload_rate: req_dp.relay_join_req_limit_reload_rate as i16,
relay_notify_limit_reload_rate: req_dp.relay_notify_limit_reload_rate as i16,
relay_global_uplink_limit_reload_rate: req_dp.relay_global_uplink_limit_reload_rate
as i16,
relay_overall_limit_reload_rate: req_dp.relay_overall_limit_reload_rate as i16,
relay_join_req_limit_bucket_size: req_dp.relay_join_req_limit_bucket_size as i16,
relay_notify_limit_bucket_size: req_dp.relay_notify_limit_bucket_size as i16,
relay_global_uplink_limit_bucket_size: req_dp.relay_global_uplink_limit_bucket_size
as i16,
relay_overall_limit_bucket_size: req_dp.relay_overall_limit_bucket_size as i16,
..Default::default()
})
.await

View File

@ -219,6 +219,36 @@ impl FromProto<MulticastGroupSchedulingType> for api::MulticastGroupSchedulingTy
}
}
impl ToProto<api::RelayModeActivation> for lrwn::RelayModeActivation {
fn to_proto(self) -> api::RelayModeActivation {
match self {
lrwn::RelayModeActivation::DisableRelayMode => {
api::RelayModeActivation::DisableRelayMode
}
lrwn::RelayModeActivation::EnableRelayMode => api::RelayModeActivation::EnableRelayMode,
lrwn::RelayModeActivation::Dynamic => api::RelayModeActivation::Dynamic,
lrwn::RelayModeActivation::EndDeviceControlled => {
api::RelayModeActivation::EndDeviceControlled
}
}
}
}
impl FromProto<lrwn::RelayModeActivation> for api::RelayModeActivation {
fn from_proto(self) -> lrwn::RelayModeActivation {
match self {
api::RelayModeActivation::DisableRelayMode => {
lrwn::RelayModeActivation::DisableRelayMode
}
api::RelayModeActivation::EnableRelayMode => lrwn::RelayModeActivation::EnableRelayMode,
api::RelayModeActivation::Dynamic => lrwn::RelayModeActivation::Dynamic,
api::RelayModeActivation::EndDeviceControlled => {
lrwn::RelayModeActivation::EndDeviceControlled
}
}
}
}
pub fn datetime_to_prost_timestamp(dt: &DateTime<Utc>) -> prost_types::Timestamp {
let ts = dt.timestamp_nanos();

View File

@ -33,6 +33,7 @@ use chirpstack_api::api::device_service_server::DeviceServiceServer;
use chirpstack_api::api::gateway_service_server::GatewayServiceServer;
use chirpstack_api::api::internal_service_server::InternalServiceServer;
use chirpstack_api::api::multicast_group_service_server::MulticastGroupServiceServer;
use chirpstack_api::api::relay_service_server::RelayServiceServer;
use chirpstack_api::api::tenant_service_server::TenantServiceServer;
use chirpstack_api::api::user_service_server::UserServiceServer;
@ -54,6 +55,7 @@ pub mod internal;
pub mod monitoring;
pub mod multicast;
pub mod oidc;
pub mod relay;
pub mod tenant;
pub mod user;
@ -151,6 +153,10 @@ pub async fn setup() -> Result<()> {
multicast::MulticastGroup::new(validator::RequestValidator::new()),
auth::auth_interceptor,
))
.add_service(RelayServiceServer::with_interceptor(
relay::Relay::new(validator::RequestValidator::new()),
auth::auth_interceptor,
))
.into_service();
let mut tonic_service = ServiceBuilder::new()
.layer(

321
chirpstack/src/api/relay.rs Normal file
View File

@ -0,0 +1,321 @@
use std::str::FromStr;
use tonic::{Request, Response, Status};
use uuid::Uuid;
use chirpstack_api::api;
use chirpstack_api::api::relay_service_server::RelayService;
use lrwn::EUI64;
use super::auth::validator;
use super::error::ToStatus;
use super::helpers;
use crate::storage::relay;
pub struct Relay {
validator: validator::RequestValidator,
}
impl Relay {
pub fn new(validator: validator::RequestValidator) -> Self {
Relay { validator }
}
}
#[tonic::async_trait]
impl RelayService for Relay {
async fn list(
&self,
request: Request<api::ListRelaysRequest>,
) -> Result<Response<api::ListRelaysResponse>, Status> {
let req = request.get_ref();
let app_id = Uuid::from_str(&req.application_id).map_err(|e| e.status())?;
self.validator
.validate(
request.extensions(),
validator::ValidateDevicesAccess::new(validator::Flag::List, app_id),
)
.await?;
let filters = relay::RelayFilters {
application_id: Some(app_id),
};
let count = relay::get_relay_count(&filters)
.await
.map_err(|e| e.status())?;
let items = relay::list_relays(req.limit as i64, req.offset as i64, &filters)
.await
.map_err(|e| e.status())?;
let mut resp = Response::new(api::ListRelaysResponse {
total_count: count as u32,
result: items
.iter()
.map(|r| api::RelayListItem {
dev_eui: r.dev_eui.to_string(),
name: r.name.clone(),
})
.collect(),
});
resp.metadata_mut()
.insert("x-log-application_id", req.application_id.parse().unwrap());
Ok(resp)
}
async fn add_device(
&self,
request: Request<api::AddRelayDeviceRequest>,
) -> Result<Response<()>, Status> {
let req = request.get_ref();
let relay_dev_eui = EUI64::from_str(&req.relay_dev_eui).map_err(|e| e.status())?;
let device_dev_eui = EUI64::from_str(&req.device_dev_eui).map_err(|e| e.status())?;
self.validator
.validate(
request.extensions(),
validator::ValidateDeviceAccess::new(validator::Flag::Update, relay_dev_eui),
)
.await?;
self.validator
.validate(
request.extensions(),
validator::ValidateDeviceAccess::new(validator::Flag::Update, device_dev_eui),
)
.await?;
relay::add_device(relay_dev_eui, device_dev_eui)
.await
.map_err(|e| e.status())?;
let mut resp = Response::new(());
resp.metadata_mut()
.insert("x-log-relay_dev_eui", req.relay_dev_eui.parse().unwrap());
resp.metadata_mut()
.insert("x-log-device_dev_eui", req.device_dev_eui.parse().unwrap());
Ok(resp)
}
async fn remove_device(
&self,
request: Request<api::RemoveRelayDeviceRequest>,
) -> Result<Response<()>, Status> {
let req = request.get_ref();
let relay_dev_eui = EUI64::from_str(&req.relay_dev_eui).map_err(|e| e.status())?;
let device_dev_eui = EUI64::from_str(&req.device_dev_eui).map_err(|e| e.status())?;
self.validator
.validate(
request.extensions(),
validator::ValidateDeviceAccess::new(validator::Flag::Update, relay_dev_eui),
)
.await?;
self.validator
.validate(
request.extensions(),
validator::ValidateDeviceAccess::new(validator::Flag::Update, device_dev_eui),
)
.await?;
relay::remove_device(relay_dev_eui, device_dev_eui)
.await
.map_err(|e| e.status())?;
let mut resp = Response::new(());
resp.metadata_mut()
.insert("x-log-relay_dev_eui", req.relay_dev_eui.parse().unwrap());
resp.metadata_mut()
.insert("x-log-device_dev_eui", req.device_dev_eui.parse().unwrap());
Ok(resp)
}
async fn list_devices(
&self,
request: Request<api::ListRelayDevicesRequest>,
) -> Result<Response<api::ListRelayDevicesResponse>, Status> {
let req = request.get_ref();
let relay_dev_eui = EUI64::from_str(&req.relay_dev_eui).map_err(|e| e.status())?;
self.validator
.validate(
request.extensions(),
validator::ValidateDeviceAccess::new(validator::Flag::Read, relay_dev_eui),
)
.await?;
let filters = relay::DeviceFilters {
relay_dev_eui: Some(relay_dev_eui),
};
let count = relay::get_device_count(&filters)
.await
.map_err(|e| e.status())?;
let items = relay::list_devices(req.limit as i64, req.offset as i64, &filters)
.await
.map_err(|e| e.status())?;
let mut resp = Response::new(api::ListRelayDevicesResponse {
total_count: count as u32,
result: items
.iter()
.map(|d| api::RelayDeviceListItem {
dev_eui: d.dev_eui.to_string(),
name: d.name.clone(),
created_at: Some(helpers::datetime_to_prost_timestamp(&d.created_at)),
})
.collect(),
});
resp.metadata_mut()
.insert("x-log-relay_dev_eui", req.relay_dev_eui.parse().unwrap());
Ok(resp)
}
}
#[cfg(test)]
pub mod test {
use super::*;
use crate::api::auth::validator::RequestValidator;
use crate::api::auth::AuthID;
use crate::storage::{application, device, device_profile, tenant, user};
use crate::test;
#[tokio::test]
async fn test_relay() {
let _guard = test::prepare().await;
// setup admin user
let u = user::User {
is_admin: true,
is_active: true,
email: "admin@admin".into(),
email_verified: true,
..Default::default()
};
let u = user::create(u).await.unwrap();
// create tenant
let t = tenant::create(tenant::Tenant {
name: "test-tenant".into(),
..Default::default()
})
.await
.unwrap();
// create application
let app = application::create(application::Application {
name: "test-app".into(),
tenant_id: t.id,
..Default::default()
})
.await
.unwrap();
// create device-profile
let dp = device_profile::create(device_profile::DeviceProfile {
name: "test-dp".into(),
tenant_id: t.id,
..Default::default()
})
.await
.unwrap();
// create relay device-profile
let dp_relay = device_profile::create(device_profile::DeviceProfile {
name: "test-dp".into(),
tenant_id: t.id,
is_relay: true,
..Default::default()
})
.await
.unwrap();
// create devices
let d_relay = device::create(device::Device {
name: "relay-device".into(),
dev_eui: EUI64::from_be_bytes([1, 2, 3, 4, 5, 6, 7, 8]),
device_profile_id: dp_relay.id,
application_id: app.id,
..Default::default()
})
.await
.unwrap();
let d = device::create(device::Device {
name: "device".into(),
dev_eui: EUI64::from_be_bytes([2, 2, 3, 4, 5, 6, 7, 8]),
device_profile_id: dp.id,
application_id: app.id,
..Default::default()
})
.await
.unwrap();
// setup the api
let service = Relay::new(RequestValidator::new());
// list relays
let list_req = get_request(
&u.id,
api::ListRelaysRequest {
application_id: app.id.to_string(),
limit: 10,
..Default::default()
},
);
let list_resp = service.list(list_req).await.unwrap();
assert_eq!(1, list_resp.get_ref().total_count);
// add device
let add_req = get_request(
&u.id,
api::AddRelayDeviceRequest {
relay_dev_eui: d_relay.dev_eui.to_string(),
device_dev_eui: d.dev_eui.to_string(),
},
);
let _ = service.add_device(add_req).await.unwrap();
// list devices
let list_req = get_request(
&u.id,
api::ListRelayDevicesRequest {
relay_dev_eui: d_relay.dev_eui.to_string(),
limit: 10,
..Default::default()
},
);
let list_resp = service.list_devices(list_req).await.unwrap();
assert_eq!(1, list_resp.get_ref().total_count);
assert_eq!(1, list_resp.get_ref().result.len());
assert_eq!(d.dev_eui.to_string(), list_resp.get_ref().result[0].dev_eui);
// remove device
let remove_req = get_request(
&u.id,
api::RemoveRelayDeviceRequest {
relay_dev_eui: d_relay.dev_eui.to_string(),
device_dev_eui: d.dev_eui.to_string(),
},
);
let _ = service.remove_device(remove_req).await.unwrap();
let remove_req = get_request(
&u.id,
api::RemoveRelayDeviceRequest {
relay_dev_eui: d_relay.dev_eui.to_string(),
device_dev_eui: d.dev_eui.to_string(),
},
);
assert!(service.remove_device(remove_req).await.is_err());
}
fn get_request<T>(user_id: &Uuid, req: T) -> Request<T> {
let mut req = Request::new(req);
req.extensions_mut().insert(AuthID::User(user_id.clone()));
req
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,6 @@
use std::str::FromStr;
use std::sync::Arc;
use std::time::Duration;
use anyhow::{Context, Result};
use rand::Rng;
@ -8,14 +9,16 @@ use tracing::{span, trace, Instrument, Level};
use lrwn::{PhyPayload, EUI64};
use super::helpers;
use crate::api::helpers::FromProto;
use crate::gateway::backend::send_downlink;
use crate::storage::{device, downlink_frame, tenant};
use crate::uplink::UplinkFrameSet;
use crate::uplink::{RelayContext, UplinkFrameSet};
use crate::{config, region};
use chirpstack_api::{gw, internal};
pub struct JoinAccept<'a> {
uplink_frame_set: &'a UplinkFrameSet,
relay_context: Option<&'a RelayContext>,
tenant: &'a tenant::Tenant,
device: &'a device::Device,
device_session: &'a internal::DeviceSession,
@ -42,6 +45,27 @@ impl JoinAccept<'_> {
fut.instrument(span).await
}
pub async fn handle_relayed(
relay_ctx: &RelayContext,
ufs: &UplinkFrameSet,
tenant: &tenant::Tenant,
device: &device::Device,
device_session: &internal::DeviceSession,
join_accept: &PhyPayload,
) -> Result<()> {
let span = span!(Level::TRACE, "join_accept_relayed", downlink_id = %ufs.uplink_set_id);
let fut = JoinAccept::_handle_relayed(
relay_ctx,
ufs,
tenant,
device,
device_session,
join_accept,
);
fut.instrument(span).await
}
async fn _handle(
ufs: &UplinkFrameSet,
tenant: &tenant::Tenant,
@ -51,6 +75,7 @@ impl JoinAccept<'_> {
) -> Result<()> {
let mut ctx = JoinAccept {
uplink_frame_set: ufs,
relay_context: None,
tenant,
device,
device_session,
@ -70,8 +95,44 @@ impl JoinAccept<'_> {
ctx.select_downlink_gateway()?;
ctx.set_tx_info()?;
ctx.set_downlink_frame()?;
ctx.send_join_accept_response().await?;
ctx.save_downlink_frame().await?;
ctx.send_join_accept_response().await?;
Ok(())
}
async fn _handle_relayed(
relay_ctx: &RelayContext,
ufs: &UplinkFrameSet,
tenant: &tenant::Tenant,
device: &device::Device,
device_session: &internal::DeviceSession,
join_accept: &PhyPayload,
) -> Result<()> {
let mut ctx = JoinAccept {
uplink_frame_set: ufs,
relay_context: Some(relay_ctx),
tenant,
device,
device_session,
join_accept,
network_conf: config::get_region_network(&ufs.region_config_id)?,
region_conf: region::get(&ufs.region_config_id)?,
downlink_frame: chirpstack_api::gw::DownlinkFrame {
downlink_id: rand::thread_rng().gen(),
..Default::default()
},
device_gateway_rx_info: None,
downlink_gateway: None,
};
ctx.set_device_gateway_rx_info()?;
ctx.select_downlink_gateway()?;
ctx.set_tx_info_relayed()?;
ctx.set_downlink_frame_relayed()?;
ctx.send_join_accept_response().await?;
ctx.save_downlink_frame_relayed().await?;
Ok(())
}
@ -152,6 +213,20 @@ impl JoinAccept<'_> {
Ok(())
}
fn set_tx_info_relayed(&mut self) -> Result<()> {
trace!("Setting tx-info for relay");
if self.network_conf.rx_window == 0 || self.network_conf.rx_window == 1 {
self.set_tx_info_for_rx1_relayed()?;
}
if self.network_conf.rx_window == 0 || self.network_conf.rx_window == 2 {
self.set_tx_info_for_rx2_relayed()?;
}
Ok(())
}
fn set_tx_info_for_rx1(&mut self) -> Result<()> {
trace!("Setting tx-info for RX1");
let gw_down = self.downlink_gateway.as_ref().unwrap();
@ -184,7 +259,7 @@ impl JoinAccept<'_> {
tx_info.power = self.region_conf.get_downlink_tx_power(tx_info.frequency) as i32;
}
// set timestamp
// Set timestamp.
tx_info.timing = Some(gw::Timing {
parameters: Some(gw::timing::Parameters::Delay(gw::DelayTimingInfo {
delay: Some(pbjson_types::Duration::from(
@ -204,18 +279,81 @@ impl JoinAccept<'_> {
Ok(())
}
fn set_tx_info_for_rx2(&mut self) -> Result<()> {
trace!("Setting tx-info for RX2");
fn set_tx_info_for_rx1_relayed(&mut self) -> Result<()> {
trace!("Setting relay tx-info for RX1");
let gw_down = self.downlink_gateway.as_ref().unwrap();
let relay_ctx = self.relay_context.unwrap();
let mut tx_info = chirpstack_api::gw::DownlinkTxInfo {
board: gw_down.board,
antenna: gw_down.antenna,
frequency: self.region_conf.get_defaults().rx2_frequency,
context: gw_down.context.clone(),
..Default::default()
};
// Get RX1 DR offset.
let rx1_dr_offset = relay_ctx.device_session.rx1_dr_offset as usize;
// get RX1 DR.
let rx1_dr_index = self
.region_conf
.get_rx1_data_rate_index(self.uplink_frame_set.dr, rx1_dr_offset)?;
let rx1_dr = self.region_conf.get_data_rate(rx1_dr_index)?;
// set DR to tx_info.
helpers::set_tx_info_data_rate(&mut tx_info, &rx1_dr)?;
// set frequency
tx_info.frequency = self
.region_conf
.get_rx1_frequency_for_uplink_frequency(self.uplink_frame_set.tx_info.frequency)?;
// set tx power
if self.network_conf.downlink_tx_power != -1 {
tx_info.power = self.network_conf.downlink_tx_power;
} else {
tx_info.power = self.region_conf.get_downlink_tx_power(tx_info.frequency) as i32;
}
// Set timestamp.
let delay = if relay_ctx.device_session.rx1_delay > 0 {
Duration::from_secs(relay_ctx.device_session.rx1_delay as u64)
} else {
self.region_conf.get_defaults().rx1_delay
};
tx_info.timing = Some(gw::Timing {
parameters: Some(gw::timing::Parameters::Delay(gw::DelayTimingInfo {
delay: Some(pbjson_types::Duration::from(delay)),
})),
});
// set downlink item
self.downlink_frame
.items
.push(chirpstack_api::gw::DownlinkFrameItem {
tx_info: Some(tx_info),
..Default::default()
});
Ok(())
}
fn set_tx_info_for_rx2(&mut self) -> Result<()> {
trace!("Setting tx-info for RX2");
let gw_down = self.downlink_gateway.as_ref().unwrap();
// Get frequency.
let frequency = self.region_conf.get_defaults().rx2_frequency;
let mut tx_info = chirpstack_api::gw::DownlinkTxInfo {
board: gw_down.board,
antenna: gw_down.antenna,
context: gw_down.context.clone(),
frequency,
..Default::default()
};
// get RX2 DR
let rx2_dr_index = self.region_conf.get_defaults().rx2_dr;
let rx2_dr = self.region_conf.get_data_rate(rx2_dr_index)?;
@ -230,7 +368,7 @@ impl JoinAccept<'_> {
tx_info.power = self.region_conf.get_downlink_tx_power(tx_info.frequency) as i32;
}
// set timestamp
// Set timestamp.
tx_info.timing = Some(gw::Timing {
parameters: Some(gw::timing::Parameters::Delay(gw::DelayTimingInfo {
delay: Some(pbjson_types::Duration::from(
@ -250,7 +388,63 @@ impl JoinAccept<'_> {
Ok(())
}
fn set_tx_info_for_rx2_relayed(&mut self) -> Result<()> {
trace!("Setting relay tx-info for RX2");
let gw_down = self.downlink_gateway.as_ref().unwrap();
let relay_ctx = self.relay_context.unwrap();
// Get frequency.
let frequency = relay_ctx.device_session.rx2_frequency;
let mut tx_info = chirpstack_api::gw::DownlinkTxInfo {
board: gw_down.board,
antenna: gw_down.antenna,
context: gw_down.context.clone(),
frequency,
..Default::default()
};
// get RX2 DR
let rx2_dr_index = relay_ctx.device_session.rx2_dr as u8;
let rx2_dr = self.region_conf.get_data_rate(rx2_dr_index)?;
// set DR to tx_info
helpers::set_tx_info_data_rate(&mut tx_info, &rx2_dr)?;
// set tx-power
if self.network_conf.downlink_tx_power != -1 {
tx_info.power = self.network_conf.downlink_tx_power;
} else {
tx_info.power = self.region_conf.get_downlink_tx_power(tx_info.frequency) as i32;
}
// Set timestamp.
let delay = if relay_ctx.device_session.rx1_delay > 0 {
Duration::from_secs(relay_ctx.device_session.rx1_delay as u64 + 1)
} else {
self.region_conf.get_defaults().rx2_delay
};
tx_info.timing = Some(gw::Timing {
parameters: Some(gw::timing::Parameters::Delay(gw::DelayTimingInfo {
delay: Some(pbjson_types::Duration::from(delay)),
})),
});
// set downlink item
self.downlink_frame
.items
.push(chirpstack_api::gw::DownlinkFrameItem {
tx_info: Some(tx_info),
..Default::default()
});
Ok(())
}
fn set_downlink_frame(&mut self) -> Result<()> {
trace!("Setting downlink frame");
let phy_b = self.join_accept.to_vec()?;
for i in &mut self.downlink_frame.items {
i.phy_payload = phy_b.clone();
@ -259,6 +453,67 @@ impl JoinAccept<'_> {
Ok(())
}
fn set_downlink_frame_relayed(&mut self) -> Result<()> {
trace!("Setting ForwardDownlinkReq frame");
let relay_ctx = self.relay_context.as_ref().unwrap();
let mut relay_phy = lrwn::PhyPayload {
mhdr: lrwn::MHDR {
m_type: lrwn::MType::UnconfirmedDataDown,
major: lrwn::Major::LoRaWANR1,
},
payload: lrwn::Payload::MACPayload(lrwn::MACPayload {
fhdr: lrwn::FHDR {
devaddr: lrwn::DevAddr::from_slice(&relay_ctx.device_session.dev_addr)?,
f_cnt: if relay_ctx
.device_session
.mac_version()
.to_string()
.starts_with("1.0")
{
relay_ctx.device_session.n_f_cnt_down
} else {
relay_ctx.device_session.a_f_cnt_down
},
f_ctrl: lrwn::FCtrl {
adr: !self.network_conf.adr_disabled,
ack: relay_ctx.must_ack,
..Default::default()
},
f_opts: lrwn::MACCommandSet::new(vec![]),
},
f_port: Some(lrwn::LA_FPORT_RELAY),
frm_payload: Some(lrwn::FRMPayload::ForwardDownlinkReq(
lrwn::ForwardDownlinkReq {
payload: Box::new(self.join_accept.clone()),
},
)),
}),
mic: None,
};
relay_phy.encrypt_frm_payload(&lrwn::AES128Key::from_slice(
&relay_ctx.device_session.nwk_s_enc_key,
)?)?;
// Set MIC.
// If this is an ACK, then FCntUp has already been incremented by one. If
// this is not an ACK, then DownlinkDataMIC will zero out ConfFCnt.
relay_phy.set_downlink_data_mic(
relay_ctx.device_session.mac_version().from_proto(),
relay_ctx.device_session.f_cnt_up - 1,
&lrwn::AES128Key::from_slice(&relay_ctx.device_session.s_nwk_s_int_key)?,
)?;
let relay_phy_b = relay_phy.to_vec()?;
for i in &mut self.downlink_frame.items {
i.phy_payload = relay_phy_b.clone();
}
Ok(())
}
async fn send_join_accept_response(&self) -> Result<()> {
trace!("Sending join-accept response");
@ -271,6 +526,8 @@ impl JoinAccept<'_> {
}
async fn save_downlink_frame(&self) -> Result<()> {
trace!("Saving downlink frame");
let df = chirpstack_api::internal::DownlinkFrame {
dev_eui: self.device.dev_eui.to_be_bytes().to_vec(),
downlink_id: self.downlink_frame.downlink_id,
@ -285,4 +542,23 @@ impl JoinAccept<'_> {
Ok(())
}
async fn save_downlink_frame_relayed(&self) -> Result<()> {
trace!("Saving ForwardDownlinkReq frame");
let relay_ctx = self.relay_context.as_ref().unwrap();
let df = chirpstack_api::internal::DownlinkFrame {
dev_eui: relay_ctx.device.dev_eui.to_be_bytes().to_vec(),
downlink_id: self.downlink_frame.downlink_id,
downlink_frame: Some(self.downlink_frame.clone()),
nwk_s_enc_key: relay_ctx.device_session.nwk_s_enc_key.clone(),
a_f_cnt_down: relay_ctx.device_session.get_a_f_cnt_down(),
n_f_cnt_down: relay_ctx.device_session.n_f_cnt_down,
..Default::default()
};
downlink_frame::save(&df).await?;
Ok(())
}
}

View File

@ -22,11 +22,17 @@ pub struct TxAck {
downlink_frame: Option<internal::DownlinkFrame>,
downlink_frame_item: Option<gw::DownlinkFrameItem>,
phy_payload: Option<PhyPayload>,
phy_payload_relayed: Option<PhyPayload>,
device_session: Option<internal::DeviceSession>,
device_session_relayed: Option<internal::DeviceSession>,
tenant: Option<tenant::Tenant>,
tenant_relayed: Option<tenant::Tenant>,
application: Option<application::Application>,
application_relayed: Option<application::Application>,
device_profile: Option<device_profile::DeviceProfile>,
device_profile_relayed: Option<device_profile::DeviceProfile>,
device: Option<device::Device>,
device_relayed: Option<device::Device>,
device_queue_item: Option<device_queue::DeviceQueueItem>,
}
@ -59,17 +65,27 @@ impl TxAck {
downlink_frame: None,
downlink_frame_item: None,
phy_payload: None,
phy_payload_relayed: None,
device_session: None,
device_session_relayed: None,
tenant: None,
tenant_relayed: None,
application: None,
application_relayed: None,
device_profile: None,
device_profile_relayed: None,
device: None,
device_relayed: None,
device_queue_item: None,
};
ctx.get_downlink_frame().await?;
ctx.decode_phy_payload()?;
if ctx.is_relay_payload() {
return ctx._handle_relayed().await;
}
if ctx.is_error() {
if ctx.is_application_payload() || ctx.is_mac_only_downlink() {
ctx.get_device().await?;
@ -122,6 +138,61 @@ impl TxAck {
Ok(())
}
async fn _handle_relayed(&mut self) -> Result<()> {
self.get_phy_payload_relayed()?;
if self.is_error() {
// We log the tx ack error under the relay as this is the device to which the downlink
// is sent.
self.get_device().await?;
self.get_device_profile().await?;
self.get_application().await?;
self.get_tenant().await?;
self.log_tx_ack_error().await?;
} else {
// First handle the relay frame-counter increment.
self.get_device_session().await?;
self.increment_a_f_cnt_down()?;
self.save_device_session().await?;
// Handle end-device frame-counter increment + queue item.
if self.is_application_payload_relayed() {
self.get_device_session_relayed().await?;
self.get_device_queue_item().await?;
if self.is_unconfirmed_downlink_relayed() {
self.delete_device_queue_item().await?;
}
if self.is_confirmed_downlink_relayed() {
self.set_device_queue_item_pending().await?;
self.set_device_session_conf_f_cnt_relayed()?;
}
self.increment_a_f_cnt_down_relayed()?;
self.save_device_session_relayed().await?;
// Log tx ack event.
self.get_device_relayed().await?;
self.get_device_profile_relayed().await?;
self.get_application_relayed().await?;
self.get_tenant_relayed().await?;
self.send_tx_ack_event_relayed().await?;
} else if self.is_mac_only_downlink_relayed() {
self.get_device_session_relayed().await?;
self.increment_n_f_cnt_down_relayed()?;
self.save_device_session_relayed().await?;
}
// Log downlink frame and meta-data.
// This will log the downlink under the relay as this is the device to which the
// downlink is sent.
self.log_downlink_frame().await?;
self.log_downlink_meta().await?;
}
Ok(())
}
async fn get_downlink_frame(&mut self) -> Result<()> {
trace!("Get downlink-frame from Redis");
let df = downlink_frame::get(self.downlink_id).await?;
@ -162,6 +233,14 @@ impl TxAck {
Ok(())
}
async fn get_device_session_relayed(&mut self) -> Result<()> {
trace!("Getting relayed device-session");
let dev_eui = EUI64::from_slice(&self.downlink_frame.as_ref().unwrap().dev_eui_relayed)?;
self.device_session_relayed = Some(device_session::get(&dev_eui).await?);
Ok(())
}
async fn get_device(&mut self) -> Result<()> {
trace!("Getting device");
let dev_eui = EUI64::from_slice(&self.downlink_frame.as_ref().unwrap().dev_eui)?;
@ -169,13 +248,28 @@ impl TxAck {
Ok(())
}
async fn get_device_relayed(&mut self) -> Result<()> {
trace!("Getting relayed device");
let dev_eui = EUI64::from_slice(&self.downlink_frame.as_ref().unwrap().dev_eui_relayed)?;
self.device_relayed = Some(device::get(&dev_eui).await?);
Ok(())
}
async fn get_device_profile(&mut self) -> Result<()> {
trace!("Get device-profile");
trace!("Getting device-profile");
self.device_profile =
Some(device_profile::get(&self.device.as_ref().unwrap().device_profile_id).await?);
Ok(())
}
async fn get_device_profile_relayed(&mut self) -> Result<()> {
trace!("Getting relayed device-profile");
self.device_profile_relayed = Some(
device_profile::get(&self.device_relayed.as_ref().unwrap().device_profile_id).await?,
);
Ok(())
}
async fn get_application(&mut self) -> Result<()> {
trace!("Getting application");
self.application =
@ -183,12 +277,26 @@ impl TxAck {
Ok(())
}
async fn get_application_relayed(&mut self) -> Result<()> {
trace!("Getting relayed application");
self.application_relayed =
Some(application::get(&self.device_relayed.as_ref().unwrap().application_id).await?);
Ok(())
}
async fn get_tenant(&mut self) -> Result<()> {
trace!("Getting tenant");
self.tenant = Some(tenant::get(&self.application.as_ref().unwrap().tenant_id).await?);
Ok(())
}
async fn get_tenant_relayed(&mut self) -> Result<()> {
trace!("Getting relayed tenant");
self.tenant_relayed =
Some(tenant::get(&self.application_relayed.as_ref().unwrap().tenant_id).await?);
Ok(())
}
async fn get_device_queue_item(&mut self) -> Result<()> {
trace!("Getting device queue-item");
self.device_queue_item = Some(
@ -259,17 +367,38 @@ impl TxAck {
Ok(())
}
fn set_device_session_conf_f_cnt_relayed(&mut self) -> Result<()> {
trace!("Setting relayed device-session conf_f_cnt");
let mut ds = self.device_session_relayed.as_mut().unwrap();
let qi = self.device_queue_item.as_ref().unwrap();
ds.conf_f_cnt = match qi.f_cnt_down {
Some(v) => v as u32,
None => {
error!("Expected device queue-item f_cnt_down to be set");
0
}
};
Ok(())
}
fn increment_a_f_cnt_down(&mut self) -> Result<()> {
trace!("Incrementing a_f_cnt_down");
let mut ds = self.device_session.as_mut().unwrap();
let ds = self.device_session.as_mut().unwrap();
ds.set_a_f_cnt_down(ds.get_a_f_cnt_down() + 1);
if ds.mac_version().to_string().starts_with("1.0") {
ds.n_f_cnt_down += 1;
} else {
ds.a_f_cnt_down += 1;
Ok(())
}
fn increment_a_f_cnt_down_relayed(&mut self) -> Result<()> {
trace!("Incrementing relayed a_f_cnt_down");
let ds = self.device_session_relayed.as_mut().unwrap();
ds.set_a_f_cnt_down(ds.get_a_f_cnt_down() + 1);
Ok(())
}
@ -282,12 +411,27 @@ impl TxAck {
Ok(())
}
fn increment_n_f_cnt_down_relayed(&mut self) -> Result<()> {
trace!("Incrementing relayed n_f_cnt_down");
let mut ds = self.device_session_relayed.as_mut().unwrap();
ds.n_f_cnt_down += 1;
Ok(())
}
async fn save_device_session(&self) -> Result<()> {
trace!("Saving device-session");
device_session::save(self.device_session.as_ref().unwrap()).await?;
Ok(())
}
async fn save_device_session_relayed(&self) -> Result<()> {
trace!("Saving relayed device-session");
device_session::save(self.device_session_relayed.as_ref().unwrap()).await?;
Ok(())
}
async fn log_tx_ack_error(&self) -> Result<()> {
trace!("Logging tx ack error");
@ -371,6 +515,54 @@ impl TxAck {
Ok(())
}
async fn send_tx_ack_event_relayed(&self) -> Result<()> {
trace!("Sending relayed tx ack event");
let tenant = self.tenant_relayed.as_ref().unwrap();
let app = self.application_relayed.as_ref().unwrap();
let dp = self.device_profile_relayed.as_ref().unwrap();
let dev = self.device_relayed.as_ref().unwrap();
let qi = self.device_queue_item.as_ref().unwrap();
let mut tags = (*dp.tags).clone();
tags.extend((*dev.tags).clone());
let downlink_id = self.downlink_frame.as_ref().unwrap().downlink_id;
let gateway_id = self
.downlink_frame
.as_ref()
.unwrap()
.downlink_frame
.as_ref()
.unwrap()
.gateway_id
.clone();
let pl = integration_pb::TxAckEvent {
downlink_id,
time: Some(Utc::now().into()),
device_info: Some(integration_pb::DeviceInfo {
tenant_id: tenant.id.to_string(),
tenant_name: tenant.name.clone(),
application_id: app.id.to_string(),
application_name: app.name.to_string(),
device_profile_id: dp.id.to_string(),
device_profile_name: dp.name.clone(),
device_name: dev.name.clone(),
dev_eui: dev.dev_eui.to_string(),
tags,
}),
queue_item_id: qi.id.to_string(),
f_cnt_down: qi.f_cnt_down.unwrap_or(0) as u32,
gateway_id,
tx_info: self.downlink_frame_item.as_ref().unwrap().tx_info.clone(),
};
integration::txack_event(app.id, &dev.variables, &pl).await;
Ok(())
}
fn decode_phy_payload(&mut self) -> Result<()> {
trace!("Decoding PhyPayload");
let phy =
@ -380,6 +572,29 @@ impl TxAck {
Ok(())
}
fn get_phy_payload_relayed(&mut self) -> Result<()> {
trace!("Getting relayed PhyPayload");
let df = self.downlink_frame.as_ref().unwrap();
let mut phy = self.phy_payload.as_ref().unwrap().clone();
let nwk_s_enc_key = AES128Key::from_slice(&df.nwk_s_enc_key)?;
// We need to set the full AFCntDown to decrypt the FRMPayload holding the
// ForwardDownlinkReq.
if let Payload::MACPayload(pl) = &mut phy.payload {
pl.fhdr.f_cnt = df.a_f_cnt_down;
}
phy.decrypt_frm_payload(&nwk_s_enc_key)?;
if let Payload::MACPayload(pl) = phy.payload {
if let Some(lrwn::FRMPayload::ForwardDownlinkReq(pl)) = pl.frm_payload {
self.phy_payload_relayed = Some(*pl.payload);
}
}
Ok(())
}
async fn log_downlink_frame(&mut self) -> Result<()> {
trace!("Logging downlink frame");
let df = self.downlink_frame.as_ref().unwrap();
@ -417,7 +632,8 @@ impl TxAck {
"".to_string()
}
},
plaintext_mac_commands: false,
plaintext_f_opts: false,
plaintext_frm_payload: false,
};
// Log for gateway (with potentially encrypted mac-commands).
@ -433,17 +649,23 @@ impl TxAck {
let nwk_s_enc_key = AES128Key::from_slice(&df.nwk_s_enc_key)?;
// Set the full frame-counter value.
// This is needed to decrypt the mac-commands and / or FrmPayload (in case of Relay).
if let Payload::MACPayload(pl) = &mut phy.payload {
if pl.f_port.unwrap_or(0) == 0 {
// We need to set the full NFcntDown to decrypt the mac-commands.
pl.fhdr.f_cnt = df.n_f_cnt_down;
} else {
pl.fhdr.f_cnt = df.a_f_cnt_down;
}
}
let mut plaintext_frm_payload = false;
if let Payload::MACPayload(pl) = &phy.payload {
// f_port must be either None or 0
if pl.f_port.unwrap_or(0) == 0 {
// f_port must be either 0 or 226 (Relay).
if vec![0, lrwn::LA_FPORT_RELAY].contains(&pl.f_port.unwrap_or(0)) {
phy.decrypt_frm_payload(&nwk_s_enc_key)?;
plaintext_frm_payload = true;
}
}
@ -461,7 +683,8 @@ impl TxAck {
m_type: dfl.m_type,
dev_addr: dfl.dev_addr.clone(),
dev_eui: dfl.dev_eui.clone(),
plaintext_mac_commands: true,
plaintext_f_opts: true,
plaintext_frm_payload,
};
// Log for device.
@ -529,6 +752,8 @@ impl TxAck {
self.downlink_tx_ack_status != gw::TxAckStatus::Ok
}
// Returns true if the downlink_frame is associated to a dev_eui and if the f_port > 0.
// In the case the downlink is multicast, the f_port > 0, but the dev_eui is not set.
fn is_application_payload(&self) -> bool {
if self.downlink_frame.as_ref().unwrap().dev_eui.is_empty() {
return false;
@ -542,6 +767,29 @@ impl TxAck {
false
}
fn is_application_payload_relayed(&self) -> bool {
if self.downlink_frame.as_ref().unwrap().dev_eui.is_empty() {
return false;
}
if let lrwn::Payload::MACPayload(pl) = &self.phy_payload_relayed.as_ref().unwrap().payload {
if pl.f_port.unwrap_or(0) != 0 {
return true;
}
}
false
}
fn is_relay_payload(&self) -> bool {
if let lrwn::Payload::MACPayload(pl) = &self.phy_payload.as_ref().unwrap().payload {
if pl.f_port.unwrap_or(0) == lrwn::LA_FPORT_RELAY {
return true;
}
}
false
}
fn is_mac_only_downlink(&self) -> bool {
if self.downlink_frame.as_ref().unwrap().dev_eui.is_empty() {
return false;
@ -555,6 +803,19 @@ impl TxAck {
false
}
fn is_mac_only_downlink_relayed(&self) -> bool {
if self.downlink_frame.as_ref().unwrap().dev_eui.is_empty() {
return false;
}
if let lrwn::Payload::MACPayload(pl) = &self.phy_payload_relayed.as_ref().unwrap().payload {
if pl.f_port.unwrap_or(0) == 0 {
return true;
}
}
false
}
fn is_multicast_downlink(&self) -> bool {
let df = self.downlink_frame.as_ref().unwrap();
if !df.multicast_group_id.is_empty() && !df.multicast_group_queue_item_id.is_empty() {
@ -570,10 +831,27 @@ impl TxAck {
false
}
fn is_unconfirmed_downlink_relayed(&self) -> bool {
if self.phy_payload_relayed.as_ref().unwrap().mhdr.m_type
== lrwn::MType::UnconfirmedDataDown
{
return true;
}
false
}
fn is_confirmed_downlink(&self) -> bool {
if self.phy_payload.as_ref().unwrap().mhdr.m_type == lrwn::MType::ConfirmedDataDown {
return true;
}
false
}
fn is_confirmed_downlink_relayed(&self) -> bool {
if self.phy_payload_relayed.as_ref().unwrap().mhdr.m_type == lrwn::MType::ConfirmedDataDown
{
return true;
}
false
}
}

View File

@ -40,7 +40,8 @@ pub async fn log_uplink_for_gateways(ufl: &api::UplinkFrameLog) -> Result<()> {
dev_addr: ufl.dev_addr.clone(),
dev_eui: ufl.dev_eui.clone(),
time: ufl.time.clone(),
plaintext_mac_commands: ufl.plaintext_mac_commands,
plaintext_f_opts: ufl.plaintext_f_opts,
plaintext_frm_payload: ufl.plaintext_frm_payload,
};
let b = ufl_copy.encode_to_vec();
@ -281,9 +282,11 @@ pub async fn get_frame_logs(
if let redis::Value::Data(b) = v {
let pl = api::UplinkFrameLog::decode(&mut Cursor::new(b))?;
let mut phy = lrwn::PhyPayload::from_slice(&pl.phy_payload)?;
if pl.plaintext_mac_commands {
if pl.plaintext_f_opts {
phy.decode_f_opts_to_mac_commands()?;
phy.decode_frm_payload_to_mac_commands()?;
}
if pl.plaintext_frm_payload {
phy.decode_frm_payload()?;
}
let pl = api::LogItem {
@ -313,9 +316,11 @@ pub async fn get_frame_logs(
if let redis::Value::Data(b) = v {
let pl = api::DownlinkFrameLog::decode(&mut Cursor::new(b))?;
let mut phy = lrwn::PhyPayload::from_slice(&pl.phy_payload)?;
if pl.plaintext_mac_commands {
if pl.plaintext_f_opts {
phy.decode_f_opts_to_mac_commands()?;
phy.decode_frm_payload_to_mac_commands()?;
}
if pl.plaintext_frm_payload {
phy.decode_frm_payload()?;
}
let pl = api::LogItem {

View File

@ -108,8 +108,18 @@ impl IntegrationTrait for Integration {
}
}
pub async fn get_uplink_events() -> Vec<integration::UplinkEvent> {
UPLINK_EVENTS.write().await.drain(..).collect()
pub async fn get_uplink_event() -> Option<integration::UplinkEvent> {
if UPLINK_EVENTS.read().await.is_empty() {
return None;
}
UPLINK_EVENTS
.write()
.await
.drain(0..1)
.collect::<Vec<integration::UplinkEvent>>()
.first()
.cloned()
}
pub async fn get_join_events() -> Vec<integration::JoinEvent> {

View File

@ -0,0 +1,136 @@
use anyhow::Result;
use tracing::info;
use crate::storage::device;
use chirpstack_api::internal;
pub fn handle(
dev: &device::Device,
ds: &mut internal::DeviceSession,
_block: &lrwn::MACCommandSet,
pending: Option<&lrwn::MACCommandSet>,
) -> Result<Option<lrwn::MACCommandSet>> {
if pending.is_none() {
return Err(anyhow!("Expected pending ConfigureFwdLimitReq mac-command"));
}
let req_mac = (**pending.unwrap())
.first()
.ok_or_else(|| anyhow!("MACCommandSet is empty"))?;
let req_pl = if let lrwn::MACCommand::ConfigureFwdLimitReq(pl) = req_mac {
pl
} else {
return Err(anyhow!("ConfigureFwdLimitReq is expected"));
};
if ds.relay.is_none() {
ds.relay = Some(internal::Relay::default());
}
info!(dev_eui = %dev.dev_eui, "ConfigureFwdLimitReq acknowledged");
if let Some(relay) = &mut ds.relay {
relay.join_req_limit_reload_rate = req_pl.reload_rate.join_req_reload_rate as u32;
relay.notify_limit_reload_rate = req_pl.reload_rate.notify_reload_rate as u32;
relay.global_uplink_limit_reload_rate = req_pl.reload_rate.global_uplink_reload_rate as u32;
relay.overall_limit_reload_rate = req_pl.reload_rate.overall_reload_rate as u32;
relay.join_req_limit_bucket_size = req_pl.load_capacity.join_req_limit_size as u32;
relay.notify_limit_bucket_size = req_pl.load_capacity.notify_limit_size as u32;
relay.global_uplink_limit_bucket_size =
req_pl.load_capacity.global_uplink_limit_size as u32;
relay.overall_limit_bucket_size = req_pl.load_capacity.overall_limit_size as u32;
}
Ok(None)
}
#[cfg(test)]
mod test {
use super::*;
struct Test {
name: String,
device_session: internal::DeviceSession,
configure_fwd_limit_req: Option<lrwn::MACCommandSet>,
configure_fwd_limit_ans: lrwn::MACCommandSet,
expected_device_session: internal::DeviceSession,
expected_error: Option<String>,
}
#[test]
fn test_response() {
let tests = vec![
Test {
name: "acked, nothing pending".into(),
device_session: internal::DeviceSession::default(),
configure_fwd_limit_req: None,
configure_fwd_limit_ans: lrwn::MACCommandSet::new(vec![
lrwn::MACCommand::ConfigureFwdLimitAns,
]),
expected_device_session: internal::DeviceSession::default(),
expected_error: Some(
"Expected pending ConfigureFwdLimitReq mac-command".to_string(),
),
},
Test {
name: "acked".into(),
device_session: internal::DeviceSession::default(),
configure_fwd_limit_req: Some(lrwn::MACCommandSet::new(vec![
lrwn::MACCommand::ConfigureFwdLimitReq(lrwn::ConfigureFwdLimitReqPayload {
reload_rate: lrwn::FwdLimitReloadRatePL {
overall_reload_rate: 10,
global_uplink_reload_rate: 20,
notify_reload_rate: 30,
join_req_reload_rate: 40,
reset_limit_counter: lrwn::ResetLimitCounter::NoChange,
},
load_capacity: lrwn::FwdLimitLoadCapacityPL {
overall_limit_size: 0,
global_uplink_limit_size: 1,
notify_limit_size: 2,
join_req_limit_size: 3,
},
}),
])),
configure_fwd_limit_ans: lrwn::MACCommandSet::new(vec![
lrwn::MACCommand::ConfigureFwdLimitAns,
]),
expected_device_session: internal::DeviceSession {
relay: Some(internal::Relay {
overall_limit_reload_rate: 10,
global_uplink_limit_reload_rate: 20,
notify_limit_reload_rate: 30,
join_req_limit_reload_rate: 40,
overall_limit_bucket_size: 0,
global_uplink_limit_bucket_size: 1,
notify_limit_bucket_size: 2,
join_req_limit_bucket_size: 3,
..Default::default()
}),
..Default::default()
},
expected_error: None,
},
];
for tst in &tests {
let mut ds = tst.device_session.clone();
let resp = handle(
&device::Device::default(),
&mut ds,
&tst.configure_fwd_limit_ans,
tst.configure_fwd_limit_req.as_ref(),
);
if let Some(e) = &tst.expected_error {
assert_eq!(true, resp.is_err(), "{}", tst.name);
assert_eq!(e, &format!("{}", resp.err().unwrap()), "{}", tst.name);
} else {
assert_eq!(true, resp.unwrap().is_none());
}
assert_eq!(tst.expected_device_session, ds, "{}", tst.name);
}
}
}

View File

@ -0,0 +1,220 @@
use std::iter::zip;
use anyhow::Result;
use tracing::{info, warn};
use crate::storage::{device, device_session};
use chirpstack_api::internal;
use lrwn::EUI64;
pub async fn handle(
dev: &device::Device,
ds: &mut internal::DeviceSession,
block: &lrwn::MACCommandSet,
pending: Option<&lrwn::MACCommandSet>,
) -> Result<Option<lrwn::MACCommandSet>> {
if pending.is_none() {
return Err(anyhow!("Expected pending CtrlUplinkListReq mac-command"));
}
let req_pls: Vec<&lrwn::CtrlUplinkListReqPayload> = (**pending.unwrap())
.iter()
.filter_map(|v| {
if let lrwn::MACCommand::CtrlUplinkListReq(pl) = v {
Some(pl)
} else {
None
}
})
.collect();
let ans_pls: Vec<&lrwn::CtrlUplinkListAnsPayload> = (**block)
.iter()
.filter_map(|v| {
if let lrwn::MACCommand::CtrlUplinkListAns(pl) = v {
Some(pl)
} else {
None
}
})
.collect();
if req_pls.len() != ans_pls.len() {
return Err(anyhow!("CtrlUplinkListAns mac-command count does not equal CtrlUplinkListReq mac-command count"));
}
let relay = match &ds.relay {
Some(v) => v.clone(),
None => Default::default(),
};
for (req_pl, ans_pl) in zip(req_pls, ans_pls) {
if ans_pl.uplink_list_idx_ack {
info!(
dev_eui = %dev.dev_eui,
uplink_list_idx = req_pl.ctrl_uplink_action.uplink_list_idx,
w_f_cnt = ans_pl.w_fcnt,
"CtrlUplinkListReq acknowledged",
);
for rd in &relay.devices {
if req_pl.ctrl_uplink_action.uplink_list_idx as u32 == rd.index {
let mut ds = device_session::get(&EUI64::from_slice(&rd.dev_eui)?).await?;
if let Some(relay) = &mut ds.relay {
relay.w_f_cnt = ans_pl.w_fcnt;
};
device_session::save(&ds).await?;
}
}
} else {
warn!(
dev_eui = %dev.dev_eui,
uplink_list_idx = req_pl.ctrl_uplink_action.uplink_list_idx,
"CtrlUplinkListReq not acknowledged",
);
}
}
ds.relay = Some(relay);
Ok(None)
}
#[cfg(test)]
mod test {
use super::*;
use crate::test;
struct Test {
name: String,
device_session: internal::DeviceSession,
device_session_ed: internal::DeviceSession,
ctrl_uplink_list_req: Option<lrwn::MACCommandSet>,
ctrl_uplink_list_ans: lrwn::MACCommandSet,
expected_device_session_ed: internal::DeviceSession,
expected_error: Option<String>,
}
#[tokio::test]
async fn test_response() {
let _handle = test::prepare().await;
let tests = vec![
Test {
name: "acked, nothing pending".into(),
device_session: internal::DeviceSession {
relay: Some(internal::Relay {
devices: vec![internal::RelayDevice {
index: 1,
dev_eui: vec![1, 2, 3, 4, 5, 6, 7, 8],
..Default::default()
}],
..Default::default()
}),
..Default::default()
},
device_session_ed: internal::DeviceSession {
dev_addr: vec![1, 2, 3, 4],
dev_eui: vec![1, 2, 3, 4, 5, 6, 7, 8],
relay: Some(internal::Relay {
w_f_cnt: 1,
..Default::default()
}),
..Default::default()
},
ctrl_uplink_list_req: None,
ctrl_uplink_list_ans: lrwn::MACCommandSet::new(vec![
lrwn::MACCommand::CtrlUplinkListAns(lrwn::CtrlUplinkListAnsPayload {
uplink_list_idx_ack: true,
w_fcnt: 10,
}),
]),
expected_device_session_ed: internal::DeviceSession {
dev_addr: vec![1, 2, 3, 4],
dev_eui: vec![1, 2, 3, 4, 5, 6, 7, 8],
relay: Some(internal::Relay {
w_f_cnt: 1,
..Default::default()
}),
..Default::default()
},
expected_error: Some("Expected pending CtrlUplinkListReq mac-command".to_string()),
},
Test {
name: "acked".into(),
device_session: internal::DeviceSession {
relay: Some(internal::Relay {
devices: vec![internal::RelayDevice {
index: 1,
dev_eui: vec![1, 2, 3, 4, 5, 6, 7, 8],
..Default::default()
}],
..Default::default()
}),
..Default::default()
},
device_session_ed: internal::DeviceSession {
dev_addr: vec![1, 2, 3, 4],
dev_eui: vec![1, 2, 3, 4, 5, 6, 7, 8],
relay: Some(internal::Relay {
w_f_cnt: 1,
..Default::default()
}),
..Default::default()
},
ctrl_uplink_list_req: Some(lrwn::MACCommandSet::new(vec![
lrwn::MACCommand::CtrlUplinkListReq(lrwn::CtrlUplinkListReqPayload {
ctrl_uplink_action: lrwn::CtrlUplinkActionPL {
uplink_list_idx: 1,
ctrl_uplink_action: 0,
},
}),
])),
ctrl_uplink_list_ans: lrwn::MACCommandSet::new(vec![
lrwn::MACCommand::CtrlUplinkListAns(lrwn::CtrlUplinkListAnsPayload {
uplink_list_idx_ack: true,
w_fcnt: 10,
}),
]),
expected_device_session_ed: internal::DeviceSession {
dev_addr: vec![1, 2, 3, 4],
dev_eui: vec![1, 2, 3, 4, 5, 6, 7, 8],
relay: Some(internal::Relay {
w_f_cnt: 10,
..Default::default()
}),
..Default::default()
},
expected_error: None,
},
];
for tst in &tests {
println!("> {}", tst.name);
device_session::save(&tst.device_session_ed).await.unwrap();
let mut ds = tst.device_session.clone();
let resp = handle(
&device::Device::default(),
&mut ds,
&tst.ctrl_uplink_list_ans,
tst.ctrl_uplink_list_req.as_ref(),
)
.await;
if let Some(e) = &tst.expected_error {
assert_eq!(true, resp.is_err(), "{}", tst.name);
assert_eq!(e, &format!("{}", resp.err().unwrap()), "{}", tst.name);
} else {
assert_eq!(true, resp.unwrap().is_none());
}
let ds =
device_session::get(&EUI64::from_slice(&tst.device_session_ed.dev_eui).unwrap())
.await
.unwrap();
assert_eq!(tst.expected_device_session_ed, ds);
}
}
}

View File

@ -0,0 +1,196 @@
use anyhow::Result;
use tracing::{error, info};
use crate::storage::device;
use chirpstack_api::internal;
pub fn handle(
dev: &device::Device,
ds: &mut internal::DeviceSession,
block: &lrwn::MACCommandSet,
pending: Option<&lrwn::MACCommandSet>,
) -> Result<Option<lrwn::MACCommandSet>> {
if pending.is_none() {
return Err(anyhow!("Expected pending EndDeviceConfReq mac-command"));
}
let req_mac = (**pending.unwrap())
.first()
.ok_or_else(|| anyhow!("MACCommandSet is empty"))?;
let req_pl = if let lrwn::MACCommand::EndDeviceConfReq(pl) = req_mac {
pl
} else {
return Err(anyhow!("EndDeviceConfReq is expected"));
};
let ans_mac = (**block)
.first()
.ok_or_else(|| anyhow!("MACCommandSet is empty"))?;
let ans_pl = if let lrwn::MACCommand::EndDeviceConfAns(pl) = ans_mac {
pl
} else {
return Err(anyhow!("EndDeviceConfAns is expected"));
};
if ds.relay.is_none() {
ds.relay = Some(internal::Relay::default());
}
if ans_pl.second_ch_freq_ack
&& ans_pl.second_ch_dr_ack
&& ans_pl.second_ch_idx_ack
&& ans_pl.backoff_ack
{
info!(dev_eui = %dev.dev_eui, "EndDeviceConfReq acknowledged");
if let Some(relay) = &mut ds.relay {
relay.ed_activation_mode =
req_pl.activation_relay_mode.relay_mode_activation.to_u8() as u32;
relay.ed_smart_enable_level = req_pl.activation_relay_mode.smart_enable_level as u32;
relay.second_channel_ack_offset =
req_pl.channel_settings_ed.second_ch_ack_offset as u32;
relay.second_channel_dr = req_pl.channel_settings_ed.second_ch_dr as u32;
relay.ed_back_off = req_pl.channel_settings_ed.backoff as u32;
relay.second_channel_freq = req_pl.second_ch_freq;
}
} else {
error!(
dev_eui = %dev.dev_eui,
second_ch_freq_ack = ans_pl.second_ch_freq_ack,
second_ch_dr_ack = ans_pl.second_ch_dr_ack,
second_ch_idx_ack = ans_pl.second_ch_idx_ack,
backoff_ack = ans_pl.backoff_ack,
"EndDeviceConfReq not acknowledged"
);
}
Ok(None)
}
#[cfg(test)]
mod test {
use super::*;
struct Test {
name: String,
device_session: internal::DeviceSession,
end_device_conf_req: Option<lrwn::MACCommandSet>,
end_device_conf_ans: lrwn::MACCommandSet,
expected_device_session: internal::DeviceSession,
expected_error: Option<String>,
}
#[test]
fn test_response() {
let tests = vec![
Test {
name: "acked, nothing pending".into(),
device_session: internal::DeviceSession::default(),
end_device_conf_req: None,
end_device_conf_ans: lrwn::MACCommandSet::new(vec![
lrwn::MACCommand::EndDeviceConfAns(lrwn::EndDeviceConfAnsPayload {
second_ch_freq_ack: true,
second_ch_dr_ack: true,
second_ch_idx_ack: true,
backoff_ack: true,
}),
]),
expected_device_session: internal::DeviceSession::default(),
expected_error: Some("Expected pending EndDeviceConfReq mac-command".into()),
},
Test {
name: "ackend".into(),
device_session: internal::DeviceSession::default(),
end_device_conf_req: Some(lrwn::MACCommandSet::new(vec![
lrwn::MACCommand::EndDeviceConfReq(lrwn::EndDeviceConfReqPayload {
activation_relay_mode: lrwn::ActivationRelayMode {
relay_mode_activation: lrwn::RelayModeActivation::EnableRelayMode,
smart_enable_level: 2,
},
channel_settings_ed: lrwn::ChannelSettingsED {
second_ch_ack_offset: 3,
second_ch_dr: 4,
second_ch_idx: 1,
backoff: 5,
},
second_ch_freq: 868300000,
}),
])),
end_device_conf_ans: lrwn::MACCommandSet::new(vec![
lrwn::MACCommand::EndDeviceConfAns(lrwn::EndDeviceConfAnsPayload {
second_ch_freq_ack: true,
second_ch_dr_ack: true,
second_ch_idx_ack: true,
backoff_ack: true,
}),
]),
expected_device_session: internal::DeviceSession {
relay: Some(internal::Relay {
ed_activation_mode: 1,
ed_smart_enable_level: 2,
second_channel_ack_offset: 3,
second_channel_dr: 4,
ed_back_off: 5,
second_channel_freq: 868300000,
..Default::default()
}),
..Default::default()
},
expected_error: None,
},
Test {
name: "nacked".into(),
device_session: internal::DeviceSession::default(),
end_device_conf_req: Some(lrwn::MACCommandSet::new(vec![
lrwn::MACCommand::EndDeviceConfReq(lrwn::EndDeviceConfReqPayload {
activation_relay_mode: lrwn::ActivationRelayMode {
relay_mode_activation: lrwn::RelayModeActivation::EnableRelayMode,
smart_enable_level: 2,
},
channel_settings_ed: lrwn::ChannelSettingsED {
second_ch_ack_offset: 3,
second_ch_dr: 4,
second_ch_idx: 1,
backoff: 5,
},
second_ch_freq: 868300000,
}),
])),
end_device_conf_ans: lrwn::MACCommandSet::new(vec![
lrwn::MACCommand::EndDeviceConfAns(lrwn::EndDeviceConfAnsPayload {
second_ch_freq_ack: false,
second_ch_dr_ack: true,
second_ch_idx_ack: true,
backoff_ack: true,
}),
]),
expected_device_session: internal::DeviceSession {
relay: Some(internal::Relay::default()),
..Default::default()
},
expected_error: None,
},
];
for tst in &tests {
let mut ds = tst.device_session.clone();
let resp = handle(
&device::Device::default(),
&mut ds,
&tst.end_device_conf_ans,
tst.end_device_conf_req.as_ref(),
);
if let Some(e) = &tst.expected_error {
assert_eq!(true, resp.is_err(), "{}", tst.name);
assert_eq!(e, &format!("{}", resp.err().unwrap()), "{}", tst.name);
} else {
assert_eq!(true, resp.unwrap().is_none());
}
assert_eq!(tst.expected_device_session, ds, "{}", tst.name);
}
}
}

View File

@ -0,0 +1,192 @@
use anyhow::Result;
use tracing::{error, info};
use crate::storage::device;
use chirpstack_api::internal;
pub fn handle(
dev: &device::Device,
ds: &mut internal::DeviceSession,
block: &lrwn::MACCommandSet,
pending: Option<&lrwn::MACCommandSet>,
) -> Result<Option<lrwn::MACCommandSet>> {
if pending.is_none() {
return Err(anyhow!("Expected pending FilterListReq mac-command"));
}
let req_mac = (**pending.unwrap())
.first()
.ok_or_else(|| anyhow!("MACCommandSet is empty"))?;
let req_pl = if let lrwn::MACCommand::FilterListReq(pl) = req_mac {
pl
} else {
return Err(anyhow!("FilterListReq is expected"));
};
let ans_mac = (**block)
.first()
.ok_or_else(|| anyhow!("MACCommandSet is empty"))?;
let ans_pl = if let lrwn::MACCommand::FilterListAns(pl) = ans_mac {
pl
} else {
return Err(anyhow!("FilterListAns is expected"));
};
if ans_pl.filter_list_action_ack && ans_pl.filter_list_len_ack && ans_pl.combined_rules_ack {
if let Some(relay) = &mut ds.relay {
for f in &mut relay.filters {
if req_pl.filter_list_idx as u32 == f.index {
info!(
filter_list_idx = req_pl.filter_list_idx,
filter_list_eui = %hex::encode(&req_pl.filter_list_eui),
"FilterListReq acknowledged"
);
f.provisioned = true;
}
}
}
} else {
error!(
dev_eui = %dev.dev_eui,
filter_list_action_ack = ans_pl.filter_list_action_ack,
filter_list_len_ack = ans_pl.filter_list_len_ack,
combined_rules_ack = ans_pl.combined_rules_ack,
"FilterListReq not acknowledged"
);
}
Ok(None)
}
#[cfg(test)]
mod test {
use super::*;
struct Test {
name: String,
device_session: internal::DeviceSession,
filter_list_req: Option<lrwn::MACCommandSet>,
filter_list_ans: lrwn::MACCommandSet,
expected_device_session: internal::DeviceSession,
expected_error: Option<String>,
}
#[test]
fn test_response() {
let tests = vec![
Test {
name: "acked, nothing pending".into(),
device_session: internal::DeviceSession::default(),
filter_list_req: None,
filter_list_ans: lrwn::MACCommandSet::new(vec![lrwn::MACCommand::FilterListAns(
lrwn::FilterListAnsPayload {
filter_list_action_ack: true,
filter_list_len_ack: true,
combined_rules_ack: true,
},
)]),
expected_device_session: internal::DeviceSession::default(),
expected_error: Some("Expected pending FilterListReq mac-command".into()),
},
Test {
name: "nacked".into(),
device_session: internal::DeviceSession {
relay: Some(internal::Relay {
filters: vec![internal::RelayFilter {
index: 1,
provisioned: false,
..Default::default()
}],
..Default::default()
}),
..Default::default()
},
filter_list_req: Some(lrwn::MACCommandSet::new(vec![
lrwn::MACCommand::FilterListReq(lrwn::FilterListReqPayload {
filter_list_idx: 1,
filter_list_action: lrwn::FilterListAction::Forward,
filter_list_eui: vec![1, 2, 3, 4, 5, 6, 7, 8],
}),
])),
filter_list_ans: lrwn::MACCommandSet::new(vec![lrwn::MACCommand::FilterListAns(
lrwn::FilterListAnsPayload {
filter_list_action_ack: false,
filter_list_len_ack: true,
combined_rules_ack: true,
},
)]),
expected_device_session: internal::DeviceSession {
relay: Some(internal::Relay {
filters: vec![internal::RelayFilter {
index: 1,
provisioned: false,
..Default::default()
}],
..Default::default()
}),
..Default::default()
},
expected_error: None,
},
Test {
name: "acked".into(),
device_session: internal::DeviceSession {
relay: Some(internal::Relay {
filters: vec![internal::RelayFilter {
index: 1,
provisioned: false,
..Default::default()
}],
..Default::default()
}),
..Default::default()
},
filter_list_req: Some(lrwn::MACCommandSet::new(vec![
lrwn::MACCommand::FilterListReq(lrwn::FilterListReqPayload {
filter_list_idx: 1,
filter_list_action: lrwn::FilterListAction::Forward,
filter_list_eui: vec![1, 2, 3, 4, 5, 6, 7, 8],
}),
])),
filter_list_ans: lrwn::MACCommandSet::new(vec![lrwn::MACCommand::FilterListAns(
lrwn::FilterListAnsPayload {
filter_list_action_ack: true,
filter_list_len_ack: true,
combined_rules_ack: true,
},
)]),
expected_device_session: internal::DeviceSession {
relay: Some(internal::Relay {
filters: vec![internal::RelayFilter {
index: 1,
provisioned: true,
..Default::default()
}],
..Default::default()
}),
..Default::default()
},
expected_error: None,
},
];
for tst in &tests {
let mut ds = tst.device_session.clone();
let resp = handle(
&device::Device::default(),
&mut ds,
&tst.filter_list_ans,
tst.filter_list_req.as_ref(),
);
if let Some(e) = &tst.expected_error {
assert_eq!(true, resp.is_err(), "{}", tst.name);
assert_eq!(e, &format!("{}", resp.err().unwrap()), "{}", tst.name);
} else {
assert_eq!(true, resp.unwrap().is_none());
}
assert_eq!(tst.expected_device_session, ds, "{}", tst.name);
}
}
}

View File

@ -57,7 +57,7 @@ pub fn handle(
// reset the error counter
ds.mac_command_error_count
.remove(&(lrwn::CID::LinkADRReq.byte() as u32));
.remove(&(lrwn::CID::LinkADRReq.to_u8() as u32));
let chans = region_conf
.get_enabled_uplink_channel_indices_for_link_adr_payloads(
@ -82,7 +82,7 @@ pub fn handle(
// reset the error counter
ds.mac_command_error_count
.remove(&(lrwn::CID::LinkADRReq.byte() as u32));
.remove(&(lrwn::CID::LinkADRReq.to_u8() as u32));
let chans = region_conf
.get_enabled_uplink_channel_indices_for_link_adr_payloads(
@ -110,7 +110,7 @@ pub fn handle(
// increase the error counter
let count = ds
.mac_command_error_count
.entry(lrwn::CID::LinkADRReq.byte() as u32)
.entry(lrwn::CID::LinkADRReq.to_u8() as u32)
.or_insert(0);
*count += 1;
@ -170,7 +170,7 @@ pub mod test {
device_session: internal::DeviceSession {
adr: true,
enabled_uplink_channel_indices: vec![0, 1],
mac_command_error_count: [(lrwn::CID::LinkADRReq.byte() as u32, 1)]
mac_command_error_count: [(lrwn::CID::LinkADRReq.to_u8() as u32, 1)]
.iter()
.cloned()
.collect(),
@ -225,7 +225,7 @@ pub mod test {
adr: true,
enabled_uplink_channel_indices: vec![0, 1],
max_supported_tx_power_index: 2,
mac_command_error_count: [(lrwn::CID::LinkADRReq.byte() as u32, 1)]
mac_command_error_count: [(lrwn::CID::LinkADRReq.to_u8() as u32, 1)]
.iter()
.cloned()
.collect(),
@ -258,7 +258,7 @@ pub mod test {
enabled_uplink_channel_indices: vec![0, 1],
tx_power_index: 1,
min_supported_tx_power_index: 1,
mac_command_error_count: [(lrwn::CID::LinkADRReq.byte() as u32, 1)]
mac_command_error_count: [(lrwn::CID::LinkADRReq.to_u8() as u32, 1)]
.iter()
.cloned()
.collect(),

View File

@ -9,20 +9,27 @@ use crate::uplink::UplinkFrameSet;
use chirpstack_api::internal;
use lrwn::EUI64;
pub mod configure_fwd_limit;
pub mod ctrl_uplink_list;
pub mod dev_status;
pub mod device_mode_ind;
pub mod device_time;
pub mod end_device_conf;
pub mod filter_list;
pub mod link_adr;
pub mod link_check;
pub mod new_channel;
pub mod notify_new_end_device;
pub mod ping_slot_channel;
pub mod ping_slot_info;
pub mod rejoin_param_setup;
pub mod rekey;
pub mod relay_conf;
pub mod reset;
pub mod rx_param_setup;
pub mod rx_timing_setup;
pub mod tx_param_setup;
pub mod update_uplink_list;
// This returns the mac-commands which must be sent back to the device as response and a bool
// indicating if a downlink must be sent. For some mac-commands, no mac-command answer is required,
@ -147,6 +154,19 @@ async fn handle(
lrwn::CID::RxParamSetupAns => rx_param_setup::handle(dev, ds, block, pending_block),
lrwn::CID::RxTimingSetupAns => rx_timing_setup::handle(dev, ds, block, pending_block),
lrwn::CID::TxParamSetupAns => tx_param_setup::handle(dev, ds, block, pending_block),
lrwn::CID::RelayConfAns => relay_conf::handle(dev, ds, block, pending_block),
lrwn::CID::EndDeviceConfAns => end_device_conf::handle(dev, ds, block, pending_block),
lrwn::CID::FilterListAns => filter_list::handle(dev, ds, block, pending_block),
lrwn::CID::UpdateUplinkListAns => update_uplink_list::handle(dev, ds, block, pending_block),
lrwn::CID::ConfigureFwdLimitAns => {
configure_fwd_limit::handle(dev, ds, block, pending_block)
}
lrwn::CID::NotifyNewEndDeviceReq => {
notify_new_end_device::handle(tenant, dp, app, dev, block).await
}
lrwn::CID::CtrlUplinkListAns => {
ctrl_uplink_list::handle(dev, ds, block, pending_block).await
}
_ => {
error!(cid = %cid, "Unexpected CID");
// Return OK, we don't want to break out of the uplink handling.

View File

@ -96,7 +96,7 @@ pub fn handle(
if ans_pl.channel_freq_ok && ans_pl.dr_range_ok {
// Reset the error-counter.
ds.mac_command_error_count
.remove(&(lrwn::CID::NewChannelReq.byte() as u32));
.remove(&(lrwn::CID::NewChannelReq.to_u8() as u32));
ds.extra_uplink_channels.insert(
req_pl.ch_index as u32,
@ -119,7 +119,7 @@ pub fn handle(
} else {
let count = ds
.mac_command_error_count
.entry(lrwn::CID::NewChannelReq.byte() as u32)
.entry(lrwn::CID::NewChannelReq.to_u8() as u32)
.or_insert(0);
*count += 1;
@ -342,7 +342,7 @@ pub mod test {
name: "add new channels (ack)".into(),
device_session: internal::DeviceSession {
enabled_uplink_channel_indices: vec![0, 1, 2],
mac_command_error_count: [(lrwn::CID::NewChannelReq.byte() as u32, 1)]
mac_command_error_count: [(lrwn::CID::NewChannelReq.to_u8() as u32, 1)]
.iter()
.cloned()
.collect(),
@ -401,7 +401,7 @@ pub mod test {
])),
expected_device_session: internal::DeviceSession {
enabled_uplink_channel_indices: vec![0, 1, 2],
mac_command_error_count: [(lrwn::CID::NewChannelReq.byte() as u32, 1)]
mac_command_error_count: [(lrwn::CID::NewChannelReq.to_u8() as u32, 1)]
.iter()
.cloned()
.collect(),

View File

@ -0,0 +1,175 @@
use anyhow::Result;
use chrono::Utc;
use tracing::info;
use crate::integration;
use crate::storage::{application, device, device_profile, tenant};
use chirpstack_api::integration as integration_pb;
pub async fn handle(
t: &tenant::Tenant,
dp: &device_profile::DeviceProfile,
app: &application::Application,
dev: &device::Device,
block: &lrwn::MACCommandSet,
) -> Result<Option<lrwn::MACCommandSet>> {
let req_mac = (**block)
.first()
.ok_or_else(|| anyhow!("MACCommandSet is empty"))?;
let req_pl = if let lrwn::MACCommand::NotifyNewEndDeviceReq(pl) = req_mac {
pl
} else {
return Err(anyhow!("NotifyNewEndDeviceReq is expected"));
};
info!(dev_eui = %dev.dev_eui, ed_dev_addr = %req_pl.dev_addr, "NotifyNewEndDeviceReq received");
let device_info = integration_pb::DeviceInfo {
tenant_id: t.id.to_string(),
tenant_name: t.name.clone(),
application_id: app.id.to_string(),
application_name: app.name.to_string(),
device_profile_id: dp.id.to_string(),
device_profile_name: dp.name.clone(),
device_name: dev.name.clone(),
dev_eui: dev.dev_eui.to_string(),
tags: {
let mut tags = (*dp.tags).clone();
tags.extend((*dev.tags).clone());
tags
},
};
let log_event = integration_pb::LogEvent {
time: Some(Utc::now().into()),
device_info: Some(device_info),
level: integration_pb::LogLevel::Info.into(),
code: integration_pb::LogCode::RelayNewEndDevice.into(),
description: "NotifyNewEndDevice received from relay".into(),
context: [
("dev_addr".to_string(), req_pl.dev_addr.to_string()),
(
"wor_snr".to_string(),
req_pl.power_level.wor_snr.to_string(),
),
(
"wor_rssi".to_string(),
req_pl.power_level.wor_rssi.to_string(),
),
]
.iter()
.cloned()
.collect(),
};
integration::log_event(app.id, &dev.variables, &log_event).await;
Ok(None)
}
#[cfg(test)]
mod test {
use super::*;
use std::time::Duration;
use tokio::time::sleep;
use uuid::Uuid;
use crate::storage::fields;
use crate::test;
#[tokio::test]
async fn test_handle() {
let _guard = test::prepare().await;
integration::set_mock().await;
let t = tenant::Tenant {
id: Uuid::new_v4(),
name: "tenant".to_string(),
..Default::default()
};
let app = application::Application {
id: Uuid::new_v4(),
name: "app".to_string(),
..Default::default()
};
let dp = device_profile::DeviceProfile {
id: Uuid::new_v4(),
name: "dp".to_string(),
tags: fields::KeyValue::new(
[("dp_tag".to_string(), "dp_value".to_string())]
.iter()
.cloned()
.collect(),
),
..Default::default()
};
let dev = device::Device {
dev_eui: lrwn::EUI64::from_be_bytes([1, 2, 3, 4, 5, 6, 7, 8]),
name: "dev".to_string(),
tags: fields::KeyValue::new(
[("dev_tag".to_string(), "dev_value".to_string())]
.iter()
.cloned()
.collect(),
),
..Default::default()
};
let block = lrwn::MACCommandSet::new(vec![lrwn::MACCommand::NotifyNewEndDeviceReq(
lrwn::NotifyNewEndDeviceReqPayload {
dev_addr: lrwn::DevAddr::from_be_bytes([1, 2, 3, 4]),
power_level: lrwn::PowerLevel {
wor_snr: 10,
wor_rssi: 20,
},
},
)]);
handle(&t, &dp, &app, &dev, &block).await.unwrap();
sleep(Duration::from_millis(100)).await;
let mock_events = integration::mock::get_log_events().await;
assert_eq!(1, mock_events.len());
let mut mock_event = mock_events[0].clone();
assert!(mock_event.time.is_some());
mock_event.time = None;
assert_eq!(
integration_pb::LogEvent {
time: None,
device_info: Some(integration_pb::DeviceInfo {
tenant_id: t.id.to_string(),
tenant_name: "tenant".to_string(),
application_id: app.id.to_string(),
application_name: "app".to_string(),
device_profile_id: dp.id.to_string(),
device_profile_name: "dp".to_string(),
device_name: "dev".to_string(),
dev_eui: dev.dev_eui.to_string(),
tags: [
("dp_tag".to_string(), "dp_value".to_string()),
("dev_tag".to_string(), "dev_value".to_string()),
]
.iter()
.cloned()
.collect(),
}),
level: integration_pb::LogLevel::Info.into(),
code: integration_pb::LogCode::RelayNewEndDevice.into(),
description: "NotifyNewEndDevice received from relay".into(),
context: [
("dev_addr".to_string(), "01020304".to_string()),
("wor_snr".to_string(), "10".to_string()),
("wor_rssi".to_string(), "20".to_string()),
]
.iter()
.cloned()
.collect(),
},
mock_event
);
}
}

View File

@ -44,7 +44,7 @@ pub fn handle(
if ans_pl.channel_freq_ok && ans_pl.dr_ok {
// Reset the error-counter.
ds.mac_command_error_count
.remove(&(lrwn::CID::PingSlotChannelReq.byte() as u32));
.remove(&(lrwn::CID::PingSlotChannelReq.to_u8() as u32));
ds.class_b_ping_slot_dr = req_pl.dr as u32;
ds.class_b_ping_slot_freq = req_pl.freq;
@ -53,7 +53,7 @@ pub fn handle(
} else {
let count = ds
.mac_command_error_count
.entry(lrwn::CID::PingSlotChannelReq.byte() as u32)
.entry(lrwn::CID::PingSlotChannelReq.to_u8() as u32)
.or_insert(0);
*count += 1;
@ -98,7 +98,7 @@ pub mod test {
device_session: internal::DeviceSession {
class_b_ping_slot_freq: 868100000,
class_b_ping_slot_dr: 3,
mac_command_error_count: [(lrwn::CID::PingSlotChannelReq.byte() as u32, 1)]
mac_command_error_count: [(lrwn::CID::PingSlotChannelReq.to_u8() as u32, 1)]
.iter()
.cloned()
.collect(),
@ -128,7 +128,7 @@ pub mod test {
device_session: internal::DeviceSession {
class_b_ping_slot_freq: 868100000,
class_b_ping_slot_dr: 3,
mac_command_error_count: [(lrwn::CID::PingSlotChannelReq.byte() as u32, 1)]
mac_command_error_count: [(lrwn::CID::PingSlotChannelReq.to_u8() as u32, 1)]
.iter()
.cloned()
.collect(),
@ -149,7 +149,7 @@ pub mod test {
expected_device_session: internal::DeviceSession {
class_b_ping_slot_freq: 868100000,
class_b_ping_slot_dr: 3,
mac_command_error_count: [(lrwn::CID::PingSlotChannelReq.byte() as u32, 2)]
mac_command_error_count: [(lrwn::CID::PingSlotChannelReq.to_u8() as u32, 2)]
.iter()
.cloned()
.collect(),

Some files were not shown because too many files have changed in this diff Show More