aboutsummaryrefslogtreecommitdiff
path: root/google/cloud/iot/v1/device_manager.proto
blob: 27ec0f0301d02840d0d275347055b797233da75e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
// Copyright 2018 Google LLC.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

syntax = "proto3";

package google.cloud.iot.v1;

import "google/api/annotations.proto";
import "google/cloud/iot/v1/resources.proto";
import "google/iam/v1/iam_policy.proto";
import "google/iam/v1/policy.proto";
import "google/protobuf/duration.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/field_mask.proto";
import "google/protobuf/timestamp.proto";
import "google/rpc/status.proto";

option cc_enable_arenas = true;
option go_package = "google.golang.org/genproto/googleapis/cloud/iot/v1;iot";
option java_multiple_files = true;
option java_outer_classname = "DeviceManagerProto";
option java_package = "com.google.cloud.iot.v1";

// Internet of Things (IoT) service. Securely connect and manage IoT devices.
service DeviceManager {
  // Creates a device registry that contains devices.
  rpc CreateDeviceRegistry(CreateDeviceRegistryRequest)
      returns (DeviceRegistry) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*}/registries"
      body: "device_registry"
    };
  }

  // Gets a device registry configuration.
  rpc GetDeviceRegistry(GetDeviceRegistryRequest) returns (DeviceRegistry) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/registries/*}"
    };
  }

  // Updates a device registry configuration.
  rpc UpdateDeviceRegistry(UpdateDeviceRegistryRequest)
      returns (DeviceRegistry) {
    option (google.api.http) = {
      patch: "/v1/{device_registry.name=projects/*/locations/*/registries/*}"
      body: "device_registry"
    };
  }

  // Deletes a device registry configuration.
  rpc DeleteDeviceRegistry(DeleteDeviceRegistryRequest)
      returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete: "/v1/{name=projects/*/locations/*/registries/*}"
    };
  }

  // Lists device registries.
  rpc ListDeviceRegistries(ListDeviceRegistriesRequest)
      returns (ListDeviceRegistriesResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*}/registries"
    };
  }

  // Creates a device in a device registry.
  rpc CreateDevice(CreateDeviceRequest) returns (Device) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*/registries/*}/devices"
      body: "device"
    };
  }

  // Gets details about a device.
  rpc GetDevice(GetDeviceRequest) returns (Device) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/registries/*/devices/*}"
      additional_bindings {
        get: "/v1/{name=projects/*/locations/*/registries/*/groups/*/devices/*}"
      }
    };
  }

  // Updates a device.
  rpc UpdateDevice(UpdateDeviceRequest) returns (Device) {
    option (google.api.http) = {
      patch: "/v1/{device.name=projects/*/locations/*/registries/*/devices/*}"
      body: "device"
      additional_bindings {
        patch: "/v1/{device.name=projects/*/locations/*/registries/*/groups/*/devices/*}"
        body: "device"
      }
    };
  }

  // Deletes a device.
  rpc DeleteDevice(DeleteDeviceRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete: "/v1/{name=projects/*/locations/*/registries/*/devices/*}"
    };
  }

  // List devices in a device registry.
  rpc ListDevices(ListDevicesRequest) returns (ListDevicesResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*/registries/*}/devices"
      additional_bindings {
        get: "/v1/{parent=projects/*/locations/*/registries/*/groups/*}/devices"
      }
    };
  }

  // Modifies the configuration for the device, which is eventually sent from
  // the Cloud IoT Core servers. Returns the modified configuration version and
  // its metadata.
  rpc ModifyCloudToDeviceConfig(ModifyCloudToDeviceConfigRequest)
      returns (DeviceConfig) {
    option (google.api.http) = {
      post: "/v1/{name=projects/*/locations/*/registries/*/devices/*}:modifyCloudToDeviceConfig"
      body: "*"
      additional_bindings {
        post: "/v1/{name=projects/*/locations/*/registries/*/groups/*/devices/*}:modifyCloudToDeviceConfig"
        body: "*"
      }
    };
  }

  // Lists the last few versions of the device configuration in descending
  // order (i.e.: newest first).
  rpc ListDeviceConfigVersions(ListDeviceConfigVersionsRequest)
      returns (ListDeviceConfigVersionsResponse) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/registries/*/devices/*}/configVersions"
      additional_bindings {
        get: "/v1/{name=projects/*/locations/*/registries/*/groups/*/devices/*}/configVersions"
      }
    };
  }

  // Lists the last few versions of the device state in descending order (i.e.:
  // newest first).
  rpc ListDeviceStates(ListDeviceStatesRequest)
      returns (ListDeviceStatesResponse) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/registries/*/devices/*}/states"
      additional_bindings {
        get: "/v1/{name=projects/*/locations/*/registries/*/groups/*/devices/*}/states"
      }
    };
  }

  // Sets the access control policy on the specified resource. Replaces any
  // existing policy.
  rpc SetIamPolicy(google.iam.v1.SetIamPolicyRequest)
      returns (google.iam.v1.Policy) {
    option (google.api.http) = {
      post: "/v1/{resource=projects/*/locations/*/registries/*}:setIamPolicy"
      body: "*"
      additional_bindings {
        post: "/v1/{resource=projects/*/locations/*/registries/*/groups/*}:setIamPolicy"
        body: "*"
      }
    };
  }

  // Gets the access control policy for a resource.
  // Returns an empty policy if the resource exists and does not have a policy
  // set.
  rpc GetIamPolicy(google.iam.v1.GetIamPolicyRequest)
      returns (google.iam.v1.Policy) {
    option (google.api.http) = {
      post: "/v1/{resource=projects/*/locations/*/registries/*}:getIamPolicy"
      body: "*"
      additional_bindings {
        post: "/v1/{resource=projects/*/locations/*/registries/*/groups/*}:getIamPolicy"
        body: "*"
      }
    };
  }

  // Returns permissions that a caller has on the specified resource.
  // If the resource does not exist, this will return an empty set of
  // permissions, not a NOT_FOUND error.
  rpc TestIamPermissions(google.iam.v1.TestIamPermissionsRequest)
      returns (google.iam.v1.TestIamPermissionsResponse) {
    option (google.api.http) = {
      post: "/v1/{resource=projects/*/locations/*/registries/*}:testIamPermissions"
      body: "*"
      additional_bindings {
        post: "/v1/{resource=projects/*/locations/*/registries/*/groups/*}:testIamPermissions"
        body: "*"
      }
    };
  }

  // Sends a command to the specified device. In order for a device to be able
  // to receive commands, it must:
  // 1) be connected to Cloud IoT Core using the MQTT protocol, and
  // 2) be subscribed to the group of MQTT topics specified by
  //    /devices/{device-id}/commands/#. This subscription will receive commands
  //    at the top-level topic /devices/{device-id}/commands as well as commands
  //    for subfolders, like /devices/{device-id}/commands/subfolder.
  //    Note that subscribing to specific subfolders is not supported.
  // If the command could not be delivered to the device, this method will
  // return an error; in particular, if the device is not subscribed, this
  // method will return FAILED_PRECONDITION. Otherwise, this method will
  // return OK. If the subscription is QoS 1, at least once delivery will be
  // guaranteed; for QoS 0, no acknowledgment will be expected from the device.
  rpc SendCommandToDevice(SendCommandToDeviceRequest)
      returns (SendCommandToDeviceResponse) {
    option (google.api.http) = {
      post: "/v1/{name=projects/*/locations/*/registries/*/devices/*}:sendCommandToDevice"
      body: "*"
      additional_bindings {
        post: "/v1/{name=projects/*/locations/*/registries/*/groups/*/devices/*}:sendCommandToDevice"
        body: "*"
      }
    };
  }

  // Associates the device with the gateway.
  rpc BindDeviceToGateway(BindDeviceToGatewayRequest)
      returns (BindDeviceToGatewayResponse) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*/registries/*}:bindDeviceToGateway"
      body: "*"
      additional_bindings {
        post: "/v1/{parent=projects/*/locations/*/registries/*/groups/*}:bindDeviceToGateway"
        body: "*"
      }
    };
  }

  // Deletes the association between the device and the gateway.
  rpc UnbindDeviceFromGateway(UnbindDeviceFromGatewayRequest)
      returns (UnbindDeviceFromGatewayResponse) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*/registries/*}:unbindDeviceFromGateway"
      body: "*"
      additional_bindings {
        post: "/v1/{parent=projects/*/locations/*/registries/*/groups/*}:unbindDeviceFromGateway"
        body: "*"
      }
    };
  }
}

// Request for `CreateDeviceRegistry`.
message CreateDeviceRegistryRequest {
  // The project and cloud region where this device registry must be created.
  // For example, `projects/example-project/locations/us-central1`.
  string parent = 1;

  // The device registry. The field `name` must be empty. The server will
  // generate that field from the device registry `id` provided and the
  // `parent` field.
  DeviceRegistry device_registry = 2;
}

// Request for `GetDeviceRegistry`.
message GetDeviceRegistryRequest {
  // The name of the device registry. For example,
  // `projects/example-project/locations/us-central1/registries/my-registry`.
  string name = 1;
}

// Request for `DeleteDeviceRegistry`.
message DeleteDeviceRegistryRequest {
  // The name of the device registry. For example,
  // `projects/example-project/locations/us-central1/registries/my-registry`.
  string name = 1;
}

// Request for `UpdateDeviceRegistry`.
message UpdateDeviceRegistryRequest {
  // The new values for the device registry. The `id` field must be empty, and
  // the `name` field must indicate the path of the resource. For example,
  // `projects/example-project/locations/us-central1/registries/my-registry`.
  DeviceRegistry device_registry = 1;

  // Only updates the `device_registry` fields indicated by this mask.
  // The field mask must not be empty, and it must not contain fields that
  // are immutable or only set by the server.
  // Mutable top-level fields: `event_notification_config`, `http_config`,
  // `mqtt_config`, and `state_notification_config`.
  google.protobuf.FieldMask update_mask = 2;
}

// Request for `ListDeviceRegistries`.
message ListDeviceRegistriesRequest {
  // The project and cloud region path. For example,
  // `projects/example-project/locations/us-central1`.
  string parent = 1;

  // The maximum number of registries to return in the response. If this value
  // is zero, the service will select a default size. A call may return fewer
  // objects than requested. A non-empty `next_page_token` in the response
  // indicates that more data is available.
  int32 page_size = 2;

  // The value returned by the last `ListDeviceRegistriesResponse`; indicates
  // that this is a continuation of a prior `ListDeviceRegistries` call and
  // the system should return the next page of data.
  string page_token = 3;
}

// Response for `ListDeviceRegistries`.
message ListDeviceRegistriesResponse {
  // The registries that matched the query.
  repeated DeviceRegistry device_registries = 1;

  // If not empty, indicates that there may be more registries that match the
  // request; this value should be passed in a new
  // `ListDeviceRegistriesRequest`.
  string next_page_token = 2;
}

// Request for `CreateDevice`.
message CreateDeviceRequest {
  // The name of the device registry where this device should be created.
  // For example,
  // `projects/example-project/locations/us-central1/registries/my-registry`.
  string parent = 1;

  // The device registration details. The field `name` must be empty. The server
  // generates `name` from the device registry `id` and the
  // `parent` field.
  Device device = 2;
}

// Request for `GetDevice`.
message GetDeviceRequest {
  // The name of the device. For example,
  // `projects/p0/locations/us-central1/registries/registry0/devices/device0` or
  // `projects/p0/locations/us-central1/registries/registry0/devices/{num_id}`.
  string name = 1;

  // The fields of the `Device` resource to be returned in the response. If the
  // field mask is unset or empty, all fields are returned.
  google.protobuf.FieldMask field_mask = 2;
}

// Request for `UpdateDevice`.
message UpdateDeviceRequest {
  // The new values for the device. The `id` and `num_id` fields must
  // be empty, and the field `name` must specify the name path. For example,
  // `projects/p0/locations/us-central1/registries/registry0/devices/device0`or
  // `projects/p0/locations/us-central1/registries/registry0/devices/{num_id}`.
  Device device = 2;

  // Only updates the `device` fields indicated by this mask.
  // The field mask must not be empty, and it must not contain fields that
  // are immutable or only set by the server.
  // Mutable top-level fields: `credentials`, `blocked`, and `metadata`
  google.protobuf.FieldMask update_mask = 3;
}

// Request for `DeleteDevice`.
message DeleteDeviceRequest {
  // The name of the device. For example,
  // `projects/p0/locations/us-central1/registries/registry0/devices/device0` or
  // `projects/p0/locations/us-central1/registries/registry0/devices/{num_id}`.
  string name = 1;
}

// Request for `ListDevices`.
message ListDevicesRequest {
  // The device registry path. Required. For example,
  // `projects/my-project/locations/us-central1/registries/my-registry`.
  string parent = 1;

  // A list of device numeric IDs. If empty, this field is ignored. Maximum
  // IDs: 10,000.
  repeated uint64 device_num_ids = 2;

  // A list of device string IDs. For example, `['device0', 'device12']`.
  // If empty, this field is ignored. Maximum IDs: 10,000
  repeated string device_ids = 3;

  // The fields of the `Device` resource to be returned in the response. The
  // fields `id` and `num_id` are always returned, along with any
  // other fields specified.
  google.protobuf.FieldMask field_mask = 4;

  // Options related to gateways.
  GatewayListOptions gateway_list_options = 6;

  // The maximum number of devices to return in the response. If this value
  // is zero, the service will select a default size. A call may return fewer
  // objects than requested. A non-empty `next_page_token` in the response
  // indicates that more data is available.
  int32 page_size = 100;

  // The value returned by the last `ListDevicesResponse`; indicates
  // that this is a continuation of a prior `ListDevices` call and
  // the system should return the next page of data.
  string page_token = 101;
}

// Options for limiting the list based on gateway type and associations.
message GatewayListOptions {
  // If not set, all devices and gateways are returned. If set, the list is
  // filtered based on gateway type and associations.
  oneof filter {
    // If `GATEWAY` is specified, only gateways are returned. If `NON_GATEWAY`
    // is specified, only non-gateway devices are returned. If
    // `GATEWAY_TYPE_UNSPECIFIED` is specified, all devices are returned.
    GatewayType gateway_type = 1;

    // If set, only devices associated with the specified gateway are returned.
    // The gateway ID can be numeric (`num_id`) or the user-defined string
    // (`id`). For example, if `123` is specified, only devices bound to the
    // gateway with `num_id` 123 are returned.
    string associations_gateway_id = 2;

    // If set, returns only the gateways with which the specified device is
    // associated. The device ID can be numeric (`num_id`) or the user-defined
    // string (`id`). For example, if `456` is specified, returns only the
    // gateways to which the device with `num_id` 456 is bound.
    string associations_device_id = 3;
  }
}

// Response for `ListDevices`.
message ListDevicesResponse {
  // The devices that match the request.
  repeated Device devices = 1;

  // If not empty, indicates that there may be more devices that match the
  // request; this value should be passed in a new `ListDevicesRequest`.
  string next_page_token = 2;
}

// Request for `ModifyCloudToDeviceConfig`.
message ModifyCloudToDeviceConfigRequest {
  // The name of the device. For example,
  // `projects/p0/locations/us-central1/registries/registry0/devices/device0` or
  // `projects/p0/locations/us-central1/registries/registry0/devices/{num_id}`.
  string name = 1;

  // The version number to update. If this value is zero, it will not check the
  // version number of the server and will always update the current version;
  // otherwise, this update will fail if the version number found on the server
  // does not match this version number. This is used to support multiple
  // simultaneous updates without losing data.
  int64 version_to_update = 2;

  // The configuration data for the device.
  bytes binary_data = 3;
}

// Request for `ListDeviceConfigVersions`.
message ListDeviceConfigVersionsRequest {
  // The name of the device. For example,
  // `projects/p0/locations/us-central1/registries/registry0/devices/device0` or
  // `projects/p0/locations/us-central1/registries/registry0/devices/{num_id}`.
  string name = 1;

  // The number of versions to list. Versions are listed in decreasing order of
  // the version number. The maximum number of versions retained is 10. If this
  // value is zero, it will return all the versions available.
  int32 num_versions = 2;
}

// Response for `ListDeviceConfigVersions`.
message ListDeviceConfigVersionsResponse {
  // The device configuration for the last few versions. Versions are listed
  // in decreasing order, starting from the most recent one.
  repeated DeviceConfig device_configs = 1;
}

// Request for `ListDeviceStates`.
message ListDeviceStatesRequest {
  // The name of the device. For example,
  // `projects/p0/locations/us-central1/registries/registry0/devices/device0` or
  // `projects/p0/locations/us-central1/registries/registry0/devices/{num_id}`.
  string name = 1;

  // The number of states to list. States are listed in descending order of
  // update time. The maximum number of states retained is 10. If this
  // value is zero, it will return all the states available.
  int32 num_states = 2;
}

// Response for `ListDeviceStates`.
message ListDeviceStatesResponse {
  // The last few device states. States are listed in descending order of server
  // update time, starting from the most recent one.
  repeated DeviceState device_states = 1;
}

// Request for `SendCommandToDevice`.
message SendCommandToDeviceRequest {
  // The name of the device. For example,
  // `projects/p0/locations/us-central1/registries/registry0/devices/device0` or
  // `projects/p0/locations/us-central1/registries/registry0/devices/{num_id}`.
  string name = 1;

  // The command data to send to the device.
  bytes binary_data = 2;

  // Optional subfolder for the command. If empty, the command will be delivered
  // to the /devices/{device-id}/commands topic, otherwise it will be delivered
  // to the /devices/{device-id}/commands/{subfolder} topic. Multi-level
  // subfolders are allowed. This field must not have more than 256 characters,
  // and must not contain any MQTT wildcards ("+" or "#") or null characters.
  string subfolder = 3;
}

// Response for `SendCommandToDevice`.
message SendCommandToDeviceResponse {}

// Request for `BindDeviceToGateway`.
message BindDeviceToGatewayRequest {
  // The name of the registry. For example,
  // `projects/example-project/locations/us-central1/registries/my-registry`.
  string parent = 1;

  // The value of `gateway_id` can be either the device numeric ID or the
  // user-defined device identifier.
  string gateway_id = 2;

  // The device to associate with the specified gateway. The value of
  // `device_id` can be either the device numeric ID or the user-defined device
  // identifier.
  string device_id = 3;
}

// Response for `BindDeviceToGateway`.
message BindDeviceToGatewayResponse {}

// Request for `UnbindDeviceFromGateway`.
message UnbindDeviceFromGatewayRequest {
  // The name of the registry. For example,
  // `projects/example-project/locations/us-central1/registries/my-registry`.
  string parent = 1;

  // The value of `gateway_id` can be either the device numeric ID or the
  // user-defined device identifier.
  string gateway_id = 2;

  // The device to disassociate from the specified gateway. The value of
  // `device_id` can be either the device numeric ID or the user-defined device
  // identifier.
  string device_id = 3;
}

// Response for `UnbindDeviceFromGateway`.
message UnbindDeviceFromGatewayResponse {}