基本的慢充协议
目录
描述
词汇表
端口:充电时使用的接口,设备可以单独控制的电力输出结构。
端口编号:端口的程序代码,和设备编号共用用以表示端口在系统中的唯一值。端口编号必须以数字顺序编码,每台机器端口编号不得跳跃,不得重用。
响应类型:上报服务端的数据响应类型。分为即时响应上报和设备主动上报。
会话ID: 由服务端生成,用以区分不同的命令数据链。
网络通讯协议
本章节内容定义通讯模块和服务器之间的通讯协议。
通讯方式
- 数据上报:string字符串
- 指令数据:定长报文
- 通讯网络协议:TCP
关于粘包
由于服务器操作系统在处理TCP通讯时,将数据包转换成流传输给应用层,在数据频率高或者并发高的情况下很容易出现粘包,单片机受内存限制将不处理粘包,所以服务器在发送数据的时候需要注意的是尽量不要以特别高的频率向单片机发送数据,单片机如果接收到数据有粘包则只能处理前面一包的数据,后面的数据将会被丢弃,服务器可以通过重发机制避免粘包对业务产生影响,同时在很偶尔的情况下服务器发送数据可能出现分包(虽然现在大部分服务器发送慢充这样的数据不会出现分包),如果大量出现分包,请调整服务器网络参数设置,如果同一条数据被分包发送间隔大于2s将被单片机将在接收到后面的数据之前就认为前面的数据是非法的。同时因为服务器内存资源充足,建议服务器尽量对接收数据进行粘包处理。
协议结构
命令结构
定义:服务器发送,通讯模块接收的数据报文。
1 | 2 | 3 | 4 | 5 | 6 | 7 |
1:开始标识(1byte) “_”
2:报文长度(3byte)(ASCII数字)
3:命令(3byte)(英文大写,第一字节A为保留字段)
4:会话ID(6byte)(每一字节0x00-0x3D之间数字+偏移量0x31,当然如果使用A-Za-z0-9就一定再这个范围之内了,也就满足要求了),每次不同的通讯的会话ID都需要不一样(服务器发起的通讯至少连续的20次通讯不一样,除了特殊说明以外,当然我们的建议还是让每次通讯的会话ID尽可能的不一样),通常设备会在获取到服务器指令执行以后需要回复结果的会返回相同的会话ID给服务器,服务端可以通过会话ID获得设备当前回应的数据是哪一个会话的。同一个会话ID设备会认为是同一次通讯的重复发送,如果设备已经处理了相关的指令,就会丢弃之后相同会话ID的指令。设备由于内存限制,比对的会话ID是之前10次通讯的会话ID,为了可靠期间服务端只要保证连续的20次服务器发起的通讯会话ID不一致就可以了确保设备不会触发丢弃操作而影响指令的执行。另外如果有些命令服务器为了使设备一定收到,但设备只需要执行一次的,这样的命令多次发送用同一会话ID发送就可以了
5:分隔符(1byte) “/”
6:参数(如果没有参数则没有该部分)
7:结束标识(2byte) (0x0D 0x0A)
响应结构
定义:通讯模块发送,服务器接收的报文。
1 | 2 | 3 | 4 | 5 | 6 | 7 |
1:开始标识(1byte) “_”
2:响应类型(2byte) PG-ping,DV-设备号(IMEI),ID-SIM卡ICCID号,CM-客户端命令,RP-数据上报,RS-命令响应, RJ-Json数据上报
3:命令(3byte)(大写英文,回传服务器请求的命令,如果没有服务器请求则为AAA)
4:会话ID(6byte)(无服务器会话ID则返回”000000”,文档中指令的会话ID有特殊定义的,已定义为准)
5:内容长度(3byte)(ASCII数字)6的长度
6:内容(内容长度可以为空)
7:结束标识(2byte) (0x0D 0x0A)
命令限制
- ADV(设备号IMEI号) AID(SIM卡ICCID号) AXT(心跳) AAA(空指令) 为系统内置命令不能用于其他接口
- 业务级别的接口命令不得用 A 开头
业务协议-继电器倒计时
查询设备端口状态
端口查询请求
关联设备命令:0x01
发送方 | 服务器 |
说明 | 服务端询问设备状态 |
开始标志 | 1byte,“_” |
报文长度 | 3byte,表示整个报文的总长度,ASCII数字表示 |
命令 | 3byte,STA |
会话ID | 6byte,服务器生成 |
分隔符 | 1byte,“/” |
参数 | 空 |
结束标志 | 2byte,\r\n(0x0D 0x0A) |
示例:
_ 016 STA DSfFGd / <0x0D> <0x0A>
端口查询响应
关联设备命令:0x01
发送方 | 通信模块 |
说明 | 返回服务端查询内容 |
开始标志 | 1byte,“_” |
响应类型 | 2byte,RS |
命令 | 3byte,STA |
会话ID | 6byte,服务器生成 |
内容长度 | 3byte,表示内容长度,ASCII数字表示 |
内容 | 端口号
: 状态(1-端口空闲,2-端口正在使用,3-端口禁用,4-端口故障) (“/”端口分隔符) |
结束标志 | 2byte,\r\n(0x0D 0x0A) |
示例:
_ RS STA DSfFGd 011 1 : 0 / 2 : 1 / 3 : 1 <0x0D> <0x0A>
设备启动
关联设备命令:0x02
设备启动请求
发送方 | 服务器 |
说明 | 支付完成后,启动设备,开始充电 |
开始标志 | 1byte,“_” |
报文长度 | 3byte,表示整个报文的总长度,ASCII数字表示 |
命令 | 3byte,RUN |
会话ID | 6byte,服务器生成 |
分隔符 | 1byte,“/” |
参数 | 端口号(2byte,不足在前面补0)
充电时长(5byte,不足在前面补0,一般主板只支持1-999) |
结束标志 | 2byte,\r\n(0x0D 0x0A) |
示例:
_ 023 RUN 123456 / 01 00010 <0x0D> <0x0A>
设备启动响应
发送方 | 通信模块 |
说明 | 响应服务端启动情况 |
开始标志 | 1byte,“_” |
响应类型 | 2byte,RS |
命令 | 3byte,RUN |
会话ID | 6byte,服务器生成 |
内容长度 | 3byte,表示内容长度,ASCII数字表示 |
内容 | 状态(1-成功,2-故障,3-端口已用) |
结束标志 | 2byte,\r\n(0x0D 0x0A) |
示例:
_ RS RUN 123456 001 1 <0x0D> <0x0A>
运行完成通知
设备运行完成上报
发送方 | 通信模块 |
说明 | 设备充电完成后,上报服务端 |
开始标志 | 1byte,“_” |
响应类型 | 2byte,RP |
命令 | 3byte,UWC |
会话ID | 6byte,A80005 |
内容长度 | 3byte,表示内容长度,ASCII数字表示 |
内容 | 充电端口 (#分隔符)
充电剩余时间/电量(单位:分钟/度)(#分隔符) 停止原因(0-时间用完了,1-用户手动停止(拔插头或是按了停止按钮),2-充满自动停止,3-端口出现问题被迫停止,4-因充电器功率过大,5-刷卡退费结束,6-开始充电未接充电器)(#分隔符) 重传序号(通讯模块生成,该参数是后面DLB命令的参数,获取到充电完成就必须要发送DLB回应设备已经接收到,如果不回应,设备为了保证服务端收到该条消息会每隔一分钟重新发送) |
结束标志 | 2byte,\r\n(0x0D 0x0A) |
示例:
_ RP UWC A80005 010 1 # 70 # 2 # 56<0x0D> <0x0A>
删除重传队列
发送方 | 服务器 |
说明 | 服务端收到设备充电完成上报后,回应设备让设备删除重传列表中的该条数据。 |
开始标志 | 1byte,“_” |
报文长度 | 3byte,表示整个报文的总长度,ASCII数字表示 |
命令 | 3byte,DLB |
会话ID | 6byte,服务器生成 |
分隔符 | 1byte,“/” |
参数 | 重传序号(通讯模块生成) |
结束标志 | 2byte,\r\n(0x0D 0x0A) |
示例:
_ 018 DLB 123456 / 56 <0x0D> <0x0A>
远程停止运行
关联设备命令:0x0B
停止指定端口运行
发送方 | 服务器 |
说明 | 停止指定的运营端口(执行退款功能时使用) |
开始标志 | 1byte,“_” |
报文长度 | 3byte,表示整个报文的总长度,ASCII数字表示 |
命令 | 3byte,RTN |
会话ID | 6byte,服务器生成 |
分隔符 | 1byte,“/” |
参数 | 2byte 端口号 |
结束标志 | 2byte,\r\n(0x0D 0x0A) |
示例:
_ 018 RTN 123456 / 01<0x0D> <0x0A>
停止指定端口运行响应
关联设备命令:0x0B
发送方 | 通信模块 |
说明 | 返回服务端执行结果 |
开始标志 | 1byte,“_” |
响应类型 | 2byte,RS |
命令 | 3byte,RTN |
会话ID | 6byte,服务器生成 |
内容长度 | 3byte,表示内容长度,ASCII数字表示 |
内容 | 端口号#/#剩余时间(单位:分) |
结束标志 | 2byte,\r\n(0x0D 0x0A) |
示例:
_ RS DCH 123456 001 1 #/# 60 <0x0D> <0x0A>
设置最低浮充功率、浮充时间
下发最低浮充功率、浮充时间
发送方 | 服务器 |
说明 | 下发最低浮充功率、浮充时间 |
开始标志 | 1byte,“_” |
报文长度 | 3byte,表示整个报文的总长度,ASCII数字表示 |
命令 | 3byte,GKA |
会话ID | 6byte,服务器下发 |
分隔符 | 1byte,“/” |
参数 | 浮充功率(5byte)
浮充时间(5byte) 充电器移除时间(5byte) |
结束标志 | 2byte,\r\n(0x0D 0x0A) |
浮充功率:最低的浮充功率,单位0.1W
浮充时间:到达最低浮充功率进行检测的时间:120秒-999秒, 单位1秒
充电器移除时间:检测充电器未连接到关闭端口输出的时间:5秒-999秒 单位1秒
示例:
_ 027 GKA 123456 / 2 #/# 8 #/# 120 0x0D 0x0A
响应最低浮充功率、浮充时间
发送方 | 通信模块 |
说明 | 响应服务器设置结果 |
开始标志 | 1byte,“_” |
响应类型 | 2byte,RS |
命令 | 3byte,GKA |
会话ID | 6byte,服务端下发 |
内容长度 | 3byte,表示内容长度,ASCII数字表示 |
内容 | S-成功,F-失败 |
结束标志 | 2byte,\r\n(0x0D 0x0A) |
示例:
_ RS GKA 123456 001 S 0x0D 0x0A
设置充电站5档计费功率、比例
关联设备命令:0x14
设置功率比例
发送方 | 服务器 |
说明 | 设置充电站3档计费功率、比例,具体用几档依设备而定 |
开始标志 | 1byte,“_” |
报文长度 | 3byte,表示整个报文的总长度,ASCII数字表示 |
命令 | 3byte,CHM |
会话ID | 6byte,服务器生成 |
分隔符 | 1byte,“/” |
参数 | 第一档功率:5byte,ASCII数字 设置第一档的功率范围0-第一档功率,单位:W
第一档比例:3byte,电动车在此功率范围内充电时间对应机器设置时间的百分比,充电时间=设置时间*对应比例% 第二档功率:5byte,ASCII数字 设置第二档的功率范围:第一档功率—第二档功率,单位:W 第二档比例:3byte,电动车在此功率范围内充电时间对应机器设置时间的百分比,充电时间=设置时间*对应比例% 第三档功率:5byte,设置第三档的功率范围:第二档功率—第三档功率,单位:W 第三档比例:3byte,电动车在此功率范围内充电时间对应机器设置时间的百分比,充电时间=设置时间*对应比例% 注意:功率第一档不能大于第二档,第二档不能大于第三档,以此类推。 |
结束标志 | 2byte,\r\n(0x0D 0x0A) |
示例:
_ 055 CHM 123456 / 00100 100 00200 050 00300 030 <0x0D> <0x0A>
设置功率比例应答
发送方 | 通信模块 |
说明 | 设置充电站3档计费功率、比例应答,主板不支持则不回复 |
开始标志 | 1byte,“_” |
响应类型 | 2byte,RS |
命令 | 3byte,CHM |
会话ID | 6byte,服务器生成 |
内容长度 | 3byte,表示内容长度,ASCII数字表示 |
内容 | 1-成功,0-失败(与主板要求的不符,比如功率超出了主板的最大功率,功率大小限制与主板要求不符等) |
结束标志 | 2byte,\r\n(0x0D 0x0A) |
示例:
_ RS CHM 123456 001 1 <0x0D> <0x0A>
读取设备5档计费功率、比例
关联设备命令:0x15
读取功率比例
发送方 | 服务器 |
说明 | 读取充电站3档计费功率、比例 |
开始标志 | 1byte,“_” |
报文长度 | 3byte,表示整个报文的总长度,ASCII数字表示 |
命令 | 3byte,CHO |
会话ID | 6byte,服务器生成 |
分隔符 | 1byte,“/” |
参数 | 固定值 0 |
结束标志 | 2byte,\r\n(0x0D 0x0A) |
示例:
_ 017 CHO 123456 / 0 <0x0D> <0x0A>
读取功率比例应答
发送方 | 通信模块 |
说明 | 返回五档功率比例值 |
开始标志 | 1byte,“_” |
响应类型 | 2byte,RS |
命令 | 3byte,CHO |
会话ID | 6byte,服务器生成 |
内容长度 | 3byte,表示内容长度,ASCII数字表示 |
内容 | 第一档功率:设置第一档的功率范围0-第一档功率,单位:W(#/#分割)
第一档比例:电动车在此功率范围内充电时间对应机器设置时间的百分比,充电时间=设置时间*对应比例%(#/#分割) 第二档功率:设置第二档的功率范围:第一档功率—第二档功率,单位:W(#/#分割) 第二档比例:电动车在此功率范围内充电时间对应机器设置时间的百分比,充电时间=设置时间*对应比例%(#/#分割) 第三档功率:设置第三档的功率范围:第二档功率—第三档功率,单位:W(#/#分割) 第三档比例:电动车在此功率范围内充电时间对应机器设置时间的百分比,充电时间=设置时间*对应比例%(#/#分割) |
结束标志 | 2byte,\r\n(0x0D 0x0A) |
示例:
_ RS CHO 123456 053 100#/#100#/#200#/#50#/#300#/#30 <0x0D> <0x0A>
设置充电站充满自停、刷卡退费
关联设备命令:0x13
设置充满退费参数
发送方 | 服务器 |
说明 | 设置充电站充满自停、刷卡退费 |
开始标志 | 1byte,“_” |
报文长度 | 3byte,表示整个报文的总长度,ASCII数字表示 |
命令 | 3byte,CHI |
会话ID | 6byte,服务器生成 |
分隔符 | 1byte,“/” |
参数 | 充满自停设置:1byte,0-不自停,1-自停 |
结束标志 | 2byte,\r\n(0x0D 0x0A) |
示例:
_ 018 CHI 123456 / 1 <0x0D> <0x0A>
设置充满退费参数应答
发送方 | 通信模块 |
说明 | 设置充电站充满自停、刷卡退费应答 |
开始标志 | 1byte,“_” |
响应类型 | 2byte,RS |
命令 | 3byte,CHI |
会话ID | 6byte,服务器生成 |
内容长度 | 3byte,表示内容长度,ASCII数字表示 |
内容 | 固定值:1 |
结束标志 | 2byte,\r\n(0x0D 0x0A) |
示例:
_ RS CHI 123456 001 1 <0x0D> <0x0A>
系统及网络接口
获取设备号
请求设备号
发送方 | 服务器 |
说明 | 在设备连接服务端成功后,服务端立即发送指令请求该设备的设备号
现在约定设备的GSM模块的IMEI号作为唯一设备号 |
开始标志 | 1byte,“_” |
报文长度 | 3byte,表示整个报文的总长度,ASCII数字表示 |
命令 | 3byte,ADV |
会话ID | 6byte,000000 |
分隔符 | 1byte,“/” |
参数 | IMEI |
结束标志 | 2byte,\r\n(0x0D 0x0A) |
示例:
_ 020 ADV 000000 / IMEI 0x0D 0x0A
设备号响应
发送方 | 通信模块 |
说明 | 设备收到设备号请求时,返回设备号
现在约定设备的GSM模块的IMEI号作为唯一设备号 设备号返回后才能开始真正的业务级别通讯 |
开始标志 | 1byte,“_” |
响应类型 | 2byte,DV |
命令 | 3byte,ADV |
会话ID | 6byte,000000 |
内容长度 | 3byte,表示内容长度,ASCII数字表示 |
内容 | IMEI号(15byte) |
结束标志 | 2byte,\r\n(0x0D 0x0A) |
示例:
IMEI号: 987654321012345 _ DV ADV 000000 015 987654321012345 0x0D 0x0A
心跳Ping
发送心跳Ping
发送方 | 通信模块 |
说明 | 设备连接成功后,轮询发送心跳包,保持长连接。
综合考虑运营商GPRS的超时、路由映射缓存超时、流量节省等因素, 心跳间隔建议在60秒 |
开始标志 | 1byte,“_” |
响应类型 | 2byte,PG |
命令 | 3byte,AXT |
会话ID | 6byte,000000 |
内容长度 | 3byte,001 |
内容 | 信号值:0-31(,分割)
误码率:0-7(#/#分割) 上次心跳响应时间:整数值(可能为负,10ms为单位,上次心跳发出时间到上次接收到服务器心跳返回的时间,可以初略估计出网络的传输和服务器的响应速度,#/#分割) 网络制式:GPRS、HSPA、WCDMA、LTE、CDMA等 |
结束标志 | 2byte,\r\n(0x0D 0x0A) |
示例:
_ PG AXT 000000 016 31 , 0 #/# 74 #/# GPRS 0x0D 0x0A
信号值显示建议:
以下以5格信号显示为例:信号值0-5显示0格,信号值6-12显示为1格,信号值13-16显示为2格,信号值17-20显示为3格,信号值21-25显示为4格,信号值26-31显示为5格。同时如果误码率≥5,则信号格数在原来基础上减去1,如果计算的信号格数为负数则显示为零格。
通常信号值为15以下(包括15)的建议通过信号放大或者调整天线匹配等手段使模块获得更好的信号,在这种信号情况下会出现掉线率高,数据延时高等情况,对通讯和业务会造成影响。
关于天线:
天线是将传输线中的电磁能转化成自由空间的电磁波,或将空间电磁波转化成传输线中的电磁能的专用设备。在无线通信系统中,天线是收发信机与外界传播介质之间的接口。同一个天线既可以辐射又可以接收无线电波:发射时,把高频电流转换为电磁波;接收时把电磁波转换为高频电流。
天线是一种变换器,它把传输线上传播的导行波,变换成在无界媒介(通常是自由空间)中传播的电磁波,由于天线具有可逆性,在接收时,天线进行相反的变换;天线是发射和接收电磁波的一个重要装置,没有天线也就没有无线电通信。因此天线的好坏以及天线的安装环境直接影响通讯的质量甚至是是否可以通讯。当你发现你同一个地方2G信号是覆盖的,但是设备的信号很差时,请务必确认天线是否匹配2G网络,天线的安装环境是否良好。天线周围不应该有金属屏蔽或者对信号有反射和吸收的介质,天线周围也不应该有高频信号源或者电力线路,天线安装应该有一定的高度,并查看天线频率、增益、驻波比系数、功率,灵敏度等参数是否符合你的要求,如果你认为设备没有达到预期的信号效果,请咨询专业的天线厂家。
响应心跳Ping
发送方 | 服务器 |
说明 | 服务端回复心跳 |
开始标志 | 1byte,“_” |
报文长度 | 3byte,表示整个报文的总长度,ASCII数字表示 |
命令 | 3byte,AXT |
会话ID | 6byte,000000 |
分隔符 | 1byte,“/” |
参数 | P |
结束标志 | 2byte,\r\n(0x0D 0x0A) |
示例:
_ 017 AXT 000000 / P 0x0D 0x0A
获取ICCID以及软硬件版本号
请求ICCID以及软硬件版本号
发送方 | 服务器 |
说明 | 在设备返回设备号后,服务端发送指令获取SIM卡的ICCID |
开始标志 | 1byte,“_” |
报文长度 | 3byte,表示整个报文的总长度,ASCII数字表示 |
命令 | 3byte,AID |
会话ID | 6byte,000000 |
分隔符 | 1byte,“/” |
参数 | |
结束标志 | 2byte,\r\n(0x0D 0x0A) |
示例:
_ 016 AID 000000 / 0x0D 0x0A
ICCID以及软硬件版本号响应
发送方 | 通信模块 |
说明 | 设备收到ICCID请求时,返回ICCID |
开始标志 | 1byte,“_” |
响应类型 | 2byte,ID |
命令 | 3byte,AID |
会话ID | 6byte,000000 |
内容长度 | 3byte,表示内容长度,ASCII数字表示 |
内容 | ICCID号(#/#分割)
软件版本号(#/#) 硬件版本号 |
结束标志 | 2byte,\r\n(0x0D 0x0A) |
示例:
ICCID号 : 898602B3131650175846
_ ID AID 000000 045 898602B3131650175846 #/# mc-2.3.0 #/# DJ-BSD-8202 0x0D 0x0A
心跳和握手流程
设备通讯模块连接上服务器后会首先发送一次心跳,此时服务器就可以和模块通讯了,一般来说首先进行身份鉴别,通过获取IMEI和ICCID指令,获取设备的IMEI和ICCID号校验设备的身份信息。心跳是由模块发起,当发起心跳以后服务端必须在5秒钟之内回复心跳,建立连接以后模块会每个一定的时间发送心跳给服务器用来保持长连接和通讯确认。