Transcript The Bluetooth Bridge
Bluetooth Integration
Building Bridges to Bluetooth Enabled Peripherals
Ryan McMahan • Senior Software Engineer Shared Technology • Intermec
Presentation Focus
• • • • Code • Tight Integration with Your App Wireless Printing Wireless Scanning Microsoft APIs
Multiblue
• A sample application • Bluetooth Printing setup • • Switching printers Bluetooth Scanning setup • Scanner setup via ISCP (Intermec Scanner Control Protocol) • Device Discovery • • Found device event Scanning • Printing
Multiblue – Application Flow
1.
2.
3.
4.
5.
6.
7.
8.
Startup Scanner setup Printer setup Scan Print Switch printers Print Shutdown
Multiblue - Startup
• • Turn the radio on • Intermec Bluetooth Library • IBT_On() • Available in Intermec Developer Library (IDL) Why would you leave it off?
• • Power savings Security policies • No radio zones
Be a Good Radio Citizen
• • •
Try
to maintain the previous radio state when exiting your app Knowing when not to turn off is easier than knowing when it is safe to turn off Intermec APIs for Bluetooth • IBT_On • IBT_Off
Multiblue – Scanner Setup
• • • Add to Data Collection – Handles all of the connection maintenance • Related session – “Accelerating Development with the Intermec Data Collection Engine” COM port connections are possible as well How do we know which scanner to connect to?
• Device Address is the key for connections • Device Discovery • Barcode scan • Read from a file • Manually entry
Avoiding Device Discovery
• • • • Very powerful and useful Can take longer than you’d like, especially in populated areas • Inquiry is traditionally fixed (approximately 10s) • Device name lookup is variable (0-10s) and handled one device at a time You can skip name lookup, but results are less valuable Approximate total time in seconds • 10 + (num_devices * 3)
Barcode Scan
• • • Scanner – SF51 Route Printer – PB41 Depot Printer – PB42
Reading Local Device Address
• 3 Steps • • Initialize Winsock Create and bind a socket • getsockname()
Reading Local Device Address
• Step 1: Initialize Winsock WSADATA wsaData; WORD wVer = MAKEWORD( 2, 2 ); if(WSAStartup(wVer, &wsaData) != 0) AfxMessageBox(_T("Could not initialize"));
Reading Local Device Address
• Step 2: Create and bind a socket SOCKET s = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM); SOCKADDR_BTH sab; memset(&sab, 0, sizeof(sab)); sab.addressFamily = AF_BTH; sab.port = 0; int len = sizeof(sab); bind(s, (sockaddr *)&sab,len);
Reading Local Device Address
• Step 3: getsockname if(0 == getsockname(s, (sockaddr *)&sab, &len)) code.Format(_T("%04x%08x"), GET_NAP(sab.btAddr), GET_SAP(sab.btAddr)); closesocket(s); code.MakeUpper(); m_cDeviceAddress.SetWindowText(code);
Live Display
• Bluetooth Scanner in Intermec Settings
Multiblue – Printer Setup
• • Prepare two printers – one COM port How do we know which printer to connect to?
• Device Address is the key for connections • • Device Discovery Barcode scan – leverage our scanner connection • Read from a file • Manually entry
Printer Self-test
• • Contains useful setup information Newer products contain a Code 128 representation of the Bluetooth Device Address
Device Address Separators
• • • Common separator forms • • AA:BB:CC:11:22:33 AA.BB.CC.11.22.33
• AA-BB-CC-11-22-33 • AA BB CC 11 22 33 Good for humans, less interesting to computers Suggestion – include code to filter out device address separators
Barcode Scan
• • • Code Note: I modify the postamble Route Printer – PB41 Depot Printer – PB42
COM Port Registration
• • • Things You Need • • • • Remote Device Address Port index – COM6 is a good choice Port prefix – COM or BSP Service UUID or RFCOMM channel Could be on different COM ports • We’ll make them share to illustrate deregistration The dreaded 2404 • • The device is in use by an active process and cannot be disconnected. Something is already registered on that port • Choose another port or deregister
Registration Code
PORTEMUPortParams pp; TCHAR prefix[3+1]; // COM or BSP pp.device = bdaddr; pp.channel = 0; // Let it auto-SDP memcpy(&pp.uuidService, &SerialPortServiceClass_UUID, sizeof(GUID)); tcscpy(prefix, L"COM"); int index = 6; hBluetoothPort = RegisterDevice(prefix, index, L"btd.dll", (DWORD)&pp);
Deregistration Code
DeregisterDevice(hBluetoothPort);
COM Port APIs
• • Same as traditional COM Ports • CreateFile & CloseFile • ReadFile & WriteFile • GetCommMask & SetCommMask • GetCommState & SetCommState • WaitCommEvent • DCB Structure Be careful with uiportflags parameter
Confirmation Print
• • Common technique to verify setup It can be bad • Requires printer to be in range and turned on • Could be wasteful depending on frequency of setup and app design
Device Discovery
• • Background thread to detect location • • Allows us to auto-switch the default printer Bluetooth GPS is perfect for this Multiblue will use this to recognize when our depot printer is ready
Device Discovery Code
iRet = WSALookupServiceBegin (&wsaq, LUP_CONTAINERS, phLookup);
Demo
• Multiblue in action
Learn More
• • • Bluetooth Resource Kit in Intermec Developer Library • Wp_sample2 Microsoft’s Sample Program • Btsearch • • Installs as part of the Pocket PC 2003 SDK \Program Files\Windows CE Tools\wce420\Pocket PC 2003\Samples\Win32\Bluetooth Windows Embedded Source Tools for Bluetooth Technology • A Win32 API Wrapper that developers can expose in Visual Studio .NET or the .NET Compact Framework
Questions?
• Yes, I will make this code available