瀏覽代碼

主板协议相关代码

skyline 1 年之前
父節點
當前提交
c1ca0fbe20
共有 19 個文件被更改,包括 953 次插入0 次删除
  1. 23 0
      car-wash-service/pom.xml
  2. 5 0
      car-wash-service/src/main/java/com/kym/service/aliyun/lot/AliyunLotService.java
  3. 123 0
      car-wash-service/src/main/java/com/kym/service/awoara/AwoaraService.java
  4. 12 0
      car-wash-service/src/main/java/com/kym/service/awoara/entity/ApiList.java
  5. 28 0
      car-wash-service/src/main/java/com/kym/service/awoara/entity/Board.java
  6. 192 0
      car-wash-service/src/main/java/com/kym/service/awoara/entity/Config.java
  7. 33 0
      car-wash-service/src/main/java/com/kym/service/awoara/entity/Detail.java
  8. 61 0
      car-wash-service/src/main/java/com/kym/service/awoara/entity/DeviceState.java
  9. 13 0
      car-wash-service/src/main/java/com/kym/service/awoara/entity/MethodHelp.java
  10. 28 0
      car-wash-service/src/main/java/com/kym/service/awoara/entity/Network.java
  11. 110 0
      car-wash-service/src/main/java/com/kym/service/awoara/entity/OrderInfo.java
  12. 38 0
      car-wash-service/src/main/java/com/kym/service/awoara/entity/request/AwoaraRequest.java
  13. 20 0
      car-wash-service/src/main/java/com/kym/service/awoara/entity/request/CloseOrderRequest.java
  14. 38 0
      car-wash-service/src/main/java/com/kym/service/awoara/entity/request/CreateOrderRequest.java
  15. 19 0
      car-wash-service/src/main/java/com/kym/service/awoara/entity/response/AwoaraResponse.java
  16. 20 0
      car-wash-service/src/main/java/com/kym/service/awoara/entity/response/CreateOrder.java
  17. 16 0
      car-wash-service/src/main/java/com/kym/service/awoara/entity/response/HardwareInfo.java
  18. 16 0
      car-wash-service/src/main/java/com/kym/service/awoara/entity/response/State.java
  19. 158 0
      car-wash-service/src/main/java/com/kym/service/awoara/impl/AwoaraServiceImpl.java

+ 23 - 0
car-wash-service/pom.xml

@@ -43,6 +43,29 @@
             <version>3.2.5</version>
         </dependency>
 
+        <!-- 阿里云物联⽹云端SDK 同步调用版 -->
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>iot20180120</artifactId>
+            <version>5.1.0</version>
+        </dependency>
+
+        <!-- 阿里云物联⽹云端SDK 异步调用版 -->
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>alibabacloud-iot20180120</artifactId>
+            <version>1.0.4</version>
+        </dependency>
+
+
+        <!-- 阿里云消息服务 MNS -->
+        <dependency>
+            <groupId>com.aliyun.mns</groupId>
+            <artifactId>aliyun-sdk-mns</artifactId>
+            <version>1.1.11</version>
+        </dependency>
+
+
     </dependencies>
 
 </project>

+ 5 - 0
car-wash-service/src/main/java/com/kym/service/aliyun/lot/AliyunLotService.java

@@ -0,0 +1,5 @@
+package com.kym.service.aliyun.lot;
+
+public interface AliyunLotService {
+
+}

+ 123 - 0
car-wash-service/src/main/java/com/kym/service/awoara/AwoaraService.java

