-
华为云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想上传一张图片,可以实现吗?或者华为云什么服务,可以实现?谢谢
-
【功能模块】https://devstar.developer.huaweicloud.com/devstar/code-templates/203ffa0aeefa4de782479bcd71a3ad8a【操作步骤&问题现象】1、上述网页的 第8部分 提到—— 双击启动设备接入模拟器(HubSimulator.jar),切换到MQTT设备模拟器页签。2、问题,这个模拟器可以在win10中跑起来吗?好像不行。3、这个模拟器有win10版本吗【截图信息】【日志信息】(可选,上传日志内容或者附件)
-
【功能模块】【操作步骤&问题现象】1、huaweicloud-sdk-iotda包没有批量任务文件上传的接口 【截图信息】【日志信息】(可选,上传日志内容或者附件)
-
版本 3.0.34-rcIoTDAClient 没有【上传批量任务文件】的接口??
-
【功能模块】NB-IOT【操作步骤&问题现象】开始是购买的bearpi路灯demo无法正常运行,设备处于未激活状态,数据无法上报下发,就猜测是不是IP地址换了,PC上去ping设备接入中提供的几种协议的接入地址,发现除了COAP协议一直请求超时无回复以外,MQTT和HTTPS都是可以正常ping通。另外确认了COAP协议下的接入地址和端口是正确的【截图信息】
-
【功能模块】【操作步骤&问题现象】1、在物联网平台的控制台能看到最新的上报数据这时用MQTT.fx发送的消息2、但是在API Explorer中调试查询设备消息API的时候查询到的消息是一片空白希望能有大神解答这个问题,十分感谢!【截图信息】【日志信息】(可选,上传日志内容或者附件)
-
ABC平台有没有设备接入和管理的相关文档或者视频?
-
之前的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。 如果系统当前时间位于关灯时间段内,且路灯状态为开,应用会自动下发关灯命令,指示路灯关闭。 如果系统当前时间位于关灯时间段外,且路灯状态为关,应用会自动下发开灯命令,指示路灯开启。 综上,通过路灯开发板作为真实设备的接入体验即完成。
-
前几天测试的时候还能正常连接到华为云看到数据的,这两天打开开发板后串口信息走到AT+CGATT?这里就不动了,一直回复的是0,无法附着网络,然后无限循环。用sscom测试 信号质量+CSQ:99,99PING也PING不起了 不知道怎么回事。求大佬们看一下
-
【功能模块】int ret = IOTA_Connect(); 平台的状态显示在线Test_PropertiesReport(); 调用该函数后,设备显示离线了,如果不调用该函数,一直在线。 平台能正常收到上报数据。使用的是官方的demo程序【截图信息】执行后,设置就离线了【日志信息】(可选,上传日志内容或者附件)
-
【DevRun开发者沙龙华为云长沙站专场】10月24日线下沙龙-物联网AIoT课件分享资料分享,请大家按需下载~
-
FOTA升级群组无法找到设备查看资料说是需要定义Profile,完成omCapabilities,但是实际找不到这个配置地方,有哪位大神指导下具体流程
-
一等奖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)这个邮箱,并说明:活动名称,活动链接,所获奖品,联系方式,最后提供华为云实名认证截图
上滑加载中
推荐直播
-
全面解析华为云EI-API服务:理论基础与实践应用指南
2024/11/29 周五 18:20-20:20
Alex 华为云学堂技术讲师
本期直播给大家带来的是理论与实践结合的华为云EI-API的服务介绍。从“主要功能,应用场景,实践案例,调用流程”四个维度来深入解析“语音交互API,文字识别API,自然语言处理API,图像识别API及图像搜索API”五大场景下API服务,同时结合实验,来加深开发者对API服务理解。
回顾中 -
企业员工、应届毕业生、在读研究生共探项目实践
2024/12/02 周一 19:00-21:00
姚圣伟 在职软件工程师 昇腾社区优秀开发者 华为云云享专家 HCDG天津地区发起人
大神带你一键了解和掌握LeakyReLU自定义算子在ONNX网络中应用和优化技巧,在线分享如何入门,以及在工作中如何结合实际项目进行学习
即将直播 -
昇腾云服务ModelArts深度解析:理论基础与实践应用指南
2024/12/03 周二 14:30-16:30
Alex 华为云学堂技术讲师
如何快速创建和部署模型,管理全周期AI工作流呢?本期直播聚焦华为昇腾云服务ModelArts一站式AI开发平台功能介绍,同时结合基于ModelArts 的实践性实验,帮助开发者从理论到实验更好地理解和使用ModelArts。
去报名
热门标签