AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Bluetooth Server Win32 API
Thema durchsuchen
Ansicht
Themen-Optionen

Bluetooth Server Win32 API

Ein Thema von Brainstalker · begonnen am 9. Sep 2010 · letzter Beitrag vom 17. Sep 2010
Antwort Antwort
Benutzerbild von Brainstalker
Brainstalker

Registriert seit: 9. Jan 2004
Ort: Berlin
176 Beiträge
 
Delphi 2009 Professional
 
#1

AW: Bluetooth Server Win32 API

  Alt 13. Sep 2010, 09:41
So ich hab jetzt mal wieder ein bisschen in der Bluetooth API geschaut und ich denke der Socket Ansatz ist der richtige. Das Androidprogramm in Java benutzt auch einen Socket, also müsste das dann ja so hinhauen. Läuft dann über RFComm.

Hab mal jetzt ein bisschen was aus der API zusammen kopiert und halbwegs nach Delphi portiert. Können noch Fehler drin sein oder Pseudocode enthalten sein. Hab jetzt auch gerade keine Möglichkeit das zu testen, weil ich auf Arbeit bin. Aber vielleicht können ja die Socket Experten mal nen Blick drüber werfen.

Delphi-Quellcode:
var
  wsaD: TWsaData;
  iResult: integer;
  ListenSocket: TSocket;
  name: SOCKADDR_BTH;

begin

//----------------------
// Initialize Winsock

  iResult := WSAStartup(WINSOCK_VERSION, @wsaD);
  if (iResult <> NO_ERROR)
    ShowMessage('Error at WSAStartup()');

//----------------------
// Create a SOCKET for listening for
// incoming connection requests.

  // Parameters for Bluetooth Socket
  ListenSocket := socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
  if (ListenSocket = INVALID_SOCKET) then
  begin
    ShowMessage('Error at socket(): ' + WSAGetLastError());
    WSACleanup();
    exit;
  end;

//----------------------
// The sockaddr_in structure specifies the address family,
// IP address, and port for the socket that is being bound.

  name.addressFamily := AF_BTH;
  name.btAddr := 0;
  name.serviceClassId := NULL_GUID;
  name.port := BT_PORT_ANY;


  if (bind(ListenSocket, TSockAddr(@name), sizeof(name)) = SOCKET_ERROR) then
  begin
    ShowMessage('bind() failed.');
    closesocket(ListenSocket);
    exit;
  end;

//----------------------
// Listen for incoming connection requests
// on the created socket

  if (listen(ListenSocket, SOMAXCONN) = SOCKET_ERROR) then
    ShowMessage('Error listening on socket.');

  ShowMessage('Listening on socket...');
  WSACleanup();
  exit;

end;
Michael N.
Brainstalker
  Mit Zitat antworten Zitat
Astat

Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
 
Lazarus
 
#2

AW: Bluetooth Server Win32 API

  Alt 13. Sep 2010, 13:59
..mal nen Blick drüber werfen.

Hi Brainstalker, als Minimum Sample sollte noch folgendes implementiert werden.

Delphi-Quellcode:
var
  ...
  name: SOCKADDR_BTH;
  addrlen: integer;
  ClientSocket: TSocket;
begin
  iResult := WSAStartup($0020, @wsaD);
.....

//----------------------
// Listen for incoming connection requests
// on the created socket

  if (listen(ListenSocket, SOMAXCONN) = SOCKET_ERROR) then
    ShowMessage('Error listening on socket.');

  addrlen := SizeOf(name);
  while ServerRunning do begin
    ClientSocket := Accept(ListenSocket, @name, @addrlen);
    if (ClientSocket <> INVALID_SOCKET) then begin
      cbRcv := Recv(ClientSocket, szBuf[0], WSOCK_READ_BUFFER_SIZE, 0);
      if (cbRcv = 0) or (cbRcv = SOCKET_ERROR) then EXIT;
      .... loop
      ret := ioctlsocket(ClientSocket, FIONREAD, cbRead);
      result := Send(ASocket, sSendData[1], Length(sSendData), 0);
      done....
    end;
  end;

  ShowMessage('Listening on socket...');
  WSACleanup();
  exit;

end;
lg. Astat
Lanthan Astat
06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
  Mit Zitat antworten Zitat
Benutzerbild von Brainstalker
Brainstalker

Registriert seit: 9. Jan 2004
Ort: Berlin
176 Beiträge
 
Delphi 2009 Professional
 
#3

AW: Bluetooth Server Win32 API

  Alt 13. Sep 2010, 17:48
