Raspberry PI FFMpeg 설치 방법.



 

1. 빌드 패키지 설치.

 

sudo apt install git build-essential

 

2. h.264 코덱 설치

 

git clone git://git.videolan.org/x264 

cd x264 

./configure --host=arm-unknown-linux-gnueabi --enable-static --disable-opencl 

make

sudo make install

 

3. mp3lame 코덱 설치 (이 코덱을 설치 하는 이유는 ffmpeg 을 이용해서 영상을 mp3 로 인코딩 하고자 할때 사용하기 위함이다.)

 

sudo apt-get install libmp3lame-dev

 

4. FFMpeg 설치

 

git clone https://github.com/FFmpeg/FFmpeg.git

cd FFmpeg 

./configure --arch=armel --target-os=linux --enable-gpl --enable-libx264 --enable-nonfree --enable-libmp3lame 

make

sudo make install

 

 

 

 

 

참고 : https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu

 

 

  1. 2017.08.21 22:02

    비밀댓글입니다

  2. 그래서요? 2017.08.21 22:03

    설치 이유를 맨 위에 적어주심이 어떨까 합니다만?

라즈베리파이(송신) ---> 아두이노 프로 미니로(수신) RF 통신을 이용하여 LED 를 켜보자


1. 준비물


  - 라즈베리파이( 2 또는 3) 1개


  - 아두이노 프로 미니 1개

  - Usb to TTL(아두이노 프로 미니에 프로그램 업로드 하기 위해 사용) 1개

    https://goo.gl/TJTMGo  (Usb To TTL + 아두이노 프로 미니 묶음 판매)


  - RF 433 Emmiter 1개

  - RF 433 Receiver 1개

    https://goo.gl/4KMIdi    (5쌍 묶음 판매)


  - LED 1개




2. 회로 구성 하기.


  2.1 라즈베리파이 회로 구성








RF 송신모듈에 각각 위와 같이 연결합니다.


 Raspberry pi

 RF Emitter

5V

Vcc 

GPIO 21

Data 

GND

GND 




  2.2 아두이노 프로 미니 회로 구성하기







Arduino Pro Mini

 RF Receiver

Vcc

Vcc 

PIN 2

Data 

GND

GND 


3. 라즈베리 파이 RC-Switch 라이브러리 준비

 

cd /home/pi

git clone https://github.com/acidpop/433Utils

cd 433Utils

cd rc-switch

make



4. Source Coding

  4.1. 라즈베리파이

 

다음 경로로 이동

cd /home/pi/433Utils/RPi_utils 

 

codesend.cpp 파일을 열어

 

int PIN =0;

위 코드를

int PIN = 21;

로 변경

 

또는 아래와 같이 소스 작성 후 컴파일



rftest.cpp 


/* Code Send */

#include "RCSwitch.h"

#include 
#include 
 
int main(int argc, char *argv[]) {
 
    // This pin is not the first pin on the RPi GPIO header!
    // Consult https://projects.drogon.net/raspberry-pi/wiringpi/pins/
    // for more information.
    int PIN = 21;
 
    // Parse the firt parameter to this command as an integer
    int code = atoi(argv[1]);
 
    if (wiringPiSetup () == -1) return 1;
    printf("sending code[%i]\n", code);
    RCSwitch mySwitch = RCSwitch();
    mySwitch.enableTransmit(PIN);
 
    mySwitch.send(code, 24);
 
    return 0;
 
}


 

위 코드를 컴파일 시에는 다음과 같이 진행한다.

 

g++ rftest.cpp -DRPI ../rc-switch/RCSwitch.cpp rftest.cpp -lwiringPi

 


  4.2 아두이노 프로 미니

 

        RCSwitch 라이브러리를 포함시켜야 한다. 


#include "RCSwitch.h"
#include 
#include 
RCSwitch mySwitch = RCSwitch();
 
void setup() {
  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);
  mySwitch.enableReceive(0);  // Receiver on inerrupt 0 => that is pin #2
}
 
void loop() {
  if (mySwitch.available()) {
 
    int value = mySwitch.getReceivedValue();
 
    if (value == 0) {
      Serial.print("Unknown encoding");
    } else {
 
     Serial.print("Received ");
      Serial.print( mySwitch.getReceivedValue() );
      Serial.print(" / ");
      Serial.print( mySwitch.getReceivedBitlength() );
      Serial.print("bit ");
      Serial.print("Protocol: ");
      Serial.println( mySwitch.getReceivedProtocol() );

      switch(value):{
        case 1001:{
           digitalWrite(LED_BUILTIN, HIGH);
        }break;
        case 1002:{
           digitalWrite(LED_BUILTIN, LOW);
        }break;
      }
    }
 
    mySwitch.resetAvailable();
 
  }
}


 

 

 

 

아두이노에 프로그램을 컴파일 -> 업로드 하고

 

툴 -> 시리얼 모니터를 선택하여 시리얼 모니터 창이 보이도록 한다.

 

 

라즈베리파이에서 컴파일 해둔 rftest 를 시험해보자.

 

sudo rftest 12345

 

 

RF 송신기로 12345 라는 값을 보내면

 

아두이노의 시리얼 모니터로 12345 라는 값을 받았다는 메시지가 보이면 성공이다.

 

RF 송신기로 1001 을 보내면 아두이노에 연결된 LED 가 켜지고

 

1002 를 보내면 연결된 LED 가 꺼진다.

 

 

 

위 예제를 이용하면 라즈베리 파이 1대와

 

아주 값싼 아두이노 프로 미니를 원격으로 컨트롤 할 수 있다.

 

릴레이를 컨트롤 하면 원격으로 조정 할수 있는 멀티탭도 만들수 있다.

 

테스트 해본 결과 집 내부 가장 끝 방에서 끝방까지 (콘크리트 벽 2, 나무 방문 2개) RF 안테나 없이 송수신이 되는것을 확인 하였다.

 

 

  1. 김종현 2017.04.27 17:14

    너무 신기하네요. 이러면 올려주신 텔레그램강좌와 조합하면 텔레그램으로 아두이노도 어느정도 컨트롤 할 수 있게 되는건가요?

    • BlogIcon Acidpop acidpop 2017.04.28 09:33 신고

      가능합니다.
      라즈베리파이에 텔레그램 봇을 개발 하고
      메시지 수신 받으면 라즈베리파이에서 아두이노로 RF 통신을 보내는 방식으로 하면 컨트롤도 할수 있죠

  2. 2017.05.22 18:37

    비밀댓글입니다

    • BlogIcon Acidpop acidpop 2017.05.22 22:26 신고

      저같은 경우는
      센서와 rf 송신기를 아두이노 프로 미니 같은 작은 칩을 이용해서 사용합니다
      아두이노에서 주기적으로 센서값을 읽어와서 값을 rf 송신기로 보내는 역할을 하고
      라즈베리에서 rf 를 수신하여 데이터를 처리 하도록 하면 됩니다
      다만, 저 같은 경우는 라즈베리파이에서 rf 수신기가 작동을 안하더군요..

 

라즈베리파이 공식 7인치 터치 스크린

 

사용을 안하면 화면이 꺼지는데

 

화면을 터치 하거나, 마우스를 움직이거나, 키보드를 누르면 화면이 다시 보인다.

 

하지만 원격에서 SSH 로 접속해서 화면을 켜지게 하고 싶다면??

 

 

다음 방법으로 가능하다.

 

echo 0 >sudo /sys/class/graphics/fb0/blank

 

 


 

Raspbian 에서 apt-get 으로 설치 할 수 있는 python 버전은 3.4 이다.

 

현재(2016/10/11 일 기준) python 버전은 3.5.2 이다.

 

python 소스를 받아서 3.5 버전을 설치 하는 방법을 포스팅 한다.

 

1. raspbian 업데이트

 

sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get dist-upgrade   <-- 이 명령은 굳이 안해도 된다.

 

2. 컴파일에 필요한 라이브러리 설치.

 

 

sudo apt-get install build-essential libncursesw5-dev libgdbm-dev libc6-dev
sudo apt-get install zlib1g-dev libsqlite3-dev tk-dev
sudo apt-get install libssl-dev openssl

 

 

3. Python 소스 다운로드 및 컴파일, 설치.

 

 

 

cd /home/pi/

mkdir temppython

cd temppython

wget "https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz"

tar xvf Python-3.5.2.tgz

cd Python-3.5.2

./configure

make

sudo make install

 

 

4. pip 설치.

 

 

wget https://bootstrap.pypa.io/get-pip.py

sudo python3.5 get-pip.py

pip3.5 --version

  1. 라즙이 2017.07.23 12:33

    이 방법으로 설치를 했는데 python3 -V를 해도 3.4.2로 나오네요. 기존 버전을 따로 처리하거나, 3.5.2로 컴파일 하기 위해선 다른 명령어를 써야 하는 건가요?

  2. 감사 2017.10.30 16:31

    감사합니다 덕분에 쉽게 설치했어요!!

  3. 라즈베리파이입문생 2017.11.20 23:03

    작성자님
    sudo python3.5 get-pip.py부분을 입력하면 오류가 뜨는데 이건 뭐가 잘못된 건가요??

  4. 라즈베리파이입문생 2017.11.20 23:38

    Could not find a version that satisfies the requirement pip (from versions:)
    No matching distribution found for pip 라고 뜹니다...

    • 라즈베리파이입문생 2017.11.20 23:41

      그 전에
      Could not fetch URL https://pypi.python.org/simple/pip/:
      There was a problem confirming the ssl certificate:
      Can't connect to HTTPS URL because the SSL module is not available. - skipping
      Could not fetch URL https://www.piwheels.hostedpi.com/simple/pip/:
      There was a problem confirming the ssl certificate:
      Can't connect to HTTPS URL because the SSL module is not available. - skipping
      Could not find a version that satisfies the requirement pip (from versions: )
      No matching distribution found for pip 라고뜹니다......

    • BlogIcon Acidpop acidpop 2017.11.21 10:15 신고

      sudo python3.5 get-pip.py --trusted-host pypi.python.org

      이렇게 뒤쪽에 옵션을 붙여줘보세요

  5. 라즈베리파이입문생 2017.11.21 10:55

    작성자님 sudo python3.5 get-pip.py --trusted-host pypi.python.org
    라고 입력하였는데 똑같은 오류가 발생하였습니다...

    • BlogIcon Acidpop acidpop 2017.11.21 11:06 신고

      흠.. 글쎄요.

      혹시 제가 터미널에 접속 해 볼수 있을까요?

      비밀 댓글로 남겨주실수 있으시면 확인 하고 댓글은 바로 삭제 하겠습니다.

  6. 2017.11.21 21:39

    비밀댓글입니다

    • BlogIcon Acidpop acidpop 2017.11.21 21:48 신고

      pip가 환경 변수경로에 등록이 안되어 있을수도 있습니다

      sudo find / -name “pip”

      위 명령으로 pip 가 실제로 있는지 확인 해보시고 있다면 전체 경로로 실행해보세요

VLC는 X-Window 가 실행 되어 있어야만 접속이 가능하다.

 

하지만 라즈베리 파이에 디스플레이(LCD등등)이 설치 되어 있다면

 

화면에 출력되는 내용 자체를 스트리밍 할 수 있다.

 

바로 FrameBuffer 자체를 스트리밍 하는것이다.

 

방법은 다음과 같다.

 

1. ilclient 라이브러리를 컴파일 한다.

cd /opt/vc/src/hello_pi/libs/ilclient

make

sudo cp ilclient.h /usr/include/

sudo cp libilclient.a /usr/lib/

 

2. telepi 소스를 다운로드 한다.

 

3. vlc 를 설치 한다.

sudo apt-get install vlc

 

 

4. 다음 명령으로 실행한다.

./telepi - | cvlc -vvv stream:///dev/stdin --sout '#standard{access=http,mux=ts,dst=:8090}' :demux=h264

 

위 명령 중 8090 이 포트이다. 자신이 원하는 포트 번호로 변경하여 실행한다.

 

5. 윈도우에서 팟플레이어 또는 VLC 플레이어를 이용하여 스트리밍 되고 있는 영상을 플레이 한다.

  5.1 팟 플레이어의 경우

1. 팟 플레이어 실행

2. Ctrl+U 키 또는 메뉴 -> 열기 -> 주소 열기 를 클릭 하여 http://raspberry pi IP Address:8090 을 입력하고 확인 버튼 클릭

 

  5.2 VLC 플레이어의 경우

1. VLC 플레이어 실행

