我如何从canvasJS中的php JSON获取更新的值?

问题描述 投票:0回答:1

我一直试图从JSON数组中获取更新的值并将其绘制在canvasJS上。

这是我的传感器1的JSON数组:

[{
    "Date": "2020-01-24 07:35:46",
    "sensorValue": 213
}, {
    "Date": "2020-01-24 07:35:46",
    "sensorValue": 433
}, {
    "Date": "2020-02-10 06:03:36",
    "sensorValue": 321
}, {
    "Date": "2020-02-10 06:03:36",
    "sensorValue": 43
}, {
    "Date": "2020-02-12 03:30:57",
    "sensorValue": 4321
}]

下面是我的index2.php文件

updateChart函数似乎不起作用。我不确定这是否是正确的方法。代码背后的基本原理:我希望每隔几秒钟使用通过php检索的更新值来更新图形。如果没有更新的值,则数组不应更改。因此,for循环和日期比较背后的原因。

<?php
    include 'getsensor.php';
?>
     <!DOCTYPE HTML>
     <html>
     <head>
     <script>
     window.onload = function() {
     <?php
        getSensor();
     ?>

     var updateInterval = 2000;
     var sensor1Data = <?php echo json_encode($json_sensor1, JSON_NUMERIC_CHECK); ?>;
     var sensor2Data = <?php echo json_encode($json_sensor2, JSON_NUMERIC_CHECK); ?>;

    //  sensor datapoints
     var sensor1 = [], sensor2 = [], sensor3 = [], sensor4 = [], sensor5 = [];

     var chart = new CanvasJS.Chart("chartContainer", {
         zoomEnabled: true,
         title: {
             text: "Soil Moisture Reading"
         },
         axisX: {
             title: "chart updates every " + updateInterval / 1000 + " secs"
         },
         axisY:{
             includeZero: false
         }, 
         toolTip: {
             shared: true
         },
         legend: {
             cursor:"pointer",
             verticalAlign: "top",
             fontSize: 22,
             fontColor: "dimGrey",
             itemclick : toggleDataSeries
         },
         data: [{ 
                 type: "line",
                 name: "Sensor 1",
                 dataPoints: sensor1
             },
             {
                 type: "line",
                 name: "Sensor 2",
                 dataPoints: sensor2
             }]
     });

    for(var i = 0; i < sensor1Data.length; i++) {
        sensor1.push({ 
            x: new Date(sensor1Data[i].Date), 
            y: Number(sensor1Data[i].sensorValue)
        })
    }

    for(var i = 0; i < sensor2Data.length; i++) {
        sensor2.push({ 
            x: new Date(sensor2Data[i].Date), 
            y: Number(sensor2Data[i].sensorValue)
        })
    }

     chart.render();
     setInterval(function(){updateChart()}, updateInterval);

     function toggleDataSeries(e) {
         if (typeof(e.dataSeries.visible) === "undefined" || e.dataSeries.visible) {
             e.dataSeries.visible = false;
         }
         else {
             e.dataSeries.visible = true;
         }
         chart.render();
     }

     function updateChart() {
         // retrieves new data from database. updates and shifts the graph.
        <?php
            getSensor();
        ?>
        var sensor1DataNew = <?php echo json_encode($json_sensor1, JSON_NUMERIC_CHECK); ?>;

        var i = sensor1DataNew.length - 1;
        // retrieve the index of the new value
        for (i; i > 0; i--){
            if (sensor1DataNew[i].Date == sensor1Data[19].Date){
                break;
            }
        }

        // pushes the new values to be plotted
        for(i; i < sensor1DataNew.length; i++) {
            sensor1.push({ 
                x: new Date(sensor1DataNew[i].Date), 
                y: Number(sensor1DataNew[i].sensorValue)
            })
        }

        if(sensor1.length > 20){
            sensor1.shift();
        }

        chart.render();
     }

    }
     </script>
     </head>
     <body>
     <div id="chartContainer" style="height: 370px; width: 100%;"></div>
     <script src="https://canvasjs.com/assets/script/canvasjs.min.js"></script>
     </body>
     </html>
javascript php canvasjs
1个回答
0
投票

我无法发表评论,但我认为问题出在加载数据的方式上(或缺少数据)。

基本上,您将数据加载到PHP页面呈现中一次,仅此而已。您需要定期一些ajax请求来加载数据,而不是updateChart方法中的PHP回声。 (在初始化部分就可以了)

$.ajax({ type: "GET", url: 'getSensorData.php', dataType: "text", async: false, success: function(data){ sensor1DataNew = data; } });

类似这样的方法可能会起作用(带有一个小jQuery)

© www.soinside.com 2019 - 2024. All rights reserved.