# 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/))。
?
圖 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")。如果該狀態顯示"已連接",您就可以運行 ;否則為點擊對并按照提示進行操作。
?
圖 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。

圖 3 Microsoft 帶 NuGet 包
Microsoft 帶 SDK 允許開發人員能夠訪問的帶區創建和更新磁貼和個性化該設備上的傳感器。您的應用程序可以發送通知,包括 haptics,到帶區。帶區本身具有很好、 清理和簡單介紹,如中所示?圖 4。

圖 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 解決方案。
?
圖 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 會自動提示您確認您想要重力方面的杰出人物的應用程序訪問權限授予帶 ; 只需選擇是。
?
圖 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# 中的一種分裂與合并表達式分析器
- 別讓我打開話匣子 - 過時的東西
- 編者寄語 - 災難鏈