У меня проблема с процессом связи 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;