区块链和物联网解决方案实用指南(全)

原文: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>"
}

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

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

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

$ npm start
> sample-device@1.0.0 start /sample-device

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

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

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

联系我们

我们非常欢迎读者的反馈意见。

一般反馈:如果您对本书的任何方面有疑问,请在邮件主题中提及书名,并通过电子邮件联系我们,地址为customercare@packtpub.com

勘误表:尽管我们已经尽一切努力确保内容的准确性,但错误是难免的。如果您在本书中发现了错误,我们将不胜感激地接受您的报告。请访问www.packt.com/submit-errata,选择您的书籍,点击勘误提交表单链接,并输入详细信息。

盗版:如果您在互联网上发现我们作品的任何形式的非法副本,请向我们提供位置地址或网站名称,我们将不胜感激。请通过链接copyright@packt.com与我们联系。

如果您有兴趣成为作者:如果您有专业知识,并且有兴趣撰写或为一本书做出贡献,请访问authors.packtpub.com

评论

请留下评论。一旦您阅读并使用了本书,为什么不在购买书籍的网站上留下评论呢?潜在的读者可以通过您的客观意见来做出购买决定,我们在 Packt 可以了解您对我们产品的看法,我们的作者可以看到您对他们书籍的反馈。谢谢!

有关 Packt 的更多信息,请访问packt.com

第一章:了解物联网并在 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. 确保您的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. 现在,创建一个名为application.json的文件,内容如下:
{
  "org": "<your iot org id>",
  "id": "<any application name>",
  "auth-key": "<application authentication key>",
  "auth-token": "<application authentication token>"
}
  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. 可以通过运行npm start命令来测试应用程序:
$ npm start
> sample-application@1.0.0 start /sample-application
> node .
connected

恭喜,您刚刚创建了连接到 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);
});

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

创建一个设备

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

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

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

  1. 注意生成的设备凭据,格式如下:
设备类型 设备 ID 认证方法 认证令牌
  1. 回到您喜欢的 IDE,并创建具有与之前应用相同特性的项目:
npm install ibmiotf --save
  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. 接下来,创建一个名为device.json的文件,内容如下:
{
  "org": "<your iot org id>",
  "type": "DeviceSimulator",
  "id": "DeviceSimulator01",
  "auth-method" : "token",
  "auth-token" : "<device authentication token>"
}
  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. 可以通过运行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. 现在,更新代码,将当前时间戳发送到 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. 再次运行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)}

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

摘要

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

我们还研究了不同类型的网络选项、选择设备类型时的重要考虑因素,以及如何创建一个连接到 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 扩展板
1 Grove 基座 v2
1 Grove 土壤湿度传感器
1 Groove 温度传感器 v1.2
1 Grove 继电器模块
1 Grove 按钮模块
4 Grove 通用 4 脚电缆
1 12V 水电磁阀
1 12V 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);

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

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

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

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

读数数值 湿度百分比
256 25.02%
307 30.00%
302 29.52%
303 29.61%
299 29.22%
298 29.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);

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

使用 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);

延迟一秒后,你将看到 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);
});

当脚本启动时,它们将从 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. 然后,创建辅助函数将传感器读数转换为可用值。以下函数负责从实际设备检索传感器值并将其转换为人类可理解的值:
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. 下一步是创建一个辅助函数来激活电磁阀,等待请求的时间量(secondsToWater变量的值),然后停止激活阀门以停止浇水:
var waterPlant = function(secondsToWater) {
  relayControl.write(1);
  setTimeout(function() {
    pinD2.write(0);
  },secondsToWater * 1000);
  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. 创建一个订阅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);
  }
});

这完成了我们的设备固件的编码,以便它可以执行我们的用户 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. 然后,从 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. 下一步是连接到 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. 每当从订阅接收到事件时,应用程序都会检查设备报告的温度是否更高或土壤湿度是否低于定义的阈值。如果是,则发布带有指定持续时间(以秒为单位)的浇水事件到设备,以激活浇水阀:
  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. 最后,启动 Express 服务器,以便 IBM Cloud SDK for Node.js 容器在 Cloud Foundry 环境中启动并受监控:
var port = process.env.PORT;
app.listen(port, function() {
 console.log("App listening!");
});

要部署应用程序,请打开 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

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

bluemix cf logs <your_application_name> 

该命令将从 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. 让我们创建一个函数来在参与者之间转移资产。我们将使用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. 访问控制列表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. 如下所示,为访问控制的资产定义访问权限:
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. 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. 我们现在准备测试我们的区块链网络。在屏幕顶部点击“测试”选项卡:

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

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

{
   "$class": "org.example.basic.SampleParticipant",
   "participantId": "1",
   "firstName": "Joao",
   "lastName": "Dow"
 }

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

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

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

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

  1. 使用以下代码为参与者 2 创建一个资产:
{
   "$class": "org.example.basic.SampleAsset",
   "assetId": "4010",
   "owner": "resource:org.example.basic.SampleParticipant#2",
   "value": 1000
 }
  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
 }

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

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

现在您已经验证了一个用例,您可以开始制作一个新的概念验证,并向业务网络中的成员展示 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

注意:许多基于 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. 安装库生成器:
npm install -g generator-hyperledger-composer@0.20
  1. 安装 REST 服务器:
npm install -g composer-rest-server@0.20

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

  1. 安装 Yeoman:
npm install -g yo

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

第二步 – 设置 Playground

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

使用以下命令安装 Playground:

npm install -g composer-playground@0.20

现在我们可以运行 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

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

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

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

第四步 – 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. 要在本地机器上下载并安装 Hyperledger Fabric,你必须通过运行以下命令下载平台特定的二进制文件:
$ curl -sSl https://goo.gl/6wtTN5 | bash -s 1.1.0

完整的安装指南可以在 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 与区块链集成不仅可以缓解许多问题,而且可以改变整个行业。

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

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

进一步阅读

第六章:设计解决方案架构

在本章中,我们将审查我们基于物联网和区块链的食品物流网络解决方案的架构,探讨以下主题:

  • 商业方面:我们将审查商业组件和商业方面的主要参与者,以及生产和消费者之间发生的过程。

  • 技术:我们将呈现我们将要设计的技术解决方案的图表。

  • 软件:我们将呈现一个详细描述软件层次和集成的解决方案图表。

我们还将更详细地审查一些涉及到我们基于物联网和区块链的解决方案的概念和架构。

食品业务

现代食品链非常庞大且复杂。有许多参与者参与影响产品的制造和交付,无论是直接还是间接的。

我们将研究这种现代食品生产过程,了解现代链条的挑战,并基于区块链和物联网提出一个新的链条:

在上图中显示的业务流程是现代食品链的简化版本。该链可能比此处所代表的要复杂得多。例如,许多超市都有自己的配送中心。然而,由于我们的主要目标是简化,我们没有代表其他因素,例如港口和海关。

对于我们的用例,我们将试图从制造商交付的时间开始考虑产品。这个产品可以是任何物品,但我们将用鸡腿作为例子。

我们链条中要管理的资产将是一箱装满鸡腿的箱子,我们的另一个资产将是一托盘装满装有鸡腿的箱子。在食品链中,我们将研究以下参与者的流程:制造商、配送中心和零售商。

如前所述,现代食品链中有很多参与者。请记住,我们遵循的是更简化的流程,不一定是实际生活中遵循的流程。我们的目标是理解物联网和区块链如何帮助食品链内的各方和流程。

过程的挑战

我们选择关注的食品链的一部分面临着许多挑战。我们在这里简要列出了它们:

  • 从农民的角度来看的挑战:确保关于原材料的关键信息的文件化,例如产品描述、检验日期、屠宰日期和库存信息

  • 制造商的挑战:确保产品来源和产品的安全交付和接收,将产品与电子产品包装在一起,为监管机构和消费者使用条形码/二维码信息标签,以及将产品聚合成包装

  • 零售商的挑战:检查包装完整性,并通过日期、仓库验证和质量控制,保持产品包装在整个运输线上的可见性

  • 消费者的挑战:对产品的来源以及包装中的信息有信心,快速识别商品,并在必要时从货架上移除可疑产品以及消费

食品工厂的过程

让我们从我们的目标过程开始。在我们的用例中,产品以大块形式到达工厂,在那里将被切割、包装,并放入销售用箱子中。这些产品被储存,并在交付之前装到托盘上。

托盘是用于移动货物的木质、金属或塑料平台,如下图所示:

图

接下来,我们将看到产品在转到下一阶段之前必须注册的重要数据。当产品到达时,捕获并记录以下数据:

  • 库存管理单位(SKU)

  • 动物来源

  • 制造商名称

  • 动物信息

  • 质量控制

  • 淘汰日期

  • 冷冻

  • 技术监督员详细信息

  • 发货日期

  • 温度和运输细节

在注册箱子或托盘时捕获以下细节:

  • SKU

  • 日期

  • 工厂地址

  • 冷冻温度

  • 质量记录

  • 托盘代码

现在让我们检查链条中下一环节的过程。

配送中心的过程

产品在被切割、包装和运送后,到达配送中心,被接收并检查以供存储。根据过程的不同,产品可能会放在更适合运输的更大托盘上,可以通过火车或卡车运输:

图

为了避免产品出现任何问题,配送中心会审核工厂发送的数据。如果有任何额外的移动,如托盘转移,需要将新的信息添加到包装中:

  • 对于产品,如下:

    • 收货日期

    • 托盘编号

    • 收到的温度

    • 存储温度

    • 运输公司

    • 质量封条

  • 对于托盘,如下:

    • 目的地代码

    • 托盘代码

    • 日期

    • 发货温度

    • 运输公司

检查后,产品被发送给零售商。

超市和商店的过程

