添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

1.首先是要在界面程序中枚举出蓝牙设备

2.为使用蓝牙设备的相关信息创建解锁用的Windows Hello设备

3.当task收到解锁事件的时候再次枚举蓝牙设备,然后判断每个枚举到的蓝牙设备有没有对应Windows Hello设备

4. 有就使用使用这个Windows Hello设备解锁电脑

那这样我先使用我的小米手环的信息创建对应的解锁设备,当我的手环在附近的时候Task就能枚举到它从而解锁,当手环不在附近的时候Task自然就枚举不到它,于是就不能使用Windows Hello解锁。

关于枚举蓝牙设备,我又在微软的官方例子中找到了Demo

Demo地址: https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/DeviceEnumerationAndPairing

这个Demo就展示了使用DeviceWatch去枚举设备

DeviceWatcher m_deviceWatcher;
string[] requestedProperties = { "System.Devices.Aep.DeviceAddress", "System.Devices.Aep.IsConnected" };
m_deviceWatcher = DeviceInformation.CreateWatcher("(System.Devices.Aep.ProtocolId:=\"{bb7bb05e-5972-42b5-94fc-76eaa7084d49}\")",
//m_deviceWatcher = DeviceInformation.CreateWatcher("(System.Devices.Aep.ProtocolId:=\"{e0cbf06c-cd8b-4647-bb8a-263b43f0f974}\")",
                                                  requestedProperties,
                                                  DeviceInformationKind.AssociationEndpoint);
m_deviceWatcher.Added += DeviceWatcher_Added;
m_deviceWatcher.Updated += DeviceWatcher_Updated;
m_deviceWatcher.Removed += DeviceWatcher_Removed;
m_deviceWatcher.EnumerationCompleted += DeviceWatcher_EnumerationCompleted;
m_deviceWatcher.Stopped += DeviceWatcher_Stopped;
m_deviceWatcher.Start();

这个代码应该是一目了然的, 其中的关键就在于CreateWatcher时候使用的参数 {bb7bb05e-5972-42b5-94fc-76eaa7084d49} 能枚举到小米手环但是枚举不到手机, {e0cbf06c-cd8b-4647-bb8a-263b43f0f974} 则相反能枚举到手机但是枚举不到小米手环。

这个类还能枚举到其他很多的设备,就靠CreateWatcher的参数具体可以看官方的Demo。

下面是接口的定义,其中 DeviceInformation 和 DeviceInformationUpdate 就包含了设备的信息

private void DeviceWatcher_Added(DeviceWatcher Sender, DeviceInformation DeviceInfo)
private void DeviceWatcher_Updated(DeviceWatcher Sender, DeviceInformationUpdate DeviceInfoUpdate)
private void DeviceWatcher_Removed(DeviceWatcher Sender, DeviceInformationUpdate DeviceInfoUpdate)
private void DeviceWatcher_EnumerationCompleted(DeviceWatcher Sender, object e)
private void DeviceWatcher_Stopped(DeviceWatcher Sender, object e)
 

 基本属性都有对应的变量,而我在CreateWatcher的时候附加的属性  string[] requestedProperties = { "System.Devices.Aep.DeviceAddress", "System.Devices.Aep.IsConnected" }; 会以键值对的形式保存在 DeviceInformation 和 DeviceInformationUpdate 的 Properties中

 我在界面程序中使用这套接口枚举到了我的手环,基本信息是这样的

DeviceID: BluetoothLE#BluetoothLExx:xx:xx:xx:xx:xx-xx:xx:xx:xx:xx:xx

Name: MI Band 2

 一开始我是想直接使用 BluetoothLE#BluetoothLExx:xx:xx:xx:xx:xx-xx:xx:xx:xx:xx:xx 这个ID去创建解锁设备的,但是发现都失败,实验下来可能是只能使用GUID去创建解锁设备。于是我就需要把 BluetoothLE#BluetoothLExx:xx:xx:xx:xx:xx-xx:xx:xx:xx:xx:xx 也存储起来,存储的思路

其实例子中也给出了,就是存在解锁设备的  DeviceConfigurationData  中,因为 我还要在 DeviceConfigurationData 中存储解锁用的两个密码,所以我干脆就将在 DeviceConfigurationData  中存储JSON格式的数据,专门写了个序列化很反序列化的类。

public class JsonData
    public string Sign { get; set; }
    public string DeviceID { get; set; }
    public string DeviceKey { get; set; }
    public string AuthKey { get; set; }
    public bool CanUnLock { get; set; }
