Netduino Plus 2 的 IoT 入门核心





5.00/5 (4投票s)
本文介绍了一个物联网入门套件,它可能有助于加速物联网项目的启动。
Netduino Plus 2 的 IoT 入门核心
引言
当今世界,有数百亿台智能设备连接到互联网,包括各种尺寸的电脑、平板电脑、手机、智能手表、寻呼机等。物联网技术预计在2020年前将这一数量翻倍,这意味着未来几年将有6万亿美元的市场待开发。
与当前基于人与屏幕、触摸、键盘和鼠标交互的计算环境相比,物联网开发无疑对我们的行为方式提出了新的挑战。不同之处在于,物联网设备应该直接与自然界交互,实时处理数据。
开发过程预计会更加复杂,可能需要开发者使用合适的工具。您是否考虑过购买一台示波器用于调试?为了加快物联网开发,本文介绍了一款物联网入门套件,它可能有助于加速物联网项目的启动。
源代码可在 Github 仓库获取:IoT.Starter.Np2.Core。
背景
假设您正试图成为一名物联网创业者,如何将物联网项目的风险降到最低?如何让支持您物联网项目“想法”的用户、投资者和决策者满意?众所周知,一些明智的步骤可以降低风险:
- 商业计划
- 团队
- 方法论
- 概念验证
- 入门套件
- 试点项目
- 商业
那么,假设最初的“想法”已经足够成熟,可以融入一个盈利的商业计划,并得到了投资者的认可。之后,一位执行经理参与进来,组建了一个精干的开发团队,该团队训练有素,能够应用敏捷方法论,确保工作流程顺畅持续。太棒了!我们现在进行到哪一步了?
自投资者加入以来,已经过去了一段时间,他们已经在催促我们拿出成果了。他们说,我们应该加快开发进程,尽快发布产品。
我们刚刚开始概念验证阶段,期望构建出符合用户和投资者需求的初步版本。这是第一个版本,不应处理最终产品所需的全部复杂性。目标是生成一个健康的“胚胎”。由于方法论和团队会持续地使“胚胎”演进,我们可以从小处着手,每个版本都增加功能和新的测试,直到我们达到试点原型阶段。
在这一刻,一个入门套件可以帮助团队专注于物联网项目背后的核心概念,并使其真正盈利。更好的是,我们目前所拥有的资源——领导团队的经理、应用敏捷方法论以实现顺畅工作流——所有这些在安装入门套件后都能立即全面投入运行。
构建入门套件
由于物联网需要智能设备连接到互联网,我们应该选择产品平台,这意味着需要一个 CPU
和一个网络接口
。如今有许多优秀的 ARM 平台,包括 Arduino、Netduino 和 Raspberry PI 等。最新的型号在处理器板上增加了有线和/或无线网络接口,同时仍保持低成本。当然,我们应该选择最适合我们项目和预算的平台。
我们还应考虑到,产品平台的硬件和软件应保持最简化,刚好满足物联网项目的需求即可。大多数情况下,会包含一个定制硬件,可能是一个子板或一个添加到 Arduino 总线上的扩展板。通过模拟团队的工作流程,我们得出结论,他们大部分时间将用于编程和测试在目标平台上执行的、与定制硬件交互的软件应用程序。
然后,我们需要一个安装在微型计算机上的外部开发系统,以便拥有:
- 一种编程
语言
及其编译器,用于为产品生成代码; - 用于加载可执行代码并在目标平台上进行调试的
实用工具
; - 一个包含
通信
软件的库,提供基本的互联网服务; - 一个包含其他
实用工具
的库,例如用于磁盘存储的工具; - 为物联网开发的软件库
模块
,如红外编解码器或传感器/电机驱动程序。
第一个被选中用于构建入门套件的平台是 Netduino Plus 2,这是一个开源电子平台,使用 .NET Micro Framework,运行频率为 168 MHz,拥有 1 MB 闪存和 192 KB 内存。请查看 Guruprasad 详细介绍 Netduino Plus 2 的文章。
选择 Netduino 的主要原因是可以使用 MS Visual Studio 作为开发工具。我们还应该提到 C# 编程语言、其编译器以及相应的加载器/调试器,这些都让开发工作变得更加轻松。.NET 软件库也提供了我们处理磁盘和其他外设所需的实用工具。
要使用 Netduino,如推荐的那样,请按以下顺序安装开发环境:
1) Microsoft Visual Studio Express 2013
2) .NET Micro Framework SDK v4.3
3) .NET MF plug-in for VS2013 (适用于 VS2013 的 .NET MF 插件)
4) Netduino SDK v4.3.2.1
要使用该入门套件,请从 Github 下载:IoT.Starter.Np2.Core。在 Starter
文件夹中可以找到三个 VS 项目:
- Controller:包含主应用程序,详见下文;
- FileServer:Oneleggedredcow 的 Netduino 文件服务器的修改版,用于处理存储在 micro SD 卡上的文件;
- HttpLibraryV3:Nart Schinackow 的 HTTPLibrary V3 的修改版,包含 HttpServer 以及相应的 HttpRequest 和 HttpResponse。
文件服务器能够执行以下命令:
- List:列出 netduino SD 卡上的文件;
- Get:将文件从 netduino 传输到 PC;
- Put:将文件从 PC 传输到 netduino;
- Delete:从 netduino SD 卡删除文件。
HttpLibrary V3 支持一种简单的身份验证方法,并且还提供一个 NtpClient 实用工具,用于直接从互联网初始化日期和时间。
控制器 (Controller)
该入门套件的预期行为是作为一个 Web 服务器,监听 80 端口,并返回从 SD 卡加载的 home.html
文件作为响应。它还接受来自浏览器的 HTTP 命令,以打开 (on) 和关闭 (off) 板载的 OnboardLed
。浏览器响应中包含当前日期/时间,以检查 NtpClient 是否在初始化时正常运行。因此,假设 IP 地址如下,有三个命令需要测试:
下面显示的 Main() 程序负责入门核心的功能。首先,它尝试使用 NtpClient.GetNetworkTime()
设置本地时间。HTTP 命令所使用的 onBoardLed
也被声明了。
public class Program
{
static HttpServer Server; // server object
static Credential ServerCredential; // server security
static Configuration ServerConfiguration; // configuration settings
static bool status = false; // on board led status
public static void Main()
{
TimeSpan elapsed = TimeSpan.Zero;
// Try to get clock at system start
try
{
var time = NtpClient.GetNetworkTime();
Utility.SetLocalTime(time);
}
catch (Exception ex)
{
// Don't depend on time
Debug.Print("Error setting clock: " + ex.Message);
}
// On board led
OutputPort onBoardLed = new OutputPort(Pins.ONBOARD_LED, false);
Thread.Sleep(1000);
// Web Server
ServerConfiguration = new Configuration(80);
ServerCredential = new Credential("Administrator", "admin", "admin");
Server = new HttpServer(ServerConfiguration, ServerCredential, @"\SD\");
Server.OnServerError += new OnServerErrorDelegate(Server_OnServerError);
Server.OnRequestReceived += new OnRequestReceivedDelegate(Server_OnRequestReceived);
Server.Start();
// File Server
FileServer server = new FileServer(@"\SD\", 1554);
while (true)
{
// null task
onBoardLed.Write(status);
Thread.Sleep(500);
}
}
}
Web 服务器使用预先初始化的管理员凭据启动,当浏览器请求数据时将需要这些凭据。文件服务器也在端口 1554 启动,用于处理 micro SD 卡。最后,一个空任务循环根据 HTTP 命令的状态
(status)持续更新 onBoardLed
。
下面显示的 Server_OnRequestReceived() 方法根据接收到的 HTTP 命令设置状态
(status)。如果没有从浏览器传递参数,则将 home.html
文件发送回浏览器。
static void Server_OnRequestReceived(HttpRequest Request, HttpResponse Response)
{
if (Request.RequestedCommand != null)
{
switch (Request.RequestedCommand.ToLower())
{
case "on":
status = true; // on board led ON
break;
case "off":
status = false; // on board led OFF
break;
}
Response.WriteFilesList("<br>" + "Comando " +
Request.RequestedCommand.ToLower() +
": Status = " + status.ToString());
}
else if (Request.RequestedFile != null)
{
string FullFileName = Request.FilesPath + Request.RequestedFile;
if (File.Exists(FullFileName))
{
Response.WriteFile(FullFileName);
}
else
{
Response.WriteNotFound();
}
}
else
{
Response.WriteFile(Request.FilesPath + "home.html"); // TODO: product page
}
}
下面的屏幕截图显示了向连接的 Netduino Plus 2 发送 HTTP 命令后的浏览器界面。入门套件现在能够建立核心功能并与外部世界通信。它已经准备好配备其他有趣的“物”了!
关注点
这是关于物联网入门套件的第一篇文章,我希望将来能用其他平台对其进行改进,并创建使用它的实际应用。
历史
2016.09.02 - 适用于 Netduino Plus 2 的核心功能初始版本。