Android 싱글 칩 마이크로컴퓨터 와 블 루 투 스 모듈 통신 인 스 턴 스 코드

치어 리 딩 을 졸 업 했 습 니 다.졸업 하기 전에 졸업 디자인 을 써 야 합 니 다.간단 한 블 루 투 스 앱 을 써 서 상호작용 을 해 야 합 니 다.인터넷 자 료 를 참고 하여 문 제 를 순조롭게 해결 해 야 합 니 다.다음은 구체 적 인 실현 방향 을 여러분 에 게 공유 하여 참고 하도록 하 겠 습 니 다.
1.안 드 로 이 드 블 루 투 스 프로 그래 밍
블 루 투 스 3.0 및 이하 버 전 프로 그래 밍 은 UUID 를 사용 해 야 한다.UUID 는 유 니 버 설 유 니 크 식별 코드(Universally Unique Identifier)로 소프트웨어 구축 의 기준 이자 오픈 소스 재단 조직 이 분포 식 컴 퓨 팅 환경 분야 에 응용 하 는 일부분 이다.블 루 투 스 3.0 과 다음 버 전에 서 UUID 는 파일 전송 서비스,직렬 서비스,프린터 서비스 등 유일한 표지 서비스 에 사 용 됩 니 다.다음 과 같 습 니 다.

#       
SerialPortServiceClass_UUID = '{00001101-0000-1000-8000-00805F9B34FB}' 
LANAccessUsingPPPServiceClass_UUID = '{00001102-0000-1000-8000-00805F9B34FB}'
#       
DialupNetworkingServiceClass_UUID = '{00001103-0000-1000-8000-00805F9B34FB}'
#       
IrMCSyncServiceClass_UUID = '{00001104-0000-1000-8000-00805F9B34FB}' 
SDP_OBEXObjectPushServiceClass_UUID = '{00001105-0000-1000-8000-00805F9B34FB}'
#       
OBEXFileTransferServiceClass_UUID = '{00001106-0000-1000-8000-00805F9B34FB}' 
IrMCSyncCommandServiceClass_UUID = '{00001107-0000-1000-8000-00805F9B34FB}'
블 루 투 스 의 연결 은 메 인 장치 가 있 고 서 비 스 를 제공 하 는 것 은 장치 라 고 볼 수 있다.주 장 치 는 UUID 접근 을 통 해 장치 에서 같은 UUID 를 가 진 서 비 스 를 제공 하여 고객 센터 인 서버(C/S)모드 를 구축한다.
2.프로 그래 밍 절차
Android 에서 블 루 투 스 를 사용 하려 면 권한 이 필요 합 니 다.블 루 투 스 권한 획득 코드 는 다음 과 같 습 니 다.

<!--      -->
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
로 컬 블 루 투 스 어댑터 가 져 오기,블 루 투 스 가 켜 지지 않 으 면 블 루 투 스 장 치 를 엽 니 다:

bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (bluetoothAdapter == null) {
// Device does not support Bluetooth
return;
}
//     
int REQUEST_ENABLE_BT = 1;
if (!bluetoothAdapter.isEnabled()) {
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(intent, REQUEST_ENABLE_BT);
}
짝 짓 기 된 블 루 투 스 장 치 를 검색 하고 짝 짓 기 목록 에 추가 합 니 다:

//       
List<String> devices = new ArrayList<String>();
Set<BluetoothDevice> bondedDevices = bluetoothAdapter.getBondedDevices();
for (BluetoothDevice device : bondedDevices) {
devices.add(device.getName() + "-" + device.getAddress());
}
일치 하지 않 는 블 루 투 스 장 치 를 검색 하고 일치 하지 않 는 목록 에 추가 합 니 다:

