Bluetooth-Kommunikation

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Michael Vogel
Beiträge: 71
Registriert: 16.03.2006 11:20

Bluetooth-Kommunikation

Beitrag von Michael Vogel »

Ich habe mir ein Entfernungsmessgerät (Bosch PLR50C) gekauft, weil ich in den nächsten Wochen hunderte Distanzen abmessen und in Excel verwalten darf. Das nette Spielzeug hat eine Bluetooth-Schnittstelle und es gibt eine Android App, die weniger nett gemacht ist (Bluetooth-Kopplung funktioniert einmal, ab dem zweiten App-Start geht nichts mehr - macht aber nichts, denn das Programm ist ohnehin nicht sehr hilfreich)...
...für Windows gibt es tatsächlich einen Bluetooth-Treiber, mit dem sich das Messgerät auch verbindet. Damit hat es sich aber, Bosch hat "vergessen", ein kleines Programm zu schreiben, welches empfangene Messwerte anzeigt oder in den Tastaturpuffer kopiert oder was auch immer.

Seht ihr irgendwelche Chancen, den Bluetooth-Treiber anzuzapfen, um an Messwerte 'ranzukommen?

Sobald man irgendwelche Daten einlesen könnte, sollte es nicht mehr so schwierig sein (Datenformat)...
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: Bluetooth-Kommunikation

Beitrag von HeX0R »

Wenn es einen Treiber gibt, erkennt Windows das Gerät zumindest mal.
Kannst Du es hiermit evtl. finden (bzw. da ist noch ne neuere Version etwas weiter hinten)?
Wenn dann noch "AddSerialPortToDevice" funktionieren würde, wäre der Rest ja ein Kinderspiel (denke ich mal).
Michael Vogel
Beiträge: 71
Registriert: 16.03.2006 11:20

Re: Bluetooth-Kommunikation

Beitrag von Michael Vogel »

Kinderspiel :?
Also dein Scanner schaut verdammt gut aus, nach ein bis zwei Rescans wird der Client "Bosch PLR50C x4504" gefunden, und ein "Serial port connected" schaffe ich auch :)

Jetzt finde ich im Device-Manager plötzlich zwei COM-Ports für Bluetooth (COM6 und COM7), das erhöht schon einmal den Schwierigkeitsgrad...

...beide einmal auf gut Glück ausprobiert - man kann sich mit beiden verbinden und bei einer bekomme ich auch schon (irgendwelche) Daten, das könnte noch etwas werden :)

Wär spannend, ob erkennbar ist, welche COM-Schnittstelle mit welchem Treiber verbunden ist...

Code: Alles auswählen


DataSection
	magic:
	Data.a $c0,$55,$02,$01,$00,$1a
EndDataSection

Port$ = "COM7"

