⑴ 有关蓝牙通讯编程的书籍
蓝牙核心技术电子书 http://www.hicode.cn/download/view-software-7696.html 蓝牙技术编程基础 http://download.csdn.net/source/1025356 蓝牙通信协议: http://www.elecm.com/a/read-htm-tid-22218.html
⑵ 蓝牙通信编程用什么软件编写 说是用C语言写 之后该怎么做呢 怎样能使计算机与单片机直接能蓝牙通信求帮忙~
 计算机端配一个蓝牙适配器 十几块人民币吧
单片机端配一个蓝牙串口模块 ,二十几块 淘宝上找找
对于计算机和单片机,都是串口通信的界面,完全无需其他的程序
(唯一要注意的是,市面上的蓝牙模块,基本上都只支持一对一的模式,因此蓝牙模块没有9位数据的模式)
所以这个你会的,^_^ 
⑶ 安卓编程和蓝牙连接怎么做
 你是用的蓝牙2.0,还是4.0 BLE?不管是这两者中哪一个,android SDK都有相关sample可以学习使用,从搜索设备,建立连接,到两端的通信都有,基本覆盖我们要使用的所有功能。
2.0的sample是:BluetoothChat,网上对它的相关讲解很多,你可以参考blog.csdn.net/homebei2/article/details/6078007;
4.0的sample是:BluetoothLeGatt,因为google在android4.3才支持BLE的api,相对来说比较新,用的话主要是理解一些新的协议栈概念,不是很难,网上资料相对来说少些,你也可以找找看
如果你要自己写的话,其实也是上面sample里那些基本功能的重新组合,可以参考:blog.csdn.net/eric41050808/article/details/16967189 
⑷ 我学蓝牙,需要什么软件调试和编程
这个复杂,PC支持蓝牙,安卓支持蓝牙,苹果也支持蓝牙。
不同的系统都支持蓝牙,而不同的系统下,需要软件完全不同。
同一系统下也可以使用不同的软件来编程。
⑸ android多连接蓝牙编程,据说可以同时进行7个连接
你把你的代码贴出来,在接收数据的时候是数据流接收,需要循环接收。
⑹ 蓝牙模块上面的晶元怎么编程
在线编程,模块的核心是蓝牙晶元,现在的蓝牙晶元很多都是Cortex-Mx的内核,是可以通过在线编程的形式来实现的,而且蓝牙晶元的程序量一般都比较小,就需要一个异步烧录的机器来支持,我知道目前ZLG致远电子的P800-ISP符合这种需求,如下图示。
⑺ 蓝牙技术是如何实现的需要什么语言去编程
 什么是蓝牙? 
