λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

ν”„λ‘œμ νŠΈ/Android

[Android] μ•ˆλ“œλ‘œμ΄λ“œμ™€ TCP/IP μ†ŒμΌ“ν†΅μ‹ μ„ μ΄μš©ν•œ 원격 μ „λ“± μ œμ–΄

728x90

2021.06.15.-2021.06.18.

​

μ „λ ₯은 μΌμƒμƒν™œκ³Ό 산업에 λ°˜λ“œμ‹œ ν•„μš”ν•œ μ—λ„ˆμ§€μ΄λ‹€. μ „κΈ°μ˜ μ†ŒλΉ„λŸ‰μ€

κΈ‰μ¦ν•˜κ³  μžˆμœΌλ‚˜ μ‚¬λžŒλ“€μ€ λΆˆν•„μš”ν•œ μ „κΈ°λ₯Ό λ‚­λΉ„ν•  λ•Œκ°€ μžˆλ‹€.

​

이λ₯Ό μ˜ˆλ°©ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄, 또 λ‹€μ‹œ λŒ€κ·œλͺ¨ μ •μ „μ‚¬νƒœ λ“±μœΌλ‘œ μ „κΈ°λ₯Ό μ‚¬μš©ν•  수 μ—†λŠ” 상황에 도달할 수 μžˆλ‹€.

​

μš°λ¦¬λŠ” 이와 같은 상황을 ν”Όν•˜κΈ° μœ„ν•΄ λΆˆν•„μš”ν•œ μ „κΈ° μ†ŒλΉ„λ₯Ό 쀄여

μ „κΈ°μš”κΈˆμ— λŒ€ν•œ 뢀담을 μ€„μ΄λŠ” 것과 νŽΈλ¦¬ν•¨μ„ μΆ”κ΅¬ν•˜λŠ” 연ꡬλ₯Ό ν•˜λ €κ³  ν•œλ‹€.

​

μ›κ²©μœΌλ‘œ μ œμ–΄κ°€ λ˜λŠ” μ•ˆλ“œλ‘œμ΄λ“œ 앱을 λ§Œλ“€μ–΄ μ‹€μ‹œκ°„μœΌλ‘œ λ¦΄λ ˆμ΄μ™€μ˜ μž‘λ™ μ—¬λΆ€λ₯Ό ν™•μΈν•˜κ³ ,

μ‚¬μš©μžκ°€ μ„€μ •ν•΄λ‘” μ‹œκ°μ— μ „λ“±μ˜ 뢈이 μΌœμ§€κ±°λ‚˜ 꺼질 수 μžˆλ„λ‘ ν•œλ‹€.

​

타이머 κΈ°λŠ₯을 μ œκ³΅ν•˜μ—¬ 10초 뒀에 전등이 On 되며 μ•ŒλžŒ μ†Œλ¦¬κ°€ ν•¨κ»˜ μ œκ³΅λ˜λŠ” 섀계λ₯Ό λͺ©ν‘œλ‘œ ν•œλ‹€.

​


 

섀계 μ‹œμŠ€ν…œ ꡬ성은 λ‹€μŒκ³Ό κ°™λ‹€.

​

μŠ€νƒ λ“œμ™€ μ•ˆλ“œλ‘œμ΄λ“œ μ•±

 

λ¦΄λ ˆμ΄μ™€ wifi λͺ¨λ“ˆ λ°°μ„ 

 

 

​

​

메인 GUI

 

 

μ‚¬μš©μž μ•ŒλžŒ μ„€μ •

 

 

​

​

μ•ˆλ“œλ‘œμ΄λ“œ μ•± μ•Œκ³ λ¦¬μ¦˜

 

 


​

아두이노 μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

