static void ev_handler(struct ns_connection *nc, int ev, void *p) { struct ns_mqtt_message *msg = (struct ns_mqtt_message *)p; (void) nc; #if 0 if (ev != NS_POLL) printf("USER HANDLER GOT %d\n", ev); #endif switch (ev) { case NS_CONNECT: ns_set_protocol_mqtt(nc); ns_send_mqtt_handshake(nc, "dummy"); break; case NS_MQTT_CONNACK: if (msg->connack_ret_code != NS_MQTT_CONNACK_ACCEPTED) { printf("Got mqtt connection error: %d\n", msg->connack_ret_code); exit(1); } printf("Subscribing to '/stuff'\n"); ns_mqtt_subscribe(nc, topic_expressions, sizeof(topic_expressions)/sizeof(*topic_expressions), 42); break; case NS_MQTT_PUBACK: printf("Message publishing acknowledged (msg_id: %d)\n", msg->message_id); break; case NS_MQTT_SUBACK: printf("Subscription acknowledged, forwarding to '/test'\n"); break; case NS_MQTT_PUBLISH: { #if 0 char hex[1024] = {0}; ns_hexdump(nc->recv_iobuf.buf, msg->payload.len, hex, sizeof(hex)); printf("Got incoming message %s:\n%s", msg->topic, hex); #else printf("Got incoming message %s: %.*s\n", msg->topic, (int)msg->payload.len, msg->payload.p); #endif printf("Forwarding to /test\n"); ns_mqtt_publish(nc, "/test", 65, NS_MQTT_QOS(0), msg->payload.p, msg->payload.len); } break; case NS_CLOSE: printf("Connection closed\n"); exit(1); } }
void * CWrkThread::Entry() { wxString str; struct ns_connection *nc; struct ns_mgr mgr; const char *address = "192.168.1.9:1883"; mgr.user_data = m_pObj; ns_mgr_init( &mgr, m_pObj ); if ( NULL == ( nc = ns_connect( &mgr, (const char *)m_pObj->m_hostMQTT.mbc_str(), ev_handler ) ) ) { fprintf( stderr, "ns_connect(%s) failed\n", address ); return NULL; } if (m_pObj->m_bSubscribe) { while (!TestDestroy() && !m_pObj->m_bQuit) { ns_mgr_poll( &mgr, 100 ); } } // Publish else { while ( !TestDestroy() && !m_pObj->m_bQuit ) { ns_mgr_poll( &mgr, 100 ); // Wait for connection if ( !m_pObj->m_bConnected ) { continue; } if ( wxSEMA_TIMEOUT == m_pObj->m_semSendQueue.WaitTimeout( 10 ) ) continue; if ( m_pObj->m_sendList.size() ) { m_pObj->m_mutexSendQueue.Lock(); vscpEvent *pEvent = m_pObj->m_sendList.front(); m_pObj->m_sendList.pop_front(); m_pObj->m_mutexSendQueue.Unlock(); if (NULL == pEvent) continue; if (m_pObj->m_bSimplify) { ; } else { vscp_writeVscpEventToString( pEvent, str ); ns_mqtt_publish( nc, "/vscp1", 65, NS_MQTT_QOS( 0 ), (const char *)str.mbc_str(), str.Length() ); } // We are done with the event - remove data if any if (NULL != pEvent->pdata) { delete [] pEvent->pdata; pEvent->pdata = NULL; } } // Event received ::wxMilliSleep(50); } } // Disconnect if we are connected. if ( m_pObj->m_bConnected ) { ns_mqtt_disconnect( nc ); } return NULL; }