публикация различной полезной нагрузки в другой теме mqtt с использованием paho mqtt

#python #mqtt #paho

Вопрос:

Я написал сценарий симулятора python для отправки данных в несколько разделов python, но когда я отправляю данные, то публикую данные только в первую тему, а не в другие темы, приведенные ниже, — это код .

 from time import sleep
from datetime import datetime
import time

from random import randint
from random import seed
#from random import random
import random,json
import paho.mqtt.publish as publish

energy_utilization=''
energy_utilization=''
asset_workdone=''
asset_tracking=''

gateway_id1=1
gateway_id2=2
gateway_id3=3



currentTime_timestamp = time.time() - 36000
time_incr=900
incr_range=900

seed(3)
for _ in range(1200):
    
      #helth
    engineoiltemp_c_1234=randint(44, 50)
    hydraulicoiltemp_c_1234= randint(50, 58)
   
    
     #util
    fuelconsumed_ltr_1234= randint(1, 6)
    
    #workdone:
    load_kg_1234= randint(1000, 1400)
    cyclecount_1234= randint(1,3)
    
    
    # # for tracking
    weather_c_1234= randint(30, 45)
   

    ##########for Asset:
    #seed(2)
    engineoiltemp_c_5618=randint(44, 55)
    hydraulicoiltemp_c_5618= randint(48, 58)
    
   
    fuelconsumed_ltr_5618= randint(1, 5)
    
    #workdone:
    load_kg_5618= randint(1200, 1600)
    cyclecount_5618= randint(1,3)  
    
   
    # # for tracking
    weather_c_5618= randint(35, 42)
   

    time_incr =incr_range
    ct_ts = currentTime_timestamp
    nextTime = ct_ts   time_incr
    timestamp= str(datetime.fromtimestamp(nextTime).strftime("%Y-%m-%d %H:%M:%S"))
    energy_health = [ 
    {"gateway_id":  gateway_id2,"engineoiltemp_c":engineoiltemp_c_5618,"hydraulicoiltemp_c":hydraulicoiltemp_c_5618 ,"timestamp": timestamp},
    
    {"gateway_id":gateway_id1,"engineoiltemp_c":engineoiltemp_c_1234,"hydraulicoiltemp_c":hydraulicoiltemp_c_1234 ,"timestamp": timestamp}, 
        
    {"gateway_id":gateway_id3, "engineoiltemp_c":0,"hydraulicoiltemp_c":0,  "timestamp":timestamp} 
    ] 

    energy_utilization = [ 
    {"gateway_id": gateway_id2,"fuelconsumed_ltr":fuelconsumed_ltr_5618,"timestamp": timestamp },
    
    {"gateway_id":gateway_id1,"fuelconsumed_ltr":fuelconsumed_ltr_1234,"timestamp":timestamp } ] 
        
    asset_workdone =[ 
    {"gateway_id":gateway_id1,   
    "enginestatus":1,"timestamp": timestamp,"load_kg":load_kg_1234,"cyclecount":cyclecount_1234 },
    
    {"gateway_id":gateway_id2,"timestamp":timestamp,"load_kg":load_kg_5618,"cyclecount":cyclecount_5618}]
        
    asset_tracking =[ 
    {"gateway_id":gateway_id2,"weather_c":weather_c_5618,"timestamp":timestamp},
    
    {"gateway_id":gateway_id1,"weather_c":weather_c_1234,"timestamp": timestamp}, 
    
    {"gateway_id":gateway_id3,"weather_c":35.5,"timestamp":timestamp} ] 

    print(energy_health)
    print(energy_utilization)
    print(asset_workdone)
    print(asset_tracking)

    import paho.mqtt.client as mqtt #import the client1
    broker_address="XXXXXXX"
    
    client = mqtt.Client("P1") #create new instance
    client.connect(broker_address) #connect to broker
    for i in energy_health:
        client.publish("UB/RA/Ex/EnergyHealth", json.dumps(i).encode('utf-8'))#publish
        print("msg publish to energyhealth")
    for j in energy_utilization:    
        client.publish("UB/RA/Ex/EnergyUtilization", json.dumps(j).encode('utf-8'))#publish
        print("msg publish to energyutili")
    for k in asset_workdone:    
        client.publish("UB/RA/Ex/Asset_WD_Productivity", json.dumps(k).encode('utf-8'))
        print("msg publish to workdone")
    for l in asset_tracking:       
        client.publish("UB/RA/Ex/AssetTracking", json.dumps(l).encode('utf-8'))
        print("msg publish to tracking")

    sleep(1)

    print('***************************************************************************************************************')
    print('n n') 
 

пожалуйста, помогите мне, в чем я ошибаюсь в этом коде.и почему он записывает данные только в тему energyhealth, а не в другие

Комментарии:

1. Где вы запустили цикл клиента MQTT?

2. Если я что-то пропустил, пожалуйста, предложите, где мне нужно добавить цикл, потому что с помощью этого кода я могу передавать данные только в первую тему .

Ответ №1:

Вам нужно переместить все настройки клиента MQTT за пределы первого цикла, чтобы он вызывался только один раз, а также запустить сетевой цикл клиента в отдельном потоке:

 import paho.mqtt.client as mqtt #import the client1

...
broker_address="XXXXXXX"

client = mqtt.Client("P1") #create new instance
client.connect(broker_address) #connect to broker
client.loop_start()

seed(3)
for _ in range(1200):
...