10f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// 20f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// Copyright (C) 2015 Google, Inc. 30f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// 40f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// Licensed under the Apache License, Version 2.0 (the "License"); 50f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// you may not use this file except in compliance with the License. 60f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// You may obtain a copy of the License at: 70f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// 80f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// http://www.apache.org/licenses/LICENSE-2.0 90f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// 100f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// Unless required by applicable law or agreed to in writing, software 110f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// distributed under the License is distributed on an "AS IS" BASIS, 120f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// See the License for the specific language governing permissions and 140f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// limitations under the License. 150f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// 160f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray#pragma once 170f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray 180f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray#include <array> 190f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray#include <memory> 200f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray#include <unordered_map> 210f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray#include <vector> 220f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray 230f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray#include "hardware/bluetooth.h" 240f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray#include "hardware/bt_gatt.h" 25234138e2606dd7a54fbcc540643511abc0a3598dArman Uguray#include "service/common/bluetooth/uuid.h" 260f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray 270f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguraynamespace bluetooth { 280f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguraynamespace gatt { 290f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray 300f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// Attribute permission values 310f2d4897046f037a9f181f47f3d349a9dd646478Arman Ugurayconst int kPermissionRead = 0x1; 320f2d4897046f037a9f181f47f3d349a9dd646478Arman Ugurayconst int kPermissionReadEncrypted = 0x2; 330f2d4897046f037a9f181f47f3d349a9dd646478Arman Ugurayconst int kPermissionReadEncryptedMitm = 0x4; 340f2d4897046f037a9f181f47f3d349a9dd646478Arman Ugurayconst int kPermissionWrite = 0x10; 350f2d4897046f037a9f181f47f3d349a9dd646478Arman Ugurayconst int kPermissionWriteEnecrypted = 0x20; 360f2d4897046f037a9f181f47f3d349a9dd646478Arman Ugurayconst int KPermissionWriteEncryptedMitm = 0x40; 370f2d4897046f037a9f181f47f3d349a9dd646478Arman Ugurayconst int kPermissionWriteSigned = 0x80; 380f2d4897046f037a9f181f47f3d349a9dd646478Arman Ugurayconst int kPermissionWriteSignedMitm = 0x100; 390f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray 400f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// GATT characteristic properties bit-field values 410f2d4897046f037a9f181f47f3d349a9dd646478Arman Ugurayconst int kPropertyBroadcast = 0x1; 420f2d4897046f037a9f181f47f3d349a9dd646478Arman Ugurayconst int kPropertyRead = 0x2; 430f2d4897046f037a9f181f47f3d349a9dd646478Arman Ugurayconst int kPropertyWriteNoResponse = 0x4; 440f2d4897046f037a9f181f47f3d349a9dd646478Arman Ugurayconst int kPropertyWrite = 0x8; 450f2d4897046f037a9f181f47f3d349a9dd646478Arman Ugurayconst int kPropertyNotify = 0x10; 460f2d4897046f037a9f181f47f3d349a9dd646478Arman Ugurayconst int kPropertyIndicate = 0x20; 470f2d4897046f037a9f181f47f3d349a9dd646478Arman Ugurayconst int kPropertySignedWrite = 0x40; 480f2d4897046f037a9f181f47f3d349a9dd646478Arman Ugurayconst int kPropertyExtendedProps = 0x80; 490f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray 500f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// A mapping from string bluetooth addresses to RSSI measurements. 510f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguraytypedef std::unordered_map<std::string, int> ScanResults; 520f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray 530f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// TODO(armansito): This should be a private internal class though I don't see 540f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// why we even need this class. Instead it should probably be merged into 550f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// Server. 560f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguraystruct ServerInternals; 570f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray 580f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// Server is threadsafe and internally locked. 590f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// Asynchronous IO is identified via a gatt_pipe FD, 600f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// and synchronously read with 'GetCharacteristicValue' 610f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// 620f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// ****DEPRECATED**** 630f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// 640f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// TODO(armansito): This class has been deprecated and is being replaced by 650f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// bluetooth::GattServer. We will remove this entirely once the new code is 660f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// ready. 670f2d4897046f037a9f181f47f3d349a9dd646478Arman Ugurayclass Server { 680f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray public: 690f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray Server(); 700f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray ~Server(); 710f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray 720f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray // Register GATT interface, initialize internal state, 730f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray // and open a pipe for characteristic write notification. 740f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray bool Initialize(const UUID& service_id, int* gatt_pipe); 750f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray 760f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray // Control the content of service advertisement. 770f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray bool SetAdvertisement(const std::vector<UUID>& ids, 780f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray const std::vector<uint8_t>& service_data, 790f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray const std::vector<uint8_t>& manufacturer_data, 800f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray bool transmit_name); 810f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray 820f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray // Control the content of service scan response. 830f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray bool SetScanResponse(const std::vector<UUID>& ids, 840f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray const std::vector<uint8_t>& service_data, 850f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray const std::vector<uint8_t>& manufacturer_data, 860f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray bool transmit_name); 870f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray 880f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray // Add an ordinary characteristic for reading and/or writing. 890f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray bool AddCharacteristic(const UUID &id, int properties, int permissions); 900f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray 910f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray // Add a special 'blob' characteristic with a corresponding control 920f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray // attribute to manipulate which part of the blob the attribute represents. 930f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray bool AddBlob(const UUID &id, const UUID &control_id, int properties, 940f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray int permissions); 950f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray 960f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray // Put a new value into a characeteristic. 970f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray // It will be read from a client starting at the next 0-offset read. 980f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray bool SetCharacteristicValue(const UUID &id, const std::vector<uint8_t> &value); 990f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray 1000f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray // Get the current value of a characteristic. 1010f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray bool GetCharacteristicValue(const UUID &id, std::vector<uint8_t> *value); 1020f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray 1030f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray // Start this service. Activate advertisements, allow connections. 1040f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray // Characteristics should all be created before this. 1050f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray bool Start(); 1060f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray 1070f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray // Cease advertisements and disallow connections. 1080f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray bool Stop(); 1090f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray 1100f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray // Enable LE scan. Scan results will be cached internally. 1110f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray bool ScanEnable(); 1120f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray 1130f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray // Disable LE scan. 1140f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray bool ScanDisable(); 1150f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray 1160f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray // Copy out the cached scan results. 1170f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray bool GetScanResults(ScanResults *results); 1180f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray 1190f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray private: 1200f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray // Internal data. 1210f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray std::unique_ptr<ServerInternals> internal_; 1220f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray}; 1230f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray 1240f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray} // namespace gatt 1250f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray} // namespace bluetooth 126