diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d95d91..f2d86c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,12 +4,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) -## [Unreleased] +## [0.6.1] - 2023-03-28 ### Added - Updated simpleble.pas with SimpleBleGetVersion(). - Added output of SimpleBLE version to log on start. +- Added checkbox in vsp terminal to select write command vs. write request (if exposed by peripheral). ### Changed @@ -18,7 +19,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) ### Fixed - Reduced flickering in VSP terminal when receiving large chunks of data. -- Fixed bug when searching VSP which is also an assigned service (didn't show vsp terminal button). +- Fixed bug when searching VSP service which is also an assigned service (didn't show vsp terminal button). ### Removed diff --git a/README.md b/README.md index c533fca..6838ce7 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# InsideBlue BLE Tool V0.6 +# InsideBlue BLE Tool V0.6.1 Welcome to **InsideBlue BLE Tool**, an easy to use cross-platform application for Bluetooth Low-Energy (BLE) connectivity leveraging the PC’s integrated Bluetooth adapter. You can scan for BLE devices that are advertising and discover their GAP services or manufacturer specific data, engage a connection and access the peripheral GATT table. @@ -65,6 +65,9 @@ Beside the mandatory TX (from peripheral to central) and RX (from central to per ### Length of RX Characteristic The length of the peripheral RX characteristic is not known to the central, hence when sending text lines with too many characters, the BLE write operation will fail. +### WriteCommand/WriteRequest +Depending on the write properties of the RX characteristic you can select to use write request or write command, if both are exposed. + ## Pairing Devices On operating systems, initiating a connection procedure will automatically run pairing if necessary. This process is entirely managed by the operating system, there isn't much that we can do from the user side. diff --git a/src/connect.pas b/src/connect.pas index cd94625..4ba7732 100644 --- a/src/connect.pas +++ b/src/connect.pas @@ -72,7 +72,7 @@ TCharDescData = record { Device data we need during an active device connection } TBleConnectData = record - ScnIdx: integer; + ScnIdx: integer; PeripheralHandle: TSimpleBlePeripheral; DeviceName: String; MacAddress: String; @@ -83,6 +83,8 @@ TBleConnectData = record IsConnected: Boolean; IsPaired: Boolean; HasVspService: Boolean; + HasVspWriteCmd: Boolean; + HasVspWriteReq: Boolean; NotIndActiveCnt: array of Integer; AttMtuSize: Integer; end; @@ -168,6 +170,7 @@ procedure ConnectDevice(DevName: string; MacAddr: string; PerHandle: TSimpleBleP Buffer: array of Byte; ChData: PByte; ChLen: NativeUInt; + FlagVspChar: Boolean; begin SetLength(Buffer, CharDescMaxLength); ChData := PByte(Buffer); @@ -300,7 +303,6 @@ procedure ConnectDevice(DevName: string; MacAddr: string; PerHandle: TSimpleBleP DeviceFormElements[i].LabelServiceUuid[SvIdx].Hint := s; end; if BleConnectData[i].HasVspService then begin - UtilLog('HasVspService'); DeviceFormElements[i].ButtonVspTerminal[SvIdx] := TButton.Create(DeviceForm[i]); DeviceFormElements[i].ButtonVspTerminal[SvIdx].Parent := DeviceFormElements[i].Panel[SvIdx]; DeviceFormElements[i].ButtonVspTerminal[SvIdx].Tag := (i shl TagPosDev) or (SvIdx shl TagPosSrv); @@ -325,15 +327,18 @@ procedure ConnectDevice(DevName: string; MacAddr: string; PerHandle: TSimpleBleP for ChIdx := 0 to BleConnectData[i].Services[SvIdx].CharacteristicCount-1 do begin SetLength(BleConnectData[i].Characteristic[SvIdx][ChIdx].data, CharDescMaxLength); SetString(s, BleConnectData[i].Services[SvIdx].Characteristics[ChIdx].Uuid.Value, SIMPLEBLE_UUID_STR_LEN-1); - n := BleAssignedCharacteristicUuidToName(BleConnectData[i].Services[SvIdx].Characteristics[ChIdx].Uuid); + n := BleVspCharacteristicUuidToName(BleConnectData[i].Services[SvIdx].Characteristics[ChIdx].Uuid); + FlagVspChar := false; if n = '' then begin - n := BleVspCharacteristicUuidToName(BleConnectData[i].Services[SvIdx].Characteristics[ChIdx].Uuid); - if n = '' then // neither assigned service nor vsp service + n := BleAssignedCharacteristicUuidToName(BleConnectData[i].Services[SvIdx].Characteristics[ChIdx].Uuid); + if n = '' then // neither assigned characteristic nor vsp characteristic UtilLog(' CH: ' + s) - else // vsp service + else // assigned characteristic UtilLog(' CH: ' + s + ' (' + n + ')'); - end else // assigned service + end else begin // vsp characteristic UtilLog(' CH: ' + s + ' (' + n + ')'); + FlagVspChar := true; + end; DeviceFormElements[i].LabelCharacteristicUuid[SvIdx][ChIdx] := TLabel.Create(DeviceForm[i]); DeviceFormElements[i].LabelCharacteristicUuid[SvIdx][ChIdx].Parent := DeviceFormElements[i].Panel[SvIdx]; @@ -411,6 +416,8 @@ procedure ConnectDevice(DevName: string; MacAddr: string; PerHandle: TSimpleBleP DeviceFormElements[i].ToggleBoxCharProp[SvIdx][ChIdx][CanWriteCommand].OnChange := @DeviceForm[i].ButtonCharWriteCommand; NextButtonCoord := NextButtonCoord + 4*DeviceFormPaddingHorizontal + FormElementsExtraWidth + DeviceFormPropPadding; DeviceFormElements[i].TextBoxCharacteristic[SvIdx][ChIdx].OnEditingDone := @DeviceForm[i].CharEditingDone; + if FlagVspChar then + BleConnectData[i].HasVspWriteCmd := True; end; if BleConnectData[i].Services[SvIdx].Characteristics[ChIdx].CanWriteRequest then begin DeviceFormElements[i].TextBoxCharacteristic[SvIdx][ChIdx].ReadOnly := false; @@ -426,6 +433,8 @@ procedure ConnectDevice(DevName: string; MacAddr: string; PerHandle: TSimpleBleP DeviceFormElements[i].ToggleBoxCharProp[SvIdx][ChIdx][CanWriteRequest].OnChange := @DeviceForm[i].ButtonCharWriteRequest; NextButtonCoord := NextButtonCoord + 4*DeviceFormPaddingHorizontal + FormElementsExtraWidth + DeviceFormPropPadding; DeviceFormElements[i].TextBoxCharacteristic[SvIdx][ChIdx].OnEditingDone := @DeviceForm[i].CharEditingDone; + if FlagVspChar then + BleConnectData[i].HasVspWriteReq := True; end; if BleConnectData[i].Services[SvIdx].Characteristics[ChIdx].CanNotify then begin DeviceFormElements[i].ToggleBoxCharProp[SvIdx][ChIdx][CanNotify] := TToggleBox.Create(DeviceForm[i]); @@ -586,7 +595,13 @@ procedure TDeviceForm.ButtonVspTerminalClick(Sender: TObject); DeviceFormElements[DeIdx].Panel[SvIdx].Enabled := false; - UartTerminalStart(BleConnectData[DeIdx].PeripheralHandle, BleConnectData[DeIdx].DeviceName, BleConnectData[DeIdx].MacAddress, BleConnectData[DeIdx].Services[SvIdx].Uuid, DeviceFormElements[DeIdx].Panel[SvIdx]); + UartTerminalStart(BleConnectData[DeIdx].PeripheralHandle, + BleConnectData[DeIdx].DeviceName, + BleConnectData[DeIdx].MacAddress, + BleConnectData[DeIdx].Services[SvIdx].Uuid, + BleConnectData[DeIdx].HasVspWriteCmd, + BleConnectData[DeIdx].HasVspWriteReq, + DeviceFormElements[DeIdx].Panel[SvIdx]); end; diff --git a/src/help/help.rtf b/src/help/help.rtf index 93a5f64..f7d4463 100644 --- a/src/help/help.rtf +++ b/src/help/help.rtf @@ -1,7 +1,10 @@ {\rtf1\ansi\deff3\adeflang1025 -{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\froman\fprq2\fcharset2 Symbol;}{\f2\fswiss\fprq2\fcharset0 Arial;}{\f3\froman\fprq2\fcharset0 Liberation Serif{\*\falt Times New Roman};}{\f4\froman\fprq2\fcharset0 OpenSymbol{\*\falt Arial Unicode MS};}{\f5\froman\fprq2\fcharset0 Liberation Sans{\*\falt Arial};}{\f6\froman\fprq2\fcharset0 Calibri;}{\f7\fnil\fprq2\fcharset0 Times New Roman;}{\f8\fnil\fprq2\fcharset0 Microsoft YaHei;}{\f9\fnil\fprq2\fcharset0 Lucida Sans;}} -{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\red5\green99\blue193;\red96\green94\blue92;\red0\green128\blue255;\red225\green223\blue221;} -{\stylesheet{\s0\snext0\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\ql\widctlpar\hyphpar0\faauto\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052 Normal;} +{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\froman\fprq2\fcharset2 Symbol;}{\f2\fswiss\fprq2\fcharset0 Arial;}{\f3\froman\fprq2\fcharset0 Liberation Serif{\*\falt Times New Roman};}{\f4\fswiss\fprq2\fcharset0 Liberation Sans{\*\falt Arial};}{\f5\froman\fprq2\fcharset0 OpenSymbol{\*\falt Arial Unicode MS};}{\f6\froman\fprq2\fcharset0 Liberation Sans{\*\falt Arial};}{\f7\froman\fprq2\fcharset0 Calibri;}{\f8\fnil\fprq2\fcharset0 Microsoft YaHei;}{\f9\fnil\fprq2\fcharset0 Times New Roman;}{\f10\fnil\fprq2\fcharset0 Lucida Sans;}} +{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\red96\green94\blue92;\red5\green99\blue193;\red0\green128\blue255;\red225\green223\blue221;} +{\stylesheet{\s0\snext0\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\ql\widctlpar\hyphpar0\faauto\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052 Normal;} +{\s2\sbasedon371\snext372\rtlch\af10\afs32\alang1081\ab \ltrch\lang1031\langfe2052\hich\af6\loch\ilvl1\outlinelevel1\ql\widctlpar\hyphpar0\faauto\sb200\sa120\keepn\ltrpar\cf0\f6\fs32\lang1031\b\kerning1\dbch\af8\langfe2052 \u220\'dcberschrift 2;} +{\s3\sbasedon371\snext372\rtlch\af10\afs28\alang1081\ab \ltrch\lang1031\langfe2052\hich\af6\loch\ilvl2\outlinelevel2\ql\widctlpar\hyphpar0\faauto\sb140\sa120\keepn\ltrpar\cf0\f6\fs28\lang1031\b\kerning1\dbch\af8\langfe2052 \u220\'dcberschrift 3;} +{\s4\sbasedon371\snext4\rtlch\af10\afs26\alang1081\ai\ab \ltrch\lang1031\langfe2052\hich\af4\loch\ql\widctlpar\hyphpar0\faauto\sb120\sa120\keepn\ltrpar\cf0\f4\fs26\lang1031\i\b\kerning1\dbch\af8\langfe2052 \u220\'dcberschrift 4;} {\*\cs15\snext15 Default Paragraph Font;} {\*\cs16\snext16 ListLabel 1;} {\*\cs17\snext17 ListLabel 2;} @@ -59,7 +62,7 @@ {\*\cs69\snext69 ListLabel 54;} {\*\cs70\snext70\loch\cf9\lang255\ul\ulc0\dbch\langfe255 Internetverkn\u252\'fcfcfcpfung;} {\*\cs71\snext71\loch\b Stark betont;} -{\*\cs72\snext72\hich\af4\loch\f4 ListLabel 55;} +{\*\cs72\snext72\hich\af5\loch\f5 ListLabel 55;} {\*\cs73\snext73 ListLabel 56;} {\*\cs74\snext74 ListLabel 57;} {\*\cs75\snext75 ListLabel 58;} @@ -203,17 +206,17 @@ {\*\cs213\snext213 ListLabel 196;} {\*\cs214\snext214 ListLabel 197;} {\*\cs215\snext215 ListLabel 198;} -{\*\cs216\sbasedon15\snext216\rtlch\af7 \ltrch\hich\af0\loch\cf17\f0\ul\ulc0 Internetverkn\u252\'fcpfung;} -{\*\cs217\sbasedon15\snext217\rtlch\af7 \ltrch\hich\af0\loch\cf18\f0\chcbpat20 Unresolved Mention;} -{\*\cs218\snext218\rtlch\af7 \ltrch ListLabel 199;} -{\*\cs219\snext219\rtlch\af7 \ltrch ListLabel 200;} -{\*\cs220\snext220\rtlch\af7 \ltrch ListLabel 201;} -{\*\cs221\snext221\rtlch\af7 \ltrch ListLabel 202;} -{\*\cs222\snext222\rtlch\af7 \ltrch ListLabel 203;} -{\*\cs223\snext223\rtlch\af7 \ltrch ListLabel 204;} -{\*\cs224\snext224\rtlch\af7 \ltrch ListLabel 205;} -{\*\cs225\snext225\rtlch\af7 \ltrch ListLabel 206;} -{\*\cs226\snext226\rtlch\af7 \ltrch ListLabel 207;} +{\*\cs216\sbasedon15\snext216\rtlch\af9 \ltrch\hich\af0\loch\cf18\f0\ul\ulc0 Internetverkn\u252\'fcpfung;} +{\*\cs217\sbasedon15\snext217\rtlch\af9 \ltrch\hich\af0\loch\cf17\f0\chcbpat20 Unresolved Mention;} +{\*\cs218\snext218\rtlch\af9 \ltrch ListLabel 199;} +{\*\cs219\snext219\rtlch\af9 \ltrch ListLabel 200;} +{\*\cs220\snext220\rtlch\af9 \ltrch ListLabel 201;} +{\*\cs221\snext221\rtlch\af9 \ltrch ListLabel 202;} +{\*\cs222\snext222\rtlch\af9 \ltrch ListLabel 203;} +{\*\cs223\snext223\rtlch\af9 \ltrch ListLabel 204;} +{\*\cs224\snext224\rtlch\af9 \ltrch ListLabel 205;} +{\*\cs225\snext225\rtlch\af9 \ltrch ListLabel 206;} +{\*\cs226\snext226\rtlch\af9 \ltrch ListLabel 207;} {\*\cs227\snext227 ListLabel 208;} {\*\cs228\snext228 ListLabel 209;} {\*\cs229\snext229 ListLabel 210;} @@ -223,15 +226,15 @@ {\*\cs233\snext233 ListLabel 214;} {\*\cs234\snext234 ListLabel 215;} {\*\cs235\snext235 ListLabel 216;} -{\*\cs236\snext236\rtlch\af7\ab0 \ltrch\loch\b0 ListLabel 217;} -{\*\cs237\snext237\rtlch\af7 \ltrch ListLabel 218;} -{\*\cs238\snext238\rtlch\af7 \ltrch ListLabel 219;} -{\*\cs239\snext239\rtlch\af7 \ltrch ListLabel 220;} -{\*\cs240\snext240\rtlch\af7 \ltrch ListLabel 221;} -{\*\cs241\snext241\rtlch\af7 \ltrch ListLabel 222;} -{\*\cs242\snext242\rtlch\af7 \ltrch ListLabel 223;} -{\*\cs243\snext243\rtlch\af7 \ltrch ListLabel 224;} -{\*\cs244\snext244\rtlch\af7 \ltrch ListLabel 225;} +{\*\cs236\snext236\rtlch\af9\ab0 \ltrch\loch\b0 ListLabel 217;} +{\*\cs237\snext237\rtlch\af9 \ltrch ListLabel 218;} +{\*\cs238\snext238\rtlch\af9 \ltrch ListLabel 219;} +{\*\cs239\snext239\rtlch\af9 \ltrch ListLabel 220;} +{\*\cs240\snext240\rtlch\af9 \ltrch ListLabel 221;} +{\*\cs241\snext241\rtlch\af9 \ltrch ListLabel 222;} +{\*\cs242\snext242\rtlch\af9 \ltrch ListLabel 223;} +{\*\cs243\snext243\rtlch\af9 \ltrch ListLabel 224;} +{\*\cs244\snext244\rtlch\af9 \ltrch ListLabel 225;} {\*\cs245\snext245 ListLabel 226;} {\*\cs246\snext246 ListLabel 227;} {\*\cs247\snext247 ListLabel 228;} @@ -250,15 +253,15 @@ {\*\cs260\snext260 ListLabel 241;} {\*\cs261\snext261 ListLabel 242;} {\*\cs262\snext262 ListLabel 243;} -{\*\cs263\snext263\rtlch\af7\ab0 \ltrch\loch\b0 ListLabel 244;} -{\*\cs264\snext264\rtlch\af7 \ltrch ListLabel 245;} -{\*\cs265\snext265\rtlch\af7 \ltrch ListLabel 246;} -{\*\cs266\snext266\rtlch\af7 \ltrch ListLabel 247;} -{\*\cs267\snext267\rtlch\af7 \ltrch ListLabel 248;} -{\*\cs268\snext268\rtlch\af7 \ltrch ListLabel 249;} -{\*\cs269\snext269\rtlch\af7 \ltrch ListLabel 250;} -{\*\cs270\snext270\rtlch\af7 \ltrch ListLabel 251;} -{\*\cs271\snext271\rtlch\af7 \ltrch ListLabel 252;} +{\*\cs263\snext263\rtlch\af9\ab0 \ltrch\loch\b0 ListLabel 244;} +{\*\cs264\snext264\rtlch\af9 \ltrch ListLabel 245;} +{\*\cs265\snext265\rtlch\af9 \ltrch ListLabel 246;} +{\*\cs266\snext266\rtlch\af9 \ltrch ListLabel 247;} +{\*\cs267\snext267\rtlch\af9 \ltrch ListLabel 248;} +{\*\cs268\snext268\rtlch\af9 \ltrch ListLabel 249;} +{\*\cs269\snext269\rtlch\af9 \ltrch ListLabel 250;} +{\*\cs270\snext270\rtlch\af9 \ltrch ListLabel 251;} +{\*\cs271\snext271\rtlch\af9 \ltrch ListLabel 252;} {\*\cs272\snext272 ListLabel 253;} {\*\cs273\snext273 ListLabel 254;} {\*\cs274\snext274 ListLabel 255;} @@ -286,54 +289,106 @@ {\*\cs296\snext296 ListLabel 277;} {\*\cs297\snext297 ListLabel 278;} {\*\cs298\snext298 ListLabel 279;} -{\s299\sbasedon0\snext300\rtlch\af9\afs28\alang1081 \ltrch\lang1031\langfe2052\hich\af5\loch\ql\widctlpar\hyphpar0\faauto\sb240\sa120\keepn\ltrpar\cf0\f5\fs28\lang1031\kerning1\dbch\af8\langfe2052 \u220\'dcberschrift;} -{\s300\sbasedon0\snext300\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052 Textk\u246\'f6rper;} -{\s301\sbasedon300\snext301\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052 Aufz\u228\'e4hlung;} -{\s302\sbasedon0\snext302\rtlch\af9\afs24\alang1081\ai \ltrch\lang1031\langfe2052\hich\af3\loch\ql\widctlpar\hyphpar0\faauto\sb120\sa120\ltrpar\cf0\f3\fs24\lang1031\i\kerning1\dbch\af7\langfe2052 Beschriftung;} -{\s303\sbasedon0\snext303\rtlch\af9\afs24\alang1025 \ltrch\lang255\langfe255\hich\af3\loch\ql\widctlpar\hyphpar0\faauto\ltrpar\cf0\f3\fs24\lang255\kerning1\dbch\af7\langfe255 Verzeichnis;} -{\s304\snext304\rtlch\af7\afs22\alang1025 \ltrch\lang1031\langfe1031\hich\af6\loch\sl254\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa160\ltrpar\cf0\f6\fs22\lang1031\kerning1\dbch\af7\langfe1031 Normal Table;} -{\s305\snext305\rtlch\af9\afs26\alang1081\ai\ab \ltrch\lang1031\langfe2052\hich\af5\loch\ql\nowidctlpar\hyphpar0\sb120\sa120\keepn\ltrpar\cf0\f5\fs26\lang1031\i\b\kerning1\dbch\af8\langfe2052 \u220\'dcdcberschrift 4;} -{\s306\sbasedon0\snext306\rtlch\af9\afs28\alang1081 \ltrch\lang1031\langfe2052\hich\af5\loch\ql\widctlpar\hyphpar0\faauto\sb240\sa120\keepn\ltrpar\cf0\f5\fs28\lang1031\kerning1\dbch\af8\langfe2052 \u220\'dcdcberschrift;} -{\s307\sbasedon0\snext307\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052 Textk\u246\'f6f6rper;} -{\s308\sbasedon307\snext308\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052 Aufz\u228\'e4e4hlung;} -{\s309\snext309\rtlch\af9\afs36\alang1081\ab \ltrch\lang1031\langfe2052\hich\af5\loch\ql\nowidctlpar\hyphpar0\faauto\sb240\sa120\keepn\ltrpar\cf0\f5\fs36\lang1031\b\kerning1\dbch\af8\langfe2052 \u220\'dcdcdcberschrift 1;} -{\s310\snext310\rtlch\af9\afs32\alang1081\ab \ltrch\lang1031\langfe2052\hich\af5\loch\ql\nowidctlpar\hyphpar0\faauto\sb200\sa120\keepn\ltrpar\cf0\f5\fs32\lang1031\b\kerning1\dbch\af8\langfe2052 \u220\'dcdcdcberschrift 2;} -{\s311\snext311\rtlch\af9\afs28\alang1081\ab \ltrch\lang1031\langfe2052\hich\af5\loch\ql\nowidctlpar\hyphpar0\faauto\sb140\sa120\keepn\ltrpar\cf0\f5\fs28\lang1031\b\kerning1\dbch\af8\langfe2052 \u220\'dcdcdcberschrift 3;} -{\s312\snext312\rtlch\af9\afs26\alang1081\ai\ab \ltrch\lang1031\langfe2052\hich\af5\loch\ql\nowidctlpar\hyphpar0\faauto\sb120\sa120\keepn\ltrpar\cf0\f5\fs26\lang1031\i\b\kerning1\dbch\af8\langfe2052 \u220\'dcdcdcberschrift 4;} -{\s313\sbasedon0\snext313\rtlch\af9\afs28\alang1081 \ltrch\lang1031\langfe2052\hich\af5\loch\ql\widctlpar\hyphpar0\faauto\sb240\sa120\keepn\ltrpar\cf0\f5\fs28\lang1031\kerning1\dbch\af8\langfe2052 \u220\'dcdcdcberschrift;} -{\s314\sbasedon0\snext314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052 Textk\u246\'f6f6f6rper;} -{\s315\sbasedon314\snext315\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052 Aufz\u228\'e4e4e4hlung;} +{\*\cs299\snext299\rtlch\af9\ab0 \ltrch\loch\b0 ListLabel 280;} +{\*\cs300\snext300\rtlch\af9 \ltrch ListLabel 281;} +{\*\cs301\snext301\rtlch\af9 \ltrch ListLabel 282;} +{\*\cs302\snext302\rtlch\af9 \ltrch ListLabel 283;} +{\*\cs303\snext303\rtlch\af9 \ltrch ListLabel 284;} +{\*\cs304\snext304\rtlch\af9 \ltrch ListLabel 285;} +{\*\cs305\snext305\rtlch\af9 \ltrch ListLabel 286;} +{\*\cs306\snext306\rtlch\af9 \ltrch ListLabel 287;} +{\*\cs307\snext307\rtlch\af9 \ltrch ListLabel 288;} +{\*\cs308\snext308 ListLabel 289;} +{\*\cs309\snext309 ListLabel 290;} +{\*\cs310\snext310 ListLabel 291;} +{\*\cs311\snext311 ListLabel 292;} +{\*\cs312\snext312 ListLabel 293;} +{\*\cs313\snext313 ListLabel 294;} +{\*\cs314\snext314 ListLabel 295;} +{\*\cs315\snext315 ListLabel 296;} +{\*\cs316\snext316 ListLabel 297;} +{\*\cs317\snext317 ListLabel 298;} +{\*\cs318\snext318 ListLabel 299;} +{\*\cs319\snext319 ListLabel 300;} +{\*\cs320\snext320 ListLabel 301;} +{\*\cs321\snext321 ListLabel 302;} +{\*\cs322\snext322 ListLabel 303;} +{\*\cs323\snext323 ListLabel 304;} +{\*\cs324\snext324 ListLabel 305;} +{\*\cs325\snext325 ListLabel 306;} +{\*\cs326\snext326 ListLabel 307;} +{\*\cs327\snext327 ListLabel 308;} +{\*\cs328\snext328 ListLabel 309;} +{\*\cs329\snext329 ListLabel 310;} +{\*\cs330\snext330 ListLabel 311;} +{\*\cs331\snext331 ListLabel 312;} +{\*\cs332\snext332 ListLabel 313;} +{\*\cs333\snext333 ListLabel 314;} +{\*\cs334\snext334 ListLabel 315;} +{\*\cs335\snext335 ListLabel 316;} +{\*\cs336\snext336 ListLabel 317;} +{\*\cs337\snext337 ListLabel 318;} +{\*\cs338\snext338 ListLabel 319;} +{\*\cs339\snext339 ListLabel 320;} +{\*\cs340\snext340 ListLabel 321;} +{\*\cs341\snext341 ListLabel 322;} +{\*\cs342\snext342 ListLabel 323;} +{\*\cs343\snext343 ListLabel 324;} +{\*\cs344\snext344\rtlch\af9\ab0 \ltrch\loch\b0 ListLabel 325;} +{\*\cs345\snext345\rtlch\af9 \ltrch ListLabel 326;} +{\*\cs346\snext346\rtlch\af9 \ltrch ListLabel 327;} +{\*\cs347\snext347\rtlch\af9 \ltrch ListLabel 328;} +{\*\cs348\snext348\rtlch\af9 \ltrch ListLabel 329;} +{\*\cs349\snext349\rtlch\af9 \ltrch ListLabel 330;} +{\*\cs350\snext350\rtlch\af9 \ltrch ListLabel 331;} +{\*\cs351\snext351\rtlch\af9 \ltrch ListLabel 332;} +{\*\cs352\snext352\rtlch\af9 \ltrch ListLabel 333;} +{\*\cs353\snext353 ListLabel 334;} +{\*\cs354\snext354 ListLabel 335;} +{\*\cs355\snext355 ListLabel 336;} +{\*\cs356\snext356 ListLabel 337;} +{\*\cs357\snext357 ListLabel 338;} +{\*\cs358\snext358 ListLabel 339;} +{\*\cs359\snext359 ListLabel 340;} +{\*\cs360\snext360 ListLabel 341;} +{\*\cs361\snext361 ListLabel 342;} +{\*\cs362\snext362 ListLabel 343;} +{\*\cs363\snext363 ListLabel 344;} +{\*\cs364\snext364 ListLabel 345;} +{\*\cs365\snext365 ListLabel 346;} +{\*\cs366\snext366 ListLabel 347;} +{\*\cs367\snext367 ListLabel 348;} +{\*\cs368\snext368 ListLabel 349;} +{\*\cs369\snext369 ListLabel 350;} +{\*\cs370\snext370 ListLabel 351;} +{\s371\sbasedon0\snext372\rtlch\af10\afs28\alang1081 \ltrch\lang1031\langfe2052\hich\af6\loch\ql\widctlpar\hyphpar0\faauto\sb240\sa120\keepn\ltrpar\cf0\f6\fs28\lang1031\kerning1\dbch\af8\langfe2052 \u220\'dcberschrift;} +{\s372\sbasedon0\snext372\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052 Textk\u246\'f6rper;} +{\s373\sbasedon372\snext373\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052 Aufz\u228\'e4hlung;} +{\s374\sbasedon0\snext374\rtlch\af10\afs24\alang1081\ai \ltrch\lang1031\langfe2052\hich\af3\loch\ql\widctlpar\hyphpar0\faauto\sb120\sa120\ltrpar\cf0\f3\fs24\lang1031\i\kerning1\dbch\af9\langfe2052 Beschriftung;} +{\s375\sbasedon0\snext375\rtlch\af10\afs24\alang1025 \ltrch\lang255\langfe255\hich\af3\loch\ql\widctlpar\hyphpar0\faauto\ltrpar\cf0\f3\fs24\lang255\kerning1\dbch\af9\langfe255 Verzeichnis;} +{\s376\snext376\rtlch\af9\afs22\alang1025 \ltrch\lang1031\langfe1031\hich\af7\loch\sl252\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa160\ltrpar\cf0\f7\fs22\lang1031\kerning1\dbch\af9\langfe1031 Normal Table;} +{\s377\snext377\rtlch\af10\afs26\alang1081\ai\ab \ltrch\lang1031\langfe2052\hich\af6\loch\ql\nowidctlpar\hyphpar0\sb120\sa120\keepn\ltrpar\cf0\f6\fs26\lang1031\i\b\kerning1\dbch\af8\langfe2052 \u220\'dcdcberschrift 4;} +{\s378\sbasedon0\snext378\rtlch\af10\afs28\alang1081 \ltrch\lang1031\langfe2052\hich\af6\loch\ql\widctlpar\hyphpar0\faauto\sb240\sa120\keepn\ltrpar\cf0\f6\fs28\lang1031\kerning1\dbch\af8\langfe2052 \u220\'dcdcberschrift;} +{\s379\sbasedon0\snext379\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052 Textk\u246\'f6f6rper;} +{\s380\sbasedon379\snext380\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052 Aufz\u228\'e4e4hlung;} +{\s381\snext381\rtlch\af10\afs36\alang1081\ab \ltrch\lang1031\langfe2052\hich\af6\loch\ql\nowidctlpar\hyphpar0\faauto\sb240\sa120\keepn\ltrpar\cf0\f6\fs36\lang1031\b\kerning1\dbch\af8\langfe2052 \u220\'dcdcdcberschrift 1;} +{\s382\snext382\rtlch\af10\afs32\alang1081\ab \ltrch\lang1031\langfe2052\hich\af6\loch\ql\nowidctlpar\hyphpar0\faauto\sb200\sa120\keepn\ltrpar\cf0\f6\fs32\lang1031\b\kerning1\dbch\af8\langfe2052 \u220\'dcdcdcberschrift 2;} +{\s383\snext383\rtlch\af10\afs28\alang1081\ab \ltrch\lang1031\langfe2052\hich\af6\loch\ql\nowidctlpar\hyphpar0\faauto\sb140\sa120\keepn\ltrpar\cf0\f6\fs28\lang1031\b\kerning1\dbch\af8\langfe2052 \u220\'dcdcdcberschrift 3;} +{\s384\snext384\rtlch\af10\afs26\alang1081\ai\ab \ltrch\lang1031\langfe2052\hich\af6\loch\ql\nowidctlpar\hyphpar0\faauto\sb120\sa120\keepn\ltrpar\cf0\f6\fs26\lang1031\i\b\kerning1\dbch\af8\langfe2052 \u220\'dcdcdcberschrift 4;} +{\s385\sbasedon0\snext385\rtlch\af10\afs28\alang1081 \ltrch\lang1031\langfe2052\hich\af6\loch\ql\widctlpar\hyphpar0\faauto\sb240\sa120\keepn\ltrpar\cf0\f6\fs28\lang1031\kerning1\dbch\af8\langfe2052 \u220\'dcdcdcberschrift;} +{\s386\sbasedon0\snext386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052 Textk\u246\'f6f6f6rper;} +{\s387\sbasedon386\snext387\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052 Aufz\u228\'e4e4e4hlung;} }{\*\listtable{\list\listtemplateid1 -{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'02\'00.;}{\levelnumbers\'01;}\rtlch\af7\ab0 \ltrch\loch\b0\loch\fi-360\li720} -{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'02\'01.;}{\levelnumbers\'01;}\rtlch\af7 \ltrch\loch\fi-360\li1440} -{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'02\'02.;}{\levelnumbers\'01;}\rtlch\af7 \ltrch\loch\fi-360\li2160} -{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'02\'03.;}{\levelnumbers\'01;}\rtlch\af7 \ltrch\loch\fi-360\li2880} -{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'02\'04.;}{\levelnumbers\'01;}\rtlch\af7 \ltrch\loch\fi-360\li3600} -{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'02\'05.;}{\levelnumbers\'01;}\rtlch\af7 \ltrch\loch\fi-360\li4320} -{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'02\'06.;}{\levelnumbers\'01;}\rtlch\af7 \ltrch\loch\fi-360\li5040} -{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'02\'07.;}{\levelnumbers\'01;}\rtlch\af7 \ltrch\loch\fi-360\li5760} -{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'02\'08.;}{\levelnumbers\'01;}\rtlch\af7 \ltrch\loch\fi-360\li6480}\listid1} +{\listlevel\levelnfc255\leveljc0\levelstartat1\levelfollow2{\leveltext \'00;}{\levelnumbers;}\fi0\li0} +{\listlevel\levelnfc255\leveljc0\levelstartat1\levelfollow2{\leveltext \'00;}{\levelnumbers;}\fi0\li0} +{\listlevel\levelnfc255\leveljc0\levelstartat1\levelfollow2{\leveltext \'00;}{\levelnumbers;}\fi0\li0} +{\listlevel\levelnfc255\leveljc0\levelstartat1\levelfollow2{\leveltext \'00;}{\levelnumbers;}\fi0\li0} +{\listlevel\levelnfc255\leveljc0\levelstartat1\levelfollow2{\leveltext \'00;}{\levelnumbers;}\fi0\li0} +{\listlevel\levelnfc255\leveljc0\levelstartat1\levelfollow2{\leveltext \'00;}{\levelnumbers;}\fi0\li0} +{\listlevel\levelnfc255\leveljc0\levelstartat1\levelfollow2{\leveltext \'00;}{\levelnumbers;}\fi0\li0} +{\listlevel\levelnfc255\leveljc0\levelstartat1\levelfollow2{\leveltext \'00;}{\levelnumbers;}\fi0\li0} +{\listlevel\levelnfc255\leveljc0\levelstartat1\levelfollow2{\leveltext \'00;}{\levelnumbers;}\fi0\li0}\listid1} {\list\listtemplateid2 -{\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61623 ?;}{\levelnumbers;}\f1\fi-360\li720} -{\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u111 ?;}{\levelnumbers;}\f10\fi-360\li1440} -{\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f10\fi-360\li2160} -{\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61623 ?;}{\levelnumbers;}\f1\fi-360\li2880} -{\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u111 ?;}{\levelnumbers;}\f10\fi-360\li3600} -{\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f10\fi-360\li4320} -{\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61623 ?;}{\levelnumbers;}\f1\fi-360\li5040} -{\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u111 ?;}{\levelnumbers;}\f10\fi-360\li5760} -{\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f10\fi-360\li6480}\listid2} -{\list\listtemplateid3 -{\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61623 ?;}{\levelnumbers;}\f1\fi-360\li720} -{\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u9702 ?;}{\levelnumbers;}\f10\fi-360\li1080} -{\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u9642 ?;}{\levelnumbers;}\f10\fi-360\li1440} -{\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u8226 ?;}{\levelnumbers;}\f10\fi-360\li1800} -{\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u9702 ?;}{\levelnumbers;}\f10\fi-360\li2160} -{\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u9642 ?;}{\levelnumbers;}\f10\fi-360\li2520} -{\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u8226 ?;}{\levelnumbers;}\f10\fi-360\li2880} -{\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u9702 ?;}{\levelnumbers;}\f10\fi-360\li3240} -{\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u9642 ?;}{\levelnumbers;}\f10\fi-360\li3600}\listid3} -{\list\listtemplateid4 {\listlevel\levelnfc255\leveljc0\levelstartat1\levelfollow2{\leveltext \'00;}{\levelnumbers;}\fi0\li0} {\listlevel\levelnfc255\leveljc0\levelstartat1\levelfollow2{\leveltext \'00;}{\levelnumbers;}\fi0\li0} {\listlevel\levelnfc255\leveljc0\levelstartat1\levelfollow2{\leveltext \'00;}{\levelnumbers;}\fi0\li0} @@ -342,141 +397,175 @@ {\listlevel\levelnfc255\leveljc0\levelstartat1\levelfollow2{\leveltext \'00;}{\levelnumbers;}\fi0\li0} {\listlevel\levelnfc255\leveljc0\levelstartat1\levelfollow2{\leveltext \'00;}{\levelnumbers;}\fi0\li0} {\listlevel\levelnfc255\leveljc0\levelstartat1\levelfollow2{\leveltext \'00;}{\levelnumbers;}\fi0\li0} -{\listlevel\levelnfc255\leveljc0\levelstartat1\levelfollow2{\leveltext \'00;}{\levelnumbers;}\fi0\li0}\listid4} -}{\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}{\listoverride\listid2\listoverridecount0\ls2}{\listoverride\listid3\listoverridecount0\ls3}{\listoverride\listid4\listoverridecount0\ls4}}{\*\generator LibreOffice/7.3.6.2$Windows_X86_64 LibreOffice_project/c28ca90fd6e1a19e189fc16c05f8f8924961e12e}{\info{\creatim\yr2023\mo2\dy9\hr16\min55}{\revtim\yr2023\mo3\dy10\hr9\min34}{\printim\yr0\mo0\dy0\hr0\min0}}{\*\userprops{\propname Operator}\proptype30{\staticval Flo}}\deftab709\deftab709\deftab709\deftab709\deftab709\deftab709\deftab709 +{\listlevel\levelnfc255\leveljc0\levelstartat1\levelfollow2{\leveltext \'00;}{\levelnumbers;}\fi0\li0}\listid2} +{\list\listtemplateid3 +{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'02\'00.;}{\levelnumbers\'01;}\rtlch\af9\ab0 \ltrch\loch\b0\loch\fi-360\li720} +{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'02\'01.;}{\levelnumbers\'01;}\rtlch\af9 \ltrch\loch\fi-360\li1440} +{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'02\'02.;}{\levelnumbers\'01;}\rtlch\af9 \ltrch\loch\fi-360\li2160} +{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'02\'03.;}{\levelnumbers\'01;}\rtlch\af9 \ltrch\loch\fi-360\li2880} +{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'02\'04.;}{\levelnumbers\'01;}\rtlch\af9 \ltrch\loch\fi-360\li3600} +{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'02\'05.;}{\levelnumbers\'01;}\rtlch\af9 \ltrch\loch\fi-360\li4320} +{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'02\'06.;}{\levelnumbers\'01;}\rtlch\af9 \ltrch\loch\fi-360\li5040} +{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'02\'07.;}{\levelnumbers\'01;}\rtlch\af9 \ltrch\loch\fi-360\li5760} +{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'02\'08.;}{\levelnumbers\'01;}\rtlch\af9 \ltrch\loch\fi-360\li6480}\listid3} +{\list\listtemplateid4 +{\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61623 ?;}{\levelnumbers;}\f1\fi-360\li720} +{\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u111 ?;}{\levelnumbers;}\f11\fi-360\li1440} +{\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f11\fi-360\li2160} +{\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61623 ?;}{\levelnumbers;}\f1\fi-360\li2880} +{\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u111 ?;}{\levelnumbers;}\f11\fi-360\li3600} +{\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f11\fi-360\li4320} +{\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61623 ?;}{\levelnumbers;}\f1\fi-360\li5040} +{\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u111 ?;}{\levelnumbers;}\f11\fi-360\li5760} +{\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f11\fi-360\li6480}\listid4} +{\list\listtemplateid5 +{\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61623 ?;}{\levelnumbers;}\f1\fi-360\li720} +{\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u9702 ?;}{\levelnumbers;}\f11\fi-360\li1080} +{\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u9642 ?;}{\levelnumbers;}\f11\fi-360\li1440} +{\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u8226 ?;}{\levelnumbers;}\f11\fi-360\li1800} +{\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u9702 ?;}{\levelnumbers;}\f11\fi-360\li2160} +{\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u9642 ?;}{\levelnumbers;}\f11\fi-360\li2520} +{\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u8226 ?;}{\levelnumbers;}\f11\fi-360\li2880} +{\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u9702 ?;}{\levelnumbers;}\f11\fi-360\li3240} +{\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u9642 ?;}{\levelnumbers;}\f11\fi-360\li3600}\listid5} +}{\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}{\listoverride\listid2\listoverridecount0\ls2}{\listoverride\listid3\listoverridecount0\ls3}{\listoverride\listid4\listoverridecount0\ls4}{\listoverride\listid5\listoverridecount0\ls5}}{\*\generator LibreOffice/7.3.6.2$Windows_X86_64 LibreOffice_project/c28ca90fd6e1a19e189fc16c05f8f8924961e12e}{\info{\creatim\yr2023\mo2\dy9\hr16\min55}{\revtim\yr2023\mo3\dy28\hr10\min15}{\printim\yr0\mo0\dy0\hr0\min0}}{\*\userprops{\propname Operator}\proptype30{\staticval Flo}}\deftab709\deftab709\deftab709\deftab709\deftab709\deftab709\deftab709 \hyphauto1\viewscale100 {\*\pgdsctbl {\pgdsc0\pgdscuse451\pgwsxn5953\pghsxn8391\marglsxn283\margrsxn283\margtsxn283\margbsxn283\pgdscnxt0 Standard;}} \formshade\paperh8391\paperw5953\margl283\margr283\margt283\margb283\sectd\sbknone\pgndec\sftnnar\saftnnrlc\sectunlocked1\pgwsxn5953\pghsxn8391\marglsxn283\margrsxn283\margtsxn283\margbsxn283\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc -{\*\ftnsep\chftnsep}\pgndec\pard\plain \s310\rtlch\af9\afs32\alang1081\ab \ltrch\lang1031\langfe2052\hich\af5\loch\ql\nowidctlpar\hyphpar0\faauto\sb200\sa120\keepn\ltrpar\cf0\f5\fs32\lang1031\b\kerning1\dbch\af8\langfe2052\li0\ri0\lin0\rin0\fi0\sb200\sa120{\loch\cf19\lang1033\loch +{\*\ftnsep\chftnsep}\pgndec\pard\plain \s2\rtlch\af10\afs32\alang1081\ab \ltrch\lang1031\langfe2052\hich\af6\loch\ilvl1\outlinelevel1\ql\widctlpar\hyphpar0\faauto\sb200\sa120\keepn\ltrpar\cf0\f6\fs32\lang1031\b\kerning1\dbch\af8\langfe2052{\listtext\pard\plain \tab}\ls1 \li0\ri0\lin0\rin0\fi0\sb200\sa120{\loch\cf19\lang1033\loch InsideBlue}{\loch\lang1033\loch BLE Tool} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0\ltrpar{\rtlch\ai \ltrch\lang1033\loch\lang1033\i\loch -Version 0.6} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0\ltrpar{\loch\cf19\lang1033\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0{\rtlch\ai \ltrch\lang1033\loch\lang1033\i\loch +Version 0.6.1} +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0{\loch\cf19\lang1033\loch InsideBlue}{\loch\lang1033\loch BLE Tool is an easy to use cross-platform application for Bluetooth Low-Energy (BLE) connectivity leveraging the PC\u8217\'92s integrated Bluetooth adapter.} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0\ltrpar{\loch\lang1033\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch You can scan for BLE devices that are advertising and discover their GAP services or manufacturer specific payload, engage a connection and access the peripheral GATT table.} -\par \pard\plain \s311\rtlch\af9\afs28\alang1081\ab \ltrch\lang1031\langfe2052\hich\af5\loch\ql\nowidctlpar\hyphpar0\faauto\sb140\sa120\keepn\ltrpar\cf0\f5\fs28\lang1031\b\kerning1\dbch\af8\langfe2052\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch +\par \pard\plain \s3\rtlch\af10\afs28\alang1081\ab \ltrch\lang1031\langfe2052\hich\af6\loch\ilvl2\outlinelevel2\ql\widctlpar\hyphpar0\faauto\sb140\sa120\keepn\ltrpar\cf0\f6\fs28\lang1031\b\kerning1\dbch\af8\langfe2052{\listtext\pard\plain \tab}\ls1 \li0\ri0\lin0\rin0\fi0{\loch Main Scan Window} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0\ltrpar{\loch\lang1033\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch After start the main scan window opens and provides common controls for BLE device discovery.} -\par \pard\plain \s312\rtlch\af9\afs26\alang1081\ai\ab \ltrch\lang1031\langfe2052\hich\af5\loch\ql\nowidctlpar\hyphpar0\faauto\sb120\sa120\keepn\ltrpar\cf0\f5\fs26\lang1031\i\b\kerning1\dbch\af8\langfe2052\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch +\par \pard\plain \s4\rtlch\af10\afs26\alang1081\ai\ab \ltrch\lang1031\langfe2052\hich\af4\loch\ql\widctlpar\hyphpar0\faauto\sb120\sa120\keepn\ltrpar\cf0\f4\fs26\lang1031\i\b\kerning1\dbch\af8\langfe2052{\loch Start/Stop Scanning} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0\ltrpar{\loch\lang1033\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch Pressing the [Start Scan] button starts scanning for BLE advertisments. Discovered devices will be shown as a panel list underneath. After scanning has started, the button turns into a [Stop Scan] button and BLE scanning stops when pressed again. The [Clear] button clears the panel list of discovered devices.} -\par \pard\plain \s312\rtlch\af9\afs26\alang1081\ai\ab \ltrch\lang1031\langfe2052\hich\af5\loch\ql\nowidctlpar\hyphpar0\faauto\sb120\sa120\keepn\ltrpar\cf0\f5\fs26\lang1031\i\b\kerning1\dbch\af8\langfe2052\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch +\par \pard\plain \s4\rtlch\af10\afs26\alang1081\ai\ab \ltrch\lang1031\langfe2052\hich\af4\loch\ql\widctlpar\hyphpar0\faauto\sb120\sa120\keepn\ltrpar\cf0\f4\fs26\lang1031\i\b\kerning1\dbch\af8\langfe2052{\loch Filters} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0\ltrpar{\loch\lang1033\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch Three filters can be applied to the device scanning. Entering a device name or part of it into the left field will only show devices matching. The device name is not case-sensitive. The middle field filters for BLE mac addresses or part of it. The mac address has to be entered as hex numbers separated by colons (aa:bb:cc:dd:ee:ff). The right field allows filtering based on the RSSI value of advertisments which \u8211\'96 to some extent \u8211\'96 represents the distance of a device. Values have to be entered as positive numbers.} -\par \pard\plain \s312\rtlch\af9\afs26\alang1081\ai\ab \ltrch\lang1031\langfe2052\hich\af5\loch\ql\nowidctlpar\hyphpar0\faauto\sb120\sa120\keepn\ltrpar\cf0\f5\fs26\lang1031\i\b\kerning1\dbch\af8\langfe2052\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch +\par \pard\plain \s4\rtlch\af10\afs26\alang1081\ai\ab \ltrch\lang1031\langfe2052\hich\af4\loch\ql\widctlpar\hyphpar0\faauto\sb120\sa120\keepn\ltrpar\cf0\f4\fs26\lang1031\i\b\kerning1\dbch\af8\langfe2052{\loch Log Output} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0\ltrpar{\loch\lang1033\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch A more detailed log output can be enabled by ticking the Show Log Output box. The main window will extend to the right and show the log output.} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0\ltrpar{\loch\lang1033\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch Two additonal buttons allow clearing the log output as well as copying the log output into the clipboard. You can also directly select text in the log output and copy.} -\par \pard\plain \s312\rtlch\af9\afs26\alang1081\ai\ab \ltrch\lang1031\langfe2052\hich\af5\loch\ql\nowidctlpar\hyphpar0\faauto\sb120\sa120\keepn\ltrpar\cf0\f5\fs26\lang1031\i\b\kerning1\dbch\af8\langfe2052\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch +\par \pard\plain \s4\rtlch\af10\afs26\alang1081\ai\ab \ltrch\lang1031\langfe2052\hich\af4\loch\ql\widctlpar\hyphpar0\faauto\sb120\sa120\keepn\ltrpar\cf0\f4\fs26\lang1031\i\b\kerning1\dbch\af8\langfe2052{\loch Scan Data Panel} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0\ltrpar{\loch\lang1033\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch For each discovered device a panel with device information is shown. It contains device name, connectable status, tx power (if available), RSSI value, mac address, advertised services, service data and manufacturer specific data.} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0\ltrpar{\loch\lang1033\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch If the UUID of a service or the company ID in the manufacturer data is in the official Bluetooth list of assigned numbers, the official name will be shown. You can hover with the mouse over the name to see the underlying service UUID or full company name with ID.} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0\ltrpar{\loch\lang1033\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch Manufacturer data can be displayed either as HEX numbers or ASCII string. For ASCII non printable characters are displayed as black boxes.} -\par \pard\plain \s312\rtlch\af9\afs26\alang1081\ai\ab \ltrch\lang1031\langfe2052\hich\af5\loch\ql\nowidctlpar\hyphpar0\faauto\sb120\sa120\keepn\ltrpar\cf0\f5\fs26\lang1031\i\b\kerning1\dbch\af8\langfe2052\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch +\par \pard\plain \s4\rtlch\af10\afs26\alang1081\ai\ab \ltrch\lang1031\langfe2052\hich\af4\loch\ql\widctlpar\hyphpar0\faauto\sb120\sa120\keepn\ltrpar\cf0\f4\fs26\lang1031\i\b\kerning1\dbch\af8\langfe2052{\loch Connect Device} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0\ltrpar{\loch\lang1033\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch If a device is connectable you can engage a connection with the Connect button.} -\par \pard\plain \s311\rtlch\af9\afs28\alang1081\ab \ltrch\lang1031\langfe2052\hich\af5\loch\ql\nowidctlpar\hyphpar0\faauto\sb140\sa120\keepn\ltrpar\cf0\f5\fs28\lang1031\b\kerning1\dbch\af8\langfe2052\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch +\par \pard\plain \s3\rtlch\af10\afs28\alang1081\ab \ltrch\lang1031\langfe2052\hich\af6\loch\ilvl2\outlinelevel2\ql\widctlpar\hyphpar0\faauto\sb140\sa120\keepn\ltrpar\cf0\f6\fs28\lang1031\b\kerning1\dbch\af8\langfe2052{\listtext\pard\plain \tab}\ls1 \li0\ri0\lin0\rin0\fi0{\loch Device Connect Window} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0\ltrpar{\loch\lang1033\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch On connect the GATT table of the device is being read and services, corresponding characteristics and descriptors are shown in a panel structure.} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0\ltrpar{\loch\lang1033\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch If the UUID of a service, characteristic or descriptor is in the official Bluetooth list of assigned numbers, the official name will be shown. You can hover with the mouse over the name to see the underlying UUID number.} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0\ltrpar{\loch\lang1033\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch Depending on the properties of each characteristic different buttons get added to the text field. Those are Read, WriteCommand, WriteRequest, Notify and Indicate. Data from/to a characteristic gets displayed or entered into a text field, which is either read/write or read only. You can switch the presentation between HEX numbers or ASCII string. When set to ASCII, non-printable characters are displayed as a black square.} -\par \pard\plain \s312\rtlch\af9\afs26\alang1081\ai\ab \ltrch\lang1031\langfe2052\hich\af5\loch\ql\nowidctlpar\hyphpar0\faauto\sb120\sa120\keepn\ltrpar\cf0\f5\fs26\lang1031\i\b\kerning1\dbch\af8\langfe2052\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch +\par \pard\plain \s4\rtlch\af10\afs26\alang1081\ai\ab \ltrch\lang1031\langfe2052\hich\af4\loch\ql\widctlpar\hyphpar0\faauto\sb120\sa120\keepn\ltrpar\cf0\f4\fs26\lang1031\i\b\kerning1\dbch\af8\langfe2052{\loch Virtual Serial Port (VSP)} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0\ltrpar{\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0{\loch Beside the official Bluetooth list of services, there exist proprietary services to expose a virtual serial port service (similar to SPP service from Bluetooth Classic). InsideBlue knows some of these and if recognized it will show their names as well along with a button to fire up a simple VSP terminal window. Please find below a list of manufactures and proprietary GATT services / characteristics which are currently supported.} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052{\listtext\pard\plain \rtlch\af7\ab0 \ltrch\loch\b0 1.\tab}\ilvl0\ls1 \li1440\ri0\lin1440\rin0\fi-360\sl276\slmult1\tx720\li720\ri0\lin720\rin0\fi-360\ltrpar{\rtlch\ab \ltrch\loch\b\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052{\listtext\pard\plain \rtlch\af9\ab0 \ltrch\loch\b0 1.\tab}\ilvl0\ls3 \li1440\ri0\lin1440\rin0\fi-360\sl276\slmult1\tx720\li720\ri0\lin720\rin0\fi-360{\rtlch\ab \ltrch\loch\b\loch Laird Connectivity}{\loch - with the }{{\field{\*\fldinst HYPERLINK "https://www.lairdconnect.com/documentation/application-note-laird-custom-ble-serial-port-service" }{\fldrslt {\rtlch\af7 \ltrch\hich\af0\loch\cf17\ul\ulc0\f0\loch + with the }{{\field{\*\fldinst HYPERLINK "https://www.lairdconnect.com/documentation/application-note-laird-custom-ble-serial-port-service" }{\fldrslt {\rtlch\af9 \ltrch\hich\af0\loch\cf18\ul\ulc0\f0\loch Virtual Serial Port (VSP)}{}}}\loch ,} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052{\listtext\pard\plain \rtlch\af7\ab0 \ltrch\loch\b0 2.\tab}\ilvl0\ls1 \li1440\ri0\lin1440\rin0\fi-360\sl276\slmult1\tx720\li720\ri0\lin720\rin0\fi-360\ltrpar{\rtlch\ab \ltrch\loch\b\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052{\listtext\pard\plain \rtlch\af9\ab0 \ltrch\loch\b0 2.\tab}\ilvl0\ls3 \li1440\ri0\lin1440\rin0\fi-360\sl276\slmult1\tx720\li720\ri0\lin720\rin0\fi-360{\rtlch\ab \ltrch\loch\b\loch u-blox}{\loch - with the }{{\field{\*\fldinst HYPERLINK "https://content.u-blox.com/sites/default/files/u-connectXpress-LowEnergySerialPortService_ProtocolSpec_UBX-16011192.pdf" }{\fldrslt {\rtlch\af7 \ltrch\hich\af0\loch\cf17\ul\ulc0\f0\loch + with the }{{\field{\*\fldinst HYPERLINK "https://content.u-blox.com/sites/default/files/u-connectXpress-LowEnergySerialPortService_ProtocolSpec_UBX-16011192.pdf" }{\fldrslt {\rtlch\af9 \ltrch\hich\af0\loch\cf18\ul\ulc0\f0\loch u-connectXpress BLE Serial Port Service}{}}}\loch ,} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052{\listtext\pard\plain \rtlch\af7\ab0 \ltrch\loch\b0 3.\tab}\ilvl0\ls1 \li1440\ri0\lin1440\rin0\fi-360\sl276\slmult1\tx720\li720\ri0\lin720\rin0\fi-360\ltrpar{\rtlch\ab \ltrch\loch\b\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052{\listtext\pard\plain \rtlch\af9\ab0 \ltrch\loch\b0 3.\tab}\ilvl0\ls3 \li1440\ri0\lin1440\rin0\fi-360\sl276\slmult1\tx720\li720\ri0\lin720\rin0\fi-360{\rtlch\ab \ltrch\loch\b\loch Nordic Semiconductors}{\loch - with the }{{\field{\*\fldinst HYPERLINK "https://developer.nordicsemi.com/nRF_Connect_SDK/doc/1.4.0/nrf/include/bluetooth/services/nus.html" }{\fldrslt {\rtlch\af7 \ltrch\hich\af0\loch\cf17\ul\ulc0\f0\loch + with the }{{\field{\*\fldinst HYPERLINK "https://developer.nordicsemi.com/nRF_Connect_SDK/doc/1.4.0/nrf/include/bluetooth/services/nus.html" }{\fldrslt {\rtlch\af9 \ltrch\hich\af0\loch\cf18\ul\ulc0\f0\loch Nordic UART Service (NUS)}{}}}\loch .} -\par \pard\plain \s311\rtlch\af9\afs28\alang1081\ab \ltrch\lang1031\langfe2052\hich\af5\loch\ql\nowidctlpar\hyphpar0\faauto\sb140\sa120\keepn\ltrpar\cf0\f5\fs28\lang1031\b\kerning1\dbch\af8\langfe2052\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch +\par \pard\plain \s3\rtlch\af10\afs28\alang1081\ab \ltrch\lang1031\langfe2052\hich\af6\loch\ilvl2\outlinelevel2\ql\widctlpar\hyphpar0\faauto\sb140\sa120\keepn\ltrpar\cf0\f6\fs28\lang1031\b\kerning1\dbch\af8\langfe2052{\listtext\pard\plain \tab}\ls1 \li0\ri0\lin0\rin0\fi0{\loch UART VSP Terminal} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0\ltrpar{\loch\lang1033\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch For known VSP services you can open a terminal window and send/receive text. Line endings can be selected for both send and receive individually. Each sent text line will be added to a history drop down menu and can be selected later for sending certain lines again.} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0\ltrpar{\loch\lang1033\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch Currently only one VSP terminal can be opened at a time.} -\par \pard\plain \s312\rtlch\af9\afs26\alang1081\ai\ab \ltrch\lang1031\langfe2052\hich\af5\loch\ql\nowidctlpar\hyphpar0\faauto\sb120\sa120\keepn\ltrpar\cf0\f5\fs26\lang1031\i\b\kerning1\dbch\af8\langfe2052\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch +\par \pard\plain \s4\rtlch\af10\afs26\alang1081\ai\ab \ltrch\lang1031\langfe2052\hich\af4\loch\ql\widctlpar\hyphpar0\faauto\sb120\sa120\keepn\ltrpar\cf0\f4\fs26\lang1031\i\b\kerning1\dbch\af8\langfe2052{\loch Line Endings} -\par \pard\plain \s307\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0\ltrpar{\loch\lang1033\loch +\par \pard\plain \s379\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch You can set line endings for send ( and/or will be appended to the send string) and receive (new line will be added to the receive window on , or closing curly bracket of e.g., a JSON string).} -\par \pard\plain \s312\rtlch\af9\afs26\alang1081\ai\ab \ltrch\lang1031\langfe2052\hich\af5\loch\ql\nowidctlpar\hyphpar0\faauto\sb120\sa120\keepn\ltrpar\cf0\f5\fs26\lang1031\i\b\kerning1\dbch\af8\langfe2052\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch +\par \pard\plain \s4\rtlch\af10\afs26\alang1081\ai\ab \ltrch\lang1031\langfe2052\hich\af4\loch\ql\widctlpar\hyphpar0\faauto\sb120\sa120\keepn\ltrpar\cf0\f4\fs26\lang1031\i\b\kerning1\dbch\af8\langfe2052{\loch Modem In/Out Characteristics} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0\ltrpar{\loch\lang1033\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch Beside the mandatory TX (from peripheral to central) and RX (from central to peripheral) characteristics, some VSP services offer additional Modem In/Out characteristics which are used for handshake signalling much like RTS/CTS signals on a real UART. These are not yet implemented in InsideBlue.} -\par \pard\plain \s312\rtlch\af9\afs26\alang1081\ai\ab \ltrch\lang1031\langfe2052\hich\af5\loch\ql\nowidctlpar\hyphpar0\faauto\sb120\sa120\keepn\ltrpar\cf0\f5\fs26\lang1031\i\b\kerning1\dbch\af8\langfe2052\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch +\par \pard\plain \s4\rtlch\af10\afs26\alang1081\ai\ab \ltrch\lang1031\langfe2052\hich\af4\loch\ql\widctlpar\hyphpar0\faauto\sb120\sa120\keepn\ltrpar\cf0\f4\fs26\lang1031\i\b\kerning1\dbch\af8\langfe2052{\loch Length of RX Characteristic} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0\ltrpar{\loch\lang1033\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch The length of the peripheral RX characteristic is not exactly known to the central, hence InsideBlue assumes MTU size minus 3 as best guess. It can be adjusted manually to another value. If the entered data is longer than the characteristic length, it will automatically split into multiple write packets.} -\par \pard\plain \s311\rtlch\af9\afs28\alang1081\ab \ltrch\lang1031\langfe2052\hich\af5\loch\ql\nowidctlpar\hyphpar0\faauto\sb140\sa120\keepn\ltrpar\cf0\f5\fs28\lang1031\b\kerning1\dbch\af8\langfe2052\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch +\par \pard\plain \s4\rtlch\af10\afs26\alang1081\ai\ab \ltrch\lang1031\langfe2052\hich\af4\loch\ql\widctlpar\hyphpar0\faauto\sb120\sa120\keepn\ltrpar\cf0\f4\fs26\lang1031\i\b\kerning1\dbch\af8\langfe2052{\listtext\pard\plain }\ilvl3\ls2 \li0\ri0\lin0\rin0\fi0\li0\ri0\lin0\rin0\fi0{\loch +WriteCommand/WriteRequest} +\par \pard\plain \s372\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052\sl276\slmult1{\loch +Depending on the write properties of the RX characteristic you can select to use write request or write command, if both are exposed.} +\par \pard\plain \s3\rtlch\af10\afs28\alang1081\ab \ltrch\lang1031\langfe2052\hich\af6\loch\ilvl2\outlinelevel2\ql\widctlpar\hyphpar0\faauto\sb140\sa120\keepn\ltrpar\cf0\f6\fs28\lang1031\b\kerning1\dbch\af8\langfe2052{\listtext\pard\plain \tab}\ls1 \li0\ri0\lin0\rin0\fi0{\loch Pairing Devices} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0\ltrpar{\loch\lang1033\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch On operating systems, initiating a connection procedure will automatically run pairing if necessary. This process is entirely managed by the operating system, there isn't much that we can do from the user side.} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0\ltrpar{\loch\lang1033\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch This has the following implications:} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052{\listtext\pard\plain \u61623\'3f\tab}\ilvl0\ls3 \li1440\ri0\lin1440\rin0\fi-360\sl276\slmult1\li720\ri0\lin720\rin0\fi-360\ltrpar{\loch\lang1033\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052{\listtext\pard\plain \u61623\'3f\tab}\ilvl0\ls5 \li1440\ri0\lin1440\rin0\fi-360\sl276\slmult1\li720\ri0\lin720\rin0\fi-360{\loch\lang1033\loch The user will need to manually confirm pairing, until that happens no successful access to protected characteristics is possible.} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052{\listtext\pard\plain \u61623\'3f\tab}\ilvl0\ls3 \li1440\ri0\lin1440\rin0\fi-360\sl276\slmult1\li720\ri0\lin720\rin0\fi-360\ltrpar{\loch\lang1033\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052{\listtext\pard\plain \u61623\'3f\tab}\ilvl0\ls5 \li1440\ri0\lin1440\rin0\fi-360\sl276\slmult1\li720\ri0\lin720\rin0\fi-360{\loch\lang1033\loch Removing a device can only be done from the OS Bluetooth settings page.} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052{\listtext\pard\plain \u61623\'3f\tab}\ilvl0\ls3 \li1440\ri0\lin1440\rin0\fi-360\sl276\slmult1\li720\ri0\lin720\rin0\fi-360\ltrpar{\loch\lang1033\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052{\listtext\pard\plain \u61623\'3f\tab}\ilvl0\ls5 \li1440\ri0\lin1440\rin0\fi-360\sl276\slmult1\li720\ri0\lin720\rin0\fi-360{\loch\lang1033\loch There is no programmatic way of controlling this process.} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0\ltrpar{\loch\lang1033\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch This applies at least for Windows OS and might be different on other OS platforms (not yet available).} -\par \pard\plain \s311\rtlch\af9\afs28\alang1081\ab \ltrch\lang1031\langfe2052\hich\af5\loch\ql\nowidctlpar\hyphpar0\faauto\sb140\sa120\keepn\ltrpar\cf0\f5\fs28\lang1031\b\kerning1\dbch\af8\langfe2052\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch +\par \pard\plain \s3\rtlch\af10\afs28\alang1081\ab \ltrch\lang1031\langfe2052\hich\af6\loch\ilvl2\outlinelevel2\ql\widctlpar\hyphpar0\faauto\sb140\sa120\keepn\ltrpar\cf0\f6\fs28\lang1031\b\kerning1\dbch\af8\langfe2052{\listtext\pard\plain \tab}\ls1 \li0\ri0\lin0\rin0\fi0{\loch Limitations} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052{\listtext\pard\plain \u61623\'3f\tab}\ilvl0\ls2 \li1440\ri0\lin1440\rin0\fi-360\sl276\slmult1\li720\ri0\lin720\rin0\fi-360\ltrpar{\loch\lang1033\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052{\listtext\pard\plain \u61623\'3f\tab}\ilvl0\ls4 \li1440\ri0\lin1440\rin0\fi-360\sl276\slmult1\li720\ri0\lin720\rin0\fi-360{\loch\lang1033\loch Since }{\loch\cf19\lang1033\loch InsideBlue}{\loch\lang1033\loch leverages the PC\u8217\'92s integrated Bluetooth Controller, this ultimately limits what\u8217\'92s achievable from a BT hardware perspective (e.g., number of simultaneous connections).} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052{\listtext\pard\plain \u61623\'3f\tab}\ilvl0\ls2 \li1440\ri0\lin1440\rin0\fi-360\sl276\slmult1\li720\ri0\lin720\rin0\fi-360\ltrpar{\loch\lang1033\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052{\listtext\pard\plain \u61623\'3f\tab}\ilvl0\ls4 \li1440\ri0\lin1440\rin0\fi-360\sl276\slmult1\li720\ri0\lin720\rin0\fi-360{\loch\lang1033\loch It is not possible to tweak BLE settings like scan interval and/or scan window or similar low-level BLE parameters.} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052{\listtext\pard\plain \u61623\'3f\tab}\ilvl0\ls2 \li1440\ri0\lin1440\rin0\fi-360\sl276\slmult1\li720\ri0\lin720\rin0\fi-360\ltrpar{\loch\lang1033\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052{\listtext\pard\plain \u61623\'3f\tab}\ilvl0\ls4 \li1440\ri0\lin1440\rin0\fi-360\sl276\slmult1\li720\ri0\lin720\rin0\fi-360{\loch\lang1033\loch Pairing of BLE devices is not yet implmented.} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052{\listtext\pard\plain \u61623\'3f\tab}\ilvl0\ls2 \li1440\ri0\lin1440\rin0\fi-360\sl276\slmult1\li720\ri0\lin720\rin0\fi-360\ltrpar{\loch\lang1033\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052{\listtext\pard\plain \u61623\'3f\tab}\ilvl0\ls4 \li1440\ri0\lin1440\rin0\fi-360\sl276\slmult1\li720\ri0\lin720\rin0\fi-360{\loch\lang1033\loch Due to a limitation of the underlying BLE library, it\u8217\'92s not possible to properly receive notifications or indications from devices exposing an identcal GATT table (i.e. identical service/characteristic UUIDs).} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052{\listtext\pard\plain \u61623\'3f\tab}\ilvl0\ls2 \li1440\ri0\lin1440\rin0\fi-360\sl276\slmult1\li720\ri0\lin720\rin0\fi-360\ltrpar{\loch\lang1033\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052{\listtext\pard\plain \u61623\'3f\tab}\ilvl0\ls4 \li1440\ri0\lin1440\rin0\fi-360\sl276\slmult1\li720\ri0\lin720\rin0\fi-360{\loch\lang1033\loch The underlying BLE library does not yet expose properties of the descriptors and hence it\u8217\'92s not yet possible to directly read/write them.} -\par \pard\plain \s311\rtlch\af9\afs28\alang1081\ab \ltrch\lang1031\langfe2052\hich\af5\loch\ql\nowidctlpar\hyphpar0\faauto\sb140\sa120\keepn\ltrpar\cf0\f5\fs28\lang1031\b\kerning1\dbch\af8\langfe2052\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch +\par \pard\plain \s3\rtlch\af10\afs28\alang1081\ab \ltrch\lang1031\langfe2052\hich\af6\loch\ilvl2\outlinelevel2\ql\widctlpar\hyphpar0\faauto\sb140\sa120\keepn\ltrpar\cf0\f6\fs28\lang1031\b\kerning1\dbch\af8\langfe2052{\listtext\pard\plain \tab}\ls1 \li0\ri0\lin0\rin0\fi0{\loch BLE Library} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0\ltrpar{\loch\cf19\lang1033\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0{\loch\cf19\lang1033\loch Inside Blue}{\loch\lang1033\loch BLE Tool is based on the SimpleBLE library (https://github.com/OpenBluetoothToolbox/SimpleBLE) and Pascal bindings for that library (https://github.com/eriklins/Pascal-Bindings-For-SimpleBLE-Library).} -\par \pard\plain \s311\rtlch\af9\afs28\alang1081\ab \ltrch\lang1031\langfe2052\hich\af5\loch\ql\nowidctlpar\hyphpar0\faauto\sb140\sa120\keepn\ltrpar\cf0\f5\fs28\lang1031\b\kerning1\dbch\af8\langfe2052\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch +\par \pard\plain \s3\rtlch\af10\afs28\alang1081\ab \ltrch\lang1031\langfe2052\hich\af6\loch\ilvl2\outlinelevel2\ql\widctlpar\hyphpar0\faauto\sb140\sa120\keepn\ltrpar\cf0\f6\fs28\lang1031\b\kerning1\dbch\af8\langfe2052{\listtext\pard\plain \tab}\ls1 \li0\ri0\lin0\rin0\fi0{\loch License} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0\ltrpar{\loch\cf19\lang1033\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0{\loch\cf19\lang1033\loch Inside Blue}{\loch\lang1033\loch BLE Tool is released under the MIT License.} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0\ltrpar{\loch\lang1033\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch Copyright (C) 2023 Erik Lins} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0\ltrpar{\loch\lang1033\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0\ltrpar{\loch\lang1033\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0{\loch\lang1033\loch The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.} -\par \pard\plain \s314\rtlch\af9\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af7\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0\sb0\sa140\ltrpar{\loch\lang1033\loch +\par \pard\plain \s386\rtlch\af10\afs24\alang1081 \ltrch\lang1031\langfe2052\hich\af3\loch\sl276\slmult1\ql\widctlpar\hyphpar0\faauto\sb0\sa140\ltrpar\cf0\f3\fs24\lang1031\kerning1\dbch\af9\langfe2052\sl276\slmult1\li0\ri0\lin0\rin0\fi0\sb0\sa140{\loch\lang1033\loch THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.} \par } \ No newline at end of file diff --git a/src/main.lfm b/src/main.lfm index e151393..00644d0 100644 --- a/src/main.lfm +++ b/src/main.lfm @@ -3,7 +3,7 @@ object ScanForm: TScanForm Height = 840 Top = 50 Width = 904 - Caption = 'InsideBlue BLE Tool V0.6' + Caption = 'InsideBlue BLE Tool V0.6.1' ClientHeight = 840 ClientWidth = 904 Color = clWhite diff --git a/src/uartterminal.lfm b/src/uartterminal.lfm index 110a0af..014c1f5 100644 --- a/src/uartterminal.lfm +++ b/src/uartterminal.lfm @@ -1,7 +1,7 @@ object TerminalForm: TTerminalForm - Left = 52 + Left = 35 Height = 560 - Top = 502 + Top = 500 Width = 800 VertScrollBar.Visible = False Caption = 'InsideBlue - Virtual Serial Port Terminal' @@ -178,4 +178,15 @@ object TerminalForm: TTerminalForm Caption = '...} (JSON)' TabOrder = 9 end + object CheckBoxUseWriteReq: TCheckBox + Left = 690 + Height = 19 + Top = 40 + Width = 103 + Alignment = taLeftJustify + Anchors = [akTop, akRight] + Caption = 'Use WR Request' + OnChange = CheckBoxUseWriteReqChange + TabOrder = 10 + end end diff --git a/src/uartterminal.pas b/src/uartterminal.pas index 546fd50..ae12f60 100644 --- a/src/uartterminal.pas +++ b/src/uartterminal.pas @@ -14,6 +14,7 @@ TTerminalForm = class(TForm) ButtonSend: TButton; CheckBoxReceiveCR: TCheckBox; CheckBoxReceiveJson: TCheckBox; + CheckBoxUseWriteReq: TCheckBox; CheckBoxSendCR: TCheckBox; CheckBoxReceiveLF: TCheckBox; CheckBoxSendLF: TCheckBox; @@ -27,6 +28,7 @@ TTerminalForm = class(TForm) MemoReceiveData: TMemo; TextBoxDeviceName: TEdit; procedure ButtonSendClick(Sender: TObject); + procedure CheckBoxUseWriteReqChange(Sender: TObject); procedure FormChangeBounds(Sender: TObject); procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); procedure TextBoxCharLenEditingDone(Sender: TObject); @@ -37,7 +39,7 @@ TTerminalForm = class(TForm) end; -procedure UartTerminalStart(PerHandle: TSimpleBlePeripheral; DevName: string; MacAddr: string; SvUuid: TSimpleBleUuid; restore: TPanel); +procedure UartTerminalStart(PerHandle: TSimpleBlePeripheral; DevName: string; MacAddr: string; SvUuid: TSimpleBleUuid; HasWrCmd: Boolean; HasWrReq: Boolean; restore: TPanel); procedure UartTerminalStop(PerHandle: TSimpleBlePeripheral); function UartTerminalIsActive(PerHandle: TSimpleBlePeripheral): Boolean; @@ -51,25 +53,27 @@ implementation type TBleVspTerminal = record - Handle: TSimpleBlePeripheral; - DeviceName: string; - MacAddress: string; - UuidService: TSimpleBleUuid; - ServiceName: string; - UuidRx: TSimpleBleUuid; - UuidTx: TSimpleBleUuid; - UuidModemIn: TSimpleBleUuid; - HasModemIn: Boolean; - UuidModemOut: TSimpleBleUuid; - HasModemOut: Boolean; - RxCharLength: Integer; - IsActive: Boolean; + Handle: TSimpleBlePeripheral; + DeviceName: string; + MacAddress: string; + UuidService: TSimpleBleUuid; + ServiceName: string; + UuidRx: TSimpleBleUuid; + UuidTx: TSimpleBleUuid; + UuidModemIn: TSimpleBleUuid; + HasModemIn: Boolean; + UuidModemOut: TSimpleBleUuid; + HasModemOut: Boolean; + RxCharLength: Integer; + HasVspWriteCmd: Boolean; + HasVspWriteReq: Boolean; + IsActive: Boolean; end; var VspTerminal: array of TBleVspTerminal; RestorePanel: TPanel; - + FlagUseWriteReq: Boolean; { TTerminalForm } @@ -145,10 +149,18 @@ procedure TTerminalForm.ButtonSendClick(Sender: TObject); i := i + 1; j := j + 1; if (j = VspTerminal[0].RxCharLength) or (i = ChLen) then begin - if SimpleBlePeripheralWriteCommand(VspTerminal[0].Handle, VspTerminal[0].UuidService, VspTerminal[0].UuidRx, ChData, j) = SIMPLEBLE_FAILURE then begin - ShowMessage('Failed to send data. Check TX max characters.'); - UtilLog('Failed to send uart terminal data.'); - exit; + if FlagUseWriteReq then begin + if SimpleBlePeripheralWriteRequest(VspTerminal[0].Handle, VspTerminal[0].UuidService, VspTerminal[0].UuidRx, ChData, j) = SIMPLEBLE_FAILURE then begin + ShowMessage('Failed to send data (WR request). Check TX max characters.'); + UtilLog('Failed to send uart terminal data.'); + exit; + end; + end else begin + if SimpleBlePeripheralWriteCommand(VspTerminal[0].Handle, VspTerminal[0].UuidService, VspTerminal[0].UuidRx, ChData, j) = SIMPLEBLE_FAILURE then begin + ShowMessage('Failed to send data (WR command). Check TX max characters.'); + UtilLog('Failed to send uart terminal data.'); + exit; + end; end; j := 0; end; @@ -167,6 +179,14 @@ procedure TTerminalForm.ButtonSendClick(Sender: TObject); TerminalForm[0].ComboBoxSendLine.Items.Add(TerminalForm[0].ComboBoxSendLine.Caption); end; +procedure TTerminalForm.CheckBoxUseWriteReqChange(Sender: TObject); +begin + if TerminalForm[0].CheckBoxUseWriteReq.State = cbChecked then + FlagUseWriteReq := true + else + FlagUseWriteReq := false; +end; + procedure TTerminalForm.FormChangeBounds(Sender: TObject); var i: Integer; @@ -213,7 +233,7 @@ procedure UartModemOutOnNotify(SvUuid: TSimpleBleUuid; ChUuid: TSimpleBleUuid; D { Start a vsp uart terminal to the device with given peripheral handle and service uuid } -procedure UartTerminalStart(PerHandle: TSimpleBlePeripheral; DevName: string; MacAddr: string; SvUuid: TSimpleBleUuid; restore: TPanel); +procedure UartTerminalStart(PerHandle: TSimpleBlePeripheral; DevName: string; MacAddr: string; SvUuid: TSimpleBleUuid; HasWrCmd: Boolean; HasWrReq: Boolean; restore: TPanel); var i, j: Integer; begin @@ -229,12 +249,14 @@ procedure UartTerminalStart(PerHandle: TSimpleBlePeripheral; DevName: string; Ma SetLength(VspTerminal, i+1); SetLength(TerminalForm, i+1); - VspTerminal[i].Handle := PerHandle; - VspTerminal[i].UuidService := SvUuid; - VspTerminal[i].DeviceName := DevName; - VspTerminal[i].MacAddress := MacAddr; - VspTerminal[i].IsActive := true; - VspTerminal[i].RxCharLength := SimpleBlePeripheralMtu(VspTerminal[i].Handle); + VspTerminal[i].Handle := PerHandle; + VspTerminal[i].UuidService := SvUuid; + VspTerminal[i].DeviceName := DevName; + VspTerminal[i].MacAddress := MacAddr; + VspTerminal[i].IsActive := true; + VspTerminal[i].RxCharLength := SimpleBlePeripheralMtu(VspTerminal[i].Handle); + VspTerminal[i].HasVspWriteCmd := HasWrCmd; + VspTerminal[i].HasVspWriteReq := HasWrReq; RestorePanel := restore; // search rx/tx/modem uart characteristics of service @@ -273,6 +295,18 @@ procedure UartTerminalStart(PerHandle: TSimpleBlePeripheral; DevName: string; Ma TerminalForm[i].TextBoxDeviceName.Caption := VspTerminal[i].DeviceName; TerminalForm[i].LabelMacAddress.Caption := 'MAC Address [' + UpperCase(VspTerminal[i].MacAddress) + ']'; TerminalForm[i].TextBoxCharLen.Caption := IntToStr(VspTerminal[i].RxCharLength); + if VspTerminal[i].HasVspWriteCmd and VspTerminal[i].HasVspWriteReq then + FlagUseWriteReq := false + else begin + if VspTerminal[i].HasVspWriteCmd then begin + TerminalForm[i].CheckBoxUseWriteReq.Visible := false; + FlagUseWriteReq := false; + end; + if VspTerminal[i].HasVspWriteReq then begin + TerminalForm[i].CheckBoxUseWriteReq.Visible := false; + FlagUseWriteReq := true; + end; + end; TerminalForm[i].Show; // subscribe to uart tx characteristic notifications