Table of Contents

  1. Usage
  2. Bluetopia one at a time, and coexistence with the MSFT stack
  3. General
  4. BluetoothRadio
    1. Radio turned off
    2. Hardware unplugged
  5. BluetoothDeviceInfo
  6. BluetoothClient
    1. Connect
  7. NetworkStream
  8. BluetoothListener
  9. BluetoothSecurity
    1. PairRequest
    2. BtCli.SetPin
    3. PairRequest overrides stored-LinkKey
  10. ObexWebRequest
  11. ObexListener
  12. Internals

Usage

  1. Support is now included in the main library for NETCF and is enabled by default.
  2. Check whether BluetoothRadio.PrimaryRadio and/or BluetoothRadio.AllRadios are non-empty, and that one has SoftwareManufacter containing value StonesteetOne.
  3. See below for what is and isn’t supported.

Bluetopia one at a time, and coexistence with the MSFT stack

The first thing to note is that the Stonestreet One Bluetopia stack only allows one application at a time to use the stack; this includes the control-panel application provided by Stonestreet One called BTExplorer.exe. So if we can’t load the stack then check that no other Bluetooth application is active. At start-up we look for the BTExplorer.exe application and kill it if it is running. (Note one can tell whether any application is using Bluetooth from the Windows Mobile UI: if the Wireless Manager Bluetooth state is “On” and the Bluetooth icon at the bottom right of the Today screen does not have a yellow/black exclamation mark overlay).

It is also common on recent devices for the Microsoft stack to be installed alongside the Stonestreet One Bluetopia stack to allow the user a choice of which stack to use. The device I’m using current has a control-panel called “BT Select” (Settings: System) which allows one to select “StoneStreetOne” or “Microsoft” and reboot. However it doesn't actually change what API is useable. The “BT Select” setting only selects which stack’s Control Panels are active. If no other application is using Bluetooth (and when Microsoft is selected if its mode is ‘Off’) then an application can choose which API to use by using it first. 32feet.NET tries to load the Stonestreet One Bluetopia stack first.

General

This is a summary see below for the details of each classes supported methods and properties.

There is good support for BluetoothRadio, BluetoothDeviceInfo (including RSSI), and device discovery including ‘live’ discovery. There is preliminary support for BluetoothListener, see below. BluetoothSecurity is also well supported both PairRequest and RemoveDevice, and also SetPin both there and on BluetoothClient. There is only good support for SDP querying.

BluetoothClient.Connect is supported for all RFCOMM/SPP connections. BluetoothClient.Authenticate and Encrypt are not supported (haven't looked), and as noted above we do support SetPin.

Data transfer (for BluetoothClient and BluetoothListener) seems fine.

The current BluetoothListener support is preliminary. It isn't clear from the API how to support multiple connections to the same port number, or even whether multiple concurrent connections to the same port number are supportable. There is however good support for SDP records, including custom records.

ObexWebRequest and ObexListener both work — listener operation of course limited as above.

To check if Stonestreet One Bluetopia support is being loaded, check whether BluetoothRadio.PrimaryRadio or AllRadios returns a radio and whether it's SoftwareManufacturer is an enum value of StonestreetOne.

Please let me have any feedback.

Multi-stack

It is not possible to use the Stonestreet One Bluetopia stack along with any other stack. As noted above is not even possible for two applications to use the stack together.

BluetoothRadio

The ‘one application at a time limitation’ also means that the radio is apparently powered-down when no application is using the stack (third-party or BTExplorer.exe). It also means that the radio Mode (connectable/discoverable), Name and Class of Device are not persistent — at each stack open, they default respectively to non-connectable/non-discoverable (so can make client connections), a system specific value e.g. “mobile compia” and zero . 32feet.NET currently does not persist any of these values across sessions currently.

Radio settings (e.g. Mode and Name) are also lost when the devices goes into standby even when the stack connection stay open. We aim to look at this sometime in the future storing any settings made by the application and reapplying them on power resume.

To Do:

  1. Mode 1) BothOff 2) BothOn 3) !Disco&NotConno
  2. Change radio Name. 32feet sees?
  3. Set Name; ex?
  4. Set Mode; ex?
  5. Radio turned off
  6. Hardware unplugged
  7. Double-check Off->Connectable transition.

See the two tables after this one for the values of the properties when the radio is disabled or un-plugged.

Test Expected Result Seen by MSFT support
ClassOfDevice ClassOfDevice { get; } No default 0 1A0114
IntPtr Handle { get; } NotSupported  
HardwareStatus HardwareStatus { get; } Running
BluetoothAddress LocalAddress { get; } 00:18:9A:11:6D:97 00:18:9A:11:6D:97
Manufacturer Manufacturer { get; } Broadcom Corporation CambridgeSiliconRadio CambridgeSiliconRadio
RadioMode Mode { get; … Connectable & Discoverable:
  • No & Yes
  • Yes & Yes
  • No & No
  • No & Yes!!
Results:
  • xxConnectable
  • xxDiscoverable
  • xxPowerOff
  • xxPowerOff
Results:
  • xxConnectable
  • xxDiscoverable
  • xxPowerOff
  • xxPowerOff
(
  • PowerOff: Can't connect-to/SDP-query the device. However the device can connect to other devices.
)
        set; } Results:
  • PowerOff ✔
  • Connectable ✔
  • Discoverable ✔
Results:
  • PowerOff ✔
  • Connectable ✔
  • Discoverable ✔
string Name { get; … alanlt2w mobile compia <blank>
        set; } NotImplemented NotImplemented
Manufacturer SoftwareManufacturer { get; } StonestreetOne Microsoft
HciVersion HciVersion { get; }   v2_0wEdr v2_0wEdr
int HciRevision { get; }   3454 3454
LmpVersion LmpVersion { get; }   v2_0wEdr v2_0wEdr
int LmpSubversion { get; }   3454 3454

Radio turned off

Property Value
HardwareStatus Shutdown
Mode PowerOff
Name empty (String.Empty)
Address empty (BluetoothAddress.None)
Status of other properties is undefined.

Hardware unplugged

Not applicable.

BluetoothDeviceInfo

Similar to the radio situation, the Bluetopia stack does not persist any device information. So each application would have to store its own device records (e.g. address, name, CoD, LinkKey, etc). 32feet.NET stores known devices within a session but does not persist then across sessions. The stack does not even cache device names within one session, so 32feet.NET has to do so manually.

To Do:

  1. DeviceName read, change name on remote device, check DeviceName is updated after a call to Refresh.
  2. LastSeen.

To Do, for created-from:

  1. By Discovery — Remembered.
  2. By Discovery — Authenticated.
  3. By Address — Get a Remembered device.
  4. By Address — Get an Authenticated device.
  5. By Address — Get a Non-existent device.
  6. By Address — Get an Unknown but in-range Device.
  7. By Discovery — DiscoOnly.
  8. By Discovery — Unknown.
  9. By Discovery — All devices.
  10. By ‘Live’ Discovery — All devices.

Test Notes

  1. May want to check Remembered list from Discovery at each step so see when that stack adds remembers devices.
  2. Check timings of “by Address” cases.
Test Result
bool Authenticated { get; }
ClassOfDevice ClassOfDevice { get; }
bool Connected { get; }
BluetoothAddress DeviceAddress { get; }
string DeviceName { get; …
                                   set; } ✘ NotImplemented
byte[][] GetServiceRecordsUnparsed(Guid service); ✘ NotSupported
ServiceRecord[] GetServiceRecords(Guid service); ✔ Fully supported
Guid[] InstalledServices { get; } ✘ NotSupportedException
DateTime LastSeen { get; } ✔ Set by device discovery.
DateTime LastUsed { get; } ✘ Returns DateTime.MinValue.
void Refresh(); ✔ Resets DeviceName alone.
bool Remembered { get; }
int Rssi { get; } ✔ Needs a connection to the remote device to work.
void SetServiceState(Guid service, bool state,
bool throwOnError);
✘ NotSupportedException
void SetServiceState(Guid service, bool state);
void ShowDialog(); ✘ NotImplemented
void Update(); ✘ NotImplemented

BluetoothClient

To Do:

  1. xxxx
  2. xxxx
