@@ -46,6 +46,26 @@ std::string toString(CC_MqttsnQoS val)
4646 return Map[idx] + " (" + std::to_string (val) + ' )' ;
4747}
4848
49+
50+ std::string toStringInternal (CC_MqttsnGatewayDisconnectReason val)
51+ {
52+ static const std::string Map[] = {
53+ /* CC_MqttsnGatewayDisconnectReason_DisconnectMsg */ " DISCONNECT Message" ,
54+ /* CC_MqttsnGatewayDisconnectReason_NoGatewayResponse */ " No Response" ,
55+ };
56+
57+ static constexpr std::size_t MapSize = std::extent<decltype (Map)>::value;
58+ static_assert (MapSize == CC_MqttsnGatewayDisconnectReason_ValuesLimit);
59+
60+ auto idx = static_cast <unsigned >(val);
61+ if (MapSize <= idx) {
62+ assert (false ); // Should not happen
63+ return std::to_string (val);
64+ }
65+
66+ return Map[idx] + " (" + std::to_string (val) + ' )' ;
67+ }
68+
4969void printQos (const char * prefix, CC_MqttsnQoS val)
5070{
5171 std::cout << " \t " << prefix << " : " << toString (val) << ' \n ' ;
@@ -173,6 +193,7 @@ AppClient::AppClient(boost::asio::io_context& io, int& result) :
173193{
174194 assert (m_client);
175195 ::cc_mqttsn_client_set_send_output_data_callback (m_client.get(), &AppClient::sendDataCb, this);
196+ ::cc_mqttsn_client_set_gw_disconnect_report_callback (m_client.get(), &AppClient::gwDisconnectedReportCb, this);
176197 ::cc_mqttsn_client_set_message_report_callback (m_client.get(), &AppClient::messageReceivedCb, this);
177198 ::cc_mqttsn_client_set_error_log_callback (m_client.get(), &AppClient::logMessageCb, this);
178199 ::cc_mqttsn_client_set_next_tick_program_callback (m_client.get(), &AppClient::nextTickProgramCb, this);
@@ -278,6 +299,11 @@ void AppClient::disconnectCompleteImpl()
278299 doComplete ();
279300}
280301
302+ void AppClient::gwDisconnectedReportImpl ()
303+ {
304+ doTerminate ();
305+ }
306+
281307std::vector<std::uint8_t > AppClient::parseBinaryData (const std::string& val)
282308{
283309 std::vector<std::uint8_t > result;
@@ -364,7 +390,6 @@ std::string AppClient::toString(CC_MqttsnAsyncOpStatus val)
364390 return Map[idx] + " (" + std::to_string (val) + ' )' ;
365391}
366392
367-
368393std::string AppClient::toString (CC_MqttsnReturnCode val)
369394{
370395 static const std::string Map[] = {
@@ -492,6 +517,12 @@ void AppClient::disconnectCompleteInternal(CC_MqttsnAsyncOpStatus status)
492517 disconnectCompleteImpl ();
493518}
494519
520+ void AppClient::gwDisconnectedReportInternal (CC_MqttsnGatewayDisconnectReason reason)
521+ {
522+ logInfo () << " Gateway disconnected with reason: " << toStringInternal (reason) << std::endl;
523+ gwDisconnectedReportImpl ();
524+ }
525+
495526void AppClient::sendDataCb (void * data, const unsigned char * buf, unsigned bufLen, unsigned broadcastRadius)
496527{
497528 asThis (data)->sendDataInternal (buf, bufLen, broadcastRadius);
@@ -519,12 +550,17 @@ unsigned AppClient::cancelNextTickWaitCb(void* data)
519550
520551void AppClient::connectCompleteCb (void * data, CC_MqttsnAsyncOpStatus status, const CC_MqttsnConnectInfo* info)
521552{
522- return asThis (data)->connectCompleteInternal (status, info);
553+ asThis (data)->connectCompleteInternal (status, info);
523554}
524555
525556void AppClient::disconnectCompleteCb (void * data, CC_MqttsnAsyncOpStatus status)
526557{
527- return asThis (data)->disconnectCompleteInternal (status);
558+ asThis (data)->disconnectCompleteInternal (status);
559+ }
560+
561+ void AppClient::gwDisconnectedReportCb (void * data, CC_MqttsnGatewayDisconnectReason reason)
562+ {
563+ asThis (data)->gwDisconnectedReportInternal (reason);
528564}
529565
530566} // namespace cc_mqttsn_client_app
0 commit comments