本文章是由機器翻譯。

Azure 內幕消息

詳細資訊:從原始硬體到可使用雲端的裝置

Bruno Terkaly
Steven Edouard

Bruno Terkaly and Ricardo Villalobos還有一個新的淘金熱發生,它不是貴重金屬。它是關於建築創新的設備,為消費者和將它們連接到雲。新的微軟首席執行官 Satya Nadella 說去年三月設備是"無雲真沒意思"。

這有道理。如果該設備收集資訊通過感應器或觀景窗,如何以及在何處將你分析此資料?畢竟,這些低端的設備,如樹莓 Pi 計算能力和存儲空間也有限。雲彩填補這一空白,更進一步,説明與安全、 裝置管理,等等。所以這個月,我們想要卷起我們的袖子,從硬體和軟體的角度來看,學習如何才能真正接受這種新的計算範例。

SmartDoor 是我們將建立從地面的物聯網 (物聯網) 產品。我們最終將附加一個門鈴、 觀景窗和覆盆子 Pi 計算裝置 (請參閱圖 1)。這個想法是有人到達您的家門口,敲響你家的門鈴。一旦他們按下門鈴,該設備將自動使用一張照片。然後這張照片被轉發到行動裝置作為推送通知訊息 (見圖 2)。該消息具有超連結的形象站在你家門口的人。這項發明的靈感需要知道誰你按門鈴,即使你不回家。

這個專案結合門鈴、 觀景窗和覆盆子的 Pi 設備
圖 1 這個專案結合門鈴、 觀景窗和覆盆子的 Pi 設備

Windows Phone 接收推式通知
圖 2 Windows Phone 接收推式通知

我們先來說明到底如何購買和組裝原始硬體。一旦我們建立硬體,我們會建造本身,在設備運行的軟體,以及運行在微軟 Azure 的軟體。這和將來的文章,不過,將主要集中于所需的軟體。

我們需要的代碼必須能夠拍攝照片,然後將其上載到 Azure。從那裡,它將需要向適當的行動裝置發送推式通知。這將表明有人按下門鈴,和一張照片的那個人是可用。由於這個專案的雄心勃勃的性質,我們會提供大量的博客文章來支援工作,並提供所需要的細節。

Pi 一樣容易

我們會解決運行對樹莓派設備本身和一些將在雲中運行的代碼的代碼 — — 特別是在 Azure 移動服務。對樹莓派,我們會安裝並運行單,這是由 Xamarin 提供的工具組括 C# 編譯器和 CLR 的 Microsoft.NET 框架相容組領導一個免費、 開放原始碼專案。

單聲道的優勢在於它可以讓你編寫.NET 代碼在 Windows 上進行編譯和運行它不變的樹莓派。在我們的例子中,我們會拍一張照片,並將其上載到 Azure 存儲空間。在將來的文章,我們將擴展代碼庫支援的能力將推式通知發送到 Windows Phone。要做到這一點,我們必須利用 Azure 服務匯流排中的推送通知和編寫 Windows 應用商店或 Windows Phone 的應用程式。

聚在一起的硬體是直截了當的因為幾乎所有的它是被稱為 Canakit 的單樹莓派工具組中可用。有關更多詳細資訊,請轉到 canakit.com。 套件包含幾個有用的東西,去得到我們的物聯網設備建造,包括主機板、 交流配接器、 通用輸入/輸出 (GPIO) 突破、 線路板、 線路板的電線,什錦反戰者和指示燈。你還需要外接顯示器、 鍵盤和滑鼠以便你可以配置和測試樹莓派。除了 Canakit,你需要兩個更多的東西 — — 一個週期性門鈴和覆盆子的 Pi 相容的觀景窗,這兩個國家很容易就可以找到。

雖然在硬體樁圖 3 可能看起來嚇人,其實很簡單,放在一起。如果你可以建造一個拼圖遊戲,您可以構建一個像 SmartDoor 一樣的設備。首先,將相機模組插在樹莓派主機板。從袋子裡拿相機並附加到樹莓派板的電纜。去 bit.ly/1rk3vzk 有關將照片發送到雲計算的更多詳細資訊。

覆盆子 Pi Canakit (不包括攝像機)
圖 3 覆盆子 Pi Canakit (不包括攝像機)

我們將介紹門鈴本身在以後的文章中,在那裡我們將焊料,它對樹莓派完全的安裝。現在,我們會將附加線路板,是插入到樹莓派電氣電路測試版本。我們可以使用跨接電纜和案板來類比門鈴。