더보기
#define NOTE_B0  31
#define NOTE_C1  33
#define NOTE_CS1 35
#define NOTE_D1  37
#define NOTE_DS1 39
#define NOTE_E1  41
#define NOTE_F1  44
#define NOTE_FS1 46
#define NOTE_G1  49
#define NOTE_GS1 52
#define NOTE_A1  55
#define NOTE_AS1 58
#define NOTE_B1  62
#define NOTE_C2  65
#define NOTE_CS2 69
#define NOTE_D2  73
#define NOTE_DS2 78
#define NOTE_E2  82
#define NOTE_F2  87
#define NOTE_FS2 93
#define NOTE_G2  98
#define NOTE_GS2 104
#define NOTE_A2  110
#define NOTE_AS2 117
#define NOTE_B2  123
#define NOTE_C3  131
#define NOTE_CS3 139
#define NOTE_D3  147
#define NOTE_DS3 156
#define NOTE_E3  165
#define NOTE_F3  175
#define NOTE_FS3 185
#define NOTE_G3  196
#define NOTE_GS3 208
#define NOTE_A3  220
#define NOTE_AS3 233
#define NOTE_B3  247
#define NOTE_C4  262
#define NOTE_CS4 277
#define NOTE_D4  294
#define NOTE_DS4 311
#define NOTE_E4  330
#define NOTE_F4  349
#define NOTE_FS4 370
#define NOTE_G4  392
#define NOTE_GS4 415
#define NOTE_A4  440
#define NOTE_AS4 466
#define NOTE_B4  494
#define NOTE_C5  523
#define NOTE_CS5 554
#define NOTE_D5  587
#define NOTE_DS5 622
#define NOTE_E5  659
#define NOTE_F5  698
#define NOTE_FS5 740
#define NOTE_G5  784
#define NOTE_GS5 831
#define NOTE_A5  880
#define NOTE_AS5 932
#define NOTE_B5  988
#define NOTE_C6  1047
#define NOTE_CS6 1109
#define NOTE_D6  1175
#define NOTE_DS6 1245
#define NOTE_E6  1319
#define NOTE_F6  1397
#define NOTE_FS6 1480
#define NOTE_G6  1568
#define NOTE_GS6 1661
#define NOTE_A6  1760
#define NOTE_AS6 1865
#define NOTE_B6  1976
#define NOTE_C7  2093
#define NOTE_CS7 2217
#define NOTE_D7  2349
#define NOTE_DS7 2489
#define NOTE_E7  2637
#define NOTE_F7  2794
#define NOTE_FS7 2960
#define NOTE_G7  3136
#define NOTE_GS7 3322
#define NOTE_A7  3520
#define NOTE_AS7 3729
#define NOTE_B7  3951
#define NOTE_C8  4186
#define NOTE_CS8 4435
#define NOTE_D8  4699
#define NOTE_DS8 4978


#include <ESP8266.h>
#include <SPI.h>
#include "ESP8266.h"
#include <SoftwareSerial.h>
int ledPin2 = 4;
int ledPin3 = 5;
int ledPin4 = 6;
int ledPin5 = 7;
#define SSID        "shj"  

#define PASSWORD    "11111111"
  unsigned long cnt;
  boolean t=false;


SoftwareSerial mySerial(11,10); /* RX:D11, TX:D10 */
ESP8266 wifi(mySerial);


void printUsage(uint8_t mux_id)
{
    char buf[]="μ‚¬μš©κ°€λŠ₯ν•œ λͺ…λ Ήμ–΄\n1 : LED 켜기\n2 : LED 끄기\nS : LED μƒνƒœμ •λ³΄\n\n";
    wifi.send(mux_id, buf, strlen(buf));
}