2. Ctrl + N 또는 메뉴 -> 미디어 -> 네트워크 스트림 열기를 클릭하고 http://raspberry pi IP Address:8090 을 입력하고 재생 버튼 클릭

 

 

VLC 플레이어를 이용하여 콘솔 화면을 재생중인 모습을 확인 할 수 있다.

 

외부망에서 접속 했을때 5초에서 10초 정도 딜레이가 있고

내부망에서는 3~5초 정도 딜레이가 있다.

 

 

 

 

 

 

 








※ 이미지 출처 : https://www.adafruit.com/products/2885






Raspberry PI Zero 가 출시 되었습니다.


사양은 아래와 같습니다.

 


 브로드컴 BCM2835AP

    - 1GHz ARM11 core (Raspberry Pi1 보다 40% 빠름)

 LPDDR2 SDRAM 512MB

 Micro-SD 슬롯

 mini HDMI 단자 1080p60 비디오 출력

 Micro USB 단자 x2

    - 1. 전원

    - 2. USB Data

 핀이 없는 40-pin GPIO

    - PIN 배열은 A+/B+/2B 와 동일

 핀이 없는 RCA 비디오 단자

 작은 크기, 65mm x 30mm x 5mm

 저렴한 가격 $5 (국내 출시가는 이보다 비싸게 나올듯..)








개인적인 바램으로는 Zero 같은 크기에 Wifi 모듈이 통합된 Raspbery Pi 가 있으면 더 좋겠다 싶음.


 

일단 공식적인 설치 방법 이미지이다.

 

 

1. 부품 리스트

  1 7인치 터치 스크린

  2 DSI 용 리본 케이블

  3 점퍼 케이블 4개

  4 지지대 4개

  5 지지대 볼트 4개

  6 어댑터 보드

 

 

2. 디스플레이용 리본 케이블을 어댑터 보드 뒷면에 연결한다.

 

 

3. J4 커넥터에 디스플레이에 있는 터치 스크린용 리본 케이블을 연결한다.

 

4. 터치 스크린에 어댑터 보드를 지지대를 이용하여 고정한다.

 

5. DSI 리본 케이블을 어댑터 보드에 연결한다.

 

6. DSI 용 리본 케이블을 라즈베리파이의 DSI 포트에 연결하고 볼트 4개를 이용하여 고정한다.

 

7. 점퍼선을 연결한다. 어댑터 보드의 5V PIN 과 라즈베리파이의 PIN2(5V)를 연결하고 어댑터 보드의 GND PIN 과 라즈베리파이의 6 PIN(GND)에 연결한다.

 

8. 가장 최신 버전의 Raspbian 이 설치된 micro sd 카드를 삽입한다.

   전원선을 어댑터 보드의 micro USB 연결 포트에 삽입한다. (라즈베리파이의 전원 연결 포트가 아니다)

 

9. 라즈비안이 설치 되고 다음 명령어를 수행한다.

 

 

sudo apt-get update && sudo apt-get -y upgrade

 

 

 

 

 


 

10. 재부팅

 

sudo reboot 

 

11. 터치 스크린 작동 확인을 위해 X11 실행

 

startx 

 

12. 터치 스크린이 작동 여부 확인

 

여기까지가 공식적으로 설명이 된 부분이다.

 

위 문서 대로 수행 한 다음 Kivy 를 설치 하였으나 멀티 터치가 작동하지 않는다.

 

Kivi 설치 과정과 멀티 터치를 활성화 하는 과정이 추가 적으로 더 필요하다. 

 


 

Kivy Library 설치 및 멀티 터치 작동 환경 설정

 

 

1. 소스 리스트에 다음 구문을 삽입한다.

 

 

sudo nano /etc/apt/sources.list

 

가장 끝 줄에 추가 하자.

 

deb http://vontaene.de/raspbian-updates/ . main

 

 

2. apt-get 키 추가

 

gpg --recv-keys 0C667A3E


gpg -a --export 0C667A3E | sudo apt-key add -

 

 

3. apt-get 업데이트 및 필요 라이브러리 설치

 

sudo apt-get update

 

sudo apt-get -y install pkg-config libgl1-mesa-dev libgles2-mesa-dev \
python-pygame python-setuptools libgstreamer1.0-dev git-core \
gstreamer1.0-plugins-{bad,base,good,ugly} \
gstreamer1.0-{omx,alsa} python-dev

 

