# Microsoft Band - 借助 Microsoft Band SDK 开发 Windows 10 应用程序
通过 [Kevin Ashley](https://msdn.microsoft.com/zh-cn/magazine/mt149362?author=Kevin+Ashley) | 2015 年 10 月 | [获取的代码](https://github.com/kevinash/GravityHeroUWP)
Microsoft Bing 预测服饰会在技术中最热门的趋势处于 2015年 ([binged.it/1hCBv9A](http://binged.it/1hCBv9A))、 个人数字助理、 家庭自动化、 3D 打印和虚拟现实游戏之前。
一个这样的设备,Microsoft 带将合并大多数人需要跟踪它们的运行状况、 适用性、 睡眠质量和更多的传感器。它在市场中包比许多开销更大的可用设备太多的传感器。
作为移动应用程序开发人员,我想使用 Microsoft 带创建有用的应用程序。一些示例我在我 Active Fitness 的应用程序 (activefitness.co) 在 Windows、 iOS 和 Android 上有超过 2 百万的用户中使用此代码中使用。大多数使用者应用程序需要在到达最大的受众的 Windows、 iOS 和 Android 等的多个平台上工作。在本文中,我将解释如何为带开发 Windows 10 应用程序和浏览跨平台选项。很荣幸能够参与带 SDK 的早期版本。现在,它已公开提供,我可以共享代码示例,增强了带 SDK 和开发人员社区的最新版本。
## 重力方面的杰出人物: Windows 10 示例应用程序
我想要构建内容有趣,展示了各种带功能并在同一时间几乎工作方式类似于一个游戏。因此,我构建名为"重力 Hero,"的通用 Windows 应用程序中所示 图 1。其原理很简单: 将跳转戴上带区并设备告诉您是否生成了过您最佳跳转。并且由于我构建了一个通用 Windows 应用程序,因此将使用在任何 Windows 10 设备上。我还添加有关本机 Android 应用程序的 GitHub 来演示如何轻松地针对其他设备上的示例代码。此外,带开发人员网站包括文档和 SDK 代码示例链接 ([developer.microsoftband.com](http://developer.microsoftband.com/))。
![](https://box.kancloud.cn/2016-01-08_568f4ae8aae0d.png)
图 1 重力方面的杰出人物示例应用程序在 Windows 10 上运行
Microsoft 带团队提供了 Sdk for Windows、 iOS 和 Android。此外,还有一种跨平台 SDK 解决方案借助 Xamarin,能够编写出优秀代码重复使用的技术。您应该选择哪种技术? 与 Microsoft 和社区的支持、 针对带设备进行开发时具有以下选项:
* 与 Windows、 iOS 和 Android 的本机开发的 Microsoft 带 SDK (Microsoft) ([bit.ly/1JfiFvW](http://bit.ly/1JfiFvW))
* 从任何 Web 源只需几个简单步骤向该乐队快速传递信息 web 磁贴 SDK (Microsoft) ([bit.ly/1h94CjZ](http://bit.ly/1h94CjZ))
* 云 (Microsoft) API 用于访问 RESTful Api 中轻松使用 JSON 格式的全面的适用性和运行状况数据 ([bit.ly/1MIBOL7](http://bit.ly/1MIBOL7))
* 跨平台 SDK (Xamarin) 在 Xamarin 的跨平台应用程序中使用针对 iOS、 Android 和 Windows;xamarin 中,您可以使用单一代码库针对所有平台 ([bit.ly/1EfhqjK](http://bit.ly/1EfhqjK))
如果已经 Windows、 iOS 或 Android 应用程序,只需为每个这些平台使用本机的带 SDK。如果您从头或想要针对所有平台使用相同的代码,您可能想要看一看 Xamarin。这完全由您来决定。平台友好方法为您提供了您需要开始构建应用程序的所有选项。在本文中,我将介绍这两个选项。
## 连接到 10 的 Windows PC 的带区
在开始进行开发之前,您将需要连接到 Windows 10 PC 的带区。Windows 10 包括蓝牙的支持,因此这是很容易实现:
您带转到设置磁贴、 单击蓝牙图标和切换到配对。您带现处于匹配模式。在您的 Windows 10 PC 上转到设置或键入 Cortana 蓝牙并打开 Bluetooth 设置页中所示 图 2。请注意在列表中的蓝牙设备您带区的状态。带名称通常首先用您的姓名和代码,除非您更改为其他内容 (在这种情况下,我有"Kevin 的带 ec:5a")。如果该状态显示"已连接",您就可以运行 ;否则为点击对并按照提示进行操作。
![](https://box.kancloud.cn/2016-01-08_568f4ae8c739a.png)
图 2 到 10 的 Windows PC 连接 Microsoft 带
## 在 Visual Studio 中创建 Windows 10 应用程序
您可以使用我在 GitHub 创建的示例应用程序启动 ([bit.ly/1U2sLup](http://bit.ly/1U2sLup))。请记住是否您决定从头开始创建您的应用程序,您需要在该清单; 中包括 Bluetooth 设备功能默认情况下的 visual Studio 不会在应用程序模板中包括此功能:
~~~
<Capabilities>
<DeviceCapability Name="bluetooth" />
</Capabilities>
~~~
如果将带区添加到自己的应用程序或从头开始创建一个 Windows 10 应用程序还需要获取 Microsoft 带 NuGet 包。有几个,一些由 Microsoft 创建和打包社区 (例如 Xamarin.Microsoft.Band 封装) 由某些添加。用于通用 Windows 应用程序中,我添加了 Microsoft 包中,如中所示 图 3。
![](https://box.kancloud.cn/2016-01-08_568f4ae8d612b.png)
图 3 Microsoft 带 NuGet 包
Microsoft 带 SDK 允许开发人员能够访问的带区创建和更新磁贴和个性化该设备上的传感器。您的应用程序可以发送通知,包括 haptics,到带区。带区本身具有很好、 清理和简单介绍,如中所示 图 4。
![](https://box.kancloud.cn/2016-01-08_568f4ae9035ee.png)
图 4 Microsoft 带
带区随附传感器 (中可以看到的完整列表 图 5) ; 用于我重力方面的杰出人物的示例应用程序,我重点介绍加速感应器传感器。
图 5 传感器可在 Microsoft 带上
| 传感器 | 详细信息 |
|---|---|
| 加速感应器 | 可提供 g 单位的 X、 Y 和 Z 加速功能。1 g = 9.81 米 / 第二个平方 (m/s2)。 |
| 陀螺 | 提供了 X、 Y 和 Z 角速度以度为单位第二个 (° / sec) 的单位。 |
| 距离 | 提供每秒 (cm/s) (厘米) 的当前速度 (厘米) 的总距离以毫秒为单位每计量器 (ms/m) 的当前进度和当前的计步器模式 (如遍历或运行)。 |
| 核心速率 | 提供每分钟 ; 节拍的数此外指示是否核心速率传感器处于完全锁定到多面手的核心速率。应仅在停留模式中使用返回的数据。带 SDK 不提供对核心速率值针对任何其他活动进行了优化的访问。|
| 计步器 | 提供了多面手已采取的步骤的总数。 |
| 外观温度 | 提供单位为摄氏度多面手当前外观的温度。 |
| UV | 提供了当前 ultraviolet 放射暴露强度。 |
| 带联系人 | 提供了作为正在磨损 not 磨损的带区的当前状态。 |
| 卡路里 | 提供了的卡路里多面手具有的总数。 |
## 设计数据模型
如往常一样,我从开始在 Visual Studio 中的数据模型中所示 图 6。良好的数据模型始终有所帮助,因为它将数据分割到单独的层,后者可以轻松地共享跨您的应用程序和甚至云后端如果您决定有显示您的数据的网站。我希望我足够灵活,能够从传感器中收集数据并将其显示在重力方面的杰出人物应用程序中的数据模型。我可以重复使用我的数据模型中其他应用程序,因此值得将其放在单独的文件夹在我的 Visual Studio 解决方案。
![](https://box.kancloud.cn/2016-01-08_568f4ae91ce8e.png)
图 6 使用示例项目和数据模型的 Visual Studio 解决方案
重力方面的杰出人物应用程序的数据模型使用一个方便的是名为 ViewModel 的帮助器类。我可以使用大量的现有模型-视图-视图模型 (MVVM) 帮助程序库,但在此示例中我只需实现了一个用于使代码尽可能透明。ViewModel 类实现 INotifyPropertyChanged 接口。这是一种相当标准的方法在.NET 应用程序中时您想要在您在 UI 中的数据模型中反映更改。在我的示例应用程序实现中,我想要确保此类通知 PropertyChanged 机制通过用户界面。
SensorReading 是类来捕获带传感器读数和通知向数据模型更改订阅的用户界面中的任何内容。让我们进一步看一下此类。此类派生自前面介绍的 ViewModel,还包括可能会很有用数据进行序列化并将其通过线路发送 (到你的云存储,例如) 的属性。SensorReading 类上的 DataContract 特性执行做到这一点,并在各个数据成员的 DataMember 属性允许为要序列化数据,或者到 JSON 或 XML,具体取决于序列化程序。SensorReading 类的另一个优点是它提供以标准化的形式,因为该类包含三维矢量读取或 Vector3。如中所示 图 7, ,我还提供了返回规范化的矢量 (非常有用的事使用 3D 的计算结果发牌时) 的值成员。
图 7 SensorReading 类传感器数据模型
~~~
[DataContract]
public class SensorReading : ViewModel
{
DateTimeOffset _timestamp;
[DataMember]
public DateTimeOffset Timestamp
{
get { return _timestamp; }
set
{
SetValue(ref _timestamp, value, "Timestamp");
}
}
double _x;
[DataMember]
public double X
{
get { return _x; }
set
{
SetValue(ref _x, value, "X", "Value");
}
}
double _y;
[DataMember]
public double Y
{
get { return _y; }
set
{
SetValue(ref _y, value, "Y", "Value");
}
}
double _z;
[DataMember]
public double Z
{
get { return _z; }
set
{
SetValue(ref _z, value, "Z", "Value");
}
}
public double Value
{
get
{
return Math.Sqrt(X * X + Y * Y + Z * Z);
}
}
}
~~~
BandModel 用于管理带区,如中所示 图 8。这是可帮助我有多个带设备连接到我的 PC; 的情况下的管理器类它还可以告诉我任何带是否已连接。
图 8 BandModel 用于管理带区
~~~
public class BandModel : ViewModel
{
static IBandInfo _selectedBand;
public static IBandInfo SelectedBand
{
get { return BandModel._selectedBand; }
set { BandModel._selectedBand = value; }
}
private static IBandClient _bandClient;
public static IBandClient BandClient
{
get { return _bandClient; }
set
{
_bandClient = value;
}
}
public static bool IsConnected
{
get {
return BandClient != null;
}
}
public static async Task FindDevicesAsync()
{
var bands = await BandClientManager.Instance.GetBandsAsync();
if (bands != null && bands.Length > 0)
{
SelectedBand = bands[0]; // Take the first band
}
}
public static async Task InitAsync()
{
try
{
if (IsConnected)
return;
await FindDevicesAsync();
if (SelectedBand != null)
{
BandClient =
await BandClientManager.Instance.ConnectAsync(SelectedBand);
// Connected!
BandModel.BandClient.NotificationManager.VibrateAsync(
Microsoft.Band.Notifications.VibrationType.ExerciseRunLap);
}
}
catch (Exception x)
{
Debug.WriteLine(x.Message);
}
}
}
~~~
AccelerometerModel 是专为重力方面的杰出人物游戏设计的。重力是可有效地采用的带中内置的加速感应器传感器测量的力。现在,您看到创建数据模型类的方式 ;您可以添加要在您的应用程序中使用带传感器的任何其他类。当我需要初始化 Init 方法中的加速感应器类时,订阅了更便于呈现由带 SDK 的多个事件:
~~~
if (BandModel.IsConnected)
{
BandModel.BandClient.SensorManager.
Accelerometer.ReadingChanged +=
Accelerometer_ReadingChanged;
BandModel.BandClient.SensorManager.
Accelerometer.ReportingInterval =
TimeSpan.FromMilliseconds(16.0);
BandModel.BandClient.SensorManager.
Accelerometer.StartReadingsAsync(
new CancellationToken());
totalTime = 0.0;
}
~~~
第一个事件是 ReadingChanged。这是为我提供了数据从基于 ReportingInterval 我定义的时间段的加速感应器传感器的事件。用于读取加速感应器值,我使用 16 毫秒阈值。若要保留报告间隔越小越好精度,但在同一时间考虑与传感器的广泛使用提高了电池损耗至关重要。接下来,我调用 StartReadingsAsync,开始从传感器读取值并将其发送回应用程序的方法。此方法只需启动的侦听程序传感器数据读数。数据传递到 ReadingChanged 事件中。
在 ReadingChanged 事件我可以捕获读取并重新计算我的数据模型中的值:
~~~
void Accelerometer_ReadingChanged(object sender,
BandSensorReadingEventArgs<IBandAccelerometerReading> e)
{
SensorReading reading = new SensorReading {
X = e.SensorReading.AccelerationX, Y = e.SensorReading.AccelerationY,
Z = e.SensorReading.AccelerationZ };
_prev = _last;
_last = reading;
Recalculate();
}
~~~
重新计算模型方法是大部分我的逻辑会发生情况 (请参阅 图 9)。我想要在超过实现前面当我开始游戏时的值时激发回到此应用程序已更改的事件。请记住,我实现重力方面的杰出人物游戏在这里,因此我在寻找获得最佳结果。我想要确保我使用 Dispatcher 类,因为带传感器事件可能在非 UI 线程上触发,因此我需要封送对 UI 线程为我已更改的事件的代码。
图 9 重新计算模型方法
~~~
DateTimeOffset _startedTime = DateTimeOffset.MinValue;
double totalTime = 0.0;
double lastTime = 0.0;
SensorReading _prev;
SensorReading _last;
double MIN = 0.4;
void Recalculate()
{
if (_last.Value <= MIN)
{
if (_startedTime > DateTimeOffset.MinValue)
lastTime = (DateTimeOffset.Now - _startedTime).TotalSeconds;
else
_startedTime = DateTimeOffset.Now;
}
else
{
if (_startedTime > DateTimeOffset.MinValue)
{
lastTime = (DateTimeOffset.Now - _startedTime).TotalSeconds;
totalTime += lastTime;
lastTime = 0.0;
_startedTime = DateTimeOffset.MinValue;
CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(
CoreDispatcherPriority.Normal, () =>
{
if (Changed != null)
Changed(_last.Value);
});
}
}
}
¡ }
}
~~~
我的 UI 需要进行更新时返回事件来自带区 (请参阅 图 10)。这是在已更改事件中,我在我 MainPage.xaml 中订阅。我显示 G 强制和计数成就。我还调用带 haptic 反馈通过 VibrateAsync 方法。作为带用户的多个月,我非常喜欢能够发送 haptic 通知 (请记住无法滥用它,并通知用户仅在适当时)。
图 10 更新已更改的事件中的用户界面
~~~
void _accelerometerModel_Changed(double force)
{
bandCount++;
UpdateCount();
if (force > maxForce)
{
maxForce = force;
heroText.Text = String.Format("Intensity {0:F2}G", maxForce);
}
if (!isAchievementUnlocked && bandCount >= maxCount*0.2)
{
Speak("Just a few more!");
isAchievementUnlocked = true;
}
if (!isSecondAchievementUnlocked && isAchievementUnlocked &&
bandCount >= maxCount * 0.8)
{
Speak("Almost there!");
isAchievementUnlocked = true;
}
BandModel.BandClient.NotificationManager.VibrateAsync(
Microsoft.Band.Notifications.VibrationType.ExerciseRunLap);
// Speak(bandCount.ToString()+"!");
}
~~~
## 让有趣开始
现在,一切就绪,让有趣开始。生成并启动该应用程序: 请记住,在任何 Windows 10 设备上运行的应用程序。因为我使用了带传感器,我不关心加速感应器有关的 PC 或电话支持。我将使用一台 PC 以带区将执行所有艰辛的工作时显示从该带区的信息。
如中所示 图 11, ,当您启动该应用程序第一次是否从 Visual Studio 或从该磁贴,Windows 10 会自动提示您确认您想要重力方面的杰出人物的应用程序访问权限授予带 ; 只需选择是。
![](https://box.kancloud.cn/2016-01-08_568f4ae9307ea.png)
图 11 Windows 10 对话框自动请求访问带区
当重力方面的杰出人物连接到带区时,您将体会振动的带区。这样做是有意,为了让您知道所有内容设置为跳转。我还添加了可听见的提示来通知您可以启动操作:
~~~
BandModel.BandClient.NotificationManager.VibrateAsync(
Microsoft.Band.Notifications.VibrationType.ExerciseRunLap);
~~~
现在,请跳转。应用程序将计数您跳转和祝贺您在每个项成就上。
这篇文章的所有示例代码都位于可在 GitHub 上: [bit.ly/1MIKIIK](http://bit.ly/1MIKIIK)。若要使用此源可以使用 Visual Studio 2015 和 Windows 10。该项目时使用 Microsoft 带 SDK NuGet 程序包。
## 总结
Microsoft Band 提供了功能强大的 SDK 以及对多平台(Windows、Android 和 iOS)的社区支持。开发人员可以使用 Microsoft Sdk 以及从 Xamarin、 GitHub 和开发人员社区的社区组件来扩展应用程序以使用 Microsoft 带。可以使用本文中的代码来为 Windows 10 将 Microsoft 带集成到自己的应用程序。
* * *
Kevin Ashley *是 Microsoft 的高级游戏开发人员推广人员。他是 《 Professional Windows 8 Programming 》 (Wrox,2012年) 的合著者和 top 的应用程序和游戏,最值得注意的是 Active Fitness,它具有超过 2 百万的用户的开发人员 ([activefitness.co](http://activefitness.co/))。他经常在各种事件、 行业显示和网络广播的技术提供了。在他的职责,他是与创业公司和合作伙伴,为提供关于软件设计、 业务和技术战略、 体系结构和开发。您可以在他的博客中跟踪 Ashley [kevinashley.com](http://kevinashley.com/) 和在 Twitter 上关注[@kashleytwit](http://twitter.com/kashleytwit)。*
- 介绍
- Microsoft Azure - Microsoft Azure - 大图
- 崛起 - 新手成功的秘诀
- ASP.NET - 借助 OmniSharp 和 Yeoman 随时随地使用 ASP.NET 5
- 使用 C++ 进行 Windows 开发 - Visual C++ 2015 中的协同例程
- Visual Studio - Bower: 用于 Web 开发的新型工具
- 测试运行 - 使用 C# 实现线性判别分析
- 代码分析 - 借助与 NuGet 集成的 Roslyn 代码分析来生成和部署库
- 孜孜不倦的程序员 - 如何成为 MEAN: 快速安装
- Microsoft Band - 借助 Microsoft Band SDK 开发 Windows 10 应用程序
- C# - C# 中的一种分裂与合并表达式分析器
- 别让我打开话匣子 - 过时的东西
- 编者寄语 - 灾难链