蓝牙低功耗串行通信- Linux和Arduino Nano ESP 32

hrirmatl  于 2023-11-17  发布在  Linux
关注(0)|答案(1)|浏览(138)

对于我正在做的一个项目,我需要通过蓝牙实现串行通信,从我的Linux笔记本电脑到Arduino板。我已经做到了,使用Arduino Uno连接到蓝牙HC-05 SPP模块 * 通过 * RFCOMM套接字,感谢Albert Huang编写的文档:An Introduction to Bluetooth Programming
上周,为了切换到蓝牙低功耗(因为我想要一个更小的板),我切换到Arduino纳米ESP 32.但我没有弄清楚如何通过BLE启用串行通信.
我已经看了ESP32 Basics: Bluetooth Classic教程,但Arduino Nano ESP 32是基于ESP 32-S3,它不支持蓝牙经典(只有BLE).我也看了看这个页面Utilisation du Bluetooth Low Energy avec bluez(法语),但我不能提取任何有用的东西.我也看了看Bluez documentation,但我不知道该怎么办.
以下是我目前上传到Arduino板上的代码:

/**
* Bluetooth LE Serial Simple Example
* 
* Outputs the text "Hello!" to the Bluetooth LE Serial port every second.
*
* Avinab Malla
* 24 July 2022
**/

#include <BleSerial.h>

BleSerial ble;

void setup()
{
    //Start the BLE Serial
    //Enter the Bluetooth name here
    ble.begin("BleSerialTest");
}

void loop()
{
    //The usage is similar to Serial
    ble.println("Hello!");
    delay(1000);
}

字符串
下面是我试图连接到它的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#include <unistd.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>
#include <bluetooth/hci_lib.h>
#include <sys/socket.h>

int main()
{
        struct sockaddr_hci addr;
        int sock;

        char *bta = "34:85:18:7B:3C:05";

        if ((sock = socket(PF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI)) < 0) {
                perror("socket() failure");
                return errno;
        }

        memset(&addr, 0, sizeof(addr));

        addr.hci_family = AF_BLUETOOTH;
        addr.hci_dev = hci_devid("34:85:18:7B:3C:05");
        addr.hci_channel = HCI_CHANNEL_CONTROL;

        int status = bind(sock, (struct sockaddr*)&addr, sizeof(addr));

        if (status < 0) {
                perror("connect() failure");
                return errno;
        } else {
                printf("bind() success\n");
        }

        char msg[65536] = {0};
        ssize_t n;

        while (1) {
                if ((n = recv(sock, msg, sizeof(msg), 0)) < 0) {
                        perror("recv() failure");
                } else {
                        printf("Received %ld bytes\n", n);
                }
        }

        close(sock);

        return EXIT_SUCCESS;
}


目前,它所做的只是显示bind() success和挂起。当我第一次尝试使用connect而不是bind时,它在显示connect() failure: Operation not supported后停止。

anauzrmj

anauzrmj1#

不幸的是,虽然蓝牙规范有一个标准的串行配置文件的经典蓝牙(SPP over RFCOMM),它没有标准化的BLE串行配置文件。这是因为当BLE被开发时,它的目标并不是要取代串行(假设它应该是“低能量”),而是一种偶尔发送少量数据的无线协议(例如传感器数据)。这意味着如果你想通过BLE实现串行通信,那么你必须创建自己的应用程序,whis不是一件容易的事情,因为它需要全面了解串行通信的一般和BLE GATT客户端/服务器架构。另外,这将是一个耗时的开发工作,因为你将不得不从头开始实现BLE串行通信。
话虽如此,如果你仍然愿意投入时间和精力来开发它,那么我建议从这个开始:

Part 1:Arduino Nano ESP32(GATT server)

你想在Arduino Nano上实现一个GATT服务器。GATT服务器至少有两个特性,名为Tx和Rx。Tx是一个带有NOTIFY属性的特性(因为数据将被发送到远程设备),Rx是具有WRITE属性的特性(这意味着远程设备将能够写入它)。现在,无论何时您通过Arduino板输入数据,您的代码需要读取该数据并通过Tx特性将数据作为通知发送。同样,每当Rx特性接收到数据时,它需要显示在屏幕上。注意:hcheung链接的example似乎正在执行这部分实现。

第2部分:Linux笔记本电脑(GATT客户端)

在Linux膝上型电脑上,您必须实现一个GATT客户端来与GATT服务器进行通信。(Arduino Nano ESP 32),以及2)启用远程Rx特性的通知。然后每当您通过键盘写入数据时,您的程序需要捕获这些数据并通过BLE发送(作为GATT客户端写入操作)到Arduino Nano ESP 32上的远程Tx特性上。同样,当您从Arduino Nano接收数据作为通知时,该数据需要显示在屏幕上。
您可以通过Arduino Nano上的两个新RTS/CTS特性扩展程序来进行流量控制,但这可能是成功实现上述目标后的额外步骤。
关于这个主题的一些有用的链接:

相关问题