안 드 로 이 드 블 루 투 스 학습 (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();
		} 
	}
}

좋은 웹페이지 즐겨찾기