栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

CAT1|mqtt对接onenet平台-token计算(c语言)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

CAT1|mqtt对接onenet平台-token计算(c语言)

token的计算是使用纯C语言实现,可以移植到任何平台。工程采用CodeBlocks编译

前言

onenet平台已经做了进一步的完善,各个功能都很齐全。现在使用mqtt进行对接

对接信息 1.服务器地址
连接协议证书地址端口说明
MQTT证书下载studio-mqtt.heclouds.com1883非加密端口接入
MQTTS证书下载studio-mqtts.heclouds.com8883加密端口接入
2.安全认证
参数是否必须参数说明
clientId设备名称
username平台分配的产品ID
password填写经过 key 计算的 token

平台的连接难点就在于token的计算。目前官网没有给出token计算的c语言方式

Token计算 1.参考文档

token计算公式https://open.iot.10086.cn/doc/v5/develop/detail/624

2.代码实现-纯C语言

代码的来源也是网络,在原基础上进行了修改测试,如果冒犯,请第一时间联系!

#ifndef _CIPHER_TOKEN_H
#define _CIPHER_TOKEN_H
#ifdef  __cplusplus
extern "C" {
#endif 

#include 

typedef enum {
    ONENET_METHOD_MD5 = 0,
    ONENET_METHOD_SHA1,
    ONENET_METHOD_SHA256,
}method_t;

typedef struct onenet_msg
{
    char produt_id[32];
    char device_name[32];
    char key[128];
}onenet_msg_t;

int onenet_creat_token_init(onenet_msg_t* msg, long long time,method_t token_method,char *token,int maxlen);


#ifdef  __cplusplus
}
#endif 
#endif 
#include "token.h"
#include "base64.h"
#include "hmac.h"
#include "md5.h"
#include "sha.h"
#include "sha1.h"
#include "sha256.h"


typedef struct {
    char  et[32];
    char* version;
    char* method;
    char res[128];
    char sign[128];
} sign_msg;


typedef  struct {
    char* old_str;
    char* str;
}URL_PARAMETES;


static int url_encoding_for_token(sign_msg* msg,char *token,int maxlen)
{
    int i,j,k,slen;
    sign_msg* temp_msg = msg;
    URL_PARAMETES url_patametes[] = {
       {"+","%2B"},
       {" ","%20"},
       {"/","%2F"},
       {"?","%3F"},
       {"%","%25"},
       {"#","%23"},
       {"&","%26"},
       {"=","%3D"},
    };
    char temp[128]     = {0};
    
    slen = strlen(temp_msg->res);
    for (i = 0,j = 0; i < slen; i++) {
        for(k = 0; k < 8; k++){
            if(temp_msg->res[i] == url_patametes[k].old_str[0]) {
                memcpy(&temp[j],url_patametes[k].str,strlen(url_patametes[k].str));
                j+=3;
                break;
            }
        }
        if (k == 8) {
            temp[j++] = temp_msg->res[i];
        }

	}
    memcpy(temp_msg->res,temp,strlen(temp));
    temp_msg->res[strlen(temp)] = 0;

    
    memset(temp,0x00,sizeof(temp));
    slen = strlen(temp_msg->sign);
    for (i = 0,j = 0; i < slen; i++) {
        for(k = 0; k < 8; k++){
            if(temp_msg->sign[i] == url_patametes[k].old_str[0]) {
                memcpy(&temp[j],url_patametes[k].str,strlen(url_patametes[k].str));
                j+=3;
                break;
            }
        }
        if(k == 8)
        {
            temp[j++] = temp_msg->sign[i];
        }
	}
    memcpy(temp_msg->sign,temp,strlen(temp));
    temp_msg->sign[strlen(temp)] = 0;

    sprintf(token, "version=%s&res=%s&et=%s&method=%s&sign=%s", temp_msg->version, temp_msg->res, temp_msg->et, temp_msg->method, temp_msg->sign);
    return strlen(token);
}


int onenet_creat_token_init(onenet_msg_t* msg, long long time,method_t token_method,char *token,int maxlen)
{
    int declen = 0, enclen =  0;
    char plaintext[64]     = { 0 };
    char hmac[64]          = { 0 };
    sign_msg sign ;
    memset(&sign,0x00,sizeof(sign));
    sign.version = "2018-10-31";
    sprintf(sign.et,"%lld",time);
    sprintf(sign.res,"products/%s/devices/%s",msg->produt_id,msg->device_name);
    mbedtls_base64_decode((unsigned char*)plaintext, sizeof(plaintext), &declen, (unsigned char*)msg->key, strlen((char*)msg->key));

    char StringForSignature[256] = { 0 };

    switch (token_method)
    {
        case ONENET_METHOD_MD5:
            sign.method = "md5";
            sprintf(StringForSignature, "%sn%sn%sn%s", sign.et, sign.method, sign.res, sign.version);
            esp_hmac_md5((unsigned char*)plaintext, declen, (unsigned char*)StringForSignature, strlen(StringForSignature), (unsigned char*)hmac);
            break;
        case ONENET_METHOD_SHA1:
            sign.method = "sha1";
            sprintf(StringForSignature, "%sn%sn%sn%s", sign.et, sign.method, sign.res, sign.version);
            esp_hmac_sha1((unsigned char*)plaintext, declen, (unsigned char*)StringForSignature, strlen(StringForSignature), (unsigned char*)hmac);
            break;
        case ONENET_METHOD_SHA256:
            sign.method = "sha256";
            sprintf(StringForSignature, "%sn%sn%sn%s", sign.et, sign.method, sign.res, sign.version);
            esp_hmac_sha256((unsigned char*)plaintext, declen, (unsigned char*)StringForSignature, strlen(StringForSignature), (unsigned char*)hmac);
            break;
    }
    mbedtls_base64_encode((unsigned char*)sign.sign, sizeof(sign.sign), &enclen, (unsigned char*)hmac, strlen(hmac));
    return url_encoding_for_token(&sign,token,maxlen);
}
测试验证

 代码下载

国际惯例,代码下载

onenet_token: onenet对接token计算方式 (gitee.com)

 onenet对接token计算C语言实现

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/779139.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号