TorBluez: Werben Service/Gatt-Server Beispiel?
Ich bin ein einfaches Gerät developping Linux läuft. Es ist BLE-fähig, und ich verwende derzeit Bluez 5.8.
Ich möchte eine Aktion auf diesem Gerät mit einem iPhone auslösen.
Was bereits funktioniert:
- kann ich das iPhone machen "sehen" das Gerät aus.
- Das iPhone verbindet sich auch mit dem Gerät.
ich Setup die Bluetooth-Gerät wie dieses auf Linux (dank this question):
# 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
Der iOS-Code 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 auf dem iPhone diesen Code ausgeführt wird, ich Holen Sie sich 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 ist es scheint, dass das iPhone gut verbindet, sieht aber keinen Dienst.
Was mir fehlt
- Ich brauche einen einfachen BLE Service, zu werben, aber ich kann keine Dokumentation finden, wie dies in bluez zu tun.
- Ich glaube, ich brauche so etwas wie einen Gatt-Server, um Lese-/Schreibeigenschaften für den Dienst zu erhalten, den ich annoncieren würde. Ich habe die Datei plugins/gatt-example.c in bluez gesehen, aber ich habe absolut keine Ahnung, wie man sie benutzt: Es gibt keine Dokumentation.
Ich soll wohl erwähnen, dass ich diese Frage sah:? Creating a gatt server, aber die Antworten erhöhen zu viele Fragen (zum Beispiel, wo der GATT api für bluez wie die GATT-Datenbank festlegen, wie für Lese registrieren/Ereignisse schreiben)
EDIT: die Befehle ich verwende nur die BLE Gerät set-up einige Daten zu werben, aber iOS berichtet, dass die Verbindung akzeptiert. Welcher Teil von Bluez akzeptiert eingehende Verbindungen?
Sie haben Recht, Sie brauchen einen GATT-Server. Die Befehle, die Sie ausführen, richten nur die Hardware ein, um ein Werbepaket zu übertragen, aber nichts startet etwas, mit dem man sich verbinden kann. Leider muss ich noch herausfinden, wie ich einen GATT-Server selbst einrichten kann, damit ich Ihnen nicht helfen kann ... –
@TimTisdall Ich weiß, dass diese Befehle keinen Server einrichten. Und das wirft die Frage auf: Wer akzeptiert die Bluetooth-Verbindung? Ich habe meinen Beitrag bearbeitet, um diese Frage klarzustellen. –
Meine Vermutung ist, dass etwas im Kernel die Verbindung herstellt, aber es ist nur eine Vermutung. –