Gopro API 제어

사용모델: Gopro hero 10 black

OS: Ubuntu 20.04 LTS

SDK, 데모 등 리소스는 github에서 다운로드 가능 (https://github.com/gopro/OpenGoPro)

Gopro python SDK 설치

pip install open-gopro

컴퓨터와 gopro 페어링

gopro에서 quick app 연결화면에 진입한다.

Quik

PC에서 터미널을 실행한 후 아래 명령 입력.

bluetoothctl

[bluetooth]# connect F3:EA:9A:C0:FF:FF

여기서 F3:EA:9A:C0:FF:FF 형태의 MAC 주소는 demo의 tutorial1, ble_connect.py 를 실행하여 알아낼 수도 있으며, 또한 bluetoothctl 쉘에서 scan on 을 입력함으로써 주변 BLE 기기의 MAC 주소를 파악하여 알아낼 수도 있다.

이렇게하여 페어링 완료. 이후에 python SDK 작동

동영상촬영

gopro-video 10 # 10초동안 동영상 촬영 후 파일 자동 다운로드

우분투 업데이트 알림 해제

업데이트 매니저의 시작코드를 수정하기 위하여 /etc/apt/apt.conf.d/99update-notifier 를 주정한다.

nano /etc/apt/apt.conf.d/99update-notifier

다음을 참고하여, ‘#’을 추가하여 주석처리한다.:

#DPkg::Post-Invoke {"if [ -d /var/lib/update-notifier ]; then touch /var/lib/update-notifier/dpkg-run-stamp; fi; if [ -e /var/lib/update-notifier/updates-available ]; then echo > /var/lib/update-notifier/updates-available; fi "; };

Onedriver 설치

리눅스용 원드라이브 클라이언트 소프트웨어 – onedriver

Ubuntu20.04LTS 기준
sudo add-apt-repository --remove ppa:jstaf/onedriver
echo 'deb http://download.opensuse.org/repositories/home:/jstaf/xUbuntu_20.04/ /' | sudo tee /etc/apt/sources.list.d/home:jstaf.list
curl -fsSL https://download.opensuse.org/repositories/home:jstaf/xUbuntu_20.04/Release.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/home_jstaf.gpg > /dev/null
sudo apt update
sudo apt install onedriver

ERR_CLEARTEXT_NOT_PERMITTED 해결법

flutter에서 webview_flutter 라이브러리를 이용하여 웹뷰를 작성 시 ERR_CLEARTEXT_NOT_PERMITTED 에러가 발생함.

이는 https로 접속해야하만 제대로 웹페이지를 보여주는 기본 보안설정 때문. 다음 조치로 해결

안드로이드

AndroidManifest.xml 파일 수정하기.

android>app>src>main>AndroidManifest.xml 파일을 열기

application 단락에 다음 내용을 추가

android:usesCleartextTraffic="true"

iOS

ios>Runner>info.plist 파일을 열기

다음내용을 하단에 추가하기

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
  <true/>
  <key>NSAllowsArbitraryLoadsInWebContent</key>
  <true/>
</dict>

마우스 위치 제어

파이썬을 이용하여 마우스 위치와 버튼을 제어. gui 환경에서 사용해야한다.

필요패키지 설치

sudo pip3 install pynput

마우스 위치 제어

import pynput
mouse_con = pynput.mouse.Controller()
mouse_con.position # 현재 마우스 위치 출력
mouse_con.position = (100,100) #100, 100 위치로 이동.

부팅시 자동실행

리눅스 부팅 시 자동시작할 스크립트를

/etc/init.d/

폴더에 넣어둔다

update-rc.d [서비스명] defaults 

위의 명령으로 자동실행을 활성화한다.

자동실행을 취소할 경우

update-rc.d [서비스명] remove 

위의 방법으로 안되는 경우

sudo apt-get install chkconfig #chkconfig 설치
chkconfig [서비스명] on

FarmOS 설치

Gitlab 주소: https://gitlab.com/JiNong_Public/farmosV2

문서목록: https://gitlab.com/JiNong_Public/farmosV2/-/tree/master/docs

Ubuntu 18.04, 구글클라우드 플랫폼 컴퓨트엔진에서 진행 > NUC에서 진행

#의존성패키지 설치
sudo apt install mariadb-server mosquitto nodejs -y
#다운로드 및 설치
git clone https://gitlab.com/JiNong_Public/farmosV2.git
cd farmosV2/scripts
sudo ./install.sh 

실행

sudo service fui start
sudo service fcore start
sudo service cvtgate start

8081 포트로 웹 접속

유저정보 확인하라고 뜨며, 로그인 안됨.

mysql을 지우고, 재설치 시 작동

기본 아이디 비밀번호: farmos / farmosv2@

KSX3267에 따라 장비를 제작하고, NUC에 연결하였으나, 장비검색이 안됨

200424

각 페이지의 정보는 ui/src/views/app/page에 있음

200507

gate에 파이썬 코드가 있음. 파이썬2 환경에서 실행되는 듯

gate/connection.py를 실행하였을 때에, 오류가 발생

다음 명령 후 재부팅

sudo usermod -a -G dialout 사용자이름

여전히 장비검색 안 됨. 다음 스크립트 시도

sudo chmod 777 /dev/ttyACM0

여전히 장비검색 안 됨

200508

시작시 실행되는 스크립트는 fcore, fui , cvtgate인데, 이것들은 /etc/init.d 폴더에 포함돼 있다. 각 스크립트가 실행하는 코드는 다음과 같다.

여기서 WORK_DIR = “/home/changho/farmosV2/” 를 기본으로 한다.

fcore

WORK_DIR = "/home/changho/farmosV2/fcore/" 
python fcore.py start

fui

WORK_DIR = "/home/changho/farmosV2/server/api"  
forever start --uid "farmosV2" -a "${WORK_DIR}/app.js"

cvtgate

WORK_DIR = "/home/changho/farmosV2/gate/cvtgate"  
python couplemng.py start

fui 실행시 이용하는 api 문서 : http://localhost:8081/docs

200512 FarmOS 지농 세미나

다섯가지 KS 온실표준. 현실성없다.

하드웨어 – 범용이라 아무거나 갖다놔도 돼서

통신 – 위와 비슷한 이유로

소개한 모든기능이 올라가있는지? 아니다. 인공지능, 비표준 장비 업데이트 기능이 빠져있다. 비표준 장비는 오픈할 계획이 없다. 인공지능은 내년..

아키텍쳐

200612

백엔드 통신을 관장하는 cvtgate. ~gate/couplemng.py 코드를 실행하여 관리하는 구조.

couplemng.py 의 134줄

adaemon = Daemon('cpmng', runner)

from daemon import Daemon, Runner

같은 폴더 내의 daemon.py를 열어보니, #Daemon을 만들어주는 클래스를 정의함’ #이라고 돼 있음

class Daemon의 def __init__(self, pname, runner, stdin=’/dev/null’, stdout=’/dev/null’, stderr=’/dev/null’): 을 참조, couplemng.py 134줄의 Daemon 클래스의 인자 cpmng와 runner 는 class Daemon에서 pname, runner에 해당되는 것을 알 수 있다.

pidfile 은 self.pidfile = “/var/run/” + pname + “.pid”, 즉 /var/run/cpmng.pid 에 데몬 pid를 기록한다.

runner 정보는 ~/conf/cpmng.conf 에 json 형식으로 기록되어 있음. 아래와 같은 형식으로 되어 있음

{
    "id" : "24969c48-da01-45a4-af73-da7f9aabbdff",
    "sleep" : 1,
    "iter" : 60,
    "mode" : "local"
}

sleep은 몇초마다 다시 동작할 것인지 (couplemng.py 124줄)

iter은 수집한 샘플 데이터 중 몇 개의 후보군 중에 선택할 것인지, 후보군의 갯수 (couplemng.py 97 – 125줄) 후보군은 loadcandidates 로 불러오는데, 이는 ../conf/localcouple.json의 json정보를 불러와서, extracouples(gate) 함수를 호출한다. (여기서 gate 는 localcouple.json 파일의 내용) extractcouples 함수는 config.json에 정의된 couples 키가 없다면, localcouple.json 정보의 gate[“children”] 정보를 반환한다.

6월22일

localcouple.json 을 python에서 josn.loads로 읽어들이면 다음과 같다.

{u'children': [{u'ssmate': {u'opt': {u'mqtt': {u'svc': u'cvtgate', u'id': u'4157859e-df55-48e5-b3ac-8e6288f2165e'}, u'db': {u'host': u'localhost', u'password': u'farmosv2@', u'db': u'farmos', u'user': u'farmos'}, u'conn': {u'host': u'localhost', u'port': 1883, u'keepalive': 60}}, u'class': u'FarmosMate', u'mod': u'mate_farmos'}, u'children': [{u'opt': {}, u'dt': u'gw', u'children': [{u'dt': u'nd', u'children': [{u'dt': u'sen', u'children': [], u'id': u'5', u'dk': u'[1,211,["value","status"]]'}, {u'dt': u'sen', u'children': [], u'id': u'6', u'dk': u'[1,221,["value","status"]]'}], u'id': u'4', u'dk': u'[1,201,["opid","status"],501,["operation","opid"]]'}], u'id': u'ACM0', u'dk': u'ACM0'}], u'name': u'\uc2dc\ud5d8\uc628\uc2e4#1', u'dsmate': {u'opt': {u'sleep': {u'noti': 2, u'obs': 10, u'time': 3}, u'conn': [{u'baudrate': 9600, u'method': u'rtu', u'timeout': 5, u'port': u'/dev/ttyACM0'}]}, u'class': u'KSX3267MateV2', u'mod': u'mate_ksx3267v2'}, u'id': u'4157859e-df55-48e5-b3ac-8e6288f2165e'}], u'id': u'c315cb82-0f6c-4ed6-b8cc-b00331789494', u'name': u'Sample'}

localcouple.json –>> children –>0–>> ssmate : gate에서 mqtt를 통해 fui와 통신하는 정보

localcouple.json –>> children –>0–>> dsmate : 센서와 gate 사이의 통신 정보

def loadcandidate 은 localcouple.json의 children 키를 반환하고,

run 명령을 수행하면 위에서 반환된 localcouple.json 의 children의 항목을 def execute의 인수로 입력함. 인수를 전달받아 실행되는 execute에서는 loadmate 함수를 실행하여 실제 메시지 교환, 구동을 하게된다.

def loadmate의 일부는 다음과 같다.

   def loadmate(self, conf, devinfo, coupleid):
        module = importlib.import_module(conf['mod'])
        class_ = getattr(module, conf['class'])
        self._logger.info("load a mate : " + str(conf['class']) + " " + str(coupleid))
        mate = class_(conf['opt'], devinfo, coupleid, self._logger)
        return mate

이 때에 conf 는 localcouple.json –>> children –>0–>> dsmate 혹은 ssmate 이며, dsmate일 경우 mod는 ‘mate_ksx3267v2‘로서 프로토콜을 반환한다. importlib.import_module(conf[‘mod’]) 줄에서 mate_ksx3267v2.py를 실행하는데, 해당코드는 표준센서노드와의 통신을 수행한다.

conf[‘class’] = “KSX3267MateV2”

conf[“id”]=’4157859e-df55-48e5-b3ac-8e6288f2165e’

Nginx 설치 및 Flask 연동

Nginx 설치

sudo apt install nginx
sudo service nginx restart #이 명령으로 재시작 가능

Nginx 기본 설정은 /etc/nginx/etc/sites-available 에 저장되어 있으며, 기본 홈폴더는 /var/www/html 이다. sites-enable 에 사이트설정 symlink를 만듦으로서 사이트를 활성화할 수 있다.

사이트 설정

#디폴트 사이트 설정 복사
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/flask
#디폴트 사이트 설정 비활성화
sudo rm /etc/nginx/sites-enabled/default
#새로운 사이트 설정 활성화
sudo ln -s /etc/nginx/sites-available/flask /etc/nginx/sites-enabled/flask

flask 웹사이트 정보 설정

/etc/nginx/sites-available/flask 파일의 내용을 다음과 같이 수정한다.

server {
listen 80;
listen [::]:80;

root /var/www/html;
server_name 192.168.43.159; #접속할 주소
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:60080;
}
}

