Php ';实时';使用canvasjs绘制图形
我正在尝试使用canvasjs制作一个近乎“实时”的图形。 我使用Raspberry Pi测量数据并将其发送到外部虚拟服务器的数据库 通过RPI,我发送n(从1到无穷大的计数)、napatie(电压、SPI的值)、cas(时间)。这相当慢,因为我每秒只发送1000个样本。只需写入.txt文件而不发送到数据库,我每秒就能获得大约30k个样本。 来自RPI的代码:Php ';实时';使用canvasjs绘制图形,php,c++,mariadb,canvasjs,Php,C++,Mariadb,Canvasjs,我正在尝试使用canvasjs制作一个近乎“实时”的图形。 我使用Raspberry Pi测量数据并将其发送到外部虚拟服务器的数据库 通过RPI,我发送n(从1到无穷大的计数)、napatie(电压、SPI的值)、cas(时间)。这相当慢,因为我每秒只发送1000个样本。只需写入.txt文件而不发送到数据库,我每秒就能获得大约30k个样本。 来自RPI的代码: #include <wiringPi.h> #include <stdio.h> #include <st
#include <wiringPi.h>
#include <stdio.h>
#include <string.h>
#include <wiringPiSPI.h>
#include <iostream>
#include <stdint.h>
#include <stdlib.h>
#include <mariadb/mysql.h>
#include <string>
#include <ctime>
#include <date.h>
using namespace std;
int main(){
using namespace date;
using namespace std::Chrono;
time_t raw time;
struct tm * timeinfo;
char buffer [80];
//CONNECT TO DB
MYSQL *conn;
if ((conn = mysql_init(NULL)) == NULL)
{
fprintf(stderr, "Could not init DB\n");
return EXIT_FAILURE;
}
if (mysql_real_connect(conn, "IP", "name", "pass", "dbname", 0, NULL, 0) == NULL)
{
fprintf(stderr, "DB Connection Error\n");
return EXIT_FAILURE;
}
//READ FROM SPI
wiringPiSPISetup(0,2000000);
int i=1;
wiringPiSetup();
std::time_t now = std::time(0);
while (1){
uint8_t spiData [2] ;
wiringPiSPIDataRW (0, spiData, 2) ;
int MSB_1 = spiData[1];
MSB_1 = MSB_1 >> 1;
int MSB_0 = spiData[0] & 0b00011111;
MSB_0 = MSB_0 << 7;
int a = MSB_1 + MSB_0;
float b = ((5.0 *(float)a)/ 4096.0);
time (&rawtime);
timeinfo = localtime (&rawtime);
strftime (buffer, 80,"%Y-%m-%d %H:%M:%S",timeinfo);
//INSERT TO DB
string query = "INSERT INTO tabulka (n, napatie,cas) VALUES ("+to_string(i)+","+to_string(b)+",'"+buffer+"')";
i++;
if ( mysql_query(conn, query.c_str()) !=0)
{
fprintf(stderr, "Query Failure\n");
return EXIT_FAILURE;
}
delayMicroseconds(10);
}
mysql_close(conn);
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int main(){
使用名称空间日期;
使用名称空间std::Chrono;
时间是原始时间;
结构tm*时间信息;
字符缓冲区[80];
//连接到数据库
MYSQL*康涅狄格州;
if((conn=mysql_init(NULL))==NULL)
{
fprintf(stderr,“无法初始化DB\n”);
返回退出失败;
}
if(mysql\u real\u connect(conn,“IP”,“name”,“pass”,“dbname”,0,NULL,0)=NULL)
{
fprintf(stderr,“数据库连接错误\n”);
返回退出失败;
}
//从SPI读取
接线PIS设置(02000000);
int i=1;
wiringPiSetup();
std::time\u t now=std::time(0);
而(1){
uint8_t spiData[2];
wiringPiSPIDataRW(0,spiData,2);
int MSB_1=spiData[1];
MSB_1=MSB_1>>1;
int MSB_0=spiData[0]&0b00011111;
MSB_0=MSB_0更改代码以收集10个值,生成批插入(insert…values(…),(…),…(…);
),然后发出该查询。这可能会将容量从每秒1K行增加到5K行
事件
是否与插入脚本竞争?也就是说,它们是否接触同一个表?相反,让脚本执行删除
并附加限制1000
如果您可以容忍批处理10个值的延迟,请尝试100;这将运行得更快。还可以调整限制
DELETE
可以每隔10delaymicross(10);
替换一次。这增加了另一个调整
更多理由:
- 由于开销和事务原子性,一次插入100行的速度大约是一次插入1行的速度的10倍(超过100行会导致“收益递减”)
DELETE
删除不同数量的行。当它删除大量行时,它对插入
和选择
的影响更大,可能导致数据中出现明显的空白
- 10秒的延迟比人类的感知速度快得多,以至于如此低的延迟似乎是不合理的
再次,对于人类,考虑将图表冻结在+/-10单位,从而使用户更容易将一页与下一页进行比较。
- 并发送实际时间,以便X轴正确分布,而不是均匀分布。这样,您可以看到间隙,或许可以发现它们遵循的模式
完成大部分工作,然后回来进行更多的评论和调整。更改代码以收集10个值,构建批插入(插入…值(…)、(…)、(…)、(…);
),然后发出该查询。这可能会将您的容量从每秒1K行增加到5K行
事件
是否与插入脚本竞争?也就是说,它们是否接触同一个表?相反,让脚本执行删除
并附加限制1000
如果您可以容忍批处理10个值的延迟,请尝试100;这将运行得更快。还可以调整限制
DELETE
可以每隔10delaymicross(10);
替换一次。这增加了另一个调整
更多理由:
- 由于开销和事务原子性,一次插入100行的速度大约是一次插入1行的速度的10倍(超过100行会导致“收益递减”)
DELETE
删除不同数量的行。当它删除大量行时,它对插入
和选择
的影响更大,可能导致数据中出现明显的空白
- 10秒的延迟比人类的感知速度快得多,以至于如此低的延迟似乎是不合理的
再次,对于人类,考虑将图表冻结在+/-10单位,从而使用户更容易将一页与下一页进行比较。
- 并发送实际时间,以便X轴正确分布,而不是均匀分布。这样,您可以看到间隙,或许可以发现它们遵循的模式
完成大部分工作,然后回来进行更多的评论和调整。请阅读感谢您让我知道。我检查了配置文件并将“显示错误”设置为“关闭”。此外,我还注释了我尝试手动显示连接错误的部分。请阅读感谢您让我知道。我检查了配置文件并将“显示错误”设置为“关闭”我还注释掉了我试图手动显示连接错误的部分。
<?php
//CONNECT TO DB AND READ
$dataPoints = array();
$conn = mysqli_connect('127.0.0.1', 'name', 'pass', 'dbname');
if ($conn->connect_error) {
die("Connection error: " . $conn->connect_error);
}
$result = $conn->query("select n, napatie from hodnoty.tabulka");
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
//$dataPoints[] = $row;
array_push($dataPoints, array("x"=> $row['n'], "y"=> $row['napatie']));
}
}
//MAKE GRAPH
?>
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="refresh" content="1" >
<script>
window.onload = function() {
var dataPoints = <?php echo json_encode($dataPoints, JSON_NUMERIC_CHECK); ?>;
var dataLength = 1000;
var chart = new CanvasJS.Chart("chartContainer", {
theme: "light2",
title: {
text: "NAPATIE NA VSTUPE DO RPI"
},
axisX:{
title: "n [/-]"
},
axisY:{
includeZero: false,
suffix: "U [V]"
},
data: [{
type: "line",
yValueFormatString: "#,##0.0#",
toolTipContent: "{y} Mbps",
dataPoints: dataPoints
}]
});
if (dataPoints.length > dataLength) { // i think this dont work
dataPoints.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>