4. pip 설치

 

 

 cd /home/pi

 

wget https://raw.github.com/pypa/pip/master/contrib/get-pip.py

 

sudo python get-pip.py

 

5. pip를 이용하여 필요한 라이브러리 설치

 

 

sudo pip install cython pygments docutils 

 

6. kivy 설치

 

git clone https://github.com/kivy/kivy

 

cd kivy

 

python setup.py build

 

sudo python setup.py install

 

7. 그림 파일 실행 (최초 설치 후 한번은 실행을 해야 /home/pi/.kivy 디렉토리 및 환경 설정 파일이 생성된다.

 

python ~/kivy/examples/demo/pictures/main.py  

 

멀티 터치가 작동 되지 않는걸 확인 할 수 있다.

 

Ctrl + c 키를 눌러 프로그램을 종료 한다.

 

 

8. 입력 장치에 대한 설정 변경 (이 부분이 중요하다. 이 입력 장치 부분을 추가 해 주어야만 kivy 에서 멀티 터치가 가능하다)

 

nano ~/.kivy/config.ini

 

다음 문장을 [Input] 섹션에 추가 한다.

mtdev_%(name)s = probesysfs,provider=mtdev
hid_%(name)s = probesysfs,provider=hidinput

 

기존에 있던 문장을 맨 앞에 #을 붙여 주석 처리 한다.

#%(name)s = probesysfs,provider=hidinput

 

 

기존

 변경

[input]
mouse = mouse
%(name)s = probesysfs,provider=hidinput

 

 

[input]
mouse = mouse
mtdev_%(name)s = probesysfs,provider=mtdev
hid_%(name)s = probesysfs,provider=hidinput
#%(name)s = probesysfs,provider=hidinput

 

 

9. 그림 파일 멀티 터치로 실행 해보기

 

 

python ~/kivy/examples/demo/pictures/main.py 

 

 

아래 링크를 보다 보면 그림 파일을 멀티 터치로 움직이는 영상을 확인 할 수 있다.

https://www.raspberrypi.org/blog/the-eagerly-awaited-raspberry-pi-display/

 

 

10. 멀티 터치 좌표 확인 프로그램 실행

 

python ~/kivy/examples/demo/touchtracer/main.py 

 

 

 

※ 출처 : http://mattrichardson.com/kivy-gpio-raspberry-pi-touch/index.html

 

 

 

 


 

그리고 화면이 90도 또는 180도 돌아가서 보이는 케이스가 있다면 다음 구문을 추가해 주시면 됩니다.


sudo vi /boot/config.txt


가장 아래에


lcd_rotate=2


0 - 0도

1 - 90도

2 - 180도

3 - 270도


이렇게 추가 하시고 재부팅 하시면 됩니다.

 

 

 

 


 

2015/10/16 추가

 

Kivy 에서 GPIO 사용 (이 부분은 아직 실제로 테스트 해보지 않았습니다.)

 

1. kivy GPIO 소스 다운로드

 

cd ~/kivy

git clone https://github.com/mrichardson23/rpi-kivy-screen.git

 

2. Kivy 예제에 있는 소스는 GPIO 17번 핀에 피에조 부저를 연결

 

10번 핀과 27번 핀에는 LED 를 연결

 

22번 핀에는 버튼을 연결하고 각각 GROUND 를 연결

 

3. root 권한으로 한번 실행

 

cd rpi-kivy-screen/

sudo python main.py

 

4. 터치 스크린이 작동하지 않는것을 확인한다. 왜냐하면 kivy 환경 설정 파일이 root 에는 적용되어 있지 않기 때문에 환경 설정 파일을 복사 한다.

Ctrl + c 키를 눌러 프로그램을 종료 한다.

 

sudo cp ~/.kivy/config.ini /root/.kivy/config.ini

 

5. 프로그램을 다시 실행하여 작동 되는것을 확인한다

 

sudo python main.py 

 

 

 


 

 

국내 공식 터치스크린 가격이 10만원을 뛰어 넘는 가격으로 형성이 되어 있다.......솔직히 너무 많이 남겨 먹는거 아닌가 싶다.

 

라즈베리파이 공식 터치 스크린을 구입할분들은 이쪽을 통해서 구입하시는걸 추천!

 

UPS 배송이라 3~4일이면 배송된다.

 

http://kr.element14.com/special-offers?MER=MER-LM-TB-KR-FREEDELIVERY-86447&#freedelivery1509

 

 

 

 

  1. 2016.04.28 15:34

    비밀댓글입니다

  2. bg 2016.04.28 15:35

    안녕하세요. 글 잘읽었습니다. 라즈베리파이 lcd사용하기위해 이글보고 따라하는데 업데이트말고 업그레이드 과정에서 Unpacking nodered (0.13.4) over (0.12.5) 라는 문장이나오고 그뒤로 진행이 되질 않습니다. 어떤문제인지알수있을까요?

    • BlogIcon Acidpop acidpop 2016.04.28 16:51 신고

      이 글이 Wheez 기준으로 작성된 글이라 그런것 같습니다.

      Jessie 에서는 터치 디스플레이 테스트를 안해봤는데

      sudo apt-get install nodered

      nodered 라는 패키지를 먼저 설치해보세요

  3. fg 2017.05.25 06:18

    jessie 에서는 https://kivy.org/docs/installation/installation-rpi.html 에 있는 방법대로 설치하시고, 위의 8. 입력장치에 대한 설정 변경 부분만 해주시면 터치가 잘 됩니다.

앞에서 Telegram BOT 강좌를 이용하여 텔레그램이 설치가 되었다면

 

라즈베리파이 내부에서만 텔레그램을 통해 메시지를 보낼수 있을것이다.

 

 

Telegram BOT 강좌 4부 참조

 

2015/07/21 - [강좌/RaspberryPI 활용] - 라즈베리파이 Telegram BOT 만들기 4부 - Telegram CLI 데몬 실행 및 서비스 등록

 

ex)