@@ -0,0 +1,123 @@
+package com.kym.service.awoara;
+
+import com.kym.service.awoara.entity.ApiList;
+import com.kym.service.awoara.entity.Config;
+import com.kym.service.awoara.entity.MethodHelp;
+import com.kym.service.awoara.entity.OrderInfo;
+import com.kym.service.awoara.entity.response.AwoaraResponse;
+import com.kym.service.awoara.entity.response.CreateOrder;
+import com.kym.service.awoara.entity.response.HardwareInfo;
+import com.kym.service.awoara.entity.response.State;
+
+import java.util.Map;
+
+/**
+ * @author skyline
+ * 石斑鱼洗车主板API接口
+ * 2023/8/7 15:06
+ */
+public interface AwoaraService {
+    /**
+     * 获取API列表
+     *
+     * @return
+     */
+    AwoaraResponse<ApiList> help();
+
+    /**
+     * 获取API帮助信息
+     *
+     * @param method
+     * @return
+     */
+    AwoaraResponse<MethodHelp> methodHelp(String method);
+
+    /**
+     * 显⽰消息对话框
+     * 注意:系统只能显⽰⼀个对话框,新的对话框会把旧的覆盖掉
+     * title 参考数据定义中的设备状态。
+     * content 参考数据定义中的订单信息(只有在洗⻋状态state=busy才会传回来)。
+     * seconds 显⽰时⻓,单位秒,时间到了对话框⾃动消失
+     *
+     * @param params
+     * @return
+     */
+    AwoaraResponse<?> showMsgbox(Map<String, Object> params);
+
+    /**
+     * 隐藏消息对话框
+     *
+     * @return
+     */
+    AwoaraResponse<?> hideMsgbox();
+
+    /**
+     * 重启设备
+     * 注意:在洗⻋的时候或者账单明细⻚⾯,设备不会重启(在等待重启),重启前由3-5秒左右的延时(防⽌⽹络数据没有发送完成)。
+     *
+     * @return
+     */
+    AwoaraResponse<?> reboot();
+
+    /**
+     * 查询设备状态
+     *
+     * @return
+     */
+    AwoaraResponse<State> queryState();
+
+    /**
+     * 查询硬件信息
+     *
+     * @return
+     */
+    AwoaraResponse<HardwareInfo> queryHardwareInfo();
+
+    /**
+     * 创建订单
+     * order_id 订单号,字符串类型,必须。
+     * member_name 会员名称,字符串类型,可选。
+     * member_balance 会员余额(单位分,仅在界⾯上显⽰,不参与任何业务处理),可选。
+     * member_discount 会员折扣比例(95表⽰9.5折优惠,默认100表⽰没有优惠),可选。
+     * prepay_money 预付⾦额(本次开机最⼤消费⾦额),单位分,必须。
+     * card_sn 刷卡的串号(对于刷普通卡的⽤户,服务器端应当在收到刷卡消息的时候查询这张卡绑定的账号
+     * 信息,如果这个账号有余额,那么推送开机命令的时候需要把上传的刷卡事件中的card_sn回传回去,
+     * 这样板⼦会把这个开机命令标记为刷卡开机,否则会标记为⽹络开机。)
+     *
+     * @return
+     */
+    AwoaraResponse<CreateOrder> createOrder();
+
+    /**
+     * 关闭订单
+     *
+     * @param params
+     * @return
+     */
+    AwoaraResponse<?> closeOrder(Map<String, Object> params);
+
+    /**
+     * 查询订单
+     * 注意:只能查询当前订单和上⼀个订单的信息,2G版本重启后不能查询之前的订单信息。
+     *
+     * @param orderId
+     * @return
+     */
+    AwoaraResponse<OrderInfo> queryOrder(String orderId);
+
+    /**
+     * 读取配置
+     *
+     * @return
+     */
+    AwoaraResponse<Config> readConfig();
+
+    /**
+     * 修改配置
+     *
+     * @param config
+     * @return
+     */
+    AwoaraResponse<?> writeConfig(Config config);
+
+}

+ 12 - 0
car-wash-service/src/main/java/com/kym/service/awoara/entity/ApiList.java

@@ -0,0 +1,12 @@
+package com.kym.service.awoara.entity;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+@Data
+@Accessors(chain = true)
+public class ApiList {
+    private List<String> api_list;
+}

+ 28 - 0
car-wash-service/src/main/java/com/kym/service/awoara/entity/Board.java

@@ -0,0 +1,28 @@
+package com.kym.service.awoara.entity;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * 主板信息
+ */
+@Data
+@Accessors(chain = true)
+public class Board {
+    /**
+     * 硬件版本号定义
+     */
+    private String hard_version;
+    /**
+     * 芯片的唯⼀ID
+     */
+    private String chip_id;
+    /**
+     * 固件版本定义
+     */
+    private String firmware_version;
+    /**
+     *  固件的编译时间
+     */
+    private String build_time;
+}

+ 192 - 0
car-wash-service/src/main/java/com/kym/service/awoara/entity/Config.java

