IBeacon und Eddystone Beacon auf die Knie zwingen

  • Tutorial

iBeacon und Eddystone sind Apple- bzw. Google-Dienste, die BLE (Bluetooth Low Energy) für die lokale Positionierung in Innenräumen verwenden. Das Grundprinzip beider Dienste ist das gleiche, nur das Format der übertragenen Daten ist unterschiedlich. Ein Beacon (Sender) sendet periodisch mit einem Intervall von Bruchteilen einer Sekunde bis zu mehreren Sekunden Pakete des Bluetooth LE-Standards, die zusätzlich zum Header zusätzliche Informationen enthalten. Die Technologie soll nicht die Position im Raum genau bestimmen, sondern nur den Moment der Annäherung in einiger Entfernung zum Leuchtturm aufzeichnen.
Ein klassisches Beispiel für die Verwendung von Leuchttürmen sind Museen. Wenn Sie im Museum ankommen, installieren Sie eine spezielle Anwendung auf Ihrem Smartphone und inspizieren die Ausstellung. Nähert sich das Smartphone dem Exponat (Leuchtturm) in einer bestimmten Entfernung, erfasst es dies und zeigt Informationen zu Ausflügen auf dem Bildschirm an.
Sie können viele fertige Beacons kaufen, aber heute werden wir einen Prototyp unseres eigenen Beacons (sowohl iBeacon als auch Eddystone) auf dem Atmel-Mikrocontroller SAML21 und dem BLE-Modul BTLC1000 montieren.

Eisen


Mit diesem Modul werden wir Bluetooth auf Basis der ATBTLC1000-XPRO- Erweiterungskarte implementieren . Als Host verwenden wir den Mikrocontroller ATSAML21J18B , der auf der Debug-Karte ATSAML21-XPRO-B installiert ist


Ein Beispiel für iBeacon generieren


Gehen Sie dazu zum Atmel | Start - Webcode-Konfigurator für Atmel-Mikrocontroller. In einem unserer letzten Artikel haben wir bereits über die Verwendung dieses Tools geschrieben. Klicken Sie auf der Hauptseite auf die Schaltfläche Alle Beispiele durchsuchen und wählen Sie im folgenden Fenster die SAM L21 Xplained Pro- Debug- Karte aus . Bei der Suche geben Sie die ibeacon- Zeile ein . Wir wählen das Beispiel BLE Simple-BTLC1000 aus und klicken auf die Schaltfläche Open Selected Project (Ausgewähltes Projekt öffnen) :


Die Standardkonfiguration entspricht theoretisch der Hardware und muss hier nicht geändert werden. Für alle Fälle können Sie das Ergebnis mit einem Screenshot vergleichen und die Schaltfläche EXPORT PROJECT in der oberen rechten Ecke des Bildschirms drücken :


Wir setzen ein Häkchen vor das Makefile (Standalone) -Element , benennen das Projekt um und drücken den DOWNLOAD PACK- Button :


Als Ergebnis wird eine Datei mit der Erweiterung * .atzip heruntergeladen . Im Prinzip handelt es sich um ein reguläres Archiv, in dem das Projekt für Atmel Studio gespeichert ist. Öffnen Sie die Datei (sie sollte mit dem Studio verknüpft sein) und warten Sie, bis das Projekt startet. Ändern Sie im sich öffnenden Dialogfeld gegebenenfalls den Namen des Projekts und den Pfad zum Ordner mit dem Projekt und klicken Sie auf OK:


Wir warten, bis das Projekt erstellt ist.

Probelauf


Grundsätzlich funktioniert das Out-of-the-Box-Beispiel bereits als iBeacon. Wir versuchen das Projekt mit der F7-Taste zu kompilieren.
Ist die Kompilierung erfolgreich, können Sie das Projekt für die ersten Tests auf den Mikrocontroller hochladen. Ich empfehle Ihnen, vorab ein Terminal-Programm zur Überwachung von Schnäppcheninformationen zu starten. Der integrierte EDBG-Debugger ist im System auch als virtueller COM-Port definiert, an den einer der SERCOMs des Mikrocontrollers angeschlossen ist.Wir


starten unseren bevorzugten Terminalcomputer, stellen die Geschwindigkeit auf 115200 und das Kontrollkästchen DTR ein.

Drücken Sie die Taste F5, um die Firmware einzufügen. Wenn Sie es zum ersten Mal hochladen, werden Sie aufgefordert, den zu verwendenden Programmierer auszuwählen: Geben Sie


im Dialogfeld unseren Debugger an:



Drücken Sie erneut F5 und warten Sie, bis die Steuerung programmiert ist und das Programm gestartet wird. Wenn alles richtig gemacht wurde, sollten Sie im Terminal die folgenden Informationen sehen:


Jetzt starten wir auf Ihrem Telefon jede Anwendung, die mit Beacons funktioniert (zum Beispiel iBeacon & Eddystone Scanner für Android) und wir sollten unser Etikett sehen.


