Android 블 루 투 스 클 라 이언 트 와 서버 측 통신 예시 구현
26482 단어 android블 루 투 스 통신
자,마지막 효과 도 를 보 세 요.
2.개술:
1.블 루 투 스 지원 여부 판단
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if(bluetoothAdapter == null) {
//the device doesn't support bluetooth
} else {
//the device support bluetooth
}
2.지원 하면 블 루 투 스 켜 기
if(!bluetoothAdapter.isEnable()) {
Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableIntent,REQUEST_ENABLE_BT);
}
3.블 루 투 스 오픈 상태 감시
BroadcastReceiver bluetoothState = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String stateExtra = BluetoothAdapter.EXTRA_STATE;
int state = intent.getIntExtra(stateExtra, -1);
switch(state) {
case BluetoothAdapter.STATE_TURNING_ON:
break;
case BluetoothAdapter.STATE_ON:
break;
case BluetoothAdapter.STATE_TURNING_OFF:
break;
case BluetoothAdapter.STATE_OFF:
break;
}
}
}
registerReceiver(bluetoothState,new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED));
4.로 컬 장 치 를 설정 하면 다른 장치 에서 검색 할 수 있 습 니 다.
Intent discoveryIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
startActivityForResult(discoveryIntent,REQUEST_DISCOVERY);
BroadcastReceiver discovery = new BroadcastReceiver() {
@Override
public void onRecevie(Content context, Intent intent) {
String scanMode = BluetoothAdapter.EXTRA_SCAN_MODE;
String preScanMode = BluetoothAdapter.EXTRA_PREVIOUS_SCAN_MODE;
int mode = intent.getIntExtra(scanMode);
}
}
registerReceiver(discovery,new IntentFilter(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED);
5.검색 장치bluetoothAdapter.startDiscovery()검색 시작 하기;
bluetoothAdapter.cancelDiscovery()검색 을 중지 합 니 다.
장 치 를 발견 하면 시스템 에서 ACTION 을 보 냅 니 다.FOUND 방송 소식,이 소식 을 받 은 BroadcastReceiver 를 실현 할 수 있 습 니 다.
BroadcastReceiver deviceFound = new BroadcastReceiver() {
@Override
public void onReceiver(Content content, Intent intent) {
String remoteDeviceName = intent.getStringExtra(BluetoothAdapter.EXTRA_NAME);
BluetoothDevice remoteDevice = intent.getParcelableExtra(BluetoothAdapter.EXTRA_DEVICE);
}
}
registerReceiver(deviceFound, new IntentFilter(BluetoothAdapter.ACTION_FOUND);
6.연결 장치두 개의 블 루 투 스 장 치 를 연결 하려 면 각각 서버 엔 드(BluetoothServerSocket)와 클 라 이언 트(BluetoothSocket)를 실현 해 야 합 니 다.이 점 은 J2SE 와 같 습 니 다.
ServerSocket 과 Socket 은 매우 유사 하 다.
BluetoothServerSocket 은 서버 에서 호출 방법 accept()를 감청 합 니 다.클 라 이언 트 요청 이 있 을 때 accept()방법 은 BluetoothSocket 으로 되 돌아 갑 니 다.클 라 이언 트 가 받 으 면 양쪽 에서 통신 할 수 있 습 니 다.InputStream 과 OutputStream 을 통 해 데이터 전송 을 실현 합 니 다.
accept 방법 은 차단 되 어 있 기 때문에 UI 스 레 드 에 넣 을 수 없습니다.BluetoothServerSocket 과 BluetoothSocket 을 사용 할 때 각각 새 스 레 드 에 넣 습 니 다.
3.어떻게 실현 합 니까?
다음은 개발 중의 몇 가지 관건 적 인 절차 이다.
1)블 루 투 스 먼저 오픈
2)사용 가능 한 장치 검색
3)블 루 투 스 소켓 을 만 들 고 입 출력 흐름 가 져 오기
4)데이터 읽 기와 쓰기
5)연결 을 끊 고 블 루 투 스 닫 기
1.페이지 전환 이 있 기 때문에 여 기 는 TabHost 를 사 용 했 지만 원래 의 효과 가 좋 지 않 고 애니메이션 이 없어 서 복사 할 수 밖 에 없 었 습 니 다.
/**
* TabHost
*
* @Project App_Bluetooth
* @Package com.android.bluetooth
* @author chenlin
* @version 1.0
* @Date 2013 6 2
* @Note TODO
*/
public class AnimationTabHost extends TabHost {
private int mCurrentTabID = 0;// tabId
private final long mDuration = 400;//
public AnimationTabHost(Context context) {
this(context, null);
}
public AnimationTabHost(Context context, AttributeSet attrs) {
super(context, attrs);
}
/**
*
*/
@Override
public void setCurrentTab(int index) {
//
if (index > mCurrentTabID) {
TranslateAnimation translateAnimation = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF,
-1.0f, Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0f);
translateAnimation.setDuration(mDuration);
getCurrentView().startAnimation(translateAnimation);
//
} else if (index < mCurrentTabID) {
TranslateAnimation translateAnimation = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 1.0f, Animation.RELATIVE_TO_SELF, 0f,
Animation.RELATIVE_TO_SELF, 0f);
translateAnimation.setDuration(mDuration);
getCurrentView().startAnimation(translateAnimation);
}
super.setCurrentTab(index);
//----- ------------------------------
if (index > mCurrentTabID) {
TranslateAnimation translateAnimation = new TranslateAnimation( //
Animation.RELATIVE_TO_PARENT, 1.0f,// RELATIVE_TO_SELF
Animation.RELATIVE_TO_PARENT, 0f, Animation.RELATIVE_TO_PARENT, 0f, Animation.RELATIVE_TO_PARENT, 0f);
translateAnimation.setDuration(mDuration);
getCurrentView().startAnimation(translateAnimation);
} else if (index < mCurrentTabID) {
TranslateAnimation translateAnimation = new TranslateAnimation(
Animation.RELATIVE_TO_PARENT, -1.0f, Animation.RELATIVE_TO_PARENT, 0f, Animation.RELATIVE_TO_PARENT, 0f,
Animation.RELATIVE_TO_PARENT, 0f);
translateAnimation.setDuration(mDuration);
getCurrentView().startAnimation(translateAnimation);
}
mCurrentTabID = index;
}
}
2.홈 페이지 를 만 들 고 복사 한 TabHost 를 사용 하여 미 끄 러 지 는 방법,상태 에 따라 세 가지 상태 가 있 습 니 다.
/**
*
*
* @Project App_Bluetooth
* @Package com.android.bluetooth
* @author chenlin
* @version 1.0
* @Date 2013 6 2
*/
@SuppressWarnings("deprecation")
public class BluetoothActivity extends TabActivity {
static AnimationTabHost mTabHost;// tabhost
static String BlueToothAddress;//
static Type mType = Type.NONE;//
static boolean isOpen = false;
// :
enum Type {
NONE, SERVICE, CILENT
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initTab();
}
private void initTab() {
//
mTabHost = (AnimationTabHost) getTabHost();
// tab
mTabHost.addTab(mTabHost.newTabSpec("Tab1").setIndicator(" ", getResources().getDrawable(android.R.drawable.ic_menu_add))
.setContent(new Intent(this, DeviceActivity.class)));
mTabHost.addTab(mTabHost.newTabSpec("Tab2").setIndicator(" ", getResources().getDrawable(android.R.drawable.ic_menu_add))
.setContent(new Intent(this, ChatActivity.class)));
//
mTabHost.setOnTabChangedListener(new OnTabChangeListener() {
public void onTabChanged(String tabId) {
if (tabId.equals("Tab1")) {
//TODO
}
}
});
// tabhost
mTabHost.setCurrentTab(0);
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
Toast.makeText(this, "address:", Toast.LENGTH_SHORT).show();
}
}
3.홈 페이지 가 생기 면 각각 두 개의 목록 페이지 를 실현 합 니 다.하 나 는 장치 페이지 DeviceActivity.Java 를 찾 는 것 이 고 다른 하 나 는 세 션 페이지 ChatActivity.java 입 니 다.1)장치 페이지 DeviceActivity.java
/**
*
* @Project App_Bluetooth
* @Package com.android.bluetooth
* @author chenlin
* @version 1.0
* @Date 2013 6 2
* @Note TODO
*/
public class DeviceActivity extends Activity {
private ListView mListView;
//
private ArrayList<DeviceBean> mDatas;
private Button mBtnSearch, mBtnService;
private ChatListAdapter mAdapter;
//
private BluetoothAdapter mBtAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.devices);
initDatas();
initViews();
registerBroadcast();
init();
}
private void initDatas() {
mDatas = new ArrayList<DeviceBean>();
mAdapter = new ChatListAdapter(this, mDatas);
mBtAdapter = BluetoothAdapter.getDefaultAdapter();
}
/**
*
*/
private void init() {
Log.i("tag", "mBtAdapter=="+ mBtAdapter);
//
Set<BluetoothDevice> deviceSet = mBtAdapter.getBondedDevices();
if (deviceSet.size() > 0) {
for (BluetoothDevice device : deviceSet) {
mDatas.add(new DeviceBean(device.getName() + "
" + device.getAddress(), true));
mAdapter.notifyDataSetChanged();
mListView.setSelection(mDatas.size() - 1);
}
} else {
mDatas.add(new DeviceBean(" ", true));
mAdapter.notifyDataSetChanged();
mListView.setSelection(mDatas.size() - 1);
}
}
/**
*
*/
private void registerBroadcast() {
//
IntentFilter discoveryFilter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
this.registerReceiver(mReceiver, discoveryFilter);
//
IntentFilter foundFilter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
this.registerReceiver(mReceiver, foundFilter);
}
/**
*
*/
private void initViews() {
mListView = (ListView) findViewById(R.id.list);
mListView.setAdapter(mAdapter);
mListView.setFastScrollEnabled(true);
mListView.setOnItemClickListener(mDeviceClickListener);
mBtnSearch = (Button) findViewById(R.id.start_seach);
mBtnSearch.setOnClickListener(mSearchListener);
mBtnService = (Button) findViewById(R.id.start_service);
mBtnService.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
BluetoothActivity.mType = Type.SERVICE;
BluetoothActivity.mTabHost.setCurrentTab(1);
}
});
}
/**
*
*/
private OnClickListener mSearchListener = new OnClickListener() {
@Override
public void onClick(View arg0) {
if (mBtAdapter.isDiscovering()) {
mBtAdapter.cancelDiscovery();
mBtnSearch.setText(" ");
} else {
mDatas.clear();
mAdapter.notifyDataSetChanged();
init();
/* */
mBtAdapter.startDiscovery();
mBtnSearch.setText("ֹͣ ");
}
}
};
/**
*
*/
private OnItemClickListener mDeviceClickListener = new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
DeviceBean bean = mDatas.get(position);
String info = bean.message;
String address = info.substring(info.length() - 17);
BluetoothActivity.BlueToothAddress = address;
AlertDialog.Builder stopDialog = new AlertDialog.Builder(DeviceActivity.this);
stopDialog.setTitle(" ");//
stopDialog.setMessage(bean.message);
stopDialog.setPositiveButton(" ", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
mBtAdapter.cancelDiscovery();
mBtnSearch.setText(" ");
BluetoothActivity.mType = Type.CILENT;
BluetoothActivity.mTabHost.setCurrentTab(1);
dialog.cancel();
}
});
stopDialog.setNegativeButton(" ", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
BluetoothActivity.BlueToothAddress = null;
dialog.cancel();
}
});
stopDialog.show();
}
};
/**
*
*/
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
//
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
//
if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
mDatas.add(new DeviceBean(device.getName() + "
" + device.getAddress(), false));
mAdapter.notifyDataSetChanged();
mListView.setSelection(mDatas.size() - 1);
}
//
} else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
setProgressBarIndeterminateVisibility(false);
if (mListView.getCount() == 0) {
mDatas.add(new DeviceBean("û ", false));
mAdapter.notifyDataSetChanged();
mListView.setSelection(mDatas.size() - 1);
}
mBtnSearch.setText(" ");
}
}
};
@Override
public void onStart() {
super.onStart();
if (!mBtAdapter.isEnabled()) {
Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableIntent, 3);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mBtAdapter != null) {
mBtAdapter.cancelDiscovery();
}
this.unregisterReceiver(mReceiver);
}
}
2)세 션 페이지 ChatActivity.java
/**
*
*
* @Project App_Bluetooth
* @Package com.android.bluetooth
* @author chenlin
* @version 1.0
* @Date 2013 3 2
* @Note TODO
*/
public class ChatActivity extends Activity implements OnItemClickListener, OnClickListener {
private static final int STATUS_CONNECT = 0x11;
private ListView mListView;
private ArrayList<DeviceBean> mDatas;
private Button mBtnSend;//
private Button mBtnDisconn;//
private EditText mEtMsg;
private DeviceListAdapter mAdapter;
/* , */
public static final String PROTOCOL_SCHEME_L2CAP = "btl2cap";
public static final String PROTOCOL_SCHEME_RFCOMM = "btspp";
public static final String PROTOCOL_SCHEME_BT_OBEX = "btgoep";
public static final String PROTOCOL_SCHEME_TCP_OBEX = "tcpobex";
// socket
private BluetoothServerSocket mServerSocket;
// socket
private BluetoothSocket mSocket;
//
private BluetoothDevice mDevice;
private BluetoothAdapter mBluetoothAdapter;
// -- -----------------
private ServerThread mServerThread;
private ClientThread mClientThread;
private ReadThread mReadThread;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.chat);
initDatas();
initViews();
initEvents();
}
private void initEvents() {
mListView.setOnItemClickListener(this);
//
mBtnSend.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
String text = mEtMsg.getText().toString();
if (!TextUtils.isEmpty(text)) {
//
sendMessageHandle(text);
mEtMsg.setText("");
mEtMsg.clearFocus();
//
InputMethodManager manager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
manager.hideSoftInputFromWindow(mEtMsg.getWindowToken(), 0);
} else
Toast.makeText(ChatActivity.this, " !", Toast.LENGTH_SHORT).show();
}
});
//
mBtnDisconn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
if (BluetoothActivity.mType == Type.CILENT) {
shutdownClient();
} else if (BluetoothActivity.mType == Type.SERVICE) {
shutdownServer();
}
BluetoothActivity.isOpen = false;
BluetoothActivity.mType = Type.NONE;
Toast.makeText(ChatActivity.this, " !", Toast.LENGTH_SHORT).show();
}
});
}
private void initViews() {
mListView = (ListView) findViewById(R.id.list);
mListView.setAdapter(mAdapter);
mListView.setFastScrollEnabled(true);
mEtMsg = (EditText) findViewById(R.id.MessageText);
mEtMsg.clearFocus();
mBtnSend = (Button) findViewById(R.id.btn_msg_send);
mBtnDisconn = (Button) findViewById(R.id.btn_disconnect);
}
private void initDatas() {
mDatas = new ArrayList<DeviceBean>();
mAdapter = new DeviceListAdapter(this, mDatas);
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
}
/**
*
*/
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
String info = (String) msg.obj;
switch (msg.what) {
case STATUS_CONNECT:
Toast.makeText(ChatActivity.this, info, 0).show();
break;
}
if (msg.what == 1) {
mDatas.add(new DeviceBean(info, true));
mAdapter.notifyDataSetChanged();
mListView.setSelection(mDatas.size() - 1);
}else {
mDatas.add(new DeviceBean(info, false));
mAdapter.notifyDataSetChanged();
mListView.setSelection(mDatas.size() - 1);
}
}
};
@Override
public void onResume() {
super.onResume();
if (BluetoothActivity.isOpen) {
Toast.makeText(this, " , 。 , ", Toast.LENGTH_SHORT).show();
return;
}
if (BluetoothActivity.mType == Type.CILENT) {
String address = BluetoothActivity.BlueToothAddress;
if (!"".equals(address)) {
mDevice = mBluetoothAdapter.getRemoteDevice(address);
mClientThread = new ClientThread();
mClientThread.start();
BluetoothActivity.isOpen = true;
} else {
Toast.makeText(this, "address is null !", Toast.LENGTH_SHORT).show();
}
} else if (BluetoothActivity.mType == Type.SERVICE) {
mServerThread = new ServerThread();
mServerThread.start();
BluetoothActivity.isOpen = true;
}
}
//
private class ClientThread extends Thread {
public void run() {
try {
mSocket = mDevice.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
Message msg = new Message();
msg.obj = " , :" + BluetoothActivity.BlueToothAddress;
msg.what = STATUS_CONNECT;
mHandler.sendMessage(msg);
mSocket.connect();
msg = new Message();
msg.obj = " ! 。";
msg.what = STATUS_CONNECT;
mHandler.sendMessage(msg);
//
mReadThread = new ReadThread();
mReadThread.start();
} catch (IOException e) {
Message msg = new Message();
msg.obj = " ! 。";
msg.what = STATUS_CONNECT;
mHandler.sendMessage(msg);
}
}
};
//
private class ServerThread extends Thread {
public void run() {
try {
// : 、UUID
mServerSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(PROTOCOL_SCHEME_RFCOMM,
UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
Message msg = new Message();
msg.obj = " , ...";
msg.what = STATUS_CONNECT;
mHandler.sendMessage(msg);
/* */
mSocket = mServerSocket.accept();
msg = new Message();
msg.obj = " ! 。";
msg.what = STATUS_CONNECT;
mHandler.sendMessage(msg);
//
mReadThread = new ReadThread();
mReadThread.start();
} catch (IOException e) {
e.printStackTrace();
}
}
};
/* */
private void shutdownServer() {
new Thread() {
public void run() {
if (mServerThread != null) {
mServerThread.interrupt();
mServerThread = null;
}
if (mReadThread != null) {
mReadThread.interrupt();
mReadThread = null;
}
try {
if (mSocket != null) {
mSocket.close();
mSocket = null;
}
if (mServerSocket != null) {
mServerSocket.close();
mServerSocket = null;
}
} catch (IOException e) {
Log.e("server", "mserverSocket.close()", e);
}
};
}.start();
}
/* ͣ */
private void shutdownClient() {
new Thread() {
public void run() {
if (mClientThread != null) {
mClientThread.interrupt();
mClientThread = null;
}
if (mReadThread != null) {
mReadThread.interrupt();
mReadThread = null;
}
if (mSocket != null) {
try {
mSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
mSocket = null;
}
};
}.start();
}
//
private void sendMessageHandle(String msg) {
if (mSocket == null) {
Toast.makeText(this, " ", Toast.LENGTH_SHORT).show();
return;
}
try {
OutputStream os = mSocket.getOutputStream();
os.write(msg.getBytes());
mDatas.add(new DeviceBean(msg, false));
mAdapter.notifyDataSetChanged();
mListView.setSelection(mDatas.size() - 1);
} catch (IOException e) {
e.printStackTrace();
}
}
//
private class ReadThread extends Thread {
public void run() {
byte[] buffer = new byte[1024];
int bytes;
InputStream is = null;
try {
is = mSocket.getInputStream();
while (true) {
if ((bytes = is.read(buffer)) > 0) {
byte[] buf_data = new byte[bytes];
for (int i = 0; i < bytes; i++) {
buf_data[i] = buffer[i];
}
String s = new String(buf_data);
Message msg = new Message();
msg.obj = s;
msg.what = 1;
mHandler.sendMessage(msg);
}
}
} catch (IOException e1) {
e1.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
}
@Override
public void onClick(View view) {
}
@Override
protected void onDestroy() {
super.onDestroy();
if (BluetoothActivity.mType == Type.CILENT) {
shutdownClient();
} else if (BluetoothActivity.mType == Type.SERVICE) {
shutdownServer();
}
BluetoothActivity.isOpen = false;
BluetoothActivity.mType = Type.NONE;
}
}
3.관련 코드 다운로드demo 다운로드:http://xiazai.jb51.net/201701/yuanma/App_BlueTooth_jb51.rar
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.