67 {
68 const CLI::App* sessionApp = subProtocolContext->getSocketConnection()->getConfigInstance()->getSection("session", true, true);
69 const CLI::App* subApp = subProtocolContext->getSocketConnection()->getConfigInstance()->getSection("sub", true, true);
70 const CLI::App* pubApp = subProtocolContext->getSocketConnection()->getConfigInstance()->getSection("pub", true, true);
71
72 subApp = (subApp != nullptr && (*subApp)["--topic"]->count() > 0) ? subApp : nullptr;
73 pubApp = (pubApp != nullptr && (*pubApp)["--topic"]->count() > 0 && (*pubApp)["--message"]->count() > 0) ? pubApp : nullptr;
74
75 iot::mqtt::client::SubProtocol* subProtocol = nullptr;
76
77 if (subApp != nullptr || pubApp != nullptr) {
78 subProtocol = new iot::mqtt::client::SubProtocol(
79 subProtocolContext,
80 getName(),
81 new ::mqtt::mqttcli::lib::Mqtt(subProtocolContext->getSocketConnection()->getConnectionName(),
82 sessionApp != nullptr ? sessionApp->get_option("--client-id")->as<std::string>() : "",
83 sessionApp != nullptr ? sessionApp->get_option("--qos")->as<uint8_t>() : 0,
84 sessionApp != nullptr ? sessionApp->get_option("--keep-alive")->as<uint16_t>() : 60,
85 sessionApp != nullptr ? !sessionApp->get_option("--retain-session")->as<bool>() : true,
86 sessionApp != nullptr ? sessionApp->get_option("--will-topic")->as<std::string>() : "",
87 sessionApp != nullptr ? sessionApp->get_option("--will-message")->as<std::string>() : "",
88 sessionApp != nullptr ? sessionApp->get_option("--will-qos")->as<uint8_t>() : 0,
89 sessionApp != nullptr ? sessionApp->get_option("--will-retain")->as<bool>() : false,
90 sessionApp != nullptr ? sessionApp->get_option("--username")->as<std::string>() : "",
91 sessionApp != nullptr ? sessionApp->get_option("--password")->as<std::string>() : "",
92 subApp != nullptr ? subApp->get_option("--topic")->as<std::list<std::string>>()
93 : std::list<std::string>(),
94 pubApp != nullptr ? pubApp->get_option("--topic")->as<std::string>() : "",
95 pubApp != nullptr ? pubApp->get_option("--message")->as<std::string>() : "",
96 pubApp != nullptr ? pubApp->get_option("--retain")->as<bool>() : false));
97 } else {
98 VLOG(0) << "[" << Color::Code::FG_RED << "Error" << Color::Code::FG_DEFAULT << "] "
99 << subProtocolContext->getSocketConnection()->getConnectionName() << ": one of 'sub' or 'pub' is required";
100 }
101
102 return subProtocol;
103 }