@@ -0,0 +1,192 @@
+package com.kym.service.awoara.entity;
+
+import com.alibaba.fastjson2.annotation.JSONField;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * 参数配置项
+ */
+@Data
+@Accessors(chain = true)
+public class Config {
+    /**
+     * 维护模式
+     * 0 未设置
+     * 1 已设置(屏幕显⽰设备维护界⾯)
+     */
+    private Integer maintenance_mode;
+    /**
+     * ⽤户⾃定义信息,屏幕左下⾓文本,可以显⽰公司名称、维护电话、客服电话等
+     */
+    @JSONField(name = "user_message.1")
+    private String user_message_1;
+    @JSONField(name = "user_message.2")
+    private String user_message_2;
+    /**
+     * 是否安装了⽔流量传感器
+     */
+    private String sensor_water;
+    /**
+     * ⻋位或场地单价(单位:分/分钟)。
+     */
+    private int price_space;
+    /**
+     * 清⽔单价(单位:分/分钟)。
+     */
+    private int price_water;
+    /**
+     * 泡沫单价(单位:分/分钟)。
+     */
+    private int price_foam;
+    /**
+     * ⽔龙头单价(单位:分/分钟)。
+     */
+    private int price_tap;
+    /**
+     * 吸尘器单价(单位:分/分钟)
+     */
+    private int price_cleaner;
+    /**
+     * ⽤户扩展功能单价(消毒、吹⼲等,单位:分/分钟)。
+     */
+    private int price_user_ext;
+    /**
+     * 镀膜的单价(单位:分/分钟)。
+     */
+    private int price_coat;
+    /**
+     * 吹⽓的单价(单位:分/分钟)。
+     */
+    private int price_blow;
+    /**
+     * 空闲超时,多久不操作设备(⽤户开关功能重新开始倒计时),那么就认为⽤户已离开,直接关闭设备(单位:秒)
+     */
+    private int idle_timeout;
+    /**
+     * 操作超时,订单开始之后多久强制关闭,也就是⽤户必须要再多⻓时间内洗完⻋(单位:秒)
+     */
+    private int operation_timeout;
+    /**
+     * 快速开机⾦额,按机箱内部的维护按键直接开机(设置为0可以关闭这个功能)
+     */
+    private int quick_open_money;
+    /**
+     * 营业时间段控制模块的⼯作模式
+     * 0 全天24⼩时暂停营业
+     * 1 全天24⼩时营业
+     * 2 由时间段控制营业时间,不在营业时间段⽆法开机,屏幕显⽰营业时间信息
+     * 例如: 上午营业 "work_time_period.1" = "08:00 - 12:00"和下午营业"work_time_period.2 = "13:30 - 20:00"
+     */
+    private Integer work_mode;
+    /**
+     * 营业时间段1,24⼩时制,程序会处理跨凌晨的情况
+     */
+    @JSONField(name = "work_time_period.1")
+    private String work_time_period_1;
+    @JSONField(name = "work_time_period.2")
+    private String work_time_period_2;
+    /**
+     * 照明时间段控制模块的⼯作模式
+     * 0 全天24⼩时关闭照明
+     * 1 全天24⼩时开启照明
+     * 2 由时间段控制开灯时间
+     */
+    private Integer light_mode;
+    /**
+     * 照明时间段1,参考营业时间段配置
+     */
+    @JSONField(name = "ight_time_period.1")
+    private String light_time_period_1;
+    @JSONField(name = "ight_time_period.2")
+    private String light_time_period_2;
+    /**
+     * 声音音量(0~100)
+     */
+    private int sound_volume;
+    /**
+     * 屏幕类型(0:不⽀持视频播放的屏幕,1:⽀持视频播放的屏幕,两种屏型号不同,填写错误会导致没有语⾳。)
+     */
+    private int screen_type;
+    /**
+     * 视频源(0:内置视频,1:TF卡内的视频,2:U盘内的视频)
+     */
+    private Integer video_source;
+    /**
+     * 视频播放延时(单位秒)。设备空闲多久开始循环播放⼴告视频。
+     */
+    private int video_play_delay;
+    /**
+     * 订单结束时延时过久关闭⼯作指⽰灯(单位秒)。
+     */
+    private int work_light_delay;
+    /**
+     * 洗⻋结束后,费⽤明细⻚⾯显⽰多久(单位秒)。
+     */
+    private int bill_delay;
+    /**
+     * 如果有参数出现错误,这⾥给出提⽰信息。
+     */
+    private String errors;
+    /**
+     * 空闲关机倒计时剩余时间⼩于这个数字,发出提⽰⾳(正在倒计时关机,请按任意功能键阻⽌关机)
+     */
+    private int notice_throshold_idle;
+    /**
+     * 操作时间倒计时剩余时间⼩于这个数字,发出提⽰⾳(您的洗⻋时间剩余不多了,请合理使⽤)
+     */
+    private int notice_throshold_operation;
+    /**
+     * 0:流量不能启动电机();1:有⽔流量的时候启动⾃动启动电机(兼容老客户,新客户请忽略该参数,请不要发送这个参数给板⼦。)。
+     */
+//    private Integer motor_mode;
+    /**
+     * 电机启动最少要⼯作多⻓时间(单位毫秒,请勿随意修改)
+     */
+    private int motor_on_delay;
+    /**
+     * 电机关闭后要强制保持关闭状态多⻓时间(单位毫秒,请勿随意修改)
+     */
+    private int motor_off_delay;
+    /**
+     * 电机关机灵敏度(有流量计有效,单位毫秒,请勿随意修改)
+     */
+    private int motor_on_interval;
+    /**
+     * 电机是否根据流量启动(有流量⾃动开启电机,请勿随意修改)
+     */
+    private int motor_flow_on;
+    /**
+     * 电机是否根据流量关闭(⽆流量⾃动关闭电机,请勿随意修改)
+     */
+    private int motor_flow_off;
+    /**
+     * ⽔龙头开启延时(单位秒,⽔龙头开启多少秒后⾃动关闭,0表⽰不⾃动关闭。)
+     */
+    private int tap_on_delay;
+    /**
+     * 投币信号的币值,也就是⼀个币是多少钱单位分(如⼈⺠币1元设置为100,港币5元,设置为500)。
+     */
+    private int coin_money;
+    /**
+     * 投币的数量,对于同时接收超过⼀种币值的投币器,投币数量是⽆效的,这个数值等于投币器发出的脉冲数量。
+     */
+    private int coin_num;
+    /**
+     * 卡密码,只有相同密码的卡可以通⽤(注意:这个密码要和使⽤卡管理⼯具初始化卡的时候写入的密码⼀致,写入后不能再次修改,
+     * 否则由于和机器上密码不⼀致就不能使⽤了 ,机器总是提⽰卡读取错误!)
+     */
+    private String card_key;
+    /**
+     * 每次开机的最⼤消费限额(单位分,建议和创建订单的参数prepay_money保持⼀致)
+     */
+    private int prepay_money;
+    /**
+     * 为0表⽰关闭,为1表⽰使⽤镀膜功能(注意:这个功能和投币器功能不能同时使⽤。)
+     */
+    private int coat_mode;
+    /**
+     * 为0表⽰关闭,为1表⽰使⽤吹⽓功能(注意:这个功能和闸机控制功能不能同时使⽤。)
+     */
+    private int blow_mode;
+}

