嵌入式linux 蓝牙怎么开发

嵌入式linux 蓝牙怎么开发,第1张

一.Linux对于蓝牙的支持

 在Linux 2.6内核已经实现如下协议。

串口形式蓝牙设备驱动(HCI UART driver)

USB蓝牙棒驱动(HCI USB driver)

内核也实现了L2CAP,RFCOMM串口接口,以及SCO链路支持.

另外内核也直接支持BNEP(Bluetooth Network Encapsulation Protocol ),即把蓝牙网络当成一个无线局域网 *** 作。

 Linux也带了蓝牙输入设备的相关支持。

需要打开 HIDP 和HID2HCI两个选项都要打开.

DUND 把蓝牙网络当成一个拨号网络来处理。

2.蓝牙协议栈

在实现了L2CAP后,也需要一个蓝牙协议栈处理。它起什么作用呢? 我的理解是内核封装到RFCOMM的层次,即只负责的蓝牙的包的封装与收发。至于包收上来,在蓝牙的四个阶段,如何应用的状态影响,以及如何响应正确的包,这一些事情由蓝牙协议栈来完成的。

在Linux实现蓝牙功能有多个互相竞争的蓝牙协议栈,但是影响最大是bluez.几乎已经成为Linux下的标准协议栈的代名词。

还有一个协议栈是Affix  不过用的人比较少

在应用程序级,它主要由两部分组成,一个是bluez的应用程序库,主要负责与内核的bluez通信,和bluez-util工具。即完成蓝牙四阶段处理的一些命令行工具。

3.蓝牙的概念。

配对由一方发起即可,如果本设备需要被其它设备搜索,需要有被发现功能。

二.Linux关于蓝牙命令

-------------------------------------------------

在Linux使用蓝牙最方便是使用bluez-util自带向个命令来测试。

我们这里采用市面最容易找到的蓝牙棒来做物理层设备与手机进行通讯测试。把蓝牙棒插LINUX下的USB口后,在dmesg我们会看到提示

表示USB蓝牙棒已经被识别了。如果

*** 作系统自带HCI工具主要来自bluez-util.

/usr/sbin/hciattach : attach serial devices via UART HCI to BlueZ stack

/usr/sbin/hcid     :Bluetooth Host Controller Interface Daemon

/usr/sbin/hciemu    :HCI emulator

/usr/sbin/hciconfig :  configure Bluetooth devices

/usr/sbin/hcidump  : Parse HCI data

/usr/bin/hcitool   : configure Bluetooth connections

/usr/bin/sdptool    : control and interrogate SDP servers

hciconfig类似于 hciconfig.类似的 *** 作可以参见官网(这里不方便留链接,自己去搜索下就可以了)

检测USB设备,lsusb

2.查看hci设备,hciconfig

激活设备

hciconfig hci0 up

3.修改蓝牙配置文件

蓝牙采用/etc/bluetooth/

hcid.conf  rfcomm.conf

其中hcid.conf有关配对信息。其中security user表示每次配对询问用户对方PIN,而auto则直接采用passkey中的PIN码。

4.重启蓝牙服务

如果修改了蓝牙配置后,需要重启蓝牙服务

service bluetooth stop

service bluetooth start

5.扫描设备

6.增加自动配对设置

修改 /etc/bluetooth/rfcomm.conf

增加扫描蓝牙地址

7.创建设备结点(只合适于第一次)

rfcomm create dev #它将创建于/dev/rfcomm0 设备结点

它等同于如下命令系列

mknod /dev/rfcomm0 c 216 1

chmod 666 /dev/rfcomm0

rfcomm bind /dev/rfcomm0 00:21:19:A4:E0:F1-1

8.增加SDP消息信息

为了减少麻烦,把所有支持的蓝牙服务都加上.

sdptool add --channel=1 DID SP DUN LAN FAX OPUSH FTP HS HF SAP NAP GN PANU HID CIP CTP A2SRC A2SNK SYNCML NOKID PCSUITE SR1

9.增加蓝牙串口绑定

rfcomm bind /dev/rfcomm0 00:21:19:A4:E0:F1 1

#rfcomm bind /dev/rfcomm0 蓝牙设备地址  通道,这个命令可选

10.解除蓝牙绑定

格式:rfcomm unbind /dev/rfcomm0 蓝牙设备地址   通道

11.联接蓝牙设备

hcitool cc 00:21:19:A4:E0:F1

三.关于蓝牙配置文件

-------------------------------------------

蓝牙的配置文件主要是 /etc/bluetooth目录下的hcid.conf和rfcomm.conf.

