안 드 로 이 드 블 루 투 스 학습 (2) 응용 층 블 루 투 스 장치 찾기, tcp 구현ip 통신
1. JAVA 층 frameworks/base/core/java/android/bluetooth/
블 루 투 스 가 포 함 된 자바 류.
2. JNI 층
frameworks/base/core/jni/android_bluetooth_시작 파일
bluez 가 JNI 를 통 해 상층 부 로 가 는 인 터 페 이 스 를 정의 합 니 다.
frameworks/base/core/jni/android_server_bluetoothservice.cpp
하드웨어 어댑터 인터페이스 system / bluetooth / bluedroid / bluetooth. c 호출
3. bluez 라 이브 러 리
external/bluez/
이것 은 bluez 사용자 공간의 라 이브 러 리 입 니 다. 오픈 소스 의 bluetooth 코드 는 많은 프로 토 콜 을 포함 하여 libbluetooth. so 를 생 성 합 니 다.
4. 하드웨어 어댑터
system/bluetooth/bluedroid/bluetooth.c
하드웨어 조작 인터페이스 포함
system/bluetooth/data/*
일부 프로필 은 / etc / bluetooth / 로 복사 합 니 다.
다른 테스트 코드 와 도구 도 있 습 니 다.
1. 블 루 투 스 개발 에 사용 되 는 종 류 를 간략하게 소개 합 니 다.
1. 블 루 투 스 어댑터, 블 루 투 스 어댑터, 블 루 투 스 장치 사용 여부 등 기능 을 판단 할 수 있 습 니 다.상용 방법 은 다음 과 같다. cancelDiscovery (), 검색 과정 을 취소 하고 블 루 투 스 장치 검색 을 할 때 이 방법 을 사용 하면 검색 을 중단 합 니 다.(검색 과정 은 12 초 간 지속) disable () 블 루 투 스 를 닫 습 니 다. 즉, 우리 가 흔히 말 하 는 블 루 투 스 사용 금지 입 니 다. enable () 블 루 투 스 를 엽 니 다. 이 방법 은 블 루 투 스 를 엽 니 다. 알림 이 뜨 지 않 습 니 다. 정상 적 인 절차 에서 저 희 는 시스템 에 블 루 투 스 장 치 를 열 었 는 지 여 부 를 알려 드 립 니 다.다음 두 줄 의 코드 는 쉽게 해결 할 수 있 습 니 다.
Intent enabler=new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enabler,reCode);//startActivity (enabler);(주 Activity 에서 2 급 Activity 를 시작 합 니 다. reCode 는 보통 3 과 같 습 니 다. AndroidManifest. xml 에 블 루 투 스 권한 을 추가 하 는 것 을 기억 하 세 요) getAddress () 로 컬 블 루 투 스 주소 가 져 오기 getDefaultAdapter () 는 기본 BluetoothAdapter 를 가 져 옵 니 다. 실제로 이 방법 만 BluetoothAdapter 를 가 져 옵 니 다. getName () 로 컬 블 루 투 스 이름 가 져 오기 getRemoteDevice (String address) 블 루 투 스 주소 에 따라 원 격 블 루 투 스 장 치 를 가 져 옵 니 다. getState () 로 컬 블 루 투 스 어댑터 의 현재 상 태 를 가 져 옵 니 다 (디 버 깅 이 가능 할 때 더 필요 할 것 같 습 니 다) isDiscovering () 은 현재 장 치 를 찾 고 있 는 지 여 부 를 판단 하고 true 로 돌아 갑 니 다. isEnabled () 블 루 투 스 가 열 렸 는 지 판단 하고 true 로 돌 아 왔 습 니 다. 그렇지 않 으 면 false 로 돌아 갑 니 다. listenUsingRfcomm WithServiceRecord (String name, UUID uid) 이름 에 따라 UUID 를 만 들 고 되 돌려 줍 니 다. Bluetooth ServerSocket, BluetoothSocket 서버 를 만 드 는 첫 번 째 단계 입 니 다. startDiscovery () 검색 시작, 검색 의 첫걸음
2. BluetoothDevice 는 이름 을 보면 알 수 있 습 니 다. 이 종 류 는 블 루 투 스 장 치 를 설명 합 니 다. createrfcommSocketToServiceRecord (UUIDuuid) UUID 에 따라 BluetoothSocket 을 만 들 고 되 돌려 줍 니 다. 이 방법 도 우리 가 BluetoothDevice 를 얻 는 목적 입 니 다. BluetoothSocket 을 만 드 는 것 입 니 다. getAddress (), getName (), BluetoothAdapter 와 같은 다른 방법 이 종 류 는 블 루 투 스 의 자동 짝 짓 기, setPin, createbond, cancelPairing User Input 등 몇 가지 숨겨 진 방법 이 있 습 니 다. (자바 의 반 사 를 통 해 이 몇 가지 숨겨 진 방법 을 호출 해 야 합 니 다)
3. BluetoothServerSocket 블 루 투 스 를 제거 하면 더 이상 익숙 할 수 없 을 것 이 라 고 믿 습 니 다. Socket 이 라면 방법 이 많 지 않 을 것 입 니 다. 이 종 류 는 하나 에 세 가지 방법 밖 에 없다. 두 개의 과부하 accept (), accept (inttimeout) 두 가지 차이 점 은 뒤의 방법 이 시간 이 지난 시간 을 지정 한 것 입 니 다. 주의해 야 할 것 은 이 두 가지 방법 을 실행 할 때 클 라 이언 트 의 요청 (또는 기한 이 지난 후에) 을 받 을 때 까지 스 레 드 를 막 고 새 스 레 드 에서 실행 해 야 합 니 다! 그리고 주의해 야 할 것 은 이 두 가지 방법 은 모두 하나의 BluetoothSocket 으로 돌아 가 고 마지막 연결 도 서버 측 과 클 라 이언 트 의 두 개의 BluetoothSocket 의 연결 이다. close () 닫 기!
4. BluetoothSocket 은 BluetoothServerSocket 과 상대 적 으로 클 라 이언 트 입 니 다. 모두 5 가지 방법 이 있 습 니 다. 의외 의 사고 없 이 모두 사용 할 수 있 습 니 다. close (), 닫 기 connect () 연결 getInptuStream () 입력 흐름 가 져 오기 getOutputStream () 출력 흐름 가 져 오기 getRemoteDevice () 원 격 장 치 를 가 져 옵 니 다. bluetoothSocket 에서 지정 한 연결 을 가 져 오 는 원 격 블 루 투 스 장 치 를 말 합 니 다.
2. 블 루 투 스 설비 의 발견, 찾기.
1. 안전성 을 고려 하여 설정 이 켜 지면 검색 할 수 있 습 니 다. 안 드 로 이 드 시스템 은 기본적으로 120 초 동안 다른 장 치 는 120 초 동안 검색 할 수 있 습 니 다.
Intent enable = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
startActivityForResult(enalbe,REQUEST_DISCOVERABLE);
2. 블 루 투 스 장치 검색
BluetoothAdapter _bluetooth = BluetoothAdapter.getDefaultAdapter(); _bluetooth.startDiscovery(); 3. 블 루 투 스 장치 닫 기 BluetoothAdapter _bluetooth = BluetoothAdapter.getDefaultAdapter(); _bluetooth.disable(); 4. 블 루 투 스 클 라 이언 트 만 들 기 BluetoothSocket socket = device. createrfcommSocketToServiceRecord (UUID. fromString (UUID 번호); socket.connect(); 4. 블 루 투 스 서버 만 들 기 BluetoothServerSocket _serverSocket = _bluetooth. listenUsingRfcommWithServiceRecord (서버 이름, UUID. fromeString (UUID 번호)); BluetoothSocket socket = _serverSocket.accept(); InputStream inputStream = socket.getInputStream(); 3. 관련 코드 구현 주: tcpip 모듈 은 시스템 setting 모듈 에서 블 루 투 스 의 짝 짓 기 를 완성 해 야 합 니 다. 짝 짓 기 에 성공 해야만 socket 통신 을 할 수 있 습 니 다.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.thecaseforbluetooth"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".BluetoothActivity"
android:label="@string/title_activity_bluetooth" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btnSearch"
android:text=" "
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btnExit"
android:text=" "
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btnDis"
android:text=" "
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btnserver"
android:text=" "
/>
<ToggleButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tbtnSwitch"
android:text=" / "
/>
<ListView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/lvDevices"
/>
</LinearLayout>
BluetoothActivity.java package com.example.thecaseforbluetooth;
import java.util.ArrayList;
import java.util.Set;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.ToggleButton;
public class BluetoothActivity extends Activity {
public Button searchBtn;//
public Button exitBtn;//
public Button discoverBtn;//
public ToggleButton openBtn;//
public Button serverbtn;
public ListView listView;//
public ArrayAdapter<String> adapter;
public ArrayList<String> list =new ArrayList<String>();
private BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
Set<BluetoothDevice> bondDevices ;
public Context context ;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
searchBtn = (Button)findViewById(R.id.btnSearch);
exitBtn = (Button)findViewById(R.id.btnExit);
discoverBtn = (Button)findViewById(R.id.btnDis);
openBtn = (ToggleButton)findViewById(R.id.tbtnSwitch);
serverbtn = (Button)findViewById(R.id.btnserver);
listView = (ListView)findViewById(R.id.lvDevices);
context = getApplicationContext();
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,list);
listView.setAdapter(adapter);
openBtn.setChecked(false);
//
IntentFilter intent = new IntentFilter();
intent.addAction(BluetoothDevice.ACTION_FOUND);// BroadcastReceiver
intent.addAction(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED); // , ACTION_SCAN_MODE_CHANGED 。 , , 。
intent.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); // , ACTION_STATE_CHANGED 。
registerReceiver(searchReceiver, intent);
//
searchBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(bluetoothAdapter.isDiscovering()){
bluetoothAdapter.cancelDiscovery();
}
list.clear();
bondDevices = bluetoothAdapter.getBondedDevices();
for(BluetoothDevice device : bondDevices) {
String str = " " + device.getName() +" "
+ device.getAddress();
list.add(str);
adapter.notifyDataSetChanged();
}
bluetoothAdapter.startDiscovery();
}
});
//
exitBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
BluetoothActivity.this.finish();
}
});
//
discoverBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent discoverIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
startActivity(discoverIntent);
}
});
//
openBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(openBtn.isChecked() == true){
bluetoothAdapter.disable();
}
else if(openBtn.isChecked() == false){
bluetoothAdapter.enable();
}
}
});
//
serverbtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
ServerThread serverThread = new ServerThread(bluetoothAdapter, context);
Toast.makeText(context, "server ", 5000).show();
serverThread.start();
}
});
listView.setOnItemClickListener(new ItemClickListener());
}
@Override
public void onStart() {
super.onStart();
// If BT is not on, request that it be enabled.
if(bluetoothAdapter == null){
Toast.makeText(context, " ", 5000).show();
}
if (!bluetoothAdapter.isEnabled()) {
Intent enableIntent = new Intent(
BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableIntent, 3);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private final BroadcastReceiver searchReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String action = intent.getAction();
BluetoothDevice device = null;
if(BluetoothDevice.ACTION_FOUND.equals(action)){
device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (device.getBondState() == BluetoothDevice.BOND_NONE) {
Toast.makeText(context, device.getName()+"", 5000).show();
String str = " " + device.getName() +" "
+ device.getAddress();
if (list.indexOf(str) == -1)//
list.add(str);
}
adapter.notifyDataSetChanged();
}
}
};
public class ItemClickListener implements OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
if(bluetoothAdapter.isDiscovering())
bluetoothAdapter.cancelDiscovery();
String str = list.get(arg2);
String address = str.substring(str.length() - 17);
BluetoothDevice btDev = bluetoothAdapter.getRemoteDevice(address);
ClientThread clientThread = new ClientThread(btDev, context);
clientThread.start();
}}
}
Bluetoothprotocol.java package com.example.thecaseforbluetooth;
public interface Bluetoothprotocol {
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";
}
ServerThread.java package com.example.thecaseforbluetooth;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.UUID;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.content.Context;
import android.os.Message;
import android.util.Log;
import android.widget.Toast;
public class ServerThread extends Thread {
public BluetoothServerSocket mserverSocket;
public BluetoothAdapter bluetoothAdapter;
public BluetoothSocket socket;
public Context context;
public ServerThread(BluetoothAdapter bluetoothAdapter,Context context) {
this.bluetoothAdapter = bluetoothAdapter;
this.context = context;
}
public void run() {
try {
/*
* : 、UUID */
mserverSocket = bluetoothAdapter.listenUsingRfcommWithServiceRecord(Bluetoothprotocol.PROTOCOL_SCHEME_RFCOMM,
UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
// /* */
socket = mserverSocket.accept();
// ,
//
byte[] buffer = new byte[1024];
int bytes;
InputStream mmInStream = null;
try {
mmInStream = socket.getInputStream();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println("zhoulc server");
while(true){
if( (bytes = mmInStream.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);
System.out.println(s+"zhoulc server is in");
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
ClientThread.java package com.example.thecaseforbluetooth;
import java.io.IOException;
import java.io.OutputStream;
import java.util.UUID;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Context;
import android.widget.Toast;
public class ClientThread extends Thread {
public BluetoothSocket socket;
public BluetoothDevice device;
public Context context;
public ClientThread(BluetoothDevice device,Context context){
this.device = device;
this.context = context;
}
public void run() {
try {
// Socket : UUID
socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
//
socket.connect();
// ,
//
if (socket == null)
{
Toast.makeText(context, " ", 5000).show();
return;
}
System.out.println("zhoulc client");
while(true){
try {
System.out.println("zhoulc client is in");
String msg = "hello everybody I am client";
OutputStream os = socket.getOutputStream();
os.write(msg.getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.