区块链和物联网解决方案实用指南(二)(1)https://developer.aliyun.com/article/1515721
将业务网络升级为新版本
升级部署的业务网络只需要四个步骤:
- 打开
package.json
文件并更新应用程序的版本号。在我们的情况下,它将更新为0.0.2
,看起来像这样:
{ "engines": { "composer": "⁰.20.4" }, "name": "food-safety-b10407", "version": "0.0.2", ...
- 通过运行
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
- 在 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
- 最后,将网络版本
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:
。
创建解决方案的物联网部分
在定义了整个区块链网络并使一切正常运行之后,我们现在将设置和开发将用于更新盒子和托盘测量值的设备。
为了完成这一点,我们将使用与第二章相同的方法创建一个新的设备,创建您的第一个物联网解决方案,并创建一个应用程序,该应用程序接收测量事件并使用 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
。让我们来看看如何:
- 找到 Factory 1 @food-safety-b10407 名片,选择 Connect now 选项。然后,点击屏幕左上角的测试。
- 在左侧面板中,选择资产 -> 食品箱,并在右上角点击 + 创建新资产:
- 用以下内容填写 JSON 并使用“创建新建”按钮创建资产:
{ "$class": "com.packtpublishing.businessnetwork.foodsafety.FoodBox", "foodBoxIdentifier": "2015", "assetTrackingInformation": [], "measureTrackingInformation": [], "owner": "resource:com.packtpublishing.businessnetwork.foodsafety.FoodFactory#1" }
将资产转移给运输者
使用 Hyperledger Composer Playground 转移食品安全网络的资产,请按照以下步骤进行:
- 在应用程序的右上角,选择“我的业务网络”选项,并作为运输者连接。
- 如果您选择测试,资产 → 食品箱,您将看到没有可用的资产:
- 返回到“工厂”身份,选择资产数据右侧的编辑按钮,并使用以下数据更新 JSON 文件:
{ "$class": "com.packtpublishing.businessnetwork.foodsafety.FoodBox", "foodBoxIdentifier": "1", "assetTrackingInformation": [], "measureTrackingInformation": [], "owner": "resource:com.packtpublishing.businessnetwork.foodsafety.Transporter#2" }
- 保存资产;它将从工厂视图中消失。当您返回到运输者视图时,您会发现运输者现在可以看到该资产。
在运输过程中测量温度
在这一点上,我们将模拟运输过程中的温度测量。
我们在 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 相同的过程进行操作:
- 在左侧面板中,选择 Assets → FoodBoxPallet,然后在右上角点击 + 创建新资产。
- 然后,使用以下数据填充 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" }
- 创建托盘后,像以前一样将托盘和箱子转移到运输车上。 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 不仅与制造业有关;它可以被理解为设计新的制造模式,旨在创造更个性化和引人入胜的体验。 新模式强调拥有数据是成功的关键因素,并且在当前业务模型的交叉点上正在创建新的商业模型。 云计算、物联网、认知计算和区块链是推动这一新模式的一些技术。
区块链和物联网解决方案实用指南(二)(3)https://developer.aliyun.com/article/1515723