基于PyPi OCPP v1.6J的模拟器接收TriggerMessage时触发错误
解决OCPP模拟器无法接收TriggerMessage请求的问题
我来帮你排查这个问题,从错误信息和代码片段来看,有两个核心问题导致了当前的报错:
1. 参数命名不匹配(拼写+格式错误)
PyOCPP库在处理请求时,会自动将Payload中的驼峰命名字段(比如requestedMessage、connectorId)转换为蛇形命名(requested_message、connector_id)。但你的处理函数存在两个问题:
- 参数名用了驼峰格式(
requestedMessage),和库转换后的蛇形名不匹配; - 拼写错误:把
connectorId写成了conectorId(少了一个字母n)。
这就导致库在传递参数时,找不到对应的函数参数,抛出missing required positional arguments的错误。
2. 无效的双重Return语句
你的函数里写了两个return语句:第一个return call.TriggerMessagePayload(...)会直接终止函数执行,后面返回响应的return call_result.TriggerMessagePayload(...)永远不会被执行,这会导致无法正确返回TriggerMessage的处理结果。
修正后的代码
from ocpp.v16 import call_result from ocpp.v16.enums import Action, TriggerMessageStatus class ChargePoint(cp): @on(Action.TriggerMessage) def on_trigger_message(self, requested_message, connector_id=None, **kwargs): # 在这里添加触发对应消息的逻辑,比如触发Heartbeat # 示例:如果请求的是Heartbeat,发送Heartbeat消息 if requested_message == "Heartbeat": # 调用你已实现的Heartbeat发送方法,比如: # await self.send_heartbeat() pass # 返回正确的TriggerMessage响应 return call_result.TriggerMessagePayload( status=TriggerMessageStatus.accepted )
关键修正点说明
- 参数命名修正:将参数改为蛇形命名
requested_message和connector_id,和库的自动转换规则匹配;给connector_id设置默认值None,因为OCPP 1.6J中该字段是可选的; - 移除无效Return:只保留返回处理结果的
return语句,确保CMS能收到accepted的响应; - 添加业务逻辑:在函数中加入触发对应消息的代码(比如发送Heartbeat),完成TriggerMessage的核心功能。
内容的提问来源于stack exchange,提问作者vijayakumar sargunam
相关产品推荐
相关产品推荐

