49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,450
1

Hci_le_set_scan_parameters() не запускается с рут и без рут

23.08.2019, 22:00. Показов 1405. Ответов 7
Метки нет (Все метки)

Не запускается hci_le_set_scan_parameters() (точнее возвращает ошибку),
ошибка в отсутствии рут прав,запускаю с sudo и то же самое,вот код,в нем возможны ошибки но сама функция должна работать правильно,скинул другу у него все работает с рут прававми.
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
#include <iostream>
#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 <sys/ioctl.h>
#include <poll.h>
#include <string>
#define BLE_SCAN_TIMEOUT   4
 
#define LE_SCAN_PASSIVE                 0x00
#define LE_SCAN_ACTIVE                  0x01
 
/* These LE scan and inquiry parameters were chosen according to LE General
 * Discovery Procedure specification.
 */
#define DISCOV_LE_SCAN_WIN              0x12
#define DISCOV_LE_SCAN_INT              0x12
 
#define BLE_EVENT_TYPE     0x05
#define BLE_SCAN_RESPONSE  0x04
 
#define EIR_NAME_SHORT     0x08  /* shortened local name */
#define EIR_NAME_COMPLETE  0x09  /* complete local name */
struct hci_state {
    int device_id;
    int device_handle;
    struct hci_filter original_filter;
    int state;
    int has_error;
    char error_message[1024];
} hci_state;
struct hci_state current_hci_state;
struct hci_state open_default_hci_device()
{
    struct hci_state current_hci_state = {0};
 
    current_hci_state.device_id = hci_get_route(NULL);
 
    if ((current_hci_state.device_handle = hci_open_dev(current_hci_state.device_id)) < 0)
    {
        current_hci_state.has_error = 1;
        snprintf(current_hci_state.error_message, sizeof(current_hci_state.error_message), "Could not open device: %s", strerror(errno));
        return current_hci_state;
    }
 
    // Set fd non-blocking
    int on = 1;
    if (ioctl(current_hci_state.device_handle, FIONBIO, (char *)&on) < 0)
    {
        current_hci_state.has_error = 1;
        snprintf(current_hci_state.error_message, sizeof(current_hci_state.error_message), "Could set device to non-blocking: %s", strerror(errno));
        return current_hci_state;
    }
 
    current_hci_state.state = 2;
 