32feet.NET
BluetoothDeviceInfo[] DiscoverDevices(…) ✔ All/Rmbd/DiscoOnly/etc
BluetoothDeviceInfo[] Begin-/EndDiscoverDevices(…)
TimeSpan InquiryLength { get;
int InquiryAccessCode { get; set; } NotImplemented
void Connect(…);
void Begin-/EndConnect(…);
bool Connected { get; } ✔ See NetworkStream below.
NetworkStream GetStream();
Socket Client { get; set; } ✘ NotSupported
int Available { get; }
LingerOption LingerState { get; set; }
void Dispose(); ✔ (ToDo disallow/abort device discovery ).
bool Authenticate { get; … ✔ returns false
set; } ✘ NotSupported
bool Encrypt { get; … ✔ returns false
set; } ✘ NotSupported
void SetPin(string pin);
void SetPin(BluetoothAddress device, string pin);
Guid LinkKey { get; } NotImplemented
LinkPolicy LinkPolicy { get; } NotImplemented
string GetRemoteMachineName(BluetoothAddress)
string RemoteMachineName { get; }
BluetoothEndPoint RemoteEndPoint { get; }

Discovery

See BluetoothDeviceInfo for discovery testing.

To Do:

Test Result Error code on MSFT+Win32

Connect

Test Result Error code on MSFT+Win32
Service with SIG Class Id e.g. Wap
Service with custom (non-SIG) Class Id
(Use BtLsnr->ListSomeCustomUuids)
Connect to a particular port number
No Service with given Class Id ✔ 10049 (PortLookup_Zero) 10049 AddressNotAvailable
No Device with given Address — to ClassId 10038 @ 6seconds 10060 TimedOut
No Device with given Address — to Port ✔ 10060 @ 6seconds (PortCONNECT_ERR) "0x1=ConnectionTimeout" 10060 TimedOut
Service doesn't have RFCOMM pdl ✔ 10064 (PortLookup_NoneRfcomm) 10064 HostDown
Already a connection to the RFCOMM port/channel ✔ 10048 (-70 = RFCOMM_UNABLE_TO_ADD_CONNECTION) 10048 AddressAlreadyInUse
Connect to 0x1101 SerialPort
Connect to 0x1105 OBEX Push ✔ (ObexWebRequest successful also)
Connect to 0x1106 OBEX FTP ✔ (ObexWebRequest successful also)
Connect to server that has "require authentication"
(and Pin etc not set)
10061 PortCONNECT_ERR Log shows "0x2=ConnectionRefused"
Slow & see auth events! Wc+XP: 52 seconds
TODO Send Negative AuthEvent responses when no records to speed this up.

NetworkStream

To Do:

  1. Read when buffer empty.
  2. Write an amount bigger than the buffer size.
  3. Is connection closed automatically on app exit?
  4. Is connection closed automatically on app crash GPF/etc?
  5. Is connection closed automatically on Radio Off?
  6. Read after remote close when there is still data in the buffer.
  7. Pending Read through remote close when the remote sends data immediately before close.
  8. Finalizable? Drop references to client and stream and check that the connection closes.
Test Result
SendOneAtATime
SendLots (Write an amount bigger than the buffer size.)
ReceiveLots ✔ (Took 2min15secs seconds to complete (UI updating...))
SendOneByteAtImmediatelyClose ✔ (Done when connection opened as client and as server)
Read when buffer empty, and send, see receive.
Connection closed automatically on app exit
Connection closed automatically on app crash GPF/etc ✔ Killed by remote process viewer (and "No" to quit prompt). The close was seen belatedly by the peer — presumable after Link Supervisory.
Connection closed automatically on Radio Off N/A: Remember that RadioOff on this platform means Non-Connectable-Mode, and not radio-powered-down…
Read after remote close when there is still data in the buffer.
Pending Read through remote close when the remote sends data immediately before close.
Finalizable? Drop references to client and stream and check that the connection closes.

BluetoothListener

Supported, but can only accept one connection. It isn't clear from the API how to support multiple connections to the same port number, or even whether multiple concurrent connections to the same port number are supportable. The second and subsequent Accepts will fail. There is however good support for SDP records, including custom records.

Test Result
void Start(int backlog);
void Start();
void Stop();
bool Pending();
BluetoothEndPoint LocalEndPoint { get; } ✔ Port is set, address (and service) are not
Socket Server { get; }
BluetoothClient AcceptBluetoothClient();
BluetoothClient Begin-/EndAcceptBluetoothClient(…);
Socket AcceptSocket();
Socket Begin-/EndAcceptSocket(…);
ServiceClass ServiceClass { get;
set; }
string ServiceName { get; set; }
ServiceRecord ServiceRecord { get; }
bool Authenticate { get; set; }
bool Encrypt { get; set; }
void SetPin(BluetoothAddress device, string pin);

Exception on first connect to BluetoothListener

The exception that occurs when running the Chat2Device sample and a client connects. This exception occurs because the system does not allow the second listen operation.

InTheHand.Net.Bluetooth.StonestreetOne.BluetopiaSocketException was unhandled
  Message="An operation was attempted on something that is not a socket (Bluetopia: RFCOMM_ADDING_SERVER_INFORMATION (-68))."
  ErrorCode=10038
  NativeErrorCode=10038
  BluetopiaError="RFCOMM_ADDING_SERVER_INFORMATION"
  BluetopiaErrorCode=-68
  StackTrace:
       at InTheHand.Net.Bluetooth.StonestreetOne.BluetopiaUtils.Throw(BluetopiaError ret, String descr)
       at InTheHand.Net.Bluetooth.StonestreetOne.BluetopiaUtils.CheckAndThrow(BluetopiaError ret, String descr)
       at InTheHand.Net.Bluetooth.StonestreetOne.BluetopiaRfcommStream.DoOpenServer(Int32 scn)
       at InTheHand.Net.Bluetooth.Factory.CommonRfcommStream.BeginAccept(BluetoothEndPoint bep, String serviceName, AsyncCallback asyncCallback, Object state)
       at InTheHand.Net.Bluetooth.Factory.CommonBluetoothListener._StartOneNewListenerPort_inLock()
       at InTheHand.Net.Bluetooth.Factory.CommonBluetoothListener.StartEnoughNewListenerPort_inLock()
       at InTheHand.Net.Bluetooth.Factory.CommonBluetoothListener.PortAcceptCallback(IAsyncResult ar)
       at InTheHand.Net.AsyncResultNoResult.CallbackRunner(Object state)
       at System.Threading.ThreadPool.WorkItem.doWork(Object o)
       at System.Threading.Timer.ring()   

BluetoothSecurity

To Do:

  1. RemoveDevice
  2. RemoveDevice full remove?
  3. Have LinkKey but remote has deleted theirs…
Test Expected Result
PairRequest(BluetoothAddress device, string pin) ✔ See below.
RemoveDevice(BluetoothAddress device) ✘ NotImplemented
 
SetPin(BluetoothAddress device, string pin) ✔ (Also used by BtCli.SetPin)
RevokePin(BluetoothAddress device) ✔ (Also used by BtCli.SetPin)
 
BluetoothAddress GetPinRequest() ✘ NotImplemented.
RefusePinRequest(BluetoothAddress device) ✘ NotImplemented.
 
SetLinkKey(BluetoothAddress a, Guid linkkey) ✘ NotImplemented.

PairRequest

Test Expected Result Internals
Success True True (peer: MSFT+Win32)
Authenticate_Callback: type: LinkKeyRequest, addr: 008098244CA4
  Sending Auth Response: -ve (no linkkey)
Authenticate_Callback: type: PINCodeRequest, addr: 008098244CA4
  Sending Auth Response: PinCode
    len: 6 [00-00-00-38-38-33-31-32-30-00-00-00-00-00-00-00-00-00-00]withPad
Authenticate_Callback: type: LinkKeyCreation, addr: 008098244CA4
Authenticate_Callback: type: AuthenticationStatus, addr: 008098244CA4
  Status: NO_ERROR)
