4

stackoverflowに関する私の最初の投稿。私は、クライアント側のjavascriptとbackbone.jsおよびhighcharts.jsを組み込んで、自宅の再生可能エネルギーシステムからのリアルタイムデータを表示するシステムを開発しています。

Arduinoと呼ばれる小さなマイクロコントローラーを使用して、センサーデータを低レベルで処理します。コントローラには独自のイーサネットハードウェアがあり、小さなサーバーとしてセットアップしています。

クライアント側のプログラムでは、バックボーンをMVCとして使用し、モデルURLがArduinoのIPをポイントしてjsonデータパケットを要求します。うまく機能します。

私が今していることは、そのURLポインターを、SQLテーブルからデータを引き出して同じjson形式で表示するための小さなphpファイルがあるホストされたサイトに移動することです。

ブラウザから、Arduinoコントローラーにjsonデータパケットを要求すると、次のようになります。

<head></head><body><pre>{"vT_pv":234.00,"iT_pv":5.90,"iS_pv":0.00,"vB_pv":27.51}</pre></body>

そして、ブラウザをphpと呼ぶホストされたサイトに向けると、次のようになります。

<head></head><body><pre>{"vT_pv":230.70,"iT_pv":4.90,"iS_pv":0.00,"vB_pv":27.56}</pre></body>

編集:Alexの要求に応じて完全なヘッダーを含めました

どちらも同じように見えますが、クライアント側のJavaScriptでは、データがモデルに正常に配置されて画面に表示できるという点で、最初のJavaScriptのみが実際に機能します。

2つの違いの1つは、ページを調べると、ArduinoがHTTP / 1.0として返されるのに対し、ホストされているサイトから返されるjsonデータはHTTP/1.1であるということです。

これはそのような問題を引き起こすのに十分でしょうか?

以下は、そのjsonのバックボーンモデルです。

PollerModel = Backbone.Model.extend({
//  url:'//xxx.xxx.xxx.xxx/poller.json',    // this one works
    url: 'http://yyy.yyy.yyy.yyy.host_site/sql_get_live.php',    // this one does not

    startUpdate: function() {
        var that = this;
        startUpdate(that);
        function  startUpdate(isThis) {
            that.fetch({async:false});
            pollerUpdateInterval = setTimeout(function(){startUpdate(that);}, 5000);
        };
    },
});

ご覧のとおり、startUpate関数が呼び出されると、5秒ごとに永久に呼び出されます。これが私が望んでいることです。

マイクロコントローラーを指す最初のURLを使用すると、それは魅力のように機能します。2番目のURLを使用すると、リクエストを送信して応答を受け取ることがわかりますが、データには何の影響も与えていないようで、モデルに入れられていません。

したがって、クライアント側のアプリでは、最初のURLはレンダリングされたビューにデータを表示しますが、2番目のURLは表示しません。

以下は、ホストサイトにあるIhaveのphpファイルです。

<?php

//  The JSON standard MIME header.
//  header('content-type: application/json; charset=utf-8');

    $con = mysql_connect('host', 'username', 'password');
    if (!$con) {
        die('mysql connect error: ' .mysql_error());
    }

    mysql_select_db("DataBase", $con);

    $sql_Live = "SELECT * FROM live";
    $mysql_record = mysql_query($sql_Live,$con);

    $row = mysql_fetch_array($mysql_record);
    $jsonData = '{"vT_pv":' . $row['vT_pv'] . ',"iT_pv":' . "4.90" . ',"iS_pv":' . $row['iS_pv'] . ',"vB_pv":' . $row['vB_pv'] . '}';
    echo "<pre >";
    echo $jsonData;
    echo "</pre>";
    mysql_close($con);
?>

コメントアウトされたヘッダーは、形式や結果に違いはありません。私はjsonエンコード機能をさまざまな方法で使用しようとしましたが、すべて成功しませんでした。実際、jsonエンコードを使用すると、非json形式だと思うものが生成されるので、上記の使用方法の形式が正しくフォーマットされていない可能性がありますか?それでも、最初のURLで機能しますか?

私はここで検索して少し行き詰まっていると感じているので、私が尋ねる時が来たと思いました。

ポール

4

2 に答える 2

2

これがヘッダーの問題であることはほぼ間違いありません。

chrome go:view>developer>developer tools>network tab> 次にリロードして左側のパネルからファイルを選択し、「ヘッダータブ」を見て、送信または受信したすべての http ヘッダーを詳細に表示すると、作業できます2 つの結果の違いを示します。

あなたのphpは動作するheader("content-type"...)はずですが、そうでない場合はApacheがPHP header();をオーバーライドしている可能性があります。その場合は、ファイルのコンテンツ タイプを変更するか、httpd.conf で .php ファイル.htaccessの属性を削除してください。content-type text/html

于 2012-12-16T07:03:58.147 に答える
1

あなたのPHPでは、これをやっています:

echo "<pre >";
echo $jsonData;
echo "</pre>";

$jsonData有効な JSON のように見えますが<pre>$jsonData</pre>、JSON にはならず、HTML でラップされた JSON になります。echo $jsonData;ラッパーを使わなくても<pre>、JavaScript で適切な結果を得ることができるはずです。Content-Type: application/jsonヘッダーも含めます。

于 2012-12-16T04:58:33.763 に答える