对于我正在做的一个项目,我需要通过蓝牙实现串行通信,从我的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
后停止。
1条答案
按热度按时间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特性扩展程序来进行流量控制,但这可能是成功实现上述目标后的额外步骤。
关于这个主题的一些有用的链接: