/* Project: MQtt Client demo program without X-Server(connect to one micro broker) Compiler: BC++ 3.1, Turbo C++ 1.01(3.01) (free from http://cc.codegear.com/free/cpp) Compile mode: large Project: MQttX_1B.C ..\..\lib\7186el.lib ..\..\lib\tcp_dm32.lib ..\..\lib\MQtt_X.lib" Details: This demo shows how to use MQtt_X library in 7186. Step 1: Initiate the controller. Step 2: Initiate the Ethernet adapter. Step 3: Initiate MQtt client. Step 4: Connect MQtt client to miro broker(IP:192.168.1.91). Step 5: Subscribe Topic Step 6: It is a loop function which receive data published from other MQtt clients and publish its data to other MQtt clients. [Dec 3, 2009] by Wilson */ #include #include "..\lib\7186e.h" #include "..\lib\Tcpip32.h" #include "..\lib\MQtt_X.h" int main(void) { int i=0, iRet=0, iLength=0; unsigned long lStart_TimeTick; PUBPARMS pubParms; SUBPARMS subParms; MQISDPTI *pSendTaskParms; MQISDPTI *pRcvTaskParms; MQISDPTI *pApiTaskParms; char SDataBuf[1024]; long dataLength = 0; long topicLength = 0; char STopic[100]; char SData[100]; char *pBuffer=NULL; char PDataBuf[32]; int statusCode = 0; unsigned int iCntState=0; unsigned int iPubState=0; //Step1. Initiate the controller. InitLib(); InstallCom1(115200, 8, 0, 1); //Step2. Initiate the Ethernet adapter. iRet=Ethernet_Init(); if(iRet==NoError) printCom1("Inint Ethernet ok.\n\r"); else printCom1("Inint Ethernet error.\n\r"); //Step3. Initiate MQtt client. iRet = MQtt_Init(0); if(iRet!=0) { // Initial MQtt_X library error. printCom1("Initial MQtt_X library error.\n\r"); } else { // Initial MQtt_X library ok. printCom1("Initial MQtt_X library OK.\n\r"); } //Step4. Connect MQtt client to miro broker(IP:192.168.1.91). pubParms.port = 1883; subParms.port = 1888; sprintf(pubParms.pBroker,"%s","192.168.1.91"); sprintf(subParms.pBroker,"%s","192.168.1.91"); pubParms.qos = 1; subParms.qos = 1; pubParms.retain = 0; pubParms.debug = 0; subParms.debug = 0; //Last will settings sprintf(pubParms.lwtTopic,"%s","uPAC1/system/alive"); sprintf(subParms.lwtTopic,"%s","uPAC1/system/alive"); pubParms.lwtQos = 1; subParms.lwtQos = 1; pubParms.lwtRetain = 0; subParms.lwtRetain = 0; sprintf(pubParms.lwtData,"%s","help"); sprintf(subParms.lwtData,"%s","help"); pubParms.dataArg = 0; subParms.dataArg = 0; pubParms.lastSentMsg = MQISDP_INV_MSG_HANDLE; subParms.lastSentMsg = MQISDP_INV_MSG_HANDLE; subParms.timeout = 10; sprintf(pubParms.clientId,"%s","uPAC1"); iRet = MQtt_MQIsdpConnect(0, &pubParms, pApiTaskParms, 2, 5, 1); if(iRet!=0) { // MQtt_MQIsdpConnect error. printCom1("MQtt_MQIsdpConnect error.\n\r"); } else { // MQtt_MQIsdpConnect OK. printCom1("MQtt_MQIsdpConnect OK.\n\r"); } //Step5. Subscribe Topic. subParms.hConn = pubParms.hConn; subParms.qos = 1; subParms.timeout = 50; //Sub topic 1 sprintf(subParms.topic,"%s","uPAC101/XBoard/DO/ch0"); iRet = MQtt_MQIsdpSubscribe(0, &subParms ); if(iRet!=0) { // MQtt_MQIsdpSubscribe 1 error. printCom1("MQtt_MQIsdpSubscribe 1 error.\n\r"); } else { // MQtt_MQIsdpSubscribe 1 OK. printCom1("MQtt_MQIsdpSubscribe 1 OK.\n\r"); } //Sub topic 2 sprintf(subParms.topic,"%s","uPAC101/XBoard/DO/ch1"); iRet = MQtt_MQIsdpSubscribe(0, &subParms ); if(iRet!=0) { // MQtt_MQIsdpSubscribe 2 error. printCom1("MQtt_MQIsdpSubscribe 2 error.\n\r"); } else { // MQtt_MQIsdpSubscribe 2 OK. printCom1("MQtt_MQIsdpSubscribe 2 OK.\n\r"); } //Sub topic 3 sprintf(subParms.topic,"%s","uPAC101/XBoard/AO/ch0"); iRet = MQtt_MQIsdpSubscribe(0, &subParms ); if(iRet!=0) { // MQtt_MQIsdpSubscribe 3 error. printCom1("MQtt_MQIsdpSubscribe 3 error.\n\r"); } else { // MQtt_MQIsdpSubscribe 3 OK. printCom1("MQtt_MQIsdpSubscribe 3 OK.\n\r"); } //Sub topic 4 sprintf(subParms.topic,"%s","uPAC101/XBoard/AO/ch1"); iRet = MQtt_MQIsdpSubscribe(0, &subParms ); if(iRet!=0) { // MQtt_MQIsdpSubscribe 4 error. printCom1("MQtt_MQIsdpSubscribe 4 error.\n\r"); } else { // MQtt_MQIsdpSubscribe 4 OK. printCom1("MQtt_MQIsdpSubscribe 4 OK.\n\r"); } //Step6. Begin the loop function for(;;) { if((GetTimeTicks()-lStart_TimeTick)>50) { lStart_TimeTick=GetTimeTicks(); //Step6.1 Recieve Publish iRet = MQtt_MQIsdpRcvPub(0, &subParms, SDataBuf, &topicLength , &dataLength); switch ( iRet ) { case MQISDP_OK: strncpy(STopic,SDataBuf,topicLength); STopic[topicLength] = '\0'; strcpy(SData,SDataBuf+topicLength); printCom1("Topic:%s Data:%s\n\r",STopic,SData); break; case MQISDP_NO_PUBS_AVAILABLE: // Timed out // printCom1("MQISDP_NO_PUBS_AVAILABLE\n\r"); break; default: // Some other problem printCom1("Some other problem\n\r"); break; } //Step6.2 Publish pubParms.qos = 1; pubParms.retain = 0 ? 1: 0; iPubState = iPubState % 4; switch(iPubState) { case 0: //DI = 0 sprintf(PDataBuf,"%s","0"); sprintf(pubParms.topic,"%s","uPAC1/XBoard/DI/ch0"); break; case 1: //DI = 1 sprintf(PDataBuf,"%s","1"); sprintf(pubParms.topic,"%s","uPAC1/XBoard/DI/ch0"); break; case 2: //AI = 3.5 sprintf(PDataBuf,"%s","3.5"); sprintf(pubParms.topic,"%s","uPAC1/XBoard/AI/ch0"); break; case 3: //AI = -3.5 sprintf(PDataBuf,"%s","-3.5"); sprintf(pubParms.topic,"%s","uPAC1/XBoard/AI/ch0"); break; } pBuffer = PDataBuf; iRet = MQtt_MQIsdpPublish(0, &pubParms, pBuffer, strlen(pBuffer)); if(iRet!=0) { // MQtt_MQIsdpPublish error. printCom1("MQtt_MQIsdpPublish %d error.\n\r",iPubState); } else { // MQtt_MQIsdpPublish OK. // printCom1("MQtt_MQIsdpPublish %d OK.\n\r",iPubState); } iPubState++; if(iPubState >= 10000) iPubState = 0; statusCode = 0; if ( pubParms.lastSentMsg != MQISDP_INV_MSG_HANDLE) { while ( statusCode != MQISDP_DELIVERED && (iCntState < 50)) { iCntState++; statusCode = MQtt_MQIsdp_getMsgStatus(0, pubParms.hConn, pubParms.lastSentMsg ); if(statusCode == MQISDP_DELIVERED) { printCom1("statusCode = MQISDP_DELIVERED\n\r"); } else { printCom1("statusCode = %d(NOT MQISDP_DELIVERED)\n\r",statusCode); } } } iCntState = 0; } } }