當前位置:首頁 » 編程軟體 » 藍牙編程

藍牙編程

發布時間: 2022-01-10 19:09:20

⑴ 有關藍牙通訊編程的書籍

藍牙核心技術電子書 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;
}

熱點內容
單片機android 發布:2024-09-20 09:07:24 瀏覽:760
如何提高三星a7安卓版本 發布:2024-09-20 08:42:35 瀏覽:659
如何更換伺服器網站 發布:2024-09-20 08:42:34 瀏覽:306
子彈演算法 發布:2024-09-20 08:41:55 瀏覽:284
手機版網易我的世界伺服器推薦 發布:2024-09-20 08:41:52 瀏覽:812
安卓x7怎麼邊打游戲邊看視頻 發布:2024-09-20 08:41:52 瀏覽:158
sql資料庫安全 發布:2024-09-20 08:31:32 瀏覽:89
蘋果連接id伺服器出錯是怎麼回事 發布:2024-09-20 08:01:07 瀏覽:503
編程鍵是什麼 發布:2024-09-20 07:52:47 瀏覽:655
學考密碼重置要求的證件是什麼 發布:2024-09-20 07:19:46 瀏覽:479