服务端程序:

const coap = require('coap');
const os = require('os');
const dt = require('node-dht-sensor');
const Gpio = require('onoff').Gpio;

const server = coap.createServer();

// 获取本地IP地址
const ifaces = os.networkInterfaces();
let ipAddress = '';
Object.keys(ifaces).forEach(ifname => {
  ifaces[ifname].forEach(iface => {
    if (iface.family !== 'IPv4' || iface.internal !== false) {
      return;
    }
    ipAddress = iface.address;
  });
});

// 创建传感器对象
const sensor = {
  temperature: {
    pin: 17,
    type: 11,
    value: 0
  },
  humidity: {
    pin: 27,
    type: 11,
    value: 0
  },
  light: {
    pin: 4,
    type: 'digital',
    value: 0
  }
};
dt.initialize(sensor.temperature.type, sensor.temperature.pin);
dt.initialize(sensor.humidity.type, sensor.humidity.pin);
const lightSensor = new Gpio(sensor.light.pin, 'in');

// 定时采集数据
setInterval(() => {
  sensor.temperature.value = dt.read(sensor.temperature.type, sensor.temperature.pin).temperature.toFixed(1);
  sensor.humidity.value = dt.read(sensor.humidity.type, sensor.humidity.pin).humidity.toFixed(1);
  sensor.light.value = lightSensor.readSync();
}, 5000);

// 处理请求
server.on('request', (req, res) => {
  console.log(`Received ${req.method} request for ${req.url}`);
  if (req.method !== 'GET') {
    res.statusCode = 405;
    return res.end();
  }
  const url = req.url.split('/');
  if (url.length === 2 && url[1] === 'ip') {
    // 返回本地IP地址
    res.setOption('Content-Format', 'text/plain');
    res.end(ipAddress);
  } else if (url.length === 2 && url[1] === 'temperature') {
    // 返回温度
    res.setOption('Content-Format', 'application/json');
    res.end(JSON.stringify({temperature: sensor.temperature.value}));
  } else if (url.length === 2 && url[1] === 'humidity') {
    // 返回湿度
    res.setOption('Content-Format', 'application/json');
    res.end(JSON.stringify({humidity: sensor.humidity.value}));
  } else if (url.length === 2 && url[1] === 'light') {
    // 返回光照度
    res.setOption('Content-Format', 'application/json');
    res.end(JSON.stringify({light: sensor.light.value}));
  } else {
    res.statusCode = 404;
    res.end();
  }
});

// 启动服务器
server.listen(() => {
  console.log(`Server started at coap://${ipAddress}`);
});

客户端程序:

const coap = require('coap');

// 获取本地IP地址
const reqIp = coap.request('coap://localhost/ip');
reqIp.on('response', resIp => {
  let ipAddress = '';
  resIp.on('data', chunk => {
    ipAddress += chunk;
  });
  resIp.on('end', () => {
    console.log(`Server IP Address: ${ipAddress}`);

    // 定时获取传感器数据
    setInterval(() => {
      // 获取温度
      const reqTemperature = coap.request(`coap://${ipAddress}/temperature`);
      reqTemperature.on('response', resTemperature => {
        resTemperature.on('data', chunk => {
          const data = JSON.parse(chunk);
          console.log(`Temperature: ${data.temperature}°C`);
        });
      });
      reqTemperature.end();

      // 获取湿度
      const reqHumidity = coap.request(`coap://${ipAddress}/humidity`);
      reqHumidity.on('response', resHumidity => {
        resHumidity.on('data', chunk => {
          const data = JSON.parse(chunk);
          console.log(`Humidity: ${data.humidity}%`);
        });
      });
      reqHumidity.end();

      // 获取光照度
      const reqLight = coap.request(`coap://${ipAddress}/light`);
      reqLight.on('response', resLight => {
        resLight.on('data', chunk => {
          const data = JSON.parse(chunk);
          console.log(`Light: ${data.light}`);
        });
      });
      reqLight.end();
    }, 5000);
  });
});
reqIp.end();
Node.js 物联网应用:使用 COAP 协议采集和发送温度、湿度、光照度数据

原文地址: https://www.cveoy.top/t/topic/m9b9 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录