核心元件之一是 GPIO 線路板。GPIO 是用 26 單獨別針 (左到右編號),讓你擴充該系統以與其他設備進行交互的硬體電路。一般來說,這些針腳讓你連接諸如感應器、 執行器、 指示燈等。雖然有不同類型的針腳。例如,有兩個針腳連接設備,專門 3.3 伏和 5 伏提供動力源。也是充當地面,有必要定義一個電路為 0 伏針。標記 GPIO 引腳作為一個簡單的關閉開關。如果您希望執行串列通訊,你會發現 TX 和 RX 引腳 (RS-232) 來傳輸和接收資料。在設備運行的軟體將需要與這些針腳進行通信。

在處理複雜性之一具有這些引腳之間的物理與邏輯的針腳與軟體通信針腳不匹配。這是博通晶片樹莓派設備中。這意味著如果一個信號到 0 GPIO 引腳,您的軟體實際上需要讀取 pin GPIO 17。 它可以是不合邏輯的所以要小心。

有其他關鍵硬體元件。電阻方面發揮關鍵作用控制電流的流動,降低電壓水準,所以你不要煎覆盆子 Pi 或任何其他設備連接到它。你還需要單芯線連接到樹莓派的 GPIO 單位。

測試測試

因此,我們需要確保我們建立了正確的硬體。最簡單的方法來測試樹莓派是只需插入外接顯示器、 鍵盤、 可選滑鼠和電源。一旦這樣做了,插上電源,Linux 的啟動序列應出現。預設的使用者名將"pi",該密碼將"覆盆子"。去 bit.ly/1k8xBFn 有關設置樹莓派的更多詳細資訊。

樹莓派需要額外的軟體,如單必須能夠運行的 C# 代碼。我們可以做任何事情的設備之前,我們將需要更新其 Raspbian OS。幸運的是,Pi 帶有預­安裝的版本。所有我們需要做是發佈了一套在主控台視窗中的命令來更新作業系統與最新的版本。然後我們可以從 Xamarin 和某些受信任的根憑證安裝單聲道的運行時。這些會讓設備使 HTTPS 請求。所有這些步驟所述的博客張貼內容在 bit.ly/Unehrr

軟體方面

有兩層架構,我們需要針對用戶端層 (樹莓派設備本身) 和服務層 (Azure 存儲和 Azure 移動服務) 的代碼。有各種語言和後端服務可供選擇。我們將 C# 用戶端和 Node.js/JavaScript 在伺服器上運行。因為有些人覺得兩種不同的語言,使執行工作複雜化,這可以是一個有爭議的選擇。

我們的目標是要展現多樣性。在 Node.js,我們相信許多圖書館和位於 npmjs.org 的包可以讓你的伺服器代碼容易得多。因為圖書館是如此強大,Node.js 經常結果小得多的代碼庫中。第二種語言更少的代碼比大量的代碼相同的語言要好。中的圖表圖 4 強調該預期的工作流,歸結為三個步驟:

  1. 用戶端請求共用訪問簽名 (SAS) 權杖,它作為一個 URL。
  2. 運行在 Azure 移動服務內的 Node.js 應用程式將返回一個 SAS URL。
  3. 用戶端將使用 SAS URL 將照片上傳到 Azure 存儲作為一個 blob。

高級別的 SmartDoor 專案的建築圖
圖 4 高級別的 SmartDoor 專案的建築圖

我們主辦我們 Node.js Azure 移動服務範圍內的應用程式。這為行動裝置用戶端推送通知、 CRUD 存儲集成、 身份和能力建立一個自訂的 API 提供了大量的預構建的支援。

專注于服務

我們先來建設我們的服務,因為它將開發用戶端,如果沒有服務層的代碼。將沒有辦法實際運行,並測試用戶端,除非你有一個功能齊全的後端服務。蔚藍的移動服務將主辦我們服務 API。

此自訂的 API 將基於 Node.js 和表達的 Web 框架。我們的客戶 (覆盆子 Pi) 將使用這些服務請求 SAS。然後該服務將使用該標記來上傳 Azure 存儲所需的照片。使用 SaS 的 URL 可以説明保護我們的 Azure 存儲帳戶,因為我們不需要在樹莓派中存儲的帳戶憑據。

我們將額外的安全問題在過去的文章 (msdn.microsoft.com/magazine/dn574801) 中使用時。SAS 權杖也是好的另一個原因 — — 他們擺脫中介層 (Node.js API) 不必經紀人從用戶端到存儲檔的傳送。

移動和存儲資源調配