Wir werden uns mit dem Format der übermittelten Daten befassen. Und er ist nach der alten Tradition von Apple sehr einfach. Das Beacon von der Payload überträgt die folgenden Daten:
UUID. Eine eindeutige 128-Bit-ID für eine Gruppe von Beacons, die den Typ oder die Zugehörigkeit zu derselben
Hauptorganisation angibt . 16-Bit-Wert ohne Vorzeichen, mit dem Sie Beacons mit derselben UUID Minor gruppieren können
.16-Bit-Wert ohne Vorzeichen, mit dem Sie Beacons mit derselben UUID und
Hauptmessleistung gruppieren können (Signalpegel 1 m vom Sender entfernt). 8-Bit-Integer mit Vorzeichen - Wert der Anzeige der empfangenen Signalstärke (RSSI), kalibriert in einem Abstand von 1 m vom Empfänger, der zur Bestimmung der Nähe zum Empfänger (Mobilgerät) verwendet wird. Gemessen in dBm.

In der Hauptdatei simple_btlc1000.c ist das Array adv_data definiert , in dem diese Daten abgelegt werden. Darüber hinaus gibt es zusätzliche Dienstprogramminformationen, deren Dekodierung Sie im Dokument Proximity Beacon
Specification
unter developer.apple.com/ibeacon finden .
static uint8_t adv_data[] =
{
0x1a, 0xff, 
0x4c, 0x00,   // Company ID
0x02, 0x15,  // Beacon Type
// Proximity UUID
0x21, 0x8A, 0xF6, 0x52, 0x73, 0xE3, 0x40, 0xB3, 0xB4, 0x1C, 0x19, 0x53, 0x24, 0x2C, 0x72, 0xf4, 
0x00, 0xbb,   // Major
0x00, 0x45,   // Minor 
0xc5   // Measured Power
};

Das Hauptmagische geschieht in der Funktion beacon_init () , die unmittelbar vor der Hauptschleife in main aufgerufen wird. Mit der API-Funktion at_ble_adv_data_set teilen wir dem Modul mit, welche Daten wir übertragen möchten (das Array "very adv_data" ). Mit der Funktion at_ble_adv_start starten wir den Übertragungsvorgang selbst mit der Häufigkeit ihrer Übertragung (BEACON_ADV_INTERVAL).
Funktionscode von Beacon_init ()
static void beacon_init(void)
{
	static at_ble_handle_t service;
	/* establish peripheral database */
	if (at_ble_primary_service_define(&service_uuid, &service, NULL, 0, chars, 2) !=  AT_BLE_SUCCESS)
		DBG_LOG("Failed to define the primary service");
	/* set beacon advertisement data */
	if(at_ble_adv_data_set(adv_data, sizeof(adv_data), scan_rsp_data, sizeof(scan_rsp_data)) != AT_BLE_SUCCESS)
		DBG_LOG("BLE Beacon advertisement data set failed");
	/* BLE start advertisement */
	if(at_ble_adv_start(AT_BLE_ADV_TYPE_UNDIRECTED, AT_BLE_ADV_GEN_DISCOVERABLE, NULL, AT_BLE_ADV_FP_ANY, 
	   BEACON_ADV_INTERVAL, BEACON_ADV_TIMEOUT, BEACON_ABSOLUTE_INTERVAL_ADV) != AT_BLE_SUCCESS)
	{
		DBG_LOG("BLE Beacon advertisement failed");
		ble_device_disconnected_ind();
	}
	else
	{
		DBG_LOG("Advertisement started");		
		ble_device_connected_ind();
	}	
}



Das Projekt für Eddystone-Beacons von Google wiederholen


Dazu muss nur eines getan werden: Ändern Sie das übertragene Datenarray in die Funktion at_ble_adv_data_set . Holen wir uns ein separates Array und füllen es aus. Über Paketformat gelesen werden kann hier . Im Gegensatz zu iBeacon kann Eddystone derzeit drei Arten von Paketen übertragen. Die Typkennung wird in einem der Bytes des Pakets übertragen:


Wir übergeben den Link.
Das Aufnahmeformat des Links selbst ist auf dieser Seite zu sehen .
Link Transfer Format
URL-Schema-Präfix

Eddystone-URL HTTP-URL-Codierung



Hinweis: Die .ru-Domain ist nicht in der Liste der unterstützten Domains enthalten. Ich wollte wirklich, dass der Link live ist, also schreibe ich geektimes.com, weil Es hat eine Weiterleitung von geektimes.ru, aber habrahabr.com leitet sie nicht auf die gleiche Weise an die .ru-Domain weiter.

Als Ergebnis erhalten wir das folgende Paket für Eddystone:
static uint8_t eddystone_data[] =
{
	0x03,
	0x03,
	0xaa, 0xfe,
	0x10,						// длина
	0x16,
	0xaa, 0xfe,					// 16-bit Eddystone UUID
	0x10,						// Frame Type: 0x10 для URL
	0xf0,						// TX Power
	0x00,						// URL Scheme: http://www.
	'g', 'e', 'e', 'k', 't', 'i', 'm', 'e', 's',
	0x00,						// .com/
};	

Vergessen Sie nicht, ein neues Paket in der API anzugeben:
at_ble_adv_data_set(eddystone_data, sizeof(eddystone_data), scan_rsp_data, sizeof(scan_rsp_data)) != AT_BLE_SUCCESS)

Kompilieren, ausfüllen, das Ergebnis anschauen.


Das ist alles, bis wir uns wiedersehen. Jetzt auf Freiflächen habr.

Jetzt auch beliebt: