Seit einiger Zeit versuche ich eine Bluetooth Verbindung zwischen Android und Windows herzustellen.
für die Android Programmierung nutze ich Eclipse, und für Windows Lazarus.
Ich habe ein TestProgramm geschrieben, um zu schauen, wie was funktioniert, nur komme ich nicht weiter.
Hier der Code
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
ExtCtrls, WinSock2, JwaBthSdpDef, JwaBluetoothAPIs, JwaWs2Bth, Windows,
JWAWinUser;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
iResult,i:Integer;
Data:WSAData;
s :Tsocket;
s2 :Tsocket;
protocolInfo:TWSAProtocol_Info ;
address:SOCKADDR_BTH;
addressT:TSockAddr;
addressT2:SOCKADDR_BTH;
service :TWSAQuerySetA;
serviceID:GUID =({04c6093b00001000800000805f9b34fb}) ;
csAddr:CSADDR_INFO;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
memo1.Clear;
iResult:= WSAStartup( MakeWord(2,2), Data);
if (iResult=0) then memo1.Lines.Add('WSAStartup OK') else memo1.Lines.Add('WSAStartup !OK');
s:=socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
if (s= INVALID_SOCKET) then memo1.Lines.Add('socket !OK') else memo1.Lines.Add('socket OK');
i:=sizeof(protocolInfo);
iResult:=getsockopt(s,SOL_SOCKET, SO_PROTOCOL_INFO,Pchar(@protocolInfo),i);
if (iResult=0) then memo1.lines.add('getsockopt OK') else memo1.lines.add('getsockopt !OK');
address.addressFamily:=AF_BTH;
//address.btAddr:=0;
//address.serviceClassId:=GUID_NULL;
address.port:=BT_PORT_ANY;
Move(address,addressT,sizeof(address));
iResult:= bind(s, @address, sizeof(address));
if (iResult=0) then memo1.lines.add('bind OK') else memo1.lines.add('bind !OK');
i:=sizeof(SOCKADDR_BTH);
iResult:=getsockname(s ,addressT,i);
if (iResult=0) then memo1.lines.add('getsockname OK') else memo1.lines.add('getsockname !OK');
FillChar(service,0,sizeof(service));
service.dwSize:=sizeof(service);
service.lpszServiceInstanceName := 'My service';
service.lpszComment := 'My comment';
service.lpServiceClassId := @serviceID;
service.dwNumberOfCsAddrs := 1;
service.dwNameSpace := NS_BTH;
FillChar(csAddr,0,sizeof(csAddr));
csAddr.LocalAddr.iSockaddrLength:=sizeof(SOCKADDR_BTH);
csAddr.LocalAddr.lpSockaddr := PSockAddr(@address);
//csAddr.RemoteAddr.iSockaddrLength:=sizeof(address);
//csAddr.RemoteAddr.lpSockaddr:=PSockAddr(@address);
csAddr.iSocketType := SOCK_STREAM;
csAddr.iProtocol := BTHPROTO_RFCOMM;
service.lpcsaBuffer:=PCSADDR_INFO(@csAddr);
if (SOCKET_ERROR= WSASetService(@service, RNRSERVICE_REGISTER, 0))
then memo1.lines.add('WSASetService !OK') else memo1.lines.add('WSASetService OK');
iResult:=listen(s,10);
if (iResult=0) then memo1.lines.add('listen OK') else memo1.lines.add('listen !OK');
memo1.lines.add('Before accept.........');
i:=sizeof(addressT2);
s2:=accept(s,PSockAddr(@addressT2),i);
memo1.lines.add('after accept.........');
if (s2 = INVALID_SOCKET) then memo1.lines.add('müll');
end;
end.

Die "accept" blockiert das Programm, wie sie soll, nur wenn ich vom Handy aus eine Verbindung aufbauen möchte, geht es einfach nicht.
Meine Farge ist:
Hat sich schon einmal jemand mit Windows Sockets in Bezug auf Bluetooth beschäftigt, und kann mir weiter helfen?
sieht jemand den Logischen oder inhaltlichen Fehler?
oder weiß jemand, wie ich das ganze mit Lazarus anders lösen kann?