private void restartInquiry() { clearMessages(); addMessage("Restart Inquiry"); state = STATE.w4_scan_result; services.clear(); devices.clear(); counter = 0; btstack.HCIInquiry(HCI_INQUIRY_LAP, INQUIRY_INTERVAL, 0); }
@SuppressLint("DefaultLocale") public void handlePacket(Packet packet) { if (packet instanceof HCIEventHardwareError) { clearMessages(); addMessage( "Received HCIEventHardwareError, \nhandle power cycle of the Bluetooth \nchip of the device."); } if (packet instanceof HCIEventDisconnectionComplete) { HCIEventDisconnectionComplete event = (HCIEventDisconnectionComplete) packet; testHandle = event.getConnectionHandle(); addMessage( String.format( "Received disconnect, status %d, handle %x", event.getStatus(), testHandle)); restartInquiry(); return; } switch (state) { case w4_btstack_working: if (packet instanceof BTstackEventState) { BTstackEventState event = (BTstackEventState) packet; if (event.getState() == 2) { addMessage("BTstack working. Set write inquiry mode."); state = STATE.w4_write_inquiry_mode; btstack.HCIWriteInquiryMode(1); // with RSSI } } break; case w4_write_inquiry_mode: if (packet instanceof HCIEventCommandComplete) { state = STATE.w4_scan_result; btstack.HCIInquiry(HCI_INQUIRY_LAP, INQUIRY_INTERVAL, 0); } break; case w4_scan_result: if (packet instanceof HCIEventInquiryResultWithRssi) { HCIEventInquiryResultWithRssi result = (HCIEventInquiryResultWithRssi) packet; devices.add( new RemoteDevice( result.getBdAddr(), result.getPageScanRepetitionMode(), result.getClockOffset())); addMessage("Found device: " + result.getBdAddr()); } if (packet instanceof HCIEventInquiryComplete) { state = STATE.w4_remote_name; if (hasMoreRemoteNameRequests()) { doNextRemoteNameRequest(); break; } } break; case w4_remote_name: if (packet instanceof HCIEventRemoteNameRequestComplete) { HCIEventRemoteNameRequestComplete result = (HCIEventRemoteNameRequestComplete) packet; if (result.getStatus() == 0) { // store name on success setNameForDeviceWithBDAddr(result.getRemoteName(), result.getBdAddr()); } if (hasMoreRemoteNameRequests()) { doNextRemoteNameRequest(); break; } // discovery done, connect to device with remote name prefix RemoteDevice remoteDevice = null; for (RemoteDevice device : devices) { if (device.getName() != null && device.getName().startsWith(REMOTE_DEVICE_NAME_PREFIX)) { remoteDevice = device; } } // try first one otherwise if (remoteDevice == null && devices.size() > 0) { remoteDevice = devices.get(0); } // no device, restart inquiry if (remoteDevice == null) { restartInquiry(); break; } // start SDP query for RFCOMMM services remoteBDAddr = remoteDevice.getBDAddress(); if (remoteDevice.getName() == null) { addMessage("Start SDP Query of " + remoteDevice.getBDAddress()); } else { addMessage("Start SDP Query of " + remoteDevice.getName()); } state = STATE.w4_sdp_query_result; byte[] serviceSearchPattern = Util.serviceSearchPatternForUUID16(SPP_UUID); btstack.SDPClientQueryRFCOMMServices(remoteBDAddr, serviceSearchPattern); break; } break; case w4_sdp_query_result: if (packet instanceof SDPQueryRFCOMMService) { SDPQueryRFCOMMService service = (SDPQueryRFCOMMService) packet; services.add(service); addMessage( String.format( "Found \"%s\", channel %d", service.getName(), service.getRFCOMMChannel())); } if (packet instanceof SDPQueryComplete) { // find service with "SPP" prefix SDPQueryRFCOMMService selectedService = null; for (SDPQueryRFCOMMService service : services) { if (service.getName().startsWith(RFCOMM_SERVICE_PREFIX)) { selectedService = service; break; } } // restart demo, if no service with prefix found if (selectedService == null) { restartInquiry(); break; } // connect state = STATE.w4_connected; clearMessages(); addMessage("SPP Test Application / Part 2"); addMessage("Connect to channel nr " + selectedService.getRFCOMMChannel()); btstack.RFCOMMCreateChannel(remoteBDAddr, selectedService.getRFCOMMChannel()); } break; case w4_connected: if (packet instanceof RFCOMMEventOpenChannelComplete) { RFCOMMEventOpenChannelComplete e = (RFCOMMEventOpenChannelComplete) packet; if (e.getStatus() != 0) { addMessage("RFCOMM channel open failed, status " + e.getStatus()); } else { state = STATE.active; rfcommChannelID = e.getRFCOMMCid(); mtu = e.getMaxFrameSize(); addMessage( String.format( "RFCOMM channel open succeeded. \nNew RFCOMM Channel ID %d,\n max frame size %d", rfcommChannelID, mtu)); counter = 0; new Thread( new Runnable() { @Override public void run() { try { while (state == STATE.active) { Thread.sleep(1000); byte[] data; try { data = String.format("BTstack SPP Counter %d\n", counter) .getBytes("utf8"); if (counter < Integer.MAX_VALUE) { counter++; } else { counter = 0; } btstack.RFCOMMSendData(rfcommChannelID, data); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } catch (InterruptedException e) { } } }) .start(); } } break; case active: if (packet instanceof RFCOMMDataPacket) { addTempMessage("Received RFCOMM data packet: \n" + packet.toString()); } break; default: break; } }