xref: /btstack/port/mtk/SPPClient/src/com/bluekitchen/sppclient/MainActivity.java (revision c9eeefbc1a8d32c2c32450cacfb8ade67133fea8)
18caefee3SMatthias Ringwald package com.bluekitchen.sppclient;
28caefee3SMatthias Ringwald 
38caefee3SMatthias Ringwald import java.io.UnsupportedEncodingException;
48caefee3SMatthias Ringwald import java.util.ArrayList;
58caefee3SMatthias Ringwald import java.util.List;
68caefee3SMatthias Ringwald 
78caefee3SMatthias Ringwald import android.annotation.SuppressLint;
88caefee3SMatthias Ringwald import android.app.Activity;
98caefee3SMatthias Ringwald import android.os.Bundle;
108caefee3SMatthias Ringwald import android.util.Log;
118caefee3SMatthias Ringwald import android.view.Menu;
128caefee3SMatthias Ringwald import android.widget.TextView;
138caefee3SMatthias Ringwald 
148caefee3SMatthias Ringwald import com.bluekitchen.btstack.RFCOMMDataPacket;
158caefee3SMatthias Ringwald import com.bluekitchen.btstack.BD_ADDR;
168caefee3SMatthias Ringwald import com.bluekitchen.btstack.BTstack;
178caefee3SMatthias Ringwald import com.bluekitchen.btstack.Packet;
188caefee3SMatthias Ringwald import com.bluekitchen.btstack.PacketHandler;
198caefee3SMatthias Ringwald import com.bluekitchen.btstack.Util;
208caefee3SMatthias Ringwald import com.bluekitchen.btstack.event.BTstackEventState;
218caefee3SMatthias Ringwald import com.bluekitchen.btstack.event.HCIEventCommandComplete;
228caefee3SMatthias Ringwald import com.bluekitchen.btstack.event.HCIEventDisconnectionComplete;
238caefee3SMatthias Ringwald import com.bluekitchen.btstack.event.HCIEventHardwareError;
248caefee3SMatthias Ringwald import com.bluekitchen.btstack.event.HCIEventInquiryComplete;
258caefee3SMatthias Ringwald import com.bluekitchen.btstack.event.HCIEventInquiryResultWithRssi;
268caefee3SMatthias Ringwald import com.bluekitchen.btstack.event.HCIEventRemoteNameRequestComplete;
27*c9eeefbcSMatthias Ringwald import com.bluekitchen.btstack.event.RFCOMMEventChannelOpened;
28045013feSMatthias Ringwald import com.bluekitchen.btstack.event.SDPEventQueryComplete;
29045013feSMatthias Ringwald import com.bluekitchen.btstack.event.SDPEventQueryRFCOMMService;
308caefee3SMatthias Ringwald 
318caefee3SMatthias Ringwald 
328caefee3SMatthias Ringwald public class MainActivity extends Activity implements PacketHandler {
338caefee3SMatthias Ringwald 
348caefee3SMatthias Ringwald 	// minimal Android text UI
358caefee3SMatthias Ringwald 
368caefee3SMatthias Ringwald 	private static final String BTSTACK_TAG = "BTstack";
378caefee3SMatthias Ringwald 
388caefee3SMatthias Ringwald 	private TextView tv;
398caefee3SMatthias Ringwald 	private String onScreenMessage = "";
408caefee3SMatthias Ringwald 
418caefee3SMatthias Ringwald 	@Override
onCreate(Bundle savedInstanceState)428caefee3SMatthias Ringwald 	protected void onCreate(Bundle savedInstanceState) {
438caefee3SMatthias Ringwald 		super.onCreate(savedInstanceState);
448caefee3SMatthias Ringwald 		setContentView(R.layout.activity_main);
458caefee3SMatthias Ringwald 
468caefee3SMatthias Ringwald 		tv = new TextView(this);
478caefee3SMatthias Ringwald 		setContentView(tv);
488caefee3SMatthias Ringwald 
498caefee3SMatthias Ringwald 		test();
508caefee3SMatthias Ringwald 	}
518caefee3SMatthias Ringwald 
addMessage(final String message)528caefee3SMatthias Ringwald 	void addMessage(final String message){
538caefee3SMatthias Ringwald 		onScreenMessage = onScreenMessage + "\n" + message;
548caefee3SMatthias Ringwald 		Log.d(BTSTACK_TAG, message);
558caefee3SMatthias Ringwald 		runOnUiThread(new Runnable(){
568caefee3SMatthias Ringwald 			public void run(){
578caefee3SMatthias Ringwald 				tv.setText(onScreenMessage);
588caefee3SMatthias Ringwald 			}
598caefee3SMatthias Ringwald 		});
608caefee3SMatthias Ringwald 	}
618caefee3SMatthias Ringwald 
addTempMessage(final String message)628caefee3SMatthias Ringwald 	void addTempMessage(final String message){
638caefee3SMatthias Ringwald 		Log.d(BTSTACK_TAG, message);
648caefee3SMatthias Ringwald 		runOnUiThread(new Runnable(){
658caefee3SMatthias Ringwald 			public void run(){
668caefee3SMatthias Ringwald 				tv.setText(onScreenMessage +"\n" + message);
678caefee3SMatthias Ringwald 			}
688caefee3SMatthias Ringwald 		});
698caefee3SMatthias Ringwald 	}
708caefee3SMatthias Ringwald 
clearMessages()718caefee3SMatthias Ringwald 	void clearMessages(){
728caefee3SMatthias Ringwald 		onScreenMessage = "";
738caefee3SMatthias Ringwald 		runOnUiThread(new Runnable(){
748caefee3SMatthias Ringwald 			public void run(){
758caefee3SMatthias Ringwald 				tv.setText(onScreenMessage);
768caefee3SMatthias Ringwald 			}
778caefee3SMatthias Ringwald 		});
788caefee3SMatthias Ringwald 	}
798caefee3SMatthias Ringwald 
808caefee3SMatthias Ringwald 
818caefee3SMatthias Ringwald 	@Override
onCreateOptionsMenu(Menu menu)828caefee3SMatthias Ringwald 	public boolean onCreateOptionsMenu(Menu menu) {
838caefee3SMatthias Ringwald 		// Inflate the menu; this adds items to the action bar if it is present.
848caefee3SMatthias Ringwald 		getMenuInflater().inflate(R.menu.main, menu);
858caefee3SMatthias Ringwald 		return true;
868caefee3SMatthias Ringwald 	}
878caefee3SMatthias Ringwald 
888caefee3SMatthias Ringwald 
898caefee3SMatthias Ringwald 	// helper class to store inquiry results
908caefee3SMatthias Ringwald 	private static class RemoteDevice{
918caefee3SMatthias Ringwald 		private enum NAME_STATE {
928caefee3SMatthias Ringwald 			REMOTE_NAME_REQUEST, REMOTE_NAME_INQUIRED, REMOTE_NAME_FETCHED
938caefee3SMatthias Ringwald 		};
948caefee3SMatthias Ringwald 
958caefee3SMatthias Ringwald 		private BD_ADDR bdAddr;
968caefee3SMatthias Ringwald 		private int pageScanRepetitionMode;
978caefee3SMatthias Ringwald 		private int clockOffset;
988caefee3SMatthias Ringwald 		private String name;
998caefee3SMatthias Ringwald 		private NAME_STATE state;
1008caefee3SMatthias Ringwald 
RemoteDevice(BD_ADDR bdAddr, int pageScanRepetitionMode, int clockOffset)1018caefee3SMatthias Ringwald 		public RemoteDevice(BD_ADDR bdAddr, int pageScanRepetitionMode, int clockOffset) {
1028caefee3SMatthias Ringwald 			this.bdAddr = bdAddr;
1038caefee3SMatthias Ringwald 			this.state = NAME_STATE.REMOTE_NAME_REQUEST;
1048caefee3SMatthias Ringwald 		}
1058caefee3SMatthias Ringwald 
nameRequest()1068caefee3SMatthias Ringwald 		public boolean nameRequest() {
1078caefee3SMatthias Ringwald 			return this.state == NAME_STATE.REMOTE_NAME_REQUEST;
1088caefee3SMatthias Ringwald 		}
1098caefee3SMatthias Ringwald 
inquireName(BTstack btstack)1108caefee3SMatthias Ringwald 		public void inquireName(BTstack btstack) {
1118caefee3SMatthias Ringwald 			this.state = NAME_STATE.REMOTE_NAME_INQUIRED;
1128caefee3SMatthias Ringwald 			btstack.HCIRemoteNameRequest(bdAddr, pageScanRepetitionMode, 0, clockOffset);
1138caefee3SMatthias Ringwald 		}
1148caefee3SMatthias Ringwald 
getBDAddress()1158caefee3SMatthias Ringwald 		public BD_ADDR getBDAddress() {
1168caefee3SMatthias Ringwald 			return this.bdAddr;
1178caefee3SMatthias Ringwald 		}
1188caefee3SMatthias Ringwald 
getName()1198caefee3SMatthias Ringwald 		private String getName() {
1208caefee3SMatthias Ringwald 			return name;
1218caefee3SMatthias Ringwald 		}
1228caefee3SMatthias Ringwald 
setName(String name)1238caefee3SMatthias Ringwald 		private void setName(String name) {
1248caefee3SMatthias Ringwald 			this.state = NAME_STATE.REMOTE_NAME_FETCHED;
1258caefee3SMatthias Ringwald 			this.name = name;
1268caefee3SMatthias Ringwald 		}
1278caefee3SMatthias Ringwald 	}
1288caefee3SMatthias Ringwald 
1298caefee3SMatthias Ringwald 	// constants
1308caefee3SMatthias Ringwald 
1318caefee3SMatthias Ringwald 	private static final int HCI_INQUIRY_LAP = 0x9E8B33;  // 0x9E8B33: General/Unlimited Inquiry Access Code (GIAC)
1328caefee3SMatthias Ringwald 	private static final int INQUIRY_INTERVAL = 5;
1338caefee3SMatthias Ringwald 	private static final int SPP_UUID = 0x1002;
1348caefee3SMatthias Ringwald 
1358caefee3SMatthias Ringwald 	private enum STATE {
1368caefee3SMatthias Ringwald 		w4_btstack_working, w4_write_inquiry_mode, w4_scan_result, w4_remote_name, w4_sdp_query_result, w4_connected, active
1378caefee3SMatthias Ringwald 	};
1388caefee3SMatthias Ringwald 
1398caefee3SMatthias Ringwald 	private static final String REMOTE_DEVICE_NAME_PREFIX = "BTstack SPP";
1408caefee3SMatthias Ringwald 	private static final String RFCOMM_SERVICE_PREFIX = "SPP";
1418caefee3SMatthias Ringwald 
1428caefee3SMatthias Ringwald 	// state
1438caefee3SMatthias Ringwald 
1448caefee3SMatthias Ringwald 	private BTstack btstack;
1458caefee3SMatthias Ringwald 	private STATE state;
1468caefee3SMatthias Ringwald 	private int testHandle;
1478caefee3SMatthias Ringwald 
1488caefee3SMatthias Ringwald 	private int rfcommChannelID = 0;
1498caefee3SMatthias Ringwald 	private int mtu = 0;
1508caefee3SMatthias Ringwald 	private BD_ADDR remoteBDAddr;
1518caefee3SMatthias Ringwald 
152045013feSMatthias Ringwald 	List<SDPEventQueryRFCOMMService> services = new ArrayList<SDPEventQueryRFCOMMService>(10);
1538caefee3SMatthias Ringwald 	List<RemoteDevice> devices = new ArrayList<RemoteDevice>(10);
1548caefee3SMatthias Ringwald 
1558caefee3SMatthias Ringwald 	private int counter;
1568caefee3SMatthias Ringwald 
1578caefee3SMatthias Ringwald 
hasMoreRemoteNameRequests()1588caefee3SMatthias Ringwald 	private boolean hasMoreRemoteNameRequests() {
1598caefee3SMatthias Ringwald 		for (RemoteDevice device:devices){
1608caefee3SMatthias Ringwald 			if (device.nameRequest()){
1618caefee3SMatthias Ringwald 				return true;
1628caefee3SMatthias Ringwald 			}
1638caefee3SMatthias Ringwald 		}
1648caefee3SMatthias Ringwald 		return false;
1658caefee3SMatthias Ringwald 	}
1668caefee3SMatthias Ringwald 
doNextRemoteNameRequest()1678caefee3SMatthias Ringwald 	private void doNextRemoteNameRequest() {
1688caefee3SMatthias Ringwald 		for (RemoteDevice device:devices){
1698caefee3SMatthias Ringwald 			if (device.nameRequest()){
1708caefee3SMatthias Ringwald 				addMessage("Get remote name of " + device.getBDAddress());
1718caefee3SMatthias Ringwald 	            device.inquireName(btstack);
1728caefee3SMatthias Ringwald 	            return;
1738caefee3SMatthias Ringwald 			}
1748caefee3SMatthias Ringwald 		}
1758caefee3SMatthias Ringwald 	}
1768caefee3SMatthias Ringwald 
restartInquiry()1778caefee3SMatthias Ringwald 	private void restartInquiry(){
1788caefee3SMatthias Ringwald 		clearMessages();
1798caefee3SMatthias Ringwald 		addMessage("Restart Inquiry");
1808caefee3SMatthias Ringwald 		state = STATE.w4_scan_result;
1818caefee3SMatthias Ringwald 		services.clear();
1828caefee3SMatthias Ringwald 		devices.clear();
1838caefee3SMatthias Ringwald 		counter = 0;
1848caefee3SMatthias Ringwald 		btstack.HCIInquiry(HCI_INQUIRY_LAP, INQUIRY_INTERVAL, 0);
1858caefee3SMatthias Ringwald 	}
1868caefee3SMatthias Ringwald 
1878caefee3SMatthias Ringwald 	@SuppressLint("DefaultLocale")
handlePacket(Packet packet)1888caefee3SMatthias Ringwald 	public void handlePacket(Packet packet){
1898caefee3SMatthias Ringwald 		if (packet instanceof HCIEventHardwareError){
1908caefee3SMatthias Ringwald 			clearMessages();
1918caefee3SMatthias Ringwald 			addMessage("Received HCIEventHardwareError, \nhandle power cycle of the Bluetooth \nchip of the device.");
1928caefee3SMatthias Ringwald 		}
1938caefee3SMatthias Ringwald 
1948caefee3SMatthias Ringwald 		if (packet instanceof HCIEventDisconnectionComplete){
1958caefee3SMatthias Ringwald 			HCIEventDisconnectionComplete event = (HCIEventDisconnectionComplete) packet;
1968caefee3SMatthias Ringwald 			testHandle = event.getConnectionHandle();
1978caefee3SMatthias Ringwald 			addMessage(String.format("Received disconnect, status %d, handle %x", event.getStatus(), testHandle));
1988caefee3SMatthias Ringwald 			restartInquiry();
1998caefee3SMatthias Ringwald 			return;
2008caefee3SMatthias Ringwald 		}
2018caefee3SMatthias Ringwald 
2028caefee3SMatthias Ringwald 		switch (state){
2038caefee3SMatthias Ringwald 		case w4_btstack_working:
2048caefee3SMatthias Ringwald 			if (packet instanceof BTstackEventState){
2058caefee3SMatthias Ringwald 				BTstackEventState event = (BTstackEventState) packet;
2068caefee3SMatthias Ringwald 				if (event.getState() == 2)	{
2078caefee3SMatthias Ringwald 					addMessage("BTstack working. Set write inquiry mode.");
2088caefee3SMatthias Ringwald 					state = STATE.w4_write_inquiry_mode;
2098caefee3SMatthias Ringwald 					btstack.HCIWriteInquiryMode(1); // with RSSI
2108caefee3SMatthias Ringwald 				}
2118caefee3SMatthias Ringwald 			}
2128caefee3SMatthias Ringwald 			break;
2138caefee3SMatthias Ringwald 
2148caefee3SMatthias Ringwald 		case w4_write_inquiry_mode:
2158caefee3SMatthias Ringwald 			if (packet instanceof HCIEventCommandComplete){
2168caefee3SMatthias Ringwald 				state = STATE.w4_scan_result;
2178caefee3SMatthias Ringwald 				btstack.HCIInquiry(HCI_INQUIRY_LAP, INQUIRY_INTERVAL, 0);
2188caefee3SMatthias Ringwald 			}
2198caefee3SMatthias Ringwald 			break;
2208caefee3SMatthias Ringwald 
2218caefee3SMatthias Ringwald 		case w4_scan_result:
2228caefee3SMatthias Ringwald 			if (packet instanceof HCIEventInquiryResultWithRssi){
2238caefee3SMatthias Ringwald 				HCIEventInquiryResultWithRssi result = (HCIEventInquiryResultWithRssi) packet;
2248caefee3SMatthias Ringwald 				devices.add(new RemoteDevice(result.getBdAddr(), result.getPageScanRepetitionMode(), result.getClockOffset()));
2258caefee3SMatthias Ringwald 				addMessage("Found device: " + result.getBdAddr());
2268caefee3SMatthias Ringwald 			}
2278caefee3SMatthias Ringwald 
2288caefee3SMatthias Ringwald 			if (packet instanceof HCIEventInquiryComplete){
2298caefee3SMatthias Ringwald 				state = STATE.w4_remote_name;
2308caefee3SMatthias Ringwald 				if (hasMoreRemoteNameRequests()){
2318caefee3SMatthias Ringwald 			        doNextRemoteNameRequest();
2328caefee3SMatthias Ringwald 			        break;
2338caefee3SMatthias Ringwald 			    }
2348caefee3SMatthias Ringwald 			}
2358caefee3SMatthias Ringwald 			break;
2368caefee3SMatthias Ringwald 
2378caefee3SMatthias Ringwald 		case w4_remote_name:
2388caefee3SMatthias Ringwald 			if (packet instanceof HCIEventRemoteNameRequestComplete){
2398caefee3SMatthias Ringwald 				HCIEventRemoteNameRequestComplete result = (HCIEventRemoteNameRequestComplete) packet;
2408caefee3SMatthias Ringwald 				if (result.getStatus() == 0){
2418caefee3SMatthias Ringwald 					// store name on success
2428caefee3SMatthias Ringwald 					setNameForDeviceWithBDAddr(result.getRemoteName(), result.getBdAddr());
2438caefee3SMatthias Ringwald 				}
2448caefee3SMatthias Ringwald 
2458caefee3SMatthias Ringwald 				if (hasMoreRemoteNameRequests()){
2468caefee3SMatthias Ringwald 			        doNextRemoteNameRequest();
2478caefee3SMatthias Ringwald 			        break;
2488caefee3SMatthias Ringwald 			    }
2498caefee3SMatthias Ringwald 
2508caefee3SMatthias Ringwald 				// discovery done, connect to device with remote name prefix
2518caefee3SMatthias Ringwald 
2528caefee3SMatthias Ringwald 				RemoteDevice remoteDevice = null;
2538caefee3SMatthias Ringwald 				for (RemoteDevice device : devices){
2548caefee3SMatthias Ringwald 					if (device.getName() != null && device.getName().startsWith(REMOTE_DEVICE_NAME_PREFIX)){
2558caefee3SMatthias Ringwald 						remoteDevice = device;
2568caefee3SMatthias Ringwald 					}
2578caefee3SMatthias Ringwald 				}
2588caefee3SMatthias Ringwald 
2598caefee3SMatthias Ringwald 				// try first one otherwise
2608caefee3SMatthias Ringwald 				if (remoteDevice == null && devices.size() > 0){
2618caefee3SMatthias Ringwald 					remoteDevice = devices.get(0);
2628caefee3SMatthias Ringwald 				}
2638caefee3SMatthias Ringwald 
2648caefee3SMatthias Ringwald 				// no device, restart inquiry
2658caefee3SMatthias Ringwald 				if (remoteDevice == null){
2668caefee3SMatthias Ringwald 					restartInquiry();
2678caefee3SMatthias Ringwald 					break;
2688caefee3SMatthias Ringwald 				}
2698caefee3SMatthias Ringwald 
2708caefee3SMatthias Ringwald 				// start SDP query for RFCOMMM services
2718caefee3SMatthias Ringwald 				remoteBDAddr = remoteDevice.getBDAddress();
2728caefee3SMatthias Ringwald 				if (remoteDevice.getName() == null){
2738caefee3SMatthias Ringwald 					addMessage("Start SDP Query of " + remoteDevice.getBDAddress());
2748caefee3SMatthias Ringwald 				} else {
2758caefee3SMatthias Ringwald 					addMessage("Start SDP Query of " + remoteDevice.getName());
2768caefee3SMatthias Ringwald 				}
2778caefee3SMatthias Ringwald 				state = STATE.w4_sdp_query_result;
2788caefee3SMatthias Ringwald 				byte[] serviceSearchPattern = Util.serviceSearchPatternForUUID16(SPP_UUID);
2798caefee3SMatthias Ringwald 				btstack.SDPClientQueryRFCOMMServices(remoteBDAddr, serviceSearchPattern);
2808caefee3SMatthias Ringwald 				break;
2818caefee3SMatthias Ringwald 			}
2828caefee3SMatthias Ringwald 			break;
2838caefee3SMatthias Ringwald 
2848caefee3SMatthias Ringwald 		case w4_sdp_query_result:
285045013feSMatthias Ringwald 			if (packet instanceof SDPEventQueryRFCOMMService){
286045013feSMatthias Ringwald 				SDPEventQueryRFCOMMService service = (SDPEventQueryRFCOMMService) packet;
2878caefee3SMatthias Ringwald 				services.add(service);
2888caefee3SMatthias Ringwald 				addMessage(String.format("Found \"%s\", channel %d", service.getName(), service.getRFCOMMChannel()));
2898caefee3SMatthias Ringwald 			}
290045013feSMatthias Ringwald 			if (packet instanceof SDPEventQueryComplete){
2918caefee3SMatthias Ringwald 				// find service with "SPP" prefix
292045013feSMatthias Ringwald 				SDPEventQueryRFCOMMService selectedService = null;
293045013feSMatthias Ringwald 				for  (SDPEventQueryRFCOMMService service : services){
2948caefee3SMatthias Ringwald 					if (service.getName().startsWith(RFCOMM_SERVICE_PREFIX)){
2958caefee3SMatthias Ringwald 						selectedService = service;
2968caefee3SMatthias Ringwald 						break;
2978caefee3SMatthias Ringwald 					}
2988caefee3SMatthias Ringwald 				}
2998caefee3SMatthias Ringwald 				// restart demo, if no service with prefix found
3008caefee3SMatthias Ringwald 				if (selectedService == null){
3018caefee3SMatthias Ringwald 					restartInquiry();
3028caefee3SMatthias Ringwald 					break;
3038caefee3SMatthias Ringwald 				}
3048caefee3SMatthias Ringwald 
3058caefee3SMatthias Ringwald 				// connect
3068caefee3SMatthias Ringwald 				state = STATE.w4_connected;
3078caefee3SMatthias Ringwald 				clearMessages();
3088caefee3SMatthias Ringwald 				addMessage("SPP Test Application / Part 2");
3098caefee3SMatthias Ringwald 				addMessage("Connect to channel nr " + selectedService.getRFCOMMChannel());
3108caefee3SMatthias Ringwald 				btstack.RFCOMMCreateChannel(remoteBDAddr, selectedService.getRFCOMMChannel());
3118caefee3SMatthias Ringwald 			}
3128caefee3SMatthias Ringwald 
3138caefee3SMatthias Ringwald 			break;
3148caefee3SMatthias Ringwald 
3158caefee3SMatthias Ringwald 		case w4_connected:
316*c9eeefbcSMatthias Ringwald 			if (packet instanceof RFCOMMEventChannelOpened){
317*c9eeefbcSMatthias Ringwald 				RFCOMMEventChannelOpened e = (RFCOMMEventChannelOpened) packet;
3188caefee3SMatthias Ringwald 				if (e.getStatus() != 0) {
3198caefee3SMatthias Ringwald 					addMessage("RFCOMM channel open failed, status " + e.getStatus());
3208caefee3SMatthias Ringwald 				} else {
3218caefee3SMatthias Ringwald 					state = STATE.active;
3228caefee3SMatthias Ringwald 					rfcommChannelID = e.getRFCOMMCid();
3238caefee3SMatthias Ringwald 					mtu = e.getMaxFrameSize();
3248caefee3SMatthias Ringwald 					addMessage(String.format("RFCOMM channel open succeeded. \nNew RFCOMM Channel ID %d,\n max frame size %d", rfcommChannelID, mtu));
3258caefee3SMatthias Ringwald 
3268caefee3SMatthias Ringwald 					counter = 0;
3278caefee3SMatthias Ringwald 					new Thread(new Runnable(){
3288caefee3SMatthias Ringwald 						@Override
3298caefee3SMatthias Ringwald 						public void run() {
3308caefee3SMatthias Ringwald 							try {
3318caefee3SMatthias Ringwald 								while(state == STATE.active){
3328caefee3SMatthias Ringwald 									Thread.sleep(1000);
3338caefee3SMatthias Ringwald 									byte[] data;
3348caefee3SMatthias Ringwald 									try {
3358caefee3SMatthias Ringwald 										data = String.format("BTstack SPP Counter %d\n", counter).getBytes("utf8");
3368caefee3SMatthias Ringwald 										if (counter < Integer.MAX_VALUE){
3378caefee3SMatthias Ringwald 											counter++;
3388caefee3SMatthias Ringwald 										} else {
3398caefee3SMatthias Ringwald 											counter = 0;
3408caefee3SMatthias Ringwald 										}
3418caefee3SMatthias Ringwald 										btstack.RFCOMMSendData(rfcommChannelID, data);
3428caefee3SMatthias Ringwald 									} catch (UnsupportedEncodingException e) {
3438caefee3SMatthias Ringwald 										// TODO Auto-generated catch block
3448caefee3SMatthias Ringwald 										e.printStackTrace();
3458caefee3SMatthias Ringwald 									}
3468caefee3SMatthias Ringwald 								}
3478caefee3SMatthias Ringwald 							} catch (InterruptedException e) {}
3488caefee3SMatthias Ringwald 						}
3498caefee3SMatthias Ringwald 					}).start();
3508caefee3SMatthias Ringwald 				}
3518caefee3SMatthias Ringwald 			}
3528caefee3SMatthias Ringwald 			break;
3538caefee3SMatthias Ringwald 
3548caefee3SMatthias Ringwald 		case active:
3558caefee3SMatthias Ringwald 			if (packet instanceof RFCOMMDataPacket){
3568caefee3SMatthias Ringwald 				addTempMessage("Received RFCOMM data packet: \n" + packet.toString());
3578caefee3SMatthias Ringwald 			}
3588caefee3SMatthias Ringwald 			break;
3598caefee3SMatthias Ringwald 
3608caefee3SMatthias Ringwald 		default:
3618caefee3SMatthias Ringwald 			break;
3628caefee3SMatthias Ringwald 		}
3638caefee3SMatthias Ringwald 	}
3648caefee3SMatthias Ringwald 
deviceForBDAddr(BD_ADDR bdAddr)3658caefee3SMatthias Ringwald 	private RemoteDevice deviceForBDAddr(BD_ADDR bdAddr){
3668caefee3SMatthias Ringwald 		for (RemoteDevice device:devices){
3678caefee3SMatthias Ringwald 			if (device.getBDAddress().equals(bdAddr) )
3688caefee3SMatthias Ringwald 				return device;
3698caefee3SMatthias Ringwald 		}
3708caefee3SMatthias Ringwald 		return null;
3718caefee3SMatthias Ringwald 	}
3728caefee3SMatthias Ringwald 
setNameForDeviceWithBDAddr(String remoteName, BD_ADDR bdAddr)3738caefee3SMatthias Ringwald 	private void setNameForDeviceWithBDAddr(String remoteName, BD_ADDR bdAddr) {
3748caefee3SMatthias Ringwald 		RemoteDevice device = deviceForBDAddr(bdAddr);
3758caefee3SMatthias Ringwald 		if (device != null){
3768caefee3SMatthias Ringwald 			addMessage("Found " + remoteName);
3778caefee3SMatthias Ringwald 			device.setName(remoteName);
3788caefee3SMatthias Ringwald 		}
3798caefee3SMatthias Ringwald 	}
3808caefee3SMatthias Ringwald 
test()3818caefee3SMatthias Ringwald 	void test(){
3828caefee3SMatthias Ringwald 		counter = 0;
3838caefee3SMatthias Ringwald 		addMessage("SPP Test Application");
3848caefee3SMatthias Ringwald 
3858caefee3SMatthias Ringwald 		btstack = new BTstack();
3868caefee3SMatthias Ringwald 		btstack.registerPacketHandler(this);
3878caefee3SMatthias Ringwald 
3888caefee3SMatthias Ringwald 		boolean ok = btstack.connect();
3898caefee3SMatthias Ringwald 		if (!ok) {
3908caefee3SMatthias Ringwald 			addMessage("Failed to connect to BTstack Server");
3918caefee3SMatthias Ringwald 			return;
3928caefee3SMatthias Ringwald 		}
3938caefee3SMatthias Ringwald 
3948caefee3SMatthias Ringwald 		addMessage("BTstackSetPowerMode(1)");
3958caefee3SMatthias Ringwald 
3968caefee3SMatthias Ringwald 		state = STATE.w4_btstack_working;
3978caefee3SMatthias Ringwald 		btstack.BTstackSetPowerMode(1);
3988caefee3SMatthias Ringwald 	}
3998caefee3SMatthias Ringwald }
4008caefee3SMatthias Ringwald 
401