旁边放着卷材(生产原料)的Finetool机器。图片:© WZL | Christian May & Semjon Becker
回顾:
第0部分:亚琛工业大学工业IOTA实验室介绍
第1部分:亚琛工业大学机床实验室IOTA工业PoC项目报告01:数据采集和首次交易
德国亚琛工业大学机床实验室(简称WZL)是世界上最大的机械研究所,WZL于今年年初开始研究IOTA的工业用例。该PoC项目的主角是Feintool AG公司生产的XFT 2500 speed型工业精冲机,它被用于批量生产关键安全部件,例如制动钳或皮带。在“状态报告01”中,我们实现了从机器中提取选定的数据,并将提取到的模拟数据转换为数字数据,然后存储到.json格式的文件中,最后上传到IOTA官方的testnet。下面的视频展示了机器以及生产过程。
使用Feintool XFT 2500 speed进行精冲 视频: © WZL | Daniel Trauth
状态报告02的重点
本文展示了我们如何准备机器数据、如何决定将数据包附加到Tangle以及选择了哪些技术堆栈。请查看状态报告01来了解PoC的体系结构。
数据包规范
对于这个PoC,我们只选择了一组可以快速测量的数据,这使我们能够相对高效地完成所有任务包。对于实际的生产场景,肯定有必要详细讨论需要哪些数据以及要使用哪些数据。然而,随着这个PoC的完成,数据的选择只是一个发展决定,而不再是技术障碍。
数据集
本PoC选择的是一些实用性的数据,因此数据包包含了测量得到的过程数据和元数据。元数据包含一个唯一的ID(类型:integer),该ID由工件表面的数字图像处理和生成的散列(正在进行中,尚未稳定)以及根据国际标准确定的材料名称(类型:string)。还有一些其他的元数据,例如产品名称、机器操作员姓名、制造商或客户名称等。此外,还对实际的机器数据进行了测量,包括冲头的最大冲压力(类型:float,单位:kN),这是沿边切割和材料产生的反作用力,以及冲压行程(类型:float,单位:mm)。由于材料性能和板材厚度因材料的波动而不同,因此每次冲压力和冲压行程各不相同。模辊(类型:float,单位:mm)目前是在现有的分析模型的基础上估算的,因为我们还需要对测量技术进行完善。时间戳(类型:unsigned integer))使用的是UNIX时间戳,它代表的是生产时间,而不是上传时间。
原始数据集文件示例
下面代码是最终的数据包格式。它分为三个部分:第一,数据包的公钥和签名散列,其次是Tangle的MAM频道,第三是数据本身。选择的文件格式是JSON。
# Data set
[
{
"pubKey": "-----PUBLIC KEY-----",
"sign": "3fe...930"
},
{
"mamAddr": "9QJ...TMX",
"sidekey": "BTE...FEP",
"root": "ABC...9QW"
},
{
"id": "1c06b4ab6c7d3cdff34a2960",
"material": "X210CrW12",
"punch_force": 2492.5676,
"punch_stroke": 15.2656,
"die_roll": 2.5865,
"timestamp": 1407390451216
}
]
机器到MAM频道的映射在后端进行。这将机器从作为载体介质的IOTA中分离出来。因此,后端包含了一个将机器标识映射到相应MAM频道地址的映射。对于每个机器标识,只存在一个MAM频道。
数据准备
数据准备过程主要与数据签名有关。我们不希望将数据本身存储在Tangle上,也不应该让所有人都拥有自由访问的权限,因此它需要签名。因为我们需要以高效的方式散列大量的数据,所以我们选择了SHA-2-256散列算法。此外,我们决定分别使用RSA和PKCS 1.5作为公钥加密技术,因为它们对签名有提供了强大的支持并且有易于使用的在线验证。
# Sign Data
def sign_data (self,
PrivPublKeys = "YourKeys.json",
DataToBeHashed = "YourData.json",
DataPackageHashed = "YourHashedData.json"
)
经过签名的数据提供了一个签名字符串,稍后可以用实际数据和存储到Tangle中的签名来验证该字符串。因此,我们能够识别损坏的或被篡改的数据。
如何存储数据包
我们决定使用AWS,因为已经有了AWS Lambda的PoW开源实现,这简化了PoC的实现过程。我们的数据存储在DynamoDB中,以便在即将进行的PoC修改中处理每个工件的大量数据。在将来,每个工件应该只在Tangle上生成一个MAM交易,并且数据本身将被存储在Tangle之外。
导入至DynamoDB。图片: © WZL | Felix Mönckemeyer & Semjon Becker
PoW阶段
PoW有三种可行的解决方案,可以直接在机器上执行PoW(使用Thomas Pototschnig(Microengineer)的FPGA),还可以使用位于车间的EDGE服务器(内部部署),或者使用云服务。对于本PoC,我们使用最简单的解决方案--在AWS中计算PoW。在未来的增强中,我们计划将计算转移到机器上,成为生产工具的一个重要组成部分,不使用任何有可能会篡改数据的第三方服务有助于创建一个免信任的环境。
PoW阶段。图片:©WZL | FelixMönckemeyer和Semjon Becker
使用AWS Lambda执行PoW
我们修改了IOTA API来使用curl.lib.js,以便在一个AWS Lambda函数中生成PoW。目前我们正在使用DynamoDB,因为它易于使用并且能在PoC的这个阶段顺利的完成任务。但是,为了并行化和加速PoW并且不会丢失制造订单/历史记录,我们还将在未来版本中结合使用Amazon SQS streams与DynamoDB,这样就可以处理POW的并行计算。在Amazon SQS streams之外,任何数量的AWS Lambda都可以并行读取并执行繁重的工作量。这应该可以使交易量(TPS)达到我们所期望的每秒2-4次。但是,TPS的数量应该可以提升到20左右,因为主要的瓶颈是同步运行的AWS Lambda,更高的TPS可以使我们将PoC应用于运转速度更快的机器上,因此是具有前瞻性的。
并发的消息附件。图片:© WZL | Felix Mönckemeyer & Semjon Becker
将工件数据附加到Tangle
将签名附加到Tangle中非常简单。读取数据流,然后提取索引,索引用于将数据推送到Tangle中,之后,其余部分交由MAM库处理。
// Get the Data out of the SQS
event.Records.forEach((record) => {
data = JSON.parse(event.Records[0].messages[0].body)
})
// Get the index in which position of the MAM stream it should be
// placed
let index = parseInt(data.indx)// Send the transaction via the MAM library and with local PoW
const root = await client.send(JSON.stringify(data), index - 1)
接下来的任务
下一步是提供一个基于web的前端,与tangle/cloud通信,允许我们的客户解密数据。
WZL x GCX x IOTA Web前端前瞻(Twitter链接)。
联系我们
如果你有任何问题或想以任何方式参与该项目,可以通过电子邮件、Twitter等方式联系Daniel或者浏览WZL网站。