Local Radio PowerOff Unknown (True) True (peer: iPhone)
Authenticate_Callback: type: LinkKeyRequest, addr: 0026B09C49CE
  Sending Auth Response: -ve (no linkkey)
Authenticate_Callback: type: PINCodeRequest, addr: 0026B09C49CE
  Sending Auth Response: PinCode
    len: 6 [38-38-33-31-32-30-00-00-00-00-00-00-00-00-00-00]
Authenticate_Callback: type: LinkKeyCreation, addr: 0026B09C49CE
Authenticate_Callback: type: AuthenticationStatus, addr: 0026B09C49CE
  Status: NO_ERROR)
Device not in range False False (12 seconds)
Authenticate_Callback: type: AuthenticationStatus, addr: 002233445566
  Status: PAGE_TIMEOUT)
Fails with my WM6 Benq phone (True) False
– Do not see a prompt on the phone.
Authenticate_Callback: type: LinkKeyRequest, addr: 001702005073
  Have Pin: True, LinkKey: False
  Sending Auth Response: -ve (no linkkey)
Authenticate_Callback: type: PINCodeRequest, addr: 001702005073
  Have Pin: True, LinkKey: False
  Sending Auth Response: PinCode
    len: 6 [00-00-00-38-38-33-31-32-30-00-00-00-00-00-00-00-00-00-00]withPad
