Commit f00360d2 authored by Pavel Vainerman's avatar Pavel Vainerman

(UHttp): Заложил HTTP API в SharedMemory

parent aabc49af
...@@ -609,6 +609,121 @@ void SharedMemory::logging( SensorMessage& sm ) ...@@ -609,6 +609,121 @@ void SharedMemory::logging( SensorMessage& sm )
IONotifyController::logging(sm); IONotifyController::logging(sm);
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
nlohmann::json SharedMemory::request_get(const string& req, const Poco::URI::QueryParameters& p)
{
if( p.empty() )
{
ostringstream err;
err << myname << "(request): 'get'. Unknown ID or Name.";
throw UniSetTypes::SystemError(err.str());
}
auto conf = uniset_conf();
auto slist = UniSetTypes::getSInfoList( p[0].first, conf );
if( slist.empty() )
{
ostringstream err;
err << myname << "(request): 'get'. Unknown ID or Name";
throw UniSetTypes::SystemError(err.str());
}
smlog1 << myname << "(GET): " << p[0].first << " size=" << slist.size() << endl;
nlohmann::json jdata;
for( const auto& s: slist )
{
string sid( std::to_string(s.si.id) );
try
{
jdata[sid]["value"] = getValue(s.si.id);
}
catch( IOController_i::NameNotFound& ex )
{
jdata[sid]["value"] = {};
jdata[sid]["error"] = string(ex.err);
}
catch( std::exception& ex )
{
jdata[sid]["value"] = {};
jdata[sid]["error"] = ex.what();
}
}
return jdata;
}
// -----------------------------------------------------------------------------
nlohmann::json SharedMemory::request_sensors( const string& req, const Poco::URI::QueryParameters& params )
{
nlohmann::json jdata;
size_t num = 0;
size_t offset = 0;
size_t limit = 0;
for( const auto& p: params )
{
if( p.first == "offset" )
offset = uni_atoi(p.second);
else if( p.first == "limit" )
limit = uni_atoi(p.second);
}
size_t endnum = offset + limit;
for( auto it=myioBegin(); it!=myioEnd(); ++it,num++ )
{
if( limit > 0 && num >= endnum )
break;
if( offset > 0 && num < offset )
continue;
// std::shared_ptr<USensorInfo>
auto s = it->second;
string sid( to_string(s->si.id));
{
uniset_rwmutex_rlock lock(s->val_lock);
jdata[sid]["value"] = s->value;
jdata[sid]["real_value"] = s->real_value;
}
jdata[sid]["id"] = sid;
jdata[sid]["type"] = UniSetTypes::iotype2str(s->type);
jdata[sid]["default_val"] = s->default_val;
jdata[sid]["tv_sec"] = s->tv_sec;
jdata[sid]["tv_nsec"] = s->tv_nsec;
jdata[sid]["dbignore"] = s->dbignore;
jdata[sid]["calibration"] = {
{ "cmin",s->ci.minCal},
{ "cmax",s->ci.maxCal},
{ "rmin",s->ci.minRaw},
{ "rmax",s->ci.maxRaw},
{ "precision",s->ci.precision}
};
// ::CORBA::Boolean undefined;
// ::CORBA::Boolean blocked;
// ::CORBA::Long priority;
// IOController_i::SensorInfo d_si = { UniSetTypes::DefaultObjectId, UniSetTypes::DefaultObjectId }; /*!< идентификатор датчика, от которого зависит данный */
// long d_value = { 1 }; /*!< разрешающее работу значение датчика от которого зависит данный */
// long d_off_value = { 0 }; /*!< блокирующее значение */
}
jdata["count"] = num;
return jdata;
}
// -----------------------------------------------------------------------------
nlohmann::json SharedMemory::request_consumers(const string& req, const Poco::URI::QueryParameters& p)
{
//! \todo Не реализовано
nlohmann::json j = {};
return j;
}
// -----------------------------------------------------------------------------
void SharedMemory::buildHistoryList( xmlNode* cnode ) void SharedMemory::buildHistoryList( xmlNode* cnode )
{ {
sminfo << myname << "(buildHistoryList): ..." << endl; sminfo << myname << "(buildHistoryList): ..." << endl;
...@@ -730,6 +845,49 @@ SharedMemory::HistorySlot SharedMemory::signal_history() ...@@ -730,6 +845,49 @@ SharedMemory::HistorySlot SharedMemory::signal_history()
return m_historySignal; return m_historySignal;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
nlohmann::json SharedMemory::getData( const Poco::URI::QueryParameters& p )
{
nlohmann::json jdata = IONotifyController::getData(p);
// jdata
return jdata;
}
// -----------------------------------------------------------------------------
nlohmann::json SharedMemory::httpHelp( const Poco::URI::QueryParameters& p )
{
nlohmann::json jdata = IONotifyController::httpHelp(p);
jdata[myname]["help"] = {
{"get","get value for sensor [have parameters]"},
{"sensors","get all sensors. [have parameters]"},
{"consumers","get consumers list"}
};
jdata[myname]["help"]["sensors"]["parameters"] = {
{"nameonly","get only name sensors"},
{"offset=N","get from N record"},
{"limit=M","limit of records"}
};
jdata[myname]["help"]["get"]["parameters"] = {
{"id1,name2,id3","get value for id1,name2,id3 sensors"},
};
return jdata;
}
// -----------------------------------------------------------------------------
nlohmann::json SharedMemory::request(const string& req, const Poco::URI::QueryParameters& p)
{
if( req == "get" )
return request_get(req,p);
if( req == "sensors" )
return request_sensors(req,p);
if( req == "consumers" )
return request_consumers(req,p);
return IONotifyController::request(req,p);
}
// -----------------------------------------------------------------------------
void SharedMemory::saveToHistory() void SharedMemory::saveToHistory()
{ {
if( hist.empty() ) if( hist.empty() )
......
...@@ -54,6 +54,7 @@ ...@@ -54,6 +54,7 @@
- \ref sec_SM_Pulsar - \ref sec_SM_Pulsar
- \ref sec_SM_DBLog - \ref sec_SM_DBLog
- \ref sec_SM_ReservSM - \ref sec_SM_ReservSM
- \ref sec_SM_REST_API
\section sec_SM_Conf Определение списка регистрируемых датчиков \section sec_SM_Conf Определение списка регистрируемых датчиков
SM позволяет определять список датчиков, которые он будет предоставлять SM позволяет определять список датчиков, которые он будет предоставлять
...@@ -296,6 +297,16 @@ ...@@ -296,6 +297,16 @@
</ReservList> </ReservList>
</SharedMemory> </SharedMemory>
\endcode \endcode
\section sec_SM_REST_API SharedMemory HTTP API
/help - Получение списка доступных команд
/ - получение стандартной информации
/get?id1,name2,id3,.. - получение значений указанных датчиков
/sensors?offset=N&limit=M - получение полной информации по списку датчиков.
Не обязательные параметры:
offset - начиная с,
limit - количество в ответе.
*/ */
class SharedMemory: class SharedMemory:
public IONotifyController public IONotifyController
...@@ -397,6 +408,11 @@ class SharedMemory: ...@@ -397,6 +408,11 @@ class SharedMemory:
return smlog; return smlog;
} }
// http API
virtual nlohmann::json getData( const Poco::URI::QueryParameters& p ) override;
virtual nlohmann::json httpHelp( const Poco::URI::QueryParameters& p ) override;
virtual nlohmann::json request( const std::string& req, const Poco::URI::QueryParameters& p ) override;
protected: protected:
typedef std::list<Restorer_XML::ReaderSlot> ReadSlotList; typedef std::list<Restorer_XML::ReaderSlot> ReadSlotList;
ReadSlotList lstRSlot; ReadSlotList lstRSlot;
...@@ -475,6 +491,10 @@ class SharedMemory: ...@@ -475,6 +491,10 @@ class SharedMemory:
virtual void dumpOrdersList( const UniSetTypes::ObjectId sid, const IONotifyController::ConsumerListInfo& lst ) override {}; virtual void dumpOrdersList( const UniSetTypes::ObjectId sid, const IONotifyController::ConsumerListInfo& lst ) override {};
virtual void dumpThresholdList( const UniSetTypes::ObjectId sid, const IONotifyController::ThresholdExtList& lst ) override {} virtual void dumpThresholdList( const UniSetTypes::ObjectId sid, const IONotifyController::ThresholdExtList& lst ) override {}
virtual nlohmann::json request_get( const std::string& req, const Poco::URI::QueryParameters& p );
virtual nlohmann::json request_sensors( const std::string& req, const Poco::URI::QueryParameters& p );
virtual nlohmann::json request_consumers( const std::string& req, const Poco::URI::QueryParameters& p );
bool dblogging = { false }; bool dblogging = { false };
//! \warning Оптимизация использует userdata! Это опасно, если кто-то ещё захочет //! \warning Оптимизация использует userdata! Это опасно, если кто-то ещё захочет
......
...@@ -5,7 +5,7 @@ export LD_LIBRARY_PATH="../../lib/.libs;../lib/.libs" ...@@ -5,7 +5,7 @@ export LD_LIBRARY_PATH="../../lib/.libs;../lib/.libs"
ulimit -Sc 10000000000 ulimit -Sc 10000000000
./uniset2-start.sh -f ./uniset2-smemory --smemory-id SharedMemory \ ./uniset2-start.sh -f ./uniset2-smemory --smemory-id SharedMemory \
--confile test.xml --datfile test.xml --db-logging 1 --ulog-add-levels system \ --confile test.xml --datfile test.xml --db-logging 1 --ulog-add-levels system,level1 \
--sm-log-add-levels any $* --sm-run-logserver \ --sm-log-add-levels any $* --sm-run-logserver \
#--pulsar-id DO_C --pulsar-iotype DO --pulsar-msec 100 #--pulsar-id DO_C --pulsar-iotype DO --pulsar-msec 100
......
...@@ -231,6 +231,7 @@ class IOController: ...@@ -231,6 +231,7 @@ class IOController:
IOStateList::iterator myioBegin(); IOStateList::iterator myioBegin();
IOStateList::iterator myioEnd(); IOStateList::iterator myioEnd();
IOStateList::iterator myiofind( UniSetTypes::ObjectId id ); IOStateList::iterator myiofind( UniSetTypes::ObjectId id );
size_t ioCount();
// -------------------------- // --------------------------
private: private:
......
...@@ -61,7 +61,9 @@ namespace UniSetTypes ...@@ -61,7 +61,9 @@ namespace UniSetTypes
// throw SystemError // throw SystemError
virtual nlohmann::json getData( const Poco::URI::QueryParameters& p ) = 0; virtual nlohmann::json getData( const Poco::URI::QueryParameters& p ) = 0;
virtual nlohmann::json httpHelp( const Poco::URI::QueryParameters& p ) = 0; virtual nlohmann::json httpHelp( const Poco::URI::QueryParameters& p ) = 0;
virtual nlohmann::json request( const std::string& req, const Poco::URI::QueryParameters& p ) = 0;
// не обязательная функция.
virtual nlohmann::json request( const std::string& req, const Poco::URI::QueryParameters& p );
}; };
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
/*! интерфейс для обработки запросов к объектам */ /*! интерфейс для обработки запросов к объектам */
......
...@@ -104,7 +104,6 @@ class UniSetObject: ...@@ -104,7 +104,6 @@ class UniSetObject:
// HTTP API // HTTP API
virtual nlohmann::json getData( const Poco::URI::QueryParameters& p ) override; virtual nlohmann::json getData( const Poco::URI::QueryParameters& p ) override;
virtual nlohmann::json httpHelp( const Poco::URI::QueryParameters& p ) override; virtual nlohmann::json httpHelp( const Poco::URI::QueryParameters& p ) override;
virtual nlohmann::json request( const std::string& req, const Poco::URI::QueryParameters& p ) override;
// -------------- вспомогательные -------------- // -------------- вспомогательные --------------
/*! получить ссылку (на себя) */ /*! получить ссылку (на себя) */
......
...@@ -85,6 +85,7 @@ namespace UniSetTypes ...@@ -85,6 +85,7 @@ namespace UniSetTypes
typedef CORBA::Object_var ObjectVar; /*!< Ссылка на объект регистрируемый в ObjectRepository */ typedef CORBA::Object_var ObjectVar; /*!< Ссылка на объект регистрируемый в ObjectRepository */
UniversalIO::IOType getIOType( const std::string& s ) noexcept; UniversalIO::IOType getIOType( const std::string& s ) noexcept;
std::string iotype2str( const UniversalIO::IOType& t ) noexcept;
std::ostream& operator<<( std::ostream& os, const UniversalIO::IOType t ); std::ostream& operator<<( std::ostream& os, const UniversalIO::IOType t );
std::ostream& operator<<( std::ostream& os, const IONotifyController_i::ThresholdInfo& ti ); std::ostream& operator<<( std::ostream& os, const IONotifyController_i::ThresholdInfo& ti );
std::ostream& operator<<( std::ostream& os, const IOController_i::ShortIOInfo& s ); std::ostream& operator<<( std::ostream& os, const IOController_i::ShortIOInfo& s );
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
*/ */
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
#include <ostream> #include <ostream>
#include "Exceptions.h"
#include "UHttpRequestHandler.h" #include "UHttpRequestHandler.h"
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
using namespace std; using namespace std;
...@@ -152,3 +153,10 @@ HTTPRequestHandler* UHttpRequestHandlerFactory::createRequestHandler( const HTTP ...@@ -152,3 +153,10 @@ HTTPRequestHandler* UHttpRequestHandlerFactory::createRequestHandler( const HTTP
return new UHttpRequestHandler(registry); return new UHttpRequestHandler(registry);
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
nlohmann::json IHttpRequest::request( const string& req, const Poco::URI::QueryParameters& p )
{
std::ostringstream err;
err << "(IHttpRequest::Request): " << req << " not supported";
throw UniSetTypes::SystemError(err.str());
}
// -------------------------------------------------------------------------
...@@ -402,14 +402,6 @@ nlohmann::json UniSetObject::httpHelp( const Poco::URI::QueryParameters& p ) ...@@ -402,14 +402,6 @@ nlohmann::json UniSetObject::httpHelp( const Poco::URI::QueryParameters& p )
return jdata; return jdata;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
nlohmann::json UniSetObject::request( const string& req, const Poco::URI::QueryParameters& p )
{
//!\todo Подумать может возвращать getData() типа стандартный ответ..
nlohmann::json jdata;
jdata[myname][req]= "";
return jdata;
}
// ------------------------------------------------------------------------------------------
ObjectPtr UniSetObject::getRef() const ObjectPtr UniSetObject::getRef() const
{ {
UniSetTypes::uniset_rwmutex_rlock lock(refmutex); UniSetTypes::uniset_rwmutex_rlock lock(refmutex);
......
...@@ -428,21 +428,27 @@ UniversalIO::IOType UniSetTypes::getIOType( const std::string& stype ) noexcept ...@@ -428,21 +428,27 @@ UniversalIO::IOType UniSetTypes::getIOType( const std::string& stype ) noexcept
return UniversalIO::UnknownIOType; return UniversalIO::UnknownIOType;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
std::ostream& UniSetTypes::operator<<( std::ostream& os, const UniversalIO::IOType t )
std::string UniSetTypes::iotype2str( const UniversalIO::IOType& t ) noexcept
{ {
if( t == UniversalIO::AI ) if( t == UniversalIO::AI )
return os << "AI"; return "AI";
if( t == UniversalIO::DI ) if( t == UniversalIO::DI )
return os << "DI"; return "DI";
if( t == UniversalIO::AO ) if( t == UniversalIO::AO )
return os << "AO"; return "AO";
if( t == UniversalIO::DO ) if( t == UniversalIO::DO )
return os << "DO"; return "DO";
return os << "UnknownIOType"; return "UnknownIOType";
}
// ------------------------------------------------------------------------------------------
std::ostream& UniSetTypes::operator<<( std::ostream& os, const UniversalIO::IOType t )
{
return os << iotype2str(t);
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
bool UniSetTypes::check_filter( UniXML::iterator& it, const std::string& f_prop, const std::string& f_val ) noexcept bool UniSetTypes::check_filter( UniXML::iterator& it, const std::string& f_prop, const std::string& f_val ) noexcept
......
...@@ -631,6 +631,11 @@ void IOController::USensorInfo::init( const IOController_i::SensorIOInfo& s ) ...@@ -631,6 +631,11 @@ void IOController::USensorInfo::init( const IOController_i::SensorIOInfo& s )
(*this) = std::move(r); (*this) = std::move(r);
} }
// ---------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------
size_t IOController::ioCount()
{
return ioList.size();
}
// ----------------------------------------------------------------------------------------
IOController::IOStateList::iterator IOController::myioBegin() IOController::IOStateList::iterator IOController::myioBegin()
{ {
return ioList.begin(); return ioList.begin();
......
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