# 文档目录 - 简介 - MQTT 认证 - MQTT 连接说明 - MQTT Topic 说明 - 设备 RPC 通信 - 数据定义 - 同步操作接口 - 事件上传 - 常见问题解答 - 版本维护记录 --- # 洗车机 MQTT 通信协议 2025-08-10 # 洗车机 MQTT 通信协议 ## 简介 设备和Web后端通过MQTT协议连接到MQTT Broker,相对于Broker⽽⾔,设备和Web后端都是MQTT客户端。 MQTT Broker可以使⽤阿⾥云物联⽹平台,也可以⾃⼰基于开源MQTT Broker做⼆次开发。 ## MQTT 认证 设备出⼚前写入产品标识、设备名称、设备秘钥三项配置信息(后续简称三元组)和MQTT Broker的信息,按照阿 ⾥云物联⽹平台的认证⽅式,计算出MQTT连接需要的客户端标识、⽤户名称、⽤户密码去连接MQTT Broker。 实例认证信息如下: ```json { "clientId": "${ProductKey}.${DeviceName}|securemode=2,signmethod=hmacsha256,timestamp=17547250 53877|", "username": "${DeviceName}&${ProductKey}", "passwd": "868deee862f87b5d4136e2adf54bfede427ada8e646a4cec52aacfeafc488220", "mqttHostUrl": "${ProductKey}.iot-as-mqtt.cn-shanghai.aliyuncs.com", "port": 1883 } ``` 以下字段在出⼚前使⽤上位机⼯具写入: ProductKey:产品标识 DeviceName:设备名称 DeviceSecure:设备秘钥 MqttHost: MQTT服务器地址(覆盖上⾯的mqttHostUrl) MqttPort: MQTT Broker使⽤的端⼝(覆盖上⾯的port) 对于⽀持WiFi的版本可以提前写入认证信息(ssid和password),也可以通过触摸屏⾃⾏设置。 认证⽅式⻅文档mqtt-sign-demo中的⽰例程序。提供有C、Java、Python、Go、C#、JavaScript等语⾔ 的实现。 clientId字段说明 securemode 加密⽅式,设备固定是2 signmethod 签名算法,设备固定是hmacsha256 timestamp Unix时间戳,单位是毫秒, 系统按照设定的时区来计算。 username 设备名称&产品标识 password 按照阿⾥云物联⽹平台的⽅式进⾏计算。 ## MQTT 连接说明 MQTT连接签名⽰例 # 洗车机 MQTT 通信协议 2025-08-10 ## MQTT Topic 说明 设备主动上报的数据都是Topic: `/${ProductKey}/${DeviceName}/user/report` 设备的RPC同步调 ⽤ Topic中符号+的位置可以是不同的数字,表⽰第N次RPC调⽤,设备会把这个数字原样返回,⽅便调 ⽤和分析问题。 设备会使⽤MQTT协议来尝试进⾏NTP时间同步,如果使⽤⾃建的MQTT Broker不⽀持 也不影响正常使⽤。 作⽤ Topic名称 说明 设备主动上 报数据 /${ProductKey}/${DeviceName}/user/report 设备发布Topic(后端订阅来 接收数据) 接收RPC请 求 /sys/${ProductKey}/${DeviceName}/rrpc/request/+ 设备订阅的Topic(后端发布 Topic) 回复RPC请 求 /sys/${ProductKey}/${DeviceName}/rrpc/response/+ 设备发布Topic(后端订阅来 接收回复) 请求NTP时 间同步 /ext/ntp/${ProductKey}/${DeviceName}/request 设备发布Topic(后端订阅来 接收回复) 接收NTP时 间信息 /ext/ntp/${ProductKey}/${DeviceName}/response 设备订阅的Topic(后端收到 请求后,发布Topic来回复 NTP时间) ## 设备 RPC 通信 请求和回复都使⽤JSON字符串格式,通过兼容MQTT的RPC接⼝来实现。下⾯ 为简化调试和接⼝处理, 配置或参数项只使⽤字符串和整数两种类型(不⽀持布尔类型和浮点类型)。 设备订阅请求:/sys/${ProductKey}/${DeviceName}/rrpc/request/+ 设备发布应答:/sys/${ProductKey}/${DeviceName}/rrpc/response/+ 参考⽰例如下: 请求 请求是指通过阿⾥云物联⽹平台发送给设备的数据。 version协议版本号,⽬前固定为2.0。 method 要调⽤的远程⽅法名称。 params ⽅法要传递的参数。 ```json { "version": "2.0", "method": "help", "params": [] } ``` 回复 # 洗车机 MQTT 通信协议 2025-08-10 回复是设备通过阿⾥云物联⽹平台返回的数据。 code 操作状态码。 200 操作成功。 400 错误的请求。 404 没有找到数据。 code_msg 状态码文本解释。 data ⽅法执⾏返回的数据。 errors 如果执⾏出错,这⾥返回具体的错误原因,没有错误返回空。 ```json { "version": "2.0", "code": 200, "code_msg": "success", "data": { "api_list": [ "help", "reboot", "query_state", "query_hardware_info", "create_order", "close_order", "query_order", "read_config", "write_config", "show_msgbox", "hide_msgbox" ] }, "errors": [] } ``` ## 数据定义 ### 设备状态 device_state state 设备的状态(重要)。 init 设备正在初始化(启动阶段,只有在主动上报的启动事件中才可能会出现)。 idle 设备空闲,可以创建订单,开机洗⻋。 busy 设备忙碌,正在洗⻋,不能再次创建订单。 sleep 不在营业时间段,不能创建订单洗⻋。 maintenance 维护模式,不能创建订单洗⻋。 fault 设备故障状态,不能创建订单洗⻋(预留,后续4G版本⽀持)。 fault_reason 故障原因(4G版本⽀持)。 fsm_state 设备主状态机的当前状态(状态可能增加或减少,仅供调试参考。)。 uptime_ms 本次上电以来的时间戳。 boot_flag 启动标识(芯片相关,⼆次开发⽆需关⼼)。 has_water 是否有⽔ # 洗车机 MQTT 通信协议 2025-08-10 -1 不⽀持或未开启 0 表⽰没有⽔ 1 表⽰有⽔ has_foam 是否有泡沫 -1 不⽀持或未开启 0 表⽰没有泡沫 1 表⽰有泡沫 temperature_chip 板载温度传感器的温度值。 ```json { "uptime_ms": "47141", "boot_flag": "software", "state": "idle", "fsm_state": "play", "has_water": -1, "has_foam": -1, "temperature_chip": 34 } ``` ### ⽹络状态 type ⽹络类型。 rssi 信号质量 ber 误码率。 imei ⽹络设备的IMEI号。 ```json { "type": "2G", "rssi": 13, "ber": 0, "imei": "8646260436889" }, ### 订单信息 order_info 如果当前正在洗⻋,那么会发送回来订单信息(参考query_order接⼝)。 open_type 开机⽅式。 button 表⽰使⽤机器的维护按钮快速开机的订单。 network 表⽰通过⽹络命令推送来的订单。 coin 表⽰投币开机的订单。 card 表⽰刷卡卡机的订单。 注意:后续可能会增加其它的开机⽅式。 close_type 关机⽅式。 button ⽤户按关机按钮关闭的机器。 network 通过⽹络命令关闭的机器。 no_balance 消费⾦额达到本次开机的最⼤消费⾦额(prepay_money)限制关机的。 # 洗车机 MQTT 通信协议 2025-08-10 idle_timeout 设备空闲超时(⻅配置项idle_timeout)关机的。 operation_timeout 操作超时(⻅配置项operation_timeout)关机的。 card 表⽰刷卡关机的订单。 注意:为空表⽰还没有关机,⽤户正在使⽤。后续可能会增加其它的关机⽅式。 order_id 订单号,和开机命令的order_id相同,如果使⽤按钮快速开机,order_id是空字符串, 并且open_type为button。 order_id_local 本机订单号(不保证连续)。 member_discount 会员折扣比例(0-100,100表⽰不享受折扣,95表⽰9.5折优惠)。 prepay_money 本次开机的预付⾦额(单位分,本次开机最⼤消费⾦额限制)。 amount 消费总额,等于各单项费⽤之和(单位分)。 amount_receivable 应收⾦额,如果⼤于预付⾦额,则限制为预付⾦额并关机,否则等于消费总 额(单位分)。 amount_received 实收⾦额等于应收⾦额乘会员折扣(单位分)。 discount_money 优惠⾦额等于消费总额减去实收⾦额(单位分)。 coin_money 投币的累计⾦额(仅限刷卡订单,单位分)。 coin_num 投币的次数仅限刷卡订单)。 card_type 卡类型(仅限刷卡订单,1表⽰普通卡,2表⽰储值卡)。 card_id 卡内码,卡出⼚的时候⼚家写入的ID(仅限刷卡订单)。 card_sn 卡串号,印刷在卡的表⾯,通过电脑上的卡管理⼯具写入卡内。(仅限刷卡订单)。 card_expired 卡过期时间,从1970年开始的时间戳(仅限刷储值卡的订单有效,普通卡为总是为 0)。 card_balance 卡内余额(仅限刷储值卡的订单有效,普通卡为总是为0)。 operation_remain_time 订单操作剩余操作时间(单位秒),开机后从operation_timeout开始每 秒减1,减到0关机,关机原因close_type=operation_timeout。 idle_remain_time 设备空闲关机倒计时剩余时间(单位秒),开机后从idle_timeout开始每秒减 1,⻅到0关机,关机原因close_type=idle_time(递减过程中按任意功能键,重新开始从 idle_timeout递减)。 detail 费⽤明细。 name 名称 price 单价(单位分) seconds 时⻓(单位秒) amount 费⽤(单位分)。 space ⻋位或场地。 water ⾼压清⽔。 foam 泡沫。 cleaner 吸尘器。 tap ⽔龙头。 user_ext ⽤户扩展,消毒或吹⼲等功能。 coat 镀膜。 blow 吹⽓。 { "open_type": "button", "close_type": "", "order_id": "", # 洗车机 MQTT 通信协议 2025-08-10 "order_id_local": "2", "member_discount": 100, "prepay_money": 1000, "amount": 40, "amount_receivable": 40, "amount_received": 40, "discount_money": 0, "remain_time": 3371, "detail": [ { "name": "space", "price": 2, "seconds": 229, "amount": 7 }, { "name": "water", "price": 100, "seconds": 5, "amount": 8 }, { "name": "foam", "price": 200, "seconds": 5, "amount": 16 }, { "name": "tap", "price": 50, "seconds": 1, "amount": 0 }, { "name": "cleaner", "price": 80, "seconds": 3, "amount": 4 }, { "name": "user_ext", "price": 100, "seconds": 3, "amount": 5 } ] } ``` 应收实收⾦额的计算 单项费⽤都按秒计算,计算⽅法如下: # 洗车机 MQTT 通信协议 2025-08-10 //根据时间计算价格 static uint32_t calc_fee(uint32_t seconds, uint32_t price) ```json { return 1.0F * seconds / 60 * price; } ``` 应收⾦额amount_receivable 由单项的费⽤相加所得,应收⾦额达到预付⾦额就会停⽌设备。 由于存在1秒时间可能增加1分钱或2分钱的情况,那么折扣比例为100时,也存在优惠⾦额不为零的情 况。 计算⽅法如下: //各收费项之和 order->amount = money; //计算应收⾦额 if (order->amount >= order->prepay_money) { order->amount_receivable = order->prepay_money; stop = 1; } else { order->amount_receivable = order->amount; } //检查折扣比例 if ((order->discount_money < 0) || (order->discount_money > 100)) { order->discount_money = 100; } //计算实收⾦额 order->amount_received = 1.0F * order->amount_receivable * order- >member_discount / 100 + 0.5F; //计算优惠⾦额 if (order->amount >= order->amount_received) { order->discount_money = order->amount - order->amount_received; } else { order->discount_money = 0; } ### 参数配置项 maintenance_mode 维护模式 0 未设置 1 已设置(屏幕显⽰设备维护界⾯). user_message.1 ⽤户⾃定义信息,屏幕左下⾓文本,可以显⽰公司名称、维护电话、客服电话等。 user_message.2 ⽤户⾃定义信息,屏幕右下⾓文本,可以显⽰公司名称、维护电话、客服电话等。 # 洗车机 MQTT 通信协议 2025-08-10 sensor_water 是否安装了⽔流量传感器。 price_space ⻋位或场地单价(单位:分/分钟)。 price_water 清⽔单价(单位:分/分钟)。 price_foam 泡沫单价(单位:分/分钟)。 price_tap ⽔龙头单价(单位:分/分钟)。 price_cleaner 吸尘器单价(单位:分/分钟)。 price_user_ext ⽤户扩展功能单价(消毒、吹⼲等,单位:分/分钟)。 price_coat 镀膜的单价(单位:分/分钟)。 price_blow 吹⽓的单价(单位:分/分钟)。 idle_timeout 空闲超时,多久不操作设备(⽤户开关功能重新开始倒计时),那么就认为⽤户已离开,直接 关闭设备(单位:秒)。 operation_timeout 操作超时,订单开始之后多久强制关闭,也就是⽤户必须要再多⻓时间内洗完⻋ (单位:秒)。 quick_open_money 快速开机⾦额,按机箱内部的维护按键直接开机(设置为0可以关闭这个功能)。 work_mode 营业时间段控制模块的⼯作模式 0 全天24⼩时暂停营业 1 全天24⼩时营业 2 由时间段控制营业时间,不在营业时间段⽆法开机,屏幕显⽰营业时间信息。 例如: 上午营业 "work_time_period.1" = "08:00 - 12:00"和下午营 业"work_time_period.2 = "13:30 - 20:00" work_time_period.1 营业时间段1,24⼩时制,程序会处理跨凌晨的情况。 work_time_period.2 营业时间段1,24⼩时制,程序会处理跨凌晨的情况。 light_mode 照明时间段控制模块的⼯作模式 0 全天24⼩时关闭照明 1 全天24⼩时开启照明 2 由时间段控制开灯时间 例如: 整个晚上亮灯"light_time_period.1" = "18:30 - 07:30" 晚上亮灯 "light_time_period.1" = "18:30 - 22:30"和早上亮灯"light_time_period.2 = "05:00 - 7:00" light_time_period.1 照明时间段1,参考营业时间段配置。 light_time_period.2 照明时间段1,参考营业时间段配置。 sound_volume ⾳量。 # 洗车机 MQTT 通信协议 2025-08-10 screen_type 屏幕类型(0:不⽀持视频播放的屏幕,1:⽀持视频播放的屏幕,两种屏型号不同,填写错误会 导致没有语⾳。) video_source 视频源(0:内置视频,1:TF卡内的视频,2:U盘内的视频)。 video_play_delay 视频播放延时(单位秒)。设备空闲多久开始循环播放⼴告视频。 work_light_delay 订单结束时延时过久关闭⼯作指⽰灯(单位秒)。 bill_delay 洗⻋结束后,费⽤明细⻚⾯显⽰多久(单位秒)。 errors 如果有参数出现错误,这⾥给出提⽰信息。 notice_throshold_idle 空闲关机倒计时剩余时间⼩于这个数字,发出提⽰⾳(正在倒计时关机,请按 任意功能键阻⽌关机)。 notice_throshold_operation 操作时间倒计时剩余时间⼩于这个数字,发出提⽰⾳(您的洗⻋时间剩 余不多了,请合理使⽤)。 motor_mode 0:流量不能启动电机();1:有⽔流量的时候启动⾃动启动电机(兼容老客户,新客户请忽略 该参数,请不要发送这个参数给板⼦。)。 motor_on_delay 电机启动最少要⼯作多⻓时间(单位毫秒,请勿随意修改。)。 motor_off_delay 电机关闭后要强制保持关闭状态多⻓时间(单位毫秒,请勿随意修改)。 motor_on_interval 电机关机灵敏度(有流量计有效,单位毫秒,请勿随意修改)。 motor_flow_on 电机是否根据流量启动(有流量⾃动开启电机,请勿随意修改)。 motor_flow_off 电机是否根据流量关闭(⽆流量⾃动关闭电机,请勿随意修改)。 tap_on_delay ⽔龙头开启延时(单位秒,⽔龙头开启多少秒后⾃动关闭,0表⽰不⾃动关闭。) coin_money 投币信号的币值,也就是⼀个币是多少钱单位分(如⼈⺠币1元设置为100,港币5元,设置 为500)。 coin_num 投币的数量,对于同时接收超过⼀种币值的投币器,投币数量是⽆效的,这个数值等于投币器 发出的脉冲数量。 card_key 卡密码,只有相同密码的卡可以通⽤(注意:这个密码要和使⽤卡管理⼯具初始化卡的时候写 入的密码⼀致,写入后不能再次修改,否则由于和机器上密码不⼀致就不能使⽤了 ,机器总是提⽰卡读 取错误!)。 prepay_money 每次开机的最⼤消费限额(单位分,建议和创建订单的参数prepay_money保持⼀致)。 coat_mode 为0表⽰关闭,为1表⽰使⽤镀膜功能(注意:这个功能和投币器功能不能同时使⽤。) blow_mode 为0表⽰关闭,为1表⽰使⽤吹⽓功能(注意:这个功能和闸机控制功能不能同时使⽤。) light_alt_mode 为0表⽰作为照明继电器使⽤;为1表⽰作为复⽤的远程控制继电器使⽤。 ⾃动洗⻋机需要配置的⼏个参数 money_unit 货币转换单位,如⼈⺠币对应的是100。 # 洗车机 MQTT 通信协议 2025-08-10 pay_money_ch1 ⾃动洗⻋机的通道1对应的⾦额。 pay_money_ch2 ⾃动洗⻋机的通道2对应的⾦额。 pay_money_ch3 ⾃动洗⻋机的通道3对应的⾦额。 pay_money_ch4 ⾃动洗⻋机的通道4对应的⾦额。 ```json { "maintenance_mode": 0, "user_message.1": "", "user_message.2": "武汉爱⻋轩科技有限公司", "sensor_water": 1, "price_space": 2, "price_water": 100, "price_foam": 200, "price_tap": 50, "price_cleaner": 80, "price_user_ext": 100, "idle_timeout": 600, "operation_timeout": 3600, "quick_open_money": 1000, "work_mode": 1, "work_time_period.1": "08:00 - 20:00", "work_time_period.2": "14:00 - 20:00", "light_mode": 0, "light_time_period.1": "11:46 - 16:48", "light_time_period.2": "13:44 - 13:45", "sound_volume": 70, "screen_type": 1, "video_source": 2, "video_play_delay": 15, "work_light_delay": 10, "bill_delay": 10, "notice_throshold_idle": 300, "notice_throshold_operation": 600, "motor_mode": 0 } ``` ### 主板信息 hard_version 硬件版本号定义。 chip_id 芯片的唯⼀ID. firmware_version 固件版本定义。 build_time 固件的编译时间。 ```json { "hard_version": "3.3", "chip_id": "CAB1001F-00039018-49044E45", "firmware_version": "3.0.0", "build_time": "Aug 11 2020 14:58:27" } ``` # 洗车机 MQTT 通信协议 2025-08-10 ## 同步操作接口 ### 帮助命令 获取API列表 请求 ```json { "version": "2.0", "method": "help", "params": [] } ``` 回复 ```json { "version": "2.0", "code": 200, "code_msg": "success", "data": { "api_list": [ "help", "reboot", "query_state", "query_hardware_info", "create_order", "close_order", "query_order", "read_config", "write_config", "show_msgbox", "hide_msgbox" ] }, "errors": [] } ``` 获取API帮助信息 请求 ```json { "version": "2.0", "method": "help", # 洗车机 MQTT 通信协议 2025-08-10 "params": { "method": "create_order" } } ``` 回复 ```json {、 "version": "2.0", "code": 200, "code_msg": "success", "data": { "method": "create_order", "help": "打开设备(打开订单);order_id 订单号 必须 字符串类型;prepay_money 预付 ⾦额(本次开机最⼤可消费⾦额) 必须 整数类型 单位分;member_balance 会员余额 可选 整数类型 单位分 (仅⽤于显⽰);member_name 会员名称 可选 字符串类型;member_discount 会员折扣 可选 整数类型(0-100,默认为100,表⽰不折扣);" }, "errors": [] } ``` ### 显⽰消息对话框 请求 注意:系统只能显⽰⼀个对话框,新的对话框会把旧的覆盖掉。 title 参考数据定义中的设备状态。 content 参考数据定义中的订单信息(只有在洗⻋状态state=busy才会传回来)。 seconds 显⽰时⻓,单位秒,时间到了对话框⾃动消失。 ```json { "version": "2.0", "method": "show_msgbox", "params": { "title": "标题", "content": "内容", "seconds": 600 } } ``` 回复 ```json { "version": "2.0", "code": 200, # 洗车机 MQTT 通信协议 2025-08-10 "code_msg": "success", "data": [], "errors": [] } ``` ### 隐藏消息对话框 请求 ```json { "version": "2.0", "method": "hide_msgbox", "params": [] } ``` 回复 ```json { "version": "2.0", "code": 200, "code_msg": "success", "data": [], "errors": [] } ``` ### 重启设备 请求 注意:在洗⻋的时候或者账单明细⻚⾯,设备不会重启(在等待重启),重启前由3-5秒左右的延时(防⽌⽹ 络数据没有发送完成)。 ```json { "version": "2.0", "method": "reboot", "params": [] } ``` 回复 ```json { "version": "2.0", "code": 200, # 洗车机 MQTT 通信协议 2025-08-10 "code_msg": "success", "data": [], "errors": [] } ``` ### 查询设备状态 请求 ```json { "version": "2.0", "method": "query_state", "params": [] } ``` 回复 device_state 参考数据定义中的设备状态。 order_info 参考数据定义中的订单信息(只有在洗⻋状态state=busy才会传回来)。 ```json { "version": "2.0", "code": 200, "code_msg": "success", "data": { "order_info": { "open_type": "network", "close_type": "", "order_id": "1597482244", "order_id_local": "101128414", "member_discount": 95, "prepay_money": 1000, "amount": 0, "amount_receivable": 0, "amount_received": 0, "discount_money": 0, "operation_remain_time": 3591, "idle_remain_time": 591, "detail": [ { "name": "space", "price": 2, "seconds": 8, "amount": 0 }, { "name": "water", "price": 100, # 洗车机 MQTT 通信协议 2025-08-10 "seconds": 0, "amount": 0 }, { "name": "foam", "price": 200, "seconds": 0, "amount": 0 }, { "name": "tap", "price": 50, "seconds": 0, "amount": 0 }, { "name": "cleaner", "price": 80, "seconds": 0, "amount": 0 }, { "name": "user_ext", "price": 100, "seconds": 0, "amount": 0 } ] }, "device_state": { "uptime_ms": "95282", "boot_flag": "software", "state": "busy", "fsm_state": "work", "has_water": -1, "has_foam": -1, "temperature_chip": 34 } }, "errors": [] } ``` ### 查询硬件信息 请求 ```json { "version": "2.0", "method": "query_hardware_info", "params": [] } ``` # 洗车机 MQTT 通信协议 2025-08-10 回复 network 参考数据定义中的⽹络状态。 board 参考数据定义中的主板信息。 ```json { "version": "2.0", "code": 200, "code_msg": "success", "data": { "network": { "type": "2G", "rssi": 13, "ber": 0, "imei": "8646260436889" }, "board": { "hard_version": "3.3", "chip_id": "CAB1001F-00039018-49044E45", "firmware_version": "3.0.0", "build_time": "Aug 11 2020 14:58:27" } }, "errors": [] } ``` ### 创建订单 请求 order_id 订单号,字符串类型,必须。 member_name 会员名称,字符串类型,可选。 member_balance 会员余额(单位分,仅在界⾯上显⽰,不参与任何业务处理),可选。 member_discount 会员折扣比例(95表⽰9.5折优惠,默认100表⽰没有优惠),可选。 prepay_money 预付⾦额(本次开机最⼤消费⾦额),单位分,必须。 card_sn 刷卡的串号(对于刷普通卡的⽤户,服务器端应当在收到刷卡消息的时候查询这张卡绑定的账号 信息,如果这个账号有余额,那么推送开机命令的时候需要把上传的刷卡事件中的card_sn回传回去, 这样板⼦会把这个开机命令标记为刷卡开机,否则会标记为⽹络开机。)。 ext_msg 订单的扩展信息,字符串类型。 对于⾃动洗⻋机,使⽤扩展信息来表⽰需要打开那个通道,也就是对应的套餐,⾃动洗⻋机⽀持4个 通道,对应的是1到4。格式为: "ext_msg": "ch=1"。上报的其他数据和⾃助洗⻋的都是⼀样的, 订单没有详细信息。⾃动洗⻋机的订单也不⽀持远程关闭。 ```json { "version": "2.0", "method": "create_order", # 洗车机 MQTT 通信协议 2025-08-10 "params": { "order_id": "1597482244", "member_name": "会员名称", "member_balance": 9800, "member_discount": 95, "prepay_money": 1000 } } ``` 回复 accepted 创建了新订单返回1,订单已存在返回0. order_id_local 本机订单号(不保证连续) ```json { "version": "2.0", "code": 200, "code_msg": "success", "data": { "order_id_local": "101128414", "created": 1 }, "errors": [] } ``` ### 关闭订单 请求 以下两个参数根据情况,⼆选⼀即可。推荐指定订单号来关闭(如果指定了订单号,当订单号和当前订单 的订单号不同时,认为订单已关闭,回复200)。 order_id 如果当前订单的订单号和order_id相同,则执⾏关闭操作(注意:创建订单和关闭订单的订单 号需要保持⼀致,否则⽆法关机。)。 force_close 如果不知道订单号,需要强制关闭设备,那么就⽤这个参数(这时候不要再发送order_id参 数)。 ```json { "version": "2.0", "method": "close_order", "params": { "order_id": "1597482244", "force_close": 1 } } ``` # 洗车机 MQTT 通信协议 2025-08-10 回复 ```json { "version": "2.0", "code": 200, "code_msg": "success", "data": [], "errors": [] } ``` ### 查询订单 请求 注意:只能查询当前订单和上⼀个订单的信息,2G版本重启后不能查询之前的订单信息。 ```json { "version": "2.0", "method": "query_order", "params": { "order_id": "1597482244" } } ``` 正常回复 如果存在,回复200,由订单信息回复,如果订单不存在,回复状态码400。 ```json { "version": "2.0", "code": 200, "code_msg": "success", "data": { "order_info": { "open_type": "network", "close_type": "", "order_id": "1597482244", "order_id_local": "101128414", "member_discount": 95, "prepay_money": 1000, "amount": 0, "amount_receivable": 0, "amount_received": 0, "discount_money": 0, "operation_remain_time": 3596, "idle_remain_time": 596, "detail": [ # 洗车机 MQTT 通信协议 2025-08-10 { "name": "space", "price": 2, "seconds": 4, "amount": 0 }, { "name": "water", "price": 100, "seconds": 0, "amount": 0 }, { "name": "foam", "price": 200, "seconds": 0, "amount": 0 }, { "name": "tap", "price": 50, "seconds": 0, "amount": 0 }, { "name": "cleaner", "price": 80, "seconds": 0, "amount": 0 }, { "name": "user_ext", "price": 100, "seconds": 0, "amount": 0 } ] } }, "errors": [] } ``` 未找到订单,回复信息 注意:只能查询当前订单和上⼀个订单的信息,2G版本重启后不能查询之前的订单信息。 ```json { "version": "2.0", "code": 404, "code_msg": "not found", # 洗车机 MQTT 通信协议 2025-08-10 "data": [], "errors": [] } ``` ### 读取配置 请求 ```json { "version": "2.0", "method": "read_config", "params": [] } ``` 回复 ```json { "version": "2.0", "code": 200, "code_msg": "success", "data": { "maintenance_mode": 0, "user_message.1": "公司名称1597484391", "user_message.2": "客服电话1597484391", "sensor_water": 0, "price_space": 2, "price_water": 110, "price_foam": 220, "price_tap": 55, "price_cleaner": 88, "price_user_ext": 102, "idle_timeout": 2100, "operation_timeout": 2700, "quick_open_money": 1099, "work_mode": 2, "work_time_period.1": "08:00 - 20:00", "work_time_period.2": "14:00 - 20:00", "light_mode": 2, "light_time_period.1": "11:46 - 16:48", "light_time_period.2": "13:44 - 13:45", "sound_volume": 70, "screen_type": 0, "video_source": 0, "video_play_delay": 120, "work_light_delay": 30, "bill_delay": 60, "notice_throshold_idle": 300, "notice_throshold_operation": 600, # 洗车机 MQTT 通信协议 2025-08-10 "motor_mode": 0 }, "errors": [] } ``` ### 修改配置 请求 ```json { "version": "2.0", "method": "write_config", "params": { "maintenance_mode": 0, "user_message.1": "公司名称1597484391", "user_message.2": "客服电话1597484391", "sensor_water": 0, "price_space": 2, "price_water": 110, "price_foam": 220, "price_tap": 55, "price_cleaner": 88, "price_user_ext": 102, "idle_timeout": 2100, "operation_timeout": 2700, "quick_open_money": 1099, "work_mode": 2, "work_time_period.1": "08:00 - 20:00", "work_time_period.2": "14:00 - 20:00", "light_mode": 2, "light_time_period.1": "11:46 - 16:48", "light_time_period.2": "13:44 - 13:45", "sound_volume": 70, "screen_type": 0, "video_source": 0, "video_play_delay": 120, "work_light_delay": 30, "bill_delay": 60, "notice_throshold_idle": 300, "notice_throshold_operation": 600 } } ``` 回复 ```json { "version": "2.0", # 洗车机 MQTT 通信协议 2025-08-10 "code": 200, "code_msg": "success", "data": [], "errors": [] } ``` ### 继电器控制命令 这个命令⽤于控制继电器,需要先设置照明继电器复⽤参数light_alt_mode。 relay 继电器的编号,⽬前固定为1. action 要执⾏的动作。 on 打开继电器。 off 关闭继电器。 toggle 切换继电器的状态。 query 查询继电器的状态。 delay_ms 动作时间,单位是毫秒,如果为零,表⽰保持在动作后的状态。 请求 ```json { "method": "relay_control", "params": { "relay": 1, "action": "on", "delay_ms": 1000 }, "version": "2.0" } ``` 回复 ```json { "version": "2.0", "code": 200, "code_msg": "success", "data": { "relay_state": 1 }, "errors": [ ] } ``` ## 事件上传 ### 设备启动事件 # 洗车机 MQTT 通信协议 2025-08-10 设备上电启动, ⽰例 ```json { "version": "2.0", "event": "boot", "data": { "device_state": { "uptime_ms": "47139", "boot_flag": "software", "state": "idle", "fsm_state": "play", "has_water": -1, "has_foam": -1, "temperature_chip": 34 } } } ``` ### 设备状态更新事件 ⽰例 ```json { "version": "2.0", "event": "device_state", "data": { "device_state": { "uptime_ms": "29702", "boot_flag": "software", "state": "idle", "fsm_state": "play", "has_water": -1, "has_foam": -1, "temperature_chip": 33 } } } ``` ### 收到订单事件 ⽰例 收到订单时上传,包含订单信息。 ```json { "version": "2.0", # 洗车机 MQTT 通信协议 2025-08-10 "event": "order_create", "data": { "order_info": { "open_type": "network", "close_type": "", "order_id": "1597485911", "order_id_local": "104657724", "member_discount": 95, "prepay_money": 1000, "amount": 0, "amount_receivable": 0, "amount_received": 0, "discount_money": 0, "operation_remain_time": 3600, "idle_remain_time": 600, "detail": [ { "name": "space", "price": 2, "seconds": 0, "amount": 0 }, { "name": "water", "price": 100, "seconds": 0, "amount": 0 }, { "name": "foam", "price": 200, "seconds": 0, "amount": 0 }, { "name": "tap", "price": 50, "seconds": 0, "amount": 0 }, { "name": "cleaner", "price": 80, "seconds": 0, "amount": 0 }, { "name": "user_ext", "price": 100, "seconds": 0, "amount": 0 } ] } # 洗车机 MQTT 通信协议 2025-08-10 } } ``` ### 关闭订单事件 ⽰例 关闭设备时上传,包含订单信息。 ```json { "version": "2.0", "event": "order_close", "data": { "order_info": { "open_type": "network", "close_type": "network", "order_id": "1597485911", "order_id_local": "104657724", "member_discount": 95, "prepay_money": 1000, "amount": 88, "amount_receivable": 88, "amount_received": 83, "discount_money": 5, "operation_remain_time": 3528, "idle_remain_time": 600, "detail": [ { "name": "space", "price": 2, "seconds": 72, "amount": 2 }, { "name": "water", "price": 100, "seconds": 0, "amount": 0 }, { "name": "foam", "price": 200, "seconds": 0, "amount": 0 }, { "name": "tap", "price": 50, "seconds": 0, "amount": 0 }, # 洗车机 MQTT 通信协议 2025-08-10 { "name": "cleaner", "price": 80, "seconds": 65, "amount": 86 }, { "name": "user_ext", "price": 100, "seconds": 0, "amount": 0 } ] } } } ``` ### 订单状态更新事件 ⽰例 ⽤来让服务器知道订单的当前状态,以下两个条件只要满⾜其中⼀个就上传⼀次。 订单的应收⾦额和上次上传的应收⾦额⼤于等于1元则上传⼀次。 如果⾦额不变,每个3分钟上传⼀次。 ```json { "version": "2.0", "event": "order_update", "data": { "order_info": { "open_type": "network", "close_type": "", "order_id": "1597485911", "order_id_local": "104657724", "member_discount": 95, "prepay_money": 1000, "amount": 88, "amount_receivable": 88, "amount_received": 83, "discount_money": 5, "operation_remain_time": 3528, "idle_remain_time": 600, "detail": [ { "name": "space", "price": 2, "seconds": 72, "amount": 2 }, { "name": "water", # 洗车机 MQTT 通信协议 2025-08-10 "price": 100, "seconds": 0, "amount": 0 }, { "name": "foam", "price": 200, "seconds": 0, "amount": 0 }, { "name": "tap", "price": 50, "seconds": 0, "amount": 0 }, { "name": "cleaner", "price": 80, "seconds": 65, "amount": 86 }, { "name": "user_ext", "price": 100, "seconds": 0, "amount": 0 } ] } } } ``` ### ⽤户登录事件 **注意:设备端登录的⽤户名和密码只能是纯数字,对于⽯斑⻥平台⽤户名通常是⼿机号码 ** ```json { "version": "2.0", "event": "user_login", "data": { "name": "123456", "password": "123456" } } ``` ### ⽤户刷卡事件 注意:⽆论⽤户刷的是普通卡还是储值卡,都会上传这个事件。 对于储值卡总是可以刷卡开关机,如果设备在 线则上传,不在线则不上传。各字段的意义请参考订单信息中的解释。 # 洗车机 MQTT 通信协议 2025-08-10 ```json { "version": "2.0", "event": "card_event", "data": { "card_type": 1, "card_id": 982334256, "card_sn": 123456, "card_expired": 0, "card_balance": 0 } } ``` ## 常见问题解答 如何知道设备是否在在线 1、从MQTT Broker来查询设备是否在线,需要查阅相关Broker实现的文档(推荐)。 2、通过MQTT遗嘱消息来实 现,由于阿⾥云物联⽹平台不⽀持该功能,为保持兼容,设备端未实现该⽅法。 3、通过RPC同步调⽤来实时的 获取设备是否在线。由于4G⽹络延时,可能会出现响应超时,响应较慢。WiFi⽹络下响应较快,有条件可以使 ⽤WiFi⽹络。 ## 版本维护记录 2025年8⽉8⽇ 增加MQTT协议的Topic和连接MQTT Broker的说明。 2024年8⽉15⽇ 增加对⾃动洗⻋机的⽀持。在创建订单的时候通过"ext_msg": "ch=1"来指定要打开的通道。 2023年10⽉26⽇ 增加照明继电器复⽤为远程控制继电器的功能。 使⽤时需要先设置参数light_alt_mode ,然后使⽤API命令relay_control来控制继电器。 2023年9⽉5⽇ 增加语⾳播放器类型字段player_type,类型为整形,取值为0使⽤默认的语⾳合成功能播放,取值为1使 ⽤屏幕语⾳文件播放。 2023年7⽉22⽇ 增加对show_msgbox和hide_msgbox接⼝的描述。这两个api可以使⽤help命令查到都可以使 ⽤。 2022年11⽉7⽇ 增加镀膜和吹⽓功能的配置项。 2021年1⽉29⽇ 增加清⽔泡沫是否联动配置项(foam_link_mode)为1表⽰打开泡沫的时候⾃动打开清⽔,为0表⽰ 单独控制模式。 2021年1⽉12⽇ 增加根据流量收费模式(motor_fee_flow为1表⽰根据流量收费,为0表⽰正常收费模式)。 2020年12⽉16⽇ 增加投币时上传⼀次订单信息变化事件(order_update),让服务器及时知道⽤户投了多少钱的 币。 2020年12⽉15⽇ # 洗车机 MQTT 通信协议 2025-08-10 增加刷卡功能,参数card_key表⽰卡密码,相同密码的卡可以通⽤,不同密码的卡不能通⽤。 卡分为普通卡和储值卡两种。普通卡只能⽹络在线时使⽤,可以通过⽹络充值,挂失(⼆次开发的 客户请⾃⼰处理)。储值卡⽆论⽹络在线还是离线都可以正常刷卡使⽤,不能⽹络充值和挂失(设备 ⽹络在线就上传记录<订单创建、订单更新、订单关闭>,不在线就不上传)。 2020年12⽉10⽇ 增加投币功能,参数coin_money 表⽰币值,表⽰⼀个投币信号代表多少钱(单位分,设备⽹络在 线就上传记录<订单创建、订单更新、订单关闭>,不在线就不上传)。 2020年11⽉12⽇ 增加打开⽔龙头超时⾃动关闭的功能(参数tap_on_delay)。 2020年11⽉8⽇ 增加电机控制模块的参数远程修改功能(参数motor_on_delay、motor_off_delay、 motor_on_interval、motor_flow_on、motor_flow_off)。 2020年11⽉6⽇ 增加设备端登录功能,⽤户点击登录,上报事件user_login。 2020年11⽉5⽇ 增加登录界⾯操作超时参数login_timeout(单位秒)。 2020年11⽉3⽇ 增加洗⻋超时时间配置space_timeout_seconds。 增加洗⻋超时后的计费⽅式配置值space_timeout_mode(场地费是否包括超时部分的费⽤)。 0表 ⽰超时后只计算超时部分的费⽤,1表⽰超时后包括超时部分的费⽤。 2020年11⽉2⽇ 增加了流量控制电机启动的配置项motor_mode。 2020年8⽉29⽇ 修复拼写错误。hard_version => hardware_version 修复拼写错误。notice_throshold_idle => notice_threshold_idle。 修复拼写错误。notice_throshold_operation => notice_threshold_operation 所有参数免重启立刻⽣效。 优化EEPROM的操作速度。 设备状态(device.state)变化实时上报事件device_state,如果需要知道那些数据发⽣了变化, 请在服务器端做比较操作。 2020年8⽉16⽇ 发布初始版本。