当前位置:   article > 正文

区块链和物联网解决方案实用指南(一)_区块链 移动网络

区块链 移动网络

原文:zh.annas-archive.org/md5/9b82e4292467bac72ed9aef40681c09a

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

区块链和**物联网(IoT)**已被证明是目前最受欢迎的技术,并且只是开始应用它们的曲线。多家大公司的首要任务之一是整合区块链和物联网,其中一些公司已经开始在几个项目中使用其实施、解决方案和倡议。

这本书将帮助您使用最佳实践开发区块链和物联网解决方案。

本书适用对象

本书适用于负责物联网基础设施安全机制的任何人,以及希望在 IBM Cloud 平台上开发使用区块链和物联网解决方案的 IT 专业人员。需要对物联网有基本的了解。

本书涵盖内容

第一章,了解物联网并在 IBM Watson IoT 平台上开发设备,帮助您了解物联网如何改变游戏规则,哪些行业可以利用这项技术,如何开始进入物联网世界以及 IBM IoT 平台提供哪些功能以及在创建物联网解决方案时如何利用这些功能。

第二章,创建您的第一个物联网解决方案,帮助您使用平台和树莓派创建您的第一个端到端物联网解决方案,以锻炼您的技能。您将创建一个自动浇水的花园系统,该系统使用平台来确保植物得到充足的水分。

第三章,解释区块链技术并与 Hyperledger 合作,介绍了区块链并帮助您理解它是如何与分类帐一起工作的,以记录提供已知身份的许可网络的交易历史。

第四章,创建您自己的区块链网络,帮助您使用 Hyperledger Composer 创建您自己的区块链网络,并探讨如何创建资产、交易功能、访问控制和查询定义。

第五章,解决食品安全 - 围绕区块链构建,帮助您设计和实施解决方案以解决物流问题。您将了解到,如何使用物联网和区块链解决方案可以确保从农场开始并在一个人的盘子上结束的食品链可以在整个旅程中安全跟踪使用这些技术,并且为了在未来几年中获得许多国家的遵从而应用这种做法。

第六章,设计解决方案架构,帮助您从食品安全运输业务问题出发设计解决方案架构,并定义使用区块链支持分布式分类帐网络和物联网设备的技术解决方案的要求,并且定义用于支持跟踪过程的平台。

第七章,创建您的区块链和物联网解决方案,向您展示了如何创建一个区块链和物联网集成解决方案来解决食品安全运输问题。您将通过编码和测试前一章中设计的组件来获得使用区块链和物联网平台的实践经验。

第八章,物联网、区块链和工业 4.0,帮助您了解行业趋势以及可以从物联网和区块链解决方案中创建或派生出的新业务模式,以及关于这些技术的市场和技术趋势。

第九章,开发区块链和物联网解决方案的最佳实践,帮助您理解之前的项目经验和场景,并查看设计和开发区块链和物联网解决方案的最佳实践和经验教训。

为了最大限度地利用本书的内容

我们期望您熟悉一种编程语言,并具有为任何嵌入式平台(如树莓派、Arduino、ESP8266 或英特尔 Edison)开发任何解决方案的一些经验。我们将主要使用 Node.js 和 Hyperledger Composer 建模语言。欢迎初学者级别的 JavaScript 技能。

下载示例代码文件

您可以从www.packt.com账户下载本书的示例代码文件。如果您在其他地方购买了本书,您可以访问www.packt.com/support并注册,文件将直接通过电子邮件发送给您。

您可以按照以下步骤下载代码文件:

  1. www.packt.com登录或注册。

  2. 选择"SUPPORT"标签。

  3. 点击"Code Downloads & Errata"。

  4. 在搜索框中输入书名并按照屏幕上的说明操作。

下载文件后,请确保使用最新版本的解压或提取文件夹:

  • 用于 Windows 的 WinRAR/7-Zip

  • 用于 Mac 的 Zipeg/iZip/UnRarX

  • 用于 Linux 的 7-Zip/PeaZip

本书的代码包也托管在 GitHub 上,网址为github.com/PacktPublishing/Hands-On-IoT-Solutions-with-Blockchain。如果代码有更新,将在现有的 GitHub 存储库上进行更新。