    return current_hci_state;
}
int gattlib_adapter_open(int * adapter) {
    std::cout << "LOL3";
 
    int dev_id;
 
    if (adapter == NULL) {
        return 1;
    }
 
    
        dev_id = hci_get_route(NULL);
 
    if (dev_id < 0) {
        fprintf(stderr, "ERROR: Invalid device.\n");
        return 1;
    }
 
    int* device_desc = new int[1];
    if (device_desc == NULL) {
        return 1;
    } else {
        adapter = device_desc;
    }
 
    device_desc[0] = hci_open_dev(dev_id);
    if (device_desc < 0) {
        fprintf(stderr, "ERROR: Could not open device.\n");
        return 1;
    }
 
    return 0;
}
int ble_scan(int adapter, int device_desc, int timeout, void *user_data) {
 
    struct hci_filter old_options;
    socklen_t slen = sizeof(old_options);
    struct hci_filter new_options;
    unsigned char buffer[HCI_MAX_EVENT_SIZE];
    evt_le_meta_event* meta = (evt_le_meta_event*)(buffer + HCI_EVENT_HDR_SIZE + 1);
    le_advertising_info* info;
    char addr[18];
    int len;
#if BLUEZ_VERSION_MAJOR == 4
    struct timeval wait;
    fd_set read_set;
#endif
 
    if (getsockopt(device_desc, SOL_HCI, HCI_FILTER, &old_options, &slen) < 0) {
        fprintf(stderr, "ERROR: Could not get socket options.\n");
        return 1;
    }
 
    hci_filter_clear(&new_options);
    hci_filter_set_ptype(HCI_EVENT_PKT, &new_options);
    hci_filter_set_event(EVT_LE_META_EVENT, &new_options);
 
    if (setsockopt(device_desc, SOL_HCI, HCI_FILTER,
                   &new_options, sizeof(new_options)) < 0) {
        fprintf(stderr, "ERROR: Could not set socket options.\n");
        return 1;
    }
 
#if BLUEZ_VERSION_MAJOR == 4
    wait.tv_sec = timeout;
    int ts = time(NULL);
 
    while(1) {
        FD_ZERO(&read_set);
        FD_SET(device_desc, &read_set);
 
        int err = select(FD_SETSIZE, &read_set, NULL, NULL, &wait);
        if (err <= 0) {
            break;
        }
 
        len = read(device_desc, buffer, sizeof(buffer));
 
        if (meta->subevent != 0x02 || (uint8_t)buffer[BLE_EVENT_TYPE] != BLE_SCAN_RESPONSE)
            continue;
 
        info = (le_advertising_info*) (meta->data + 1);
        ba2str(&info->bdaddr, addr);
 
        printf("%d",info->data);
 
        int elapsed = time(NULL) - ts;
        if (elapsed >= timeout) {
            printf("Err2");
            break;
        }
 
        wait.tv_sec = timeout - elapsed;
    }
#else
    while (1) {
        struct pollfd fds;
        fds.fd     = device_desc;
        fds.events = POLLIN;
 
        int err = poll(&fds, 1, timeout * 1000);
        if (err <= 0) {
            break;
        } else if ((fds.revents & POLLIN) == 0) {
            continue;
        }
 
        len = read(device_desc, buffer, sizeof(buffer));
 
        if (meta->subevent != 0x02 || (uint8_t)buffer[BLE_EVENT_TYPE] != BLE_SCAN_RESPONSE)
            continue;
 
        info = (le_advertising_info*) (meta->data + 1);
        ba2str(&info->bdaddr, addr);
 
        printf("%d",*reinterpret_cast<int*> (info->data));
    }
#endif
 
    setsockopt(device_desc, SOL_HCI, HCI_FILTER, &old_options, sizeof(old_options));
    return 0;
}
 
 
int gattlib_adapter_scan_enable(struct hci_state current_hci_state, int timeout, void *user_data) {
    uint16_t interval = htobs(DISCOV_LE_SCAN_INT);
    uint16_t window = htobs(DISCOV_LE_SCAN_WIN);
    uint8_t own_address_type = 0x00;
    uint8_t filter_policy = 0x00;
    
    int ret = hci_le_set_scan_parameters(current_hci_state.device_handle, 0x01, htobs(0x0010), htobs(0x0010), 0x00, 0x00, 1000);
    if (ret < 0) {
        std::cout << "ERROR: Set scan parameters failed (are you root?).\n" ;
    
        return 1;
    }
    
      ret = hci_le_set_scan_enable(current_hci_state.device_handle, 0x01, 1, 1000);
      if (ret < 0) {
        fprintf(stderr, "ERROR: Enable scan failed.\n");
        return 1;
      }
 
      ret = ble_scan(current_hci_state.device_handle, current_hci_state.device_handle, timeout, user_data);
      if (ret != 0) {
        fprintf(stderr, "ERROR: Advertisement fail.\n");
        return 1;
      }
 
     return 0;
}
 
int main()
{
 
    int * adapter;
    //gattlib_adapter_open(adapter);
    current_hci_state = open_default_hci_device();
    gattlib_adapter_scan_enable(current_hci_state,BLE_SCAN_TIMEOUT,NULL);    
    return 0;
}
Добавлено через 21 минуту
рут права имею,команды такие как sudo apt-get update работают
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.08.2019, 22:00
Ответы с готовыми решениями:

Не запускается pm2 без рут прав
Столкнулся с популярной проблемой в pm2, без рута не запускаются скрипты. Выполнял sudo chown -R...

Удалить проги на андроид через ADB без рут
Добрый день? Кто подскажет как удалить программы через компьютер без рут, тел Samsung GT-S7390...

пароль рут
Забыл пароль рута. Как востановить?

Монтирование не от рут’а
Команда mount имеет следующие права -rwxr-xr-x root root то есть запускать её может любой...

