Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
0 / 0 / 0
Регистрация: 21.11.2014
Сообщений: 8

Чтение данных с bluetooth-устройств

21.11.2014, 23:46. Показов 2965. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Программа должна считать данные с bluetooth-устройства. Функция SearchBT() находит MAC-адреса устройств, отбирает MAC-адреса rfcomm устройств, пишет их в json массив и возвращает его из функции.

Сам вопрос состоит в том, что я не могу его передать в функцию подключения ConnectionDev(). Еще мне что-то говорили про проверки строчки, помеченой ****, но я не понял, на что именно проверять.

Также хочу услышать любую критику, начиная от присваивания правильных имен переменным, разнообразных проверок и так далее.

P.S. Прошу строго не судить, программист (если меня вообще можно так назвать) я начинающий. Да, кстати, чтение по непонятной причине не проходит, команда для старта чтения правильная, сокет не блокируется, количество ожидаемых байтов правильное, пауза между отправкой команды и ожиданием приема данных достаточная...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>
#include <bluetooth/hci_lib.h>
#include <bluetooth/rfcomm.h>
#include <string.h>
#include <jansson.h>
#include <jansson_config.h>
#include <fcntl.h>
json_t *SearchBT();
int ConnectionDev();
void AutoInputPK();
 
int main(int argc, char *argv[])
{
    //(json_array_get( SearchBT(), 1));
    json_t *Jarr2;
Jarr2 = json_array();
json_array_append(Jarr2,SearchBT());
//printf("\n2**---**%s*---**2", json_dumps(Jarr2, 0));
printf("jhgj");
ConnectionDev(Jarr2);
return (0);
}
//_____________
 
int ConnectionDev(char *dest)//функция для подключения  устройства
{
    struct sockaddr_rc addr = {0};//мак устройства с рфкомм EC:FE:7E:11:85:1F
    int s, status, counter;
      printf("jhgj");
    AutoInputPK(dest);
    // выделить сокет
    s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
    // устанавливаем параметры соединения
    addr.rc_family = AF_BLUETOOTH;
    addr.rc_channel = (uint8_t) 1;
    str2ba(dest, &addr.rc_bdaddr);
    //char text[20]={0};
   **** status = connect(s, (struct sockaddr *)&addr, sizeof(addr));
    fcntl(s, F_SETFL, FNDELAY|fcntl(s, F_GETFL, 0));
    counter = write(s, "wboam1\r", 8);
    //sleep(5);
    //counter  =read(s,text, 8);
    if (counter  > 0)
    {
    printf("\n received:\n [%s]", dest);
    }
 
    if (status == 0)
    {
        printf("\nYEP MF`s");
    }
    if (status < 0)
   {
        perror("uh oh");
   }
    close(s);
    return 0;
}
//___________
 
json_t *SearchBT() //Функция для поиска BT устройства с возвратом его мак адреса
{
    inquiry_info *ii = NULL;
    int max_rsp = 255, num_rsp;
    int dev_id, len = 8, flags;
    int i, socketRfcomm;
    char addrf[19] = {0};
    char *arrayMacaddr[20] = {0}; //сделать его динамическим
    socketRfcomm = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
    dev_id = hci_get_route(NULL);
    flags = IREQ_CACHE_FLUSH; 
    ii = (inquiry_info *)malloc(max_rsp * sizeof(inquiry_info));
    num_rsp = hci_inquiry(dev_id, len, max_rsp, NULL, &ii, flags);
    if (num_rsp < 0)
    {
        perror("hci_inquiry");
    }
    printf("all devices:");
    for (i = 0; i < num_rsp; i++)
    {
        ba2str(&(ii + i)->bdaddr, addrf);
        arrayMacaddr[i] = strdup(addrf);
        printf("\n--[%s]", arrayMacaddr[i]);
    }  
    free(ii);
    close(socketRfcomm);
    json_t *asd, *as2;
    as2 = json_array();
    //цикл проверки мак адресов, с последующим удалением мак адресов левых устройств
    for (i = 0; i < num_rsp; i++)
    {
        char str2 [8] = "EC:FE:7E";
        if (strncmp(arrayMacaddr[i], str2, 8) == 0)
        {
            asd = json_string(arrayMacaddr[i]);
            json_array_append(as2, asd);
            printf("\n**---**%s*---**", json_dumps(as2, 0));
 
        }
    }
    return (as2);
}
//___________
 
