라즈베리파이(Raspberry pi)

라즈베리파이 HomeAssistant Websocket python 코드 -> java 코드로

알통몬_ 2018. 3. 5. 14:54
반응형


공감 및 댓글은 포스팅 하는데

 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 

도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 

만들어 나가겠습니다^^

 


이번 포스팅에서는 관심이 있으신 분들만 보실 것 같아서 여러 설명은 생략하고

간단히 하려고 합니다.


먼저 사용환경입니다.

HardWare : Raspberry Pi 3 Model B + Wi - Fi / 샤오미 게이트웨어 + 온습도 센서 2개

OS : Hassbian ( raspbian + Home-assistant )


목적 : home assistant 페이지가 아닌 별도로 샤오미 온습도 센서의 데이터를 받아서 웹 페이지를 구성하고 싶다.


Home assistant 가이드에는 javaScript 나 Python WebSocket을 이용한 데이터 수신 예제는 있지만 자바를 사용한 예제는 없습니다.


그래서 자바 웹 소켓 라이브러리를 사용해서 만들어보았습니다.


먼저 Python 예제 코드입니다.

import asyncio
import asyncws
import json



@asyncio.coroutine
def echo():
websocket = yield from asyncws.connect('ws://본인 라즈베리파이 ip 주소:8123/api/websocket')

yield from websocket.send(json.dumps(
{'id': '1', 'type': 'subscribe_events', 'event_type': 'state_changed'}))

while True:
message = yield from websocket.recv()
if message is None:
break
print(message)

asyncio.get_event_loop().run_until_complete(echo())

사용하는데 불편한 점은 asyncio는 기존에 있지만, 

asyncws 는 따로 설치를 해주어야 한다는 점입니다.

그리고 Django를 몰라서 WAS와 연동하려면 또 공부를 해야하는 단점이 있었습니다.


자바 예제 )

웹 소켓 라이브러리 출처 : https://github.com/TooTallNate/Java-WebSocket

메이븐에 라이브러리 추가해줬습니다.

예제 코드 )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package websocket;
 
import java.net.URI;
import java.util.HashMap;
import java.util.Map;
 
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
 
public class MyWebsocketClient {
 
    public static final String URL = "ws://본인 라즈베리파이 ip 주소:8123/api/websocket";
 
    public static final int TIMEOUT = 0;
    public static WebSocketClient wsc;
    public static URI uri;
    public static Map<StringString> data = new HashMap<>();
 
    public static void main(String[] args) {
        method();
    }
 
    public static void method() {
        try {
            uri = new URI(URL);
            wsc = new WebSocketClient(uri) {
 
                @Override
                public void onClose(int arg0, String arg1, boolean arg2) {
                    System.out.println("1:" + arg0);
                    System.out.println("2:" + arg1);
                    System.out.println("3:" + arg2);
                }
 
                @Override
                public void onError(Exception arg0) {
                    System.out.println("error: " + arg0.getMessage());
                }
 
                @Override
                public void onMessage(String arg0) {
 
                    System.out.println("receive: " + arg0);
 
                }
 
                @Override
                public void onOpen(ServerHandshake shs) {
                    System.out.println("open: " + shs.getHttpStatus());
                    System.out.println(wsc.getReadyState());
                    wsc.send("{\"id\": \"1\", \"type\": \"subscribe_events\", \"event_type\": \"state_changed\"}");
 
                }
 
            };
            wsc.connect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
}
 
cs


WebSocketClient 생성자 중 Map<String, String>  파라미터가 있는 생성자가 있어서

낚여서 계속 Map을 가지고 테스트하는데 시간을 많이 써버렸습니다.

저처럼 실수하지마시고, 바로 send() 함수에 위처럼 JSON 형식의 문자열을 보내면 됩니다.

그럼 위처럼 센서에 대한 데이터를 받을 수 있습니다 ㅎㅎ


감사합니다.


반응형