public class CMyHelloWinJson
    public static JsonData ParesToData(string js)
        JsonData rv = null;
            JsonObject schoolObject = JsonObject.Parse(js);
            if (schoolObject != null)
                rv = new JsonData();
                rv.Sign = schoolObject.GetNamedString("Sign");
                rv.DeviceID = schoolObject.GetNamedString("DeviceID");
                rv.DeviceKey = schoolObject.GetNamedString("DeviceKey");
                rv.AuthKey = schoolObject.GetNamedString("AuthKey");
                rv.CanUnLock = schoolObject.GetNamedBoolean("CanUnLock");
        }catch(Exception e)
            return rv;
        return rv;
    public static string ParesToJson(JsonData Dat)
        JsonObject schoolObject = new JsonObject();
        schoolObject.SetNamedValue("Sign", JsonValue.CreateStringValue(Dat.Sign));
        schoolObject.SetNamedValue("DeviceID", JsonValue.CreateStringValue(Dat.DeviceID));
        schoolObject.SetNamedValue("DeviceKey", JsonValue.CreateStringValue(Dat.DeviceKey));
        schoolObject.SetNamedValue("AuthKey", JsonValue.CreateStringValue(Dat.AuthKey));
        schoolObject.SetNamedValue("CanUnLock", JsonValue.CreateBooleanValue(Dat.CanUnLock));
        return schoolObject.ToString();
 

 所以在界面中创建解锁设备的代码就变成了这样

string modelnumber = "MyHelloWin";
// 随机数转 string 可能会丢失信息的
byte[] deviceKeyArray = new byte[32];
byte[] authKeyArray = new byte[32];
IBuffer deviceKey = CryptographicBuffer.CreateFromByteArray(deviceKeyArray);
IBuffer authKey = CryptographicBuffer.CreateFromByteArray(authKeyArray);
JsonData Dat = new JsonData();
Dat.Sign = "MyHellowin";
Dat.DeviceKey = System.Text.Encoding.UTF8.GetString(deviceKeyArray);
Dat.AuthKey = System.Text.Encoding.UTF8.GetString(authKeyArray);
Dat.DeviceID = DeviceID;
Dat.CanUnLock = false;
string js = CMyHelloWinJson.ParesToJson(Dat);
byte[] signArry = System.Text.Encoding.UTF8.GetBytes(js);
IBuffer deviceConfigData = CryptographicBuffer.CreateFromByteArray(signArry);
String deviceGUId = System.Guid.NewGuid().ToString();
int state = await WinHello.RegisterDeviceAsync(deviceGUId, bleDeviceDisplay.DeviceName, modelnumber, deviceConfigData, deviceKey, authKey);
// 注册
SecondaryAuthenticationFactorDeviceCapabilities Capabilities = SecondaryAuthenticationFactorDeviceCapabilities.SecureStorage;
SecondaryAuthenticationFactorRegistrationResult RegistrationResult = await SecondaryAuthenticationFactorRegistration.RequestStartRegisteringDeviceAsync(DervicesID,
        Capabilities,
        FriendlyName,
        ModelNumber,
        deviceKey,
        authKey);