商店将会接收产品并检查商品是否符合要求。如果符合,托盘被拆卸并箱子被打开。这结束了我们对资产的监控:

图

必须在这个阶段注册以下重要数据,产品才能到达消费者:

  • 收货日期

  • 托盘编号

  • 收到的温度

  • 存储温度

  • 运输公司

  • 质量封条

现在轮到商店负责给产品贴标签了,之后可能会直接放到货架上,也可能不会。

技术方法

现在我们对我们的流程和潜在问题有了更好的理解,让我们看看技术如何对我们有用。以下是标准区块链 Hyperledger Fabric 架构的表示:

图片

前述图表向我们展示了三个重要层次:前端应用程序(左侧)、API/SDK(中心)、以及 Hyperledger Fabric 和物联网平台(右侧)。

让我们更详细地审查每一层。

前端应用程序

此层负责数据输入,可以是来自 SAP、Salesforce 或 Siebel 的数据包,也可以是自定义应用程序。它还可以与物联网设备交互,收集数据并在区块链分类帐中注册。开发前端应用程序的现代架构包括以下层次:

图片

好的,我知道每一层都有很多其他工具,而不仅仅是这里介绍的,但我只是用我更熟悉的那些。

这种前端架构允许我们将服务从单一界面中分离出来。通过这样做,我们可以将用户体验UX)扩展到多个平台,而无需重建整个应用程序。

基于物联网的资产追踪

物联网在食品链中发挥着重要作用。物联网设备可以跟踪资产,有大量可用的模型可以做到这一点。有用于测量温度的传感器,位置可以使用 GPS、信标、SigFox、Wi-Fi、4G 和 Sub1Ghz 来确定。这些设备和网络可以被农场、工厂、运输公司、分销中心和零售店使用,覆盖食品链中的所有参与者。

食品链中的主要挑战是运输。许多食品需要特殊关照,温度是最重要的关注点之一。由于许多食品易腐,温度控制对于防止污染和损坏至关重要。

让我们看看如何利用物联网设备来缓解这一挑战。 粒子电子资产追踪器(如下图所示)可用于收集温度和环境数据,并识别 GPS 位置和蜂窝三角测量等信息:

图片

此追踪器允许我们连接到 u-blox M8 GNSS GPS 接收器和 Adafruit LIS3DH 三轴加速度计。我们也可以连接 Grove 传感器。

让我们看看这种物联网解决方案的高层架构:

图片

此图表向我们展示了解决方案的一些重要组件。让我们看看它们是什么:

  • 消息队列遥测传输(MQTT):这是一种基于发布-订阅的消息传输协议,通过 TCP 工作。它专为需要小代码占用空间或网络带宽有限的远程连接设计。发布-订阅消息传输模式需要一个消息代理。

  • Node-RED:Node-RED 是一种用于在易于使用的流程编辑器中简单地连接硬件设备、API 和在线服务的编程工具。

  • IBM Cloud:这是一套面向企业的云计算服务。

  • Bosch IoT Rollouts: 这是 Bosch IoT Suite 中的一个云服务,可以让用户管理边缘设备、控制器和网关的软件更新的推出。

那么,这些组件如何组合在一起以帮助食品供应链中的各种流程?以下是:

  • Node-RED 控制面板仪表板使我们能够选择资产跟踪器,并检查位置、数据、设备状态和其他信息

  • 资产跟踪设备可以通过蜂窝网络进行激活或更新

  • 地理位置数据可以定期传输,并且可以在 Node-RED 中的仪表板上进行跟踪

  • 资产跟踪设备查询温度数据,然后可能查询位置或速度数据

  • Node-RED 可以将温度、位置和速度数据写入 Hyperledger Fabric

  • Node-RED 仪表板查询 Hyperledger Fabric 以获取各种任务和信息,例如交易历史记录、日期和时间数据和地理传感器数据

API/SDK

SDK 或 API 是一个负责在区块链网络中建立连接的集成层。通常使用 Node.js 开发,并在调用智能合约中起着重要作用。今天,我们可以找到覆盖 Go 和 Java 的 API/SDK 文档,并且 Python 的文档正在制定中。

您可以参考此链接以获取有关如何使用 API/SDK 将您的应用程序与区块链网络集成的更多信息:hyperledger-fabric.readthedocs.io/en/release-1.3/fabric-sdks.html

以下图示显示了一个与通过 API/SDK 与 Hyperledger Fabric 交互的应用程序集成:

Composer JavaScript SDK 源自 Node.js,允许开发人员将您的应用程序与他们的业务网络集成。

有两个 npm 模块:

  • composer-client:这个模块通常作为应用程序的本地依赖项安装。它提供了业务应用程序用来连接业务网络以访问资产和参与者并提交交易的 API。在生产中,这是需要作为应用程序的直接依赖项添加的唯一模块。

  • composer-admin:此模块通常作为管理应用程序的本地依赖项安装。此 API 允许创建和部署业务网络定义。

现在让我们继续到我们解决方案的最后一层。

Hyperledger Composer – 高级概览

Hyperledger Composer 是创建您的区块链网络的简单方法,与 Hyperledger Composer 架构站点提供的全栈工作解决方案集成在一起。

从高层次来看,Hyperledger Composer 由以下组件组成:

  • 执行运行时

  • JavaScript SDK

  • 命令行界面CLI

  • REST 服务器

  • LoopBack 连接器

  • 游乐场 Web 用户界面

  • Yeoman 代码生成器

  • VS Code 和 Atom 编辑器插件

在本书范围之外详细审查这些内容将超出范围。您可以访问此链接简要探索这些组件:hyperledger.github.io/composer/latest/introduction/solution-architecture

软件组件

现在我们将从架构师的角度查看我们解决方案的软件组件。这是一个熟悉所有组件并更好地了解它们如何集成的好方法。

首先,让我们探索一下最重要的组件之一:身份验证过程。

我们如何确保区块链的每个成员在我们的前端应用程序中具有正确的访问权限?在回答这个问题之后,我们将深入研究 Hyperledger Composer 的最重要的组件:建模语言和事务处理器函数。

Composer REST 服务器

要验证客户端,我们将需要设置一个 REST 服务器。在这个选项可用之后,客户端在被允许调用 REST API 之前应该被验证。

REST 服务器使用一个名为 PASSPORT 的开源软件,这是一个用于 Node.js 的身份验证中间件。它灵活且模块化,支持通过用户名和密码、Facebook、Twitter、Google 和轻量级目录访问协议LDAP)等方式进行身份验证。在第七章中,创建您的区块链和物联网解决方案,我们将有关于此的更多细节。现在,让我们回顾一下这些组件将如何工作。

在下图中,我们可以看到使用 Composer REST 服务器的高级认证架构:

下图描述了以下组件:一个前端应用程序、一个 Composer REST 服务器、LDAP 和 Cloudant,一个 NoSQL 数据库。

如果您正在进行测试或需要快速创建概念验证,我强烈建议使用 Facebook、Google 或 Twitter 进行身份验证。这比其他方法更容易更快。

要使用先前的方法将 Composer REST 服务器用作自定义实现,我们需要进行一些自定义。执行以下步骤:

  1. composer-rest-server安装中有一行需要在该行之前执行的:
apk del make gcc g++ python git

在使用此方法之前,请确保您有一个干净的环境,清理所有先前的安装。

  1. 要自定义我们的 composer REST 服务器 Dockerfile,在 RUN 语句中添加以下命令:
su -c "npm install -g passport-ldapauth" - composer && \
  1. 创建以下环境变量:
export COMPOSER_CARD=admin@interbancario
export COMPOSER_NAMESPACES=require
export COMPOSER_AUTHENTICATION=true
export COMPOSER_MULTIUSER=true
  1. 如果你检查 API 调用并收到 404,意味着你未登录:
export COMPOSER_PROVIDERS='{
    "ldap": {
    "provider": "ldap",
    "authScheme": "ldap",
    "module": "passport-ldapauth",
    "authPath": "/auth/ldap",
    "successRedirect": “<redirection URL. will be overwritten by the property 'json: true'>”,
 "failureRedirect": "/?success=false",
 "session": true,
    "json": true,
    "LdapAttributeForLogin": “< CHANGE TO LOGIN ATTRIBUTE >",
    "LdapAttributeForUsername": "<CHANGE TO USERNAME ATTRIBUTE>",
      "server": {
      "url": “<URL DO LDAP>",
      "bindDN": “<DISTINGUISHED USER NAME FOR A SEARCH>",
      "bindCredentials": “<USER PASSWORD FOR A SEARCH>", 
      "searchBase": “<PATH WITH USERS LIST WILL BE STORED>",
      "searchFilter": "(uid={{username}})"
    }
  }
}'
  1. 检查我们的钱包中是否有 API:
TestValideteLastProcess:A Transaction named TestValideteLastProcess
UpdateOpportunityStatus: A Transaction named UpdateOpportunityStatus
Wallet:Business network cards for the authenticated user

为了更好地理解过程认证,让我们探索这个执行流程:

每个composer-rest-server的 API 调用必须包含access_token,这是由身份验证带回的。有关更多信息,请参阅hyperledger.github.io/composer/v0.16/integrating/enabling-rest-authentication

使用 curl 的一些例子包括:

curl -v http://localhost:3000/api/system/ping?access_token=xxxxx

这是另一个例子:

curl -v -H 'X-Access-Token: xxxxx' http://localhost:3000/api/system/ping
  1. 这是设置你的composer-rest-server的最后一步:使用 Cloudant 创建一个名片。

创建具有以下属性的成员卡:

  • IDwallet-data/admin@system name

  • 密钥wallet-data/admin@system name

  • {"rev" : "5-1af3gs53gwh...."}

根据以下截图上传附件:

在第七章,创建您的区块链和物联网解决方案中,我们将部署此实现。

