扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:I-soft 来源:CSDN 2007年11月18日
关键字:
以下是引用片段: The dwSize member must be sizeof(WSAQUERYSET). The lpBlob member (itself a pointer to a BLOB structure) is optional, but if used, the device inquire parameters valid for LUP_FLUSHCACHE are the following: The cbSize member of the BLOB structure must be sizeof(BTH_QUERY_DEVICE). The pBlobData member is a pointer to a BTH_QUERY_DEVICE structure, for which the LAP member is the Bluetooth inquiry access code, and the length member is the length of the inquiry, in seconds. The dwNameSpace member must be NS_BTH. All other WSAQUERYSET members are ignored. |
具体什么意思各位可以自己去理解,我想比我翻译出来要好些,毕竟我
以下是引用片段: byte[] buffer1 = new byte[0x400]; BitConverter.GetBytes(60).CopyTo(buffer1, 0); GCHandle handle1 = GCHandle.Alloc(blob1.ToByteArray(), GCHandleType.Pinned); IntPtr ptr1 = handle1.AddrOfPinnedObject(); BitConverter.GetBytes((int) (ptr1.ToInt32() + 4)).CopyTo(buffer1, 0x38); |
另外的两个API也照类似方法调用即可。
在调用了WSALookupServiceNext之后,bytes数组pQuerySet中便包含了远程设备的地址
以下是引用片段: int num5 = BitConverter.ToInt32(buffer1, 0x30); int num6 = Marshal.ReadInt32((IntPtr) num5, 8); int num7 = Marshal.ReadInt32((IntPtr) num5, 12); SocketAddress address1 = new SocketAddress(AddressFamily.Unspecified, num7); |
因为.net框架的地址族里面没有蓝牙,所以我们这里用的是AddressFamily.Unspecified。
然后的工作就是从中获取
前面我们已经计算出,这个Address里面的前六个字节是byte数组形式的设备ID,第七到第二十二个字节是蓝牙的Service Guid,在后面四个字节是端口号,所以我们只需要分别提取出来即可。
四. 监听服务
监听服务调用的是非托管API WSASetService,其原型是
以下是引用片段: INT WSASetService( LPWSAQUERYSET lpqsRegInfo, WSAESETSERVICEOP essoperation, DWORD dwControlFlags ); |
可以看到关键也是第一个参数,lpqsRegInfo,这也是一个struct,我们的包装方法与前面的发现
以下是引用片段: lpqsRegInfodwSizesizeof(WSAQUERYSET) lpszServiceInstanceNameNot supported on Windows CE. Set to 0. lpServiceClassIdNot supported on Windows CE. Set to 0. dwNameSpaceNS_BTH. dwNumberOfCsAddrsNot supported on Windows CE. Set to 0. IpcsaBufferNot supported on Windows CE. Set to 0. lpBlobPoints to a BTHNS_SETBLOB structure, containing information about the service to be added. * All other WSAQUERYSET fields are ignored. |
五. 连接
我们知道,IrDA中连接远程服务是使用方法System.Net.Sockets.IrDAClient类中的Connect方法。而这个方法又是调用的Socket类中的Connect方法。而Socket类是一个比较抽象的类,它并不绑定某个具体的地址族、SocketType和protocolType,所以在实例化的时候,需要指定这三个参数。我们也知道,在IrDA中,这三个参数分别是AddressFamily.Irda, SocketType.Stream,和ProtocolType.IP,那么在蓝牙中这三个参数分别是什么呢?我们好像找不到。
且慢,真是这样吗?
我们知道在.net中,这三个参数都是枚举值,而枚举在默认情况下,你可以认为就是int值的替代表现。
我们该如何知道这三个参数到底是什么呢?
还是先看Socket类的Connect方法。
我们查查有关资料,可以知道这个方法实际上是调用的一个非托管函数:
以下是引用片段: [DllImport("mscoree", EntryPoint="@339")] public static extern int connect(int s, byte[] name, int namelen); |
也就是非托管的Socket API。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者