「Raspberry piでiBeacon受信」でRaspberry piでiBeaconを受信しましたが、今度はWindows10でiBeaconを受信します。
Android アプリ「 Beacon Simulator」の設定
Android アプリ「 Beacon Simulator」を使って次のiBeaconを発生します。
uuid:FFB2C814-5A15-42E2-864A-9D996FC499BC,major:2,minor:0 major: 2 minor: 0 uuid:86815C38-AE83-4244-96A3-161EF2AC9E08 major:1 minor:55
BeaconScannerアプリの作成
BeaconScanner「BeaconScanTest」アプリの作成します。「uuid」で次のクラス「BeaconScan」をインスタンス化して、「ScanStart」メソッドを呼びます。
BeaconScanTest
using System;
using Windows.Devices.Bluetooth.Advertisement;
using Windows.Storage.Streams;
namespace BeaconScanTest
{
class BeaconScan
{
private const int AdjustedLengthInBytes = -2; //CompanyID分の2桁ずれている為読み取り位置補正
private static BluetoothLEAdvertisementWatcher watcher;
public BeaconScan()
{
}
public void ScanStart()
{
watcher = new BluetoothLEAdvertisementWatcher();
watcher.Received += Watcher_Received;
watcher.Stopped += Watcher_Stopped;
watcher.ScanningMode = BluetoothLEScanningMode.Passive;
watcher.Start();
Console.ReadKey();
watcher.Stop();
while (true) { };
}
protected static void Watcher_Received(BluetoothLEAdvertisementWatcher sender, BluetoothLEAdvertisementReceivedEventArgs args)
{
string UUID;
int Major;
int Minor;
string retBeaconData;
var manufacturerSections = args.Advertisement.ManufacturerData;
if (manufacturerSections.Count > 0)
{
var manufacturerData = manufacturerSections[0];
var data = new byte[manufacturerData.Data.Length];
using (var reader = DataReader.FromBuffer(manufacturerData.Data))
{
reader.ReadBytes(data);
}
//バイトデータから抽出
//公式での出力値(Windowsでは2byteずれているので補正が必要)
// Byte(s) WinByte(s) Name
// --------------------------
// 0-1 none Manufacturer ID (16-bit unsigned integer, big endian)
// 2-3 0-1 Beacon code (two 8-bit unsigned integers, but can be considered as one 16-bit unsigned integer in little endian)
// 4-19 2-17 ID1 (UUID)
// 20-21 18-19 ID2 (16-bit unsigned integer, big endian)
// 22-23 20-21 ID3 (16-bit unsigned integer, big endian)
// 24 22 Measured Power (signed 8-bit integer)
// 25 23 Reserved for use by the manufacturer to implement special features (optional)
string uuid = BitConverter.ToString(data, 4 + AdjustedLengthInBytes, 16);
System.Text.StringBuilder sb = new System.Text.StringBuilder(uuid);
sb.Replace("-", " ", 11, 1);
sb.Replace("-", " ", 17, 1);
sb.Replace("-", " ", 23, 1);
sb.Replace("-", " ", 29, 1);
sb.Replace("-", "");
sb.Replace(" ", "-");
UUID = sb.ToString();
byte[] revData;
revData = new byte[] { data[20 + AdjustedLengthInBytes], data[21 + AdjustedLengthInBytes] }; // Bytes 18-19
Array.Reverse(revData);
Major = BitConverter.ToUInt16(revData, 0);
revData = new byte[] { data[22 + AdjustedLengthInBytes], data[23 + AdjustedLengthInBytes] }; // Bytes 20-21
Array.Reverse(revData);
Minor = BitConverter.ToUInt16(revData, 0);
retBeaconData = string.Format("uuid:{0},", UUID); //"00000000-0000-0000-0000-000000000000"
retBeaconData += string.Format("major:{0},", Major.ToString("D"));
retBeaconData += string.Format("minor:{0}", Minor.ToString("D"));
Console.WriteLine(retBeaconData);
}
else
{
Console.Error.Write("Manufacturer Sections Count Error\n");
}
}
protected static void Watcher_Stopped(BluetoothLEAdvertisementWatcher watcher, BluetoothLEAdvertisementWatcherStoppedEventArgs eventArgs)
{
Environment.Exit(0);
}
}
}
BeaconScannerアプリの実行
BeaconScanner「BeaconScanTest」アプリの実行すると、コンソールに次のようにBeacon の内容が表示されます。