//Handler for all requests and responses from the server. This function routes the //right handlers void onMessage(MessageData* md) { //printf("onMessage\n"); if (md) { MQTTMessage* message = md->message; char *topic = malloc(md->topicName->lenstring.len + 1); sprintf(topic, "%.*s", md->topicName->lenstring.len, md->topicName->lenstring.data); printf("onMessage topic:%s\n",topic); if(!strcmp(topic,DMRESPONSE)){ messageResponse(md); } if (!strcmp(topic, dmUpdate)) { messageUpdate(md); } if (!strcmp(topic, dmObserve)) { messageObserve(md); } if (!strcmp(topic, dmCancel)) { messageCancel(md); } if (!strcmp(topic, dmReboot)) { messageForAction(md,1); } if (!strcmp(topic, dmFactoryReset)) { messageForAction(md,0); } if (!strcmp(topic, dmFirmwareDownload)) { messageFirmwareDownload(md); } if (!strcmp(topic, dmFirmwareUpdate)) { messageFirmwareUpdate(md); } free(topic); } }
void notify_message(struct sockaddr *from, int proto, u_char *msg, int len) { u_short *p = (u_short *) msg ; u_short msgid, flags ; MSGPTR pMsg ; #ifdef DEBUG char logbuf[256] ; #endif msgid = ntohs(p[0]) ; flags = ntohs(p[1]) ; #ifdef DEBUG if ((flags & 0x8000) == 0) { sprintf(logbuf, "Request %04x (%04x) from %s, %d bytes", msgid, flags, addrFmt(from, proto), len) ; } else { sprintf(logbuf, "Response %04x (%04x) from %s %d bytes", msgid, flags, addrFmt(from, proto), len) ; } TRACE("%s\n", logbuf) ; strcpy(logbuf, " ") ; switch ((flags & 0x7800) >> 11) { case 0 : strcat(logbuf, "QUERY ") ; break ; case 1 : strcat(logbuf, "IQUERY ") ; break ; case 2 : strcat(logbuf, "STATUS ") ; break ; default : strcat(logbuf, "UNKNOWN") ; break ; } if ((flags & 0x0400) != 0) { strcat(logbuf, ",AA") ; } if ((flags & 0x0200) != 0) { strcat(logbuf, ",TC") ; } if ((flags & 0x0100) != 0) { strcat(logbuf, ",RD") ; } if ((flags & 0x0080) != 0) { strcat(logbuf, ",RA") ; } switch (flags & 0x00f) { case 0 : strcat(logbuf, ",No Error ") ; break ; case 1 : strcat(logbuf, ",Format Error ") ; break ; case 2 : strcat(logbuf, ",Server Failure ") ; break ; case 3 : strcat(logbuf, ",Name Error ") ; break ; case 4 : strcat(logbuf, ",Not Implemented") ; break ; case 5 : strcat(logbuf, ",Refused ") ; break ; default : strcat(logbuf, ",Unknown Error ") ; break ; } TRACE("%s\n", logbuf) ; #endif if ((flags & 0x8000) == 0) { /* request from client */ if ((pMsg = searchReq(msgid, proto, from)) == NULL) { pMsg = createReq(msgid, proto, from) ; } if (pMsg == NULL) { WARN("notify_message - cannot create message record\n") ; return ; } messageForward(pMsg, msg, len) ; } else { /* response from server */ if ((pMsg = searchOrg(msgid, proto)) == NULL) { WARN("notify_message - no corresponding request\n") ; return ; } messageResponse(pMsg, msg, len) ; disposeReq(pMsg); } }