ibeacon で実装

parent e400b870
<Window x:Class="WpfBleSampleApp.MainWindow"
<Window x:Class="iBeaconScanner.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfBleSampleApp"
xmlns:local="clr-namespace:iBeaconScanner"
mc:Ignorable="d"
Title="MainWindow"
Height="500"
Width="566.338"
Loaded="Window_Loaded"
Closed="Window_Closed">
<Grid Margin="0,62,13.5,186.5">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="9*"/>
<ColumnDefinition Width="8*"/>
<ColumnDefinition Width="257*"/>
</Grid.ColumnDefinitions>
<TextBlock x:Name="TextBlockokList" Margin="24,-31,-11,0" Height="188" VerticalAlignment="Top" RenderTransformOrigin="0.495,1.012" Grid.Column="2" />
<TextBlock x:Name="TextBlockRSSI" Margin="10,162,-1,-128" Height="190" VerticalAlignment="Top" Grid.ColumnSpan="3" RenderTransformOrigin="0.492,1.471" />
Title="MainWindow" Height="350" Width="1130.975">
<Grid>
<TextBox x:Name="textBox" Margin="0" TextWrapping="Wrap" Text=""/>
</Grid>
</Window>
\ No newline at end of file
......@@ -6,6 +6,8 @@ using System.Threading;
using System.Windows;
using Windows.Devices.Bluetooth;
using Windows.Devices.Bluetooth.Advertisement;
using Windows.Storage.Streams;
public class Define
{
......@@ -15,213 +17,71 @@ public class Define
//special thanks
//https://blog.okazuki.jp/entry/2016/07/19/221226
//https://qiita.com/gebo/items/469dd49ddd1e24ce7a42
namespace WpfBleSampleApp
namespace iBeaconScanner
{
/// <summary>
/// MainWindow.xaml の相互作用ロジック
/// </summary>
public partial class MainWindow : Window
{
private BluetoothLEAdvertisementWatcher watcher;
//private Dictionary<string, BluetoothLEDevice> devices = new Dictionary<string, BluetoothLEDevice>();
private Dictionary<ulong, BluetoothLEDevice> devices = new Dictionary<ulong, BluetoothLEDevice>();
private Mutex mutex = new Mutex();
/*DeviceId*/
/*private string[] okList =
{
"BluetoothLE#BluetoothLE98:5f:d3:d1:35:3f-74:99:95:70:e8:29",
"BluetoothLE#BluetoothLE98:5f:d3:d1:35:3f-4e:03:3e:8f:50:96",
"BluetoothLE#BluetoothLE98:5f:d3:d1:35:3f-43:2d:3f:b7:45:02",
"",
"",
};*/
/*BDアドレス*/
private ulong[] okList =
{
/*82423332791826, //Bluetooth 4a:f6:ad:78:e6:12
108555962440447, //Bluetooth 62:bb:27:94:5a:ff
117605944835917,
76312922084733, //Bluetooth 45:67:fc:9c:d5:7d 自分の何か
139673612859991, // orutasu 12/19
95952497671738, // orutasu 12/19
104072803926013, // orutasu 12/19
112717208922713, //12/20 lab
*/
//12/23 自宅
72542603779210 ,//Bluetooth 41:fa:24:21:1c:8a,
119668175063121 ,//Bluetooth 6c:d6:6b:10:c8:51,
139563132157043,//Bluetooth 7e:ee:92:ea:7c:73,
//1/8 lab
140285132663853 ,//Bluetooth 7f:96:ad:7f:ec:2d,
83936478851746,//Bluetooth 4c:56:fc:01:72:a2,
};
/*private string[] okList =
{
Bluetooth 45:67:fc:9c:d5:7d, 76312922084733
Bluetooth 62:bb:27:94:5a:ff, 108555962440447
Bluetooth 59:d7:f7:2e:b4:b0, 98784099873968
Bluetooth 45:67:fc:9c:d5:7d, 76312922084733
Bluetooth 4a:f6:ad:78:e6:12, 82423332791826
Bluetooth 45:fb:92:65:f1:77, 76946795262327
Bluetooth 43:b4:22:bc:0b:c5, 74440955923397
Bluetooth 45:67:fc:9c:d5:7d, 76312922084733
Bluetooth 45:da:1d:36:ba:a5, 76803095313061
Bluetooth 6f:2b:60:01:42:b7, 122232084972215
Bluetooth 78:dc:79:ad:81:08, 132888329552136
Bluetooth 48:64:11:76:c7:0d, 79594626926349
Bluetooth 72:b0:e5:06:05:76, 126104082187638
Bluetooth 5e:a7:56:82:3f:fd, 104072803926013
Bluetooth 5e:dc:1f:04:ac:04, 104299506215940
Bluetooth 5d:cb:9f:e8:a2:f1, 103129142567665
Bluetooth 70:19:e9:5c:d2:55, 123256591667797 ,
Bluetooth 66:84:05:32:aa:59, 112717208922713 ,
Bluetooth 5f:85:83:41:60:a7, 105027037388967 ,
};*/
private BluetoothLEAdvertisementWatcher advWatcher;
public MainWindow()
{
InitializeComponent();
this.watcher = new BluetoothLEAdvertisementWatcher();
//OK_List の表示
this.TextBlockokList.Text += $"\n";
foreach (var ok in okList)
{
this.TextBlockokList.Text += $"{ok}\n";
}
this.TextBlockokList.Text += $"--------------------------------\n";
// CompanyIDとかDataでフィルタリングしたいとき
//var md = new BluetoothLEManufacturerData();
//// company id 0xFFFF (多分これ https://www.bluetooth.com/specifications/assigned-numbers/company-Identifiers)
//md.CompanyId = 0xFFFF;
//// data 0x1234
//var w = new DataWriter();
//w.WriteUInt16(0x1234);
//md.Data = w.DetachBuffer();
//this.watcher.AdvertisementFilter.Advertisement.ManufacturerData.Add(md);
// ↓https://docs.microsoft.com/ja-jp/windows/uwp/devices-sensors/ble-beacon
// rssi >= -60のとき受信開始するっぽい
this.watcher.SignalStrengthFilter.InRangeThresholdInDBm = -60; // >=-60dBm
// rssi <= -65が2秒続いたら受信終わるっぽい
this.watcher.SignalStrengthFilter.OutOfRangeThresholdInDBm = -65; // <=-65dBm
this.watcher.SignalStrengthFilter.OutOfRangeTimeout = TimeSpan.FromMilliseconds(3000);// 3000ミリ秒以上遠ざかっていると受信終了
this.watcher.Received += this.Watcher_Received;
}
private async void Watcher_Received(BluetoothLEAdvertisementWatcher sender, BluetoothLEAdvertisementReceivedEventArgs args)
{
/*
await this.Dispatcher.InvokeAsync(() =>
{
var md = args.Advertisement.ManufacturerData.FirstOrDefault();
if (md != null)
{
// ManufactureDataをもとにCompanyIDとったりできる
}
var uuids = String.Join(",", args.Advertisement.ServiceUuids.Select(uuid => uuid.ToString()));
this.TextBlockRSSI.Text = $"{args.Timestamp:HH\\:mm\\:ss}, RSSI: {args.RawSignalStrengthInDBm}, Address: {args.BluetoothAddress.ToString("X")}, Type: {args.AdvertisementType} , {args.Advertisement.ServiceUuids.Count}{uuids}";
});
*/
var task = BluetoothLEDevice.FromBluetoothAddressAsync(args.BluetoothAddress);
//↑Adパケットをキャプチャするというタスク
task.Completed = delegate
{
switch (task.Status)
{
case Windows.Foundation.AsyncStatus.Completed://無事完了すれば
var device = task.GetResults();
if (device == null) return;
Debug.WriteLine($"device found:{device.Name},{device.BluetoothAddress}");// ここでKeyを決める
Debug.WriteLine($"device found:{device.Name},{device.DeviceId},{device.BluetoothAddress}");// ここでKeyを決める
this.advWatcher = new BluetoothLEAdvertisementWatcher();
// https://blogs.msdn.microsoft.com/shozoa/2016/02/28/windows-10-bluetooth/
// インターバルがゼロのままだと、CPU負荷が高くなりますので、適切な間隔(SDK サンプルでは 1秒)に指定しないと、アプリの動作に支障をきたすことになります。
this.advWatcher.SignalStrengthFilter.SamplingInterval = TimeSpan.FromMilliseconds(1000);
if (device.WasSecureConnectionUsedForPairing) { //接続したことがあればSecure
Debug.WriteLine("####Secure####");
}
// rssi >= -60のときスキャンする
this.advWatcher.SignalStrengthFilter.InRangeThresholdInDBm = -50;
mutex.WaitOne();
devices[device.BluetoothAddress] = device;//DeviceId と device を結び付けている
//KeyにBDアドレスを選択
this.advWatcher.Received += this.Watcher_Received;
//RSSIが小さければ削除するコード(必要か?)
Debug.WriteLine("===========begin");
foreach (var x in devices)
{
var dev = x.Value;
var id = x.Key; // == dev.BluetoothAddress
Debug.WriteLine($"{dev.Name}, {id} ,");// Name,BluetoothAddress
}
Debug.WriteLine("===========end");
mutex.ReleaseMutex();
this.Dispatcher.InvokeAsync(() =>
{
mutex.WaitOne();
this.TextBlockRSSI.Text = "";
foreach (var x in devices)
{
var dev = x.Value;
var id = x.Key; // == dev.DeviceId
this.TextBlockRSSI.Text += $"{dev.Name}, {id}\n";
}
// OKリストの中身と何個一致しているか
//var count = okList.Count((okId) => devices.ContainsKey(okId));
var count = okList.Count((okId) => devices.ContainsKey(okId));
this.TextBlockRSSI.Text += $"ok count: {count}\n";
// スキャン開始
this.advWatcher.Start();
}
if (count >= Define.OK_Num) {
this.TextBlockRSSI.Text += $"You are You!\n";
}
private async void Watcher_Received(BluetoothLEAdvertisementWatcher sender, BluetoothLEAdvertisementReceivedEventArgs args)
{
await this.Dispatcher.InvokeAsync(() => {
mutex.ReleaseMutex();
});
break;
// http://sonic.blue/it/605
// Windows10デバイスでiBeaconの全データを取得する方法
iBeacon bcon = new iBeacon(args);
case Windows.Foundation.AsyncStatus.Started:
Debug.WriteLine($"started: ");
break;
Debug.WriteLine($"uuid:{bcon.UUID}////,major:{bcon.Major}");
default:
Debug.WriteLine($"failed: {task.Status} {task.ErrorCode}");
break;
if (bcon.UUID != null)
{
// iBeacon
DateTimeOffset timestamp = args.Timestamp;
string retBeaconData;
retBeaconData = "{";
//retBeaconData += string.Format("vendor:'{0}',", bcon.iBeaconVendor);
retBeaconData += string.Format("uuid:'{0}',", bcon.UUID);
retBeaconData += string.Format("major:{0},", bcon.Major.ToString("D"));
retBeaconData += string.Format("minor:{0},", bcon.Minor.ToString("D"));
retBeaconData += string.Format("measuredPower:{0},", bcon.MeasuredPower.ToString("D"));
retBeaconData += string.Format("rssi:{0},", bcon.Rssi.ToString("D"));
retBeaconData += string.Format("accuracy:{0},", bcon.Accuracy.ToString("F6"));
retBeaconData += string.Format("proximity:'{0}',", bcon.Proximity);
retBeaconData += string.Format("BluetoothAddress:'{0}',", bcon.BluetoothAddress);
retBeaconData += string.Format("RawSignalStrengthInDBm:{0}", bcon.RawSignalStrengthInDBm);
retBeaconData += "}";
this.textBox.Text = this.textBox.Text + timestamp.ToString("HH\\:mm\\:ss\\.fff") + ":" + retBeaconData + "\r\n";
}
};
}
private void Window_Closed(object sender, EventArgs e)
{
this.watcher.Stop();
});
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
this.watcher.Start();
}
}
}
\ No newline at end of file
}
......@@ -70,6 +70,7 @@
<DependentUpon>App.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="iBeacon.cs" />
<Compile Include="MainWindow.xaml.cs">
<DependentUpon>MainWindow.xaml</DependentUpon>
<SubType>Code</SubType>
......
using System;
using Windows.Devices.Bluetooth.Advertisement;
using Windows.Storage.Streams;
public class iBeacon
{
private const int MinimumLengthInBytes = 25;//最小の長さ
private const int AdjustedLengthInBytes = -2;//CompanyID分の2桁ずれている為読み取り位置補正
//プロパティ
public string Name { get; set; }
public DateTimeOffset Timestamp { get; set; }
public BluetoothLEAdvertisementType AdvertisementType { get; set; }
public int ManufacturerId { get; set; }
public int Major { get; set; }
public int Minor { get; set; }
public string UUID { get; set; }
public short Rssi { get; set; }
public short MeasuredPower { get; set; }
public double ManufacturerReserved { get; set; }
public ulong BluetoothAddress { get; set; }
public int RawSignalStrengthInDBm { get; }
//精度(accuracy)
public double Accuracy
{
get { return calcAccuracy(MeasuredPower, Rssi); }
}
//近接度(Proximity):近接(immidiate)、1m以内(near)、1m以遠(far)、不明(Unknown)
public string Proximity
{
get
{
string _Proximity = "Unknown";
//Rssi未取得ならUnknown
if (Rssi == 0) { return _Proximity; }
//rssi値からProximityを判別
if (Rssi > -40)
{
_Proximity = "immidiate";//近接
}
else if (Rssi > -59)
{
_Proximity = "near";//1m以内
}
else
{
_Proximity = "far";//1m以遠
}
return _Proximity;
}
}
//コンストラクタ
public iBeacon()
{
ManufacturerId = -1;
Major = -1;
Minor = -1;
Rssi = 0;
UUID = "";
MeasuredPower = -1;
ManufacturerReserved = -1.0;
}
//コンストラクタ2
public iBeacon(BluetoothLEAdvertisementReceivedEventArgs eventArgs)
{
//出力されているbyteデータから各値を抽出する
var manufacturerSections = eventArgs.Advertisement.ManufacturerData;
Timestamp = eventArgs.Timestamp;
AdvertisementType = eventArgs.AdvertisementType;
if (manufacturerSections.Count > 0)
{
var manufacturerData = manufacturerSections[0];
var data = new byte[manufacturerData.CompanyId];
iBeacon bcon = new iBeacon();
/* using (var reader = DataReader.FromBuffer(manufacturerData.Data))
{
reader.ReadBytes(data);
}
*/
//長さをチェック
if (data == null || data.Length < MinimumLengthInBytes + AdjustedLengthInBytes)
{
return;
}
//イベントから取得
Rssi = eventArgs.RawSignalStrengthInDBm;
Name = eventArgs.Advertisement.LocalName;
ManufacturerId = manufacturerData.CompanyId;
//バイトデータから抽出
//公式での出力値(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)
//BigEndianの値を取得
UUID = BitConverter.ToString(data, 4 + AdjustedLengthInBytes, 16); // Bytes 2-17
MeasuredPower = Convert.ToSByte(BitConverter.ToString(data, 24 + AdjustedLengthInBytes, 1), 16); // Byte 22
//もし追加データがあればここで取得
if (data.Length >= MinimumLengthInBytes + AdjustedLengthInBytes + 1)
{
ManufacturerReserved = data[25 + AdjustedLengthInBytes]; // Byte 23
}
//.NET FramewarkのEndianはCPUに依存するらしい
if (BitConverter.IsLittleEndian)
{
//LittleEndianの値を取得
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);
}
else
{
//BigEndianの値を取得
Major = BitConverter.ToUInt16(data, 20 + AdjustedLengthInBytes); // Bytes 18-19
Minor = BitConverter.ToUInt16(data, 22 + AdjustedLengthInBytes); // Bytes 20-21
}
}
else
{
new iBeacon();
}
}
//精度を計算する
protected static double calcAccuracy(short measuredPower, short rssi)
{
if (rssi == 0)
{
return -1.0; //nodata return -1.
}
double ratio = rssi * 1.0 / measuredPower;
if (ratio < 1.0)
{
return Math.Pow(ratio, 10);
}
else
{
double accuracy = (0.89976) * Math.Pow(ratio, 7.7095) + 0.111;
return accuracy;
}
}
}
#pragma checksum "..\..\MainWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "56F052CFB7FE06C2C911627D754264C69B1D7797"
#pragma checksum "..\..\MainWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "83B8DB4DECAA2131589EE936FAC7F27E5B12F855"
//------------------------------------------------------------------------------
// <auto-generated>
// このコードはツールによって生成されました。
......@@ -29,10 +29,10 @@ using System.Windows.Media.TextFormatting;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Shell;
using WpfBleSampleApp;
using iBeaconScanner;
namespace WpfBleSampleApp {
namespace iBeaconScanner {
/// <summary>
......@@ -41,17 +41,9 @@ namespace WpfBleSampleApp {
public partial class MainWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector {
#line 19 "..\..\MainWindow.xaml"
#line 10 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock TextBlockokList;
#line default
#line hidden
#line 20 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock TextBlockRSSI;
internal System.Windows.Controls.TextBox textBox;
#line default
#line hidden
......@@ -87,24 +79,7 @@ namespace WpfBleSampleApp {
switch (connectionId)
{
case 1:
#line 11 "..\..\MainWindow.xaml"
((WpfBleSampleApp.MainWindow)(target)).Loaded += new System.Windows.RoutedEventHandler(this.Window_Loaded);
#line default
#line hidden
#line 12 "..\..\MainWindow.xaml"
((WpfBleSampleApp.MainWindow)(target)).Closed += new System.EventHandler(this.Window_Closed);
#line default
#line hidden
return;
case 2:
this.TextBlockokList = ((System.Windows.Controls.TextBlock)(target));
return;
case 3:
this.TextBlockRSSI = ((System.Windows.Controls.TextBlock)(target));
this.textBox = ((System.Windows.Controls.TextBox)(target));
return;
}
this._contentLoaded = true;
......
#pragma checksum "..\..\MainWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "56F052CFB7FE06C2C911627D754264C69B1D7797"
#pragma checksum "..\..\MainWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "83B8DB4DECAA2131589EE936FAC7F27E5B12F855"
//------------------------------------------------------------------------------
// <auto-generated>
// このコードはツールによって生成されました。
......@@ -29,10 +29,10 @@ using System.Windows.Media.TextFormatting;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Shell;
using WpfBleSampleApp;
using iBeaconScanner;
namespace WpfBleSampleApp {
namespace iBeaconScanner {
/// <summary>
......@@ -41,17 +41,9 @@ namespace WpfBleSampleApp {
public partial class MainWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector {
#line 19 "..\..\MainWindow.xaml"
#line 10 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock TextBlockokList;
#line default
#line hidden
#line 20 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock TextBlockRSSI;
internal System.Windows.Controls.TextBox textBox;
#line default
#line hidden
......@@ -87,24 +79,7 @@ namespace WpfBleSampleApp {
switch (connectionId)
{
case 1:
#line 11 "..\..\MainWindow.xaml"
((WpfBleSampleApp.MainWindow)(target)).Loaded += new System.Windows.RoutedEventHandler(this.Window_Loaded);
#line default
#line hidden
#line 12 "..\..\MainWindow.xaml"
((WpfBleSampleApp.MainWindow)(target)).Closed += new System.EventHandler(this.Window_Closed);
#line default
#line hidden
return;
case 2:
this.TextBlockokList = ((System.Windows.Controls.TextBlock)(target));
return;
case 3:
this.TextBlockRSSI = ((System.Windows.Controls.TextBlock)(target));
this.textBox = ((System.Windows.Controls.TextBox)(target));
return;
}
this._contentLoaded = true;
......
45d4cf267363dbdf9b29ddb1b7cb274a98f2f6e1
3d0f4bf2707f6919b6b1c9310b5d98aed3a08f53
......@@ -82,3 +82,24 @@ C:\Users\Kaoru\source\repos\catchBLE\WpfApp1\obj\Debug\WpfApp1.csproj.CoreCompil
C:\Users\Kaoru\source\repos\catchBLE\WpfApp1\obj\Debug\WpfApp1.csproj.CopyComplete
C:\Users\Kaoru\source\repos\catchBLE\WpfApp1\obj\Debug\WpfApp1.exe
C:\Users\Kaoru\source\repos\catchBLE\WpfApp1\obj\Debug\WpfApp1.pdb
C:\Users\Kaoru\source\repos\catchBLE2\WpfApp1\bin\Debug\WpfApp1.exe.config
C:\Users\Kaoru\source\repos\catchBLE2\WpfApp1\bin\Debug\WpfApp1.exe
C:\Users\Kaoru\source\repos\catchBLE2\WpfApp1\bin\Debug\WpfApp1.pdb
C:\Users\Kaoru\source\repos\catchBLE2\WpfApp1\bin\Debug\System.Runtime.WindowsRuntime.dll
C:\Users\Kaoru\source\repos\catchBLE2\WpfApp1\bin\Debug\System.Runtime.WindowsRuntime.UI.Xaml.dll
C:\Users\Kaoru\source\repos\catchBLE2\WpfApp1\bin\Debug\Windows.WinMD
C:\Users\Kaoru\source\repos\catchBLE2\WpfApp1\bin\Debug\System.Runtime.WindowsRuntime.xml
C:\Users\Kaoru\source\repos\catchBLE2\WpfApp1\bin\Debug\System.Runtime.WindowsRuntime.UI.Xaml.xml
C:\Users\Kaoru\source\repos\catchBLE2\WpfApp1\obj\Debug\WpfApp1.csprojAssemblyReference.cache
C:\Users\Kaoru\source\repos\catchBLE2\WpfApp1\obj\Debug\MainWindow.g.cs
C:\Users\Kaoru\source\repos\catchBLE2\WpfApp1\obj\Debug\App.g.cs
C:\Users\Kaoru\source\repos\catchBLE2\WpfApp1\obj\Debug\WpfApp1_MarkupCompile.cache
C:\Users\Kaoru\source\repos\catchBLE2\WpfApp1\obj\Debug\WpfApp1_MarkupCompile.lref
C:\Users\Kaoru\source\repos\catchBLE2\WpfApp1\obj\Debug\MainWindow.baml
C:\Users\Kaoru\source\repos\catchBLE2\WpfApp1\obj\Debug\WpfApp1.g.resources
C:\Users\Kaoru\source\repos\catchBLE2\WpfApp1\obj\Debug\WpfApp1.Properties.Resources.resources
C:\Users\Kaoru\source\repos\catchBLE2\WpfApp1\obj\Debug\WpfApp1.csproj.GenerateResource.cache
C:\Users\Kaoru\source\repos\catchBLE2\WpfApp1\obj\Debug\WpfApp1.csproj.CoreCompileInputs.cache
C:\Users\Kaoru\source\repos\catchBLE2\WpfApp1\obj\Debug\WpfApp1.csproj.CopyComplete
C:\Users\Kaoru\source\repos\catchBLE2\WpfApp1\obj\Debug\WpfApp1.exe
C:\Users\Kaoru\source\repos\catchBLE2\WpfApp1\obj\Debug\WpfApp1.pdb
......@@ -12,9 +12,9 @@ DEBUG;TRACE
C:\Users\Kaoru\source\repos\catchBLE2\WpfApp1\App.xaml
11151548125
9403354300
6-1683440482
71148438499
MainWindow.xaml;
True
False
......@@ -4,17 +4,17 @@
winexe
C#
.cs
C:\Users\Kaoru\source\repos\WpfApp1\WpfApp1\obj\Debug\
C:\Users\Kaoru\source\repos\catchBLE2\WpfApp1\obj\Debug\
WpfApp1
none
false
DEBUG;TRACE
C:\Users\Kaoru\source\repos\WpfApp1\WpfApp1\App.xaml
C:\Users\Kaoru\source\repos\catchBLE2\WpfApp1\App.xaml
11151548125
9403354300
10737660320
71148438499
MainWindow.xaml;
False
True

FC:\Users\Kaoru\source\repos\catchBLE2\WpfApp1\MainWindow.xaml;;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment