Ejemplo n.º 1
0
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);
  }
}
Ejemplo n.º 2
0
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;

}