混合软件包
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
,点击安装。
首次安装失败,报XHR错误,安装过程漫长且没有进度条,差评!
重启VSC后,再次安装成功,并安装了C/C++工具链。
安装硬件BSP
使用Ctrl+Shift+P
,输入Arduino
,寻找并选中Arduino:Board Manager
。选中右下侧的Addtional URL
按钮。
在settings.json
文件中的User Setting
面板中添加以下文字:
"arduino.additionalUrls": "https://raw.githubusercontent.com/VSChina/azureiotdevkit_tools/master/package_azureboard_index.json"
并保存。
在Board Manager中重新搜寻AZ3166,安装最新BSP。这一步需要下载103MB用于编译STM32F412RG,非常耗时。
安装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();
}