資源調配 Azure 移動服務包括在蔚藍的入口網站中的幾個點擊。同樣是 Azure 存儲資源調配。隨著配置的任何東西,你需要去思考的 Url 和您想要為您的基於雲計算的服務使用的命名約定。您還應該考慮這幾個的全球資料中心,您想要使用,確保您的存儲帳戶處於同一個資料中心作為 Azure 的移動服務,以減少延遲,避免資料傳輸費用。您可以找到更詳細的步驟的資源調配帳號 Azure 移動服務和 Azure 存儲在 bit.ly/WyQird

共用的訪問簽名

如中所示圖 4,樹莓派用戶端將請求一個 SAS 權杖從 Azure 移動服務。從我們在 Azure 移動服務內定義的 API 發出一個 get 請求,它會這樣做。SAS 權杖免費中介層 (Node.js API) 從代理傳輸到存儲從用戶端的檔。

中的代碼圖 5 Node.js 運行在 Azure 移動服務作為 API 服務終結點內的一段摘錄。目的是從需要 SAS 的樹莓派用戶端請求的回應。樹莓派會發出反對主辦在 Azure 移動服務的終結點的"get"請求傳遞應用程式的鍵,它是識別碼唯一地表示我們的手機服務。

圖 5 所示 Node.js Code 為微軟 Azure 移動服務 API

exports.get = function(request, response) {
  // These are part of "App Settings" in the configuration section
  // of your service. Shouldn't be hardcoded into this Node.js script.
  containerName = request.service.config.appSettings.PhotoContainerName;
    accountName = request.service.config.appSettings.AccountName;
    accountKey = request.service.config.appSettings.AccountKey;
  // Connect to the Blob service.
  blobService = azure.createBlobService(
    accountName,accountKey,accountName + '.blob.core.windows.net');
  createContainer();
  createPolicies();
  var sasResponse = GetSAS();
  return request.respond(201, sasResponse);
}

應用程式鍵表示以安全的方式與具體的 Azure 移動服務進行通信。這項服務將從門戶,樹莓派上運行的代碼將使用,獲取此金鑰,所以你應該留下它派上用場。然後你可以將它粘貼到用戶端代碼。用戶端接收到 SAS 封裝在 URL 內用戶端可以使用在以後的操作中上, 傳一張照片。

現在我們將重點放在一些表示伺服器端 Node.js 應用程式的代碼。還有強大的 Node.js SDK 量身打造 azure 發售 bit.ly/Unnikj。這個代碼庫的 Azure 平臺,如工作表、 佇列、 主題、 核心管理通知集線器等其他部分提供了大量的支援。你可以找到一個教程上整合 Node.js 和 Azure Blob 存儲在 bit.ly/1nBEvBa

我們的目的而言,Node.JS 應用程式返回到用戶端的 SAS 被綁在我們先前設置的存儲帳戶。因此,Node.js 應用程式將需要存儲帳戶的帳戶名稱和管理金鑰。

蔚藍的移動服務允許您具體化從 Node.js 應用程式的配置設置。它通常是糟糕的程式設計實踐,對直接在代碼中硬編碼帳戶金鑰設置。應用程式設定允許您設置服務運行時可以讀取的鍵-值對。你可以瞭解更多關於它在 bit.ly/1pwGFRN

最終,Node.js 代碼將返回一個 URL 的用戶端可以使用上載照片的 SA。隨著 SAS 權杖,Node.js 應用程式返回 201 HTTP 狀態。 這意味著它符合這一請求,並創建一個新的資源 (SAS 標記)。

你會發現一個更詳細的演練涉及 Node.js、 SAS URL 和在應用程式設定 bit.ly/WyQird

裡面的覆盆子 Pi 代碼

硬體和軟體的介面是相當簡單的。可以將用戶端代碼看作一個巨大的狀態機。它是在不斷迴圈檢查的 GPIO 引腳的狀態中。正如你可以看到從代碼中圖 6,我們就只檢查看看是否一根針是打開還是關閉,true 或 false。

圖 6 長輪詢迴圈介面與覆盆子 Pi GPIO 來控制行為

while (true)
{
  // If pin 17 is off, we are ready.
  if (!s_Gpio.InputPin(FileGPIO.FileGPIO.enumPIN.gpio17))
  {
    showReady(true);
    // If pin 22 is true, indicate to the user that the system is busy,
    // take a photograph and then upload to the cloud.
    if (s_Gpio.InputPin(FileGPIO.FileGPIO.enumPIN.gpio22))
    {
      showReady(false);
      TakeAndSendPicture();
    }
  }
  else
  {
    // Not ready to take a photo yet.
    showReady(false);
    break;
  }
  // Pause for one-tenth of a second.
  System.Threading.Thread.Sleep(100);
}

