向蓝牙设备发送命令

时间:2022-01-30 23:50:11

参考链接:http://blog.csdn.net/csu_yang/article/details/5912659

http://blog.csdn.net/lailzhihou/article/details/5817994

蓝牙命令
1. 向蓝牙设备发送命令
bccmd -t bcsp -d /dev/ttymxc1 psload -r /etc/bluetooth/BC6QFN.psr
-t 指定通讯协议 bcsp 为蓝牙核心串口协议
-d 指定执行命令的特定设备
psload -r 装载psr文件中的所有ps键值, -r 表示加载后,发送一个热启动命令.

2. 蓝牙配置命令
hciattach -n /dev/ttymxc1 any 3000000

 

此篇文章用于说明如何在WinCE系统上实现串口蓝牙,希望给想在CE上实现这个功能的“新手”朋友一个帮助。

    先说一下我的硬件环境:CSR BC4 ROM蓝牙芯片,S3C6410,WinCE6.0系统。

    硬件连接:把蓝牙的RX,TX,CTS,RTS和板子上的相应口连接,注意是交叉连接,我这里连接的是UART1。还有就是给蓝牙供电,地,天线等。

    硬件连接好之后,给蓝牙上电,先来搜一把?我当初就是这么干的,我的目的是想验证一下蓝牙有没有接好之类的,掏出手机一搜,结果什么也没有搜到,当时我很郁闷,但是今天回头来想想,认为当时什么也没搜到才算是正常的,如果当时能搜到这个蓝牙,那么,估计这个蓝牙在系统上也不会被认到了(指的是想在系统的控制面板里面,使用CE自带的蓝牙进行搜索配对等操作)。

    好了,现在也搜不到蓝牙,也不能验证模组有没有接好,还是不管那么多了,下面开始上软件,用软件来验证。首先来实现让系统认到这个硬件(使用CE自带的程序进行搜索配对等)。

    1、请先到http://lailzhihou.download.csdn.net/这里下载蓝牙驱动,这个驱动编译后会生成一个bthbcsp.dll的文件。

    2、把该驱动加到你的BSP包里面,便于编译。

    3、在Platform.reg文件中添加如下的注册表项目:

[HKEY_LOCAL_MACHINE/Software/Microsoft/Bluetooth/Transports/BuiltIn/1]
  "driver"="Bthbcsp.dll"
  "flags"=dword:4
  "name"="COM2:"
  "baud"=dword:1C200
  "FlashChip"=dword:0
  "Priority256"=dword:84
  "PacketSize"=dword:C0
 "SerialTimeoutConstant"=dword:5
 "SerialIntervelTimeout"=dword:ffffffff
 "ReopenDelay"=dword:64
  "resetdelay"=dword:1388

    这里最关键的就是

"name"="COM2:"
  "baud"=dword:1C200

    两项,"name"="COM2:"这个是到时候驱动会使用这个名字的串口和蓝牙硬件通信,结合前面我的硬件连接,我的硬件是连接在UART1上,所以,我的系统中有把UART1这个串口设定为“COM2“,当然,这个名字是可以改的,但是必须要保证这里的,"name"=?这个的名字要和你连接的UART上映射的串口名字一样就可以。

    "baud"=dword:1C200,这个很明显是在指定串口的波特率,十六进制表示,我这里设定的是115200,设定这个波特率的原因是,我蓝牙模块的默认波特率是115200,也就是说,这里设定的波特率应该要和你的蓝牙模块的默认波特率一样。原因是:驱动在加载的时候,首先会使用这里设定的波特率打开串口,和模块通信,此时,驱动会给模块进行初始化操作,会使用到一系列的PSKey值。模块只有在经过了这个初始化操作之后,才会开始工作。当然可以再这个PSKey的设置中更改模块的波特率,这样就可以提高蓝牙的传送速度等,关于这点我讲在后面来讲述,首先还是把这个波特率设定为你的蓝牙模块的默认波特率。

    4、在Platform.bib文件中加入类似:

bthbcsp.dll     $(_FLATRELEASEDIR)/bthbcsp.dll     NK  SHK

PSConfig.psr                 $(_FLATRELEASEDIR)/PSConfig.psr              NK    U

