// Copyright 2017 Paul Nettle. // // This file is part of Gobbledegook. // // Gobbledegook is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Gobbledegook is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Gobbledegook. If not, see . // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // >> // >>> INSIDE THIS FILE // >> // // This file contains various functions for interacting with Bluetooth Management interface, which provides adapter configuration. // // >> // >>> DISCUSSION // >> // // We only cover the basics here. If there are configuration features you need that aren't supported (such as configuring BR/EDR), // then this would be a good place for them. // // Note that this class relies on the `HciAdapter`, which is a very primitive implementation. Use with caution. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #pragma once #include #include #include "HciAdapter.h" #include "Utils.h" namespace ggk { struct Mgmt { // // Constants // // The length of the controller's name (not including null terminator) static const int kMaxAdvertisingNameLength = 248; // The length of the controller's short name (not including null terminator) static const int kMaxAdvertisingShortNameLength = 10; // // Types // // These indices should match those in HciAdapter::kEventTypeNames enum EventTypes { EInvalidEvent = 0x0000, ECommandCompleteEvent = 0x0001, ECommandStatusEvent = 0x0002, EControllerErrorEvent = 0x0003, EIndexAddedEvent = 0x0004, EIndexRemovedEvent = 0x0005, ENewSettingsEvent = 0x0006, EClassOfDeviceChangedEvent = 0x0007, ELocalNameChangedEvent = 0x0008, ENewLinkKeyEvent = 0x0009, ENewLongTermKeyEvent = 0x000A, EDeviceConnectedEvent = 0x000B, EDeviceDisconnectedEvent = 0x000C, EConnectFailedEvent = 0x000D, EPINCodeRequestEvent = 0x000E, EUserConfirmationRequestEvent = 0x000F, EUserPasskeyRequestEvent = 0x0010, EAuthenticationFailedEvent = 0x0011, EDeviceFoundEvent = 0x0012, EDiscoveringEvent = 0x0013, EDeviceBlockedEvent = 0x0014, EDeviceUnblockedEvent = 0x0015, EDeviceUnpairedEvent = 0x0016, EPasskeyNotifyEvent = 0x0017, ENewIdentityResolvingKeyEvent = 0x0018, ENewSignatureResolvingKeyEvent = 0x0019, EDeviceAddedEvent = 0x001a, EDeviceRemovedEvent = 0x001b, ENewConnectionParameterEvent = 0x001c, EUnconfiguredIndexAddedEvent = 0x001d, EUnconfiguredIndexRemovedEvent = 0x001e, ENewConfigurationOptionsEvent = 0x001f, EExtendedIndexAddedEvent = 0x0020, EExtendedIndexRemovedEvent = 0x0021, ELocalOutOfBandExtendedDataUpdatedEvent = 0x0022, EAdvertisingAddedEvent = 0x0023, EAdvertisingRemovedEvent = 0x0024, EExtendedControllerInformationChangedEvent = 0x0025 }; // These indices should match those in HciAdapter::kCommandCodeNames enum CommandCodes { EInvalidCommand = 0x0000, EReadVersionInformationCommand = 0x0001, EReadSupportedCommandsCommand = 0x0002, EReadControllerIndexListCommand = 0x0003, EReadControllerInformationCommand = 0x0004, ESetPoweredCommand = 0x0005, ESetDiscoverableCommand = 0x0006, ESetConnectableCommand = 0x0007, ESetFastConnectableCommand = 0x0008, ESetBondableCommand = 0x0009, ESetLinkSecurityCommand = 0x000A, ESetSecureSimplePairingCommand = 0x000B, ESetHighSpeedCommand = 0x000C, ESetLowEnergyCommand = 0x000D, ESetDeviceClass = 0x000E, ESetLocalNameCommand = 0x000F, EAddUUIDCommand = 0x0010, ERemoveUUIDCommand = 0x0011, ELoadLinkKeysCommand = 0x0012, ELoadLongTermKeysCommand = 0x0013, EDisconnectCommand = 0x0014, EGetConnectionsCommand = 0x0015, EPINCodeReplyCommand = 0x0016, EPINCodeNegativeReplyCommand = 0x0017, ESetIOCapabilityCommand = 0x0018, EPairDeviceCommand = 0x0019, ECancelPairDeviceCommand = 0x001A, EUnpairDeviceCommand = 0x001B, EUserConfirmationReplyCommand = 0x001C, EUserConfirmationNegativeReplyCommand = 0x001D, EUserPasskeyReplyCommand = 0x001E, EUserPasskeyNegativeReplyCommand = 0x001F, EReadLocalOutOfBandDataCommand = 0x0020, EAddRemoteOutOfBandDataCommand = 0x0021, ERemoveRemoteOutOfBandDataCommand = 0x0022, EStartDiscoveryCommand = 0x0023, EStopDiscoveryCommand = 0x0024, EConfirmNameCommand = 0x0025, EBlockDeviceCommand = 0x0026, EUnblockDeviceCommand = 0x0027, ESetDeviceIDCommand = 0x0028, ESetAdvertisingCommand = 0x0029, ESetBREDRCommand = 0x002A, ESetStaticAddressCommand = 0x002B, ESetScanParametersCommand = 0x002C, ESetSecureConnectionsCommand = 0x002D, ESetDebugKeysCommand = 0x002E, ESetPrivacyCommand = 0x002F, ELoadIdentityResolvingKeysCommand = 0x0030, EGetConnectionInformationCommand = 0x0031, EGetClockInformationCommand = 0x0032, EAddDeviceCommand = 0x0033, ERemoveDeviceCommand = 0x0034, ELoadConnectionParametersCommand = 0x0035, EReadUnconfiguredControllerIndexListCommand = 0x0036, EReadControllerConfigurationInformationCommand = 0x0037, ESetExternalConfigurationCommand = 0x0038, ESetPublicAddressCommand = 0x0039, EStartServiceDiscoveryCommand = 0x003a, EReadLocalOutOfBandExtendedDataCommand = 0x003b, EReadExtendedControllerIndexListCommand = 0x003c, EReadAdvertisingFeaturesCommand = 0x003d, EAddAdvertisingCommand = 0x003e, ERemoveAdvertisingCommand = 0x003f, EGetAdvertisingSizeInformationCommand = 0x0040, EStartLimitedDiscoveryCommand = 0x0041, EReadExtendedControllerInformationCommand = 0x0042, ESetAppearanceCommand = 0x0043 }; // Construct the Mgmt device // // Set `controllerIndex` to the zero-based index of the device as recognized by the OS. If this parameter is omitted, the index // of the first device (0) will be used. Mgmt(uint16_t controllerIndex = kDefaultControllerIndex); // Set the adapter name and short name // // The inputs `name` and `shortName` may be truncated prior to setting them on the adapter. To ensure that `name` and // `shortName` conform to length specifications prior to calling this method, see the constants `kMaxAdvertisingNameLength` and // `kMaxAdvertisingShortNameLength`. In addition, the static methods `truncateName()` and `truncateShortName()` may be helpful. // // Returns true on success, otherwise false bool setName(std::string name, std::string shortName); // Set a setting state to 'newState' // // Many settings are set the same way, this is just a convenience routine to handle them all // // Returns true on success, otherwise false bool setState(uint16_t commandCode, uint16_t controllerId, uint8_t newState); // Set the powered state to `newState` (true = powered on, false = powered off) // // Returns true on success, otherwise false bool setPowered(bool newState); // Set the BR/EDR state to `newState` (true = enabled, false = disabled) // // Returns true on success, otherwise false bool setBredr(bool newState); // Set the Secure Connection state (0 = disabled, 1 = enabled, 2 = secure connections only mode) // // Returns true on success, otherwise false bool setSecureConnections(uint8_t newState); // Set the bondable state to `newState` (true = enabled, false = disabled) // // Returns true on success, otherwise false bool setBondable(bool newState); // Set the connectable state to `newState` (true = enabled, false = disabled) // // Returns true on success, otherwise false bool setConnectable(bool newState); // Set the LE state to `newState` (true = enabled, false = disabled) // // Returns true on success, otherwise false bool setLE(bool newState); // Set the advertising state to `newState` (0 = disabled, 1 = enabled (with consideration towards the connectable setting), // 2 = enabled in connectable mode). // // Returns true on success, otherwise false bool setAdvertising(uint8_t newState); // // Utilitarian // // Truncates the string `name` to the maximum allowed length for an adapter name. If `name` needs no truncation, a copy of // `name` is returned. static std::string truncateName(const std::string &name); // Truncates the string `name` to the maximum allowed length for an adapter short-name. If `name` needs no truncation, a copy // of `name` is returned. static std::string truncateShortName(const std::string &name); private: // // Data members // // The default controller index (the first device) uint16_t controllerIndex; // Default controller index static const uint16_t kDefaultControllerIndex = 0; }; }; // namespace ggk