Streamr助你掌控自己的数据(2)——三种整合数据至Streamr的典型场景
博客说明
所有刊发内容均可转载但是需要注明出处。

三种整合数据至Streamr的典型场景
本系列文档主要介绍怎么通过Streamr管理自己的DATA,整个系列包括三篇教程文档,分别是:教你5分钟上传数据至Streamr、三种整合数据至Streamr的典型场景、教你在Streamr市场上发布数据。所有文档均参考Streamr blog。前两篇主要偏向技术文档,所以需要有一定的技术背景。第三篇不包含任何技术知识,大部分人都可以按照教程来完成相应的操作。
简介
第一篇文档主要介绍如何通过调用API接口上传数据至Streamr,本篇教程文档主要介绍了三种整合数据至Streamr网络的典型示例。包括: 1. 直接从数据源推送数据至Streamr网络; 2. 数据源和Streamr之间建立桥接(数据源向桥接点实时推送数据); 3. 数据源和Streamr之间建立桥接(桥接点向数据源发送轮询请求)。
相关概念说明
在Streamr网络中,每个数据点属于一个Stream。每个数据点(或者成为事件、消息)包含了标有时间戳的一系列信息,比如,传感器采集的数据、即时通讯的消息等。根据使用场景的不同,一个Stream可以包括一个源的数据或者是多个数据源的数据。Streamr网络为用户上传数据提供API接口,用户调用该API接口最简单的方式是使用Streamr客户端库。当前的Streamr客户端库是JavaScript编写的,其他语言的客户端库还在开发中。如果您不方便使用当前的Streamr客户端库,您也可以使用HTTP库来调用API接口,相关方法请参见上一篇说明文档。
场景一:直接从数据源推送数据至Streamr网络

- 复杂度:低
- 延迟:低
- 可用性:中等
在这种模式下,数据源一产生新的数据,将被立即直接推送至Streamr网络。这种模式是官方推荐的,但是受环境影响,这种模式有可能会不可用。这种模式需要用户能够控制产生数据的系统并且能够决定该数据发送的地方。举例来说,如果您是IoT设备生产商,您可以直接将Streamr客户端直接植入这些IoT设备中,并且允许设备使用者上传数据至Streamr网络。大部分的工业设备具有良好的可配置特性,可以随时将产生的数据接入Streamr网络。然而,诸如汽车、手机、智能手环等消费级设备经常强制将用户数据发送至设备制造商的云端,然后向用户提供访问该数据的API接口。在这种场景下,用户可以使用桥接模式将数据接入到Streamr网络(具体参见下一小节)。
下面以一个实际应用为例说明如何直接从数据源推送数据至Streamr网络。这里主要介绍如何将IoT传感器Ruuvi产生的测量数据实时上传至Streamr。该设备通过低功耗蓝牙将数据传输至一台装有Streamr客户端库的网关计算机。其中,网关计算机为每个设备单独建立一个Stream,并且将设备产生的测量数据实时上传至所创建的Stream。其示例代码如下:
const StreamrClient = require('streamr-client')
const ruuvi = require('node-ruuvitag')
const API_KEY = 'MY-API-KEY'
const client = new StreamrClient({
apiKey: API_KEY
})
const streams = {}
console.log('Listening for RuuviTags...')
ruuvi.on('found', tag => {
// Create a Stream for this tag if it doesn't exist yet
if (!streams[tag.id]) {
streams[tag.id] = await client.getOrCreateStream({
name: 'Ruuvi ' + tag.id
})
}
tag.on('updated', async (data) => {
const stream = streams[tag.id]
try {
// Produce the data point to the stream
await stream.produce(data)
} catch (err) {
console.error(err)
}
})
})
场景二:数据源和Streamr之间建立桥接(数据源向桥接点实时推送数据)

