void Robot::ProcessMessage(const SMsgHeader* header,const string& body) { log.debug("ProcessMessage start..."); SATCPConnectionPtr spSocket = m_spSocket; log.debug(format("Process robot msg='%s'", body)); rapidjson::Document oDocument; string sRes = ""; const string sFailedResTemple = "{\"sender\": \"server1\",\"sendertype\": \"server\",\"msgid\": \"%s\",\"errcode\": %d,\"errmsg\": \"%s\"}"; string sErrorMsg = ""; int nErrcode = 0; string sMsgID = ""; if (!oDocument.Parse<0>(body.c_str()).HasParseError() && oDocument.IsObject()) { string sSender = ""; string sSendertype = ""; if (oDocument.HasMember("sender") && oDocument["sender"].IsString()) { sSender = oDocument["sender"].GetString(); } if (oDocument.HasMember("sendertype") && oDocument["sendertype"].IsString()) { sSendertype = oDocument["sendertype"].GetString(); } if (oDocument.HasMember("msgid") && oDocument["msgid"].IsString()) { sMsgID = oDocument["msgid"].GetString(); } if (sMsgID.empty() || sSender.empty() || sSendertype.empty()) { nErrcode = 2; sErrorMsg = "request msg format error!"; log.warning("request msg format error!"); } else { rapidjson::Document response; response.SetObject(); rapidjson::Document::AllocatorType& allocator = response.GetAllocator(); response.AddMember("sender", "server1", allocator); response.AddMember("sendertype", "server", allocator); response.AddMember("msgid", sMsgID.c_str(), allocator); if (IsRegistered()) { m_oLastRecvMsg.update(); if (sMsgID == "robot.heartbeat") { Process_Heartbeat(oDocument, response,sRes); } else if (sMsgID == "server.get.robot_status") { // 更新状态信息 Process_Status(oDocument); return; } else if (sMsgID == "robot.request.customer") { // 请求人工服务 Process_RequestCustomer(oDocument); } } else if (sMsgID == "robot.register") { Process_Register(oDocument, response, sRes); } else { log.error(format("Can't process msg,has't registered!msgid='%s'", sMsgID)); nErrcode = 1; sErrorMsg = "Has't registered!"; } } } else { nErrcode = 3; sErrorMsg = "invalid json format!"; log.warning("robot request format error,invalid json format"); } if (sRes.empty()) { sRes = Poco::format(sFailedResTemple,sMsgID, nErrcode, sErrorMsg); } if (sRes.length() > 0) { SendMessage(sRes, header->nInvokeID); } if (sMsgID == "robot.register") { if (m_bIsRegistered) { SendGetStatusRequest(); } } }
//------------------------------------------------------------------- //----------------------------Code----------------------------------- //------------------------------------------------------------------- void main(void) { // should only execute main loop once; after this just respond to interrupts InitTimers(); InitPorts(); InitComm(); InitInterrupts(); SSPBUF = BytesOut[i]; while(1) { //----------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------- //-----EUART STUFF------------------------------------------------------------------------- //----------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------- if(CommActive) { if( X_Transition!=0 ) { X_Transition = 0; switch( CurrentX_State ) { case X_Idle_State : { SEND = 1; NextX_State = X_StartDelim_State; NextByteOut = 0x7E; // Starting Edit for Variable Message Size MessageCounter = Encode_Message(CurrentType); X_LengthLSB = MessageCounter + 5; //For framing bytes // Populating the Message Frame X_CMD = TXData[0]; X_RF1 = TXData[1]; X_RF2 = TXData[2]; X_RF3 = TXData[3]; X_RF4 = TXData[4]; X_RF5 = TXData[5]; } break; case X_StartDelim_State : { NextX_State = X_LengthMSB_State; NextByteOut = X_LengthMSB ; } break; case X_LengthMSB_State : { NextX_State = X_LengthLSB_State; NextByteOut = X_LengthLSB; } break; case X_LengthLSB_State : { NextX_State = X_API_State; NextByteOut = X_API; } break; case X_API_State : { NextX_State = X_FID_State; NextByteOut = X_FID; } break; case X_FID_State : { NextX_State = X_AddrMSB_State; NextByteOut = X_AddrMSB; } break; case X_AddrMSB_State : { NextX_State = X_AddrLSB_State; NextByteOut = X_AddrLSB; } break; case X_AddrLSB_State : { NextX_State = X_Options_State; NextByteOut = X_Options; } break; case X_Options_State : { NextX_State = X_CMD_State; // will later need logic here for what transition to do based on length LSB NextByteOut = X_CMD; } break; case X_CMD_State : { MessageCounter--; if(MessageCounter) { NextX_State = X_RF1_State; NextByteOut = X_RF1; } else { NextX_State = X_Checksum_State; NextByteOut = CalculateChecksum(); } } break; case X_RF1_State : { MessageCounter--; if(MessageCounter) { NextX_State = X_RF2_State; NextByteOut = X_RF2; } else { NextX_State = X_Checksum_State; NextByteOut = CalculateChecksum(); } } break; case X_RF2_State : { MessageCounter--; if(MessageCounter) { NextX_State = X_RF3_State; NextByteOut = X_RF3; } else { NextX_State = X_Checksum_State; NextByteOut = CalculateChecksum(); } } break; case X_RF3_State : { MessageCounter--; if(MessageCounter) { NextX_State = X_RF4_State; NextByteOut = X_RF4; } else { NextX_State = X_Checksum_State; NextByteOut = CalculateChecksum(); } } break; case X_RF4_State : { MessageCounter--; if(MessageCounter) { NextX_State = X_RF5_State; NextByteOut = X_RF5; } else { NextX_State = X_Checksum_State; NextByteOut = CalculateChecksum(); } } break; case X_RF5_State : { NextX_State = X_Checksum_State; NextByteOut = CalculateChecksum(); } break; case X_Checksum_State : { SEND = 0; NextX_State = X_Idle_State; NextByteOut = 0x7E; } break; } // end switch case }// end if X_Transition if( R_Transition!=0 ) { R_Transition = 0; switch( CurrentR_State ) { case R_Idle_State : { if (ByteIn == 0x7E) // should always be this! { NextR_State = R_LengthMSB_State; } } break; case R_LengthMSB_State : { if ( ByteIn == 0x00 ) // should always be this! { NextR_State = R_LengthLSB_State; } } break; case R_LengthLSB_State : { NextR_State = R_API_State; R_LengthLSB = ByteIn; } break; case R_API_State : { ///Adding Code to Handle different types of received messages R_API = ByteIn; if (R_API == API_TXSTAT) NextR_State = R_FID_State; else if (R_API == API_RXPACK) { NextR_State = R_AddrMSB_State; LostCommCounter = 0; } else NextR_State = R_Idle_State; } break; case R_AddrMSB_State : { NextR_State = R_AddrLSB_State; R_AddrMSB = ByteIn; } break; case R_AddrLSB_State : { NextR_State =R_SigStr_State; R_AddrLSB = ByteIn; } break; case R_SigStr_State : { NextR_State = R_Options_State; R_SigStr = ByteIn; } break; case R_Options_State : { NextR_State = R_CMD_State; // will later need logic here for what transition to do based on length LSB R_Options = ByteIn; } break; case R_CMD_State: { NextR_State = R_RF1_State; R_CMD = ByteIn; } break; case R_RF1_State : { NextR_State = R_Idle_State; R_RF1 = ByteIn; if (R_CMD == 0x05) { //PAIR_RESP Received if(R_RF1&BIT0HI) { Paired = 1; //Stop Broadcasting and send Direct Messages X_AddrMSB = R_AddrMSB; X_AddrLSB = R_AddrLSB; CurrentType = CTRL; Set_PAIRED; PORTC = PORTC_Copy; LostCommCounter = 0; } else { XBee_State(0); } } if (R_CMD == 0x06) { //STATUS Received Process_Status(R_RF1); } } break; case R_FID_State : { NextR_State = R_STATUS_State; R_FID = ByteIn; } break; case R_STATUS_State : { NextR_State = R_Idle_State; R_STATUS = ByteIn; //Code to Resend Message if no ACK if (R_STATUS) { X_Transition = 1; CurrentX_State = X_Idle_State; NextX_State = CurrentX_State; } } break; } // end switch case }// end if R_Transition if (SEND && TXIF) // for some reason, with TXIE I get 0x7E transmitted twice. { X_Transition = 1; TXREG = NextByteOut; } CurrentX_State = NextX_State; CurrentR_State = NextR_State; } } }; // end main