+ 33 - 0
car-wash-service/src/main/java/com/kym/service/awoara/entity/Detail.java

@@ -0,0 +1,33 @@
+package com.kym.service.awoara.entity;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+@Data
+@Accessors(chain = true)
+public class Detail {
+    /**
+     * 费用项名称
+     * space ⻋位或场地。
+     * water ⾼压清⽔。
+     * foam 泡沫。
+     * cleaner 吸尘器。
+     * tap ⽔龙头。
+     * user_ext ⽤户扩展,消毒或吹⼲等功能。
+     * coat 镀膜。
+     * blow 吹⽓
+     */
+    private String name;
+    /**
+     * 单价(单位分)
+     */
+    private int price;
+    /**
+     * 时⻓(单位秒)
+     */
+    private int seconds;
+    /**
+     * 费⽤(单位分)
+     */
+    private int amount;
+}

+ 61 - 0
car-wash-service/src/main/java/com/kym/service/awoara/entity/DeviceState.java

@@ -0,0 +1,61 @@
+package com.kym.service.awoara.entity;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * 设备状态
+ */
+@Data
+@Accessors(chain = true)
+public class DeviceState {
+    /**
+     * 设备的状态
+     * init 设备正在初始化(启动阶段,只有在主动上报的启动事件中才可能会出现)。
+     * idle 设备空闲,可以创建订单,开机洗⻋。
+     * busy 设备忙碌,正在洗⻋,不能再次创建订单。
+     * sleep 不在营业时间段,不能创建订单洗⻋。
+     * maintenance 维护模式,不能创建订单洗⻋。
+     * fault 设备故障状态,不能创建订单洗⻋(预留,后续4G版本⽀持)
+     */
+    private String state;
+    /**
+     * 故障原因(4G版本⽀持)。
+     */
+    private String fault_reason;
+    /**
+     * 设备主状态机的当前状态(状态可能增加或减少,仅供调试参考。)
+     */
+    private String fsm_state;
+    /**
+     * 本次上电以来的时间戳。(ms)
+     */
+    private String uptime_ms;
+    /**
+     * 启动标识(芯片相关,⼆次开发⽆需关⼼)。
+     */
+    private String boot_flag;
+    /**
+     * 是否有⽔
+     * -1 不⽀持或未开启
+     * 0 表⽰没有⽔
+     * 1 表⽰有⽔
+     */
+    private String has_water;
+    /**
+     * 是否有泡沫
+     * -1 不⽀持或未开启
+     * 0 表⽰没有泡沫
+     * 1 表⽰有泡沫
+     */
+    private String has_foam;
+    /**
+     * 板载温度传感器的温度值
+     */
+    private String temperature_chip;
+
+
+
+
+
+}

