Linux下如何使用蓝牙

Linux下如何使用蓝牙,第1张

使用蓝牙

在使用蓝牙之前,先要确认你所使用的内核是否已经加入蓝牙支持,各大Linux厂商的发行版的内核一般都带有蓝牙支持。

首先加载模块:

#modprobe hci_usb (我这里使用的是usb接口的蓝牙适配器)

#modprobe rfcomm

开启蓝牙服务

#/etc/rc.d/init.d/bluetooth start

打开设备接口:

#hciconfig hci0 up

查看设备状态:

#hciconfig -a

hci0: Type: USB

BD Address: 00:10:60:A3:68:9F ACL MTU: 192:8 SCO MTU: 64:8

UP RUNNING PSCAN ISCAN

 一,蓝牙存储设备

蓝牙适配器: ISSC芯片, USB接口(市面上还有其他的一些品牌,大多没有问题)

蓝牙手机:索爱T628

蓝牙耳机:Jabra BT250(大陆地区型号是FS258,大概照顾中国人对BT的特殊理解和258的吉利数字)

1,加载蓝牙适配器

插入USB口之后,可以使用lsusb命令,看到:

Bus 004 Device 003: ID 1131:1001 Integrated System Solution Corp.

这是,运行hciconfig可以看到:

hci0: Type: USB

BD Address: 00:11:67:02:1A:03 ACL MTU: 678:8 SCO MTU: 48:5

DOWN

RX bytes:142289 acl:884 sco:0 events:823 errors:0

TX bytes:13302 acl:494 sco:0 commands:151 errors:0

运行:

hciconfig hci0 up

可以激活借口(这一步不做,hcitool scan无法运行)

3,配置bluez

默认的配置文件放在/etc/bluetooth目录

hcid.conf和pin不需要修改,安全方式已经被设置成auto,这是为了方便连接,用户可以自己修改,推荐不做修改,以防止有些设备连接不上。

4,重启bluetooth服务。

/etc/rc.d/init.d/bluetooth stop

/etc/rc.d/init.d/bluetooth start

5,扫描设备

运行hcitool scan可以得到:

Scanning ...

00:01:EC:0C:D2:00 Tree's T628

6,修改配置文件:

修改/etc/bluetooth/rfcomm.conf

将里面的:

device 11:22:33:44:55:66

修改成hcitool scan的结果,也就是:

device 00:01:EC:0C:D2:00

保存退出。

7,创建设备:

运行

rfcomm_create_dev。

8,添加通道:

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

后面的参数不一定被支持,但是以防有些服务没有被打开,所以,干脆全部打开了。

rfcomm bind /dev/rfcomm0 电话的地址 通道(在rfcomm.conf中配置)

这里的命令应该写成:

rfcomm bind /dev/rfcomm0 00:01:EC:0C:D2:00 1

9,连接手机:

hcitool cc 电话的地址

也就是

hcitool cc 00:01:EC:0C:D2:00

这时候,可以看到手机上的蓝牙连接呈联通状态。

10,从计算机发送文件:

obex-send abc.jpg

*** 作系统会d出提示框,让你选择要发送的目标。

同时可以看到手机会d出提示框,询问是否接受文件。

11,手机的配置:

需要在手机上进行一下配置:

连接->蓝牙->匹配装置->添加装置。

会自动扫描到PC上的适配器。

如果需要填入识别码就填写123。上面已经设置了。

这时候,可以看到手机已经成功的添加蓝牙装置。

12,从手机发送文件。

在PC机上启动obex-server,会看到系统托盘出现一个小图标。

完成上面的工作后,可以进入手机的:

多媒体->我的影集

选择一张图片。

然后,“发送”->“通过蓝牙”

看到有刚才扫描到的蓝牙适配器。

然后,就可以发送文件了。

13,使用软件管理手机信息。

参考gnokii软件的文档

二、蓝牙耳机。

1,同时按住jabra 250上面的“电话键”和“音量增大键”,大约8秒,看到蓝灯常亮

1,扫描耳机,得到bdaddress

hcitool scan

3,配置工作:

modprobe snd_bt_sco

hciconfig hci0 void 0x0060

btsco bdaddress (这里的bdaddress就是扫描出来的结果)

btsco运行后,会d出对话框,要求输入耳机的pin,jabra 250为0000,可以在说明书上找到。

4,建立联接后,设备被映射成/dev/dsp1。

以beep为例,

插件->输出,选择使用alsa驱动,点开“首选项”,音频设置部分就可以看到btsco:hw0,1之类的信息,选择这个即可。

然后播放一首歌,尝试一下无线的快乐吧。

然后适当的配置你所要使用的播放器之类的就可以了。

(二)在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://outofmemory.cn/yw/6233652.html

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

发表评论

登录后才能评论

评论列表(0条)

保存