Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt 5 : 5.8.0 - Qt Creator : 4.2.2 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

[Qt 4.7] Linphone

Bonjour,

Je cherche à discuter avec Linphone pour pouvoir faire une interface graphique en Qt dans mon Application embarqué.

J'ai vu que si on exécutait linphone suivi de --pipe, linphone crée un fichier pour faire les échanges dans /tmp/linphonec-0.
Au départ j'ai cru que c'était un pipe (au vu de la commande) mais il s'avère en réalité que c'est un localsocket.

J'ai donc décidé d'utiliser QLocalSocket.

La fonction d'écriture marche parfaitement, je peux envoyer les commandes que je veux à linphone et il les interprète bien.
Par contre il m'est presque impossible de récupérer les résultats que linphone envoi dans le localsocket.
Pour récupérer les informations j'ai connecté le signal readyRead() sur ma fonction de lecture.
Je récupère bien mes données de ma commande (je fais juste "help"), qui est automatiquement suivi de la réception de l'erreur puis de la déconnection :
LS - Error on socket QLocalSocket::PeerClosedError
LS - status on socket QLocalSocket::ClosingState
LS - status on socket QLocalSocket::UnconnectedState
LS - Disconnect


J'me suis donc dit que j'avais juste à me reconnecter, ce que j'ai fais :
LS - Connect local socket
LS - status on socket QLocalSocket::ConnectingState
LS - status on socket QLocalSocket::ConnectedState
LS - Connect


Ensuite je tape une commande directement dans ma console linphone.
Je récupère bien les données et ma commande mais ensuite, pas d'erreur dans mon application comme à la première commande, pas de déconnexion non plus mais il ne se passe plus rien du tout par la suite.


Voici mon code si cela peut vous aider à m'aider !
#include "localSocket.h"

LocalSocket::LocalSocket(linapl3 *base, QString path) {
this->base = base;
this->path = path;

socket = new QLocalSocket();

connect(socket, SIGNAL(connected()), this, SLOT(LS_connect()));
connect(socket, SIGNAL(disconnected()), this, SLOT(LS_disconnect()));
connect(socket, SIGNAL(error(QLocalSocket::LocalSocketError)), this, SLOT(LS_error(QLocalSocket::LocalSocketError)));
connect(socket, SIGNAL(readyRead()), this, SLOT(LS_read()));
connect(socket, SIGNAL(stateChanged(QLocalSocket::LocalSocketState)), this, SLOT(LS_status(QLocalSocket::LocalSocketState)));

LS_open();
}

LocalSocket::~LocalSocket(void) {
LS_close();
}

void LocalSocket::LS_open() {
qDebug() << "LS - Connect local socket";

if(socket != NULL) {
socket->abort();
socket->close();
}

socket->connectToServer(path, QIODevice::ReadWrite);
}

void LocalSocket::LS_close() {
qDebug() << "LS - Close local socket";

if(socket != NULL)
socket->close();
}

void LocalSocket::LS_read() {
if(socket->bytesAvailable() && socket->state() == QLocalSocket::ConnectedState) {
qDebug() << "LS - Read local socket";

IncomingData = socket->readAll();
base->incomingEvent(QString(IncomingData));
}
else {
qDebug() << "LS - Read local socket failed";
}
}

void LocalSocket::LS_write(QString msg) {
if(socket->isWritable() && socket->isOpen()) {
qDebug() << "LS - Write local socket";

OutgoingData = msg.toAscii();
socket->write(OutgoingData);

if(!socket->waitForBytesWritten(5000))
qDebug() << socket->errorString();
}
else {
if(socket->isWritable())
qDebug() << "LS - The unix socket/named pipe is not open";
else
qDebug() << "LS - The unix socket/named pipe is not writable";
}
}

void LocalSocket::LS_error(QLocalSocket::LocalSocketError error) {
qDebug() << "LS - Error on socket" << error;
}

void LocalSocket::LS_connect() {
qDebug() << "LS - Connect";
}

void LocalSocket::LS_disconnect() {
qDebug() << "LS - Disconnect";

LS_open();
}

void LocalSocket::LS_status(QLocalSocket::LocalSocketState state) {
qDebug() << "LS - status on socket" << state;
}

Merci d'avance pour votre aide.

Réponses

  • Bon,

    Je me suis posé la question de savoir si ça ne venait tout simplement de la l'implémentation des QLocalSocket et j'ai donc tenté avec les fonctions de base mais là aussi ça ne fonctionne pas.
    J'ai l'impression que je dois oublier de paramétrer quelque chose dans le QSocketNotifier car la fonction LS_read est tout le temps appelé ...

    Si quelqu'un peut m'aider ...
    #include "localSocket.h"


    LocalSocket::LocalSocket(linapl3 *base, QString path) {
    this->base = base;
    this->path = path;

    sock = ::socket(PF_LOCAL, SOCK_STREAM, 0);

    name.sun_family = AF_LOCAL;
    strcpy(name.sun_path, this->path.toAscii().data());

    notifier = new QSocketNotifier(sock, QSocketNotifier::Read);
    connect(notifier, SIGNAL(activated(int)), this, SLOT(LS_read(int)));

    LS_open();
    }

    LocalSocket::~LocalSocket(void) {
    LS_close();
    }


    void LocalSocket::LS_open() {
    qDebug() << "LS - Connect local socket";

    if(::connect(sock, (struct sockaddr *) &name, SUN_LEN(&name)) < 0)
    qDebug() << "LS - Error connect";
    }

    void LocalSocket::LS_close() {
    qDebug() << "LS - Close local socket";

    ::close(sock);
    }

    void LocalSocket::LS_read(int fd) {
    qDebug() << "LS - READ";

    QString response;

    buf[0] = 0;

    nbytes = sizeof(buf);
    bytes_read = ::read(fd, buf, nbytes);
    qDebug() << "---- Nb bytes : " + QString::number(bytes_read, 10);

    sleep(1);

    response.append(QString(buf));

    while(bytes_read > 0) {
    bytes_read = ::read(fd, buf, nbytes);
    qDebug() << "---- Nb bytes : " + QString::number(bytes_read, 10);
    if(bytes_read > 0)
    response.append(QString(buf));
    }

    base->incomingEvent(response);
    }

    void LocalSocket::LS_write(QString msg) {
    qDebug() << "LS - WRITE";

    int length = strlen(msg.toAscii().data()) + 1;

    // Write the string.
    ::write (sock, msg.toAscii().data(), length);
    }
Connectez-vous ou Inscrivez-vous pour répondre.