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

아두이노 와 안드로이드 wifi socket 통신 질문!

0 추천

안드로이드 공부를 시작한지 얼마 안된 학생입니다.

안드로이드에서 지정한 값을 보내주면 아두이노에서 받은 메시지에 대한 응답을 해주는 부분을

공부하고 있습니다.

bluetooth 관련 모듈을 장착하고

bluetooth로 테스트 해볼때는 전혀 문제없었지만.

현재 아두이노에 jsn270 을 장착하고 무선랜 AP에 연결되어있습니다.

전원을 연결하면 아두이노 서버가 활성화 되고있습니다.

여기에 안드로이드로 단순한 socket 연결을 시도해봤는데

정삭적으로 연결은 되었지만 receive에서 문제가 생겼습니다.

bluetooth에서 전혀 발생하지 않았던 receive 값이 지속적으로 -1이 들어오게 되었습니다.

로그로 살펴보면

Log : Socket Connection Sucess...
Log : Start ReadThread....
Log : Receive Start
Log : Receive bytes : -1
Log : Receive bytes : -1
Log : Receive bytes : -1
.
. ---> press the button ( android -> Arduino send message)
.
Log : Receive bytes : -1
Log : Receive bytes : -1
.
. ---> press the button ( android -> Arduino send message)
broken pipe error
.
Log : Receive bytes : -1
Log : Receive bytes : -1

이런식으로 Receive bytes -1이 계속하여 들어오게됩니다.

bluetooth에서는 전혀 발생하지 않았는데 wifi를 이용한 socket 통신을 하니 이런 문제가 발생합니다.

아두이노와 socket 통신은 기본적인 socket이 아닌 다른 방식을 사용해야하는건가요?

public class MainActivity extends ActionBarActivity {


    private Socket socket;
 
    private InputStream mmInStream;
    private OutputStream mmOutStream;

    private ConnectedThread writeThread;
 private String ip = "192.168.0.101";
 private int port = 80;
 
 Button btn1;
   
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

     try {
   setSocket(ip, port);
   
   } catch (IOException e) {
   e.printStackTrace();
   }
  
  btn1 = (Button) findViewById(R.id.SendButton);
  btn1.setOnClickListener(mClickListener);
          
           
 }
 



 Button.OnClickListener mClickListener = new View.OnClickListener() {
   
   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    switch(v.getId())
    {
    case R.id.SendButton:
     byte[] hex_test2={(byte)0xFE,(byte)0xD0,(byte)0xAA,(byte)0x01,(byte)

0x01,(byte)0x64,(byte)0x64,(byte)0x64,(byte)0x64,(byte)0x64,(byte)0xA0,(byte)0xFE,(byte)0x0D};   
        mmOutStream.write(hex_test2);
    Log.d("TEST", "SENDDATA");
     break;
    default :
     break;
    }
    
   }
  };
 
    public void setSocket(String ip, int port) throws IOException
    {
         try {
             socket = new Socket(ip, port);
             Log.d("TEST", "SOCKET SUCESS");
             ConnectedThread mConnectedThread = new ConnectedThread(socket);
             mConnectedThread.start();
             try {
     mmInStream = socket.getInputStream();
              mmOutStream = socket.getOutputStream();
             
    } catch (IOException e1) {
     // TODO Auto-generated catch block
     e1.printStackTrace();
    }
         } catch (IOException e) {
             System.out.println(e);
             Log.d("TEST", "SOCKET_FAIL");
             e.printStackTrace();
         }
 
     }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
 }

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
  // Handle action bar item clicks here. The action bar will
  // automatically handle clicks on the Home/Up button, so long
  // as you specify a parent activity in AndroidManifest.xml.
  int id = item.getItemId();
  if (id == R.id.action_settings) {
   return true;
  }
  return super.onOptionsItemSelected(item);
 }
 
 private class ConnectedThread extends Thread {
     private final Socket mmSocket;
     private final InputStream mmInStream;
     private final OutputStream mmOutStream;

     public ConnectedThread(Socket socket) {
         mmSocket = socket;
         InputStream tmpIn = null;
         OutputStream tmpOut = null;
         // Get the input and output streams, using temp objects because
         // member streams are final
         try {
             tmpIn = socket.getInputStream();
             tmpOut = socket.getOutputStream();
         } catch (IOException e) { }
         mmInStream = tmpIn;
         mmOutStream = tmpOut;
     }

     public void run() {
         byte[] buffer = new byte[1024];    // buffer store for the stream
         int bytes; // bytes returned from read()
         // Keep listening to the InputStream until an exception occurs
         while (true) {
             try {
                 // Read from the InputStream
                 bytes = mmInStream.read(buffer);
                 // Send the obtained bytes to the UI Activity
                 Log.d("TEST", "receive : " + bytes);
             } catch (IOException e) {
                 break;
             }
         }
     }
 }

아두이노의 경우 완성된 제품이 와서 내부 소스를 볼수 없더군요...

혹시나 해서 Wireshark로 패킷이 지나가는걸을 봤는데 데이터는 전송되는것 같습니다.

.101이 아두이노 이며, .13이 데이터가 흘러가나 보려고 데스크탑에서 java로 보내본 주소입니다.

소스는 위의 소스와 같은 소스를 사용했습니다. 데이터는 흘러가는것 같은데 전혀 응답이 오지않아서

어떤 부분이 문제인지 정말 궁금합니다.

쌈빱 (280 포인트) 님이 2016년 6월 8일 질문

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...