2017-02-22 37 views
0

我們正在嘗試讀取埃迪斯通燈塔的數據格式,所以我們可以做的一些URL。然而,格式化,當我們不斷收到???goo.gl/..如何從URL中埃迪斯通C#

我們寫一些代碼在接收藍牙數據來記錄數據。

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()); 
} 

這是我們輸出

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 

我們有什麼編碼/解碼使用?

回答

4

按照EddyStone spec一個埃迪斯通幀開始與字節AA-FE。指定幀類型的單個字節緊隨其後。 0x10是一個url框架的標識符。
之後,代表傳輸功率的單字節包括在內,這你大概可以忽略不計。
然後,一個單字節表示方案跟在後面的URL。 url使用ASCII的可打印部分編碼,不可打印字符用於壓縮。

一旦你確定了正確的部分(即,從AA-FE-10)解析應該是相對比較簡單。