bluetooth

package module
Version: v0.5.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 29, 2022 License: BSD-3-Clause Imports: 11 Imported by: 36

README

Go Bluetooth

Go Bluetooth

PkgGoDev CircleCI

Go Bluetooth is a cross-platform package for using Bluetooth Low Energy hardware from the Go programming language.

It works on typical operating systems such as Linux, macOS, and Windows.

It can also be used running "bare metal" on microcontrollers produced by Nordic Semiconductor by using TinyGo.

The Go Bluetooth package can be used to create both Bluetooth Low Energy Centrals as well as to create Bluetooth Low Energy Peripherals.

Bluetooth Low Energy Central

A typical Bluetooth Low Energy Central would be your laptop computer or mobile phone.

This example shows a central that scans for peripheral devices and then displays information about them as they are discovered:

package main

import (
	"tinygo.org/x/bluetooth"
)

var adapter = bluetooth.DefaultAdapter

func main() {
	// Enable BLE interface.
	must("enable BLE stack", adapter.Enable())

	// Start scanning.
	println("scanning...")
	err := adapter.Scan(func(adapter *bluetooth.Adapter, device bluetooth.ScanResult) {
		println("found device:", device.Address.String(), device.RSSI, device.LocalName())
	})
	must("start scan", err)
}

func must(action string, err error) {
	if err != nil {
		panic("failed to " + action + ": " + err.Error())
	}
}

Bluetooth Low Energy Peripheral

A typical Bluetooth Low Energy Peripheral would be a temperature sensor or heart rate sensor.

This example shows a peripheral that advertises itself as being available for connection:

package main

import (
	"time"

	"tinygo.org/x/bluetooth"
)

var adapter = bluetooth.DefaultAdapter

func main() {
  	// Enable BLE interface.
	must("enable BLE stack", adapter.Enable())

  	// Define the peripheral device info.
	adv := adapter.DefaultAdvertisement()
	must("config adv", adv.Configure(bluetooth.AdvertisementOptions{
		LocalName: "Go Bluetooth",
  	}))
  
  	// Start advertising
	must("start adv", adv.Start())

	println("advertising...")
	for {
		// Sleep forever.
		time.Sleep(time.Hour)
	}
}

func must(action string, err error) {
	if err != nil {
		panic("failed to " + action + ": " + err.Error())
	}
}

Current support

Linux macOS Windows Nordic Semi
API used BlueZ CoreBluetooth WinRT SoftDevice
Scanning ✔️ ✔️ ✔️ ✔️
Connect to peripheral ✔️ ✔️ ✔️
Write peripheral characteristics ✔️ ✔️ ✔️
Receive notifications ✔️ ✔️ ✔️
Advertisement ✔️ ✔️
Local services ✔️ ✔️
Local characteristics ✔️ ✔️
Send notifications ✔️ ✔️

Linux

Go Bluetooth support for Linux uses BlueZ via the D-Bus interface thanks to the https://github.com/muka/go-bluetooth package. This should work with most distros that support BlueZ such as Ubuntu, Debian, Fedora, and Arch Linux, among others.

Linux can be used both as a BLE Central or as a BLE Peripheral.

Installation

You need to have a fairly recent version of BlueZ, for example v5.48 is the latest released version for Ubuntu/Debian.

sudo apt update
sudo apt install bluez

Once you have done this, you can obtain the Go Bluetooth package using Git:

git clone https://github.com/tinygo-org/bluetooth.git
Compiling

After you have followed the installation, you should be able to compile/run the "scanner" test program:

cd bluetooth
go run ./examples/scanner

macOS

Go Bluetooth support for macOS uses the CoreBluetooth libraries thanks to the https://github.com/JuulLabs-OSS/cbgo package.

As a result, it should work with most versions of macOS, although it will require compiling using whatever specific version of XCode is required by your version of the operating system.

The macOS support only can only act as a BLE Central at this time, with some additional development work needed for full functionality.

Installation

In order to compile Go Bluetooth code targeting macOS, you must do so on macOS itself. In other words, we do not currently have cross compiler support. You must also have XCode tools installed:

xcode-select --install

Once you have done this, you can obtain the Go Bluetooth package using Git:

git clone https://github.com/tinygo-org/bluetooth.git
Compiling

After you have followed the installation, you should be able to compile/run the "scanner" test program:

cd bluetooth
go run ./examples/scanner

Windows

Go Bluetooth support for Windows uses the WinRT Bluetooth interfaces by way of the https://github.com/tinygo-org/bluetooth/winbt package that is part of this package.

The Windows support is still experimental, and needs additional development to be useful. At this time, it can only be used to perform scanning operations as a BLE Central.

For specifics please see https://github.com/tinygo-org/bluetooth/issues/13

Installation

Once you have done this, you can obtain the Go Bluetooth package using Git:

git clone https://github.com/tinygo-org/bluetooth.git
Compiling

After you have followed the installation, you should be able to compile/run the "scanner" test program:

cd bluetooth
go run .\examples\scanner

Nordic Semiconductor

Go Bluetooth has bare metal support for several chips from Nordic Semiconductor that include a built-in Bluetooth Low Energy radio.

This support requires compiling your programs using TinyGo.

You must also use firmware provided by Nordic Semiconductor known as the "SoftDevice". The SoftDevice is a binary blob that implements the BLE stack. There are other (open source) BLE stacks, but the SoftDevices are pretty solid and have all the qualifications you might need. Other BLE stacks might be added in the future.

The Nordic Semiconductor SoftDevice can be used both as a BLE Central or as a BLE Peripheral, depending on which chip is being used. See the "Supported Chips" section below.

Installation

You must install TinyGo to be able to compile bare metal code using Go Bluetooth. Follow the instructions for your operating system at https://tinygo.org/getting-started/

Once you have installed TinyGo, you can install the Go Bluetooth package by running:

git clone https://github.com/tinygo-org/bluetooth.git

Check your desired target board for any additional installation requirements.

Adafruit "Bluefruit" boards

The line of "Bluefruit" boards created by Adafruit already have the SoftDevice firmware pre-loaded. This means you can use TinyGo and the Go Bluetooth package without any additional steps required. Supported Adafruit boards include:

After you have installed TinyGo and the Go Bluetooth package, you should be able to compile/run code for your device.

For example, this command can be used to compile and flash an Adafruit Circuit Playground Bluefruit board with the example we provide that turns it into a BLE server to control the built-in NeoPixel LEDs:

tinygo flash -target circuitplay-bluefruit ./examples/circuitplay

There are other boards with TinyGo support that also use the same UF2 bootloader with pre-loaded SoftDevice. They include:

BBC micro:bit
Version 1

The BBC micro:bit uses an nRF51 chip with a CMSIS-DAP interface.