uWSGI 설치 및 실행

sudo pip3 install uwsgi
uwsgi -s 127.0.0.1:60080 --wsgi-file app.wsgi

한편, app.wsgi의 내용은 다음과 같다.

#flask app 경로 : /home/changho/flask_web_basic
#flask app 파일명: flask_web.py
import sys
sys.path.insert(0,"/home/changho/flask_web_basic")

from flask_web import app as application

크론탭에 uwsgi 정보를 등록해두어 자동실행되게 한다.

@reboot cd /home/changho/flask_web_basic;sudo -uchangho uwsgi -s 127.0.0.1:60080 --wsgi-file app.wsgi -b65535#flask app을 실행할 사용자이름을 지정해준다

git 사용법 정리

참고: https://rogerdudler.github.io/git-guide/index.ko.html

#git 복제
git clone /로컬/저장소/경로 <복사할 디렉토리>
git clone http://원격경로 <복사할 디렉토리>
git clone -b<브랜치네임> <원격경로>

#git 저장소 시작
git init

#파일 추가, 삭제 및 발행
git add <파일이름>
git add *
git rm <파일이름> #파일 삭제
git rm --cached <파일이름> #추적중지
git rm -r--cached <폴더이름> #폴더 추적중지
git commit -m "이번 확정본에 대한 설명"
git push origin master #여기서 master는 branch 이름. 다른 가지를 선택하려면 가지 이름을 입력
git remote add origin <원격 경로>

#가지(branch) 만들기
git checkout -b feature_x
#master 가지로 돌아오기
git checkout master
#가지 삭제
git branch -d feature_x
#가지에 파일 전송
git push origin feature_x

#갱신. 업데이트된 내용 내려받기
git fetch --all
git stash
git pull
#다른가지에 있는 변경내용을 현재 가지에 병합하려면
git merge <가지 이름>
#변경내용 병합 전, 어떻게 바뀌었는지 비교
git diff <원래 가지> <비교대상 가지>

#요소들의 상태 확인
git status
#gui 방식의 git
gitk