Welcome to the Pycom forum Forum
    • \[\[global:header.categories\]\]
    • \[\[global:header.recent\]\]
    • \[\[global:header.tags\]\]
    • \[\[global:header.popular\]\]
    • Login

    Explore Pybytes | Official Documentation | Report a Firmware Bug/Issue | GitHub

    Google IoT and MQTT

    Scheduled Pinned Locked Moved Discussion
    3 Posts 2 Posters 240 Views 3 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • P Offline
      panda
      last edited by

      Re: [SiPy](Micropython and Google IoT Core MQTT)

      I was able to make this work. What made this doable is using the new pycom ucrypto library. Previously it would take ~5 minutes to generate a JWT signature. The following repository has what should be placed in /flash/lib

      https://github.com/innoagg/pycom_google_iot

      Next you need to setup your Google IoT registry and download the private key from that process. See these steps:

      https://cloud.google.com/iot/docs/how-tos/mqtt-bridge#downloading_mqtt_server_certificates

      From the steps above you should have created a private key for the device. Place this key in /flash/cert

      Next you must build a configuration file with details from the Google IoT instance. here is an example mqtt_config.py that I used:

      google_cloud_config = {
          'project_id':'XXX',
          'cloud_region':'us-central1',
          'registry_id':'XXX',
          'device_id':'XXX',
          'mqtt_bridge_hostname':'mqtt.googleapis.com',
          'mqtt_bridge_port':8883
      }
      
      jwt_config = {
          'algorithm':'RS256',
          'token_ttl': 43200, #12 hours
          'private_key':""
      }
      
      try:
          log.info("Loading RSA Private Key...")
          with open('/flash/cert/private_key.pem','rb') as f:
              jwt_config['private_key'] = f.read()
              print(jwt_config['private_key'])
          f.close()
          log.info("RSA Private Key Loaded")
      except Exception as e:
          log.error("Error Loading RSA Private Key: {}".format(e))
          jwt_config['private_key']
      

      Finally, use a similar procedure to return an MQTT client:

      import mqtt_config
      import microjwt
      from umqtt.simple import MQTTClient
      import machine
      import time
      from network import WLAN
      from machine import RTC
      import ujson
      
      print("connect wifi")
      
      wlan = WLAN(mode=WLAN.STA)
      wlan.connect("XXX", auth=(WLAN.WPA2, "XXX"), timeout=5000)
      
      while not wlan.isconnected():
          machine.idle()
      
      rtc = RTC()
      rtc.init()
      
      if not rtc.synced():
          rtc.ntp_sync("pool.ntp.org")
          while not rtc.synced():
              print("RTC Syncing...")
              time.sleep_ms(500)
      
      print("RTC Time:{}".format(time.time()))
      
      print(wlan.ifconfig())
      
      print("wifi connected")
      
      def on_message(topic, msg):
         print("Topic:{}  Msg:{}".format(topic, msg))
      
      def get_mqtt_client(project_id, cloud_region, registry_id, device_id, jwt):
          """Create our MQTT client. The client_id is a unique string that identifies
          this device. For Google Cloud IoT Core, it must be in the format below."""
          client_id = 'projects/{}/locations/{}/registries/{}/devices/{}'.format(project_id, cloud_region, registry_id, device_id)
          print('Sending message with password {}'.format(jwt))
          client = MQTTClient(client_id.encode('utf-8'),server=mqtt_config.google_cloud_config['mqtt_bridge_hostname'],port=mqtt_config.google_cloud_config['mqtt_bridge_port'],user=b'unused',password=jwt.encode('utf-8'),ssl=True)
          client.set_callback(on_message)
          client.connect(clean_session=True)
          client.subscribe('/devices/{}/config'.format(device_id), 1)
          client.subscribe('/devices/{}/commands/#'.format(device_id), 1)
          return client
      
      print("generate jwt")
      jwtObj = microjwt.new(mqtt_config.google_cloud_config['project_id'], mqtt_config.jwt_config['private_key'], 'RS256', mqtt_config.jwt_config['token_ttl'])
      jwt = jwtObj.encodedValue()
      
      client = get_mqtt_client(mqtt_config.google_cloud_config['project_id'], mqtt_config.google_cloud_config['cloud_region'], mqtt_config.google_cloud_config['registry_id'], mqtt_config.google_cloud_config['device_id'], jwt)
      
      temp = 0;
      def pub():
          global temp
          temp = temp + 1
          message = {
              "device_id": mqtt_config.google_cloud_config['device_id'],
              "temp": temp
          }
          print("Publishing message "+str(ujson.dumps(message)))
          mqtt_topic = '/devices/{}/{}'.format(mqtt_config.google_cloud_config['device_id'], 'events')
          client.publish(mqtt_topic.encode('utf-8'), ujson.dumps(message).encode('utf-8'))
      
      def checkMessages():
          print("Check Messages...")
          client.check_msg()
          time.sleep(1)
      
      
      1 Reply Last reply Reply Quote 0
      • P Offline
        panda
        last edited by panda

        Also refer to the mqtt library used and included in my repository:

        https://github.com/micropython/micropython-lib/tree/master/umqtt.simple

        1 Reply Last reply Reply Quote 0
        • B Offline
          BetterAuto Pybytes Beta
          last edited by

          Hey @panda are you still out there? What firmware version did you test this on? I can't get any other Google IoT libraries to work due to various firmware bugs and want to try your implementation.

          1 Reply Last reply Reply Quote 0

          Hello! It looks like you're interested in this conversation, but you don't have an account yet.

          Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

          With your input, this post could be even better 💗

          Register Login
          • 1 / 1
          • First post
            Last post

          Pycom on Twitter

          Pycom