我们还提供来自丰富图书和视频目录的其他代码包,可在**github.com/PacktPublishing/**获取。快去看看吧!

下载彩色图像

我们还提供了一个 PDF 文件,其中包含本书中使用的截图/图表的彩色图像。您可以从这里下载:www.packtpub.com/sites/default/files/downloads/9781789132243_ColorImages.pdf

使用的约定

本书中使用了许多文本约定。

CodeInText:指示文本中的代码字词、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 句柄。以下是一个示例:“接下来,打开您喜欢的 IDE,创建一个新的 Node.js 项目,并安装ibmiotf依赖包。”

代码块设置如下:

{
  "org": "<your iot org id>",
  "id": "<any application name>",
  "auth-key": "<application authentication key>",
  "auth-token": "<application authentication token>"
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

当我们希望引起您对代码块的特定部分的注意时,相关的行或项将以粗体显示:

"successRedirect": “<redirection URL. will be overwritten by the property 'json: true'>”,
"failureRedirect": "/?success=false",
"session": true,
  • 1
  • 2
  • 3

任何命令行输入或输出均以以下格式书写:

$ npm start
> sample-device@1.0.0 start /sample-device
  • 1
  • 2

粗体:指示一个新术语、一个重要词或您在屏幕上看到的单词。例如,菜单或对话框中的单词在文本中出现如下。以下是一个示例:“从设置步骤中创建的 IoT 平台服务中,在菜单中选择设备,然后选择添加设备*。”

警告或重要说明会显示为此格式。

提示和技巧显示为此格式。

第一章:了解物联网并在 IBM Watson IoT 平台上开发设备

在当今世界,计算机能够处理难以想象的数据量,任何人都可以创建和销售自己的设备。因此,物联网IoT)已成为当前商业环境中的热门话题,人们比以往任何时候都更加联系紧密。

在本章中,您将了解到 IoT 如何改变游戏规则,并发现哪些行业可以利用这项技术做些什么。我们将看看如何开始进入物联网世界,了解 IBM IoT 平台提供的功能,并学习如何在创建我们自己的 IoT 解决方案时利用这些功能。

本章将涵盖以下主题:

  • IoT 作为业务和技术

  • 实施 IoT 解决方案的行业

  • IoT 解决方案的技术要素

  • IBM Watson IoT 平台提供的功能和能力

  • 创建集成到 IBM Watson IoT 平台的简单网关、应用程序和设备

什么是物联网?

有关 IoT 是什么的定义有很多,但在网上最常见的文章都认为它是通过互联网互相连接的一组计算机化的事物。事物可以理解为人、物体、计算机、手机、建筑物、动物以及任何可以连接到互联网的东西。

自从嵌入式系统能够连接到互联网并成为网络参与者以来,这个术语一直在使用。从计算机到手机,智能手表到恒温器和冰箱,整个生产线现在都可以连接到互联网。

这种演变也受到了 DIY 社区的丰富。在世界各地,您将找到价格更低的原型系统,例如 Arduino、Raspberry Pi 和其他系统芯片SOC);易于使用的编程语言;甚至图形化编程。

那么,举个例子,连接的冰箱如何使您受益呢?嗯,这种技术将使制造商能够监视您的行为,并且看到您每天从早上 9 点到下午 6 点都不在家,因为在一个月内在此时间段内冰箱门没有被打开。如果可以重新编程冰箱在此期间减少使用,因为没有人会打开门会怎样呢?如果同一制造商查看了从所有拥有该冰箱的所有者那里收集的数据呢?了解每天与冰箱互动的不同群体是什么以及他们如何与之互动的洞察力可能会使其有可能根据该信息创建一个新模型。这种解决方案将更加生态、可定制和便宜。它还可以更新冰箱软件,使其更智能,而无需购买新的。

苹果推出了诸如HomeKitHealthKit之类的物联网框架。它们具有不同的目标,但仍然是连接到互联网的东西。

人们可以将门/窗传感器、摄像头、恒温器、灯泡和门锁连接到互联网,然后利用 iPhone 上的家庭应用程序从世界任何地方来控制它们。这可以在你回家的路上自动更改恒温器,或者当你在外面时通知诸如开门之类的事情。甚至可以利用连接的体重秤通知你每天的体重。谷歌、亚马逊和其他公司也推出了类似的解决方案。

IBM Watson 物联网平台并不打算提供产品。相反,它着重于提供一个安全、可扩展和可靠的平台,作为设备和应用程序之间连接的中心枢纽。

物联网的常见商业用例

冰箱是在家中使用物联网的一个简单而强大的例子,但它并不是如何使用物联网的唯一例子。在本章中,我们将讨论一些不同的情况、行业和人们,他们可能从连接设备中受益。

连接的汽车

让我们以自动驾驶汽车为例。有了它,汽车制造商可以监控驾驶员的一般行为,改善驾驶体验的各个方面,以及安全性。他们还可以更早地检测到组件故障,从而更早地进行召回,从而提高客户满意度,同时降低问题组件的生产成本。从汽车所有者的角度来看,这可能非常有益,因为他们可以监控汽车零部件的磨损,并在维护成本上花费更少的资金。

连接的人员

如果你是一名运动从业者,你可能已经使用智能手表来监测你的健康状况。如果所有这些信息都得到了妥善存储和分析,那么医学研究可以获取更多的数据,可以预测疾病,甚至可能改善整体生活质量。

此外,连接健康设备(如称重器、心率监测仪和血糖仪)并使用区块链共享数据可以为每个人创建统一的医疗报告。医生可以通过改善诊断和医疗决策。这也将使疾病的特征化和预测成为可能。

物联网在 2016 年在里约热内卢举办的奥运会中发挥了重要作用。许多连接的物品被用来收集信息并处理影响运动员身体状况的因素。这也有助于创建新的设备,如自行车,以及新的剧烈比赛的再生策略。

这些简单的例子展示了物联网将如何改变我们整个生活方式,让我们对其如此关注有多个理由。

物联网中的技术要素

物联网不仅仅依赖于设备和应用程序。它需要一组能力,在物联网解决方案中使用时,可以为个人和公司提供更多的价值。在本节中,我们将讨论一些这些能力,例如设备、硬件和软件,这些对于设计和实施有效的物联网解决方案至关重要。

设备

设备位于物联网解决方案的边缘。事实上,这些设备在物联网的背景下被称为物品。它们通常能够发送和接收数据事件。

例如,具有嵌入式土壤湿度探头的设备可以检测到监测的土壤含水量为 43%。然后,它可以向其连接的平台报告这一信息事件。平台随后可以向设备发送动作事件,触发水阀打开并恢复土壤湿度。这种交互取决于与设备相关的其他方面,这些方面将在接下来的章节中介绍。现在,让我们专注于设备。

为了处理这些类型的交互,您可以将设备看作是具有模拟或数字(或两者兼有)处理能力的计算单元。这意味着它能够读取和写入模拟和数字信号到它们的探针和执行器。

模拟信号是可以在一系列值中变化的信号。例如,让我们以 Arduino Uno 板为例。Arduino Uno 具有 10 位分辨率的模数转换器ADC),这意味着它可以读取从 0V 到 5V 的电压并将其映射为 0 到 1,023(2¹⁰ = 1,024)之间的整数值。模拟信号通常用于从模拟传感器读取数据。

数字信号是二进制信号,这意味着它只有两个可能的值:0 或 1,高或低。这种信号主要用于识别或改变开关状态,例如,打开或关闭 LED 灯泡。

边缘计算

设备还能够自行处理一些操作。这可能是一个简单的决定:例如,如果土壤的湿度低于 50%,则打开水阀一分钟,并在五分钟后再次检查湿度水平。

或者,这可能是一个复杂的任务:例如,确定自动驾驶汽车摄像头检测到的物体是等待过马路的人还是一棵树。

必须处理这些类型的分析的设备不能总是依赖于网络或应用程序获取信息或帮助。如果其中一个设备失效会怎么样?这可能会导致事故发生。

因此,这些设备提供了一种称为边缘计算的不同类型的能力,即在解决方案的最边缘——设备本身进行分析处理的能力。基本上,边缘计算允许设备在没有与网络的主动连接时“离线”执行一些操作和计算。

在选择将成为物联网解决方案一部分的设备时,最好的方法是确保设备具备所有的功能。

由于物联网网络中的设备数量非常庞大,超出能力范围可能导致与成本、电源供应、连接协议、用户体验甚至解决方案复杂性相关的不同问题。

网络

任何物联网解决方案的另一个重要元素是网络。如今有几种连接设备的方式,因此在选择设备时必须考虑到这一重要方面。如今最常用的网络标准是有线网络或 Wi-Fi、蜂窝/移动、LPWANLoRa。所有这些都有优缺点,所以让我们更仔细地看一下它们的用途。

无线(Wi-Fi)或有线网络

Wi-Fi 是互联网上最常见的标准通信模型。它假定被连接的设备或对象能够连接到 IEEE 802.x 网络,因此能够处理基于 IP 的网络。

市场上有许多可连接 Wi-Fi 的设备。一些 Wi-Fi 模块的示例包括ExpressIf ESP-8266ESP-32模块、Texas Instruments CC3200Microchip ATSAMW25Intel EdisonGalileo。这并非设备的完整列表,还有许多其他组合,结合了 Wi-Fi 可能的控制器和 MCU。

Wi-Fi 模块相对便宜,通常是使用现有网络并支持高负载传输的良好选择,因为它们可靠且连接速度快(高达 6.7 Gbps)。

基于 Wi-Fi 的物联网解决方案看起来几乎是以下图表所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

多个设备可以连接到一个节点,例如路由器,路由器连接到互联网,允许连接的设备访问互联网。

蜂窝/移动网络

蜂窝网络是任何移动电话使用的相同连接。这种网络的基本思想是将一个区域划分为若干个小区,每个小区都有一个由基站和若干个收发器提供无线网络连接的基站。该网络提供一系列服务,如语音、文本和数据。

移动网络是在解决方案中的设备类型不在 Wi-Fi 网络范围内时的一个选择,例如在汽车中。可能需要移动网络设备的另一个应用是当解决方案不能依赖用户的网络时,例如,如果您使用的是设备的订阅,且设备的活动取决于网络连接。当使用订阅网络时,即使用户禁用了他们自己的网络连接,设备也将继续执行其工作。

下图显示了标准蜂窝网络的工作原理:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以看到,蜂窝天线向有限区域提供信号。范围内的设备可以通过无线网络连接到天线,并使用移动服务提供商提供的服务,包括可用的互联网连接。

低功耗广域网络(LPWAN)

LPWAN 是一种设计用于在广泛区域内以非常低比特率工作的无线网络类型,这意味着在这种类型的网络中,交换量确实很小。

LPWAN 使用低功耗、低比特率和低频设备,当用于连接物品时非常强大。这是因为它使得可以使用持久电池和更小的设备。但仍然存在许多限制,如小数据负载或每天限定的消息数量。

由于频率较低,LPWAN 可以非常可靠且不易受干扰,即使在传播非常大范围的消息时也是如此。LPWAN 提供商通常对网络中发送的消息数量有限制。LPWAN 有许多提供商,其中最著名的可能是 Sigfox。

LPWAN 并没有设备或网关到互联网的直接连接。相反,它们通常具有预配置的网络,在网络的一端,您将拥有设备,在另一端,您将有许多 web 钩子和功能,允许您连接到您的应用程序或平台:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

与蜂窝网络不同,LPWAN 网络不向设备提供互联网连接,而是提供了一种从设备到网络的事件触发的方法。例如,您可以在 LPWAN 提供商网络边缘创建一个应用程序和触发器,以使设备接收到数据事件时,它调用互联网上的一个可用服务,并使用设备发布的给定数据。

LoRa 或 LoRaWAN

LoRa 网络图与 LPWAN 网络类似,只是不使用服务提供商基础设施,LoRa 网络可以有一个网关,允许设备连接到互联网。负责 LoRa 网络基础设施的人是网络的所有者,这意味着您不依赖网络服务提供商。您创建自己的网络:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

有一些与 LoRA 相同模型的技术,使用不同的协议,如 ZigBee。飞利浦 Hue 使用与 ZigBee 相同的方法连接灯泡、LED 灯带和其他 Hue 设备到一个网关,然后网关连接到 Hue 云。

网络摘要

总之,在选择网络连接时,您可以使用此表作为参考:

类型速度负载范围连接初始化成本基础设施
Wi-Fi双向私人/公共
移动网络双向提供商
LPWAN设备提供商
LoRa双向私有

应用程序协议

在决定最适合您的物联网解决方案的设备之后,定义与设备通信的协议非常重要。物联网解决方案倾向于使用轻量级协议,例如 MQTT。这不是物联网中唯一可用的协议,但由于 IBM Watson IoT 平台依赖 MQTT 和 REST——而 REST 非常流行——让我们稍微专注于 MQTT。

MQTT

MQTT 代表消息队列遥测传输。它是一种基于发布和订阅模式的极轻量级消息协议。与任何消息队列模型一样,它是一种异步协议。

如下图所示,发布和订阅(pub/sub)模型依赖于三个参与者:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

三个参与者的解释如下:

  • 发布者是生产任何内容并将其发布到给定主题(称为主题)的参与者。

  • 订阅者是事件消费者。订阅者订阅其感兴趣的主题(topics),并在发布者创建发布到其订阅之一时获得事件发布。

  • 代理负责接收发布并通知感兴趣的订阅者有关特定主题的信息。

现在让我们转到下一个重要的技术要素。

分析与人工智能

在物联网解决方案中拥有分析或人工智能软件组件并不是必需的,但将其用于处理从设备收集的数据以提取模式和见解非常有趣,这可能导致预测性维护、更好地理解用户行为等。

例如,让我们看一些通过洗衣机捕获的数据。有人可能购买了该家电,因为它据说可以节省能源。然而,经过收集的数据处理后,发现该家电消耗的能源比预想的多。根本原因是润滑剂,因为它不适合在非热带国家的电机中使用。

稍后,假设您将该信息与销售数据进行比较,并意识到大约八个月前在欧洲销售了 100 万台洗衣机。洗衣机制造商可以享受提前发货费率,以交换必须更换的备件。制造商还可以为其供应商获得可预测的新润滑剂数量,这可能导致新的家电设计。

IBM Watson IoT 平台功能

IBM Watson IoT 平台是连接物联网解决方案中的设备、网关和应用程序的中心。它支持 REST 和 MQTT 协议,用于应用程序、设备、网关、事件处理和管理任务。IBM Watson IoT 平台可在基于 Cloud Foundry 和 Kubernetes 的 IBM 云平台(以前称为 IBM Bluemix)上使用。

让我们回顾一下此平台的相关特性。

特点

在本节中,我们将讨论 IBM Watson IoT 平台的以下主要特性:

  • 仪表板

  • 设备、网关和应用程序,

  • 安全性

让我们开始吧!

仪表板

这是您访问 IBM Watson IoT 平台时将看到的第一件事。此仪表板可以是许多看板和卡片的组合,为您的 IoT 解决方案提供了多种可视化选项:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

浏览此屏幕中可用的看板和卡片,以熟悉界面。

设备、网关和应用程序

平台中另一个可用的功能是设备管理控制。该功能可以创建和删除设备、网关、应用程序和设备类型。还可以检查并触发对设备的操作,例如固件升级请求或重置:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

您还可以创建 API 密钥,以便您的应用程序可以连接到 IoT 组织并与解决方案的其他组件进行交互。

安全性

您还可以使用 IoT 平台管理解决方案的安全性方面。这可能包括为设备连接创建策略、设备 IP 地址的白名单和黑名单,或查看国家规则。您还可以管理被允许或被阻止管理 IoT 组织的用户,以及解决方案。

创建您的第一个 IoT 解决方案

在本章的早期部分,有许多设备和应用程序没有深入解释。要了解它们在 IoT 解决方案中的角色,重要的是创建每个示例。

这里创建的场景将是一个设备连接到IBM Watson IoT 平台,发送时间戳作为数据,以及一个使用 Node.js 将其打印到stdout应用程序

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后,我们将通过向解决方案添加网关来改进此功能,该网关与以下图表类似:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最后,拥有网关连接和设备连接的区别在于,您可以根据任何使决策变得更容易、更便宜或其他任何原因来创建设备连接到 IoT 平台的抽象或专业化。

创建网关

工作的第一个任务是创建一个 IoT 组织。如果您没有 IBM ID 和 IBM Cloud 帐户,注册过程非常直观,只需几分钟即可完成。如果您已经拥有 IBM Cloud 帐户和 IBM ID,请访问 bluemix.net IBM Cloud 平台。首先,登录并为本书的练习创建一个空间。

登录 IBM 云平台并访问指定空间后,选择“创建资源”选项以访问服务目录:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在菜单中选择物联网,创建一个名为物联网平台的服务。然后选择创建选项:**:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

创建服务后,您可以选择“启动”选项并访问 IoT 平台:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当您访问 IoT 平台时,请注意地址为https://xxxxxx.internetofthings.ibmcloud.com/

这里,xxxxxx是您的组织 ID;请注意下,因为在整个过程中会用到它。

创建一个应用

创建应用意味着,您允许实际的应用程序或服务连接到特定的 Watson IoT 平台组织:

  1. 为了做到这一点,通过 IBM Cloud 仪表板访问 IoT 组织,从侧边菜单中选择应用程序,然后选择生成 API 密钥,填写描述字段为Hands-On IoT Solutions with Blockchain - Chapter 1 App*。最后,点击“下一步”:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 选择标准应用角色,然后点击生成密钥。您将得到一个API 密钥认证令牌。请记下这些内容,以表格形式记录,因为您将需要它们连接到您的应用程序:
API 密钥认证令牌
  1. 接下来,打开您喜欢的 IDE,创建一个新的 Node.js 项目,并安装ibmiotf依赖包:
npm install ibmiotf --save
  • 1
  1. 确保您的package.json文件看起来与下面的内容类似:
{
  "name": "sample-application",
  "version": "1.0.0",
  "description": "Hands-On IoT Solutions with Blockchain - Chapter 1 App",
  "main": "index.js",
  "scripts": {
    "start": "node .",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Maximiliano Santos",
  "license": "ISC",
  "dependencies": {
    "ibmiotf": "⁰.2.41"
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  1. 现在,创建一个名为application.json的文件,内容如下:
{
  "org": "<your iot org id>",
  "id": "<any application name>",
  "auth-key": "<application authentication key>",
  "auth-token": "<application authentication token>"
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  1. 创建一个名为index.js的文件,并添加以下内容:
var Client = require("ibmiotf");
var appClientConfig = require("./application.json");

var appClient = new Client.IotfApplication(appClientConfig);

appClient.connect();

appClient.on("connect", function () {
  console.log("connected");
});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  1. 可以通过运行npm start命令来测试应用程序:
$ npm start
> sample-application@1.0.0 start /sample-application
> node .
connected
  • 1
  • 2
  • 3
  • 4

恭喜,您刚刚创建了连接到 IBM Watson IoT 平台的第一个应用程序!

  1. 现在,更新index.js的内容如下:
var Client = require("ibmiotf");
var appClientConfig = require("./application.json");

var appClient = new Client.IotfApplication(appClientConfig);

appClient.connect();

appClient.on("connect", function () {
  appClient.subscribeToDeviceEvents();
});

appClient.on("deviceEvent", function (deviceType, deviceId, payload, topic) {
  console.log("Device events from : " + deviceType + " : " + deviceId + " with payload : " + payload);
});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

现在,每当设备发布事件时,您将在stdout中得到事件的打印。在下一节中,我们将创建一个设备来发布事件。

创建一个设备

在本节中,您将运行类似步骤,创建一个模拟设备,连接到 IBM Watson IoT 平台,并发布事件。

  1. 在设置步骤中创建的 IoT 平台服务中,在菜单中选择设备,然后选择添加设备。创建一个名为 DeviceSimulator 的设备类型,并在设备 ID 字段中填写DeviceSimulator01

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 由于这只是一个模拟器,只需点击“下一步”,直到达到向导的末尾即可:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 注意生成的设备凭据,格式如下:
设备类型设备 ID认证方法认证令牌
  1. 回到您喜欢的 IDE,并创建具有与之前应用相同特性的项目:
npm install ibmiotf --save
  • 1
  1. 确保您的package.json文件看起来像下面这样:
{
  "name": "sample-device",
  "version": "1.0.0",
  "description": "Hands-On IoT Solutions with Blockchain - Chapter 1 Device",
  "main": "index.js",
  "scripts": {
    "start": "node .",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Maximiliano Santos",
  "license": "ISC",
  "dependencies": {
    "ibmiotf": "⁰.2.41"
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  1. 接下来,创建一个名为device.json的文件,内容如下:
{
  "org": "<your iot org id>",
  "type": "DeviceSimulator",
  "id": "DeviceSimulator01",
  "auth-method" : "token",
  "auth-token" : "<device authentication token>"
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  1. 创建一个名为index.js的文件,并添加以下内容:
var iotf = require("ibmiotf");
var config = require("./device.json");

var deviceClient = new iotf.IotfDevice(config);

deviceClient.log.setLevel('debug');

deviceClient.connect();

deviceClient.on('connect', function(){
  console.log("connected");
});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  1. 可以通过运行npm start命令来测试设备模拟器:
$ npm start
> sample-device@1.0.0 start /sample-device
> node .
[BaseClient:connect] Connecting to IoTF with host : ssl://3nr17i.messaging.internetofthings.ibmcloud.co
m:8883 and with client id : d:3nr17i:DeviceSimulator:DeviceSimulator01
[DeviceClient:connect] DeviceClient Connected
connected
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  1. 现在,更新代码,将当前时间戳发送到 IoT 平台服务:
var iotf = require("ibmiotf");
var config = require("./device.json");

var deviceClient = new iotf.IotfDevice(config);

deviceClient.log.setLevel('debug');

deviceClient.connect();

deviceClient.on('connect', function() {
  console.log("connected");
  setInterval(function function_name () {
    deviceClient.publish('myevt', 'json', '{"value":' + new Date() +'}', 2);
  },2000);
});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  1. 再次运行npm start,设备将每两秒向 Watson IoT 平台发送一个事件。你可以检查应用程序的日志,查看它是否接收到了事件,如下所示:
Device Event from :: DeviceSimulator : DeviceSimulator01 of event myevt with payload : {"value":Sun May 20 2018 21:55:19 GMT-0300 (-03)}
Device Event from :: DeviceSimulator : DeviceSimulator01 of event myevt with payload : {"value":Sun May 20 2018 21:55:21 GMT-0300 (-03)}
Device Event from :: DeviceSimulator : DeviceSimulator01 of event myevt with payload : {"value":Sun May 20 2018 21:55:23 GMT-0300 (-03)}
Device Event from :: DeviceSimulator : DeviceSimulator01 of event myevt with payload : {"value":Sun May 20 2018 21:55:25 GMT-0300 (-03)}
  • 1
  • 2
  • 3
  • 4

恭喜!你的设备模拟器现在正在发布事件,你的应用程序正在接收它们!

摘要

在本章中,我们概述了物联网环境。我们了解了一些在成功实施物联网解决方案中起作用的重要技术要素。

我们还研究了不同类型的网络选项、选择设备类型时的重要考虑因素,以及如何创建一个连接到 IBM Watson IoT 平台的设备和应用程序。

在下一章中,你将通过创建一个简单的连接花园来提高你的开发技能。

进一步阅读

在 IBM Watson IoT 平台文档中可以找到其他语言的示例,例如 Python、Java、C++ 和 C#,链接如下:console.bluemix.net/docs/services/IoT/getting-started.html#getting-started-with-iotp

第二章:创建您的第一个物联网解决方案

在上一章中,我们探讨了物联网IoT)以及 IBM Watson IoT 平台。我们还创建了我们的第一个简单解决方案。在本章中,我们将通过创建一个简单的端到端解决方案来实践这一点,从选择设备到创建设备固件和一个用于控制简单花园浇水系统的应用程序。

本章将涵盖以下主题:

  • 了解如何设置解决方案

  • 创建连接设备

  • 创建连接到平台的简单应用程序

  • 发布和处理设备事件

  • 将动作发布到设备

  • 在遇到问题时如何获取帮助

技术要求

完整的解决方案代码可在 ch2 文件夹中找到,位于 github.com/PacktPublishing/Hands-On-IoT-Solutions-with-Blockchain.git 存储库中。

确保您还安装了 Cloud Foundry CLI 和 Bluemix CLI;这些命令行界面的安装过程在 console.bluemix.net/docs/cli/index.html#overview 中有描述。

第一个物联网解决方案 - 花园解决方案

在 DIY 社区中,浇水系统是使用物联网的常见第一个项目。我们也将使用它作为一个示例项目,开始使用 IBM Watson IoT 平台。

需求概述

好的解决方案是基于真正对人们重要的问题。所以让我们从介绍实际问题开始我们的解决方案:

约翰独自一人住在城市的公寓里。他是一个商人,每周必须出差 3-4 天。在不出差或工作时,约翰喜欢照顾他的植物。然而,由于他一周有一半时间不在家,约翰正在努力保持他的花园健康和美丽。

约翰曾经在自动浇水系统中遇到过几次挑战性的经历:要么系统没有足够地给植物浇水(例如在炎热或干燥的日子),要么在天气好的时候给它们浇水太多。

约翰正在寻找一个解决方案,只有当植物达到一定的土壤湿度条件时,或者他觉得有必要时才给花园浇水。

解决方案概述

下图显示了将开发的解决约翰问题的解决方案组件的概述:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个连接的设备将连接到约翰的植物上,并定期从植物和环境(土壤湿度和温度)中检索测量值,并将事件发布到 IBM Watson IoT 平台。该设备还将订阅触发命令(动作)。

部署到 IBM 云(Bluemix)的应用将订阅约翰的事件,并在达到配置的最低土壤湿度或高温阈值时,应用将发送动作命令以进行一定时间的浇水。

选择设备

鉴于前一节描述的要求,需要创建的设备必须具备以下功能:

  • 能够测量土壤湿度水平(模拟探针非常适合这种解决方案)

  • 具有双向通信能力(以便用户在觉得有必要时为花园浇水)

  • 能够配置土壤湿度的限制(可配置规则)

关于解决方案,还有以下假设是成立的:

  • 用户将提

    • 供 Wi-Fi 互联网连接

    • 用户将为系统提供能源供应

    • 该系统将用于公寓,因此不需要远距离连接

    • 负载大小是不确定的

  • 当提供了 Wi-Fi 连接时,相关性变得更高

由于我们在创建实际设备之前进行原型设计,有许多原型设计平台可以使布线和测试解决方案更加容易快速。为此,我们将使用其中一种最强大和模块化的平台:英特尔 Edison 和 Grove。

我们将寻找具有 Wi-Fi 连接和模拟传感器连接的设备(或组合)。我们还需要一个土壤湿度模拟传感器探针、一个温湿度传感器和一个水电磁阀。

因此,解决方案将需要一个零件列表,其形式将类似于以下内容:

数量组件
1英特尔 Edison 模块
1英特尔 Edison Arduino 扩展板
1Grove 基座 v2
1Grove 土壤湿度传感器
1Groove 温度传感器 v1.2
1Grove 继电器模块
1Grove 按钮模块
4Grove 通用 4 脚电缆
112V 水电磁阀
112V 2A 电源适配器
2杜邦线(公对公)

下图提供了部件列表表中指定的部件的概览。请注意,设备的形状和颜色仅用于说明目的,可能会因供应商、版本或其他特性而有所不同:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

该图像是用 Fritzing 创建的,并在 CC BY-SA 3.0 下获得许可;请参阅 https://creativecommons.org/licenses/by-sa/3.0/

让我们快速查看一下此列表中的零件。

英特尔 Edison

Edison 是一款片上系统SoC),基于英特尔 x86 架构,内置蓝牙 4.0 和 Wi-Fi,专为物联网应用设计。Edison 运行名为 Yocto 的 Linux 发行版;支持许多平台,如 Python、Node.js、C 和 C++;并具有用于使用 Arduino IDE、Eclipse 和英特尔 XDK 开发解决方案的插件。

Arduino 扩展板

Intel 还推出了用于 Edison 的 Arduino 扩展板,它提供了与 Arduino 模块相同的标准引脚接口,并与 Arduino Shield 兼容。由于可以使用标准的 Arduino IDE、兼容的库、连接器和 Shield,因此 Intel Edison Arduino 扩展板是原型设计和运行 Arduino 程序的一个不错的接口。

Grove 系统

Grove 是由 Seeed 创建的一套组件和 Shield,用于创建一个标准化的模块化平台,供原型设计解决方案使用。有许多可用的原型设计,包括 Grove 平台的工作代码,尤其是在DIY社区网站上可以找到。

Grove 系统针对市场上广泛采用的平台(如 Arduino、Raspberry Pi 和 BeagleBone)提供了相应的 Shield。在互联网上可以找到包含计算模块、基础 Shield、Grove 模块和备件的捆绑销售套装。

请注意,并非每种传感器都兼容每种平台,因为一些平台缺乏某些功能。例如,Raspberry Pi 不提供模拟接口,因此通过模拟接口连接的传感器将与其不兼容。

让我们来看看作为这个物联网解决方案一部分的所有 Grove 组件。

用于 Arduino 的 Grove 基础 Shield

在本项目中,我们将使用 Arduino 的 Grove 基础 Shield,它提供了一个接口,用于将 Grove 标准连接器连接到 Arduino 引脚接口。它提供了四个模拟接口,四个 I2C 接口,七个数字接口和一个 UART 接口。

Grove 传感器

在本项目中,我们将使用两种不同类型的传感器:土壤湿度传感器和温度传感器。

土壤湿度传感器是一种模拟探针,可以提供土壤电阻测量数据,这一点我们将在本章后面进行解释。该传感器的温度是基于热敏电阻的,并且其规格和计算方法也在测量环境温度部分有详细介绍。

两种传感器都使用标准的 Grove 连接线,为探测器提供VCCGND和数据连接功能。

Grove 按钮

这个按钮与传感器一样连接到计算模块,但根据按钮是否按下,它可以提供开路或闭路状态。

它可能有不同的解释:按钮按下时中断连接,这意味着除非按下按钮,否则它会持续做某事;或者按钮按下时激活连接,这意味着只有在按下按钮后才会执行某些操作。

Grove 继电器

作为预期的一样,继电器模块连接到标准的 Grove 接口,但由于它不提供读数,所以被归类为执行器。

其他执行器模块,如 LED、显示器、电机驱动器和蜂鸣器,用于执行动作而不是读取状态。继电器模块也有两种状态,断路或闭路,这意味着继电器的输入连接没有连接到输出。

这结束了我们对零件的审查。让我们继续进行解决方案开发过程中的下一步。

接线装置

要组装硬件,我们需要正确连接传感器探针到处理单元——在本例中,是英特尔 Edison 模块。

Grove 模块使连接变得非常简单,如下面的步骤所示:

  1. 使用 Grove 通用电缆:

    • 将 Grove 湿度传感器连接到基础盾牌的A0连接插孔

    • 将 Grove 温度传感器连接到基础盾牌的A3连接插孔

    • 将 Grove 继电器模块连接到基础盾牌的D2连接插孔

    • 将 Grove 按钮模块连接到基础盾牌的D3连接插孔

  2. 使用跳线:

    • 将电磁阀的V+端连接到外部 12V 电源

    • 将外部GND引脚连接到基础盾牌的一个GND引脚

    • 将继电器连接到一个GND引脚

    • 将电磁阀GND端连接到另一个继电器模块连接处

以下图表显示了正确的连接方式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图像是使用 Fritzing 创建的,并且受 CC BY-SA 3.0 许可证的保护 https://creativecommons.org/licenses/by-sa/3.0/

编写设备固件

接下来,我们将创建一个设备应用程序(固件),该应用程序读取传感器数据并将其发送到后备应用程序。在上一章中,我们使用 Node.js 从设备模拟器发布事件,现在我们将使用此方法来利用前一章的代码。请记住,此解决方案的目标是在温度过高或土壤湿度过低时浇水。

下一节显示了创建读取所有传感器数据并将事件发布到 IBM Watson IoT 平台的固件所需的代码。

测量土壤湿度

此项目中使用的传感器探针是一个电阻性传感器,它测量通过传感器探针的电流。它有两个物理分离的探针;一个探针连接到正极,另一个连接到GND端。当两个探针通过一个共同的表面连接时,它将测量通过该表面传递的电流并给我们一个读数。

在我们的情况下,当探针接触土壤时,它将测量通过的电流。当土壤变湿时,它变得更加导电,这意味着更多的电流将通过探针。

位于 Arduino 扩展板上的英特尔 Edison ADC(模拟到数字)转换器具有 12 位分辨率,但通过软件限制为 10 位分辨率。如果我们将此作为测量的基础,我们将获得以下读数的理解:

2¹⁰ = 1024

这意味着我们的读数将是从 0 到 1,023 的值,其中 0 表示没有水,1,023 表示水的 100%。这将因土壤中存在的其他杂质而变化,例如矿物质。然而,在这种情况下,我们将假设土壤被完美地测量。当它完全干燥时,它会给我们一个 0% 的测量值,如果是一杯没有任何土壤的水,它会给我们一个 100% 的读数。

以下代码将每两秒读取一次土壤湿度传感器:

var mraa = require('mraa');
var pin0 = new mraa.Aio(0);
var getSoilMoisture = function() {
  var sensorReading = pin0.read();
  return sensorReading;
};
setInterval(function() {
  console.log("Current Moisture " + getSoilMoisture());
},2000);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

要运行代码,请在 Edison 的 SSH 控制台中键入 npm start

为了测试目的,让我们查看打印到控制台的传感器测量读数并对这些值有所了解:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们已经知道,0 表示 0% 的水分,1,023 表示 100%,这意味着程序中的样本测量读数如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

将读数值应用于前面的公式将使它们转换为百分比值,如下所示:

读数数值湿度百分比
25625.02%
30730.00%
30229.52%
30329.61%
29929.22%
29829.13%

测量环境温度

与上一个代码块类似(但稍微更加数学上复杂),温度传感器返回传感器的模拟读数。

如果我们查看制造商的说明 (wiki.seeedstudio.com/Grove-Temperature_Sensor_V1.2/) 关于如何读取传感器,我们将发现传感器的 v1.2 配有一个热敏电阻,其值为 4,250,以及一个 100k 电阻。

因此,使用该传感器计算温度值的公式如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

以下代码将基于传感器读数每两秒给出一次温度:

var mraa = require('mraa');
var pin3 = new mraa.Aio(3);
var RESISTOR = 100000;
var THERMISTOR = 4250;
var getTemperature = function() {
  var sensorReading = pin3.read();
  var R = 1023 / sensorReading - 1;
  R = RESISTOR * R;
  var temperature = 1 / (Math.log(R/RESISTOR)/THERMISTOR+1/298.15)-273.15;
  return temperature;
};
setInterval(function() {
  console.log("Current Temperature " + getTemperature());
},2000);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

此代码的输出将类似于以下内容:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 SSH 控制台,这些读数将被记录。

打开继电器

最后但同样重要的是,因为我们想要打开一个继电器,让水流出然后关闭,所以打开水的代码在一秒后关闭两秒后如下所示:

var mraa = require('mraa');
var pinD2 = new mraa.Gpio(2);
pinD2.dir(mraa.DIR_OUT);
setTimeout(function() {
  pinD2.write(1);
  setTimeout(function() {
    pinD2.write(0);
  },2000);
},1000);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

延迟一秒后,你将看到 D3 继电器模块的 LED 灯亮起,并且会听到一声点击。这意味着继电器连接已关闭,两秒后它将关闭并打开连接。

发布事件

在本章的这一点上,我们已经探讨了能够读取土壤湿度和温度的 Node.js 脚本,并且我们还查看了能够打开和关闭让水流到植物的继电器的代码。

现在的目标是将这两个值发布到 IBM Watson IoT 平台。

如前一章所示,需要创建一个设备并记录凭据,以便我们可以使用它们将设备连接到平台。下面的代码执行事件的定期发布:

var iotf = require("ibmiotf");
var mraa = require('mraa');
var config = require("./device.json");
var deviceClient = new iotf.IotfDevice(config);
var temperatureSensor = new mraa.Aio(3);
var moistureSensor = new mraa.Aio(0);
var RESISTOR = 100000;
var THERMISTOR = 4250;
var getTemperature = function() {
 var sensorReading = temperatureSensor.read();
 var R = 1023 / sensorReading - 1;
 R = RESISTOR * R;
 var temperature = 1 / (Math.log(R/RESISTOR)/THERMISTOR+1/298.15)-273.15;
 return temperature;
};
var getSoilMoisture = function() {
 var sensorReading = moistureSensor.read();
 return sensorReading;
};
deviceClient.connect();
deviceClient.on('connect', function(){
console.log("connected");
setInterval(function function_name () {
deviceClient.publish('status', 'json', '{ "temperature": ' + getTemperature() +', "soilMoisture": ' + getSoilMoisture() + '}', 2);
},300000);
});
  • 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

当脚本启动时,它们将从 device.json 文件加载配置,连接到 IBM Watson IoT 平台,然后每五分钟发布一次当前土壤湿度和温度的事件。

监测事件

查看设备发布的数据最简单的方法是使用看板和卡片。如果在创建卡片时保持设备脚本运行,它将从设备发布的数据结构中获取值。

  1. 要创建卡片,请访问 IBM Watson IoT 平台控制台,并在左侧菜单中选择看板:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 在页面右上角,选择+ 创建新看板,填写所需信息,并创建看板。大多数必须提供的信息都是杂项,但确保对目标用户有意义。这里创建的看板应该显示所监测到的植物读数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

看板是一组相关的卡片,卡片是设备发布到平台的相关值的集合。

  1. 选择已创建的看板,并通过选择+ 添加新卡片创建卡片。

  2. 选择 折线图 设备可视化和已创建的设备:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 选择折线图卡后,需要选择事件的数据源。将已创建的设备作为此卡的数据源。数据源,顾名思义,是将用于从设备收集的度量值填充图表的信息源:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 选择数据源后,需要选择将在图表上绘制的度量。如果设备已经向 IBM Watson IoT 平台发布了一些事件,那么度量名称将可供选择。另一方面,如果设备代码以前从未运行过,则需要提供度量名称。建议(但不是必须)在创建图表之前至少测试设备代码,以避免错误。

  2. 在正在开发的解决方案中,我们希望卡片在折线图中具有两个度量值,并进行跟踪。使用相应的单位和最小和最大可能值添加每个度量值。对于土壤湿度,我们使用百分比,因此单位应为%,最小和最大值分别为0100

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 对于以摄氏度(°C)测量的温度,最小和最大可能值分别为0100

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 选择您喜欢显示的卡片大小,命名卡片,并创建它。您现在可以可视化发布的数据了:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以验证植物设备发送的测量值,在时间线上绘制出来。还可以更改图表的时间范围。

订阅操作

在为设备发布事件之后,现在是定义需要由设备处理的操作的时候了。在我们的情况下,解决方案的用户 John 希望能够在检测到定义的土壤湿度阈值时给植物浇水,当温度达到可配置值时,或者当他触发浇水植物的事件时。

水流由电磁阀控制,该阀由继电器模块打开和关闭。以下代码是先前代码的更新,包括订阅浇水植物动作,该动作将打开阀门一分钟。

  1. 起点是导入所有包依赖项,使用预定义值定义RESISTORTHERMISTOR常量,并从device.json中加载配置:
var iotf = require("ibmiotf");
var mraa = require('mraa');
var config = require("./device.json");
var deviceClient = new iotf.IotfDevice(config);
var temperatureSensor = new mraa.Aio(3);
var moistureSensor = new mraa.Aio(0);
var relayControl = new mraa.Gpio(2);
var RESISTOR = 100000;
var THERMISTOR = 4250;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  1. 然后,创建辅助函数将传感器读数转换为可用值。以下函数负责从实际设备检索传感器值并将其转换为人类可理解的值:
var getTemperature = function() {
  var sensorReading = temperatureSensor.read();
  var R = 1023 / sensorReading - 1;
  R = RESISTOR * R;
  var temperature = 1 / (Math.log(R/RESISTOR)/THERMISTOR+1/298.15)-273.15;
  return temperature;
};
var getSoilMoisture = function() {
  var sensorReading = moistureSensor.read();
  return sensorReading;
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  1. 下一步是创建一个辅助函数来激活电磁阀,等待请求的时间量(secondsToWater变量的值),然后停止激活阀门以停止浇水:
var waterPlant = function(secondsToWater) {
  relayControl.write(1);
  setTimeout(function() {
    pinD2.write(0);
  },secondsToWater * 1000);
  • 1
  • 2
  • 3
  • 4
  • 5
  1. 连接到 IBM Watson IoT 平台并创建一个发布函数,该函数将每五分钟向平台发布事件:
deviceClient.connect();
deviceClient.on('connect', function(){
  console.log("connected");
  setInterval(function function_name () {
    deviceClient.publish('status', 'json', '{ "temperature": ' + getTemperature() +', "soilMoisture": ' + getSoilMoisture() + '}', 2);
  },300000);
});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  1. 创建一个订阅water事件的函数,触发waterPlant函数:
deviceClient.on("command", function (commandName,format,payload,topic) {
  if(commandName === "water") {
    var commandPayload = JSON.parse(payload.toString());
    console.log("Watering the plant for " + commandPayload.duration + " seconds.");
    waterPlant(commandPayload.duration);
  } else {
    console.log("Command not supported.. " + commandName);
  }
});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

这完成了我们的设备固件的编码,以便它可以执行我们的用户 John 所期望的操作。

创建后端应用程序

设备固件设置完成后,现在是专注于开发将处理设备事件并发送命令以便在 John 不在家时给他的植物浇水的应用程序的时候了。

应用程序的代码将在 IBM Cloud 平台(Bluemix)上运行。由于这只是一个示例应用程序,我们将使用环境变量来存储参数(温度和土壤湿度阈值)。

在 IBM Cloud 平台上创建一个 Cloud Foundry 应用程序

  1. 要在 IBM Cloud 中创建一个应用程序,请访问console.bluemix.net,选择创建资源选项,并在左侧菜单中选择 Cloud Foundry Apps,然后选择 SDK for Node.js。做完这些之后,给应用程序命名并创建运行时:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 当应用程序创建完成后,在左侧菜单中选择 Connections,并创建到 IoT 服务的连接:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 在创建到 IBM Watson IoT Platform 组织的连接之后,选择左侧菜单中的 Runtime 选项,然后选择 Environment Variables。在屏幕底部,添加两个用户定义变量,MINIMUM_MOISTURE 的值为 300MAXIMUM_TEMPERATURE 的值为 50

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

与之前章节中使用 JSON 文件存储配置不同,现在唯一需要的配置是在 VCAP_SERVICES 和环境变量中。可以使用默认库包从代码中访问这些变量,并且在 Node.js 中有用于访问 Cloud Foundry 环境相关设施的加速器,比如在下一节中介绍的代码中使用的 cfenv 模块。

上传代码

由于我们正在将应用程序部署到 Cloud Foundry 环境中,重要的是要知道 Cloud Foundry 容器期望容器发布一个 HTTP 端口,所以即使我们不使用容器来公开 HTTP 资源,我们仍然会启动 Express JS 服务器。

以下代码处理从设备接收到的事件,并在满足任何条件时发布动作。

  1. 再次,代码的入口是加载模块依赖项并从 Cloud Foundry 环境变量中收集所需配置:
var express = require("express");
var cfenv = require("cfenv");
var Client = require("ibmiotf");
var minimumMoisture = parseInt(process.env.MINIMUM_MOISTURE);
var maximumTemperature = parseInt(process.env.MAXIMUM_TEMPERATURE);
  • 1
  • 2
  • 3
  • 4
  • 5
  1. 然后,从 Cloud Foundry 环境加载配置数据并生成连接配置数据:
var app = express();
var appEnv = cfenv.getAppEnv();
var iotConfig = appEnv.getService("Internet of Things Platform-mf");
var appClientConfig = {
  "org": iotConfig.credentials.org,
  "id": "hands-on-iot-app",
  "auth-key": iotConfig.credentials.apiKey,
  "auth-token": iotConfig.credentials.apiToken
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  1. 下一步是连接到 IBM Watson IoT Platform 并订阅目标设备事件:
var appClient = new Client.IotfApplication(appClientConfig);
appClient.connect();
appClient.on("connect", function () {
  appClient.subscribeToDeviceEvents();
});
appClient.on("deviceEvent", function (deviceType, deviceId, eventType, format, payload) {
  var deviceData = JSON.parse(payload);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  1. 每当从订阅接收到事件时,应用程序都会检查设备报告的温度是否更高或土壤湿度是否低于定义的阈值。如果是,则发布带有指定持续时间(以秒为单位)的浇水事件到设备,以激活浇水阀:
  if(deviceData.temperature > maximumTemperature ||
deviceData.soilMoisture < minimumMoisture ) {
    console.log("Device, please water the plant for 60 seconds");
    var actionData= { duration : 60 };
    actionData = JSON.stringify(actionData);
    appClient.publishDeviceCommand(deviceType, deviceId, "water", "json", actionData);
  }
});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  1. 最后,启动 Express 服务器,以便 IBM Cloud SDK for Node.js 容器在 Cloud Foundry 环境中启动并受监控:
var port = process.env.PORT;
app.listen(port, function() {
 console.log("App listening!");
});
  • 1
  • 2
  • 3
  • 4

要部署应用程序,请打开 manifest.yml 文件并更改应用程序的 name 属性。然后,打开命令行终端,切换到应用程序基目录(即 manifest.yml 所在的位置),并使用 bluemix CLI 部署应用程序:

bluemix login

bluemix target -o <your_cloud_foundry_organization_name> -s <space_where_your_app_will_be_deployed>

bluemix cf push
  • 1
  • 2
  • 3
  • 4
  • 5

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

获取成功部署消息后,使用 bluemix CLI 检查应用程序日志:

bluemix cf logs <your_application_name> 
  • 1

该命令将从 Cloud Foundry 应用程序检索并显示日志文件,如下所示。为确保您能检索这些日志,请确保所有应用程序跟踪都发送到 stdoutstderr

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从 Cloud Foundry 应用程序的日志文件

查看设备日志,可以看到每当满足条件时,它们都会收到浇水的操作请求:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

此时,您已经在 IBM Cloud 环境中拥有一个 IoT 应用程序和设备,并且已连接并正常工作。

摘要

在本章中,我们开发了在支持 Node.js 的真实设备上运行的解决方案。我们还使用了低级别的 mraa 库,该库与设备的 GPIO(通用输入/输出)进行交互,读取模拟传感器(温度和土壤湿度传感器),并使用数字引脚开关继电器的开关。这看起来非常简单,但大多数设备都具有传感器和执行器,这可能会改变它们的使用方式。但是,它们基本上遵循相同的概念。

我们在 IBM Watson IoT 平台中创建了一个仪表板,有助于查看设备发布的实时数据。我们还在 IBM Cloud 平台(Bluemix)中创建了一个应用程序,并将后台服务(IBM Watson IoT 平台组织)附加到了应用程序上,以利用配置数据连接到服务,并使用 Bluemix 命令行界面部署应用程序。

接下来的章节将介绍区块链作为互连业务平台,并解释其价值以及它增加业务链价值的常见用例。

进一步阅读

完成使用 IBM Watson IoT 平台的解决方案所需的大多数资源都可以在官方文档中找到,链接如下:console.bluemix.net/docs/services/IoT/index.html#gettingstartedtemplate。社区还发布了许多使用 IBM Watson IoT 的配方,并可在 developerWorks 配方网站上找到,链接如下:developer.ibm.com/recipes/tutorials/category/internet-of-things-iot/

了解如何将项目上传到 GitHub 存储库以及如何创建交付流水线以在推送新更改到存储库时自动构建、测试和部署应用程序也非常有帮助。尽管这不在本书的范围之内,但这仍然是一个非常好的实践。

关于 Grove 系统平台、模块、套件和组件规格的更多信息可以在制造商的网站上找到:wiki.seeedstudio.com/Grove/

第三章:解释区块链技术并使用超级账本进行工作

区块链是数字世界中的一股变革力量,人们比以往任何时候都更加联系。简单来说,这个称为区块链的共享分布式账本能够使记录交易和跟踪资产的过程更加安全、简单,并且对所有成员透明。

现在人们经常使用诸如互联网银行、电子商务和应用程序之类的服务进行购买,如酒店预订、出租车服务和其他在线服务。这导致了大量的交易和数据。除此之外,物联网也为这个数字世界带来了新的可能性。随着产品与物联网集成,交易量呈指数级增长;因此,跨地理边界连接到供应商、银行和监管机构的必要性也在增加。

区块链技术为许多行业的运营业务提供了巨大的转型机会,如金融服务、保险、通信和政府。此外,它促进了公司之间的交易,因为它们可以通过数字方式进行处理。

什么是区块链?

让我们更深入地了解一下区块链到底是什么。资产包括任何能够被拥有或控制以产生价值的东西。资产是这个网络的主角,并且可以包括有形资产,如汽车、房屋或货币。它们还可以包括无形资产,如版权和专利。如果资产是主角,那么账本就是关键。账本是企业的记录系统。企业将在参与的多个业务网络中拥有多个账本。

以下图表代表了业务网络的现状。每个参与者保留自己的账本,随着业务交易的发生,它们会更新以表示业务交易:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用区块链技术,业务网络的成员共享账本,每次通过点对点复制发生交易时都会更新,如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

区块链允许多个竞争方与相同的全球性真相安全互动。它具有用于记录交易历史的共享不可变账本,为具有已知身份的权限网络提供服务。

区块链的四个重要概念如下:

  • 共识:要使交易有效,所有参与者必须就其有效性达成一致。

  • 溯源:参与者知道资产来自何处以及其所有权如何随时间变化。

  • 不可变性:在交易记录到账本之后,没有参与者可以篡改交易。如果交易出错,必须使用新的交易来撤销错误,然后两笔交易都会可见。

  • 最终性: 一个共享的单一账本提供了确定资产所有权或交易完成的唯一途径。

当我们谈论区块链时,主要关注的是基于区块链的企业网络、面向企业的区块链,其中交易和成员是经过许可、私有和优先的;我们正在处理资产、身份和选择性认可。

你可能熟悉区块链是比特币技术的概念。事实上,我们甚至可以说比特币是区块链的第一个用例。比特币是一种没有中央银行、没有单一管理员和没有纸币的数字货币。所使用的软件能够在点对点网络中解决数学难题。交易没有中间人;它们直接在用户之间进行,并具有透明性。

区块链与 Hyperledger

周围有许多区块链框架或技术:R3(corda)、以太坊、Neo 和 Nem,每个都具有特定的设计和架构。在本书中,我们将专注于 Hyperledger 区块链技术(www.hyperledger.org/)。

Hyperledger 是 Linux Foundation 的一部分,于 2016 年启动,具有技术和组织治理结构以及 30 家创始企业会员。现在有超过 230 家成员参与了这一倡议。这包括了思科、日立、IBM、ABN AMRO、澳新银行、红帽、VMware 和摩根大通等公司。如今,Hyperledger 在同一伞下与许多项目合作,并专注于区块链用例的差异,以及涵盖框架和工具。你可以在www.hyperledger.org找到对 Hyperledger 项目的良好描述。在这里,指出了 Hyperledger 孵化和推广一系列企业区块链技术,包括分布式账本框架、智能合约引擎、客户端库、图形界面、实用库和示例应用程序。Hyperledger 伞策略鼓励重复使用共同的构建模块,并实现 DLT(分布式账本技术)组件的快速创新:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Hyperledger 项目

探索 Hyperledger 项目,我们找到了五个框架和五个工具。框架包括 Sawtooth、Iroha、Burrow、Indy 和 Fabric。工具包括 Caliper、Composer、Cello、Explorer 和 Quilt。

让我们讨论这些框架和工具。

Hyperledger Sawtooth 框架

Hyperledger Sawtooth 遵循与其他 Hyperledger 框架相同的架构和特性;它是用于构建分布式账本应用程序和网络的企业区块链平台。

在我看来,Sawtooth 最引人注目的特点是使用 API 的便利性,以及许多语言,如 Python、C++、Go、Java、JavaScript 和 Rust。这有助于开发在 Sawtooth 平台上运行的应用程序。此外,您还可以为 Seth 事务族编写 Solidity 智能合约。

另一个好的特性是并行交易执行。大多数区块链需要串行交易执行,以确保网络上每个节点的一致排序。以太坊合约兼容性也可以与 Seth 一起使用;Sawtooth-Ethereum 整合项目扩展了 Sawtooth 平台与以太坊的互操作性。

Hyperledger Iroha 框架

Hyperledger Iroha 是一个设计用于构建分布式账本的区块链平台;它基于诸如了解您的客户之类的用例,并具有移动应用程序开发和称为 Sumeragi 的新链基拜占庭容错共识算法。Soramitsu、Hitachi、NTT Data 和 Colu 最初为 Hyperledger Iroha 做出了贡献。

Hyperledger Composer 工具

如果您想测试一个想法,创建一个概念验证POC)或最小价值产品(MVP),甚至开始一个项目,那么 Hyperledger Composer 可以帮助您快速轻松地做到这一点。您可以使用名为 Composer Playground 的 web 应用程序测试您的业务网络。通过一些点击和一个好的用例,您也可以创建一个集成到您系统中的业务网络。另一个选项是创建一个前端应用程序来使用您的智能合约。

下图代表了 Hyperledger Composer 工具站点中的官方架构概述。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Hyperledger Burrow 框架

Hyperledger Burrow 文档的第一段含有对这个框架的良好描述。描述如下:

“Hyperledger Burrow 是一个权限 Ethereum 智能合约区块链节点。它在权限虚拟机上执行 Ethereum EVM 智能合约代码(通常以 Solidity 编写)。Burrow 在基于权益证明的 Tendermint 共识引擎上提供交易终局和高交易吞吐量。”

实际上,想要与以太坊智能合约一起工作。应用于 Hyperledger Burrow 的高级架构可以在以下图表中看到:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Hyperledger Fabric

要探索 Hyperledger 的总项目,我们将使用 Hyperledger Fabric。这是 Hyperledger 框架的第一个项目或初始概念,Digital Asset 和 IBM 是最初的贡献者之一。Hyperledger Fabric 的特点如下:

  • 允许诸如共识和成员服务之类的组件即插即用

  • 利用容器技术托管称为链代码的智能合约,这些智能合约包括系统的应用逻辑

但在我们继续之前,让我们回顾一些区块链的概念,并详细探索 Hyperledger Fabric:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在前面的图中,你可以看到一个高层次的区块链架构。让我们探索(分析)这个架构的重要组件:

  • 链码: 这是我们的业务网络合同,就像任何合同一样,它规定了网络成员之间可能的交易,并保证每个成员都有对账本的预先确定的定义访问。

  • 账本: 将其视为整个交易历史的数字存储,就像数据库一样,您可以拥有查询功能来探索数据。

  • **隐私:**频道:在大多数情况下,所有网络都有一个唯一的频道,但 Hyperledger Fabric 允许多边交易,保证隐私和机密性,因此如果网络中的两个成员由于任何原因需要在它们之间进行特定交易,它们可以有一个与其他人分离的频道。

  • 安全和成员服务:每个成员在网络中都有特定的权限,因此每笔交易都将被记录并可以被授权的监管者或审计者追踪。

为了更好地解释我们所说的,让我们看一下 Hyperledger Fabric 在业务网络中的组件:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

前面图中显示的组件可以解释如下:

  • 多个成员是区块链网络的一部分。在这种情况下,我们有成员 1成员 2成员 3成员 N

  • 每个成员都有自己的对等节点。

  • 每个对等节点都有一个证书管理机构

  • 队列或者交易将由排序集群排序。

成员或对等节点

对等节点是网络中托管账本和智能合约的成员或公司。智能合约和账本用于封装网络中的共享流程和共享信息:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

证书管理机构(CA)

业务网络的每个成员都可以访问由系统信任的权威颁发的数字身份。在最常见的情况下,数字身份(或简单身份)采用符合 X.509 标准的加密验证数字证书的形式,并由 CA 颁发。

排序集群

队列或者交易将由提供给客户端和对等节点共享通信频道的排序服务排序,为包含交易的消息提供广播服务。在排序和分发交易的过程中,Hyperledger Fabric 与**排序服务(OS)**和 Kafka 集群一起工作,这是保证负载平衡和共识的代理。当我们建立环境时,我们将更详细地探讨这一点。

SDK/ API

应用程序或当前系统可以通过一个 SDK/API 连接到区块链网络,这通常使用 Node.js 开发,是使用智能合约的重要步骤:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Hyperledger Fabric 1.3 有一些重要的改进。自 1.1 版本和 Node.js 链码支持以来,开发人员现在能够使用最流行的框架和最新的编程语言来开发链码了。如果你使用的是 1.1 版本之前的版本,你需要使用 Go 来开发链码。让我们来探索一下 Hyperledger Fabric 1.3 的新功能。

本书用来创建编码的例子将遵循 Hyperledger Fabric 1.4,其具有重要的新功能,如:

  • 开发应用的新方法

这些新功能促进了分散式代码的编写。它们使开发人员能够直观而合乎逻辑地使用 Node.js SDK Node.js 链码来编写分散式应用程序

  • 操作的新功能和更易维护

随着更多 Hyperledger Fabric 网络的部署和测试,可维护性和运行方面变得更加重要。Fabric v1.4 在记录改进、健康检查和运行指标方面有新功能。Fabric 1.4 是建议用于启动生产操作的版本,因为其功能侧重于稳定性和一些重要的修复。如果你去 Hyperledger Fabric 网站,你可以找到关于未来修复将在 v1.4.x 流中交付的信息,而新功能正在 v2.0 流中开发中。

选择一个好的使用案例

在开始任何区块链项目之前,一个重要的步骤是选择一个好的使用案例。我们经常看到可以通过分布式数据库甚至具有良好权限访问的 Web 应用程序解决的情况。这里有一个难题要解决:

  • 业务网络是否包括在内?

  • 是否有一个需要验证或共识的交易?

  • 审计追踪重要吗,或者原产地控制?

  • 不可变性(数据)

  • 最终性(减少争议)

一定要绘制一个地图,并标明不同的组织,或是一个商业网络以及它们之间的关联——这是非常重要的一步。此外,检查使用案例是否涉及到第二至第五点之间列出的一个或多个属性。如果你没有第二至第五点之间列出的多个属性,那么它可能并不适合区块链解决方案。

在选择使用案例时,进行头脑风暴或设计思维会议是个好主意。

这个表格演示了不同行业的一个良好使用案例:

金融机构保险跨行业和其他

|

  • 信用证

  • 借贷或债券

  • 联盟共享账本

|

  • 第一方医疗索赔处理

  • 计划好的个人财产索赔处理

|

  • 忠诚积分

  • 资本资产管理

  • 身份管理

|

区块链—食品追踪使用案例

现在,让我们专注于食品追踪的用例。如今,消费者要求了解更多关于产品生产的信息和透明度。欧盟对企业供应链要求更多信息,并对不遵守规定的公司和国家进行严厉处罚。自 2016 年以来,赛里斯消费者一直在追踪他们的食物是在哪生产的,以及在抵达他们餐桌之前在不同批发商和经纪人手中转手了多少次。所以,区块链似乎是一个很好的适用场景,对吧?

让我们思考区块链的五个要素:

  1. 商业联网

生产商、制造商、运输公司、零售店。

  1. 是否存在需要验证或共识的交易?

记录谁拥有什么,何时,以及资产在供应链的哪里。

  1. 审计路径重要吗?

消费者要求,像欧盟和赛里斯这样的国家都需要进行跟踪审计。

  1. 不可变性和 5. 最终性

参与复杂流程的不同公司和资产。

好了,现在我们知道区块链适合我们的用例,让我们来看看使用区块链技术的好处:

  • 它是可验证的,防止任何一方篡改或质疑正在交换的信息的合法性。

  • 在复杂的全球供应链中,通过增加透明度可以获得更高的效率。

  • 监管机构、政府机关和商业网络公司可以快速而轻松地从整个供应链请求可靠的信息。

在接下来的章节中,我们将更详细地探讨食品链以及区块链与物联网如何改变它。

摘要

区块链具有共享和分布式分类帐功能,可以使业务网络中的交易记录和资产跟踪过程更加简单和动态。这与比特币不同,比特币是一个无权限公共分类帐的例子,并定义了一个不受监管的有大量资源的影子货币。区块链通常是受许可的、私有的,并优先考虑背书,使用基于加密货币的资产。

项目称为 Hyperledger,是一个协作项目,采用开源代码,旨在推广区块链技术。

2017 年 5 月,有五个活跃的框架和五个活跃的工具:

  • 框架: Hyperledger Burrow、Hyperledger Fabric、Hyperledger Iroha、Hyperledger Sawtooth 和 Hyperledger Indy

  • 工具: Hyperledger Cello、Hyperledger Composer、Hyperledger Explorer、Hyperledger Quilt 和 Hyperledger Caliper

在接下来的章节中,我们将更详细地探讨区块链平台如何解决食品链中的一些重要挑战,我们将发现 Hyperledger Fabric 1.4 是一个强大的区块链平台。

问题

Q. 为什么使用区块链?

A. 区块链为解决束缚供应链的食品链挑战提供了信任和透明度;通过使用区块链,你可以获得该平台的好处,比如:

  • 信任和透明度

  • 选择谁行动和接收信息,因为你只需要一个共享账本来进行交易

  • 由于账本不可更改,不再存在信任缺失的问题,参与者可以确保交易的起源和真实性

  • 快速轻松地获取详细的端到端供应链数据

  • 通过生态系统数据,基于商品和产品更好的配置,最小化浪费

区块链赋予参与者共享账本的能力,每次交易发生时,通过点对点复制进行更新。隐私服务用于确保参与者只能看到与他们相关的账本部分,并且交易是安全的、经过认证的和可验证的。区块链还允许资产转移合同嵌入在交易中执行。网络参与者达成一致,通过所谓的共识过程验证交易。政府监督、遵从和审计可以成为同一个网络的一部分。

进一步阅读

要查找更多关于该主题的信息,请访问以下链接:

第四章:创建您自己的区块链网络

在本章中,我们将使用 Hyperledger Composer 创建一个区块链网络。我们将探索一个简单的用例,在其中资产可以在网络参与者之间转移。我们将学习如何快速安装 Hyperledger Fabric 版本 1.1。此外,我们将确定并实现一本运行您自己业务网络的逐步指南。

我们将通过探索以下主题来学习所有这些内容:

  • 创建区块链网络的先决条件

  • 对 Hyperledger Composer 的简要概述

  • 探索 Composer Playground 以创建区块链网络

  • 设置本地 Hyperledger Fabric/Composer 开发环境

先决条件

为了完成本章的练习,请确保您的计算机已安装以下内容:

  • curl

  • Node.js 8.9.x

  • Python 2.7

  • Git 2.9.x 或更高版本

  • Go

  • Windows 10/Ubuntu Linux 14.04/macOS 10.12

对于 Windows 10,您将需要安装 Windows 子系统以运行 Ubuntu。

使用 Hyperledger Composer 创建自己的区块链网络

在第三章,解释区块链技术和使用 Hyperledger 中,我们看了一些属于 Hyperledger 分布分类帐伞下的各个框架。我们随后分析了其中之一,即 Hyperledger Composer,一个开发区块链网络的强大工具。

在区块链方面,使用 Hyperledger Composer 的最大优势之一是该框架提供的出色文档,不仅限于网站本身,还包括开发者网站和其他提供代码和常规示例的网站。

在这里,我们将看到一个比在 Hyperledger Composer 的教程网站上发现的稍微不太常见的用例的逐步指南,这将演示创建区块链网络是多么简单。我们将使用被称为 Playground 的 Hyperledger Composer 平台。

访问 Hyperledger Composer

在线 Hyperledger Composer Playground 使我们能够在没有任何安装的情况下探索 Hyperledger 组件。以下步骤将指导您游览在线 Composer Playground:

  1. 让我们访问以下链接的网站:composer-playground.mybluemix.net/login。正如我们在以下截图中看到的,主页会显示一个闪屏页面:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 点击 Let’s Blockchain! 按钮后,将进入下一个页面,其作为仪表板使用:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这个页面上,您可以选择使用教程,该教程将带领您完成非常详细的逐步流程。这对于探索 Hyperledger Composer 非常有帮助。现在,让我们继续。

  1. 点击 Get Started 链接。加载几个屏幕后,您将进入编辑器,在那里您将能够创建您自己的区块链网络:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在我们的情况下,我们将有两个参与者和一个资产,这可以是一个具有价值的令牌。这个想法是在网络的参与者之间移动这个资产和价值。

探索样本区块链网络的结构

  1. 让我们从name.cto模型文件开始。模型文件定义了我们业务网络中的资产、参与者、交易和事件。请记住,每一步之后,您需要部署这些更改。接下来,我们将看到一些截图来说明这个过程:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 让我们使用以下代码来创建参与者、交易和事件:
// **
  * Sample business network definition.
  */
 namespace org.example.basic

 asset SampleAsset identified by assetId {
   o String assetId
   --> SampleParticipant owner
   o Double value
 }

