基于32feet.net对Broadcom(Widcomm) stack蓝牙(Bluetooth)设备开发Windows Mobile与PC程序

背景

Widcomm是第一个为Windows编写蓝牙Stack的公司,后来给Broadcom收购了,由于他是第一个,所以目前很多蓝牙设备都是使用Broadcom Statck的。下面讲述如何使用32feet.net对基于Broadcom Statck的蓝牙设备进行开发。

 

本文的例子是基于 Windows Mobile 与 PC之间的通过蓝牙(Bluetooth) 传输文件的开发Windows Moible, Wince 使用.NET Compact Framework进行蓝牙(Bluetooth)开发 之 32feet.NET 的基础上修改的。

 

缘由

谢谢 yanghao 同学的建议, 讲一下写这篇文章的缘由。 这篇文章是为了解决 崔江 同学提出的问题而写的,我之前写了一系列关于蓝牙开发的文章,在这些文章的读者中,有不少人提问如何使用widcomm Stack进行蓝牙的相关开发,我在g.cn和baidu里面查找过,发现国内关于这方面的文章很少,所以把自己的经验总结下来,可能该文章比较难懂,请先阅读“进一步阅读”下的链接,这些文章相对来说是入门篇到进阶篇,这篇算是那些文章的延续了,算是进阶篇。 

 

驱动安装

进行Broadcom stack的开发,必须安装该驱动程序,下面以XP为例子,说明Broadcom驱动程序的安装。

Broadcom-Bluetooth-1

插入Broadcom stack的蓝牙dongle。

Broadcom-Bluetooth-2

插入驱动程序的CD进行安装。

Broadcom-Bluetooth-3

安装完毕能看到该蓝牙设备。

 

32feet.net源码下载

到codeplex下载32feet.net最新的代码,由于最新的32feet.net的release没有包含对Broadcom stack的支持,所以需要下载build版本。最新的build版本下载地址如下:
http://32feet.codeplex.com/SourceControl/ListDownloadableCommits.aspx

 

Broadcom stack的Native DLL

如果使用Microsoft Stack,32feet.net可以直接调用Wince(Windows Embedded CE)和Windows Mobile内置的btdrt.dll和BthUtil.dll。但是使用Broadcom stack的情况就不一样了。32feet.net封装了Native的DLL来调用Broadcom的驱动。 在源码包里面已经包含了build好的DLL,看下图。

Broadcom-Bluetooth-4    

上图为PC的Native DLL。

Broadcom-Bluetooth-5 

上图为Windows Mobile的Native DLL。

 

32feet.net编译

打开\32feet-61144\InTheHand.Net.Personal_Widcomm下的解决方案。

Broadcom-Bluetooth-6 Broadcom-Bluetooth-7

分别编译InTheHand.Net.Personal.CF2和InTheHand.Net.Personal.FX2项目生成32feet.net的.NET Assembly InTheHand.Net.Personal.dll.

 

项目引用的更新

把引用都更新到新编译的InTheHand.Net.Personal.dll。

Broadcom-Bluetooth-8

为了节省时间,我的例子是在原先文章的基础上进行修改的。原文参考  Windows Mobile 与 PC之间的通过蓝牙(Bluetooth) 传输文件的开发 

 

修改以支持Broadcom Stack

修改对InTheHand.Net.Personal.dll的引用。

注释设置PrimaryRadio.Mode 的调用,因为Broadcom(Widcomm) stack不支持设置PrimaryRadio.Mode 。

//InTheHand.Net.Bluetooth.BluetoothRadio.PrimaryRadio.Mode = InTheHand.Net.Bluetooth.RadioMode.Discoverable;

 

 

部署程序

PC端

和Microsoft Stack不一样,部署的时候不仅仅需要部署程序,而且需要部署Native DLL及其依赖的DLL。如果不部署这些依赖DLL,程序会抛出异常。这是之前 崔江 同学调试一直出错的原因。

Broadcom-Bluetooth-20

我把这些依赖的DLL都放到源码包里面了。

 

Windows Mobile端

Windows Mobile端相对简单,依赖的DLL本身已经安装到设备上去了。

Broadcom-Bluetooth-9

 Broadcom-Bluetooth-21

只是需要部署应用程序,inthehand.net.personal.dll 和 32feetWidcomm.dll就可以了。

 

配对蓝牙设备

程序运行的时候,需要手工配对。

Broadcom-Bluetooth-12

Broadcom-Bluetooth-13

但是在Microsoft Stack里面可以通过程序来配对的,可以参考 Windows Moible, Wince 使用.NET Compact Framework的进行蓝牙(Bluetooth)设备配对的开发

 

测试基于Broadcom stack的文件传输程序

Broadcom-Bluetooth-11

两边都是Broadcom Stack,但是服务端接收到ObexListener的请求的时候会抛出异常,如下:

ObexListenerContext olc = listener.GetContext();

 

Broadcom-Bluetooth-10

