2013-03-20 7 views
0

Что я хочу сделать это: У меня есть база данных с определенными устройствами Bluetooth (BD_ADDR). Я хочу узнать, находится ли какое-либо из устройств в радиусе действия, и если да, скажите ему что-нибудь сделать. Один из способов - все время запускать обнаружение, создавать список обнаруженных устройств и сравнивать их с базой данных. Если обнаружено устройство, присутствующее в базе данных, я открываю соединение с ним и говорю ему что-то делать. Проблема в том, что этот процесс медленный и надежно найти все устройства, длина запроса должна быть большой, и процесс должен повторяться все время.Быстрое обнаружение устройств Bluetooth

Моя идея - открыть мой Bluetooth только один раз, соединить его с моим устройством и с тех пор всякий раз, когда устройство входит в диапазон, установить соединение с ним не путем длительного обнаружения, а каким-то образом используя информацию, которую я уже для этого устройства.

Другими словами, можно ли использовать информацию, которую я уже знаю об устройстве (имеющем пару с ним раньше или просто связав с ним), чтобы начать общение с ним, не открывая его первым?

Спасибо, donescamilloATgmail.com

ответ

0

Что библиотеки вы используете для Bluetooth и какой сокет вы планируете общаться с? В большинстве случаев вы можете просто создать соединение сокета с устройством, если знаете его BD_ADDR. Например, в Bluez, вам нужно только написать следующее, чтобы создать соединение RFCOMM к известному серверу по каналу 1:

struct sockaddr_rc addr = { 0 }; 
int s, status; 

// destination address 
char dest[18] = "00:17:EC:35:96:FF"; 

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

// set the connection parameters (who to connect to) 
addr.rc_family = AF_BLUETOOTH; 
addr.rc_channel = 1; 
str2ba(dest, &addr.rc_bdaddr); 

// connect to server 
status = connect(s, (struct sockaddr *)&addr, sizeof(addr)); 

Надеется, что это помогает.

+0

Я использую BTstack для Windows. Не уверен, что он реализует связь сокетов. Просто, чтобы подтвердить - если у меня есть BD_ADDRESS устройства, мне не нужна никакая другая информация (например, clockOffset и т. Д.), Чтобы подключиться к ней (так или иначе, я узнаю, как именно). Это тот случай? Спасибо, donescamilloATgmail.com – user1523271

+0

Yup that is right. Вам не нужно знать ничего, кроме BD_ADDR, для подключения к устройству. Однако вам необходимо убедиться, что устройство поддерживает соединение сокетов, которое вы пытаетесь использовать. RFCOMM, возможно, является наиболее распространенным сокетом, поэтому я был бы удивлен, если BTStack не реализует его. – Zaphod

Смежные вопросы