如何基于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
相关产品推荐
相关产品推荐

