502 lines
17 KiB
Protocol Buffer
502 lines
17 KiB
Protocol Buffer
|
// Copyright 2022 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
|
||
|
//
|
||
|
// https://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";
|
||
|
|
||
|
option java_outer_classname = "HostProto";
|
||
|
|
||
|
package pandora;
|
||
|
|
||
|
import "google/protobuf/empty.proto";
|
||
|
import "google/protobuf/any.proto";
|
||
|
|
||
|
// Service to trigger Bluetooth Host procedures
|
||
|
//
|
||
|
// At startup, the Host must be in BR/EDR connectable mode
|
||
|
// (see GAP connectability modes).
|
||
|
service Host {
|
||
|
// Factory reset the host.
|
||
|
// **After** responding to this command, the gRPC server should loose
|
||
|
// all its state.
|
||
|
// This is comparable to a process restart or an hardware reset.
|
||
|
// The gRPC server might take some time to be available after
|
||
|
// this command.
|
||
|
rpc FactoryReset(google.protobuf.Empty) returns (google.protobuf.Empty);
|
||
|
// Reset the host by performing an HCI reset. Previous bonds must
|
||
|
// not be removed and the gRPC server must not be restarted.
|
||
|
rpc Reset(google.protobuf.Empty) returns (google.protobuf.Empty);
|
||
|
// Read the local Bluetooth device address.
|
||
|
// This should return the same value as a Read BD_ADDR HCI command.
|
||
|
rpc ReadLocalAddress(google.protobuf.Empty) returns (ReadLocalAddressResponse);
|
||
|
// Create an ACL BR/EDR connection to a peer.
|
||
|
// If the two devices have not established a previous bond,
|
||
|
// the peer must be discoverable.
|
||
|
// Whether this also triggers pairing (i.e. authentication and/or encryption)
|
||
|
// is implementation defined:
|
||
|
// some Bluetooth Host stack trigger pairing when ACL connection is being
|
||
|
// established, others when a profile or service requiring a specific
|
||
|
// security level is being opened. If it does trigger pairing, pairing events
|
||
|
// shall be handled through `Security.OnPairing` if a corresponding stream
|
||
|
// has been opened prior to this call, otherwise, they shall be automatically
|
||
|
// confirmed by the host before this method returns.
|
||
|
rpc Connect(ConnectRequest) returns (ConnectResponse);
|
||
|
// Get an active ACL BR/EDR connection to a peer.
|
||
|
rpc GetConnection(GetConnectionRequest) returns (GetConnectionResponse);
|
||
|
// Wait for an ACL BR/EDR connection from a peer.
|
||
|
rpc WaitConnection(WaitConnectionRequest) returns (WaitConnectionResponse);
|
||
|
// Create an ACL LE connection.
|
||
|
// Unlike BR/EDR `Connect`, this must not trigger or wait any
|
||
|
// pairing/encryption and return as soon as the connection is complete.
|
||
|
rpc ConnectLE(ConnectLERequest) returns (ConnectLEResponse);
|
||
|
// Get an active ACL LE connection to a peer.
|
||
|
rpc GetLEConnection(GetLEConnectionRequest) returns (GetLEConnectionResponse);
|
||
|
// Wait for an ACL LE connection from a peer.
|
||
|
rpc WaitLEConnection(WaitLEConnectionRequest) returns (WaitLEConnectionResponse);
|
||
|
// Disconnect an ACL connection.
|
||
|
// The related Connection must not be reused afterwards.
|
||
|
rpc Disconnect(DisconnectRequest) returns (google.protobuf.Empty);
|
||
|
// Wait for disconnection of an ACL connection.
|
||
|
rpc WaitDisconnection(WaitDisconnectionRequest) returns (google.protobuf.Empty);
|
||
|
// Create and enable an advertising set using legacy or extended advertising,
|
||
|
// except periodic advertising.
|
||
|
rpc StartAdvertising(StartAdvertisingRequest) returns (StartAdvertisingResponse);
|
||
|
// Remove an advertising set.
|
||
|
rpc StopAdvertising(StopAdvertisingRequest) returns (google.protobuf.Empty);
|
||
|
// Run LE scanning and return each device found.
|
||
|
// Canceling the `Scan` stream shall stop scanning.
|
||
|
rpc Scan(ScanRequest) returns (stream ScanningResponse);
|
||
|
// Start BR/EDR inquiry and returns each device found.
|
||
|
// Canceling the `Inquiry` stream shall stop inquiry.
|
||
|
rpc Inquiry(google.protobuf.Empty) returns (stream InquiryResponse);
|
||
|
// Set BR/EDR discoverability mode.
|
||
|
rpc SetDiscoverabilityMode(SetDiscoverabilityModeRequest) returns (google.protobuf.Empty);
|
||
|
// Set BR/EDR connectability mode.
|
||
|
rpc SetConnectabilityMode(SetConnectabilityModeRequest) returns (google.protobuf.Empty);
|
||
|
// Get remote device name from connection.
|
||
|
rpc GetRemoteName(GetRemoteNameRequest) returns (GetRemoteNameResponse);
|
||
|
}
|
||
|
|
||
|
// Bluetooth device own address type.
|
||
|
enum OwnAddressType {
|
||
|
PUBLIC = 0x0;
|
||
|
RANDOM = 0x1;
|
||
|
RESOLVABLE_OR_PUBLIC = 0x2;
|
||
|
RESOLVABLE_OR_RANDOM = 0x3;
|
||
|
}
|
||
|
|
||
|
// Advertisement primary PHY types.
|
||
|
enum PrimaryPhy {
|
||
|
PRIMARY_1M = 0;
|
||
|
PRIMARY_CODED = 2;
|
||
|
}
|
||
|
|
||
|
// Advertisement secondary PHY types.
|
||
|
enum SecondaryPhy {
|
||
|
SECONDARY_1M = 0;
|
||
|
SECONDARY_2M = 1;
|
||
|
SECONDARY_CODED = 2;
|
||
|
}
|
||
|
|
||
|
// Discoverability modes.
|
||
|
enum DiscoverabilityMode {
|
||
|
NOT_DISCOVERABLE = 0;
|
||
|
DISCOVERABLE_LIMITED = 1;
|
||
|
DISCOVERABLE_GENERAL = 2;
|
||
|
}
|
||
|
|
||
|
// Connectability modes (BR/EDR only).
|
||
|
enum ConnectabilityMode {
|
||
|
NOT_CONNECTABLE = 0;
|
||
|
CONNECTABLE = 1;
|
||
|
}
|
||
|
|
||
|
// A Token representing an ACL connection.
|
||
|
// It's acquired via a `Connect` or `ConnectLE`.
|
||
|
message Connection {
|
||
|
// Opaque value filled by the gRPC server, must not be modified nor crafted.
|
||
|
google.protobuf.Any cookie = 1;
|
||
|
}
|
||
|
|
||
|
// A Token representing an Advertising set.
|
||
|
// It's acquired via a `StartAdvertising` on the Host service.
|
||
|
message AdvertisingSet {
|
||
|
// Opaque value filled by the gRPC server, must not be modified nor crafted.
|
||
|
google.protobuf.Any cookie = 1;
|
||
|
}
|
||
|
|
||
|
// Data types notably used for Extended Inquiry Response and Advertising Data.
|
||
|
// The Flags data type is mandatory must be automatically set by the IUT and is
|
||
|
// not exposed here.
|
||
|
// include_<data type> are used in advertising requests for data types
|
||
|
// which may not be exposed to the user and that must be set by the IUT
|
||
|
// when specified.
|
||
|
// See Core Supplement, Part A, Data Types for details.
|
||
|
message DataTypes {
|
||
|
repeated string incomplete_service_class_uuids16 = 1; // Incomplete List of 16bit Service Class UUIDs
|
||
|
repeated string complete_service_class_uuids16 = 2; // Complete List of 16bit Service Class UUIDs
|
||
|
repeated string incomplete_service_class_uuids32 = 3; // Incomplete List of 32bit Service Class UUIDs
|
||
|
repeated string complete_service_class_uuids32 = 4; // Complete List of 32bit Service Class UUIDs
|
||
|
repeated string incomplete_service_class_uuids128 = 5; // Incomplete List of 128bit Service Class UUIDs
|
||
|
repeated string complete_service_class_uuids128 = 6; // Complete List of 128bit Service Class UUIDs
|
||
|
// Shortened Local Name
|
||
|
oneof shortened_local_name_oneof {
|
||
|
string shortened_local_name = 7;
|
||
|
bool include_shortened_local_name = 8;
|
||
|
}
|
||
|
// Complete Local Name
|
||
|
oneof complete_local_name_oneof {
|
||
|
string complete_local_name = 9;
|
||
|
bool include_complete_local_name = 10;
|
||
|
}
|
||
|
// Tx Power Level
|
||
|
oneof tx_power_level_oneof {
|
||
|
uint32 tx_power_level = 11;
|
||
|
bool include_tx_power_level = 12;
|
||
|
}
|
||
|
// Class of Device
|
||
|
oneof class_of_device_oneof {
|
||
|
uint32 class_of_device = 13;
|
||
|
bool include_class_of_device = 14;
|
||
|
}
|
||
|
uint32 peripheral_connection_interval_min = 15; // Peripheral Connection Interval Range minimum value, 16 bits
|
||
|
uint32 peripheral_connection_interval_max = 16; // Peripheral Connection Interval Range maximum value, 16 bits
|
||
|
repeated string service_solicitation_uuids16 = 17; // List of 16bit Service Solicitation UUIDs
|
||
|
repeated string service_solicitation_uuids128 = 18; // List of 128bit Service Solicitation UUIDs
|
||
|
map<string, bytes> service_data_uuid16 = 19; // Service Data 16bit UUID
|
||
|
repeated bytes public_target_addresses = 20; // Public Target Addresses
|
||
|
repeated bytes random_target_addresses = 21; // Random Target Addresses
|
||
|
uint32 appearance = 22; // Appearance (16bits)
|
||
|
// Advertising Interval
|
||
|
oneof advertising_interval_oneof {
|
||
|
uint32 advertising_interval = 23; // 16 bits
|
||
|
bool include_advertising_interval = 24;
|
||
|
}
|
||
|
repeated string service_solicitation_uuids32 = 25; // List of 32bit Service Solicitation UUIDs
|
||
|
map<string, bytes> service_data_uuid32 = 26; // Service Data 32bit UUID
|
||
|
map<string, bytes> service_data_uuid128 = 27; // Service Data 128bit UUID
|
||
|
string uri = 28; // URI
|
||
|
bytes le_supported_features = 29; // LE Supported Features
|
||
|
bytes manufacturer_specific_data = 30; // Manufacturer Specific Data
|
||
|
DiscoverabilityMode le_discoverability_mode = 31; // Flags LE Discoverability Mode
|
||
|
}
|
||
|
|
||
|
// Response of the `ReadLocalAddress` method.
|
||
|
message ReadLocalAddressResponse {
|
||
|
// Local Bluetooth device address as array of 6 bytes.
|
||
|
bytes address = 1;
|
||
|
}
|
||
|
|
||
|
// Request of the `Connect` method.
|
||
|
message ConnectRequest {
|
||
|
// Peer Bluetooth device address as array of 6 bytes.
|
||
|
bytes address = 1;
|
||
|
}
|
||
|
|
||
|
// Response of the `Connect` method.
|
||
|
message ConnectResponse {
|
||
|
// Response result.
|
||
|
oneof result {
|
||
|
// Connection on `Connect` success
|
||
|
Connection connection = 1;
|
||
|
// Peer not found error.
|
||
|
google.protobuf.Empty peer_not_found = 2;
|
||
|
// A connection with peer already exists.
|
||
|
google.protobuf.Empty connection_already_exists = 3;
|
||
|
// Pairing failure error.
|
||
|
google.protobuf.Empty pairing_failure = 4;
|
||
|
// Authentication failure error.
|
||
|
google.protobuf.Empty authentication_failure = 5;
|
||
|
// Encryption failure error.
|
||
|
google.protobuf.Empty encryption_failure = 6;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Request of the `GetConnection` method.
|
||
|
message GetConnectionRequest {
|
||
|
// Peer Bluetooth device address as array of 6 bytes.
|
||
|
bytes address = 1;
|
||
|
}
|
||
|
|
||
|
// Response of the `GetConnection` method.
|
||
|
message GetConnectionResponse {
|
||
|
// Response result.
|
||
|
oneof result {
|
||
|
// Connection on `GetConnection` success
|
||
|
Connection connection = 1;
|
||
|
// Peer not found error.
|
||
|
google.protobuf.Empty peer_not_found = 2;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Request of the `WaitConnection` method.
|
||
|
message WaitConnectionRequest {
|
||
|
// Peer Bluetooth device address as array of 6 bytes.
|
||
|
bytes address = 1;
|
||
|
}
|
||
|
|
||
|
// Response of the `WaitConnection` method.
|
||
|
message WaitConnectionResponse {
|
||
|
// Response result.
|
||
|
oneof result {
|
||
|
// Connection on `WaitConnection` success
|
||
|
Connection connection = 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Request of the `ConnectLE` method.
|
||
|
message ConnectLERequest {
|
||
|
// Own address type.
|
||
|
OwnAddressType own_address_type = 1;
|
||
|
// Peer Bluetooth device address as array of 6 bytes.
|
||
|
oneof address {
|
||
|
// Public device address.
|
||
|
bytes public = 2;
|
||
|
// Random device address.
|
||
|
bytes random = 3;
|
||
|
// Public identity device address.
|
||
|
bytes public_identity = 4;
|
||
|
// Random (static) identity device address.
|
||
|
bytes random_static_identity = 5;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Response of the `ConnectLE` method.
|
||
|
message ConnectLEResponse {
|
||
|
// Response result.
|
||
|
oneof result {
|
||
|
// Connection on `ConnectLE` success
|
||
|
Connection connection = 1;
|
||
|
// Peer not found error.
|
||
|
google.protobuf.Empty peer_not_found = 2;
|
||
|
// A connection with peer already exists.
|
||
|
google.protobuf.Empty connection_already_exists = 3;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Request of the `GetLEConnection` method.
|
||
|
message GetLEConnectionRequest {
|
||
|
// Peer Bluetooth device address as array of 6 bytes.
|
||
|
oneof address {
|
||
|
// Public device address.
|
||
|
bytes public = 1;
|
||
|
// Random device address.
|
||
|
bytes random = 2;
|
||
|
// Public identity device address.
|
||
|
bytes public_identity = 3;
|
||
|
// Random (static) identity device address.
|
||
|
bytes random_static_identity = 4;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Response of the `GetLEConnection` method.
|
||
|
message GetLEConnectionResponse {
|
||
|
// Response result.
|
||
|
oneof result {
|
||
|
// Connection on `GetLEConnection` success
|
||
|
Connection connection = 1;
|
||
|
// Peer not found error.
|
||
|
google.protobuf.Empty peer_not_found = 2;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Request of the `WaitLEConnection` method.
|
||
|
message WaitLEConnectionRequest {
|
||
|
// Peer Bluetooth device address as array of 6 bytes.
|
||
|
oneof address {
|
||
|
// Public device address.
|
||
|
bytes public = 1;
|
||
|
// Random device address.
|
||
|
bytes random = 2;
|
||
|
// Public identity device address.
|
||
|
bytes public_identity = 3;
|
||
|
// Random (static) identity device address.
|
||
|
bytes random_static_identity = 4;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Response of the `WaitLEConnection` method.
|
||
|
message WaitLEConnectionResponse {
|
||
|
// Response result.
|
||
|
oneof result {
|
||
|
// Connection on `WaitLEConnection` success
|
||
|
Connection connection = 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Request of the `Disconnect` method.
|
||
|
message DisconnectRequest {
|
||
|
// Connection that should be disconnected.
|
||
|
Connection connection = 1;
|
||
|
}
|
||
|
|
||
|
// Request of the `WaitDisconnection` method.
|
||
|
message WaitDisconnectionRequest {
|
||
|
// Connection to wait disconnection from.
|
||
|
Connection connection = 1;
|
||
|
}
|
||
|
|
||
|
// Request of the `StartAdvertising` method.
|
||
|
message StartAdvertisingRequest {
|
||
|
// `true` to use legacy advertising.
|
||
|
// The implementation shall fail when set to `false` and
|
||
|
// extended advertising is not supported.
|
||
|
bool legacy = 1;
|
||
|
// Advertisement data.
|
||
|
DataTypes data = 2;
|
||
|
// If none, the device is not scannable.
|
||
|
DataTypes scan_response_data = 3;
|
||
|
// Target Bluetooth device address as array of 6 bytes.
|
||
|
// If none, advertisement is undirected.
|
||
|
oneof target {
|
||
|
// Public device address or public identity address.
|
||
|
bytes public = 4;
|
||
|
// Random device address or random (static) identity address.
|
||
|
bytes random = 5;
|
||
|
}
|
||
|
// Own address type to advertise.
|
||
|
OwnAddressType own_address_type = 6;
|
||
|
// `true` if the device is connectable.
|
||
|
bool connectable = 7;
|
||
|
// Interval & range of the advertisement.
|
||
|
float interval = 8;
|
||
|
// If not specified, the IUT is free to select any interval min and max
|
||
|
// which comprises the specified interval.
|
||
|
float interval_range = 9;
|
||
|
// Extended only: primary PHYs.
|
||
|
PrimaryPhy primary_phy = 10;
|
||
|
// Extended only: secondary PHYs.
|
||
|
SecondaryPhy secondary_phy = 11;
|
||
|
}
|
||
|
|
||
|
// Response of the `StartAdvertising` method.
|
||
|
message StartAdvertisingResponse {
|
||
|
AdvertisingSet set = 1;
|
||
|
}
|
||
|
|
||
|
// Request of the `StopAdvertising` method.
|
||
|
message StopAdvertisingRequest {
|
||
|
// AdvertisingSet that should be stopped.
|
||
|
AdvertisingSet set = 1;
|
||
|
}
|
||
|
|
||
|
// Request of the `Scan` method.
|
||
|
message ScanRequest {
|
||
|
// `true` the use legacy scanning.
|
||
|
// The implementation shall fail when set to `false` and
|
||
|
// extended scanning is not supported.
|
||
|
bool legacy = 1;
|
||
|
// Scan in passive mode (versus active one).
|
||
|
bool passive = 2;
|
||
|
// Own address type.
|
||
|
OwnAddressType own_address_type = 3;
|
||
|
// Interval & window of the scan.
|
||
|
float interval = 4;
|
||
|
float window = 5;
|
||
|
// Scanning PHYs.
|
||
|
repeated PrimaryPhy phys = 6;
|
||
|
}
|
||
|
|
||
|
// Response of the `Scan` method.
|
||
|
message ScanningResponse {
|
||
|
// `true` if the response is legacy.
|
||
|
bool legacy = 1;
|
||
|
// Peer Bluetooth device address as array of 6 bytes.
|
||
|
oneof address {
|
||
|
// Public device address.
|
||
|
bytes public = 2;
|
||
|
// Random device address.
|
||
|
bytes random = 3;
|
||
|
// Public identity device address (corresponds to resolved private address).
|
||
|
bytes public_identity = 4;
|
||
|
// Random (static) identity device address (corresponds to resolved private address).
|
||
|
bytes random_static_identity = 5;
|
||
|
}
|
||
|
// Direct Bluetooth device address as array of 6 bytes.
|
||
|
oneof direct_address {
|
||
|
// Public device address.
|
||
|
bytes direct_public = 6;
|
||
|
// Non-resolvable private address or static device address.
|
||
|
bytes direct_non_resolvable_random = 7;
|
||
|
// Resolvable private address (resolved by controller).
|
||
|
bytes direct_resolved_public = 8;
|
||
|
// Resolvable private address (resolved by controller).
|
||
|
bytes direct_resolved_random = 9;
|
||
|
// Resolvable private address (controller unable to resolve).
|
||
|
bytes direct_unresolved_random = 10;
|
||
|
}
|
||
|
// `true` if the peer is connectable.
|
||
|
bool connectable = 11;
|
||
|
// `true` if the peer is scannable.
|
||
|
bool scannable = 12;
|
||
|
// `true` if the `undirected.data` is truncated.
|
||
|
// This indicates that the advertisement data are truncated.
|
||
|
bool truncated = 13;
|
||
|
// Advertising SID from 0x00 to 0x0F.
|
||
|
uint32 sid = 14;
|
||
|
// On extended only: primary PHYs.
|
||
|
PrimaryPhy primary_phy = 15;
|
||
|
// On extended only: secondary PHYs.
|
||
|
SecondaryPhy secondary_phy = 16;
|
||
|
// TX power in dBm, range: -127 to +20.
|
||
|
int32 tx_power = 17;
|
||
|
// Received Signal Strenght Indication in dBm, range: -127 to +20.
|
||
|
int32 rssi = 18;
|
||
|
// Interval of the periodic advertising, 0 if not periodic
|
||
|
// or within 7.5 ms to 81,918.75 ms range.
|
||
|
float periodic_advertising_interval = 19;
|
||
|
// Scan response data.
|
||
|
DataTypes data = 20;
|
||
|
}
|
||
|
|
||
|
// Response of the `Inquiry` method.
|
||
|
message InquiryResponse {
|
||
|
bytes address = 1;
|
||
|
uint32 page_scan_repetition_mode = 2;
|
||
|
uint32 class_of_device = 3;
|
||
|
uint32 clock_offset = 4;
|
||
|
int32 rssi = 5;
|
||
|
DataTypes data = 6;
|
||
|
}
|
||
|
|
||
|
// Request of the `SetDiscoverabilityMode` method.
|
||
|
message SetDiscoverabilityModeRequest {
|
||
|
DiscoverabilityMode mode = 1;
|
||
|
}
|
||
|
|
||
|
// Request of the `SetConnectabilityMode` method.
|
||
|
message SetConnectabilityModeRequest {
|
||
|
ConnectabilityMode mode = 1;
|
||
|
}
|
||
|
|
||
|
// Request of the `GetRemoteName` method.
|
||
|
message GetRemoteNameRequest {
|
||
|
oneof remote {
|
||
|
// ACL connection with remote device.
|
||
|
Connection connection = 1;
|
||
|
// Remote Bluetooth device address as array of 6 bytes.
|
||
|
bytes address = 2;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Response of the `GetRemoteName` method.
|
||
|
message GetRemoteNameResponse {
|
||
|
// Response result.
|
||
|
oneof result {
|
||
|
// Remote name on `GetRemoteName` success.
|
||
|
string name = 1;
|
||
|
// Remote not found error.
|
||
|
google.protobuf.Empty remote_not_found = 2;
|
||
|
}
|
||
|
}
|