Bluez: werben service / gatt-server-Beispiel?
Ziel
Ich bin die Dritte ein einfaches Gerät mit Linux. Es ist BLE-fähig ist, und ich bin derzeit mit bluez 5.8.
Ich möchte eine Aktion auslösen, auf dieses Gerät mit einem iPhone.
Was bereits funktioniert:
- Ich kann das iPhone "sieht" das Gerät.
- Das iPhone verbindet sich auch das Gerät.
Richte ich das bluetooth-Gerät, wie unter linux (Dank diese Frage):
# 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
Des iOS-Codes ist einfach:
- (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);
}
}
Wenn Sie diesen code ausführen auf dem iPhone, ich bekomme dieses Protokoll:
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
So scheint es, dass das iPhone verbindet feine, aber nicht sehen, jeden Dienst.
Was ich bin fehlt
- Ich brauche, um Werbung für eine einfache BLE serviceaber ich finde keine Dokumentation, wie dies zu tun in bluez .
- Ich glaube, ich brauche so etwas wie eine gatt-server zu erhalten, Lesen/schreiben von Eigenschaften für den Dienst, den ich bewerben würde. Ich sah die plugins/gatt-Beispiel.c-Datei in bluez, aber ich habe absolut keine Idee, wie es zu benutzen: es gibt keine Dokumentation.
Vielleicht sollte ich erwähnen, dass ich sah diese Frage: Erstellen eines gatt-serveraber die Antworten erheben zu viel Fragen (z.B. wo ist die GATT-api für bluez? wie die GATT-Datenbank? Wie registrieren Sie sich für lese - /Schreibvorgänge?)
BEARBEITEN:
Die Befehle, die ich verwenden Sie nur die set-up-die BLE-Gerät zu werben, einige Daten, aber iOS meldet, dass die Verbindung akzeptiert. Welchen Teil von bluez ist das akzeptieren von eingehenden verbindungen?
InformationsquelleAutor der Frage Gilles Gregoire | 2013-12-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schließlich entdeckte ich die Antworten auf all die Fragen, die ich hatte.
Beginnen werde ich mit der Beantwortung der letzten Frage:
Die Befehle, die ich verwenden Sie nur die set-up-die BLE-Gerät zu werben, einige Daten, aber iOS meldet, dass die Verbindung akzeptiert. Welchen Teil von bluez ist das akzeptieren von eingehenden verbindungen?
Dieser war beantwortet auf der bluez mailing-Listein Reaktion auf mich.
Zusammenfassung: das BLE-Verbindung ist angenommen auf der HCI-Ebene, die durch den kernel. Wenn Sie möchten, dass die Verbindung von user-space benötigen Sie ein l2cap socket mit der ATT-channel-ID (die ist 4).
Bleno hat ein gutes Beispiel für die Verwendung eines L2CAP socket.
Wie ein L2CAP socket arbeitet, ist im Grunde wie diese:
Wie Sie Werbung für ein service?
Erkannte ich, ich brauchte eine Antwort auf die Vorherige Frage eine Antwort zu geben.
Einmal Lesen Sie die Daten über L2CAP socket, alles was mehr Sinn macht, zum Beispiel, wenn Sie Ihr Android-Telefon nicht
gatt.discoverServices()
dann das kleine Programm oben Lesen (also empfangen):Was im Grunde bedeutet:
Diese Anforderung ist der Weg zu einer BLE-Peripheriegerät anfordern der Liste der Dienste.
Dann können Sie beantworten diese Anfrage mit der Liste der Dienstleistungen, die Ihr Gerät bietet, formatiert entsprechend den GATT-Protokoll.
Wieder, sehen Sie die Implementierung dieser in Bleno.
InformationsquelleAutor der Antwort Gilles Gregoire
Du bist wirklich in der Nähe.
Zu sehen, die die Dienste auf einem Gerät mit Ihrem iOS-code, versuchen Sie,
Ihrem
didConnectPeripheral
vor derdiscoverServices
nennen. Ich habe welche aus der Apple-Dokumentation und es Feste Dinge, die für mich (nur nicht vergessen, hinzuzufügenCBPeripheralDelegate
zu der interface-Deklaration in der header-Datei). Ohne SiedidDiscoverServices
wird nie aufgerufen werden.War ich in der Lage, um die
gatt-example
service plugin zu laufen, durch das kompilieren von BlueZ von der Quelle mit der./configure --enable-maintainer-mode
. Dann starten Siebluetoothd -nd
du wirst sehen, so etwas wiein der Nähe der Spitze der Ausgabe, und dann
In diesem Punkt, meine iOS-app war in der Lage, um zu sehen, die BlueZ
peripheral
verbinden, und entdecken Sie seine Dienste (nach einemhciconfig hci0 leadv
).InformationsquelleAutor der Antwort Gabriel