• [技术干货] 华为云IoT设备接入密码C语言生成
    华为云IoT设备接入密码C语言生成Andy 2021-3-18一、问题去年给客户(华为SaaS生态链企业,名字匿了)定制了一款高性价比DTU网关,支持协议定制、远程配置、断缓续传。有些朋友想拿样品测试,问题来了:网关接入华为IoT云的参数(ClientId、Username、Password等)一般是从客户的应用后台获取,如果没有后台或者后台对接比较麻烦怎么办?先看看这些参数是怎么来的:https://support.huaweicloud.com/api-iothub/iot_06_v5_3009.html1. ClientId(1) 设备ID① 产品ID② 设备标识码(2) 时间戳2. Username设备ID3. Password由HMACSHA256算法生成(1) 加密密钥:时间戳(2) 明文:设备密钥。以上各个参数中,只有设备标志码每个设备不同,其他均为固定值,即设备与云平台保持一致即可,核心是实现HMACSHA256算法(正好在宇宙四大行做加密谋生-_-||),以下简要分述。 二、云平台客户用自己的华为云账号按以下参数创建产品、注册设备后,不必配置任何参数,网关即可自动上云。三、工具生成https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/四、算法检验http://www.jsons.cn/allencrypt/五、代码生成X86平台有openSSL,JAVA有Cipher包,瘦弱的MCU只能直接用源代码了,感谢这位大兄弟(不知是不是扒的openSSL源码?):https://blog.csdn.net/miniphoenix/article/details/110135164代码扒下来精简了下,输出由hex改为string,OK~// HMAC_SHA256.c #include "HMAC_SHA256.h" #include "stdint.h" #include <stdio.h>  #include <stdlib.h> #include <string.h> //------------------------------------------------------------------------------ #define SHA256_BLOCKLEN  64ul //size of message block buffer #define SHA256_DIGESTLEN 32ul //size of digest in uint8_t #define SHA256_DIGESTINT 8ul  //size of digest in uint32_t   //------------------------------------------------------------------------------ typedef struct sha256_ctx_t {   uint64_t len;                 // processed message length   uint32_t h[SHA256_DIGESTINT]; // hash state   uint8_t buf[SHA256_BLOCKLEN]; // message block buffer } SHA256_CTX;   void sha256_init(SHA256_CTX *ctx); void sha256_update(SHA256_CTX *ctx, const uint8_t *m, uint32_t mlen); // resets state: calls sha256_init void sha256_final(SHA256_CTX *ctx, uint8_t *md);   //------------------------------------------------------------------------------ typedef struct hmac_sha256_ctx_t {   uint8_t buf[SHA256_BLOCKLEN]; // key block buffer, not needed after init   uint32_t h_inner[SHA256_DIGESTINT];   uint32_t h_outer[SHA256_DIGESTINT];   SHA256_CTX sha; } HMAC_SHA256_CTX;   void hmac_sha256_init(HMAC_SHA256_CTX *hmac, const uint8_t *key, uint32_t keylen); void hmac_sha256_update(HMAC_SHA256_CTX *hmac, const uint8_t *m, uint32_t mlen); // resets state to hmac_sha256_init void hmac_sha256_final(HMAC_SHA256_CTX *hmac, uint8_t *md);   //------------------------------------------------------------------------------ void pbkdf2_sha256(HMAC_SHA256_CTX *ctx,     const uint8_t *key, uint32_t keylen, const uint8_t *salt, uint32_t saltlen, uint32_t rounds,     uint8_t *dk, uint32_t dklen);   //------------------------------------------------------------------------------   #include <string.h>   //#define ROR(n,k) ((n >> k) | (n << (32 - k)))   static uint32_t ror(uint32_t n, uint32_t k) {   return (n >> k) | (n << (32 - k)); }   #define ROR(n,k) ror(n,k)   #define CH(x,y,z)  (z ^ (x & (y ^ z))) #define MAJ(x,y,z) ((x & y) | (z & (x | y))) #define S0(x)      (ROR(x, 2) ^ ROR(x,13) ^ ROR(x,22)) #define S1(x)      (ROR(x, 6) ^ ROR(x,11) ^ ROR(x,25)) #define R0(x)      (ROR(x, 7) ^ ROR(x,18) ^ (x>>3)) #define R1(x)      (ROR(x,17) ^ ROR(x,19) ^ (x>>10))   static const uint32_t K[64] = {   0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,   0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,   0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,   0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,   0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,   0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,   0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,   0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 };   static void sha256_transform(SHA256_CTX *s, const uint8_t *buf) {   uint32_t t1, t2, a, b, c, d, e, f, g, h, m[64];   uint32_t i, j;      for (i = 0, j = 0; i < 16; i++, j += 4)   {     m[i] = (uint32_t) buf[j] << 24 | (uint32_t) buf[j + 1] << 16 |            (uint32_t) buf[j + 2] << 8 | (uint32_t) buf[j + 3];   }   for (; i < 64; i++)   {     m[i] = R1(m[i - 2]) + m[i - 7] + R0(m[i - 15]) + m[i - 16];   }   a = s->h[0];   b = s->h[1];   c = s->h[2];   d = s->h[3];   e = s->h[4];   f = s->h[5];   g = s->h[6];   h = s->h[7];   for (i = 0; i < 64; i++)   {     t1 = h + S1(e) + CH(e, f, g) + K[i] + m[i];     t2 = S0(a) + MAJ(a, b, c);     h = g;     g = f;     f = e;     e = d + t1;     d = c;     c = b;     b = a;     a = t1 + t2;   }   s->h[0] += a;   s->h[1] += b;   s->h[2] += c;   s->h[3] += d;   s->h[4] += e;   s->h[5] += f;   s->h[6] += g;   s->h[7] += h; }   void sha256_init(SHA256_CTX *s) {   s->len = 0;      s->h[0] = 0x6a09e667;   s->h[1] = 0xbb67ae85;   s->h[2] = 0x3c6ef372;   s->h[3] = 0xa54ff53a;   s->h[4] = 0x510e527f;   s->h[5] = 0x9b05688c;   s->h[6] = 0x1f83d9ab;   s->h[7] = 0x5be0cd19; }   void sha256_final(SHA256_CTX *s, uint8_t *md) {   uint32_t r = s->len % SHA256_BLOCKLEN;   int i;      //pad   s->buf[r++] = 0x80;   if (r > 56)   {     memset(s->buf + r, 0, SHA256_BLOCKLEN - r);     r = 0;     sha256_transform(s, s->buf);   }   memset(s->buf + r, 0, 56 - r);   s->len *= 8;   s->buf[56] = s->len >> 56;   s->buf[57] = s->len >> 48;   s->buf[58] = s->len >> 40;   s->buf[59] = s->len >> 32;   s->buf[60] = s->len >> 24;   s->buf[61] = s->len >> 16;   s->buf[62] = s->len >> 8;   s->buf[63] = s->len;   sha256_transform(s, s->buf);      for (i = 0; i < SHA256_DIGESTINT; i++)   {     md[4 * i    ] = s->h[i] >> 24;     md[4 * i + 1] = s->h[i] >> 16;     md[4 * i + 2] = s->h[i] >> 8;     md[4 * i + 3] = s->h[i];   }   sha256_init(s); }   void sha256_update(SHA256_CTX *s, const uint8_t *m, uint32_t len) {   const uint8_t *p = m;   uint32_t r = s->len % SHA256_BLOCKLEN;      s->len += len;   if (r)   {     if (len + r < SHA256_BLOCKLEN)     {       memcpy(s->buf + r, p, len);       return;     }     memcpy(s->buf + r, p, SHA256_BLOCKLEN - r);     len -= SHA256_BLOCKLEN - r;     p += SHA256_BLOCKLEN - r;     sha256_transform(s, s->buf);   }   for (; len >= SHA256_BLOCKLEN; len -= SHA256_BLOCKLEN, p += SHA256_BLOCKLEN)   {     sha256_transform(s, p);   }   memcpy(s->buf, p, len); }   #define INNER_PAD '\x36' #define OUTER_PAD '\x5c'   void hmac_sha256_init(HMAC_SHA256_CTX *hmac, const uint8_t *key, uint32_t keylen) {   SHA256_CTX *sha = &hmac->sha;   uint32_t i;      if (keylen <= SHA256_BLOCKLEN)   {     memcpy(hmac->buf, key, keylen);     memset(hmac->buf + keylen, '\0', SHA256_BLOCKLEN - keylen);   }   else   {     sha256_init(sha);     sha256_update(sha, key, keylen);     sha256_final(sha, hmac->buf);     memset(hmac->buf + SHA256_DIGESTLEN, '\0', SHA256_BLOCKLEN - SHA256_DIGESTLEN);   }      for (i = 0; i < SHA256_BLOCKLEN; i++)   {     hmac->buf[ i ] = hmac->buf[ i ] ^ OUTER_PAD;   }      sha256_init(sha);   sha256_update(sha, hmac->buf, SHA256_BLOCKLEN);   // copy outer state   memcpy(hmac->h_outer, sha->h, SHA256_DIGESTLEN);      for (i = 0; i < SHA256_BLOCKLEN; i++)   {     hmac->buf[ i ] = (hmac->buf[ i ] ^ OUTER_PAD) ^ INNER_PAD;   }      sha256_init(sha);   sha256_update(sha, hmac->buf, SHA256_BLOCKLEN);   // copy inner state   memcpy(hmac->h_inner, sha->h, SHA256_DIGESTLEN); }   void hmac_sha256_update(HMAC_SHA256_CTX *hmac, const uint8_t *m, uint32_t mlen) {   sha256_update(&hmac->sha, m, mlen); }   void hmac_sha256_final(HMAC_SHA256_CTX *hmac, uint8_t *md) {   SHA256_CTX *sha = &hmac->sha;   sha256_final(sha, md);      // reset sha to outer state   memcpy(sha->h, hmac->h_outer, SHA256_DIGESTLEN);   sha->len = SHA256_BLOCKLEN;      sha256_update(sha, md, SHA256_DIGESTLEN);   sha256_final(sha, md); // md = D(outer || D(inner || msg))      // reset sha to inner state -> reset hmac   memcpy(sha->h, hmac->h_inner, SHA256_DIGESTLEN);   sha->len = SHA256_BLOCKLEN; }   void pbkdf2_sha256(HMAC_SHA256_CTX *hmac,     const uint8_t *key, uint32_t keylen, const uint8_t *salt, uint32_t saltlen, uint32_t rounds,     uint8_t *dk, uint32_t dklen) {   uint8_t *U;   uint8_t *T;   uint8_t count[4];   uint32_t i, j, k;   uint32_t len;     uint32_t hlen = SHA256_DIGESTLEN;   uint32_t l = dklen / hlen + ((dklen % hlen) ? 1 : 0);   uint32_t r = dklen - (l - 1) * hlen;      hmac_sha256_init(hmac, key, keylen);      U = hmac->buf;   T = dk;      len = hlen;   for (i = 1; i <= l; i++)   {     if (i == l) { len = r; }     count[0] = (i >> 24) & 0xFF;     count[1] = (i >> 16) & 0xFF;     count[2] = (i >>  8) & 0xFF;     count[3] = (i) & 0xFF;     hmac_sha256_update(hmac, salt, saltlen);     hmac_sha256_update(hmac, count, 4);     hmac_sha256_final(hmac, U);     memcpy(T, U, len);     for (j = 1; j < rounds; j++)     {       hmac_sha256_update(hmac, U, hlen);       hmac_sha256_final(hmac, U);       for (k = 0; k < len; k++)       {         T[k] ^= U[k];       }     }     T += len;   }    } void compute_sha_ex(unsigned char* dest, const uint8_t *msg, uint32_t mlen) {   uint8_t md[SHA256_DIGESTLEN] = {0};   SHA256_CTX sha;   sha256_init(&sha);   sha256_update(&sha, msg, mlen);   sha256_final(&sha, md);   memcpy(dest, md, SHA256_DIGESTLEN); }   void compute_hmac_ex(unsigned char* dest, const uint8_t *key, uint32_t klen, const uint8_t *msg, uint32_t mlen) {   uint8_t md[SHA256_DIGESTLEN] = {0};   HMAC_SHA256_CTX hmac;   hmac_sha256_init  (&hmac, key, klen);   hmac_sha256_update(&hmac, msg, mlen);   hmac_sha256_final (&hmac, md); #if 0   // hex value   memcpy(dest, md, SHA256_DIGESTLEN); #else   // string of hex value   for (int i = 0; i < SHA256_DIGESTLEN; i++)   {     sprintf(dest, "%s%02x", dest, md[i]);   } #endif }// HMAC_SHA256.h #ifndef _HMAC_SHA256_H #define _HMAC_SHA256_H #ifndef uint8_t   typedef unsigned char   uint8_t; #endif #ifndef uint32_t   typedef unsigned int    uint32_t; #endif void compute_hmac_ex(unsigned char* dest, const uint8_t *key, uint32_t klen, const uint8_t *msg, uint32_t mlen); #endif// HuaweiIotToken.c // Andy 18676383370, 435223420@qq.com // https://support.huaweicloud.com/api-iothub/iot_06_v5_3009.html #include "HuaweiIotToken.h"   #include "HMAC_SHA256.h"   #include <stdio.h>  #include <string.h> #define TIME_STAMP_LEN            (10) int TOKEN_GetDeviceId(const uchar *productId, const uchar *deviceCode, uchar *deviceId) {   if ( !productId )   {     printf("[%s] input error: productId is NULL", __FUNCTION__);     return -10;   }   if ( !strlen(productId) )   {     printf("[%s] input error: productId is empty", __FUNCTION__);     return -11;   }   if ( !deviceCode )   {     printf("[%s] input error: deviceCode is NULL", __FUNCTION__);     return -20;   }   if ( !strlen(deviceCode) )   {     printf("[%s] input error: deviceCode is empty", __FUNCTION__);     return -21;   }   if ( !deviceId )   {     printf("[%s] input error: deviceId is NULL", __FUNCTION__);     return -30;   }      sprintf(deviceId, "%s_%s", productId, deviceCode);   return 0; } int TOKEN_GetClientId(const uchar *deviceId, const uchar *timeStamp, uchar *clientId) {   const uchar DEVICE_ID_TYPE[1+1]   = "0";   const uchar CIPHER_SIGN_TYPE[1+1] = "0";   if ( !deviceId )   {     printf("[%s] input error: productId is NULL", __FUNCTION__);     return -10;   }   if ( !strlen(deviceId) )   {     printf("[%s] input error: productId is empty", __FUNCTION__);     return -11;   }   if ( !timeStamp )   {     printf("[%s] input error: timeStamp is NULL", __FUNCTION__);     return -20;   }   if ( strlen(timeStamp) != TIME_STAMP_LEN )   {     printf("[%s] input error: timeStamp len %d", __FUNCTION__, strlen(timeStamp));     return -21;   }   if ( !clientId )   {     printf("[%s] input error: deviceCode is NULL", __FUNCTION__);     return -30;   }   sprintf(clientId, "%s_%s_%s_%s",                     deviceId,                     DEVICE_ID_TYPE,                     CIPHER_SIGN_TYPE,                     timeStamp);   return 0; } int TOKEN_GetPassword(const uchar *timeStamp, const uchar *deviceSecret, uchar *password) {   if ( !timeStamp )   {     printf("[%s] input error: timeStamp is NULL", __FUNCTION__);     return -10;   }   if ( strlen(timeStamp) != TIME_STAMP_LEN )   {     printf("[%s] input error: timeStamp len %d", __FUNCTION__, strlen(timeStamp));     return -11;   }   if ( !deviceSecret )   {     printf("[%s] input error: deviceSecret is NULL", __FUNCTION__);     return -20;   }   if ( !strlen(deviceSecret) )   {     printf("[%s] input error: deviceSecret is empty", __FUNCTION__);     return -21;   }   if ( !password )   {     printf("[%s] input error: password is NULL", __FUNCTION__);     return -30;   }   compute_hmac_ex(  password,                     timeStamp,                     strlen(timeStamp),                     deviceSecret,                     strlen(deviceSecret)  );      return 0; }// HuaweiIotToken.h #ifndef _HUAWEI_IOT_TOKEN_H #define _HUAWEI_IOT_TOKEN_H #ifndef uchar   typedef unsigned char   uchar; #endif int TOKEN_GetDeviceId(const uchar *productId, const uchar *deviceCode,   uchar *deviceId); int TOKEN_GetClientId(const uchar *deviceId,  const uchar *timeStamp,    uchar *clientId); int TOKEN_GetPassword(const uchar *timeStamp, const uchar *deviceSecret, uchar *password); #endif// test.c #include "HuaweiIotToken.h" #include <stdio.h> #define MAX_STR_LEN               (256) #define CLIENT_ID_LEN             (256) #define USERNAME_LEN              (256) #define PASSWORD_LEN              (256) #define PRODUCT_ID                "myProductId" #define IMEI                      "864424044187240" #define DEVICE_SECRET             "12345678" #define DEVICE_REG_TIME_STAMP     "2021031803" int main(int argc,char **argv)   {   int ret = 0;   uchar deviceId[MAX_STR_LEN + 1]   = {0};   ret = TOKEN_GetDeviceId(PRODUCT_ID, IMEI, deviceId);   if ( ret ) return -1;   printf("product id  : %s\n", PRODUCT_ID);   printf("device code : %s\n", IMEI);   printf("device id   : %s\n", deviceId);   printf("\n");   uchar clientId[CLIENT_ID_LEN + 1] = {0};   ret = TOKEN_GetClientId(deviceId, DEVICE_REG_TIME_STAMP, clientId);   if ( ret ) return -2;   printf("device id   : %s\n", deviceId);   printf("time stamp  : %s\n", DEVICE_REG_TIME_STAMP);   printf("client id   : %s\n", clientId);   printf("\n");   uchar password[PASSWORD_LEN + 1] = {0};   ret = TOKEN_GetPassword(DEVICE_REG_TIME_STAMP, DEVICE_SECRET, password);   if ( ret ) return -3;   printf("timeStamp   : %s\n", DEVICE_REG_TIME_STAMP);   printf("deviceSecret: %s\n", DEVICE_SECRET);   printf("password    : %s\n", password);   printf("\n");   return 0; }编译,运行。。。生成的password完全一致,欧耶~d52820682c39ed6875c351ddcc1329580de6edd6c9056e6b8190342222f62af1
  • [问题求助] 通过IoTDA想上传一张图片,可以实现吗?或者华为云什么服务,可以实现?
    通过IoTDA想上传一张图片,可以实现吗?或者华为云什么服务,可以实现?谢谢
  • [问题求助] Codelabs /烟雾传感器智能报警开发 涉及 设备接入模拟器
    【功能模块】https://devstar.developer.huaweicloud.com/devstar/code-templates/203ffa0aeefa4de782479bcd71a3ad8a【操作步骤&问题现象】1、上述网页的 第8部分 提到—— 双击启动设备接入模拟器(HubSimulator.jar),切换到MQTT设备模拟器页签。2、问题,这个模拟器可以在win10中跑起来吗?好像不行。3、这个模拟器有win10版本吗【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] 【IOTA产品】【sdk功能】huaweicloud-sdk-iotda包没有批量任务文件上传的接口
    【功能模块】【操作步骤&问题现象】1、huaweicloud-sdk-iotda包没有批量任务文件上传的接口 【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [交流吐槽] huaweicloud-sdk-iotda
    版本  3.0.34-rcIoTDAClient 没有【上传批量任务文件】的接口??
  • [问题求助] 设备接入中Coap协议下的域名无法ping通
    【功能模块】NB-IOT【操作步骤&问题现象】开始是购买的bearpi路灯demo无法正常运行,设备处于未激活状态,数据无法上报下发,就猜测是不是IP地址换了,PC上去ping设备接入中提供的几种协议的接入地址,发现除了COAP协议一直请求超时无回复以外,MQTT和HTTPS都是可以正常ping通。另外确认了COAP协议下的接入地址和端口是正确的【截图信息】
  • [问题求助] 在设备接入IoTA中使用应用侧API查询设备消息查询不到
    【功能模块】【操作步骤&问题现象】1、在物联网平台的控制台能看到最新的上报数据这时用MQTT.fx发送的消息2、但是在API Explorer中调试查询设备消息API的时候查询到的消息是一片空白希望能有大神解答这个问题,十分感谢!【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] 【ABC】【设备接入】ABC平台有没有设备接入和管理的相关文档或者视频?
    ABC平台有没有设备接入和管理的相关文档或者视频?
  • [问题求助] Lite OS中通过NB模组与IOTDA平台的连接问题
          之前的NB卡应该是停机了,我现在重新换了一张新的卡,在Debug页面里面每次查询到CGATT=1之后,NB模组就会自己重启,无限反复,云平台上显示的设备在线,但并没有数据传输。用AT指令直接调试模组PING不通,会返回ERROR,想问下我这是哪里的问题。                               [DEBUG][48726][__resp_rcv:159] ATRCV:4 Bytes:![DEBUG][48730][__resp_rcv:159] ATRCV:4 Bytes:ÿ[DEBUG][48735][__resp_rcv:159] ATRCV:31 Bytes:Boot: UnsignedSecurity B..[DEBUG][48743][__resp_rcv:159] ATRCV:23 Bytes:VerifiedProtocol A..[DEBUG][48749][__resp_rcv:159] ATRCV:23 Bytes:VerifiedApps A......[DEBUG][48756][__resp_rcv:159] ATRCV:10 Bytes:Verified[DEBUG][48761][__resp_rcv:159] ATRCV:42 Bytes:REBOOT_CAUSE_APPLICATION_ATNeulOK[DEBUG][53281][__cmd_send:123] ATSND:5 Bytes:ATE0[DEBUG][55311][__cmd_send:123] ATSND:5 Bytes:ATE0[DEBUG][55934][__resp_rcv:159] ATRCV:6 Bytes:OK[DEBUG][55945][__cmd_send:123] ATSND:5 Bytes:ATE0[DEBUG][55950][__resp_rcv:159] ATRCV:6 Bytes:OK[DEBUG][55968][__cmd_send:123] ATSND:13 Bytes:AT+QREGSWT=1[DEBUG][55974][__resp_rcv:159] ATRCV:6 Bytes:OK[DEBUG][55990][__cmd_send:123] ATSND:10 Bytes:AT+CMEE=1[DEBUG][55995][__resp_rcv:159] ATRCV:6 Bytes:OK[DEBUG][56013][__cmd_send:123] ATSND:12 Bytes:AT+NCONFIG?[DEBUG][56018][__resp_rcv:159] ATRCV:6 Bytes:OK[DEBUG][56626][__resp_rcv:159] ATRCV:583 Bytes:+NCONFIG:AUTOCONNECT,FALSE+NCONFIG:CR_0354_0338_SCRAMBLING,TRUE+NCONFIG:CR_0859_SI_AVOID,TRUE+NCONFIG:COMBINE_ATTACH,FALSE+NCONFIG:CELL_RESELECTION,TRUE+NCONFIG:ENABLE_BIP,FALSE+NCONFIG:MULTITONE,TRUE+NCONFIG:NAS_SIM_POWER_SAVING_ENABLE,TRUE+NCONFIG:BARRING_RELEASE_DELAY,64+NCONFIG:RELEASE_VERSION,13+NCONFIG:RPM,FALSE+NCONFIG:SYNC_TIME_PERIOD,0+NCONFIG:IPV6_GET_PREFIX_TIME,15+NCONFIG:NB_CATEGORY,1+NCONFIG:RAI,FALSE+NCONFIG:HEAD_COMPRESS,FALSE+NCONFIG:RLF_UPDATE,FALSE+NCONFIG:CONNECTION_REESTABLISHMENT,FALSE+NCONFIG:PCO_IE_TYPE,EPCOOK[DEBUG][56692][__cmd_send:123] ATSND:10 Bytes:AT+NBAND?[DEBUG][56719][__resp_rcv:159] ATRCV:23 Bytes:+NBAND:5,8,20OK[DEBUG][56736][__cmd_send:123] ATSND:10 Bytes:AT+CFUN=1[DEBUG][60775][__cmd_send:123] ATSND:10 Bytes:AT+COPS=0[DEBUG][62799][__cmd_send:123] ATSND:9 Bytes:AT+NCDP?[DEBUG][63144][__resp_rcv:159] ATRCV:6 Bytes:OK[DEBUG][63203][__cmd_send:123] ATSND:52 Bytes:AT+NCDP=iot-coaps.cn-north-4.myhuaweicloud.com,5683[DEBUG][63212][__resp_rcv:159] ATRCV:6 Bytes:OK[DEBUG][63229][__cmd_send:123] ATSND:11 Bytes:AT+CGATT=1[DEBUG][63234][__resp_rcv:159] ATRCV:59 Bytes:+NCDP:iot-coaps.cn-north-4.myhuaweicloud.com,5683OK[DEBUG][63255][__cmd_send:123] ATSND:10 Bytes:AT+NNMI=1[DEBUG][63260][__resp_rcv:159] ATRCV:6 Bytes:OK[DEBUG][63276][__cmd_send:123] ATSND:10 Bytes:AT+CGATT?[DEBUG][63281][__resp_rcv:159] ATRCV:18 Bytes:+CME ERROR: 51[DEBUG][63287][__resp_rcv:159] ATRCV:6 Bytes:OK[DEBUG][63296][__resp_rcv:159] ATRCV:18 Bytes:+CGATT:0OK[DEBUG][66314][__cmd_send:123] ATSND:10 Bytes:AT+CGATT?[DEBUG][69359][__cmd_send:123] ATSND:10 Bytes:AT+CGATT?[DEBUG][70352][__resp_rcv:159] ATRCV:18 Bytes:+CGATT:1OK[DEBUG][70359][__resp_rcv:159] ATRCV:18 Bytes:+CGATT:1OK[DEBUG][86468][__cmd_send:123] ATSND:5 Bytes:ATE0[DEBUG][86477][__resp_rcv:159] ATRCV:6 Bytes:OK[DEBUG][86487][__cmd_send:123] ATSND:5 Bytes:ATE0[DEBUG][86496][__resp_rcv:159] ATRCV:6 Bytes:OK[DEBUG][86508][__cmd_send:123] ATSND:7 Bytes:AT+NRB[DEBUG][86523][__resp_rcv:159] ATRCV:13 Bytes:REBOOTING[DEBUG][91980][__resp_rcv:159] ATRCV:4 Bytes:![DEBUG][91985][__resp_rcv:159] ATRCV:4 Bytes:ÿ[DEBUG][91990][__resp_rcv:159] ATRCV:31 Bytes:Boot: UnsignedSecurity B..[DEBUG][91997][__resp_rcv:159] ATRCV:23 Bytes:VerifiedProtocol A..[DEBUG][92004][__resp_rcv:159] ATRCV:23 Bytes:VerifiedApps A......[DEBUG][92010][__resp_rcv:159] ATRCV:10 Bytes:Verified[DEBUG][92016][__resp_rcv:159] ATRCV:42 Bytes:REBOOT_CAUSE_APPLICATION_ATNeulOK
  • [技术干货] 小熊派开发板实践:智慧路灯沙箱实验之真实设备接入
    智慧路灯是城市智能化道路上重要一环,智慧路灯的实施具有节约公共照明能耗、减少因照明引起的交通事故等多种社会意义。路灯也是大家在日常生活中可以强烈感知到的公共设施,更易理解其智能化的场景。基于物理网解决方案,我们可以实现路灯的远程监控与控制,实现远程控制、按需照明等功能,降低路灯运行成本。体验《沙箱实验:基于IoT平台构建智慧路灯应用》实验后,有些小伙伴总觉得模拟器体验没有真实设备好,故小主尝试用小熊派开发板(E53_SC1、NB35)真实设备代替模拟器完成实验体验。其中,大部分操作步骤相同,本文仅列出需要修改及注意的地方。平台侧:1、创建产品:模拟器:协议类型为MQTT真实设备:协议类型为LwM2M/CoAP,且需要开发部署编解码插件。2、配置智慧路灯应用(注册设备):模拟器:设备标识可自定义,如123456789f。真实设备:设备标识填写为NB35通信模组IMEI,可使用串口工具+AT指令(AT+CGSN=1)查询获取设备IMEI。应用侧:1、编译构建智慧路灯应用:创建代码仓库后,需要修改部分代码适配真实设备。① 修改src/main/java/com/huawei/service/RegisterDirectConnectedDevice.java,添加如下代码。paramReg.put("device_name", deviceInfo.getVerifyCode()); ② 修改src/main/java/com/huawei/service/CreateDeviceCommand.java,变更及添加如下代码。 ③ 修改src/main/java/com/huawei/controller/PushReceiver.java,变更及添加如下代码。 2、完成如上修改,重新编译构建出包;再基于新构建的包重新部署路灯应用到ECS服务器。 设备侧: 1、资源准备: 模拟器:HubSimulator.jar 真实设备:小熊派开发板(E53_SC1、NB35) 2、真实设备需要端侧开发,代码编译、烧录。推荐IDE:VS Code+IoT Link插件 3、基于示例工程创建:oc_streetlight_template 4、修改Demos\oc_streetlight_template\oc_streetlight_template.c,填写对接的IoT平台的实际IP、端口。 #define cn_endpoint_id        "BearPi_0001" #define cn_app_server        "119.3.250.80" #define cn_app_port         "5683" 5、完成如上修改,编译烧录即可。 结果验证: 1、请将开发板拨码开关拨到AT+MCU侧,并通过USB连接PC上电,进行数据上报。 2、等待1-2分钟查看应用界面,页面应该显示“环境亮度”为设备上报数值,“灯状态”为toggle状态。 3、“路灯控制”选择“终端联控模式”,开关选择“开”,单击“设置”。 查看开发板路灯状态,灯应该点亮。 4、“路灯控制”选择“自动调光模式”,设置亮度阈值为100。 若此时设备上报的光感强度大于100,应用会自动下发关灯命令,指示路灯关闭。 用手遮住路灯扩展板上的光强传感器,使光强小于100,若路灯是关闭状态,则应用会下发开灯命令,指示路灯开启。 5、“路灯控制”选择“分段定时模式”,设置关灯时间段为06:00-18:30。 如果系统当前时间位于关灯时间段内,且路灯状态为开,应用会自动下发关灯命令,指示路灯关闭。 如果系统当前时间位于关灯时间段外,且路灯状态为关,应用会自动下发开灯命令,指示路灯开启。 综上,通过路灯开发板作为真实设备的接入体验即完成。
  • [问题求助] NB模组不能正常连接IoTDA了,是不是NB卡消息条数用完了?
    前几天测试的时候还能正常连接到华为云看到数据的,这两天打开开发板后串口信息走到AT+CGATT?这里就不动了,一直回复的是0,无法附着网络,然后无限循环。用sscom测试  信号质量+CSQ:99,99PING也PING不起了 不知道怎么回事。求大佬们看一下
  • [问题求助] 设备接入 IoTDA 在线状态不正常
    【功能模块】int ret = IOTA_Connect();   平台的状态显示在线Test_PropertiesReport();  调用该函数后,设备显示离线了,如果不调用该函数,一直在线。 平台能正常收到上报数据。使用的是官方的demo程序【截图信息】执行后,设置就离线了【日志信息】(可选,上传日志内容或者附件)
  • [技术干货] 【DevRun开发者沙龙华为云长沙站专场】10月24日线下沙龙-物联网AIoT课件分享
    【DevRun开发者沙龙华为云长沙站专场】10月24日线下沙龙-物联网AIoT课件分享资料分享,请大家按需下载~
  • [问题求助] 华为云FOTA升级
    FOTA升级群组无法找到设备查看资料说是需要定义Profile,完成omCapabilities,但是实际找不到这个配置地方,有哪位大神指导下具体流程
  • [最新动态] 【获奖公示,附带抽奖视频】【IoT畅学物联网】——设备接入服务(IoTDA)实践(发布实验截图和心得等有机会赢取丰厚奖品)
     一等奖1名:京东e卡200元                                二等奖2名:京东e卡100元              三等奖3名:京东e卡50元抽奖视频已经上传到附件一等奖获得者:截图贴第9楼   Mr Z 二等奖获得者:截图贴第17楼 walker0,第29楼eerlis 三等奖获得者:主贴第101*10%=10.1=10楼     small hole,101*50%=50.5=51楼     猪,你的鼻子很大,101*90%=90.9楼=91楼   macbook获奖用户请在9.10前发送邮件给(iotcooperation@huawei.com)这个邮箱,并说明:活动名称,活动链接,所获奖品,联系方式,最后提供华为云实名认证截图
总条数:623 到第
上滑加载中