7
6571 / 4556 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
23.08.2019, 22:17 2
Цитата Сообщение от ReYalp Посмотреть сообщение
Не запускается hci_le_set_scan_parameters() (точнее возвращает ошибку),
Какую именно ошибку она возвращает?
0
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,450
23.08.2019, 22:24  [ТС] 3
oleg-m1973, -1 в обоих случачях

Добавлено через 5 минут
oleg-m1973, errno в случае sudo - 5, в случае без - 1
0
6571 / 4556 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
23.08.2019, 22:24 4
Цитата Сообщение от ReYalp Посмотреть сообщение
oleg-m1973, -1 в обеих случачях
А errno какой?
0
шКодер самоучка
2171 / 1878 / 912
Регистрация: 09.10.2013
Сообщений: 4,125
Записей в блоге: 7
23.08.2019, 22:27 5
ReYalp, возможно у вас нет нужного девайса?
прочитайте сообщение об ошибке:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main()
{
 
    int * adapter;
    //gattlib_adapter_open(adapter);
    current_hci_state = open_default_hci_device();
    if (current_hci_state.has_error) {
        std::cerr
                << "ERROR(open_default_hci_device()):"
                << current_hci_state.error_message
                << std::endl;
        return 1;
    }
    std::clog << "OK(open_default_hci_device())" << std::endl;
    gattlib_adapter_scan_enable(current_hci_state,BLE_SCAN_TIMEOUT,NULL);    
    return 0;
}
ЗЫ: в функции gattlib_adapter_open написана какая то чушь.
0
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,450
23.08.2019, 22:34  [ТС] 6
Цитата Сообщение от Max Dark Посмотреть сообщение
ЗЫ: в функции gattlib_adapter_open написана какая то чушь.
она вообще лишняя,просто забыл убрать

Добавлено через 1 минуту
Max Dark, OK(open_default_hci_device())

Добавлено через 4 минуты
Max Dark, просто самое странное то что у моего друга который скомпилировал точно такой же код эта функция работает нормально с sudo.

Добавлено через 32 секунды
у него другой дистрибутив ,но я не думаю что дело может быть в этом
0
6571 / 4556 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
23.08.2019, 22:36 7
Цитата Сообщение от ReYalp Посмотреть сообщение
oleg-m1973, errno в случае sudo - 5, в случае без - 1
5 - это Input/output error. Скорее всего у тебя проблемы c bluetooth-контроллером
https://stackoverflow.com/ques... in-vc-code
0
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,450
23.08.2019, 22:53  [ТС] 8
oleg-m1973, уже делал ,не помогло

Добавлено через 13 минут
oleg-m1973, та ссылка помогла разово решить проблему и я понял что нужно добавить выключение в код ,после добавления функции
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
oid stop_hci_scan(struct hci_state current_hci_state)
{
  if(current_hci_state.state == HCI_STATE_FILTERING)
  {
    current_hci_state.state = HCI_STATE_SCANNING;
    setsockopt(current_hci_state.device_handle, SOL_HCI, HCI_FILTER, &current_hci_state.original_filter, sizeof(current_hci_state.original_filter));
  }
 
  if(hci_le_set_scan_enable(current_hci_state.device_handle, 0x00, 1, 1000) < 0) 
  {
    current_hci_state.has_error = true;
    snprintf(current_hci_state.error_message, sizeof(current_hci_state.error_message), "Disable scan failed: %s", strerror(errno));
  }
 
  current_hci_state.state = HCI_STATE_OPEN;
}
ошибка больше не появляется но код не работает как нужно,а вроде должен
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.08.2019, 22:53
Помогаю со студенческими работами здесь

Рут права LeEco Le 2
Привет всем, может кто где видел как сделать рут права на LeEco Le 2. Облазил весь 4pda там нет....

Проверка рут прав
Требуется проверить наличие рут-прав на телефоне. Как это реализовать?

Не получается удалить рут
Здравствуйте, у меня такая вот проблема, помогите пожалуйста решить. Недавно поставил программу...

Отладка на Eclipse и рут
Здравствуйте. Подскажите пожалуйста по среде разработке. Использую Eclipse Version: Kepler Release...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru