0

我正在尝试使用 MQTT javascript 发布一些实时值。下面我需要设置正确的 JSON 格式值。在这里,我只能为所有总线发送一个值,但我需要发送单独的总线单独的值。怎么做。

我当前的代码:

var data = {
    Buses: "BusA", "BusB", "BusC",
    Speed: BusA_minspeed + (BusA_maxspeed - BusA_minspeed) * Math.random(), // It should be use seperate values seperate Buses
    FL: BusA_minfl + (BusA_maxfl - BusA_minfl) * Math.random()
};

我的期望:

Buses  Speed FL
BusA    123  80
BusB    231  40
BusC    124  50

我的发布部分

function publishTelemetry() {
    data.Speed = genNextValue(data.Speed, BusA_minspeed, BusA_maxspeed);
    data.FL = genNextValue(data.Fl, BusA_minfl, BusA_maxfl);
    client.publish('v1/devices/me/telemetry', JSON.stringify(data));
}

function genNextValue(prevValue, min, max) {
    var value = prevValue + ((max - min) * (Math.random() - 0.5)) * 0.03;
    value = Math.max(min, Math.min(max, value));
    return Math.round(value * 10) / 10;
}
4

1 回答 1

1

根据您的期望,我看到您应该具有这样的 JSON 结构

data有一个属性Buses,它是以下对象的数组

{
  Name: BUS_NAME,
  Speed: BUSS_SPEED,
  FL: YOUR_FL
} 

JSON

var data = {
  Buses: [{ 
    Name: 'BusA'
    Speed: BusA_minspeed + (BusA_maxspeed - BusA_minspeed) * Math.random(), // It should be use seperate values seperate Buses
    FL: BusA_minfl + (BusA_maxfl - BusA_minfl) * Math.random()
  },{
    Name: 'BusB'
    Speed: BusB_minspeed + (BusB_maxspeed - BusB_minspeed) * Math.random(), // It should be use seperate values seperate Buses
    FL: BusB_minfl + (BusB_maxfl - BusB_minfl) * Math.random()
  },{
    Name: 'BusC'
    Speed: BusC_minspeed + (BusC_maxspeed - BusC_minspeed) * Math.random(), // It should be use seperate values seperate Buses
    FL: BusC_minfl + (BusC_maxfl - BusC_minfl) * Math.random()
  }] 
}

如果您有上述 JSON 结构,您可以发送单独的数据,如下所示

使用以下函数并通过busName获取特定总线的对象

function getBusData(busName){
   return data.buses.filter(function(bus){
      return bus.Name == busName;
  })[0];
}

用法

 var busA_data = getBusData('BusA');

现在,使用应该包含的 busA_data

{ 
    Name: 'BusA'
    Speed: 123,
    FL: 80
}

要发布,您需要使用JSON.stringify以下方式将 JSON 转换为字符串并发布

client.publish(YOUR_BROKER, JSON.stringify(busA_data));

并且您需要在 .on('message', fn) 中执行相反的操作,例如

client.on('message', function (topic, payload) {
  const obj = JSON.parse(payload.toString()) // payload is your JSON as string
})
于 2017-06-02T13:53:50.693 回答