Isn't there a Logic Schema trigger for Internet connected?
This trigger fires when the Internet (Web) system is online and ready for use.
Ask Dmitriy Khodos if this fires when it is possible to post or when the Agent actually gets responses from the Enterprise.
The Deployment Utility has a way to know if the Agent is connected to the Enterprise. Perhaps you could exploit that mechanism through an extension.
You could develop a custom component for the Agent in C++ and use it to query the Enterprise connectivity status. The API call that your component would have to make is IEnterpriseProxy::GetServerStatus(). A pointer to the IEnterpriseProxy interface can be obtained by calling GetInterface() with IID_ENTERPRISE_PROXY argument. See CustomComponent/SampleComponents in the Agent SDK for examples of custom component source code.
Thanks for your input!
We already have a custom component developed by Axeda, so (not knowing whether IEnterpriseProxy is COM, in-process, out-of-process, ...) I decided to extend that component (it also already has member of IEnterpriseProxy) and then (also adding this DI through Builder project) add my own DataItem.
The design seems not to be 100%ly elegant, but it does the job.
For usage, I have to set the DataItem with a "T" value, wait a bit, and then either get an "N" or an "F" (also not sure about AX_Char being wchar or something else, also unsure about allowed size of string, so I just limit to 1 char..).
I tested this and saw that I get the desired result (there is some delay when unplugging network, I suppose this is based on the ping rate currently set - can I force a connection attempt?).
Many thanks, best
// OnDataChange() Handle data change
void StateChange::OnDataChange(int count, AX_DataItem* pItems)
for (int i = 0; i < count; i++)
AX_DataItem* pItem = &pItems[i];
EString strDataItem = pItem->pszName;
if(strDataItem == /* ... */)
// ... existing code
else if(strDataItem == AGENT_QUERY_ONLINE)
AX_DataValue *pValue = &pItem->value;
if(pValue->iQuality == AX_DataGood && pValue->iType == AX_DataString)
AX_Char* pCh = pValue->data.pszString;
if (*pCh != 0)
if (*pCh == (AX_Char)TEXT('T')) // T == Test
Item.iDeviceId = CONNECTOR_GATEWAY; // AgentQueryOnline data item lives on the Gateway
Item.pszName = (AX_Char*)AGENT_QUERY_ONLINE;
Item.bInhibit = AX_False;
Item.value.iType = AX_DataString;
Item.value.iQuality = AX_DataGood;
Item.value.timeStamp.iSec = time(NULL);
Item.value.timeStamp.iMilliSec = 0;
myResChars= (AX_Char)TEXT('N'); // N == oNline
myResChars= (AX_Char)TEXT('F'); // F == oFfline
myResChars = 0;
Item.value.data.pszString = myResChars;
AX_Char represents "wide" character.
The Agent determines that the Enterprise server is unavailable -- that is, the connectivity state is offline -- once three successive communication attempts have failed. Moreover, when the Agent encounters a communication failure, the next attempt is delayed for a period of time randomized between 0 and 60 seconds. This is why IEnterpriseProxy::GetServerStatus() may not reflect loss of connectivity for a minute a two after the connection has been disrupted.