You will need to install OpenOCD (http://openocd.org/) to flash the board.

First, flash the SoftDevice firmware by copying the .hex file to the device. For example (on Linux):

cd bluetooth
cp ./s110_nrf51_8.0.0/s110_nrf51_8.0.0_softdevice.hex /media/yourusername/MICROBIT/

Once you have copied the SoftDevice firmware to the BBC micro:bit, you can then flash your TinyGo program:

tinygo flash -target=microbit-s110v8 ./examples/heartrate
Version 2

The BBC micro:bit v2 uses an nRF52833 chip with a CMSIS-DAP interface.

Support for the v2 will be available soon.

Supported Chips

The following Nordic Semiconductor chips are currently supported:

  • nRF51822 with the S110 SoftDevice (version 8). This SoftDevice does not support all features (e.g. scanning).
  • nRF52832 with the S132 SoftDevice (version 6).
  • nRF52840 with the S140 SoftDevice (version 6 and 7).
Flashing the SoftDevice on Other Boards

To use a board that uses one of the above supported chips from Nordic Semiconductor, other then those already listed, you will probably need to install the SoftDevice firmware on the board yourself in order to use it with TinyGo and the Go Bluetooth package.

Flashing the SoftDevice can sometimes be tricky. If you have nrfjprog installed, you can erase the flash and flash the new BLE firmware using the following commands. Replace the path to the hex file with the correct SoftDevice, for example s132_nrf52_6.1.1/s132_nrf52_6.1.1_softdevice.hex for S132 version 6.

nrfjprog -f nrf52 --eraseall
nrfjprog -f nrf52 --program path/to/softdevice.hex

After that, don't reset the board but instead flash a new program to it. For example, you can flash the Heart Rate Sensor example using tinygo (modify the -target flag as needed for your board):

tinygo flash -target=pca10040-s132v6 ./examples/heartrate

Flashing will normally reset the board.

API stability

The API is not stable! Because many features are not yet implemented and some platforms (e.g. Windows and macOS) are not yet fully supported, it's hard to say what a good API will be. Therefore, if you want stability you should pick a particular git commit and use that. Go modules can be useful for this purpose.

Some things that will probably change:

  • Add options to the Scan method, for example to filter on UUID.
  • Extra options to the Enable function, to request particular features (such as the number of peripheral connections supported).

This package will probably remain unstable until the following has been implemented:

  • Scan filters. For example, to filter on service UUID.
  • Bonding and private addresses.
  • Full support for all features at least two desktop operating systems.
  • Maybe some Bluetooth Classic support, such as A2DP.

Contributing

Your contributions are welcome!

Please take a look at our CONTRIBUTING.md document for details.

Frequently Asked Questions

Q. Where can I get an introduction to Bluetooth Low Energy, GAP, GATT, etc.?

A. Please see this excellent article from our friends at Adafruit: https://learn.adafruit.com/introduction-to-bluetooth-low-energy

Q. What is a client and server in BLE?

A. Please see https://devzone.nordicsemi.com/f/nordic-q-a/71/what-is-a-client-and-server-in-ble

Q. Can a device be both a GATT client and GATT server?

A. Yes, but this is not currently supported by Go Bluetooth. Current support is either to act as a central in client mode, or as a peripheral in server mode.

License

This project is licensed under the BSD 3-clause license, see the LICENSE file for details.

The SoftDevices from Nordic are licensed under a different license, check the license file in the SoftDevice source directory.

Documentation

Overview

Package bluetooth provides a cross-platform Bluetooth module for Go that can be used on operating systems such as Linux, macOS, and Windows.

It can also be used running "bare metal" on microcontrollers such as those produced by Nordic Semiconductor.

This package can be use to create Bluetooth Low Energy centrals as well as peripherals.

Code generated by bin/gen-characteristic-uuids; DO NOT EDIT. This file was generated on 2021-02-01 14:19:13.563222488 +0100 CET m=+0.007308013 using the list of standard characteristics UUIDs from https://github.com/NordicSemiconductor/bluetooth-numbers-database/blob/master/v1/characteristics_uuids.json

Code generated by bin/gen-service-uuids; DO NOT EDIT. This file was generated on 2021-02-01 14:19:12.31511038 +0100 CET m=+0.005731522 using the list of standard service UUIDs from https://github.com/NordicSemiconductor/bluetooth-numbers-database/blob/master/v1/service_uuids.json

Index

Constants

View Source
const Version = "0.5.0"

Version returns a user-readable string showing the version of the bluetooth package for support purposes. Update this value before release of new version of software.

Variables

View Source
var (

	// CharacteristicUUIDAerobicHeartRateLowerLimit - Aerobic Heart Rate Lower Limit
	CharacteristicUUIDAerobicHeartRateLowerLimit = New16BitUUID(0x2A7E)

	// CharacteristicUUIDAerobicHeartRateUpperLimit - Aerobic Heart Rate Upper Limit
	CharacteristicUUIDAerobicHeartRateUpperLimit = New16BitUUID(0x2A84)

	// CharacteristicUUIDAerobicThreshold - Aerobic Threshold
	CharacteristicUUIDAerobicThreshold = New16BitUUID(0x2A7F)

	// CharacteristicUUIDAge - Age
	CharacteristicUUIDAge = New16BitUUID(0x2A80)

	// CharacteristicUUIDAggregate - Aggregate
	CharacteristicUUIDAggregate = New16BitUUID(0x2A5A)

	// CharacteristicUUIDAlertCategoryID - Alert Category ID
	CharacteristicUUIDAlertCategoryID = New16BitUUID(0x2A43)

	// CharacteristicUUIDAlertCategoryIDBitMask - Alert Category ID Bit Mask
	CharacteristicUUIDAlertCategoryIDBitMask = New16BitUUID(0x2A42)

	// CharacteristicUUIDAlertLevel - Alert Level
	CharacteristicUUIDAlertLevel = New16BitUUID(0x2A06)

	// CharacteristicUUIDAlertNotificationControlPoint - Alert Notification Control Point
	CharacteristicUUIDAlertNotificationControlPoint = New16BitUUID(0x2A44)

	// CharacteristicUUIDAlertStatus - Alert Status
	CharacteristicUUIDAlertStatus = New16BitUUID(0x2A3F)

	// CharacteristicUUIDAltitude - Altitude
	CharacteristicUUIDAltitude = New16BitUUID(0x2AB3)

	// CharacteristicUUIDAnaerobicHeartRateLowerLimit - Anaerobic Heart Rate Lower Limit
	CharacteristicUUIDAnaerobicHeartRateLowerLimit = New16BitUUID(0x2A81)

	// CharacteristicUUIDAnaerobicHeartRateUpperLimit - Anaerobic Heart Rate Upper Limit
	CharacteristicUUIDAnaerobicHeartRateUpperLimit = New16BitUUID(0x2A82)

	// CharacteristicUUIDAnaerobicThreshold - Anaerobic Threshold
	CharacteristicUUIDAnaerobicThreshold = New16BitUUID(0x2A83)

	// CharacteristicUUIDAnalog - Analog
	CharacteristicUUIDAnalog = New16BitUUID(0x2A58)

	// CharacteristicUUIDAnalogOutput - Analog Output
	CharacteristicUUIDAnalogOutput = New16BitUUID(0x2A59)

	// CharacteristicUUIDApparentWindDirection - Apparent Wind Direction
	CharacteristicUUIDApparentWindDirection = New16BitUUID(0x2A73)

	// CharacteristicUUIDApparentWindSpeed - Apparent Wind Speed
	CharacteristicUUIDApparentWindSpeed = New16BitUUID(0x2A72)

	// CharacteristicUUIDAppearance - Appearance
	CharacteristicUUIDAppearance = New16BitUUID(0x2A01)

	// CharacteristicUUIDBarometricPressureTrend - Barometric Pressure Trend
	CharacteristicUUIDBarometricPressureTrend = New16BitUUID(0x2AA3)

	// CharacteristicUUIDBatteryLevel - Battery Level
	CharacteristicUUIDBatteryLevel = New16BitUUID(0x2A19)

	// CharacteristicUUIDBatteryLevelState - Battery Level State
	CharacteristicUUIDBatteryLevelState = New16BitUUID(0x2A1B)

	// CharacteristicUUIDBatteryPowerState - Battery Power State
	CharacteristicUUIDBatteryPowerState = New16BitUUID(0x2A1A)

	// CharacteristicUUIDBloodPressureFeature - Blood Pressure Feature
	CharacteristicUUIDBloodPressureFeature = New16BitUUID(0x2A49)

	// CharacteristicUUIDBloodPressureMeasurement - Blood Pressure Measurement
	CharacteristicUUIDBloodPressureMeasurement = New16BitUUID(0x2A35)

	// CharacteristicUUIDBodyCompositionFeature - Body Composition Feature
	CharacteristicUUIDBodyCompositionFeature = New16BitUUID(0x2A9B)

	// CharacteristicUUIDBodyCompositionMeasurement - Body Composition Measurement
	CharacteristicUUIDBodyCompositionMeasurement = New16BitUUID(0x2A9C)

	// CharacteristicUUIDBodySensorLocation - Body Sensor Location
	CharacteristicUUIDBodySensorLocation = New16BitUUID(0x2A38)

	// CharacteristicUUIDBondManagementControlPoint - Bond Management Control Point
	CharacteristicUUIDBondManagementControlPoint = New16BitUUID(0x2AA4)

	// CharacteristicUUIDBondManagementFeatures - Bond Management Features
	CharacteristicUUIDBondManagementFeatures = New16BitUUID(0x2AA5)

	// CharacteristicUUIDBootKeyboardInputReport - Boot Keyboard Input Report
	CharacteristicUUIDBootKeyboardInputReport = New16BitUUID(0x2A22)

	// CharacteristicUUIDBootKeyboardOutputReport - Boot Keyboard Output Report
	CharacteristicUUIDBootKeyboardOutputReport = New16BitUUID(0x2A32)

	// CharacteristicUUIDBootMouseInputReport - Boot Mouse Input Report
	CharacteristicUUIDBootMouseInputReport = New16BitUUID(0x2A33)

	// CharacteristicUUIDCentralAddressResolution - Central Address Resolution
	CharacteristicUUIDCentralAddressResolution = New16BitUUID(0x2AA6)

	// CharacteristicUUIDCGMFeature - CGM Feature
	CharacteristicUUIDCGMFeature = New16BitUUID(0x2AA8)

	// CharacteristicUUIDCGMMeasurement - CGM Measurement
	CharacteristicUUIDCGMMeasurement = New16BitUUID(0x2AA7)

	// CharacteristicUUIDCGMSessionRunTime - CGM Session Run Time
	CharacteristicUUIDCGMSessionRunTime = New16BitUUID(0x2AAB)

	// CharacteristicUUIDCGMSessionStartTime - CGM Session Start Time
	CharacteristicUUIDCGMSessionStartTime = New16BitUUID(0x2AAA)

	// CharacteristicUUIDCGMSpecificOpsControlPoint - CGM Specific Ops Control Point
	CharacteristicUUIDCGMSpecificOpsControlPoint = New16BitUUID(0x2AAC)

	// CharacteristicUUIDCGMStatus - CGM Status
	CharacteristicUUIDCGMStatus = New16BitUUID(0x2AA9)

	// CharacteristicUUIDCrossTrainerData - Cross Trainer Data
	CharacteristicUUIDCrossTrainerData = New16BitUUID(0x2ACE)

	// CharacteristicUUIDCSCFeature - CSC Feature
	CharacteristicUUIDCSCFeature = New16BitUUID(0x2A5C)

	// CharacteristicUUIDCSCMeasurement - CSC Measurement
	CharacteristicUUIDCSCMeasurement = New16BitUUID(0x2A5B)

	// CharacteristicUUIDCurrentTime - Current Time
	CharacteristicUUIDCurrentTime = New16BitUUID(0x2A2B)

	// CharacteristicUUIDCyclingPowerControlPoint - Cycling Power Control Point
	CharacteristicUUIDCyclingPowerControlPoint = New16BitUUID(0x2A66)

	// CharacteristicUUIDCyclingPowerFeature - Cycling Power Feature
	CharacteristicUUIDCyclingPowerFeature = New16BitUUID(0x2A65)

	// CharacteristicUUIDCyclingPowerMeasurement - Cycling Power Measurement
	CharacteristicUUIDCyclingPowerMeasurement = New16BitUUID(0x2A63)

	// CharacteristicUUIDCyclingPowerVector - Cycling Power Vector
	CharacteristicUUIDCyclingPowerVector = New16BitUUID(0x2A64)

	// CharacteristicUUIDDatabaseChangeIncrement - Database Change Increment
	CharacteristicUUIDDatabaseChangeIncrement = New16BitUUID(0x2A99)

	// CharacteristicUUIDDateOfBirth - Date of Birth
	CharacteristicUUIDDateOfBirth = New16BitUUID(0x2A85)

	// CharacteristicUUIDDateOfThresholdAssessment - Date of Threshold Assessment
	CharacteristicUUIDDateOfThresholdAssessment = New16BitUUID(0x2A86)

	// CharacteristicUUIDDateTime - Date Time
	CharacteristicUUIDDateTime = New16BitUUID(0x2A08)

	// CharacteristicUUIDDateUTC - Date UTC
	CharacteristicUUIDDateUTC = New16BitUUID(0x2AED)

	// CharacteristicUUIDDayDateTime - Day Date Time
	CharacteristicUUIDDayDateTime = New16BitUUID(0x2A0A)

	// CharacteristicUUIDDayOfWeek - Day of Week
	CharacteristicUUIDDayOfWeek = New16BitUUID(0x2A09)

	// CharacteristicUUIDDescriptorValueChanged - Descriptor Value Changed
	CharacteristicUUIDDescriptorValueChanged = New16BitUUID(0x2A7D)

	// CharacteristicUUIDDeviceName - Device Name
	CharacteristicUUIDDeviceName = New16BitUUID(0x2A00)

	// CharacteristicUUIDDewPoint - Dew Point
	CharacteristicUUIDDewPoint = New16BitUUID(0x2A7B)

	// CharacteristicUUIDDigital - Digital
	CharacteristicUUIDDigital = New16BitUUID(0x2A56)

	// CharacteristicUUIDDigitalOutput - Digital Output
	CharacteristicUUIDDigitalOutput = New16BitUUID(0x2A57)

	// CharacteristicUUIDDSTOffset - DST Offset
	CharacteristicUUIDDSTOffset = New16BitUUID(0x2A0D)

	// CharacteristicUUIDElevation - Elevation
	CharacteristicUUIDElevation = New16BitUUID(0x2A6C)

	// CharacteristicUUIDEmailAddress - Email Address
	CharacteristicUUIDEmailAddress = New16BitUUID(0x2A87)

	// CharacteristicUUIDExactTime100 - Exact Time 100
	CharacteristicUUIDExactTime100 = New16BitUUID(0x2A0B)

	// CharacteristicUUIDExactTime256 - Exact Time 256
	CharacteristicUUIDExactTime256 = New16BitUUID(0x2A0C)

	// CharacteristicUUIDFatBurnHeartRateLowerLimit - Fat Burn Heart Rate Lower Limit
	CharacteristicUUIDFatBurnHeartRateLowerLimit = New16BitUUID(0x2A88)

	// CharacteristicUUIDFatBurnHeartRateUpperLimit - Fat Burn Heart Rate Upper Limit
	CharacteristicUUIDFatBurnHeartRateUpperLimit = New16BitUUID(0x2A89)

	// CharacteristicUUIDFirmwareRevisionString - Firmware Revision String
	CharacteristicUUIDFirmwareRevisionString = New16BitUUID(0x2A26)

	// CharacteristicUUIDFirstName - First Name
	CharacteristicUUIDFirstName = New16BitUUID(0x2A8A)

	// CharacteristicUUIDFitnessMachineControlPoint - Fitness Machine Control Point
	CharacteristicUUIDFitnessMachineControlPoint = New16BitUUID(0x2AD9)

	// CharacteristicUUIDFitnessMachineFeature - Fitness Machine Feature
	CharacteristicUUIDFitnessMachineFeature = New16BitUUID(0x2ACC)

	// CharacteristicUUIDFitnessMachineStatus - Fitness Machine Status
	CharacteristicUUIDFitnessMachineStatus = New16BitUUID(0x2ADA)

	// CharacteristicUUIDFiveZoneHeartRateLimits - Five Zone Heart Rate Limits
	CharacteristicUUIDFiveZoneHeartRateLimits = New16BitUUID(0x2A8B)

	// CharacteristicUUIDFloorNumber - Floor Number
	CharacteristicUUIDFloorNumber = New16BitUUID(0x2AB2)

	// CharacteristicUUIDGender - Gender
	CharacteristicUUIDGender = New16BitUUID(0x2A8C)

	// CharacteristicUUIDGlucoseFeature - Glucose Feature
	CharacteristicUUIDGlucoseFeature = New16BitUUID(0x2A51)

	// CharacteristicUUIDGlucoseMeasurement - Glucose Measurement
	CharacteristicUUIDGlucoseMeasurement = New16BitUUID(0x2A18)

	// CharacteristicUUIDGlucoseMeasurementContext - Glucose Measurement Context
	CharacteristicUUIDGlucoseMeasurementContext = New16BitUUID(0x2A34)

	// CharacteristicUUIDGustFactor - Gust Factor
	CharacteristicUUIDGustFactor = New16BitUUID(0x2A74)

	// CharacteristicUUIDHardwareRevisionString - Hardware Revision String
	CharacteristicUUIDHardwareRevisionString = New16BitUUID(0x2A27)

	// CharacteristicUUIDHeartRateControlPoint - Heart Rate Control Point
	CharacteristicUUIDHeartRateControlPoint = New16BitUUID(0x2A39)

	// CharacteristicUUIDHeartRateMax - Heart Rate Max
	CharacteristicUUIDHeartRateMax = New16BitUUID(0x2A8D)

	// CharacteristicUUIDHeartRateMeasurement - Heart Rate Measurement
	CharacteristicUUIDHeartRateMeasurement = New16BitUUID(0x2A37)

	// CharacteristicUUIDHeatIndex - Heat Index
	CharacteristicUUIDHeatIndex = New16BitUUID(0x2A7A)

	// CharacteristicUUIDHeight - Height
	CharacteristicUUIDHeight = New16BitUUID(0x2A8E)

	// CharacteristicUUIDHIDControlPoint - HID Control Point
	CharacteristicUUIDHIDControlPoint = New16BitUUID(0x2A4C)

	// CharacteristicUUIDHIDInformation - HID Information
	CharacteristicUUIDHIDInformation = New16BitUUID(0x2A4A)

	// CharacteristicUUIDHipCircumference - Hip Circumference
	CharacteristicUUIDHipCircumference = New16BitUUID(0x2A8F)

	// CharacteristicUUIDHTTPControlPoint - HTTP Control Point
	CharacteristicUUIDHTTPControlPoint = New16BitUUID(0x2ABA)

	// CharacteristicUUIDHTTPEntityBody - HTTP Entity Body
	CharacteristicUUIDHTTPEntityBody = New16BitUUID(0x2AB9)

	// CharacteristicUUIDHTTPHeaders - HTTP Headers
	CharacteristicUUIDHTTPHeaders = New16BitUUID(0x2AB7)

	// CharacteristicUUIDHTTPStatusCode - HTTP Status Code
	CharacteristicUUIDHTTPStatusCode = New16BitUUID(0x2AB8)

	// CharacteristicUUIDHTTPSSecurity - HTTPS Security
	CharacteristicUUIDHTTPSSecurity = New16BitUUID(0x2ABB)

	// CharacteristicUUIDHumidity - Humidity
	CharacteristicUUIDHumidity = New16BitUUID(0x2A6F)

	// CharacteristicUUIDIDDAnnunciationStatus - IDD Annunciation Status
	CharacteristicUUIDIDDAnnunciationStatus = New16BitUUID(0x2B22)

	// CharacteristicUUIDIDDCommandControlPoint - IDD Command Control Point
	CharacteristicUUIDIDDCommandControlPoint = New16BitUUID(0x2B25)

	// CharacteristicUUIDIDDCommandData - IDD Command Data
	CharacteristicUUIDIDDCommandData = New16BitUUID(0x2B26)

	// CharacteristicUUIDIDDFeatures - IDD Features
	CharacteristicUUIDIDDFeatures = New16BitUUID(0x2B23)

	// CharacteristicUUIDIDDHistoryData - IDD History Data
	CharacteristicUUIDIDDHistoryData = New16BitUUID(0x2B28)

	// CharacteristicUUIDIDDRecordAccessControlPoint - IDD Record Access Control Point
	CharacteristicUUIDIDDRecordAccessControlPoint = New16BitUUID(0x2B27)

	// CharacteristicUUIDIDDStatus - IDD Status
	CharacteristicUUIDIDDStatus = New16BitUUID(0x2B21)

	// CharacteristicUUIDIDDStatusChanged - IDD Status Changed
	CharacteristicUUIDIDDStatusChanged = New16BitUUID(0x2B20)

	// CharacteristicUUIDIDDStatusReaderControlPoint - IDD Status Reader Control Point
	CharacteristicUUIDIDDStatusReaderControlPoint = New16BitUUID(0x2B24)

	// CharacteristicUUIDIEEE1107320601RegulatoryCertificationDataList - IEEE 11073-20601 Regulatory Certification Data List
	CharacteristicUUIDIEEE1107320601RegulatoryCertificationDataList = New16BitUUID(0x2A2A)

	// CharacteristicUUIDIndoorBikeData - Indoor Bike Data
	CharacteristicUUIDIndoorBikeData = New16BitUUID(0x2AD2)

	// CharacteristicUUIDIndoorPositioningConfiguration - Indoor Positioning Configuration
	CharacteristicUUIDIndoorPositioningConfiguration = New16BitUUID(0x2AAD)

	// CharacteristicUUIDIntermediateCuffPressure - Intermediate Cuff Pressure
	CharacteristicUUIDIntermediateCuffPressure = New16BitUUID(0x2A36)

	// CharacteristicUUIDIntermediateTemperature - Intermediate Temperature
	CharacteristicUUIDIntermediateTemperature = New16BitUUID(0x2A1E)

	// CharacteristicUUIDIrradiance - Irradiance
	CharacteristicUUIDIrradiance = New16BitUUID(0x2A77)

	// CharacteristicUUIDLanguage - Language
	CharacteristicUUIDLanguage = New16BitUUID(0x2AA2)

	// CharacteristicUUIDLastName - Last Name
	CharacteristicUUIDLastName = New16BitUUID(0x2A90)

	// CharacteristicUUIDLatitude - Latitude
	CharacteristicUUIDLatitude = New16BitUUID(0x2AAE)

	// CharacteristicUUIDLNControlPoint - LN Control Point
	CharacteristicUUIDLNControlPoint = New16BitUUID(0x2A6B)

	// CharacteristicUUIDLNFeature - LN Feature
	CharacteristicUUIDLNFeature = New16BitUUID(0x2A6A)

	// CharacteristicUUIDLocalEastCoordinate - Local East Coordinate
	CharacteristicUUIDLocalEastCoordinate = New16BitUUID(0x2AB1)

	// CharacteristicUUIDLocalNorthCoordinate - Local North Coordinate
	CharacteristicUUIDLocalNorthCoordinate = New16BitUUID(0x2AB0)

	// CharacteristicUUIDLocalTimeInformation - Local Time Information
	CharacteristicUUIDLocalTimeInformation = New16BitUUID(0x2A0F)

	// CharacteristicUUIDLocationAndSpeed - Location and Speed Characteristic
	CharacteristicUUIDLocationAndSpeed = New16BitUUID(0x2A67)

	// CharacteristicUUIDLocationName - Location Name
	CharacteristicUUIDLocationName = New16BitUUID(0x2AB5)

	// CharacteristicUUIDLongitude - Longitude
	CharacteristicUUIDLongitude = New16BitUUID(0x2AAF)

	// CharacteristicUUIDMagneticDeclination - Magnetic Declination
	CharacteristicUUIDMagneticDeclination = New16BitUUID(0x2A2C)

	// CharacteristicUUIDMagneticFluxDensity2D - Magnetic Flux Density - 2D
	CharacteristicUUIDMagneticFluxDensity2D = New16BitUUID(0x2AA0)

	// CharacteristicUUIDMagneticFluxDensity3D - Magnetic Flux Density - 3D
	CharacteristicUUIDMagneticFluxDensity3D = New16BitUUID(0x2AA1)

	// CharacteristicUUIDManufacturerNameString - Manufacturer Name String
	CharacteristicUUIDManufacturerNameString = New16BitUUID(0x2A29)

	// CharacteristicUUIDMaximumRecommendedHeartRate - Maximum Recommended Heart Rate
	CharacteristicUUIDMaximumRecommendedHeartRate = New16BitUUID(0x2A91)

	// CharacteristicUUIDMeasurementInterval - Measurement Interval
	CharacteristicUUIDMeasurementInterval = New16BitUUID(0x2A21)

	// CharacteristicUUIDModelNumberString - Model Number String
	CharacteristicUUIDModelNumberString = New16BitUUID(0x2A24)

	// CharacteristicUUIDNavigation - Navigation
	CharacteristicUUIDNavigation = New16BitUUID(0x2A68)

	// CharacteristicUUIDNetworkAvailability - Network Availability
	CharacteristicUUIDNetworkAvailability = New16BitUUID(0x2A3E)

	// CharacteristicUUIDNewAler - New Aler
	CharacteristicUUIDNewAler = New16BitUUID(0x2A46)

	// CharacteristicUUIDObjectActionControlPoint - Object Action Control Point
	CharacteristicUUIDObjectActionControlPoint = New16BitUUID(0x2AC5)

	// CharacteristicUUIDObjectChanged - Object Changed
	CharacteristicUUIDObjectChanged = New16BitUUID(0x2AC8)

	// CharacteristicUUIDObjectFirstCreated - Object First-Created
	CharacteristicUUIDObjectFirstCreated = New16BitUUID(0x2AC1)

	// CharacteristicUUIDObjectID - Object ID
	CharacteristicUUIDObjectID = New16BitUUID(0x2AC3)

	// CharacteristicUUIDObjectLastModified - Object Last-Modified
	CharacteristicUUIDObjectLastModified = New16BitUUID(0x2AC2)

	// CharacteristicUUIDObjectListControlPoint - Object List Control Point
	CharacteristicUUIDObjectListControlPoint = New16BitUUID(0x2AC6)

	// CharacteristicUUIDObjectListFilter - Object List Filter
	CharacteristicUUIDObjectListFilter = New16BitUUID(0x2AC7)

	// CharacteristicUUIDObjectName - Object Name
	CharacteristicUUIDObjectName = New16BitUUID(0x2ABE)

	// CharacteristicUUIDObjectProperties - Object Properties
	CharacteristicUUIDObjectProperties = New16BitUUID(0x2AC4)

	// CharacteristicUUIDObjectSize - Object Size
	CharacteristicUUIDObjectSize = New16BitUUID(0x2AC0)

	// CharacteristicUUIDObjectType - Object Type
	CharacteristicUUIDObjectType = New16BitUUID(0x2ABF)

	// CharacteristicUUIDOTSFeature - OTS Feature
	CharacteristicUUIDOTSFeature = New16BitUUID(0x2ABD)

	// CharacteristicUUIDPeripheralPreferredConnectionParameters - Peripheral Preferred Connection Parameters
	CharacteristicUUIDPeripheralPreferredConnectionParameters = New16BitUUID(0x2A04)

	// CharacteristicUUIDPeripheralPrivacyFlag - Peripheral Privacy Flag
	CharacteristicUUIDPeripheralPrivacyFlag = New16BitUUID(0x2A02)

	// CharacteristicUUIDPLXContinuousMeasurement - PLX Continuous Measurement Characteristic
	CharacteristicUUIDPLXContinuousMeasurement = New16BitUUID(0x2A5F)

	// CharacteristicUUIDPLXFeatures - PLX Features
	CharacteristicUUIDPLXFeatures = New16BitUUID(0x2A60)

	// CharacteristicUUIDPLXSpotCheckMeasurement - PLX Spot-Check Measurement
	CharacteristicUUIDPLXSpotCheckMeasurement = New16BitUUID(0x2A5E)

	// CharacteristicUUIDPnPID - PnP ID
	CharacteristicUUIDPnPID = New16BitUUID(0x2A50)

	// CharacteristicUUIDPollenConcentration - Pollen Concentration
	CharacteristicUUIDPollenConcentration = New16BitUUID(0x2A75)

	// CharacteristicUUIDPosition2D - Position 2D
	CharacteristicUUIDPosition2D = New16BitUUID(0x2A2F)

	// CharacteristicUUIDPosition3D - Position 3D
	CharacteristicUUIDPosition3D = New16BitUUID(0x2A30)

	// CharacteristicUUIDPositionQuality - Position Quality
	CharacteristicUUIDPositionQuality = New16BitUUID(0x2A69)

	// CharacteristicUUIDPressure - Pressure
	CharacteristicUUIDPressure = New16BitUUID(0x2A6D)

	// CharacteristicUUIDProtocolMode - Protocol Mode
	CharacteristicUUIDProtocolMode = New16BitUUID(0x2A4E)

	// CharacteristicUUIDPulseOximetryControlPoint - Pulse Oximetry Control Point
	CharacteristicUUIDPulseOximetryControlPoint = New16BitUUID(0x2A62)

	// CharacteristicUUIDRainfall - Rainfall
	CharacteristicUUIDRainfall = New16BitUUID(0x2A78)

	// CharacteristicUUIDRCFeature - RC Feature
	CharacteristicUUIDRCFeature = New16BitUUID(0x2B1D)

	// CharacteristicUUIDRCSettings - RC Settings
	CharacteristicUUIDRCSettings = New16BitUUID(0x2B1E)

	// CharacteristicUUIDReconnectionAddress - Reconnection Address
	CharacteristicUUIDReconnectionAddress = New16BitUUID(0x2A03)

	// CharacteristicUUIDReconnectionConfigurationControlPoint - Reconnection Configuration Control Point
	CharacteristicUUIDReconnectionConfigurationControlPoint = New16BitUUID(0x2B1F)

	// CharacteristicUUIDRecordAccessControlPoint - Record Access Control Point
	CharacteristicUUIDRecordAccessControlPoint = New16BitUUID(0x2A52)

	// CharacteristicUUIDReferenceTimeInformation - Reference Time Information
	CharacteristicUUIDReferenceTimeInformation = New16BitUUID(0x2A14)

	// CharacteristicUUIDRemovable - Removable
	CharacteristicUUIDRemovable = New16BitUUID(0x2A3A)

	// CharacteristicUUIDReport - Report
	CharacteristicUUIDReport = New16BitUUID(0x2A4D)

	// CharacteristicUUIDReportMap - Report Map
	CharacteristicUUIDReportMap = New16BitUUID(0x2A4B)

	// CharacteristicUUIDResolvablePrivateAddressOnly - Resolvable Private Address Only
	CharacteristicUUIDResolvablePrivateAddressOnly = New16BitUUID(0x2AC9)

	// CharacteristicUUIDRestingHeartRate - Resting Heart Rate
	CharacteristicUUIDRestingHeartRate = New16BitUUID(0x2A92)

	// CharacteristicUUIDRingerControlPoint - Ringer Control point
	CharacteristicUUIDRingerControlPoint = New16BitUUID(0x2A40)

	// CharacteristicUUIDRingerSetting - Ringer Setting
	CharacteristicUUIDRingerSetting = New16BitUUID(0x2A41)

	// CharacteristicUUIDRowerData - Rower Data
	CharacteristicUUIDRowerData = New16BitUUID(0x2AD1)

	// CharacteristicUUIDRSCFeature - RSC Feature
	CharacteristicUUIDRSCFeature = New16BitUUID(0x2A54)

	// CharacteristicUUIDRSCMeasurement - RSC Measurement
	CharacteristicUUIDRSCMeasurement = New16BitUUID(0x2A53)

	// CharacteristicUUIDSCControlPoint - SC Control Point
	CharacteristicUUIDSCControlPoint = New16BitUUID(0x2A55)

	// CharacteristicUUIDScanIntervalWindow - Scan Interval Window
	CharacteristicUUIDScanIntervalWindow = New16BitUUID(0x2A4F)

	// CharacteristicUUIDScanRefresh - Scan Refresh
	CharacteristicUUIDScanRefresh = New16BitUUID(0x2A31)

	// CharacteristicUUIDScientificTemperatureCelsius - Scientific Temperature Celsius
	CharacteristicUUIDScientificTemperatureCelsius = New16BitUUID(0x2A3C)

	// CharacteristicUUIDSecondaryTimeZone - Secondary Time Zone
	CharacteristicUUIDSecondaryTimeZone = New16BitUUID(0x2A10)

	// CharacteristicUUIDSensorLocation - Sensor Location
	CharacteristicUUIDSensorLocation = New16BitUUID(0x2A5D)

	// CharacteristicUUIDSerialNumberString - Serial Number String
	CharacteristicUUIDSerialNumberString = New16BitUUID(0x2A25)

	// CharacteristicUUIDServiceChanged - Service Changed
	CharacteristicUUIDServiceChanged = New16BitUUID(0x2A05)

	// CharacteristicUUIDServiceRequired - Service Required
	CharacteristicUUIDServiceRequired = New16BitUUID(0x2A3B)

	// CharacteristicUUIDSoftwareRevisionString - Software Revision String
	CharacteristicUUIDSoftwareRevisionString = New16BitUUID(0x2A28)

	// CharacteristicUUIDSportTypeForAerobicAndAnaerobicThresholds - Sport Type for Aerobic and Anaerobic Thresholds
	CharacteristicUUIDSportTypeForAerobicAndAnaerobicThresholds = New16BitUUID(0x2A93)

	// CharacteristicUUIDStairClimberData - Stair Climber Data
	CharacteristicUUIDStairClimberData = New16BitUUID(0x2AD0)

	// CharacteristicUUIDStepClimberData - Step Climber Data
	CharacteristicUUIDStepClimberData = New16BitUUID(0x2ACF)

	// CharacteristicUUIDString - String
	CharacteristicUUIDString = New16BitUUID(0x2A3D)

	// CharacteristicUUIDSupportedHeartRateRange - Supported Heart Rate Range
	CharacteristicUUIDSupportedHeartRateRange = New16BitUUID(0x2AD7)

	// CharacteristicUUIDSupportedInclinationRange - Supported Inclination Range
	CharacteristicUUIDSupportedInclinationRange = New16BitUUID(0x2AD5)

	// CharacteristicUUIDSupportedNewAlertCategory - Supported New Alert Category
	CharacteristicUUIDSupportedNewAlertCategory = New16BitUUID(0x2A47)

	// CharacteristicUUIDSupportedPowerRange - Supported Power Range
	CharacteristicUUIDSupportedPowerRange = New16BitUUID(0x2AD8)

	// CharacteristicUUIDSupportedResistanceLevelRange - Supported Resistance Level Range
	CharacteristicUUIDSupportedResistanceLevelRange = New16BitUUID(0x2AD6)

	// CharacteristicUUIDSupportedSpeedRange - Supported Speed Range
	CharacteristicUUIDSupportedSpeedRange = New16BitUUID(0x2AD4)

	// CharacteristicUUIDSupportedUnreadAlertCategory - Supported Unread Alert Category
	CharacteristicUUIDSupportedUnreadAlertCategory = New16BitUUID(0x2A48)

	// CharacteristicUUIDSystemID - System ID
	CharacteristicUUIDSystemID = New16BitUUID(0x2A23)

	// CharacteristicUUIDTDSControlPoint - TDS Control Point
	CharacteristicUUIDTDSControlPoint = New16BitUUID(0x2ABC)

	// CharacteristicUUIDTemperature - Temperature
	CharacteristicUUIDTemperature = New16BitUUID(0x2A6E)

	// CharacteristicUUIDTemperatureCelsius - Temperature Celsius
	CharacteristicUUIDTemperatureCelsius = New16BitUUID(0x2A1F)

	// CharacteristicUUIDTemperatureFahrenheit - Temperature Fahrenheit
	CharacteristicUUIDTemperatureFahrenheit = New16BitUUID(0x2A20)

	// CharacteristicUUIDTemperatureMeasurement - Temperature Measurement
	CharacteristicUUIDTemperatureMeasurement = New16BitUUID(0x2A1C)

	// CharacteristicUUIDTemperatureType - Temperature Type
	CharacteristicUUIDTemperatureType = New16BitUUID(0x2A1D)

	// CharacteristicUUIDThreeZoneHeartRateLimits - Three Zone Heart Rate Limits
	CharacteristicUUIDThreeZoneHeartRateLimits = New16BitUUID(0x2A94)

	// CharacteristicUUIDTimeAccuracy - Time Accuracy
	CharacteristicUUIDTimeAccuracy = New16BitUUID(0x2A12)

	// CharacteristicUUIDTimeBroadcast - Time Broadcast
	CharacteristicUUIDTimeBroadcast = New16BitUUID(0x2A15)

	// CharacteristicUUIDTimeSource - Time Source
	CharacteristicUUIDTimeSource = New16BitUUID(0x2A13)

	// CharacteristicUUIDTimeUpdateControlPoint - Time Update Control Point
	CharacteristicUUIDTimeUpdateControlPoint = New16BitUUID(0x2A16)

	// CharacteristicUUIDTimeUpdateState - Time Update State
	CharacteristicUUIDTimeUpdateState = New16BitUUID(0x2A17)

	// CharacteristicUUIDTimeWithDST - Time with DST
	CharacteristicUUIDTimeWithDST = New16BitUUID(0x2A11)

	// CharacteristicUUIDTimeZone - Time Zone
	CharacteristicUUIDTimeZone = New16BitUUID(0x2A0E)

	// CharacteristicUUIDTrainingStatus - Training Status
	CharacteristicUUIDTrainingStatus = New16BitUUID(0x2AD3)

	// CharacteristicUUIDTreadmillData - Treadmill Data
	CharacteristicUUIDTreadmillData = New16BitUUID(0x2ACD)

	// CharacteristicUUIDTrueWindDirection - True Wind Direction
	CharacteristicUUIDTrueWindDirection = New16BitUUID(0x2A71)

	// CharacteristicUUIDTrueWindSpeed - True Wind Speed
	CharacteristicUUIDTrueWindSpeed = New16BitUUID(0x2A70)

	// CharacteristicUUIDTwoZoneHeartRateLimit - Two Zone Heart Rate Limit
	CharacteristicUUIDTwoZoneHeartRateLimit = New16BitUUID(0x2A95)

	// CharacteristicUUIDTxPowerLevel - Tx Power Level
	CharacteristicUUIDTxPowerLevel = New16BitUUID(0x2A07)

	// CharacteristicUUIDUncertainty - Uncertainty
	CharacteristicUUIDUncertainty = New16BitUUID(0x2AB4)

	// CharacteristicUUIDUnreadAlertStatus - Unread Alert Status
	CharacteristicUUIDUnreadAlertStatus = New16BitUUID(0x2A45)

	// CharacteristicUUIDURI - URI
	CharacteristicUUIDURI = New16BitUUID(0x2AB6)

	// CharacteristicUUIDUserControlPoint - User Control Point
	CharacteristicUUIDUserControlPoint = New16BitUUID(0x2A9F)

	// CharacteristicUUIDUserIndex - User Index
	CharacteristicUUIDUserIndex = New16BitUUID(0x2A9A)

	// CharacteristicUUIDUVIndex - UV Index
	CharacteristicUUIDUVIndex = New16BitUUID(0x2A76)

	// CharacteristicUUIDVO2Max - VO2 Max
	CharacteristicUUIDVO2Max = New16BitUUID(0x2A96)

	// CharacteristicUUIDWaistCircumference - Waist Circumference
	CharacteristicUUIDWaistCircumference = New16BitUUID(0x2A97)

	// CharacteristicUUIDWeight - Weight
	CharacteristicUUIDWeight = New16BitUUID(0x2A98)

	// CharacteristicUUIDWeightMeasurement - Weight Measurement
	CharacteristicUUIDWeightMeasurement = New16BitUUID(0x2A9D)

	// CharacteristicUUIDWeightScaleFeature - Weight Scale Feature
	CharacteristicUUIDWeightScaleFeature = New16BitUUID(0x2A9E)

	// CharacteristicUUIDWindChill - Wind Chill
	CharacteristicUUIDWindChill = New16BitUUID(0x2A79)

	// CharacteristicUUIDBlinkyButtonState - Blinky Button State
	CharacteristicUUIDBlinkyButtonState = NewUUID([16]byte{0x00, 0x00, 0x15, 0x24, 0x12, 0x12, 0xef, 0xde, 0x15, 0x23, 0x78, 0x5f, 0xea, 0xbc, 0xd1, 0x23})

	// CharacteristicUUIDBlinkyLEDState - Blinky LED State
	CharacteristicUUIDBlinkyLEDState = NewUUID([16]byte{0x00, 0x00, 0x15, 0x25, 0x12, 0x12, 0xef, 0xde, 0x15, 0x23, 0x78, 0x5f, 0xea, 0xbc, 0xd1, 0x23})

	// CharacteristicUUIDLegacyDFUControlPoint - Legacy DFU Control Point
	CharacteristicUUIDLegacyDFUControlPoint = NewUUID([16]byte{0x00, 0x00, 0x15, 0x31, 0x12, 0x12, 0xef, 0xde, 0x15, 0x23, 0x78, 0x5f, 0xea, 0xbc, 0xd1, 0x23})

	// CharacteristicUUIDLegacyDFUPacket - Legacy DFU Packet
	CharacteristicUUIDLegacyDFUPacket = NewUUID([16]byte{0x00, 0x00, 0x15, 0x32, 0x12, 0x12, 0xef, 0xde, 0x15, 0x23, 0x78, 0x5f, 0xea, 0xbc, 0xd1, 0x23})

	// CharacteristicUUIDLegacyDFUVersion - Legacy DFU Version
	CharacteristicUUIDLegacyDFUVersion = NewUUID([16]byte{0x00, 0x00, 0x15, 0x34, 0x12, 0x12, 0xef, 0xde, 0x15, 0x23, 0x78, 0x5f, 0xea, 0xbc, 0xd1, 0x23})

	// CharacteristicUUIDDFUControlPoint - DFU Control Point
	CharacteristicUUIDDFUControlPoint = NewUUID([16]byte{0x8e, 0xc9, 0x00, 0x01, 0xf3, 0x15, 0x4f, 0x60, 0x9f, 0xb8, 0x83, 0x88, 0x30, 0xda, 0xea, 0x50})

	// CharacteristicUUIDDFUPacket - DFU Packet
	CharacteristicUUIDDFUPacket = NewUUID([16]byte{0x8e, 0xc9, 0x00, 0x02, 0xf3, 0x15, 0x4f, 0x60, 0x9f, 0xb8, 0x83, 0x88, 0x30, 0xda, 0xea, 0x50})

	// CharacteristicUUIDButtonlessDFUWithoutBonds - Buttonless DFU Without Bonds
	CharacteristicUUIDButtonlessDFUWithoutBonds = NewUUID([16]byte{0x8e, 0xc9, 0x00, 0x03, 0xf3, 0x15, 0x4f, 0x60, 0x9f, 0xb8, 0x83, 0x88, 0x30, 0xda, 0xea, 0x50})

	// CharacteristicUUIDButtonlessDFUWithBonds - Buttonless DFU With Bonds
	CharacteristicUUIDButtonlessDFUWithBonds = NewUUID([16]byte{0x8e, 0xc9, 0x00, 0x04, 0xf3, 0x15, 0x4f, 0x60, 0x9f, 0xb8, 0x83, 0x88, 0x30, 0xda, 0xea, 0x50})

	// CharacteristicUUIDExperimentalButtonlessDFU - Experimental Buttonless DFU
	CharacteristicUUIDExperimentalButtonlessDFU = NewUUID([16]byte{0x8e, 0x40, 0x00, 0x01, 0xf3, 0x15, 0x4f, 0x60, 0x9f, 0xb8, 0x83, 0x88, 0x30, 0xda, 0xea, 0x50})

	// CharacteristicUUIDSMP - SMP Characteristic
	CharacteristicUUIDSMP = NewUUID([16]byte{0xda, 0x2e, 0x78, 0x28, 0xfb, 0xce, 0x4e, 0x01, 0xae, 0x9e, 0x26, 0x11, 0x74, 0x99, 0x7c, 0x48})

	// CharacteristicUUIDThingyDeviceName - Thingy Device Name
	CharacteristicUUIDThingyDeviceName = NewUUID([16]byte{0xef, 0x68, 0x01, 0x01, 0x9b, 0x35, 0x49, 0x33, 0x9b, 0x10, 0x52, 0xff, 0xa9, 0x74, 0x00, 0x42})

	// CharacteristicUUIDThingyAdvertisingParameters - Thingy Advertising Parameters
	CharacteristicUUIDThingyAdvertisingParameters = NewUUID([16]byte{0xef, 0x68, 0x01, 0x02, 0x9b, 0x35, 0x49, 0x33, 0x9b, 0x10, 0x52, 0xff, 0xa9, 0x74, 0x00, 0x42})

	// CharacteristicUUIDThingyConnectionParameters - Thingy Connection Parameters
	CharacteristicUUIDThingyConnectionParameters = NewUUID([16]byte{0xef, 0x68, 0x01, 0x04, 0x9b, 0x35, 0x49, 0x33, 0x9b, 0x10, 0x52, 0xff, 0xa9, 0x74, 0x00, 0x42})

	// CharacteristicUUIDThingyEddystoneURL - Thingy Eddystone URL
	CharacteristicUUIDThingyEddystoneURL = NewUUID([16]byte{0xef, 0x68, 0x01, 0x05, 0x9b, 0x35, 0x49, 0x33, 0x9b, 0x10, 0x52, 0xff, 0xa9, 0x74, 0x00, 0x42})

	// CharacteristicUUIDThingyCloudToken - Thingy Cloud Token
	CharacteristicUUIDThingyCloudToken = NewUUID([16]byte{0xef, 0x68, 0x01, 0x06, 0x9b, 0x35, 0x49, 0x33, 0x9b, 0x10, 0x52, 0xff, 0xa9, 0x74, 0x00, 0x42})

	// CharacteristicUUIDThingyFWVersion - Thingy FW Version
	CharacteristicUUIDThingyFWVersion = NewUUID([16]byte{0xef, 0x68, 0x01, 0x07, 0x9b, 0x35, 0x49, 0x33, 0x9b, 0x10, 0x52, 0xff, 0xa9, 0x74, 0x00, 0x42})

	// CharacteristicUUIDThingyMTURequest - Thingy MTU Request
	CharacteristicUUIDThingyMTURequest = NewUUID([16]byte{0xef, 0x68, 0x01, 0x08, 0x9b, 0x35, 0x49, 0x33, 0x9b, 0x10, 0x52, 0xff, 0xa9, 0x74, 0x00, 0x42})

	// CharacteristicUUIDThingyTemperature - Thingy Temperature
	CharacteristicUUIDThingyTemperature = NewUUID([16]byte{0xef, 0x68, 0x02, 0x01, 0x9b, 0x35, 0x49, 0x33, 0x9b, 0x10, 0x52, 0xff, 0xa9, 0x74, 0x00, 0x42})

	// CharacteristicUUIDThingyPressure - Thingy Pressure
	CharacteristicUUIDThingyPressure = NewUUID([16]byte{0xef, 0x68, 0x02, 0x02, 0x9b, 0x35, 0x49, 0x33, 0x9b, 0x10, 0x52, 0xff, 0xa9, 0x74, 0x00, 0x42})

	// CharacteristicUUIDThingyHumidity - Thingy Humidity
	CharacteristicUUIDThingyHumidity = NewUUID([16]byte{0xef, 0x68, 0x02, 0x03, 0x9b, 0x35, 0x49, 0x33, 0x9b, 0x10, 0x52, 0xff, 0xa9, 0x74, 0x00, 0x42})

	// CharacteristicUUIDThingyAirQuality - Thingy Air Quality
	CharacteristicUUIDThingyAirQuality = NewUUID([16]byte{0xef, 0x68, 0x02, 0x04, 0x9b, 0x35, 0x49, 0x33, 0x9b, 0x10, 0x52, 0xff, 0xa9, 0x74, 0x00, 0x42})

	// CharacteristicUUIDThingyColor - Thingy Color
	CharacteristicUUIDThingyColor = NewUUID([16]byte{0xef, 0x68, 0x02, 0x05, 0x9b, 0x35, 0x49, 0x33, 0x9b, 0x10, 0x52, 0xff, 0xa9, 0x74, 0x00, 0x42})

	// CharacteristicUUIDThingyConfiguration - Thingy Configuration
	CharacteristicUUIDThingyConfiguration = NewUUID([16]byte{0xef, 0x68, 0x02, 0x06, 0x9b, 0x35, 0x49, 0x33, 0x9b, 0x10, 0x52, 0xff, 0xa9, 0x74, 0x00, 0x42})

	// CharacteristicUUIDThingyLEDState - Thingy LED State
	CharacteristicUUIDThingyLEDState = NewUUID([16]byte{0xef, 0x68, 0x03, 0x01, 0x9b, 0x35, 0x49, 0x33, 0x9b, 0x10, 0x52, 0xff, 0xa9, 0x74, 0x00, 0x42})

	// CharacteristicUUIDThingyButtonState - Thingy Button State
	CharacteristicUUIDThingyButtonState = NewUUID([16]byte{0xef, 0x68, 0x03, 0x02, 0x9b, 0x35, 0x49, 0x33, 0x9b, 0x10, 0x52, 0xff, 0xa9, 0x74, 0x00, 0x42})

	// CharacteristicUUIDThingyEXTPin - Thingy EXT Pin
	CharacteristicUUIDThingyEXTPin = NewUUID([16]byte{0xef, 0x68, 0x03, 0x03, 0x9b, 0x35, 0x49, 0x33, 0x9b, 0x10, 0x52, 0xff, 0xa9, 0x74, 0x00, 0x42})

	// CharacteristicUUIDThingyMotionConfig - Thingy Motion Config
	CharacteristicUUIDThingyMotionConfig = NewUUID([16]byte{0xef, 0x68, 0x04, 0x01, 0x9b, 0x35, 0x49, 0x33, 0x9b, 0x10, 0x52, 0xff, 0xa9, 0x74, 0x00, 0x42})

	// CharacteristicUUIDThingyTap - Thingy Tap
	CharacteristicUUIDThingyTap = NewUUID([16]byte{0xef, 0x68, 0x04, 0x02, 0x9b, 0x35, 0x49, 0x33, 0x9b, 0x10, 0x52, 0xff, 0xa9, 0x74, 0x00, 0x42})

	// CharacteristicUUIDThingyOrientation - Thingy Orientation
	CharacteristicUUIDThingyOrientation = NewUUID([16]byte{0xef, 0x68, 0x04, 0x03, 0x9b, 0x35, 0x49, 0x33, 0x9b, 0x10, 0x52, 0xff, 0xa9, 0x74, 0x00, 0x42})

	// CharacteristicUUIDThingyQuaternion - Thingy Quaternion
	CharacteristicUUIDThingyQuaternion = NewUUID([16]byte{0xef, 0x68, 0x04, 0x04, 0x9b, 0x35, 0x49, 0x33, 0x9b, 0x10, 0x52, 0xff, 0xa9, 0x74, 0x00, 0x42})

	// CharacteristicUUIDThingyPedometer - Thingy Pedometer
	CharacteristicUUIDThingyPedometer = NewUUID([16]byte{0xef, 0x68, 0x04, 0x05, 0x9b, 0x35, 0x49, 0x33, 0x9b, 0x10, 0x52, 0xff, 0xa9, 0x74, 0x00, 0x42})

	// CharacteristicUUIDThingyRawData - Thingy Raw Data
	CharacteristicUUIDThingyRawData = NewUUID([16]byte{0xef, 0x68, 0x04, 0x06, 0x9b, 0x35, 0x49, 0x33, 0x9b, 0x10, 0x52, 0xff, 0xa9, 0x74, 0x00, 0x42})

	// CharacteristicUUIDThingyEuler - Thingy Euler
	CharacteristicUUIDThingyEuler = NewUUID([16]byte{0xef, 0x68, 0x04, 0x07, 0x9b, 0x35, 0x49, 0x33, 0x9b, 0x10, 0x52, 0xff, 0xa9, 0x74, 0x00, 0x42})

	// CharacteristicUUIDThingyRotationMatrix - Thingy Rotation Matrix
	CharacteristicUUIDThingyRotationMatrix = NewUUID([16]byte{0xef, 0x68, 0x04, 0x08, 0x9b, 0x35, 0x49, 0x33, 0x9b, 0x10, 0x52, 0xff, 0xa9, 0x74, 0x00, 0x42})

	// CharacteristicUUIDThingyHeading - Thingy Heading
	CharacteristicUUIDThingyHeading = NewUUID([16]byte{0xef, 0x68, 0x04, 0x09, 0x9b, 0x35, 0x49, 0x33, 0x9b, 0x10, 0x52, 0xff, 0xa9, 0x74, 0x00, 0x42})

	// CharacteristicUUIDThingyGravityVector - Thingy Gravity Vector
	CharacteristicUUIDThingyGravityVector = NewUUID([16]byte{0xef, 0x68, 0x04, 0x0a, 0x9b, 0x35, 0x49, 0x33, 0x9b, 0x10, 0x52, 0xff, 0xa9, 0x74, 0x00, 0x42})

	// CharacteristicUUIDThingySoundConfig - Thingy Sound Config
	CharacteristicUUIDThingySoundConfig = NewUUID([16]byte{0xef, 0x68, 0x05, 0x01, 0x9b, 0x35, 0x49, 0x33, 0x9b, 0x10, 0x52, 0xff, 0xa9, 0x74, 0x00, 0x42})

	// CharacteristicUUIDThingySpeakerData - Thingy Speaker Data
	CharacteristicUUIDThingySpeakerData = NewUUID([16]byte{0xef, 0x68, 0x05, 0x02, 0x9b, 0x35, 0x49, 0x33, 0x9b, 0x10, 0x52, 0xff, 0xa9, 0x74, 0x00, 0x42})

	// CharacteristicUUIDThingySpeakerStatus - Thingy Speaker Status
	CharacteristicUUIDThingySpeakerStatus = NewUUID([16]byte{0xef, 0x68, 0x05, 0x03, 0x9b, 0x35, 0x49, 0x33, 0x9b, 0x10, 0x52, 0xff, 0xa9, 0x74, 0x00, 0x42})

	// CharacteristicUUIDThingyMicrophone - Thingy Microphone
	CharacteristicUUIDThingyMicrophone = NewUUID([16]byte{0xef, 0x68, 0x05, 0x04, 0x9b, 0x35, 0x49, 0x33, 0x9b, 0x10, 0x52, 0xff, 0xa9, 0x74, 0x00, 0x42})

	// CharacteristicUUIDUARTTX - UART TX Characteristic
	CharacteristicUUIDUARTTX = NewUUID([16]byte{0x6e, 0x40, 0x00, 0x03, 0xb5, 0xa3, 0xf3, 0x93, 0xe0, 0xa9, 0xe5, 0x0e, 0x24, 0xdc, 0xca, 0x9e})

	// CharacteristicUUIDUARTRX - UART RX Characteristic
	CharacteristicUUIDUARTRX = NewUUID([16]byte{0x6e, 0x40, 0x00, 0x02, 0xb5, 0xa3, 0xf3, 0x93, 0xe0, 0xa9, 0xe5, 0x0e, 0x24, 0xdc, 0xca, 0x9e})

	// CharacteristicUUIDEddystoneCapabilities - Eddystone Capabilities
	CharacteristicUUIDEddystoneCapabilities = NewUUID([16]byte{0xa3, 0xc8, 0x75, 0x01, 0x8e, 0xd3, 0x4b, 0xdf, 0x8a, 0x39, 0xa0, 0x1b, 0xeb, 0xed, 0xe2, 0x95})

	// CharacteristicUUIDEddystoneActiveSlot - Eddystone Active Slot
	CharacteristicUUIDEddystoneActiveSlot = NewUUID([16]byte{0xa3, 0xc8, 0x75, 0x02, 0x8e, 0xd3, 0x4b, 0xdf, 0x8a, 0x39, 0xa0, 0x1b, 0xeb, 0xed, 0xe2, 0x95})

	// CharacteristicUUIDEddystoneAdvertisingInterval - Eddystone Advertising Interval
	CharacteristicUUIDEddystoneAdvertisingInterval = NewUUID([16]byte{0xa3, 0xc8, 0x75, 0x03, 0x8e, 0xd3, 0x4b, 0xdf, 0x8a, 0x39, 0xa0, 0x1b, 0xeb, 0xed, 0xe2, 0x95})

	// CharacteristicUUIDEddystoneRadioTxPower - Eddystone Radio Tx Power
	CharacteristicUUIDEddystoneRadioTxPower = NewUUID([16]byte{0xa3, 0xc8, 0x75, 0x04, 0x8e, 0xd3, 0x4b, 0xdf, 0x8a, 0x39, 0xa0, 0x1b, 0xeb, 0xed, 0xe2, 0x95})

	// CharacteristicUUIDEddystoneAdvancedAdvertisedTxPower - Eddystone (Advanced) Advertised Tx Power
	CharacteristicUUIDEddystoneAdvancedAdvertisedTxPower = NewUUID([16]byte{0xa3, 0xc8, 0x75, 0x05, 0x8e, 0xd3, 0x4b, 0xdf, 0x8a, 0x39, 0xa0, 0x1b, 0xeb, 0xed, 0xe2, 0x95})

	// CharacteristicUUIDEddystoneLockState - Eddystone Lock State
	CharacteristicUUIDEddystoneLockState = NewUUID([16]byte{0xa3, 0xc8, 0x75, 0x06, 0x8e, 0xd3, 0x4b, 0xdf, 0x8a, 0x39, 0xa0, 0x1b, 0xeb, 0xed, 0xe2, 0x95})

	// CharacteristicUUIDEddystoneUnlock - Eddystone Unlock
	CharacteristicUUIDEddystoneUnlock = NewUUID([16]byte{0xa3, 0xc8, 0x75, 0x07, 0x8e, 0xd3, 0x4b, 0xdf, 0x8a, 0x39, 0xa0, 0x1b, 0xeb, 0xed, 0xe2, 0x95})

	// CharacteristicUUIDEddystonePublicECDHKey - Eddystone Public ECDH Key
	CharacteristicUUIDEddystonePublicECDHKey = NewUUID([16]byte{0xa3, 0xc8, 0x75, 0x08, 0x8e, 0xd3, 0x4b, 0xdf, 0x8a, 0x39, 0xa0, 0x1b, 0xeb, 0xed, 0xe2, 0x95})

	// CharacteristicUUIDEddystoneEIDIdentityKey - Eddystone EID Identity Key
	CharacteristicUUIDEddystoneEIDIdentityKey = NewUUID([16]byte{0xa3, 0xc8, 0x75, 0x09, 0x8e, 0xd3, 0x4b, 0xdf, 0x8a, 0x39, 0xa0, 0x1b, 0xeb, 0xed, 0xe2, 0x95})

	// CharacteristicUUIDEddystoneADVSlotData - Eddystone ADV Slot Data
	CharacteristicUUIDEddystoneADVSlotData = NewUUID([16]byte{0xa3, 0xc8, 0x75, 0x0a, 0x8e, 0xd3, 0x4b, 0xdf, 0x8a, 0x39, 0xa0, 0x1b, 0xeb, 0xed, 0xe2, 0x95})

	// CharacteristicUUIDEddystoneAvancedFactoryReset - Eddystone Avanced Factory Reset
	CharacteristicUUIDEddystoneAvancedFactoryReset = NewUUID([16]byte{0xa3, 0xc8, 0x75, 0x0b, 0x8e, 0xd3, 0x4b, 0xdf, 0x8a, 0x39, 0xa0, 0x1b, 0xeb, 0xed, 0xe2, 0x95})

	// CharacteristicUUIDEddystoneAdvancedRemainConnectable - Eddystone (Advanced) Remain Connectable
	CharacteristicUUIDEddystoneAdvancedRemainConnectable = NewUUID([16]byte{0xa3, 0xc8, 0x75, 0x0c, 0x8e, 0xd3, 0x4b, 0xdf, 0x8a, 0x39, 0xa0, 0x1b, 0xeb, 0xed, 0xe2, 0x95})

	// CharacteristicUUIDFastPairModelID - Fast Pair Model ID
	CharacteristicUUIDFastPairModelID = NewUUID([16]byte{0xfe, 0x2c, 0x12, 0x33, 0x83, 0x66, 0x48, 0x14, 0x8e, 0xb0, 0x01, 0xde, 0x32, 0x10, 0x0b, 0xea})

	// CharacteristicUUIDFastPairKeybasedPairing - Fast Pair Key-based Pairing
	CharacteristicUUIDFastPairKeybasedPairing = NewUUID([16]byte{0xfe, 0x2c, 0x12, 0x34, 0x83, 0x66, 0x48, 0x14, 0x8e, 0xb0, 0x01, 0xde, 0x32, 0x10, 0x0b, 0xea})

	// CharacteristicUUIDFastPairPasskey - Fast Pair Passkey
	CharacteristicUUIDFastPairPasskey = NewUUID([16]byte{0xfe, 0x2c, 0x12, 0x35, 0x83, 0x66, 0x48, 0x14, 0x8e, 0xb0, 0x01, 0xde, 0x32, 0x10, 0x0b, 0xea})

	// CharacteristicUUIDFastPairAccountKey - Fast Pair Account Key
	CharacteristicUUIDFastPairAccountKey = NewUUID([16]byte{0xfe, 0x2c, 0x12, 0x36, 0x83, 0x66, 0x48, 0x14, 0x8e, 0xb0, 0x01, 0xde, 0x32, 0x10, 0x0b, 0xea})

	// CharacteristicUUIDFastPairData - Fast Pair Data
	CharacteristicUUIDFastPairData = NewUUID([16]byte{0xfe, 0x2c, 0x12, 0x37, 0x83, 0x66, 0x48, 0x14, 0x8e, 0xb0, 0x01, 0xde, 0x32, 0x10, 0x0b, 0xea})

	// CharacteristicUUIDDeprecatedFastPairModelID - Deprecated Fast Pair Model ID
	CharacteristicUUIDDeprecatedFastPairModelID = New16BitUUID(0x1233)

	// CharacteristicUUIDDeprecatedFastPairKeybasedPairing - Deprecated Fast Pair Key-based Pairing
	CharacteristicUUIDDeprecatedFastPairKeybasedPairing = New16BitUUID(0x1234)

	// CharacteristicUUIDDeprecatedFastPairPasskey - Deprecated Fast Pair Passkey
	CharacteristicUUIDDeprecatedFastPairPasskey = New16BitUUID(0x1235)

	// CharacteristicUUIDDeprecatedFastPairAccountKey - Deprecated Fast Pair Account Key
	CharacteristicUUIDDeprecatedFastPairAccountKey = New16BitUUID(0x1236)

	// CharacteristicUUIDDeprecatedFastPairData - Deprecated Fast Pair Data
	CharacteristicUUIDDeprecatedFastPairData = New16BitUUID(0x1237)

	// CharacteristicUUIDAppleNotificationSource - Apple Notification Source
	CharacteristicUUIDAppleNotificationSource = NewUUID([16]byte{0x9f, 0xbf, 0x12, 0x0d, 0x63, 0x01, 0x42, 0xd9, 0x8c, 0x58, 0x25, 0xe6, 0x99, 0xa2, 0x1d, 0xbd})

	// CharacteristicUUIDAppleControlPoint - Apple Control Point
	CharacteristicUUIDAppleControlPoint = NewUUID([16]byte{0x69, 0xd1, 0xd8, 0xf3, 0x45, 0xe1, 0x49, 0xa8, 0x98, 0x21, 0x9b, 0xbd, 0xfd, 0xaa, 0xd9, 0xd9})

	// CharacteristicUUIDAppleDataSource - Apple Data Source
	CharacteristicUUIDAppleDataSource = NewUUID([16]byte{0x22, 0xea, 0xc6, 0xe9, 0x24, 0xd6, 0x4b, 0xb5, 0xbe, 0x44, 0xb3, 0x6a, 0xce, 0x7c, 0x7b, 0xfb})

	// CharacteristicUUIDAppleRemoteCommand - Apple Remote Command
	CharacteristicUUIDAppleRemoteCommand = NewUUID([16]byte{0x9b, 0x3c, 0x81, 0xd8, 0x57, 0xb1, 0x4a, 0x8a, 0xb8, 0xdf, 0x0e, 0x56, 0xf7, 0xca, 0x51, 0xc2})

	// CharacteristicUUIDAppleEntityUpdate - Apple Entity Update
	CharacteristicUUIDAppleEntityUpdate = NewUUID([16]byte{0x2f, 0x7c, 0xab, 0xce, 0x80, 0x8d, 0x41, 0x1f, 0x9a, 0x0c, 0xbb, 0x92, 0xba, 0x96, 0xc1, 0x02})

	// CharacteristicUUIDAppleEntityAttribute - Apple Entity Attribute
	CharacteristicUUIDAppleEntityAttribute = NewUUID([16]byte{0xc6, 0xb2, 0xf3, 0x8c, 0x23, 0xab, 0x46, 0xd8, 0xa6, 0xab, 0xa3, 0xa8, 0x70, 0xbb, 0xd5, 0xd7})

	// CharacteristicUUIDMicrobitAccelerometerData - micro:bit Accelerometer Data
	CharacteristicUUIDMicrobitAccelerometerData = NewUUID([16]byte{0xe9, 0x5d, 0xca, 0x4b, 0x25, 0x1d, 0x47, 0x0a, 0xa0, 0x62, 0xfa, 0x19, 0x22, 0xdf, 0xa9, 0xa8})

	// CharacteristicUUIDMicrobitAccelerometerPeriod - micro:bit Accelerometer Period
	CharacteristicUUIDMicrobitAccelerometerPeriod = NewUUID([16]byte{0xe9, 0x5d, 0xfb, 0x24, 0x25, 0x1d, 0x47, 0x0a, 0xa0, 0x62, 0xfa, 0x19, 0x22, 0xdf, 0xa9, 0xa8})

	// CharacteristicUUIDMicrobitMagnetometerData - micro:bit Magnetometer Data
	CharacteristicUUIDMicrobitMagnetometerData = NewUUID([16]byte{0xe9, 0x5d, 0xfb, 0x11, 0x25, 0x1d, 0x47, 0x0a, 0xa0, 0x62, 0xfa, 0x19, 0x22, 0xdf, 0xa9, 0xa8})

	// CharacteristicUUIDMicrobitMagnetometerPeriod - micro:bit Magnetometer Period
	CharacteristicUUIDMicrobitMagnetometerPeriod = NewUUID([16]byte{0xe9, 0x5d, 0x38, 0x6c, 0x25, 0x1d, 0x47, 0x0a, 0xa0, 0x62, 0xfa, 0x19, 0x22, 0xdf, 0xa9, 0xa8})

	// CharacteristicUUIDMicrobitMagnetometerBearing - micro:bit Magnetometer Bearing
	CharacteristicUUIDMicrobitMagnetometerBearing = NewUUID([16]byte{0xe9, 0x5d, 0x97, 0x15, 0x25, 0x1d, 0x47, 0x0a, 0xa0, 0x62, 0xfa, 0x19, 0x22, 0xdf, 0xa9, 0xa8})

	// CharacteristicUUIDMicrobitButtonAState - micro:bit Button A State
	CharacteristicUUIDMicrobitButtonAState = NewUUID([16]byte{0xe9, 0x5d, 0xda, 0x90, 0x25, 0x1d, 0x47, 0x0a, 0xa0, 0x62, 0xfa, 0x19, 0x22, 0xdf, 0xa9, 0xa8})

	// CharacteristicUUIDMicrobitButtonBState - micro:bit Button B State
	CharacteristicUUIDMicrobitButtonBState = NewUUID([16]byte{0xe9, 0x5d, 0xda, 0x91, 0x25, 0x1d, 0x47, 0x0a, 0xa0, 0x62, 0xfa, 0x19, 0x22, 0xdf, 0xa9, 0xa8})

	// CharacteristicUUIDMicrobitPinData - micro:bit Pin Data
	CharacteristicUUIDMicrobitPinData = NewUUID([16]byte{0xe9, 0x5d, 0x8d, 0x00, 0x25, 0x1d, 0x47, 0x0a, 0xa0, 0x62, 0xfa, 0x19, 0x22, 0xdf, 0xa9, 0xa8})

	// CharacteristicUUIDMicrobitPinADConfiguration - micro:bit Pin AD Configuration
	CharacteristicUUIDMicrobitPinADConfiguration = NewUUID([16]byte{0xe9, 0x5d, 0x58, 0x99, 0x25, 0x1d, 0x47, 0x0a, 0xa0, 0x62, 0xfa, 0x19, 0x22, 0xdf, 0xa9, 0xa8})

	// CharacteristicUUIDMicrobitPinIOConfiguration - micro:bit Pin I/O Configuration
	CharacteristicUUIDMicrobitPinIOConfiguration = NewUUID([16]byte{0xe9, 0x5d, 0xb9, 0xfe, 0x25, 0x1d, 0x47, 0x0a, 0xa0, 0x62, 0xfa, 0x19, 0x22, 0xdf, 0xa9, 0xa8})

	// CharacteristicUUIDMicrobitPWMControl - micro:bit PWM Control
	CharacteristicUUIDMicrobitPWMControl = NewUUID([16]byte{0xe9, 0x5d, 0xd8, 0x22, 0x25, 0x1d, 0x47, 0x0a, 0xa0, 0x62, 0xfa, 0x19, 0x22, 0xdf, 0xa9, 0xa8})

	// CharacteristicUUIDMicrobitLEDMatrixState - micro:bit LED Matrix State
	CharacteristicUUIDMicrobitLEDMatrixState = NewUUID([16]byte{0xe9, 0x5d, 0x7b, 0x77, 0x25, 0x1d, 0x47, 0x0a, 0xa0, 0x62, 0xfa, 0x19, 0x22, 0xdf, 0xa9, 0xa8})

	// CharacteristicUUIDMicrobitLEDText - micro:bit LED Text
	CharacteristicUUIDMicrobitLEDText = NewUUID([16]byte{0xe9, 0x5d, 0x93, 0xee, 0x25, 0x1d, 0x47, 0x0a, 0xa0, 0x62, 0xfa, 0x19, 0x22, 0xdf, 0xa9, 0xa8})

	// CharacteristicUUIDMicrobitScrollingDelay - micro:bit Scrolling Delay
	CharacteristicUUIDMicrobitScrollingDelay = NewUUID([16]byte{0xe9, 0x5d, 0x0d, 0x2d, 0x25, 0x1d, 0x47, 0x0a, 0xa0, 0x62, 0xfa, 0x19, 0x22, 0xdf, 0xa9, 0xa8})

	// CharacteristicUUIDMicrobitRequirements - micro:bit Requirements
	CharacteristicUUIDMicrobitRequirements = NewUUID([16]byte{0xe9, 0x5d, 0xb8, 0x4c, 0x25, 0x1d, 0x47, 0x0a, 0xa0, 0x62, 0xfa, 0x19, 0x22, 0xdf, 0xa9, 0xa8})

	// CharacteristicUUIDMicrobitEvent - micro:bit Event
	CharacteristicUUIDMicrobitEvent = NewUUID([16]byte{0xe9, 0x5d, 0x97, 0x75, 0x25, 0x1d, 0x47, 0x0a, 0xa0, 0x62, 0xfa, 0x19, 0x22, 0xdf, 0xa9, 0xa8})

	// CharacteristicUUIDMicrobitClientRequirements - micro:bit Client Requirements
	CharacteristicUUIDMicrobitClientRequirements = NewUUID([16]byte{0xe9, 0x5d, 0x23, 0xc4, 0x25, 0x1d, 0x47, 0x0a, 0xa0, 0x62, 0xfa, 0x19, 0x22, 0xdf, 0xa9, 0xa8})

	// CharacteristicUUIDMicrobitClientEvent - micro:bit Client Event
	CharacteristicUUIDMicrobitClientEvent = NewUUID([16]byte{0xe9, 0x5d, 0x54, 0x04, 0x25, 0x1d, 0x47, 0x0a, 0xa0, 0x62, 0xfa, 0x19, 0x22, 0xdf, 0xa9, 0xa8})

	// CharacteristicUUIDMicrobitDFUControl - micro:bit DFU Control
	CharacteristicUUIDMicrobitDFUControl = NewUUID([16]byte{0xe9, 0x5d, 0x93, 0xb1, 0x25, 0x1d, 0x47, 0x0a, 0xa0, 0x62, 0xfa, 0x19, 0x22, 0xdf, 0xa9, 0xa8})

	// CharacteristicUUIDMicrobitTemperature - micro:bit Temperature
	CharacteristicUUIDMicrobitTemperature = NewUUID([16]byte{0xe9, 0x5d, 0x92, 0x50, 0x25, 0x1d, 0x47, 0x0a, 0xa0, 0x62, 0xfa, 0x19, 0x22, 0xdf, 0xa9, 0xa8})

	// CharacteristicUUIDMicrobitTemperaturePeriod - micro:bit Temperature Period
	CharacteristicUUIDMicrobitTemperaturePeriod = NewUUID([16]byte{0xe9, 0x5d, 0x1b, 0x25, 0x25, 0x1d, 0x47, 0x0a, 0xa0, 0x62, 0xfa, 0x19, 0x22, 0xdf, 0xa9, 0xa8})

	// CharacteristicUUIDMeshProvisioningDataIn - Mesh Provisioning Data In
	CharacteristicUUIDMeshProvisioningDataIn = New16BitUUID(0x2ADB)

	// CharacteristicUUIDMeshProvisioningDataOut - Mesh Provisioning Data Out
	CharacteristicUUIDMeshProvisioningDataOut = New16BitUUID(0x2ADC)

	// CharacteristicUUIDMeshProxyDataIn - Mesh Proxy Data In
	CharacteristicUUIDMeshProxyDataIn = New16BitUUID(0x2ADD)

	// CharacteristicUUIDMeshProxyDataOut - Mesh Proxy Data Out
	CharacteristicUUIDMeshProxyDataOut = New16BitUUID(0x2ADE)
)
View Source
var (

	// ServiceUUIDGenericAccess - Generic Access
	ServiceUUIDGenericAccess = New16BitUUID(0x1800)

	// ServiceUUIDAlertNotification - Alert Notification Service
	ServiceUUIDAlertNotification = New16BitUUID(0x1811)

	// ServiceUUIDAutomationIO - Automation IO
	ServiceUUIDAutomationIO = New16BitUUID(0x1815)

	// ServiceUUIDBattery - Battery Service
	ServiceUUIDBattery = New16BitUUID(0x180F)

	// ServiceUUIDBloodPressure - Blood Pressure
	ServiceUUIDBloodPressure = New16BitUUID(0x1810)

	// ServiceUUIDBodyComposition - Body Composition
	ServiceUUIDBodyComposition = New16BitUUID(0x181B)

	// ServiceUUIDBondManagement - Bond Management Service
	ServiceUUIDBondManagement = New16BitUUID(0x181E)

	// ServiceUUIDContinuousGlucoseMonitoring - Continuous Glucose Monitoring
	ServiceUUIDContinuousGlucoseMonitoring = New16BitUUID(0x181F)

	// ServiceUUIDCurrentTime - Current Time Service
	ServiceUUIDCurrentTime = New16BitUUID(0x1805)

	// ServiceUUIDCyclingPower - Cycling Power
	ServiceUUIDCyclingPower = New16BitUUID(0x1818)

	// ServiceUUIDCyclingSpeedAndCadence - Cycling Speed and Cadence
	ServiceUUIDCyclingSpeedAndCadence = New16BitUUID(0x1816)

	// ServiceUUIDDeviceInformation - Device Information
	ServiceUUIDDeviceInformation = New16BitUUID(0x180A)

	// ServiceUUIDEnvironmentalSensing - Environmental Sensing
	ServiceUUIDEnvironmentalSensing = New16BitUUID(0x181A)

	// ServiceUUIDFitnessMachine - Fitness Machine
	ServiceUUIDFitnessMachine = New16BitUUID(0x1826)

	// ServiceUUIDGenericAttribute - Generic Attribute
	ServiceUUIDGenericAttribute = New16BitUUID(0x1801)

	// ServiceUUIDGlucose - Glucose
	ServiceUUIDGlucose = New16BitUUID(0x1808)

	// ServiceUUIDHealthThermometer - Health Thermometer
	ServiceUUIDHealthThermometer = New16BitUUID(0x1809)

	// ServiceUUIDHeartRate - Heart Rate
	ServiceUUIDHeartRate = New16BitUUID(0x180D)

	// ServiceUUIDHTTPProxy - HTTP Proxy
	ServiceUUIDHTTPProxy = New16BitUUID(0x1823)

	// ServiceUUIDHumanInterfaceDevice - Human Interface Device
	ServiceUUIDHumanInterfaceDevice = New16BitUUID(0x1812)

	// ServiceUUIDImmediateAlert - Immediate Alert
	ServiceUUIDImmediateAlert = New16BitUUID(0x1802)

	// ServiceUUIDIndoorPositioning - Indoor Positioning
	ServiceUUIDIndoorPositioning = New16BitUUID(0x1821)

	// ServiceUUIDInsulinDelivery - Insulin Delivery
	ServiceUUIDInsulinDelivery = New16BitUUID(0x183A)

	// ServiceUUIDInternetProtocolSupport - Internet Protocol Support Service
	ServiceUUIDInternetProtocolSupport = New16BitUUID(0x1820)

	// ServiceUUIDLinkLoss - Link Loss
	ServiceUUIDLinkLoss = New16BitUUID(0x1803)

	// ServiceUUIDLocationAndNavigation - Location and Navigation
	ServiceUUIDLocationAndNavigation = New16BitUUID(0x1819)

	// ServiceUUIDMeshProvisioning - Mesh Provisioning Service
	ServiceUUIDMeshProvisioning = New16BitUUID(0x1827)

	// ServiceUUIDMeshProxy - Mesh Proxy Service
	ServiceUUIDMeshProxy = New16BitUUID(0x1828)

	// ServiceUUIDNextDSTChange - Next DST Change Service
	ServiceUUIDNextDSTChange = New16BitUUID(0x1807)

	// ServiceUUIDObjectTransfer - Object Transfer Service
	ServiceUUIDObjectTransfer = New16BitUUID(0x1825)

	// ServiceUUIDPhoneAlertStatus - Phone Alert Status Service
	ServiceUUIDPhoneAlertStatus = New16BitUUID(0x180E)

	// ServiceUUIDPulseOximeter - Pulse Oximeter Service
	ServiceUUIDPulseOximeter = New16BitUUID(0x1822)

	// ServiceUUIDReconnectionConfiguration - Reconnection Configuration
	ServiceUUIDReconnectionConfiguration = New16BitUUID(0x1829)

	// ServiceUUIDReferenceTimeUpdate - Reference Time Update Service
	ServiceUUIDReferenceTimeUpdate = New16BitUUID(0x1806)

	// ServiceUUIDRunningSpeedAndCadence - Running Speed and Cadence
	ServiceUUIDRunningSpeedAndCadence = New16BitUUID(0x1814)

	// ServiceUUIDScanParameters - Scan Parameters
	ServiceUUIDScanParameters = New16BitUUID(0x1813)

	// ServiceUUIDTransportDiscovery - Transport Discovery
	ServiceUUIDTransportDiscovery = New16BitUUID(0x1824)

	// ServiceUUIDTxPower - Tx Power
	ServiceUUIDTxPower = New16BitUUID(0x1804)

	// ServiceUUIDUserData - User Data
	ServiceUUIDUserData = New16BitUUID(0x181C)

	// ServiceUUIDWeightScale - Weight Scale
	ServiceUUIDWeightScale = New16BitUUID(0x181D)

	// ServiceUUIDFirmwareRevision - Firmware Revision
	ServiceUUIDFirmwareRevision = New16BitUUID(0x2A26)

	// ServiceUUIDAppleNotificationCenter - Apple Notification Center Service
	ServiceUUIDAppleNotificationCenter = NewUUID([16]byte{0x79, 0x05, 0xf4, 0x31, 0xb5, 0xce, 0x4e, 0x99, 0xa4, 0x0f, 0x4b, 0x1e, 0x12, 0x2d, 0x00, 0xd0})

	// ServiceUUIDAppleMedia - Apple Media Service
	ServiceUUIDAppleMedia = NewUUID([16]byte{0x89, 0xd3, 0x50, 0x2b, 0x0f, 0x36, 0x43, 0x3a, 0x8e, 0xf4, 0xc5, 0x02, 0xad, 0x55, 0xf8, 0xdc})

	// ServiceUUIDMicrobitAccelerometer - micro:bit Accelerometer Service
	ServiceUUIDMicrobitAccelerometer = NewUUID([16]byte{0xe9, 0x5d, 0x07, 0x53, 0x25, 0x1d, 0x47, 0x0a, 0xa0, 0x62, 0xfa, 0x19, 0x22, 0xdf, 0xa9, 0xa8})

	// ServiceUUIDMicrobitMagnetometer - micro:bit Magnetometer Service
	ServiceUUIDMicrobitMagnetometer = NewUUID([16]byte{0xe9, 0x5d, 0xf2, 0xd8, 0x25, 0x1d, 0x47, 0x0a, 0xa0, 0x62, 0xfa, 0x19, 0x22, 0xdf, 0xa9, 0xa8})

	// ServiceUUIDMicrobitButton - micro:bit Button Service
	ServiceUUIDMicrobitButton = NewUUID([16]byte{0xe9, 0x5d, 0x98, 0x82, 0x25, 0x1d, 0x47, 0x0a, 0xa0, 0x62, 0xfa, 0x19, 0x22, 0xdf, 0xa9, 0xa8})

	// ServiceUUIDMicrobitIOPin - micro:bit IO Pin Service
	ServiceUUIDMicrobitIOPin = NewUUID([16]byte{0xe9, 0x5d, 0x12, 0x7b, 0x25, 0x1d, 0x47, 0x0a, 0xa0, 0x62, 0xfa, 0x19, 0x22, 0xdf, 0xa9, 0xa8})

	// ServiceUUIDMicrobitLED - micro:bit LED Service
	ServiceUUIDMicrobitLED = NewUUID([16]byte{0xe9, 0x5d, 0xd9, 0x1d, 0x25, 0x1d, 0x47, 0x0a, 0xa0, 0x62, 0xfa, 0x19, 0x22, 0xdf, 0xa9, 0xa8})

	// ServiceUUIDMicrobitEvent - micro:bit Event Service
	ServiceUUIDMicrobitEvent = NewUUID([16]byte{0xe9, 0x5d, 0x93, 0xaf, 0x25, 0x1d, 0x47, 0x0a, 0xa0, 0x62, 0xfa, 0x19, 0x22, 0xdf, 0xa9, 0xa8})

	// ServiceUUIDMicrobitDFUControl - micro:bit DFU Control Service
	ServiceUUIDMicrobitDFUControl = NewUUID([16]byte{0xe9, 0x5d, 0x93, 0xb0, 0x25, 0x1d, 0x47, 0x0a, 0xa0, 0x62, 0xfa, 0x19, 0x22, 0xdf, 0xa9, 0xa8})

	// ServiceUUIDMicrobitTemperature - micro:bit Temperature Service
	ServiceUUIDMicrobitTemperature = NewUUID([16]byte{0xe9, 0x5d, 0x61, 0x00, 0x25, 0x1d, 0x47, 0x0a, 0xa0, 0x62, 0xfa, 0x19, 0x22, 0xdf, 0xa9, 0xa8})

	// ServiceUUIDThingyConfiguration - Thingy Configuration Service
	ServiceUUIDThingyConfiguration = NewUUID([16]byte{0xef, 0x68, 0x01, 0x00, 0x9b, 0x35, 0x49, 0x33, 0x9b, 0x10, 0x52, 0xff, 0xa9, 0x74, 0x00, 0x42})

	// ServiceUUIDThingyWeatherStation - Thingy Weather Station Service
	ServiceUUIDThingyWeatherStation = NewUUID([16]byte{0xef, 0x68, 0x02, 0x00, 0x9b, 0x35, 0x49, 0x33, 0x9b, 0x10, 0x52, 0xff, 0xa9, 0x74, 0x00, 0x42})

	// ServiceUUIDThingyUI - Thingy UI Service
	ServiceUUIDThingyUI = NewUUID([16]byte{0xef, 0x68, 0x03, 0x00, 0x9b, 0x35, 0x49, 0x33, 0x9b, 0x10, 0x52, 0xff, 0xa9, 0x74, 0x00, 0x42})

	// ServiceUUIDThingyMotion - Thingy Motion Service
	ServiceUUIDThingyMotion = NewUUID([16]byte{0xef, 0x68, 0x04, 0x00, 0x9b, 0x35, 0x49, 0x33, 0x9b, 0x10, 0x52, 0xff, 0xa9, 0x74, 0x00, 0x42})

	// ServiceUUIDThingySound - Thingy Sound Service
	ServiceUUIDThingySound = NewUUID([16]byte{0xef, 0x68, 0x05, 0x00, 0x9b, 0x35, 0x49, 0x33, 0x9b, 0x10, 0x52, 0xff, 0xa9, 0x74, 0x00, 0x42})

	// ServiceUUIDNordicLEDAndButton - Nordic LED and Button Service
	ServiceUUIDNordicLEDAndButton = NewUUID([16]byte{0x00, 0x00, 0x15, 0x23, 0x12, 0x12, 0xef, 0xde, 0x15, 0x23, 0x78, 0x5f, 0xea, 0xbc, 0xd1, 0x23})

	// ServiceUUIDNordicUART - Nordic UART Service
	ServiceUUIDNordicUART = NewUUID([16]byte{0x6e, 0x40, 0x00, 0x01, 0xb5, 0xa3, 0xf3, 0x93, 0xe0, 0xa9, 0xe5, 0x0e, 0x24, 0xdc, 0xca, 0x9e})

	// ServiceUUIDEddystone - Eddystone
	ServiceUUIDEddystone = New16BitUUID(0xFEAA)

	// ServiceUUIDEddystoneConfiguration - Eddystone Configuration Service
	ServiceUUIDEddystoneConfiguration = NewUUID([16]byte{0xa3, 0xc8, 0x75, 0x00, 0x8e, 0xd3, 0x4b, 0xdf, 0x8a, 0x39, 0xa0, 0x1b, 0xeb, 0xed, 0xe2, 0x95})

	// ServiceUUIDFastPair - Fast Pair Service
	ServiceUUIDFastPair = New16BitUUID(0xFE2C)

	// ServiceUUIDLegacyDFU - Legacy DFU Service
	ServiceUUIDLegacyDFU = NewUUID([16]byte{0x00, 0x00, 0x15, 0x30, 0x12, 0x12, 0xef, 0xde, 0x15, 0x23, 0x78, 0x5f, 0xea, 0xbc, 0xd1, 0x23})

	// ServiceUUIDSecureDFU - Secure DFU Service
	ServiceUUIDSecureDFU = New16BitUUID(0xFE59)

	// ServiceUUIDExperimentalButtonlessDFU - Experimental Buttonless DFU Service
	ServiceUUIDExperimentalButtonlessDFU = NewUUID([16]byte{0x8e, 0x40, 0x00, 0x01, 0xf3, 0x15, 0x4f, 0x60, 0x9f, 0xb8, 0x83, 0x88, 0x30, 0xda, 0xea, 0x50})

	// ServiceUUIDExposureNotification - Exposure Notification Service
	ServiceUUIDExposureNotification = New16BitUUID(0xFD6F)

	// ServiceUUIDSMP - SMP Service
	ServiceUUIDSMP = NewUUID([16]byte{0x8d, 0x53, 0xdc, 0x1d, 0x1d, 0xb7, 0x4c, 0xd3, 0x86, 0x8b, 0x8a, 0x52, 0x74, 0x60, 0xaa, 0x84})
)
View Source
var DefaultAdapter = &Adapter{
	connectHandler: func(device Addresser, connected bool) {
		return
	},
}

DefaultAdapter is the default adapter on the system. On Linux, it is the first adapter available.

Make sure to call Enable() before using it to initialize the adapter.

Functions

This section is empty.

Types

type Adapter

type Adapter struct {
	// contains filtered or unexported fields
}

func (*Adapter) AddService

func (a *Adapter) AddService(s *Service) error

AddService creates a new service with the characteristics listed in the Service struct.

func (*Adapter) Address added in v0.4.0

func (a *Adapter) Address() (MACAddress, error)

func (*Adapter) Connect

func (a *Adapter) Connect(address Addresser, params ConnectionParams) (*Device, error)

Connect starts a connection attempt to the given peripheral device address.

On Linux and Windows, the IsRandom part of the address is ignored.

func (*Adapter) DefaultAdvertisement

func (a *Adapter) DefaultAdvertisement() *Advertisement

DefaultAdvertisement returns the default advertisement instance but does not configure it.

func (*Adapter) Enable

func (a *Adapter) Enable() (err error)

Enable configures the BLE stack. It must be called before any Bluetooth-related calls (unless otherwise indicated).

func (*Adapter) Scan

func (a *Adapter) Scan(callback func(*Adapter, ScanResult)) error

Scan starts a BLE scan. It is stopped by a call to StopScan. A common pattern is to cancel the scan when a particular device has been found.

On Linux with BlueZ, incoming packets cannot be observed directly. Instead, existing devices are watched for property changes. This closely simulates the behavior as if the actual packets were observed, but it has flaws: it is possible some events are missed and perhaps even possible that some events are duplicated.

func (*Adapter) SetConnectHandler

func (a *Adapter) SetConnectHandler(c func(device Addresser, connected bool))

SetConnectHandler sets a handler function to be called whenever the adaptor connects or disconnects. You must call this before you call adaptor.Connect() for centrals or adaptor.Start() for peripherals in order for it to work.

func (*Adapter) StopScan

func (a *Adapter) StopScan() error

StopScan stops any in-progress scan. It can be called from within a Scan callback to stop the current scan. If no scan is in progress, an error will be returned.

type Address

type Address struct {
	MACAddress
}

Address contains a Bluetooth MAC address.

type Addresser

type Addresser interface {
	// String of the address
	String() string

	// Set the address
	Set(val string)

	// Is this address a random address?
	// Bluetooth addresses are roughly split in two kinds: public
	// (IEEE-assigned) addresses and random (not IEEE assigned) addresses.
	// "Random" here doesn't mean it is exactly random but at least it looks
	// random. Sometimes, it contains a hash.
	// For more information:
	// https://www.novelbits.io/bluetooth-address-privacy-ble/
	// Set the address
	SetRandom(bool)
	IsRandom() bool
}

Addresser contains a Bluetooth address, which is a MAC address plus some extra information.

type Advertisement struct {
	// contains filtered or unexported fields
}

Advertisement encapsulates a single advertisement instance.

func (*Advertisement) Configure

func (a *Advertisement) Configure(options AdvertisementOptions) error

Configure this advertisement.

On Linux with BlueZ, it is not possible to set the advertisement interval.

func (*Advertisement) Start

func (a *Advertisement) Start() error

Start advertisement. May only be called after it has been configured.

type AdvertisementFields

type AdvertisementFields struct {
	// The LocalName part of the advertisement (either the complete local name
	// or the shortened local name).
	LocalName string

	// ServiceUUIDs are the services (16-bit or 128-bit) that are broadcast as
	// part of the advertisement packet, in data types such as "complete list of
	// 128-bit UUIDs".
	ServiceUUIDs []UUID
}

AdvertisementFields contains advertisement fields in structured form.

type AdvertisementOptions

type AdvertisementOptions struct {
	// The (complete) local name that will be advertised. Optional, omitted if
	// this is a zero-length string.
	LocalName string

	// ServiceUUIDs are the services (16-bit or 128-bit) that are broadcast as
	// part of the advertisement packet, in data types such as "complete list of
	// 128-bit UUIDs".
	ServiceUUIDs []UUID

	// Interval in BLE-specific units. Create an interval by using NewDuration.
	Interval Duration
}

AdvertisementOptions configures an advertisement instance. More options may be added over time.

type AdvertisementPayload

type AdvertisementPayload interface {
	// LocalName is the (complete or shortened) local name of the device.
	// Please note that many devices do not broadcast a local name, but may
	// broadcast other data (e.g. manufacturer data or service UUIDs) with which
	// they may be identified.
	LocalName() string

	// HasServiceUUID returns true whether the given UUID is present in the
	// advertisement payload as a Service Class UUID. It checks both 16-bit
	// UUIDs and 128-bit UUIDs.
	HasServiceUUID(UUID) bool

	// Bytes returns the raw advertisement packet, if available. It returns nil
	// if this data is not available.
	Bytes() []byte
}

AdvertisementPayload contains information obtained during a scan (see ScanResult). It is provided as an interface as there are two possible implementations: an implementation that works with raw data (usually on low-level BLE stacks) and an implementation that works with structured data.

type Characteristic

type Characteristic struct {
	// contains filtered or unexported fields
}

Characteristic is a single characteristic in a service. It has an UUID and a value.

func (*Characteristic) Write

func (c *Characteristic) Write(p []byte) (n int, err error)

Write replaces the characteristic value with a new value.

type CharacteristicConfig

type CharacteristicConfig struct {
	Handle *Characteristic
	UUID
	Value      []byte
	Flags      CharacteristicPermissions
	WriteEvent func(client Connection, offset int, value []byte)
}

CharacteristicConfig contains some parameters for the configuration of a single characteristic.

The Handle field may be nil. If it is set, it points to a characteristic handle that can be used to access the characteristic at a later time.

type CharacteristicPermissions

type CharacteristicPermissions uint8

CharacteristicPermissions lists a number of basic permissions/capabilities that clients have regarding this characteristic. For example, if you want to allow clients to read the value of this characteristic (a common scenario), set the Read permission.

const (
	CharacteristicBroadcastPermission CharacteristicPermissions = 1 << iota
	CharacteristicReadPermission
	CharacteristicWriteWithoutResponsePermission
	CharacteristicWritePermission
	CharacteristicNotifyPermission
	CharacteristicIndicatePermission
)

Characteristic permission bitfields.

func (CharacteristicPermissions) Broadcast

func (p CharacteristicPermissions) Broadcast() bool

Broadcast returns whether broadcasting of the value is permitted.

func (CharacteristicPermissions) Read

Read returns whether reading of the value is permitted.

func (CharacteristicPermissions) Write

func (p CharacteristicPermissions) Write() bool

Write returns whether writing of the value with Write Request is permitted.

func (CharacteristicPermissions) WriteWithoutResponse

func (p CharacteristicPermissions) WriteWithoutResponse() bool

WriteWithoutResponse returns whether writing of the value with Write Command is permitted.

type Connection

type Connection uint16

Connection is a numeric identifier that indicates a connection handle.

type ConnectionParams

type ConnectionParams struct {
	// The timeout for the connection attempt. Not used during the rest of the
	// connection. If no duration is specified, a default timeout will be used.
	ConnectionTimeout Duration

	// Minimum and maximum connection interval. The shorter the interval, the
	// faster data can travel between both devices but also the more power they
	// will draw. If no intervals are specified, a default connection interval
	// will be used.
	MinInterval Duration
	MaxInterval Duration
}

ConnectionParams are used when connecting to a peripherals.

type Device

type Device struct {
	// contains filtered or unexported fields
}

Device is a connection to a remote peripheral.

func (*Device) Disconnect added in v0.2.0

func (d *Device) Disconnect() error

Disconnect from the BLE device. This method is non-blocking and does not wait until the connection is fully gone.

func (*Device) DiscoverServices

func (d *Device) DiscoverServices(uuids []UUID) ([]DeviceService, error)

DiscoverServices starts a service discovery procedure. Pass a list of service UUIDs you are interested in to this function. Either a slice of all services is returned (of the same length as the requested UUIDs and in the same order), or if some services could not be discovered an error is returned.

Passing a nil slice of UUIDs will return a complete list of services.

On Linux with BlueZ, this just waits for the ServicesResolved signal (if services haven't been resolved yet) and uses this list of cached services.

type DeviceCharacteristic

type DeviceCharacteristic struct {
	// contains filtered or unexported fields
}

DeviceCharacteristic is a BLE characteristic on a connected peripheral device.

func (DeviceCharacteristic) EnableNotifications

func (c DeviceCharacteristic) EnableNotifications(callback func(buf []byte)) error

EnableNotifications enables notifications in the Client Characteristic Configuration Descriptor (CCCD). This means that most peripherals will send a notification with a new value every time the value of the characteristic changes.

func (*DeviceCharacteristic) Read added in v0.2.0

func (c *DeviceCharacteristic) Read(data []byte) (int, error)

Read reads the current characteristic value.

func (*DeviceCharacteristic) UUID

func (c *DeviceCharacteristic) UUID() UUID

UUID returns the UUID for this DeviceCharacteristic.

func (DeviceCharacteristic) WriteWithoutResponse

func (c DeviceCharacteristic) WriteWithoutResponse(p []byte) (n int, err error)

WriteWithoutResponse replaces the characteristic value with a new value. The call will return before all data has been written. A limited number of such writes can be in flight at any given time. This call is also known as a "write command" (as opposed to a write request).

type DeviceService

type DeviceService struct {
	// contains filtered or unexported fields
}

DeviceService is a BLE service on a connected peripheral device.

func (*DeviceService) DiscoverCharacteristics

func (s *DeviceService) DiscoverCharacteristics(uuids []UUID) ([]DeviceCharacteristic, error)

DiscoverCharacteristics discovers characteristics in this service. Pass a list of characteristic UUIDs you are interested in to this function. Either a list of all requested services is returned, or if some services could not be discovered an error is returned. If there is no error, the characteristics slice has the same length as the UUID slice with characteristics in the same order in the slice as in the requested UUID list.

Passing a nil slice of UUIDs will return a complete list of characteristics.

func (*DeviceService) UUID

func (s *DeviceService) UUID() UUID

UUID returns the UUID for this DeviceService.

type Duration

type Duration uint16

Duration is the unit of time used in BLE, in 0.625µs units. This unit of time is used throughout the BLE stack.

func NewDuration

func NewDuration(interval time.Duration) Duration

NewDuration returns a new Duration, in units of 0.625µs. It is used both for advertisement intervals and for connection parameters.

type MAC

type MAC [6]byte

MAC represents a MAC address, in little endian format.

func ParseMAC

func ParseMAC(s string) (mac MAC, err error)

ParseMAC parses the given MAC address, which must be in 11:22:33:AA:BB:CC format. If it cannot be parsed, an error is returned.

func (MAC) String

func (mac MAC) String() string

String returns a human-readable version of this MAC address, such as 11:22:33:AA:BB:CC.

type MACAddress

type MACAddress struct {
	// MAC address of the Bluetooth device.
	MAC
	// contains filtered or unexported fields
}

MACAddress contains a Bluetooth address which is a MAC address.

func (MACAddress) IsRandom

func (mac MACAddress) IsRandom() bool

IsRandom if the address is randomly created.

func (MACAddress) Set

func (mac MACAddress) Set(val string)

Set the address

func (MACAddress) SetRandom

func (mac MACAddress) SetRandom(val bool)

SetRandom if is a random address.

type ScanResult

type ScanResult struct {
	// Bluetooth address of the scanned device.
	Address Addresser

	// RSSI the last time a packet from this device has been received.
	RSSI int16

	// The data obtained from the advertisement data, which may contain many
	// different properties.
	// Warning: this data may only stay valid until the next event arrives. If
	// you need any of the fields to stay alive until after the callback
	// returns, copy them.
	AdvertisementPayload
}

ScanResult contains information from when an advertisement packet was received. It is passed as a parameter to the callback of the Scan method.

type Service

type Service struct {
	UUID
	Characteristics []CharacteristicConfig
	// contains filtered or unexported fields
}

Service is a GATT service to be used in AddService.

type UUID

type UUID [4]uint32

UUID is a single UUID as used in the Bluetooth stack. It is represented as a [4]uint32 instead of a [16]byte for efficiency.

func New16BitUUID

func New16BitUUID(shortUUID uint16) UUID

New16BitUUID returns a new 128-bit UUID based on a 16-bit UUID.

Note: only use registered UUIDs. See https://www.bluetooth.com/specifications/gatt/services/ for a list.

func NewUUID

func NewUUID(uuid [16]byte) UUID

NewUUID returns a new UUID based on the 128-bit (or 16-byte) input.

func ParseUUID

func ParseUUID(s string) (uuid UUID, err error)

ParseUUID parses the given UUID, which must be in 00001234-0000-1000-8000-00805f9b34fb format. This means that it cannot (yet) parse 16-bit UUIDs unless they are serialized as a 128-bit UUID. If the UUID cannot be parsed, an error is returned. It will always successfully parse UUIDs generated by UUID.String().

func (UUID) Bytes

func (uuid UUID) Bytes() [16]byte

Bytes returns a 16-byte array containing the raw UUID.

func (UUID) Get16Bit

func (uuid UUID) Get16Bit() uint16

Get16Bit returns the 16-bit version of this UUID. This is only valid if it actually is a 16-bit UUID, see Is16Bit.

func (UUID) Is16Bit

func (uuid UUID) Is16Bit() bool

Is16Bit returns whether this UUID is a 16-bit BLE UUID.

func (UUID) Is32Bit

func (uuid UUID) Is32Bit() bool

Is32Bit returns whether this UUID is a 32-bit or 16-bit BLE UUID.

func (UUID) Replace16BitComponent

func (uuid UUID) Replace16BitComponent(component uint16) UUID

Replace16BitComponent returns a new UUID where bits 16..32 have been replaced with the bits given in the argument. These bits are the same bits that vary in the 16-bit compressed UUID form.

This is especially useful for the Nordic SoftDevice, because it is able to store custom UUIDs more efficiently when only these bits vary between them.

func (UUID) String

func (uuid UUID) String() string

String returns a human-readable version of this UUID, such as 00001234-0000-1000-8000-00805f9b34fb.

Directories

Path Synopsis
examples
circuitplay
This example is intended to be used with the Adafruit Circuitplay Bluefruit board.
This example is intended to be used with the Adafruit Circuitplay Bluefruit board.
discover
This example scans and then connects to a specific Bluetooth peripheral and then displays all of the services and characteristics.
This example scans and then connects to a specific Bluetooth peripheral and then displays all of the services and characteristics.
heartrate-monitor
This example scans and then connects to a specific Bluetooth peripheral that can provide the Heart Rate Service (HRS).
This example scans and then connects to a specific Bluetooth peripheral that can provide the Heart Rate Service (HRS).
Package rawterm provides some sort of raw terminal interface, both on hosted systems and baremetal.
Package rawterm provides some sort of raw terminal interface, both on hosted systems and baremetal.
Package winbt provides a thin layer over the WinRT Bluetooth interfaces.
Package winbt provides a thin layer over the WinRT Bluetooth interfaces.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL