127 lines
4.2 KiB
C++
127 lines
4.2 KiB
C++
//
|
|
// Copyright 2015 Google, Inc.
|
|
//
|
|
// 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.
|
|
//
|
|
#pragma once
|
|
|
|
#include <bluetooth/uuid.h>
|
|
#include <array>
|
|
#include <memory>
|
|
#include <unordered_map>
|
|
#include <vector>
|
|
|
|
#include "hardware/bluetooth.h"
|
|
#include "hardware/bt_gatt.h"
|
|
|
|
namespace bluetooth {
|
|
namespace gatt {
|
|
|
|
// Attribute permission values
|
|
const int kPermissionRead = 0x1;
|
|
const int kPermissionReadEncrypted = 0x2;
|
|
const int kPermissionReadEncryptedMitm = 0x4;
|
|
const int kPermissionWrite = 0x10;
|
|
const int kPermissionWriteEnecrypted = 0x20;
|
|
const int KPermissionWriteEncryptedMitm = 0x40;
|
|
const int kPermissionWriteSigned = 0x80;
|
|
const int kPermissionWriteSignedMitm = 0x100;
|
|
|
|
// GATT characteristic properties bit-field values
|
|
const int kPropertyBroadcast = 0x1;
|
|
const int kPropertyRead = 0x2;
|
|
const int kPropertyWriteNoResponse = 0x4;
|
|
const int kPropertyWrite = 0x8;
|
|
const int kPropertyNotify = 0x10;
|
|
const int kPropertyIndicate = 0x20;
|
|
const int kPropertySignedWrite = 0x40;
|
|
const int kPropertyExtendedProps = 0x80;
|
|
|
|
// A mapping from string bluetooth addresses to RSSI measurements.
|
|
typedef std::unordered_map<std::string, int> ScanResults;
|
|
|
|
// TODO(armansito): This should be a private internal class though I don't see
|
|
// why we even need this class. Instead it should probably be merged into
|
|
// Server.
|
|
struct ServerInternals;
|
|
|
|
// Server is threadsafe and internally locked.
|
|
// Asynchronous IO is identified via a gatt_pipe FD,
|
|
// and synchronously read with 'GetCharacteristicValue'
|
|
//
|
|
// ****DEPRECATED****
|
|
//
|
|
// TODO(armansito): This class has been deprecated and is being replaced by
|
|
// bluetooth::GattServer. We will remove this entirely once the new code is
|
|
// ready.
|
|
class Server {
|
|
public:
|
|
Server();
|
|
~Server();
|
|
|
|
// Register GATT interface, initialize internal state,
|
|
// and open a pipe for characteristic write notification.
|
|
bool Initialize(const Uuid& service_id, int* gatt_pipe);
|
|
|
|
// Control the content of service advertisement.
|
|
bool SetAdvertisement(const std::vector<Uuid>& ids,
|
|
const std::vector<uint8_t>& service_data,
|
|
const std::vector<uint8_t>& manufacturer_data,
|
|
bool transmit_name);
|
|
|
|
// Control the content of service scan response.
|
|
bool SetScanResponse(const std::vector<Uuid>& ids,
|
|
const std::vector<uint8_t>& service_data,
|
|
const std::vector<uint8_t>& manufacturer_data,
|
|
bool transmit_name);
|
|
|
|
// Add an ordinary characteristic for reading and/or writing.
|
|
bool AddCharacteristic(const Uuid& id, int properties, int permissions);
|
|
|
|
// Add a special 'blob' characteristic with a corresponding control
|
|
// attribute to manipulate which part of the blob the attribute represents.
|
|
bool AddBlob(const Uuid& id, const Uuid& control_id, int properties,
|
|
int permissions);
|
|
|
|
// Put a new value into a characeteristic.
|
|
// It will be read from a client starting at the next 0-offset read.
|
|
bool SetCharacteristicValue(const Uuid& id,
|
|
const std::vector<uint8_t>& value);
|
|
|
|
// Get the current value of a characteristic.
|
|
bool GetCharacteristicValue(const Uuid& id, std::vector<uint8_t>* value);
|
|
|
|
// Start this service. Activate advertisements, allow connections.
|
|
// Characteristics should all be created before this.
|
|
bool Start();
|
|
|
|
// Cease advertisements and disallow connections.
|
|
bool Stop();
|
|
|
|
// Enable LE scan. Scan results will be cached internally.
|
|
bool ScanEnable();
|
|
|
|
// Disable LE scan.
|
|
bool ScanDisable();
|
|
|
|
// Copy out the cached scan results.
|
|
bool GetScanResults(ScanResults* results);
|
|
|
|
private:
|
|
// Internal data.
|
|
std::unique_ptr<ServerInternals> internal_;
|
|
};
|
|
|
|
} // namespace gatt
|
|
} // namespace bluetooth
|