#serial=0
If OpenSerialPort(#serial, Port$, 9600, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)

	Debug "SerialPort opened with success"
	
	#timeout=100
	Ok = #False
	
	WriteSerialPortData(#serial,?magic,6)
	
	Timeout = #TimeOut
	Repeat

		If AvailableSerialPortInput(#Serial)
			If ReadSerialPortData(#Serial,@Byte,1)=1
				Debug Hex(byte)
			EndIf
			Delay(1)
		EndIf

	Until 0;Timeout = 0 Or Ok

Debug "closed"

	CloseSerialPort(#Serial)

Else
	Debug "Can't open the serial port: "+Port$
EndIf

Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: Bluetooth-Kommunikation

Beitrag von HeX0R »

Ist es nicht so, dass Du einen COM-Port bekommst, sobald Du Dich verbindest und sobald Du AddSerialPortToDevice ausführst, ein zweiter kommt?
Wenn Du dann weisst, welcher von beiden für Dich nutzbar ist, sollte der Rest nicht so schwer sein.
In einer Windowsanwendung z.B. kannst Du ein Signal in der Eventschleife abfangen und bekommst den COM-Port frei Haus, ich habe das mal für ein Tool gemacht, weil ich wollte, dass das automatisch anfängt zu kommunizieren, sobald ein (USB-)COM-Port eingesteckt wird.
Falls Dich das interessiert, müsste ich mal auf die Suche gehen.

[Edit]
Per SetWindowCallBack() einsetzen:

Code: Alles auswählen

Procedure CallBack_NewDevice(WindowID, Message, wParam, lParam)              ;add/delete live connecting USB devices (windows only)
	Protected Result, a$, F
	Protected *db.DEV_BROADCAST_HDR
	
	Result = #PB_ProcessPureBasicEvents
	Select Message
			
		Case #WM_DEVICECHANGE
			If wParam = #DBT_DEVICEARRIVAL
				*db = lParam
				If *db\dbch_devicetype = #DBT_DEVTYP_PORT
					a$     = PeekS(*db + 12)
					Debug "New COM Port: " + a$
				EndIf
			ElseIf wParam = #DBT_DEVICEREMOVECOMPLETE
				*db = lParam
				If *db\dbch_devicetype = #DBT_DEVTYP_PORT
					a$ = PeekS(*db + 12)
					Debug "COM Port unplugged: " + a$
				EndIf
			EndIf
			
	EndSelect
	
	ProcedureReturn Result
EndProcedure
Michael Vogel
Beiträge: 71
Registriert: 16.03.2006 11:20

Re: Bluetooth-Kommunikation

Beitrag von Michael Vogel »

Danke, ich komme vielleicht noch darauf zurück...
...momentan kämpfe ich mit den Prüfsummen, dann hole ich mir hoffentlich richtige Messwerte - wenn das funkt', nehme ich mir die COMs wieder vor :allright:

Code: Alles auswählen

; Define

	EnableExplicit

	Enumeration
		#Serial
	EndEnumeration

	DataSection
		Magic:;						Initial command
		Data.a $c0,$55,$02,$01,$00,$1a;		Set device as master		($1a=CRC)

		;							Commands after device has been set as bluetooth master (last byte is CRC)
		GetMeasurementCount:
		Data.a $c0,$51,$02,$FF,$FF,$9c;		Get how many measurements are in device memory
		GetMeasurementMemory:
		Data.a $c0,$51,$02,$01,$01,$18;		Get measurement #1
		Data.a $c0,$51,$02,$01,$0a,$80;		Get measurement #10

		InputBuffer:
		Data.a 0,0,0
		Type:
		Data.a 0
		Count:
		Data.w 0
		One:
		Data.a 0
		Distance:
		Data.l 0
		Null:
		Data.l 0,0
		CRC:
		Data.a 0
	EndDataSection

	Global SerialPort.s="COM7"


	#CrcPolynomial=		166
	#CrcSeed=			170

; EndDefine

Procedure.i ByteCRC(byte,crc)

	; http://www.ti.com/lit/an/slua363/slua363.pdf

	Protected bit_mask
	Protected carry_check
	Protected temp_data

	temp_data=byte;

	For bit_mask=0 To 7
		byte!crc
		crc<<1
		temp_data<<1
		carry_check=byte&$80
		If carry_check
			crc!#CrcPolynomial
		EndIf
		byte = temp_data
	Next bit_mask

	ProcedureReturn crc

EndProcedure
Procedure.i DataCRC(*memory,size)

	Protected seed=#CrcSeed

	While size
		seed=ByteCRC(PeekA(*memory),seed)
		size-1
		*memory+1
	Wend

	ProcedureReturn seed

EndProcedure

Debug bytecrc(0,1)
Debug DataCRC(?magic,5)
End
H.Brill
Beiträge: 356
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: Bluetooth-Kommunikation

Beitrag von H.Brill »

Schau mal im Gerätemanager.
Normalerweise ist ein Port für RX und einer für TX,
also Empfangen und Senden.
Muß man evtl. ausprobieren, welcher wofür.
PB 5.60
Michael Vogel
Beiträge: 71
Registriert: 16.03.2006 11:20

Re: Bluetooth-Kommunikation

Beitrag von Michael Vogel »

Hey, schaut inzwischen alles schon ganz gut aus...

...ich bekomme inzwischen Werte von meinem Messgerät, die COM-Schnittstellen kann ich auch relativ schnell im Hintergrund abklopfen (im Gerätemanager sieht man praktisch keine Unterschiede, bei den "Treiberfähigkeiten" hat die funktionierende Schnittstelle das Flag CM_DEVCAP_REMOVABLE gesetzt, das kann aber auch Zufall sein), jetzt (also eher am Wochenende) muss ich nur noch alle Programmteile zusammenfügen...

Danke für deine Unterstützung - eigentlich war's wirklich ein Kinderspiel (komisch, dass der Hersteller so etwas nicht mitliefert...)
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Re: Bluetooth-Kommunikation

Beitrag von nicolaus »

Schade habe es zu spät gesehen sonst hätte ich auch geholfen..
Ich hatte vor vielen Jahren mal für den Motorola RS507 und später auch den RS6000 die entsprechende Widnows Software für damal noch Motorola entwickelt.
Im Endeffekt auch wie bei dir über COM gemacht. Funktioniert super und BT läst sich auch recht einfach unter Windows kontrolieren.

Ich wünsch Dir viel Spaß und erfolg mit deinem Scanner :-)
Antworten