蓝牙(Bluetooth)是由东芝、爱立信、IBM、Intel和诺基亚于1998年5月共同提出的近距离无线数据通讯技术标准。它能够在10米的半径范围内实现单点对多点的无线数据和声音传输,其数据传输带宽可达1Mbps。通讯介质为频率在2.402GHz到2.480GHz之间的电磁波。 
蓝牙通讯技术的特点 
■蓝牙工作在全球开放的2.4GHz ISM(即工业、科学、医学)频段; 
■使用跳频频谱扩展技术,把频带分成若干个跳频信道(hop channel),在一次连接中,无线电收发器按一定的码序列不断地从一个信道「跳」到另一个信道; 
■一台蓝牙设备可同时与其它七台蓝牙设备建立连接; 
■数据传输速率可达1Mbit/s; 
■低功耗、通讯安全性好; 
■在有效范围内可越过障碍物进行连接,没有特别的通讯视角和方向要求; 
■支持语音传输; 
■组网简单方便 
蓝牙通讯技术的用途 
蓝牙技术是一种新兴的技术,尚未投入广泛应用,目前许多蓝牙设备还处于实验室试验阶段。但可以肯定的是现在多数具有红外无线数据通讯功能的设备,在将来一样可以使用蓝牙技术来实现无线连接。同时蓝牙技术的网络特点和语音传输技术使它还可以实现红外技术无法实现的某些特定功能,如无线电话、多台设备组网等等。 
厂家和消费者的认同度 
蓝牙技术已获得了两千余家企业的响应,从而拥有了巨大的开发和生产能力。蓝牙已拥有了很高的知名度,广大消费者对这一技术很有兴趣。 
植入成本 
目前市面上的蓝牙设备还是比较少见。USB界面蓝牙适配器、蓝牙PC卡和蓝牙手机已经有了面向市场的产品,售价都很高。由此可见蓝牙早期发展阶段植入成本还是比较高的。但估计批量化后植入成本可在30美元以下。在蓝牙技术发展成熟的时期,植入成本应该可以控制在10美元以内。 
缺点 
蓝牙是一种还没有完全成熟的技术,尽管被描述得前景诱人,但还有待于实际使用的严格检验。蓝牙的通讯速率也不是很高,在当今这个数据爆炸的时代,可能也会对它的发展有所影响。 
目前主流的软件和硬件平台均不提供对蓝牙的支持,这使得蓝牙的应用成本升高,普及难度增大。 
ISM频段是一个开放频段,可能会受到诸如微波炉、无绳电话、科研仪器、工业或医疗设备的干扰。 
红外 
JAVA介绍 
一、前言 
 『Java』从1995年的暑假开始在计算机业界就受到了高度注意,特别是在Internet和多 媒体(Multimedia)相关产品类方面。Java为何有如此这幺大的魅力?人作如此的比喻: Java在全球信息网(World Wide Web, WWW)地位就如同电子表格(Spreadsheet)与个人计 算机(PC)的关系。那Java究竟有那些特色呢? 
 Java是一种软件技术 
 是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言 
 是一种为 Internet发展的计算机语言 
 是一种使网页(Web Page)产生生动活泼画面的语言 
 是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言 
 是一种语言,用以产生「小应用程序(Applet(s))」 
 是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能 
 是一种将安全性(Security)列为第一优先考虑的语言 
 是一种使用者不需花费很多时间学习的语言 
 是一种突破用户端机器环境和CPU结构的语言 
 是一种「写一次,即可在任何机器上执行(Write OnceRun Anywhere)」的语言是有史以来,第一套允 使用者将应用程序(Applications)通过Internet从远端的服务器(Remote Server)传输到本地端的机器 上(LocalMachine)并执行 
 是一种应用程序提供者不需要知道使用者的计算机硬件(如:Sun, Intel, 或MAC等)与软件(如:SW- UNIX, MAC O/S, Windows, 或NT等)环境的语言(Kestenbaum, 1995)。 
 下面将依序地介绍Java,首先是Java的发展历史与Java语言介绍,其次依序是Java Applet和HotJava的简单介绍。 