echo "msg 홍길동 메시지 보내봅니다" | nc localhost 8888

 

nc 뒤에 localhost 만 라즈베리파이의 IP로 변경하면 다른 장비에서도 사용 할 수 있지 않을까? 싶지만 작동하지 않는다.

 

echo "msg 홍길동 메시지 보내봅니다" | nc 192.168.0.199 8888

 

분명 -P 옵션으로 8888 포트를 열었지만 라즈베리파이 내부에서만 작동 하지 다른 장비에서는 작동하지 않는다.

 

그 비밀(?)은 바로 Telegram CLI 의 소스에 숨겨져 있다.

 

Telegram 소스가 위치한 경로로 이동해보자.

 

cd /home/pi/tg

 

여기에서 main.c 파일을 vi 또는 nano 에디터로 열어 보면

 

int main 함수 아래쪽 (필자는 919 라인에 있다)을 보자.

 

 

 882   int main (int argc, char **argv) {
 883   signal (SIGSEGV, termination_signal_handler);
 884   signal (SIGABRT, termination_signal_handler);
 885   signal (SIGBUS, termination_signal_handler);
 886   signal (SIGQUIT, termination_signal_handler);
 887   signal (SIGFPE, termination_signal_handler);
 888
 889   signal (SIGPIPE, SIG_IGN);
 890
 891   signal (SIGTERM, sig_term_handler);
 892   signal (SIGINT, sig_term_handler);
 893
 894   rl_catch_signals = 0;
 895
 896
 897   log_level = 10;
 898
 899   args_parse (argc, argv);
 900
 901   change_user_group ();
 902
 903   if (port > 0) {
 904     struct sockaddr_in serv_addr;
 905     int yes = 1;
 906     sfd = socket (AF_INET, SOCK_STREAM, 0);
 907     if (sfd < 0) {
 908       perror ("socket");
 909       exit(1);
 910     }
 911
 912     if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) < 0) {
 913       perror("setsockopt");
 914       exit(1);
 915     }
 916     memset (&serv_addr, 0, sizeof (serv_addr));
 917
 918     serv_addr.sin_family = AF_INET;
 919     serv_addr.sin_addr.s_addr = accept_any_tcp ? INADDR_ANY : htonl (0x7f000001);
 920     serv_addr.sin_port = htons (port);

 

 

919 라인에서 설정하는 저 부분 중 accept_any_tcp 플래그가 True 일때는 INADDR_ANY 를

FALSE 라면 htonl(0x7f000001) 값을 세팅하게 되어 있다.

 

