Webソケットを使用してシリアルポートからデータを読み取り、ブラウザにデータを表示するnode.jsサーバースクリプトがあります。サーバー スクリプトは、ブラウザにリアルタイム データを正しく表示するため、まったく問題ありません。これは、Websocket も正しく機能していることも意味します。実際の問題は、Flot を使用してリアルタイム チャートを表示し、データを視覚化しようとしたときに始まります。サーバーがエラー メッセージをスローします - デバッグ - 静的コンテンツ /socket.io.js を提供しました
これが私のサーバーのコードです:
// It captures data from serial port and displays it in web page.
var http = require('http').createServer(handler);
var io = require('socket.io').listen(http);
var sys = require('sys');
var fs = require('fs');
var clients = [];
http.listen(8000);
var SerialPort = require('serialport2').SerialPort;
var portName = 'COM10';
var sp = new SerialPort(); // instantiate the serial port.
sp.open(portName, { // portName is instatiated to be COM3, replace as necessary
baudRate: 9600, // this is synced to what was set for the Arduino Code
dataBits: 8, // this is the default for Arduino serial communication
parity: 'none', // this is the default for Arduino serial communication
stopBits: 1, // this is the default for Arduino serial communication
flowControl: false // this is the default for Arduino serial communication
});
function handler(request, response) {
response.writeHead(200, {
'Content-Type':'text/html'
});
var rs = fs.createReadStream(__dirname + '/template2.htm');
sys.pump(rs, response);
};
var buffer ; //contains raw data
var dataStore = "" ; // To hold the string
io.sockets.on('connection', function(socket) {
var username;
clients.push(socket);
socket.emit('welcome', {'salutation':'TMP36 Sensor output!'});
sp.on('data', function (data) { // call back when data is received
buffer = data.toString();
// check for end character in buffer
for(i=0; i<buffer.length; i++)
{
if(buffer[i] != "N")
{
//store it in data
dataStore = dataStore + buffer[i];
}
if(buffer[i] == "N")
{
//spit the data
//console.log(dataStore);
//socket.emit('data', {'salutation':dataStore});
socket.emit('data', dataStore);
// //initialize data to null
dataStore = "";
}
}
});
});
以下は、Flot を使用してリアルタイム チャートを表示しようとするクライアント コードです。
<!DOCTYPE html>
<html lang='en'>
<head>
<title>Chat</title>
<link type="text/css" href="/css/smoothness/jquery-ui-1.8.20.custom.css" rel="Stylesheet" />
<script type='text/javascript'
src='http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js'></script>
<script language="javascript" type="text/javascript" src="../3rdParty/flot/jquery.js"></script>
<script language="javascript" type="text/javascript" src="../3rdParty/flot/jquery.flot.js"></script>
<script src="//localhost:8000/socket.io/socket.io.js"></script>
<script type="text/javascript">
$(function () {
// Initialize Flot data points
var totalPoints = 300;
var res = [];
function getInitData() {
// zip the generated y values with the x values
for (var i = 0; i < totalPoints; ++i){
res.push([i, 0]);
}
return res;
}
// Options for Flot plot
var options = {
series: { shadowSize: 0 }, // drawing is faster without shadows
yaxis: { min: 0, max: 100 },
xaxis: { show: false }
};
var plot = $.plot($("#placeholder"), [ getInitData() ], options);
// Update the JQuery UI Progress Bar
$( "#progressbar" ).progressbar({
value: 0
});
//var socket = io.connect();
//var socket = io.connect('http://localhost:8000');
//var socket = io.connect(document.location.href);
var socket = io.connect('http://10.0.0.2:8000');
//This block is executed when data is received from server
socket.on('data', function(msg) {
// Put sensor value to the 'sensor_value' span
//var val = data.salutation;
var val = msg;
$('#sensor_value').html(val);
// Push new value to Flot Plot
res.push([totalPoints, val]); // push on the end side
res.shift(); // remove first value to maintain 300 points
// reinitialize the x axis data points to 0 to 299.
for (i=0;i<totalPoints;i++) { res[i][0] = i; }
// Redraw the plot
plot.setData([ res ]);
plot.draw();
// Update JQuery UI progress bar.
$( "#progressbar" ).progressbar({
value: val
});
});
});
</script>
</head>
<body>
<h1>Temperature Monitor</h1>
<div role="main">
Potentiometer Value: <span id="sensor_value"></span><br/>
<div id="progressbar" style="width:600px;height:50px;"></div><br/>
Graph:<br/>
<div id="placeholder" style="width:600px;height:300px;"></div><br/>
</body>
</html>
私のセットアップで flot が機能しない理由を誰か助けてもらえますか? また、Windows 7 である同じマシンでサーバーとクライアントを実行しています。
Chrome デバッガーでは、次のメッセージが表示されました。
Resource interpreted as Script but transferred with MIME type text/html: "http://localhost:8000/3rdParty/flot/jquery.js". :8000/:6
Resource interpreted as Script but transferred with MIME type text/html: "http://localhost:8000/3rdParty/flot/jquery.flot.js". :8000/:6
Resource interpreted as Stylesheet but transferred with MIME type text/html: "http://localhost:8000/css/smoothness/jquery-ui-1.8.20.custom.css". localhost:5
Uncaught SyntaxError: Unexpected token < jquery.js:2
Uncaught SyntaxError: Unexpected token < jquery.flot.js:2
Uncaught TypeError: Object function (i,r){return new b.fn.init(i,r)} has no method 'plot' localhost:31
どんな助けでも非常に高く評価されます。
乾杯 !アン