发挥比原特性和融合PPk开放协议的经验分享(3)
基于比原链开发物联网软硬件结合DAPP
在前期两个各有特点的DAPP--“我画你猜”小游戏(详见 https://www.8btc.com/article/276313)和“趣吧”网络社群(详见https://www.8btc.com/article/287217 )收获的经验基础上, 我们PPk技术社区进一步实现了一个采用PPk开放协议和比原链的物联网应用DEMO——“JoyIOT趣联网”。
可以通过下面两种方式访问: 1. 传统的网址: http://btmdemo.ppkpub.org/joy/iot/
注:类似DAT、IPFS等正在发展中的WEB3.0开放协议,目前大众使用的电脑和手机浏览器还不能原生支持访问。要访问“ppk:joy/iot/”这样的ODIN标识网址,现在可以运行我们PPk开发的JAVA开源工具的代理服务,就能使用现有浏览器来访问PPK网络资源了,比如 http://btmdemo.ppkpub.org:8088/ 或 http://45.32.19.146:8088/ 就是我们运行的示例服务,在浏览器里打开该代理服务网址然后输入要访问的 PPk ODIN标识网址就可以看到了,如下图所示:
主要特性:
1.设备(Device): 本示例采用比原链自主注册设备,相应ODIN标识为 ppk;JOY/iot/bytom/txid# 其中的txid取值为对应链上交易唯一ID,例如 ppk:JOY/iot/bytom/9a7c52bad7f9da6821b69739fc756f25bf184cde7dd5ffa9851f3b3fd2abc6df#
内容定义格式示例如下,参考 https://schema.org/ 标准化数据集可以进一步灵活扩展。 { "@context": [ "https://schema.org/", "https://w3id.org/security/v1" ], "@type": "PeerIOT",
"name": "设备名称", "avtar": "设备图像,建议用img_data_url或者url",
"gas_asset_uris":[ "ppk:BTM/asset/asset_id....." ],
"authenticationCredential": [ { "type": "RsaCryptographicKey", "publicKeyPem": "-----BEGIN PUBLIC KEY...END PUBLIC KEY-----" } ], }
注: (1)定义中的gas_asset_uris是用于识别提取属于该设备关联传感器信息的资产标识列表,通过对应区块链Explorer API查询指定资产标识相关的Retired类型交易列表即可过滤出符合“JoyIOT趣联网”定义的传感器数据。 (2)定义中的公钥publicKeyPem可用于对设备下属传感器相关信息的验证。
2.传感器(Sensor): 本示例通过比原链来自主登记设备上的传感器,相应ODIN标识为 ppk;JOY/pub/bytom/txid/sensor_id# 其中的 ppk;JOY/pub/bytom/txid 为设备ODIN标识,sensor_id为自定义的传感器ID。 例如 ppk:JOY/pub/bytom/9a7c52bad7f9da6821b69739fc756f25bf184cde7dd5ffa9851f3b3fd2abc6df/dht1#
内容定义格式采用PPk PTTP协议Data数据报文定义,可以进一步灵活扩展。 JSON格式定义如下: { "ver":协议版本号(目前取值为1),
"data":"数据正文字符串,JSON编码,具体定义见下文";
"sign":"签名算法类型(如SHA256withRSA,SHA1withRSA等):对data字符串的签名对应Base64编码字符串", }
其中data数据正文字符串的JSON格式定义如下: { "uri":"对应传感器信息的ODIN标识",
"utc":到秒值的生成时间戳, "status_code":返回状态码,沿用HTTP协议定义的状态码定义,缺省为200 "status_info":"返回状态附加描述字符串,可选,沿用HTTP协议定义的状态码定义相关描述",
"metainfo":{ //对数据块的元描述信息 "content_type":"正文类型,采用HTTP协议相关定义,如text/html,text/json,image/jpg等)",
"content_encoding":"内容编码形式,参考HTTP协议相关定义,如gzip,base64,deflate等,如果该字段为空则表示内容为原文", "content_charset":"内容字符集,采用HTTP协议相关定义,如utf-8, iso-8859-1,gb2312等,如果该字段为空则缺省为utf-8", "content_length":正文长度, }, "content":"子块正文数据,如果是二进制需要采用Base64编码", }
其中content的JSON格式定义如下: { "@type":"传感器类型,目前定义了两种:DHT温湿度传感器和LED_MATRIX发光二极管阵列", "title":"传感器名称",
"vd_set":{ "algo":"发布数据时所用非对称签名验证算法类型,缺省为SHA256withRSA,可选SHA1withRSA,SHA3withRSA等", "pubkey":"验证所需要的公钥" } } 注: 定义中的公钥pubkey可用于对传感器相关上报数据或接收命令的验证。如果pubkey取值为空字符串,则表示忽略可信验证。
3.传感器数据(SensorRecord):
本示例通过比原链来存储传感器关联的数据,相应ODIN标识为 ppk;JOY/pub/bytom/txid/sensor_id/#record_id 其中的 ppk;JOY/pub/bytom/txid/sensor_id 为设备传感器ODIN标识,record_id为自定义的唯一记录标识(如流水号或时间戳等)。 例如 ppk:JOY/pub/bytom/9a7c52bad7f9da6821b69739fc756f25bf184cde7dd5ffa9851f3b3fd2abc6df/dht1/#1539764770
传感器数据的内容定义格式同样采用上述的PPk PTTP协议Data数据报文定义,可以进一步灵活扩展。 在本示例里涉及的两种传感器的具体定义如下: 1.由DHT温湿度传感器上报的监测数据:需要设备对数据包进行签名,然后通过组织成区块链交易发送到区块链上存储和被访问使用。 其中content的JSON格式定义在本示例里具体定义如下: { "temperature":摄氏温度整数值, "humidity":湿度整数值 }
2.发送给LED点阵显示模块的控制命令:需要控制者对数据包按控制权限要求进行签名或不签名,通过组织成区块链交易发送到区块链上存储,最后被目标传感器所读取验证后执行相应的控制命令。 其中content的JSON格式定义在本示例里具体定义如下: { "width":点阵宽度, "height":点阵高度, "matrix":"点阵显示原始数据字符串", "img_data_url":"采用data:形式的图像数据" }
这里探讨下结合区块链的物联网DAPP应用相比传统的物联网应用有什么本质的改变? 我们PPk社区认为,相比传统的物联网应用常用的“云服务+设备”架构,DAPP应用模式下,设备可以在区块链上自主注册自身和下属传感器标识,并通过区块链存储监测数据和接收控制命令。这样同一份物联网数据,开放、可信、持续地托管到区块链上,可以被其它DAPP应用所自主、可信、稳定地调用和整合,所谓“1+1>2”,自组织成更有生命力的物联网应用生态。
以我们这次做的“JouIOT趣联网”DMEO来说,每一个设备、传感器以及相关检测数据和控制命令都开放、可信地存放在比原链上,拥有能保证跨链唯一性的ODIN标识。
现在我们就可以通过比原链来自主注册一个新的物联网设备,在“趣联网”示例主页点击右上角的“请点击这里注册一个新设备,获得跨链跨平台的ODIN标识”链接,显示新设备注册界面如下:
生成一对RSA公私钥的方法很多,比如用 http://web.chacuo.net/netrsakeypair 这样的线上工具就可以,如下图所示:
将私钥单独备份好,将公钥部分就可以复制到上述注册新设备的参数填写页面里(注意需将原始公钥文本里的换行都替换成“\r\n”)。待设备参数都编辑输入完整后,点击“确认发布到比原链上”按钮就可以完成新设备的注册了,回到主页后点击设备列表里新注册的设备图标,就可以查看具体信息,如下图所示:
其中的device_odin参数地址(ppk:527064.583/iot/bytom/40f0e51109a477bdf9737a36dc792b35494bf2eb9b04c52c70d3ea21594e9222) 就是该设备的ODIN标识,可以被跨链跨平台应用所自主可信地访问,通过支持ODIN标识和PTTP协议的工具比如PPk浏览器,间接调用比原链相关API,就能获取到该ODIN标识对应设备定义的JSON数据,如下图所示:
新设备添加成功后,接下来就可以添加该设备下属的传感器了。 本示例采用树莓派(Raspberry Pi 3)来模拟搭建一个物联网硬件设备,并配置两个常见的传感器模块:DHT11温湿度传感器和MAX7219驱动LED8*8点阵显示模块,如下图所示:
树莓派的基础Linux环境安装和两个传感器的连接配置方式在网上有比较详细的资料可以查阅,这里不再详述,下面几个网址可供参考:Raspberry Pi 3简明配置教程: https://medium.com/@molimowang/raspberry-pi-3%E7%AE%80%E6%98%8E%E9%85%8D%E7%BD%AE%E6%95%99%E7%A8%8B-a575f20a7361 树莓派三使用max7219 led点阵: https://blog.csdn.net/zyaiwmy/article/details/70224250 树莓派控制温湿度传感器DHT11: http://guojianxiang.com/posts/2015-11-26-RP_Controle_Dht11.html
通过SSH客户端登录到已安装好Linux的树莓派系统,从本示例的GITHUB上(https://github.com/joyiot/btmdemo/tree/master/python)下载相应的Python源码,先编辑其中 device.json 文件,输入该设备对应的上述ODIN标识和生成的私钥(注意需将原始私钥文本里的换行都替换成“\r\n”)后保存,如下图所示:
首先我们输入下述命令来添加一个名称为"dht1"的温湿度传感器:
python joyiot_register_sensor.py --id dht1 --type DHT --pubkey SameToDevice
执行结果最后显示如下就说明新的传感器已经在比原链上登记成功了。Response= {"status":"success","data":{"tx_id":"324b1ca181d66232c153eb64312881c05587803340288a6c4b74704bb359b7f8"}}
编辑 joyiot_dht.py 文件,,如下图所示:python joyiot_dht.py
即可将监测到的温湿度数据上传到比原链上。然后我们输入下述命令再添加一个名称为"led1"的LED显示点阵模块:
python joyiot_register_sensor.py --id led1 --type LED_MATRIX --pubkey ""
注意这里的pubkey参数取值为空字符串,表示新增的这个LED显示点阵是完全开放的,通过区块链接收控制数据时不需要验证权限。如果该参数指定了一个公钥,则通过区块链接收控制数据时会验证需要有相应的私钥签名。回到设备信息展示页面,刷新后就会列出该设备下属的传感器列表,如下图所示:
回到设备信息显示页面,点击相应的LED点阵右侧的“查看最近的控制数据”,就可以查看到如下信息:
回到安装了LED点阵的树莓派上,输入下述命令:
python joyiot_led.py --id led1
就可以通过PTTP协议来读取上述ODIN标识的具体内容,并相应体现,如下图所示:在上述这个示例基础上,我们PPk技术社区正在结合比原链和更多区块链平台的各自特性,进一步构思和实现更多应用示例,体现PPk开放协议在WEB3.0生态中的独特“衔接”作用,欢迎继续关注。
附:本示例源码的GITHUB网址 https://github.com/joyiot/btmdemo/ 其中WEB部分是PHP+JS编写,硬件控制部分是Python编写。