int melody[] = {
  NOTE_AS4, NOTE_AS4, NOTE_AS4, NOTE_AS4,
  NOTE_AS4, NOTE_AS4, NOTE_AS4, NOTE_AS4,
  NOTE_AS4, NOTE_AS4, NOTE_AS4, NOTE_AS4,
  NOTE_AS4, NOTE_AS4, NOTE_AS4, NOTE_AS4,
  NOTE_AS4, NOTE_AS4, NOTE_AS4, NOTE_AS4,
  NOTE_D5, NOTE_D5, NOTE_D5, NOTE_D5,
  NOTE_C5, NOTE_C5, NOTE_C5, NOTE_C5, 
  NOTE_F5, NOTE_F5, NOTE_F5, NOTE_F5, 
  NOTE_G5, NOTE_G5, NOTE_G5, NOTE_G5,
  NOTE_G5, NOTE_G5, NOTE_G5, NOTE_G5, 
  NOTE_G5, NOTE_G5, NOTE_G5, NOTE_G5, 
  NOTE_C5, NOTE_AS4, NOTE_A4, NOTE_F4,
  NOTE_G4, 0, NOTE_G4, NOTE_D5,
  NOTE_C5, 0, NOTE_AS4, 0,
  NOTE_A4, 0, NOTE_A4, NOTE_A4,
  NOTE_C5, 0, NOTE_AS4, NOTE_A4, 
  NOTE_G4,0, NOTE_G4, NOTE_AS5,
  NOTE_A5, NOTE_AS5, NOTE_A5, NOTE_AS5,
  NOTE_G4,0, NOTE_G4, NOTE_AS5,
  NOTE_A5, NOTE_AS5, NOTE_A5, NOTE_AS5,
  NOTE_G4, 0, NOTE_G4, NOTE_D5,
  NOTE_C5, 0, NOTE_AS4, 0,
  NOTE_A4, 0, NOTE_A4, NOTE_A4,
  NOTE_C5, 0, NOTE_AS4, NOTE_A4, 
  NOTE_G4,0, NOTE_G4, NOTE_AS5,
  NOTE_A5, NOTE_AS5, NOTE_A5, NOTE_AS5,
  NOTE_G4,0, NOTE_G4, NOTE_AS5,
  NOTE_A5, NOTE_AS5, NOTE_A5, NOTE_AS5
 };

int noteDurations[] = {
  8,8,8,8,
8,8,8,8,
8,8,8,8,
8,8,8,8,
8,8,8,8,
8,8,8,8,
8,8,8,8,
8,8,8,8,
8,8,8,8,
8,8,8,8,
8,8,8,8,
8,8,8,8,
8,8,8,8,
8,8,8,8,
8,8,8,8,
8,8,8,8,
8,8,8,8,
8,8,8,8,
8,8,8,8,
8,8,8,8,
8,8,8,8,
8,8,8,8,
8,8,8,8,
8,8,8,8,
8,8,8,8,
8,8,8,8,
8,8,8,8,
8,8,8,8,
  }; 
void setup(void)
{
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
pinMode(ledPin4, OUTPUT);
pinMode(ledPin5, OUTPUT);
digitalWrite( ledPin2, HIGH) ;
digitalWrite( ledPin3, LOW );
digitalWrite( ledPin4, LOW );
    mySerial.begin(9600);
    Serial.begin(9600);
    Serial.print("setup begin\r\n");
    
    Serial.print("FW Version:");
    Serial.println(wifi.getVersion().c_str());
      
    if (wifi.setOprToStationSoftAP()) {
        Serial.print("to station + softap ok\r\n");
    } else {
        Serial.print("to station + softap err\r\n");
    }
 
    if (wifi.joinAP(SSID, PASSWORD)) {
        Serial.print("Join AP success\r\n");
        Serial.print("IP: ");
        Serial.println(wifi.getLocalIP().c_str());    
    } else {
        Serial.print("Join AP failure\r\n");
    }
    
    if (wifi.enableMUX()) {
        Serial.print("multiple ok\r\n");
    } else {
        Serial.print("multiple err\r\n");
    }
    
    if (wifi.startTCPServer(9000)) {
        Serial.print("start tcp server ok\r\n");
    } else {
        Serial.print("start tcp server err\r\n");
    }
    
    if (wifi.setTCPServerTimeout(1000)) { 
        Serial.print("set tcp server timout 360 seconds\r\n");
    } else {
        Serial.print("set tcp server timout err\r\n");
    }
    
    Serial.print("setup end\r\n");

     pinMode(LED_BUILTIN, OUTPUT);
}