htonl(0x7f000001) 이 값은 INADDR_LOOPBACK 이라는 플래그로 정의되어 있는데

 

LOOPBACK 네트워크의 접속만 허용하겠다 라는 의미이다.

 

몇일전 Telegram cli 소스에서는 accept_any_tcp 라는 항목이 없었는데 최근 소스에 추가가 되어 있다.

 

 

4부에서 데몬으로 실행할때 옵션에서 accept_any_tcp 라는 옵션만 더 추가하면 다른 네트워크에서도 접근이 가능한 소켓을 Listen 한다.

 

 

telegram-cli -h 를 해도 나오지 않는 항목이기 때문에 소스를 보지 않는 이상 알 수 없는 옵션이다.

 

(최근 소스를 받아보면 help 에 해당 옵션이 나온다)

 

 

 

bin/telegram-cli -s bot/basicbot.lua -P 8888 -e "contact_list" --accept_any_tcp -L /var/log/telegram.log -d & 

 

위 명령으로 데몬을 띄우면 다른 장비에서도 라즈베리파이의 IP와 8888 포트 정보를 이용하여

 

netcat 을 통해 메시지를 보낼 수 있다.

 

 

 


 

 

제목과 전혀 다른 내용이 전개 되었는데 PHP는 도대체 어디 간거야? 라는 의문이 있을것이다.

 

지금까지의 내용은 그냥 알아두기 수준으로만 하고 넘어가는것이 좋다.

 

왜냐하면 위와 같이 LOOPBACK 네트워크가 아닌 모든 네트워크에서 접속을 다 받을수 있다면 공격자가 라즈베리파이의 IP와 포트로 수많은 메시지를 보낼 수가 있게된다.

 

Telegram CLI 의 소켓은 보안성이 없고 그저 모든 명령을 다 받아 처리하게 되어 있기 때문에

 

심각한 보안 문제가 발생 할 수 있다.

 

telegram-cli 로 모르는 사람에게 온갖 스팸 메시지가 보내 질 수도 있는것이다.

 

 

 

필자는 LOOPBACK 으로만 소켓을 열고 php 를 이용해서 메시지를 전송한다.

 

 

준비 과정은 다음과 같다.

 

1. 라즈베리파이에 Apache+ php 또는 NginX + php 를 설치 한다.

 

웹서버와 php 를 설치하는 방법은 수많은 블로그에서 다루고 있으니 생략한다.

 

필자는 Apache + PHP 로 구성하였다.

 

2. php 파일을 작성한다.

 

PHP를 이용해서 텔레그램으로 메시지를 보내는 방법으로 다음과 같이 코딩하였다.

 

  1. PHP에서 GET parameter 중 password 키를 지정하여 해당 Password 값과 일치 하지 않는다면 요청을 무시한다.

  2. password 가 일치 한다면 Text File 을 전송 받는다.

  3. 전송 받은 Text File을 Local Network 의 Telegram-CLI 에 전송 하도록 요청한다.

 

필자는 PHP 개발을 잘 몰라서 여기저기 구글링하여 다음과 같이 개발하였다.

<?php
header("Content-Type: text/html; charset=UTF-8");
// 4.1.0 이전의 PHP에서는, $_FILES 대신에 $HTTP_POST_FILES를
// 사용해야 합니다.



$pw=$_POST["password"];

// 뒷부분의 엄청나게 긴 패스워드는 'password' 라는 문자열을 SHA256 으로 해쉬한 결과값이다.
// 각 사용자는 자신의 고유 Password 를 설정하여 사용하면 된다.
$pwcmp = strcmp($pw, '5E884898DA28047151D0E56F8DC6292773603D0D6AABBDD62A11EF721D1542D8');

$tgsend_text_shell="/home/pi/tg/bot/shell/tgtext.sh";
$ipauth="/tmp/ipauth.txt";