这里的security 是表示配对的认证模式,user表示由用户输入密码。这个需要在后面用

pin_helper 指明用哪一个程序输入密码,这程序可以是图形界面程序,或者是字符界面程序。

常见的pin_helper有

/usr/bin/bluez-pin : bluez自带的pin输入界面

kbluepin

passkey 配置项指明请求联接的设备的pin码。当采用auto模式时,将采用这个密码来联接.

方法如下:

1、终端使用命令lsusb

2、运行hciconfig可以看到:

从上图可以看出,的蓝牙设备是hci0

3、运行hcitool dev可以看到蓝牙设备的硬件地址

运行hcitoo --help 可以查看更多相关命令

然后激活设

sudo hciconfig hci0 up

要注意的是,激活前蓝牙必须是打开的,否则会出现如下错误:

4、然后扫描:

hcitool scan

5、然后开始连接了,连接阶段使用的主要命令是rfcomm:

运行rfcomm --help 可以查看用法

首先需要绑定目的蓝牙设备:

sudo rfcomm bind /dev/rfcomm0 E0:A6:70:8C:A3:02

注意:上面的这个地址是目的蓝牙设备的硬件地址。

接着连接:

sudo cat >/dev/rfcomm0

这是目的蓝牙主机就会d出一个对话框要求输入pin码,随便输入一个,然后主机就会d出一个对话框,只要输入的和刚才一致就可以通过验证。之后我们发现我的手机已经显示了成功配对的标记了。

(二)在HHARM2410-R3上的移植

完成了在普通red hat上的安装,熟悉了蓝牙协议栈一些基本的东西,下面的任务就是把协议栈搬到开发板上了。

第一步当然是内核了,由于华恒的内核代码改过,我也不知道从bluez上下载的patch能不能使用,试试看了,只好。

# cd /HHARM2410/kernel

# gzip -dc ~/patch-2.4.18-mh15.gz | patch -p1

# find ./ -name '*rej'

./fs/cramfs/inode.c.rej

不好,有文件不能patch,看看是针对cramfs文件系统的patch,我也不清楚为什么bluez的patch会修改到cramfs,不过我想 问题应该不大。内核源代码关于bluetooth的部分华恒应该没有改过,因此patch的主要部分应该是没有问题的。如果内核编译后发生问题,我想大概 也只有把内核代码翻出来看了。

先就这样了,用用试试看好了。与普通pc上的类似,只不过有些是m的现在统统为y了。我的配置关于Bluez的部分设置为:

#

# Bluetooth support

#

CONFIG_BLUEZ=y

CONFIG_BLUEZ_L2CAP=y

# CONFIG_BLUEZ_SCO is not set

CONFIG_BLUEZ_RFCOMM=y

CONFIG_BLUEZ_RFCOMM_TTY=y

CONFIG_BLUEZ_BNEP=y

CONFIG_BLUEZ_BNEP_MC_FILTER=y

CONFIG_BLUEZ_BNEP_PROTO_FILTER=y

# CONFIG_BLUEZ_HIDP is not set

#

# Bluetooth device drivers

#

CONFIG_BLUEZ_HCIUSB=y

# CONFIG_BLUEZ_HCIUSB_SCO is not set

# CONFIG_BLUEZ_HCIUART is not set

# CONFIG_BLUEZ_HCIBFUSB is not set

# CONFIG_BLUEZ_HCIDTL1 is not set

# CONFIG_BLUEZ_HCIBT3C is not set

# CONFIG_BLUEZ_HCIBLUECARD is not set

# CONFIG_BLUEZ_HCIBTUART is not set

# CONFIG_BLUEZ_HCIVHCI is not set

device部分就设了个USB的,其他的就不设置了。

下面继续make depmake zImage的常规过程,OK,没有发生编译问题,可以稍微舒口气了。

下面要移植Bluez的基础库了,在Redhat 9下执行

# ldd /usr/lib/libbluetooth.so.1.0.17

libc.so.6 =>/lib/libc.so.6 (0x4002c000)

/lib/ld-linux.so.2 =>/lib/ld-linux.so.2 (0x80000000)

发现没有依赖什么莫名其妙的库,应该换个编译器就可以了,configure一下就可以了。我的配置命令很简单:

# ./configure --host=armv4l --prefix=/HHARM2410/applications/bluezport/libs CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc CPP=/opt/host/armv4l/bin/armv4l-unknown-linux-cpp AR=/opt/host/armv4l/bin/armv4l-unknown-linux-ar STRIP=/opt/host/armv4l/bin/armv4l-unknown-linux-strip RANLIB=/opt/host/armv4l/bin/armv4l-unknown-linux-ranlib

