1 //
2 //  Copyright 2015 Google, Inc.
3 //
4 //  Licensed under the Apache License, Version 2.0 (the "License");
5 //  you may not use this file except in compliance with the License.
6 //  You may obtain a copy of the License at:
7 //
8 //  http://www.apache.org/licenses/LICENSE-2.0
9 //
10 //  Unless required by applicable law or agreed to in writing, software
11 //  distributed under the License is distributed on an "AS IS" BASIS,
12 //  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 //  See the License for the specific language governing permissions and
14 //  limitations under the License.
15 //
16 #pragma once
17 
18 #include <bluetooth/uuid.h>
19 #include <array>
20 #include <memory>
21 #include <unordered_map>
22 #include <vector>
23 
24 #include "hardware/bluetooth.h"
25 #include "hardware/bt_gatt.h"
26 
27 namespace bluetooth {
28 namespace gatt {
29 
30 // Attribute permission values
31 const int kPermissionRead = 0x1;
32 const int kPermissionReadEncrypted = 0x2;
33 const int kPermissionReadEncryptedMitm = 0x4;
34 const int kPermissionWrite = 0x10;
35 const int kPermissionWriteEnecrypted = 0x20;
36 const int KPermissionWriteEncryptedMitm = 0x40;
37 const int kPermissionWriteSigned = 0x80;
38 const int kPermissionWriteSignedMitm = 0x100;
39 
40 // GATT characteristic properties bit-field values
41 const int kPropertyBroadcast = 0x1;
42 const int kPropertyRead = 0x2;
43 const int kPropertyWriteNoResponse = 0x4;
44 const int kPropertyWrite = 0x8;
45 const int kPropertyNotify = 0x10;
46 const int kPropertyIndicate = 0x20;
47 const int kPropertySignedWrite = 0x40;
48 const int kPropertyExtendedProps = 0x80;
49 
50 // A mapping from string bluetooth addresses to RSSI measurements.
51 typedef std::unordered_map<std::string, int> ScanResults;
52 
53 // TODO(armansito): This should be a private internal class though I don't see
54 // why we even need this class. Instead it should probably be merged into
55 // Server.
56 struct ServerInternals;
57 
58 // Server is threadsafe and internally locked.
59 // Asynchronous IO is identified via a gatt_pipe FD,
60 // and synchronously read with 'GetCharacteristicValue'
61 //
62 // ****DEPRECATED****
63 //
64 // TODO(armansito): This class has been deprecated and is being replaced by
65 // bluetooth::GattServer. We will remove this entirely once the new code is
66 // ready.
67 class Server {
68  public:
69   Server();
70   ~Server();
71 
72   // Register GATT interface, initialize internal state,
73   // and open a pipe for characteristic write notification.
74   bool Initialize(const Uuid& service_id, int* gatt_pipe);
75 
76   // Control the content of service advertisement.
77   bool SetAdvertisement(const std::vector<Uuid>& ids,
78                         const std::vector<uint8_t>& service_data,
79                         const std::vector<uint8_t>& manufacturer_data,
80                         bool transmit_name);
81 
82   // Control the content of service scan response.
83   bool SetScanResponse(const std::vector<Uuid>& ids,
84                        const std::vector<uint8_t>& service_data,
85                        const std::vector<uint8_t>& manufacturer_data,
86                        bool transmit_name);
87 
88   // Add an ordinary characteristic for reading and/or writing.
89   bool AddCharacteristic(const Uuid& id, int properties, int permissions);
90 
91   // Add a special 'blob' characteristic with a corresponding control
92   // attribute to manipulate which part of the blob the attribute represents.
93   bool AddBlob(const Uuid& id, const Uuid& control_id, int properties,
94                int permissions);
95 
96   // Put a new value into a characeteristic.
97   // It will be read from a client starting at the next 0-offset read.
98   bool SetCharacteristicValue(const Uuid& id,
99                               const std::vector<uint8_t>& value);
100 
101   // Get the current value of a characteristic.
102   bool GetCharacteristicValue(const Uuid& id, std::vector<uint8_t>* value);
103 
104   // Start this service. Activate advertisements, allow connections.
105   // Characteristics should all be created before this.
106   bool Start();
107 
108   // Cease advertisements and disallow connections.
109   bool Stop();
110 
111   // Enable LE scan. Scan results will be cached internally.
112   bool ScanEnable();
113 
114   // Disable LE scan.
115   bool ScanDisable();
116 
117   // Copy out the cached scan results.
118   bool GetScanResults(ScanResults* results);
119 
120  private:
121   // Internal data.
122   std::unique_ptr<ServerInternals> internal_;
123 };
124 
125 }  // namespace gatt
126 }  // namespace bluetooth
127