物联网(IOT)的时代已经来临。物联网这个词最初听起来有些不吉利,就像是一些我们赖以生存的我们认为没有生命、没有智慧的对象突然之间有了它们自己的智慧一样。值得庆幸的是,这些增强功能通常对我们是有利的,能够提高我们的生活。例如,我们开始使用智能电话。几乎无法想象,在不到十年的时间里,它们现在就像汽车一样普及。很难想象没有它们的生活会是怎样。
接下来是可穿戴设备,目前以智能手表为主导。手表已经发展到了具有自己的主见(处理能力),而且生物传感器和环境传感器也越来越多。在与其他智能设备进行联网时,智能手表形成了一个庞大的物联网,能够提供前所未有的功能。在适当的时候,智能手表还将成为我们日常生活中不可或缺的一部分。
感谢在 Kickstarter 上举办的一次非常成功的、历史性的 集体融资活动 ,来自世界各地的成千上万的开发人员都收到了 Pebble 智能手表,他们可以亲自对该手表进行编程。该手表带有一块可以持续用一个星期的电池、一个在户外阳光下仍然清晰可见的可动态更新的显示器、一个集成运动传感器、一个振动马达,以及对最新的低能耗蓝牙标准配件的支持,Pebble 在实用的可穿戴硬件设计方面远远领先于同行。
Pebble 是智能手表领域的先驱。Pebble 最初只支持使用 C 语言程序实现其嵌入式 ARM 核心 CPU。现在,您可以通过使用 Pebble.js 平台完全使用 JavaScript 来创建 Pebble 应用程序。
本教程将展示如何使用物联网构建一个实时销售追踪系统。外部销售团队的每个成员都配备了了一块 Pebble 智能手表。当所有销售代表都在某个客户的站点上进行销售的时候,他或她只需单击一下手表就能实时记录销售情况。集中式仪表板向高管显示了最新的销售统计数据,并对销售代表进行实时评分。
下面展示了这些子系统是如何协同工作的:
服务器端子系统运行在 IBM Bluemix PaaS 上的云中。销售数据是在一个 BluemixMongoDB 服务实例中维护的。 salesdashboard 是一个用来访问数据的 Meteor 应用程序。 salesrally 是一个服务器应用程序,支持 Pebble 通过运行在 Bluemix SDK for Node.js 之上的 REST API 端点来访问 MongoDB 销售数据。 watchsalesclient 是一个在 Pebble 手表上运行的 JavaScript 应用程序。
阅读: Pebble 开发人员文档
阅读: Pebble.js 开发人员文档
阅读: Meteor 中的即时 Web 应用程序
阅读: MongoDB 服务入门
阅读: 使用 SDK for Node.js 创建应用程序
“ 在与其他智能设备联网时,智能手表形成了一个庞大的物联网,那么可以提供前所未有的功能。 ”
git
支持的 Node.js 开发环境 销售追踪系统有三个不同的子系统。首先登场的是 salesdashboard Web 应用程序。高管将会在销售数据流入的同时查看实时更新的 “谁销售的产品最多” 的排行。您可以从您的浏览器运行 salesdashboard:
运行 salesdashboard
最初,仪表板显示,Eileen 率先售出了 5 个单元:
每个销售代表都有一块 Pebble 手表和一个配套的 iPhone 或 Android 手机。这些手表将会运行 watchsalesclient 应用程序。
Pebble 手表的右侧有三个按钮;watchsalesclient 仅使用了顶部和底部的按钮。这个应用程序显示了一个带有一些指令的欢迎屏幕:
要随时找出哪个销售代表具有最高的销售记录,可以晃动手表(或单击底部的按钮)。watchsaleclient 将会查询总部,并显示目前的销售精英:
快速振动手表两次,以指示提供了最新的销售数据。
要录制一次销售,销售代表只需单击顶部的按钮。在(通过 Bluemix 上的服务器数据库)向总部确认这次销售时,只需晃动手表即可,没必要查看手表表面。销售代表可以继续与客户交谈,同时单击手表来记录销售。
在进行确认之后,手表会显示销售代表的当前销售记录。现在,Sing 刚刚完成了更多的销售,共售出了 6 个单元,超过了 Eileen:
销售仪表板显示了实时的排行记录,现在,Sing 位于该表的顶部:
轻弹一下手腕就可以获得目前位于顶部的销售数据,现在,Sing 正在大出风头(至少从目前看是这样):
watchsalesclient 的实例通过另一个子系统来访问公司的数据库:salesrally 服务器应用程序。这个 Bluemix SDK for Node.js 应用程序为 Pebble 手表的多个 REST API 端点提供服务。
您可以在自己的浏览器中测试 salesrally 服务器应用程序:
Run salesrally
现在,是时候来整理一下您自己的系统了。
要在 Bluemix 上部署您自己的 salesdashboard 应用程序实例:
获取代码
salesdashboard
中的主机和名称更改为您在项目创建对话框中输入的惟一 Bluemix 应用程序名称。 通过应用程序的 Bluemix URL 来测试您的应用程序。
salesdashboard 应用程序是一个典型的 Meteor 应用程序。一个名为 Sales
的 Meteor 集合将会显示,可以通过一个模板 helper 来动态更新它:
Sales = new Meteor.Collection("salesrally"); if (Meteor.isClient) { Template.salesdata.helpers({ dataset : function () { return Sales.find({}, {sort: { sold: -1}}); } }); }
一个 Meteor Spacebar 模板(Spacebar 是 Meteor 的模板引擎) salesdata
被用于显示销售代表的列表和每个销售代表销售的小部件的数量:
<body> <div id="title"> <h1>Sales Rally 2015</h1> </div> <div id="salestable"> {{> salesdata}} </div> </body> <template name="salesdata"> <div class="salesdata"> {{#each dataset}} {{> datapoint}} {{/each}} </div> </template> <template name="datapoint"> <div class="datapoint"> <span class="name">{{name}}</span> <span class="sales">{{sold}}</span> </div> </template>
当 Meteor 的实时查询更新检测到 Sales
集合中的变化,就会在屏幕上更新所有反应元素(reactive element)。 Meteor 的 Tracker 组件将会追踪所有反应元素实例,并使用其 Blaze 引擎来更新 DOM。因为集合是按照 sold
字段进行分类的,所有目前领先的销售代表总是位于顶部。
应用程序能够很方便地根据 MongoDB 实例中的原始数据创建种子值:
if (Meteor.isServer) { Meteor.startup(function () { Sales.remove({}); Sales.insert({name:"Joe", token:"ELSI839", sold: 3}); Sales.insert({name:"Sing", token:"X83LE19", sold: 2}); Sales.insert({name:"Eileen", token:"DF2328M", sold: 5}); }); }
该应用程序是通过一个 自定义 buildpack 进行部署的,我为了在 Bluemix 上部署 Meteor 应用程序而创建了这个 buildpack。如果您在部署时遇到问题,可以尝试先从 Bluemix 中删除应用程序,而不是通过一个正在运行的实例来部署它。
要部署您自己的 salesrally 应用程序实例:
获取代码
salesrally
中的主机和名称更改为您在项目创建对话框中输入的惟一 Bluemix 应用程序名称。注意这个名称,该名称是稍后将会用于您的 watchsalesclient 应用程序的名称。 您可以通过 URL http:// 您的应用程序的名称 .mybluemix.net/topsales 在浏览器中快速测试您的应用程序。
如果您熟悉 Meteor,您可能会意识到,还可以通过添加 Iron Router 智能包来处理 salesdashboard 应用程序中的所有 REST API,完全消除使用一个单独的 salesrally 服务器的需求。
salesrally 是一个 node.js 服务器应用程序,它暴露了 REST API 来为一个销售代表注册一次销售,并查询当前销售最多的销售代表。salesrally 使用了 hapi REST 框架,并通过 官方 mongodb node.js 本机驱动程序 访问共享的 MongoDB 实例。
以下代码将处理传入的 REST API 调用。这些调用可以通过 HTTP GET
或 POST
方法来实现:
server.route([{ method: 'GET', path: '/sold', handler: soldGetHandler }, { method: 'POST', path: '/sold', handler: soldPostHandler }, { method: 'GET', path: '/topsales', handler: getTopSalesHandler } ]);
GET
和 POST
处理程序都在后台调用了相同的 helper 函数:
var soldGetHandler = function(request, reply) { incSales(request.query.name, request.query.token, reply); }; var soldPostHandler = function(request, reply) { incSales(request.payload.name, request.payload.token, reply); }; var getTopSalesHandler = function(request, reply) { findTopSalesperson(request, reply); };
GET
受到支持,主要用于简化调试和测试。为了实现生产,可以将 POST
方法与 Transport Layer Security (TLS) 和其他 API 身份验证一起使用。
/sold
REST API 路由首先对传入用户进行身份验证。该查询将会确认 “用户和令牌” 组合存在于数据库中:
Mongo.connect(url, function(err, db){ assert.equal(null, err); var col = db.collection('salesrally'); col.findOne({ 'name': name, 'token':token}, {fields: null}, function(err, doc) { ...
然后通过一个 Mongo Update()
操作来更新所出售单元的数量:
col.update({ 'name': name, 'token':token}, {$inc: {'sold': 1}}, function(err, r){ ...});
对于 /topsales
API 路由,用来定位顶级销售代表的 Mongo 查询如下所示:
col.findOne({}, {sort: {sold: -1}, fields: {_id: 0,token: 0}}, function(err, doc) { ...});
出于安全考虑,只返回名称字段和销售数量字段。
要开发 Pebble.js 应用程序,可以在 Pebble SDK 和 cloudpebble 之间进行选择。在这一步中,将会使用 cloudpebble(它显然更易于使用),cloudpebble 有一个内置的 IDE,能够在线编译,并直接部署到已连接的手表。
要通过 cloudpebble 在一个 Pebble 上运行 watchclient 代码:
获取代码
APPURL
变量(以及 USER
和 TOKEN
变量,如果必要的话): var UI = require('ui'), ajax = require('ajax'), Vector2 = require('vector2'), Accel = require('ui/accel'), Vibe = require('ui/vibe'); var APPURL = 'http://salesrally.mybluemix.net/'; var USER = 'Sing'; var TOKEN = 'X83LE19';
即使通过使用手表与 Pebble.js 应用程序进行交互,应用程序实际上仍然运行在已连接的手机上。Pebble 充当了一个终端 — 接受用户输入,并在通过蓝牙连接到 iPhone 或 Android 应用程序中的实际 Pebble.js 应用程序时显示应用程序输出。
在单击手表上的顶部按钮时,将会通过 Pebble.js Ajax 库对 salesrally 服务器执行 API 调用:
main.on('click', 'up', function(e) { ajax({ url: APPURL + 'sold', type:'json', method: 'post', data: {name: USER, token: TOKEN} }, function(data) { Vibe.vibrate('double'); }, ... };
Pebble.js vibe
库被用来快速震动手表两次。
就是这样。现在,您可以在云中启动自己的 salesrally 了。
DevOps Services、Bluemix、Meteor、Pebble.js 和 MongoDB 使得这个功能性的销售追踪系统的创建和部署变得更加简单。通过使用现代的 “设备到云(device-to-cloud)” 技术,您可以在一个悠闲的下午来实现功能强大的高效分布式系统,以前需要花费几个月的人工来设计、筹划和部署该系统。