Как отформатировать URL из Eddystone в C#

Мы пытаемся прочитать данные маяка EddyStone, чтобы мы могли что-то сделать с URL. Однако при форматировании мы продолжаем получать ???goo.gl/..

Мы написали некоторый код для регистрации данных в полученных данных Bluetooth.

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

Какое кодирование / декодирование мы должны использовать?

1 ответ

Решение

Согласно спецификации EddyStone кадр EddyStone начинается с байтов AA-FE, После этого следует один байт, определяющий тип кадра. 0x10 является идентификатором для рамки URL.
После этого включается один байт, представляющий мощность передачи, который вы, вероятно, можете игнорировать.
Затем следует схема, представляющая один байт, с последующим URL. URL кодируется с использованием печатаемой части ASCII, непечатные символы используются для сжатия.

Как только вы определили правильный раздел (то есть, начиная с AA-FE-10Разбор должен быть относительно простым.

Другие вопросы по тегам