You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 13:45:32