Commit 0f0dbfd8 authored by Pavel Vainerman's avatar Pavel Vainerman

(MBSlave): заложил скелет реализации REST API

parent 8a08d486
......@@ -1504,6 +1504,24 @@ namespace uniset
cout << LogServer::help_print("prefix-logserver") << endl;
}
// -----------------------------------------------------------------------------
string MBSlave::amode2str(MBSlave::AccessMode m)
{
switch(m)
{
case amRW:
return "rw";
case amRO:
return "ro";
case amWO:
return "wr";
default:
return "";
}
}
// -----------------------------------------------------------------------------
std::shared_ptr<MBSlave> MBSlave::init_mbslave(int argc, const char* const* argv, uniset::ObjectId icID,
const std::shared_ptr<SharedMemory>& ic, const string& prefix )
{
......@@ -1983,6 +2001,129 @@ namespace uniset
pingOK = false;
return ModbusRTU::erTimeOut;
}
#ifndef DISABLE_REST_API
// -------------------------------------------------------------------------
Poco::JSON::Object::Ptr MBSlave::httpHelp( const Poco::URI::QueryParameters& p )
{
uniset::json::help::object myhelp(myname, UniSetObject::httpHelp(p));
{
// 'regs'
uniset::json::help::item cmd("get registers list");
cmd.param("regs=reg1,reg2,reg3..", "get these registers");
cmd.param("addr=mbaddr1,mbaddr2,..", "get registers for mbaddr");
myhelp.add(cmd);
}
return myhelp;
}
// -------------------------------------------------------------------------
Poco::JSON::Object::Ptr MBSlave::httpRequest( const string& req, const Poco::URI::QueryParameters& p )
{
if( req == "regs" )
return request_regs(req, p);
return UniSetObject::httpRequest(req, p);
}
// -------------------------------------------------------------------------
Poco::JSON::Object::Ptr MBSlave::request_regs( const string& req, const Poco::URI::QueryParameters& params )
{
Poco::JSON::Object::Ptr json = new Poco::JSON::Object();
Poco::JSON::Array::Ptr jdata = uniset::json::make_child_array(json, "regs");
auto my = httpGetMyInfo(json);
auto oind = uniset_conf()->oind;
std::vector<std::string> q_regs;
std::vector<std::string> q_addr;
if( !params.empty() )
{
for( const auto& p: params )
{
if( p.first == "regs" )
q_regs = uniset::explode_str(p.second, ',');
else if( p.first == "addr" )
q_addr = uniset::explode_str(p.second, ',');
}
}
/* Создаём json
* { {"addr":
* {"regs":
* {reginfo..},
* {reginfo..},
* }},
* }
*/
// Проход по списку заданных addr..
if( !q_addr.empty() )
{
for( const auto& a: q_addr )
{
ModbusRTU::ModbusAddr mbaddr = ModbusRTU::str2mbAddr(a);
auto i = iomap.find(mbaddr);
if( i != iomap.end() )
{
Poco::JSON::Object::Ptr jaddr = get_regs(i->first,i->second, q_regs);
jdata->add(jaddr);
}
}
}
else // Проход по всему списку
{
for( const auto& i: iomap )
{
Poco::JSON::Object::Ptr jaddr = get_regs(i.first,i.second, q_regs);
jdata->add(jaddr);
}
}
return json;
}
// -------------------------------------------------------------------------
Poco::JSON::Object::Ptr MBSlave::get_regs(ModbusRTU::ModbusAddr addr, const RegMap& rmap, const std::vector<string>& q_regs )
{
Poco::JSON::Object::Ptr jaddr = new Poco::JSON::Object();
Poco::JSON::Array::Ptr regs = new Poco::JSON::Array();
jaddr->set( ModbusRTU::addr2str(addr), regs);
if( q_regs.empty() )
{
for( const auto& r: rmap )
{
Poco::JSON::Object::Ptr reginfo = get_reginfo(r.second);
regs->add(reginfo);
}
}
else
{
for( const auto& s : q_regs )
{
auto reg = genRegID( ModbusRTU::str2mbData(s), default_mbfunc);
auto r = rmap.find(reg);
if( r != rmap.end() )
{
Poco::JSON::Object::Ptr reginfo = get_reginfo(r->second);
regs->add(reginfo);
}
}
}
return jaddr;
}
// -------------------------------------------------------------------------
Poco::JSON::Object::Ptr MBSlave::get_reginfo( const IOProperty& prop )
{
Poco::JSON::Object::Ptr reginfo = new Poco::JSON::Object();
reginfo->set("mbreg", prop.mbreg);
reginfo->set("vtype", VTypes::type2str( prop.vtype));
reginfo->set("regID", prop.regID);
reginfo->set("amode", amode2str( prop.amode));
reginfo->set("value", prop.value);
return reginfo;
}
#endif
// -------------------------------------------------------------------------
ModbusRTU::mbErrCode MBSlave::much_real_read(RegMap& rmap, const ModbusRTU::ModbusData reg, ModbusRTU::ModbusData* dat,
size_t count, const int fn )
......@@ -2652,6 +2793,7 @@ namespace uniset
i->info = inf.str().c_str();
return i._retn();
}
// ----------------------------------------------------------------------------
void MBSlave::initTCPClients( UniXML::iterator confnode )
{
......
......@@ -60,6 +60,7 @@ namespace uniset
- \ref sec_MBSlave_MEIRDI
- \ref sec_MBSlave_DIAG
- \ref sec_MBSlave_TCP
- \ref sec_MBSlave_REST_API
\section sec_MBSlave_Comm Общее описание Modbus slave
Класс реализует базовые функции для протокола Modbus в slave режиме. Реализацию Modbus RTU - см. RTUExchange.
......@@ -303,6 +304,15 @@ namespace uniset
</MBTCPPersistentSlave>
\endcode
\section sec_MBSlave_REST_API MBSlave HTTP API
/help - Получение списка доступных команд
/ - получение стандартной информации
/regs?regs=reg1,reg2,reg3,..&addr=addr1,addr2,addr3 - получение списка регистров
Не обязательные параметры:
regs - выдать информацию только по указанным регистрам
addr - выдать информацию только по указанным адресам устройств
*/
// -----------------------------------------------------------------------------
/*! Реализация slave-интерфейса */
......@@ -330,6 +340,8 @@ namespace uniset
amWO
};
std::string amode2str( AccessMode m );
struct BitRegProperty;
struct IOProperty:
......@@ -388,6 +400,12 @@ namespace uniset
virtual uniset::SimpleInfo* getInfo( const char* userparam = 0 ) override;
#ifndef DISABLE_REST_API
// http API
virtual Poco::JSON::Object::Ptr httpHelp( const Poco::URI::QueryParameters& p ) override;
virtual Poco::JSON::Object::Ptr httpRequest( const string& req, const Poco::URI::QueryParameters& p ) override;
#endif
protected:
/*! обработка 0x01 */
......@@ -514,6 +532,12 @@ namespace uniset
ModbusRTU::mbErrCode real_bitreg_write_it( std::shared_ptr<BitRegProperty>& bp, const ModbusRTU::ModbusData val );
ModbusRTU::mbErrCode real_write_prop(IOProperty* p, ModbusRTU::ModbusData* dat, size_t& i, size_t count );
#ifndef DISABLE_REST_API
// http api
Poco::JSON::Object::Ptr request_regs( const std::string& req, const Poco::URI::QueryParameters& p );
Poco::JSON::Object::Ptr get_regs(ModbusRTU::ModbusAddr addr, const RegMap& rmap, const std::vector<std::string>& q_regs );
Poco::JSON::Object::Ptr get_reginfo( const IOProperty& prop );
#endif
MBSlave();
timeout_t initPause = { 3000 };
uniset::uniset_rwmutex mutex_start;
......
......@@ -858,7 +858,7 @@ Poco::JSON::Object::Ptr IOController::httpHelp( const Poco::URI::QueryParameters
{
// 'sensors'
uniset::json::help::item cmd("et all sensors");
uniset::json::help::item cmd("get all sensors");
cmd.param("nameonly", "get only name sensors");
cmd.param("offset=N", "get from N record");
cmd.param("limit=M", "limit of records");
......
......@@ -1223,7 +1223,7 @@ Poco::JSON::Object::Ptr IONotifyController::request_consumers( const string& req
ConsumerListInfo emptyList;
if( p.size() > 0 )
if( !p.empty() )
{
if( !p[0].first.empty() )
slist = uniset::getSInfoList( p[0].first, uniset_conf() );
......
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