Created
February 2, 2017 13:50
-
-
Save brianpursley/b78beec4fe43054da6e92d56f6d0f3a7 to your computer and use it in GitHub Desktop.
iBeacon Windows 10 Console Application using C#
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Linq; | |
using Windows.Devices.Bluetooth.Advertisement; | |
using Windows.Storage.Streams; | |
namespace BeaconExample | |
{ | |
class Program | |
{ | |
private class BeaconData | |
{ | |
public Guid Uuid { get; set; } | |
public ushort Major { get; set; } | |
public ushort Minor { get; set; } | |
public sbyte TxPower { get; set; } | |
public static BeaconData FromBytes(byte[] bytes) | |
{ | |
if (bytes[0] != 0x02) { throw new ArgumentException("First byte in array was exptected to be 0x02", "bytes"); } | |
if (bytes[1] != 0x15) { throw new ArgumentException("Second byte in array was expected to be 0x15", "bytes"); } | |
if (bytes.Length != 23) { throw new ArgumentException("Byte array length was expected to be 23", "bytes"); } | |
return new BeaconData | |
{ | |
Uuid = new Guid( | |
BitConverter.ToInt32(bytes.Skip(2).Take(4).Reverse().ToArray(), 0), | |
BitConverter.ToInt16(bytes.Skip(6).Take(2).Reverse().ToArray(), 0), | |
BitConverter.ToInt16(bytes.Skip(8).Take(2).Reverse().ToArray(), 0), | |
bytes.Skip(10).Take(8).ToArray()), | |
Major = BitConverter.ToUInt16(bytes.Skip(18).Take(2).Reverse().ToArray(), 0), | |
Minor = BitConverter.ToUInt16(bytes.Skip(20).Take(2).Reverse().ToArray(), 0), | |
TxPower = (sbyte)bytes[22] | |
}; | |
} | |
public static BeaconData FromBuffer(IBuffer buffer) | |
{ | |
var bytes = new byte[buffer.Length]; | |
using (var reader = DataReader.FromBuffer(buffer)) | |
{ | |
reader.ReadBytes(bytes); | |
} | |
return BeaconData.FromBytes(bytes); | |
} | |
} | |
static void Main(string[] args) | |
{ | |
var watcher = new BluetoothLEAdvertisementWatcher(); | |
watcher.Received += Watcher_Received; | |
watcher.Start(); | |
Console.WriteLine("Bluetooth LE Advertisement Watcher Started (Press ESC to exit)"); | |
while (Console.ReadKey().Key != ConsoleKey.Escape) | |
{ | |
} | |
watcher.Stop(); | |
Console.WriteLine("Bluetooth LE Advertisement Watcher Stopped"); | |
} | |
private static void Watcher_Received(BluetoothLEAdvertisementWatcher sender, BluetoothLEAdvertisementReceivedEventArgs args) | |
{ | |
const ushort AppleCompanyId = 0x004C; | |
foreach (var adv in args.Advertisement.ManufacturerData.Where(x => x.CompanyId == AppleCompanyId)) | |
{ | |
var beaconData = BeaconData.FromBuffer(adv.Data); | |
Console.WriteLine( | |
"[{0}] {1}:{2}:{3} TxPower={4}, Rssi={5}", | |
args.Timestamp, | |
beaconData.Uuid, | |
beaconData.Major, | |
beaconData.Minor, | |
beaconData.TxPower, | |
args.RawSignalStrengthInDBm); | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thanks for this example! After rewriting it a bit for my own purposes it worked great.
FYI: If anyone tries running the above code as a Console App (.Net Core) in Microsoft Visual Studio, make sure you add the required references as explained in this post: https://stackoverflow.com/questions/53268156/is-universal-windows-platform-required-to-use-the-windows-devices-bluetooth-name
In my own case the first reference was actually here:
"C:\Program Files (x86)\Windows Kits\10\UnionMetadata\10.0.18362.0\Windows.winmd"