ããã«ã¡ã¯ãHabrïŒ
仿¥ã¯ãã¢ãã€ã«ããã€ã¹ããã³ã³ãã¥ãŒã¿ãŒãå¶åŸ¡ããæ¹æ³ã«ã€ããŠèª¬æããŸãã ããããããã¯radminã®å¥ã®é¡äŒŒç©ã§ã¯ãªããå人ã®ã³ã³ãã¥ãŒã¿ãŒãæš¡æ¬ããæ¹æ³ã®äŸã§ããããŸããã ããã¯ãããŒã¢ã³ã®ãªã¢ãŒãå¶åŸ¡ããŸãã¯ããããPythonã§æžãããããŒã¢ã³ã管çããããã®ã€ã³ã¿ãŒãã§ãŒã¹ã®äœæã«é¢ãããã®ã§ãã
ã¢ãŒããã¯ãã£ã¯éåžžã«åçŽã§ãã
èå³ãããã°ãç«ã«ããããã
å®è£
ãé²ããåã«ããããžã§ã¯ãã«ã¿ãã°ããæºåãããããšãææ¡ããŸãã å¿
èŠæ§ïŒ
ããªã¢ã³ã³ã
ãµãŒããŒåŽããå§ããŸããã-Djangoã¢ããªã±ãŒã·ã§ã³ã æ°ããã¢ããªã±ãŒã·ã§ã³ãäœæããã¹ãŒããŒãŠãŒã¶ãŒã远å ããŸãã
python manage.py startapp remotecontrol
Djangoãããžã§ã¯ãã§äœ¿çšããã¢ããªã±ãŒã·ã§ã³ã«ããã«è¿œå ããããšããå§ãããŸãïŒweb \ settings.pyãŸãã¯ãwebãã®ä»£ããã«-Djnagoãããžã§ã¯ãã®ååïŒïŒ
INSTALLED_APPS = [ ....... 'remotecontrol', ]
DBãšã¹ãŒããŒãŠãŒã¶ãŒãäœæããŸãã
python manage.py migrate python manage.py createsuperuser
èšå®ãå®äºããããã¢ããªã±ãŒã·ã§ã³ã«é²ã¿ãŸãã
ã¢ãã«ïŒremotecontrol \ models.pyïŒ
ã¢ãŒããã¯ãã£ã«ã¯1ã€ã®ã¢ãã«ãããªã-ããã¯ãããŒã¢ã³ãå¿çããå¿
èŠãããããŒã ã§ãã ã¢ãã«ãã£ãŒã«ãïŒ
- ã³ãã³ãã³ãŒã -4ã€ã®ã³ãã³ãã䜿çšããŸãïŒãäžæåæ¢ãããåéãããåèµ·åãããã³ã³ãããŒã«ããã«ãç¡å¹ã«ããã
- ããŒã ã®ã¹ããŒã¿ã¹ -ãäœææžã¿ãããåŠçäžãããå®äºãããæåŠãã®4ã€ã®ç¶æ
ãå¯èœã§ãã
- IP
- ãªããžã§ã¯ãäœææ¥
ããŒã ãšã¹ããŒã¿ã¹ã®
詳现ã«ã€ããŠã¯ã以äžãåç
§ããŠãã ãã ã
ã¢ãã«ã«ã€ããŠèª¬æããŸãã å°ããªãã¢ããã°ã¬ãŒããã¢ãã«ïŒ
1.æšæºãããŒãžã£ãŒãå±éããŸãã ãäœææžã¿ãç¶æ
ããã³ãåŠçäžãç¶æ
ã®ã³ãã³ããåä¿¡ããã¡ãœããã远å ããŸãã
ãããŒãžã£ãŒã«ã€ããŠèª¬æããŸãããã class CommandManager(models.Manager):
ãããŠãã¢ãã«ã«è¿œå ããŸãïŒ
class Command(models.Model): ....... objects = CommandManager()
2.ç¶æ
ãã§ãã¯ã®æ¹æ³ãšã³ãã³ãã®ç¶æ
ãèšå®ããæ¹æ³ã远å ããŸãã
远å ããŸãã ã¡ãœããïŒ class Command(models.Model): .......
泚ïŒãã¡ããããããã®ã¡ãœãããªãã§ãå®è¡ã§ããŸãã ãã®å ŽåãDjango ORMã§åäœããã³ãŒãã§ã¯ã宿°ã䜿çšããã³ãã³ãæŽæ°ã®ããžãã¯ïŒå°ãªããšã2è¡ã§ãããããã§ãïŒãèšè¿°ããå¿
èŠããããŸãããããã¯ããŸã䟿å©ã§ã¯ãããŸããã å¿
èŠãªã¡ãœããããã«ããæ¹ãã¯ããã«äŸ¿å©ã§ãã ãããããã®ã¢ãããŒããæŠå¿µãšççŸããå Žåã¯ãã³ã¡ã³ãã®è°è«ãåãã§èããŸããmodels.pyã®å®å
šãªãªã¹ãïŒ ç®¡çããã«ïŒremotecontrol \ admin.pyïŒ
泚ïŒä»¥äžã§ã¯ãã¯ã©ã€ã¢ã³ãIPãå€å¥ããããã«django-ipwareã¢ããªã±ãŒã·ã§ã³ãå¿
èŠã«ãªããŸãã
pip install django-ipware
ããã§ã¯ãã¹ãŠããã€ãã£ãã«è¡ãããŸãã管çããã«ã«ã¢ãã«ãç»é²ãã衚ã«è¡šç€ºãããŠããåãšãã©ãŒã ã®ãã£ãŒã«ãã説æããŸãã å¯äžã®æ³šæç¹-ãªããžã§ã¯ãã«ã¯ã©ã€ã¢ã³ãIPãä¿åããã«ã¯ãsaveã¡ãœããããªãŒããŒã©ã€ãããå¿
èŠããããŸãã
ã¢ãã«ã®å€æŽãããŒã¿ããŒã¹ã«é©çšããããšãå¿ããªãã§ãã ããïŒ
python manage.py makemigrations remotecontrol python manage.py migrate remotecontrol
ãã®çµæããªããžã§ã¯ããäœæ/ç·šéããããšãã§ããŸã... ...ãããŠã管çããã«ã§ãªããžã§ã¯ãã®ãªã¹ãã衚瀺ããŸãã ã³ãã³ãåŠçã®ããžãã¯ã®å®è£
ã«é²ã¿ãŸãã
ã¯ã©ã¹IRemoteControl
äžèšã®ãšããã4ã€ã®ããŒã ããããŸãã
- ãäžæåæ¢ã -ã¡ã€ã³ããŒã¢ã³ãµã€ã¯ã«ãäžæåæ¢ãããåéãããåèµ·åããããªã¢ãŒãã®ç¡å¹åããé€ããã¹ãŠã®ã³ãã³ããç¡èŠããŸãã
- ãåéã -æªéã®ã¡ã€ã³ãµã€ã¯ã«ãåéããŸãã
- ãåèµ·åã -ããŒã¢ã³ã®ååæåãæ§æã®åèªã¿åããªã©ãå®è¡ããŸãã ãã®ã³ãã³ãã¯ããäžæåæ¢ãã³ãã³ãã®ã¢ã¯ã·ã§ã³ã®å Žåã«ãå®è¡ãããŸãããåèµ·ååŸã«ã¡ã€ã³ãµã€ã¯ã«ãåéãããŸãã
- ãã³ã³ãããŒã«ããã«ãç¡å¹ã«ããã -çä¿¡ã³ãã³ãã®åŠçã忢ããŸãïŒãã以éã®ã³ãã³ãã¯ãã¹ãŠç¡èŠãããŸãïŒã ãã®ã³ãã³ãã¯ããäžæåæ¢ãã³ãã³ãã®ã¢ã¯ã·ã§ã³ã®å Žåã«ãå®è¡ãããŸãã
äœææã«ã¯ãããŒã ã«ã¹ããŒã¿ã¹ãäœææžã¿ããå²ãåœãŠãããŸãïŒããããšããCapïŒïŒã åŠçäžãã³ãã³ãã¯ãå®è¡æžã¿ãïŒã·ã¹ãã ã®ç¶æ
ãå¿
èŠãªæ¡ä»¶ããã¹ãŠæºããå ŽåïŒãŸãã¯ãæåŠæžã¿ãïŒãã以å€ã®å ŽåïŒã«ãªããŸãã ã¹ããŒã¿ã¹ãåŠçäžãã¯ããé·æã«ããããããŒã ã«é©çšãããŸã-ããŒã ã®å®è¡ã«ã¯æéããããå ŽåããããŸãã ããšãã°ããäžæåæ¢ãã³ãã³ããåãåã£ãã³ãŒãã¯ãã©ã°å€ã®ã¿ã倿Žãããåèµ·åãã³ãã³ãã¯ããè€éãªããžãã¯ã®å®è¡ãéå§ããŸãã
ã³ãã³ããåŠçããããã®ããžãã¯ã¯æ¬¡ã®ãšããã§ãã
- 1åã®å埩ã§ã1ã€ã®ã³ãã³ããåŠçãããŸãã
- ãåŠçäžãç¶æ
ã®ãæãå€ããã³ãã³ããååŸããŸãã ååšããªãå Žåããäœææžã¿ãç¶æ
ã®ãæãå€ãããã®ãååŸããŸãã ããã§ãªãå Žåãå埩ã¯å®äºããŠããŸãã
- ç¡å¹ãªIPããã³ãã³ããåä¿¡ããå Žå-ã¹ããŒã¿ã¹ããæåŠãã«èšå®ããŸãã å埩ãå®äºããŸããã
- ã³ã³ãããŒã«ããã«ããªãã«ãªã£ãŠããå Žåã¯ãã³ãã³ãã¹ããŒã¿ã¹ããäžæ¿èªãã«èšå®ããŸãã å埩ãå®äºããŸããã
- ã³ãã³ããããŒã¢ã³ã®çŸåšã®ç¶æ
ã«å¯ŸããŠæå¹ã§ãªãå Žåãç¶æ
ããæåŠãã«èšå®ããŸãã å埩ãå®äºããŸããã
- ã¹ããŒã¿ã¹ããåŠçäžãã«èšå®ãïŒå¿
èŠãªå ŽåïŒãã³ãã³ããå®è¡ããã¹ããŒã¿ã¹ããå®äºãã«èšå®ããŸãã å埩ãå®äºããŸããã
ã¯ã©ã¹ã®ããšã³ããªãã€ã³ããã¯.check_commandsïŒïŒã¡ãœããã§ããããã¯äžèšã®ããžãã¯ãå®è£
ããŸãã ããŒã¢ã³ã®ã¡ã€ã³ã«ãŒãã§åãã¡ãœãããåŒã³åºããŸãã ãäžæåæ¢ãã³ãã³ããåä¿¡ããå Žåãã¡ãœããã«ãµã€ã¯ã«ãäœæãããŸããçµäºæ¡ä»¶ã¯ãåéãã³ãã³ããåä¿¡ããããšã§ããããã«ãããããŒã¢ã³ã®äœæ¥ã§ç®çã®äžæåæ¢å¹æãéæãããŸãã
Control.pyã¢ãžã¥ãŒã«ïŒremotecontrol \ control.pyïŒ
IRemoteControlã®å®è£
ãèšè¿°ããã¢ãžã¥ãŒã«ãã¢ããªã±ãŒã·ã§ã³ãã£ã¬ã¯ããªã«é
眮ããããšãææ¡ããŸãã ãããã£ãŠã䟿å©ã«è»¢éãããDjango-appãååŸããŸãã
ãã©ãã¯ããžãã¯
ç空äžã®çç¶ã®æªéã®ã¢ãã«ã次ã®ããã«è¡šçŸã§ããå ŽåïŒ
ã³ã³ãããŒã«ããã«ã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£
ã¯ç°¡åã§ãã
ãã®çµæãåŒã³åºãããæªéã¯å¶åŸ¡ãããŸããã管çããã«ããã®ã¿ã§ãã
ãã®ã³ãŒãã
daemon.pyãªã©ã®ãã¡ã€ã«ã«å
¥ããŠãå
ã«é²ã¿ãŸã-ã¢ãã€ã«ã¯ã©ã€ã¢ã³ããèšè¿°ããŸãã
REST API
ããããæåã¯ãã¢ãã€ã«ã¯ã©ã€ã¢ã³ããšãµãŒããŒåŽã®éã®éä¿¡çšã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããããšããå§ãããŸãã å§ããŸãããã
æºå段é
Django RESTãã¬ãŒã ã¯ãŒã¯ãã€ã³ã¹ããŒã«ããŸãã
pip install djangorestframework
æ¥ç¶ïŒweb \ settings.pyïŒïŒ
INSTALLED_APPS = [ ....... 'rest_framework', ]
ãããŠæ§æããŸãïŒåãå Žæã§ããã¡ã€ã«ã®æåŸã«è¿œå ããŸãïŒïŒ
REST_FRAMEWORK = {
ã·ãªã¢ã©ã€ã¶ãŒïŒremotecontrol \ serializers.pyïŒ
RESTã€ã³ã¿ãŒãã§ãŒã¹ã䜿çšããŠæ»ãããŒã¿ã»ãããèšè¿°ããããšããå§ããŸãã ããã§ã¯ãã¢ãã«èšè¿°ïŒ.status_dspïŒïŒããã³.code_dspïŒïŒïŒãããç¶æ
ãšã³ãã³ãã³ãŒãã®ããã¹ãåãããããè¿ã䟿å©ãªç¥ç§çãªã¡ãœãããèŠã€ããŸãã
serializers.pyã®ãªã¹ãïŒ from rest_framework import serializers from .models import Command class CommandSerializer(serializers.ModelSerializer): class Meta: model = Command fields = ('status', 'code', 'id', 'status_dsp', 'code_dsp', 'ip')
ããŒã¿ãã¥ãŒïŒremotecontrol \ views.pyïŒ
Djangoã¢ããªã±ãŒã·ã§ã³ã®ã¢ãŒããã¯ãã£ã®REST APIã¡ãœããã¯åããã¥ãŒã§ãããçè§£ã§ããã®ã¯âŠã ãã§ãã
ã¯ã©ã€ã¢ã³ããšéä¿¡ããã«ã¯
ã APIã¡ãœããã®3
æåã® åèªã§ååã§ãïŒããŒãçæ³çãªäžç...ïŒïŒ
- commands_available-䜿çšå¯èœãªã³ãã³ãã³ãŒãã®ãªã¹ããšãã³ãã³ããåŠçããããšèŠãªãããã¹ããŒã¿ã¹ã³ãŒãã®ãªã¹ããè¿ããŸãã
- ã³ãã³ã -æ°ããã³ãã³ããªããžã§ã¯ããäœæããããã«äœ¿çšãããŸãã ããŒã¿ããŒã¹ã§äœ¿çšå¯èœãªãªããžã§ã¯ãã®ãªã¹ãã¯å¿
èŠãããŸããã
- ã³ãã³ã/ <ãªããžã§ã¯ãID> -ã³ãã³ããªããžã§ã¯ãã®ç¶æ
ãæ±ºå®ããããã«äœ¿çšãããŸãã
ã³ãŒããæå°éã«æããããã«ãDjango RESTãã¬ãŒã ã¯ãŒã¯ã«ãã³ãã«ãããŠãããã³ã䜿çšããŸãã
- @api_view-颿°ããŒã¹ã®ãã¥ãŒã®ãã³ã¬ãŒã¿ãŒããã©ã¡ãŒã¿ãŒã¯æå¹ãªhttpã¡ãœããã®ãªã¹ããæå®ããŸãã
- generics.CreateAPIView-ãªããžã§ã¯ããäœæããã¡ãœããã®ã¯ã©ã¹ã§ãPOSTã®ã¿ããµããŒãããŸãã
- generics.RetrieveAPIView-ãªããžã§ã¯ãã«é¢ãã詳现æ
å ±ãååŸããããã®ã¯ã©ã¹ã§ãGETã®ã¿ããµããŒãããŸãã
views.pyã®ãªã¹ãïŒ from rest_framework.decorators import api_view from rest_framework.response import Response from rest_framework import generics from ipware.ip import get_ip from .models import Command from .serializers import CommandSerializer @api_view(['GET']) def commands_available(request):
ãšã³ããã€ã³ãïŒremotecontrol \ urls.pyïŒ
å®è£
ãããAPIã¡ãœããã®ãšã³ããã€ã³ãã«ã€ããŠèª¬æããŸãã
urls.pyã®ãªã¹ãïŒ from django.conf.urls import url from . import views urlpatterns = [ url(r'^commands_available/$', views.commands_available), url(r'^commands/$', views.CommandList.as_view()), url(r'^commands/(?P<pk>[0-9]+)/$', views.CommandDetail.as_view()), ]
ãããŠãããããããžã§ã¯ãïŒweb \ urls.pyïŒã«æ¥ç¶ããŸãïŒ
urlpatterns = [ ....... url(r'^remotecontrol/', include('remotecontrol.urls')), ]
éä¿¡çšã®ã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ãããŠããŸãã ç§ãã¡ã¯æãããããã«æž¡ããŸãã
ããªã¢ãŒãã³ã³ãããŒã«ã¢ããªã
ãµãŒããŒãšéä¿¡ããã«ã¯ãUrlRequestïŒ
kivy.network.urlrequest.UrlRequest ïŒã䜿çšããŸãã ãã¹ãŠã®å©ç¹ã®ãã¡ã次ã®ãã®ãå¿
èŠã§ãã
- éåæã¢ãŒãã®ãµããŒãã
- Python dictã«å¿ããŠæ£ããJSONãèªåçã«å€æããŸãã
å®è£
ãç°¡åã«ããããã«ãåºæ¬èªèšŒã¹ããŒã ã䜿çšããŸãã
å¿
èŠã«å¿ããŠãUrlRequestã䜿çšããŠWebãªãœãŒã¹äžã®ä»ã®èªèšŒæ¹æ³ã«æ¬¡ã®èšäºã®ãããããåœãŠãããšãã§ããŸã-ã³ã¡ã³ããèšè¿°ããŸããããŸãããã°ãã³ãŒãå
ã®ã³ã¡ã³ãã§ååçè§£ã§ããŸãã ããã§ãååã§ã¯ãªãå Žå-ç§ã«ç¥ãããŠãç§ã¯å€æŽãè¡ããŸãããã®æç¹ã§ãã³ãŒãã®çããããçµäºããã·ãŒã³ã«å
¥ããŸã
éç ²
圌ã«ã€ããŠã¯ã»ãšãã©èªãããŠããªãã®ã§ãBuildozerã«ã€ããŠé·ãé話ãããšãã§ããŸãã Habréã«ã¯èšäºããããŸãïŒ
ãªãªãŒã¹ããŒãžã§ã³ã® ã€ã³ã¹ããŒã«ãšæ§æ ã
Google Playã§ã®å
¬éã«é¢ããèšäºïŒããã¡ãã
ããã¥ã¡ã³ãããã
ãŸã ...ããããããŸããŸãªãœãŒã¹ã«æ£ãã°ã£ãŠãã
èšäºå
šäœãæžãããšãã§ãã埮åŠãªéãããããŸãã ããã§èŠç¹ãéããŠã¿ãŸãã
ãã®é©ç°ã«å¯ŸåŠããããã®ããã€ãã®å®çšçãªãã³ãïŒ- Androidã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããã«ã¯ããŸã Linuxãå¿
èŠã§ããä»®æ³ãã·ã³ã§å®è¡ã§ããŸãã , python-for-android ( ) sh ( pbs), Windows;
- , â Buildozer Android-dev . ( , ndk, sdk requirements) 30-40 ;
- Buildozer , Kivy Kivy-garden ( Kivy);
- , Buildozer ( â ). Buildozer , ( ) .
- Buildozer root;
ããŠãDebianãšUbuntuã®å¹žããªææè
ãæ¯æŽããããã®å°ãã®ã³ãŒãïŒæ®ãã¯ããã¡ã€ã«ã§æ
éã«åŠçãããå¿
èŠããããŸãïŒBuildozerãã€ã³ã¹ããŒã«ãããã®ã§ããããåæåããŸãïŒ buildozer init
ãã®ã³ãã³ãã®çµæãã¢ã»ã³ããªãŒæ§æãã¡ã€ã«ïŒbuildozer.specïŒããã£ã¬ã¯ããªãŒã«äœæãããŸãã以äžã«ãªã¹ããããŠããããŒãèŠã€ããŠããããã«å¯Ÿå¿ããå€ãå²ãåœãŠãŸããbuildozer.specã®ç·šé# (list) Garden requirements
garden_requirements = xpopup
# (str) Supported orientation (one of landscape, portrait or all)
orientation = portrait
# (bool) Indicate if the application should be fullscreen or not
fullscreen = 0
# (list) Permissions
android.permissions = INTERNET
# (int) Minimum API required
android.minapi = 13
# (int) Android SDK version to use
android.sdk = 21
wunderwaffeãã¢ã¯ãã£ãã«ããŸãã buildozer android debug
åºåã«ã¯.apkããããAndroidããã€ã¹ã«ã€ã³ã¹ããŒã«ã§ããŸããã§ãã
ããã§ãšãããããŸãïŒãã¹ãäž
ãããŠãããããã¹ãŠã©ã®ããã«æ©èœããããèŠãŠã¿ãŸãããã圌ããããã»ã©é·ãé詊ããŠã¿ãã®ãäžæè°ã§ã¯ãããŸãã:)DjangoãµãŒããŒãèµ·åããããŒã«ã«ãããã¯ãŒã¯äžã®ãã·ã³ã®IPããã©ã¡ãŒã¿ãŒãšããŠæå®ããŸãã python manage.py 192.168.xxx.xxx:8000
ç§ãã¡ã¯æªéãšåŒã³ãŸãïŒ python daemon.py
Androidããã€ã¹ã§ã¢ããªã±ãŒã·ã§ã³ãèµ·åãããšã次ã®ãããªãã®ã衚瀺ãããŸããæ³šïŒgithubã«ãããããžã§ã¯ãã®æçµããŒãžã§ã³ã¯ããããªã®é²ç»ã«äœ¿çšãããŸãããæ©èœã®æ¡åŒµã«ãããèšäºã§æå®ãããã³ãŒããšã¯ç°ãªããŸãããŠãŒã¶ãŒã³ãã³ããšãããã°ã¡ãã»ãŒãžã®ãµããŒãããµãŒããŒããŒãã«è¿œå ããïŒããããããããããïŒãã¯ã©ã€ã¢ã³ãã«ã¯æ¿èªãã©ãŒã ãã³ãã³ãã®ç¢ºèªèŠæ±ãããã³ã€ã³ã¿ãŒãã§ã€ã¹ã®å©äŸ¿æ§ã远å ãããŸããããŸãšãããš
ãã®çµæãäœãåŸãããŸãããïŒ- ãªã¢ãŒãã³ãã³ãã«å¯Ÿããåå¿ã®ããžãã¯ãå®è£
ããç°¡åã«åã蟌ã¿å¯èœãªã¯ã©ã¹ã
- Webã€ã³ã¿ãŒãã§ã€ã¹ããä»»æã®ã¹ã¯ãªãããå¶åŸ¡ããREST APIãæäŸãããµãŒããŒã¢ããªã±ãŒã·ã§ã³ã
- REST APIãä»ããŠã¹ã¯ãªããã管çããããã®Androidã¢ããªã±ãŒã·ã§ã³ã
ããŸãã«ã倧声ã§èšã£ããããããŸãããã... ç§ã¯è³ªåã«èŠãããããŠããŸã- ä»ã®èšèªãšæè¡ïŒPythonãé€ãïŒã䜿çšããŠåæ§ã®ã¢ãŒããã¯ãã£ãå®è£
ããïŒå°ãªããšãïŒãã以äžã®åŽåãšã³ãŒãã®èšè¿°ã¯äžå¯èœã§ããïŒä»¥äžã§ãã
ãã¹ãŠã®çŽ æŽãããã³ãŒãã£ã³ã°ãšæåãããã«ãã䟿å©ãªãªã³ã¯
githubã®ãRemoteControlInterfaceãDjangoã®ããã¯Django RESTãã¬ãŒã ã¯ãŒã¯ã®ããã¯Kivyã®ããã¯Kivyã®ã€ã³ã¹ããŒã«Buildozerã®ã€ã³ã¹ããŒã«