/** * @brief 向代理(服务器)发送一个消息 * @param pTopic 消息主题 * @param pMessage 消息内容 * @retval 小于0表示发送失败 */ int mqtt_publish(char *pTopic,char *pMessage) { int32_t len,rc; MQTTPacket_connectData data = MQTTPacket_connectData_initializer; unsigned char buf[200]; MQTTString topicString = MQTTString_initializer; int msglen = strlen(pMessage); int buflen = sizeof(buf); data.clientID.cstring = "me"; data.keepAliveInterval = 5; data.cleansession = 1; len = MQTTSerialize_connect(buf, buflen, &data); /* 1 */ topicString.cstring = pTopic; len += MQTTSerialize_publish(buf + len, buflen - len, 0, 0, 0, 0, topicString, (unsigned char*)pMessage, msglen); /* 2 */ len += MQTTSerialize_disconnect(buf + len, buflen - len); /* 3 */ transport_open(); rc = transport_sendPacketBuffer(buf,len); transport_close(); if (rc == len) printf("Successfully published\n\r"); else printf("Publish failed\n\r"); return 0; }
int MQTTConnect(Client* c, MQTTPacket_connectData* options) { // Timer connect_timer; int rc = FAILURE; MQTTPacket_connectData default_options = MQTTPacket_connectData_initializer; int len = 0; // InitTimer(&connect_timer); // countdown_ms(&connect_timer, c->command_timeout_ms); if (c->isconnected) // don't send connect packet again if we are already connected goto exit; if (options == 0) options = &default_options; // set default options if none were supplied c->keepAliveInterval = options->keepAliveInterval; // countdown(&c->ping_timer, c->keepAliveInterval); if ((len = MQTTSerialize_connect(c->buf, c->buf_size, options)) <= 0) goto exit; if ((rc = sendPacket_ev(c, len)) != SUCCESS) // send the connect packet goto exit; // there was a problem rc = SUCCESS; exit: return rc; }
int MQTTConnect (Client *c, MQTTPacket_connectData *options) { Timer connect_timer; int rc = FAILURE; int len = 0; MQTTPacket_connectData default_options = MQTTPacket_connectData_initializer; InitTimer (&connect_timer); countdown_ms (&connect_timer, c->command_timeout_ms); if (c->isconnected) // don't send connect packet again if we are already connected goto exit; if (options == 0) options = &default_options; // set default options if none were supplied c->keepAliveInterval = options->keepAliveInterval; countdown (&c->ping_timer, c->keepAliveInterval); //-------------------------------------------------------------------- // Generate a MQTT "Connect" packet, and send it to the remote Broker //-------------------------------------------------------------------- len = MQTTSerialize_connect (c->buf, c->buf_size, options); if (len <= 0) goto exit; // supplied buffer is too small rc = sendPacket (c, len, &connect_timer); // send the connect packet if (rc != SUCCESS) goto exit; // there was a problem //-------------------------------------------------------------------- // Wait for and read in the MQTT "ConnAck" reply packet. //-------------------------------------------------------------------- // this will be a blocking call, wait for the connack if (waitfor(c, CONNACK, &connect_timer) == CONNACK) { unsigned char connack_rc = 255; char sessionPresent = 0; if (MQTTDeserialize_connack((unsigned char*) &sessionPresent, &connack_rc, c->readbuf, c->readbuf_size) == 1) rc = connack_rc; else rc = FAILURE; } else rc = FAILURE; exit: if (rc == SUCCESS) c->isconnected = 1; return rc; }
int MQTTConnect(Client* c, MQTTPacket_connectData* options) { Timer connect_timer; int rc = FAILURE; MQTTPacket_connectData default_options = MQTTPacket_connectData_initializer; int len = 0; InitTimer(&connect_timer); countdown_ms(&connect_timer, c->command_timeout_ms); if (c->isconnected) // don't send connect packet again if we are already connected goto exit; if (options == 0) options = &default_options; // set default options if none were supplied c->keepAliveInterval = options->keepAliveInterval; countdown(&c->ping_timer, c->keepAliveInterval); if ((len = MQTTSerialize_connect(c->buf, c->buf_size, options)) <= 0) goto exit; if ((rc = sendPacket(c, len, &connect_timer)) != SUCCESS) // send the connect packet goto exit; // there was a problem // this will be a blocking call, wait for the connack if (waitfor(c, CONNACK, &connect_timer) == CONNACK) { unsigned char connack_rc = 255; char sessionPresent = 0; if (MQTTDeserialize_connack((unsigned char*)&sessionPresent, &connack_rc, c->readbuf, c->readbuf_size) == 1) rc = connack_rc; else rc = FAILURE; } else rc = FAILURE; exit: if (rc == SUCCESS) c->isconnected = 1; DeInitTimer(&connect_timer); //STM: added this line of code return rc; }
int MQTTConnect(MQTTClient* c, MQTTPacket_connectData* options) { Timer connect_timer; int rc = MQTT_FAILURE; MQTTPacket_connectData default_options = MQTTPacket_connectData_initializer; int len = 0; platform_mutex_lock(&c->mutex); if (c->isconnected) /* don't send connect packet again if we are already connected */ goto exit; platform_timer_init(&connect_timer); platform_timer_countdown(&connect_timer, c->command_timeout_ms); if (options == 0) options = &default_options; /* set default options if none were supplied */ c->ping_outstanding = 0; c->keepAliveInterval = options->keepAliveInterval; platform_timer_countdown(&c->ping_timer, c->keepAliveInterval*1000); if ((len = MQTTSerialize_connect(c->buf, c->buf_size, options)) <= 0) goto exit; if ((rc = sendPacket(c, len, &connect_timer)) != MQTT_SUCCESS) // send the connect packet goto exit; // there was a problem // this will be a blocking call, wait for the connack if (waitfor(c, CONNACK, &connect_timer) == CONNACK) { unsigned char connack_rc = 255; unsigned char sessionPresent = 0; if (MQTTDeserialize_connack(&sessionPresent, &connack_rc, c->readbuf, c->readbuf_size) == 1) rc = connack_rc; else rc = MQTT_FAILURE; } else rc = MQTT_FAILURE; exit: if (rc == MQTT_SUCCESS) c->isconnected = 1; platform_mutex_unlock(&c->mutex); return rc; }
int MQTTConnect(MQTTClient* c, MQTTPacket_connectData* options) { Timer connect_timer; int rc = FAILURE; MQTTPacket_connectData default_options = MQTTPacket_connectData_initializer; int len = 0; #if defined(MQTT_TASK) FreeRTOS_MutexLock(&c->mutex); #endif if (c->isconnected) /* don't send connect packet again if we are already connected */ goto exit; TimerInit(&connect_timer); TimerCountdownMS(&connect_timer, c->command_timeout_ms); if (options == 0) options = &default_options; /* set default options if none were supplied */ c->keepAliveInterval = options->keepAliveInterval; TimerCountdown(&c->ping_timer, c->keepAliveInterval); if ((len = MQTTSerialize_connect(c->buf, c->buf_size, options)) <= 0) goto exit; if ((rc = sendPacket(c, len, &connect_timer)) != SUCCESS) goto exit; // this will be a blocking call, wait for the connack if (waitfor(c, CONNACK, &connect_timer) == CONNACK) { unsigned char connack_rc = 255; unsigned char sessionPresent = 0; if (MQTTDeserialize_connack(&sessionPresent, &connack_rc, c->readbuf, c->readbuf_size) == 1) rc = connack_rc; else rc = FAILURE; } else rc = FAILURE; exit: if (rc == SUCCESS) c->isconnected = 1; #if defined(MQTT_TASK) FreeRTOS_MutexUnlock(&c->mutex); #endif return rc; }
static int mqttClient_sendConnect(mqttClient_t* clientData, MQTTPacket_connectData* connectData) { int rc = LE_OK; LE_ASSERT(clientData); LE_ASSERT(connectData); if (clientData->session.isConnected) { LE_WARN("already connected"); goto cleanup; } int len = MQTTSerialize_connect(clientData->session.tx.buf, sizeof(clientData->session.tx.buf), connectData); if (len <= 0) { LE_ERROR("MQTTSerialize_connect() failed(%d)", len); rc = len; goto cleanup; } LE_DEBUG("<--- CONNECT"); rc = mqttClient_write(clientData, len); if (rc) { LE_ERROR("mqttClient_write() failed(%d)", rc); goto cleanup; } rc = le_timer_Start(clientData->session.cmdTimer); if (rc) { LE_ERROR("le_timer_Start() failed(%d)", rc); goto cleanup; } cleanup: return rc; }
int mqtt_connect(mqtt_client_t *c, MQTTPacket_connectData *data) { int rc = -1; int len; len = MQTTSerialize_connect(c->wbuf, c->wbuflen, data); if (len <= 0) goto exit; rc = mqtt_write(c->sockfd, c->wbuf, len); if (rc < 0) goto exit; rc = MQTTPacket_read(c->rbuf, c->rbuflen, c->getfn); if (rc < 0) goto exit; if (rc == CONNACK) { unsigned char sessionPresent, connack_rc; if (MQTTDeserialize_connack(&sessionPresent, &connack_rc, c->rbuf, c->rbuflen) == 1) { rc = connack_rc; } else { rc = -1; } } else rc = -1; exit: return rc; }
/** * @brief 向服务器订阅一个消息,该函数会因为TCP接收数据函数而阻塞 * @param pTopic 消息主题,传入 * @param pMessage 消息内容,传出 * @retval 小于0表示订阅消息失败 */ int mqtt_subscrib(char *pTopic,char *pMessage) { MQTTPacket_connectData data = MQTTPacket_connectData_initializer; int rc = 0; unsigned char buf[200]; int buflen = sizeof(buf); int msgid = 1; MQTTString topicString = MQTTString_initializer; int req_qos = 0; int len = 0; rc = transport_open(); if(rc < 0){ printf("transport_open error\n\r"); return rc; } data.clientID.cstring = ""; data.keepAliveInterval = 5;//服务器保持连接时间,超过该时间后,服务器会主动断开连接,单位为秒 data.cleansession = 1; data.username.cstring = ""; data.password.cstring = ""; len = MQTTSerialize_connect(buf, buflen, &data); rc = transport_sendPacketBuffer(buf, len); if(rc != len){ printf("connect transport_sendPacketBuffer error\n\r"); goto exit; } /* wait for connack */ if (MQTTPacket_read(buf, buflen, transport_getdata) == CONNACK) { unsigned char sessionPresent, connack_rc; if (MQTTDeserialize_connack(&sessionPresent, &connack_rc, buf, buflen) != 1 || connack_rc != 0) { printf("Unable to connect, return code %d\n\r", connack_rc); goto exit; } }else{ printf("MQTTPacket_read error\n\r"); goto exit; } /* subscribe */ topicString.cstring = pTopic; len = MQTTSerialize_subscribe(buf, buflen, 0, msgid, 1, &topicString, &req_qos); rc = transport_sendPacketBuffer(buf, len); if(rc != len){ printf("connect transport_sendPacketBuffer error\n\r"); goto exit; } if (MQTTPacket_read(buf, buflen, transport_getdata) == SUBACK) /* wait for suback */ { unsigned short submsgid; int subcount; int granted_qos; rc = MQTTDeserialize_suback(&submsgid, 1, &subcount, &granted_qos, buf, buflen); if (granted_qos != 0) { printf("granted qos != 0, %d\n\r", granted_qos); goto exit; } } else goto exit; /* loop getting msgs on subscribed topic */ topicString.cstring = pTopic; memset(buf,0,buflen); //transport_getdata接收数据会阻塞,除非服务器断开连接后才返回 if (MQTTPacket_read(buf, buflen, transport_getdata) == PUBLISH){ unsigned char dup; int qos; unsigned char retained; unsigned short msgid; int payloadlen_in; unsigned char* payload_in; MQTTString receivedTopic; rc = MQTTDeserialize_publish(&dup, &qos, &retained, &msgid, &receivedTopic, &payload_in, &payloadlen_in, buf, buflen); printf("message arrived %d: %s\n\r", payloadlen_in, payload_in); strcpy(pMessage,(const char *)payload_in); } printf("disconnecting\n\r"); len = MQTTSerialize_disconnect(buf, buflen); rc = transport_sendPacketBuffer(buf, len); exit: transport_close(); return rc; }
int main() { MQTTPacket_connectData data = MQTTPacket_connectData_initializer; int rc = 0; char buf[200]; int buflen = sizeof(buf); int msgid = 1; MQTTString topicString = MQTTString_initializer; int req_qos = 0; char* payload = "mypayload"; int payloadlen = strlen(payload); int len = 0; signal(SIGINT, cfinish); signal(SIGTERM, cfinish); rc = Socket_new("127.0.0.1", 1883, &mysock); data.clientID.cstring = "me"; data.keepAliveInterval = 20; data.cleansession = 1; data.username.cstring = "testuser"; data.password.cstring = "testpassword"; struct timeval tv; tv.tv_sec = 1; /* 1 second Timeout */ tv.tv_usec = 0; setsockopt(mysock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv,sizeof(struct timeval)); len = MQTTSerialize_connect(buf, buflen, &data); rc = write(mysock, buf, len); /* wait for connack */ if (MQTTPacket_read(buf, buflen, getdata) == CONNACK) { int connack_rc; if (MQTTDeserialize_connack(&connack_rc, buf, buflen) != 1 || connack_rc != 0) { printf("Unable to connect, return code %d\n", connack_rc); goto exit; } } else goto exit; /* subscribe */ topicString.cstring = "substopic"; len = MQTTSerialize_subscribe(buf, buflen, 0, msgid, 1, &topicString, &req_qos); rc = write(mysock, buf, len); if (MQTTPacket_read(buf, buflen, getdata) == SUBACK) /* wait for suback */ { int submsgid; int subcount; int granted_qos; rc = MQTTDeserialize_suback(&submsgid, 1, &subcount, &granted_qos, buf, buflen); if (granted_qos != 0) { printf("granted qos != 0, %d\n", granted_qos); goto exit; } } else goto exit; topicString.cstring = "pubtopic"; while (!toStop) { if (MQTTPacket_read(buf, buflen, getdata) == PUBLISH) { int dup; int qos; int retained; int msgid; int payloadlen_in; char* payload_in; int rc; MQTTString receivedTopic; rc = MQTTDeserialize_publish(&dup, &qos, &retained, &msgid, &receivedTopic, &payload_in, &payloadlen_in, buf, buflen); printf("message arrived %.*s\n", payloadlen_in, payload_in); } printf("publishing reading\n"); len = MQTTSerialize_publish(buf, buflen, 0, 0, 0, 0, topicString, payload, payloadlen); rc = write(mysock, buf, len); } printf("disconnecting\n"); len = MQTTSerialize_disconnect(buf, buflen); rc = write(mysock, buf, len); exit: rc = shutdown(mysock, SHUT_WR); rc = recv(mysock, NULL, 0, 0); rc = close(mysock); return 0; }
int main(int argc, char *argv[]) { MQTTPacket_connectData data = MQTTPacket_connectData_initializer; int rc = 0; int mysock = 0; unsigned char buf[200]; int buflen = sizeof(buf); int msgid = 1; MQTTString topicString = MQTTString_initializer; int req_qos = 0; char* payload = "mypayload"; int payloadlen = strlen(payload); int len = 0; char *host = "m2m.eclipse.org"; int port = 1883; MQTTTransport mytransport; stop_init(); if (argc > 1) host = argv[1]; if (argc > 2) port = atoi(argv[2]); mysock = transport_open(host, port); if(mysock < 0) return mysock; printf("Sending to hostname %s port %d\n", host, port); mytransport.sck = &mysock; mytransport.getfn = transport_getdatanb; mytransport.state = 0; data.clientID.cstring = "me"; data.keepAliveInterval = 20; data.cleansession = 1; data.username.cstring = "testuser"; data.password.cstring = "testpassword"; len = MQTTSerialize_connect(buf, buflen, &data); rc = transport_sendPacketBuffer(mysock, buf, len); /* wait for connack */ if (MQTTPacket_read(buf, buflen, transport_getdata) == CONNACK) { unsigned char sessionPresent, connack_rc; if (MQTTDeserialize_connack(&sessionPresent, &connack_rc, buf, buflen) != 1 || connack_rc != 0) { printf("Unable to connect, return code %d\n", connack_rc); goto exit; } } else goto exit; /* subscribe */ topicString.cstring = "substopic"; len = MQTTSerialize_subscribe(buf, buflen, 0, msgid, 1, &topicString, &req_qos); rc = transport_sendPacketBuffer(mysock, buf, len); do { int frc; if ((frc=MQTTPacket_readnb(buf, buflen, &mytransport)) == SUBACK) /* wait for suback */ { unsigned short submsgid; int subcount; int granted_qos; rc = MQTTDeserialize_suback(&submsgid, 1, &subcount, &granted_qos, buf, buflen); if (granted_qos != 0) { printf("granted qos != 0, %d\n", granted_qos); goto exit; } break; } else if (frc == -1) goto exit; } while (1); /* handle timeouts here */ /* loop getting msgs on subscribed topic */ topicString.cstring = "pubtopic"; while (!toStop) { /* handle timeouts */ if (MQTTPacket_readnb(buf, buflen, &mytransport) == PUBLISH) { unsigned char dup; int qos; unsigned char retained; unsigned short msgid; int payloadlen_in; unsigned char* payload_in; int rc; MQTTString receivedTopic; rc = MQTTDeserialize_publish(&dup, &qos, &retained, &msgid, &receivedTopic, &payload_in, &payloadlen_in, buf, buflen); printf("message arrived %.*s\n", payloadlen_in, payload_in); printf("publishing reading\n"); len = MQTTSerialize_publish(buf, buflen, 0, 0, 0, 0, topicString, (unsigned char*)payload, payloadlen); rc = transport_sendPacketBuffer(mysock, buf, len); } } printf("disconnecting\n"); len = MQTTSerialize_disconnect(buf, buflen); rc = transport_sendPacketBuffer(mysock, buf, len); exit: transport_close(mysock); return 0; }
int main(int argc, char** argv) { if (argc < 6) { printf("Usage: mqtt_pub <host> <port> <client_id> <topic> <message>\n"); return 0; } /* parse arguments */ char* host = argv[1]; int port = atoi(argv[2]); char* clientid = argv[3]; char* topic = argv[4]; char* message = argv[5]; /* resolv broker ip address */ struct hostent *he; if((he = gethostbyname(host)) == NULL) { perror("hostname error\n"); return 1; } /* try to connect to the broker */ struct sockaddr_in sa; int sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); memset(&sa, 0, sizeof sa); sa.sin_family = AF_INET; sa.sin_port = htons(port); sa.sin_addr.s_addr = inet_addr(inet_ntoa(*((struct in_addr *)he->h_addr))); if (connect(sock, (struct sockaddr *) &sa, sizeof sa) < 0) { perror("error on connect\n"); close(sock); return 2; } else { /* initialize and load mqtt helpers */ MQTTString topicString = MQTTString_initializer; topicString.cstring = topic; MQTTPacket_connectData data = MQTTPacket_connectData_initializer; data.willFlag = 0; data.MQTTVersion = 3; data.clientID.cstring = clientid; data.keepAliveInterval = 20; data.cleansession = 1; /* prepare the message */ char buf[1024]; int buflen = sizeof (buf); int len = MQTTSerialize_connect(buf, buflen, &data); len += MQTTSerialize_publish(buf + len, buflen - len, 0, 0, 0, 0, topicString, message, strlen(message)); len += MQTTSerialize_disconnect(buf + len, buflen - len); /* send message */ int n = write(sock, buf, len); if (n < 0) { perror("error sending packet\n"); close(sock); return 2; } else { printf("%i byte(s) sent\n", n); } } /* close socket and exit */ close(sock); return 0; }
int MQTTConnectWithResults(MQTTClient *c, MQTTPacket_connectData *options, MQTTConnackData *data) { Timer connect_timer; int rc = FAILURE; MQTTPacket_connectData default_options = MQTTPacket_connectData_initializer; int len = 0; #if defined(MQTT_TASK) MutexLock(&c->mutex); #endif if (c->isconnected) { /* don't send connect packet again if we are already connected */ goto exit; } TimerInit(&connect_timer); TimerCountdownMS(&connect_timer, c->command_timeout_ms); if (options == 0) { options = &default_options; /* set default options if none were supplied */ } c->keepAliveInterval = options->keepAliveInterval; c->cleansession = options->cleansession; TimerCountdown(&c->last_received, c->keepAliveInterval); if ((len = MQTTSerialize_connect(c->buf, c->buf_size, options)) <= 0) { goto exit; } if ((rc = sendPacket(c, len, &connect_timer)) != SUCCESS) { // send the connect packet goto exit; // there was a problem } // this will be a blocking call, wait for the connack if (waitfor(c, CONNACK, &connect_timer) == CONNACK) { data->rc = 0; data->sessionPresent = 0; if (MQTTDeserialize_connack(&data->sessionPresent, &data->rc, c->readbuf, c->readbuf_size) == 1) { rc = data->rc; } else { rc = FAILURE; } } else { rc = FAILURE; } exit: if (rc == SUCCESS) { c->isconnected = 1; c->ping_outstanding = 0; } #if defined(MQTT_TASK) MutexUnlock(&c->mutex); #endif return rc; }
int main(int argc, char *argv[]) { /******MQTT*******/ MQTTPacket_connectData data = MQTTPacket_connectData_initializer; int rc = 0; char buf[200]; int buflen = sizeof(buf); int mysock = 0; MQTTString topicString = MQTTString_initializer; char* payload = "mypayload"; int payloadlen = strlen(payload); int len = 0; char *host = "192.168.8.241"; int port = 1883; /******UART*******/ int fd = FALSE; int ret; char rcv_buf[512]; int i; if(argc < 2){ printf("Usage: %s /dev/ttySn \n",argv[0]); return FALSE; } if (argc > 2) host = argv[2]; if (argc > 3) port = atoi(argv[3]); fd = UART_Open(fd,argv[1]); if(FALSE == fd){ printf("open error\n"); exit(1); } ret = UART_Init(fd,9600,0,8,1,'N'); if (FALSE == fd){ printf("Set Port Error\n"); exit(1); } ret = UART_Send(fd,"*IDN?\n",6); if(FALSE == ret){ printf("write error!\n"); exit(1); } printf("command: %s\n","*IDN?"); memset(rcv_buf,0,sizeof(rcv_buf)); /**************MQTT tansport*************/ mysock = transport_open(host,port); if(mysock < 0) return mysock; printf("Sending to hostname %s port %d\n", host, port); data.clientID.cstring = "me"; data.keepAliveInterval = 20; data.cleansession = 1; data.username.cstring = "testuser"; data.password.cstring = "testpassword"; data.MQTTVersion = 4; for(i=0;;i++) { ret = UART_Recv(fd, rcv_buf,512); if(ret > 0) { rcv_buf[ret]='\0'; printf("%s",rcv_buf); len = MQTTSerialize_connect((unsigned char *)buf, buflen, &data); topicString.cstring = "mytopic"; len += MQTTSerialize_publish((unsigned char *)(buf + len), buflen - len, 0, 0, 0, 0, topicString, (unsigned char *)rcv_buf, ret+1); len += MQTTSerialize_disconnect((unsigned char *)(buf + len), buflen - len); rc = transport_sendPacketBuffer(mysock, buf, len); if (rc == len) printf("Successfully published\n"); else printf("Publish failed\n"); } else { printf("cannot receive data1\n"); break; } } exit: UART_Close(fd); transport_close(mysock); return 0; }