fitnesskit/bluetoothmessageprotocol
[Docs](https://fitnesskit.github.io/BluetoothMessageProtocol/)
Installation
BluetoothMessageProtocol is available through CocoaPods. To install it, simply add the following line to your Podfile:
pod 'BluetoothMessageProtocol'Swift Package Manager:
dependencies: [
.package(url: "https://github.com/FitnessKit/BluetoothMessageProtocol", from: "2.0.1")
]How to Use
Services
The Service class helps to describe a BLE Service. There is no assumption to which Characteristics the Service contains.
Example Using CoreBluetooth:
centralManager.scanForPeripherals(withServices: [CBUUID(string: ServiceHeartRate.uuidString),],
options: [CBCentralManagerScanOptionAllowDuplicatesKey : true])
Supported Services
- BLE SIG Services
- Home Kit Accessory Protocol (HAP)
- BLE Mesh
Characteristic
Each Bluetooth Characteristic has an encode and decode method. When you receive the data from a sensor you call the static decode method to turn the data into a Characteristic Object as seen below in the example:
func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
if let sensorData = characteristic.value {
if characteristic.uuid.uuidString == CharacteristicHeartRateMeasurement.uuidString {
doDecodeHRMess(sensorData: sensorData)
}
if characteristic.uuid.uuidString == CharacteristicBodySensorLocation.uuidString {
doDecodeBody(sensorData: sensorData)
}
}
}
func doDecodeHRMess(sensorData: Data) {
let hrData: Result<CharacteristicHeartRateMeasurement, BluetoothDecodeError> = CharacteristicHeartRateMeasurement.decode(with: sensorData)
switch hrData {
case .success(let char):
print("HR: \(char.heartRate)")
case .failure(let error):
print(error)
}
/// Or you can stil use the doCatch
do {
let hrData = try CharacteristicHeartRateMeasurement.decode(with: sensorData).get()
print("HR: \(hrData.heartRate)")
} catch {
print(error)
}
}
func doDecodeBody(sensorData: Data) {
let sensor: Result<CharacteristicBodySensorLocation, BluetoothDecodeError> = CharacteristicBodySensorLocation.decode(with: sensorData)
switch sensor {
case .success(let char):
print("Location: \(char.sensorLocation.stringValue)")
case .failure(let error):
print(error)
}
/// Or you can stil use the doCatch
do {
let sensor = try CharacteristicBodySensorLocation.decode(with: sensorData).get()
print("Location: \(sensor.sensorLocation.stringValue)")
} catch {
print(error)
}
}Manufacturer Specific Data
Manufacturer Specific data contains a Company Assigned Number and specific data defined by the Manufacturer.
Example using Apple iBeacon:
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
if let advertData = advertisementData[CBAdvertisementDataManufacturerDataKey] as? Data {
switch ManufacturerDataAppleiBeacon.decode(with: advertData) {
case .success(let beacon):
print(beacon.proximityUUID.uuidString)
case .failure(let error):
print(error)
}
/// Or you can stil use the doCatch
if let beacon = try? ManufacturerDataAppleiBeacon.decode(with: advertData).get() {
print(beacon.proximityUUID.uuidString)
}
}
}Manufacturer Specific Data
- Apple iBeacon
- AltBeacon
- HomeKit
- HomeKit Encrypted Notification Advertisement
- Polar Heart Rate
License
BluetoothMessageProtocol is available under the MIT license
Package Metadata
Repository: fitnesskit/bluetoothmessageprotocol
Default branch: master
README: README.md