蓝牙,是一种支持设备短距离通信(一般10m内)的无线电技术。能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换。利用“蓝牙”技术,能够有效地简化移动通信终端设备之间的通信,也能够成功地简化设备与因特网Internet之间的通信,从而数据传输变得更加迅速高效,为无线通信拓宽道路。蓝牙采用分散式网络结构以及快跳频和短包技术,支持点对点及点对多点通信,工作在全球通用的2.4GHz ISM(即工业、科学、医学)频段。其数据速率为1Mbps。采用时分双工传输方案实现全双工传输。
蓝牙,对于手机乃至整个 IT业而言已经不仅仅是一项简单的技术,而是一种概念。当蓝牙联盟信誓旦旦地对未来前景作着美好的憧憬时,整个业界都为之震动。抛开传统连线的束缚,彻底地享受无拘无束的乐趣,蓝牙给予我们的承诺足以让人精神振奋。  

 蓝牙技术是一种无线数据与语音通信的开放性全球规范,它以低成本的近距离无线连接为基础,为固定与移动设备通信环境建立一个特别连接。其程序写在一个9 x 9 mm的微芯片中。   例如,如果把蓝牙技术引入到移动电话和膝上型电脑中,就可以去掉移动电话与膝上型电脑之间的令人讨厌的连接电缆而而通过无线使其建立通信。

打印机、PDA、桌上型电脑、传真机、键盘、游戏操纵杆以及所有其它的数字设备都可以成为蓝牙系统的一部分。除此之外,蓝牙无线技术还为已存在的数字网络和外设提供通用接口以组建一个远离固定网络的个人特别连接设备群。  

 蓝牙工作在全球通用的2.4GHz ISM(即工业、科学、医学)频段。蓝牙的数据速率为1Mb/s。时分双工传输方案被用来实现全双工传输。 使用IEEE802.15协议。   ISM频带是对所有无线电系统都开放的频带,因此使用其中的某个频段都会遇到不可预测的干扰源。例如某些家电、无绳电话、汽车房开门器、微波炉等等,都可能是干扰。为此,蓝牙特别设计了快速确认和跳频方案以确保链路稳定。跳频技术是把频带分成若干个跳频信道(hop channel),在一次连接中,无线电收发器按一定的码序列(即一定的规律,技术上叫做“伪随机码”,就是"假"的随机码)不断地从一个信道"跳"到另一个信道,只有收发双方是按这个规律进行通信的,而其他的干扰不可能按同样的规律进行干扰;跳频的瞬时带宽是很窄的,但通过扩展频谱技术使这个窄带宽成百倍地扩展成宽频带,使干扰可能的影响变成很小。  

 与其它工作在相同频段的系统相比,蓝牙跳频更快,数据包更短,这使蓝牙比其它系统都更稳定。FEC(Forward Error Correction,前向纠错)的使用抑制了长距离链路的随机噪音。应用了二进制调频(FM)技术的跳频收发器被用来抑制干扰和防止衰落。  

 蓝牙基带协议是电路交换与分组交换的结合。在被保留的时隙中可以传输同步数据包,每个数据包以不同的频率发送。一个数据包名义上占用一个时隙,但实际上可以被扩展到占用5个时隙。蓝牙可以支持异步数据信道、多达3个的同时进行的同步话音信道,还可以用一个信道同时传送异步数据和同步话音。每个话音信道支持64kb/s同步话音链路。异步信道可以支持一端最大速率为721kb/s而另一端速率为57.6kb/s的不对称连接,也可以支持43.2kb/s的对称连接。

我们如何检索计算机上面的蓝牙设备呢,我们使用winsock搜索蓝牙设备,请见代码分析

#include "stdafx.h"

#include <winsock2.h>
#include <ws2bth.h>

#pragma comment(lib,"ws2_32.lib")

