【问题标题】:How to show raspberrypi sensor data in react using nodejs and socketio如何使用nodejs和socket io在反应中显示树莓派传感器数据
【发布时间】:2022-02-09 04:50:20
【问题描述】:

我想显示一些来自树莓派的传感器数据(使用 python socketio)作为前端反应,我使用 nodejs 作为后端。数据当前显示在控制台(nodejs)中,但我似乎无法弄清楚它将如何在反应中显示。很抱歉这个基本问题,但我似乎找不到合理的方法来实现这个。这是我的树莓派、节点和反应代码。

#raspberrypi code
import asyncio
import socketio

sio = socketio.AsyncClient()

@sio.event
async def connect():
    print('connection established')

@sio.event
async def message(data):
    print('message received with ', data)
    await sio.emit('fromAPI', {'msgFromPy': 'my response'})

@sio.event
async def disconnect():
    print('disconnected from server')

async def main():
    await sio.connect('http://localhost:5000')
    await sio.wait()

if __name__ == '__main__':
    asyncio.run(main())

Nodejs 代码

const io = require("socket.io")(5000);


io.on("connection", socket => {
  // either with send()
  console.log('Connected');
  socket.send("Hello!");

  // handle the event sent with socket.send()
  socket.on("fromAPI", (data) => {
    console.log(data);
    socket.emit("fromAPI", data);
    
  });

     });
});

下面是反应代码

import React, { useState, useEffect } from "react";
import socketIOClient from "socket.io-client";
const ENDPOINT = "http://localhost:5000";

function App() {

  const [response, setResponse] = useState("");

  useEffect(() => {
    const socket = socketIOClient(ENDPOINT);
    socket.on("fromAPI", data => {
      setResponse(data);
    });
  }, []);

  return (
    <p>
      It's {response.msgFromPy}
    </p>
  );

}

export default App;

我应该怎么做才能在反应中显示来自节点的数据。我的反应也没有任何错误。感谢您的帮助

【问题讨论】:

    标签: python node.js reactjs socket.io raspberry-pi


    【解决方案1】:

    我使用 websockets 解决了整个问题。制作了两个 nodejs websocket 服务器。一个通过端口 5000 连接到树莓派,另一个通过端口 4001 连接到响应。下面给出了 raspberrypi python、nodejs 服务器和响应客户端的代码。 rpi 码:

    import asyncio
    import socketio
    import random
    import time
    
    sio = socketio.AsyncClient()
    
    @sio.event
    async def connect():
        print('connection established')
    
    @sio.event
    async def message(data):
        print('message received with ', data)
        while True:
            await sio.emit('fromAPI', {"id": 1, "Temprature" : random.randint(0,9), "Humidity": random.randint(0,9)})
            await sio.sleep(3)
            
    
    @sio.on('my_message')
    async def on_message(data):
        #while True:
        print('I received a message!', data)
        await sio.sleep(1)
            
    
    @sio.event
    async def disconnect():
        print('disconnected from server')
    
    async def main():
        await sio.connect('http://localhost:5000')
        await sio.wait()
        loop = asyncio.get_event_loop()
        try:
            asyncio.ensure_future(message(data))
            asyncio.ensure_future(on_message(data))
            loop.run_forever()
        except KeyboardInterrupt:
            pass
        finally:
            print("closing thread")
            loop.close()
    
    if __name__ == '__main__':
        asyncio.run(main())
    

    nodejs代码:

    const io = require("socket.io")(5000);
    const io1 = require("socket.io")(4001);
    
    
    let interval;
    let dataFromReact;
    
    io.on("connection", (socket) => {
      io1.on("connection", (socket1) => { 
        socket1.on("rcvdFromReact", data1 => { 
          dataFromReact = data1;
          socket.emit("my_message", data1);
        });
      });
    });
    
        
        
    io.on("connection", socket => {
      socket.send("hello");
      io1.on("connection", socket1 => {
      // either with send()
      console.log('Connected');
      socket.on("fromAPI", (data) => {
        console.log(data);
       socket1.emit("fromNodejs", data);
    
      });
     });
    });
    

    反应代码(App.js):

    import React, { useState, useEffect } from "react";
    import socketIOClient from "socket.io-client";
    const ENDPOINT = "http://localhost:4001";
    
    function App() {
    
    
      const [response, setResponse] = useState("");
      const [title, setTitle] = useState('')
    
      
      const handleSubmit = (e) => {
        e.preventDefault();
        var temps = e.target.temp.value;
        var humids = e.target.humid.value;
        console.log(temps + humids);
        setTitle(temps);
        const socket = socketIOClient(ENDPOINT);
        socket.emit("rcvdFromReact", temps);
        console.log("Temprature is " + temps);
      }
    
      useEffect(() => {
        const socket = socketIOClient(ENDPOINT);
        socket.on("fromNodejs", data => {
          setResponse(data);
          console.log(data);
          //console.log("Temprature is " + temps);
        });
      }, []);
    
      return (
        <div>
        <p>
          It's {response.Temprature} and {response.Humidity}
        </p>
        <form onSubmit={handleSubmit}>
        <input placeholder = "Temprature" name = "temp"  /> 
        <input placeholder = "Humidity" name = "humid"  /> 
        <button>Click Me</button>
        </form>
        </div>
      );
    
    }
    
    export default App;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-14
      • 2018-04-16
      • 2022-11-02
      • 2020-06-29
      • 2017-10-26
      相关资源
      最近更新 更多