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

如何基于Node.js OCPP服务器实现移动端远程交易启动与数据获取?

问题解答

1. 从移动端启动远程交易的实现方式

必须通过你自建的OCPP服务器发起——因为充电桩仅与OCPP服务器维持WebSocket连接,移动端无法直接和充电桩通信。具体流程是:

  • 移动端调用你后端的自定义API(比如/start-transaction),携带充电桩ID、用户授权标签、充电接口ID等参数
  • 你的OCPP服务器收到请求后,向对应的充电桩发送OCPP标准的SendRemoteStartTransaction命令

示例代码(基于现有服务器扩展)

首先,在客户端连接时存储充电桩实例,方便后续定位:

// 全局存储已连接的充电桩,key为充电桩的identity标识
const connectedChargers = new Map();

server.on('client', async (client) => {
    console.log(`${client.session.sessionId} connected!`);
    connectedChargers.set(client.identity, client); // 存入Map

    // 保留原有BootNotification、Heartbeat等handle逻辑...

    // 客户端断开时清理存储
    client.on('close', () => {
        connectedChargers.delete(client.identity);
    });
});

然后添加供移动端调用的HTTP接口(以Express为例):

const express = require('express');
const app = express();
app.use(express.json());

// 移动端调用此接口触发远程启动
app.post('/start-transaction', async (req, res) => {
    const { chargerId, connectorId, idTag } = req.body;
    const client = connectedChargers.get(chargerId);

    if (!client) {
        return res.status(404).json({ error: '目标充电桩未连接' });
    }

    try {
        // 发送OCPP远程启动命令
        const response = await client.call('SendRemoteStartTransaction', {
            connectorId: connectorId,
            idTag: idTag
        });
        res.json(response);
    } catch (err) {
        res.status(500).json({ error: err.message });
    }
});

app.listen(3001, () => {
    console.log('移动端API服务启动于3001端口');
});

2. 获取充电桩数据的两种方式

方式一:接收充电桩主动上报的数据

充电桩会主动向OCPP服务器推送状态、计量值、交易事件等数据,你只需要添加对应OCPP方法的处理器即可:

// 在client.handle区域新增以下逻辑
client.handle('MeterValues', ({ params }) => {
    console.log(`充电桩${client.identity}上报计量数据:`, params);
    // 此处可将数据存入数据库或进行业务处理
    return {};
});

client.handle('StartTransaction', ({ params }) => {
    console.log(`充电桩${client.identity}启动充电交易:`, params);
    return {
        idTagInfo: { status: 'Accepted' }
    };
});

client.handle('StopTransaction', ({ params }) => {
    console.log(`充电桩${client.identity}结束充电交易:`, params);
    return {};
});

方式二:主动向充电桩查询数据

如果需要获取充电桩配置、诊断信息等非主动上报的数据,可以调用OCPP的查询类命令:

// 示例:主动查询充电桩配置
async function fetchChargerConfig(chargerId) {
    const client = connectedChargers.get(chargerId);
    if (!client) throw new Error('充电桩未连接');
    
    try {
        // 调用GetConfiguration命令,空数组表示查询全部配置项
        const response = await client.call('GetConfiguration', { key: [] });
        console.log(`充电桩${chargerId}配置信息:`, response);
        return response;
    } catch (err) {
        console.error('查询配置失败:', err);
        throw err;
    }
}

// 暴露HTTP接口供移动端调用查询
app.get('/charger-config/:chargerId', async (req, res) => {
    try {
        const config = await fetchChargerConfig(req.params.chargerId);
        res.json(config);
    } catch (err) {
        res.status(500).json({ error: err.message });
    }
});

参考资源

  • ocpp-rpc库官方示例:库的源码目录中包含了常见OCPP方法的处理和调用示例,可直接参考
  • OCPP 1.6官方规范:详细定义了所有请求/响应方法的参数格式、交互逻辑,是开发的核心依据
  • 社区OCPP开源项目:比如Node.js生态中的ocpp库,提供了完整的服务器、客户端实现示例,可参考其命令调用和事件处理逻辑

内容的提问来源于stack exchange,提问作者Vasu Rangpariya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 00:42:06