因为Broadcom(Widcomm) Stack是不支持sockets的,所以Broadcom(Widcomm) Stack不能作为ObexListener来使用,我把ObexListener换成Microsoft Stack,一切运行正常。

源代码: http://files.cnblogs.com/procoder/BroadcomBluetoothObex.rar

如果需要换成Microsoft Stack,只需要换InTheHand.Net.Personal.dll的引用就可以了。

 

同时我也在 Windows Moible, Wince 使用.NET Compact Framework进行蓝牙(Bluetooth)开发 之 32feet.NET 的基础上做了一个两端都Broadcom Stack的通信程序。

源代码:http://files.cnblogs.com/procoder/BroadcomBluetooth.rar

我同时发现如果服务端为Broadcom Stack的程序,有挂死现象,我改成Microsoft Stack问题又解决了。

Broadcom-Bluetooth-14        

 

关于Broadcom Stack(Widcomm Stack)开发的建议

32feet.net对Broadcom Stack(Widcomm Stack)的支持是不完整的。支持情况可以参照这个文档:http://files.cnblogs.com/procoder/32feet-and-Widcomm-Broadcom.doc

 

我建议不是万不得已的情况下,不用使用Broadcom Stack(Widcomm Stack),使用Microsoft Stack很多问题都迎刃而解了。这里有一个文档讲述如何把非Microsoft Stack的设备安装Microsoft Stack。请参考:http://files.cnblogs.com/procoder/Belkin-F8T012-and-Microsoft-Stack.doc

 

 

进一步阅读

更多的蓝牙开发相关文章如下:

Windows Moible, Wince 使用.NET Compact Framework的进行蓝牙(Bluetooth)开发 之 Windows Embedded Source Tools for Bluetooth

Windows Moible, Wince 使用.NET Compact Framework进行蓝牙(Bluetooth)开发 之 32feet.NET

Windows Moible, Wince 使用.NET Compact Framework的进行蓝牙(Bluetooth)开发 之 蓝牙虚拟串口 (Bluetooth Virtual Serial Port)(可以用于把Bluetooth的GPS receiver变成串口)

Windows Moible, Wince 使用.NET Compact Framework的进行蓝牙(Bluetooth)设备配对的开发

30 Days of .NET [Windows Mobile Applications] - Day 02: Bluetooth Manager(蓝牙管理器) (简单的Bluetooth应用)

Windows Moible, Wince 使用.NET Compact Framework的进行蓝牙(Bluetooth)广播程序的开发

Windows Mobile 与 PC之间的通过蓝牙(Bluetooth) 传输文件的开发

Windows Mobile下通过蓝牙(Bluetooth)发送大文件的实现

作者:Jake LinJake's Blog on 博客园
出处:http://procoder.cnblogs.com

作品Jake Lin创作,采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。 任何转载必须保留完整文章,在显要地方显示署名以及原文链接。如您有任何疑问或者授权方面的协商,请给我留言
posted @ 2009-11-17 08:44 Jake Lin 阅读(3219) 评论(24) 编辑 收藏

 回复 引用 查看   
#1楼 2009-11-17 08:47 yanghao      
我觉得一篇文章是不是先把做这个东西的理由(需求)写出来比较好,这样好引导一些想接触新玩意但又不太明白这东西能干什么的人有足够的热情继续研究,我个人觉得这个东西很好,可能有点用处,但是没太看懂,像我这种水平的人应该觉得有个流程图之类的图纸觉得比较容易理解。一点建议,希望不要介意啊,呵呵。。
 回复 引用 查看   
#2楼 2009-11-17 08:49 yanghao      
还有个问题?为什么起这么早了。。。。?
 回复 引用 查看   
#3楼 2009-11-17 08:50 egmkang      
只要是早上爬起来,看见有一篇WM的文章,肯定是你的.
 回复 引用 查看   
#4楼[楼主] 2009-11-17 09:10 Jake Lin      
@yanghao
不好意思,这篇文章是解决 崔江 同学的问题而写的,这篇不是入门文章,入门文章请看“进一步阅读”下的链接,这篇算是那些文件的延续了。

 回复 引用 查看   
#5楼[楼主] 2009-11-17 09:11 Jake Lin      
@yanghao
@egmkang
早起的鸟有虫吃。

 回复 引用 查看   
#6楼[楼主] 2009-11-17 09:19 Jake Lin      
@yanghao
谢谢你的建议,我把文章更新了,加上“缘由”一段。

 回复 引用 查看   
#7楼 2009-11-17 09:21 阿肆      
學習。很好的資料。
 回复 引用 查看   
#8楼[楼主] 2009-11-17 09:21 Jake Lin      
@egmkang
@yanghao
其实不是一大早把整篇文章写完的,这篇文章我从上个星期开始写了,一点点写,同时也在整理和调试代码。只是早上网络状况好,发上来了。

 回复 引用 查看   
#9楼 2009-11-17 09:48 yanghao      
@Jake Lin
哦 ,能不能在。net winform上作开发咯?我主要是用c#做web方面开发的,其他的基本上没用过,winform还是搞了下。。

 回复 引用 查看   