Authenticate_Callback: type: AuthenticationStatus, addr: 001702005073
  Status: AUTHENTICATION_FAILURE)
  Have Pin: True, LinkKey: False
Peer slightly dead: Widcomm+XP False False (47 seconds)
Authenticate_Callback: type: LinkKeyRequest, addr: 000A3A6865BB
  Sending Auth Response: -ve (no linkkey)
Authenticate_Callback: type: PINCodeRequest, addr: 000A3A6865BB
  Sending Auth Response: PinCode
    len: 6 [38-38-33-31-32-30-00-00-00-00-00-00-00-00-00-00]
Authenticate_Callback: type: AuthenticationStatus, addr: 000A3A6865BB
  Status: LMP_RESPONSE_TIMEOUT)
Wrong passcode on peer False False (iPhone)
Authenticate_Callback: type: LinkKeyRequest, addr: 0026B09C49CE
  Sending Auth Response: -ve (no linkkey)
Authenticate_Callback: type: PINCodeRequest, addr: 0026B09C49CE
  Sending Auth Response: PinCode
    len: 6 [00-00-00-38-38-33-31-32-30-00-00-00-00-00-00-00-00-00-00]withPad
Authenticate_Callback: type: AuthenticationStatus, addr: 0026B09C49CE
  Status: AUTHENTICATION_FAILURE)

BluetoothClient.SetPin

Test Expected Result Internals
Connecting to device needing authentication
— no PIN etc
Fail to connect SUCCESS 30seconds
(SocketException 10038(!TODO!))
BeginFillInPortState
Authenticate_Callback: type: LinkKeyRequest, addr: 0007809CC2E9
  No Pin or LinkKey for that device, exiting.
HandleSDP_Response_Callback2: ConnectionError=0x1
Connecting to device needing authentication
— where NOT previously connected/auth'd
— with BtCli.SetPin(p)
Success connect SUCCESS
BeginFillInPortState
Authenticate_Callback: type: LinkKeyRequest, addr: 0007809CC2E9
  Have Pin: True, LinkKey: False
  Sending Auth Response: -ve (no linkkey)
Authenticate_Callback: type: PINCodeRequest, addr: 0007809CC2E9
  Have Pin: True, LinkKey: False
  Sending Auth Response: PinCode
    len: 4 [33-30-39-39-00-00-00-00-00-00-00-00-00-00-00-00]
Authenticate_Callback: type: LinkKeyCreation, addr: 0007809CC2E9
  Have Pin: True, LinkKey: False
HandleSDP_Response_Callback2: ServiceSearchAttributeResponse=0x5
FillInPort_ServiceDiscoveryCallback, got port: 1
Authenticate_Callback: type: LinkKeyRequest, addr: 0007809CC2E9
  Have Pin: True, LinkKey: True
  Sending Auth Response: LinkKey)
    len: 16
HandleSPP_Event_Callback2: Port_Open_Confirmation=0x1
EventConnectConf: Success=0x0
CONNECTED DEBUGID; m_state: New; m_arConnect (set), IsCompleted: False.
Connecting to device needing authentication
— where NOT previously connected/auth'd
— with BtCli.SetPin(a,p)
Success connect SUCCESS
BeginFillInPortState
Authenticate_Callback: type: LinkKeyRequest, addr: 0007809CC2E9
  Have Pin: True, LinkKey: False
  Sending Auth Response: -ve (no linkkey)
Authenticate_Callback: type: PINCodeRequest, addr: 0007809CC2E9
  Have Pin: True, LinkKey: False
  Sending Auth Response: PinCode
    len: 4 [33-30-39-39-00-00-00-00-00-00-00-00-00-00-00-00]
Authenticate_Callback: type: LinkKeyCreation, addr: 0007809CC2E9
  Have Pin: True, LinkKey: False