void loop(void)
{
    uint8_t buffer[128] = {0};
    uint8_t mux_id;
    uint32_t len = wifi.recv(&mux_id, buffer, sizeof(buffer), 100);
    
if(t==true){
        if((millis()>cnt+10*1000)){
        digitalWrite( ledPin2, LOW );
        for (int thisNote = 0; thisNote < 112; thisNote++) {
          
          uint32_t len = wifi.recv(&mux_id, buffer, sizeof(buffer), 100);
          if(len>0)break;
          
          int noteDuration = 750 / noteDurations[thisNote];
          tone(ledPin5 , melody[thisNote], noteDuration);
      
          int pauseBetweenNotes = noteDuration * 1.30;
          delay(pauseBetweenNotes);
          
          noTone(ledPin5 );
        }
        
        t=false;
        digitalWrite( ledPin2, HIGH );
        }
      }

    if (len > 0) {
        Serial.print("Status:[");
        Serial.print(wifi.getIPStatus().c_str());
        Serial.println("]");
        
        Serial.print("Received from :");
        Serial.print(mux_id);
        Serial.print("[");


        Serial.print("Received:[");
        for(uint32_t i = 0; i < len; i++) {
            Serial.print((char)buffer[i]);
        }
        Serial.print("]\r\n");


        char command = buffer[0];
        int ledStatus = digitalRead(LED_BUILTIN);
        

        switch (command){
        
            case '1':
              
              digitalWrite( ledPin2, LOW) ;
              break;
        
            case '2':
            
             digitalWrite( ledPin2, HIGH );
              break;
        
            case '3':
              digitalWrite( ledPin3, LOW );

             break;
            case '4':
                      
              digitalWrite( ledPin3, HIGH );
              break;

            case '5':
              digitalWrite( ledPin4, HIGH );      
              
              break;

            case '6':
               digitalWrite( ledPin4, LOW );      
              
              break;

            case 'g':
               cnt=millis();
              t=true;
              }
                  
        }      
    }

 

 

 

 

 

μ•ˆλ“œλ‘œμ΄λ“œ μŠ€νŠœλ””μ˜€μ˜ MainActivity.java

더보기
package com.example.myapplication;


import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.Switch;
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;


public class MainActivity extends AppCompatActivity {

    public static Context context_main;
    private TextView mConnectionStatus;
    private ArrayAdapter<String> mConversationArrayAdapter;
    private Button light_button1, light_button2, color_button1,color_button2;
    private static final String TAG = "TcpClient";
    private boolean isConnected = false;
    public Switch light_switch, time_switch;

    private String mServerIP = null;
    private Socket mSocket = null;
    private PrintWriter mOut;
    private BufferedReader mIn;
    private Thread mReceiverThread = null;

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

        mConnectionStatus = (TextView)findViewById(R.id.connection_status_textview);
        light_button1 = (Button)findViewById(R.id.button3);
        light_button2 = (Button)findViewById(R.id.button4);
        color_button1 = (Button)findViewById(R.id.button6);
        color_button2 = (Button)findViewById(R.id.button7);
        light_switch = (Switch)findViewById(R.id.switch1);
        time_switch = (Switch)findViewById(R.id.switch4);

        light_switch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {

                    String sendMessage = "1";
                    if (!isConnected) showErrorDialog("μ„œλ²„λ‘œ μ ‘μ†λœν›„ λ‹€μ‹œ ν•΄λ³΄μ„Έμš”.");
                    else {
                        new Thread(new SenderThread(sendMessage)).start();
                    }

                    light_button1.setOnClickListener(new View.OnClickListener(){
                        public void onClick(View v){
                            String sendMessage = "3";
                            if (!isConnected) showErrorDialog("μ„œλ²„λ‘œ μ ‘μ†λœν›„ λ‹€μ‹œ ν•΄λ³΄μ„Έμš”.");
                            else {
                                new Thread(new SenderThread(sendMessage)).start();
                            }
                        }
                    });

                    light_button2.setOnClickListener(new View.OnClickListener(){
                        public void onClick(View v){
                            String sendMessage = "4";
                            if (!isConnected) showErrorDialog("μ„œλ²„λ‘œ μ ‘μ†λœν›„ λ‹€μ‹œ ν•΄λ³΄μ„Έμš”.");
                            else {
                                new Thread(new SenderThread(sendMessage)).start();
                            }
                        }
                    });

                    color_button1.setOnClickListener(new View.OnClickListener(){
                        public void onClick(View v){
                            String sendMessage = "5";
                            if (!isConnected) showErrorDialog("μ„œλ²„λ‘œ μ ‘μ†λœν›„ λ‹€μ‹œ ν•΄λ³΄μ„Έμš”.");
                            else {
                                new Thread(new SenderThread(sendMessage)).start();
                            }
                        }
                    });

                    color_button2.setOnClickListener(new View.OnClickListener(){
                        public void onClick(View v){
                            String sendMessage = "6";
                            if (!isConnected) showErrorDialog("μ„œλ²„λ‘œ μ ‘μ†λœν›„ λ‹€μ‹œ ν•΄λ³΄μ„Έμš”.");
                            else {
                                new Thread(new SenderThread(sendMessage)).start();
                            }
                        }
                    });
                } else {
                    String sendMessage = "2";
                    if (!isConnected) showErrorDialog("μ„œλ²„λ‘œ μ ‘μ†λœν›„ λ‹€μ‹œ ν•΄λ³΄μ„Έμš”.");
                    else {
                        new Thread(new SenderThread(sendMessage)).start();
                    }
                }
            }
        });
