STM串口转tcp实现Mqtt客户端
来源:互联网 发布:oppo网络销售授权书 编辑:程序博客网 时间:2024/06/05 14:39
由于现存版本的mqtt代码都是针对嵌入式linux系统的,直接copy过来是不能使用的,必须对其中的动态数组定义顺序等问题进行处理,本例程定义topic最大长度为64,message最大长度为1024。本例程包含3个文件分别是emqtt.h
#ifndef __LIBEMQTT_H__#define __LIBEMQTT_H__#include <stdint.h>#include <string.h>#ifndef MQTT_CONF_USERNAME_LENGTH #define MQTT_CONF_USERNAME_LENGTH 13 // Recommended by MQTT Specification (12 + '\0')#endif#ifndef MQTT_CONF_PASSWORD_LENGTH #define MQTT_CONF_PASSWORD_LENGTH 13 // Recommended by MQTT Specification (12 + '\0')#endif#define MQTT_MSG_CONNECT 1<<4#define MQTT_MSG_CONNACK 2<<4#define MQTT_MSG_PUBLISH 3<<4#define MQTT_MSG_PUBACK 4<<4#define MQTT_MSG_PUBREC 5<<4#define MQTT_MSG_PUBREL 6<<4#define MQTT_MSG_PUBCOMP 7<<4#define MQTT_MSG_SUBSCRIBE 8<<4#define MQTT_MSG_SUBACK 9<<4#define MQTT_MSG_UNSUBSCRIBE 10<<4#define MQTT_MSG_UNSUBACK 11<<4#define MQTT_MSG_PINGREQ 12<<4#define MQTT_MSG_PINGRESP 13<<4#define MQTT_MSG_DISCONNECT 14<<4#define MQTTParseMessageType(buffer) ( *buffer & 0xF0 )#define MQTTParseMessageDuplicate(buffer) ( *buffer & 0x08 )#define MQTTParseMessageQos(buffer) ( (*buffer & 0x06) >> 1 )#define MQTTParseMessageRetain(buffer) ( *buffer & 0x01 )typedef struct { // Connection info char clientid[50]; // Auth fields char username[MQTT_CONF_USERNAME_LENGTH]; char password[MQTT_CONF_PASSWORD_LENGTH]; // Will topic uint8_t will_retain; uint8_t will_qos; uint8_t clean_session; // Management fields uint16_t seq; uint16_t alive;} mqtt_broker_handle_t;uint8_t mqtt_num_rem_len_bytes(const uint8_t* buf);uint16_t mqtt_parse_rem_len(const uint8_t* buf);uint16_t mqtt_parse_msg_id(const uint8_t* buf);uint16_t mqtt_parse_pub_topic(const uint8_t* buf, uint8_t* topic);uint16_t mqtt_parse_pub_topic_ptr(const uint8_t* buf, const uint8_t** topic_ptr);uint16_t mqtt_parse_publish_msg(const uint8_t* buf, uint8_t* msg);uint16_t mqtt_parse_pub_msg_ptr(const uint8_t* buf, const uint8_t** msg_ptr);/** Initialize the information to connect to the broker. * @param broker Data structure that contains the connection information with the broker. * @param clientid A string that identifies the client id. * * @note Only has effect before to call mqtt_connect */void mqtt_init(mqtt_broker_handle_t* broker, const char* clientid);/** Enable the authentication to connect to the broker. * @param broker Data structure that contains the connection information with the broker. * @param username A string that contains the username. * @param password A string that contains the password. * * @note Only has effect before to call mqtt_connect */void mqtt_init_auth(mqtt_broker_handle_t* broker, const char* username, const char* password);/** Set the keep alive timer. * @param broker Data structure that contains the connection information with the broker. * @param alive Keep aliver timer value (in seconds). * * @note Only has effect before to call mqtt_connect */void mqtt_set_alive(mqtt_broker_handle_t* broker, uint16_t alive);/** Connect to the broker. * @param broker Data structure that contains the connection information with the broker. * * @retval 1 On success. * @retval 0 On connection error. * @retval -1 On IO error. */int mqtt_connect(mqtt_broker_handle_t* broker);/** Disconnect to the broker. * @param broker Data structure that contains the connection information with the broker. * * @note The socket must also be closed. * * @retval 1 On success. * @retval 0 On connection error. * @retval -1 On IO error. */int mqtt_disconnect(mqtt_broker_handle_t* broker);/** Publish a message on a topic. This message will be published with 0 Qos level. * @param broker Data structure that contains the connection information with the broker. * @param topic The topic name. * @param msg The message. * @param retain Enable or disable the Retain flag (values: 0 or 1). * * @retval 1 On success. * @retval 0 On connection error. * @retval -1 On IO error. */int mqtt_publish(mqtt_broker_handle_t* broker, const char* topic, const char* msg, uint8_t retain);/** Publish a message on a topic. * @param broker Data structure that contains the connection information with the broker. * @param topic The topic name. * @param msg The message. * @param retain Enable or disable the Retain flag (values: 0 or 1). * @param qos Quality of Service (values: 0, 1 or 2) * @param message_id Variable that will store the Message ID, if the pointer is not NULL. * * @retval 1 On success. * @retval 0 On connection error. * @retval -1 On IO error. */int mqtt_publish_with_qos(mqtt_broker_handle_t* broker, const char* topic, const char* msg, uint8_t retain, uint8_t qos, uint16_t* message_id);/** Send a PUBREL message. It's used for PUBLISH message with 2 QoS level. * @param broker Data structure that contains the connection information with the broker. * @param message_id Message ID * * @retval 1 On success. * @retval 0 On connection error. * @retval -1 On IO error. */int mqtt_pubrel(mqtt_broker_handle_t* broker, uint16_t message_id);/** Subscribe to a topic. * @param broker Data structure that contains the connection information with the broker. * @param topic The topic name. * @param message_id Variable that will store the Message ID, if the pointer is not NULL. * * @retval 1 On success. * @retval 0 On connection error. * @retval -1 On IO error. */int mqtt_subscribe(mqtt_broker_handle_t* broker, const char* topic, uint16_t* message_id);/** Unsubscribe from a topic. * @param broker Data structure that contains the connection information with the broker. * @param topic The topic name. * @param message_id Variable that will store the Message ID, if the pointer is not NULL. * * @retval 1 On success. * @retval 0 On connection error. * @retval -1 On IO error. */int mqtt_unsubscribe(mqtt_broker_handle_t* broker, const char* topic, uint16_t* message_id);/** Make a ping. * @param broker Data structure that contains the connection information with the broker. * * @retval 1 On success. * @retval 0 On connection error. * @retval -1 On IO error. */int mqtt_ping();#endif
emqq.c
#include "emqtt.h" #include "usart4_wifi.h" #define MQTT_DUP_FLAG 1<<3 #define MQTT_QOS0_FLAG 0<<1 #define MQTT_QOS1_FLAG 1<<1 #define MQTT_QOS2_FLAG 2<<1 #define MQTT_RETAIN_FLAG 1 #define MQTT_CLEAN_SESSION 1<<1 #define MQTT_WILL_FLAG 1<<2 #define MQTT_WILL_RETAIN 1<<5 #define MQTT_USERNAME_FLAG 1<<7 #define MQTT_PASSWORD_FLAG 1<<6 #define TOPIC_MAX_LENGTH 64 #define MESSAGE_MAX_LENGTH 1024 //fixed_head×î´óΪ3 qossize×î´óΪ2 uint8_t mqtt_num_rem_len_bytes(const uint8_t* buf) { uint8_t num_bytes = 1; if ((buf[1] & 0x80) == 0x80) { num_bytes++; if ((buf[2] & 0x80) == 0x80) { num_bytes ++; if ((buf[3] & 0x80) == 0x80) { num_bytes ++; } } } return num_bytes; } uint16_t mqtt_parse_rem_len(const uint8_t* buf) { uint16_t multiplier = 1; uint16_t value = 0; uint8_t digit; buf++; do { digit = *buf; value += (digit & 127) * multiplier; multiplier *= 128; buf++; } while ((digit & 128) != 0); return value; } uint16_t mqtt_parse_msg_id(const uint8_t* buf) { uint8_t type = MQTTParseMessageType(buf); uint8_t qos = MQTTParseMessageQos(buf); uint16_t id = 0; uint8_t rlb; uint8_t offset; //printf("mqtt_parse_msg_id\n"); if(type >= MQTT_MSG_PUBLISH && type <= MQTT_MSG_UNSUBACK) { if(type == MQTT_MSG_PUBLISH) { if(qos != 0) { rlb = mqtt_num_rem_len_bytes(buf); offset = *(buf+1+rlb)<<8; // topic UTF MSB offset |= *(buf+1+rlb+1); // topic UTF LSB offset += (1+rlb+2); // fixed header + topic size id = *(buf+offset)<<8; // id MSB id |= *(buf+offset+1); // id LSB } } else { // fixed header length // 1 for "flags" byte + rlb for length bytes rlb = mqtt_num_rem_len_bytes(buf); id = *(buf+1+rlb)<<8; // id MSB id |= *(buf+1+rlb+1); // id LSB } } return id; } uint16_t mqtt_parse_pub_topic(const uint8_t* buf, uint8_t* topic) { const uint8_t* ptr; uint16_t topic_len = mqtt_parse_pub_topic_ptr(buf, &ptr); //printf("mqtt_parse_pub_topic\n"); if(topic_len != 0 && ptr != NULL) { memcpy(topic, ptr, topic_len); } return topic_len; } uint16_t mqtt_parse_pub_topic_ptr(const uint8_t* buf, const uint8_t **topic_ptr) { uint16_t len = 0; uint8_t rlb; //printf("mqtt_parse_pub_topic_ptr\n"); if(MQTTParseMessageType(buf) == MQTT_MSG_PUBLISH) { // fixed header length = 1 for "flags" byte + rlb for length bytes rlb = mqtt_num_rem_len_bytes(buf); len = *(buf+1+rlb)<<8; // MSB of topic UTF len |= *(buf+1+rlb+1); // LSB of topic UTF // start of topic = add 1 for "flags", rlb for remaining length, 2 for UTF *topic_ptr = (buf + (1+rlb+2)); } else { *topic_ptr = NULL; } return len; } uint16_t mqtt_parse_publish_msg(const uint8_t* buf, uint8_t* msg) { const uint8_t* ptr; //printf("mqtt_parse_publish_msg\n"); uint16_t msg_len = mqtt_parse_pub_msg_ptr(buf, &ptr); if(msg_len != 0 && ptr != NULL) { memcpy(msg, ptr, msg_len); } return msg_len; } uint16_t mqtt_parse_pub_msg_ptr(const uint8_t* buf, const uint8_t **msg_ptr) { uint16_t len = 0; uint8_t rlb; uint8_t offset; //printf("mqtt_parse_pub_msg_ptr\n"); if(MQTTParseMessageType(buf) == MQTT_MSG_PUBLISH) { // message starts at // fixed header length + Topic (UTF encoded) + msg id (if QoS>0) rlb = mqtt_num_rem_len_bytes(buf); offset = (*(buf+1+rlb))<<8; // topic UTF MSB offset |= *(buf+1+rlb+1); // topic UTF LSB offset += (1+rlb+2); // fixed header + topic size if(MQTTParseMessageQos(buf)) { offset += 2; // add two bytes of msg id } *msg_ptr = (buf + offset); // offset is now pointing to start of message // length of the message is remaining length - variable header // variable header is offset - fixed header // fixed header is 1 + rlb // so, lom = remlen - (offset - (1+rlb)) len = mqtt_parse_rem_len(buf) - (offset-(rlb+1)); } else { *msg_ptr = NULL; } return len; } void mqtt_init(mqtt_broker_handle_t* broker, const char* clientid) { // Connection options broker->alive = 300; // 300 seconds = 5 minutes broker->seq = 1; // Sequency for message indetifiers // Client options memset(broker->clientid, 0, sizeof(broker->clientid)); memset(broker->username, 0, sizeof(broker->username)); memset(broker->password, 0, sizeof(broker->password)); if(clientid) { strncpy(broker->clientid, clientid, sizeof(broker->clientid)); } else { strcpy(broker->clientid, "emqtt"); } // Will topic broker->clean_session = 1; } void mqtt_init_auth(mqtt_broker_handle_t* broker, const char* username, const char* password) { if(username && username[0] != '\0') strncpy(broker->username, username, sizeof(broker->username)-1); if(password && password[0] != '\0') strncpy(broker->password, password, sizeof(broker->password)-1); } void mqtt_set_alive(mqtt_broker_handle_t* broker, uint16_t alive) { broker->alive = alive; } int mqtt_connect(mqtt_broker_handle_t* broker) { uint8_t flags = 0x00; uint16_t clientidlen = strlen(broker->clientid); uint16_t usernamelen = strlen(broker->username); uint16_t passwordlen = strlen(broker->password); uint16_t payload_len = clientidlen + 2; // Variable header uint8_t var_header[] = { 0x00,0x06,0x4d,0x51,0x49,0x73,0x64,0x70, // Protocol name: MQIsdp 0x03, // Protocol version 0x00, // Connect flags 0x00, 0x00 // Keep alive }; // Fixed header uint8_t fixedHeaderSize = 2; // Default size = one byte Message Type + one byte Remaining Length uint8_t remainLen; //¶àÒ»¸ö×Ö½Ú·ÀÖ¹³öÏÖ²»¹»µÄÇé¿ö uint8_t fixed_header[3]; uint16_t offset = 0; //¶à200¸ö×Ö½Ú·ÀÖ¹³öÏÖ²»¹»µÄÇé¿ö uint8_t packet[sizeof(fixed_header)+sizeof(var_header)+200]; // Preparing the flags //²»ÉèÖÃÓû§ÃûºÍÃÜÂëÈ¥µôÁ½¸öif if(usernamelen) { payload_len += usernamelen + 2; flags |= MQTT_USERNAME_FLAG; } if(passwordlen) { payload_len += passwordlen + 2; flags |= MQTT_PASSWORD_FLAG; } //ÿ´Î¶¼³õʼ»¯ËùÒÔ´Ë´¦Ó¦¸ÃÊÇ1 if(broker->clean_session) { flags |= MQTT_CLEAN_SESSION; } //¸üжÔÓ¦µÄflags±ê־λ var_header[9] = flags; var_header[10] = broker->alive>>8; var_header[11] = broker->alive&0xFF; remainLen = sizeof(var_header)+payload_len; //¼Ù¶¨´Ë´¦²»»á³¬¹ý127¸ö×Ö·ûÔò±£ÁôfixedHeaderSize if (remainLen > 127) { fixedHeaderSize++; // add an additional byte for Remaining Length } // Message Type fixed_header[0] = MQTT_MSG_CONNECT; // Remaining Length if (remainLen <= 127) { fixed_header[1] = remainLen; } else { // first byte is remainder (mod) of 128, then set the MSB to indicate more bytes fixed_header[1] = remainLen % 128; fixed_header[1] = fixed_header[1] | 0x80; // second byte is number of 128s fixed_header[2] = remainLen / 128; } memset(packet, 0, sizeof(packet)); memcpy(packet, fixed_header, fixedHeaderSize); offset += fixedHeaderSize;//sizeof(fixed_header); memcpy(packet+offset, var_header, sizeof(var_header)); offset += sizeof(var_header); // Client ID - UTF encoded packet[offset++] = clientidlen>>8; packet[offset++] = clientidlen&0xFF; memcpy(packet+offset, broker->clientid, clientidlen); offset += clientidlen; if(usernamelen) { // Username - UTF encoded packet[offset++] = usernamelen>>8; packet[offset++] = usernamelen&0xFF; memcpy(packet+offset, broker->username, usernamelen); offset += usernamelen; } if(passwordlen) { // Password - UTF encoded packet[offset++] = passwordlen>>8; packet[offset++] = passwordlen&0xFF; memcpy(packet+offset, broker->password, passwordlen); offset += passwordlen; } //·¢ËÍÊý¾Ý°ü uart4SendChars(packet,offset); return 1; } int mqtt_ping() { uint8_t packet[] = { MQTT_MSG_PINGREQ, // Message Type, DUP flag, QoS level, Retain 0x00 // Remaining length }; //·¢ËÍpingÊý¾Ý°ü uart4SendChars(packet,sizeof(packet)); return 1; } int mqtt_publish_with_qos(mqtt_broker_handle_t* broker, const char* topic, const char* msg, uint8_t retain, uint8_t qos, uint16_t* message_id) { const uint16_t topiclen = strlen(topic); const uint16_t msglen = strlen(msg); uint8_t qos_flag = MQTT_QOS0_FLAG; uint8_t qos_size = 0; // No QoS included //½«Êý×é·ÖÅä³É×î´óÖµ topiclen×î´ó64 //msg ×î´ó1024 uint8_t var_header[TOPIC_MAX_LENGTH+2+2];//topiclen+2+qos_size uint8_t varHeaderSize; uint8_t fixedHeaderSize = 2; uint16_t remainLen; uint8_t fixed_header[3]; uint8_t packet[sizeof(fixed_header)+sizeof(var_header)+MESSAGE_MAX_LENGTH]; if(qos == 1) { qos_size = 2; // 2 bytes for QoS qos_flag = MQTT_QOS1_FLAG; } else if(qos == 2) { qos_size = 2; // 2 bytes for QoS qos_flag = MQTT_QOS2_FLAG; } varHeaderSize=topiclen+2+qos_size; // Variable header // Topic size (2 bytes), utf-encoded topic memset(var_header, 0, sizeof(var_header)); var_header[0] = topiclen>>8; var_header[1] = topiclen&0xFF; memcpy(var_header+2, topic, topiclen); if(qos_size) { var_header[topiclen+2] = broker->seq>>8; var_header[topiclen+3] = broker->seq&0xFF; if(message_id) { // Returning message id *message_id = broker->seq; } broker->seq++; } // Fixed header // the remaining length is one byte for messages up to 127 bytes, then two bytes after that // actually, it can be up to 4 bytes but I'm making the assumption the embedded device will only // need up to two bytes of length (handles up to 16,383 (almost 16k) sized message) // Default size = one byte Message Type + one byte Remaining Length remainLen = varHeaderSize+msglen;//sizeof(var_header) if (remainLen > 127) { fixedHeaderSize++; // add an additional byte for Remaining Length } // Message Type, DUP flag, QoS level, Retain fixed_header[0] = MQTT_MSG_PUBLISH | qos_flag; if(retain) { fixed_header[0] |= MQTT_RETAIN_FLAG; } // Remaining Length if (remainLen <= 127) { fixed_header[1] = remainLen; } else { // first byte is remainder (mod) of 128, then set the MSB to indicate more bytes fixed_header[1] = remainLen % 128; fixed_header[1] = fixed_header[1] | 0x80; // second byte is number of 128s fixed_header[2] = remainLen / 128; } memset(packet, 0, sizeof(packet)); memcpy(packet, fixed_header, fixedHeaderSize); memcpy(packet+fixedHeaderSize, var_header, varHeaderSize); memcpy(packet+fixedHeaderSize+varHeaderSize, msg, msglen); //·¢ËÍÊý¾Ý°ü uart4SendChars(packet,fixedHeaderSize+varHeaderSize+msglen); return 1; } int mqtt_publish(mqtt_broker_handle_t* broker, const char* topic, const char* msg, uint8_t retain) { return mqtt_publish_with_qos(broker, topic, msg, retain, 0, NULL); } int mqtt_pubrel(mqtt_broker_handle_t* broker, uint16_t message_id) { uint8_t packet[] = { MQTT_MSG_PUBREL | MQTT_QOS1_FLAG, // Message Type, DUP flag, QoS level, Retain 0x02, // Remaining length 0x00, 0x00 }; packet[2]=message_id>>8; packet[3]=message_id&0xFF; //·¢ËÍÊý¾Ý°ü uart4SendChars(packet,sizeof(packet)); return 1; } int mqtt_subscribe(mqtt_broker_handle_t* broker, const char* topic, uint16_t* message_id) { const uint16_t topiclen = strlen(topic); // Variable header uint8_t var_header[2]; // Message ID //topic ×î´ó64 Topic size (2 bytes), utf-encoded topic, QoS byte uint8_t utf_topic[TOPIC_MAX_LENGTH+3]; // Fixed header uint8_t fixed_header[] = { MQTT_MSG_SUBSCRIBE | MQTT_QOS1_FLAG, // Message Type, DUP flag, QoS level, Retain 0x00 }; // uint8_t packet[sizeof(var_header)+sizeof(fixed_header)+sizeof(utf_topic)]; var_header[0] = broker->seq>>8; var_header[1] = broker->seq&0xFF; if(message_id) { // Returning message id *message_id = broker->seq; } broker->seq++; // utf topic // Topic size (2 bytes), utf-encoded topic, QoS byte memset(utf_topic, 0, sizeof(utf_topic)); utf_topic[0] = topiclen>>8; utf_topic[1] = topiclen&0xFF; memcpy(utf_topic+2, topic, topiclen); //sizeof(var_header)+sizeof(utf_topic) fixed_header[1]=sizeof(var_header)+topiclen+3; memset(packet, 0, sizeof(packet)); memcpy(packet, fixed_header, sizeof(fixed_header)); memcpy(packet+sizeof(fixed_header), var_header, sizeof(var_header)); memcpy(packet+sizeof(fixed_header)+sizeof(var_header), utf_topic, topiclen+3); //·¢ËÍÊý¾Ý°ü uart4SendChars(packet,sizeof(fixed_header)+sizeof(var_header)+topiclen+3); return 1; } int mqtt_unsubscribe(mqtt_broker_handle_t* broker, const char* topic, uint16_t* message_id) { const uint16_t topiclen = strlen(topic); // Variable header uint8_t var_header[2]; // Message ID uint8_t utf_topic[TOPIC_MAX_LENGTH+2]; // Topic size (2 bytes), utf-encoded topic // Fixed header uint8_t fixed_header[] = { MQTT_MSG_UNSUBSCRIBE | MQTT_QOS1_FLAG, // Message Type, DUP flag, QoS level, Retain 0x00 }; uint8_t packet[sizeof(var_header)+sizeof(fixed_header)+sizeof(utf_topic)]; var_header[0] = broker->seq>>8; var_header[1] = broker->seq&0xFF; if(message_id) { // Returning message id *message_id = broker->seq; } broker->seq++; // utf topic memset(utf_topic, 0, sizeof(utf_topic)); utf_topic[0] = topiclen>>8; utf_topic[1] = topiclen&0xFF; memcpy(utf_topic+2, topic, topiclen); fixed_header[1]=sizeof(var_header)+topiclen+2; memset(packet, 0, sizeof(packet)); memcpy(packet, fixed_header, sizeof(fixed_header)); memcpy(packet+sizeof(fixed_header), var_header, sizeof(var_header)); memcpy(packet+sizeof(fixed_header)+sizeof(var_header), utf_topic, topiclen+2); //·¢ËÍÊý¾Ý°ü uart4SendChars(packet,sizeof(fixed_header)+sizeof(var_header)+topiclen+2); return 1; }
topmqtt.c
#include <stdio.h>#include "emqtt.h"#define RCVBUFSIZE 1024 uint8_t packet_buffer[RCVBUFSIZE]; int keepalive = 30; mqtt_broker_handle_t broker; int init_socket(mqtt_broker_handle_t* broker, const char* hostname, short port) { int flag = 1; keepalive = 3; //atÖ¸ÁîÁ¬½Óhostname port ·þÎñÆ÷ //¹Ø±ÕatÖ¸Áî mqtt_set_alive(broker,keepalive); return 0; } int read_packet(int timeout) { //µÈ´ýÉèÖÃʱ¼äÖ®ºó½«½ÓÊÕµ½µÄÊý¾Ý×ܳ¤¶È·µ»Ø //·µ»ØÊý¾Ý×ܳ¤¶È //½«½ÓÊÕµ½µÄÊý¾Ý·ÅÈëpacket_buffer£¬²¢·µ»Ø½ÓÊÕµ½µÄÊý¾Ý³¤¶È return 0;//packet_length; } int topmqtt() { int packet_length; uint16_t msg_id, msg_id_rcv; //×Ö·û´®±íʾ¸Ã²úÆ·µÄΨһ±êʶÂë mqtt_init(&broker, "avengalvon"); //ÉÏÊö²Ù×÷½ö½öÊǽ«Êý¾Ý¸´ÖƵ½½á¹¹ÌåÄÚ²¿ÏÂÃæ½øÐзþÎñÆ÷Á¬½Ó init_socket(&broker,"123.56.29.115", 1883); //·¢ËÍÁ¬½ÓÇëÇó mqtt_connect(&broker); //µÈ´ý¶ÁÈ¡Á¬½ÓÇëÇ󷵻ذü packet_length = read_packet(1); //ͨ¹ý½ÓÊÕµ½Êý¾Ý°ü³¤¶ÈÀ´ÅжÏÁ¬½ÓÊÇ·ñ³É¹¦ if(packet_length < 0) { printf("Error(%d) on read packet!\n", packet_length); return -1; } if(MQTTParseMessageType(packet_buffer) != MQTT_MSG_CONNACK) { printf("CONNACK expected!\n"); return -2; } if(packet_buffer[3] != 0x00) { printf("CONNACK failed!\n"); return -2; } //Á¬½Ó³É¹¦ºó ½øÐÐÊý¾Ý·¢²¼ ·¢²¼Ö÷ÌâΪ¡°hello¡ ± mqtt_publish(&broker, "hello", "Example: QoS 0", 0); //¸ù¾Ý»îԾʱ¼ä¶¨Ê±·¢ËÍmqtt_ping(); //¶©ÔÄÖ÷Ìâ mqtt_subscribe(&broker, "public/test/topic", &msg_id); //¶©Ôijɹ¦ÑéÖ¤ if(packet_length < 0) { printf("Error(%d) on read packet!\n", packet_length); return -1; } if(MQTTParseMessageType(packet_buffer) != MQTT_MSG_SUBACK) { printf("SUBACK expected!\n"); return -2; } msg_id_rcv = mqtt_parse_msg_id(packet_buffer); if(msg_id != msg_id_rcv) { printf("%d message id was expected, but %d message id was found!\n", msg_id, msg_id_rcv); return -3; } //µÈ´ýÊý¾Ý½ÓÊÕ while(1) { // <<<<< packet_length = read_packet(0); if(packet_length == -1) { printf("Error(%d) on read packet!\n", packet_length); return -1; } else if(packet_length > 0) { printf("Packet Header: 0x%x...\n", packet_buffer[0]); if(MQTTParseMessageType(packet_buffer) == MQTT_MSG_PUBLISH) { uint8_t topic[255], msg[1000]; uint16_t len; len = mqtt_parse_pub_topic(packet_buffer, topic); topic[len] = '\0'; // for printf len = mqtt_parse_publish_msg(packet_buffer, msg); msg[len] = '\0'; // for printf printf("%s %s\n", topic, msg); } } } }
0 0
- STM串口转tcp实现Mqtt客户端
- MQTT客户端推送实现
- Python MQTT客户端实现
- android4.0以上实现Mqtt客户端
- MQTT客户端--基于paho实现(Java)
- Eclipse paho实现的MQTT Java客户端
- stm篇--GPIO和串口
- STM 32 串口接收配置
- 客户端TCP实现简介
- Android TCP 客户端实现
- Android TCP 客户端实现
- netty实现tcp客户端
- mqtt协议实现安卓的推送客户端实现
- JS实现websocket+mqtt+ssl通信客户端实现
- gprs模块用TCP实现MQTT协议(基于SIM900A)
- STM中USART串口通讯:RS232,RS485
- STM 32 UART串口通信基本原理
- WinSock客户端服务端实现--TCP
- 分享我的书签
- log4j java.io.FileNotFoundException: log4j.dtd (No such file or directory)
- 完整java开发中JDBC连接数据库代码和步骤
- 修改linux文件权限命令:chmod
- Html的基础格式
- STM串口转tcp实现Mqtt客户端
- 系统提供的简便listview的使用方法
- 通过Java的反射机制实现对象的拷贝
- windows上获取“我的文档”目录
- ios frame、bound和center定义及使用场景总结
- SEL的使用
- 错误积累
- 编译libevent-2.1.6beta
- 浅谈JSON.stringfy语法