- 复杂度:中等
- 延迟:低
- 可用性:中等
这种模式适用于您无法直接控制数据源的场景,用户可以通过一系列API接口实时获取数据。具体地,在这种模式下,数据源实时将新产生的数据推送给用户,用户收到通知后立即将该数据上传至Streamr。
示例1
示例1主要介绍如何使用Bitfinex客户端库和Streamr客户端库,将Bitfinex上DATA/USD交易数据和Streamr建立连接。
const BFX = require('bitfinex-api-node')
const StreamrClient = require('streamr-client')
const STREAM_ID = 'MY-STREAM-ID'
const API_KEY = 'MY-API-KEY'
const bws = new BFX('', '', {
version: 2,
transform: true
}).ws
const client = new StreamrClient({
apiKey: API_KEY
})
bws.on('open', () => {
bws.subscribeTicker('DATUSD')
})
bws.on('ticker', (pair, ticker) => {
console.log('Ticker:', ticker)
client.produceToStream(STREAM_ID, ticker)
.then(() => console.log('Sent to Streamr!'))
.catch((err) => console.error(err))
})
示例2
示例1主要从编程角度介绍如何建立相应的连接,如果您非程序员,那可以使用本示例中的可视化编辑器Streamr Editor来建立相应的连接。但是,使用该可视化编辑器也需要用户了解一些API接口和协议等技术知识。下面展示一个通过MQTT API监测电车实时位置的过程,该过程已获得赫尔辛基公共交通的授权。
# MQTT 模型参数
URL: mqtt://mqtt.hsl.fi
Topic: /hfp/v1/journey/ongoing/tram/#
MQTT 模型数据JSON格式的字符串,通过JSON解析器模型解析为一个对象。从该对象中提取出'VP'字段,该字段包含的也是一个对象。从提取出的对象中获取'desi','lat','long'和'veh'字段的值,然后经过数据处理之后通过SendToStream模型将该数据上传至Streamr。

场景三:数据源和Streamr之间建立桥接(桥接点向数据源发送轮询请求)

- 复杂度:中等
- 延迟:中等
- 可用性:好
大多数云服务提供商都会为用户提供访问数据的API接口,这种场景正是使用该API接口完成用户数据上传至Streamr。在这种场景下,当数据源产生新的数据时,用户不会收到任何通知,这就意味着用户需要重复向该API接口发送数据请求,这种方式成为轮询。显而易见,这种方式并不是一个获取实时数据的最佳方式,原因如下:1. 在用户请求该数据之前,该数据可能已经变化多次,意味着用户会丢失一些数据信息;2. 会给API服务器端带来不必要的负载,因为用户请求的时机是不固定的,不一定恰巧在数据值发送变化的时候;3. 增加了时延(轮询周期的一半时间)。
示例1
本示例将介绍如何使用OpenWeatherMap每隔15分钟查询瑞士楚格的天气情况。对于天气等这种数据,使用轮询方式获取是可行的,因为天气状况不会变化的太快。
const fetch = require('node-fetch')
const StreamrClient = require('streamr-client')
const OPENWEATHERMAP_API_KEY = 'MY-OPENWEATHERMAP-KEY'
const STREAMR_API_KEY = 'MY-STREAMR-KEY'
const POLL_INTERVAL = 15 * 60 * 1000 // 5 minutes
const location = 'Zug,Switzerland'
const client = new StreamrClient({
apiKey: STREAMR_API_KEY
})
// Query data from OWM and produce the result to Streamr
function pollAndProduce(stream) {
fetch(`https://api.openweathermap.org/data/2.5/weather?q=${location}&APPID=${OPENWEATHERMAP_API_KEY}&units=metric`)
.then((response) => response.json())
.then((json) => {
console.log(json)
// Produce the data point to Streamr
return stream.produce(json)
}).catch((err) => {
console.error(err)
})
}
// Create a Stream for this location, if it doesn't exist
client.getOrCreateStream({
name: `Weather in ${location}`,
description: 'From openweathermap.org, updated every 15 minutes'
}).then((stream) => {
console.log(`Target Stream id: ${stream.id}`)
// Poll and produce now
pollAndProduce(stream)
// Keep repeating every 15 minutes
setInterval(() => pollAndProduce(stream), POLL_INTERVAL)
}).catch((err) => {
console.log(err)
})
示例2
示例2将介绍如何利用可视化编辑器完成上述功能。

