Raspberry pi bluetooth-отправка данных
Прежде чем опубликовать это, я попытался найти простую программу для отправки любых данных с помощью BLE с rapsberry pi. Но больше я получил в деталях, я знал, что есть некоторые библиотеки BLE, которые поддерживают Программирование с использованием Python на RPi. Я новичок в сетевом программировании на python и ищу учебник. Каждый учебник посвящен тому, как подключить RPi и какой-то телефон с помощью BLE.Они не показывают, как сделать скрипт py, чтобы отправить некоторые данные датчиков или что-то подобное. Пожалуйста, проводите.
1 ответ:
Смотрите материал ниже, скопированный из записи so Documentation, которую я создал по этому вопросу.
В конце концов, у вас в основном есть TCP-подобный сокет, через который вы можете отправлять любые данные. Но я бы посоветовал вам использовать протоколы ATT & GATT (см. спецификацию Bluetooth). Все устройства BLE должны использовать эти протоколы, но если отправитель и получатель запрограммированы вами, вы можете использовать свой собственный, возможно, более простой протокол.
Это не специфический RPi, в этом нет необходимости, так как почти каждый дистрибутив Linux использует один и тот же стек Bluetooth, называемый Bluez. Вам нужен пакет
libbluetooth-dev
для разработки собственных приложений с его помощью.Для Python можно использовать любую из следующих библиотек:
Вы можете найти обширный учебник для второгоЗдесь . Он сделан для конкретного оборудования bluetooth, но его должно быть более чем достаточно, чтобы вы начали с ним работать. Бле.
Откройте гнездо L2CAP для низкоэнергетической связи
В C, с Bluez
Во-первых, все переменные, которые нам нужны, объяснение последует в соответствующем месте.int get_l2cap_connection () {
Во-первых, нам нужно создать сокет, из которого мы сможем принять соединение. Семейство сокетов -int ssock = 0; int csock = 0; int reuse_addr = 1; struct sockaddr_l2 src_addr; struct bt_security bt_sec; int result = 0;
PF_BLUETOOTH
, тип сокета -SOCK_SEQPACKET
(мы хотим иметь TCP-подобный сокет, а не raw), а протокол-протокол Bluetooth L2CAP (BTPROTO_L2CAP
).ssock = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP);
Мы хотим сделать конечно, это было успешно:
if (ssock < 0) { perror("Opening L2CAP socket failed"); return -1; }
Теперь мы должны заполнить исходную адресную структуру подстановочным адресом, чтобы любое устройство Bluetooth с любым адресом могло подключиться к нам. Подстановочный адрес определяется как
BDADDR_ANY
вbluetooth.h
. Чтобы скопировать его в адресную структуру, мы можем использовать функциюbacpy
. Мы также должны установить семейство адресов, тип адреса и идентификатор канала.memset(&src_addr, 0, sizeof(src_addr)); bacpy(&src_addr.l2_bdaddr, BDADDR_ANY); src_addr.l2_family = AF_BLUETOOTH; src_addr.l2_bdaddr_type = BDADDR_LE_PUBLIC; src_addr.l2_cid = htobs(CID_ATT);
Установка опции SO_REUSEADDR позволит нам быстро вызвать bind снова, если это необходимо (это можно оставить out):
setsockopt(ssock, SOL_SOCKET, SO_REUSEADDR, &reuse_addr, sizeof(reuse_addr));
Далее мы должны связать сокет со структурой адреса источника, которую мы только что определили. Снова мы проверяем возвращаемое значение, чтобы убедиться, что оно работает.
result = bind(ssock, (struct sockaddr*) &src_addr, sizeof(src_addr)); if (result < 0) { perror("Binding L2CAP socket failed"); return -1; }
Далее устанавливается уровень безопасности. Обратите внимание, что этот шаг необязателен, но установка уровня безопасности на средний позволит автоматически выполнять сопряжение с устройством (ядро обрабатывает фактическое сопряжение).
Теперь мы можем сказать ядру, что наш ssock является пассивным сокетом, который будет принимать соединение. Второй параметр-это отставание. Если вы хотите узнать больше, на главной странице listen содержится вся необходимая вам информация.memset(&bt_sec, 0, sizeof(bt_sec)); bt_sec.level = BT_SECURITY_MEDIUM; result = setsockopt(ssock, SOL_BLUETOOTH, BT_SECURITY, &bt_sec, sizeof(bt_sec)); if (result != 0) { perrorno("Setting L2CAP security level failed"); return -1; }
Теперь мы можем ждать входящего соединения. Структура peer_addr будет содержать адрес подключенного устройства, после того, как accept возвращает. csock будет файловым дескриптором сокета, который мы можем читать/записывать, чтобы взаимодействовать с подключенным устройством.result = listen(ssock, 10); if (result < 0) { perror("Listening on L2CAP socket failed"); return -1; }
memset(peer_addr, 0, sizeof(*peer_addr)); socklen_t addrlen = sizeof(*peer_addr); csock = accept(ssock, (struct sockaddr*)peer_addr, &addrlen); if (csock < 0) { perror("Accepting connection on L2CAP socket failed"); return -1; }
Мы можем распечатать адрес подключенного устройства (необязательно, конечно). Мы можем используйте функцию batostr для преобразования адреса Bluetooth в строку.
printf("Accepted connection from %s", batostr(&peer_addr->l2_bdaddr));
Если мы не хотим, чтобы подключались другие устройства, мы должны закрыть сокет сервера. Сделайте то же самое с csock, после того как ваша связь с устройством закончена.
close(ssock); return csock; }