#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):
...