2017-02-22 2 views
0

Wir versuchen, die Daten eines EddyStone Beacon zu lesen, damit wir etwas mit der URL tun können. Beim Formatieren erhalten wir jedoch ???goo.gl/..Wie URL formatieren von Eddystone in C#

Wir haben einen Code geschrieben, um die Daten in den empfangenen Bluetooth-Daten zu protokollieren.

private void OnAdvertisementReceived(BluetoothLEAdvertisementWatcher watcher, BluetoothLEAdvertisementReceivedEventArgs eventArgs) 
{ 
    // We only need the scannable devices containing data 
    if (eventArgs.AdvertisementType != BluetoothLEAdvertisementType.ConnectableUndirected || eventArgs.Advertisement.DataSections.Count < 3) 
     return; 

    // Do whatever you want with the advertisement 
    Encoding asciiEncoding = ASCIIEncoding.ASCII; 

    System.Diagnostics.Debug.WriteLine("=========================================================================================== NEW ADVERTISEMENT ==========================================================================================="); 
    System.Diagnostics.Debug.WriteLine("Address: " + eventArgs.BluetoothAddress); 
    System.Diagnostics.Debug.WriteLine("Type: " + eventArgs.AdvertisementType); 
    System.Diagnostics.Debug.WriteLine("Strength: " + eventArgs.RawSignalStrengthInDBm); 
    System.Diagnostics.Debug.WriteLine("Datasections Count: " + eventArgs.Advertisement.DataSections.Count); 
    System.Diagnostics.Debug.WriteLine("Flags: " + eventArgs.Advertisement.Flags); 
    System.Diagnostics.Debug.WriteLine("LocalName: " + eventArgs.Advertisement.LocalName); 
    System.Diagnostics.Debug.WriteLine("Uuids: " + eventArgs.Advertisement.ServiceUuids[0]); 

    string output = ""; 
    int i = 1; 
    foreach(BluetoothLEAdvertisementDataSection data in eventArgs.Advertisement.DataSections) 
    { 
     var dataReader = Windows.Storage.Streams.DataReader.FromBuffer(data.Data); 
     System.Diagnostics.Debug.WriteLine("Data Length: " + data.Data.Length + "/DataReader: " + dataReader.UnconsumedBufferLength); 
     byte[] fileContent = new byte[dataReader.UnconsumedBufferLength]; 
     dataReader.ReadBytes(fileContent); 

     string hexString = BitConverter.ToString(fileContent); 
     System.Diagnostics.Debug.WriteLine("Datasection" + i + ": " + BitConverter.ToString(fileContent)); 
     string dataSectionOutput = asciiEncoding.GetString(fileContent, 0, fileContent.Length); 
     System.Diagnostics.Debug.WriteLine("Datasection" + i + ": " + dataSectionOutput); 

     output += dataSectionOutput; 
     output = output.Replace("?", ""); 

     i++; 
    } 

    System.Diagnostics.Debug.WriteLine("Output: " + output.ToString()); 
} 

Das ist unser Ausgangs

Address: 220868346281848 
Type: ConnectableUndirected 
Strength: -75 
Datasections Count: 3 
Flags: GeneralDiscoverableMode, ClassicNotSupported 
LocalName: 
Uuids: 0000feaa-0000-1000-8000-00805f9b34fb 
Data Length: 1/DataReader: 1 
Datasection1: 06 
Datasection1: 
Data Length: 2/DataReader: 2 
Datasection2: AA-FE 
Datasection2: ?? 
Data Length: 18/DataReader: 18 
Datasection3: AA-FE-10-EB-03-67-6F-6F-2E-67-6C-2F-79-54-35-56-61-64 
Datasection3: ???goo.gl/yT5Vad 
Output: goo.gl/yT5Vad 

Welche Kodierung/Dekodierung müssen wir verwenden?

Antwort

4

Entsprechend der EddyStone spec beginnt ein EddyStone-Rahmen mit den Bytes AA-FE. Ein einzelnes Byte, das den Rahmentyp spezifiziert, folgt danach. 0x10 ist die Kennung für einen URL-Frame.
Danach ist ein einzelnes Byte, das die Übertragungsleistung darstellt, enthalten, die Sie wahrscheinlich ignorieren können.
Dann folgt ein einzelnes Byte, das Schema darstellt, mit der URL danach. Die URL wird mit dem druckbaren Teil von ASCII codiert, die nicht druckbaren Zeichen werden für die Komprimierung verwendet.

Sobald Sie den richtigen Abschnitt ermittelt haben (beginnend mit AA-FE-10) sollte das Parsen relativ einfach sein.