有兩種方法檢查引腳狀態。第一種方法,我們已經在這裡,其中一個是談到檔案系統。通過檢查特定檔與特定的值,我們可以確定是否一根針是打開還是關閉。另一種方法,通常提供更高的性能,是檢查特定值的記憶體中的特定位置。雖然它會慢些上班用的檔案系統,認為更安全。這種方法利用 linux 系統提供的內置驅動程式。

讓我們解決一些將運行在單覆盆子 Pi 使用 C# 的代碼。覆盆子 Pi 將執行四個基本步驟。首先,它將回應有人按門鈴按鈕。第二,基於門鈴按鈕,它會拍一張照片並將其保存到本機存放區區。第三,它將請求一個 SAS 權杖,然後使用它來上傳一張照片。第四,它將上傳照片到 Azure 存儲作為一個 blob。雖然在 C# 中編寫代碼,它是所有基於休息。這意味著任何語言或環境能夠 HTTP 可以執行這四個步驟。

我們可以通過溝通 GPIO 控制樹莓派。有只有四個點在我們的應用程式要使用 GPIO 2 的輸入和 GPIO 1 的輸出。我們將介紹一些 C# 代碼的介面與這些針腳。看看主回路中的覆盆子 Pi C# 代碼的圖 6。引腳 17 和 22 用來測試設備就緒,採取並上傳照片,基於門鈴按鈕。

這個無限長輪詢迴圈不停的檢查引腳電壓。所以軟體知道事情需要完成 — — 像拍張照片。這種迴圈運行在大約 10 赫茲,它會輪詢引腳狀態。如果你有興趣瞭解更多關於基準測試速度,請轉到 bit.ly/1trFzt9

各種語言以不同的速度運行。例如,Python 是相當緩慢和不能使用它在場景中,速度是關鍵。在這種情況下,10 赫茲是不夠快,以檢查是否門鈴開關已掌權拔銷 22,當有人按下它時。

