// Copyright 2017 The Fuchsia Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. library fuchsia.bluetooth.gatt; using fuchsia.bluetooth; interface RemoteService { // Returns the characteristics and characteristic descriptors that belong to // this service. 1: DiscoverCharacteristics() -> (fuchsia.bluetooth.Status status, vector<Characteristic> characteristics); // Reads the value of the characteristic with |id| and returns it in the // reply. If |status| indicates an error |value| will be empty. // // If the characteristic has a long value (i.e. larger than the current MTU) // this method will return only the first (MTU - 1) bytes of the value. Use // ReadLongCharacteristic() to read larger values or starting at a non-zero // offset. 2: ReadCharacteristic(uint64 id) -> (fuchsia.bluetooth.Status status, vector<uint8> value); // Reads the complete value of a characteristic with the given |id|. This // procedure should be used if the characteristic is known to have a value // that can not be read in a single request. // // Returns up to |max_bytes| octets of the characteristic value starting at // the given |offset|. // // This may return an error if: // a. |max_bytes| is 0; // b. The |offset| is invalid; // c. The characteristic does not have a long value; // d. The server does not support the long read procedure. 3: ReadLongCharacteristic(uint64 id, uint16 offset, uint16 max_bytes) -> (fuchsia.bluetooth.Status status, vector<uint8> value); // Writes |value| to the characteristic with |id|. The ATT protocol method is // selected based on the input parameters and properties of the // characteristic: // // a. If |value| fits within a single ATT request (based on the current MTU) // and |offset| is 0, the "Write Characteristic Value" procedure will be // used. // b. If |value| is value cannot fit within a single ATT request or a // non-zero |offset| is requested, the "Write Long Characteristic Value" // procedure will be used. // c. If the characteristic does not claim to support the selected // procedure, the request will fail with ErrorCode.NotSupported. 4: WriteCharacteristic(uint64 id, uint16 offset, vector<uint8> value) -> (fuchsia.bluetooth.Status status); // Writes |value| to the characteristic with |id| without soliciting an // acknowledgement from the peer. This method has no response and its delivery // cannot be confirmed. 5: WriteCharacteristicWithoutResponse(uint64 id, vector<uint8> value); // Reads the value of the characteristic descriptor with |id| and returns it // in the reply. If |status| indicates an error, |value| can be ignored. // // If the descriptor has a long value (i.e. larger than the current MTU) // this method will return only the first (MTU - 1) bytes of the value. Use // ReadLongDescriptor() to read larger values or starting at a non-zero // offset. 6: ReadDescriptor(uint64 id) -> (fuchsia.bluetooth.Status status, vector<uint8> value); // Reads the complete value of a characteristic descriptor with the given |id|. // This procedure should be used if the descriptor is known to have a value // that can not be read in a single request. // // Returns up to |max_bytes| octets of the characteristic value starting at // the given |offset|. // // This may return an error if: // a. |max_bytes| is 0; // b. The |offset| is invalid; // c. The server does not support the long read procedure. 7: ReadLongDescriptor(uint64 id, uint16 offset, uint16 max_bytes) -> (fuchsia.bluetooth.Status status, vector<uint8> value); // Writes |value| to the characteristic descriptor with |id|. This operation // may return an error if: // a. The size of |value| exceeds the current MTU. // b. |id| refers to an internally reserved descriptor type (e.g. the Client // Characteristic Configuration descriptor). 8: WriteDescriptor(uint64 id, vector<uint8> value) -> (fuchsia.bluetooth.Status status); // Subscribe or unsubscribe to notifications/indications from the characteristic with // the given |id|. Notifications or indications will be enabled if |enable| is // true or disabled if |enable| is false and they have been enabled for this // client. // // Either notifications or indications will be enabled depending on // characteristic properties. Indications will be preferred if they are // supported. // // This operation fails if the characteristic does not have the "notify" or // "indicate" property or does not contain a Client Characteristic // Configuration descriptor. // // On success, the OnCharacteristicValueUpdated event will be sent whenever // the peer sends a notification or indication. The local host will // automically confirm indications. 9: NotifyCharacteristic(uint64 id, bool enable) -> (fuchsia.bluetooth.Status status); // Events: // Called when a characteristic value notification or indication is received. 1001: -> OnCharacteristicValueUpdated(uint64 id, vector<uint8> value); }; interface Client { // Enumerates services found on the peer that this Client represents. Results // can be restricted by specifying a list of UUIDs in |uuids|. The returned // ServiceInfo structures will contain only basic information about each // service and the |characteristics| and |includes| fields will be null. // // To further interact with services, clients must obtain a RemoteService // handle by calling ConnectToService(). 1: ListServices(vector<string>? uuids) -> (fuchsia.bluetooth.Status status, vector<ServiceInfo> services); // Connects the RemoteService with the given identifier. 2: ConnectToService(uint64 id, request<RemoteService> service); };