Hyperledger Composer 模型

有许多方法来识别区块链用例。让我们记住第三章中描述的一些重要指标,解释区块链技术并使用 Hyperledger 工作

  • 是否涉及业务网络?

  • 如果有,是否有需要验证和审计的交易?

  • 透明度和数据不可变性是否重要?

确定了这些问题的答案后,头脑风暴也是详细解决方案和确定最佳解决方案平台(如 IBM 食品安全)的良好方式,或者开始为用例创建自定义开发。

使用 Hyperledger Composer 建模语言可以很容易地定义将作为交易进行处理并存储在分类账上的资源的结构。

CTO 文件创建了具有三个主要元素的业务网络定义的域模型:

  • 包含文件中所有资源声明的单个命名空间

  • 包含资产、交易、参与者和事件的一组资源定义

  • 可选的导入声明,导入来自其他命名空间的资源

在第七章,创建您的区块链和物联网解决方案中,我们创建了一个业务网络。让我们更详细地探讨我们在代码中使用的代码:

命名空间是资产、事件、参与者和交易的基本定义,如下所示:

// **
  * 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
 }

事务处理函数是通过使用业务网络连接 API 提交事务时由运行时自动调用的:

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

 event SampleEvent {
   --> SampleAsset origin
   --> SampleAsset target
     o Double txTransferAmount
 }

有关 Hyperledger Composer 建模语言的更多信息,请访问以下链接:

Hyperledger Composer 访问控制语言

Hyperledger Composer 有一个访问控制文件(.acl),您可以使用它来编程业务访问控制和网络访问控制。业务访问控制适用于业务网络内的资源,而网络访问控制则是指对管理网络更改的控制。

这是一个授予网络访问控制的例子:

rule networkControlPermission {
  description:  "networkControl can access network commands"
  participant: "org.acme.foodchain.auction.networkControl"
  operation: READ, CREATE, UPDATE
  resource: "org.hyperledger.composer.system.Network"
  action: ALLOW  
}

下面是另一个例子:

rule SampleConditionalRuleWithTransaction {
    description: "Description of the ACL rule"
    participant(m): "org.foodchain..SampleParticipant"
    operation: ALL
    resource(v): "org.example.SampleAsset"
    transaction(tx): "org.example.SampleTransaction"
    condition: (v.owner.getIdentifier() == m.getIdentifier())
    action: ALLOW
}

您可以通过访问以下链接了解有关 Hyperledger Composer 访问控制语言的更多信息:hyperledger.github.io/composer/v0.16/reference/acl_language.html

Hyperledger Composer 事务处理函数

Hyperledger Composer 业务网络定义由一组模型文件和一组脚本组成。脚本可以包含实现业务网络定义模型文件中定义的事务的事务处理函数。