time_switch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {
                    String sendMessage = "g";
                    if (!isConnected) showErrorDialog("μ„œλ²„λ‘œ μ ‘μ†λœν›„ λ‹€μ‹œ ν•΄λ³΄μ„Έμš”.");
                    else {
                        new Thread(new SenderThread(sendMessage)).start();
                    }
                } else {
                    String sendMessage = "e";
                    if (!isConnected) showErrorDialog("μ„œλ²„λ‘œ μ ‘μ†λœν›„ λ‹€μ‹œ ν•΄λ³΄μ„Έμš”.");
                    else {
                        new Thread(new SenderThread(sendMessage)).start();
                    }
                }
            }
        });

        mConversationArrayAdapter = new ArrayAdapter<>( this,
                android.R.layout.simple_list_item_1 );
        new Thread(new ConnectThread("192.168.78.148", 9000)).start();
        context_main=this;
    }

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

        isConnected = false;
    }


    private static long back_pressed;
    @Override
    public void onBackPressed(){

        if (back_pressed + 2000 > System.currentTimeMillis()){
            super.onBackPressed();

            Log.d(TAG, "onBackPressed:");
            isConnected = false;

            finish();
        }
        else{
            Toast.makeText(getBaseContext(), "ν•œλ²ˆ 더 λ’€λ‘œκ°€κΈ°λ₯Ό λˆ„λ₯΄λ©΄ μ’…λ£Œλ©λ‹ˆλ‹€.", Toast.LENGTH_SHORT).show();
            back_pressed = System.currentTimeMillis();
        }

    }

    private class ConnectThread implements Runnable {

        private String serverIP;
        private int serverPort;

        ConnectThread(String ip, int port) {
            serverIP = ip;
            serverPort = port;

            mConnectionStatus.setText("connecting to " + serverIP + ".......");
        }

        @Override
        public void run() {

            try {

                mSocket = new Socket(serverIP, serverPort);
              

                mServerIP = mSocket.getRemoteSocketAddress().toString();

            } catch( UnknownHostException e )
            {
                Log.d(TAG,  "ConnectThread: can't find host");
            }
            catch( SocketTimeoutException e )
            {
                Log.d(TAG, "ConnectThread: timeout");
            }
            catch (Exception e) {

                Log.e(TAG, ("ConnectThread:" + e.getMessage()));
            }


            if (mSocket != null) {

                try {

                    mOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(mSocket.getOutputStream(), "UTF-8")), true);
                    mIn = new BufferedReader(new InputStreamReader(mSocket.getInputStream(), "UTF-8"));

                    isConnected = true;
                } catch (IOException e) {

                    Log.e(TAG, ("ConnectThread:" + e.getMessage()));
                }
            }


            runOnUiThread(new Runnable() {

                @Override
                public void run() {

                    if (isConnected) {

                        Log.d(TAG, "connected to " + serverIP);
                        mConnectionStatus.setText("connected to " + serverIP);

                    }else{

                        Log.d(TAG, "failed to connect to server " + serverIP);
                        mConnectionStatus.setText("failed to connect to server "  + serverIP);
                    }

                }
            });
        }
    }
    private class TimeThread implements Runnable {

        private String time;

        TimeThread(String time) {
            this.time = time;
        }

        @Override
        public void run() {

            mOut.println(this.time);
            mOut.flush();

            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Log.d(TAG, "send message: " + time);
                    mConversationArrayAdapter.insert(time, 0);
                }
            });
        }
    }
    private class SenderThread implements Runnable {
        private String msg;
        SenderThread(String msg) {
            this.msg = msg;
        }
        @Override
        public void run() {

            mOut.println(this.msg);
            mOut.flush();

            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Log.d(TAG, "send message: " + msg);
                    mConversationArrayAdapter.insert(msg, 0);
                }
            });
        }
    }
    