// Password 가 일치하지 않는 경우 접속한 사용자의 IP를 텔레그램으로 전송
if($pwcmp){
    echo "Unauthorized user";
    ignore_user_abort(1); 
    $f = fopen($ipauth, "w"); 
    $tp="(".date('Y/m/d-H:i:s').") ".$_SERVER['REMOTE_ADDR']; 
    fwrite($f, "인증되지 않은 사용자가 File Upload를 시도하였습니다\n");
    fwrite($f, $tp."\n");
    $pwtxt   ="PASSWORD : ".$pw;
    fwrite($f, $pwtxt."\n");
    fwrite($f, $_SERVER['HTTP_USER_AGENT']."\n");
    fclose($f);  
    exec($tgsend_text_shell." ".escapeshellarg($ipauth));
}else{

    $uploaddir = '/tmp/';
    $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

    if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
        echo "파일이 유효하고, 성공적으로 업로드 되었습니다.\n";
    } else {
        print "파일이 유효하지 않습니다!\n";
    }

    // 업로드 된 Text 파일을 Telegram 으로 전송한다.
    exec($tgsend_text_shell." "."홍길동"." ".escapeshellarg($uploadfile));
}

?>

위 코드를 아래의 경로에 저장한다.

 

/var/www/tgcli.php

 

 

 

주의 :

위 코드에서 "5E884898DA28047151D0E56F8DC6292773603D0D6AABBDD62A11EF721D1542D8" 

 

이 Password 부분은 각 사용자가 변경하여 사용하여야 한다.

 

필자는 SHA256 생성기 (http://www.convertstring.com/ko/Hash/SHA256) 를 이용해서 암호를 해쉬한 값을 사용한다.

 

위 Hash 코드는 'password' 라는 문자열을 SHA256으로 해쉬한 값이다. 그대로 사용하면 안된다.

 

 

좀 더 보안에 신경을 써야 한다면 php 파일 내부에 암호를 저장하는게 아닌 다른곳에 저장해두고 php에서 읽어오게 해야 더 좋을듯..

 

 

 

위와 같이 저장하였다면 90%는 성공이다.

 

이제 다른 장비에서 사용 하는 방법은 다음과 같다.

 

필자는 curl 이라는 유틸을 이용해서 사용한다.

 

다른 리눅스 장비에서 다음 명령어를 입력하여 실행해보자.

 

 

curl --form userfile=@/tmp/temp.txt --form password=5E884898DA28047151D0E56F8DC6292773603D0D6AABBDD62A11EF721D1542D8 http://192.168.0.199/tgcli.php

 

 

 

 

/tmp/temp.txt 파일을 라즈베리파이의 php 로 전송을 하는 명령어이다.

 

당연히 /tmp/temp.txt 파일이 있어야 한다.

 

모든 과정이 정상적으로 되었다면 텔레그램으로 해당 텍스트 파일의 내용이 전송 되었을 것이다.

 

 

 

위 php 파일을 응용하면 파일이 아닌 GET Parameter에 내용을 직접 전달 할 수도 있다.

 

 


 

 

이 강좌는 난이도가 조금 있습니다.

 

차근 차근 따라해 보시고 잘 안되는 부분이나 궁금하신 점은 질문 게시판을 이용해 주세요.

 

감사합니다.

  1. BlogIcon 천타 2016.04.08 12:29

    좋은 자료 공유해주셔서 정말 감사합니다~

    궁금해서 인터넷 검색하다가 여기까지 왔는데 진짜 너무 잘 정리해주셨네요~ 짱짱!!

  2. 궁금 2016.07.25 17:29

    라즈베리파이 대신에 레드햇 리눅스 쓰는데요 카카오톡은 어떻게 해야하나요?ㅠㅠㅠ

    • BlogIcon Acidpop acidpop 2016.07.25 17:33 신고

      카카오톡은 Open API가 상당히 한정 되어 있는걸로 알고 있습니다.

      https://developers.kakao.com/docs/restapi#카카오톡-나에게-보내기

      위 링크를 참조 하시면 될것 같습니다.

    • 궁금 2016.07.25 17:35

      오! 감사합니다 PHP도 참고하면 되겠죠?

    • BlogIcon Acidpop acidpop 2016.07.25 17:55 신고

      카카오톡 쪽은 문서를 읽어봐도 좀 애매하게 작성된게 많아서...

      저는 머리가 나쁜지 이해가 잘 안가더라구요 ^^;

  3. 궁금 2016.07.26 10:28

    제가 머리 나쁜게 아니었네요 ㅋㅋㅋ
    카카오톡 쪽 문서 자체가 어려운가봐요. 무튼 좋은 글 보고 갈게요~~ 즐거운 하루 보내세요~

+ Recent posts