Node.js 物联网应用:使用 COAP 协议采集和发送温度、湿度、光照度数据
服务端程序:
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();
原文地址: https://www.cveoy.top/t/topic/m9b9 著作权归作者所有。请勿转载和采集!