图解连接阿里云(二)使用Paho-MQTT(支持FreeRTOS版本、Linux版本)连接1MQTT测试服务器 2阿里云物联网平台
前沿提要:
MQTT是什么不知道?
看这一篇:https://www.cnblogs.com/happybirthdaytoyou/p/10362336.html
阿里云官网玩不转?
看这一篇: https://www.cnblogs.com/happybirthdaytoyou/p/14065294.html
不会用代码连接阿里云?
看这一篇:https://www.cnblogs.com/happybirthdaytoyou/p/14074606.html
Paho-MQTT
前往下载 https://gitee.com/mirrors/paho.mqtt.embedded-c?_from=gitee_search
我当前使用版本:
链接:https://pan.baidu.com/s/1pkUyD2mcQlQQur2GZHryCw
提取码:kcpo
0. 简介
Paho嵌入式C工程提供了以下三个子项目:
- MQTTPacket: 这里提供MQTT数据包的序列化与反序列化,以及部分辅助函数。
- 它们是高级库的基础,但也可以单独使用。主要取决于您对网络的读写,大概意思就是如果你对MQTT源码很熟悉,你可以直接使用MQTTPacket的接口。
- MQTTClient: 封装MQTTPacket生成的高级别C++客户端程序。
- MQTTClient-C:封装MQTTPacket生成的高级别C客户端程序。
MQTTClient-C中包含:
├── CMakeLists.txt
├── samples
│ ├── CMakeLists.txt
│ ├── FreeRTOS
│ └── linux
├── src
│ ├── CMakeLists.txt
│ ├── FreeRTOS
│ ├── MQTTClient.c
│ ├── MQTTClient.h
│ ├── cc3200
│ └── linux
└── test
├── CMakeLists.txt
└── test1.c- samples目录提供FreeRTOS和linux两个例程,分别支持FreeRTOS和Linux系统。
- src目录提供MQTTClient的代码实现能力,以及用于移植到FreeRTOS、cc3200和Linux的网络驱动。
代码编译方法
mkdir mybuild
cd mybuild
cmake ..
make
添加两个源文件,然后修改CMakeLists.txt
修改后的CMakeLists.txt:
add_executable(
aiot_c_demo
aiot_c_demo.c
aiot_mqtt_sign.c
) target_link_libraries(aiot_c_demo paho-embed-mqtt3cc paho-embed-mqtt3c)
target_include_directories(aiot_c_demo PRIVATE "../../src" "../../src/linux")
target_compile_definitions(aiot_c_demo PRIVATE MQTTCLIENT_PLATFORM_HEADER=MQTTLinux.h)
1. 连接MQTT测试服务器
使用的测试服务器:
aiot_c_demo.c 这是你主要编写的代码,你可以参考我下面的
/**
这个例子是发布消息到MQTT测试服务器 test.mosquitto.org 上去。
我windows上的MQTT客户端软件订阅了该主题,所以可以收到这里发送的消息。
**/ #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "MQTTClient.h"
#include <unistd.h> #define ADDRESS "test.mosquitto.org" // MQTT Test Server For Free
#define PORT 1883
#define CLIENTID // 客户端ID const char *subTopic = "/publish/TEST/111";
const char *pubTopic = "/publish/TEST/000"; char clientId[150] = {0};
char username[65] = {0};
char password[65] = {0}; unsigned char sendbuf[1000];
unsigned char readbuf[1000]; void messageArrived(MessageData* md)
{
MQTTMessage* message = md->message; printf("\nIOT Cloud Message Arrived! \n");
printf("%.*s\n", md->topicName->lenstring.len, md->topicName->lenstring.data);
printf("%.*s\n\n", (int)message->payloadlen, (char*)message->payload);
} int main(int argc, char* argv[])
{
Network net;
MQTTClient client;
char *host = ADDRESS;
short port = PORT; /* network init and establish network */
NetworkInit(&net); int rc = NetworkConnect(&net, host, port);
if(!rc){
printf("\nNetworkConnect Success \n");
}
else{
printf("\nNetworkConnect ERR \n\n");
} /**************MQTT Client Init***************/
MQTTClientInit(&client, &net, 1000, sendbuf, sizeof(sendbuf), readbuf, sizeof(readbuf));
/* set the default message handler */
client.defaultMessageHandler = messageArrived; /**************MQTTConnect***************/
/* set mqtt connect parameter */
MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
data.willFlag = 0;
//data.MQTTVersion = 3; 版本号不要指定,要不然连接服务器(执行MQTTConnect时)会返回失败
data.clientID.cstring = clientId; //clientId;
data.username.cstring = username;
data.password.cstring = password;
data.keepAliveInterval = 60;
data.cleansession = 1;
printf("......Try to Connect to %s %d, ......\n", host, port); rc = MQTTConnect(&client, &data);
if(!rc)
printf("MQTTConnect %d, Connect MQTT IoT Cloud Success!\n", rc);
else
printf("MQTTConnect %d, Connect ERR!\n", rc); /**************MQTTSubscribe***************/
rc = MQTTSubscribe(&client, subTopic, 1, messageArrived);
if(!rc)
printf("MQTTSubscribe %d, MQTTSubscribe MQTT IoT Cloud Success!\n", rc);
else
printf("MQTTSubscribe %d, MQTTSubscribe ERR!\n", rc); /**************MQTTPublish***************/
#define mqttdata "hello mqtt" MQTTMessage msg = {
QOS1,
1, // retained .
0,
0, // id
mqttdata,
strlen(mqttdata),
};
msg.id++;
rc = MQTTPublish(&client, pubTopic, &msg);
if(!rc)
printf("MQTTPublish %d, id = %d MQTTPublish MQTT IoT Cloud Success! \n", rc, msg.id);
else
printf("MQTTPublish %d, MQTTPublish ERR!\n", rc); while(1){ MQTTYield(&client, 1000); // 在需要接收数据时, 都需要主动调用该函数
printf("---1s--- \n "); } return rc;
}
aiot_mqtt_sign.c 暂时为空文件即可, 连接阿里云时才会使用到。
先填好通信猫软件上的参数
注意,这里填写的发布和订阅的主题是和aiot_c_demo.c内的发布订阅的主题对应的。 MQTT,依靠主题来建立不同客户端的关联。
PS:通信猫软件下载地址
ubuntu内编译程序,准备运行
运行结果:
2. 连接阿里云物联网平台
这里会使用到aiot_mqtt_sign.c
aiot_mqtt_sign.c加上内容吧, 赋值黏贴拿去使用即可,这里面的代码可以不用关心,主要是提供一个计算密码的功能函数:
/*
* Copyright (C) 2015-2019 Alibaba Group Holding Limited
*/ #include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h> #define PRODUCTKEY_MAXLEN (20)
#define DEVICENAME_MAXLEN (32)
#define DEVICESECRET_MAXLEN (64) #define SIGN_SOURCE_MAXLEN (200)
#define CLIENTID_MAXLEN (150)
#define USERNAME_MAXLEN (64)
#define PASSWORD_MAXLEN (65) #define TIMESTAMP_VALUE "2524608000000"
#define MQTT_CLINETID_KV "|timestamp=2524608000000,_v=paho-c-1.0.0,securemode=3,signmethod=hmacsha256,lan=C|" static void utils_hmac_sha256(const uint8_t *msg, uint32_t msg_len, const uint8_t *key, uint32_t key_len, uint8_t output[32]); static void _hex2str(uint8_t *input, uint16_t input_len, char *output)
{
char *zEncode = "0123456789ABCDEF";
int i = 0, j = 0; for (i = 0; i < input_len; i++) {
output[j++] = zEncode[(input[i] >> 4) & 0xf];
output[j++] = zEncode[(input[i]) & 0xf];
}
} int aiotMqttSign(const char *productKey, const char *deviceName, const char *deviceSecret,
char clientId[150], char username[64], char password[65])
{
char deviceId[PRODUCTKEY_MAXLEN + DEVICENAME_MAXLEN + 2] = {0};
char macSrc[SIGN_SOURCE_MAXLEN] = {0};
uint8_t macRes[32] = {0};
int res; /* check parameters */
if (productKey == NULL || deviceName == NULL || deviceSecret == NULL ||
clientId == NULL || username == NULL || password == NULL) {
return -1;
}
if ((strlen(productKey) > PRODUCTKEY_MAXLEN) || (strlen(deviceName) > DEVICENAME_MAXLEN) ||
(strlen(deviceSecret) > DEVICESECRET_MAXLEN)) {
return -1;
} /* setup deviceId */
memcpy(deviceId, deviceName, strlen(deviceName));
memcpy(deviceId + strlen(deviceId), "&", strlen("&"));
memcpy(deviceId + strlen(deviceId), productKey, strlen(productKey)); /* setup clientid */
memcpy(clientId, deviceId, strlen(deviceId));
memcpy(clientId + strlen(deviceId), MQTT_CLINETID_KV, strlen(MQTT_CLINETID_KV));
memset(clientId + strlen(deviceId) + strlen(MQTT_CLINETID_KV), 0, 1); /* setup username */
memcpy(username, deviceId, strlen(deviceId));
memset(username + strlen(deviceId), 0, 1); /* setup password */
memcpy(macSrc, "clientId", strlen("clientId"));
memcpy(macSrc + strlen(macSrc), deviceId, strlen(deviceId));
memcpy(macSrc + strlen(macSrc), "deviceName", strlen("deviceName"));
memcpy(macSrc + strlen(macSrc), deviceName, strlen(deviceName));
memcpy(macSrc + strlen(macSrc), "productKey", strlen("productKey"));
memcpy(macSrc + strlen(macSrc), productKey, strlen(productKey));
memcpy(macSrc + strlen(macSrc), "timestamp", strlen("timestamp"));
memcpy(macSrc + strlen(macSrc), TIMESTAMP_VALUE, strlen(TIMESTAMP_VALUE)); utils_hmac_sha256((uint8_t *)macSrc, strlen(macSrc), (uint8_t *)deviceSecret,
strlen(deviceSecret), macRes); memset(password, 0, PASSWORD_MAXLEN);
_hex2str(macRes, sizeof(macRes), password);
return 0;
} /******************************
* hmac-sha256 implement below
******************************/
#define SHA256_KEY_IOPAD_SIZE (64)
#define SHA256_DIGEST_SIZE (32) /**
* \brief SHA-256 context structure
*/
typedef struct {
uint32_t total[2]; /*!< number of bytes processed */
uint32_t state[8]; /*!< intermediate digest state */
unsigned char buffer[64]; /*!< data block being processed */
int is224; /*!< 0 => SHA-256, else SHA-224 */
} iot_sha256_context; typedef union {
char sptr[8];
uint64_t lint;
} u_retLen; /*
* 32-bit integer manipulation macros (big endian)
*/
#ifndef GET_UINT32_BE
#define GET_UINT32_BE(n,b,i) \
do { \
(n) = ( (uint32_t) (b)[(i) ] << 24 ) \
| ( (uint32_t) (b)[(i) + 1] << 16 ) \
| ( (uint32_t) (b)[(i) + 2] << 8 ) \
| ( (uint32_t) (b)[(i) + 3] ); \
} while( 0 )
#endif #ifndef PUT_UINT32_BE
#define PUT_UINT32_BE(n,b,i) \
do { \
(b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
(b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
(b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
(b)[(i) + 3] = (unsigned char) ( (n) ); \
} while( 0 )
#endif static void utils_sha256_zeroize(void *v, uint32_t n)
{
volatile unsigned char *p = v;
while (n--) {
*p++ = 0;
}
} void utils_sha256_init(iot_sha256_context *ctx)
{
memset(ctx, 0, sizeof(iot_sha256_context));
} void utils_sha256_free(iot_sha256_context *ctx)
{
if (NULL == ctx) {
return;
} utils_sha256_zeroize(ctx, sizeof(iot_sha256_context));
} void utils_sha256_starts(iot_sha256_context *ctx)
{
int is224 = 0;
ctx->total[0] = 0;
ctx->total[1] = 0; if (is224 == 0) {
/* SHA-256 */
ctx->state[0] = 0x6A09E667;
ctx->state[1] = 0xBB67AE85;
ctx->state[2] = 0x3C6EF372;
ctx->state[3] = 0xA54FF53A;
ctx->state[4] = 0x510E527F;
ctx->state[5] = 0x9B05688C;
ctx->state[6] = 0x1F83D9AB;
ctx->state[7] = 0x5BE0CD19;
} ctx->is224 = is224;
} static const uint32_t K[] = {
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,
}; #define SHR(x,n) ((x & 0xFFFFFFFF) >> n)
#define ROTR(x,n) (SHR(x,n) | (x << (32 - n))) #define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^ SHR(x, 3))
#define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^ SHR(x,10)) #define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))
#define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25)) #define F0(x,y,z) ((x & y) | (z & (x | y)))
#define F1(x,y,z) (z ^ (x & (y ^ z))) #define R(t) \
( \
W[t] = S1(W[t - 2]) + W[t - 7] + \
S0(W[t - 15]) + W[t - 16] \
) #define P(a,b,c,d,e,f,g,h,x,K) \
{ \
temp1 = h + S3(e) + F1(e,f,g) + K + x; \
temp2 = S2(a) + F0(a,b,c); \
d += temp1; h = temp1 + temp2; \
} void utils_sha256_process(iot_sha256_context *ctx, const unsigned char data[64])
{
uint32_t temp1, temp2, W[64];
uint32_t A[8];
unsigned int i; for (i = 0; i < 8; i++) {
A[i] = ctx->state[i];
} for (i = 0; i < 64; i++) {
if (i < 16) {
GET_UINT32_BE(W[i], data, 4 * i);
} else {
R(i);
} P(A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i], K[i]); temp1 = A[7];
A[7] = A[6];
A[6] = A[5];
A[5] = A[4];
A[4] = A[3];
A[3] = A[2];
A[2] = A[1];
A[1] = A[0];
A[0] = temp1;
} for (i = 0; i < 8; i++) {
ctx->state[i] += A[i];
}
}
void utils_sha256_update(iot_sha256_context *ctx, const unsigned char *input, uint32_t ilen)
{
size_t fill;
uint32_t left; if (ilen == 0) {
return;
} left = ctx->total[0] & 0x3F;
fill = 64 - left; ctx->total[0] += (uint32_t) ilen;
ctx->total[0] &= 0xFFFFFFFF; if (ctx->total[0] < (uint32_t) ilen) {
ctx->total[1]++;
} if (left && ilen >= fill) {
memcpy((void *)(ctx->buffer + left), input, fill);
utils_sha256_process(ctx, ctx->buffer);
input += fill;
ilen -= fill;
left = 0;
} while (ilen >= 64) {
utils_sha256_process(ctx, input);
input += 64;
ilen -= 64;
} if (ilen > 0) {
memcpy((void *)(ctx->buffer + left), input, ilen);
}
} static const unsigned char sha256_padding[64] = {
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
}; void utils_sha256_finish(iot_sha256_context *ctx, uint8_t output[32])
{
uint32_t last, padn;
uint32_t high, low;
unsigned char msglen[8]; high = (ctx->total[0] >> 29)
| (ctx->total[1] << 3);
low = (ctx->total[0] << 3); PUT_UINT32_BE(high, msglen, 0);
PUT_UINT32_BE(low, msglen, 4); last = ctx->total[0] & 0x3F;
padn = (last < 56) ? (56 - last) : (120 - last); utils_sha256_update(ctx, sha256_padding, padn);
utils_sha256_update(ctx, msglen, 8); PUT_UINT32_BE(ctx->state[0], output, 0);
PUT_UINT32_BE(ctx->state[1], output, 4);
PUT_UINT32_BE(ctx->state[2], output, 8);
PUT_UINT32_BE(ctx->state[3], output, 12);
PUT_UINT32_BE(ctx->state[4], output, 16);
PUT_UINT32_BE(ctx->state[5], output, 20);
PUT_UINT32_BE(ctx->state[6], output, 24); if (ctx->is224 == 0) {
PUT_UINT32_BE(ctx->state[7], output, 28);
}
} void utils_sha256(const uint8_t *input, uint32_t ilen, uint8_t output[32])
{
iot_sha256_context ctx; utils_sha256_init(&ctx);
utils_sha256_starts(&ctx);
utils_sha256_update(&ctx, input, ilen);
utils_sha256_finish(&ctx, output);
utils_sha256_free(&ctx);
} static void utils_hmac_sha256(const uint8_t *msg, uint32_t msg_len, const uint8_t *key, uint32_t key_len, uint8_t output[32])
{
iot_sha256_context context;
uint8_t k_ipad[SHA256_KEY_IOPAD_SIZE]; /* inner padding - key XORd with ipad */
uint8_t k_opad[SHA256_KEY_IOPAD_SIZE]; /* outer padding - key XORd with opad */
int32_t i; if ((NULL == msg) || (NULL == key) || (NULL == output)) {
return;
} if (key_len > SHA256_KEY_IOPAD_SIZE) {
return;
} /* start out by storing key in pads */
memset(k_ipad, 0, sizeof(k_ipad));
memset(k_opad, 0, sizeof(k_opad));
memcpy(k_ipad, key, key_len);
memcpy(k_opad, key, key_len); /* XOR key with ipad and opad values */
for (i = 0; i < SHA256_KEY_IOPAD_SIZE; i++) {
k_ipad[i] ^= 0x36;
k_opad[i] ^= 0x5c;
} /* perform inner SHA */
utils_sha256_init(&context); /* init context for 1st pass */
utils_sha256_starts(&context); /* setup context for 1st pass */
utils_sha256_update(&context, k_ipad, SHA256_KEY_IOPAD_SIZE); /* start with inner pad */
utils_sha256_update(&context, msg, msg_len); /* then text of datagram */
utils_sha256_finish(&context, output); /* finish up 1st pass */ /* perform outer SHA */
utils_sha256_init(&context); /* init context for 2nd pass */
utils_sha256_starts(&context); /* setup context for 2nd pass */
utils_sha256_update(&context, k_opad, SHA256_KEY_IOPAD_SIZE); /* start with outer pad */
utils_sha256_update(&context, output, SHA256_DIGEST_SIZE); /* then results of 1st hash */
utils_sha256_finish(&context, output); /* finish up 2nd pass */
}
aiot_c_demo.c 这是你主要编写的代码,你可以参考我下面的
#include <stdio.h>
#include <memory.h>
#include "MQTTClient.h" #include <stdio.h>
#include <signal.h>
#include <sys/time.h> #define Aliyun #define EXAMPLE_PRODUCT_KEY "a11B0MP4tDp"
#define EXAMPLE_DEVICE_NAME "1st_device_mqttfx"
#define EXAMPLE_DEVICE_SECRET "04dfa2d5fe80a9d993e6c59d6523fe43" /* declare the external function aiotMqttSign() */
extern int aiotMqttSign(const char *productKey, const char *deviceName, const char *deviceSecret,
char clientId[150], char username[65], char password[65]); volatile int toStop = 0; void cfinish(int sig)
{
signal(SIGINT, NULL);
toStop = 1;
} /*-----------------------------------------------
printf("%*s", 10, s);
意思是输出字符串s,但至少占10个位置,不足的在字符串s左边补空格,这里等同于printf("%10s", s);
-----------------------------------------------*/
void messageArrived(MessageData* md)
{
MQTTMessage* message = md->message; printf("\nmessageArrived!! \n");
printf("%.*s\t", md->topicName->lenstring.len, md->topicName->lenstring.data);
printf("%.*s\n", (int)message->payloadlen, (char*)message->payload);
} /* main function */
int main(int argc, char** argv)
{
int rc = 0; /* setup the buffer, it must big enough for aliyun IoT platform */
unsigned char buf[1000];
unsigned char readbuf[1000]; Network n;
MQTTClient c; #ifdef Aliyun
char *host = EXAMPLE_PRODUCT_KEY".iot-as-mqtt.cn-shanghai.aliyuncs.com";
short port = 443; const char *subTopic = "/"EXAMPLE_PRODUCT_KEY"/"EXAMPLE_DEVICE_NAME"/service/property/set";
const char *pubTopic = "/sys/"EXAMPLE_PRODUCT_KEY"/"EXAMPLE_DEVICE_NAME"/thing/event/property/post"; #else char *host = "47.105.141.172"; // "test.mosquitto.org";
short port = 1883; const char *subTopic = "guest/talk"; // "/publish/TEST/111";
const char *pubTopic = "guest/talk"; // "/publish/TEST/000"; #endif /* invoke aiotMqttSign to generate mqtt connect parameters */
char clientId[150] = {0};
char username[65] = {0};
char password[65] = {0}; #ifdef Aliyun
if ((rc = aiotMqttSign(EXAMPLE_PRODUCT_KEY, EXAMPLE_DEVICE_NAME, EXAMPLE_DEVICE_SECRET, clientId, username, password) < 0)) {
printf("aiotMqttSign -%0x4x\n", -rc);
return -1;
}
printf("clientid: %s\n", clientId);
printf("username: %s\n", username);
printf("password: %s\n", password); #endif signal(SIGINT, cfinish);
signal(SIGTERM, cfinish); /* network init and establish network to aliyun IoT platform */
NetworkInit(&n);
rc = NetworkConnect(&n, host, port);
printf("NetworkConnect %d\n", rc); /* init mqtt client */
MQTTClientInit(&c, &n, 1000, buf, sizeof(buf), readbuf, sizeof(readbuf)); /* set the default message handler */
c.defaultMessageHandler = messageArrived; /* set mqtt connect parameter */
MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
data.willFlag = 0;
//data.MQTTVersion = 3; 版本号不要指定,要不然连接服务器(执行MQTTConnect时)会返回失败
data.clientID.cstring = clientId;
data.username.cstring = username;
data.password.cstring = password;
data.keepAliveInterval = 60;
data.cleansession = 1;
printf("Connecting to %s %d\n", host, port); rc = MQTTConnect(&c, &data);
if(!rc)
printf("MQTTConnect %d, Connect aliyun IoT Cloud Success!\n", rc); printf("Subscribing to %s\n", subTopic);
rc = MQTTSubscribe(&c, subTopic, 1, messageArrived);
printf("MQTTSubscribe %d\n", rc); int cnt = 0;
unsigned int msgid = 0; char mqttdata[] = {"{\"method\":\"thing.event.property.post\",\"id\":\"1371514638\",\"params\":{\"Humidity\":76},\"version\":\"1.0.0\"}"};
printf("mqttdata==> %s\n\n", mqttdata); while (!toStop)
{
// MQTT_Yield会block住timeout的时间去尝试接收数据,直到timeout才会退出
MQTTYield(&c, 1000); // 在需要接收数据时, 都需要主动调用该函数 if (++cnt % 20 == 0) { // every 5 seconds, will do this
MQTTMessage msg = {
QOS0,
1, // 0 ?
0,
0,
mqttdata,
strlen(mqttdata),
};
msg.id = ++msgid;
rc = MQTTPublish(&c, pubTopic, &msg);
printf("MQTTPublish %d, msgid %d\n", rc, msgid);
}
} printf("Stopping\n"); MQTTDisconnect(&c);
NetworkDisconnect(&n); return 0;
}
结果
.
图解连接阿里云(二)使用Paho-MQTT(支持FreeRTOS版本、Linux版本)连接1MQTT测试服务器 2阿里云物联网平台的更多相关文章
- Linux远程连接ssh工具(FinalShell)xshell替代神器
对对对 FinalShell SSH工具,服务器管理,远程桌面加速软件,支持Windows,macOS,Linux,版本2.9.8,更新时间2019.6.19 wntr 2017-01-17 11:0 ...
- 图解连接阿里云(一)创建阿里云物联网平台产品和设备,使用MQTT.fx快速体验
1. 打开 https://www.aliyun.com/ 注册账号 2.注册账号登录后点击控制台 3. 在下图1处输入物联网平台,会弹出2处所示物联网平台的入口,点击红色箭头所示处,进入物联网平 ...
- ESA2GJK1DH1K基础篇: 阿里云物联网平台: 测试MQTT连接阿里云物联网平台
前言 这节看一下在阿里云上实现MQTT通信是个怎样的流程 看了很多网上的教程,感觉讲的迷迷糊糊.... 其实感觉他们是对MQTT不够透彻,所以写的文章就是个比着葫芦画瓢的感觉 在我面前这东西就是玩具. ...
- 阿里云物联网平台: Android 连接阿里云物联网平台
说明 这节是是为下一节做铺垫的 只要是按照我提供的学习路线一节一节的认认真真学过来的,这节就十分的简单 有了前两节的基础,这节呢咱让Android 连接阿里云物联网平台 使用这节的代码 https: ...
- 阿里云服务器的购买、基本配置、(xshell)远程连接、搭建环境
一.服务器的购买 1.购买时间点:搞活动的时候.利用学生身份购买 (1)活动:想白嫖一台服务器 双十一,可以在双十一左右,时间提前一点,百度或B站,搜阿里云服务器.腾讯服务器(618可能也有) 一般, ...
- nrf9160 做modem—— 连接云(接入方式MQTT)
今天测试把nrf9160作为modem的例程Serial LTE Modem程序(后面简称slm),何为做modem,通俗来说就是将nrf9160作为无线模块,主控由其余MCU做,主控通过AT命令控制 ...
- EMQX+阿里云飞天洛神云网络 NLB:MQTT 消息亿级并发、千万级吞吐性能达成
随着物联网技术的发展与各行业数字化进程的推进,全球物联网设备连接规模与日俱增.一个可靠高效的物联网系统需要具备高并发.大吞吐.低时延的数据处理能力,支撑海量物联网数据的接入与分析,从而进一步挖掘数据价 ...
- 【小程序案例】支付宝小程序-MQTT模器,IoT设备通过WSS接入阿里云IoT物联网平台
支付宝小程序-MQTT模拟器通过WSS接入阿里云IoT物联网平台 小程序效果: 1. 准备工作 1.1 注册阿里云账号 开通阿里云账号,并通过支付宝实名认证 https://www.aliyun.co ...
- [IOT] 自制蓝牙工牌办公室定位系统 (一)—— 阿里物联网平台概览及打通端到云(硬核·干货)
目录:老少皆宜.超长干货文警告 1.快速入门创建产品 -- 小白,打包带走去吹牛 2.代码分析 -- 老炮,快速了解能用上 2.1 从start.sh分析开发环境如何自动构建 2.2 从sample. ...
- ESA2GJK1DH1K升级篇: 阿里云物联网平台 OTA: 关于阿里云物联网平台 OTA 的升级流程
前言 鉴于有些用户直接想使用现成的物联网平台实现 OTA 远程升级 我就写一写这系列的文章 注意:首先大家必须把我自建服务器是如何实现的看明白! 我看了下阿里云提供的,实际上流程和咱自建实现的差别不大 ...
随机推荐
- [oeasy]python0068_ 字体样式_正常_加亮_变暗_控制序列
字体样式 回忆上次内容 上次了解了一个新的转义模式 \33 逃逸控制字符 esc esc 让输出 退出标准输出流 进行控制信息的设置 可以清屏 也可以设置光标输出的位置 还能做什么呢? 可以设置字符的 ...
- 二分查找 | C++
以此题为例:P2249 [深基13.例1]查找 二分查找 对于一个单调不降的序列 \(S\),传统查找的复杂度是 \(O(|S|)\),即 \(O(n)\). 有时候序列 \(S\) 中的元素特别多, ...
- Day 4 - 搜索进阶与模拟
启发式搜索 下面将简要介绍启发式搜索及其用法. 定义 启发式搜索(英文:\(\text{heuristic search}\))是一种在普通搜索算法的基础上引入了启发式函数的搜索算法. 启发式函数的作 ...
- Python 按分类权重(区间)随机获取分类样本
按分类权重(区间)随机获取分类样本 By:授客 QQ:1033553122 开发环境 win 10 python 3.6.5 需求 活动抽奖,参与抽奖产品有iphone, 华为,小米,魅族,vivo, ...
- 关于SpringCloud Bus RemoteApplicationEvent 使用注意事项
最近使用SpringCloud Bus 用于服务直接消息通信,遇到一些问题,记录下来给一样碰到问题的你一个解决方案 开发环境 : springboot 2.3.9.RELEASE spring-clo ...
- 【MySQL】java.sql.SQLException: Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation '='
问题原因参考: http://t.zoukankan.com/zhulei2-p-13451554.html collations 排序规则 Illegal mix 非法混合 SQL报错指出,操作符等 ...
- 【ActiveJdbc】01 入门
官方快速上手文档: https://javalite.io/activejdbchttps://javalite.io/getting_started 完整介绍: https://javalite.i ...
- 计算机论文中的SD SE是什么 ?
Standard Deviation (SD) and Standard Error (SE): 标准差和标准误差:在统计学和数据分析中常用来描述数据的分布和估计值的精确性.SD 表示标准差,SE 表 ...
- IPython notebook(Jupyter notebook)指定IP和端口运行
1. 使用conda 安装 jupyter conda install jupyter 2. 在服务器端不打开浏览器,指定 端口, IP , 运行jupyter notebook 这里假设端口 ...
- 读博期间的宿舍 && 行李打包 —— 大连开发区校区
=============================================