The thread 0x45fc9636 has exited with code 0 (0x0).
HandleSDP_Response_Callback2: ServiceSearchAttributeResponse=0x5
BuildRecordList Number_Service_Records: 1
DoEndServiceDiscovery, got 1 records.
FillInPort_ServiceDiscoveryCallback, got port: 1
Authenticate_Callback: type: LinkKeyRequest, addr: 0007809CC2E9
  Have Pin: True, LinkKey: True
  Sending Auth Response: LinkKey)
    len: 16
HandleSPP_Event_Callback2: Port_Open_Confirmation=0x1
EventConnectConf: Success=0x0
CONNECTED DEBUGID; m_state: New; m_arConnect (set), IsCompleted: False.
Connecting to device needing authentication
— where were previously connected/auth'd
— with BtCli.SetPin.
Success connect SUCCESS
BeginFillInPortState
Doing address-less PIN now.
Authenticate_Callback: type: LinkKeyRequest, addr: 0007809CC2E9
  Have Pin: True, LinkKey: True
  Sending Auth Response: LinkKey)
    len: 16
HandleSDP_Response_Callback2: ServiceSearchAttributeResponse=0x5
BuildRecordList Number_Service_Records: 1
DoEndServiceDiscovery, got 1 records.
FillInPort_ServiceDiscoveryCallback, got port: 1
Authenticate_Callback: type: LinkKeyRequest, addr: 0007809CC2E9
  Have Pin: True, LinkKey: True
  Sending Auth Response: LinkKey)
    len: 16
HandleSPP_Event_Callback2: Port_Open_Confirmation=0x1
EventConnectConf: Success=0x0
CONNECTED DEBUGID; m_state: New; m_arConnect (set), IsCompleted: False.
Connecting to device needing authentication
— where were previously connected/auth'd
— with NO BtCli.SetPin.
Success connect SUCCESS
BeginFillInPortState                
Authenticate_Callback: type: LinkKeyRequest, addr: 0007809CC2E9
  Have Pin: True, LinkKey: True
  Sending Auth Response: LinkKey)
    len: 16
HandleSDP_Response_Callback2: ServiceSearchAttributeResponse=0x5
BuildRecordList Number_Service_Records: 1
DoEndServiceDiscovery, got 1 records.
FillInPort_ServiceDiscoveryCallback, got port: 1
Authenticate_Callback: type: LinkKeyRequest, addr: 0007809CC2E9
  Have Pin: True, LinkKey: True
  Sending Auth Response: LinkKey)
    len: 16
HandleSPP_Event_Callback2: Port_Open_Confirmation=0x1
EventConnectConf: Success=0x0
CONNECTED DEBUGID; m_state: New; m_arConnect (set), IsCompleted: False.
Connecting to Port number to device needing authentication
— where were not previously connected/auth'd
— with BtCli.SetPin.
Success connect SUCCESS
BeginFillInPortState
BeginFillInPort, has port -> Completed Syncronously
Authenticate_Callback: type: PINCodeRequest, addr: 001583B41BFA
  Have Pin: True, LinkKey: False
  Sending Auth Response: PinCode
    len: 6 [38-38-33-31-32-30-00-00-00-00-00-00-00-00-00-00]
Authenticate_Callback: type: LinkKeyCreation, addr: 001583B41BFA
  Have Pin: True, LinkKey: False
HandleSPP_Event_Callback2: Port_Open_Confirmation=0x1
EventConnectConf: Success=0x0
CONNECTED DEBUGID; m_state: New; m_arConnect (set), IsCompleted: False.
HandleSPP_Event_Callback2: Port_Status_Indication=0x3
Revoking address-less PIN now.
RevokePin<-RevokeAddressLessPin: True
GAP_Remote_Name_Event_Data: status: NO_ERROR, addr: 001583B41BFA
  name: ALANPC1
DeviceMenuTesting stopping DEBUG at 22/04/11 14:11:16

PairRequest overrides stored-LinkKey
(PairRequest success and again PairRequest -- see it NOT using the stored-LinkKey)

Test Expected Result Internals
PairRequest first time Success SUCCESS
Authenticate_Callback: type: LinkKeyRequest, addr: 0007809CC2E9
  Have Pin: True, LinkKey: False
  Sending Auth Response: -ve (no linkkey)
