物联网(IoT)技术的发展正在以前所未有的速度增长,预计到2020年之前,连接到互联网的设备数量将翻一番,这代表着未来几年内将开发出一个价值6万亿美元的市场。物联网的发展无疑对行为方式提出了新的挑战,与当前基于屏幕、触摸、键盘和鼠标的计算环境相比,物联网设备需要直接与自然交互,实时处理数据。
开发过程预计将变得更加复杂,可能需要为开发者提供合适的工具。为了加快物联网开发,本文介绍了一个物联网入门套件,可以帮助加速物联网项目的启动。
假设正尝试成为一名物联网企业家,如何最小化物联网项目的启动风险?如何满足用户、投资者和决策者对“物联网项目”想法的支持?众所周知,一些明智的步骤可以降低风险:
假设原始的“想法”已经足够成熟,可以适应一个盈利的商业计划,并且已经被投资者接受。之后,一位执行经理介入,召集了一个训练有素的开发团队,他们熟练地应用敏捷方法论,确保流程顺畅且持续。太好了!现在在哪里?
自从投资者介入以来已经过去了一段时间,他们已经在推动结果。他们说,应该加快开发过程,尽快推出产品。刚刚开始概念验证,期望构建一个符合用户和投资者需求的初步版本。这是第一个版本,它不应该处理最终产品所需的所有复杂性。目标是生成一个健康的胚胎。由于方法论和团队不断发展,可以从小开始,每个版本都会增加功能和新的测试,直到达到试点原型。
在这个时候,一个入门套件可以帮助团队专注于物联网计划背后的主要概念,并使其真正盈利。更好的是,到目前为止获得的资源——领导团队的经理,应用方法论以确保流程顺畅,所有这些都是完全运行的,准备好立即在安装入门套件后运行。
由于物联网需要连接到互联网的智能设备,应该选择产品平台,这意味着一个CPU和一个网络接口。今天有很多不错的ARM平台,包括Arduino、Netduino和Raspberry PI等。最新的型号在处理器板上增加了有线和/或无线网络接口,同时保持低成本。自然地,应该选择最适合项目和预算的最佳平台。
还应该考虑到产品平台的硬件和软件应该保持最小,以适应物联网计划。大多数情况下包括定制硬件,可能是一个附加板或添加到Arduino总线上的屏蔽。模拟团队的工作流程,得出结论,他们大部分时间将用于编程和测试在目标平台上执行的软件应用程序,与定制硬件交互。
然后,需要一个外部开发系统,安装在微型计算机上,以便有:
选择构建入门套件的第一个平台是Netduino Plus 2,这是一个使用.NET Micro Framework运行在168 MHz、1 MB闪存和192 KB RAM的开源电子平台。请查看Guruprasad详细介绍Netduino Plus 2的文章。
选择Netduino的主要原因是MS Visual Studio作为开发工具的可用性。还应该提到C#编程语言,它的编译器和相应的加载器/调试器,使生活变得更加轻松。.NET软件库还提供了需要处理磁盘和其他外围设备的工具。
要使用Netduino,建议按照以下顺序安装开发环境:
要使用入门套件,请从Github下载IoT.Starter.Np2.Core。在Starter文件夹中可以找到三个VS项目:
文件服务器能够执行以下命令:
HttpLibrary V3支持简单的认证方法,还有一个NtpClient实用程序,用于直接从互联网初始化日期和时间。
入门套件的预期行为是一个监听端口80的Web服务器,并用从SD卡加载的home.html文件回答。它还接受来自浏览器的HTTP命令来打开和关闭板上的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。
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(
"" +
"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
}
}