JS开发求助:将IoT设备API返回的纯文本转换为JSON
解决IoT设备纯文本属性转JSON并整合到现有服务的方案
1. 核心转换函数
先实现一个纯文本转JSON的工具函数,自动处理键值对和数字类型转换:
function parseDeviceTextToJson(rawText) { return rawText.trim().split('\n').reduce((result, line) => { // 分割每行的键和值,去除前后空格 const [key, valueStr] = line.split('=').map(item => item.trim()); // 尝试把值转为数字,失败则保留原字符串 result[key] = isNaN(Number(valueStr)) ? valueStr : Number(valueStr); return result; }, {}); }
2. 整合到现有项目步骤
第一步:安装HTTP请求库
使用axios发起GET请求,先安装依赖:
npm install axios
第二步:更新设备配置
修改cameras对象,添加每个设备的API地址(根据厂商API实际路径调整):
var ping = require('ping'); const express = require('express'); const axios = require('axios'); // 新增引入 const app = express(); // 更新设备配置,包含IP和API地址 var cameras = { "device_name": { ip: "xx.xx.xx.xx", apiUrl: "http://xx.xx.xx.xx/api/get-attributes" // 替换为实际API地址 }, // 可添加更多设备 "device_office": { ip: "yy.yy.yy.yy", apiUrl: "http://yy.yy.yy.yy/api/get-attributes" } };
第三步:新增获取设备属性的路由
添加新路由获取所有设备的属性(已转换为JSON):
app.get('/camera-properties', async (req, res) => { const response = {}; // 并行请求所有设备的API const requestPromises = Object.entries(cameras).map(async ([deviceName, deviceInfo]) => { try { // 发起GET请求获取纯文本数据 const { data } = await axios.get(deviceInfo.apiUrl); // 转换为JSON格式并存入响应对象 response[deviceName] = parseDeviceTextToJson(data); } catch (err) { // 处理请求失败的情况 response[deviceName] = { error: '无法获取设备属性', details: err.message || '未知错误' }; } }); // 等待所有请求完成 await Promise.all(requestPromises); res.send(response); });
第四步:(可选)整合Ping状态与设备属性
如果需要同时返回设备在线状态和属性,新增综合路由:
app.get('/camera-status', async (req, res) => { const response = {}; const combinedPromises = Object.entries(cameras).map(async ([deviceName, deviceInfo]) => { // 并行执行Ping和属性请求 const [pingResult, attributeResult] = await Promise.all([ ping.promise.probe(deviceInfo.ip, { timeout: 1 }), axios.get(deviceInfo.apiUrl).catch(err => err) ]); // 写入Ping状态 response[deviceName] = { alive: pingResult.alive }; // 处理属性请求结果 if (attributeResult instanceof Error) { response[deviceName].properties = { error: '获取属性失败' }; } else { response[deviceName].properties = parseDeviceTextToJson(attributeResult.data); } }); await Promise.all(combinedPromises); res.send(response); });
3. 保留原Ping路由
你的原/ping路由可以继续保留,也可根据需求合并到上述综合路由中。
内容的提问来源于stack exchange,提问作者Louis
相关产品推荐
相关产品推荐

