2017-02-28 5 views
0

私のサーバーに接続されているすべてのクライアントにボタン状態を送信する際に問題があります。私はエクスプレスとsocket.ioを使って、ラズベリーパイのホストサーバーから光を入れようとしています。Socket.ioボタンをすべてのクライアントに送信

私はまずクライアントからボタンをクリックすると、ボタンの状態が私のサーバーに送信され、それがすべてのクライアントに送信されます。すべてのクライアントページでボタンをクリックしますが、その後ボタンは無限ループに入ります。クリックし続けます。

私が行っているプロセスは正しいですか?私はすべてのクライアントに放出の例をたくさん見つけることができますが、私はボタンの状態を放出するものを見つけることができません。私もemit.broadcastを試みましたが、2人のクライアントはボタンの状態を無限に送信しました。

誰でもこの問題を解決するための提案はありますか? ありがとう!

サーバーサイドコード:

var express = require('express'); 
var app = express(); 
var server = require('http').createServer(app); 
var io = require('socket.io')(server); 

var onoff = require('onoff'); 
var Gpio = onoff.Gpio; 
var light = new Gpio(13, 'out'); 


app.use(express.static(__dirname + '/')); 
app.get('/', function(req, res,next) { 
res.sendFile(__dirname + '/brew.html'); 
}); 

console.log('Starting Server...'); 

    var io = require('socket.io').listen(server); 
    io.sockets.on('connection', function (client) { 

    client.on('lightOn',function(on){ 
    light.writeSync(1); 
    io.emit('lightOn'); 
    }); 
    client.on('lightOff',function(off){ 
    light.writeSync(0); 
    io.emit('lightOff'); 
    }); 
    }); 

server.listen(3000); 

function lightOn(){ 
light.writeSync(1); 
} 
    function lightOff(){ 
    light.writeSync(0); 
    } 

クライアントコード:

<h3 id="h3Brew">Light</h3> 
    <input type="checkbox" data-toggle="toggle" data-on="Off" data-off="On" id="toggle"> 

    <script> 
    var socket = io.connect(); 
    $(function() { 
    $('#toggle').bootstrapToggle({ 
     on: 'ON', 
     off: 'OFF' 
    }); 
    }) 
     $("#toggle").change(function(){ 
      if($("#toggle").prop("checked") == true){ 
      socket.emit('lightOn', 'on\n'); 
      }else{ 
      socket.emit('lightOff', 'off\n');} 
     }); 

     socket.on('lightOn', function() { 
      $('#toggle').bootstrapToggle('on'); 
     }); 
     socket.on('lightOff', function() { 
      $('#toggle').bootstrapToggle('off'); 
     }); 

    </script> 
+0

私は '$( '#toggle')と思っています。bootstrapToggle( 'on');' #toggle変更イベントをトリガして、基本的には無限ループになります。 – madalinivascu

+0

応答をありがとう。私は間違いなく今問題を見る。あなたはすべてのクライアントにボタンプレスを発行する適切な方法を知っていますか? – pshutt

答えて

0

酔っぱらっおよびユーザー

あなたによってトリガされた1つによってトリガ変更イベントを区別するために、グローバル変数を使用しますこのようなものを試すことができます

var websocket = false; 
$("#toggle").change(function(){ 
     if(!websocket) { 
      if($("#toggle").prop("checked") == true){ 
      socket.emit('lightOn', 'on\n'); 
      }else{ 
      socket.emit('lightOff', 'off\n');} 
     } else {websocket = false;} 
     }); 

     socket.on('lightOn', function() { 
      websocket = true; 
      $('#toggle').bootstrapToggle('on'); 
     }); 
     socket.on('lightOff', function() { 
      websocket = true; 
      $('#toggle').bootstrapToggle('off'); 

     }); 
+1

それは動作します!ありがとう! – pshutt

関連する問題