2016年6月11日 星期六

40歲

在這個時間點該寫下的一句話, 為了這個其實我想了很久. 這 30 年來的求知生涯裡, 唯一不變的就是 "變", 唯一直得懷疑的就是真理. 所以我覺的留這句話寫給以後的自己....
.
"懷疑所有你認為正確的事情"

2016年6月1日 星期三

Microsoft Azure IoT certification

筆記一下做 IoT device 認證的流程. 在這裡先說我的結論: IoT device 認證硬體所需要的, 就是可以連 internet 的 ethernet 界面 (ethernet 可能是模擬的那也可以, 但一定要可以連 internet, 因為最後要連去 azure cloud server 做認證), 其中最主要的部份是加解密, 你 device 送出的加密資料 iot device explorer 可以解, device explorer 送出的加密資料你 device 可以解的開, 這樣才可以完成認證. 我認為對 Microsoft 來說它的重點在加解密.
至於 internet 連線能力最好是 raw package 不是靠 TCP/IP stack, 有沒有在 NAT 後面無所謂.

1. Azure 相關環境的建置:


整體流程參考文章..
https://azure.microsoft.com/zh-tw/documentation/articles/iot-hub-tested-configurations/
  • 首先你要有 microsoft 的帳號, hotmail.com 還是 outlook.com 這類的都可以.
  • 這個帳號要綁信用卡... (這點可以說是整個流程裡最棘手的部份)
至於帳號怎麼用信用卡付費, 還有一套跟 Microsoft 申請的流程要跑, 因為這個流程會隨 Azure portal 界面更改而小有變動, 目前不寫在這裡. 目前 (2016/06) 以它免費帳號附贈的 6300NTD 額度來說, 只是做這個認證, 完全花不到裡面的額度. 即使是如此, 我還是去申請了發票請款...

在申請完 azure 帳號後, 要照這個文件設定一個 azure 端的 iothub service
https://github.com/Azure/azure-iot-sdks/blob/master/doc/setup_iothub.md
如文件所述, 記得把 primary key copy 下來, 會用在 device explorer 上.

device explorer 有可以直接安裝的 .msi 檔 (它有 source-code, 但重編它意義不大) 可用:
https://github.com/Azure/azure-iot-sdks/releases
目前 device explorer 僅能在 windows 下執行. 安裝好後執行它, 參考設定文件:
https://github.com/Azure/azure-iot-sdks/blob/master/doc/manage_iot_hub.md#device-explorer
把剛剛從 azure portal 上 copy 下的 primary key 貼在 configuration 中, 再從 device explorer 裡新增你要認證的 IoT device 型號, 此時你會再得到另一組新 key, 選到 "Copy connection string" copy 下這個字串.

這個字串很重要, 就是你日後要改 c#, 改 c sample code 裡的那個關鍵字串. 以下就是 code work.

Device Explorer 雖然目前只能在 Windows 上跑, 但對於認證並不影響, linux iot device 測試一樣要連到這台裝了 Device Explorer 的 Windows 機器上, Windows 也是.

2. Ubuntu linux 14.04.4 LTS armhf (for C)

先講 ubuntu 是因為拉它的 sample code 用 git 比較方便, 有 linux / windows 雙修的人我建議先用 linux git 把整包 code 拉下來後再分給 linux 或 windows 機器去編.
  • git clone --recursive https://github.com/Azure/azure-iot-sdks.git
以下是在板子上做編譯的動作, 我沒有試過拿 linaro 的 gcc 4.9 tool-chain 去 cross-compile 這個 sample code, 因為它只要對應的 SSL library 那些東西版本不對, 就算編的過也過不了測試.
需要安裝這些東西:
  • sudo apt-get update
  • sudo apt-get install -y curl libcurl4-openssl-dev build-essential cmake git libssl-dev uuid-dev

再檢查版本是否合乎需求
  • cmake --version
  • gcc --version
因為這包 sample code 需要 cmake 2,8,12 以上, gcc 4.9 以上才能正常工作, 裝 cmake 時就會強迫把 gcc 4.8 相關套件也全裝上去. 裝 gcc 4.9 需要這些步驟:
  • sudo apt-get install -y software-properties-common
  • sudo add-apt-repository ppa:ubuntu-toolchain-r/test
  • sudo apt-get update
  • sudo apt-get -y install gcc-4.9 g++-4.9
  • sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.9
  • (update 2016/09/12 see update note)

如同參考文件:
https://github.com/Azure/azure-iot-sdks/blob/master/doc/get_started/ubuntu-ankaa-c.md
一樣, 修改以下三個檔案
  • azure-iot-sdks/c/iothub_client/samples/iothub_client_sample_amqp/iothub_client_sample_amqp.c
  • azure-iot-sdks/c/iothub_client/samples/iothub_client_sample_http/iothub_client_sample_http.c
  • azure-iot-sdks/c/iothub_client/samples/iothub_client_sample_mqtt/iothub_client_sample_mqtt.c

  • static const char* connectionString = "[device connection string]"; 
