认证
认证报文如下:
[2,“3VFfYCu5ZFP7ZHhDKvRoYUMqFeM8jFDxBkuE”,“Authorize”,{“idTag”:“FFFFFFFEEEEEEEEE”}]
[3,“3VFfYCu5ZFP7ZHhDKvRoYUMqFeM8jFDxBkuE”,{“idTagInfo”:{“status”:“Accepted”,“expiryDate”:“2024-06-30T00:00:00.000Z”,“parentIdTag”:“PATFFFFFFF”}}]
--- ocpp 1.6的认证报文
-- @string req_msg.id_tag 充电卡片的ID
-- @string
-- @return int result 1 - 成功允许充电,2 - 认证失败不允许充电,
-- @usage
ocpp_local_func.authorize = function (ocpp_obj, req_msg, ret_msg)
-- statements
local msg_ranid = random_str(16)
local masking_key = math.random(1, 0xffffffff)
local msg = "[2,"
local authorinfo = {
idTag = req_msg.id_tag,
}
local authorinfo_json = json.encode(authorinfo)
local msg = "[2,\"" .. msg_ranid .. "\"," .. "\"Authorize\"," .. authorinfo_json .. "]"
print("author msg:", msg, masking_key)
websocket.write(ocpp_obj.ws_id, msg, "text", masking_key)
local data = websocket.read(ocpp_obj.ws_id)
if not data then
return -100
end
local ret_id, ret_ranid, ret_s = string.match(data, '%[(%d),%"(%w+)%",(.*)%]')
--print("ret_id:", ret_id, "ret_ranid:", ret_ranid, "ret_s:", ret_s)
if ret_id and ret_ranid == msg_ranid then
print("ret_id:", ret_id, "ret_ranid:", ret_ranid, "ret_s:", ret_s)
local ret_msg = json.decode(ret_s)
--errorinfo.print_tab(ret_json["idTagInfo"])
--print("ret_json.idTagInfo.status:", ret_json["idTagInfo"]["status"])
if ret_msg["idTagInfo"]["status"] == "Accepted" then
return 1
else
return 2
end
end
return -1
end
boot_notification
[2,“7egoQNk0PfgFw92WDWp5bWUhwHdTlJgnte8u”,“BootNotification”,{“chargePointVendor”:“hiddd”,“chargePointModel”:“elmo-vir1”,“firmwareVersion”:“0.9.89”,“iccid”:“4567890”,“imsi”:“1111111”,“meterType”:“elm acpp”,“meterSerialNumber”:“elm.0.0.1112”}]
[3,“7egoQNk0PfgFw92WDWp5bWUhwHdTlJgnte8u”,{“status”:“Accepted”,“currentTime”:“2024-06-23T00:19:56.011Z”,“interval”:14400}]
chargePointServ.resp.boot_notification = function(source)
-- 充电桩向终点站发起认证请求,每个充电头单独认证
local req_msg = {
["req_obj"] = {
["chargePointVendor"] = chargecfg.getValueByKey("chargePointVendor"),
["chargePointModel"] = chargecfg.getValueByKey("chargePointModel"),
["chargePointSerialNumber"] = chargecfg.getValueByKey("chargePointSerialNumber"),
["firmwareVersion"] = chargecfg.getValueByKey("firmwareVersion"),
["iccid"] = chargecfg.getValueByKey("iccid"),
["imsi"] = chargecfg.getValueByKey("imsi"),
["meterType"] = chargecfg.getValueByKey("meterType"),
["meterSerialNumber"] = chargecfg.getValueByKey("meterSerialNumber")
}
}
local ret_msg = {}
local f, result = ocpp_protocol.call("boot_notification", req_msg, ret_msg)
print("boot_notification result:", result, f)
if not f then
return -2
end
return result
end
--- ocpp 充电桩信息上报
-- @string
-- @return int result 1 - 上报成功,-100 网络不可达读取返回值失败
-- @usage
ocpp_local_func.boot_notification = function (self, req_msg, ret_msg)
-- statements
local msg_ranid = random_str(16)
local boot_json = json.encode(req_msg.req_obj)
local msg = "[2,\"" .. msg_ranid .. "\"," .. "\"BootNotification\"," .. boot_json .. "]"
print("boot msg:", msg)
websocket.write(self.ws_id, msg, "text", 0)
local data = websocket.read(self.ws_id)
if not data then
return -100
end
local ret_id, ret_ranid, ret_s = string.match(data, '%[(%d),%"(%w+)%",(.*)%]')
--print("ret_id:", ret_id, "ret_ranid:", ret_ranid, "ret_s:", ret_s)
if ret_id and ret_ranid == msg_ranid then
print("ret_id:", ret_id, "ret_ranid:", ret_ranid, "ret_s:", ret_s)
local ret_msg = json.decode(ret_s)
--errorinfo.print_tab(ret_json["idTagInfo"])
--print("ret_json.idTagInfo.status:", ret_json["idTagInfo"]["status"])
if ret_msg["status"] == "Accepted" then
return 1
else
return 2
end
end
end
心跳
[2,“c6VuHI1z5tvH1okM5uH9OcHvwgTAjo2dJMNS”,“Heartbeat”,{}]
[3,“c6VuHI1z5tvH1okM5uH9OcHvwgTAjo2dJMNS”,{“currentTime”:“2024-06-23T00:20:08.437Z”}]
--- ocpp 心跳
-- @string
-- @return int result 1 - 成功允许充电,2 - 认证失败不允许充电,-100 网络不可达读取返回值失败
-- @usage
ocpp_local_func.heart_beat = function (self, req_msg, ret_msg)
-- statements
local msg_ranid = random_str(16)
local msg = "[2,\"" .. msg_ranid .. "\"," .. "\"BootNotification\"," .. boot_json .. "]"
print("boot msg:", msg)
websocket.write(self.ws_id, msg, "text", 0)
local data = websocket.read(self.ws_id)
if not data then
return -100
end
local ret_id, ret_ranid, ret_s = string.match(data, '%[(%d),%"(%w+)%",(.*)%]')
--print("ret_id:", ret_id, "ret_ranid:", ret_ranid, "ret_s:", ret_s)
if ret_id and ret_ranid == msg_ranid then
--print("ret_id:", ret_id, "ret_ranid:", ret_ranid, "ret_s:", ret_s)
local ret_msg = json.decode(ret_s)
if not ret_msg["currentTime"] then
return 2
else
return 1
-- statements
end
else
return 2
end
end