【问题标题】:Storing Pubnub data in mysql在 mysql 中存储 Pubnub 数据
【发布时间】:2020-11-26 13:18:00
【问题描述】:

概念:

通过 pubnub 通道发送 GPS 数据和接近度数据,将它们存储在 mysql 数据库中,然后使用 grafana 监控数据库内容。

目前情况:

我们有 2 个人通过名为“frameData”的 pubnub 频道发布数据,一个发送 GPS 数据,另一个发送接近度数据。 echo 给出了正确的参数,但是它们不会发布到数据库中。谁能帮忙解决这个问题?

代码:

import os
import time
import sys
import datetime
 
import MySQLdb
 
from pubnub.enums import PNStatusCategory
from pubnub.callbacks import SubscribeCallback
from pubnub.pnconfiguration import PNConfiguration
from pubnub.pubnub import PubNub
 

# removed the pub and sub key for the purpose of asking this question
pnconfig = PNConfiguration()
pnconfig.publish_key = "pub-c-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
pnconfig.subscribe_key = "sub-c-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
pubnub = PubNub(pnconfig)
 
CHANNEL = "frameData"
 
database = MySQLdb.connect(host="localhost", user="pi", passwd="raspberry",db="IoTProject")
cursor = database.cursor()
 
FrameID = 1
SerieNummer = "000001"
Longitude = ""
Latitude = ""
isGeladen = ""
Datum=datetime.datetime.now()
 
class MySubscribeCallbackITF(SubscribeCallback):
    def message (self, pubnub, message):
 
        if type(message.message) is list:
 
            Latitude = message.message[0].lstrip("u")
            Longitude = message.message[1].lstrip("u")
            print(Latitude)
            print(Longitude)
            return(Latitude,Longitude)
 
        elif type(message.message) is not  list:
 
            isGeladen = message.message
            print(isGeladen)
            return(isGeladen)

        else:
 
            print("No data available")
 

    def presence(self, pubnub, event):
            print("[PRESENCE: {​​​​}​​​​]".format(event.event))
            print("uuid: {​​​​}​​​​, channel: {​​​​}​​​​".format(event.uuid, event.channel))
 
    def status(self, pubnub, event):
            if event.category == PNStatusCategory.PNConnectedCategory:
                    print("[STATUS: PNConnectedCategory]")
                    print("connected to channels: " + CHANNEL)
 

cursor.execute("INSERT INTO IoTProject(FrameID,SerieNummer,isGeladen,Longitude,Latitude,Datum) VALUES(%s, %s, %s, %s, %s, %s)",(FrameID,SerieNummer,isGeladen,Longitude,Latitude,Datum))
database.commit()
 
print('Listening...')
 
pubnub.add_listener(MySubscribeCallbackITF())
pubnub.subscribe().channels(CHANNEL).execute()

输出: Data that gets placed in the database so far.

【问题讨论】:

  • 您能否提供您的print 语句中的任何日志。如果您可以enable PubNub SDK logging 并复制,那将很有帮助。在message 回调中,您return 是什么?因为这是一个异步调用,所以不应该有任何“返回”的东西。你有任何错误吗?此外,发布者发送消息的速度有多快(消息/分钟)。
  • 当我重新阅读详细信息时,您似乎在message 回调中收到了消息,但消息没有进入您的数据库。同样,cursor.execute 周围报告的任何错误?
  • 我启用了PubNub SDK,下图显示反馈,我删掉了经纬度。你是对的,消息回调的返回现在被删除了。 GPS 模块大约每 5 秒发送一次数据,如果值与之前的值不同,则大约 10 秒发送一次。所以估计 15 条消息/分钟。下面的截图:(没有真正看到如何添加截图作为回复,所以我做了一个图片链接)ibb.co/YtWzpPV@CraigConover
  • 如何在消息回调之外接收 pubnub 数据?所以我可以给它分配一个变量名并用它来写入数据库
  • 这是个好主意!很高兴看到这个。将消息数据保存到消息接收器内部的 MySQL database, you'd but the cursor.execute("INSERT INTO .. ")database.commit()

标签: python mysql iot pubnub


【解决方案1】:

将纬度经度跟踪数据保存到数据库 MySQL

以下示例修改了@Daiter123 原始代码示例的帖子。代码的主要修改是在MySubscribeCallbackITF 类中定义的message 接收器方法中运行cursor.execute("INSERT INTO ... ")database.commit()

import os
import time
import sys
import datetime
import MySQLdb
from pubnub.enums import PNStatusCategory
from pubnub.callbacks import SubscribeCallback
from pubnub.pnconfiguration import PNConfiguration
from pubnub.pubnub import PubNub

pnconfig = PNConfiguration()
pnconfig.publish_key = "pub-c-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
pnconfig.subscribe_key = "sub-c-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
pubnub = PubNub(pnconfig)
 
CHANNEL = "frameData"
 
database = MySQLdb.connect(host="localhost", user="pi", passwd="raspberry", db="IoTProject")
cursor = database.cursor()

FrameID = 1
SerieNummer = "000001"
Longitude = ""
Latitude = ""
isGeladen = ""
Datum=datetime.datetime.now()
 
class MySubscribeCallbackITF(SubscribeCallback):
    def message (self, pubnub, message):
        if type(message.message) is list:
            Latitude    = message.message[0].lstrip("u")
            Longitude   = message.message[1].lstrip("u")
            Datum       = datetime.datetime.now()
            FrameID     = 1
            SerieNummer = "000001"

            print(Latitude)
            print(Longitude)

            ## =-=-=-=-=-=-=-=-=-=-=-=-=-=
            ## Save Data to Database
            ## =-=-=-=-=-=-=-=-=-=-=-=-=-=
            cursor.execute(
                "INSERT INTO IoTProject(FrameID,SerieNummer,isGeladen,Longitude,Latitude,Datum) VALUES (%s, %s, %s, %s, %s, %s)",
                (FrameID,SerieNummer,isGeladen,Longitude,Latitude,Datum))
            database.commit()
 
        elif type(message.message) is not list:
            isGeladen = message.message
            print(isGeladen)

        else:
            print("No data available")
 
    def status(self, pubnub, event):
        if event.category == PNStatusCategory.PNConnectedCategory:
            print("[STATUS: PNConnectedCategory]")
            print("connected to channels: " + CHANNEL)
 
print('Listening...')
pubnub.add_listener(MySubscribeCallbackITF())
pubnub.subscribe().channels(CHANNEL).execute()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多