一、蓝牙配置及与手机通信
1、蓝牙介绍
(1)四种基本蓝牙profile
1. GAP Profile: Generic Access Profile,该Profile保证不同的Bluetooth产品可以互相发现对方并建立连接。
2.SDAP Profile: Service Discovery Application Profile,通过该Profile,一个Bluetooth设备可以找到其它Bluetooth设备提供的服务,以及查询相关的信息。
3.SPP Profile: Serial Port Profile,模拟串口通讯。
4.GOEP Profile: Generic Object Exchange Profile,通用对象交换。这个Profile的名字有些费解,它定义的是数据的传输,包括同步,文件传输,或者推送其它的数据。你可以把它理解为内容无关的传输层协议,可以被任何应用用来传输自己定义的数据对象.
(2)九种应用协议(usage profile)
1.CTP Profile: Cordless Telephone Profile,无绳电话。
2.IP Profile: Intercom Profile,这是在两个设备之间建立语音连接,换句话说,把两个昂贵的兰牙设备变成廉价的对讲机。
3. HS Profile: HeadSet Profile,用于连接耳机。
4.DNP Profile: Dial-up Networking Profile,用于为PC提供拨号网络功能。
5.FP Profile: Fax Profile,传真功能。
6.LAP Profile: LAN Access Profile,使用PPP协议建立局域网。
7.OPP Profile: Object Push Profile,用于设备之间传输数据对象。
8.FTP Profile: File Transfer Profile,用于文件传输。
9.SP Profile: Synchronization Profile,用于不同的Bluetooth设备同步,保持数据的一致性
2、安装蓝牙相关软件包
sudo apt-get install pi-bluetooth bluez bluez-firmware blueman
3、添加pi用户到蓝牙组
sudo usermod -G bluetooth -a pi
sudo reboot
之后蓝牙可以使用
4、开启蓝牙设备
sudo vi /etc/systemd/system/dbus-org.bluez.service
修改文件中这两个语句(要根据自己的路径修改)
重启树莓派,输入hciconfig(类似ifconfig)命令查看蓝牙服务
5、查看适配器提供的各种功能
sudo sdptool browse local
6、等待连接
通过hciconfig看到我们的本地的设备是hci0,运行一下命令等待连接
sudo rfcomm watch hci0
让手机能够搜到我们的蓝牙
法1:点击Make Discoverable
法2:运行sudo hciconfig hci0 piscan
7、手机串口软件连接
手机连接上后ls /dev可以看到rfcomm0
只有在有蓝牙连接上去的时候才有这个设备
8、手机树莓派通信
-
树莓派上安装minicom–>设置串口为rfcomm0
-
手机上打开蓝牙串口,即可通信
参考网页:
http://blog.csdn.net/wanyeye/article/details/52909869
https://www.raspberrypi.org/forums/viewtopic.php?p=919420
https://jasiek.me/2014/10/04/bluetooth-console-on-a-raspberry-pi-using-a-usb-adapter.html
9、绑定设备号 到某个MAC和channel上
创建设备节点:mknod /dev/rfcomm0 c 216 0
216是RFCOMM的设备号,可以参考…./bluez-utils-2.x/scripts/create_dev脚本
绑定:rfcomm bind /dev/rfcomm0 [MAC] [channel]
解除绑定:rfcomm release /dev/rfcomm0
查看绑定:rfcomm show /dev/rfcomm0
二、应用编程
1. 蓝牙串口操作所需要的头文件
#include <stdio.h> /*标准输入输出定义*/
#include <stdlib.h> /*标准函数库定义*/
#include <unistd.h> /*Unix 标准函数定义*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> /*文件控制定义*/
#include <termios.h> /*PPSIX 终端控制定义*/
#include <errno.h> /*错误号定义*/
2.打开蓝牙串口
例如:fd = open( “/dev/rfcomm0 “, O_RDWR | O_NOCTTY | O_NDELAY);
标志O_NOCTTY可以告诉UNIX这个程序不会成为这个端口上的“控制终端”.如果不这样做的话,所有的输入,比如键盘上过来的Ctrl+C中止信号等等,会影响到你的进程.而有些程序比如getty(1M/8)则会在打开登录进程的时候使用这个特性,但是通常情况下,用户程序不会使用这个行为.
O_NDELAY标志则是告诉UNIX,这个程序并不关心DCD信号线的状态——也就是不关心端口另一端是否已经连接.如果不指定这个标志的话,除非DCD信号线上有space电压否则这个程序会一直睡眠.
3.设置蓝牙串口
波特率设置
struct termios options;
* Get the current options for the port...
tcgetattr(fd, &options);
* Set the baud rates to 19200...
cfsetispeed(&options, B19200);
cfsetospeed(&options, B19200);
* Enable the receiver and set local mode...
options.c_cflag |= (CLOCAL | CREAD);
* Set the new options for the port...
tcsetattr(fd, TCSANOW, &options);
设置字符大小
设置字符大小的时候,这里却没有像设置波特率那么方便的函数.所以,程序中需要一些位掩码运算来把事情搞定.字符大小以比特为单位指定:
options.c_flag &= ~CSIZE; / * Mask the character size bits */
options.c_flag |= CS8; /* Select 8 data bits */
设置奇偶校验和停止位
- No parity (8N1)
options.c_cflag &= ~PARENB
options.c_cflag &= ~CSTOPB
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8; - Even parity (7E1)
options.c_cflag |= PARENB
options.c_cflag &= ~PARODD
options.c_cflag &= ~CSTOPB
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS7; - Odd parity (7O1)
options.c_cflag |= PARENB
options.c_cflag |= PARODD
options.c_cflag &= ~CSTOPB
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS7; - Space parity is setup the same as no parity (7S1)
options.c_cflag &= ~PARENB
options.c_cflag &= ~CSTOPB
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
设置输入输出
如果不是开发终端之类的,只是串口传输数据,而不需要串口来处理,那么使用原始模式(Raw Mode)方式来通讯,设置方式如下:
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); /*Input*/
options.c_oflag &= ~OPOST; /*Output*/
经典输入是以面向行设计的.在经典输入模式中输入字符会被放入一个缓冲之中,这样可以以与用户交互的方式编辑缓冲的内容,直到收到CR(carriage return)或者LF(line feed)字符.
选择使用经典输入模式的时候,你通常需要选择ICANON,ECHO和ECHOE选项:
options.c_lflag |= (ICANON | ECHO | ECHOE);
通过在c_oflag成员变量中设置OPOST选项的方法程序可以选择加工过的输出.
options.c_oflag |= OPOST;
在所有选项当中,你可能只需要使用ONLCR选项来将行分隔符映射到CR-LF组合对上.其他选项主要是历史遗留,仅仅与行打印机和终端跟不上串行数据的年代有关.
设置硬件流控制
某些版本的UNIX系统支持通过CTS(Clear To Send)和RTS(Request To Send)信号线来设置硬件流控制.如果系统上定义了CNEW_RTSCTS和CRTSCTS常量,那么很可能它会支持硬件流控制.使用下面的方法将硬件流控制设置成有效:
options.c_cflag |= CNEW_RTSCTS;
将它设置成为无效的方法与此类似:
options.c_cflag &= ~CNEW_RTSCTS;
4.读写串口
char buffer[1024];
int Length;
int nByte;
nByte = write(fd, buffer ,Length)
char buff[1024];
int Len;
int readByte = read(fd,buff,Len);
使用文件操作read函数读取,如果设置为原始数据模式(Raw Date Mode)传输数据,那么read函数返回的字符数是实际串口收到的字符数,也就是返回从串口输入缓冲区中实际得到的字符的个数.在不能得到数据的情况下,read(2)系统调用就会一直等着,只到有端口上新的字符可以读取或者发生超时或者错误的情况发生.
如果需要read(2)函数迅速返回的话,可以使用操作文件的函数来实现异步读取,如fcntl,或者select等来操作 。
fcntl(fd, F_SETFL, FNDELAY);
标志FNDELAY可以保证read(2)函数在端口上读不到字符的时候返回0.需要回到正常(阻塞)模式的时候,需要再次在不带FNDELAY标志的情况下调用fcntl(2)函数:
fcntl(fd, F_SETFL, 0);
当然,如果你最初就是以O_NDELAY标志打开串口的,你也可在之后使用这个方法改变读取的行为方式.
5.关闭串口
close(fd);
一、蓝牙介绍(1)四种基本蓝牙profile1. GAP Profile: Generic Access Profile,该Profile保证不同的Bluetooth产品可以互相发现对方并建立连接。2.SDAP Profile: Service Discovery Application Profile,通过该Profile,一个Bluetooth设备可以找到其它Bluetooth设备提供的服务,以
在项目中需要使用树莓派的板载蓝牙与HC05蓝牙模块进行通讯,但目前HC05和树莓派的原生接口兼容性并不完善,尝试了很多方案,以下是一个目前能用的方案.
一、树莓派与HC05蓝牙模块进行连接
在树莓派的图形界面单机右上角蓝牙图标>Add Device,如下图所示,
点击Pair,输入配对密码,一直OK,最后会弹出连接失败.如下图所示,没关系,这里只是输入配对密码.
在p...
树莓派3B自带蓝牙模块,笔者就想通过树莓派蓝牙模块实现数据传输的可编程化,就想在树莓派上搭建一个蓝牙编程环境。以下是笔者搭建环境所出现的一些步骤、问题及其应对方案。
bluez的安装需要手动编译,在bluez官网(http://www.bluez.org/)中找到较新版本进行下载,笔者写文章时的最新版本是5.44,找到链接后在 ~/Downloads/下输入命令
$ wget http://www.kernel.org/pub/linux/bluetooth/bluez-5.44.tar.xz
sudo apt-get install python-dev
sudo apt-get install libbluetooth-dev
sudo pip3 install pybluez
注意:如果是Python3,必须pip3 ,前面一直用pip安装,一直不行,后面Google,pip3可以了,不知道Python2是否需要pip,未测试。
import bluetooth
The Raspberry Pi single-board computer has had built-in Bluetooth connectivity since the release of the Raspberry Pi 3 in 2016, allowing you to connect wireless peripherals such as keyboards, game controllers, headsets, and more to your device.
If you don.
入坑树莓派(2)——树莓派4B与手机蓝牙通信1、引言2、步骤2.1、蓝牙配对2.2、蓝牙连接准备2.3、蓝牙连接3、参考网址
在入坑树莓派(1)中已经搞掂了可视化问题。现在继续开展下一步,尝试与手机通信,一开始是想弄wifi连接的,但发现基于wifi的APP比较难弄,为了降低开发的难度,又因为树莓派板子自带蓝牙模块,所以直接选用蓝牙连接手机通信。
2.1、蓝牙配对
(1)直接打开VNC viewer登陆进树莓派系统,右上角图标打开蓝牙。
(2)点击“Make Discoverable”
参考连接:https://www.raspberrypi.org/forums/viewtopic.php?p=9194201、查看树莓派蓝牙开启状态2、重启一下蓝牙服务并且打开手机的蓝牙3、开始打开蓝牙shell和进行蓝牙操作的一些指令4、connect连接蓝牙5、手机连接效果另:1、查看蓝牙的版本
2、关于使用蓝牙传输数据需要有专门的UART串口工具和软件,在这里没有继续深入去探索了,有机会在
文章目录一、树莓派中的蓝牙二、通过python使用树莓派蓝牙三、通过蓝牙进行通信1、通过RFCOMM方式进行通信2、通过L2CAP方式进行通信四、问题与改进
一、树莓派中的蓝牙
Raspberry中已经安装了Bluez。我使用的版本是5.50。你可以通过以下命令检查自己的BlueZ版本:
bluetoothd -v
可以用下面的命令检查Bluez的运行状态:
systemctl status bluetooth
可以看到我的返回结果显示蓝牙已经打开并正在运行。
你可以用下面命令手动启动或关闭蓝牙服务:
本笔记基于树莓派 3B+(同事买的,拿来玩玩的)的原生蓝牙,实现与手机之间的SPP服务的通讯功能,截至本笔记,未发现同类的笔记/文章。本人主要参考了后面的两个链接,经过大半天(严格说不到一周,主要一开始一直使用苹果手机的蓝牙,苹果比较封闭,耽误了太多的时间)的摸索链路上基本OK,草做个笔记以备查阅。
调试的手机也是借同事的 嘿嘿主要参考链接:
https://www.raspberrypi.org
1. 购买距离传感器模块,比如 HC-SR04,它可以通过脉冲测量的方式来测量距离。
2. 连接 HC-SR04 模块到树莓派上。可以通过 GPIO 引脚连接。具体的连接方式可以参考 HC-SR04 的数据手册。
3. 安装蓝牙模块并进行配对。可以使用树莓派自带的蓝牙模块,或者通过 USB 接口连接外部蓝牙模块。在配对过程中,需要注意蓝牙模块的名称和密码,以便后续连接。
4. 编写 Python 程序,使用 HC-SR04 模块测量距离,并将距离信息通过蓝牙发送给另一台设备。可以使用 PyBluez 库来实现蓝牙通信。
5. 在另一台设备上,也需要安装蓝牙模块并进行配对。然后编写 Python 程序,接收从树莓派发送过来的距离信息,并将其显示到 1602 液晶屏上。可以使用 LiquidCrystal 库来控制液晶屏。
总体来说,这个项目需要一定的硬件和软件开发经验。如果你还没有相关经验,可以先学习一些基础知识,比如树莓派的 GPIO 编程、Python 编程和蓝牙通信等。