营收|论如何使用智能合约将物联网数据实现货币化( 四 )


· (iii) MQTT代理:从物联网设备收集数据并根据智能合约颁发的访问令牌对客户进行身份验证的受信任的第三方 。
· (iv) 客户:对使用和支付特定物联网数据感兴趣的公共用户 。
图5展示了一个通用图 , 显示了以太坊环境中系统参与者之间的实体属性和关系 。 如图所示 , 每个IoT设备都与单个所有者、单个MQTT代理相关联 , 并且可以有多个可以订阅多个主题的客户 。 IoT设备可以能够发布客户感兴趣的单个或多个主题 。 所有者可以拥有多个IoT设备 。 此外 , MQTT代理可以处理多个物联网设备 。



2. 逻辑流程和智能合约
在本小节中 , 我们简要说明智能合约的逻辑流程 。 我们的智能合约的完整代码在GitHub上提供了 。 物联网设备的所有者通过 IoTSmartContract 的构造函数创建合约 , 并指定 MQTT 代理的地址以及默认主题的详细信息 。 然后 , 合约注册代理并使用 TopicAdd 记录事件 。 图6 显示了 IoTSmartContract 构造函数的代码 。 msg.sender 和 b 的值分别是所有者和代理的 EA 。



如图 7所示 , 为了访问物联网数据 , 客户首先需要通过应付存款功能向合约进行初始以太币存款 , 该功能记录客户存款的金额并将其添加到现有存款中(如果有) 。

然后 , 客户可以通过订阅功能指定主题和他们希望使用的以太币金额来访问特定主题 。 重要的是要注意 , 在这一步中 , 实际上不会从客户那里拿走以太币 , 而只是从客户的初始存款中扣除 。 当客户想要访问物联网数据时 , 客户将调用具有特定主题的访问函数 。 然后 , 合约会检查客户是否具有正确的订阅 , 如果是 , 合约会将访问持续时间和令牌发送给客户 。
此外 , 还会记录访问事件(参数包括客户的地址、令牌、请求的主题和访问持续时间) 。 事件消息由所有以太坊节点(包括客户和经纪人)公开广播和捕获 。 经纪人将使用令牌对链外客户进行身份验证 。 身份验证是通过要求客户发送相同的令牌但由客户的私钥签名来完成的 。 一旦经纪人通过身份验证 , 客户将通过 MQTT 连接在指定的时间段内或直到客户断开连接之前访问物联网数据 。 订阅和访问函数的 Solidity 代码分别显示在图 6 和图 7 中 。 如图 7 所示 , 为了生成唯一的访问令牌 , 合约对几个变量(所有者和客户的地址、主题 ID 和通过系统的访问总数)的串联进行哈希处理 。
代理与客户之间的通信通过 MQTT 协议直接进行 , 在该协议中 , 代理将主题数据发布给订阅的客户 。 值得注意的是 , 任何希望使用该服务的客户都可以调用订阅功能 。 当客户断开连接时 , 代理将调用 (updateSubscriptionTime) 函数 , 其中客户的订阅余额根据数据访问的持续时间进行更新 。 如果会话到期 , 当客户的存款用完时发生 , 代理会断开会话并调用( updateSubscriptionTime) 函数 , 智能合约在断开连接请求后将付款发送给设备所有者 。
如果客户希望退还他/她的剩余余额 , 客户会调用智能合约的退款功能 。 然后 , 合约确保当前没有数据被访问 , 重置客户的存款和订阅 , 并将剩余的以太币发送回给客户 。 这种相互作用如图所示 。 退款功能的代码如图所示 。 值得注意的是 , 客户在执行智能合约调用的功能时支付以太气体消耗 , 该函数来自他自己的账户 , 而不是智能合约本身的资金 。
结论在本文中 , 我们提出了一种基于区块链解决方案的系统设计、架构和实施方案 , 使用以太坊智能合约以不涉及中介的方式通过自动支付实现物联网数据的货币化 。 我们使用Solidity语言实现了以太坊智能合约 。 我们详细介绍了参与者之间的系统交互 , 并使用Remix IDE测试了系统的各种功能 。 作为未来的工作 , 我们正在实施一个由智能网络摄像头组成的全功能系统 , 该系统将实时图像流式传输到基于亚马逊的MQTT代理 , 其中图像被聚合 。 我们还在开发前端DApp(去中心化应用程序)和钱包 , 供不同的参与者与以太坊智能合约进行交互 。