int _tmain(int argc, _TCHAR* argv[])
{
    // 初始化winsock
    WSADATA wsaData;
    if( WSAStartup( MAKEWORD(2,2), &wsaData ) != 0 )
{
  _tprintf(_T("WSAStartup failed with error code: %d\n"), WSAGetLastError());
        return 1;
    }

// 初始化蓝牙枚举结构
DWORD dwWsaqsLen = sizeof(WSAQUERYSET);
LPWSAQUERYSET lpWsaqs = (LPWSAQUERYSET)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwWsaqsLen);
lpWsaqs->dwSize = sizeof(WSAQUERYSET);
lpWsaqs->dwNameSpace = NS_BTH;

// 开始枚举蓝牙设备
    DWORD dwWsaqsFlags = LUP_CONTAINERS | LUP_FLUSHCACHE | LUP_RETURN_NAME | LUP_RETURN_ADDR;
    HANDLE hService;

if(WSALookupServiceBegin(lpWsaqs, dwWsaqsFlags, &hService) != SOCKET_ERROR)
{
  bool bFinished = false;
  while(!bFinished)
  {
   if(WSALookupServiceNext(hService, dwWsaqsFlags, &dwWsaqsLen, lpWsaqs) == NO_ERROR)
   {
    SOCKADDR_BTH *saBth = (SOCKADDR_BTH*)lpWsaqs->lpcsaBuffer->RemoteAddr.lpSockaddr;
    BTH_ADDR bthAddr = saBth->btAddr;

_tprintf(_T("\n发现蓝牙设备: \n"));
    _tprintf(_T("------------------------\n"));
    _tprintf(_T("NAP: 0x%04X  SAP: 0x%08X 设备名称: %s\n"), GET_NAP(bthAddr), GET_SAP(bthAddr), lpWsaqs->lpszServiceInstanceName);
   }
   else
   {
    // 错误处理
    switch(WSAGetLastError())
    {
    // 所给缓冲区过小,重新申请
    case WSAEFAULT:
     HeapFree(GetProcessHeap(), 0, lpWsaqs);
     lpWsaqs = (LPWSAQUERYSET)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwWsaqsLen);
     break;

// 没有更多蓝牙设备了
    case WSA_E_NO_MORE:
     bFinished = true;
     break;

default:
     //bFinished = true;
     break;
    }
   }
  }
  WSALookupServiceEnd( hService );
}

// 释放资源
HeapFree(GetProcessHeap(), 0, lpWsaqs);
    WSACleanup();

return 0;
}