二、Java FAQ 
 下面以问答的方式来说明Java的发展历史与其背景(下列内容整理自 Java FAQ list and Tutorial和The Java Language: A White Paper,读者若欲深 入了解,请自行参阅原文): 
 Java何时开始发展?(When) 
 最早大概可追溯至1991年四月份,Sun的绿色计划(Green Project)开始着手于发展消费性电子产品(Consumer Electronics),所使用的语言是C、C++、及Oak (为Java语 言的前身),后因语言本身和市场的问题, 使得消费性电子产品的发展无法达到当初 预期的目标,再加上网络的兴起, 绿色计划也因此而改变发展的方向,这已是1994 年了。 
 为何称之为Java?(Why) "Java"是美国SUN计算机公司Java发展小组历经无数次的激烈讨论之后才被选择出。 生动(Liveliness)、动画(Animation)、速度(Speed)、交互性(Interactivity)为当 初选择名字时所欲表达出的特色。"Java"是在无数的建议中脱颖而出的,而"Java" 不是由几个单字的首字所组成, 而是从许多程序设计师钟爱的热腾腾、香浓咖啡中 产生灵感的。 
 谁开发了Java?(Who) Java是美国SUN计算机公司Java发展小组开发的,早期的成员(绿色工程)是Patrick Naughton, James Gosling, & Mike Sheridan,而现在大家较为熟悉的成员是James Gosling。 
 在那里开发了Java?(Where) 
 也就是问Java的出生地?答案是美国。 
 如何可以找到所需的Java信息?(How to) 
 在网络上,您可以连到Sun公司的Java WWW网站,URL是,或是 。在那里几乎可以找到您所需要的所有Java信息,但是语 言多少是一个障碍, 至少对某些人而言;没关系,目前国内已有很多个网站提供中文 Java信息。在清华和中科院的FTP站点上有不少有关资料。想象以后应会有更多的站点提供相关信息。 
 如何才能看到Java的效果?(How Do I) 
 首先您需要有含有Java解释器的浏览器(Browser),例如:Netscpae公司的Netscape Navigator 2.0以上或是Sun公司的HotJava浏览器,对个人计算机使用者而言,操作 系统需是Windows 95或是Windows NT。 
 Java是因为撰写C++语言程序时的困难而研制开的,起先,只是一个消费性电子产品 大计划中的一部份,C++语言是当初被考虑采用的,但从一开始的编译问题一直到最 后的一连串问题迫使得放弃C++语言,而有Java语言的产生。Sun是要Java成为一个简 单(Simple)、面向对象的(Object Oriented)、 分布式的(Distributed)、解释的(Interpreted)、健壮的(Robust)、安全的(Secure)、 结构中立的(Architecture Neutral)、可移植的(Portable)、高效能的(High Performance)、多线程的(Multithreaded)、动态的(Dynamic)的程序语言(摘译自 TheJava Language: A White Paper, 1995)。 
 在Sun的Java语言白皮书中明白地说明上述Java语言的技巧。若以木工为比喻,一个面 向对象的木工,他(她)最主要的重点是即将要做的木椅子,其次才是所需要的工具; 反之;一个以非面向对象的木工,他(她)所关心的只是工具。最近的即插即用(Plug and Play)亦是面向对象设计的重点。 分布式的(Distributed):Java有一个很周全的程薪录JAVA介绍 。 
一、 
 『Java』从1995年的暑假开始在计算机业界就受到了高度注意,特别是在Internet和 多媒体(Multimedia)相关产品类方面。Java为何有如此这幺大的魅力?人作如此的比喻: Java在全球信息网(World Wide Web, WWW)地位就如同电子表格(Spreadsheet)与个人计 算机TTP和FTP等TCP/IP通讯协定相配合。Java应用程序(Applications) 能在网络上开启及连结使用物件,就如同透过URLs连结使用一个本地文件系统(Local File System)。 健壮的(Robust):由Java所编写出的程序能在多种情况下执行而具有其稳定性。Java与 C/C++最大不同点是Java有一个指针模型(Pointer Model)来排除内存被覆盖(Overwriting Memory)和毁损数据(Corrupting Data)的可能性。 
 安全的(Secure):Java是被设计用于网络及分布式的环境中,安全性自必是一个很 重要的考虑。Java拥有数个阶层的互锁(Interlocking)保护措施,能有效地防止病 毒的侵入和破坏行为的发生。 
 结构中立的(Architecture Neutral):一般而言,网络是由很多不同机型的机器所 组合而成的,CPU和作业系统体系结构均有所不同;因此,如何使一个应用程序可以 在每一种机器上执行,是一个难题。所幸,Java的编译器产生一种结构中立的目标 文件格式(Object File Format);这使得编译码得以在很多种处理器中执行。 
 可移植的(Portable):原始资料型式的大小是被指定的,例如"float"一直是表示一 个32位元IEEE 754浮点运算数字,因绝大多数的CPU都具有此共同特征。程序库属于 系统的一部份,它定义了一些可移植的程序界面,Java本身具备有很好的可移植性。 
 解释的(Interpreted):Java解释器能直接地在任何机器上执行Java位元码(Bytecodes), 因此在进行程序连结时,时间的节省,这对于缩短程序的开发过程,有极大的帮助。 
 高效能的(High Performance):Java位元码迅速地能被转换成机器码(Machine Code), 从位元码转换到机器码的效能几乎与C与C++没有分别。 
 多线程的(Multi threaded):Java语言具有多线程的功能,这对于交互回应能力及 实时执行行为是有帮助的。 
 动态的(Dynamic):Java比C或C++语言更具有动态性,更能适应时刻在变的环境, Java不会因程序库的更新,而必须重新编译程序。 
 此外,Hank Shiffman (Making Sense of Java)亦针一般对Java的错误看法及观 念提出他的说明,特在此摘译如下: 
 "Java是一种编写Web Pages的一种语言,就如同HTML和VRML一样" 事实上,Java并不象是HTML此一类的描述语言(Description Language),而是一种 编程语言(Programming Language)。描述语言标明内容和位置,而编程语言描述一 种产生结果的过程。 