mBluetoothAdapter.startDiscovery();
//           : 
final BroadcastReceiver mReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) { 
String action = intent.getAction(); // When discovery finds a device 
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
// Get the BluetoothDevice object from the Intent 
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
// Add the name and address to an array adapter to show in a ListView 
mArrayAdapter.add(device.getName() + "
" + device.getAddress()); } } }; // : // Register the BroadcastReceiver IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); registerReceiver(mReceiver, filter); // Don't forget to unregister during onDestroy
서버 측 이 라면 감청 이 필요 합 니 다.감청 은 특정한 서비스의 UUID 이 고 서버 감청 류 는 다음 과 같 습 니 다.

private class ConnectThread extends Thread {
private final String MY_UUID = "00001101-0000-1000-8000-00805F9B34FB";
private final BluetoothSocket socket;
private final BluetoothDevice device;
public ConnectThread(BluetoothDevice device) {
this.device = device;
BluetoothSocket tmp = null;
try {
tmp = device.createRfcommSocketToServiceRecord(UUID.fromString(MY_UUID));
} catch (IOException e) {
e.printStackTrace();
}
this.socket = tmp;
}
public void run() {
bluetoothAdapter.cancelDiscovery();
try {
socket.connect();
connectedThread = new ConnectedThread(socket);
connectedThread.start();
} catch (IOException e) {
try {
socket.close();
} catch (IOException ee) {
ee.printStackTrace();
}
return;
}
//manageConnectedSocket(socket);
}
public void cancel() {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
클 라 이언 트 와 서버 측 이 연결 되 었 을 때 Connected Thread 류 가 데 이 터 를 받 아야 합 니 다.

//               , ConnectedThread    
private class ConnectedThread extends Thread {
private final BluetoothSocket socket;
private final InputStream inputStream;
private final OutputStream outputStream;
public ConnectedThread(BluetoothSocket socket) {
this.socket = socket;
InputStream input = null;
OutputStream output = null;
try {
input = socket.getInputStream();
output = socket.getOutputStream();
} catch (IOException e) {
e.printStackTrace();
}
this.inputStream = input;
this.outputStream = output;
}
public void run() {
byte[] buff = new byte[1024];
int bytes;
while (true) {
try {
bytes = inputStream.read(buff);
String str = new String(buff, "ISO-8859-1");
str = str.substring(0, bytes);
Log.e("recv", str);
} catch (IOException e) {
e.printStackTrace();
break;
}
}
}
public void write(byte[] bytes) {
try {
outputStream.write(bytes);
} catch (IOException e) {
e.printStackTrace();
}
}
public void cancel() {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
지금까지 블 루 투 스 개발 의 대체적인 절 차 였 습 니 다.블 루 투 스 클 라 이언 트 가 연결 류 를 만 드 는 것 은 언급 되 지 않 았 지만 BLE 와 전형 적 인 블 루 투 스 안 드 로 이 드 개발 을 찾 아 볼 수 있 습 니 다.
3.블 루 투 스 앱 소개
블 루 투 스 앱 을 설치 하려 면 싱글 칩 마이크로컴퓨터 가 블 루 투 스 모듈 을 통 해 보 내 온 데 이 터 를 받 아야 하고 블 루 투 스 앱 도 싱글 칩 마이크로컴퓨터 에 데 이 터 를 보 내 제어 할 수 있다.페이지 레이아웃 은 다음 과 같 습 니 다.하 나 는 전체 페이지 이 고 하 나 는 페이지 를 설정 하 는 것 입 니 다.테스트 핸드폰 은 매 블 루 노트 입 니 다.사거리 신호등 제어 시스템 으로 설치 되 어 있 기 때문에 모든 페이지 에 4 개의 LED 등 이 배치 되 어 있 고 각각 길목 의 4 개의 신호등 을 대표 하 며 시간 에 따라 서로 다른 색깔(빨간색/녹색/노란색)을 표시 하고 카운트다운 을 표시 하 며 마지막 으로 신호등 시스템 전체 그림 을 보 여 줍 니 다.

activity_main.xml 파일 은 다음 과 같 습 니 다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="wrap_content" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
<LinearLayout
android:id="@+id/linear_layout_top"
android:layout_alignParentTop="true"
android:layout_width="match_parent"
android:layout_height="40dp">
<TextView
android:id="@+id/notice_view"
android:layout_width="0dp"
android:layout_height="40dp"
android:text="     "
android:layout_weight="3"/>
<TextView
android:id="@+id/notice_recv_view"
android:layout_width="0dp"
android:layout_height="30dp"
android:layout_weight="3"/>
<TextView
android:id="@+id/notice_send_view"
android:layout_width="0dp"
android:layout_height="30dp"
android:layout_weight="3"/>
<Button
android:id="@+id/turn_on_off"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_weight="2"
android:text="ON"/>
</LinearLayout>
<TextView
android:id="@+id/led1"
android:layout_centerHorizontal="true"
android:layout_below="@+id/linear_layout_top"
android:layout_width="40dp"
android:layout_height="20dp"
android:gravity="center"
android:text="LED1"/>
<TextView
android:id="@+id/led0"
android:layout_centerHorizontal="true"
android:layout_below="@+id/led1"
android:layout_width="40dp"
android:layout_height="20dp"
android:gravity="center"
android:text="+"/>
<TextView
android:id="@+id/led3"
android:layout_below="@+id/led1"
android:layout_toLeftOf="@+id/led1"
android:layout_width="40dp"
android:layout_height="20dp"
android:gravity="center"
android:text="LED3"/>
<TextView
android:id="@+id/led2"
android:layout_centerHorizontal="true"
android:layout_below="@+id/led3"
android:layout_width="40dp"
android:layout_height="20dp"
android:gravity="center"
android:text="LED2"/>
<TextView
android:id="@+id/led4"
android:layout_below="@+id/led1"
android:layout_toRightOf="@+id/led1"
android:layout_width="40dp"
android:layout_height="20dp"
android:gravity="center"
android:text="LED4"/>
<ScrollView
android:id="@+id/scroll_view"
android:layout_below="@+id/led2"
android:layout_above="@+id/linear_layout_bottom"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/recv_view"
android:text=""
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</ScrollView>
<LinearLayout
android:id="@+id/linear_layout_bottom"
android:layout_alignParentBottom="true"
android:layout_width="match_parent"
android:layout_height="50dp">
<Button
android:id="@+id/clear_recv_view"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="clear" />
<EditText
android:id="@+id/send_text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="3"
android:hint="   ,  @#  "/>
<Button
android:id="@+id/send"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="send" />
</LinearLayout>
</RelativeLayout>
MainActivity.java 파일 은 다음 과 같 습 니 다.

package com.luoxn28.bluetooth;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Message;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.UUID;
public class MainActivity extends ActionBarActivity implements View.OnClickListener {
public static final int RECV_VIEW = 0;
public static final int NOTICE_VIEW = 1;
private BluetoothAdapter bluetoothAdapter = null;
private ConnectThread connectThread = null;
private ConnectedThread connectedThread = null;
private TextView noticeView = null;
private Button turnOnOff = null;
private TextView led0, led1, led2, led3, led4;
ScrollView scrollView = null;
private TextView recvView = null;
private Button clearRecvView = null;
private EditText sendText = null;
private Button send = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//   BluetoothAdapter
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (bluetoothAdapter == null) {
// Device does not support Bluetooth
return;
}
//       
noticeView = (TextView) findViewById(R.id.notice_view);
turnOnOff = (Button) findViewById(R.id.turn_on_off);
led0 = (TextView) findViewById(R.id.led0);
led1 = (TextView) findViewById(R.id.led1);
led2 = (TextView) findViewById(R.id.led2);
led3 = (TextView) findViewById(R.id.led3);
led4 = (TextView) findViewById(R.id.led4);
scrollView = (ScrollView) findViewById(R.id.scroll_view);
recvView = (TextView) findViewById(R.id.recv_view);
clearRecvView = (Button) findViewById(R.id.clear_recv_view);
sendText = (EditText) findViewById(R.id.send_text);
send = (Button) findViewById(R.id.send);
turnOnOff.setOnClickListener(this);
clearRecvView.setOnClickListener(this);
send.setOnClickListener(this);
if (!bluetoothAdapter.isEnabled()) {
noticeView.setText("     ");
}
else {
noticeView.setText("     ");
}
noticeView.setBackgroundColor(Color.GRAY);
led0.setBackgroundColor(Color.GRAY);
led1.setBackgroundColor(Color.GRAY);
led2.setBackgroundColor(Color.GRAY);
led3.setBackgroundColor(Color.GRAY);
led4.setBackgroundColor(Color.GRAY);
}
private boolean isOn = false;
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.turn_on_off: //   '0'  '1'   
if (bluetoothAdapter == null || !bluetoothAdapter.isEnabled()) {
Toast.makeText(this, "     ", Toast.LENGTH_SHORT).show();
break;
}
if (connectedThread == null) {
Toast.makeText(this, "     ", Toast.LENGTH_SHORT).show();
break;
}
String turn_string = "1@#";
connectedThread.write(turn_string.getBytes());
if (isOn == false) {
isOn = true; //    
turnOnOff.setText("OFF");
led1.setText("");
led2.setText("");
led3.setText("");
led4.setText("");
}
else {
isOn = false; //    
turnOnOff.setText("ON");
led1.setText("LED1");
led2.setText("LED2");
led3.setText("LED3");
led4.setText("LED4");
}
break;
case R.id.clear_recv_view: //      
recvView.setText("");
break;
case R.id.send: //     ,   "@#"  
if (bluetoothAdapter == null || !bluetoothAdapter.isEnabled()) {
Toast.makeText(this, "     ", Toast.LENGTH_SHORT).show();
return;
}
if (connectedThread == null) {
Toast.makeText(this, "     ", Toast.LENGTH_SHORT).show();
break;
}
String inputText = sendText.getText().toString() + "@#"; //          "@#  ",               
//Toast.makeText(MainActivity.this, inputText, Toast.LENGTH_SHORT).show();
connectedThread.write(inputText.getBytes());
break;
default:
break;
}
}
private android.os.Handler handler = new android.os.Handler() {
public void handleMessage(Message msg) {
Bundle bundle = null;
switch (msg.what) {
case RECV_VIEW:
if (isOn == false) {
isOn = true;
turnOnOff.setText("OFF");
}
bundle = msg.getData();
String recv = bundle.getString("recv");
recvView.append(recv + "
"); scrollView.fullScroll(ScrollView.FOCUS_DOWN); // if (recv.isEmpty() || recv.contains(" ") || recv.contains("#")) { break; } int num = Integer.valueOf(recv) / 2; // 0-60s if (num <= 20) { led1.setText(""); led2.setText(""); led3.setText(""); led4.setText(""); led1.setBackgroundColor(Color.RED); led2.setBackgroundColor(Color.RED); led3.setBackgroundColor(Color.GREEN); led4.setBackgroundColor(Color.GREEN); } else if (num < 30) { int n = 30 - num; led1.setText("" + n); led2.setText("" + n); if (num < 28) { led3.setBackgroundColor(Color.GREEN); led4.setBackgroundColor(Color.GREEN); } else { led3.setBackgroundColor(Color.YELLOW); led4.setBackgroundColor(Color.YELLOW); } } else if (num <= 50) { led1.setText(""); led2.setText(""); led3.setText(""); led4.setText(""); led1.setBackgroundColor(Color.GREEN); led2.setBackgroundColor(Color.GREEN); led3.setBackgroundColor(Color.RED); led4.setBackgroundColor(Color.RED); } else { int n = 60 - num; led3.setText("" + n); led4.setText("" + n); if (num < 58) { led1.setBackgroundColor(Color.GREEN); led2.setBackgroundColor(Color.GREEN); } else { led1.setBackgroundColor(Color.YELLOW); led2.setBackgroundColor(Color.YELLOW); } } break; case NOTICE_VIEW: bundle = msg.getData(); String notice = bundle.getString("notice"); noticeView.setText(notice); break; default: break; } } }; @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.start_bluetooth) { if (bluetoothAdapter != null) { // int REQUEST_ENABLE_BT = 1; if (!bluetoothAdapter.isEnabled()) { Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(intent, REQUEST_ENABLE_BT); noticeView.setText(" "); //Toast.makeText(this, " ", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, " ", Toast.LENGTH_SHORT).show(); } } return true; } else if (id == R.id.show_devices) { if (bluetoothAdapter != null) { if (!bluetoothAdapter.isEnabled()) { Toast.makeText(this, " ", Toast.LENGTH_SHORT).show(); return true; } // List<String> devices = new ArrayList<String>(); Set<BluetoothDevice> bondedDevices = bluetoothAdapter.getBondedDevices(); for (BluetoothDevice device : bondedDevices) { devices.add(device.getName() + "-" + device.getAddress()); } StringBuilder text = new StringBuilder(); for (String device : devices) { text.append(device + "
"); } Toast.makeText(this, text, Toast.LENGTH_SHORT).show(); } return true; } else if (id == R.id.find_devices) { Toast.makeText(this, " ", Toast.LENGTH_SHORT).show(); } else if (id == R.id.connect_devices) { if (bluetoothAdapter == null || !bluetoothAdapter.isEnabled()) { Toast.makeText(this, " ", Toast.LENGTH_SHORT).show(); return true; } // , List<String> devices = new ArrayList<String>(); Set<BluetoothDevice> bondedDevices = bluetoothAdapter.getBondedDevices(); for (BluetoothDevice device : bondedDevices) { connectThread = new ConnectThread(device); connectThread.start(); //Toast.makeText(this, " ", Toast.LENGTH_SHORT).show(); break; } } return super.onOptionsItemSelected(item); } private class ConnectThread extends Thread { private final String MY_UUID = "00001101-0000-1000-8000-00805F9B34FB"; private final BluetoothSocket socket; private final BluetoothDevice device; public ConnectThread(BluetoothDevice device) { this.device = device; BluetoothSocket tmp = null; try { tmp = device.createRfcommSocketToServiceRecord(UUID.fromString(MY_UUID)); } catch (IOException e) { e.printStackTrace(); } this.socket = tmp; } public void run() { bluetoothAdapter.cancelDiscovery(); try { socket.connect(); connectedThread = new ConnectedThread(socket); connectedThread.start(); } catch (IOException e) { try { socket.close(); } catch (IOException ee) { ee.printStackTrace(); } return; } //manageConnectedSocket(socket); } public void cancel() { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } // , ConnectedThread private class ConnectedThread extends Thread { private final BluetoothSocket socket; private final InputStream inputStream; private final OutputStream outputStream; public ConnectedThread(BluetoothSocket socket) { this.socket = socket; InputStream input = null; OutputStream output = null; try { input = socket.getInputStream(); output = socket.getOutputStream(); } catch (IOException e) { e.printStackTrace(); } this.inputStream = input; this.outputStream = output; } public void run() { StringBuilder recvText = new StringBuilder(); byte[] buff = new byte[1024]; int bytes; Bundle tmpBundle = new Bundle(); Message tmpMessage = new Message(); tmpBundle.putString("notice", " "); tmpMessage.what = NOTICE_VIEW; tmpMessage.setData(tmpBundle); handler.sendMessage(tmpMessage); while (true) { try { bytes = inputStream.read(buff); String str = new String(buff, "ISO-8859-1"); str = str.substring(0, bytes); // , "#" , //Log.e("read", str); if (!str.endsWith("#")) { recvText.append(str); continue; } recvText.append(str.substring(0, str.length() - 1)); // '#' Bundle bundle = new Bundle(); Message message = new Message(); bundle.putString("recv", recvText.toString()); message.what = RECV_VIEW; message.setData(bundle); handler.sendMessage(message); recvText.replace(0, recvText.length(), ""); } catch (IOException e) { e.printStackTrace(); break; } } } public void write(byte[] bytes) { try { outputStream.write(bytes); } catch (IOException e) { e.printStackTrace(); } } public void cancel() { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } }
menu_main.xml 파일 은 다음 과 같 습 니 다.

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity">
<item
android:id="@+id/show_devices"
android:title="@string/show_devices"
android:orderInCategory="100"
app:showAsAction="never" />
<item
android:id="@+id/start_bluetooth"
android:title="@string/start_bluetooth"
android:orderInCategory="100"
app:showAsAction="never" />
<item
android:id="@+id/find_devices"
android:title="@string/find_devices"
android:orderInCategory="100"
app:showAsAction="never" />
<item
android:id="@+id/connect_devices"
android:title="@string/connect_devices"
android:orderInCategory="100"
app:showAsAction="never" />
</menu>
strings.xml 파일 은 다음 과 같 습 니 다.

<resources>
<string name="app_name">BlueTooth</string>
<string name="action_settings">Settings</string>
<string name="start_bluetooth">    </string>
<string name="show_devices">      </string>
<string name="find_devices">    </string>
<string name="connect_devices">    </string>
</resources>
지금까지 전체 앱 이 개발 되 었 습 니 다.직접 테스트 를 사용 할 수 있 습 니 다.오류 가 있 으 면 댓 글 을 통 해^ ^에 대해 이야기 하 는 것 을 환영 합 니 다.
여기까지 입 니 다.본 고 는 모든 내용 을 소개 해 드 리 겠 습 니 다.직접 테스트 해 봤 습 니 다.코드 가 안전 하고 믿 을 수 있 으 며 실 용적 입 니 다.만약 에 문제 가 있 으 면 저 에 게 메 시 지 를 남 겨 주세요.편집장 님 께 서 신속하게 답 해 주 실 겁 니 다!

좋은 웹페이지 즐겨찾기