+ 13 - 0
car-wash-service/src/main/java/com/kym/service/awoara/entity/MethodHelp.java

@@ -0,0 +1,13 @@
+package com.kym.service.awoara.entity;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+@Data
+@Accessors(chain = true)
+public class MethodHelp {
+    private String method;
+    private String help;
+}

+ 28 - 0
car-wash-service/src/main/java/com/kym/service/awoara/entity/Network.java

@@ -0,0 +1,28 @@
+package com.kym.service.awoara.entity;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * 网络状态
+ */
+@Data
+@Accessors(chain = true)
+public class Network {
+    /**
+     * 网络类型
+     */
+    private String type;
+    /**
+     * 信号质量
+     */
+    private String rssi;
+    /**
+     * 误码率
+     */
+    private String ber;
+    /**
+     * ⽹络设备的IMEI号
+     */
+    private String imei;
+}

+ 110 - 0
car-wash-service/src/main/java/com/kym/service/awoara/entity/OrderInfo.java

@@ -0,0 +1,110 @@
+package com.kym.service.awoara.entity;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+/**
+ * 订单信息
+ */
+@Data
+@Accessors(chain = true)
+public class OrderInfo {
+    /**
+     * 开机⽅式。
+     * button 表⽰使⽤机器的维护按钮快速开机的订单。
+     * network 表⽰通过⽹络命令推送来的订单。
+     * coin 表⽰投币开机的订单。
+     * card 表⽰刷卡卡机的订单。
+     * 注意:后续可能会增加其它的开机⽅式。
+     */
+    private String open_type;
+    /**
+     * 关机⽅式。
+     * button ⽤户按关机按钮关闭的机器。
+     * network 通过⽹络命令关闭的机器。
+     * no_balance 消费⾦额达到本次开机的最⼤消费⾦额(prepay_money)限制关机的。
+     * idle_timeout 设备空闲超时(⻅配置项idle_timeout)关机的。
+     * operation_timeout 操作超时(⻅配置项operation_timeout)关机的。
+     * card 表⽰刷卡关机的订单。
+     * 注意:为空表⽰还没有关机,⽤户正在使⽤。后续可能会增加其它的关机⽅式。
+     */
+    private String close_type;
+    /**
+     * 订单号,和开机命令的order_id相同,如果使⽤按钮快速开机,order_id是空字符串,
+     * 并且open_type为button
+     */
+    private String order_id;
+    /**
+     * 本机订单号(不保证连续)。
+     */
+    private String order_id_local;
+    /**
+     * 会员折扣比例(0-100,100表⽰不享受折扣,95表⽰9.5折优惠)。
+     */
+    private int member_discount;
+    /**
+     * 本次开机的预付⾦额(单位分,本次开机最⼤消费⾦额限制)。
+     */
+    private int prepay_money;
+    /**
+     * 消费总额,等于各单项费⽤之和(单位分)
+     */
+    private int amount;
+    /**
+     * 应收⾦额,如果⼤于预付⾦额,则限制为预付⾦额并关机,否则等于消费总额(单位分)。
+     */
+    private int amount_receivable;
+    /**
+     * 实收⾦额等于应收⾦额乘会员折扣(单位分)。
+     */
+    private int amount_received;
+    /**
+     * 优惠⾦额等于消费总额减去实收⾦额(单位分).
+     */
+    private int discount_money;
+    /**
+     * 投币的累计⾦额(仅限刷卡订单,单位分)
+     */
+    private int coin_money;
+    /**
+     * 投币的次数仅限刷卡订单)。
+     */
+    private int coin_num;
+    /**
+     * 卡类型(仅限刷卡订单,1表⽰普通卡,2表⽰储值卡)。
+     */
+    private Integer card_type;
+    /**
+     * 卡内码,卡出⼚的时候⼚家写入的ID(仅限刷卡订单)。
+     */
+    private String card_id;
+    /**
+     * 卡串号,印刷在卡的表⾯,通过电脑上的卡管理⼯具写入卡内。(仅限刷卡订单)。
+     */
+    private String card_sn;
+    /**
+     * 卡过期时间,从1970年开始的时间戳(仅限刷储值卡的订单有效,普通卡为总是为0)。
+     */
+    private long card_expired;
+    /**
+     * 卡内余额(仅限刷储值卡的订单有效,普通卡为总是为0)
+     */
+    private int card_balance;
+    /**
+     * 订单操作剩余操作时间(单位秒),开机后从operation_timeout开始每秒减1,减到0关机,关机原因close_type=operation_timeout
+     */
+    private int operation_remain_time;
+    /**
+     * 设备空闲关机倒计时剩余时间(单位秒),开机后从idle_timeout开始每秒减1,⻅到0关机,
+     * 关机原因close_type=idle_time(递减过程中按任意功能键,重新开始从idle_timeout递减)。
+     */
+    private int idle_remain_time;
+    /**
+     * 费⽤明细
+     */
+    private List<Detail> detail;
+
+
+}

