灌装机
2026-08-05
通讯协议
设备sn 采用单片机唯一标识UID 如002c00564633501320393635
- 协议:
MQTT - Client ID: 设备sn
- 包体格式:
json
Topic
- 服务器广播
sys/evt - 服务器下行
sys/dn/${device_sn}- 举例: 设备号为
002c00564633501320393635则对应topic为sys/dn/002c00564633501320393635
- 举例: 设备号为
- 设备上行
sys/up/${device_sn}添加了设备号,方便对单一设备报文截取- 举例: 设备号为
002c00564633501320393635则对应topic为sys/up/002c00564633501320393635
- 举例: 设备号为
心跳 hb
- 服务器广播
- 设备收到服务器心跳后返回
Name:tRequiredType:string
Default Value: hb
数据包类型
Name:snRequiredType:string
唯一标识SN
服务器填""
设备如实填写 如002c00564633501320393635
Name:tsRequiredType:int
Unix时间戳(秒) 服务器发送Unix时间戳(秒)
设备发送设备运行时间(秒)
{
"t": "hb",
"sn": "002c00564633501320393635",
"ts": 330
}空中升级
版本信息 ota
- 设备上行
- 服务器收到设备上行后,下发版本信息
Name:tRequiredType:string
Default Value: ota
数据包类型
Name:snRequiredType:string
唯一标识SN
服务器填""
设备如实填写 如002c00564633501320393635
Name:tsRequiredType:int
Unix时间戳(秒) 服务器发送Unix时间戳(秒)
设备发送设备运行时间(秒)
Name:verRequiredType:int
Default Value: 0
版本号
升级文件名称格式为: VEM_V1.2.3.bin 则版本号ver = 1 * 10000 + 2 * 100 + 3 * 1 = 10203
服务器如实填写 没有升级文件时0
Name:crcRequiredType:int
Default Value: 0
升级bin文件的校验CRC
设备固定为0
服务器如实填写 没有升级文件时0
unsigned int CRC32(const unsigned char* pu8Data, unsigned int u32Size) {
unsigned int i, crc;
crc = 0xFFFFFFFF;
for (i = 0; i < u32Size; i++) {
crc = crc32c_table[(crc ^ pu8Data[i]) & 0xff] ^ (crc >> 8);
}
return crc ^ 0xFFFFFFFF;
}Name:sizeRequiredType:int
Default Value: 0
升级bin文件的字节大小
设备固定为0
服务器如实填写 没有升级文件时0
{
"t": "ota",
"sn": "002c00564633501320393635",
"ts": 1785924259,
"ver": 0,
"crc": 0,
"size": 0,
}数据传输 ota_data
- 设备上行
- 服务器收到设备上行后,下发数据传输
Name:snRequiredType:string
唯一标识SN
服务器填""
设备如实填写 如002c00564633501320393635
Name:tsRequiredType:int
Unix时间戳(秒) 服务器发送Unix时间戳(秒)
设备发送设备运行时间(秒)
Name:offsetRequiredType:int
升级文件bin的起始地址
Name:sizeRequiredType:int
升级文件bin的起始地址的字节数
服务器返回时长度不够,按实际填写
Name:dataRequiredType:string
hex编码的bin数据
设备端填""
服务器返回实际内容
{
"t": "ota_data",
"sn": "002c00564633501320393635",
"ts": 1785924259,
"offset": 0,
"size": 100,
"data": "" // hex编码的bin数据
}流程示例
// 如升级文件.bin内容长度为16,十六进制如下
// [00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0c 0d 0f]
// 升级过程如下
// 设备上行版本信息
{
"t": "ota",
"sn": "002c00564633501320393635",
"ts": 1785924259,
"ver": 0,
"crc": 0,
"size": 0,
}
// 服务器下行版本信息
{
"t": "ota",
"sn": "002c00564633501320393635",
"ts": 1785924259,
"ver": 0,
"crc": 2426568960,
"size": 16,
}
// 设备上行数据传输
{
"t": "ota_data",
"sn": "002c00564633501320393635",
"ts": 1785924259,
"offset": 0,
"size": 10,
"data": "" //
}
// 服务器下行数据传输
{
"t": "ota_data",
"sn": "002c00564633501320393635",
"ts": 1785924259,
"offset": 0,
"size": 10,
"data": "00010203040506070809" //
}
// 设备上行数据传输
{
"t": "ota_data",
"sn": "002c00564633501320393635",
"ts": 1785924259,
"offset": 10,
"size": 10,
"data": "" //
}
// 超时下方服务器下行数据传输,则设备会重发上方设备上行数据传输
// 服务器下行数据传输
{
"t": "ota_data",
"sn": "002c00564633501320393635",
"ts": 1785924259,
"offset": 10,
"size": 6, // 注意 长度不足时,为实际bin文件剩余内容
"data": "0a0b0c0d0e0f" //
}设备注册 br
- 设备开机后仅上行一次注册报文
- 服务器收到设备上行后,下发设备注册成功
Name:tRequiredType:string
Default Value: br
数据包类型
Name:snRequiredType:string
唯一标识SN
服务器填""
设备如实填写 如002c00564633501320393635
Name:tsRequiredType:int
Unix时间戳(秒) 服务器发送Unix时间戳(秒)
设备发送设备运行时间(秒)
Name:qrcodeRequiredType:string
二维码、 最大长度不超过128字节
设备如实填写
服务器如实填写
{
"t": "br",
"sn": "002c00564633501320393635",
"ts": 1785924259,
"qrcode": "localhost:8080",
}设备状态 status
- 设备周期5秒上行设备状态
Name:tRequiredType:string
Default Value: status
数据包类型
Name:snRequiredType:string
唯一标识SN
服务器填"" 设备状态
Name:tsRequiredType:int
设备发送设备运行时间(秒)
Name:stateRequiredType:int
设备状态
| 状态 | 描述 | 备注 |
|---|---|---|
| 1 | 复位 | 上电后默认状态、成功后切换到待机状态 |
| 2 | 待机 | 可接收业务指令、并到灌装中状态 |
| 3 | 灌装中 | |
| 4 | 故障 | 发生故障时切换到该状态 |
| 5 | 维护 | |
| 6 | 准备重启 |
Name:errorRequiredType:string
故障描述 最大长度不超过128字节
无故障时填""
Name:senserRequiredType:array[int,int,int,int]
传感器状态 4个传感器输入状态 0:无效 1:有效
| 传感器 | 描述 | 备注 |
|---|---|---|
| 1 | 暂未添加 | |
| 2 | 暂未添加 | |
| 3 | 暂未添加 | |
| 4 | 暂未添加 |
Name:relayRequiredType:array[int,int,int,int]
继电器状态 4个继电器输出状态 0:关闭 1:开启
| 继电器 | 描述 | 备注 |
|---|---|---|
| 1 | 罐装继电器 | |
| 2 | 放杯继电器 | |
| 3 | 广告灯继电器 | |
| 4 | 暂未添加 |
Name:otaRequiredType:int
OTA升级状态
- 0: 升级空闲
- 1-99: 升级中
- 100: 升级完成
- 其他: 升级失败
Name:mlRequiredType:int
罐装中时罐装量
设备如实填写
服务器如实填写
Name:idRequiredType:string
操作员ID
设备如实填写
{
"t": "status",
"sn": "002c00564633501320393635",
"ts": 1785924259,
"state": 1,
"error": "",
"senser": [0,0,0,0],
"relay": [0,0,0,0],
"ml": 0,
"ota": 0,
"id": "",
}设备复位 reset
- 服务器下发复位指令
- 设备仅在待机状态、故障状态处理该指令、将切换到复位中状态、其他状态下忽略该指令
Name:tRequiredType:string
Default Value: reset
数据包类型
Name:snRequiredType:string
唯一标识SN
服务器填"" 设备状态
Name:tsRequiredType:int
设备发送设备运行时间(秒)
{
"t": "reset",
"sn": "002c00564633501320393635",
"ts": 1785924259,
}设备重启 reboot
- 服务器下发重启指令
- 设备仅在待机状态、故障状态处理该指令、将切换到重启中状态、其他状态下忽略该指令
Name:tRequiredType:string
Default Value: reboot
数据包类型
Name:snRequiredType:string
唯一标识SN
服务器填"" 设备状态
Name:tsRequiredType:int
设备发送设备运行时间(秒)
{
"t": "reboot",
"sn": "002c00564633501320393635",
"ts": 1785924259,
}设备罐装
准备罐装 fill_ready
- 服务器下发准备罐装指令
- 设备收到后回复准备罐装结果,仅在待机状态、处理该指令、其他状态下忽略该指令
Name:tRequiredType:string
Default Value: fill_ready
数据包类型
Name:sn
唯一标识SN
服务器填"" 设备状态
Name:tsRequiredType:int
设备发送设备运行时间(秒)
Name:item_idRequiredType:string
商品订单ID
设备如实填写
服务器如实填写
Name:user_idRequiredType:string
用户ID
设备如实填写
服务器如实填写
Name:mlRequiredType:int
罐装量
设备如实填写
服务器如实填写
Name:errorRequiredType:string
故障描述 最大长度不超过128字节
服务器填""
设备收到后可执行情况下填"",不可执行情况下填故障描述
{
"t": "fill",
"sn": "002c00564633501320393635",
"ts": 1785924259,
"item_id": "1234567890",
"user_id": "544as",
"ml": 100,
"error": "",
}罐装结果 fill_done
- 设备上行罐装结果
- 服务器收到设备上行后回复,设备没收到则会周期上报罐装结果、期间模块状态仍为罐装中
Name:tRequiredType:string
Default Value: fill_done
数据包类型
Name:snRequiredType:string
唯一标识SN
服务器填"" 设备状态
Name:tsRequiredType:int
设备发送设备运行时间(秒)
Name:item_idRequiredType:int
商品订单ID
设备如实填写
Name:user_idRequiredType:int
用户ID
设备如实填写
Name:mlRequiredType:int
实际罐装量
设备如实填写
Name:errorRequiredType:string
故障描述 最大长度不超过128字节
罐装成功时填"",罐装失败时填故障描述
{
"t": "fill_done",
"sn": "002c00564633501320393635",
"ts": 1785924259,
"item_id": 1,
"user_id": 1,
"ml": 100,
"error": "",
}管理员
管理员账户登录 login_user
- 设备端输入账号密码后,请求维护登录
- 服务器收到设备上行后,下发登录结果
Name:tRequiredType:string
Default Value: login_user
数据包类型
Name:snRequiredType:string
唯一标识SN
服务器填"" 设备状态
Name:tsRequiredType:int
设备发送设备运行时间(秒)
Name:usernameRequiredType:string
账号
设备如实填写
服务器""
Name:passwordRequiredType:string
密码
设备如实填写
服务器""
Name:idRequiredType:string
操作员ID
设备填""
服务器如实填写,""表示无效登录,后续维护操作上传记录时,需要填写该ID
{
"t": "login",
"sn": "002c00564633501320393635",
"ts": 1785924259,
"username": "admin",
"password": "123456",
"id": "",
}数字密码登录 login_num
- 设备端输入数字密码后,请求维护登录
- 服务器收到设备上行后,下发登录结果
Name:tRequiredType:string
Default Value: login_num
数据包类型
Name:snRequiredType:string
唯一标识SN
服务器填"" 设备状态
Name:tsRequiredType:int
设备发送设备运行时间(秒)
Name:passwordRequiredType:string
密码
设备如实填写
服务器""
Name:idRequiredType:string
操作员ID
设备填""
服务器如实填写,""表示无效登录,后续维护操作上传记录时,需要填写该ID
{
"t": "login_num",
"sn": "002c00564633501320393635",
"ts": 1785924259,
"password": "005599",
"id": "",
}登出 logout
- 设备上行登出请求
- 服务器收到设备上行后,下发登出结果
登出成功后,设备状态切换到故障状态,非复位状态已禁止仪器自启动
Name:tRequiredType:string
Default Value: logout
数据包类型
Name:snRequiredType:string
唯一标识SN
服务器填"" 设备状态
Name:tsRequiredType:int
设备发送设备运行时间(秒)
Name:idRequiredType:string
操作员ID
设备如实填写
{
"t": "logout",
"sn": "002c00564633501320393635",
"ts": 1785924259,
"id": "",
}操作历史 history
- 设备上行维护历史
Name:tRequiredType:string
Default Value: history
数据包类型
Name:snRequiredType:string
唯一标识SN
服务器填"" 设备状态
Name:tsRequiredType:int
设备发送设备运行时间(秒)
Name:idRequiredType:string
操作员ID
设备如实填写
Name:operateRequiredType:string
操作描述
设备如实填写
{
"t": "history",
"sn": "002c00564633501320393635",
"ts": 1785924259,
"id": "",
"operate": "relay 1 on",
}参数
主页参数 param_home
- 设备周期
5秒发送主页参数拉取请求 - 服务器收到设备上行后,下发主页参数
Name:tRequiredType:string
Default Value: param_home
数据包类型
Name:snRequiredType:string
唯一标识SN
服务器填"" 设备状态
Name:tsRequiredType:int
设备发送设备运行时间(秒)
Name:priceRequiredType:int
当前价格 单位分/毫升
服务器如实填写,0表示无效价格
设备如实填写
Name:price_updateRequiredType:int
价格涨幅 有符号 单位分/毫升
服务器如实填写,0表示无效价格更新时间
设备如实填写
Name:mlRequiredType:int
容量累计 单位毫升
服务器如实填写
设备如实填写
{
"t": "param_home",
"sn": "002c00564633501320393635",
"ts": 1785924259,
"price": 15, // 当前价格 单位`分/毫升`
"price_update": -300, // 价格涨幅 单位`分/毫升`
"ml": 100, // 容量累计 单位`毫升`
}商品参数 param_product
- 进入该菜单后,发送产品参数拉取请求。修改保存后,发送产品参数保存请求
- 服务器收到设备上行后,下发最新产品参数
Name:tRequiredType:string
Default Value: param_product
数据包类型
Name:snRequiredType:string
唯一标识SN
服务器填"" 设备状态
Name:tsRequiredType:int
设备发送设备运行时间(秒)
Name:nameRequiredType:string
产品名称 中文情况下 屏幕显示GBK编码
服务器如实填写
设备如实填写
Name:noRequiredType:string
商品编号
服务器如实填写
设备如实填写
Name:mlRequiredType:int
单次出液量 单位毫升
服务器如实填写
设备如实填写
Name:priceRequiredType:int
商品价格 单位分/毫升
服务器如实填写
设备如实填写
Name:daysRequiredType:int
保质期 单位天
服务器如实填写
设备如实填写
Name:secsRequiredType:int
金额回收 单位秒
服务器如实填写
设备如实填写
Name:wayRequiredType:int
超时处理方式 1: 消费处理 2:原路退回
Name:idRequiredType:string
操作员ID
设备传""时代表拉取,非""时代表保存
{
"t": "param_product",
"sn": "002c00564633501320393635",
"ts": 1785924259,
"name": "bear",
"no": "001122",
"ml": 100,
"price": 15,
"days": 30,
"secs": 60,
"way": 1,
"id": "",
}库存参数 param_stock
- 进入该菜单后,发送库存参数拉取请求。修改保存后,发送库存参数保存请求
- 服务器收到设备上行后,下发最新库存参数
Name:tRequiredType:string
Default Value: param_stock
数据包类型
Name:snRequiredType:string
唯一标识SN
服务器填"" 设备状态
Name:tsRequiredType:int
设备发送设备运行时间(秒)
Name:maxRequiredType:int
容器总容量 单位豪升
服务器如实填写
设备如实填写
Name:warnRequiredType:int
预警容量 单位毫升
服务器如实填写
设备如实填写
Name:stopRequiredType:int
停售容量 单位毫升
服务器如实填写
设备如实填写
Name:remainRequiredType:int
剩余库存 单位毫升
服务器如实填写
设备如实填写
Name:sumRequiredType:int
总毫升数 单位毫升
服务器如实填写
设备如实填写
Name:idRequiredType:string
操作员ID
设备传""时代表拉取,非""时代表保存
{
"t": "param_stock",
"sn": "002c00564633501320393635",
"ts": 1785924259,
"max": 1000,
"warn": 20,
"stop": 10,
"remain": 50,
"sum": 100,
"id": "",
}价格参数 param_price
- 进入该菜单后,发送价格参数拉取请求。修改保存后,发送价格参数保存请求
- 服务器收到设备上行后,下发最新价格参数
Name:tRequiredType:string
Default Value: param_price
数据包类型
Name:snRequiredType:string
唯一标识SN
服务器填"" 设备状态
Name:tsRequiredType:int
设备发送设备运行时间(秒)
Name:modeRequiredType:int
Default Value: 0
交易所模式 0:关闭 1: 比例模式 2: 8档固定价
Name:bin_upRequiredType:int
Default Value: 0
比例模式涨幅设置 万分比(0-2000)
Name:bin_dnRequiredType:int
Default Value: 0
比例模式跌幅设置 万分比(0-2000)
Name:bin_secRequiredType:int
Default Value: 0
比例模式时间间隔 秒
Name:x8_secRequiredType:int
Default Value: 0
8档固定价时间间隔 秒
Name:x8_priceRequiredType:array[int, int, int, int, int, int, int, int]
Default Value: [0, 0, 0, 0, 0, 0, 0, 0]
8档固定价价格 分
Name:idRequiredType:string
操作员ID
设备传""时代表拉取,非""时代表保存
{
"t": "param_price",
"sn": "002c00564633501320393635",
"ts": 1785924259,
"mode": 1,
"bin_up": 10,
"bin_dn": 20,
"bin_sec": 60,
"x8_sec": 70,
"x8_price": [10, 20, 30, 40, 50, 60, 70, 80],
"id": "",
}恢复出厂 restore
- 设备发送恢复出厂请求
- 服务器收到设备上行后,下发恢复出厂结果
Name:tRequiredType:string
Default Value: restore
数据包类型
Name:sn
唯一标识SN
服务器填"" 设备状态
Name:tsRequiredType:int
设备发送设备运行时间(秒)
Name:idRequiredType:string
操作员ID
设备传""时代表拉取,非""时代表保存
{
"t": "restore",
"sn": "002c00564633501320393635",
"ts": 1785924259,
"id": "",
}日志 log
- 设备上报日志
Name:tRequiredType:string
Default Value: log
数据包类型
Name:snRequiredType:string
唯一标识SN
服务器填"" 设备状态
Name:tsRequiredType:int
设备发送设备运行时间(秒)
Name:logRequiredType:string
日志内容 utf8编码
{
"t": "log",
"sn": "002c00564633501320393635",
"ts": 1785924259,
"log": "日志内容",
}