每三個銷執行不同的功能。第一個輸入,pin 17,必須連接到接地引腳 (這由 C# 作為假解釋)。如果這不這種方式配置,程式將退出。銷 22 必須設置為電源 (這會被解釋為 true)。當銷 22 屬即時,拍照過程開始在 TakeAndSend­圖片。ShowReady 方法使用引腳 4,輸出插針,以顯示程式已準備好拍攝和上傳圖片,通過 LED 驅動。

此解決方案利用條件編譯符號,所以適當的代碼運行在 Raspbian 作業系統上,與正常的 Windows/桌面作業系統。在解決方案中的代碼必須是不同的因為在 Raspbian 作業系統下拍照並非 API 呼叫。它涉及到在它自己的進程中運行的可執行檔。另一方面,根據 Windows 8,您利用 CaptureFileAsync API CameraCaptureUI。

採取的照片,我們調用內置 raspistill 可執行檔中所示圖 7。這已經被配置為拍張照片並將其保存為 jpeg 格式。這允許您指定的檔案名、 照片品質和圖像的大小。Raspistill 是作為子流程開始的。雖然這張照片被採取,代碼從 Azure 移動服務請求的 SAS URL。它然後將圖片上載到 Azure Blob 存儲。

圖 7,拍張照片並上傳到雲

static void TakeAndSendPicture()
{
#if LINUX
  // Start photo-taking process. This will kick off the raspistill process.
  // We'll wait for it to exit after we get the photo URL.
  Process raspistill = new Process();
  raspistill.StartInfo = new ProcessStartInfo("/usr/bin/raspistill",
    "-n -q " + photoQuality +
    " -o /home/pi/Desktop/me.jpg -h 200 -w 200 -t 500")
    {
      UseShellExecute = false
    };
    raspistill.Start();
#endif
  // Get Photo URL while the picture is being taken.
  WebRequest photoRequest = WebRequest.Create(
    "https://raspberrypiservice.azure-mobile.net/api/getuploadblobsas?");
  photoRequest.Method = "GET";
  photoRequest.Headers.Add("X-ZUMO-APPLICATION", 
    "AIzNtpTdQLjORKJJhTrQWWRSHSnXcN78");
  PhotoResponse photoResp = null;
  using (var sbPhotoResponseStream = 
    photoRequest.GetResponse().GetResponseStream())
  {
    StreamReader sr = new StreamReader(sbPhotoResponseStream);
    string data = sr.ReadToEnd();
    photoResp = JsonConvert.DeserializeObject<PhotoResponse>(data);
  }
  Console.WriteLine("Pushing photo to SAS Url: " + photoResp.sasUrl);
  WebRequest putPhotoRequest = WebRequest.Create(photoResp.sasUrl);
  putPhotoRequest.Method = "PUT";
  putPhotoRequest.Headers.Add("x-ms-blob-type", "BlockBlob");
#if LINUX
  // Wait until the photo is taken.
  raspistill.WaitForExit();
  FileStream fs = new FileStream(@"/home/pi/Desktop/me.jpg", 
    FileMode.Open);
#else
  FileStream fs = new FileStream(@"testPhoto.jpg", FileMode.Open);
#endif
  using (fs)
  using (var reqStream = putPhotoRequest.GetRequestStream())
  {
    Console.WriteLine("Writing photo to blob...");
    fs.CopyTo(reqStream);
  }
  using (putPhotoRequest.GetResponse())
  {
  }
}

Visual Studio解決方案生成的運行對樹莓派,以及傳統的 Windows 作業系統。此解決方案利用條件編譯符號,以便在 Raspbian OS 與正常的 Windows 桌面作業系統上運行相應的代碼。在解決方案中的代碼必須是不同的因為拍一張照片在 Raspbian 作業系統下的是特定于平臺的。為了保持事情簡單,編譯為 Windows 8 時,我們不要拍張照片。相反,我們將現有的映射 (testPhoto.jpg) 上載到雲。

好消息是代碼的你可以共用大量的 Windows 和 Raspbian 之間。一切從獲取上傳照片 SAS 是相同的。所以如果它工作在 Windows 中,,對 Raspbian 也最有可能將工作方式相同。這大大簡化了用戶端基於代碼的開發和測試。覆盆子 Pi 是一個約束的設備,所以,最好儘量減少設備本身所作的工作。

一旦該設備需要一張照片,你應該能夠看到在兩個地方。首先是設備本身,特別是在 /home/pi/Desktop/me.jpg,它在命令列指定的位置上。然後,當然,整個點是將圖像上傳到 Azure 存儲帳戶容器。

總結

這是構建您自己的物聯網設備的堅實起點。我們試圖解決一切從採購五金、 裝配、 安裝軟體、 編寫軟體和測試功能。我們還已經提供了許多支援的博客文章。但這種解決方案並不完整。

在下一篇文章中,我們會處理推式通知發送到手機中,以便您可以查看在行動裝置上按門鈴的人的照片的方式。我們將介紹通知服務,這是 Azure 服務匯流排的一部分。 我們還將構建一個 Windows Phone 應用程式能夠從 Azure 接收推式通知。最後,我們會涉及額外的存儲機制,如使用 MongoDB NoSQL 資料庫和連接著一張臉識別回結束。敬請期待更多互聯網的東西 Azure。


Bruno Terkaly 是微軟的開發人員福音傳教士。他的知識深度來自多年的經驗在欄位中,使用大量的平臺、 語言、 框架、 Sdk、 庫和 Api 編寫代碼。他花時間寫代碼、 博客和直播演講上構建基於雲的應用程式,具體地使用微軟 Azure 平臺。你可以讀他的博客 blogs.msdn.com/b/brunoterkaly

Steven Edouard 是微軟的開發人員福音傳教士。在此之前,他擔任在.NET 運行時團隊提供產品,如.NET 框架 4.5 和.NET 本地編譯的軟體測試工程師。現在他的激情所在令人興奮的人物,對雲計算服務,通過開展技術演示、 線上內容和演示文稿的無限潛力。

感謝以下的微軟技術專家對其進行審查:Gil以撒斯和布倫特 Stineman
在已經持續了 20 多年的 IT 職業生涯,布倫特 Stineman 已觸及一切從移動到主機。目前,他用他的激情為雲計算和 Azure 平臺來説明授權企業架構師作為福音傳教士與微軟的開發人員體驗 (DX) 處技術傳福音與發展 (TED) 組。您可以按照在布倫特:twitter.com/brentCodeMonkey

Gil以撒斯是微軟 Azure 平臺開發經驗 (DX) 司技術福音傳教士。他的角色是説明客戶隨著基於雲計算的架構更快地獲得成功。Gil經驗基於多年來花了編碼和説明客戶解決問題跨異類混合技術。Gil目前主要致力於將開放源碼技術到 Azure。您可以按照在Gil twitter.com/gilisaacs