+ 38 - 0
car-wash-service/src/main/java/com/kym/service/awoara/entity/request/AwoaraRequest.java

@@ -0,0 +1,38 @@
+package com.kym.service.awoara.entity.request;
+
+import lombok.Builder;
+import lombok.Data;
+import lombok.Getter;
+
+@Getter
+enum Method {
+    help,
+    reboot,
+    query_state,
+    query_hardware_info,
+    create_order,
+    close_order,
+    query_order,
+    read_config,
+    write_config,
+    show_msgbox,
+    hide_msgbox;
+}
+
+/**
+ * 石斑鱼主板API请求参数
+ */
+@Builder
+@Data
+public class AwoaraRequest<T> {
+    private final String version = "2.0";
+    private String method;
+    private T params;
+
+    public void setMethod(Method method) {
+        if (method == null) {
+            throw new IllegalArgumentException("Method cannot be null");
+        }
+        this.method = method.name();
+    }
+}

+ 20 - 0
car-wash-service/src/main/java/com/kym/service/awoara/entity/request/CloseOrderRequest.java

@@ -0,0 +1,20 @@
+package com.kym.service.awoara.entity.request;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * 关闭订单(请求)
+ */
+@Data
+@Accessors(chain = true)
+public class CloseOrderRequest {
+    /**
+     * 订单号,字符串类型,必须。
+     */
+    private String order_id;
+    /**
+     * 如果不知道订单号,需要强制关闭设备,那么就⽤这个参数(这时候不要再发送order_id参数)。
+     */
+    private Integer force_close;
+}

+ 38 - 0
car-wash-service/src/main/java/com/kym/service/awoara/entity/request/CreateOrderRequest.java

@@ -0,0 +1,38 @@
+package com.kym.service.awoara.entity.request;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * 创建订单(请求)
+ */
+@Data
+@Accessors(chain = true)
+public class CreateOrderRequest {
+    /**
+     * 订单号,字符串类型,必须。
+     */
+    private String order_id;
+    /**
+     * 会员名称,字符串类型,可选。
+     */
+    private String member_name;
+    /**
+     * 会员余额(单位分,仅在界⾯上显⽰,不参与任何业务处理),可选。
+     */
+    private int member_balance;
+    /**
+     * 会员折扣比例(95表⽰9.5折优惠,默认100表⽰没有优惠),可选。
+     */
+    private int member_discount;
+    /**
+     * 预付⾦额(本次开机最⼤消费⾦额),单位分,必须。
+     */
+    private int prepay_money;
+    /**
+     * 刷卡的串号(对于刷普通卡的⽤户,服务器端应当在收到刷卡消息的时候查询这张卡绑定的账号
+     * 信息,如果这个账号有余额,那么推送开机命令的时候需要把上传的刷卡事件中的card_sn回传回去,
+     * 这样板⼦会把这个开机命令标记为刷卡开机,否则会标记为⽹络开机。)。
+     */
+    private String card_sn;
+}

