Разрыв трубки Bluetooth во время чтения и работает приложение Qt - PullRequest
0 голосов
/ 12 октября 2019

У меня проблема с процессом связи Bluetooth, работающим независимо в фоновом режиме, в то время как приложение Qt работает на переднем плане. Я пытаюсь перенести видео, отправленное из приложения для Android, на мой RPI 3B. Приложение разделено на две части: приложение Qt с пользовательским интерфейсом и отображаемыми сообщениями, а также небольшое облегченное приложение на языке Си, обрабатывающее все соединения Bluetooth через службу RFCOMM SPP. Когда приложение C работает само по себе, все работает нормально, я могу получать все данные из отправленного видео и правильно его читать. Но когда я запускаю приложение Qt, приложение C перестает получать данные в середине передачи, возвращая 0 байтов, прочитанных с помощью recv ().

Мой вопрос: поскольку оба приложения работают отдельно, есть лиспособ, которым приложение Qt будет мешать работе приложения C и обработке сокетов?

Если так, есть ли способ решить эту проблему?

Заранее большое спасибо.

немного предыстории: я сначала использовал API QBluetooth, но у меня были проблемы с большими файлами (3 Мб) и сигналами, поэтому я решил разработать небольшое приложение C, которое работает в цикле while и обрабатывает все протоколы и передачу данных. Затем я начал бы его с q QProcess и связался бы с ним с помощью сигналов process-> write () и readyRead (), но появилось то же поведение. Поэтому я решил запускать каждое приложение самостоятельно и общаться через File * и QFile (работает в QThread), чтобы отправлять и получать сообщения. (Я не использую X11, но вместо этого EGLFS).

Приложение Qt:

void AwBtThread::onTimeout()
{
    timeout->stop();
    if(in_sig->exists()){
        if(in_sig->open(QFile::ReadOnly)){
             QByteArray in = in_sig->readAll();
             in_sig->close();
             in_sig->remove();
             QByteArray ret = process_data(in);
             if(ret.length() > 0){
                 if(out_sig->open(QFile::WriteOnly)){
                     out_sig->write(ret.toStdString().c_str());
                     out_sig->close();
                 }
             }
         }
     }
     timeout->start();
 }

Приложение C:

struct sockaddr_rc loc_addr = { 0 } , rem_addr = { 0 } ;
char buf [2048] = { 0 } ;
int port = 3;
int s, client, bytes_read, result ;
unsigned int opt = sizeof (rem_addr);

char msg [2048] = { 0 } ;
char inBuf [1024] = { 0 } ;

// register service
sdp_session_t *session = register_service(port);

// allocate socket
s = socket (AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);

// bind socket to port 1 of the first available bluetooth adapter
loc_addr.rc_family = AF_BLUETOOTH ;
loc_addr.rc_bdaddr = *BDADDR_ANY ;
loc_addr.rc_channel =port;

result = bind(s, (struct sockaddr *)&loc_addr, sizeof(loc_addr));

result = listen(s, 1);

memset ( buf ,0, sizeof ( buf));

// accept one connection
    client = accept(s, (struct sockaddr *)&rem_addr, &opt);

    ba2str(&rem_addr.rc_bdaddr, buf);

    total_read = 0;

    while(isOk != 0){
        // read data from the client
        bytes_read = recv(client, buf, sizeof(buf), 0);
        if (bytes_read > 0) {

            if(startsWith("FILE", buf)){

                if(bytes_read < sizeof(buf))
                   buf[bytes_read] = '\0';
                else
                   buf[sizeof(buf)] = '\0';


                get_signal(inBuf, 1023);
                //send_info(inBuf, "BT_RET");

                if(strcmp(inBuf, "OK") == 0){

                    total_read = 0;

                    FILE * fp;
                    int i;
                    /* open the file for writing*/
                    fp = fopen ("/tmp/download.mp4","wb");

                    while(1){
                        bytes_read = recv(client, buf, sizeof(buf), 0);
                        if (bytes_read > 0) {

                            total_read += bytes_read;                               
                            fwrite (buf, bytes_read, 1, fp);
                        }
                    }

                    fclose (fp);    
                }

            }
        }
    }

    // close connection
    close(client);
    close(s);
    return 0;
...