的部份, [device connection string] 就是用前面講的 Device Explorer 中 Copy connection string 出的字串.
再來才是
  • sudo azure-iot-sdks/c/build_all/linux/build.sh

最後它會做些測試, 只要看以上三個 sample code self-test 沒過, 大部份就是 ssl library 之類的套件不合需求所致. 例如我在 debian 8.4 上做同樣的事, debian 8.4 有原生的 gcc 4.9.2, 但編出來的東西就是不能用.

測試時有裝 Device Explorer 的 Windows 機器要開機開著, 選好 device 後, 點選 monitor 開始監聽來自這個 iot device 發的訊息, 跟送出給這個 iot device 的訊息, 就可以完成測試.

ps1. 因為 ubuntu 14.04 base-core 只有 armhf, 所以我不知道 armel 能不能編的過.
ps2. 如果確定 target ARM 是 ARMv7 的機器, 可以試著使用 ubuntu 14.04 base-core 套件
http://cdimage.ubuntu.com/ubuntu-base/releases/14.04/release/
的 rootfs 掛起來後, 再去編譯. 如前面所述, 此時的 kernel 只要打通 UART (for debug) 跟 ethernet 就可以測試,
ps3. 三個 sample code 預設都不會 printf 出它送出的訊息, 只能靠從 Device Explorer 接收到的訊息判斷是否可以正常溝通. 需要進一步資料正確性驗證工作的請自己改 code. Device Explorer 收到訊息的樣子請參考下圖 Windows 10 的範例, 送出的嘛............... 因為訊息太亂我不想貼了 sorry (重點是根本無從驗證正不正確)

3.Windows 10 (for C#)

目前編譯環境 Windows 僅能支援 10. (ps. 按照原始的文件, 你必需要在要認證的裝置上跑那個 code builder, 但實際上個人實驗的結果是根本不需要, 只需要執行編譯出來的 binary 就可以)

首先的要裝一個 Windows 10, 專業版或個人版都可以, 試用就可以不需要正式版 (正不正式看你需要...). 裝好後第一件事情就是 setting, security and update, developer mode 打開.
安裝 visualstudio 2015 (community 版即可)
https://www.visualstudio.com/en-us/downloads/download-visual-studio-vs.aspx
只知道需要幾樣元件有:
  • Programming Languages
    • Visual C++
      • Common Tools for Visual C++ 2015
  • Windows and Web Development
    • Microsoft SQL Server Data Tools

安裝網路版 SDK:

網路版安裝有一個好處, 它會幫你檢查 vs2015 有沒有欠缺元件.

下載前面講的檔案
https://github.com/Azure/azure-iot-sdks
(Windows 用戶可以點選旁邊的 "clone or download" 再 download zip 下載, 可是個人比較信任它的 git clone 能力...), 解開壓縮檔.

如同文件
https://github.com/Azure/azure-iot-sdks/blob/master/doc/get_started/windows10-aaeon-up-csharp.md
所述, 修改 program.cs 中 private const string DeviceConnectionString = "replace";, "replace" 就是用前面講的 Device Explorer 中 Copy connection string 出的字串. 然後 build solution.

要測試時, 進 console, 到 project 的 release folder 下執行該 .exe 檔...
azure-iot-sdks-master\csharp\device\samples\DeviceClientAmqpSample\bin\Release\
送出成功會像這樣:
Device Explorer 收到會像這樣:


ps1. 如果此時提示 Microsoft.Zaure.Devices.Client.DLL 找不到, 請先嘗試 build Microsoft.Zaure.Devices.Client 這單一個 project 試試看. 如果這一個失敗, 後面三個 sample code 就算編的起來也不能使用.

ps2. 用 vs2015 打開 iothub_csharp_client.sln, 打開後 vs2015 會提示是否要安裝欠缺的套件, 如果沒有出現, 可以嘗試看看 solution explore 那邊有沒有 "install missing feature(s)" 的選項, 安裝欠缺的套件. 個人建議 android SDK 跟 iOS SDK 可以不用裝, 因為此時的重點是 C#.

最後, 要把 build log 存起來, 寄給微軟時會要用到.

added note 2016/06/23 根據這篇文
http://www.inside.com.tw/2016/06/21/connecting-to-microsoft-azure-iot-hub-using-mqtt
所述, Device Explore 給的 key 有可能只有 24 小時的效力, azure portal 看到 iot hub 的那個 primary key 我則是確定可以用很多天 (其實是我沒換...) 都還有效. Device Explore 配發給 device 的 ssh key 是不是只有 24 小時內有效, 我不知道, 等有機會我再試...
update 20160912:
今天看到 ubuntu 14.04.5 LTS 更新裡有 gcc 4.9 (不是只有 base 而已) 可用, 看來可以直接裝.