+ 19 - 0
car-wash-service/src/main/java/com/kym/service/awoara/entity/response/AwoaraResponse.java

@@ -0,0 +1,19 @@
+package com.kym.service.awoara.entity.response;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+/**
+ * 石斑鱼API响应体
+ */
+@Data
+@Accessors(chain = true)
+public abstract class AwoaraResponse<T> {
+    private String version;
+    private int code;
+    private String code_msg;
+    private T data;
+    private List<String> errors;
+}

+ 20 - 0
car-wash-service/src/main/java/com/kym/service/awoara/entity/response/CreateOrder.java

@@ -0,0 +1,20 @@
+package com.kym.service.awoara.entity.response;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * 创建订单(响应)
+ */
+@Data
+@Accessors(chain = true)
+public class CreateOrder {
+    /**
+     * 本机订单号(不保证连续)
+     */
+    private String order_id_local;
+    /**
+     * 创建了新订单返回1,订单已存在返回0
+     */
+    private Integer accepted;
+}

+ 16 - 0
car-wash-service/src/main/java/com/kym/service/awoara/entity/response/HardwareInfo.java

@@ -0,0 +1,16 @@
+package com.kym.service.awoara.entity.response;
+
+import com.kym.service.awoara.entity.Board;
+import com.kym.service.awoara.entity.Network;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * 查询硬件信息(响应)
+ */
+@Data
+@Accessors(chain = true)
+public class HardwareInfo {
+    private Network network;
+    private Board board;
+}

+ 16 - 0
car-wash-service/src/main/java/com/kym/service/awoara/entity/response/State.java

@@ -0,0 +1,16 @@
+package com.kym.service.awoara.entity.response;
+
+import com.kym.service.awoara.entity.DeviceState;
+import com.kym.service.awoara.entity.OrderInfo;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * 查询设备状态(响应)
+ */
+@Data
+@Accessors(chain = true)
+public class State {
+    private OrderInfo order_info;
+    private DeviceState device_state;
+}

+ 158 - 0
car-wash-service/src/main/java/com/kym/service/awoara/impl/AwoaraServiceImpl.java