下面是一个带有事务的脚本文件的示例:

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}`);
 }
 }

正如我们所看到的,当使用 BusinessNetworkConnection API 提交事务时,事务处理函数会由运行时自动调用。文档注释内的装饰器用于为函数提供运行时处理所需的元数据,并且每种事务类型都有一个关联的注册表用于存储事务。

摘要

本章描述的架构涉及许多组件,实现可能看起来有点复杂。到目前为止,我们已经确定了物联网和区块链的组合可以缓解多个问题并转变现代食品链的运作方式。例如,这样的实现可以在成员之间带来透明度,使他们更有效地控制数据;增加他们的安全性;使流程自动化和动态化;移除中间人;并且整体上使链条变得不那么复杂。

我们还看到物联网作为设备和传感器的计算和网络功能的延伸工作,使它们能够以最少或没有人类输入的方式进行机器对机器的交互。这些技术组件带来了诸如前所未有的自动化、为供应提供成本削减、节能、增值服务和高效管理等优势。

区块链与物联网的整合会使传感器、条形码和二维码扫描事件以及基于射频识别(RFID)的资产等边缘设备之间的数据交换成为可能。连接传感器的资产将能够记录敏感信息,例如特定仓库的位置和温度,并且这些信息可以自动记录或更新在区块链上。

通过更好地理解架构以及构成其技术组件的要素,我们将能够充分实施用于现代食品链的物联网和区块链解决方案。

在下一章中,我们将看到如何使用物联网创建自己的区块链。

问题

Q. 物联网安全不足如何威胁区块链网络中的数据?

A. 有时,公司在使用物联网时并不关注安全性。也许因为这是一项新技术,他们并不认为会带来立即的风险。事实是,企业正在将不安全的设备引入其网络,然后未能及时更新软件。不应用安全补丁并非新现象,但是带有互联网连接的不安全物联网设备是一场灾难等待发生;想想黑客和分布式拒绝服务(DDoS)攻击。应为物联网设备制定强有力的安全计划,类似于互联网服务的安全计划。强大的设备识别和更新可以帮助减轻大多数问题。

Q. 区块链技术对于这种应用已经足够成熟了吗?

A. 如今,市面上有许多区块链平台供应商。家乐福、沃尔玛等已经是这些平台的成员。因此,这表明大公司已经在区块链平台上经营业务,而这样的平台适用于这类应用。

Q. 使用物联网和区块链实施解决方案有多复杂?

A. 本章描述的大多数技术都是开源的并被许多公司使用。这表明我们讨论的不是什么复杂的东西,而是大多数开发人员可以使用的东西。

Q. 有多复杂的方案能够覆盖整个食物链?

A. 是的,这并不是一项容易的任务。您可以通过验证用例来开始;一个好的用例是至关重要的。此外,检查是否涉及业务网络;记住,物联网也在追踪资产方面发挥着重要作用,并且您应该为资产追踪制定安全计划。

Q. 使用 Hyperledger Fabric 或 Composer 等开源工具是否需要担心?

A. 超级账本是 Linux 基金会的一部分,拥有 250 多家公司作为成员,包括金融、银行、供应链、制造和技术领域的领导者。例如,IBM、思科、美国运通、富士通、英特尔和摩根大通都在使用 Linux 基金会的技术。换句话说,只要在设备上采用标准的安全措施,这些工具就是安全的。

进一步阅读

第七章:创建您的区块链和 IoT 解决方案

在正确理解了上一章节中提出的项目目标后,现在是让解决方案开始运行的时候了。在本章中,我将引导你创建一个使用 Hyperledger Composer 的区块链网络。

在本章中,我们将涵盖以下主题:

  • 创建区块链网络

  • 使用 Hyperledger Composer 定义资产、参与者、交易和访问控制清单

  • 将网络发布到 Hyperledger 环境

我们还将从第二章借用代码,即创建您的第一个 IoT 解决方案,以创建一个将监视货物运输并与区块链网络交互的设备。

技术要求

要访问完整的代码,您需要在您的计算机上安装 Hyperledger Fabric/Composer 环境,包括先决条件,以及能够开发 Node.js 应用程序的 IDE(推荐使用 Visual Studio Code)。

本章列出的代码可在github.com/PacktPublishing/Hands-On-IoT-Solutions-with-Blockchain/tree/master/ch7/hands-on-iot-blockchain.找到

解决方案概述

在这里,我们将处理食品工厂到杂货店的产品移动中最重要的部分之一。

下图显示了应针对每个给定阶段实施的解决方案:

让我们详细看看前述的图表。我们将从四个参与者开始:

  • 工厂: 这是食品安全解决方案的起点。它负责从农场收集原材料,并创建一个发送到仓库的货箱。此参与者被允许的操作是添加新的货箱和将货箱转移至运输者。

  • 运输者: 这是负责在受控温度下从工厂到仓库,以及从仓库到杂货店进行运输的公司。运输者定义的操作包括向其控制的资产添加温度测量数据,以及将资产转移到仓库或杂货店。

  • 杂货店: 这是一家向消费者出售食品盒的公司。杂货店是这一链条的终点,消费者可以从食品盒中获取信息。杂货店可以检查货物托盘和货箱数据。

  • 消费者: 他们是食品盒的目标受众。消费者对跟踪货箱链条很感兴趣,因此有一个查看货箱信息的映射操作。

我们将使用每个参与者的名片创建一个Composer REST 服务器的实例,因此总共将拥有四个Composer REST 服务器实例。还有盒子和托盘。这些资产的定义如下:

  • 食品盒:代表在工厂生产并在整个链条中处理的产品

  • 托盘:代表一批箱子,这些箱子被组合在一起从仓库送到杂货店

让我们开始我们的区块链网络解决方案。

创建区块链网络

要开发区块链网络,首先需要使用 Yeoman 命令行创建一个业务网络项目,然后命名业务网络:

$ yo hyperledger-composer
Welcome to the Hyperledger Composer project generator
? Please select the type of project: Business Network
You can run this generator using: 'yo hyperledger-composer:businessnetwork'
Welcome to the business network generator
? Business network name: food-safety-b10407
? Description: Hands-on IoT solutions with Blockchain
? Author name: Maximiliano and Enio
? Author email: max.santos@gmail.com
? License: Apache-2.0
? Namespace: com.packtpublishing.businessnetwork.foodsafety
? Do you want to generate an empty template network? Yes: generate an empty template network
   create package.json
   create README.md
   create models/com.packtpublishing.businessnetwork.cto
   create permissions.acl
   create .eslintrc.yml

Yeoman 生成器生成一个基本空结构的 Hyperledger Composer 业务网络的文件夹。

.cto文件包含业务网络的定义:资产、参与者、交易和查询,而.acl文件包含了资产和交易的访问控制列表。

在后续的部分中,我们将编写业务网络定义,所以打开 Visual Studio Code 并打开 Yeoman 创建的文件夹。

要开始开发区块链解决方案,请打开models/com.packtpublishing.businessnetwork.cto文件并开始编码。

概念和枚举

创建常见数据类型的组合,这些类型在资产、参与者和交易中是常见的,可以通过在 Hyperledger Composer 中创建更可读的结构来实现。这些结构是概念枚举

我们将在解决方案中使用以下结构:

// Tracking information when an asset arrives or leaves a location
enum LocationStatus {
 o ARRIVED
 o IN_TRANSIT
 o LEFT
}

// Location Types
enum LocationType {
 o FACTORY
 o WAREHOUSE
 o TRANSPORTER
 o STORE
}

// A measurement sent by the transporter sensor
concept Measurement {
 o DateTime date
 o Double value
}

// Check if it's in the factory, warehouse
concept Location {
 o DateTime date
 o LocationType location
 o String locationIdentifier
 o LocationStatus status
}

接下来,我们将看看如何定义业务网络中的资产。

资产定义

在定义了区块链网络的一般结构后,让我们定义将在其中使用的资产。在我们的解决方案中,将有FoodBoxFoodBoxPallet资产。

以下代码定义了它们:

// Definition of a food box
asset FoodBox identified by foodBoxIdentifier {
 o String foodBoxIdentifier
 o Location[] assetTrackingInformation
 o Measurement[] measureTrackingInformation
 --> FoodSafetyParticipant  owner
}

// Definition of a pallet that groups food boxes
asset FoodBoxPallet identified by foodBoxPalletIdentifier {
 o String foodBoxPalletIdentifier
 --> FoodBox foodBoxInPallet
 o Location[] assetTrackingInformation 
 o Measurement[] measureTrackingInformation
 --> FoodSafetyParticipant  owner
}

参与者

参与者是与区块链网络交互的行为者。每个参与者定义都是业务网络中不同角色的权限在访问控制列表中的定义,如下所示:

abstract participant FoodSafetyParticipant identified by identifier {
 o String identifier
 o String name
}

participant FoodFactory extends FoodSafetyParticipant {
}

participant Warehouse extends FoodSafetyParticipant {
}

participant Transporter extends FoodSafetyParticipant {
}

participant Store extends FoodSafetyParticipant {
}

participant Consumer extends FoodSafetyParticipant {
}

部署和测试用于 Hyperledger 的业务网络

为了测试目的,我们将授予所有参与者对区块链网络的所有资源完全访问权限:

  1. 为了实现这一点,我们将在permissions.acl文件中添加以下行(不删除任何现有规则):
rule Default {
    description: "Allow all participants access to all resources"
    participant: "ANY"
    operation: ALL
    resource: "com.packtpublishing.businessnetwork.foodsafety.**"
    action: ALLOW
}

定义了这条规则后,我们将能够部署和测试账本,而无需任何其他额外的权限。

  1. 在定义了网络后,我们将生成一个业务网络归档.bna文件)并部署到 Hyperledger 环境中。在此之前,请确保您的环境已经正常运行。要创建.bna文件,请转到项目的根目录并运行以下命令:
$ composer archive create -t dir -n .
Creating Business Network Archive
Looking for package.json of Business Network Definition
    Input directory: /hands-on-iot-solutions-with-blockchain/ch7/food-safety-b10407
Found:
     Description: Hands-on IoT solutions with Blockchain
     Name: food-safety-b10407
     Identifier: food-safety-b10407@0.0.1
Written Business Network Definition Archive file to 
     Output file: food-safety-b10407@0.0.1.bna
Command succeeded
  1. 如果你尚未生成PeerAdminCard,现在是时候这样做,并将其与在我们下载了fabric-dev servers的目录中使用createPeerAdminCard.sh脚本导入:
$ ~/fabric-dev-servers/createPeerAdminCard.sh 
Development only script for Hyperledger Fabric control
Running 'createPeerAdminCard.sh'
FABRIC_VERSION is unset, assuming hlfv12
FABRIC_START_TIMEOUT is unset, assuming 15 (seconds)
Using composer-cli at v0.20.4
Successfully created business network card file to 
    Output file: /tmp/PeerAdmin@hlfv1.card
Command succeeded
Successfully imported business network card
    Card file: /tmp/PeerAdmin@hlfv1.card
    Card name: PeerAdmin@hlfv1
Command succeeded
The following Business Network Cards are available:
Connection Profile: hlfv1
┌─────────────────┬───────────┬──────────────────┐
│ Card Name       │ UserId    │ Business Network │
├─────────────────┼───────────┼──────────────────┤
│ PeerAdmin@hlfv1 │ PeerAdmin │                  │
└─────────────────┴───────────┴──────────────────┘

Issue composer card list --card <Card Name> to get details a specific card
Command succeeded
Hyperledger Composer PeerAdmin card has been imported, host of fabric specified as 'localhost'
  1. 当你设置好一切后,将.bna文件安装到环境中,并通过运行以下命令启动网络:
$ composer network install --card PeerAdmin@hlfv1 --archiveFile food-safety-b10407\@0.0.1.bna 
√ Installing business network. This may take a minute...
Successfully installed business network food-safety-b10407, version 0.0.1

Command succeeded
$ composer network start --networkName food-safety-b10407 --networkVersion 0.0.1 --networkAdmin admin --networkAdminEnrollSecret adminpw --card PeerAdmin@hlfv1 --file networkadmin.card
Starting business network food-safety-b10407 at version 0.0.1

Processing these Network Admins: 
userName: admin
√ Starting business network definition. This may take a minute...
Successfully created business network card:
Filename: networkadmin.card

Command succeeded
  1. 最后,导入启动过程生成的网络管理员卡,并 ping 网络以确保它在环境中运行:
$ composer card import --file networkadmin.card
Successfully imported business network card
    Card file: networkadmin.card
    Card name: admin@food-safety-b10407

Command succeeded

$ composer network ping --card admin@food-safety-b10407
The connection to the network was successfully tested: food-safety-b10407
    Business network version: 0.0.1
    Composer runtime version: 0.20.4
    participant: org.hyperledger.composer.system.NetworkAdmin#admin
    identity: org.hyperledger.composer.system.Identity#f48a787ac40102cc7753336f8b15dd20fa3765e7b9049b2aeda4dcc3816d30c1

Command succeeded

在这一点上,我们已经创建了我们网络的第一个版本;生成了用于部署的包(.bna文件);创建了PeerAdminCard;将网络安装到 Hyperledger Fabric 环境;生成了负责管理区块链网络的NetworkAdminCard;并启动了网络。

使用管理员卡,我们将发送ping命令以确保网络已经启动并正常运行。现在,让我们改进我们的网络。

通过区块链中交易操作资产

交易是在 Hyperledger Composer 定义的业务网络中执行的原子操作,运行在 Hyperledger Fabric 环境和定义的业务网络的范围内。

在这里演示的用例中,我们创建的交易将会使用 IoT 设备提供的信息来更新托盘和嵌套的食品箱。

它由两个结构组成。第一个是交易的定义,并在业务网络定义模型(.cto文件)中创建:

transaction updateTransportationData {
  --> FoodBoxPallet pallet
  o Location locationInformation
  o Measurement measurementInformation
}

下一个结构是实现之前定义的交易的函数,并在 JavaScript ES5 兼容的脚本中创建(一个.js文件):

/**
 * Update pallets and boxes with measurements function.
 * @param {com.packtpublishing.businessnetwork.foodsafety.UpdateTransportationData} tx Update pallets and boxes with measurements.
 * @transaction
 */
async function updateTransportationData(tx) {

 // Get transaction parametes
 let newValue = tx.asset;
 let location = tx.locationInformation;
 let measurement = tx.measurementInformation;

 // Update Pallet data with measurements
 if( !newValue.assetTrackingInformation || newValue.assetTrackingInformation == undefined)
 newValue.assetTrackingInformation = [];
 if ( !newValue.measureTrackingInformation || newValue.measureTrackingInformation == undefined)
 newValue.measureTrackingInformation = [];

 newValue.assetTrackingInformation.push(location);
 newValue.measureTrackingInformation.push(measurement);

 // Update Boxes data with measurements
 let foodBox = newValue.foodBoxInPallet;
 if( !foodBox.assetTrackingInformation || foodBox.assetTrackingInformation == undefined)
 foodBox.assetTrackingInformation = [];

 if ( ! foodBox.measureTrackingInformation || foodBox.measureTrackingInformation == undefined)
 foodBox.measureTrackingInformation = [];

 foodBox.assetTrackingInformation.push(location); 
 foodBox.measureTrackingInformation.push(measurement);

// Get the asset registry for both assets.
 let assetRegistryFoodBoxPallet = await getAssetRegistry('com.packtpublishing.businessnetwork.foodsafety.FoodBoxPallet');
 let assetRegistryFoodBox = await getAssetRegistry('com.packtpublishing.businessnetwork.foodsafety.FoodBox');

 // Update the assets in the asset registry.
 await assetRegistryFoodBoxPallet.update(newValue);
 await assetRegistryFoodBox.update(foodBox);
}

生成并导出参与者名片

为了正确使用网络,我们将为每一个类(工厂仓库运输商商店,和消费者)创建一个参与者,生成他们各自的名片,并将它们导入 Composer CLI 钱包:

  1. 首先,我们将创建参与者:
$ composer participant add -c admin@food-safety-b10407 -d '{"$class":"com.packtpublishing.businessnetwork.foodsafety.Consumer","identifier":"5","name":"Consumer"}'
Participant was added to participant registry.

Command succeeded

$ composer participant add -c admin@food-safety-b10407 -d '{"$class":"com.packtpublishing.businessnetwork.foodsafety.Store","identifier":"4","name":"Store"}'
Participant was added to participant registry.

Command succeeded

$ composer participant add -c admin@food-safety-b10407 -d '{"$class":"com.packtpublishing.businessnetwork.foodsafety.Transporter","identifier":"2","name":"Transporter"}'
Participant was added to participant registry.

Command succeeded

$ composer participant add -c admin@food-safety-b10407 -d '{"$class":"com.packtpublishing.businessnetwork.foodsafety.Warehouse","identifier":"3","name":"Warehouse"}'
Participant was added to participant registry.

Command succeeded

$ composer participant add -c admin@food-safety-b10407 -d '{"$class":"com.packtpublishing.businessnetwork.foodsafety.FoodFactory","identifier":"1","name":"Factory"}'
Participant was added to participant registry.
Command succeeded
  1. 然后,我们将发行一个身份并使用以下命令导入它们各自的名片:
composer identity issue -c admin@food-safety-b10407 -f <name of the output file for the card> -u <participant name> -a <participant class# Participant id>
  1. 对每个参与者重复执行此命令:Transporter 1Store 1Warehouse 1Factory 1
$ composer identity issue -c admin@food-safety-b10407 -f consumer.card -u "Consumer" -a "resource:com.packtpublishing.businessnetwork.foodsafety.Consumer#1"
Issue identity and create Network Card for: Consumer

√ Issuing identity. This may take a few seconds...

Successfully created business network card file to 
    Output file: consumer.card Command succeeded

  1. 为每个参与者/生成的名片将每张名片导入 Composer CLI 钱包,并检查所有名片是否已成功导入:
$ composer card import -f consumer.card 
Successfully imported business network card
    Card file: consumer.card
    Card name: Consumer 1@food-safety-b10407

Command succeeded

$ composer card list
The following Business Network Cards are available:
Connection Profile: hlfv1
┌──────────────────────────────────┬───────────────┬────────────────────┐
│ Card Name                        │ UserId        │ Business Network   │
├──────────────────────────────────┼───────────────┼────────────────────┤
│ Factory 1@food-safety-b10407     │ Factory       │ food-safety-b10407 │
├──────────────────────────────────┼───────────────┼────────────────────┤
│ Warehouse 1@food-safety-b10407   │ Warehouse     │ food-safety-b10407 │
├──────────────────────────────────┼───────────────┼────────────────────┤
│ Store 1@food-safety-b10407       │ Store         │ food-safety-b10407 │
├──────────────────────────────────┼───────────────┼────────────────────┤
│ Consumer 1@food-safety-b10407    │ Consumer      │ food-safety-b10407 │
├──────────────────────────────────┼───────────────┼────────────────────┤
│ Transporter 1@food-safety-b10407 │ Transporter   │ food-safety-b10407 │
├──────────────────────────────────┼───────────────┼────────────────────┤
│ admin@food-safety-b10407         │ admin         │ food-safety-b10407 │
├──────────────────────────────────┼───────────────┼────────────────────┤
│ PeerAdmin@hlfv1                  │ PeerAdmin     │                    │
└──────────────────────────────────┴───────────────┴────────────────────┘

Issue composer card list --card <Card Name> to get details a specific card

Command succeeded

定义访问控制列表(ACLs)

为了强制执行网络上的权限,我们将为参与者对资产定义一些访问控制规则,具体规则如下:

  1. 只有工厂可以创建FoodBoxes
rule FoodBoxFactoryCreation {
 description: "Factories can create FoodBoxes"
 participant: "com.packtpublishing.businessnetwork.foodsafety.FoodFactory"
 operation: CREATE
 resource: "com.packtpublishing.businessnetwork.foodsafety.FoodBox"
 action: ALLOW
}
  1. 由于食品工厂也能够看到他们的FoodBoxes并将它们转移到运输商,我们可以使用条件规则来定义这些限制:
rule FoodBoxFactoryUpdateAndRead {
 description: "Factories can update and read owned FoodBoxes"
 participant(p): "com.packtpublishing.businessnetwork.foodsafety.FoodFactory"
 operation: UPDATE, READ
 resource(b): "com.packtpublishing.businessnetwork.foodsafety.FoodBox"
 condition: (p == b.owner)
 action: ALLOW
}
  1. 下一个规则涉及运输商。他们可以读取和更新他们自己的FoodBoxes。我们将对FoodBoxPallets做同样的操作:
rule FoodBoxTransportersUpdateAndRead {
 description: "Transporters can update and read owned FoodBoxes"
 participant(p): "com.packtpublishing.businessnetwork.foodsafety.Transporter"
 operation: UPDATE, READ
 resource(b): "com.packtpublishing.businessnetwork.foodsafety.FoodBox"
 condition: (p  == b.owner )
 action: ALLOW
}

rule FoodBoxPalletTransportersUpdateAndRead {
 description: "ransporters can update and read owned FoodBoxes"
 participant(p): "com.packtpublishing.businessnetwork.foodsafety.Transporter"
 operation: UPDATE, READ
 resource(b): "com.packtpublishing.businessnetwork.foodsafety.FoodBoxPallet"
 condition: (p  == b.owner )
 action: ALLOW
}
  1. 仓库也可以读取和更新他们的FoodBoxes,以及创建,更新和读取FoodBoxPallets
rule FoodBoxPalletWarehouseCreate {
 description: "Warehouses can create FoodBoxPallets"
 participant: "com.packtpublishing.businessnetwork.foodsafety.Warehouse"
 operation: CREATE
 resource: "com.packtpublishing.businessnetwork.foodsafety.FoodBoxPallet"
 action: ALLOW
}

rule FoodBoxWarehouseUpdateAndRead {
 description: "Warehouses can update and read owned FoodBoxes"
 participant(p): "com.packtpublishing.businessnetwork.foodsafety.Warehouse"
 operation: UPDATE, READ
 resource(b): "com.packtpublishing.businessnetwork.foodsafety.FoodBox"
 condition: (p == b.owner )
 action: ALLOW
}

rule FoodBoxPalletWarehouseUpdateAndRead {
 description: "Warehouses can update and read owned FoodBoxes"
 participant(p): "com.packtpublishing.businessnetwork.foodsafety.Warehouse"
 operation: UPDATE, READ
 resource(b): "com.packtpublishing.businessnetwork.foodsafety.FoodBoxPallet"
 condition: (p  == b.owner)
 action: ALLOW
}

  1. 最后,商店可以读取他们拥有的FoodBoxes,而消费者可以读取所有的FoodBoxes
// Store Rules
rule StoreCanReadFoodBoxes {
 description: "Stores can update and read owned FoodBoxes"
 participant(p): "com.packtpublishing.businessnetwork.foodsafety.Store"
 operation: READ
 resource(b): "com.packtpublishing.businessnetwork.foodsafety.FoodBoxPallet"
 condition: (p  == b.owner )
 action: ALLOW
}

// Consumer Rules
rule ConsumersCanReadFoodBoxes {
 description: "Factories can update and read owned FoodBoxes"
 participant: "com.packtpublishing.businessnetwork.foodsafety.Consumer"
 operation: READ
 resource: "com.packtpublishing.businessnetwork.foodsafety.FoodBox"
 action: ALLOW
}

应用了这些规则后,网络可以被测试了。

将业务网络升级为新版本

升级部署的业务网络只需要四个步骤:

  1. 打开package.json文件并更新应用程序的版本号。在我们的情况下,它将更新为0.0.2,看起来像这样:
{
 "engines": {
 "composer": "⁰.20.4"
 },
 "name": "food-safety-b10407",
 "version": "0.0.2",
...
  1. 通过运行composer archive create -t dir -n .命令创建一个新的 BNA 文件:
$ composer archive create -t dir -n .
Creating Business Network Archive

Looking for package.json of Business Network Definition
 Input directory: /projects/hands-on-iot-solutions-with-blockchain/ch7/food-safety-b10407
Found:
 Description: Hands-on IoT solutions with Blockchain
 Name: food-safety-b10407
 Identifier: food-safety-b10407@0.0.2
Written Business Network Definition Archive file to
 Output file: food-safety-b10407@0.0.2.bna

Command succeeded
  1. 在 Hyperledger 环境中安装新的归档文件:
$ composer network install --card PeerAdmin@hlfv1 --archiveFile food-safety-b10407\@0.0.2.bna
√ Installing business network. This may take a minute...
Successfully installed business network food-safety-b10407, version 0.0.2

Command succeeded
  1. 最后,将网络版本upgrade到新版本:
$ composer network upgrade --card PeerAdmin@hlfv1 --networkName food-safety-b10407 --networkVersion 0.0.2
Upgrading business network food-safety-b10407 to version 0.0.2

√ Upgrading business network definition. This may take a minute...

Command succeeded

如果所有命令都成功运行,那么业务网络现在将在新版本上运行,包括在前面的章节中创建的交易和 ACLs。

为每个参与者设置 Composer REST 服务器

作为安装 Hyperledger Composer 开发环境的先决条件的一部分,您还将安装了 Composer REST 服务器。

这个组件是基于 Loopback 框架(loopback.io)的 API 服务器,包括一个loopback-connector-composer用于连接到 Hyperledger Composer 环境,以及一个动态收集资产、参与者和交易模型的脚本。

启动 Composer REST 服务器的最简单方法是运行cli命令并正确填写启动问卷。为了我们的方便,我们将使用以下命令运行它:

composer-rest-server -c "<business card name>" -n never -u true -w true -p <port defined for the participant server> 

为每个参与者打开一个终端窗口,以启动专用的 Composer REST 服务器:

composer-rest-server -c "Factory@food-safety-b10407" -n never -u true -w true -p 3000

composer-rest-server -c "Warehouse@food-safety-b10407" -n never -u true -w true -p 3001

composer-rest-server -c "Store@food-safety-b10407" -n never -u true -w true -p 3002

composer-rest-server -c "Consumer@food-safety-b10407" -n never -u true -w true -p 3003

composer-rest-server -c "Transporter@food-safety-b10407" -n never -u true -w true -p 3004

每个运行实例都与单个用户相关联,这意味着通过监听端口3003的 Composer REST 服务器调用的所有操作都与具有标识符 5**的Consumer相关。例如,如果创建了一个新的Consumer参与者(假设 ID 为 6),那么必须向参与者发放新的名片,并使用新的名片启动另一个 Composer REST 服务器实例。

在大多数情况下,一个商业名片就足以满足整个组织的需求。其他发放名片的规则可以由治理定义,例如每个分支/子公司一个名片,或者每个用户必须有自己的名片。

此时,您的计算机上应该有五个 Composer REST 服务器实例正在运行,每个服务器都可以通过浏览器访问以下地址:http://localhost:<port>

创建解决方案的物联网部分

在定义了整个区块链网络并使一切正常运行之后,我们现在将设置和开发将用于更新盒子和托盘测量值的设备。

为了完成这一点,我们将使用与第二章相同的方法创建一个新的设备,创建您的第一个物联网解决方案,并创建一个应用程序,该应用程序接收测量事件并使用 Composer REST 服务器提供的 API 更新区块链账本。

硬件设置

为了组装这个监控设备,我们将应用一些可能与生产环境相关的假设:

  • 运输车辆有可用的 Wi-Fi 连接,使设备可以连接到互联网

  • 监测设备时间与应用程序时间同步,包括时区

  • 所有的箱子都是同时运输,使用相同的车辆,因此对于托盘上的所有箱子都适用相同的条件和测量标准。

在生产级应用中,必须使用诸如缓存未发布的事件和使用不同的网络提供商(Sigfox,LoRAWan,移动连接等)等技术来处理这些限制/假设,并且实际时间必须与设备位置同步。

此项目中使用的零件如下所示:

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

组件的描述如下表所示。鉴于它们是第二章创建您的第一个物联网解决方案中所使用的子集,您应该对它们很熟悉。

数量 组件
1 英特尔 Edison 模块
1 英特尔 Edison Arduino 扩展板
1 Grove 基本盾牌 v2
1 Grove 温度传感器 v1.2
1 Grove 通用 4 针线缆

在这些假设的前提下,用于此应用程序的设备如下图所示连接。在这里,我们已经将 Grove 温度传感器连接到基本盾牌上的A3连接插孔。

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

这样就完成了监测食品箱运输的设备。

固件开发

下面的代码是从第二章创建您的第一个物联网解决方案中借用的,因为它具有相同的硬件特性和相同的目标。

唯一的修改是在已发布的 JSON 中:在从工厂运输到仓库时,我们必须移除soilMoisture属性,并在从仓库运输到商店时添加箱子 ID,并在添加托盘 ID 时进行运输。

它获取 Grove 传感器的温度并将其发布到 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 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;
};

deviceClient.connect();
deviceClient.on('connect', function(){
    console.log("connected");
    setInterval(function function_name () {
// When transporting from Factory to Warehouse
    deviceClient.publish('status','json','{ "foodBoxId":"1", "temperature":+         getTemperature()}',         2);

// When transporting from Warehouse to Store
// deviceClient.publish('status','json','{ "palletId":"1", "temperature":+ 
// getTemperature()}', 2);

 },300000);
});

应用程序开发

由于我们在本地运行 Hyperledger 环境,因此在此开发的应用程序必须在与 Hyperledger 相同的网络上运行。鉴于我们不是在 IBM Cloud/Bluemix 上运行它,配置将存储在 JSON 文件中,在与应用程序的主.js文件相同的目录中运行。

配置 JSON 文件的内容结构列在这里,并且必须更新为在第二章创建您的第一个物联网解决方案中定义的详细信息。

{
    "org": "<your IoT organization id>",
    "id": "sample-app",
    "auth-key": "<application authentication key>",
    "auth-token": "<application authentication token>"
}

应用程序代码接收设备发布的所有事件,并使用收集的温度更新托盘中的FoodBoxes

// Composer Rest Server definitions
var request = require('request');
var UPDATE_BOX_URL = "http://<composer rest server url>:3004/api/UpdateFoodBoxTransportationData"
var UPDATE_PALLET_URL = "http://<composer rest server url>:3004/api/UpdateTransportationData"

// Watson IoT definitions
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, eventType, format, payload) {
 // update food box
 // updateFoodBox(payload.temperature);
 // update pallet
 // updatePallet(payload.temperature);
 });

以下代码通过 Composer REST 服务器调用区块链网络中定义的交易:

var updateFoodBox = function (temperature) {
   var options = {
      uri: UPDATE_BOX_URL,
      method: 'POST',
      json: {
  "$class": "com.packtpublishing.businessnetwork.foodsafety.UpdateFoodBoxTransportationData",
  "asset": "resource:com.packtpublishing.businessnetwork.foodsafety.FoodBox#<YOUR FOODBOX ID>",
  "locationInformation": {
    "$class": "com.packtpublishing.businessnetwork.foodsafety.Location",
    "date": "2018-12-24T15:08:27.912Z",
    "location": "<LOCATION TYPE>",
    "locationIdentifier": "<LOCATION ID>",
    "status": "<LOCATION STATUS>"
  },
  "measurementInformation": {
    "$class": "com.packtpublishing.businessnetwork.foodsafety.Measurement",
    "date": "2018-12-24T15:08:27.912Z",
    "value": 0
  }
}
    };
}

var updatePallet = function (temperature) {
    var options = {
      uri: UPDATE_BOX_URL,
      method: 'POST',
      json: {
  "$class": "com.packtpublishing.businessnetwork.foodsafety.UpdateTransportationData",
  "asset": "resource:com.packtpublishing.businessnetwork.foodsafety.FoodBoxPallet#<YOUR PALLET ID>",
  "locationInformation": {
    "$class": "com.packtpublishing.businessnetwork.foodsafety.Location",
    "date": "2018-12-24T15:09:02.944Z",
    "location": "<LOCATION TYPE>",
    "locationIdentifier": "<LOCATION ID>",
    "status": "<STATUS>"
  },
  "measurementInformation": {
    "$class": "com.packtpublishing.businessnetwork.foodsafety.Measurement",
    "date": "2018-12-24T15:09:02.944Z",
    "value": 0
  }
}
    };
}

端到端测试

为了测试目的,我们将使用 Hyperledger Composer Playground 进行大部分操作,除了运输者更新。所以,在这一点上,您可以停止之前启动的所有 Composer REST 服务器,除了在传输者参与者上启动的服务器(监听端口 3004)。

如果您在开发环境设置期间安装了 Hyperledger Composer Playground,则您只需运行composer-playground命令,或者使用npm进行安装(npm install -g composer-playground)。

您的默认浏览器将打开 Composer-Playground Web 应用程序,如下截图所示:

Composer playground 登陆页面

你可以看到之前创建的相同参与者。

创建一个食品箱

根据我们授予的权限,工厂可以创建FoodBoxes。让我们来看看如何:

  1. 找到 Factory 1 @food-safety-b10407 名片,选择 Connect now 选项。然后,点击屏幕左上角的测试。

  2. 在左侧面板中,选择资产 -> 食品箱,并在右上角点击 + 创建新资产:

  1. 用以下内容填写 JSON 并使用“创建新建”按钮创建资产:
{
  "$class": "com.packtpublishing.businessnetwork.foodsafety.FoodBox",
  "foodBoxIdentifier": "2015",
  "assetTrackingInformation": [],
  "measureTrackingInformation": [],
  "owner": "resource:com.packtpublishing.businessnetwork.foodsafety.FoodFactory#1"
}

将资产转移给运输者

使用 Hyperledger Composer Playground 转移食品安全网络的资产,请按照以下步骤进行:

  1. 在应用程序的右上角,选择“我的业务网络”选项,并作为运输者连接。

  2. 如果您选择测试,资产 → 食品箱,您将看到没有可用的资产:

  1. 返回到“工厂”身份,选择资产数据右侧的编辑按钮,并使用以下数据更新 JSON 文件:
{
 "$class": "com.packtpublishing.businessnetwork.foodsafety.FoodBox",
 "foodBoxIdentifier": "1",
 "assetTrackingInformation": [],
 "measureTrackingInformation": [],
 "owner": "resource:com.packtpublishing.businessnetwork.foodsafety.Transporter#2"
}
  1. 保存资产;它将从工厂视图中消失。当您返回到运输者视图时,您会发现运输者现在可以看到该资产。

在运输过程中测量温度

在这一点上,我们将模拟运输过程中的温度测量。

我们在 IoT 应用程序代码中创建了以下注释代码,因为我们在不同时间处理传输收集的数据。

首先是当一个FoodBox工厂运到仓库时,这是由updateFoodBox函数实现的,而updatePallet函数旨在处理从仓库到商店的运输:

appClient.on("deviceEvent", function (deviceType, deviceId, eventType, format, payload) {
 // update food box
 // updateFoodBox(payload.temperature);
 // update pallet
 // updatePallet(payload.temperature);
 });

此时,我们正在处理从 工厂仓库 的运输,因此取消注释代码的第 19 行—updateFoodBox(payload.temperature);— 然后更新第 30、34、35 和 36 行,提供正确的数据值。

确保运输车的 Composer REST 服务器正在运行,并且设备代码的第 2 和第 3 行中定义的 URL 指向正确的 Composer REST 服务器主机。

启动设备应用程序。

将资产转移到仓库

当资产转移到运输车时,情况也是如此。转到运输车的资产视图,编辑 JSON 文件,并使用相应的值更改所有者:

"owner": "resource:com.packtpublishing.businessnetwork.foodsafety.Warehouse#3"

创建一个托盘并将箱子添加到其中

要创建托盘,我们需要按照与 FoodBox 相同的过程进行操作:

  1. 在左侧面板中,选择 Assets → FoodBoxPallet,然后在右上角点击 + 创建新资产。

  2. 然后,使用以下数据填充 JSON。确保您在 foodBoxInPallet 字段中使用相同的 FoodBox ID,而在 owner 字段中使用 Warehouse ID (3):

{
 "$class": "org.hyperledger.composer.system.AddAsset",
 "resources": [
 {
 "$class": "com.packtpublishing.businessnetwork.foodsafety.FoodBoxPallet",
 "foodBoxPalletIdentifier": "3485",
 "foodBoxInPallet": "resource:com.packtpublishing.businessnetwork.foodsafety.FoodBox#2473",
 "assetTrackingInformation": [],
 "measureTrackingInformation": [],
 "owner": "resource:com.packtpublishing.businessnetwork.foodsafety.Warehouse#3"
 }
 ],
 "targetRegistry": "resource:org.hyperledger.composer.system.AssetRegistry#com.packtpublishing.businessnetwork.foodsafety.FoodBoxPallet",
 "transactionId": "0dfe3b672a78dd1d6728acd763d125f813ed0ca74450a2596b9cf79f47f054ad",
 "timestamp": "2018-12-24T14:43:34.217Z"
}
  1. 创建托盘后,像以前一样将托盘和箱子转移到运输车上。 JSON 的所有者值应如下所示:
 "owner": "resource:com.packtpublishing.businessnetwork.foodsafety.Transporter#2"

在运输托盘时测量温度

这与 FoodBox 运输的测量规则相同,但您必须注释设备代码的第 19 行并取消注释第 20 行,以及更新第 53、57、58 和 59 行的正确值以适用于您的托盘。

在运输结束时,通过使用托盘的 owner 和以下行将资产转移到仓库中的箱子:

 "owner": "resource:com.packtpublishing.businessnetwork.foodsafety.Store#4"

跟踪食品盒

要跟踪食品盒作为消费者,我们将通过 composer-playground 使用 Hyperledger Composer Historian。

要访问已应用于资产的操作历史记录,请使用 Consumer business card 连接到 Hyperledger 环境,并从游乐场的左侧面板中选择 All Transactions 选项。

我们将能够查看对资产执行的所有交易,从其创建到托盘及其内部箱子到达仓库为止:

Composer 游乐场 - 历史学家

我们还可以通过单击查看记录链接来查看交易详细信息,如下所示:

摘要

在本章中,我们学习了如何使用 Hyperledger Composer 和 Watson IoT 平台创建业务网络。

在开发解决方案的过程中,我们能够使用 Yeoman 创建 Hyperledger Composer 项目;定义共享数据结构;创建资产、参与者交易和访问控制列表;以及创建网络的第一个版本并将其升级为新版本。

我们还能够创建一个设备,负责从工厂到仓库的食品箱的假设运输中读取温度,并且后来,从仓库到商店,将该信息添加到区块链网络的共享账本中的食品箱资产中。

食品箱的消费者还能够追踪与该箱相关的信息,从生产链的最初开始。

尽管 Hyperledger Composer 和 Watson IoT 开发相当简单,但我们所创建的解决方案解决了食品链安全方面的重大问题。

以下章节将向您介绍作者对实际项目中所学到的教训、实践和模式的观点,以及在当前工业 4.0 情景下,物联网和区块链如何成为创造业务模型和解决新挑战的必要工具。

第八章:物联网、区块链和工业 4.0

物联网和区块链并不是推动新经济和制造革命演进的唯一技术集合。工业 4.0 是一个概念,发生在一个新方法、新技术和空前的计算能力的时代,任何拥有互联网接入的人都可以使用。

在本章中,我们将探讨物联网(IoT)、区块链和云计算等关键技术的作用,重点关注这些因素如何推动工业 4.0 的演进。

本章将涵盖以下主题:

  • 云计算在新经济模型中的作用

  • 物联网如何帮助创新产业

  • 区块链作为工业 4.0 的业务平台

工业 4.0

工业 4.0,又称为经济 4.0,是一个新的制造模式的名称,其中连接性、数据收集和处理广泛应用于整个制造链中。

智能工厂与自动化工厂的区别在于,智能工厂不仅仅是自动化的;它们是连接的、可监控的、协作的。

重要的是要知道,工业 4.0 不仅与制造业有关;它可以被理解为设计新的制造模式,旨在创造更个性化和引人入胜的体验。 新模式强调拥有数据是成功的关键因素,并且在当前业务模型的交叉点上正在创建新的商业模型。 云计算、物联网、认知计算和区块链是推动这一新模式的一些技术。

云计算作为创新平台

云计算为创建新业务模型提供了机会,同时提供了重新设计现有业务模型的工具。 云计算为高度技术化和创新化的服务生态系统提供了简单、自助、灵活和低成本的基础设施。 与其说是处理能力,不如说云计算的作用是成为一个创新平台。 让我们深入了解云计算的世界,以了解其与工业 4.0 发展的关系和重要性。

云计算模型

云计算是共享计算资源的概念,包括内存、计算、网络和存储能力,用于运行应用程序。 将计算模型定义为云模型的特征包括自助式资源分配、软件定义的资源和按需付费的货币化。 这些通常以商业化的三种模型呈现:基础设施即服务IaaS)、平台即服务PaaS)和软件即服务SaaS)。 此外,它们可以以公共和私有的部署模式交付:

查看前面图表中的交付模型,可以了解服务消费者应关注的能力有哪些:

  • IaaS 模型中,正如其名称所示,云服务提供商负责维护网络、存储、服务器和虚拟机组件。包括其许可证、备份、更新和升级在内的每一层都是服务承包方的责任。

  • PaaS 提供了另外三个层次:操作系统、中间件和运行时能力,为服务使用者提供更多的基础设施和软件许可证管理抽象;他们只需处理应用程序代码和二进制文件以及其使用的数据。

  • SaaS 将计算提升到更高的抽象级别:服务使用者只需使用订阅的解决方案。

IBM Cloud Public(也称为 Bluemix)提供了此处描述的所有功能。通过其控制台提供 IaaS、PaaS 和 SaaS 解决方案。你可以实例化物理或虚拟机器和应用程序运行时,并订阅服务目录中提供的任何服务,包括 IBM Watson IoT 和 IBM Blockchain 平台。

当这些模型部署在公共网络(如互联网)的多租户环境中时,称为公共云,即一个人和一家公司共享相同的资源的地方。当公司或个人在私有或公共网络的单租户环境中使用其中任何模型时,称为私有云。

云计算对工业 4.0 的重要性

在云计算模型出现之前,IT 部门需要经历漫长、昂贵和困难的过程才能使解决方案对其客户可用。他们必须购买服务器;等待交付;在数据中心中为其提供空间;准备网络和虚拟化;安装操作系统、中间件、数据库和运行时;然后开发应用程序并将其部署到生产环境中。

当云计算在上述场景中发生时,提供相同的计算能力并开始开发应用程序只需几分钟。你只需要支付所使用资源的费用。

在开发创新解决方案时,最小可行产品(MVP)可能不会产生预期结果,导致基础设施、平台软件和附加服务不断变化。如果创建的 MVP 不符合目标用户的需求呢?在第一种情况下,你已经支付了所需的所有资源,因此即使关闭解决方案,你已经花费了资本支出。然而,在第二种情况下(云),你只支付了服务费用,所以只是运营支出。如果解决方案非常合适,人们使用得很多呢?在第一种情况下,你必须遵循更简单(但仍然困难)的路径来提供更多资源,而在云计算中,你可以在需要时随时扩展解决方案资源,而不是一直都需要。

云计算还提供了使用物联网、认知计算、区块链和其他在互联网上创建和提供的最佳服务和技术来测试新服务和创建新应用程序的能力。这些服务是创建新解决方案和商业模式的强大工具,为客户提供不同的体验,无论使用同一服务的人数是 1、10、100 还是 100 万人。

物联网

正如之前所述,数据是工业 4.0 成功的关键因素。收集和分析的数据越多,预测和建议就越有说服力。

物联网不仅是一种自动化框架技术,还是从连接的设备中收集大量数据的绝佳方式。通过结合不同的数据源(机器和机器人传感器、安全摄像头、心率监测器、环境和气象数据),可以定义和分析领域,了解业务背景的当前实际情况,并对其进行更加理性的分析。还可以洞察如何变得更加高效、更加可预测和更加灵活,因为可以实时处理数据的收集,如下图所示:

处理结果也可以成为改变机器和机器人当前运行的动作的触发器,甚至可以在继续处理之前修复正在创建的产品中的缺陷,以执行自我修复任务。

区块链——简化业务链

随着商业模式的发展,它们往往会采用更精益的方法。在这种情况下,精益产业意味着只专注于对产品的目标客户有价值的事物。任何不为产品提供价值的程序、产品的一部分或创建产品的过程都被视为无用的,必须予以删除或更改,以便为端到端解决方案增加更多的价值。以同样的方式,智能商业模式往往只包含为业务模型增加价值和知识的步骤,这意味着在这个领域外包仍然是一件大事。如果不知道如何将端到端服务链整合到业务中,要想变得精益并不容易和廉价。

当外包或分散业务任务对模型至关重要时,区块链会发挥作用,通过提供分散任务的机会来实现。让我们看一下下面的传统汽车销售流程图:

每当客户购买一辆汽车时,经销商的账簿中都会为该汽车创建一个新条目,并向汽车制造商下订单,后者会在其账簿中创建另一个条目,并向其供应商订购零件,这也会在他们的账簿中创建订单条目。区块链通过为过程的所有利益相关者使用共享账簿来简化该过程:

该过程本身现在具有审计性并且最终产品可以被端到端地追踪,使新车主对产品的来源有所了解。

区块链实现了一个既精简又可审计的以产品为驱动的业务流程。

摘要

在这一章中,您了解到了在工业 4.0 背景下关键技术如云计算、物联网和区块链的重要性。

云计算是一种提供低成本、可扩展和自助技术采用的计算模型,创建了一个适合创建创新业务模式的环境。

物联网不仅是一个自动化工具包,还可以被视为数据收集和创建数字化上下文的框架,类似于真实世界的上下文;它创造了一个数字化的现实环境,模拟了与真实世界相同的条件。

区块链通过简化去中心化流程实现了精益生产线,并帮助公司集中精力发挥自身优势,而不必在不为最终产品产生聚合价值的任务上花费时间和金钱。

在下一章中,我们将研究以往项目中获得的最佳实践和经验教训,解决了我们所面临的一些问题以及如何解决这些问题。

第九章:开发区块链和物联网解决方案的最佳实践

正如对每种新兴技术都是如此,成为早期采用者充满了挑战和需要学习的教训。本章的重点是提出一些解决方案,我们可以将其应用于现实项目中,以避免陷入麻烦。

本章将涵盖以下主题:

  • 云应用的参考架构

  • 如何使用 12 因素应用程序开发模型创建云原生应用程序

  • 无服务器计算

  • 使用 Hyperledger Composer 作为应用程序开发的加速器

开发云应用程序

与云应用程序相关的潜在问题很多,从资源的简单误用到无法解决的问题都有。应用简洁的架构并使用 12 因素应用程序开发模式可确保在应用程序扩展或缩减时不会陷入麻烦。

容器是将应用程序与其所有依赖项(包括其代码、运行时、中间件、库和操作系统)打包的标准化方式。Docker 和 Garden 是可以在 IBM 云平台上运行的容器,但也有其他容器类型可供使用,如 Rockt。使用容器增加了应用程序的可移植性,因此宿主操作系统是哪个特定的 Linux 发行版,以及您的应用程序是在不同的发行版上构建的都无关紧要,因为操作系统是容器化应用程序的一层,两个发行版一起交付。

以下图示了容器化应用程序的结构:

云平台使用容器化应用程序并将其部署到一组服务器中。我们可以将这些应用程序移到灵活的计算环境中,以更好地利用现有基础设施,并跟踪服务发现组件中部署的容器。

每个平台都有自己使用容器化应用程序部署模型的方式,如下图所示:

一个容器是基于容器镜像部署的,容器镜像是基本镜像、依赖项和应用程序的只读定义。每个相同应用的容器都是基于该镜像部署的,而在运行时对容器所做的任何更改仅在该容器处于活动状态时存在,并且仅适用于该容器的实例。

参考架构

云计算为部署应用程序创建了一个抽象的环境;我们使用虚拟运行时。这意味着我们没有位置意识,也不能保证我们的应用程序会留在同一个数据中心或虚拟机中。我们甚至不能确信应用程序的 IP 地址在 10 分钟后仍然相同。以下图表显示了使用 IBM Cloud Public(Bluemix)成功应用的云应用程序的参考架构:

云原生应用程序应该水平扩展,这意味着每当工作负载需求增加时,应用程序应该增加该应用程序的实例数量以处理新请求。同样,如果工作负载减少,应该减少应用程序实例的数量。

使用 12 因素应用程序模型进行开发

12 因素应用模型是一组应该遵循的实践,以使云应用程序具有可伸缩性。它为敌对的云环境变化提供支持。

该模型的 12 个原则如下:

  • 代码库:我们的代码库在修订控制中被跟踪,并且被部署多次。

  • 依赖关系:我们应该明确声明和隔离依赖关系。

  • 配置:我们应该将应用程序配置参数存储在环境中。

  • 后端服务:我们应该将后端服务视为附加资源。

  • 构建、发布、运行:我们应该严格区分构建和运行阶段。

  • 进程:我们应该将应用程序作为一个或多个无状态进程执行。

  • 端口绑定:我们应该通过端口绑定导出服务。

  • 并发性:我们应该通过进程模型进行横向扩展。

  • 可处置性:我们应该通过快速启动和优雅关闭来最大程度地提高鲁棒性。

  • 开发/生产对等性:我们应该尽可能地使开发、演示和生产保持相似。

  • 日志:我们应该将日志视为事件流。

  • 管理进程:我们应该将管理和管理任务作为一次性进程运行。

这些原则减少了与云计算相关的简单错误的数量。

您不必将所有这些概念都应用于您开发的所有云原生应用程序。例如,如果您不需要脚本来预加载数据库,则不需要应用管理进程原则。然而,如果您正在使用一个需要保持状态或与不同应用程序共享状态(如会话)的应用程序,那么使用后端服务是必不可少的,因为您永远不知道响应用户请求的容器所在的物理或虚拟计算机主机是什么。

无服务器计算

无服务器计算是部署模型,其中应用程序部署在环境中,但不一定始终运行。它的容器在首次执行时启动,并在请求需要执行它时保持活动。在空闲一段时间后,该应用程序的容器被停止。重要的是要注意,停止的容器需要一段时间才能启动,因此实时响应并不是无服务器应用程序的优势。

无服务器应用程序(或者像许多云服务提供商所称的云函数)是部署并附加到触发器的微服务,该触发器负责启动包含该功能的容器并运行它。触发器可以是数据库更改,传递给代理的消息,HTTP 请求或其他类型的请求。

云提供商通常根据云函数的执行持续时间和资源分配(通常是内存)收费。例如,一个云函数可能需要 500 毫秒,并使用 256MB 的内存。

一个成功的云函数不需要大量计算和大量请求(定期过程)。为了方便构建和部署无服务器应用程序过程,无服务器框架是一个不错的选择,因为它支持谷歌云、AWS、IBM 云和微软 Azure 对无服务器计算的实现。

使用 Hyperledger Composer 进行区块链开发

Hyperledger Composer 是 Linux Foundation 在 Hyperledger 品牌下托管的一个项目。该项目旨在创建一个框架和工具集,加速使用 Hyperledger Fabric 开发区块链应用程序,并简化与其他应用程序的集成。需要牢记的是,任何框架都意图通过抽象部分复杂性来简化解决方案的某个方面,但也会限制对所应用抽象的控制。

Hyperledger Composer 工具包

Hyperledger Composer 并不是解决 Hyperledger Fabric 提出的所有复杂性的通用解决方案。它剥夺了一些可以自定义的任务灵活性。然而,它所做的是提供一个工具包,用于创建链码项目,构建区块链应用程序包(.bna文件)并将它们部署到 Hyperledger Fabric。

使用 Hyperledger Composer 开发业务网络的重点是使用项目结构和通用语言创建资产、参与者、交易、查询和访问控制列表。在创建业务网络定义之后,Composer 有工具可以将应用程序打包并部署到 Hyperledger Fabric 平台。

Hyperledger Composer REST 服务器

为了简化与其他应用程序的集成,Hyperledger Composer 提供了 Composer REST 服务器,这是建立在 LoopBack 框架之上的 API 服务器,连接到定义的业务网络。它检索资产、交易和参与者的信息,并提供了一个 REST API 服务器和一个服务合同,以 swagger 格式描述,以便与业务网络进行交互。

Composer REST 服务器提供了许多有用的功能。最值得一看的是身份验证、多用户模式和数据源配置。

身份验证和多用户模式

当您创建业务应用程序时,请求进行身份验证并不少见。Composer REST 服务器提供了连接到许多身份验证和授权提供程序的手段,使用 Passport 中间件。虽然该项目声称 Passport 有超过 300 种身份验证和授权策略,但我们的经验表明,并非所有这些都能即插即用;有时,您必须创建自定义代码才能使它们正常工作。然而,我们已成功地实现了 Google、GitHub、Auth0 和 LDAP 的身份验证策略。

多用户模式允许多个参与者使用单个 Composer REST 服务器,而不是为每个参与者部署独立的 Composer REST 服务器。在这种模式下,使用主名片检索 API,但与业务网络的交互是使用其自己的名片。此模式需要启用用户身份验证。

数据源配置

Composer REST 服务器使用数据源存储用户会话数据。这并不意味着必须配置显式数据源;如果没有配置数据源,Composer REST 服务器将使用即插即用的内存连接器。

当使用多个 Composer REST 服务器实例以实现高可用性或负载平衡时,这些实例不共享内存,因此需要数据源。可以使用任何具有 loopback 连接器的数据源。在我们的经验中,MongoDB、Cloudant 和 Redis 可以即插即用;只需按照 Hyperledger 提供的步骤安装连接器并配置环境变量即可。

摘要

在本章中,我们已经了解了在云环境中开发和部署应用程序的影响。我们考虑了容器的工作原理,以及如何将容器化的应用程序部署到云平台,以及另一种模型:无服务器计算。我们还介绍了云原生应用程序开发的 12 因素模型原则。

然后,我们将 Hyperledger Composer 视为开发区块链解决方案的加速器。我们探讨了各种功能,包括使用身份验证、多用户模式和数据源配置。

这本书提供了有关使用 IBM Watson IoT 平台和 Hyperledger Compose 创建简单应用程序的信息。这些远非是唯一支持物联网和区块链解决方案的平台和工具,但概念是相同的,可以应用。如果您对使用所解释的工具进行扩展功能感兴趣,无论是 Watson IoT 还是 Hyperledger Fabric / Composer,都提供了详尽的文档以及大量社区提供的文章,但是,我们的观点是实践是了解它们是否适合特定解决方案的最佳方式,因此,即使您想学习如何使用工具包,也只需尝试一下,简单的用例是良好的教师。

进一步阅读

本章介绍的主题是一个概述,如果您需要更深入地了解任何主题,我们建议阅读以下参考资料:

posted @ 2024-05-01 15:27  绝不原创的飞龙  阅读(25)  评论(0编辑  收藏  举报