/ / Jak sformatować adres URL z Eddystone w C # - c #, beacon, eddystone, eddystone-url

Jak sformatować URL z Eddystone w C # - c #, beacon, eddystone, eddystone-url

Próbujemy odczytać dane sygnału nawigacyjnego EddyStone, abyśmy mogli coś zrobić z adresem URL. Jednak podczas formatowania ciągle się pojawia ???goo.gl/..

Napisaliśmy kod do zarejestrowania danych w otrzymanych danych 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());
}

To jest nasz wynik

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

Jakiego kodowania / dekodowania musimy użyć?

Odpowiedzi:

4 dla odpowiedzi № 1

Według Specyfikacja EddyStone ramka EddyStone zaczyna się od bajtów AA-FE. Następnie następuje pojedynczy bajt określający typ ramki. 0x10 jest identyfikatorem ramki adresu URL.
Następnie dołączany jest jeden bajt reprezentujący moc transmisji, który prawdopodobnie można zignorować.
Następnie następuje schemat reprezentujący jeden bajt, a następnie adres URL. Adres URL jest zakodowany przy użyciu części ASCII przeznaczonej do wydruku, do kompresji używane są znaki niedrukowalne.

Po określeniu poprawnej sekcji (to znaczy od AA-FE-10) parsowanie powinno być stosunkowo proste.