@@ -0,0 +1,158 @@
+package com.kym.service.awoara.impl;
+
+import com.aliyun.iot20180120.Client;
+import com.aliyun.iot20180120.models.*;
+import com.aliyun.tea.TeaModel;
+import com.kym.service.awoara.AwoaraService;
+import com.kym.service.awoara.entity.ApiList;
+import com.kym.service.awoara.entity.Config;
+import com.kym.service.awoara.entity.MethodHelp;
+import com.kym.service.awoara.entity.OrderInfo;
+import com.kym.service.awoara.entity.response.AwoaraResponse;
+import com.kym.service.awoara.entity.response.CreateOrder;
+import com.kym.service.awoara.entity.response.HardwareInfo;
+import com.kym.service.awoara.entity.response.State;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class AwoaraServiceImpl implements AwoaraService {
+
+    private static final String ENDPOINT = "iot.cn-shanghai.aliyuncs.com";
+    private static final String IOT_INSTANCE_ID = "iot.cn-shanghai.aliyuncs.com";
+    private static final String GROUP_ID = "iot.cn-shanghai.aliyuncs.com";
+
+    /**
+     * 初始化IoT(Iot20180120)客户端
+     */
+    public static com.aliyun.iot20180120.Client initialization() throws Exception {
+        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
+                .setRegionId("cn-shanghai")
+                .setAccessKeyId(System.getenv("ACCESS_KEY_ID"))
+                .setAccessKeySecret(System.getenv("ACCESS_KEY_SECRET"));
+        return new com.aliyun.iot20180120.Client(config);
+    }
+
+
+    /**
+     * 调用Iot20180120客户端发送请求
+     * 1.RRpc:向指定设备发送请求消息,并同步返回响应
+     */
+    public static RRpcResponse rRpc(Client client, String iotInstanceId, String productKey, String deviceName, String requestBase64Byte, String timeout, String topic) throws Exception {
+        var request = new RRpcRequest()
+                .setIotInstanceId(iotInstanceId)
+                .setProductKey(productKey)
+                .setDeviceName(deviceName)
+                .setRequestBase64Byte(requestBase64Byte)
+                .setTopic(timeout);
+        // 等待设备回复消息的时间,单位是毫秒,取值范围是1,000 ~8,000。
+        // 校验integer型入参
+        Integer iTimeout = Integer.parseInt(topic);
+        request.setTimeout(iTimeout);
+        log.info("-------------------1.RRpc:向指定设备发送请求消息,并同步返回响应--------------------");
+        RRpcResponse response = client.rRpc(request);
+        log.info(com.aliyun.teautil.Common.toJSONString(TeaModel.buildMap(response)));
+        return response;
+    }
+
+    /**
+     * 调用Iot20180120客户端发送请求
+     * 2.PubBroadcast 向指定产品所有设备,或向订阅了指定Topic的所有设备发布广播消息
+     */
+    public static PubBroadcastResponse pubBroadcast(com.aliyun.iot20180120.Client client, String iotInstanceId, String productKey, String messageContent, String topic) throws Exception {
+        PubBroadcastRequest request = new PubBroadcastRequest()
+                .setIotInstanceId(iotInstanceId)
+                .setProductKey(productKey)
+                .setMessageContent(messageContent)
+                .setTopicFullName(topic);
+        log.info("-------------------2.PubBroadcast 向指定产品所有设备,或向订阅了指定Topic的所有设备发布广播消息--------------------");
+        PubBroadcastResponse response = client.pubBroadcast(request);
+        log.info(com.aliyun.teautil.Common.toJSONString(TeaModel.buildMap(response)));
+        return response;
+    }
+
+    /**
+     * 调用Iot20180120客户端发送请求
+     * 3.SubscribeTopic 为指定设备订阅Topic
+     */
+    public static SubscribeTopicResponse subscribeTopic(com.aliyun.iot20180120.Client client, String iotInstanceId, String productKey, String deviceName, String topicStr) throws Exception {
+        // 要订阅的Topic,最多订阅10个Topic。
+        // Topic的操作权限必须为订阅或发布和订阅。
+        List<String> arrTopic = Arrays.stream(topicStr.split(",", 10)).toList();
+        SubscribeTopicRequest request = new SubscribeTopicRequest()
+                .setIotInstanceId(iotInstanceId)
+                .setProductKey(productKey)
+                .setDeviceName(deviceName)
+                .setTopic(arrTopic);
+        log.info("-------------------3.SubscribeTopic 为指定设备订阅Topic--------------------");
+        SubscribeTopicResponse response = client.subscribeTopic(request);
+        log.info(com.aliyun.teautil.Common.toJSONString(TeaModel.buildMap(response)));
+        return response;
+    }
+
+
+    @Override
+    public AwoaraResponse<ApiList> help() {
+        return null;
+    }
+
+    @Override
+    public AwoaraResponse<MethodHelp> methodHelp(String method) {
+        return null;
+    }
+
+    @Override
+    public AwoaraResponse<?> showMsgbox(Map<String, Object> params) {
+        return null;
+    }
+
+    @Override
+    public AwoaraResponse<?> hideMsgbox() {
+        return null;
+    }
+
+    @Override
+    public AwoaraResponse<?> reboot() {
+        return null;
+    }
+
+    @Override
+    public AwoaraResponse<State> queryState() {
+        return null;
+    }
+
+    @Override
+    public AwoaraResponse<HardwareInfo> queryHardwareInfo() {
+        return null;
+    }
+
+    @Override
+    public AwoaraResponse<CreateOrder> createOrder() {
+        return null;
+    }
+
+    @Override
+    public AwoaraResponse<?> closeOrder(Map<String, Object> params) {
+        return null;
+    }
+
+    @Override
+    public AwoaraResponse<OrderInfo> queryOrder(String orderId) {
+        return null;
+    }
+
+    @Override
+    public AwoaraResponse<Config> readConfig() {
+        return null;
+    }
+
+    @Override
+    public AwoaraResponse<?> writeConfig(Config config) {
+        return null;
+    }
+}