#10楼[楼主] 2009-11-17 09:51 Jake Lin      
@yanghao
可以,源码里面PC的目录就是.net winform的程序。

 回复 引用 查看   
#11楼 2009-11-17 12:07 施炯      
呵呵 Jake有蓝牙的dongle啊 不错
 回复 引用 查看   
#12楼[楼主] 2009-11-17 12:20 Jake Lin      
@施炯
是呀,公司还有toshiba和Broadcom的dongle,很不好用,不如我在淘宝上买了几个便宜的Microsoft Stack的dongle好用,就是那些盗版货地址一样的,买的时候要注意,否则彼此之间不能通信了。

 回复 引用 查看   
#13楼 2009-11-17 13:08 airwolf2026      
需要这样的文章
 回复 引用 查看   
#14楼 2009-11-17 20:50 崔江      
可以运行了,况且没有死机现象,不过在我的机上还要加上以下DLL
msvcm80d.dll
msvcp80d.dll
msvcr80d.dll
Microsoft.VC80.DebugCRT.manifest

 回复 引用 查看   
#15楼[楼主] 2009-11-18 05:34 Jake Lin      
@崔江
需要哪些dll可以在depends看出来,我自己也是看depends的,我很高兴你终于迈出第一步了。have fun.

 回复 引用 查看   
#16楼 2009-11-18 08:45 egmkang      
@崔江
其实最好安装Runtime.
VC开发出来的Win32程序,是需要Runtime的

 回复 引用 查看   
#17楼 2009-12-12 19:52 遛扬狗      
关注蓝牙技术的人不多,跟应用场景也有很大的关系。原来我用过32feet.net一段时间,一个发现周边蓝牙设备的函数就要执行10秒, 实在是太慢了。
 回复 引用 查看   
#18楼 2009-12-25 16:06 改改      
你好,谢谢这篇文章。
我还有个问题请教,我按部署的项目,运行就会出错

Unexpected exception creating factory 'InTheHand.Net>bluetooth.Widcomm.WidcommBluetoothFactory ex:System.DllNotFoundException:无法加载 DLL "32feetWidcomm"' :由于应用程序配置不正确,程序未能启动。重新安装应用程序可能会纠正这个问题.(异常来自 HRESULT: 0x800736B1). 在 IntheHand.Net.Bluetooth.BluetoothFactory.GetStacks_inLock()

at BluetoothFactory.GetStacks_inLock()
at BluetoothFactory.get_Factories()
...


我把 部署Native DLL及其依赖的DLL 都复制到我的源码里面了。
我是直接复制的你提供的源码里面的dll

32feetWidcom.dll btwapi.dll msvcr80.dll InTheHand.Net.Person.dll 都复制到跟我的程序exe 同一目录,并且添加了 IntheHand.Net.Person.dll 的引用。

然后就报这种错误。好晕啊,这个大概是为什么呢??
看到后请给我回复邮件,谢谢!
QQ : 24502476 谢谢!

 回复 引用 查看   
#19楼 2010-02-11 18:40 随心所欲      
请问,怎么控制蓝牙的headset?我想用我的wince设备从headset接收声音,并且录制下来。
我可以链接上设备,然后怎么发送和接收数据?什么格式?

 回复 引用 查看   
#20楼[楼主] 2010-02-12 11:19 Jake Lin      
@随心所欲
我没有实际做过,我想可以通过winsock来通信,在服务端启动服务的时候可以指定服务的类型,handset的服务类型为
Hands-Free Profile (HFP)

参考Windows Moible, Wince 使用.NET Compact Framework进行蓝牙(Bluetooth)开发 之 32feet.NET
修改
BluetoothListener listener = new BluetoothListener(BluetoothService.SerialPort);


中的BluetoothService.SerialPort为Handsfree,HandsfreeAudioGateway或者Headset,HeadsetAudioGateway,你要逐个试一下,因为我没有做过,不好意思。

 回复 引用 查看   
#22楼 2010-02-17 09:14 随心所欲      
@Jake Lin
这个我倒是测试过了,可以链接上的是Headset。我的设备也有了反应,证明链接没有问题。
只是剩下的数据传送就不知道怎么做了。

 回复 引用 查看   
#23楼[楼主] 2010-02-18 07:06 Jake Lin      
@随心所欲
我不知道通过Winsock行不行,因为没有做过,所以还不清楚。

 回复 引用 查看   
#24楼 2011-11-02 17:02 疯癫大圣      
引用改改:
你好,谢谢这篇文章。
我还有个问题请教,我按部署的项目,运行就会出错

Unexpected exception creating factory 'InTheHand.Net>bluetooth.Widcomm.WidcommBluetoothFactory ex:System.DllNotFoundException:无法加载 DLL "32feetWidcomm"' :由于应用程序配置不正确,程序未能启动。重新安装应用程序可能会纠正这个问题.(异常来自 HRESULT: 0x800736B1). 在 IntheHand.Net.Bluetooth.BluetoothFactory...

楼主 我也遇见这个问题了,求解决啊