LD=/opt/host/armv4l/bin/armv4l-unknown-linux-ld

# make

# make install

OK了,到了/HHARM2410/applications/bluezport/libs下看看,我也不清楚为什么,居然只有.a和.la的静态库,没有动态库。只好自己动手,到bluz-libs-2.17/src/下,自己编译动态库:

# /opt/host/armv4l/bin/armv4l-unknown-linux-gcc -shared -o libbluetooth.so.1.0.17 bluetooth.o hci.o sdp.o

再做两个符号连接

# ln -s libbluetooth.so.1.0.17 libbluetooth.so

# ln -s libbluetooth.so.1.0.17 libbluetooth.so.1

好了,库交叉编译完毕,mv到/HHARM2410/application/bluezport/libs/lib文件夹下就可以了。

接着移植Bluez的工具集。与库类似,先看一下各个程序需要用到什么库,比如:

#ldd /usr/sbin/hcid

libbluetooth.so.1 =>/usr/lib/libbluetooth.so.1 (0x40035000)

libc.so.6 =>/lib/libc.so.6 (0x40042000)

/lib/ld-linux.so.2 =>/lib/ld-linux.so.2 (0x40000000)

挨个试试需要用的工具,发现需要的库华恒和Bluez都提供了,应该换个编译器编译一下就可以了。编译之前我为了到板子上与我自己的手机连接方便修改 了bluez-utils-2.17/hcid/security.c文件,在init_security_data函数中的设置默认的密码,非常简单地 改了两行:

strcpy(hcid.pin_code, "123")

hcid.pin_len = 3

然后configure我想就行了,我的configure设置为:

# ./configure --prefix=/HHARM2410-R3/applications/bluezport/utils --includedir=/HHARM2410-R3/applications/bluezport/libs/include --libdir=/HHARM2410-R3/applications/bluezport/libs/lib --with-bluez=/HHARM2410-R3/applications/bluezport/libs --disable-test --disable-cups --disable-pcmia --host=armv4l CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc CPP=/opt/host/armv4l/bin/armv4l-unknown-linux-cpp AR=/opt/host/armv4l/bin/armv4l-unknown-linux-ar STRIP=/opt/host/armv4l/bin/armv4l-unknown-linux-strip RANLIB=/opt/host/armv4l/bin/armv4l-unknown-linux-ranlib LD=/opt/host/armv4l/bin/armv4l-unknown-linux-ld

# make

我在这步make的时候出现了一点小错误,好像是说PATH_MAX没有定义,这个是LINUX设置的存放路径名缓冲区的最大长度。应该是少包含了一个头文件造成的。我没有去仔细考究,就在当前文件下的config.h中添加了三行:

#ifndef PATH_MAX

#define PATH_MAX 4095/* PAGE_SIZE - 1 */

#endif

采用简单粗鲁的添加定义的方式。再make,通过。

# make install

好了,工具集都在/HHARM2410-R3/applications/bluezport/util下了

最后,由于在PC的LINUX下的默认pin_helper /usr/bin/bluepin是用python写的代码,在2410上当然不能用了,所以要自己写一个pin_helper的程序。翻翻 /usr/bin/bluepin的代码以及hcid/security.c的代码,事实上hcid进程在验证PIN code的时候开了一个pipe指向pin_helper进程的标准输出,pin_helper进程向用户询问PIN code,如果用户输入密码XXXX就以"PIN:XXXX"的形式写到标准输出中去,如果用户reject就写个"ERR"回去。

我以一种最简单的方式实现pin_helper程序,即固定地写一个code回去,比如123,牺牲安全性。

用脚本实现就是:

#!/bin/sh

echo "PIN:123"

用C实现一个就是:

#include <stdio.h>

int main(int argc, char* argv[])

{

printf("PIN:123")

}

交叉编译成my_pin_helper再放到板子的/usr/bin下,那么就可以把板子的hcid.conf修改成:

pin_helper /usr/pin/my_pin_helper

后来,我在板子上也用MiniGUI写了一个pin_helper,也挺简单的。

好了,一切准备完毕,做好ramdisk,记得在/dev下mknod几个rfcomm,放到板子上,可以运行!

插上USB适配器,连模块都不用probe

# hciconfig hci0 up

# hcid -f /etc/bluetooth/hcid.conf

# hciconfig -a


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8380417.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-15
下一篇2023-04-15

发表评论

登录后才能评论

评论列表(0条)

    保存