#ifdef HAVE_CONFIG_H # include #endif #include "aqhome/msg/msg_ping.h" #include "aqhome/ipc/nodes/msg_ipc_ping.h" #include "aqhome/ipc/nodes/msg_ipc_forward.h" #include "aqhome/ipc/nodes/msg_ipc_setaccmsggrps.h" #include "aqhome/mqtt/endpoint_mqttc.h" #include "aqhome/mqtt/msg_mqtt_connect.h" #include "aqhome/mqtt/msg_mqtt_connack.h" #include "aqhome/mqtt/msg_mqtt_publish.h" #include "aqhome/mqtt/msg_mqtt_pubresponse.h" #include "aqhome/mqtt/msg_mqtt_subscribe.h" #include "aqhome/mqtt/msg_mqtt_suback.h" #include "aqhome/hexfile/hexfile.h" #include "aqhome/hexfile/flashrecord.h" #include "aqhome/aqhome.h" #include #include #include #include #include #include #include #include #include static int _mqttConnect2(GWEN_MSG_ENDPOINT *epClient); static GWEN_MSG *_awaitPacket2(GWEN_MSG_ENDPOINT *epClient, uint8_t expectedPacketType); GWEN_MSG *createPingMsg(uint8_t destAddr, uint8_t srcAddr) { GWEN_MSG *msg; int rv; msg=GWEN_Msg_new(AQH_MAXMSGSIZE); rv=GWEN_Msg_AddByte(msg, destAddr); if (rv<0) { fprintf(stderr, "ERROR1: %d\n", rv); GWEN_Msg_free(msg); return NULL; } rv=GWEN_Msg_AddByte(msg, 6); /* msglen */ if (rv<0) { fprintf(stderr, "ERROR2: %d\n", rv); GWEN_Msg_free(msg); return NULL; } rv=GWEN_Msg_AddByte(msg, AQH_MSG_TYPE_PING); /* ping */ if (rv<0) { fprintf(stderr, "ERROR3: %d\n", rv); GWEN_Msg_free(msg); return NULL; } rv=GWEN_Msg_AddByte(msg, srcAddr); /* src addr */ if (rv<0) { fprintf(stderr, "ERROR4: %d\n", rv); GWEN_Msg_free(msg); return NULL; } rv=GWEN_Msg_AddByte(msg, 0); /* timestamp */ if (rv<0) { fprintf(stderr, "ERROR5: %d\n", rv); GWEN_Msg_free(msg); return NULL; } rv=GWEN_Msg_AddByte(msg, 0); /* timestamp */ if (rv<0) { fprintf(stderr, "ERROR6: %d\n", rv); GWEN_Msg_free(msg); return NULL; } rv=GWEN_Msg_AddByte(msg, 0); /* timestamp */ if (rv<0) { fprintf(stderr, "ERROR7: %d\n", rv); GWEN_Msg_free(msg); return NULL; } rv=GWEN_Msg_AddByte(msg, 0); /* timestamp */ if (rv<0) { fprintf(stderr, "ERROR8: %d\n", rv); GWEN_Msg_free(msg); return NULL; } rv=AQH_NodeMsg_AddChecksum(msg); if (rv<0) { fprintf(stderr, "ERROR9: %d\n", rv); GWEN_Msg_free(msg); return NULL; } return msg; } int testMqttConnection2() { GWEN_MSG_ENDPOINT *epClient; int loop; AQH_Init(); epClient=AQH_MqttClientEndpoint_new("TESTCLIENT1234", "127.0.0.1", 1883, NULL, 1); for (loop=0;; loop++) { DBG_INFO(GWEN_LOGDOMAIN, "Loop %d:", loop); GWEN_MsgEndpoint_IoLoop(epClient, 2000); /* 2000 ms */ if (GWEN_MsgEndpoint_GetState(epClient)==GWEN_MSG_ENDPOINT_STATE_CONNECTED) { DBG_INFO(AQH_LOGDOMAIN, "Connected."); break; } } return 0; } int testMqttSubscribe2(int argc, char **argv) { GWEN_MSG_ENDPOINT *epClient; int rv; GWEN_MSG *msgOut; GWEN_MSG *msgIn; uint16_t pckId; const char *host="127.0.0.1"; AQH_Init(); if (argc>1) host=argv[1]; DBG_ERROR(AQH_LOGDOMAIN, "Connecting to %s (%s)", host, argv[1]); epClient=AQH_MqttClientEndpoint_new("TESTCLIENT1234", host, 1883, NULL, 1); rv=_mqttConnect2(epClient); if (rv<0) { DBG_INFO(AQH_LOGDOMAIN, "here (%d)", rv); return 2; } pckId=AQH_MqttClientEndpoint_GetNextPacketId(epClient); //msgOut=AQH_PublishMqttMsg_new(AQH_MQTTMSG_FLAGS_QOS1, 1, "test/subject1", (const uint8_t*) "29.9", 4); //msgOut=GWEN_SubscribeMqttMsg_new(AQH_MQTTMSG_MSGTYPE_SUBSCRIBE, pckId, "aqhome/#", 0); msgOut=GWEN_SubscribeMqttMsg_new(AQH_MQTTMSG_MSGTYPE_SUBSCRIBE, pckId, "#", 0); if (msgOut==NULL) { DBG_ERROR(NULL, "Error creating message"); return 2; } GWEN_MsgEndpoint_AddSendMessage(epClient, msgOut); msgIn=_awaitPacket2(epClient, AQH_MQTTMSG_MSGTYPE_SUBACK); if (msgIn) { GWEN_BUFFER *buf; buf=GWEN_Buffer_new(0, 256, 0, 1); AQH_SubAckMqttMsg_DumpToBuffer(msgIn, buf, "received"); fprintf(stdout, "%s\n", GWEN_Buffer_GetStart(buf)); GWEN_Buffer_free(buf); GWEN_Msg_free(msgIn); } for (;;) { GWEN_MSG *msg; GWEN_MsgEndpoint_IoLoop(epClient, 2000); /* 2000 ms */ msg=GWEN_MsgEndpoint_TakeFirstReceivedMessage(epClient); if (msg) { if ((AQH_MqttMsg_GetMsgTypeAndFlags(msg) & 0xf0)==(AQH_MQTTMSG_MSGTYPE_PUBLISH & 0xf0)) { GWEN_BUFFER *buf; buf=GWEN_Buffer_new(0, 256, 0, 1); AQH_PublishMqttMsg_DumpToBuffer(msg, buf, "received"); fprintf(stdout, "%s\n", GWEN_Buffer_GetStart(buf)); GWEN_Buffer_free(buf); } else { DBG_ERROR(NULL, "Received this message:"); GWEN_Text_DumpString((const char*) GWEN_Msg_GetConstBuffer(msg), GWEN_Msg_GetBytesInBuffer(msg), 2); } GWEN_Msg_free(msg); } } return 0; } int testMqttSubscribe3(int argc, char **argv) { GWEN_MSG_ENDPOINT *epClient; int rv; //const char *host="127.0.0.1"; const char *host="192.168.117.192"; AQH_Init(); if (argc>1) host=argv[1]; DBG_ERROR(AQH_LOGDOMAIN, "Connecting to %s (%s)", host, argv[1]); epClient=AQH_MqttClientEndpoint_new("TESTCLIENT1234", host, 1883, NULL, 1); GWEN_MsgEndpoint_AddFlags(epClient, AQH_ENDPOINT2_MQTTCLIENT_FLAGS_SUBSCRIBEALL); rv=GWEN_MultilayerEndpoint_StartConnect(epClient); if (rv<0 && rv!=GWEN_ERROR_IN_PROGRESS) { DBG_ERROR(NULL, "Error on startConnect: %d", rv); return 2; } for (;;) { GWEN_MSG *msg; GWEN_MsgEndpoint_IoLoop(epClient, 2000); /* 2000 ms */ msg=GWEN_MsgEndpoint_TakeFirstReceivedMessage(epClient); if (msg) { if ((AQH_MqttMsg_GetMsgTypeAndFlags(msg) & 0xf0)==(AQH_MQTTMSG_MSGTYPE_PUBLISH & 0xf0)) { GWEN_BUFFER *buf; buf=GWEN_Buffer_new(0, 256, 0, 1); AQH_PublishMqttMsg_DumpToBuffer(msg, buf, "received"); fprintf(stdout, "%s\n", GWEN_Buffer_GetStart(buf)); GWEN_Buffer_free(buf); } else { DBG_ERROR(NULL, "Received this message:"); GWEN_Text_DumpString((const char*) GWEN_Msg_GetConstBuffer(msg), GWEN_Msg_GetBytesInBuffer(msg), 2); } GWEN_Msg_free(msg); } } return 0; } int _mqttConnect2(GWEN_MSG_ENDPOINT *epClient) { int loop; for (loop=0;; loop++) { DBG_INFO(GWEN_LOGDOMAIN, "Loop %d:", loop); GWEN_MsgEndpoint_IoLoop(epClient, 2000); /* 2000 ms */ if (GWEN_MsgEndpoint_GetState(epClient)==GWEN_MSG_ENDPOINT_STATE_CONNECTED) { DBG_INFO(AQH_LOGDOMAIN, "Connected."); break; } else if (GWEN_MsgEndpoint_GetState(epClient)==GWEN_MSG_ENDPOINT_STATE_UNCONNECTED) { DBG_INFO(AQH_LOGDOMAIN, "Disconnected."); return GWEN_ERROR_IO; } } return 0; } GWEN_MSG *_awaitPacket2(GWEN_MSG_ENDPOINT *epClient, uint8_t expectedPacketType) { fprintf(stdout, "Waiting for response\n"); for (;;) { GWEN_MSG *msg; DBG_DEBUG(AQH_LOGDOMAIN, "Next loop"); GWEN_MsgEndpoint_IoLoop(epClient, 2000); /* 2000 ms */ msg=GWEN_MsgEndpoint_TakeFirstReceivedMessage(epClient); if (msg) { if ((AQH_MqttMsg_GetMsgTypeAndFlags(msg) & 0xf0)==(expectedPacketType & 0xf0)) { return msg; } else { DBG_ERROR(NULL, "Received this message:"); GWEN_Text_DumpString((const char*) GWEN_Msg_GetConstBuffer(msg), GWEN_Msg_GetBytesInBuffer(msg), 2); } } } /* for */ return NULL; } #if 0 GWEN_MSG_ENDPOINT *_acceptHttpConnection(GWEN_UNUSED GWEN_MSG_ENDPOINT *ep, GWEN_SOCKET *sk, GWEN_UNUSED const GWEN_INETADDRESS *addr, GWEN_UNUSED void *data) { GWEN_MSG_ENDPOINT *epIncoming; DBG_INFO(GWEN_LOGDOMAIN, "Incoming connection"); //epIncoming=GWEN_IpcEndpoint_CreateIpcTcpServiceForSocket(sk, NULL, 1); epIncoming=GWEN_MsgEndpoint_new("HTTP-Service", 0); GWEN_MsgEndpoint_SetSocket(epIncoming, sk); GWEN_MsgIoEndpoint_Extend(epIncoming); AQH_HttpEndpoint_Extend(epIncoming, AQH_ENDPOINT_HTTP_FLAGS_PASSIVE); return epIncoming; } int testHttpDaemon() { GWEN_MSG_ENDPOINT *epServer; int loop; AQH_Init(); epServer=GWEN_TcpdEndpoint_new("127.0.0.1", 55556, NULL, 1); GWEN_TcpdEndpoint_SetAcceptFn(epServer, _acceptHttpConnection, NULL); for (loop=0;; loop++) { GWEN_MSG_ENDPOINT *ep; DBG_INFO(GWEN_LOGDOMAIN, "Loop %d:", loop); GWEN_MsgEndpoint_IoLoop(epServer, 2000); /* 2000 ms */ ep=GWEN_MsgEndpoint_Tree2_GetFirstChild(epServer); while(ep) { GWEN_MSG *msg; DBG_INFO(GWEN_LOGDOMAIN, "- Checking endpoint"); while( (msg=GWEN_MsgEndpoint_TakeFirstReceivedMessage(ep)) ) { GWEN_DB_NODE *db; GWEN_BUFFER *buf; GWEN_MSG *msgOut; DBG_INFO(GWEN_LOGDOMAIN, " - received msg"); db=GWEN_Msg_GetDbParsedInfo(msg); if (db) GWEN_DB_Dump(db, 2); buf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(buf, "HTTP/1.1 200 Okay\r\n"); GWEN_Buffer_AppendString(buf, "Connection: close\r\n"); GWEN_Buffer_AppendString(buf, "Content-length: 23\r\n"); GWEN_Buffer_AppendString(buf, "\r\n"); GWEN_Buffer_AppendString(buf, "This is a test string\r\n"); msgOut=GWEN_Msg_fromBytes((const uint8_t*)GWEN_Buffer_GetStart(buf), GWEN_Buffer_GetUsedBytes(buf)); GWEN_Buffer_free(buf); GWEN_MsgEndpoint_AddSendMessage(ep, msgOut); GWEN_Msg_free(msg); } /* while */ ep=GWEN_MsgEndpoint_Tree2_GetNext(ep); } GWEN_MsgEndpoint_RemoveUnconnectedAndEmptyChildren(epServer); } return 0; } #endif int testHexfile(int argc, char **argv) { const char *inFilename; const char *outFilename; AQH_HEXFILE *h; int rv; if (argc<3) { fprintf(stderr, "Missing filenames (in, out)\n"); return 1; } rv=AQH_Init(); if (rv<0) { } inFilename=argv[1]; outFilename=argv[2]; h=AQH_Hexfile_fromFile(inFilename); if (h==NULL) { fprintf(stderr, "Error reading hexfile \"%s\".\n", inFilename); return 2; } else { AQH_HEXFILERECORD_LIST *recordList; GWEN_BUFFER *buffer; recordList=AQH_Hexfile_GetRecordList(h); fprintf(stdout, "INTEL Hexfile read with %d records\n", AQH_HexfileRecord_List_GetCount(recordList)); buffer=GWEN_Buffer_new(0, 1024, 0, 1); AQH_Hexfile_toBuffer(h, buffer); rv=GWEN_SyncIo_Helper_WriteFile(outFilename, (const uint8_t*) GWEN_Buffer_GetStart(buffer), GWEN_Buffer_GetUsedBytes(buffer)); GWEN_Buffer_free(buffer); if (rv<0) { fprintf(stderr, "ERROR writing outfile \"%s\": %d", outFilename, rv); AQH_Hexfile_free(h); return 3; } AQH_Hexfile_free(h); } return 0; } int testFlashRecords(int argc, char **argv) { const char *inFilename; AQH_HEXFILE *h; int rv; if (argc<2) { fprintf(stderr, "Missing filename\n"); return 1; } rv=AQH_Init(); if (rv<0) { } inFilename=argv[1]; h=AQH_Hexfile_fromFile(inFilename); if (h==NULL) { fprintf(stderr, "Error reading hexfile \"%s\".\n", inFilename); return 2; } else { AQH_HEXFILERECORD_LIST *recordList; AQH_FLASHRECORD_LIST *flashRecordList; recordList=AQH_Hexfile_GetRecordList(h); fprintf(stdout, "INTEL Hexfile read with %d records\n", AQH_HexfileRecord_List_GetCount(recordList)); flashRecordList=AQH_FlashRecord_fromHexfileRecords(recordList); if (flashRecordList==NULL) { fprintf(stderr, "ERROR creating flash record list\n"); AQH_Hexfile_free(h); return 3; } else { AQH_FLASHRECORD *fr; fprintf(stdout, "Flash record list created with %d records\n", AQH_FlashRecord_List_GetCount(flashRecordList)); fr=AQH_FlashRecord_List_First(flashRecordList); while(fr) { fprintf(stdout, "- %08x (%d bytes)\n", AQH_FlashRecord_GetAddress(fr), AQH_FlashRecord_GetDataLength(fr)); fr=AQH_FlashRecord_List_Next(fr); } } AQH_Hexfile_free(h); } return 0; } int main(int argc, char **argv) { //return testHexfile(argc, argv); //return testFlashRecords(argc, argv); //return testMqttConnection2(); //return testMqttSubscribe2(argc, argv); //return testHttpDaemon(); return testMqttSubscribe3(argc, argv); return 0; }