如何在 Arduino NANO 33 BLE (nRF52) 和 iPad 之间保持活动的 MIDI BLE 连接

问题描述 投票:0回答:2

我正在使用 Arduino Nano 33 BLE 设备实现适用于 iPad 的 BLE MIDI 控制器。下面的代码可以:

  • 使设备作为 BLE MIDI 外设被发现
  • 与 BLE MIDI 中央应用程序建立连接

仅使用 Android 应用程序连接稳定。 每个iOS应用程序(例如Garageband,AUM等)立即关闭连接(arduino板上的LED在几秒钟内打开和关闭),但是如果设备不断发送MIDI消息(看看注释的代码行在 loop() 函数中)连接永远保持活动状态;不幸的是,重复发送消息并不是我想要实现的控制器的目的。

可能需要实施 BLE 服务的特定配置或轮询操作以符合严格的 iOS 标准,但我找不到不包括的 Nano 33 BLE 设备的任何工作解决方案或示例在 loop() 函数中发送注释。

#include <ArduinoBLE.h> byte midiData[] = {0x80, 0x80, 0x00, 0x00, 0x00}; // set up the MIDI service and MIDI message characteristic: BLEService midiService("03B80E5A-EDE8-4B33-A751-6CE34EC4C700"); BLECharacteristic midiCharacteristic("7772E5DB-3868-4112-A1A9-F2669D106BF3", BLEWrite | BLEWriteWithoutResponse | BLENotify | BLERead, sizeof(midiData)); bool midi_connected = false; void setup() { // initialize serial communication Serial.begin(9600); // initialize built in LED: pinMode(LED_BUILTIN, OUTPUT); // Initialize BLE service: if (!BLE.begin()) { Serial.println("starting BLE failed!"); while (true); } BLE.setLocalName("MBLE"); BLE.setAdvertisedService(midiService); BLE.setEventHandler(BLEConnected, onConnected); BLE.setEventHandler(BLEDisconnected, onDisconnected); midiCharacteristic.setEventHandler(BLEWritten, onWritten); midiService.addCharacteristic(midiCharacteristic); BLE.addService(midiService); BLE.setConnectable(true); BLE.setAdvertisingInterval(32); BLE.setConnectionInterval(32, 64); BLE.advertise(); } void loop() { BLEDevice central = BLE.central(); if (central) { // midiCommand(0x90, 60, 127); // delay(250); // midiCommand(0x80, 60, 0); // delay(250); } } void onConnected(BLEDevice central) { digitalWrite(LED_BUILTIN, HIGH); midi_connected = true; } void onDisconnected(BLEDevice central) { digitalWrite(LED_BUILTIN, LOW); midi_connected = false; } void onWritten(BLEDevice central, BLECharacteristic characteristic) { auto buffer = characteristic.value(); auto length = characteristic.valueLength(); if (length > 0) { // echo on the next midi channel midiCommand(buffer[2], buffer[3], buffer[4]); } } void midiCommand(byte cmd, byte data1, byte data2) { midiData[2] = cmd; midiData[3] = data1; midiData[4] = data2; midiCharacteristic.setValue(midiData, sizeof(midiData)); }
    
ios arduino bluetooth-lowenergy midi nrf52
2个回答
1
投票
我(终于)自己找到了一个解决方案,查看 Apple 提供的

MIDI BLE 规范,上面写着

配件应请求 15 ms 或更短的连接间隔。 Apple 建议从请求开始 连接间隔为 11.25 毫秒,如果连接请求被 Apple 拒绝,则连接间隔为 15 毫秒 产品。 高于 15 毫秒的间隔不适合现场播放情况。

及以后

支持蓝牙低功耗 MIDI 的 Apple 设备将在与配件建立连接后尝试读取 MIDI I/O 特性。 [...] 配件应使用没有有效负载的数据包响应初始 MIDI I/O 特征读取。

所以我改变了

setup()函数中的连接间隔

BLE.setConnectionInterval(9, 12);
并在连接事件处理函数中包含几行

void onConnected(BLEDevice central) { digitalWrite(LED_BUILTIN, HIGH); midi_connected = true; midiCharacteristic.setValue(0); }
就是这样!


0
投票
如果有人稍后寻找解决方案,对我来说,我只需要在连接时发送一条消息即可。

© www.soinside.com 2019 - 2024. All rights reserved.