这是通过 websocket 解析传入 JSON 并根据消息类型进行响应的正确方法吗?
Is this a correct way to parse incoming JSON over websocket, and respond depending on the type of message?
所以我正在使用 OCPP 1.6 JSON 通过网络套接字从充电点接收 JSON。
我正在尝试解析消息并根据消息内容做出适当的响应,使用 Node.js
这是我收到的消息:
[ 2,
'bc7MRxWrWFnfQzepuhKSsevqXEqheQSqMcu3',
'BootNotification',
{ chargePointVendor: 'AVT-Company',
chargePointModel: 'AVT-Express',
chargePointSerialNumber: 'avt.001.13.1',
chargeBoxSerialNumber: 'avt.001.13.1.01',
firmwareVersion: '0.9.87',
iccid: '',
imsi: '',
meterType: 'AVT NQC-ACDC',
meterSerialNumber: 'avt.001.13.1.01' } ]
在这种情况下,它是 'BootNotification' 消息,我需要用 'Accepted' 消息对其进行响应。
这是我的代码:
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', function connection(ws) {
ws.on('message', function incoming(message) {
//Make incoming JSON into javascript object
var msg = JSON.parse(message)
// Print whole message to console
console.log(msg)
// Print only message type to console. For example BootNotification, Heartbeat etc...
console.log("Message type: " + msg[2])
// Send response depending on what the message type is
if (msg[2] === "BootNotification") {
//Send correct response
} // Add all the message types
});
});
有了这个,我将消息类型作为字符串打印到控制台:
Message type: BootNotification
所以我的问题是,这是获取消息类型的正确方法吗?
我是新手,所以我想确定一下。
OCPP 1.6 JSON 的规范可在此处获得:OpenChargeAlliance website
我想是的。 JSON.parse
是内置的,嗯,pares JSON 字符串。万一出错,它会抛出一个错误,所以你可能 try/catch
这个。
由于您得到的响应是一个数组,因此没有其他方法可以通过数字索引访问其项目。
在这种情况下,我个人更喜欢这样的东西:
const handlers = {
'BootNotification': request => { 'msg': 'what a request' }
};
比你还可以:
let respone = {'msg': 'Cannot handle this'}
if (handlers.hasOwnProperty(msg[2])) {
response = handlers[msg[2]](msg);
}
但这就是我要走的路。
如果您询问的是 OCPP 消息结构(不是解析 JSON),我可以为您提供有关 OCPP 1.6 版本的详细信息。
在 OCPP 1.6 中,客户端(充电站)发送一个CALL(类似在 HTTP 中请求)到服务器(充电站管理系统)。所有 CALL 都具有 4 个元素的严格结构:
- MessageTypeId (整数)
- UniqueId(UUID,字符串)
- 动作 (字符串)
- Payload(JSON 包含与 Action 相关的参数的对象。)
或如您的示例所示:
[
2,
'bc7MRxWrWFnfQzepuhKSsevqXEqheQSqMcu3',
'BootNotification',
{ chargePointVendor: 'AVT-Company',
chargePointModel: 'AVT-Express',
chargePointSerialNumber: 'avt.001.13.1',
chargeBoxSerialNumber: 'avt.001.13.1.01',
firmwareVersion: '0.9.87',
iccid: '',
imsi: '',
meterType: 'AVT NQC-ACDC',
meterSerialNumber: 'avt.001.13.1.01' }
]
因此操作类型应始终位于索引 2(当您在解析收到的消息时检索它)。解析错误的处理方法可以参考@philipp anwser
所以我正在使用 OCPP 1.6 JSON 通过网络套接字从充电点接收 JSON。 我正在尝试解析消息并根据消息内容做出适当的响应,使用 Node.js
这是我收到的消息:
[ 2,
'bc7MRxWrWFnfQzepuhKSsevqXEqheQSqMcu3',
'BootNotification',
{ chargePointVendor: 'AVT-Company',
chargePointModel: 'AVT-Express',
chargePointSerialNumber: 'avt.001.13.1',
chargeBoxSerialNumber: 'avt.001.13.1.01',
firmwareVersion: '0.9.87',
iccid: '',
imsi: '',
meterType: 'AVT NQC-ACDC',
meterSerialNumber: 'avt.001.13.1.01' } ]
在这种情况下,它是 'BootNotification' 消息,我需要用 'Accepted' 消息对其进行响应。
这是我的代码:
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', function connection(ws) {
ws.on('message', function incoming(message) {
//Make incoming JSON into javascript object
var msg = JSON.parse(message)
// Print whole message to console
console.log(msg)
// Print only message type to console. For example BootNotification, Heartbeat etc...
console.log("Message type: " + msg[2])
// Send response depending on what the message type is
if (msg[2] === "BootNotification") {
//Send correct response
} // Add all the message types
});
});
有了这个,我将消息类型作为字符串打印到控制台:
Message type: BootNotification
所以我的问题是,这是获取消息类型的正确方法吗? 我是新手,所以我想确定一下。
OCPP 1.6 JSON 的规范可在此处获得:OpenChargeAlliance website
我想是的。 JSON.parse
是内置的,嗯,pares JSON 字符串。万一出错,它会抛出一个错误,所以你可能 try/catch
这个。
由于您得到的响应是一个数组,因此没有其他方法可以通过数字索引访问其项目。
在这种情况下,我个人更喜欢这样的东西:
const handlers = {
'BootNotification': request => { 'msg': 'what a request' }
};
比你还可以:
let respone = {'msg': 'Cannot handle this'}
if (handlers.hasOwnProperty(msg[2])) {
response = handlers[msg[2]](msg);
}
但这就是我要走的路。
如果您询问的是 OCPP 消息结构(不是解析 JSON),我可以为您提供有关 OCPP 1.6 版本的详细信息。
在 OCPP 1.6 中,客户端(充电站)发送一个CALL(类似在 HTTP 中请求)到服务器(充电站管理系统)。所有 CALL 都具有 4 个元素的严格结构:
- MessageTypeId (整数)
- UniqueId(UUID,字符串)
- 动作 (字符串)
- Payload(JSON 包含与 Action 相关的参数的对象。)
或如您的示例所示:
[
2,
'bc7MRxWrWFnfQzepuhKSsevqXEqheQSqMcu3',
'BootNotification',
{ chargePointVendor: 'AVT-Company',
chargePointModel: 'AVT-Express',
chargePointSerialNumber: 'avt.001.13.1',
chargeBoxSerialNumber: 'avt.001.13.1.01',
firmwareVersion: '0.9.87',
iccid: '',
imsi: '',
meterType: 'AVT NQC-ACDC',
meterSerialNumber: 'avt.001.13.1.01' }
]
因此操作类型应始终位于索引 2(当您在解析收到的消息时检索它)。解析错误的处理方法可以参考@philipp anwser