top drop menu

Recent Post

화요일, 11월 6

NodeMCU(혹 아두이노)를 이용하여 웹소켓 통신하기(3)

이번에는 안드로이드 클라이언트를 만들어 보자. 쉽게 할 수 있는 방법을 찾아 보니 딱히 없다. 기본으로 제공하는게 없는 모양이다. 못 찾아서 그럴수도 …
그래서 웹소켓 라이브러리를 이용하기로 했다. 먼저 gradle에 추가해 주자.
implementation 'com.neovisionaries:nv-websocket-client:2.4'
레이아웃은 간단히 응답 메세지를 출력할 텍스트뷰를 배치하고 그 밑에 두개의 버튼을 추가하였다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="
http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     tools:context=".MainActivity">

    <TextView
         android:id="@+id/tv_result"
         android:textSize="24dp"
         android:textColor="@color/colorAccent"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_alignParentTop="true"
         android:layout_centerHorizontal="true"
         android:layout_marginTop="66dp"
         android:text="TextView" />

    <Button
         android:id="@+id/button"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_alignParentStart="true"
         android:layout_alignParentTop="true"
         android:layout_marginStart="76dp"
         android:layout_marginTop="157dp"
         android:text="Red" />

    <Button
         android:id="@+id/button2"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_alignBottom="@+id/button"
         android:layout_alignParentEnd="true"
         android:layout_marginEnd="77dp"
         android:text="Green" />


</RelativeLayout>
이제 메인액티비에 코드를 작성하자.
public class MainActivity extends AppCompatActivity {
    private static final String TAG = MainActivity.class.getSimpleName();
     Button bt_red, bt_green;
     TextView result;

    WebSocket ws = null;
    @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);

        WebSocketFactory factory = new WebSocketFactory().setConnectionTimeout(5000);
         try{
             ws = factory.createSocket("ws://server_ip:port"); //''로 하면 에러남 이런 아니 왜?
             ws.addListener(new WebSocketAdapter(){
                 @Override
                 public void onTextMessage(WebSocket websocket, String text) throws Exception {
                     super.onTextMessage(websocket, text);
                     Log.d(TAG, "received: " + text);
                     //응답받은 것을 화면에 출력
                     result.setText(text);
                 }
             });
             ws.connectAsynchronously();
         } catch (Exception e) {
             e.printStackTrace();
         }

        bt_red = (Button) findViewById(R.id.button);
         bt_green = (Button) findViewById(R.id.button2);
         result = (TextView) findViewById(R.id.tv_result);

        bt_red.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
                 sendMessage(view, "red");
             }
         });

        bt_green.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
                 sendMessage(view, "green");
             }
         });
     }

    @Override
     protected void onDestroy() {
         super.onDestroy();

        if(ws != null){
             ws.disconnect();
             ws = null;
         }
     }

    public void sendMessage(View view, String message) {
         if(ws.isOpen()){
             ws.sendText(message);
         }
     }
}

Screenshot_20181106-225918
Blogger Widget