图中,Clock模型每隔15分钟发出一次警报并且触发HTTP Request模型向OpenWeatherMap发出获取天气数据的请求。然后,SendToStream模型将获取到的数据上传至Streamr。
参考文献
Streamr助你掌控自己的数据(2)——三种整合数据至Streamr的典型场景的更多相关文章
- Streamr助你掌控自己的数据(3)——教你在Streamr市场上发布数据
博客说明 所有刊发内容均可转载但是需要注明出处. 教你在Streamr市场上发布数据 本系列文档主要介绍怎么通过Streamr管理自己的DATA,整个系列包括三篇教程文档,分别是:教你5分钟上传数据至 ...
- Streamr助你掌控自己的数据(1)——教你5分钟上传数据至Streamr
博客说明 所有刊发内容均可转载但是需要注明出处. 教你5分钟上传数据至Streamr 本系列文档主要介绍怎么通过Streamr管理自己的DATA,整个系列包括三篇教程文档,分别是:教你5分钟上传数据至 ...
- Streamr助你掌控自己的数据
博客说明 所有刊发内容均可转载但是需要注明出处. 项目简介 Streamr 致力于为世界实时数据的自由公平交换打造开源平台,并促进全球数据经济的发展.Streamr项目基于区块链技术,并向用户提供数据 ...
- Request三种获取数据的方式
今天在做ajax请求后台代码时,发现ajax的方法都对,但就是请求不了后台代码,后来在同事帮助下才发现前台定义了两个相同参数导致请求出错. 下面记录一下request三种获取数据的方式: 1. Req ...
- ios网络学习------4 UIWebView的加载本地数据的三种方式
ios网络学习------4 UIWebView的加载本地数据的三种方式 分类: IOS2014-06-27 12:56 959人阅读 评论(0) 收藏 举报 UIWebView是IOS内置的浏览器, ...
- Linux就这个范儿 第18章 这里也是鼓乐笙箫 Linux读写内存数据的三种方式
Linux就这个范儿 第18章 这里也是鼓乐笙箫 Linux读写内存数据的三种方式 P703 Linux读写内存数据的三种方式 1.read ,write方式会在用户空间和内核空间不断拷贝数据, ...
- Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式
Linux就这个范儿 第15章 七种武器 linux 同步IO: sync.fsync与fdatasync Linux中的内存大页面huge page/large page David Cut ...
- MATLAB 显示输出数据的三种方式
MATLAB 显示输出数据的三种方式 ,转载 https://blog.csdn.net/qq_35318838/article/details/78780412 1.改变数据格式 当数据重复再命令行 ...
- ajax数据提交数据的三种方式和jquery的事件委托
ajax数据提交数据的三种方式 1.只是字符串或数字 $.ajax({ url: 'http//www.baidu.com', type: 'GET/POST', data: {'k1':'v1'}, ...
随机推荐
- 【JavaScript】赛码网前端笔试本地环境搭建
参考:https://hoofoo.me/article/2017-04-11/%E8%B5%9B%E7%A0%81%E7%BD%91%E5%89%8D%E7%AB%AF%E7%AC%94%E8%AF ...
- dede:channel二级导航currentstyle属性失效问题
dede:channel默认只作用在一级导航中,在调用下级导航(type='son')时,发现不起作用. 修改方法:修改 include/taglib/channel.lib.php 第133行.if ...
- Tensorflow-slim 学习笔记(二)第一层目录代码解读
通过阅读代码来学习,一向时最直接快速的.本章将讲解slim的第一层目录tensorflow/tensorflow/contrib/slim/python/slim的代码. 本层代码主要包括learni ...
- PHP分行打印数组-php输出数组方法大全
我们都知道php有两种方式可以打印数组 $arr = array( "a"=>"orange", "b"=>"bana ...
- phpqrcode生成动态二维码简单实例
这是一个利用phpqrcode生成动态二维码简单实例,比微信官方提供的接口还要好用.二维码是动态的,不用生成图片,可自定义二维码大小,间隙,跳转地址等. 参数设置: include_once 'php ...
- 使用Android studio搭建Android环境
最近安装Android studio遇到了很多问题,现在总结一下安装过程 因为我的电脑是AMD的cpu,好像不能使用虚拟机(具体原因不知道),所以我使用 软件+手机 去开发APP 先说一下使用And ...
- Spring第二天——IOC注解操作与AOP概念
大致内容 spring的bean管理(注解实现) AOP原理 log4j介绍 spring整合web项目的演示 一.spring注解实现bean管理 注解: 代码中一些特殊的标记,使用注解也可以完成一 ...
- 2017-2018-1 20155317 IPC
2017-2018-1 20155317 IPC - 共享内存 共享内存主要是通过映射机制实现的.以window系统调用为例子:Windows 下进程的地址空间在逻辑上是相互隔离的,但在物理上却是重叠 ...
- 一天半时间大致的学习了HTML和CSS.
目前需要经常练习的知识: 1.正则表达式 2.CSS 3.编程
- wpf mediakit 摄像头截图
原文:wpf mediakit 摄像头截图 在用VideoCaptureElement的过程中,不知道怎么获得摄像头的截图,纠结了整整一天, 最终在下面的网站上找到了答案,哈哈.(困的都不清醒的大脑, ...