Hello. Having a hard time with this one.
The Apple Media Service is documented here (1). It seems like an elegant and simply system to control audio over BLE with a custom hardware solution.
I have set up various boards I have, including Arduino Nano BLE and Adafruit Huzzah ESP32, using fairly straightforward scripts.
This "device" I am building then should show up on the iPhone > Settings App > Bluetooth > Other Devices. I should able to connect to the device, and have it get media information from the iPhone and be able to control it
What happens is a bit odd. First nothing shows up in Other Devices. I then use a BLE integrator app like BLE Scanner, and it shows up as Arduino (despite what I name it). I can connect to it, and interesting it lists APPLE MEDIA as a service UUID (which is correct!).
Now if I go back to Settings App > Bluetooth, because I have connected to my device with BLE Scanner, it shows as connected and under "My Devices" ! However it doesn't work, no audio is controlled. As a test I tried flicking the Play Pause characteristic but it does nothing (can see it in the Arduino code below where it flips every 4 second).
Is there an example of using Apple Media Device BLE control? I found one using MicroPython but I don't want to use micropython, and I am not sure what I am doing different.
The Arduino code is here. I have been trying to get this to work for a while now, using many, many different boards / chips. Any help is appreciated:
BLEService mediaService("89D3502B-0F36-433A-8EF4-C502AD55F8DC");
BLEUnsignedCharCharacteristic audioControlChar("9B3C81D8-57B1-4A8A-B8DF-0E56F7CA51C2", BLEWrite | BLENotify);
BLEUnsignedCharCharacteristic entityUpdateChar("2F7CABCE-808D-411F-9A0C-BB92BA96C102", BLEWrite | BLENotify);
BLEUnsignedCharCharacteristic entityAttributeChar("C6B2F38C-23AB-46D8-A6AB-A3A870BBD5D7", BLEWrite | BLERead);
int playPauseSwitch = 1; // for now flip between 0 (pause) and play (1) on 9B3C81D8 characteristic, every 4 seconds
long previousMillis = 0; // count for test to flip play pause
void setup() {
Serial.begin(9600);
while (!Serial);
pinMode(LED_BUILTIN, OUTPUT);
// begin initialization
if (!BLE.begin()) {
Serial.println("starting BLE failed!");
while (1);
}
BLE.setLocalName("MediaController");
mediaService.addCharacteristic(audioControlChar);
mediaService.addCharacteristic(entityUpdateChar);
mediaService.addCharacteristic(entityAttributeChar);
BLE.setAdvertisedService(mediaService); // add the service UUID
BLE.addService(mediaService);
BLE.advertise();
Serial.println("Bluetooth device active, waiting for connections...");
}
void loop() {
// wait for a BLE central
BLEDevice central = BLE.central();
// if a central is connected to the peripheral:
if (central) {
Serial.print("Connected to central: ");
// print the central's BT address:
Serial.println(central.address());
// turn on the LED to indicate the connection:
digitalWrite(LED_BUILTIN, HIGH);
while (central.connected()) {
long currentMillis = millis();
// For now flip play pause characteristics every 4 seconds
if (currentMillis - previousMillis >= 4000) {
previousMillis = currentMillis;
flipPlayPause();
}
}
// when the central disconnects, turn off the LED:
digitalWrite(LED_BUILTIN, LOW);
Serial.print("Disconnected from central: ");
Serial.println(central.address());
}
}
void flipPlayPause() {
if (playPauseSwitch == 0) {
playPauseSwitch = 1;
} else {
playPauseSwitch = 0;
}
audioControlChar.writeValue(playPauseSwitch);
}
(1) - Apple BLE Media Service https://developer.apple.com/library/archive/documentation/CoreBluetooth/Reference/AppleMediaService_Reference/Introduction/Introduction.html#//apple_ref/doc/uid/TP40014716-CH2-SW1