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

블루투스 통신결과를 스크린에 띄우고싶습니다.

0 추천

폰-->노트북은 결과값이 노트북에 뜹니다만, 

 

노트북--> 폰은 데이터를 어떻게 잡아야되는지 감이 안오네요

 

Bluetooth chat 예제를 보고 공부하는데 ,

  case MESSAGE_READ:
                byte[] readBuf = (byte[]) msg.obj;
                // construct a string from the valid bytes in the buffer
                String readMessage = new String(readBuf, 0, msg.arg1);
                mConversationArrayAdapter.add(mConnectedDeviceName+":  " + readMessage);
                break;
 
이걸 이용해서 데이터를 읽어오는것 아닌가요?
 
그런데 소스에서 어떻게 데이터를 읽어야할지 감이안옵니다.
 
도움을주십시오
wsbaek (170 포인트) 님이 2014년 6월 24일 질문

1개의 답변

+1 추천
Bluetooth Char  예제를 보시면 블루투스 통신을 담당하는 클래스에서 메인 엑티비티에 핸들러를 통해 메세지를 보냅니다.

지금 그 부분인거 같은데요.. 현재 질문에 소스가 있는 부분에 readMessage가 다른 기기로부터 받은 데이터가 됩니다.

그 부분을 수정을 하던지 저장을 하던지... 하시면 됩니다.
인연 (31,880 포인트) 님이 2014년 6월 24일 답변
어떤식으로 수정해야하나요..ㅠㅠ감이안와요
노트북에서 단말기로 오는 데이터가 어떤 것인지도 모르는데 수정을 바라시면 곤란하지요 ^^;
분명 어떤 식으로 오는데 어떤식으로 수정했으면 하는 것이 있을텐데 말이지요.
음, 노트북에서 오는 데이터는 10진수 숫자입니다.
데이터는 랩뷰의 아웃풋값을 받습니다.
제 생각에는 main함수에 void로 read에 대한 함수를 새로 만들어서 호출하는 식으로 해야할 것 같은데, 이 방법이 맞나요?
제가 자바쪽은 문외한이라.....죄송합니다
10진수 숫자를 어떻게 가공하고 싶은지는 잘 모르겠지만. 일단 int 값으로 수정하여서 값을 가공을 해야겠지요. Integer.parseInt(readMessage) 와 같이 int로 수정을 한 뒤, 가공을 하면 되겠네요. 뭐... 그 뒤는 int형으로 바뀌었으니 처리할 수 있으리라 봅니다. 해당 과정을 함수화 하여도 되지만.. 그건 질문자 분의 선택이라고 생각됩니다.
사실 정수형인지 문자열인지 보다 중요한건 데이터를 어떻게 호출하느냐 하는것이 궁금했습니다.
공부가 안되있어서 급히 이것저것 소스만 보고 어떻게돌아가는지 감만잡은 상태라,,, 친절한 답변에 정말 죄송스럽네요

그럼 만약 답변해주신대로

 case MESSAGE_READ:
                byte[] readBuf = (byte[]) msg.obj;
                // construct a string from the valid bytes in the buffer
                String readMessage = new String(readBuf, 0, msg.arg1);
                Integer.parseInt(readMessage);
                Toast.makeText(getApplicationContext(), readMessage, Toast.LENGTH_SHORT).show();
                break;
이렇게 수정을 한뒤, 액티비티에서 저 int값을 어떻ㄱ ㅔ호출해야하나요?
Value.setText(String.valueOf(score));

이런식으로 호출하면되나요?
음... 전역변수를 하나 선언해두고, 핸들러가 호출 될 때 읽어들인 값을 저장하면 됩니다. 액티비티에서는 전역변수를 통해 값에 접근하는 방법이 되겠지요. 아니면, 값을 처리하는 함수가 있다면 함수의 인자로 값을 넘겨주어도 되리라 봅니다. 값이 전송되는 시간이 불규칙적으로 온다면 함수를 후자의 방법으로 바로바로 처리하는 쪽이 좋을 것이라 보이기도 하네요. 아무튼 액티비티의 다른 부분에서 사용하려면 그 값에 접근할 수 있도록 구현을 해 두어야지요. 전자의 방법은 변수를 통해 접근하는 것이고, 후자의 방법은 함수의 인자로 접근하는 것입니다. 더 편한것을 선택하시면 됩니다.
자바를 잘 모르신다니..
public class ActivityMain extends Acticity{
  int readvalue;
 ...
  public Hander mHandler = new Handler(){
  ...
 case MESSAGE_READ:
                byte[] readBuf = (byte[]) msg.obj;
                // construct a string from the valid bytes in the buffer
                String readMessage = new String(readBuf, 0, msg.arg1);
                mConversationArrayAdapter.add(mConnectedDeviceName+":  " + readMessage);
                readvalue = Integer.parseINT(readMessage);
                break;
...
 }
}

위와 같은 방법으로 한다면 전역변수로 하는 방법이며, 액티비티 내에서는 readvalue로 접근할 수 있습니다.
아 설명이 부족했군요 ㅎㅎ;;; 다른액티비티에서 실행하게만들어놔서 말입니다..ㅎㅎ 감사합니다
package remote.bluetooth;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class KbdActivity extends Activity {
    @Override
   
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView Read;
    //    TypeView KbdView = new TypeView(this);
        setContentView(R.layout.typeview); // KbdActivity에 TypeView를 입히기.
        // TODO Auto-generated method stub
        Read = (TextView) findViewById(R.id.read);
        Read.setText(String.valueOf(Main.readvalue));
        
        
        
    }
}

말씀해주신대로 해보았으나
Cannot make a static reference to the non-static field Main.readvalue

readvalue가 static하지 않아서 안된다고 뜨네요..
음...  int readvalue; 로 선언된 것을 static int readvalue;로 고치면 되긴 합니다만... 구지 다른 액티비티를 실행하는 이유라도 있는지요? 전 또 동일 액티비티 내에서 처리하는줄...^^;


static으로 하니까 한 화면에 연속된 값(숫자가 변하는값)을 받지는 못하는군요!
지금 숫자를 모니터링해야되서 연속된 값을받아야하는데 static int로 하면 어쩔수가 없는것 같네요
정말 감사합니다 많은 도움이되었습니다!
모니터링을 하는데 데이터별로 각각다른 activity에서 실행되게 해놨기때문에 다른 activity에서 열어야합니다 ㅎㅎ;
데이터별로 모니터링을 해야한다면 또한 다른 액티비티라면 위의 방법은 부적절하다고 생각합니다. 옵저버 패턴을 검색하여 적용해보세요. 아니면 데이터를 관리하는 클래스를 따로 만들고 데이터는 그 클래스를 통해서 얻어온다던지... 옵저버 패턴이 생소하다면 따로 클래스를 만드는 것이 더 구현하기 쉬울 것입니다.
...