[PYTHON] [MQTT] J'ai essayé de parler avec un appareil utilisant AWS IoT Core et Soracom Beam.

introduction

La raison de la mise en œuvre de cette architecture est qu'il existe déjà un mécanisme pour notifier l'appareil à l'aide de SMS, mais il est difficile d'enquêter en raison de l'instabilité de la communication et de l'utilisation des services d'autres entreprises. Il y avait un problème. L'objectif est donc de le stabiliser en le rendant gérable à l'aide de MQTT.

Exigences

Technologie utilisée

--AWS IoT Core (ci-après IoT Core) --SORACOM Poutre (ci-après Poutre)

Contenu

Préparation préalable

  1. Paramètres IoT Core et Beam

Tout d'abord, configurez IoT Core et Beam.

Veuillez vous référer au guide SORACOM car il est très simple à comprendre. Si vous suivez la procédure, vous ne ferez pas d'erreur.

https://dev.soracom.io/jp/docs/aws_iot_guide_console/

Une fois terminé, vous pourrez communiquer avec le côté appareil via IoT Core.

  1. Paramètres SIM Obtenez imsi de SIM en code python et utilisez-le comme nom de sujet. Pour ce faire, vous devez activer "Paramètres du service de métadonnées".

Veuillez vous référer à ce qui suit pour la méthode de réglage https://dev.soracom.io/jp/start/metadata/

La mise en oeuvre! !!

  1. Exécutez le python suivant dans l'appareil IoT
  2. Publier le message du test IoT Core
  3. Il réussit s'il est émis vers la console ou redémarré.

mqtt_sub.py


# -*- coding: utf-8 -*-
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient
import time
import json
import subprocess
import requests

SORACOM_METADATA_URL = 'http://metadata.soracom.io/v1/subscriber'

def get_imsi(self):
    """get IMSI from SORACOM API"""
    subscriber = json.loads(requests.get(SORACOM_METADATA_URL).text)
    return subscriber["imsi"]

#Sera exécuté à l'arrivée de MQTT
def customCallback(client, userdata, message):
    message = json.loads(message.payload)["message"]
    if message == "REBOOT":
        reboot = "sudo reboot"
        subprocess.call(reboot, shell=True)
    else:
        print(message)
        pass


def main():
    try:
        #L'identifiant du client. Tout va bien cette fois.
        mqttClient = AWSIoTMQTTClient('aws_iot_sub')

        #Paramètres de l'hôte de communication. Définition de l'extrémité de la poutre.
        mqttClient.configureEndpoint('beam.soracom.io', 1883)

        #C'est le paramètre lorsque vous vous déconnectez.
        # configureOfflinePublishQueueing(queueSize, dropBehavior=DROP_NEWEST)
        # queueSize:1 ou plus...la taille de la file d'attente est définie sur la valeur de l'argument
        # queueSize: 0 ...file d'attente invalide
        # queueSize: -1 ...taille de file d'attente illimitée
        # dropBehavior:Définition lorsque la file d'attente devient pleine DROP si elle n'est pas définie_NEWEST
        mqttClient.configureOfflinePublishQueueing(0)

        #Fréquence d'exécution
        mqttClient.configureDrainingFrequency(2)  # Hz

        #délai d'expiration du client
        mqttClient.configureConnectDisconnectTimeout(10)  # sec

        #Délai d'expiration pour QoS 1
        mqttClient.configureMQTTOperationTimeout(5)  # sec

        #Connexion avec IoT Core
        #Vous pouvez également définir keepalive. La valeur par défaut est 600 secondes
        mqttClient.connect()

        imsi = get_imsi()

    except Exception as err:
        print(err)

    #Si l'onde radio est mauvaise, l'abonnement sera une exception et python tombera, alors essayez/Boucle avec sauf
    #La raison pour laquelle err of except n'est pas sorti est que le message n'est pas renvoyé par Exception of subcribe, donc même s'il est sorti, il sera vide.
    #Le nom du sujet doit être imsi afin que seul l'environnement dans lequel il s'exécute puisse être abonné.
    while True:
        try:
            mqttClient.subscribe(str(imsi), 1, customCallback)
            time.sleep(1)
        except Exception as err:
            pass

if __name__ == "__main__":
    main()

Résumé

Cette fois, j'ai introduit uniquement le redémarrage, mais il est possible d'exécuter divers processus en exécutant sh. L'article publié le 5ème jour du calendrier de l'Avent 2019, que cet article a enregistré, faisait quelque chose d'intéressant, donc je pense que ce sera utile. Je veux essayer...

J'ai utilisé le SDK AWSIoTPython, mais j'ai également pu communiquer avec Beam en utilisant paho. Avec cette exigence, il n'y a guère d'intérêt à utiliser le SDK, et je pense que le SDK sera plus utile lors de l'exploitation des ombres au lieu d'utiliser IoT Core en tant que courtier. Cependant, comme paho fonctionne en interne, nous avons adopté un SDK spécialisé pour AWS.

Si vous savez s'il existe un autre bon moyen, faites-le moi savoir.

Recommended Posts

[MQTT] J'ai essayé de parler avec un appareil utilisant AWS IoT Core et Soracom Beam.
[Introduction à AWS] J'ai essayé de porter une application de conversation et de jouer avec text2speech @ AWS ♪
J'ai essayé AWS Iot
J'ai essayé d'utiliser AWS Chalice
[AWS / Tello] J'ai essayé de faire fonctionner le drone avec ma voix Part2
J'ai essayé de déverrouiller l'entrée 2 lock sésame d'une simple pression sur le bouton AWS IoT
J'ai essayé d'utiliser PyEZ et JSNAPy. Partie 4: Automatisez la configuration du FAI avec PyEZ et JSNAPy
[AWS / Tello] J'ai essayé de faire fonctionner le drone avec ma voix Part1
J'ai essayé d'utiliser l'API checkio
J'ai essayé d'exprimer de la tristesse et de la joie face au problème du mariage stable.
J'ai essayé de convertir la chaîne datetime <-> avec tzinfo en utilisant strftime () et strptime ()
J'ai essayé d'apprendre l'angle du péché et du cos avec le chainer
J'ai essayé d'extraire et d'illustrer l'étape de l'histoire à l'aide de COTOHA
J'ai essayé de mettre à jour le calendrier Google avec des rendez-vous CSV à l'aide de Python et de l'API Google
J'ai essayé de contrôler la bande passante et le délai du réseau avec la commande tc
J'ai essayé d'utiliser Amazon SQS avec django-celery
J'ai essayé d'utiliser du sélénium avec du chrome sans tête
Surveillance active des appareils AWS IoT
J'ai essayé de jouer avec l'image avec Pillow
J'ai essayé d'utiliser l'API BigQuery Storage
J'ai essayé de notifier la mise à jour de "Hameln" en utilisant "Beautiful Soup" et "IFTTT"
J'ai essayé Hello World avec un langage OS + C 64 bits sans utiliser de bibliothèque
J'ai essayé de créer un environnement à vérifier régulièrement en utilisant Selenium avec AWS Fargate
L'histoire de la fabrication de soracom_exporter (j'ai essayé de surveiller SORACOM Air avec Prometheus)
J'ai essayé d'utiliser PyEZ et JSNAPy. Partie 1: Aperçu
J'ai essayé de "lisser" l'image avec Python + OpenCV
J'ai essayé d'utiliser l'API Detect Labels d'AWS Rekognition
vprof - J'ai essayé d'utiliser le profileur pour Python
J'ai essayé le web scraping en utilisant python et sélénium
J'ai essayé de "différencier" l'image avec Python + OpenCV
J'ai essayé de sauvegarder les données avec discorde
J'ai essayé d'utiliser PyCaret à la vitesse la plus rapide
J'ai essayé d'utiliser l'API Google Cloud Vision
J'ai essayé la différenciation jacobienne et partielle avec python
J'ai essayé la synthèse de fonctions et le curry avec python
J'ai essayé de "binariser" l'image avec Python + OpenCV
J'ai essayé d'utiliser le module Datetime de Python
J'ai essayé de connecter AWS Lambda à d'autres services
J'ai essayé d'utiliser le filtre d'image d'OpenCV
J'ai essayé DBM avec Pylearn 2 en utilisant des données artificielles
J'ai essayé d'utiliser la bibliothèque de programmation fonctionnelle toolz
J'ai essayé d'utiliser la base de données (sqlite3) avec kivy
J'ai essayé de jouer avec la calculatrice avec tkinter
J'ai essayé de notifier la mise à jour de "Devenir romancier" en utilisant "IFTTT" et "Devenir un romancier API"
J'ai essayé de noter la syntaxe trop humoristique et humoristique en utilisant l'API COTOHA.
J'ai essayé de comparer la vitesse de traitement avec dplyr de R et pandas de Python
J'ai essayé d'entraîner la fonction péché avec chainer
J'ai essayé de lire et d'enregistrer automatiquement avec VOICEROID2 2
J'ai essayé d'implémenter et d'apprendre DCGAN avec PyTorch
J'ai essayé d'exécuter l'application sur la plateforme IoT "Rimotte"
[AWS IoT] Enregistrer des éléments dans AWS IoT à l'aide du SDK AWS IoT Python
J'ai fait une analyse émotionnelle d'Amazon Comprehend avec l'AWS CLI.
J'ai essayé de toucher un fichier CSV avec Python
J'ai essayé de résoudre Soma Cube avec python
[Linux] J'ai essayé d'utiliser le logiciel de statistiques génétiques PLINK
J'ai essayé de regrouper les données ECG en utilisant la méthode K-Shape
J'ai essayé d'obtenir une AMI en utilisant AWS Lambda
J'ai essayé d'approcher la fonction sin en utilisant le chainer