蓝牙 传输 socket

1、有一个蓝牙设备,是一个蓝牙模块,非手机或者其他主机。使用SPP协议。

2、使用主机连接这个蓝牙设备,主机是win10系统。在系统中的蓝牙设置中,对这个设备的蓝牙连接,会出现两个虚拟端口。如下图,设备DX2003,会有COM3,COM4两个端口。如果进行数据传输,只能使用COM4端口。

3、开始的时候,使用串口控制来实现对蓝牙设备的数据传输,这种方式比较简单。就是先遍历串口设备,然后选择一个COM口,打开,就可以进行数据传输了。但是有一些缺点,无法通过程序端获取到是哪个端口可用,也无法获取到类似于window系统这样的可以显示出不同端口的名称,再根据名称的后缀来判断。同时,一旦设备断开,对于串口的程序端判断,也不是很及时。在不同电脑上,同一个设备的COM口也会不同,还需要人工去判断,选择。操作模式不够好。

4、基于上述原因,走了另外一条道路。就是使用socket来实现。可通过网络查询,很多都说SPP协议是点对点经典蓝牙模式,没有服务器/客户端的协议。一度放弃,只是可以实现通过设备名称可以找到蓝牙地址的功能。一次偶然的机会,进行测试的时候,突发奇想试试socket能不能连上设备。最后竟然连接上了。设备端是服务器,电脑端是客户端。除了一些设置不同,其他的使用方式和网络没有什么区别。唉,我也不知道为什么。

5、查找蓝牙设备的代码,此代码可以实现对已配对电脑设备的遍历查找。但是无法实现查找未配对设备。

#include <stdlib.h>

#include <stdio.h>

// Link to ws2_32.lib

#include <Winsock2.h>

#include <Ws2bth.h>

// Link to Bthprops.lib

#include <BluetoothAPIs.h>

 

int main(int argc, char **argv)

{

            HANDLE hRadio, hDeviceFind;

            BLUETOOTH_DEVICE_INFO_STRUCT deviceInfo;

            BLUETOOTH_DEVICE_SEARCH_PARAMS deviceSearchParams;

            BLUETOOTH_RADIO_INFO radioInfo;

            GUID guidServices[10];

            DWORD numServices, result;

            int i = 1;

 

            BLUETOOTH_FIND_RADIO_PARAMS btfrp = { sizeof(BLUETOOTH_FIND_RADIO_PARAMS) };

            HBLUETOOTH_RADIO_FIND hFind = BluetoothFindFirstRadio(&btfrp, &hRadio);

 

            if (hFind != NULL)

            {

                        printf("BluetoothFindFirstRadio() is working!\n");

                        do

                        {

                                    // Do something with the radio handle...

                                    radioInfo.dwSize = sizeof(radioInfo);

 

                                    if (BluetoothGetRadioInfo(hRadio, &radioInfo) == ERROR_SUCCESS)

                                    {

                                                printf("BluetoothGetRadioInfo() is OK!\n");

                                                printf(" Radio found: %S\n", radioInfo.szName);

                                    }

                                    else

                                                printf("BluetoothGetRadioInfo() failed with error code %d\n", GetLastError());

 

                                    deviceInfo.dwSize = sizeof(deviceInfo);

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

                                    deviceSearchParams.dwSize = sizeof(deviceSearchParams);

 

                                    // deviceSearchParams.fReturnAuthenticated = TRUE;

                                    deviceSearchParams.fReturnRemembered = TRUE;

                                    //deviceSearchParams.fReturnUnknown = TRUE;

                                    //deviceSearchParams.fReturnConnected = TRUE;

                                    deviceSearchParams.hRadio = hRadio;

 

                                    hDeviceFind = BluetoothFindFirstDevice(&deviceSearchParams, &deviceInfo);

                                    if (hDeviceFind != NULL)

                                    {

                                                printf("BluetoothFindFirstDevice() is OK!\n");

                                                do

                                                {

                                                            printf(" Device found - Name: %S\n", deviceInfo.szName);

                                                            printf(" Device found - Address: %X\n", deviceInfo.Address);

                                                            printf(" Device found - Device Class: %ul\n", deviceInfo.ulClassofDevice);

 

                                                            numServices = sizeof(guidServices);
 // guidServices should contains a complete list of enabled service GUIDs.

                                    result = BluetoothEnumerateInstalledServices(hRadio, &deviceInfo, &numServices, guidServices);

 

                                    if (result == ERROR_SUCCESS)

                                    {

                                                printf("BluetoothEnumerateInstalledServices() should be fine!\n");

                                                printf(" ...GUID services\n");

                                    }

                                    else

                                                printf("BluetoothEnumerateInstalledServices() failed with error code %d\n", result);

 

                           }

                           while(BluetoothFindNextDevice(hDeviceFind, &deviceInfo));

 

                           BluetoothFindDeviceClose(hDeviceFind);

               }

 

                                    // Need to re-allocate, else BluetoothGetDeviceInfo() will fail

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

                                    deviceInfo.dwSize = sizeof(deviceInfo);

 

                                    if (BluetoothGetDeviceInfo(hRadio, &deviceInfo))

                                    {

                                                printf("BluetoothGetDeviceInfo() is OK!\n");

                                                printf(" ...More operations...\n");

                                                // BluetoothUpdateDeviceRecord() - change name, BluetoothRemoveDevice() etc.

                                    }

                                    else

                                                printf("BluetoothGetDeviceInfo() failed with error code %d\n", GetLastError());

 

                                    CloseHandle(hRadio);

                        } while( BluetoothFindNextRadio(hFind, &hRadio));

                        BluetoothFindRadioClose(hFind);

            }

            return 0;

}

 6、socket相关设置代码,可以连接蓝牙设备。有过网络通信编程经验的同学,看到这已经可以自主往下进行了。连接成功后,后面使用socket就可以进行数据通讯了。

