Alternatives to Using the Intel® XDK to Develop Node.js IoT Applications
本文提供了一个起点,用于为无显示屏的物联网 Linux 设备组装用于开发 Node.js 应用程序的工具集。
Intel® XDK 提供了一个跨平台开发环境,用于创建运行在无显示屏嵌入式 Linux* 系统上的 Node.js* 物联网应用程序。用于在 Intel® XDK 内组装此环境的工具是标准的开源工具。本文提供了一个起点,用于为在无显示屏物联网 Linux 设备上开发 Node.js 应用程序组装类似的工具集。
Intel® XDK 物联网开发组件
Intel® XDK 支持物联网应用程序开发的部分包括以下关键功能元素:
- 对 JavaScript* 友好的编辑器
- 连接到无显示屏物联网 Linux 设备的工具
- 可用于学习如何与 I/O 传感器交互的示例
- 远程调试 Node.js 应用程序的手段
前三个组件的有用替代方案将在下面介绍。最后一个组件(远程调试 Node.js 应用程序)的替代方案在配套文章《使用 Chrome DevTools 调试您的远程物联网 Node.js 应用程序》中有介绍。
对 JavaScript* 友好的编辑器
可以使用各种免费的、对 JavaScript 友好的编辑器作为 Intel® XDK 的替代品。除了 Adobe* 的免费开源 Brackets* 编辑器(Intel® XDK 内置的编辑器)之外,还有 GitHub* 的开源 Atom* 编辑器,以及 Microsoft* 的免费开源 Visual Studio* Code 编辑器。
如果您一直在使用 Intel® XDK,并不要求您继续使用 Brackets 编辑器。最终,您应该选择一个适合您的编辑器,以上提到的任何免费替代品都可以,以及许多流行的付费代码编辑器,例如 JetBrains* 的 Webstorm* 和 Sublime HQ* 的 Sublime Text*。
Brackets
Intel® XDK 内置的编辑器是 Brackets 开源编辑器,它由 Adobe 支持,专为 HTML5(JavaScript、CSS 和 HTML)应用程序的开发而设计。事实上,Brackets 编辑器本身就是一个 HTML5 应用程序!Brackets 编辑器可以通过许多 开源扩展进行扩展。可以考虑添加到 Brackets 的一些扩展是:
使用此“使用 Brackets 进行 JavaScript 开发”搜索链接,找到许多其他建议。
Brackets 编辑器可在 Microsoft Windows*、Apple macOS* 和大多数 Linux* 操作系统发行版上运行。
Atom
GitHub 创建了一个名为 Atom 的开源编辑器,它与 Brackets 一样,也基于 HTML5 技术构建。它拥有许多 免费包,可用于扩展编辑器。可以考虑添加到 Atom 的一些扩展是:
注意:特别值得关注的是 Atom 的 Nuclide 包。这个“附加组件”内置了对 Chrome DevTools 和 Node.js 应用程序的远程开发 的支持,这与 Intel® XDK 提供的功能类似。
使用此“使用 Atom 进行 JavaScript 开发”搜索链接,找到许多其他建议。
Atom 编辑器可在 Microsoft Windows、Apple macOS 和大多数 Linux 操作系统发行版上运行。
Visual Studio* Code
Microsoft 的 Visual Studio* Code 编辑器是一款通用的开源编程编辑器,包含许多 针对 JavaScript 应用程序开发的特定功能,以及 用于 JavaScript 和 Node.js 应用程序开发的扩展。尽管这款编辑器的名称包含 Visual Studio,但使用该编辑器不需要 Microsoft Visual Studio* 许可证,其使用也不依赖于您的系统上安装了 Visual Studio。它是一个独立编辑器。可以考虑添加到 Visual Studio Code 的一些扩展是:
- 该编辑器内置了 git 支持
- ESLint
- npm IntelliSense
- Debugger for Chrome*
使用此“使用 Visual Studio Code 进行 JavaScript 开发”搜索链接,找到许多其他建议。
Visual Studio Code 编辑器可在 Microsoft Windows、Apple macOS 和大多数 Linux 操作系统发行版上运行。
连接到无显示屏的物联网设备
在 Intel® XDK 的“IoT Develop”选项卡中,有几个功能可以帮助您在网络上定位无显示屏的 Linux 物联网设备、登录到您的物联网设备并将项目文件传输到您的设备。如果您在 Intel® XDK 之外工作,可以使用以下工具和技术来执行类似的任务。
- ssh 用于远程登录到物联网设备
- MDNS(又名 Bonjour 或 Avahi)用于按名称定位物联网设备
- SSHFS 用于与您的物联网设备共享项目文件
启用 SSH 远程登录
通过 SSH 远程登录到 Linux 物联网目标设备是最简单的方法。这允许您通过网络从主机开发系统到物联网目标设备获取一个 shell 提示符。使用此功能需要开发机上的 SSH 客户端(在许多 Windows 机器上称为 PuTTY)和物联网目标设备上的 SSH 服务器。
注意:一些物联网目标设备包含一个串行 TTY 端口,可用于访问登录 shell。从技术上讲,这不是“远程登录”,因为您必须将主机开发机物理连接到您的物联网目标设备,通常通过 USB 串行连接或传统的 RS-232 或“TTL”串行端口。如果您的物联网设备不支持键盘和显示器,您将需要使用此串行 TTY 端口来安装和配置 SSH 服务器。
根据安装在物联网目标设备上的 Linux 发行版,可能已经安装了 SSH 服务器。如果您使用的是之前与 Intel® XDK 一起使用的物联网设备,它应该已经运行了 SSH 服务器。如果没有,您可能需要在物联网设备上安装 SSH 服务器以启用 SSH 远程登录。
如果您的Linux 物联网设备上没有运行 sshd
(或等效的 ssh 服务器),请在您的物联网设备上的 bash 命令提示符下键入以下命令(这些说明假定使用 Ubuntu* 发行版,其他 Linux 发行版可能需要不同的说明):
$ sudo apt install openssh-server
注意:Intel® XDK 要求您启用 root 远程登录到您的物联网设备的功能,因为 xdk-daemon
假定并且 mraa
库要求您的物联网应用程序以root 权限运行。这是一个不必要的限制。如果您想启用 root 远程登录,请搜索“通过 SSH 启用 root 登录”以获取详细信息。
如果您不想向远程物联网设备添加 root 用户,一个方便的临时“成为 root”的方法是使用“sudo -E bash
”命令。这允许您像 root 用户一样操作,并保留您正常的用户的环境和主目录。当您不再需要“成为 root
”时,只需键入“exit
”即可返回您的正常用户 shell 会话。
一旦在物联网目标设备上启用了 SSH 服务,您就可以使用您喜欢的 SSH 客户端通过网络登录到您的物联网设备。根据您的网络配置,您可能需要通过其 IP 地址来识别您的物联网设备以建立远程 SSH 连接。有关该问题的解决方案,请参阅下一节。
从 Apple macOS* 机器、Linux* 桌面或已启用“Windows Bash”的 Microsoft Windows® 10 机器上,远程登录到物联网设备的最简单方法是使用“ssh
”命令(替换为您的物联网设备的用户名和 IP 地址)。
$ ssh my-iot-username@192.168.2.15
上面显示的 IP 地址 192.168.2.15 是一个占位符,很可能不起作用!您必须使用您的物联网设备的 IP 地址来建立远程 ssh 连接!!
如果您没有启用“Windows Bash”(或者您使用的是旧版本的 Windows),您可以安装 MinGW MSYS 工具来获取一个 ssh 命令副本,该命令可直接从 Windows 命令提示符或 MSYS bash 提示符运行(请记住将 MSYS 工具添加到您的 PATH)。否则,Windows 开发主机上的一个免费且流行的 ssh 替代品是 PuTTY ssh 和 telnet 客户端。
为您的物联网设备添加 MDNS 服务
如果您在小型或非托管网络(如典型的家庭网络)上工作,您可能没有名称服务器来帮助按名称定位您的物联网设备。除非您已专门配置路由器的 DHCP 服务为您的物联网设备提供固定 IP 地址,否则与您的物联网设备关联的 IP 地址可能会发生变化。
要解决此问题,请为您的 Linux 物联网设备添加 MDNS(Avahi)服务。Intel® XDK 使用此技术来识别和定位物联网设备。MDNS 的使用仅限于您的开发系统(例如,您的笔记本电脑)和您的物联网设备位于同一子网中的情况(这在大多数家庭网络中很常见)。
注意:在目标物联网设备上安装 MDNS 的具体说明将因物联网设备上安装的 Linux 发行版而异。以下说明假定您的物联网设备正在运行 Ubuntu。
如果您的物联网目标设备正在运行 Ubuntu,请在您的远程物联网设备 shell 上键入以下命令(即,您已通过 ssh/PuTTY 的远程 shell 或物联网设备的开放 TTY 串行端口(如果它有)登录到您的物联网设备)。
$ sudo -E apt install avahi-daemon avahi-autoipd avahi-utils
然后,通过物联网设备上的同一远程 shell,键入以下命令来测试 MDNS 服务:
$ sudo systemctl is-active avahi-daemon.service
active
$ ping $HOSTNAME.local
PING my-iot-ubuntu.local (10.7.188.149) 56(84) bytes of data.
64 bytes from my-iot-ubuntu.intel.com (10.7.188.149): icmp_seq=1 ttl=64 time=0.051 ms
64 bytes from my-iot-ubuntu.intel.com (10.7.188.149): icmp_seq=2 ttl=64 time=0.090 ms
如果您看到与上面类似的结果,则表明您的 MDNS 服务正在您的物联网设备上运行。
安装并运行 MDNS 服务后,您就可以使用 MDNS/Avahi/Bonjour 使用的特殊 local
域来快速识别您的物联网设备(当然,前提是您知道物联网设备的 主机名,并且您的物联网设备和开发系统位于同一本地子网)。
在典型的 Ubuntu 桌面或 Apple macOS 机器上,MDNS/Bonjour/Avahi 服务和实用程序已安装。在这种情况下,请在您的 Apple 或 Ubuntu Linux 开发机的终端 shell 中键入以下命令:
$ ping my-iot-hostname.local
其中“my-iot-hostname
”是您的物联网设备的基础主机名。例如,使用早期设备上“ping $HOSTNAME.local
”测试的结果,在开发系统上键入以下命令将定位并识别该物联网设备:
$ ping my-iot-ubuntu.local
Windows 机器需要安装 Apple Bonjour 服务才能执行此 ping 测试。Bonjour 服务通常包含在 iTunes 或各种其他使用 MDNS 的应用程序中(通常是为非托管网络上的联网打印机、媒体服务器和 NAS 驱动器设计的软件)。要确定 Bonjour 服务是否已在您的 Windows 系统上运行,请在 Windows 命令提示符下键入:
> net start | find "Bonjour"
Bonjour Service
如果您看到“Bonjour Service”的输出,则表示 MDNS/Avahi/Bonjour 已在您的 Windows 系统上安装并运行。在这种情况下,上述 ping 测试也可以从 Windows 命令行执行。
如果 Bonjour 服务未在您的 Windows 系统上运行,则可能已禁用它,或者您可能需要安装它。要安装 Bonjour 服务,请安装 iTunes 或使用可在 support.apple.com/bonjour 获取的“Bonjour Print Services for Windows”安装程序。
有关安装和配置 MDNS/Avahi/Bonjour 的更多信息,请参阅以下内容:
- wiki.archlinux.org/index.php/avahi
- en.wikipedia.org/wiki/Avahi_(software)
- blog.uguu.waw.pl/2015/05/21/mdns-netbsd-linux-osx
使用 SSHFS 共享文件
在为无显示屏的物联网目标设备开发应用程序时,通常更容易在开发主机(您的笔记本电脑或台式机)上运行开发工具(编辑器、包管理器、调试器等),然后将正在开发的应用程序复制到物联网设备上运行。您可能可以直接在物联网设备上运行开发工具,但如果您的物联网目标设备是无显示屏的、RAM 和存储空间有限,或者物理上不易访问,那么将物联网设备用作开发主机是不切实际的。
当您将开发主机系统与目标运行时系统分开时,为物联网设备开发 Node.js JavaScript 应用程序会更加困难。由于 Node.js 应用程序不像典型的 C/C++ 应用程序那样被编译成单个可执行文件,因此您需要一种方法来有效地、准确地将所有 Node.js 应用程序文件复制到物联网设备上进行测试和调试。
使用 Intel® XDK 时,开发在本地主机开发机上进行,您的项目将被复制到物联网目标设备上运行和调试。本质上,Intel® XDK 会将主机上的本地项目文件夹打包(TAR),将其复制到目标设备,然后在目标设备上解包(解压)(到一个名为“/node_app_slot”的文件夹中)。要手动复制此过程,您可以执行以下操作(假定目标设备上已存在一个名为“node_app_slot”的文件夹)。
首先,在主机开发机上:
$ cd my-project-folder
$ tar cvjhf my-project.tgz *
$ scp my-project.tgz user@iot-hostname.local:
$ ssh iot-username@iot-hostname.local
然后,在远程物联网设备上(使用上一步打开的远程 ssh 通道):
$ cd node_app_slot
$ rm -rf *
$ tar xvf ../my-project.tgz
将应用程序文件复制到物联网设备后,您可以开始安装包(如果需要),然后运行和调试应用程序。
显然,如果您对代码进行许多小幅更改,并且/或需要在将应用程序安装到物联网设备时安装 NPM 包,那么上述过程将非常繁琐。
注意:重要的是,节点包的安装,特别是包含二进制组件安装的包,应该在目标设备上进行,而不是在主机上。这样做是为了确保节点包的二进制组件与使用它们的系统(即您的物联网目标设备)的体系结构和操作系统相匹配。
如果您的目标物联网设备上的体系结构和操作系统与您的主机开发机匹配,您可以在将项目复制到物联网目标设备之前,在主机上执行 NPM 包的安装。
此过程可以进行许多优化,例如仅复制已添加或更改的文件。另一种优化方法是使用 “scp -r”选项,并跳过 tar/untar 步骤。使用 “rsync”工具使您的主机和目标项目文件夹保持同步和镜像会更快(请记住有关 NPM 包安装的问题)。手动管理此过程既笨拙又容易出错。
改用网络文件系统
与其使用上述复制方法,不如通过共享的网络文件系统来管理一套单一的源文件和项目。您可以通过两种方式来实现此目的:
- 在目标设备上导出应用程序项目文件夹,并将其挂载到主机上
- 在主机上导出应用程序项目文件夹,并将其挂载到目标设备上
选项 #2 的优点是确保您的项目源代码“驻留在”您的主机开发系统上。这使得管理和备份应用程序源代码文件变得容易。
选项 #1 的优点是更容易在各种物联网设备上设置和实现。此选项还可以确保要运行的应用程序代码驻留在运行代码的设备上,这对于在运行和测试应用程序时遇到网络文件系统延迟和/或断开连接的情况很重要。这些网络中断对于在运行时解释的脚本语言(如 Node.js 应用程序)来说是一个重大问题。
注意:实现选项 #1 的最简单方法是使用 SSHFS。由于您的物联网目标设备上已经有了 SSH 服务器,因此无需在目标物联网设备上安装任何额外软件(如 Samba 服务器或类似的网络文件系统)。这对于处理资源受限的物联网设备尤其有用。
要了解如何为此任务使用 SSHFS,请阅读本文的第一页。可能需要在主机开发系统上安装额外的软件才能使 SSHFS 工作。要回顾如何在主机开发系统上安装这些额外软件,请参阅这篇优秀的安装文章。
本质上,一旦在您的主机开发系统上安装了 SSHFS 软件,您将发出一个看起来像这样的命令(在您的主机开发机上):
$ sshfs user@my-iot-device.local: my-host-mount-folder
这将导致挂载物联网设备的远程文件系统,并在您的主机开发系统上的<my-host-mount-folder>
处使其可见。
挂载后,您可以使用您喜欢的编辑器和其他工具来处理应用程序。您还需要启动一个并行的 SSH 连接到您的远程物联网设备,以处理安装 NPM 包并在您的物联网设备上运行应用程序。请务必备份此远程物联网项目文件夹中的源文件,无论是备份到您主机系统上的另一个位置还是备份到云存储库,以确保在物联网设备发生任何情况时不会丢失源代码!
有关使用远程 Chrome DevTools 会话调试远程 Node.js 物联网应用程序的帮助,请参阅这篇配套文章。
注意:Atom 的 Nuclide 包“附加组件”还内置了对 Chrome DevTools 和 Node.js 应用程序的远程开发 的支持,类似于上面描述的 SSHFS 方法,但它在一个完整的开发环境中。
为 Node.js* 物联网设备编写的 JavaScript* 示例
Intel® XDK 中包含的物联网 Node.js 示例发布在 Intel 管理的 IoT DevKit GitHub* 帐户和 GoMobile GitHub* 帐户中,具体来说,在以下仓库中:
这些示例中的大多数依赖于开源的 MRAA 和 UPM 库来访问本地设备 I/O(少数示例仅需要 MRAA 库即可运行)。MRAA 和 UPM Linux 库提供对低速传感器、串行通信端口和执行器输出的访问。它们用 C/C++ 编写,并包含 Python、JavaScript(Node.js)和 Java* 语言的 API 绑定。
MRAA 包含一个名为 imraa
的特殊服务,用于利用通过 USB 连接到物联网目标设备的 Arduino 101*(美国以外品牌为 Genuino 101*)板作为“I/O 扩展器”,通过 firmata
Sketch 软件轻松进行物联网“边缘设备”应用程序的原型开发。
有关 MRAA 和 UPM 库的更多详细信息,请参阅以下页面:
- MRAA 文档页面和 UPM 文档页面(API 详细信息)
- MRAA README 页面(支持的物联网硬件平台完整列表)
- 在您的物联网设备上安装 MRAA
- 在您的物联网设备上安装 UPM
安装 MRAA 和 UPM
在使用这些示例之前,您需要确认您的物联网目标设备上已安装 MRAA 库和(可选)适当的 UPM 库。要确定 mraa
是否已作为全局节点模块安装,并且可以包含在 Node.js 应用程序中,请在您的物联网设备的提示符下键入:
$ npm -g list --depth=0
/usr/lib
??? mraa@1.6.1
??? npm@2.15.11
$ node
> var x = require('mraa')
undefined
> x.getVersion()
'v1.6.1'
> .exit
您的系统报告的具体版本可能与上面显示的有所不同。
注意:全局安装 MRAA 和 UPM 库并非必需,只是为了方便,特别是如果您开发许多依赖这些库的应用程序。如果需要,您可以将必要的 MRAA 和 UPM 库安装在应用程序项目工作区内的本地节点模块中。
以下命令假定使用 Ubuntu 物联网设备。对于其他 Linux 发行版,请参阅 MRAA 安装说明。
在撰写本文时,MRAA 库不支持 Node.js 7.x 或更高版本。请查看 MRAA 库 README 以获取关于 MRAA 支持的 Node.js 版本最新信息。
$ sudo add-apt-repository ppa:mraa/mraa
$ sudo apt update
$ sudo apt install libmraa1 libmraa-dev mraa-tools mraa-imraa python-mraa python3-mraa
更新命令(上面中间一行)可能需要一些时间才能完成,请耐心等待!
要确认 imraa 服务已成功安装,请在您的物联网目标设备的命令行上键入:
$ which imraa
/usr/bin/imraa
现在安装 mraa 节点模块(您看到的版本号可能与下面不同):
$ sudo npm -g install mraa
> mraa@1.6.1 install /usr/lib/node_modules/mraa
> node-gyp rebuild
...many compile messages, with many warnings...
SOLINK_MODULE(target) Release/obj.target/mraa.node
COPY Release/mraa.node
make: Leaving directory '/usr/lib/node_modules/mraa/build'
mraa@1.6.1 /usr/lib/node_modules/mraa
安装过程中的许多警告消息不要惊慌,这是正常的。
注意:仅安装您感兴趣的示例所需的 UPM 模块。不必安装 UPM 仓库中所有可用的 UPM 库模块。