最近在Windows CE.NET上要做一个蓝牙通讯模块,往网上搜索资料,发现了一篇用C# 来开发.NET CF 蓝牙的通信模块的文 章,http://it.sohu.com/20050331/n224948889.shtml,尝试着照他的思路做,才发现是如此艰难.非托管代码与托管代码之间的交互是最大的问题.这个项目也就一筹莫展.意外发现OpennetCF网站上有个蓝牙模块,我就出尝试用这个库来写,但是写的demo在我那款PDA 上不能运行,可是我这款PDA是支持微软stack的啊,问题出在哪呢?
用Vault把OpennetCF中的关于Bluetooth模块的源代码下载下来研究一下,才发现OpennetCF中的Bluetooth中用到的本地API跟上面我找到的那篇论文中提到的API有些不一致,马上我就进行修改:
#region 本地API代码
/// <summary>
/// 查找本地蓝牙DeviceID
/// </summary>
/// <param name="pba">本地蓝牙DeviceID</param>
/// <returns></returns>
[DllImport("Btdrt.dll", SetLastError=true)]
public static extern int BthReadLocalAddr(byte[] pba);
/// <summary>
/// 初始化查找周围设备
/// </summary>
/// <param name="pQuerySet"></param>
/// <param name="dwFlags"></param>
/// <param name="lphLookup"></param>
/// <returns></returns>
[DllImport("Btdrt.dll", SetLastError=true)]
public static extern int BthNsLookupServiceBegin(
byte[] pQuerySet,
LookupFlags dwFlags,
ref int lphLookup);
/// <summary>
/// 开始查找蓝牙设备
/// </summary>
/// <param name="hLookup"></param>
/// <param name="dwFlags"></param>
/// <param name="lpdwBufferLength"></param>
/// <param name="pResults"></param>
/// <returns></returns>
[DllImport("Btdrt.dll", SetLastError=true)]
public static extern int BthNsLookupServiceNext(
int hLookup,
LookupFlags dwFlags,
ref int lpdwBufferLength,
byte[] pResults);
/// <summary>
/// 查找周围蓝牙设备结束
/// </summary>
/// <param name="hLookup"></param>
/// <returns></returns>
[DllImport("Btdrt.dll", SetLastError=true)]
public static extern int BthNsLookupServiceEnd( int hLookup);
/// <summary>
/// 获取配对码请求
/// </summary>
/// <param name="pba"></param>
/// <returns></returns>
[DllImport("Btdrt.dll", SetLastError=true)]
public static extern int BthGetPINRequest(byte[] pba);
/// <summary>
/// 设置配对码
/// </summary>
/// <param name="pba"></param>
/// <param name="cPinLength"></param>
/// <param name="ppin"></param>
/// <returns></returns>
[DllImport("btdrt.dll", SetLastError=true)]
public static extern int BthSetPIN(byte[] pba, int cPinLength, byte[] ppin);
/// <summary>
/// 创建ACL连接
/// </summary>
/// <param name="pbt"></param>
/// <param name="phandle"></param>
/// <returns></returns>
[DllImport("Btdrt.dll", SetLastError=true)]
public static extern int BthCreateACLConnection(byte[] pbt, ref ushort phandle);
/// <summary>
/// 配对码验证
/// </summary>
/// <param name="pbt"></param>
/// <returns></returns>
[DllImport("Btdrt.dll", SetLastError=true)]
public static extern int BthAuthenticate(byte[] pbt);
/// <summary>
/// 关闭认证连接
/// </summary>
/// <param name="handle"></param>
/// <returns></returns>
[DllImport("Btdrt.dll", SetLastError=true)]
public static extern int BthCloseConnection(ushort handle);
//BthGetHardwareStatus
[DllImport("Btdrt.dll", SetLastError=true)]
public static extern int BthGetHardwareStatus(ref HardwareStatus pistatus);
//BthRevokePin
[DllImport("Btdrt.dll", SetLastError=true)]
public static extern int BthRevokePIN(byte[] pba);
[DllImport("ws2.dll", EntryPoint="WSAGetLastError", SetLastError=true)]
public static extern int CeGetLastError();
[DllImport("ws2_32.dll", EntryPoint="WSAGetLastError", SetLastError=true)]
public static extern int XpGetLastError();
//SetService
[DllImport("Btdrt.dll",SetLastError=true)]
public static extern int BthNsSetService(
byte[] lpqsRegInfo,
WSAESETSERVICEOP essoperation,
int dwControlFlags);
#endregion
/// <summary>
/// 查找本地蓝牙DeviceID
/// </summary>
/// <param name="pba">本地蓝牙DeviceID</param>
/// <returns></returns>
[DllImport("Btdrt.dll", SetLastError=true)]
public static extern int BthReadLocalAddr(byte[] pba);
/// <summary>
/// 初始化查找周围设备
/// </summary>
/// <param name="pQuerySet"></param>
/// <param name="dwFlags"></param>
/// <param name="lphLookup"></param>
/// <returns></returns>
[DllImport("Btdrt.dll", SetLastError=true)]
public static extern int BthNsLookupServiceBegin(
byte[] pQuerySet,
LookupFlags dwFlags,
ref int lphLookup);
/// <summary>
/// 开始查找蓝牙设备
/// </summary>
/// <param name="hLookup"></param>
/// <param name="dwFlags"></param>
/// <param name="lpdwBufferLength"></param>
/// <param name="pResults"></param>
/// <returns></returns>
[DllImport("Btdrt.dll", SetLastError=true)]
public static extern int BthNsLookupServiceNext(
int hLookup,
LookupFlags dwFlags,
ref int lpdwBufferLength,
byte[] pResults);
/// <summary>
/// 查找周围蓝牙设备结束
/// </summary>
/// <param name="hLookup"></param>
/// <returns></returns>
[DllImport("Btdrt.dll", SetLastError=true)]
public static extern int BthNsLookupServiceEnd( int hLookup);
/// <summary>
/// 获取配对码请求
/// </summary>
/// <param name="pba"></param>
/// <returns></returns>
[DllImport("Btdrt.dll", SetLastError=true)]
public static extern int BthGetPINRequest(byte[] pba);
/// <summary>
/// 设置配对码
/// </summary>
/// <param name="pba"></param>
/// <param name="cPinLength"></param>
/// <param name="ppin"></param>
/// <returns></returns>
[DllImport("btdrt.dll", SetLastError=true)]
public static extern int BthSetPIN(byte[] pba, int cPinLength, byte[] ppin);
/// <summary>
/// 创建ACL连接
/// </summary>
/// <param name="pbt"></param>
/// <param name="phandle"></param>
/// <returns></returns>
[DllImport("Btdrt.dll", SetLastError=true)]
public static extern int BthCreateACLConnection(byte[] pbt, ref ushort phandle);
/// <summary>
/// 配对码验证
/// </summary>
/// <param name="pbt"></param>
/// <returns></returns>
[DllImport("Btdrt.dll", SetLastError=true)]
public static extern int BthAuthenticate(byte[] pbt);
/// <summary>
/// 关闭认证连接
/// </summary>
/// <param name="handle"></param>
/// <returns></returns>
[DllImport("Btdrt.dll", SetLastError=true)]
public static extern int BthCloseConnection(ushort handle);
//BthGetHardwareStatus
[DllImport("Btdrt.dll", SetLastError=true)]
public static extern int BthGetHardwareStatus(ref HardwareStatus pistatus);
//BthRevokePin
[DllImport("Btdrt.dll", SetLastError=true)]
public static extern int BthRevokePIN(byte[] pba);
[DllImport("ws2.dll", EntryPoint="WSAGetLastError", SetLastError=true)]
public static extern int CeGetLastError();
[DllImport("ws2_32.dll", EntryPoint="WSAGetLastError", SetLastError=true)]
public static extern int XpGetLastError();
//SetService
[DllImport("Btdrt.dll",SetLastError=true)]
public static extern int BthNsSetService(
byte[] lpqsRegInfo,
WSAESETSERVICEOP essoperation,
int dwControlFlags);
#endregion
改动相应的代码,再写Bluetooth的demo时,就能正常运行.