participant SampleParticipant identified by participantId {
   o String participantId
   o String firstName
   o String lastName
 }

 transaction SampleTransaction {
   --> SampleAsset origin
   --> SampleAsset target
     o Double txTransferAmount
 }

 event SampleEvent {
   --> SampleAsset origin
   --> SampleAsset target
     o Double txTransferAmount
 }
  • 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
  1. 让我们创建一个函数来在参与者之间转移资产。我们将使用name.js脚本文件:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 让我们看一下这里使用的算法/逻辑的代码:
 * Sample transaction processor function.
  * @param {org.example.basic.SampleTransaction} tx The sample transaction instance.
  * @transaction
  */
 async function sampleExchange(tx) { 
     // Get the asset registry for the asset.
     const assetRegistry = await getAssetRegistry('org.example.basic.SampleAsset');

       //Ensure the balance is greather than the amount to be transfered
       if(tx.origin.value > tx.txTransferAmount) {

     //charge from receiver account
     tx.origin.value = (tx.origin.value - tx.txTransferAmount);

     //add to receiver account
     tx.target.value = (tx.target.value +  tx.txTransferAmount);

     // Update the asset in the asset registry.
     await assetRegistry.update(tx.origin);
     await assetRegistry.update(tx.target);

     // Emit an event for the modified asset.
     let event = getFactory().newEvent('org.example.basic', 'SampleEvent');

     event.origin = tx.origin;
 event.target = tx.target;
 event.txTransferAmount = tx.txTransferAmount;

 emit(event);

 } else {
   throw Error(`You do not have enough balance for this transaction: Balance US$: ${tx.origin.value} Transfer Amount: ${tx.txTransferAmount}`);
 }
 }
  • 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
  1. 访问控制列表ACL)是确保 Hyperledger Composer 区块链网络对参与者在资产上可以执行的操作进行隔离访问的功能。现在我们将创建一个业务规则,允许区块链网络的成员有正确的访问控制。基本文件赋予当前参与者,即网络管理员,对业务网络和系统级操作的完全访问权。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里有一些代码,向我们展示如何创建访问控制:

/**
  * Sample access control list. rule Everybody Can Read Everything and send a transaction for example
  */
 rule EverybodyCanReadEverything {
     description: "Allow all participants read access to all resources"
     participant: "org.example.basic.SampleParticipant"
     operation: READ
     resource: "org.example.basic.*"
     action: ALLOW
 }
 rule EverybodyCanSubmitTransactions {
     description: "Allow all participants to submit transactions"
     participant: "org.example.basic.SampleParticipant"
     operation: CREATE
     resource: "org.example.basic.SampleTransaction"
     action: ALLOW
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  1. 如下所示,为访问控制的资产定义访问权限:
rule OwnerHasFullAccessToTheirAssets {
 description: "Allow all participants full access to their assets"
 participant(p): "org.example.basic.SampleParticipant"
 operation: ALL
 resource(r): "org.example.basic.SampleAsset"
 condition: (r.owner.getIdentifier() === p.getIdentifier())
 action: ALLOW }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  1. SystemACL定义一个规则,无论是网络管理员还是用户,如下所示:

 rule SystemACL {
 description: "System ACL to permit all access"
 participant: "org.hyperledger.composer.system.Participant"
 operation: ALL
 resource: "org.hyperledger.composer.system.**"
 action: ALLOW }
 rule NetworkAdminUser {
 description: "Grant business network administrators full access to user resources"
 participant: "org.hyperledger.composer.system.NetworkAdmin"
 operation: ALL
 resource: "**"
 action: ALLOW
 }
 rule NetworkAdminSystem { description: "Grant business network administrators full access to system resources"
 participant: "org.hyperledger.composer.system.NetworkAdmin"
 operation: ALL
 resource: "org.hyperledger.composer.system.**"
 action: ALLOW
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  1. 我们现在准备测试我们的区块链网络。在屏幕顶部点击“测试”选项卡:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 现在为您的区块链网络创建两个参与者。第一个参与者在这里显示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用以下代码来创建第一个参与者:

{
   "$class": "org.example.basic.SampleParticipant",
   "participantId": "1",
   "firstName": "Joao",
   "lastName": "Dow"
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

第二个参与者在这里显示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用以下代码创建第二个参与者:

{
   "$class": "org.example.basic.SampleParticipant",
   "participantId": "2",
   "firstName": "Sarah",
   "lastName": "Barbosa"
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  1. 现在让我们为参与者 1 创建一个资产。记得添加participantIdassetIdvalue

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 使用以下代码为参与者 1 创建一个资产:
{
   "$class": "org.example.basic.SampleAsset",
   "assetId": "0744",
   "owner": "resource:org.example.basic.SampleParticipant#1",
   "value": 1000
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  1. 重复用于参与者 1 的方法,用于参与者 2:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 使用以下代码为参与者 2 创建一个资产:
{
   "$class": "org.example.basic.SampleAsset",
   "assetId": "4010",
   "owner": "resource:org.example.basic.SampleParticipant#2",
   "value": 1000
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  1. 我们现在准备在参与者之间提交一笔交易。点击“提交”按钮并从参与者 2 发送一笔金额给参与者 1。在以下示例中,交易的价值为 300:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 使用以下代码在参与者之间转移一笔金额:
{
   "$class": "org.example.basic.SampleTransaction",
   "origin": "resource:org.example.basic.SampleAsset#0744",
   "target": "resource:org.example.basic.SampleAsset#4010",
   "txTransferAmount": 300
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

做得好!通过点击以下两个截图中的记录,您可以看到所有交易的详细信息。第一个显示了所有创建的资产的列表:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第二张截图显示了在区块链网络上运行的交易历史记录:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在您已经验证了一个用例,您可以开始制作一个新的概念验证,并向业务网络中的成员展示 Hyperledger 区块链的全部潜力。

使用 Hyperledger Fabric 和 Composer 安装您自己的区块链网络

在上一节中,我们看到了使用 Playground 与 Hyperledger Composer 一起工作是多么容易。现在我们将在您自己的(本地)机器上安装 Composer。

我们将从安装区块链网络的三个最重要阶段开始:

  1. 安装先决条件

  2. 安装 Hyperledger Composer(开发环境)

  3. 更新环境

我们可以通过许多方式使用 Hyperledger Fabric 安装区块链网络,包括本地服务器、Kubernetes、IBM Cloud 和 Docker。首先,我们将探索 Docker 和 Kubernetes。

设置 Docker

Docker 可以使用www.docker.com/get-started上提供的信息进行安装。

Hyperledger Composer 与两个版本的 Docker 一起工作:

  • Docker Composer 版本 1.8 或更高版本

  • Docker 引擎版本 17.03 或更高版本

如果您已经安装了 Docker 但不确定版本,您可以在终端或命令提示符中使用以下命令查看版本:

docker –version
  • 1

注意:许多基于 Linux 的操作系统,例如 Ubuntu,都附带了最新版本的 Python(Python 3.5.1)。在这种情况下,重要的是要获取 Python 2.7 版本。您可以在此处获取它:www.python.org/download/releases/2.7/

安装 Hyperledger Composer

现在我们将设置 Hyperledger Composer 并获得其开发工具的访问权限,这些工具主要用于创建业务网络。我们还将设置 Hyperledger Fabric,该工具可用于在本地运行或部署业务网络。这些业务网络也可以在其他地方的 Hyperledger Fabric 运行时中运行,例如在云平台上。

确保您之前没有安装过这些工具并使用过。如果您安装过,您将会使用本指南。

组件

要成功安装 Hyperledger Composer,您需要准备好以下组件:

  • CLI 工具

  • Playground

  • Hyperledger Fabric

  • 一个 IDE

安装完这些后,您可以开始执行这里给出的步骤。

步骤 1 – 设置 CLI 工具

CLI 工具,composer-cli,是一个具有最重要操作的库,例如管理、操作和开发任务。我们还将在此步骤中安装以下工具:

  • Yeoman:用于生成应用程序的前端工具

  • 库生成器:用于生成应用程序资产

  • REST 服务器:用于运行 REST 服务器(本地)

让我们开始设置 CLI 工具:

  1. 安装 CLI 工具:
npm install -g composer-cli@0.20
  • 1
  1. 安装库生成器:
npm install -g generator-hyperledger-composer@0.20
  • 1
  1. 安装 REST 服务器:
npm install -g composer-rest-server@0.20
  • 1

这将允许与本地 REST 服务器集成,将你的业务网络暴露为 RESTful API。

  1. 安装 Yeoman:
npm install -g yo
  • 1

不要使用susudo命令来使用npm,以确保当前用户有足够的权限来自己运行环境。

第二步 – 设置 Playground

如果你在本地机器上使用浏览器运行 Playground,Playground 可以为你提供一个 UI。这将允许你显示你的业务网络,浏览应用程序以进行测试编辑,并测试你的业务网络。

使用以下命令安装 Playground:

npm install -g composer-playground@0.20
  • 1

现在我们可以运行 Hyperledger Fabric 了。

第三步 – Hyperledger Fabric

这一步将允许你在本地运行 Hyperledger Fabric 运行时并部署你的业务网络:

  1. 选择一个目录,比如~/fabric-dev-servers

  2. 现在获取包含安装 Hyperledger Fabric 工具的.tar.gz文件:

mkdir ~/fabric-dev-servers && cd ~/fabric-dev-servers

curl -O https://raw.githubusercontent.com/hyperledger/composer-tools/master/packages/fabric-dev-servers/fabric-dev-servers.tar.gz
tar -xvf fabric-dev-servers.tar.gz
  • 1
  • 2
  • 3
  • 4

你已经下载了一些脚本,这些脚本将允许安装本地 Hyperledger Fabric v1.2 运行时。

  1. 要下载实际的环境 Docker 镜像,在你的用户home目录中运行以下命令:
cd ~/fabric-dev-servers
export FABRIC_VERSION=hlfv12
./downloadFabric.sh
  • 1
  • 2
  • 3

干得好!现在你拥有了一个典型的开发者环境所需的一切。

第四步 – IDE

Hyperledger Composer 允许你使用许多 IDE。其中两个知名的是 Atom 和 VS Code,它们都有很好的扩展可以用于与 Hyperledger Composer 的工作。

Atom 可以让你使用composer-atom插件(github.com/hyperledger/composer-atom-plugin)对 Hyperledger Composer 建模语言进行语法高亮。你可以在以下链接下载这个 IDE:atom.io/.同时,你也可以在以下链接下载 VS Code:code.visualstudio.com/download

使用 Docker 安装 Hyperledger Fabric 1.3

有许多下载 Hyperledger Fabric 平台的方法;Docker 是最常用的方法。你可以使用官方仓库。如果你使用的是 Windows,你将需要使用 Docker Quickstart 终端来运行接下来的终端命令。

如果你在 Windows 上使用 Docker,请按照以下说明操作:

  1. 请参阅 Docker 文档以了解共享驱动器,文档地址为docs.docker.com/docker-for-windows/#shared-drives,并在其中一个共享驱动器下使用一个位置。

  2. 创建一个目录,从 Hyperledger GitHub 仓库克隆示例文件,并运行以下命令:

$ git clone -b master https://github.com/hyperledger/fabric-samples.git
  • 1
  1. 要在本地机器上下载并安装 Hyperledger Fabric,你必须通过运行以下命令下载平台特定的二进制文件:
$ curl -sSl https://goo.gl/6wtTN5 | bash -s 1.1.0
  • 1

完整的安装指南可以在 Hyperledger 网站找到:hyperledger-fabric.readthedocs.io/en/release-1.3/install.html

将 Hyperledger Fabric 1.3 部署到 Kubernetes 环境

这一步骤建议给那些具有 Kubernetes、云环境和网络工作经验和技能,并且希望深入探索 Hyperledger Fabric 1.3 的人士。

Kubernetes 是一个容器编排平台,可在主要云服务提供商(如亚马逊网络服务、谷歌云平台、IBM 和 Azure)上使用。IBM 的杰出云架构师之一 Marcelo Feitoza Parisi 在 GitHub 上创建并发布了一份关于如何在 Kubernetes 上设置 Hyperledger Fabric 生产环境的指南。

该指南可在 github.com/feitnomore/hyperledger-fabric-kubernetes 上找到。

特别感谢 Marcelo!

摘要

在这一章中,我们通过 Composer Playground 探索了 Hyperledger Composer 的在线云部署。通过使用在线网络编辑器,我们看到了如何创建网络定义、运行网络测试,并访问历史记录,我们能够可视化所有在区块链网络上运行的交易。

我们还运行了本地开发环境的安装,并为您提供了一个资源,用于在 Kubernetes 上运行的生产级 Hyperledger 设置。

在下一章中,我们将探讨现代食品链中的主要参与者及其当前的挑战。然后我们将讨论物联网和区块链技术如何帮助解决这些挑战。

进一步阅读

第五章:解决食品安全 - 基于区块链的解决方案

在本章中,我们将探讨食品链的主要挑战,并通过查看以下内容了解涉及的各方:

  • 当前流程和问题

  • 产品追踪的重要性

  • 政府和监管机构的问题和关切

我们还将看到物联网和区块链如何成为解决这些问题的关键技术,以及审查正在制定的认证和法规,以确保整个食品链符合食品安全政策的要求。

现代食品链中的法规、挑战和关切

你能想象在几小时内从银行获得信用证书,并在几分钟内与供应商共享吗?你能想象在没有繁文缛节和完全安全的情况下,接收海关部门有关货物状态的更新吗?

是的,这一切都是可能的,事实证明,使用物联网和区块链技术收集的信息(产品状态更新、信用批准书等)非常重要。然而,区块链技术带来的好处远远不止我们刚提到的这些。

在探讨这些额外好处之前,让我们看看这个行业面临的一些挑战以及旨在尝试实施食品安全的法规。

关于食品安全的挑战

疾病控制与预防中心(CDC)估计,每年有 4800 万人患上食源性疾病,有 128,000 人住院治疗,还有 3000 人死亡。

在美国的 2006 年,发现了菠菜中的大肠杆菌。结果,整个国家所有商店都停止销售菠菜。追踪到源头花了两周的时间:来自一个供应商的 1 批次的 1 天货物。与此同时,至少有 199 人生病,3 人死亡。

更近些年,在 2017 年 3 月,巴西爆发了一起涉及该国最大肉类加工企业的重大丑闻。在巴西联邦警察开展的名为“Carne Fraca”的行动中,这些企业被指控篡改肉类并将其销售到本地和国外。由于难以获取必要数据以提供答案,这些公司花了几周时间才回应这些指控。

食品安全法规 - ISO 22000

由于全球化的结果,许多种类的食品来自不同国家并流通。不安全食品可能带来许多严重后果。这使得有必要制定国际标准,以确保食品安全并确保食品链有序。

ISO 拥有一项食品安全管理认证,可以帮助防止这种后果。 ISO 22000 的目的是制定确保所有食品获得认证的要求,并保证产品安全。它规划了组织所需的内容,并确保食品符合要求并对消费者安全。它可以被任何类型的组织使用,无论其在食品链中的位置或其规模如何。

改善整个食品链有多种原因。尽管已采取了多项行动以获得更高标准的产品,更好的储存和更高的生产,但近年来几乎没有真正解决这些问题并符合 ISO 22000 等法规的行动。

在实现这一复杂链条的有效性方面面临着巨大挑战,但我们相信物联网和区块链技术的结合将减轻许多这些挑战,并有效地解决这一复杂食品链的问题。

区块链和物联网如何在食品链中发挥作用

要实现生态系统的透明度,我们需要连接其中的所有实体。这不仅适用于零售商或制造商,而且适用于系统内的每个人; 每个组成它的成员,从农场到餐桌,包括这条链的最后一个成员,消费者。

如今,有许多公司正在采用物联网和区块链技术。他们已经意识到食品链中存在各种问题,但每个参与方都专注于他们的业务结果,而不是整个链条困扰的问题。

任何可以部分解决此问题的解决方案都将为整个食品链提供价值。但是,它仍然不能解决所有涉​​及方的每个问题。

要实施有效的解决方案,让我们根据市场细分来审查一组需求。需求可以根据许多方面而变化,例如公司规模,地理位置等等。我们的目标是确保每个人都看到采用物联网和区块链技术的价值,从而对参与此类链及其利益感兴趣。这将帮助我们获得完整的数据集,以提供食品生态系统的端到端透明度。

食品生态系统

在本节中,我们将探讨食品链中涉及的参与者,并查看他们的活动以及应用于流程的每个部分的法规。我们将更详细地研究以下参与者:

  • 农民

  • 食品制造商

  • 仓储和配送中心

  • 运输公司(运输公司)

  • 食品零售商和超市

  • 消费者

  • 监管机构

  • 认证和合规性

以下图表展示了这一复杂食品链中的所有参与者。本章节的主要目的是确定如何利用物联网和区块链共同增加对所分享信息真实性的信心,减少人为错误,并使用不可变数据确保来源:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

高级食品链工艺

从技术角度来看,物联网是解决方案的锦上添花。如今,有很多资产跟踪传感器可以通过蓝牙、超宽带(UWB)、Wi-Fi、LPWA、LTE、NB-IoT、5G、卫星、红外线、超声波、NFC 和 RFID 连接和传输数据。这种多重连接的组合允许提供即时资产跟踪信息。

现在你可以通过物联网访问数据,考虑将这些信息存储在区块链网络中。让我们重新审视一下区块链的概念。首先,我们可以说区块链为我们提供了之前没有的可靠流程所需的信任。但现在,有了区块链技术,我们能够在许多生态系统中分享多种类型的信息。

它还提供足够的信任,使我们能够真正解决之前提到的问题,从而更好地为客户服务。除此之外,通过创建这种重要的信任,区块链允许我们使用我们已经投资的资产。这些资产由我们数十年来积累的数据和新类型的分析代表:认知、机器学习、预测、大数据等诸多类似的分析。此外,我们可以说区块链代表了将这一切整合在一起的遗失的拼图。

我们的区块链解决方案需要实现一些重要的事情,包括:

  • 提供食品行业需求的透明度

  • 创建可靠的连接,这样食品生态系统中的每个人都可以参与

  • 提高互操作性,使行业能够推动可用性和访问性

  • 牲畜和谷物监测

  • 辨别牲畜的位置

  • 温室监测(温度和灌溉)

本章后面,我们将了解如何实现所有这些。

食品生态系统中的机遇和挑战

让我们探索这个生态系统的每个组成部分,并确定随之而来的机遇和挑战。

农民

技术和农业相互配合,并可能具有颠覆性。农民擅长采用新技术,特别是当新技术有助于提高生产效率和提供更高的农业运营效率时。这些改进是采用新技术的动机,原因非常简单:粮食和农业组织(FAO)预测到 2050 年地球上将有 96 亿人口,食品生产将必须增加 70%。

农业企业是农业生产的商业。它专注于用于农业的产品的加工、仓储、分销、营销和零售。农业企业推广了物联网解决方案,并将这项技术推上了一个不同的层次。

如今,这个领域有很多大公司,如陶氏农业科学公司、杜邦、孟山都和先正达;AB 农业(英联食品旗下的一部分);ADM;约翰迪尔;洋蔓; 和普瑞那农场。在当今全球化的世界中,要获得市场份额并达成好交易越来越困难。

农民面临的压力比以往任何时候都更大。因此,他们需要关注以下主题:

  • 跟踪生产批次

  • 制定生产仓储战略

  • 获取商品市场信息

  • 更快地识别特定的害虫

  • 保证一个良好的环境、例行程序和屠宰场,以确保所有动物得到良好的照顾和准备

这些是农民面临的主要挑战。他们依赖传感器;用于测量温度、时间和收获面积的数据收集器;更快的收割机器;GPS;支持决策的预测模型;以及区块链,以保证信息以精确透明的方式存储。

食品制造商

食品制造商在这个链条中扮演着重要的角色;他们是这个过程的核心。因为他们参与了从流程的开始(从动物的早期到动物被屠宰)到结束(动物被宰杀)的整个过程,他们也参与了肉类准备和消费者食品产品的包装过程。这里是这样一个工厂操作的一瞥:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们经常听说与食品制造商相关的常见问题,特别是与鸡、奶牛和猪等动物有关的问题。这些问题往往与动物屠宰作业有关,这是食品制造业事故最多的领域。此外,食品链及其中进行的各项流程需要通过多个安全关卡,如温度分析、目测批准、包装机器、存储和运输。

在这个复杂的市场中,没有生产商愿意其产品与可能影响客户印象的事故相关联.这个链条中有许多参与者,他们可以直接影响客户的感知。食品制造商面临的挑战如下:

  • 进一步自动化食品处理,减少或完全消除人工接触,并确保过程中高卫生标准

  • 赢得供应商忠诚度,并保证高质量水平

  • 有效地控制库存和货物的发货

  • 有关存储位置和执行操作的数据

  • 如何注册箱子、托盘等

该行业已意识到,物联网与区块链技术可以成为保证透明度、可追溯性、问题快速解决以及达成共识的强大盟友,不仅在内部部门,还与外部合作伙伴和关联方。

监管者

对于监管部门的食品制造业来说,物联网和区块链可以提供更多数据透明度,对数据分析的快速响应以及其他改进,例如食品起源认证:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2018 年 7 月,英格兰、威尔士和北爱尔兰跨境工作的独立政府部门食品标准局(FSA)成功完成了一项区块链试点。

FSA 信息管理负责人 Sian Thomas 如下所述:

*“这是一个非常令人兴奋的进展。我们认为区块链技术可能为食品行业的某个部分(如需要大量检查和整理结果的屠宰场)增加真正的价值。 *我们的方法是与行业一起制定数据标准,使理论变为现实,我很高兴我们能够证明区块链确实在食品行业的这一部分起作用。我认为现在行业和政府有很大的机会共同合作,扩大和发展这种方法。”

政府的角色是监管。很明显,与政府一起在这一领域活动的其他组织现在也面临着清理检查的困难。尽管有多种控制机制,如视觉分析和需要由生产者获取的实验室数据,但检查仍然容易受到腐败影响,对起源控制没有完整信息。

然而,显而易见,链条很长,快速和客观地找到任何偏差的实际负责方并不是一件容易的事情。此外,这种活动中始终存在的腐败也影响整个链条。

根据这些信息,我们可以得出以下结论,该链接中需要解决以下挑战:

  • 确保产品配方遵循为该产品规定的规则

  • 确保信息可靠且可审计

让我们继续下一个链接:运输公司。

运输公司

当我们谈论食品运输时,我们应首先谈论易腐产品。它们的处理需要对温度和交货时间等因素进行特别控制。运输易腐货物还需要特别许可证。货物在目的地和出发地的特别产品检查以及打包和拆包都需要控制和追踪。

如今,运输公司拥有一系列技术,可帮助解决产品的控制和追踪问题。配送中心和仓库可以通过扫描仪、条形码甚至使用机器人来控制托盘的到达和发货。

另外一些重要的促进因素是分析解决方案和自动化发票,用于追踪商品的订购地点、供货地点、发货地点、送达地点以及到货日期。例如,图像识别可以帮助注册具有相似部分的物品。

毫无疑问,物联网传感器是这些新技术的强大框架。这些传感器可以跟踪温度、湿度和易腐货物及其他商品的容器被篡改情况。一旦违反任何给定条件,设备立即向供应链经理发出自动警报,以便立即采取行动解决食品安全问题。

正是在这一点上,区块链技术可以在跟踪和注册产品方面提供极大的帮助,并通过单一可追踪的共享分类账为所有各方之间带来信任和共识。

商店和超市

当产品出现问题时,这些链条中的行为主体是第一个收到反馈的。他们(商店和超市)也经常因商品问题受到责备,因为他们有时负责存储、运输和产品处理。这些问题可能发生在商店内部或在向其他商店分销过程中。

超市和商店的运营与食品工厂的运营一样复杂。它们都有强大的处理操作和储存责任。食品腐坏的问题并不罕见,所以问题是:“这个产品已经腐烂了还是在这里腐烂了?”

通常,每个产品所有者都有自己的质量控制流程,这使事情变得更加困难。当事故发生时,各方提供证据证明他们免责,但这些证据通常与他们的内部流程有关。将产品转交给另一方时的过程未得到解决。

此外,我们还有产品分发给更大的商店,这里也会出现相同的处理问题。但是,这类问题也可能发生在商店内部。

这给超市带来了当前面临的挑战:

  • 管理和控制产品的收发

  • 有效地控制库存和商店之间货物的发货

  • 收集产品的物理位置和存储数据

  • 将产品解包并运送到货架上

  • 控制和注意产品的到期日期

大多数大中型超市已经拥有自己的电子商务网络。这导致技术和软件在他们的日常工作中进一步被采用。作为这些公司使用的技术示例,我们可以提到库存控制,大规模使用物联网来控制箱子和托盘,使用 QR 码,集成数据系统来处理库存和销售,预测模型,跟踪客户忠诚度等。这向我们展示了在这一领域技术的日益增长的使用。

客户

在竞争激烈的市场中,客户是主角。他们将决定市场上最好的产品是什么。除了看产品本身外,他们还会决定购买产品的最佳地点和最佳制造商。

今天,除了提供出色的包装外,商店还必须有完美的布局,并提供易于阅读的产品和商品描述。产品的来源信息,是否符合所需标准以及是否具有必要的认证也对客户至关重要。在选择产品时,一些区别因素包括能够轻松获取所有这些信息,阅读 QR 码以及能够使用增强现实解决方案听取产品详情。

一对未来学家在七月美国商会活动上表示,在购买产品之前,消费者更加挑剔,有更多机会与产品互动,并更了解食物对身体的影响。您可以在此处了解更多信息:www.fooddive.com/news/what-will-grocery-shopping-look-like-in-the-future/447503/.

这一链条内的挑战并不容易克服。问题可能带来的影响远不止财务损失;它们可能导致客户健康问题,甚至死亡。

技术可以是解决这些问题的伟大盟友。可以肯定的是,当我们谈论物联网和区块链时,这种组合可以通过在共享流程链中的成员之间带来透明度,使其能够更有效地控制数据,增加安全性,使流程自动化和动态化,消除中间商,并使链条更少复杂地革命化这个领域。

我们还可以看到,整个链条中的所有成员都面临着巨大的挑战,而物联网和区块链技术的使用可以带来积极的结果。对于客户来说,更好的产品定位或品牌资产可能会导致他们在选择上更具权力,并意识到他们正在消费什么。

食品链是物联网和区块链技术的一个好的使用案例吗?

让我们回顾一下在第三章中提到的重要内容,解释区块链技术并使用 Hyperledger 进行工作。以下是一些可用于确定区块链良好使用案例的几个问题:

  1. 是否存在业务网络?

是的——生产商、制造商、运输公司和零售店。

  1. 是否需要验证或共识的交易?

是的——记录谁拥有什么,以及资产在供应链中的何时何地。

  1. 审计跟踪重要吗(显示出处)?

是的——客户请求,监管机构要求。

  1. 是否需要跟踪数据更改(数据不可变性和最终性)?

是的——它涉及不同的公司,资产从一方传递给另一方,并且具有不同级别的控制。

因此,我们的食品链示例符合成为区块链合适使用案例的所有相关要求。但是 IoT 在这种情况下如何发挥作用呢?

以多种方式。例如,基于 IoT 的智能农业将使种植者和农民能够减少不必要的浪费,并提高生产力,从利用的化肥量到农用车辆进行收获的次数。通过在问题发生之前检测潜在问题,可以预防食品污染及其后果。

IoT 允许进行实时监控;它不仅检查历史数据,而且由于传感器允许维护工程师几乎实时地注意到设备的变化,还提供成本节约。

摘要

我们已经看到了食品链的复杂性。许多参与者之间存在高度的相互依赖性。我们还观察到,食品行业的链条中存在许多挑战,这会在食品制造过程的任何部分发现问题时给客户带来风险。

此外,我们正在超越工人需要亲自监视我们的食物经过的每一件设备的时代。通过使用互联网设备,维护工程师可以更好地了解设备、库存和人员的情况。

区块链技术可以为所有生态系统参与者提供共享价值的可信连接,包括最终客户。在这个解决方案的核心是食品行业中的 IoT 使用,其中包括传感器、条形码阅读器和 QR 码等技术,而 IoT 与区块链集成不仅可以缓解许多问题,而且可以改变整个行业。

安装在设备上的互联网传感器提供了对维护和食品安全问题的关键见解,包括实时系统生成的警报和通知。维护工程师能够通过智能手机或平板电脑从任何地方访问这些实时数据。用于食品安全的物联网系统的功能包括实时了解食品加工设备的状态,一旦出现任何问题就发送自动警报,并提供解决问题的建议下一步操作。

在下一章中,我们将把食品链的挑战与可以缓解这些挑战的技术联系起来。

进一步阅读

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/864069
推荐阅读
  

闽ICP备14008679号