public void showErrorDialog(String message)
    {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("Error");
        builder.setCancelable(false);
        builder.setMessage(message);
        builder.setPositiveButton("OK",  new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
                finish();
            }
        });
        builder.create().show();
    }
    public void button8(View v)
    {
        Intent intent=new Intent(getApplicationContext(), AlarmActivity.class);
        startActivity(intent); //μ•Œλ¦Ό μ„€μ •ν•  수 μžˆλŠ” μƒˆ μ°½ μ—¬λŠ”κ±°..
    }

}

 

 

 

RingtonePlayingService.java 둜 μ•ŒλžŒ μŒμ•…μ„ μž¬μƒν•œλ‹€.

더보기
package com.example.myapplication;

import android.annotation.TargetApi;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Build;
import android.os.IBinder;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.NotificationCompat;
import android.util.Log;
import android.widget.Switch;


public class RingtonePlayingService extends Service{

    MediaPlayer mediaPlayer;
    int startId;
    boolean isRunning;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();

        if (Build.VERSION.SDK_INT >= 26) {
            String CHANNEL_ID = "default";
            NotificationChannel channel = new NotificationChannel(CHANNEL_ID,
                    "Channel human readable title",
                    NotificationManager.IMPORTANCE_DEFAULT);

            ((NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE)).createNotificationChannel(channel);

            Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
                    .setContentTitle("μ•ŒλžŒμ‹œμž‘")
                    .setContentText("μ•ŒλžŒμŒμ΄ μž¬μƒλ©λ‹ˆλ‹€.")
                    .setSmallIcon(R.mipmap.ic_launcher)

                    .build();
            ((MainActivity)MainActivity.context_main).light_switch.setChecked(true);
            startForeground(1, notification);
        }
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        String getState = intent.getExtras().getString("state");

        assert getState != null;
        switch (getState) {
            case "alarm on":
                startId = 1;
                break;
            case "alarm off":
                startId = 0;
                break;
            default:
                startId = 0;
                break;
        }

        // μ•ŒλžŒμŒ μž¬μƒ X , μ•ŒλžŒμŒ μ‹œμž‘ 클릭
        if(!this.isRunning && startId == 1) {

            mediaPlayer = MediaPlayer.create(this,R.raw.ouu);
            mediaPlayer.start();

            this.isRunning = true;
            this.startId = 0;
        }

        // μ•ŒλžŒμŒ μž¬μƒ O , μ•ŒλžŒμŒ μ’…λ£Œ λ²„νŠΌ 클릭
        else if(this.isRunning && startId == 0) {

            mediaPlayer.stop();
            mediaPlayer.reset();
            mediaPlayer.release();

            this.isRunning = false;
            this.startId = 0;
        }
        // μ•ŒλžŒμŒ μž¬μƒ X , μ•ŒλžŒμŒ μ’…λ£Œ λ²„νŠΌ 클릭
        else if(!this.isRunning && startId == 0) {
            this.isRunning = false;
            this.startId = 0;
        }

