Пример #1
0
/**
 * Connects to the MQTT service. This first establishes an SSL based
 * socket. Then it sends the initial connection packet with optional
 * arguments, which correspond to the flags provided. The arguments
 * must be passed in order: client identifier, will topic, will
 * message, username, and password (not required). The arguments must
 * be in a string format.
 *
 * @param mqtt    The #fb_mqtt.
 * @param timeout The keep-alive timeout (seconds).
 * @param flags   The #fb_mqtt_connect_flags.
 * @param cid     The client identifier.
 * @param ...     Additional arguments in order, NULL-terminated.
 **/
void fb_mqtt_connect(fb_mqtt_t *mqtt, guint8 flags, const gchar *cid, ...)
{
    fb_mqtt_msg_t *msg;
    va_list        ap;
    const gchar   *str;

    g_return_if_fail(mqtt != NULL);

    if (G_UNLIKELY(fb_mqtt_connected(mqtt, FALSE)))
        return;

    /* Facebook always sends a CONNACK, use QoS1 */
    flags |= FB_MQTT_CONNECT_FLAG_QOS1;

    msg = fb_mqtt_msg_new(FB_MQTT_MSG_TYPE_CONNECT, 0);
    fb_mqtt_msg_write_str(msg, FB_MQTT_NAME);  /* Protocol name */
    fb_mqtt_msg_write_byte(msg, FB_MQTT_VERS); /* Protocol version */
    fb_mqtt_msg_write_byte(msg, flags);        /* Flags */
    fb_mqtt_msg_write_u16(msg, FB_MQTT_KA);    /* Keep alive */
    fb_mqtt_msg_write_str(msg, cid);           /* Client identifier */

    va_start(ap, cid);

    while ((str = va_arg(ap, const gchar*)) != NULL)
        fb_mqtt_msg_write_str(msg, str);

    va_end(ap);

    fb_mqtt_write(mqtt, msg);
    fb_mqtt_msg_free(msg);
    fb_mqtt_timeout(mqtt);
}
Пример #2
0
/**
 * Opens the connection to the MQTT service.
 *
 * @param mqtt The #fb_mqtt.
 **/
void fb_mqtt_open(fb_mqtt_t *mqtt, const gchar *host, gint port)
{
    g_return_if_fail(mqtt != NULL);

    fb_mqtt_close(mqtt);
    mqtt->ssl = ssl_connect((gchar*) host, port, TRUE, fb_mqtt_cb_open, mqtt);

    if (mqtt->ssl == NULL) {
        fb_mqtt_cb_open(mqtt, 1, NULL, 0);
        return;
    }

    fb_mqtt_timeout(mqtt);
}
Пример #3
0
/**
 * Implemented #b_event_handler for sending a PING request.
 *
 * @param data The user defined data, which is #fb_mqtt.
 * @param fd   The event file descriptor.
 * @param cond The #b_input_condition.
 *
 * @return FALSE to prevent continued event handling.
 **/
static gboolean fb_mqtt_cb_ping(gpointer data, gint fd,
                                b_input_condition cond)
{
    fb_mqtt_t     *mqtt = data;
    fb_mqtt_msg_t *msg;

    msg = fb_mqtt_msg_new(FB_MQTT_MSG_TYPE_PINGREQ, 0);
    fb_mqtt_write(mqtt, msg);
    fb_mqtt_msg_free(msg);

    mqtt->tev = 0;
    fb_mqtt_timeout(mqtt);
    return FALSE;
}
Пример #4
0
static gboolean
fb_mqtt_cb_ping(gpointer data)
{
	FbMqtt *mqtt = data;
	FbMqttMessage *msg;
	FbMqttPrivate *priv = mqtt->priv;

	msg = fb_mqtt_message_new(FB_MQTT_MESSAGE_TYPE_PINGREQ, 0);
	fb_mqtt_write(mqtt, msg);
	g_object_unref(msg);

	priv->tev = 0;
	fb_mqtt_timeout(mqtt);
	return FALSE;
}
Пример #5
0
void
fb_mqtt_open(FbMqtt *mqtt, const gchar *host, gint port)
{
	FbMqttPrivate *priv;
	PurpleAccount *acc;

	g_return_if_fail(FB_IS_MQTT(mqtt));
	priv = mqtt->priv;

	acc = purple_connection_get_account(priv->gc);
	fb_mqtt_close(mqtt);
	priv->gsc = purple_ssl_connect(acc, host, port, fb_mqtt_cb_open,
	                               fb_mqtt_cb_open_error, mqtt);

	if (priv->gsc == NULL) {
		fb_mqtt_cb_open_error(NULL, 0, mqtt);
		return;
	}

	fb_mqtt_timeout(mqtt);
}
Пример #6
0
void
fb_mqtt_connect(FbMqtt *mqtt, guint8 flags, const GByteArray *pload)
{
	FbMqttMessage *msg;

	g_return_if_fail(!fb_mqtt_connected(mqtt, FALSE));
	g_return_if_fail(pload != NULL);

	/* Facebook always sends a CONNACK, use QoS1 */
	flags |= FB_MQTT_CONNECT_FLAG_QOS1;

	msg = fb_mqtt_message_new(FB_MQTT_MESSAGE_TYPE_CONNECT, 0);
	fb_mqtt_message_write_str(msg, FB_MQTT_NAME);   /* Protocol name */
	fb_mqtt_message_write_byte(msg, FB_MQTT_LEVEL); /* Protocol level */
	fb_mqtt_message_write_byte(msg, flags);         /* Flags */
	fb_mqtt_message_write_u16(msg, FB_MQTT_KA);     /* Keep alive */

	fb_mqtt_message_write(msg, pload->data, pload->len);
	fb_mqtt_write(mqtt, msg);

	fb_mqtt_timeout(mqtt);
	g_object_unref(msg);
}