Platforms to show: All Mac Windows Linux Cross-Platform
/Bluetooth/Mac Bluetooth/Bluetooth LE Heart Rate Mac
Required plugins for this example: MBS Bluetooth Plugin, MBS MacBase Plugin, MBS Main Plugin
You find this example project in your Plugins Download as a Xojo project file within the examples folder: /Bluetooth/Mac Bluetooth/Bluetooth LE Heart Rate Mac
This example is the version from Thu, 29th Jul 2020.
Project "Bluetooth LE Heart Rate Mac.xojo_binary_project"
Class App Inherits Application
Const kEditClear = "&Delete"
Const kFileQuit = "&Quit"
Const kFileQuitShortcut = ""
End Class
Class MainWindow Inherits Window
Control List Inherits Listbox
ControlInstance List Inherits Listbox
End Control
EventHandler Sub Open()
centralManager = new CBCentralManager
centralManager.list = list
End EventHandler
Property centralManager As CBCentralManager
End Class
MenuBar MainMenuBar
MenuItem FileMenu = "&File"
MenuItem FileQuit = "#App.kFileQuit"
MenuItem EditMenu = "&Edit"
MenuItem EditUndo = "&Undo"
MenuItem EditSeparator1 = "-"
MenuItem EditCut = "Cu&t"
MenuItem EditCopy = "&Copy"
MenuItem EditPaste = "&Paste"
MenuItem EditClear = "#App.kEditClear"
MenuItem EditSeparator2 = "-"
MenuItem EditSelectAll = "Select &All"
End MenuBar
Class CBCentralManager Inherits CBCentralManagerMBS
EventHandler Sub DidConnectPeripheral(peripheral as CBPeripheralMBS)
list.Log CurrentMethodName+": "+peripheral.Name
// make new object, so we catch events
dim p as new CBPeripheral(peripheral)
p.list = list
peripherals.append p
dim serviceUUIDs() as CBUUIDMBS
serviceUUIDs.Append CBUUIDMBS.UUIDWithString("180D")
// discoverServices with no array to get all services
p.discoverServices serviceUUIDs
End EventHandler
EventHandler Sub DidDisconnectPeripheral(peripheral as CBPeripheralMBS, error as NSErrorMBS)
list.Log CurrentMethodName
if error <> nil then
list.Log "Error: "+error.LocalizedDescription
end if
connectedPeripheral = nil
End EventHandler
EventHandler Sub DidDiscoverPeripheral(peripheral as CBPeripheralMBS, advertisementData as Dictionary, RSSI as String)
Dim Name As String = peripheral.name
list.Log CurrentMethodName+": "+RSSI+" "+Name
if Name <> "iPhone" and connectedPeripheral = nil then
// make new object
dim p as new CBPeripheral(peripheral)
p.list = list
connectedPeripheral = p
self.connectPeripheral p
end if
End EventHandler
EventHandler Sub DidFailToConnectPeripheral(peripheral as CBPeripheralMBS, error as NSErrorMBS)
list.Log CurrentMethodName
if error <> nil then
list.Log "Error: "+error.LocalizedDescription
end if
End EventHandler
EventHandler Sub DidUpdateState()
Select case state
case me.kStatePoweredOff
list.Log CurrentMethodName+": PoweredOff"
case me.kStatePoweredOn
list.Log CurrentMethodName+": PoweredOn"
case me.kStateResetting
list.Log CurrentMethodName+": Resetting"
case me.kStateUnauthorized
list.Log CurrentMethodName+": Unauthorized"
case me.kStateUnknown
list.Log CurrentMethodName+": Unknown"
case me.kStateUnsupported
list.Log CurrentMethodName+": Unsupported"
else
list.Log CurrentMethodName+": ?"
end Select
if me.State = me.CBCentralManagerStatePoweredOn then
list.Log "State changed to poweredOn"
dim serviceUUIDs() as CBUUIDMBS
serviceUUIDs.Append CBUUIDMBS.UUIDWithString("180D")
// already found it?
dim lastPeripherals() as CBPeripheralMBS = me.retrieveConnectedPeripheralsWithServices(serviceUUIDs)
if lastPeripherals.ubound >= 0 then
dim device as CBPeripheralMBS = lastPeripherals(lastPeripherals.ubound)
dim p as new CBPeripheral(device)
peripherals.Append p
me.connectPeripheral p
else
// look for it
me.scanForPeripheralsWithServices serviceUUIDs
end if
end if
End EventHandler
Property connectedPeripheral As CBPeripheral
Property list As listbox
Property peripherals() As CBPeripheral
End Class
Class CBPeripheral Inherits CBPeripheralMBS
EventHandler Sub DidDiscoverCharacteristicsForService(service as CBServiceMBS, error as NSErrorMBS)
list.Log CurrentMethodName
dim ServiceUUID as string = service.UUID.UUIDString
if ServiceUUID = "180D" then
dim characteristics() as CBCharacteristicMBS = service.characteristics
for each characteristic as CBCharacteristicMBS in characteristics
select case characteristic.UUID.UUIDString
case "2A37"
// Set notification on heart rate measurement
list.Log "Found a Heart Rate Measurement Characteristic"
me.setNotifyValue(true, characteristic)
case "2A38"
// Read body sensor location
list.Log "Found a Body Sensor Location Characteristic"
me.readValueForCharacteristic(characteristic)
case "2A39"
// Write heart rate control point
list.Log "Found a Heart Rate Control Point Characteristic"
dim data as new MemoryBlock(1)
data.UInt8Value(0) = 1
me.writeValue(data, characteristic, CBCharacteristicMBS.kPropertyWriteWithoutResponse)
end Select
next
end if
if error <> nil then
list.Log "Error: "+error.LocalizedDescription
end if
End EventHandler
EventHandler Sub DidDiscoverDescriptorsForCharacteristic(characteristic as CBCharacteristicMBS, error as NSErrorMBS)
list.Log CurrentMethodName
if error <> nil then
list.Log "Error: "+error.LocalizedDescription
end if
End EventHandler
EventHandler Sub DidDiscoverIncludedServicesForService(service as CBServiceMBS, error as NSErrorMBS)
list.Log CurrentMethodName
if error <> nil then
list.Log "Error: "+error.LocalizedDescription
end if
End EventHandler
EventHandler Sub DidDiscoverServices(error as NSErrorMBS)
list.Log CurrentMethodName
if error <> nil then
list.Log "Error: "+error.LocalizedDescription
end if
dim services() as CBServiceMBS = me.services
for each service as CBServiceMBS in Services
list.Log "Service found: "+service.UUID.UUIDString
me.discoverCharacteristics service
next
End EventHandler
EventHandler Sub DidUpdateName()
list.Log CurrentMethodName+": "+me.name
End EventHandler
EventHandler Sub DidUpdateNotificationStateForCharacteristic(characteristic as CBCharacteristicMBS, error as NSErrorMBS)
list.Log CurrentMethodName
if error <> nil then
list.Log "Error: "+error.LocalizedDescription
end if
End EventHandler
EventHandler Sub DidUpdateRSSI(error as NSErrorMBS)
list.Log CurrentMethodName
if error <> nil then
list.Log "Error: "+error.LocalizedDescription
end if
End EventHandler
EventHandler Sub DidUpdateValueForCharacteristic(characteristic as CBCharacteristicMBS, error as NSErrorMBS)
list.Log CurrentMethodName
if error <> nil then
list.Log "Error: "+error.LocalizedDescription
end if
select case characteristic.UUID.UUIDString
case "2A37"
update(characteristic.value)
end Select
End EventHandler
EventHandler Sub DidUpdateValueForDescriptor(descriptor as CBDescriptorMBS, error as NSErrorMBS)
list.Log CurrentMethodName
if error <> nil then
list.Log "Error: "+error.LocalizedDescription
end if
End EventHandler
EventHandler Sub DidWriteValueForCharacteristic(characteristic as CBCharacteristicMBS, error as NSErrorMBS)
list.Log CurrentMethodName
if error <> nil then
list.Log "Error: "+error.LocalizedDescription
end if
End EventHandler
EventHandler Sub DidWriteValueForDescriptor(descriptor as CBDescriptorMBS, error as NSErrorMBS)
list.Log CurrentMethodName
if error <> nil then
list.Log "Error: "+error.LocalizedDescription
end if
End EventHandler
Sub update(data as MemoryBlock)
if data.size >= 2 then
dim bpm as integer
if BitwiseAnd(data.UInt8Value(0), 1) = 0 then
bpm = data.uint8Value(1)
else
bpm = data.uint8Value(1) * 256 + data.uint8Value(2)
end if
list.Log "BPM: "+str(bpm)
end if
End Sub
Property list As listbox
End Class
Module Module1
Sub Log(extends l as listbox, row as string)
l.AddRow row
// scroll at bottom
l.ScrollPosition = l.ListCount
End Sub
End Module
ExternalFile info
End ExternalFile
End Project
See also:
The items on this page are in the following plugins: MBS Bluetooth Plugin.