Commit 8346e452 authored by Pavel Vainerman's avatar Pavel Vainerman

(unet2): Встроил возможность задавать для каждого Reveiver, датчик связи и…

(unet2): Встроил возможность задавать для каждого Reveiver, датчик связи и датчик "количество потерянных пакетов".
parent 8a5e4fde
...@@ -110,6 +110,34 @@ sender(0) ...@@ -110,6 +110,34 @@ sender(0)
continue; continue;
} }
string s_resp_id(n_it.getProp("respond_id"));
UniSetTypes::ObjectId resp_id = UniSetTypes::DefaultObjectId;
if( !s_resp_id.empty() )
{
resp_id = conf->getSensorID(s_resp_id);
if( resp_id == UniSetTypes::DefaultObjectId )
{
ostringstream err;
err << myname << ": Unknown RespondID.. Not found id for '" << s_resp_id << "'" << endl;
dlog[Debug::CRIT] << myname << "(init): " << err.str() << endl;
throw SystemError(err.str());
}
}
string s_lp_id(n_it.getProp("lostpackets_id"));
UniSetTypes::ObjectId lp_id = UniSetTypes::DefaultObjectId;
if( !s_lp_id.empty() )
{
lp_id = conf->getSensorID(s_lp_id);
if( lp_id == UniSetTypes::DefaultObjectId )
{
ostringstream err;
err << myname << ": Unknown LostPacketsID.. Not found id for '" << s_lp_id << "'" << endl;
dlog[Debug::CRIT] << myname << "(init): " << err.str() << endl;
throw SystemError(err.str());
}
}
UNetReceiver* r = new UNetReceiver(h,p,shm); UNetReceiver* r = new UNetReceiver(h,p,shm);
r->setReceiveTimeout(recvTimeout); r->setReceiveTimeout(recvTimeout);
...@@ -118,6 +146,8 @@ sender(0) ...@@ -118,6 +146,8 @@ sender(0)
r->setUpdatePause(updatepause); r->setUpdatePause(updatepause);
r->setMaxDifferens(maxDiff); r->setMaxDifferens(maxDiff);
r->setMaxProcessingCount(maxProcessingCount); r->setMaxProcessingCount(maxProcessingCount);
r->setRespondID(resp_id);
r->setLostPacketsID(lp_id);
recvlist.push_back(r); recvlist.push_back(r);
} }
......
...@@ -20,20 +20,19 @@ ...@@ -20,20 +20,19 @@
\par Обмен построен на основе протокола UDP. \par Обмен построен на основе протокола UDP.
Основная идея заключается в том, что каждый узел на порту равном своему ID Основная идея заключается в том, что каждый узел на порту равном своему ID
посылает в сеть UDP-пакеты содержащие данные считанные из локальной SM. Формат данных - это набор посылает в сеть UDP-пакеты содержащие данные считанные из локальной SM. Формат данных - это набор
пар "id - value". Другие узлы принимают их. Помимо этого процесс, данный процесс запускает пар "id - value". Другие узлы принимают их. Помимо этого данный процесс запускает
по потоку приёма для каждого другого узла и ловит пакеты от них, сохраняя данные в SM. по потоку приёма для каждого другого узла и ловит пакеты от них, сохраняя данные в SM.
\par При своём старте процесс считывает из секции <nodes> список узлов с которыми необходимо вести обмен. \par При своём старте процесс считывает из секции <nodes> список узлов с которыми необходимо вести обмен, параметры своего узла.
Открывает по потоку приёма на каждый узел и поток передачи для своих данных. А так же параметры Открывает по потоку приёма на каждый узел и поток передачи для своих данных.
своего узла.
\par Пример конфигурирования \par Пример конфигурирования
По умолчанию при считывании используются свойства \a ip и \a id - в качестве порта. По умолчанию при считывании используются свойства \a ip и \a id - в качестве порта.
Но можно переопределять эти параметры, при помощи указания \a unet_port и/или \a unet_ip. Но можно переопределять эти параметры, при помощи указания \a unet_port и/или \a unet_ip.
Помимо этого можно задать broadcast-адрес по умолчанию \a unet_ip для всех узлов в Помимо этого можно задать broadcast-адрес по умолчанию \a unet_broadcast_ip для всех узлов в
свойствах секции <nodes unet_ip="xxx.255"> свойствах секции <nodes unet_broadcast_ip="xxx.255">
\code \code
<nodes port="2809" unet_ip="192.168.56.255"> <nodes port="2809" unet_broadcast_ip="192.168.56.255">
<item ip="127.0.0.1" name="LocalhostNode" textname="Локальный узел" unet_ignore="1" unet_port="3000" unet_ip="192.168.56.1"> <item ip="127.0.0.1" name="LocalhostNode" textname="Локальный узел" unet_ignore="1" unet_port="3000" unet_ip="192.168.56.1">
<iocards> <iocards>
... ...
......
...@@ -24,6 +24,8 @@ udp(0), ...@@ -24,6 +24,8 @@ udp(0),
recvTimeout(5000), recvTimeout(5000),
lostTimeout(5000), lostTimeout(5000),
lostPackets(0), lostPackets(0),
sidRespond(UniSetTypes::DefaultObjectId),
sidLostPackets(UniSetTypes::DefaultObjectId),
activated(false), activated(false),
r_thr(0), r_thr(0),
u_thr(0), u_thr(0),
...@@ -113,6 +115,18 @@ void UNetReceiver::setMaxDifferens( unsigned long set ) ...@@ -113,6 +115,18 @@ void UNetReceiver::setMaxDifferens( unsigned long set )
maxDifferens = set; maxDifferens = set;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void UNetReceiver::setRespondID( UniSetTypes::ObjectId id )
{
sidRespond = id;
shm->initDIterator(ditRespond);
}
// -----------------------------------------------------------------------------
void UNetReceiver::setLostPacketsID( UniSetTypes::ObjectId id )
{
sidLostPackets = id;
shm->initAIterator(aitLostPackets);
}
// -----------------------------------------------------------------------------
void UNetReceiver::start() void UNetReceiver::start()
{ {
if( !activated ) if( !activated )
...@@ -141,6 +155,30 @@ void UNetReceiver::update() ...@@ -141,6 +155,30 @@ void UNetReceiver::update()
dlog[Debug::CRIT] << myname << "(update): catch ..." << std::endl; dlog[Debug::CRIT] << myname << "(update): catch ..." << std::endl;
} }
if( sidRespond!=DefaultObjectId )
{
try
{
shm->localSaveState(ditRespond,sidRespond,isRecvOK(),shm->ID());
}
catch(Exception& ex)
{
dlog[Debug::CRIT] << myname << "(step): (respond) " << ex << std::endl;
}
}
if( sidLostPackets!=DefaultObjectId )
{
try
{
shm->localSaveValue(aitLostPackets,sidLostPackets,getLostPacketsNum(),shm->ID());
}
catch(Exception& ex)
{
dlog[Debug::CRIT] << myname << "(step): (lostPackets) " << ex << std::endl;
}
}
msleep(updatepause); msleep(updatepause);
} }
} }
......
...@@ -67,6 +67,9 @@ class UNetReceiver ...@@ -67,6 +67,9 @@ class UNetReceiver
void setLostTimeout( timeout_t msec ); void setLostTimeout( timeout_t msec );
void setMaxDifferens( unsigned long set ); void setMaxDifferens( unsigned long set );
void setRespondID( UniSetTypes::ObjectId id );
void setLostPacketsID( UniSetTypes::ObjectId id );
void setMaxProcessingCount( int set ); void setMaxProcessingCount( int set );
inline ost::IPV4Address getAddress(){ return addr; } inline ost::IPV4Address getAddress(){ return addr; }
...@@ -100,6 +103,11 @@ class UNetReceiver ...@@ -100,6 +103,11 @@ class UNetReceiver
PassiveTimer ptLostTimeout; PassiveTimer ptLostTimeout;
unsigned long lostPackets; /*!< счётчик потерянных пакетов */ unsigned long lostPackets; /*!< счётчик потерянных пакетов */
UniSetTypes::ObjectId sidRespond;
IOController::DIOStateList::iterator ditRespond;
UniSetTypes::ObjectId sidLostPackets;
IOController::AIOStateList::iterator aitLostPackets;
bool activated; bool activated;
ThreadCreator<UNetReceiver>* r_thr; // receive thread ThreadCreator<UNetReceiver>* r_thr; // receive thread
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment