Google cloud functions 移动现有mqtt物联网设备以与Google云协同工作

Google cloud functions 移动现有mqtt物联网设备以与Google云协同工作,google-cloud-functions,mqtt,google-cloud-pubsub,google-cloud-iot,Google Cloud Functions,Mqtt,Google Cloud Pubsub,Google Cloud Iot,我正在尝试安装两个不同的先前设计的物联网设备来与Google cloud配合使用,目前我的设备正在使用自定义mqtt主题发布其遥测,如: 云到设备: /devices/device1/battery/cmnd/stat (gets the status) /devices/device1/battery/cmnd/interval (value on payload) /devices/device1/fan/cmnd/turn (value on payload) 设备到云: /devic

我正在尝试安装两个不同的先前设计的物联网设备来与Google cloud配合使用,目前我的设备正在使用自定义mqtt主题发布其遥测,如:

云到设备:

/devices/device1/battery/cmnd/stat (gets the status)
/devices/device1/battery/cmnd/interval (value on payload)
/devices/device1/fan/cmnd/turn (value on payload)

设备到云:

/devices/device1/heartbeat/tele
/devices/device1/wifi/ip/tele
/devices/device1/wifi/rssi/tele

我是谷歌物联网云的新手,试图了解它是如何工作的,我应该如何设计后端来将我的设备连接到它

如果使用GCP,我将失去使用自定义mqtt主题的灵活性,并且我仅限于使用四个预定义主题:

  • /设备/我的设备/事件/
  • /设备/我的设备/命令/#
  • /设备/我的设备/配置/
  • /设备/我的设备/状态/
我试图将我的“tele”主题映射到“events”,并使用云函数解析json并将数据插入cloudsql数据库

我在物联网核心上创建了如下主题:

并创建了一个云函数:

import base64
import sqlalchemy
from sqlalchemy import update


def device_telemetry_wifi_pubsub(event, context):
    pubsub_message = base64.b64decode(event['data']).decode('utf-8')

db_user = os.environ.get("DB_USER")
db_pass = os.environ.get("DB_PASS")
db_name = os.environ.get("DB_NAME")
cloud_sql_connection_name = os.environ.get("CLOUD_SQL_CONNECTION_NAME")

db = sqlalchemy.create_engine(
    sqlalchemy.engine.url.URL(
        drivername='mysql+pymysql',
        username=db_user,
        password=db_pass,
        database=db_name,
        query={
            'unix_socket': '/cloudsql/{}'.format(cloud_sql_connection_name)
        },
    ),
)

stmt = sqlalchemy.text('INSERT INTO wifistr(wifistr) VALUES (:data)')
try:
    with db.connect() as conn:
        conn.execute(stmt, data=pubsub_message)
    message.ack()
except Exception as e:
    print(e)
我正在使用“projects/{my project}/topics/wifi”主题触发器将接收到的json编码的wifi遥测数据插入数据库,我的计划是用我的设备发送的其余数据重复这个过程……它可以工作,但不确定这是否是我在GCP中尝试做的最好方法

我有几个问题/验证/假设:

  • 我已经看到在创建iot核心注册表时有一个默认遥测主题,如果没有匹配的主题子文件夹,该注册表将发布接收到的所有事件,但我无法找到任何方法来知道当我从云函数处理消息时,哪个mqtt主题生成了消息,对吗
  • 知道哪个主题生成了消息的唯一方法是使用不同的发布/订阅主题和子文件夹,并在该发布/订阅消息队列中收到消息时使用不同的匹配云函数触发
  • 大多数函数与可能的公共代码非常相似,是否可以创建某种库,将我的所有函数都包含在一个文件/代码库中,并使用不同的云函数在该库上调用不同的方法
  • 如果不可能,是否有任何方法可以在一个步骤上从gcloud cli部署多个功能

  • 请原谅,如果我的一些假设是错误的,或者我错过了一些东西,因为我对云事物非常陌生

    关于问题1和2,根据,为了分离来自同一设备的不同数据,您可以使用MQTT/HTTP子文件夹发布/订阅主题,以将遥测事件发布到不同的主题。此外,您还可以阅读更多。关于问题3和问题4,不可能为云功能创建模板,中没有描述此选项。因此,您必须为每个主题声明一个Clooud函数,但正如您所看到的,每个函数的实现可以委托给单个函数。最后,这显示了一个类似的场景,可以让您更好地理解。我分享的这些信息对你有帮助吗?