마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 블루투스 통신

0 추천

블루투스와 연결을 해서 문자"a"를 아두이노 HC-06을 통해 전송 받았습니다. 아두이노 시리얼모니터에는 앱에서 전송한 "a"가 잘 출력되지만, 이클립스에서 블루투스와 연결해 실행하면 문자를 받지 못하는 상황이 있는거 같습니다. 이클립스 코드에 어떤 문제가 있는건가요..? 

제 생각으로는 아두이노 시리얼모니터에 "a"가 출력되는걸봐서 전송은 정상적으로 된거 같은데, 이클립스 자바에서 받는 코드에 문제가 있어서 화면에 출력을 못하는거 같습니다....

전송한 문자를 정상적으로 출력하라면 어떻게 해야 하나요...?

 

 

안드로이드 버튼 클릭시 a 전송

btnOpen.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sendText="a";
                try{
                    outputStream.write(sendText.getBytes());
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        });

 

 

이클립스 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;

import javax.bluetooth.BluetoothStateException;
import javax.bluetooth.LocalDevice;
import javax.bluetooth.RemoteDevice;
import javax.bluetooth.UUID;
import javax.microedition.io.Connector;  
import javax.microedition.io.StreamConnection;  
import javax.microedition.io.StreamConnectionNotifier;  
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Reader;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Date; 


public class Server{	  
    public static void main(String[] args){   
		log("Local Bluetooth device...\n");
    	LocalDevice local = null;
		try {
			
			local = LocalDevice.getLocalDevice();
		} catch (BluetoothStateException e2) {
			
		}
    	log( "address: " + local.getBluetoothAddress() );
    	log( "name: " + local.getFriendlyName() );
    	
    	Runnable r = new ServerRunable();
    	Thread thread = new Thread(r);
    	thread.start();
    } 
    private static void log(String msg) {  
        System.out.println("["+(new Date()) + "] " + msg);  
    }
}

class ServerRunable implements Runnable{	  
	//UUID for SPP
	final UUID uuid = new UUID("0000110100001000800000805F9B34FB", false);
    final String CONNECTION_URL_FOR_SPP = "btspp://localhost:"
    			+ uuid +";name=SPP Server";  
    private StreamConnectionNotifier mStreamConnectionNotifier = null;  
    private StreamConnection mStreamConnection = null; 
    private int count = 0;    
	@Override
	public void run() {
    	try {
			mStreamConnectionNotifier = (StreamConnectionNotifier) Connector
						.open(CONNECTION_URL_FOR_SPP);
			log("Opened connection successful.");
		} catch (IOException e) {
			log("Could not open connection: " + e.getMessage());
			return;
		}
    	log("Server is now running.");  	
        while(true){      	
        	log("wait for client requests...");
			try {	
				mStreamConnection = mStreamConnectionNotifier.acceptAndOpen();
			} catch (IOException e1) {
				log("Could not open connection: " + e1.getMessage() );
			}
			count++;
			log("현재 접속 중인 클라이언트 수: " + count);				
	        new Receiver(mStreamConnection).start();
        }
		
	}
    class Receiver extends Thread {
    	private InputStream mInputStream = null; 
        private OutputStream mOutputStream = null; 
        private String mRemoteDeviceString = null;
        private StreamConnection mStreamConnection = null;
        Receiver(StreamConnection streamConnection){
        	mStreamConnection = streamConnection;
			try {	
				mInputStream = mStreamConnection.openInputStream();
				mOutputStream = mStreamConnection.openOutputStream();	
				mOutputStream.write(123);
				log("Open streams...");
			} catch (IOException e) {
				log("Couldn't open Stream: " + e.getMessage());
				Thread.currentThread().interrupt();		
				return;
			}
			try {
					RemoteDevice remoteDevice = RemoteDevice.getRemoteDevice(mStreamConnection);
			        mRemoteDeviceString = remoteDevice.getBluetoothAddress();
					log("Remote device");
					log("address: "+ mRemoteDeviceString);
				} catch (IOException e1) {
					log("Found device, but couldn't connect to it: " + e1.getMessage());
					return;
			}
			log("Client is connected...");
        }
    	@Override
		public void run() {
			try {
	    		Reader mReader = new BufferedReader(new InputStreamReader
			         ( mInputStream, Charset.forName(StandardCharsets.UTF_8.name())));
	    		boolean isDisconnected = false;
	
				Sender("에코 서버에 접속하셨습니다.");
				Sender( "보내신 문자를 에코해드립니다.");
	    		
				while(true){
					log("ready");		        
		            StringBuilder stringBuilder = new StringBuilder();
		            int c = 0;          
					while ( '\n' != (char)( c = mReader.read()) ) {		
						if ( c == -1){	
							log("Client has been disconnected");
							count--;
							log("현재 접속 중인 클라이언트 수: " + count);
							isDisconnected = true;
							Thread.currentThread().interrupt();
							break;
						}
						stringBuilder.append((char) c);
					}
		            if ( isDisconnected ) break;
		            String recvMessage = stringBuilder.toString();
			        log( mRemoteDeviceString + ": " + recvMessage );
		            Sender(recvMessage);
		           int irecvMessage=Integer.parseInt(recvMessage);
		            mOutputStream.write(irecvMessage);
				}
			} catch (IOException e) {
				log("Receiver closed" + e.getMessage());
			}
		}
    	void Sender(String msg){
            PrintWriter printWriter = new PrintWriter(new BufferedWriter
            		(new OutputStreamWriter(mOutputStream, 
            				Charset.forName(StandardCharsets.UTF_8.name()))));
    		printWriter.write(msg+"\n");
    		printWriter.flush();
    		log( "Me : " + msg );
    	}
	}
    private static void log(String msg) {  
        System.out.println("["+(new Date()) + "] " + msg);  
    }   
}

 

개미1 (1,260 포인트) 님이 2021년 10월 19일 질문

1개의 답변

0 추천

제가 이두이노라는 디바이스에 대해서는 아는 게 없어서 디바이스 관련된 거는 말씀드릴게 없는데, 코드에서 한가지가 눈에 들어 옵니다.

while(true){        
            log("wait for client requests...");
            try {   
                mStreamConnection = mStreamConnectionNotifier.acceptAndOpen();
            } catch (IOException e1) {
                log("Could not open connection: " + e1.getMessage() );
            }
            count++;
            log("현재 접속 중인 클라이언트 수: " + count);              
            new Receiver(mStreamConnection).start();
        }

문서에는 acceptAndOpen에 대해서

Returns a StreamConnection object that represents a server side socket connection.

서버 소켙 커넥션에 대한 오브젝트를 리턴한다고 되어 있는데요.

왜 무한루프 안에서 acceptAndOnce를 계속 호출하나요? 루프이전에 호출하던가 커넥션이 끊어진 경우에만 호출이 되야하는 것이 아닌가 해서요.

spark (224,800 포인트) 님이 2021년 10월 19일 답변
...