esp8266+新版onenet平台之HTTP设备属性上报

一、注册账户

新版onenet平台

https://open.iot.10086.cn/

作为onenet新用户,需要先进行账号注册登录

二、创建产品

进入开发者 中心->产品开发->创建产品

产品品类无要求,智能化化选择设备接入,节点类型为直连设备,协议为HTTP

进入对应的产品开发

设置物模型,添加自定义功能点

三、创建设备

在产品开发下对对应产品进行项目管理,添加设备

设备名称为设备ID(新版统一设备名称和ID)位置信息可以不选择

找到esp8266设备->属性,即可看到产品下的设备自动添加了功能点

四、esp8266设备属性上报

工具:

Postman、token生成工具/代码、开发文档

新版onenet平台提供了两种安全鉴权文档方式:设备接入的安全鉴权、平台API调用安全鉴权

设备接入安全鉴权

对应的官方文档(新版)

https://open.iot.10086.cn/doc/v5/fuse/detail/913

建议用官方的Java代码复制到在线编辑器(官方的token计算工具算出来的不对)

在线编辑器:https://www.jyshare.com/compile/10/

version:平台规定用2018-10-31,不修改

res:设备级接入为products/产品ID/devices/设备ID(即设备名称)

et:过期时间不修改

accesskey:设备接入采用设备密钥

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;

public class Token {

    public static String assembleToken(String version, String resourceName, String expirationTime, String signatureMethod, String accessKey)
            throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException {
        StringBuilder sb = new StringBuilder();
        String res = URLEncoder.encode(resourceName, "UTF-8");
        String sig = URLEncoder.encode(generatorSignature(version, resourceName, expirationTime, accessKey, signatureMethod), "UTF-8");
        sb.append("version=")
                .append(version)
                .append("&res=")
                .append(res)
                .append("&et=")
                .append(expirationTime)
                .append("&method=")
                .append(signatureMethod)
                .append("&sign=")
                .append(sig);
        return sb.toString();
    }

    public static String generatorSignature(String version, String resourceName, String expirationTime, String accessKey, String signatureMethod) 
		    throws NoSuchAlgorithmException, InvalidKeyException {
        String encryptText = expirationTime + "\n" + signatureMethod + "\n" + resourceName + "\n" + version;
        String signature;
        byte[] bytes = HmacEncrypt(encryptText, accessKey, signatureMethod);
        signature = Base64.getEncoder().encodeToString(bytes);
        return signature;
    }

    public static byte[] HmacEncrypt(String data, String key, String signatureMethod)
            throws NoSuchAlgorithmException, InvalidKeyException {
        //根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
        SecretKeySpec signinKey = null;
        signinKey = new SecretKeySpec(Base64.getDecoder().decode(key),
                "Hmac" + signatureMethod.toUpperCase());

        //生成一个指定 Mac 算法 的 Mac 对象
        Mac mac = null;
        mac = Mac.getInstance("Hmac" + signatureMethod.toUpperCase());

        //用给定密钥初始化 Mac 对象
        mac.init(signinKey);

        //完成 Mac 操作
        return mac.doFinal(data.getBytes());
    }

    public enum SignatureMethod {
        SHA1, MD5, SHA256;
    }

    public static void main(String[] args) throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException {
        String version = "2018-10-31";
        String resourceName = "products/bhgG9DOhK6/devices/esp8266";
        String expirationTime = System.currentTimeMillis() / 1000 + 100 * 24 * 60 * 60 + "";
        String signatureMethod = SignatureMethod.SHA1.name().toLowerCase();
        String accessKey = "NFR4SFYxYUNqb3MxWTc3SVNXODEwZGU3TDhZbHBCeDI=";
        String token = assembleToken(version, resourceName, expirationTime, signatureMethod, accessKey);
        System.out.println("Authorization:" + token);
    }
}

得到token(令牌验证)

version=2018-10-31&res=products%2F产品ID%2Fdevices%2F设备名称&et=1714363706&method=sha1&sign=HlAgfxg5Ps7ZW9ULk%2Ff2Lv8I%2BDU%3D

发送Post请求

postman官网:https://www.postman.com/downloads/

不注册账号也可以用

Address:https://open.iot.10086.cn/fuse/http

设备上报url(请求路径):/device/thing/property/post

路径参数:

topic$sys/{pid}/{device-name}/thing/property/post
protocolhttp

对于不同的设备操作的url

设备属性上报完整的请求路径如下

https://open.iot.10086.cn/fuse/http/device/thing/property/post?topic=$sys/产品ID/设备名称/thing/property/post&protocol=http

请求头

在postman中header中添加参数

Content-Typeapplication/json
token设备级key计算出的token

请求体

在Body中填写上报参数,选raw,发送格式选择JSON

官方文档:https://open.iot.10086.cn/doc/v5/fuse/detail/935

其中的time参数可以不添加,修改如下

{
  "id":"123",
  "version":"1.0",
  "params":{
    "test":{
      "value":100
    },
    "shake":{
      "value":50
    }
  }
}

Send请求体,收到 "errno": 0,"error": "succ",则属性上报成功

如果没有上报成功可以对应官方文档查询问题

https://open.iot.10086.cn/doc/v5/fuse/detail/934

五、效果呈现

关于新版onenet平台的功能开发欢迎大家持续关注,一起探讨

  • 55
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值