[PYTHON] termux × AWS Envoyez des informations de localisation de smartphone à AWS avec l'IoT

introduction

Ma femme m'a dit de faire la queue quand j'ai quitté le bureau, mais honnêtement, c'est un problème. Je me suis demandé si je pouvais automatiquement notifier que j'avais quitté le bureau, j'ai donc envoyé les informations de localisation à AWS pour le moment.

図1.png

environnement

Téléphone intelligent: Kyocera (KTV44) OS:Android 9

Côté smartphone (termux)

Installez termux sur Android à l'aide de Google Play. https://play.google.com/store/apps/details?id=com.termux&hl=ja

Comme il est difficile de saisir sur le clavier avec un smartphone, Après l'installation, entrez la commande suivante pour créer l'environnement pour ssh.

$ termux-setup-storage #Autorisez termux à utiliser le stockage Android.
$ pkg install openssh #Installez ssh (serveur et client)
$ sshd #Démarrer le serveur ssh
$ passwd #réglage du mot de passe
$ whoami #Confirmer le nom d'utilisateur (faire une note)
$ ifconfig #Vérifiez l'adresse IP de votre smartphone (notez-la)

À propos, l'adresse IP affichée par termux est la même que l'adresse IP du smartphone lui-même, donc si vous la connaissez à l'avance, vous n'avez pas besoin d'ifconfig.

Ensuite, connectez-vous à votre smartphone avec ssh depuis votre PC pour faciliter le travail. Soyez prudent ici. Le numéro de port TCP par défaut pour ssh est 22, mais pour termux 8022 est spécifié. Par conséquent, spécifiez le numéro de port avec l'option -p. Côté PC (Ubuntu)

$ ssh -p 8022  (Nom d'utilisateur)@(Adresse IP du smartphone)

Si vous faites ssh pour la première fois Are you sure you want to continue connecting (yes/no)? Répondez oui. Après cela, entrez le mot de passe défini sur votre smartphone.

Le traitement en arrière-plan étant interdit dans l'état initial, la connexion ssh sera interrompue chaque fois que le smartphone se met en veille. En sélectionnant «RELEASE WAKE LOCK» sur votre smartphone, le traitement en arrière-plan sera effectué.

Screenshot_20201015-214307.png

Une fois que vous pourrez utiliser ssh, nous continuerons à créer l'environnement.

$ pkg install git #Installez git pour AWS IoT Core pour une utilisation ultérieure.
$ pkg install python #Installez également Python.
$ pkg install vim-python #Installez également vim pour l'édition de fichiers.
$ pkg install termux-api #termux-Installez également api. Requis pour obtenir des informations GPS.

Une fois le système d'installation terminé, l'étape suivante consiste à configurer AWS Iot Core. Reportez-vous à cet article ↓, enregistrez la chose appelée "android01" et effectuez le test de connexion du smartphone à AWS. https://qiita.com/zakuzakuzaki/items/e30d63598ca1d6c0f2a9

J'ai été surpris parce que j'ai pu le faire tel quel. termux est incroyable.

Utilisez la commande termux-location dans "termux-api" pour obtenir les informations de localisation. https://wiki.termux.com/wiki/Termux-location

$ termux-location -p network #Sortie de la position actuelle que le smartphone observe
{
  "latitude": 	35.6359322,
  "longitude": 139.8786311,
  "altitude": 43.5,
  "accuracy": 23.26799964904785,
  "vertical_accuracy": 3.299999237060547,
  "bearing": 0.0,
  "speed": 0.0,
  "elapsedMs": 97,
  "provider": "network"
}

-p est une option permettant de sélectionner la méthode d'obtention des informations de localisation et de sélectionner [gps / réseau / passif]. La valeur par défaut est gps, mais pour une raison quelconque, je ne pouvais pas le faire sur mon smartphone, j'ai donc choisi le réseau. (Aucune erreur, attendez longtemps.) À propos, même si vous changez votre smartphone de la connexion Wi-Fi à la connexion 3G, vous ne pouvez pas obtenir les informations de localisation sauf si vous sélectionnez le réseau.

Probablement un problème avec les autorisations de l'application termux, mais je n'ai pas pu le résoudre, alors je l'ai laissé. Normalement, Android peut donner des droits d'utilisation tels que des dossiers, des caméras, un GPS, etc. pour chaque application sur l'écran de réglage de l'application. Termux n'a pas le choix de l'autorité en premier lieu, il n'y a donc aucun moyen de l'accorder.

Après avoir confirmé que les informations de localisation peuvent être obtenues, enregistrez-les au format json pour un traitement facile.

$ termux-location -p network |sed -e "4,10d"|tr -d '\n'|tr -d ' '| sed -s s/,}/}/g > location.json
$ cat location.json 
{"latitude":35.6359322,"longitude":139.8786311}#Confirmez qu'il a été bien formé

Que fais tu ・ Obtenir des informations de localisation ・ Lignes supprimées 4 à 10 (autres que la latitude et la longitude) -Supprimer les sauts de ligne -Supprimer l'espace -Supprimer le dernier "," (virgule) -Enregistrer location.json dans le répertoire courant est. Je pense qu'il est normal d'envoyer toutes les informations telles quelles, mais j'ai coupé les données inutiles afin de réduire le plus possible la quantité de communication.

Ensuite, créez un programme pour publier les informations de localisation. Créez "jsonPub.py" qui est une version modifiée de la dernière partie de "basicPubSub.py", un exemple de fichier dans aws-iot-device-sdk-python. Assurez-vous de charger et de publier location.json, qui contient des informations de localisation.

Avant de modifier

basicPubSub.py (ligne 112 et suivantes)


# Publish to the same topic in a loop forever
loopCount = 0
while True:
    if args.mode == 'both' or args.mode == 'publish':
        message = {}
        message['message'] = args.message
        message['sequence'] = loopCount
        messageJson = json.dumps(message)
        myAWSIoTMQTTClient.publish(topic, messageJson, 1)
        if args.mode == 'publish':
            print('Published topic %s: %s\n' % (topic, messageJson))
        loopCount += 1
    time.sleep(1)

Après l'édition

jsonPub.py (ligne 112 et suivantes)


# Publish to the same topic in a loop forever
with open("location.json", "rb") as load_file:#Lecture du fichier d'informations sur l'emplacement
    location = bytearray(load_file.read())#Convertir en type bytearray pour la transmission MQTT
loopCount = 0
while True:
    if args.mode == 'both' or args.mode == 'publish':
        myAWSIoTMQTTClient.publish(topic, location, 1)#Publier les informations de localisation
        if args.mode == 'publish':
            print('Published topic %s: %s\n' % (topic, location))#Pour confirmation
        loopCount += 1
    time.sleep(1)

Ceci termine la construction côté smartphone.

Paramètres côté AWS

Ensuite, définissez le côté cloud. Cela change simplement la politique.

Dans AWS IoT> Stratégies, ajoutez des rubriques auxquelles vous pouvez publier et vous abonner. Cette fois, j'ai ajouté un sujet nommé "emplacement". Lorsque vous avez terminé les modifications, "Enregistrer comme nouvelle version". Le non-respect de cette consigne entraînera une erreur de connexion.

0.PNG

tester

Accédez à AWS IoT> Tests, entrez le nom de la rubrique (emplacement), puis cliquez sur S'abonner à la rubrique.

1.PNG

Exécutez jsonPub.py dans le terminal. Spécifiez le nom de la rubrique avec l'option -t à la fin de la commande.

python jsonPub.py  -e (Veuillez faire correspondre votre ARN)-ats.iot.ap-northeast-1.amazonaws.com -r root-CA.crt -c android01.cert.pem -k android01.private.key -t location

Confirmez que le message suivant est envoyé au terminal. J'ai pu m'abonner aux informations de localisation publiées par mon smartphone sur AWS à partir d'AWS.


Received a new message: 
b'{"latitude":35.6359322,"longitude":139.8786311}'
from topic: 
location
--------------

De plus, du côté AWS, assurez-vous de vous abonner à la rubrique relative à l'emplacement. 2.PNG

Merci pour votre soutien.

en conclusion

Nous avons créé un environnement pour envoyer les informations de localisation du smartphone à AWS. Ensuite, ce serait bien si vous pouviez utiliser lamda etc. pour vérifier la notification automatique de sortie du bureau et l'heure de départ du train de retour. En passant, soyez assuré que les informations de localisation affichées sur cette page ne sont pas ma maison.

Le fichier créé cette fois est posté sur github. https://github.com/zakuzakuzaki/zaki-aws/tree/main/iot

URL de référence

Merci de votre collaboration.    J'ai essayé de préparer l'environnement de développement sur le terminal Android https://qiita.com/leosuke/items/b83425d5a6730aa4cf94

Créez un référentiel mobile que vous pouvez transporter avec Termux https://wlog.flatlib.jp/item/1859

Lire JSON avec Python https://qiita.com/kikuchiTakuya/items/53990fca06fb9ba1d8a7

Recommended Posts

termux × AWS Envoyez des informations de localisation de smartphone à AWS avec l'IoT
Visualisez les informations de localisation avec Basemap
Envoyer les images prises avec ESP32-WROOM-32 vers AWS (API Gateway → Lambda → S3)
mail html avec image à envoyer avec python
Envoyer du CSS compressé à Gzip avec Flask
Envoyer des données à l'API DRF avec Vue.js
Je veux jouer avec aws avec python
Connectez-vous à s3 avec AWS Lambda Python
Comment utiliser Folium (visualisation des informations de localisation)
Envoyer un message à LINE avec Python (LINE Notify)
Comment envoyer un message à LINE avec curl
Obtenez les dernières informations AMI avec l'AWS CLI
Envoyez un email à l'adresse de Spushi avec python
Envoyer des données depuis Raspberry Pi à l'aide d'AWS IOT
Connectez-vous facilement à AWS avec plusieurs comptes
Exemple de notification Slack avec python lambda
Guidage d'itinéraire vers l'emplacement de photographie iPhone avec Pythonista
Python simulé pour essayer AWS IoT Device Shadow
AWS Step Functions pour apprendre avec un exemple
Premiers pas avec AWS IoT facilement en Python
Envoyer msgpack avec ajax à l'environnement flask (werkzeug)
Script Python pour obtenir des informations de note avec REAPER
Je veux tracer les informations de localisation de GTFS Realtime sur Jupyter! (Avec ballon)