65.9K
CodeProject 正在变化。 阅读更多。
Home

Netduino Plus 2 的 IoT 入门核心

starIconstarIconstarIconstarIconstarIcon

5.00/5 (4投票s)

2016 年 9 月 5 日

CPOL

6分钟阅读

viewsIcon

16534

本文介绍了一个物联网入门套件,它可能有助于加速物联网项目的启动。

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 地址如下,有三个命令需要测试:

http://10.1.1.105/

http://10.1.1.105/cmd?on

http://10.1.1.105/cmd?off

下面显示的 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 的核心功能初始版本。

© . All rights reserved.