参考链接

python-ocpp
ocpp v16 文档

一个会话流程

1.清楚你的消息类型 message-type

2.设置你的唯一会话ID message-id

3.清楚你的call所需要的字段 call eg.

call-exp

4.清楚你的call-result所需要的字段 call-result eg.

call-result-exp

BootNotification

req 字段解释

必须携带的参数

  • chargePointModel ChargePoint的model标识
  • chargePointVendor ChargePoint的vendor标识

可选参数

  • chargePointSerialNumber ChargePoint的序列号
  • firmwareVersion ChargePoint的固件版本
  • iccid ICCID of the modem’s SIM card. 参考翻译:modem’s SIM卡的ICCID
  • imsi IMSI of the modem’s SIM card. 参考翻译:modem’s SIM卡的IMSI
  • meterSerialNumber the serial number of the main power meter of the Charge Point. 参考翻译:ChargePoint的主功率表的序列号
  • meterType the type of the main power meter of the Charge Point. 参考翻译:ChargePoint的主功率表的类型
  • chargeBoxSerialNumber 已弃用,将在未来版本中删除

v16-json-官方request说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "BootNotificationRequest",
"type": "object",
"properties": {
"chargePointVendor": {
"type": "string",
"maxLength": 20
},
"chargePointModel": {
"type": "string",
"maxLength": 20
},
"chargePointSerialNumber": {
"type": "string",
"maxLength": 25
},
"chargeBoxSerialNumber": {
"type": "string",
"maxLength": 25
},
"firmwareVersion": {
"type": "string",
"maxLength": 50
},
"iccid": {
"type": "string",
"maxLength": 20
},
"imsi": {
"type": "string",
"maxLength": 20
},
"meterType": {
"type": "string",
"maxLength": 25
},
"meterSerialNumber": {
"type": "string",
"maxLength": 25
}
},
"additionalProperties": false,
"required": [
"chargePointVendor",
"chargePointModel"
]
}

req 例子

1
2
3
4
5
6
7
8
[2,
"19223201",
"BootNotification",
{
"chargePointVendor": "None",
"chargePointModel": "None"
}
]

携带请求头

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
GET /webServices/ocpp/CS3211 HTTP/1.1
Host: some.server.com:33033
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: ocpp1.6, ocpp2.0
Sec-WebSocket-Version: 13

[2,
"19223201",
"BootNotification",
{
"chargePointVendor": "None",
"chargePointModel": "None"
}
]

python websockets ocpp 尝试

server

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import asyncio
import websockets
from datetime import datetime

from ocpp.routing import on
from ocpp.v16 import ChargePoint as cp
from ocpp.v16.enums import Action, RegistrationStatus
from ocpp.v16 import call_result, call

class ChargePoint(cp):
@on(Action.BootNotification)
def on_boot_notitication(self, charge_point_vendor, charge_point_model, **kwargs):
print(charge_point_vendor)
print(charge_point_model)
return call_result.BootNotificationPayload(
current_time=datetime.utcnow().isoformat(),
interval=10,
status=RegistrationStatus.accepted,
)

async def on_connect(websocket, path):
charge_point_id = path.strip('/')
cp = ChargePoint(charge_point_id, websocket)
await cp.start()

async def main():
server = await websockets.serve(
on_connect,
'0.0.0.0',
9000,
subprotocols=['ocpp1.6']
)
await server.wait_closed()


if __name__ == '__main__':
asyncio.run(main())

client

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import json
import asyncio
import websockets

async def boot():
async with websockets.connect('ws://127.0.0.1:9000/exp01/') as websocket:
message = [2,
"20220613001",
"BootNotification",
{
"chargePointVendor": "china",
"chargePointModel": "unknow"
}
]
await websocket.send(json.dumps(message))

result = await websocket.recv()
print(result)
await websocket.close()

asyncio.get_event_loop().run_until_complete(boot())

输出

server

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
china
unknow
connection handler failed
Traceback (most recent call last):
File "C:\Users\R\AppData\Local\Programs\Python\Python37\lib\site-packages\websockets\legacy\server.py", line 232, in handler
await self.ws_handler(self)
File "C:\Users\R\AppData\Local\Programs\Python\Python37\lib\site-packages\websockets\legacy\server.py", line 1149, in _ws_handler
)(websocket, websocket.path)
File "c:\Users\R\Desktop\充电桩\ocpp-test\server.py", line 94, in on_connect
await cp.start()
File "C:\Users\R\AppData\Local\Programs\Python\Python37\lib\site-packages\ocpp\charge_point.py", line 128, in start
message = await self._connection.recv()
File "C:\Users\R\AppData\Local\Programs\Python\Python37\lib\site-packages\websockets\legacy\protocol.py", line 553, in recv
await self.ensure_open()
File "C:\Users\R\AppData\Local\Programs\Python\Python37\lib\site-packages\websockets\legacy\protocol.py", line 930, in ensure_open
raise self.connection_closed_exc()
websockets.exceptions.ConnectionClosedOK: received 1000 (OK); then sent 1000 (OK)

client

1
[3,"20220613001",{"currentTime":"2022-06-13T02:49:13.748448","interval":10,"status":"Accepted"}]