这样的信息。

    5、添加组件,这里,使用系统在创建工程时候默认添加的组件即可:

      a、core os->cebase->communication service and networking->networking-personal area network(PAN)->bluetooth->Bluetooth profiles support->Bluetooth HS/HF and Audio Gateway

     b、core os->cebase->communication service and networking->networking-personal area network(PAN)->bluetooth->Bluetooth Protocol Stack with Transport Driver Support->Bluetooth Stack with Universal Loadable Driver

       注意:在b这个同级目录下的组件,只添加这一个,其它的请不要添加。

    6、编译系统,下载NK,如果不出意外,那么此时你就可以再系统的控制面板中搜索和配对蓝牙了。

       如果运气不好,没反应,那么可以从以下几个方面着手查找,先确认相应的DLL和注册表文件是否有加入到系统中。查找驱动是否有加载(bthbcsp.dll)正常情况下,次驱动被加载,会跑到HCI_BCSP.cpp文件的HCI_OpenConnection函数中去,所以可以再这个函数中加上打印看看,是否有跑进来。如果跑进来了,而没有成功,那么请跟进看看跑到哪里就失败退出了之类的,以我的板子上为例,我的在打开串口后进行串口配置的时候就有个地方失败了,所以我在提供的驱动中也是屏蔽了这里的,具体的位置在HCI_BCSP.cpp文件的OpenConnection函数中:


#if 0
    if (!SetupComm (serialPortHandle, serialBufferSize, serialBufferSize)) 
 {
  RETAILMSG(1, (TEXT("SetupComm/r/n")));
  IFDBG(DebugOut(DEBUG_BCSP_ERROR, TEXT("<BcspCommunication::OpenConnection@%s> UNABLE TO SET BUFFERS"), name));
  return GetLastError();
 }
#endif

     这里可以根据你的具体情况放开试试。

     另外提醒一下:请在每次重启系统前的时候,最好给模块进行重新上电的操作!!!

 

     如果顺利的话,此时,你已经可以搜索配对了,但这还不够,我们还需要传送文件看看,这个需要加入OBEX组件:

   Core OS->CEBASE->Applications and Services Development->Object Exchange Protocol(OBEX)

     依次展开这个目录下的所有子项,并添加它们。 添加后编译NK就可以传送文件了。

     如果,在这里你出现了这样的现象,就是当下载完NK之后的第一次系统启动后,可以传送文件,一切都很正常,但是当重启之后,就不能传送文件了,在手机端老是提示连接失败,那么可以尝试在Platform.reg文件中加入如下注册表信息尝试:

[HKEY_LOCAL_MACHINE/Services/OBEX]
  "FriendlyName"="OBEX"
 "DLL"="OBEXSrVr.dll"
 "Keep"=dword:1
; "Order"=dword:9
 "Order"=dword:A
  "Prefix"="OBX"
  "Index"=dword:0

这里是把OBEX这个驱动的启动顺序靠后了。

    另外:

[HKEY_LOCAL_MACHINE/Software/Microsoft/Obex/Services/{00000000-0000-0000-0000-000000000000}]
    ;"BaseDir"="
//My Documents//DefaultInbox"
    "BaseDir"="
//NandFlash//DefaultInbox"
    "Server"="obexinbx.dll"

这段信息可以设定保存文件时候的默认路径。

 

    如果一切顺利,到这里你已经可以随心所欲的传送文件了,但是,可能此时你会觉得传送的速度太慢了,要提高传送的速度就需要设定更高的通信波特率。这里需要涉及到修改2个地方,一个是PSConfig.psr文件,这个文件是一个配置文件,用于来初始化蓝牙芯片。打开这个文件,里面有一些地址和值的配置,这里只需要修改波特率这一项即可:&01be=01d8,后面的01d8表示速度(默认的115200,和我的蓝牙模块的默认波特率一样),修改这个为你想要速度即可,注意这个的速度的修改应该参考一下的公式来进行换算:  

    修改完这个地方,还需要修改驱动中的打开串口的波特率。在HCI_BCSP.cpp文件中,HCI_OpenConnection函数中,有:

result = bcspCommunication.OpenConnection(szComPortName, dwBaud, dwDefaultPacketSize, dwThreadPriority, TRUE);

把这里的dwBaud参数,修改为你在上面PSCONfig.psr文件中设定的波特率一样的即可。此时还应该在OpenConnection函数中开启硬件控制(波特率太高的情况下)。

     修改这2个地方之后,重新编译,下载NK,注意这里在下载NK的时候,一定要做到给蓝牙复位,或重新上电。否则,你会发现连接不上蓝牙了。

     如果你的串口驱动足够OK的话,那么此时你的速度应该会提升到你设定的(串口速度/8/2)K/s,很遗憾的是我的速度并没有提升,估计是我的串口驱动不够强,没有使用上硬件控制流的功能.....

 

     至此,完成了一个最基本的文件传送的蓝牙的设置,如果希望两个蓝牙之间使用文本数据的方式来通信,可以采用Socket的方式来进行,在下载的文件中有2个别人写的示例程序(在此感谢原作者),一个是CE上的Socket方式的通信,一个是PC上的蓝牙程序。另外,在PC上进行蓝牙的Socket开发的时候,你可能还需要先安装一个XP SP2的SDK,然后才可以进行开发。

