熱門技術 Winsock 搜尋藍芽裝置

2021-09-30 15:38:06 字數 3489 閱讀 6772

這裡有各種藍芽相關的文章

我們如何檢索計算機上面的藍芽裝置呢,我們使用winsock搜尋藍芽裝置,請見**分析

#include "stdafx.h"

#include

#include

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

int _tmain(int argc, _tchar* ar**)

// 初始化藍芽列舉結構

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)

else }}

wsalookupserviceend( hservice );

}// 釋放資源

heapfree(getprocessheap(), 0, lpwsaqs);

wsacleanup();

return 0;

}使用winsock連線到遠端藍芽裝置

你可以通過建立服務端和客戶端套接字來連線兩個藍芽裝置。服務端套接字必須設定為監聽傳入連線並接受客戶端套接字;客戶端套接字在傳送連線請求之前必須要知道要連線到的裝置的位址。

你也可以在microsoft windows ce上使用串列埠**方便地建立連線,詳情參見「利用虛擬串列埠連線到遠端裝置」

注意為了使清晰起見,文中忽略了錯誤處理

在建立連線前,你必須先獲得以下資訊:

øtypedef ulonglong bt_addr, *pbt_addr, bt_addr, *pbt_addr;

注意僅僅客戶端須要如此。

ø 乙個guid型別變數的服務識別符號,或者rfcomm通道(1到31)。

建立客戶端套接字1.

wsadata wsd;

wsastartup (makeword(1,0), &wsd);

2. 呼叫socket函式來建立乙個藍芽套接字。

socket client_socket = socket (af_bt, sock_stream, bthproto_rfcomm);

socket

函式的引數值將套接字設定為藍芽服務。

3. 通過設定sockaddr_bth結構體來儲存客戶端要連線到的遠端裝置的資訊。

a. 建立並初始化sockaddr_bth變數。

sockaddr_bth sa;

memset (&sa, 0, sizeof(sa));

b. 將btaddr成員賦值為包含目標裝置位址的bt_addr變數。

sa.btaddr = b;

//b is abt_addrvariable

你的程式可以接受字串型別的裝置位址,但必須將其轉換並儲存為乙個bt_addr型別變數。

c. 如果服務識別符號有效,則將serviceclassid成員設定為基於rfcomm的服務的guid。這種情況下,客戶端執行sdp查詢然後使用得到的伺服器通道。

或者如果你要使用硬編碼的通道編號,將port成員變數設定為伺服器通道編號。

sa.port = channel & 0xff;

4. 呼叫connect函式來連線到藍芽套接字。

if (connect (client_socket, (sockaddr *)&sa, sizeof(sa)))

傳遞第3步中設定好的sockaddr_bth來指定目標裝置的屬性。

連線建立後,你可以通過傳送和接收資料來和目標裝置通訊。

5. 要關閉與目標裝置的連線呼叫closesocket函式關閉藍芽套接字,並且確保使用closehandle函式釋放套接字。

closesocket(client_socket);

closehandle ((lpvoid)client_socket);

6. 要結束對winsock服務的使用,呼叫wsacleanup函式。在程式中對每個成功呼叫的wsastartup都必須對應地呼叫wsacleanup。

to create a server socket1.

wsadata wsd;

wsastartup (makeword(1,0), &wsd);

2. 呼叫socket函式來建立乙個藍芽套接字。

socket server_socket = socket (af_bt, sock_stream, bthproto_rfcomm);

socket

函式的引數值將套接字設定為藍芽服務。

3. 通過設定sockaddr_bth結構體來儲存伺服器裝置的資訊。

sockaddr_bth sa;

memset (&sa, 0, sizeof(sa));

sa.addressfamily = af_bt;

sa.port = channel & 0xff;

注意為了避免衝突,在選擇伺服器通道時建議將channel設定為0,這樣rfcomm將自動使用下乙個有效的通道。

結構體中的資訊用來將套接字繫結到伺服器裝置的本地位址上。

4. 呼叫bind函式繫結第二步中建立的server_socket,傳入第三步中建立的sa的引用指定裝置資訊。

if (bind (server_socket, (sockaddr *)&sa, sizeof(sa)))

5. 用listen函式來監聽客戶端藍芽裝置傳送的連線請求。

if (listen (server_socket, 5))

6. 用accept函式來接受傳入的連線請求。

sockaddr_bth sa2;

int size = sizeof(sa2);

socket s2 = accept (server_socket, (sockaddr *)&sa2, &size);

呼叫accept將返回scokaddr_bth型別的客戶端位址。

7. 呼叫closecocket函式來關閉套接字。

closesocket(server_socket);

要結束對winsock服務的使用,呼叫wsacleanup函式。在程式中對每個成功呼叫的wsastartup都必須對應地呼叫wsacleanup。

搜尋歷史,熱門搜尋,高亮

今天來寫一篇關於input框的部落格,乙個簡單的案例,希望能夠幫助你們!廢話不多說,直接見 home 頂部 home header container home header img assets search.png alt div home header input text placehold...

藍芽技術原理(9)藍芽AOA AOD技術原理

5.1 有個特性加入了aoa和aod定位應用,實現了厘公尺級別的定位功能,效果不錯 1 發射端 1 乙個tag 2 單天線的 3 資料報為cte廣播資料 2 接收端 1 陣列天線 2 通過cte廣播訊號得到iq結果 1 發射端 1 乙個天線 2 通過cte廣播訊號得到iq結果 2 接收端 1 陣列天...

andriod 藍芽開發之藍芽搜尋

藍芽的搜尋是通過廣播來實現的。關鍵 如下 1 用於發現藍芽的廣播接受者 接收器 當搜尋藍芽裝置完成時呼叫 private broadcastreceiver foundreceiver new broadcastreceiver private broadcastreceiver discovery...