编程代码分析-使用winsock搜索蓝牙设备相关推荐

  1. 基于visual c++之windows核心编程代码分析(64)现有的exe文件中添加自己的代码

    我们进行信息安全编程的时候,经常需要向exe文件插入自己的源代码, 我们如何在代码中实现呢.请见代码与注释讲解 #include <iostream.h> #include <win ...

  2. 基于visual c++之windows核心编程代码分析(24)IO控制、内核通信

    我们在进行Windows编程的时候,经常需要进行IO控制与内核通信,我们来实现IO控制与内核通信.请见代码实现与注释讲解 驱动代码实现与分析 /* 头文件 */ #include <ntddk. ...

  3. 基于visual c++之windows核心编程代码分析(30)Telnet协议编程

    Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式.它为用户提供了在本地计算机上完成远程主机工作的能力.在终端使用者的电脑上使用telnet程序,用它连接 ...

  4. 基于visual c++之windows核心编程代码分析(31)SNMP协议编程

    SNMP(Simple Network Management Protocol,简单网络管理协议)的前身是简单网关监控协议(SGMP),用来对通信线路进行管理.随后,人们对SGMP进行了很大的修改,特 ...

  5. 基于visual c++之windows核心编程代码分析(42)windows下进程的身份切换

    进程是操作系统结构的基础:是一个正在执行的程序:计算机中正在运行的程序实例:可以分配给处理器并由处理器执行的一个实体: 由单一顺序的执行显示,一个当前状态和一组相关的系统资源所描述的活动单元. 对应用 ...

  6. 基于visual c++之windows核心编程代码分析(47)实现交换网络的QQ号嗅探

    当我们在一个交换网络里面,不知道别人的QQ号码是个很痛苦的事情,假如一个PLMM在上网,你却不知道她得QQ也没有勇气去问,是个很可惜的事情, 至于我们搞编程的,可以通过交换机的数据交换,嗅探出QQ号, ...

  7. 基于visual c++之windows核心编程代码分析(36)实践SYN安全隐患监测

    SYN (synchronize) SYN是TCP/IP建立连接时使用的握手信号.在客户机和服务器之间建立正常的TCP网络连接时,客户机首先发出一个SYN消息,服务器使用SYN-ACK应答表示接收到了 ...

  8. 基于visual c++之windows核心编程代码分析(61)打造自己的Windows输入法

    IMM(Input Method Manager)只在安装了亚洲语言包之后才能使用. 通过调用GetSystemMetrics(SM_IMMENABLED)知道IMM是否使能. 一共由三部分组成: s ...

  9. 【Linux Socket 编程入门】06 - 拉个骡子溜溜:UDP编程模型代码分析

    (一) 前情 在第4篇里面,介绍了TCP编程实例,现在,我们再看看UDP编程实例.才完美嘛. (二)上个菜:一个UDP程序分析 开胃:UDP客户服务器编程模型 与TCP面向连接,可靠的编程模型不同,U ...

  10. 【Linux Socket 编程入门】05 - 拉个骡子溜溜:TCP编程模型代码分析

    (一) 看看以前学了啥 前面介绍了socket的分类,IP地址,端口号(port),常用的socket数据结构以及常用的函数.现在我们来看一个例子,看看socket编程究竟是什么. (二) 一图看懂客 ...

最新文章

  1. CCF201604-3 路径解析(解法二)(100分)
  2. 两个音轨合并_webm格式视频文件合并+weba音频文件无损合并
  3. 正则表达式的简单认识
  4. 使用Angular HTTP client对数据模型进行创建操作
  5. Ubuntu16.04编译RK3399:make kernel.img error
  6. 1295 N皇后问题
  7. Alphabet高管:移动搜索为收入主要增长点 广告形式改进长期获益
  8. 全球餐厅库存管理软件行业调研及趋势分析报告
  9. 离线强化学习总结!(原理、数据集、算法、复杂性分析、超参数调优等)
  10. Opencontrail 流的处理
  11. aes key iv从mysql_OpenSSL AES 算法中 Key 和 IV 是如何生成的?
  12. 窄带包络Matlab分析,窄带随机过程的产生及其性能测试
  13. 【传送门】 Linux软件安装合集
  14. 激光雷达的应用及发展前景
  15. 高通全新WiFi方案支持Ayla物联网平台连接
  16. 三门问题详解(附C语言实现)
  17. Linux软件的安装
  18. linux批量删除指定名称的文件夹
  19. 【OpenCV+Qt】实现简易视频播放器——支持进度条拖动
  20. chai断言库学习3-Core Plugin Concepts

热门文章

  1. linux有类似酷狗qq音乐软件,除了网易云QQ音乐,这些小众音乐APP同样值得推荐。...
  2. 我的世界java旁观者模式_我的世界怎么开旁观者模式-我的世界切换模式攻略
  3. 国内量化投资策略的演进方向
  4. df满足条件的值修改_python – 如何根据其他列中的条件将pandas df列中的多个值更改为np.nan?...
  5. JMeter二次开发
  6. 软件二次开发平台简介
  7. win8虚拟机_老司机教你如何在虚拟机安装win8系统,双系统也可以这样实现
  8. 杨焘鸣:潜意识的特性
  9. 使用video speed controller给视频加速
  10. DZ先生怪谈国标28181-2016之目录查询