Hey danke Astat,

das mit dem Accept hab ich auch noch gefunden. Das Programm wartet auch auf eine Connection vom Client. Mein Problem ist jetzt bloß noch, das mein Client auf dem Smartphone immer noch nicht connecten will. Ich weiß nicht was ich im Moment noch für einen Fehler drin habe. Falls sich jemand mit der Android programmierung auskennt, mit:
Code:
private final BluetoothDevice mmDevice;
tmp = mmDevice.createRfcommSocketToServiceRecord(MY_UUID);
will ich eine Verbindung herstellen. Allerdigs bekomm ich damit keine Connection.


[EDIT]
Hab gerade rausgefunden, das ich den Service mit der Funktion WSASetService promoten soll. Allerdings scheint das bei mir nicht so richtig zu funktionieren.
Als Fehler bekomme ich immer (Nummer: 11004):
Zitat:
Der angeforderte Name ist gültig, es wurden jedoch keine Daten des angeforderten Typs gefunden
Weiß jemand was da schief läuft?
Michael N.
Brainstalker

Geändert von Brainstalker (13. Sep 2010 um 21:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Brainstalker
Brainstalker

Registriert seit: 9. Jan 2004
Ort: Berlin
176 Beiträge
 
Delphi 2009 Professional
 
#4

AW: Bluetooth Server Win32 API

  Alt 14. Sep 2010, 07:35
Der ganze Thread hier ist zwar eher ein Selbstgespräch, aber vielleicht bringt es ja auch anderen Benutzern etwas wenn ich hier meine Gedanken und Fortschritte aufschreibe.

Ich stehe jetzt (hoffentlich) kurz vor einer funktionierenden Verbindung meines Android Handys und dem PC. Ich werde nachher zwei Dinge ausprobieren, ich habe zum einen im Internet noch ein bisschen Source zur Funktion WSASetService gefunden:
Code:
int size = sizeof(SOCKADDR_BTH);

if (0 != getsockname(s, pAddr, &size))
{
printf("%s\n", GetLastErrorMessage(GetLastError()));
}

WSAQUERYSET service;

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

service.dwSize = sizeof(service);

service.lpszServiceInstanceName = "My Service";
service.lpszComment = "My comment";

GUID serviceID = OBEXFileTransferServiceClass_UUID;

service.lpServiceClassId = &serviceID;

service.dwNumberOfCsAddrs = 1;
service.dwNameSpace = NS_BTH;

CSADDR_INFO csAddr;

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

csAddr.LocalAddr.iSockaddrLength = sizeof(SOCKADDR_BTH);
csAddr.LocalAddr.lpSockaddr = pAddr;

csAddr.iSocketType = SOCK_STREAM;
csAddr.iProtocol = BTHPROTO_RFCOMM;

service.lpcsaBuffer = &csAddr;

if (0 != WSASetService(&service, RNRSERVICE_REGISTER, 0))
{
printf("%s\n", GetLastErrorMessage(GetLastError()));
}
und zum anderen liegt es vielleicht daran, das mein Androidprogramm einfach nur eine andere GUID für den Service benutzen muss.
Code:
RFCOMM_PROTOCOL_UUID: TGUID = '{00000003-0000-1000-8000-00805F9B34FB}';
Michael N.
Brainstalker
  Mit Zitat antworten Zitat
Benutzerbild von Brainstalker
Brainstalker

Registriert seit: 9. Jan 2004
Ort: Berlin
176 Beiträge
 
Delphi 2009 Professional
 
#5

AW: Bluetooth Server Win32 API

  Alt 17. Sep 2010, 15:43
Ich bin leider noch nicht viel weiter gekommen. Allerdings ist mir jetzt was aufgefallen.

In der Datei "ws2bth.h" ist die Konstante BT_PORT_ANY als -1 deklariert.
Im Struct SOCKADDR_BTH ist die Variable port als ULONG deklariert.

Es ist doch gar nicht möglich den Wert zuzuweisen oder? Der Compiler meckert ja zurecht das die untere Grenze verletzt wird.

Delphi-Quellcode:
const
  BT_PORT_ANY = -1;

var
  name: SOCKADDR_BTH;

...

name.port := BT_PORT_ANY;
Wie kann ich denn den Wert zuweisen? Scheint ein Fehler zu sein in meinem Code, denn z.Z. benutze ich 0 als Port. In der msdn steht aber man soll BT_PORT_ANY benutzen.
Michael N.
Brainstalker
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz