问题描述
我正在尝试安装两个不同的先前设计的物联网设备以与 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
...
我是 google 物联网云的新手,并试图了解它的工作原理以及我应该如何设计后端以将我的设备连接到它。
AFAIK 使用 GCP 我失去了使用自定义 mqtt 主题的灵活性,我只能使用四个预定义的主题:
- /devices/my-device/events/
- /devices/my-device/commands/#
- /devices/my-device/config/
- /devices/my-device/state/
我正在尝试将我的“电话”主题映射到“事件”,并使用云函数来解析 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 部署多个功能?
如果我的一些假设是错误的或者我错过了一些东西,请原谅我,因为我对云很陌生
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)