void UMasterServerFunctions::UnregisterServer()
{
	if (!CurrentRegisteredServer.IsEmpty())
	{

		// Clear the timer on checking in as we don't need to check in anymore
		GameInstance->GetWorld()->GetTimerManager().ClearTimer(CheckIn_Handle);

		FHttpRequest* RequestData = new FHttpRequest;

		RequestData->SetRequestType(EHttpRequestType::HRT_UnregisterServer);
		RequestData->SetData(ServerToJSON(CurrentRegisteredServer, *RequestData));

		// No server currently registered anymore, if the request fails, at least check in won't happen and the server will be purged automatically after a short period of time.
		CurrentRegisteredServer = CurrentRegisteredServer = *(new FServerInformation);

		TransmitRequest(*RequestData);
	}
	else
	{
		// No server registered, broadcast failure
		ServerUnregisteredEvent.Broadcast(EHttpResponse::HR_NoSend);
	}

}
uint32_t JoinFlowHandler::WriteKeyNickSession(NE::Model::Capabilities& capabilities, Address32 address32,
                                              WHartUniqueID uniqueID, Address32 parentAddress32, const NE::Model::SecurityKey& networkKey,
                                              const NE::Model::SecurityKey& key)
{
    C963_WriteSession_Req writeSessionLocal;
    { // write the session locally
        writeSessionLocal.m_ulPeerNonceCounterValue = 0;
        writeSessionLocal.m_unPeerNickname = (address32 & 0xFFFF);
        memcpy(writeSessionLocal.m_aPeerUniqueID, uniqueID.bytes, 5); //TODO check if it is ok
        memcpy(writeSessionLocal.m_aKeyValue, key.value, key.LENGTH);
        writeSessionLocal.m_eSessionType = WHartSessionKey::sessionKeyed;
        writeSessionLocal.m_ucReserved = 0;
        memset(writeSessionLocal.m_tExecutionTime, 0, 5);
    }

    C2009_NM_WriteUniqueIdNickname_Req localAddressNick;
    {
        localAddressNick.nickname = (uint16_t) address32 & 0xFFFF;
        localAddressNick.uniqueId = uniqueID;
        localAddressNick.isTR = device.isBackbone;
    }

    WHartCommand arrayLocal[] = { { CMDID_C963_WriteSession, 0, &writeSessionLocal }, {
            CMDID_C2009_NM_WriteUniqueIdNickname, 0, &localAddressNick } };
    WHartCommandList listReqLocal = { sizeof(arrayLocal) / sizeof(arrayLocal[0]), arrayLocal };

    //COULD trigger TransmitConfirm if there is a package in the stack for the peer address.
    TransmitRequest(NetworkManager_Nickname(), listReqLocal, WHartSessionKey::joinKeyed);

    try
    {
        keyNickSessionOperations.reset(new NE::Model::Operations::EngineOperations());
        commonData.networkEngine.initJoinDevice(*keyNickSessionOperations, capabilities, address32, uniqueID,
                                                parentAddress32, networkKey, key);


        std::ostringstream stream;
        stream << "Write session " << ToStr(address32) << ", parent=" << ToStr(parentAddress32);
        keyNickSessionOperations->reasonOfOperations = stream.str();

        SMState::SMStateLog::logOperations(keyNickSessionOperations->reasonOfOperations, *keyNickSessionOperations);

        SendOperations(keyNickSessionOperations, keyNickSessionHandle, true);
    }
    catch (std::exception& ex)
    {
        LOG_ERROR("Error:" << ex.what());
    }

    return keyNickSessionHandle;
}
void UMasterServerFunctions::CheckInServer()
{
	if (!CurrentRegisteredServer.IsEmpty())
	{

		FHttpRequest* RequestData = new FHttpRequest;
		RequestData->SetRequestType(EHttpRequestType::HRT_CheckIn);
		RequestData->SetData(ServerToJSON(CurrentRegisteredServer, *RequestData));

		TransmitRequest(*RequestData);
	}
	else
	{
		ServerCheckInEvent.Broadcast(EHttpResponse::HR_NoSend);
	}

}
Ejemplo n.º 4
0
void GatewayStack::SendJoinRequest()
{
	// complete c000 response
	C000_ReadUniqueIdentifier_Resp c000;

	FillGwIdentityResponse (&c000, config);

	CHartCmdWrapper::Ptr pCmd000(new CHartCmdWrapper);
	pCmd000->LoadParsed(CMDID_C000_ReadUniqueIdentifier, sizeof(C000_ReadUniqueIdentifier_Resp), &c000, RCS_N00_Success);


	// complete c020 response
	C020_ReadLongTag_Resp c020;

	memcpy(c020.longTag, config.m_szLongTag, sizeof(c020.longTag));

	CHartCmdWrapper::Ptr pCmd020(new CHartCmdWrapper);
	pCmd020->LoadParsed(CMDID_C020_ReadLongTag,  sizeof(C020_ReadLongTag_Resp),&c020, RCS_N00_Success);

	C787_ReportNeighborSignalLevels_Resp c787;
	memset(&c787, 0, sizeof(c787));
	c787.m_ucNeighborTableIndex = 0;
	c787.m_ucNoOfNeighborEntriesRead = 1;
	c787.m_ucTotalNoOfNeighbors = 1;
	c787.m_aNeighbors[0].RSLindB = 123;
	c787.m_aNeighbors[0].nickname = NetworkManager_Nickname();

	CHartCmdWrapper::Ptr pCmd787(new CHartCmdWrapper);
	pCmd787->LoadParsed(CMDID_C787_ReportNeighborSignalLevels, sizeof(C787_ReportNeighborSignalLevels_Resp),&c787, RCS_N00_Success);

	CHartCmdWrapperList oJoinList;

	oJoinList.push_back(pCmd000);
	oJoinList.push_back(pCmd020);
	oJoinList.push_back(pCmd787);

	WHartAddress nm(NetworkManager_UniqueID());

	m_nCurrentJoinReqHandle = TransmitRequest(nm, whartpEvent, wharttPublishNotify, 0, oJoinList, WHartSessionKey::joinKeyed);

	joinTimer = timerFactory->CreateDeadlineTimer(REJOIN_TIMER);
	joinTimer->Elapsed = boost::bind(&GatewayStack::ProcessJoinStatus, this);
}
void UMasterServerFunctions::RegisterServer(FServerInformation Server)
{
	if (!Server.IsEmpty())
	{
		ServerRegisteredEvent.RemoveDynamic(this, &UMasterServerFunctions::OnRegisteredServer);
		ServerRegisteredEvent.AddDynamic(this, &UMasterServerFunctions::OnRegisteredServer);

		FHttpRequest* RequestData = new FHttpRequest;
		RequestData->SetRequestType(EHttpRequestType::HRT_RegisterServer);
		RequestData->SetData(ServerToJSON(Server, *RequestData));
		CurrentRegisteredServer = Server;

		TransmitRequest(*RequestData);
	}
	else
	{
		ServerRegisteredEvent.Broadcast(EHttpResponse::HR_NoSend, 0);
	}

}
void UMasterServerFunctions::RequestServerList()
{
	FHttpRequest* RequestData = new FHttpRequest;
	RequestData->SetRequestType(EHttpRequestType::HRT_ReceiveServerList);
	TransmitRequest(*RequestData);
}