Baud rate = pskey_value/0.004096

这里还列有一些典型的速度值:

 

38k4 baud - 157 (0x009d)

57k6 baud - 236 (0x00ec)

115k2 baud - 472 (0x01d8)

230k4 baud - 944 (0x03b0)

460k8 baud - 1887 (0x075f)

921k6 baud - 3775 (0x0ebf)

1382k4 baud - 5662 (0x161e)

 

WINCE5.O对USB蓝牙适配器服务的支持

<1>添加蓝牙协议栈

   蓝牙组件位置:Communication Services and Networking/Networking - Personal Area Network (PAN)/Bluetooth/

   Bluetooth Protocol Stack with Transport Driver Support/Bluetooth Stack with Integrated USB Driver

   Bluetooth Protocol Stack with Transport Driver Support/Bluetooth Stack with Universal Loadable Driver

   Bluetooth Profiles Support/Bluetooth DUN Gateway

   Bluetooth Profiles Support/Bluetooth HS/HF and Audio Gateway Service

   Bluetooth Profiles Support/Bluetooth LAP and Configuration Utility

   Bluetooth Profiles Support/Bluetooth PAN

<2>添加对象交换协议

   Applications and Services Development/OBEX Client

   Applications and Services Development/OBEX Server/OBEX File Browser

   Applications and Services Development/OBEX Server/OBEX Inbox

<3>修改注册表

   修改注册表文件内容:C:/WINCE500/PUBLIC/SERVERS/OAK/FILES/servers.reg

   查找下面内容,并添加

    "CanWrite" = dword:1 

    "Authenticate" = dword:0 

    "Password" = "0000 " 

    "Transport Authenticate"=dword:0

    修改前:

; @CESYSGEN IF SERVERS_MODULES_OBEXFILE

[HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Obex/Services/{f9ec7bc4-953c-11d2-984e-525400dc9e09}]

    "BaseDir"="//Temp//Ftp"

    "Server"="obexfile.dll"

; @CESYSGEN IF CE_MODULES_BTD

 "BluetoothSdpRecord"=hex:35,41,09,00,01,35,03,19,11,06,09,00,04,35,11,35,/

                             03,19,01,00,35,05,19,00,03,08,0a,35,03,19,00,08,/

                             09,00,06,35,09,09,65,6e,09,00,6a,09,01,00,09,00,/

                             09,35,08,35,06,19,11,06,09,01,00,09,01,00,25,03,/

                             46,54,50

; @CESYSGEN ENDIF CE_MODULES_BTD

; @CESYSGEN ENDIF SERVERS_MODULES_OBEXFILE

; @CESYSGEN IF SERVERS_MODULES_OBEXEXEC

;[HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Obex/Services/{f9ec7bc4-953c-11d2-984e-525400dc9e09}]

;    "Server"="obexexec.dll"

; @CESYSGEN ENDIF SERVERS_MODULES_OBEXEXEC

    修改后:

; @CESYSGEN IF SERVERS_MODULES_OBEXFILE

[HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Obex/Services/{f9ec7bc4-953c-11d2-984e-525400dc9e09}]

    "BaseDir"="//Temp//Ftp"

    "Server"="obexfile.dll"

; @CESYSGEN IF CE_MODULES_BTD

 "BluetoothSdpRecord"=hex:35,41,09,00,01,35,03,19,11,06,09,00,04,35,11,35,/

                             03,19,01,00,35,05,19,00,03,08,0a,35,03,19,00,08,/

                             09,00,06,35,09,09,65,6e,09,00,6a,09,01,00,09,00,/

                             09,35,08,35,06,19,11,06,09,01,00,09,01,00,25,03,/

                             46,54,50

;下面要添加的

    "CanWrite" = dword:1 

    "Authenticate" = dword:0 

    "Password" = "0000 " 

    "Transport Authenticate"=dword:0

; @CESYSGEN ENDIF CE_MODULES_BTD

; @CESYSGEN ENDIF SERVERS_MODULES_OBEXFILE

<4>重新编译工程