Authenticate_Callback: type: PINCodeRequest, addr: 0007809CC2E9
  Have Pin: True, LinkKey: False
  Sending Auth Response: PinCode
    len: 4 [33-30-39-39-00-00-00-00-00-00-00-00-00-00-00-00]
Authenticate_Callback: type: LinkKeyCreation, addr: 0007809CC2E9
  Have Pin: True, LinkKey: False
Authenticate_Callback: type: AuthenticationStatus, addr: 0007809CC2E9
  Status: NO_ERROR)
  Have Pin: True, LinkKey: False
PairRequest second time Success, and see it NOT send the stored-LinkKey SUCCESS
Authenticate_Callback: type: LinkKeyRequest, addr: 0007809CC2E9
  Have Pin: True, LinkKey: False
  Sending Auth Response: -ve (no linkkey)
Authenticate_Callback: type: PINCodeRequest, addr: 0007809CC2E9
  Have Pin: True, LinkKey: False
  Sending Auth Response: PinCode
    len: 4 [33-30-39-39-00-00-00-00-00-00-00-00-00-00-00-00]
The thread 0x687261e has exited with code 0 (0x0).
Authenticate_Callback: type: LinkKeyCreation, addr: 0007809CC2E9
  Have Pin: True, LinkKey: False
Authenticate_Callback: type: AuthenticationStatus, addr: 0007809CC2E9
  Status: NO_ERROR)
  Have Pin: True, LinkKey: False
PairRequest third time, wrong PIN Fail, and see it NOT send the stored-LinkKey SUCCESS
Authenticate_Callback: type: LinkKeyRequest, addr: 0007809CC2E9
  Have Pin: True, LinkKey: False
  Sending Auth Response: -ve (no linkkey)
Authenticate_Callback: type: PINCodeRequest, addr: 0007809CC2E9
  Have Pin: True, LinkKey: False
  Sending Auth Response: PinCode
    len: 7 [38-38-33-31-32-30-20-00-00-00-00-00-00-00-00-00]
Authenticate_Callback: type: AuthenticationStatus, addr: 0007809CC2E9
  Status: AUTHENTICATION_FAILURE)
  Have Pin: True, LinkKey: False

ObexWebRequest

Supported.

Test Result
To non-existent device SUCCESS: WebEx=>SockEx (SDP)
To fsquirt.exe on XP SUCCESS (sent 70029 bytes)
To Widcomm+XP SUCCESS (sent 40034 bytes)
GET, To Widcomm+XP SUCCESS (received 84 bytes)

ObexListener

Partially supported — BluetoothListener can accept only one connection.

Test Result
From fMT on MSFT+XP SUCCESS
From fsquirt.exe on XP SUCCESS (sent 1840 bytes)

BTW before running: no SDP record. When running:

AttrId: 0x0000 -- ServiceRecordHandle
UInt32: 0x10000

AttrId: 0x0001 -- ServiceClassIdList
ElementSequence
    Uuid128: 00001105-0000-1000-8000-00805f9b34fb -- ObexObjectPush

AttrId: 0x0002 -- ServiceRecordState
UInt32: 0x2

AttrId: 0x0004 -- ProtocolDescriptorList
ElementSequence
    ElementSequence
        Uuid16: 0x100 -- L2CapProtocol
    ElementSequence
        Uuid16: 0x3 -- RFCommProtocol
        UInt8: 0xB
    ElementSequence
        Uuid16: 0x8 -- ObexProtocol
( ( L2Cap ), ( Rfcomm, ChannelNumber=11 ), ( Obex ) )

AttrId: 0x0303 -- SupportedFormatsList
ElementSequence
    UInt8: 0xFF

Internals

On my M3Sky I see start-up parameters:

Calling BSC_Initialize with:HCI_DriverInformation/COMM (COMM, 32), 'COM' 5, BCSP, 921600; 921600, 500.

That's COM5, BCSP wire protocol, at 921600bps, with initialisation parameters: 921600bps and timeout 500ms. "(COMM, 32)" is the data struct type and size. We don't have support for the USB parameters.

Our previous format was:

Calling BSC_Initialize with:HCI_DriverInformation__HCI_COMMDriverInformation COMM, 32, 5, 921600, BCSP, 500, 921600, 'COM'.

Within a session BluetopiaFactory stores a list (hashtable) of Device Address and Name information. Similarly BluetopiaSecurity maintains XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

- end of document -