        // μ•ŒλžŒμŒ μž¬μƒ O , μ•ŒλžŒμŒ μ‹œμž‘ λ²„νŠΌ 클릭
        else if(this.isRunning && startId == 1){

            this.isRunning = true;
            this.startId = 1;
        }
        else {
        }
        return START_NOT_STICKY;
    }
    @Override
    public void onDestroy() {
        super.onDestroy();

        Log.d("onDestory() μ‹€ν–‰", "μ„œλΉ„μŠ€ 파괴");

    }
}

 

 

 

Alarm_Reciver.java λ₯Ό ν†΅ν•˜μ—¬ μ €μž₯된 μ•ŒλžŒ μ‹œκ°„μ„ λ°›λŠ”λ‹€.

더보기
package com.example.myapplication;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.util.Log;

public class Alarm_Reciver extends BroadcastReceiver{

    Context context;

    @Override
    public void onReceive(Context context, Intent intent) {

        this.context = context;
        // intentλ‘œλΆ€ν„° 전달받은 string
        String get_yout_string = intent.getExtras().getString("state");

        // RingtonePlayingService μ„œλΉ„μŠ€ intent 생성
        Intent service_intent = new Intent(context, RingtonePlayingService.class);

        // RingtonePlayinService둜 extra stringκ°’ 보내기
        service_intent.putExtra("state", get_yout_string);
        // start the ringtone service

        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O){
            this.context.startForegroundService(service_intent);
        }else{
            this.context.startService(service_intent);
        }
    }
}
 

 

 

 

AlarmActivity.java 둜 μ‚¬μš©μž μ•ŒλžŒ 섀정을 ν•œλ‹€.

더보기
package com.example.myapplication;

        import android.app.AlarmManager;
        import android.app.NotificationManager;
        import android.app.PendingIntent;
        import android.content.Context;
        import android.content.Intent;
        import android.os.Build;
        import androidx.annotation.RequiresApi;

    import androidx.appcompat.app.AppCompatActivity;
        import android.os.Bundle;
        import android.util.Log;
        import android.view.View;
        import android.widget.Button;
        import android.widget.Switch;
        import android.widget.TimePicker;
        import android.widget.Toast;

        import java.sql.Time;
        import java.util.Calendar;
        import java.util.GregorianCalendar;


public class AlarmActivity extends AppCompatActivity{

    AlarmManager alarm_manager;
    TimePicker alarm_timepicker;
    Context context;
    PendingIntent pendingIntent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_alarm);

        this.context = this;

        // μ•ŒλžŒλ§€λ‹ˆμ € μ„€μ •
        alarm_manager = (AlarmManager) getSystemService(ALARM_SERVICE);

        // νƒ€μž„ν”Όμ»€ μ„€μ •
        alarm_timepicker = findViewById(R.id.time_picker);

        // Calendar 객체 생성
        final Calendar calendar = Calendar.getInstance();

        // μ•ŒλžŒλ¦¬μ‹œλ²„ intent 생성
        final Intent my_intent = new Intent(this.context, Alarm_Reciver.class);

        // μ•ŒλžŒ μ‹œμž‘ λ²„νŠΌ
        Button alarm_on = findViewById(R.id.btn_start);
        alarm_on.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                // calendar에 μ‹œκ°„ μ…‹νŒ…
                calendar.set(Calendar.HOUR_OF_DAY, alarm_timepicker.getHour());
                calendar.set(Calendar.MINUTE, alarm_timepicker.getMinute());

                // μ‹œκ°„ κ°€μ Έμ˜΄
                int hour = alarm_timepicker.getHour();
                int minute = alarm_timepicker.getMinute();
                Toast.makeText(AlarmActivity.this,"Alarm μ˜ˆμ • " + hour + "μ‹œ " + minute + "λΆ„",Toast.LENGTH_SHORT).show();

                // reveiver에 string κ°’ λ„˜κ²¨μ£ΌκΈ°
                my_intent.putExtra("state","alarm on");

                pendingIntent = PendingIntent.getBroadcast(AlarmActivity.this, 0, my_intent,
                        PendingIntent.FLAG_UPDATE_CURRENT);

                // μ•ŒλžŒμ…‹νŒ…
                alarm_manager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                        pendingIntent);


            }
        });

        // μ•ŒλžŒ μ •μ§€ λ²„νŠΌ
        Button alarm_off = findViewById(R.id.btn_finish);
        alarm_off.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(AlarmActivity.this,"Alarm μ’…λ£Œ",Toast.LENGTH_SHORT).show();
                // μ•ŒλžŒλ§€λ‹ˆμ € μ·¨μ†Œ
                alarm_manager.cancel(pendingIntent);

                my_intent.putExtra("state","alarm off");

                // μ•ŒλžŒμ·¨μ†Œ
                sendBroadcast(my_intent);
            }
        });
    }
}
 
 
 
 