2. "Java语言容易学习和使用,不像C、C++和其它程序语言" 
 Java是一种编程语言。Java容易学吗?Java或许是比C或C++容易学,但仍是一种编程语言,而不是一种描述语言。 
3. "Java码是可移植的,但C及C++不是" 
 Java原代码(Source Code)是比C语言来得可移植一点,差别在于Java的目标码。 Java码在一种机器上进行编译,而能在所有的机器上执行, 只要那部机器上有 Java解释器。 
4. "Java能被拓展而在机器上执行任何事情" 
 理论上,Java Applet (Java小应用程序)能做任何事情,如模拟3D VRML模型、播放电影、产生音频....等。但事实上,一个小应用程序(Applet)仅能在那一页上被执行,而无法在那一页之外执行。同时,Java亦受限于程序库的功能。 
5. "Java是适合于建立大型的应用程序" 
 如果Java适合于大型程序,则Java就不适合应用于Web浏览器了。第一个商业 性的Java Applets (Applix's Java-Based Spreadsheet) 并不是全然使用Java, 它只使用Java作为用户界面,而所有的处理工作, 是用CGI码。 
6. "Java是解释执行的,Basic是解释执行的,因此Java=Basic" 
 虽然Java的确是使用解释器,但事实上,Java则与C或C++等完全编译语言较为相近,但与Basic或APL等完全解译语言较不相近。 
7. "Java删除了CGI命令稿(Scripts)和程序的需求" 
 Java Applets将会取代部份CGI的用途。在有些情况,Java Applets能够取代一些服务器端代码(Server-Side Code),但大多数的情况,基于安全性理由或是效 能的考虑,Java仍无法全然取代CGI Scripts。 
8. "Netscape's JavaScript是与Java有相关" 
 除了名称之外,Java和JavaScript是有一点点相关。JavaScript是一种命令稿语 言,是可以在HTML页中使用。Java码并未出现在HTML中,而在HTML中通过一个链 结来链结编译码组。Java和JavaScript之间的关系就如同C语言和C Shell一般。 
⑻ 想通过计算机上的编程,控制单片机上的蓝牙模块,具体应该怎么编程。
 常用的方法有:
 1.通过通过计算机上的蓝牙设备给单片机上的蓝牙设备,给单片机指令起到控制作用。
 2.通过串口232或485或直接串口通讯链接到单片机的串口通讯引脚给单片机指令从而达到控制单片机。
 3.通过计算机上的wifi给单片机上的wifi指令不过这样麻烦。
第一种方法最好把,不过计算机上要有蓝牙设备或外界USB的蓝牙。
第二种方法是有线的,可以通过计算机上的232界面直接跟单片机通讯。 
⑼ c++中蓝牙编程的库类
 安装PSDK就可以用了,之前有写过一个类在MFC里面调用,并能成功与蓝牙手机通信,只不过是非标准的蓝牙协议。代码如下:
=====================h头文件========================
#ifndef NS_BTH
#include "ws2bth.h" //如果没有定义NS_BTH宏,则将PSDK头文件包含进来
#endif
#ifndef BTH_ADDR
typedef ULONGLONG BTH_ADDR;
#endif
#ifndef SAFE_DELETE
#define SAFE_DELETE(pObj) {if(pObj) delete pObj; pObj = NULL;}
#endif
#ifndef SAFE_DELETERG
#define SAFE_DELETERG(pObj) {if(pObj) delete [] pObj; pObj = NULL;}
#endif
#define RECEIVE_OVER_COMMAND 0x00001000
typedef struct _tag_BthDev_Info 
{
 BTH_ADDR btAddr;
 TCHAR szAddr[32];
 TCHAR szName[128];
 _tag_BthDev_Info()
 {
 memset(this, 0, sizeof(this));
 }
}
BTHDEV_INFO;
class CGGBlueTooth
{
public:
 CGGBlueTooth();
 ~CGGBlueTooth();
 BOOL StartSearchBthDev(IN DWORD dwControlFlags);
 BOOL GetNextBthDev(
 IN OUT BTHDEV_INFO *pcBthDevInfo, 
 IN DWORD dwControlFlags = LUP_RETURN_NAME | LUP_RETURN_ADDR | LUP_FLUSHCACHE
 );
 BOOL EndSearchBthDev();
 //Socket Api
 BOOL Create(int af = AF_BTH, int type = SOCK_STREAM, int protocol = BTHPROTO_RFCOMM);
 BOOL Close();
 //If no error occurs, this function returns zero. If an error occurs, it returns SOCKET_ERROR
 int Bind(BTH_ADDR sktAddr = 0, ULONG port = BT_PORT_ANY);
 int Listen(IN int backlog);
 int GetSockName(BTH_ADDR *psktAddr, ULONG *port);
 int SetBthService(TCHAR *lpServiceName);
 int Accept(CGGBlueTooth *pcBth);
 int Connect(BTH_ADDR sktAddr, ULONG port, int nMSecond = -1);
 int Send(LPVOID lpData, int len, int flags = 0);
 int Recv(LPVOID lpData, int len, int flags = 0);
 int SendAll(LPVOID lpData, int len, int flags = 0);
 int RecvAll(LPVOID lpData, int len, int flags = 0);
private:
 void HexMac2String(BTH_ADDR dw64Addr, TCHAR *pstrMac);
private:
 HANDLE m_hLookup;
 SOCKET m_hSocket;
 SOCKADDR_BTH m_sktAddr;
};
==============cpp文件================
#include "stdafx.h"
#include "GGBlueTooth.h"
//#include "tchar.h"
CGGBlueTooth::CGGBlueTooth()
 : m_hLookup(NULL)
 , m_hSocket(NULL)
{
 memset(&m_sktAddr, 0, sizeof(m_sktAddr));
}
CGGBlueTooth::~CGGBlueTooth()
{
 EndSearchBthDev();
 Close();
}
void CGGBlueTooth::HexMac2String(BTH_ADDR dw64Addr, TCHAR *pstrMac)
{
 BYTE *pbAddr = (BYTE*)&dw64Addr;
 _stprintf(
 pstrMac, _T("%02X:%02X:%02X:%02X:%02X:%02X"),
 pbAddr[5], pbAddr[4], pbAddr[3], 
 pbAddr[2], pbAddr[1], pbAddr[0]
 );
}
BOOL CGGBlueTooth::StartSearchBthDev(IN DWORD dwControlFlags)
{
 WSAQUERYSET wsaq;
 ZeroMemory(&wsaq, sizeof(wsaq));
 wsaq.dwSize = sizeof(wsaq);
 wsaq.dwNameSpace = NS_BTH;
 wsaq.lpcsaBuffer = NULL;
 return WSALookupServiceBegin(&wsaq, dwControlFlags, &m_hLookup) == ERROR_SUCCESS ? TRUE : FALSE;
}
BOOL CGGBlueTooth::GetNextBthDev(
 IN OUT BTHDEV_INFO *pcBthDevInfo, 
 IN DWORD dwControlFlags /* = LUP_RETURN_NAME | LUP_RETURN_ADDR | LUP_FLUSHCACHE*/
)
{
 if (!m_hLookup || !pcBthDevInfo)
 {
 return FALSE;
 }
 memset(pcBthDevInfo->szAddr, 0, sizeof(pcBthDevInfo->szAddr));
 memset(pcBthDevInfo->szName, 0, sizeof(pcBthDevInfo->szName));
 union 
 {
 CHAR buf[5000];
 double __unused; // ensure proper alignment
 };
 LPWSAQUERYSET pwsaResults = (LPWSAQUERYSET)buf;
 DWORD dwSize = sizeof(buf);
 int nResult;
 ZeroMemory(pwsaResults, sizeof(WSAQUERYSET));
 pwsaResults->dwSize = sizeof(WSAQUERYSET);
 pwsaResults->dwNameSpace = NS_BTH;
 pwsaResults->lpBlob = NULL;
 nResult = WSALookupServiceNext (m_hLookup, dwControlFlags, &dwSize, pwsaResults);
 if (nResult == ERROR_SUCCESS)
 {
 pcBthDevInfo->btAddr = ((SOCKADDR_BTH *)pwsaResults->lpcsaBuffer->RemoteAddr.lpSockaddr)->btAddr;
 BOOL bHaveName = pwsaResults->lpszServiceInstanceName && *(pwsaResults->lpszServiceInstanceName);
 if (bHaveName)
 {
 HexMac2String(pcBthDevInfo->btAddr, pcBthDevInfo->szAddr);
 _tcscpy(pcBthDevInfo->szName, pwsaResults->lpszServiceInstanceName);
 }
 return TRUE;
 }
 
 return FALSE;
}
BOOL CGGBlueTooth::EndSearchBthDev()
{
 if (m_hLookup)
 {
 WSALookupServiceEnd(m_hLookup);
 m_hLookup = NULL;
 return TRUE;
 }
 
 return FALSE;
}
///===============================
BOOL CGGBlueTooth::Create(int af/* = AF_BTH*/, int type/* = SOCK_STREAM*/, int protocol/* = BTHPROTO_RFCOMM*/)
{
 if (m_hSocket)
 {
 return FALSE;
 }
 m_hSocket = socket(af, type, protocol);
 m_sktAddr.addressFamily = af;
 m_sktAddr.serviceClassId = GUID_NULL;
 return m_hSocket == INVALID_SOCKET ? FALSE : TRUE;
}
BOOL CGGBlueTooth::Close()
{
 if (m_hSocket)
 {
 closesocket(m_hSocket);
 return TRUE;
 }
 return FALSE;
}
int CGGBlueTooth::Bind(BTH_ADDR sktAddr/* = 0*/, ULONG port/* = BT_PORT_ANY*/)
{
 m_sktAddr.btAddr = sktAddr;
 m_sktAddr.port = port;
 return bind(m_hSocket, (SOCKADDR *)&m_sktAddr, sizeof(m_sktAddr));
}
int CGGBlueTooth::Listen(int backlog)
{
 return listen(m_hSocket, backlog);
}
int CGGBlueTooth::GetSockName(BTH_ADDR *psktAddr, ULONG *port)
{
 int nLen = sizeof(m_sktAddr);
 int nResult = getsockname(m_hSocket, (SOCKADDR *)&m_sktAddr, &nLen);
 if (nResult == 0)
 {
 *psktAddr = m_sktAddr.btAddr;
 *port = m_sktAddr.port;
 }
 return nResult;
}
GUID OBEXFileTransferServiceClass_UUID_EX = {0x00001106, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
int CGGBlueTooth::SetBthService(TCHAR * lpServiceName)
{
 CSADDR_INFO sockInfo;
 sockInfo.iProtocol = BTHPROTO_RFCOMM;
 sockInfo.iSocketType = SOCK_STREAM;
 sockInfo.LocalAddr.lpSockaddr = (SOCKADDR *)&m_sktAddr;
 sockInfo.LocalAddr.iSockaddrLength = sizeof(m_sktAddr);
 sockInfo.RemoteAddr.lpSockaddr = (SOCKADDR *)&m_sktAddr;
 sockInfo.RemoteAddr.iSockaddrLength = sizeof(m_sktAddr);
 WSAQUERYSET svcInfo = {0};
 svcInfo.dwSize = sizeof(svcInfo);
 svcInfo.dwNameSpace = NS_BTH;
 svcInfo.lpszServiceInstanceName = lpServiceName;
 svcInfo.lpServiceClassId = &OBEXFileTransferServiceClass_UUID_EX;
 svcInfo.dwNumberOfCsAddrs = 1;
 svcInfo.lpcsaBuffer = &sockInfo;
 return WSASetService(&svcInfo, RNRSERVICE_REGISTER, 0);
}
int CGGBlueTooth::Accept(CGGBlueTooth *pcBth)
{
 SOCKADDR_BTH ca;
 int size = sizeof(ca);
 pcBth->m_hSocket = accept (m_hSocket, (SOCKADDR *)&ca, &size);
 pcBth->m_sktAddr = ca;
 return pcBth->m_hSocket == INVALID_SOCKET ? SOCKET_ERROR : 0;
}
int CGGBlueTooth::Connect(BTH_ADDR sktAddr, ULONG port, int nMSecond/* = -1*/)
{
 SOCKADDR_BTH sa = {0};
 sa.addressFamily = AF_BTH;
 sa.btAddr = sktAddr;
 sa.port = port;
 if (nMSecond == -1)
 {
 return connect(m_hSocket, (LPSOCKADDR)&sa, sizeof(SOCKADDR_BTH));
 }
 
 ULONG non_blocking = 1;
 ULONG blocking = 0;
 
 int nResult = ioctlsocket(m_hSocket, FIONBIO, &non_blocking);
 if (nResult == SOCKET_ERROR)
 {
 return nResult;
 }
 nResult = SOCKET_ERROR;
 if (connect(m_hSocket, (LPSOCKADDR)&sa, sizeof(SOCKADDR_BTH)) == SOCKET_ERROR)
 {
 struct timeval tv; 
 fd_set writefds;
 // 设置连接超时时间
 tv.tv_sec = nMSecond / 1000; // 秒数
 tv.tv_usec = nMSecond % 1000; // 毫秒
 FD_ZERO(&writefds); 
 FD_SET(m_hSocket, &writefds); 
 nResult = select((int)m_hSocket + 1, NULL, &writefds, NULL, &tv);
 if(nResult > 0)
 {
 if(FD_ISSET(m_hSocket, &writefds))
 {
 int error = 0;
 int len = sizeof(error); 
 //下面的一句一定要,主要针对防火墙 
 if(!(getsockopt(m_hSocket, SOL_SOCKET, SO_ERROR, (char *)&error, &len) != 0 || error != 0))
 {
 nResult = 0;
 }
 }
 }
 else if (nResult == 0)
 {
 nResult = -2;
 }
 }
 if (ioctlsocket(m_hSocket, FIONBIO, &blocking) == SOCKET_ERROR)
 {
 nResult = SOCKET_ERROR;
 }
 return nResult;
}
int CGGBlueTooth::Send(LPVOID lpData, int len, int flags/* = 0*/)
{
 return send(m_hSocket, (char *)lpData, len, flags);
}
int CGGBlueTooth::Recv(LPVOID lpData, int len, int flags/* = 0*/)
{
 return recv(m_hSocket, (char *)lpData, len, flags);
}
int CGGBlueTooth::SendAll(LPVOID lpData, int len, int flags/* = 0*/)
{
 int nCount = send(m_hSocket, (char *)lpData, len, flags);
 if (nCount == SOCKET_ERROR && WSAGetLastError() != WSAEWOULDBLOCK)
 {
 return SOCKET_ERROR;
 }
 int nCommand = 0;
 nCount = recv(m_hSocket, (char *)&nCommand, 4, flags);
 if (nCount != 4 || nCommand != RECEIVE_OVER_COMMAND)
 {
 return SOCKET_ERROR;
 }
 return ERROR_SUCCESS;
}
int CGGBlueTooth::RecvAll(LPVOID lpData, int len, int flags/* = 0*/)
{
 int nCount = -1, nCurRecv = 0, nMaxRead = 32 * 1024;
 while (nCurRecv < len)
 {
 if (len - nCurRecv < nMaxRead)
 {
 nMaxRead = len - nCurRecv;
 }
 nCount = recv(m_hSocket, (char *)lpData + nCurRecv, nMaxRead, flags);
 if (nCount == SOCKET_ERROR)
 {
 if (WSAGetLastError() == WSAEWOULDBLOCK)
 {
 Sleep(1);
 continue;
 }
 else
 {
 return SOCKET_ERROR;
 }
 }
 nCurRecv += nCount;
 }
 int nCommand = RECEIVE_OVER_COMMAND;
 nCount = send(m_hSocket, (char *)&nCommand, 4, flags);
 if (nCount == SOCKET_ERROR && WSAGetLastError() != WSAEWOULDBLOCK)
 {
 return SOCKET_ERROR;
 }
 
 return ERROR_SUCCESS;
} 
