Raspberry pi bluetooth-отправка данных


Прежде чем опубликовать это, я попытался найти простую программу для отправки любых данных с помощью BLE с rapsberry pi. Но больше я получил в деталях, я знал, что есть некоторые библиотеки BLE, которые поддерживают Программирование с использованием Python на RPi. Я новичок в сетевом программировании на python и ищу учебник. Каждый учебник посвящен тому, как подключить RPi и какой-то телефон с помощью BLE.Они не показывают, как сделать скрипт py, чтобы отправить некоторые данные датчиков или что-то подобное. Пожалуйста, проводите.

1 2

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;
    }

Далее устанавливается уровень безопасности. Обратите внимание, что этот шаг необязателен, но установка уровня безопасности на средний позволит автоматически выполнять сопряжение с устройством (ядро обрабатывает фактическое сопряжение).

    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;
    }
Теперь мы можем сказать ядру, что наш ssock является пассивным сокетом, который будет принимать соединение. Второй параметр-это отставание. Если вы хотите узнать больше, на главной странице listen содержится вся необходимая вам информация.
    result = listen(ssock, 10);
    if (result < 0) {
        perror("Listening on L2CAP socket failed");
        return -1;
    }
Теперь мы можем ждать входящего соединения. Структура peer_addr будет содержать адрес подключенного устройства, после того, как accept возвращает. csock будет файловым дескриптором сокета, который мы можем читать/записывать, чтобы взаимодействовать с подключенным устройством.
    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;
}