Commit 938af6e6 authored by Pavel Vainerman's avatar Pavel Vainerman

(MQTTPublisher): подправил описание, make style

parent 3615f9fd
...@@ -77,6 +77,7 @@ MQTTPublisher::MQTTPublisher(UniSetTypes::ObjectId objId, xmlNode* cnode, UniSet ...@@ -77,6 +77,7 @@ MQTTPublisher::MQTTPublisher(UniSetTypes::ObjectId objId, xmlNode* cnode, UniSet
smTestID = sid; smTestID = sid;
UniXML::iterator i(sit); UniXML::iterator i(sit);
if( !i.goChildren() ) if( !i.goChildren() )
continue; continue;
...@@ -84,7 +85,7 @@ MQTTPublisher::MQTTPublisher(UniSetTypes::ObjectId objId, xmlNode* cnode, UniSet ...@@ -84,7 +85,7 @@ MQTTPublisher::MQTTPublisher(UniSetTypes::ObjectId objId, xmlNode* cnode, UniSet
continue; continue;
MQTTTextInfo mi(topicsensors, sit, i); MQTTTextInfo mi(topicsensors, sit, i);
textpublist.emplace(sid,std::move(mi) ); textpublist.emplace(sid, std::move(mi) );
} }
if( publist.empty() ) if( publist.empty() )
...@@ -161,13 +162,13 @@ string MQTTPublisher::replace( const std::string& text, MQTTPublisher::MQTTTextI ...@@ -161,13 +162,13 @@ string MQTTPublisher::replace( const std::string& text, MQTTPublisher::MQTTTextI
ostringstream smax; ostringstream smax;
smax << ri->rmax; smax << ri->rmax;
txt = replace_all(txt,"%v",v.str()); txt = replace_all(txt, "%v", v.str());
txt = replace_all(txt,"%n",ti->xmlnode.getProp("name")); txt = replace_all(txt, "%n", ti->xmlnode.getProp("name"));
txt = replace_all(txt,"%t",ti->xmlnode.getProp("textname")); txt = replace_all(txt, "%t", ti->xmlnode.getProp("textname"));
txt = replace_all(txt,"%i",id.str()); txt = replace_all(txt, "%i", id.str());
txt = replace_all(txt,"%rmin",smin.str()); txt = replace_all(txt, "%rmin", smin.str());
txt = replace_all(txt,"%rmax",smax.str()); txt = replace_all(txt, "%rmax", smax.str());
txt = replace_all(txt,"%r",r.str()); txt = replace_all(txt, "%r", r.str());
return std::move(txt); return std::move(txt);
} }
...@@ -283,6 +284,7 @@ void MQTTPublisher::askSensors( UniversalIO::UIOCommand cmd ) ...@@ -283,6 +284,7 @@ void MQTTPublisher::askSensors( UniversalIO::UIOCommand cmd )
void MQTTPublisher::sensorInfo( const UniSetTypes::SensorMessage* sm ) void MQTTPublisher::sensorInfo( const UniSetTypes::SensorMessage* sm )
{ {
auto i = publist.find(sm->id); auto i = publist.find(sm->id);
if( i != publist.end() ) if( i != publist.end() )
{ {
ostringstream m; ostringstream m;
...@@ -302,14 +304,16 @@ void MQTTPublisher::sensorInfo( const UniSetTypes::SensorMessage* sm ) ...@@ -302,14 +304,16 @@ void MQTTPublisher::sensorInfo( const UniSetTypes::SensorMessage* sm )
} }
auto t = textpublist.find(sm->id); auto t = textpublist.find(sm->id);
if( t != textpublist.end() ) if( t != textpublist.end() )
{ {
auto rlist = t->second.rlist; auto rlist = t->second.rlist;
for( auto&& r: rlist )
for( auto && r : rlist )
{ {
if( r.check(sm->value) ) if( r.check(sm->value) )
{ {
string tmsg = replace(r.text,&(t->second),&r,sm->value); string tmsg = replace(r.text, &(t->second), &r, sm->value);
//subscribe(NULL, i.second.pubname.c_str()); //subscribe(NULL, i.second.pubname.c_str());
myinfo << "(sensorInfo): publish: topic='" << t->second.pubname << "' msg='" << tmsg << "'" << endl; myinfo << "(sensorInfo): publish: topic='" << t->second.pubname << "' msg='" << tmsg << "'" << endl;
...@@ -342,6 +346,7 @@ MQTTPublisher::MQTTTextInfo::MQTTTextInfo( const string& rootsec, UniXML::iterat ...@@ -342,6 +346,7 @@ MQTTPublisher::MQTTTextInfo::MQTTTextInfo( const string& rootsec, UniXML::iterat
} }
std::string subtopic(i.getProp("subtopic")); std::string subtopic(i.getProp("subtopic"));
if( !subtopic.empty() ) if( !subtopic.empty() )
pubname = rootsec + "/" + subtopic; pubname = rootsec + "/" + subtopic;
else else
...@@ -358,19 +363,21 @@ MQTTPublisher::MQTTTextInfo::MQTTTextInfo( const string& rootsec, UniXML::iterat ...@@ -358,19 +363,21 @@ MQTTPublisher::MQTTTextInfo::MQTTTextInfo( const string& rootsec, UniXML::iterat
{ {
long min = 0; long min = 0;
long max = 0; long max = 0;
if( i.getName() == "range" ) if( i.getName() == "range" )
{ {
min = i.getIntProp("min"); min = i.getIntProp("min");
max = i.getIntProp("max"); max = i.getIntProp("max");
if( min > max ) if( min > max )
std::swap(min,max); std::swap(min, max);
} }
else else
{ {
min = max = i.getIntProp("value"); min = max = i.getIntProp("value");
} }
RangeInfo r(min,max,i.getProp("text")); RangeInfo r(min, max, i.getProp("text"));
rlist.push_back( std::move(r) ); rlist.push_back( std::move(r) );
} }
} }
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
MQTT - это.. MQTT - это..
Данная реализация построена на использованиие билиотеки mosquitto. Данная реализация построена на использованиие библиотеки mosquitto.
Издатель публикует события по каждому изменению датчика в указанном топике. Издатель публикует события по каждому изменению датчика в указанном топике.
\section sec_MQTT_Conf Настройка MQTTPublisher \section sec_MQTT_Conf Настройка MQTTPublisher
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
Название можно задать при помощи аргумента конмадной строки --prefix-mqtt-topicsensors Название можно задать при помощи аргумента конмадной строки --prefix-mqtt-topicsensors
или в настроечной секции topicsensors="..". По умолчанию topicsensors='sensors'. или в настроечной секции topicsensors="..". По умолчанию topicsensors='sensors'.
Какие датчики "публиковать" можно задавать при помощи filter-field и filter-value параметров. События по каким датчикам "публиковать" можно задавать при помощи filter-field и filter-value параметров.
--prefix-filter-field - задаёт фильтрующее поле для датчиков --prefix-filter-field - задаёт фильтрующее поле для датчиков
--prefix-filter-value - задаётзначение фильтрующего поля для датчиков. Необязательнй параметр. --prefix-filter-value - задаётзначение фильтрующего поля для датчиков. Необязательнй параметр.
...@@ -47,42 +47,41 @@ ...@@ -47,42 +47,41 @@
Но можно задать и в настроечной секции: mqttHost=".." и mqttPort=".." Но можно задать и в настроечной секции: mqttHost=".." и mqttPort=".."
Помимо этого можно задать время проверки соединения, параметром Помимо этого можно задать время проверки соединения, параметром
--prefix-mqtt-keepalive sec - По умолчанию: 60 --prefix-mqtt-keepalive sec - По умолчанию: 60 или и в настроечной секции: mqttKeepAlive=".."
или и в настроечной секции: mqttKeepAlive=".."
Для запуска издателя, неоходимо наличие в configure.xml секции: <ObjectName name="ObjectName" ...параметры">. Для запуска издателя, неоходимо наличие в configure.xml секции: <ObjectName name="ObjectName" ...параметры">.
\todo Доделать контрольный таймер (контроль наличия соединения с сервером) \todo Доделать контрольный таймер (контроль наличия соединения с сервером)
\section sec_MQTT_Text Генерирование текстовых сообщений \section sec_MQTT_Text Генерирование текстовых сообщений
В данном классе реализована возможность сопоставлять значения датчиков текстовым сообщениям, посылаемым на сервер. Имеется возможность сопоставлять значения датчиков текстовым сообщениям, посылаемым на сервер.
Для этого необходимо в настроечной секции для датчика создать секцию <mqtt> Для этого необходимо в настроечной секции для датчика создать подсекцию <mqtt>. Пример:
\code \code
<item id="10" name="MySensor1" .....> <item id="10" name="MySensor1" filter_field="filter_value"...>
<mqtt subtopic="myevent"> <mqtt subtopic="myevent">
<msg value="12" text="My text for value %v"/> <msg value="12" text="My text for value %v"/>
<msg value="13" text="My text for value %v"/> <msg value="13" text="My text for value %v"/>
<msg value="14" text="My text for value %v"/> <msg value="14" text="My text for value %v"/>
<range min="10" max="20" text="My text for value %r. Value = %v" <range min="10" max="20" text="My text for range %r. %n = %v"/>
<mqtt> <mqtt>
</item> </item>
\endcode \endcode
- \b range - задаёт диапазон включающий [min,max] - \b range - задаёт диапазон включающий [min,max]
- \b subtopic - задаёт подраздел в корневом топике (см. topicsensors). Т.е. полный топик для публикации текстовых сообщений
будет иметь вид ROOTPROJECT/topicsensors/sensorname/textevent или если задано поле \subtopic то
события будут опубликованы в ROOTPROJECT/topicsensors/subtopic
При этом в тексте можно применять следующие "подстановки": При этом в тексте можно применять следующие "подстановки":
- \b %v - текущее значение - \b %v - текущее значение (value)
- \b %n - name - \b %n - name
- \b %t - textname - \b %t - textname
- \b %i - ID - \b %i - ID
- \b %r - заданный диапазон (range). Заменяется на "[min:max]". Действует только для диапазонов. - \b %r - заданный диапазон (range). Заменяется на "[min:max]"
- \b %rmin - минимальное значение диапазона (range min). Действует только для диапазонов. - \b %rmin - минимальное значение диапазона (range min)
- \b %rmax - максимальное значение диапазона (range max). Действует только для диапазонов. - \b %rmax - максимальное значение диапазона (range max)
\note Если заданные "одиночные" значения совпадают с диапазоном, то будет сгенерировано несколько сообщений. \note Если заданные "одиночные" значения совпадают с диапазоном, то будет сгенерировано несколько сообщений. Т.е. диапазоны могут пересекатся.
Поле \b subtopic - задаёт подраздел в корневом топике (см. topicsensors). Т.е. полный топик для публикации текстовых сообщений
будет иметь вид ROOTPROJECT/topicsensors/sensorname/textevent или если задано поле \subtopic то
события будут опубликованы в ROOTPROJECT/topicsensors/subtopic
*/ */
class MQTTPublisher: class MQTTPublisher:
protected mosqpp::mosquittopp, protected mosqpp::mosquittopp,
...@@ -138,7 +137,7 @@ class MQTTPublisher: ...@@ -138,7 +137,7 @@ class MQTTPublisher:
struct RangeInfo struct RangeInfo
{ {
RangeInfo( long min, long max, const std::string& t ): rmin(min), rmax(max), text(t){} RangeInfo( long min, long max, const std::string& t ): rmin(min), rmax(max), text(t) {}
long rmin; long rmin;
long rmax; long rmax;
......
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