Цель
Я разрабатываю простое устройство под управлением Linux. Он поддерживает BLE, и в настоящее время я использую bluez 5.8.
Я хочу активировать действие на этом устройстве с помощью iPhone.
Что уже работает:
- Я могу заставить iPhone "видеть" устройство.
- iPhone также подключается к устройству.
Я устанавливаю устройство Bluetooth как это на linux (спасибо этот вопрос):
# activate bluetooth
hciconfig hci0 up
# set advertise data: "hello world"
hcitool -i hci0 cmd 0x08 0x0008 48 45 4c 4c 4f 57 4f 52 4c 44
# start advertising as connectable
hciconfig hci0 leadv 0
Код iOS прост:
- (int) scanForPeripherals
{
if (self->centralManager.state != CBCentralManagerStatePoweredOn) {
return -1;
}
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO], CBCentralManagerScanOptionAllowDuplicatesKey, nil];
[self.centralManager scanForPeripheralsWithServices:nil options:options];
return 0;
}
- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{
if (central.state == CBCentralManagerStatePoweredOn) {
NSLog(@"Starting scan");
[self scanForPeripherals];
}
}
- (void) centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{
NSLog(@"didDiscoverPeripheral");
/*
* Retain the peripheral to avoid the error:
* CoreBluetooth[WARNING]: state = connecting> is being dealloc'ed while connecting
*/
self.activePeripheral = peripheral;
[centralManager connectPeripheral:peripheral options:nil];
}
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
{
NSLog(@"Connected to peripheral");
/* discover all services */
[peripheral discoverServices:nil];
}
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error
{
NSLog(@"Discovered services");
for (CBService *service in peripheral.services) {
NSLog(@"Discovered service %@", service);
}
}
При запуске этого кода на iPhone я получаю этот журнал:
2013-12-19 12:53:22.609 Test2[18518:60b] Starting scan
2013-12-19 12:53:29.945 Test2[18518:60b] didDiscoverPeripheral
2013-12-19 12:53:31.230 Test2[18518:60b] Connected to peripheral
Итак, кажется, что iPhone подключается нормально, но не видит никакой службы.
Что мне не хватает
- Мне нужно рекламировать простой сервис BLE, но я не могу найти документацию о том, как это сделать в bluez.
- Думаю, мне нужно что-то вроде gatt-сервера для получения характеристик чтения/записи для сервиса, который я бы рекламировал. Я видел файл plugins/gatt-example.c в bluez, но я понятия не имею, как его использовать: документации нет.
Возможно, я должен упомянуть, что я видел этот вопрос: Создание gatt-сервера, но ответы задают слишком много вопросов (например, где GATT api для bluez? Как установить базу данных GATT? Как зарегистрироваться для событий чтения/записи?)
EDIT: Команды, которые я использую, только настраивают устройство BLE для рекламы некоторых данных, но iOS сообщает, что соединение принято. Какая часть bluez принимает входящие соединения?