2017-02-22 60 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)解析应该是相对比较简单。