btSocket = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
					memset(&sockAddr, 0, sizeof(sockAddr));
					sockAddr.addressFamily = AF_BTH;
					sockAddr.serviceClassId = RFCOMM_PROTOCOL_UUID;
					sockAddr.port = BT_PORT_ANY;
					sockAddr.btAddr = deviceInfo.Address.ullLong;
					error = connect(btSocket, (SOCKADDR*)&sockAddr, sizeof(sockAddr));
					if (error== SOCKET_ERROR)
					{
						printf("=CRITICAL= | connect() call failed. WSAGetLastError=[%d]\n", WSAGetLastError());
					}
					else
					{
						nLinkState = 1;
						printf("--------- Link Sucess!!!------- \n");
						break;
					}

7、现在可以实现电脑PC端对另一个蓝牙设备模块的数据通讯。电脑是win10,蓝牙是SPP协议。电脑端已经对蓝牙设备进行了配对。然后电脑端写程序使用Socket就可以实现与蓝牙设备的数据传输。虽然已经实现,但还是有很多问题没有想明白。时间有效,暂时先做到这一步,后续有机会,再进行。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 蓝牙Socket是指蓝牙设备之间通过无线蓝牙连接建立的通信通道。通过蓝牙Socket,设备可以进行数据的传输和交换,实现互相之间的通信功能。 蓝牙Socket是一种面向连接的通信方式,即在进行通信之前,需要先建立两个设备之间的连接。这种连接方式可以确保通信的稳定性和可靠性。蓝牙Socket使用一对端口来标识通信的两个设备,一个端口用于接收数据,另一个端口用于发送数据。 相比传统的有线通信方式,蓝牙Socket的优势在于无线连接,不需要使用数据线或者网络连接,更加便捷。蓝牙Socket广泛用于各种蓝牙设备之间的通信,如手机与耳机、键盘、打印机等的连接,以及智能家居设备之间的互联互通。 蓝牙Socket的实现依赖于蓝牙协议栈和相应的开发工具。开发人员可以利用蓝牙Socket实现设备之间的数据传输和交互,例如发送命令、接收数据等。同时,开发人员还可以通过蓝牙Socket实现设备之间的远程控制和管理,以及实现更加复杂的功能。 总之,蓝牙Socket是一种无线通信方式,通过建立连接实现设备之间的数据传输和交互。它在各种蓝牙设备之间的通信中起到了重要的作用,为用户提供了更加便捷和灵活的通信方式。 ### 回答2: 蓝牙socket是一种用于蓝牙通信的软件接口。它建立了蓝牙设备之间的通信连接,允许数据在设备之间传输蓝牙socket对于蓝牙通信的应用程序尤为重要,它提供了一种可靠的通信方式。 通过蓝牙socket,设备可以建立远程通信连接,例如手机与耳机之间的通信。这种通信方式是无线的,因此非常方便。蓝牙socket可以处理多种类型的数据,例如音频、视频、文件等。 蓝牙socket的使用需要一些特定的协议和设置,以确保通信的正确性和速度。通常,当设备之间建立连接时,它们会自动协商和选择适当的协议和设置。 蓝牙socket还有一些特性,例如安全性和能效性。蓝牙socket可以使用加密等安全措施,以防止数据泄漏或非法访问。此外,蓝牙socket还可以通过调整传输速率和功耗来提高能效性,以适应不同类型的应用需求。 总之,蓝牙socket是一种重要的软件接口,为蓝牙设备之间的通信提供了便捷而可靠的方式。它广泛应用于手机、平板电脑、耳机、音箱等各种蓝牙设备中,为用户提供了更好的使用体验。 ### 回答3: 蓝牙Socket是一种无线通信协议,用于在蓝牙设备之间建立连接和实现数据传输。它是蓝牙技术中的一种通信方式,可以用于连接各种蓝牙设备,如手机、电脑、音频设备等。 蓝牙Socket的工作原理是通过建立蓝牙连接,将数据以流的形式传输。通过蓝牙Socket,可以实现设备之间的数据传输和通信,比如发送文件、播放音乐、远程控制等。蓝牙Socket提供了一种简单、方便、低功耗的方式,使得设备之间的互联变得更加容易。 蓝牙Socket具有以下特点: 1. 无线传输蓝牙Socket不需要物理连接线,通过蓝牙无线技术进行数据传输。 2. 简单易用:蓝牙Socket使用简单,只需建立连接并发送数据即可实现通信。 3. 低功耗:蓝牙Socket采用低功耗技术,节省设备电量,延长电池使用寿命。 4. 安全可靠:蓝牙Socket支持加密和验证机制,确保通信的安全性和可靠性。 5. 多设备连接:蓝牙Socket可以同时连接多个设备,实现设备间的并行通信。 总之,蓝牙Socket是一种便捷实用的无线通信方式,适用于各种蓝牙设备之间的数据传输和通信。它的应用范围广泛,如蓝牙耳机、车载蓝牙、智能家居等领域,为设备间的互联提供了一种简单方便的解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值