如何在 C# 中从 Eddystone 格式化 URL
How to format URL from Eddystone in C#
我们正在尝试读取 EddyStone 信标的数据,因此我们可以对 URL 做一些事情。但是,在格式化时我们不断得到 ???goo.gl/..
我们写了一些代码来记录接收到的蓝牙数据中的数据。
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
我们必须使用什么encoding/decoding?
根据 EddyStone spec,EddyStone 帧以字节 AA-FE
开始。之后是指定帧类型的单个字节。 0x10
是 url 帧的标识符。
之后是一个表示发射功率的字节,你可以忽略。
然后是表示方案的单个字节,之后是 url。 url 使用 ASCII 的可打印部分进行编码,不可打印的字符用于压缩。
一旦确定了正确的部分(即从 AA-FE-10
开始),解析应该相对简单。
我们正在尝试读取 EddyStone 信标的数据,因此我们可以对 URL 做一些事情。但是,在格式化时我们不断得到 ???goo.gl/..
我们写了一些代码来记录接收到的蓝牙数据中的数据。
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
我们必须使用什么encoding/decoding?
根据 EddyStone spec,EddyStone 帧以字节 AA-FE
开始。之后是指定帧类型的单个字节。 0x10
是 url 帧的标识符。
之后是一个表示发射功率的字节,你可以忽略。
然后是表示方案的单个字节,之后是 url。 url 使用 ASCII 的可打印部分进行编码,不可打印的字符用于压缩。
一旦确定了正确的部分(即从 AA-FE-10
开始),解析应该相对简单。