Microsoft Azure IoT 开发工具

混合软件包

Microsoft Azure作为其云计算分支,提供了一个混合软件包,300MB的混合压缩包,一次性搞定所有安装步骤。混合压缩包中的install.cmd脚本尝试智能化地识别并安装依赖项,会跳过安装某些已经安装项目。

但是。发现在Yarn安装node.js包时存在很长时间延时,且没有任何提示。即使使用科学上网方式,系统也没有任何提示和改进。个人觉得在(国内环境)本地开发中如果使用Node.js,不如使用Python更加简单。

混合软件包,差评!

手动安装

如果自动安装搞不定,可以参考此网页来手动安装。

安装azure-cli

azure-cli,是Azure云计算的跨平台远程命令行工具,主要依赖于Python和pip。

下载 azure-cli.msi 后安装到系统中。在Windows Bash/Linux/MAC系统中安装可以参考完整安装教程。

安装成功

安装Arduino IDE

Azure IoT采用Arduino Wiring API,所以采用C++编程。其IDE概念来自Processing IDE,所以采用Java编程。

下载Arduino IDE for Windows,并安装。

安装成功

安装Visual Studio Code

Visual Studio是微软的传统开发工具,也是Azure IoT的主要开发工具,不过Visual Studio Code却采用了Node.js进行开发,所以其缺省支持JavaScript/TypeScript/Node.js,对于其他语言则采用扩展方式提供。

下载Visual Studio Code for Windows,并安装。

安装成功

安装Node.js

下载Node.js Windows Installer,并安装。

安装工具包

下载最新版本工具压缩包:https://aka.ms/devkit/prod/installpackage/tasks/latest

将压缩包解压在C:\Users\[your name]中,并新建Windows命令行环境,并运行:

cd C:\Users\[your name]\azure-board-cli
npm install

你可以看到一大堆安装日志...... balabalabala......最后唧唧歪歪给了几个报警,可以忽略。

安装VSC的Arduino扩展插件

启动VSC,在左侧垂直面板中点击扩展图标,并搜索Arduino,选择Microsoft提供的Arduino for Visual Studio Code,点击安装。

Microsoft Azure IoT 开发工具_第1张图片
installation-extensions-win.png

首次安装失败,报XHR错误,安装过程漫长且没有进度条,差评!

重启VSC后,再次安装成功,并安装了C/C++工具链。

安装硬件BSP

使用Ctrl+Shift+P,输入Arduino,寻找并选中Arduino:Board Manager。选中右下侧的Addtional URL按钮。

Microsoft Azure IoT 开发工具_第2张图片
installation-additional-urls-win.png

settings.json文件中的User Setting面板中添加以下文字:

 "arduino.additionalUrls": "https://raw.githubusercontent.com/VSChina/azureiotdevkit_tools/master/package_azureboard_index.json"

并保存。

Microsoft Azure IoT 开发工具_第3张图片
installation-settings-json-win.png

在Board Manager中重新搜寻AZ3166,安装最新BSP。这一步需要下载103MB用于编译STM32F412RG,非常耗时。

Microsoft Azure IoT 开发工具_第4张图片
installation-az3166-win.png

安装ST-LINK/V2驱动

下载驱动并安装,这一步因为我自己一直用ST工具链,所以可以省去。

整个工具链的构成是一个有意思的设计,基于开源和商业许可证的各类硬件设计,配合JavaScript的UI,Python的自动化管理。或许这就是未来物联网的最佳搭配组合。

注意

在硬件介绍中,说明板载调试器为DAP-Link,这与事实有一定出入。因为DAP-Link是ARM/mbed的开源设计,原称CMSIS-DAP。但是在Keil IDE中发现,CMSIS-DAP没有识别出芯片,而切换到ST-LINK才识别出芯片。只是该设备被系统枚举成为AZ3166,所以应该是ST授权的ST-LINK。

VSC的布局可能与贴图有出入,需要灵活处理。

Arduino 风格代码

尽管底层依赖于ARM mbed和Arduino,但是该平台又不仅仅是基于第三方平台的设计。Microsoft添加了自己的工具链和IDE。所以具体使用方式还在摸索中。但其代码肯定是Arduino风格的C++代码,而且底层是mbed C++ API。

#include "Arduino.h"
#include "OledDisplay.h"
#include "AudioClass.h"

AudioClass& Audio = AudioClass::getInstance();
const int AUDIO_SIZE = 32000 * 3 + 45;

int lastButtonAState;
int buttonAState;
int lastButtonBState;
int buttonBState;
char *waveFile;
int totalSize;
int monoSize;

void setup(void)
{
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(115200);

  Serial.println("Helloworld in Azure IoT DevKits!");

  // initialize the button pin as a input
  pinMode(USER_BUTTON_A, INPUT);
  lastButtonAState = digitalRead(USER_BUTTON_A);
  pinMode(USER_BUTTON_B, INPUT);
  lastButtonBState = digitalRead(USER_BUTTON_B);

  // Setup your local audio buffer
  waveFile = (char *)malloc(AUDIO_SIZE + 1);
  memset(waveFile, 0x0, AUDIO_SIZE);
}

void loop(void)
{
  printIdleMessage();

  while (1)
  {
    buttonAState = digitalRead(USER_BUTTON_A);
    buttonBState = digitalRead(USER_BUTTON_B);
    
    if (buttonAState == LOW && lastButtonAState == HIGH)
    {
      record();
    }

    if (buttonBState == LOW && lastButtonBState == HIGH)
    {
      play();
    }
    
    lastButtonAState = buttonAState;
    lastButtonBState = buttonBState;
  }

  delay(100);
}

void printIdleMessage()
{
  Screen.clean();
  Screen.print(0, "AZ3166 Audio:  ");
  Screen.print(1, "Press A to record", true);
  Screen.print(2, "Press B to play", true);
}

void record()
{
  // Re-config the audio data format
  Audio.format(8000, 16);

  Serial.println("start recording");
  Screen.clean();
  Screen.print(0, "Start recording");

  // Start to record audio data
  Audio.startRecord(waveFile, AUDIO_SIZE, 3);

  // Check whether the audio record is completed.
  while (Audio.getAudioState() == AUDIO_STATE_RECORDING)
  {
    delay(100);
  }
  
  Screen.clean();
  Screen.print(0, "Finish recording");
  Audio.getWav(&totalSize);
  Serial.print("Recorded size: ");
  Serial.println(totalSize);

  printIdleMessage();
}

void play()
{
  Screen.clean();
  Screen.print(0, "Start playing");
  Audio.startPlay(waveFile, totalSize);
  
  while (Audio.getAudioState() == AUDIO_STATE_PLAYING)
  {
    delay(100);
  }
  
  Screen.print(0, "Stop playing");
  printIdleMessage();
}


你可能感兴趣的:(Microsoft Azure IoT 开发工具)