bool MqttSnClient::loop() { if(mCurrentState == DISCONNECTED || mCurrentState == LOST) { return false; } uint8_t buffer[I_RfPacketSocket::PAYLOAD_CAPACITY+1] = {0}; if(handleLoop(buffer, PUBLISH)) { handlePublish(buffer); } unsigned long now = millis(); if (((now - mLastReveiveActivity) > mKeepAliveTimerDuration) || ((now - mLastSendActivity) > mKeepAliveTimerDuration)) { BT_LOG_INFO("send PINGREQ ..."); Pingreq* message = reinterpret_cast<Pingreq*>(buffer); message->initialize(); if (!send(buffer, message->header.length)) { BT_LOG_WARNING("send PINGREQ failed"); changeState(LOST); return false; } if(!pollLoop(buffer, PINGRESP)) { BT_LOG_WARNING("wait for PINGRESP timeout"); changeState(LOST); return false; } BT_LOG_INFO(" ... PINGRESP received"); } return true; }
UtlBoolean SipPublishServer::handleMessage(OsMsg &eventMessage) { int msgType = eventMessage.getMsgType(); int msgSubType = eventMessage.getMsgSubType(); // SIP message if(msgType == OsMsg::PHONE_APP && msgSubType == SipMessage::NET_SIP_MESSAGE) { const SipMessage* sipMessage = ((SipMessageEvent&)eventMessage).getMessage(); UtlString method; if(sipMessage) { sipMessage->getCSeqField(NULL, &method); } // PUBLISH requests if(sipMessage && !sipMessage->isResponse() && method.compareTo(SIP_PUBLISH_METHOD) == 0) { handlePublish(*sipMessage); } } return(TRUE); }
void QMQTT::ClientPrivate::onNetworkReceived(const QMQTT::Frame& frm) { QMQTT::Frame frame(frm); quint8 qos = 0; bool retain, dup; QString topic; quint16 mid = 0; quint8 header = frame.header(); quint8 type = GETTYPE(header); Message message; switch(type) { case CONNACK: frame.readChar(); handleConnack(frame.readChar()); break; case PUBLISH: qos = GETQOS(header); retain = GETRETAIN(header); dup = GETDUP(header); topic = frame.readString(); if( qos > QOS0) { mid = frame.readInt(); } message.setId(mid); message.setTopic(topic); message.setPayload(frame.data()); message.setQos(qos); message.setRetain(retain); message.setDup(dup); handlePublish(message); break; case PUBACK: case PUBREC: case PUBREL: case PUBCOMP: mid = frame.readInt(); handlePuback(type, mid); break; case SUBACK: mid = frame.readInt(); qos = frame.readChar(); // todo: send a subscribed signal (only in certain cases? mid? qos?) break; case UNSUBACK: // todo: send an unsubscribed signal (only certain cases? mid?) break; case PINGRESP: // todo: I know I'm suppose to do something with this. Look at specifications. break; default: break; } }
//--------------------------------------------- //--------------------------------------------- void Client::onReceived(Frame &frame) { quint8 qos = 0; bool retain, dup; QString topic; quint16 mid = 0; quint8 header = frame.header(); quint8 type = GETTYPE(header); Message message; qCDebug(client, "handleFrame: type=%d", type); switch(type) { case CONNACK: //skip reserved frame.readChar(); handleConnack(frame.readChar()); break; case PUBLISH: qos = GETQOS(header);; retain = GETRETAIN(header); dup = GETDUP(header); topic = frame.readString(); if( qos > MQTT_QOS0) { mid = frame.readInt(); } message.setId(mid); message.setTopic(topic); message.setPayload(frame.data()); message.setQos(qos); message.setRetain(retain); message.setDup(dup); handlePublish(message); break; case PUBACK: case PUBREC: case PUBREL: case PUBCOMP: mid = frame.readInt(); handlePuback(type, mid); break; case SUBACK: mid = frame.readInt(); qos = frame.readChar(); emit subacked(mid, qos); break; case UNSUBACK: emit unsubacked(mid); break; case PINGRESP: emit pong(); break; default: break; } }
void MqttSnClient::handleInternal(uint8_t* iBuffer) { Header* header = reinterpret_cast<Header*>(iBuffer); switch(header->msgType) { case PUBLISH : handlePublish(iBuffer); return; case REGISTER : handleRegister(iBuffer); return; case PINGREQ : handlePingRequest(iBuffer); return; case PINGRESP : handlePingResponse(iBuffer); return; } BT_LOG_WARNING_AND_PARAMETER("drop unexpected/unsupported message of type ", header->msgType); }
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; } }