if (RegistrationResult.Status == SecondaryAuthenticationFactorRegistrationStatus.Started) {
    await RegistrationResult.Registration.FinishRegisteringDeviceAsync(DerviceContext);
return (int)RegistrationResult.Status;

 界面写好了,那么解锁的时候思路大致就是这样的

先是枚举出所有的蓝牙设备,使用和上面相同的方法。

private void DeviceWatcher_Added(DeviceWatcher Sender, DeviceInformation DeviceInfo)
{

  IReadOnlyList<SecondaryAuthenticationFactorInfo> deviceList = await SecondaryAuthenticationFactorRegistration.FindAllRegisteredDeviceInfoAsync(SecondaryAuthenticationFactorDeviceFindScope.AllUsers);
  for (int i = 0; i < deviceList.Count; i++)
      SecondaryAuthenticationFactorInfo deviceInfo = deviceList.ElementAt(i);
      byte[] combinedDataArray;
      CryptographicBuffer.CopyToByteArray(deviceInfo.DeviceConfigurationData, out combinedDataArray);
      string JS = System.Text.Encoding.UTF8.GetString(combinedDataArray);
      JsonData Dat = CMyHelloWinJson.ParesToData(JS);
      if (Dat == null)
          continue;
      if (String.Equals(Dat.DeviceID, DeviceInfo.DeviceID)) { // 使用这个设备进行解锁  } 
  }
}

具体解锁的方法,上面一篇文章中有相应的介绍。或者你直接看我写的Demo: http://git.oschina.net/alwaysking/MyHelloWin

然而,当我天真的这样就搞定的时候,来了个晴天霹雳,因为在Task中使用DeviceWatcher枚举设备的时候他的回调函数根本不会被触发。注意我的蓝牙设备是配对的设备。

解决方法也是有的,我们下一篇再讲

转载于:https://www.cnblogs.com/alwaysking/p/7258859.html

接着探索上一篇讲了一个微软官方的Demo,这个Demo基本上已经把我们要做的事情做完了。那么基于这个Demo,我说下我的思路。1.首先是要在界面程序中枚举出蓝牙设备2.为使用蓝牙设备的相关信息创建解锁用的Windows Hello设备3.当task收到解锁事件的时候再次枚举蓝牙设备,然后判断每个枚举到的蓝牙设备有没有对应Windows Hello设备4. 有就使用使用...
在网上找了很多资料关于Winform如何试用电脑自带蓝牙与设备(手机、仪器、工具、3C电器等等)的低功耗蓝牙(BLE)进行通信的示例,找了很久都没有一个完整的解决方案,最近终于经过自己的不断研究实现了在Winform上实现了与BLE设备的蓝牙通信。 这里将几个关键点说明下,供大家参考:
什么是Windows Hello Windows Hellowindows 10 中提供的使用生物识别来解锁windows的一个框架。 如果你拥有人脸识别的摄像头或者指纹识别器亦或者是windows 手环的话是可以在系统中直接开启的。 事情的起因 有一次看 “科技美学” 的时候的 那岩提到windows红石更新之后 可以使用小米手环解锁小米的笔记本,我立马意识到这可能就是使用了Wi...
本文转自:https://www.cnblogs.com/webtojs/p/9675956.html winform 程序调用Windows.Devices.Bluetoot API 实现windows下BLE蓝牙设备自动连接,收发数据功能。不需要使用win10的UWP开发。 先贴图,回头来完善代码 源码如下: using System; using System...
当对其ListBox添加值后,如果要使用SelectedItem,就要将要赋值给SelectedItem的值转化为初始转化的值!例如: lstXXX.Add(1); lstXXX.Add(2); 会默认lstXXX存储的值为整型数值,以后要使用SelectedItem使某项处于被选中状态,就要将赋给SelectedItem的值转化为整型, lstXXX.SelectedItem = "2"...
    忽略之前小打小闹,这个项目算是我的第一个项目--SCNU的网络公选课的android版本的客户端。项目是从5月中旬开始的,中间经历了几个星期的复习考试时间,到现在可以说是完工了吧(或许还有写细节要修改)。这个项目带给我蛮多的经验,包括android开发及其它,所以有必要写写总结。     项目的故事版是另外一个负责iphone版本的同学设计的,所以界面就有仿照iphone的样子,其实正如...
winform 程序调用Windows.Devices.Bluetoot API 实现windows下BLE蓝牙设备自动连接,收发数据功能。不需要使用win10的UWP开发。 先贴图,回头来完善代码 源码如下: using System; using System.Collections.Generic; using System.Linq; using System...
4 基于RoundTrip(往返)的通讯协议设计 通讯服务器插件的核心为3部分:(1)与通讯方式、业务逻辑无关的通讯协议实现;(2)和通讯方式、业务逻辑有关的通讯业务逻辑的实现;(3)远程通讯消息队列。在这里我将重点描述通讯协议的实现。这个通讯协议的实现比较灵巧。 4.1 通讯协议基本单元——消息 通讯协议的通讯单元是消息,以下是来自硬件开发工程师编写的协议,消息包由前导符、起始符、消息头、...
我的初衷是直接用Unity实现PC端连接蓝牙,接收蓝牙发送的数据。但是能力有限,在网上也找了很久,一直没有找到解决方案。就只能退而求其次通过Unity+WindowsForms两个平台实现这一功能。 项目实例: 1.使用WindowsForms连接到蓝牙,接收蓝牙信息后,通过UDP发送 using System; using System.Collections.Generic; using System.Diagnostics; using System.Net; using System..
通过看文档发现,System.Device.Location 只有在.NET Framwork 4.0 以上版本才有此引用,于是在新建项目时,选择”.NET Framwork 4.0“ 或者以上版本,生成完项目后,选择”项目“——〉”添加引用“——〉”. NET“ 下,选择”System.Device“,——〉“确定”。这样就成功的添加了引用集。 上述错误就解决了。
Windows Hello面部软件设备下载适用于安装有Windows 10操作系统的设备。要下载Windows Hello面部软件设备,请按照以下步骤进行操作: 1. 打开你的设备,并确保它已连接到网络。 2. 进入“开始”菜单,点击“设置”图标。 3. 在“设置”窗口中,点击“帐户”选项。 4. 在左侧的菜单中,选择“登录选项”。 5. 在右侧的窗口中,找到“Windows Hello面部识别”选项,并点击“设置”。 6. 在新窗口中,你可以看到“设置面部识别”的选项。如果你的设备已有可用的面部识别设置,点击“已完备”进行设备的更新。如果还没有面部识别设置,点击“开始”以进行新的面部识别设置。 7. 稍等片刻,系统将要求你按照屏幕上的指示,以允许设备访问你的摄像头,并进行面部扫描。请确保你的摄像头被正确连接并处于正常工作状态。 8. 完成面部扫描后,系统会提示你进行一些额外的设置,例如是否要在登录时使用面部识别等。根据个人喜好进行选择。 9. 最后,系统将完成Windows Hello面部软件设备的下载和安装。你可以关闭“设置”窗口,并开始使用面部识别登录系统。 需要注意的是,Windows Hello面部识别需要具备一定的摄像头硬件支持。如果你的设备不具备此功能或摄像头驱动程序需要更新,请前往设备制造商的官方网站下载适用的驱动程序,并按照驱动程序提供商的指示安装更新。