라즈베리파이 subscribe / 안드로이드 publish

박현민·2022년 3월 11일
0

라즈베리파이

목록 보기
4/4

먼저 라즈베리파이에 led토픽을 subscribe하는 코드를 작성해야한다.

import paho.mqtt.client as mqtt
from py_irsend import irsend

def on_message(client, userdata, message):
    msg = str(message.payload.decode("utf-8"))
    print(msg)

    if msg=="OFF":
        irsend.send_once('led',['OFF'])
    elif msg == "ON":
        irsend.send_once('led',['ON'])
        irsend.send_once('led',['%'])
        for a in range(10):
            irsend.send_once('led',['UP'])
    elif msg == "SLEEP":
        irsend.send_once('led',['SLEEP'])
    elif msg == "UP":
        irsend.send_once('led',['UP'])
    elif msg == "DOWN":
        irsend.send_once('led',['DOWN'])
    elif msg == "%":
        irsend.send_once('led',['%'])
    elif msg == "1M":
        irsend.send_once('led',['1M'])
    elif msg == "10M":
        irsend.send_once('led',['10M'])
    elif msg == "20M":
        irsend.send_once('led',['20M'])
    elif msg == "30M":
        irsend.send_once('led',['30M'])

        
    
broker_address = "localhost"
client1 = mqtt.Client() 
client1.connect(broker_address) 
client1.subscribe("led") 
client1.on_message = on_message
client1.loop_forever()

브로커 주소는 라즈베리파이 즉 localhost이다.
클라이언트 이름은 굳이 줄 필요없고 connect로 broker와 연결한다.
led토픽을 지정하고 메세지가 들어왔을때 실행할 함수 등록과 반복을 지정하면 끝이다
함수는 메세지 값에 따라 다른 버튼이 눌리는 효과를 주었다.

ON에는 최고밝기를 하기 위해 반복문을 돌렸다


다음은 안드로이드이다.
먼저 의존성 추가

implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5'
implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'

그 다음으로는 권한추가 + 서비스 등록

<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

...

<service android:name="org.eclipse.paho.android.service.MqttService" />

마지막으로 자바 코드이다.

package com.example.ledmqtt;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;

import org.eclipse.paho.android.service.MqttAndroidClient;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        try {
            MqttClient client = new MqttClient("tcp://192.168.0.75:1883", MqttClient.generateClientId(),null);
            client.connect();
            client.publish("led", new MqttMessage("ON".getBytes()));
        } catch (MqttException e) {
            e.printStackTrace();
        }
        finish();
    }
}

Mqtt를 연결해주고 led토픽에 ON값을 발행한다.
그 이후 어플이 꺼져야하기때문에 finish()를 넣었다.

0개의 댓글