在 UP Squared 板上使用 Thinger.io 服务器
本文将演示如何在运行 Ubuntu 操作系统的 UP Squared 板上使用 Thinger.io。
引言
Thinger.io* 是一个面向物联网 (IoT) 的在线云平台,可让许多设备与 Thinger.io 云集成。它提供实时数据处理和显示。有关详细信息,请访问 Thinger.io 网站。本文将演示如何在运行 Ubuntu* 操作系统的 UP Squared* 板上使用 Thinger.io。它将读取实时光线传感器值并在时间序列图表中显示。如果光线传感器指示天色渐暗,它将发送电子邮件通知。UP Squared 板是一款低功耗、高性能的平台,非常适合 IoT 应用。UP Squared 板基于 Intel® Celeron® 处理器 (N3350) 或 Pentium® 处理器 (N4200)。有关更多信息,请访问 UP Squared 主页。
硬件要求
此项目中使用的硬件组件如下所示
- UP Squared、Grove Pi 板和传感器套件
- 带 HDMI 接口的显示器
- USB 键盘和鼠标
- VGA 或 HDMI 线缆
- 具有 Internet 访问的网络连接或 UP Squared 的 WiFi 套件
软件要求
本项目使用的软件要求列在下面
- 对于 UP Squared* Grove* IoT 开发套件,UP Squared 板已安装 Ubuntu 16.04 服务器映像。要升级或刷新,请遵循 UP Squared Grove IoT 开发套件 Ubuntu 16.04 服务器映像。
- 如果安装的 Ubuntu 没有适用于 UP Squared 的正确内核,请遵循下面的 安装 Ubuntu 内核说明来验证和更新 UP Squared 的内核,以获得对 GPIO 引脚的访问权限。
安装 Ubuntu* 内核
Ubuntu Core 中的默认内核不允许访问 GPIO 引脚。安装下面的必需内核以获得对 GPIO 引脚的访问权限。
- 在更新内核之前,请使用以下命令检查您是否拥有适用于 UP Squared 的正确内核。
uname -srv
- UP Squared 的内核应如下所示
Linux 4.10.0-42-generic #5000~upboard9-Ubuntu SMP Tue Dec 12 11:46:16 UTC 2017
- 添加存储库
sudo add-apt-repository ppa:ubilinux/up
- 更新存储库列表
sudo apt update
- 删除所有已安装的通用内核
sudo apt-get autoremove -purge ‘linux-.*generic’
- 安装 UP Squared 的内核
sudo apt-get install linux-image-generic-hwe-16.04-upboard
- 重启
sudo reboot
- 验证内核是否已安装
uname -srv
在 UP Squared* 上设置 Thinger.io*
升级系统
sudo apt-get update sudo apt-get upgrade
下载最新版本的 Thinger.io Linux 客户端并进行构建和运行
git clone https://github.com/thinger-io/Linux-Client.git cd Linux-Client/src chmod +x run.sh ./run.sh
下载并构建 MRAA 和 UPM 库
UPM 是一个允许您与传感器和执行器进行接口的库。MRAA 是一个 GPIO 库,可轻松连接到 Linux 上 UP Squared 和其他板的 IO 引脚。
MRAA 库
git clone https://github.com/intel-iot-devkit/mraa.git mkdir mraa/build cd mraa/build cmake .. -DBUILDSWIGNODE=OFF make make install
UPM 库
git clone https://github.com/intel-iot-devkit/upm.git mkdir upm/build cd upm/build cmake .. -DCMAKE-INSTALL_PREFIX:PATH=/usr -DBUILDEXAMPLES=ON -DBUILDSQIGPYTHON=OFF -DBUILDSWIGNODE=OFF make sudo make install
默认情况下,MRAA 和 UPM 库及包含文件将安装在 /usr/local。如果您希望将它们安装在不同的目录中,例如 /usr,则可以使用 cmake 的选项 -DCMAKE-INSTALL_PREFIX:PATH=/usr,如下所示。本示例将使用默认目录 /usr/local。
cmake .. -DCMAKE-INSTALL_PREFIX:PATH=/usr -DBUILDEXAMPLES=ON -DBUILDSQIGPYTHON=OFF -DBUILDSWIGNODE=OFF
创建新的 Thinger.io* 设备
Thinger.io 允许多个设备连接到 Thinger.io 云。如果您还没有账户,请访问 thinger.io 控制台创建一个免费账户。然后,在 Thinger.io 控制台的左侧面板中导航到“设备”以添加新设备。
填写设备 ID 和设备描述。对于凭据字段,可以填写一个值,或者单击“生成随机凭据”以获取随机凭据值。记下凭据值,以便稍后在代码示例 3:Thinger.io 实例中连接设备到 Thinger.io 服务器时使用。然后,单击“添加设备”按钮添加新设备。
一旦您的第一个设备成功添加到 Thinger.io,它应该显示 1/2 个设备,如下所示。免费账户最多支持两个设备。
一旦您的第一个设备成功添加到 Thinger.io,它应该显示 **1/2** 个设备,如下所示。免费账户最多支持两个设备。
设置 Thinger.io 端点
端点是设备用于向消费您设备数据的服务发送电子邮件、SMS 或其他信息的预定义通道。导航到左侧面板中的 **端点**,然后单击 **添加端点** 以添加新端点。
填写所有必需字段以定义端点。下面是一个光线传感器端点的示例。然后单击 **添加端点** 窗口底部的“添加端点”以注册端点。
更新 main.cpp 以与 Grove* 传感器接口
编辑 main.cpp 以与光线传感器进行接口。如果光线传感器指示天色渐暗,它将发送电子邮件进行通知。
cd src vi main.cpp
将此行添加到 main.cpp 中以与 Grove 保护板进行接口。
mraa.addSubplatform(mraa.GROVEPI, "0 ")
将光线传感器连接到模拟引脚 A1。
// Light sensor is connected to the analog A1 #define OFFSET 512 Light *light_sensor = new Light(OFFSET + 1);
使用 UP Squared 设备信息初始化 Thinger.io 实例。
#define USER_ID "your_thinger.io_user_id" #define DEVICE_ID "your_upsquared_device_id" #define DEVICE_CREDENTIAL "your_thinger.io_credential" // From Figure 3: Add device window above // Initialize Thinger.io instance for UP Squared Thinger_device thing(USER_ID, DEVICE_ID, DEVICE_CREDENTIAL);
注册端点后,设备可以调用 call_endpoint()
并传入端点标识符,将电子邮件发送到上面图 5:添加新端点窗口中定义的电子邮件地址。
thing.call_endpoint("light_is_dim");
pson 内联函数会将光线传感器值分配给 light 私有变量,并且其值将在 api 窗口中显示,如图 8:UP Squared API 窗口所示。
thing["light"] >> [](pson& out) { out = light_value; };
从模拟引脚 A1 读取光线传感器值,并将其流式传输到 Thinger.io 服务器。如果光线指示天色渐暗,则调用端点发送电子邮件。
int light_value = 0; // global variable for the pson inline below while(1) { thing.handle(); light_value = light_sensor->value(); thing["light"] >> [](pson& out) { out = light_value; }; // It is getting dark, send email if (light_value < 10) { thing.call_endpoint("light_is_dim"); } std::cout << "light_sensor = " << light_sensor->value() << endl; thing.stream(thing["light"]); }
当光线传感器指示天色渐暗时,您应该会收到一封来自 no-reply@thinger.io 的电子邮件,其中包含预定义的邮件主题和正文。
编译和执行
编辑 Makefile 以包含依赖库
cd Linux-Client cd build/CMakefiles/thinger.dir vi flags.make
将 I/usr/local/include/upm -I/usr/local/include -I/usr/local/include/upm -L/usr/local/lib -lupm-light -lupmc-light -lmraa -lupm-utilities -lupmc-utilities
添加到 CXX_FLAGS。更新后的 flags.make 应如下所示
# CMAKE generated file: DO NOT EDIT! # Generated by "Unix Makefiles" Generator, CMake Version 3.5 # compile CXX with /usr/bin/c++ CXX_FLAGS = -std=c++11 -I/usr/local/include/upm -I/usr/local/include -I/usr/local/include/upm -L/usr/local/lib -lupm-light -lupmc-light -lmraa -lupm-utilities -lupmc-utilities -O3 -DNDEBUG CXX_DEFINES = -DDAEMON=0 -DOPEN_SSL=1 CXX_INCLUDES =
重新编译更新的 main.cpp
cd ~/Linux-Client/build make thinger
执行更新后的 Thinger.io。请注意,您需要是 root 用户才能访问 GPIO,因此请务必包含“sudo”。要运行更新后的 main.cpp,请在终端中键入以下命令
sudo ./thinger
查看传感器实时值
在 Thinger.io 控制台中,导航到左侧面板中的“设备”,选择 UpSquared 设备,然后单击“查看 API”。
然后,单击 **查看 API**。实时光线传感器将显示在 **UpSquared API** 窗口中。要刷新实时光线传感器值,请单击 **运行**。
时间序列图
要查看时间序列图中的实时光线传感器值,请导航到左侧的面板,然后单击 **仪表板**。然后单击 **添加仪表板**,填写所有字段,然后单击以创建新仪表板。
成功创建新仪表板后,再次单击左侧面板中的 **仪表板** 以查看新添加的仪表板,然后单击它。
将右上角的按钮向右滑动,然后单击 **添加小部件** 按钮。
选择 **时间序列图**。
填写所有必需字段,然后单击 **保存** 按钮。
实时光线传感器时间序列图将如下所示。
示例草图
#include "mraa.hpp" #include "upm/light.hpp" #include "thinger/thinger.h" #include "upm_utilities.h" #include #define USER_ID "nnle" #define DEVICE_ID "UpSquared" #define DEVICE_CREDENTIAL "tJU5a1VBBYBG" #define OFFSET 512 using namespace mraa; using namespace upm; using namespace std; // Global variable for pson inline below int light_value = 0; int main(int argc, char *argv[]) { unsigned int aPinLight; Platform platform = getPlatformType(); if(platform == INTEL_UP2) { aPinLight = 1 + OFFSET; // A1 } else { cout << "Error: Unrecognize board.\n"; return 1; } // Interface with Grove shield addSubplatform(GROVEPI, "0"); // Light sensor is connected to the analog pin A1 Light *light_sensor = new Light(aPinLight); // Initialize Thinger.io instance for UP Squared thinger_device thing(USER_ID, DEVICE_ID, DEVICE_CREDENTIAL); while(1) { thing.handle(); light_value = light_sensor->value(); thing["light"] >> [](pson& out) { out = light_value; }; if (light_value < 10) { thing.call_endpoint("light_is_dim"); } cout << "light_sensor = " << light_sensor->value() << endl; thing.stream(thing["light"]); } thing.start(); return 0; }
摘要
Thinger.io 提供用于构建 IoT 应用程序的服务。它允许您连接和管理设备,并实时可视化传感器数据。您还可以通过多个传感器、多个 IoT 设备扩展您的项目,并实现设备之间的通信。