void AutoInputPK(char *dest)   //функция автоматического ввода пин кода из симпл агент
{
    char *macAddrs = dest;
    char *cmdTemp = " bluez-simple-agent hci0 ";
    char cmd[50];
    sprintf(cmd, "%s%s", cmdTemp, macAddrs);
    FILE *ptr;
    ptr = popen(cmd, "w");
    pclose(ptr);
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.11.2014, 23:46
Ответы с готовыми решениями:

Передача данных с устройств через Bluetooth по запросу
Есть проект на C# который работает на простое чтение данных с com порта если он открыт. А мне нужно сделать так что бы данные начали...

Чтение и запись данных с устройств подключенных по PROFIBUS к S7-315
Здравствуйте. Есть несколько устройств подключенных по PROFIBUS к S7-315. С них необходимо считывать пару слов и записывать столько же. В...

Подключение bluetooth-устройств
К ноутбуку не подключаются устройства по bluetooth. Сопряжение происходит, хоть и не всегда успешно. После сопряжения устройство...

4
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
22.11.2014, 01:27
А нарисовать прототип json_array_append(ююю,ююю); слабо?
Или ты просишь покопаться в ентих:
C
1
2
3
4
5
6
7
8
...
#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>
#include <bluetooth/hci_lib.h>
#include <bluetooth/rfcomm.h>
...
#include <jansson.h>
#include <jansson_config.h>
исходниках и выдать ответ?
0
0 / 0 / 0
Регистрация: 21.11.2014
Сообщений: 8
22.11.2014, 02:10  [ТС]
int json_array_append(json_t *array, json_t *value)

Добавлено через 33 минуты
и причем тут прототип этой функи??
я же сказал,проблема с передачей массива.
0
deleted
177 / 50 / 5
Регистрация: 29.03.2013
Сообщений: 365
22.11.2014, 19:08
Везде где ты итерируешь Arraymacaddr - undefined behavior. Ибо массив из 20 указателей, num_rsp может быть больше.
Память strdup нигде не освобождается.
В 74 строке открыт сокет, который нигде не использовали и был просто закрыт
Логика работы в целом не поддается объяснению. Hci_inquiry зафейлилась, просто вывели сообщение об ошибке и продолжаем делать непонятно че.

Ну инепосредственно по существу вопроса. Не проверяешь возвращаемые значения функций - не знаешь почему не работает. Вполне логичный результат при таком подходе.
0
0 / 0 / 0
Регистрация: 21.11.2014
Сообщений: 8
24.11.2014, 16:09  [ТС]
спасибо большое,довольно содержательно и по существу

Добавлено через 18 часов 9 минут
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/*
Изменен файл  /usr/bin/bluez-simple-agent
а именно
- return raw_input("Enter PIN Code: ")
+ return "XXXX"; #raw_input("Enter PIN Code: ")
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>
#include <bluetooth/hci_lib.h>
#include <bluetooth/rfcomm.h>
#include <string.h>
#include <jansson.h>
#include <jansson_config.h>
#include <fcntl.h>
json_t *SearchBT();
int ConnectionDev();
void AutoInputPK();
 
int main(int argc, char *argv[])
{
    ConnectionDev(SearchBT());
    return (0);
}
//_______________________________________________________________________________
 
int ConnectionDev(json_t *mac)//функция для подключения  устройства
{
    struct sockaddr_rc addr = {0};//мак устройства с рфкомм EC:FE:7E:11:85:1F
    int s, status, counter;
    const char *dest = {0};
    size_t t = 0;
    size_t n = 0;
    // выделить сокет
    s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
    // устанавливаем параметры соединения
    addr.rc_family = AF_BLUETOOTH;
    addr.rc_channel = (uint8_t) 1;
    t = json_array_size(mac);
    for (n = 0; n < t; n++)
    {
        dest = json_string_value(json_array_get(mac, n));
        str2ba(dest, &addr.rc_bdaddr);
    }
    AutoInputPK(dest);//сейчас тут только один мак адресс,который лежит
    //в нулевом элементе mac нужно сделать цикл,что бы вместо нуля была переменная
    //char text[20]={0};
    status = connect(s, (struct sockaddr *)&addr, sizeof(addr));
    fcntl(s, F_SETFL, FNDELAY | fcntl(s, F_GETFL, 0));
    counter = write(s, "wboam1\r", 8);
    //sleep(5);
    //counter  =read(s,text, 8);
    if (counter  > 0)
    {
        printf("\n received:\n [%s]", dest);
    }
 
    if (status == 0)
    {
        printf("\nYEP MF`s");
    }
 
    if (status < 0)
    {
        perror("uh oh");
    }
    close(s);
    return 0;
}
//_____________________________________________________________________________
 
json_t *SearchBT() //Функция для поиска BT устройства с возвратом его мак адреса
{
    inquiry_info *ii = NULL;
    int max_rsp = 255, num_rsp;
    int dev_id, len = 8, flags;
    int i;
    char addrf[19] = {0};
    char *arrayMacaddr[20] = {0}; //**да,это массив из 20 указателей от которого нужно избавиться и он не где не очищается
    dev_id = hci_get_route(NULL);
    flags = IREQ_CACHE_FLUSH; //использование всех подключенных устройств, с удалением из хеша старых
    ii = (inquiry_info *)malloc(max_rsp * sizeof(inquiry_info));
    num_rsp = hci_inquiry(dev_id, len, max_rsp, NULL, &ii, flags); //**тут не знаю что не так,почитал на форуме,тчо это гавно.
    if (num_rsp < 0)
    {
        perror("hci_inquiry");
    }
    printf("all devices:");
    for (i = 0; i < num_rsp; i++)
    {
        ba2str(&(ii + i)->bdaddr, addrf);
        arrayMacaddr[i] = strdup(addrf);
        printf("\n--[%s]", arrayMacaddr[i]);
    }
    free(ii);
    json_t *asd, *as2;
    as2 = json_array();
    //цикл проверки мак адресов, с последующим удалением мак адрессов левых устройств
    for (i = 0; i < num_rsp; i++)
    {
        char str2 [8] = "EC:FE:7E";
        if (strncmp(arrayMacaddr[i], str2, 8) == 0)
        {
            asd = json_string(arrayMacaddr[i]);
            json_array_append(as2, asd);
            free(arrayMacaddr);
        }
    }
    return (as2);
}
 
//_____________________________________________________________________________
 
 
void AutoInputPK(char *dest)   //функция автоматического ввода пин кода из симпл агент
{
    char *macAddrs = dest;
    char *cmdTemp = " bluez-simple-agent hci0 ";
    char cmd[50];
    sprintf(cmd, "%s%s", cmdTemp, macAddrs);
    FILE *ptr;
    ptr = popen(cmd, "w");
    pclose(ptr);
}
с json справился, теперь не понимаю почему все крашится на очистке arrayMacaddr.
не понял чем не понравился Hci_inquiry.
да и массив из 20 указателей тоже.
если есть совет как изменить эту строку,то с удовольствием и огромным желанием выслушаю!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.11.2014, 16:09
Помогаю со студенческими работами здесь

Bluetooth. Поиск устройств
Всем привет. Подскажите пожалуйста как правильно написать поиск устройств. Читал несколько статей и никак не могу понять как написать код,...

Список устройств и передача файла Bluetooth на C#
Доброго всем форумчанинам, Вот ситуация, необходимо реализовать на одной форме два поля (панели) в одной показывать список устройств...

Bluetooth чат для нескольких устройств
Хочу создать Bluetooth чат на Android. Примеров чатов много, но все для двух устройств. С их работой я разобрался. Но вот примеров чатов с...

bluetooth "USB HOST" для андроид устройств
не умею разрабатывать что то своё, но легко собираю то что уже собирали. Но вот тут будет не простая задача но деньги для сборки сего...

Получение списка подключеных Bluetooth-устройств и передача/прием файлов
скачал wireles framework.как с ним работать.нужно получить список подключеных блютуз-устройств и передать или получить какойто файл на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru