使用 Bluemix 提供的 IoT 和 GPS 服务提高您的健康水平(3)
 
- UID
- 1066743
|

使用 Bluemix 提供的 IoT 和 GPS 服务提高您的健康水平(3)
获取步长数据前面您已经在 Node.js 中构建了基本应用程序框架并将其绑定到了服务,而且了解了如何访问凭据来使用服务 API。下一步是在 Get Moar Steps 应用程序中做一些有趣的事情:显示一个用户的 Fitbit 数据。
登录页面(来自您的 Node.js 应用程序的默认 GET / 响应)请求用户的凭据并提供一个用于注册 Fitbit 的 Wearable Fitness 服务的链接:
登录页面中的表单控件验证您有用户名和密码的条目。它们还从客户端浏览器查询本地时间-时区信息。该组数据(通过 HTTP POST)被发送到应用程序中的 POST /iot 路径。
此时,您拥有了对 Wearable Fitness API 进行 REST 调用并获取回一些 Fitbit 数据所需的所有细节。请注意,Bluemix 中的每个服务在 Bluemix 仪表板内都有一个文档参考链接,具体而言是 API 文档参考链接。您已经完成了任务,然后决定想要从 Wearable Fitness API 的 /iot/doc?id= 端点查询 Fitbit 活动的 “今日” 文档。
“今日” 的提及应很明显地指出,您为何从登录页面表单传入客户端浏览器的时区。根据代码的托管位置,服务器的当前时间和日期的观念可能不同于 Fitbit 在用的时间和日期。通过使用从客户端浏览器查询的数据,应用程序至少可以基于用户的当前位置向他们展示恰当的日子。(仍然存在的一个漏洞是,Fitbit 设备自身有一个时区集,如果用户当前不在与设备相同的时区,而且未将其设置为自动更新或手动更新它,结果可能就不匹配。但在本例中,为简单起见,我暂时不管这个漏洞。)
您可以在 DevOps Services Web IDE 中查看完整的代码(参见 routes/iot.js),包括所有日期解析和计算的处理。继续看示例后续部分,以下是基于服务凭据、最终用户 ID 和密码、文档名称和要查询的日期构建 REST 调用的简短视图。请注意,我将 REST 调用/响应功能标准化为一个名为 restcall.js 的独立模块:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| function queryFitbitData(username, password, datestr, callbackFn) {
var restcall = require('../restcall');
var url = require('url');
//Because the Bluemix service detail includes a URL with the /iot endpoint already
//postfixed to the "url", we use the Node.js url module to break it back down so
//we can have the host portion for our options JSON object below
var iotURLObj = url.parse(iotprops.url);
var host = iotURLObj.host;
var authStr = username+":"+password;
var endpoint = "/iot/doc?id=fb_activity_"+datestr+"&appId="+iotprops.appId;
var options = {
host: host,
path: endpoint,
method: "GET",
auth: authStr
};
console.log("URL: "+host+" / Endpoint: "+endpoint);
//send the request to the IoT API
restcall.get(options, true, callbackFn);
}
|
禁止任何 API 服务中断的回调函数将由来自 Wearable Fitness API 的 JSON 响应触发,包括当天的 Fitbit 设备统计信息。提供的信息比您可在 Fitbit 网站上访问的信息要多得多,包括各活动级别所用的时间(和距离)的更详尽分析,这些活动级别包括久坐不动、相当活跃、极其活跃。
以下是您调用 Wearable Fitness /iot/doc API 时返回的具有代表性的一部分 JSON 数据:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
| "summary": {
"distances": [
{
"distance": 5.56,
"activity": "total"
},
{
"distance": 5.56,
"activity": "tracker"
},
{
"distance": 23.01,
"activity": "loggedActivities"
},
{
"distance": 2.44,
"activity": "veryActive"
},
{
"distance": 2.17,
"activity": "moderatelyActive"
},
{
"distance": 0.94,
"activity": "lightlyActive"
},
{
"distance": 0,
"activity": "sedentaryActive"
},
{
"distance": 23.01,
"activity": "Cycling"
}
],
"sedentaryMinutes": 733,
"lightlyActiveMinutes": 113,
"caloriesOut": 3120,
"caloriesBMR": 1836,
"marginalCalories": 1107,
"fairlyActiveMinutes": 77,
"veryActiveMinutes": 49,
"activityCalories": 1489,
"steps": 8404,
"activeScore": -1
},
"iot_source": "fitbit",
"goals": {
"activeMinutes": 30,
"distance": 8.05,
"caloriesOut": 2925,
"steps": 10000
}
|
API 以公里为单位返回距离。如果要在您的应用程序中显示任何距离数据(使用英里或任何其他单位),则必须执行单位换算。请注意,应用程序既向您提供各活动级别所用的分钟数,也向您提供在那些活动级别的跑动距离(单位:千米)。 |
|
|
|
|
|