[Bluetooth] – How to Host a RFCOMM Service in C++


Introduction

Bluetooth is an industry-standard protocol that enables wireless connectivity for computers, handheld devices, mobile phones, and other devices.

RFCOMM emulates RS-232 (ITU-T V.24) serial ports. The emulation includes transfer of the state of the non-data circuits. RFCOMM has a built-in scheme for null modem emulation.

Service Definition Model

 

 

This blog will introduce how to use Windows Sockets functions to host a Bluetooth RFCOMM service, and use the Windows Runtime API to consume this service.

Steps:

#1 ask for Windows Sockets API (WSA) 2.2

The socket initialization only be required once for one process, so I put the initialization code in a static function.

#2 create a Windows socket

#3 create a Bluetooth address and bind to Windows socket

#4 register a Bluetooth service (SDP)

#5 listen to the Windows socket

 

# CODE #

RFCOMM Server (C++):

#include "stdafx.h"
#include "Winsock.h"
#include <WinSock2.h>
#include <ws2bth.h>
#include <bthsdpdef.h>
#include <bluetoothapis.h>

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

int main()
{
	if (!Winsock::InitialzedForCurrentProcess())
	{
		return 1;
	}

	Winsock winsock = Winsock(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);

	if (!winsock.IsValid())
	{
		return 1;
	}

	winsock.Bind();

	winsock.Listen();

	winsock.RegisterServcie(_T("RFCOMM Server Demo Instance"), _T("Pushing data to PC"), OBEXObjectPushServiceClass_UUID);

	winsock.OnConnected([](SOCKET s){
		char buffer[1024] = { 0 };

		memset(buffer, 0, sizeof(buffer));

		int r = 0;

		do
		{
			r = recv(s, (char*)buffer, sizeof(buffer), 0);

			printf("result:%d, %s\n", r, buffer);

		} while (r != 0);

		closesocket(s);
	});

	winsock.Accept();

	WSACleanup();

    return 0;
}

Code on Github: https://github.com/dream-365/winapp/tree/master/BluetoothPlay

Skip to main content