void GatewayControlTask::run(){ Timer advertiseTimer; Timer sendUnixTimer; Event* ev = 0; _gatewayId = atoi(_res->getArgv('i')); if (_gatewayId == 0 || _gatewayId > 255){ THROW_EXCEPTION(ExFatal, ERRNO_SYS_05, "Invalid Gateway Id"); // ABORT } int keepAlive = KEEP_ALIVE_TIME; if(_res->getArgv('k') != 0){ keepAlive =atoi( _res->getArgv('k')); if (keepAlive > 65536){ THROW_EXCEPTION(ExFatal, ERRNO_SYS_06, "KeepAliveTime is grater than 65536 Secs"); // ABORT } } if(_res->getArgv('l') != 0){ _loginId = _res->getArgv('l'); } if(_res->getArgv('w') != 0){ _password = _res->getArgv('w'); } _eventQue = _res->getGatewayEventQue(); advertiseTimer.start(keepAlive * 1000UL); printf("%s TomyGateway start\n", currentDateTime()); while(true){ ev = _eventQue->timedwait(TIMEOUT_PERIOD); /*------ Check Client is Lost ---------*/ if(ev->getEventType() == EtTimeout){ ClientList* clist = _res->getClientList(); for( int i = 0; i < clist->getClientCount(); i++){ if((*clist)[i]){ (*clist)[i]->checkTimeover(); }else{ break; } } /*------ Check Keep Alive Timer & send Advertise ------*/ if(advertiseTimer.isTimeup()){ MQTTSnAdvertise* adv = new MQTTSnAdvertise(); adv->setGwId(_gatewayId); adv->setDuration(keepAlive); Event* ev1 = new Event(); ev1->setEvent(adv); //broadcast printf(YELLOW_FORMAT2, currentDateTime(), "ADVERTISE", LEFTARROW, GATEWAY, msgPrint(adv)); _res->getClientSendQue()->post(ev1); advertiseTimer.start(keepAlive * 1000UL); sendUnixTimer.start(SEND_UNIXTIME_TIME * 1000UL); } /*------ Check Timer & send UixTime ------*/ if(sendUnixTimer.isTimeup()){ uint8_t buf[4]; uint32_t tm = time(0); setUint32(buf,tm); MQTTSnPublish* msg = new MQTTSnPublish(); msg->setTopicId(MQTTSN_TOPICID_PREDEFINED_TIME); msg->setTopicIdType(MQTTSN_TOPIC_TYPE_PREDEFINED); msg->setData(buf, 4); msg->setQos(0); Event* ev1 = new Event(); ev1->setEvent(msg); printf(YELLOW_FORMAT2, currentDateTime(), "PUBLISH", LEFTARROW, GATEWAY, msgPrint(msg)); _res->getClientSendQue()->post(ev1); sendUnixTimer.stop(); } } /*------ Check SEARCHGW & send GWINFO ---------*/ else if(ev->getEventType() == EtBroadcast){ MQTTSnMessage* msg = ev->getMqttSnMessage(); printf(YELLOW_FORMAT2, currentDateTime(), "SERCHGW", LEFTARROW, CLIENT, msgPrint(msg)); if(msg->getType() == MQTTSN_TYPE_SEARCHGW){ if(_res->getClientList()->getClientCount() < MAX_CLIENT_NODES ){ MQTTSnGwInfo* gwinfo = new MQTTSnGwInfo(); gwinfo->setGwId(_gatewayId); Event* ev1 = new Event(); ev1->setEvent(gwinfo); printf(YELLOW_FORMAT1, currentDateTime(), "GWINFO", RIGHTARROW, CLIENT, msgPrint(gwinfo)); _res->getClientSendQue()->post(ev1); } } } /*------ Message form Clients ---------*/ else if(ev->getEventType() == EtClientRecv){ ClientNode* clnode = ev->getClientNode(); MQTTSnMessage* msg = clnode->getClientRecvMessage(); clnode->updateStatus(msg); if(msg->getType() == MQTTSN_TYPE_PUBLISH){ handleSnPublish(ev, clnode, msg); }else if(msg->getType() == MQTTSN_TYPE_SUBSCRIBE){ handleSnSubscribe(ev, clnode, msg); }else if(msg->getType() == MQTTSN_TYPE_UNSUBSCRIBE){ handleSnUnsubscribe(ev, clnode, msg); }else if(msg->getType() == MQTTSN_TYPE_PINGREQ){ handleSnPingReq(ev, clnode, msg); }else if(msg->getType() == MQTTSN_TYPE_PUBACK){ handleSnPubAck(ev, clnode, msg); }else if(msg->getType() == MQTTSN_TYPE_CONNECT){ handleSnConnect(ev, clnode, msg); }else if(msg->getType() == MQTTSN_TYPE_WILLTOPIC){ handleSnWillTopic(ev, clnode, msg); }else if(msg->getType() == MQTTSN_TYPE_WILLMSG){ handleSnWillMsg(ev, clnode, msg); }else if(msg->getType() == MQTTSN_TYPE_DISCONNECT){ handleSnDisconnect(ev, clnode, msg); }else if(msg->getType() == MQTTSN_TYPE_REGISTER){ handleSnRegister(ev, clnode, msg); }else if(msg->getType() == MQTTSN_TYPE_PUBREC){ handleSnPubRec(ev, clnode, msg); }else if(msg->getType() == MQTTSN_TYPE_PUBREL){ handleSnPubRel(ev, clnode, msg); }else if(msg->getType() == MQTTSN_TYPE_PUBCOMP){ handleSnPubComp(ev, clnode, msg); }else{ printf("%s Irregular ClientRecvMessage\n", currentDateTime()); } } /*------ Message form Broker ---------*/ else if(ev->getEventType() == EtBrokerRecv){ ClientNode* clnode = ev->getClientNode(); MQTTMessage* msg = clnode->getBrokerRecvMessage(); if(msg->getType() == MQTT_TYPE_PUBACK){ handlePuback(ev, clnode, msg); }else if(msg->getType() == MQTT_TYPE_PINGRESP){ handlePingresp(ev, clnode, msg); }else if(msg->getType() == MQTT_TYPE_SUBACK){ handleSuback(ev, clnode, msg); }else if(msg->getType() == MQTT_TYPE_UNSUBACK){ handleUnsuback(ev, clnode, msg); }else if(msg->getType() == MQTT_TYPE_CONNACK){ handleConnack(ev, clnode, msg); }else if(msg->getType() == MQTT_TYPE_PUBLISH){ handlePublish(ev, clnode, msg); }else if(msg->getType() == MQTT_TYPE_DISCONNECT){ handleDisconnect(ev, clnode, msg); }else if(msg->getType() == MQTT_TYPE_PUBREC){ handlePubRec(ev, clnode, msg); }else if(msg->getType() == MQTT_TYPE_PUBREL){ handlePubRel(ev, clnode, msg); }else if(msg->getType() == MQTT_TYPE_PUBCOMP){ handlePubComp(ev, clnode, msg); }else{ printf("%s Irregular BrokerRecvMessage\n", currentDateTime()); } } delete ev; } }
void BrokerSendTask::run(){ Event* ev = 0; MQTTMessage* srcMsg = 0; ClientNode* clnode = 0; char param[TOMYFRAME_PARAM_MAX]; if(_res->getParam("BrokerName",param) == 0){ _host = strdup(param); } if(_res->getParam("BrokerPortNo",param) == 0){ _service =strdup( param); } _light = _res->getLightIndicator(); while(true){ uint16_t length = 0; memset(_buffer, 0, SOCKET_MAXBUFFER_LENGTH); ev = _res->getBrokerSendQue()->wait(); clnode = ev->getClientNode(); srcMsg = clnode->getBrokerSendMessage(); if(srcMsg->getType() == MQTT_TYPE_PUBLISH){ MQTTPublish* msg = static_cast<MQTTPublish*>(srcMsg); length = msg->serialize(_buffer); LOGWRITE(BLUE_FORMAT, currentDateTime(), "PUBLISH", RIGHTARROW, GREEN_BROKER, msgPrint(msg)); if(send(clnode, length) == 0){ LOGWRITE(SEND_COMPLETE); } }else if(srcMsg->getType() == MQTT_TYPE_PUBACK){ MQTTPubAck* msg = static_cast<MQTTPubAck*>(srcMsg); length = msg->serialize(_buffer); LOGWRITE(GREEN_FORMAT, currentDateTime(), "PUBACK", RIGHTARROW, GREEN_BROKER, msgPrint(msg)); if(send(clnode, length) == 0){ LOGWRITE(SEND_COMPLETE); } }else if(srcMsg->getType() == MQTT_TYPE_PUBREL){ MQTTPubRel* msg = static_cast<MQTTPubRel*>(srcMsg); length = msg->serialize(_buffer); LOGWRITE(GREEN_FORMAT, currentDateTime(), "PUBREL", RIGHTARROW, GREEN_BROKER, msgPrint(msg)); if(send(clnode, length) == 0){ LOGWRITE(SEND_COMPLETE); } }else if(srcMsg->getType() == MQTT_TYPE_PINGREQ){ MQTTPingReq* msg = static_cast<MQTTPingReq*>(srcMsg); length = msg->serialize(_buffer); LOGWRITE(FORMAT, currentDateTime(), "PINGREQ", RIGHTARROW, GREEN_BROKER, msgPrint(msg)); if(send(clnode, length) == 0){ LOGWRITE(SEND_COMPLETE); } }else if(srcMsg->getType() == MQTT_TYPE_SUBSCRIBE){ MQTTSubscribe* msg = static_cast<MQTTSubscribe*>(srcMsg); length = msg->serialize(_buffer); LOGWRITE(FORMAT, currentDateTime(), "SUBSCRIBE", RIGHTARROW, GREEN_BROKER, msgPrint(msg)); if(send(clnode, length) == 0){ LOGWRITE(SEND_COMPLETE); } }else if(srcMsg->getType() == MQTT_TYPE_UNSUBSCRIBE){ MQTTUnsubscribe* msg = static_cast<MQTTUnsubscribe*>(srcMsg); length = msg->serialize(_buffer); LOGWRITE(FORMAT, currentDateTime(), "UNSUBSCRIBE", RIGHTARROW, GREEN_BROKER, msgPrint(msg)); if(send(clnode, length) == 0){ LOGWRITE(SEND_COMPLETE); } }else if(srcMsg->getType() == MQTT_TYPE_CONNECT){ MQTTConnect* msg = static_cast<MQTTConnect*>(srcMsg); length = msg->serialize(_buffer); LOGWRITE(FORMAT, currentDateTime(), "CONNECT", RIGHTARROW, GREEN_BROKER, msgPrint(msg)); clnode->connectSended(); if(send(clnode, length) == 0){ LOGWRITE(SEND_COMPLETE); } }else if(srcMsg->getType() == MQTT_TYPE_DISCONNECT){ MQTTDisconnect* msg = static_cast<MQTTDisconnect*>(srcMsg); length = msg->serialize(_buffer); LOGWRITE(FORMAT, currentDateTime(), "DISCONNECT", RIGHTARROW, GREEN_BROKER, msgPrint(msg)); if(send(clnode, length) == 0){ LOGWRITE(SEND_COMPLETE); } clnode->getStack()->disconnect(); } delete ev; } }
void BrokerSendTask::run(){ Event* ev = NULL; MQTTMessage* srcMsg = NULL; ClientNode* clnode = NULL; uint8_t buffer[SOCKET_MAXBUFFER_LENGTH]; string host = BROKER_HOST_NAME; int port = BROKER_PORT; if(_res->getArgc() > ARGV_BROKER_ADDR){ host = _res->getArgv()[ARGV_BROKER_ADDR]; } if(_res->getArgc() > ARGV_BROKER_PORT){ port = atoi(_res->getArgv()[ARGV_BROKER_PORT]); } while(true){ uint16_t length = 0; memset(buffer, 0, SOCKET_MAXBUFFER_LENGTH); ev = _res->getBrokerSendQue()->wait(); clnode = ev->getClientNode(); srcMsg = clnode->getBrokerSendMessage(); if(srcMsg->getType() == MQTT_TYPE_PUBLISH){ MQTTPublish* msg = static_cast<MQTTPublish*>(srcMsg); length = msg->serialize(buffer); D_MQTT("%s PUBLISH ---> Broker %s\n", currentDateTime(), msgPrint(buffer,msg)); } else if(srcMsg->getType() == MQTT_TYPE_PUBACK){ MQTTPubAck* msg = static_cast<MQTTPubAck*>(srcMsg); length = msg->serialize(buffer); D_MQTT("%s PUBACK ---> Broker %s\n", currentDateTime(), msgPrint(buffer,msg)); } else if(srcMsg->getType() == MQTT_TYPE_PINGREQ){ MQTTPingReq* msg = static_cast<MQTTPingReq*>(srcMsg); length = msg->serialize(buffer); D_MQTT("%s PINGREQ ---> Broker %s\n", currentDateTime(), msgPrint(buffer,msg)); } else if(srcMsg->getType() == MQTT_TYPE_SUBSCRIBE){ MQTTSubscribe* msg = static_cast<MQTTSubscribe*>(srcMsg); length = msg->serialize(buffer); D_MQTT("%s SUBSCRIBE ---> Broker %s\n", currentDateTime(), msgPrint(buffer,msg)); } else if(srcMsg->getType() == MQTT_TYPE_UNSUBSCRIBE){ MQTTUnsubscribe* msg = static_cast<MQTTUnsubscribe*>(srcMsg); length = msg->serialize(buffer); D_MQTT("%s UNSUBSCRIBE ---> Broker %s\n", currentDateTime(), msgPrint(buffer,msg)); } else if(srcMsg->getType() == MQTT_TYPE_CONNECT){ MQTTConnect* msg = static_cast<MQTTConnect*>(srcMsg); length = msg->serialize(buffer); D_MQTT("%s CONNECT ---> Broker %s\n", currentDateTime(), msgPrint(buffer,msg)); } else if(srcMsg->getType() == MQTT_TYPE_DISCONNECT){ MQTTDisconnect* msg = static_cast<MQTTDisconnect*>(srcMsg); length = msg->serialize(buffer); D_MQTT("%s DISCONNECT ---> Broker %s\n", currentDateTime(), msgPrint(buffer,msg)); } int rc = 0; if(length > 0){ if( clnode->getSocket()->isValid()){ rc = clnode->getSocket()->send(buffer, length); if(rc == -1){ clnode->getSocket()->disconnect(); D_MQTT(" Socket is valid. but can't send Client:%s\n", clnode->getNodeId()->c_str()); } }else{ if(clnode->getSocket()->create()){ if(clnode->getSocket()->connect(host, port)){ rc = clnode->getSocket()->send(buffer, length); if(rc == -1){ clnode->getSocket()->disconnect(); D_MQTT(" Socket is created. but can't send, Client:%s\n", clnode->getNodeId()->c_str()); } }else{ D_MQTT("%s Can't connect socket Client:%s\n", currentDateTime(), clnode->getNodeId()->c_str()); } }else{ D_MQTT("%s Can't create socket Client:%s\n", currentDateTime(), clnode->getNodeId()->c_str()); } } } delete ev; } }