​

 
색상 1 ν΄λ¦­μ‹œ / 색상 2 ν΄λ¦­μ‹œ

 

 
밝기 1 (μ™„μ „ 밝은 μ „λ“±) λ²„νŠΌ ν΄λ¦­μ‹œ / 밝기 2 (쑰금 μ–΄λ‘μš΄ μ „λ“±) λ²„νŠΌ ν΄λ¦­μ‹œ

 

 

 
타이머(10초) 이후 μ „λ“± 켜짐 / μ‚¬μš©μž μ•ŒλžŒ μ„€μ • μž‘λ™ 사진

 

​

​


[1] ν•œκ΅­μ „λ ₯곡사, γ€Œν•œκ΅­μ „λ ₯톡계」, μ—λ„ˆμ§€κ²½μ œμ—°κ΅¬μ›, γ€Œμ—λ„ˆμ§€μˆ˜κΈ‰ν†΅κ³„γ€

* 자료 : μ—λ„ˆμ§€κ²½μ œμ—°κ΅¬μ›, γ€Œ2020 μ—λ„ˆμ§€ν†΅κ³„μ—°λ³΄γ€ 2021

 

[2]Lee, Y.-A., Kim, K.-C. and Han, S.-B. (2010) “원격 μ „λ ₯μ œμ–΄ 및 λŒ€κΈ°μ „λ ₯ 관리 κΈ°λŠ₯을 κ°–λŠ” μƒˆλ‘œμš΄ 슀마트 μŠ€μœ„μΉ˜ 섀계,” ν•œκ΅­μ •λ³΄ν†΅μ‹ ν•™νšŒλ…Όλ¬Έμ§€. ν•œκ΅­μ •λ³΄ν†΅μ‹ ν•™νšŒ, 14(10), pp. 2343–2350. doi: 10.6109/JKIICE.2010.14.10.2343.

 

[3] Tam LeMinh, “λ² νŠΈλ‚¨ 슀마트 μŠ€μœ„μΉ˜, μ–Όλ§ˆλ‚˜ μŠ€λ§ˆνŠΈν•΄μ‘Œμ„κΉŒ?”, https://news.kotra.or.kr/user/globalBbs/kotranews/782/globalBbsDataView.do?setIdx=243&dataIdx=186959

 

[4] korta, “슀마트 κ°€μ „μœΌλ‘œ κΎΈλ―ΈλŠ” 슀마트 ν™ˆ, λ―Έκ΅­μ‹œμž₯ μ§„μΆœ μ „λž΅”, 2019-12, KOTRA 19-074

 

[5] 김희성, “νŒŒμ›Œλ³΄μ΄μŠ€, μŒμ„±μΈμ‹κ³Ό IoT 기술 μœ΅ν•©λœ μ‚¬μΌλ‘œ μŒμ„±μΈμ‹ 슀마트 μŠ€μœ„μΉ˜ μΆœμ‹œ”, 2016-04-05

 

[6] John, μ „μžλΆ€ν’ˆ ‘릴레이(Relay)'에 λŒ€ν•΄ μ•Œμ•„λ³΄κΈ°, http://Mechasolution.com

 

[7] 릴레이의 μ’…λ₯˜μ™€ μ‚¬μš©λ°©λ²•, https://makernambo.com/47, 2019-01-21.

'ν”„λ‘œμ νŠΈ > Android' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[Android] GPSλ₯Ό μ΄μš©ν•œ μ—¬ν–‰ μ•±  (0) 2023.01.02
[Android] μš΄λ™ 관리 μ•±  (0) 2023.01.02