diff --git a/app/src/main/java/com/newcapec/jni/ApduResp.java b/app/src/main/java/com/newcapec/jni/ApduResp.java
new file mode 100644
index 0000000..940be4b
--- /dev/null
+++ b/app/src/main/java/com/newcapec/jni/ApduResp.java
@@ -0,0 +1,9 @@
+package com.newcapec.jni;
+
+public class ApduResp {
+
+    public short LenOut;        //????IC??????????????
+    public byte[] DataOut = new byte[512];     //??IC??????????????
+    public byte SWA;          //IC??????1
+    public byte SWB;            //IC??????2
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/newcapec/jni/ApduSend.java b/app/src/main/java/com/newcapec/jni/ApduSend.java
new file mode 100644
index 0000000..d5dbe30
--- /dev/null
+++ b/app/src/main/java/com/newcapec/jni/ApduSend.java
@@ -0,0 +1,9 @@
+package com.newcapec.jni;
+
+
+public class ApduSend {
+    public byte[] Command = new byte[4];     //CLA, INS, P1, P2
+    public short Lc;           //?????IC???????????
+    public byte[] DataIn = new byte[512];      //?????IC????????
+    public short Le;           //????????????????
+}
diff --git a/app/src/main/java/com/newcapec/jni/AuxScreen.java b/app/src/main/java/com/newcapec/jni/AuxScreen.java
new file mode 100644
index 0000000..6e7a1cb
--- /dev/null
+++ b/app/src/main/java/com/newcapec/jni/AuxScreen.java
@@ -0,0 +1,197 @@
+package com.newcapec.jni;
+
+public class AuxScreen {
+
+    /**
+     * font code  type
+     */
+    public static final int FONT_CODE_UCS2 = 0;
+    public static final int FONT_CODE_GB2312 = 1;
+    public static final int FONT_CODE_UTF8 = 2;
+
+
+    static {
+        try {
+            System.loadLibrary("auxScreen");
+        } catch (Throwable e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * @return
+     */
+    public int open() {
+        return Native_ScrOpen();
+    }
+
+    /**
+     *
+     */
+    public void close() {
+        Native_ScrClose();
+    }
+
+    /**
+     * 清全屏
+     *
+     * @return
+     */
+    public int cls() {
+        return Native_ScrCls();
+    }
+
+    /**
+     * 清屏
+     *
+     * @param startline 起始行
+     * @param endline   结束行
+     * @return
+     */
+    public int clrLine(int startline, int endline) {
+        return Native_ScrClrLine(startline, endline);
+    }
+
+    /**
+     * 设置前景颜色
+     *
+     * @param fgcolor
+     * @return
+     */
+    public int setFgcolor(int fgcolor) {
+        return Native_ScrSetFgcolor(fgcolor);
+    }
+
+    /**
+     * 设置背景颜色
+     *
+     * @param bgcolor
+     * @return
+     */
+    public int setBgcolor(int bgcolor) {
+        return Native_ScrSetBgcolor(bgcolor);
+    }
+
+    /**
+     * 选择字体
+     *
+     * @param fonttype
+     * @return
+     */
+    public int selectFont(int fonttype) {
+        return Native_ScrSelectFont(fonttype);
+    }
+
+    /**
+     * 设置字体大小
+     *
+     * @param fontsize
+     * @return
+     */
+    public int setFontSize(int fontsize) {
+        return Native_ScrSetFontSize(fontsize);
+    }
+
+    /**
+     * 设置字、行间距
+     *
+     * @param CharSpace
+     * @param LineSpace
+     */
+    public void setSpace(int CharSpace, int LineSpace) {
+        Native_ScrSpaceSet(CharSpace, LineSpace);
+    }
+
+    /**
+     * 设置像素点颜色
+     *
+     * @param x
+     * @param y
+     * @param color
+     */
+    public void drawDot(int x, int y, int color) {
+        Native_ScrDrawDot(x, y, color);
+    }
+
+    /**
+     * 矩形框
+     *
+     * @param left
+     * @param top
+     * @param right
+     * @param bottom
+     * @param color
+     */
+    public void drawRect(int left, int top, int right, int bottom, int color) {
+        Native_ScrDrawRect(left, top, right, bottom, color);
+    }
+
+    /**
+     * 从某个点画字
+     *
+     * @param x
+     * @param y
+     * @param txt
+     * @return
+     */
+    public int textOut(int x, int y, String txt) {
+        return Native_ScrTextOut(x, y, txt);
+    }
+
+    /**
+     * 获取屏幕的宽高
+     *
+     * @param width
+     * @param height
+     * @return
+     */
+    public int getSize(int width[], int height[]) {
+        return Native_ScrGetSize(width, height);
+    }
+
+    public int drawBmp(int width, int height, byte bmp[]) {
+        return Native_ScrDrawBmp(width, height, bmp);
+    }
+
+    public void ScrDrawLogo() {
+        Native_ScrDrawLogo();
+    }
+
+    public void ScrClrRect(int left, int top, int width, int height) {
+        Native_ScrClrRect(left, top, width, height);
+    }
+
+
+    private native final int Native_ScrOpen();
+
+    private native final void Native_ScrClose();
+
+    private native final int Native_ScrCls();
+
+    private native final int Native_ScrClrLine(int startline, int endline);
+
+    private native final int Native_ScrSetFgcolor(int fgcolor);
+
+    private native final int Native_ScrSetBgcolor(int bgcolor);
+
+    private native final int Native_ScrSelectFont(int fonttype);
+
+    private native final int Native_ScrSetFontSize(int fontsize);
+
+    private native final void Native_ScrSpaceSet(int CharSpace, int LineSpace);
+
+    private native final void Native_ScrDrawDot(int x, int y, int color);
+
+    private native final void Native_ScrDrawRect(int left, int top, int right, int bottom, int color);
+
+    private native final int Native_ScrTextOut(int x, int y, String txt);
+
+    private native final int Native_ScrGetSize(int width[], int height[]);
+
+    private native final int Native_ScrDrawBmp(int width, int height, byte bmp[]);
+
+    private native final void Native_ScrDrawLogo();
+
+    private native final void Native_ScrClrRect(int left, int top, int width, int height);
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/newcapec/jni/Icc.java b/app/src/main/java/com/newcapec/jni/Icc.java
new file mode 100644
index 0000000..3a4f197
--- /dev/null
+++ b/app/src/main/java/com/newcapec/jni/Icc.java
@@ -0,0 +1,57 @@
+package com.newcapec.jni;
+
+/**
+ * 接触卡
+ *
+ * @author mayixi
+ */
+public class Icc {
+    static {
+
+    }
+
+    /**
+     * @param version
+     */
+    public Icc(int version) {
+        if (version < 110) {
+            System.loadLibrary("iccV108");
+        } else if (version < 115) {
+            System.loadLibrary("iccV110");
+        } else if (version < 116) {
+            System.loadLibrary("iccV115");
+        } else {
+            System.loadLibrary("iccV116");
+        }
+    }
+
+    public int init(byte slot, byte attr[]) {
+        return Native_Icc_Init(slot, attr);
+    }
+
+    public int close(byte slot) {
+        return Native_Icc_Close(slot);
+    }
+
+    public int autoResp(byte slot, byte autoresp) {
+        return Native_Icc_AutoResp(slot, autoresp);
+    }
+
+    public int sendIsoCommand(byte slot, ApduSend send, ApduResp recv) {
+        return Native_Icc_IsoCommand(slot, send, recv);
+    }
+
+    public int detect(byte slot) {
+        return Native_Icc_Detect(slot);
+    }
+
+    private native final int Native_Icc_Init(byte slot, byte atr[]);
+
+    private native final int Native_Icc_Close(byte slot);
+
+    private native final int Native_Icc_AutoResp(byte slot, byte autoresp);
+
+    private native final int Native_Icc_IsoCommand(byte slot, ApduSend send, ApduResp recv);
+
+    private native final int Native_Icc_Detect(byte slot);
+};
diff --git a/app/src/main/java/com/newcapec/jni/Picc.java b/app/src/main/java/com/newcapec/jni/Picc.java
new file mode 100644
index 0000000..fadb179
--- /dev/null
+++ b/app/src/main/java/com/newcapec/jni/Picc.java
@@ -0,0 +1,195 @@
+/*******************************************************************
+ * PiccInterface.java
+ * PiccInterface 、PICC_PARA、DetectInfo、ErrocCode
+ * A302 射频卡操作接口类
+ * 2014-11-05
+ * v0.1
+ *******************************************************************/
+package com.newcapec.jni;
+
+public class Picc {
+    static {
+
+    }
+
+    public static class PICC_PARA {
+
+        public byte drv_ver[];       // 驱动程序的版本信息,如：”1.01A”;只能读取,写入无效
+        public byte drv_date[];      // 驱动程序的日期信息,如：”2006.08.25”; 只能读取
+        public byte a_conduct_w;     // A卡输出电导写入允许：1--允许,其它—不允许
+        public byte a_conduct_val;   // A卡输出电导控制变量,有效范围0~63,超出时视为63
+        public byte m_conduct_w;       // M1卡输出电导写入允许
+        public byte m_conduct_val;   // M1卡输出电导控制变量,有效范围0~63,超出时视为63
+        public byte b_modulate_w;    //B卡调制指数写入允许：
+        public byte b_modulate_val;  // B卡调制指数控制变量,有效范围0~63,超出时视为63
+        public byte card_buffer_w;   //卡片接收缓冲区大小写入允许：
+
+        public short card_buffer_val;      //卡片接收缓冲区大小参数(单位：字节),有效值1~256.大于256时,将以256写入;设为0时,将不会写入
+        public byte wait_retry_limit_w;     // S(WTX)响应发送次数写入允许（暂不适用）
+        public short wait_retry_limit_val; //S(WTX)响应最大重试次数（暂不适用）
+        public byte card_type_check_w;      //卡片类型检查写入允许 */
+        public byte card_type_check_val;    // 0-检查卡片类型,其他－不检查卡片类型(默认为检查卡片类型)
+        public byte card_RxThreshold_w;     //B卡片接收灵敏度写入允许：1--允许，其它值--不允许。该值不可读
+        public byte card_RxThreshold_val;      //B卡片接收灵敏度
+
+        public byte f_modulate_w;          //felica调制指数写入允许
+        public byte f_modulate_val;
+        public byte a_modulate_w;
+        public byte a_modulate_val;
+        public byte a_card_RxThreshold_w;
+        public byte a_card_RxThreshold_val;    //felica调制指数
+
+        /*A卡调制指数控制变量，有效范围0~63,超出时视为63*/
+        /*A卡接收灵敏度检查写入允许：1--允许，其它值--不允许*/
+        /*A卡接收灵敏度*/
+        public byte a_card_antenna_gain_w;
+        public byte a_card_antenna_gain_val;    //A卡的天线增益
+        public byte b_card_antenna_gain_w;
+        public byte b_card_antenna_gain_val;    //B卡的天线增益
+        public byte f_card_antenna_gain_w;
+        public byte f_card_antenna_gain_val;    //Felica的天线增益
+        public byte f_card_RxThreshold_w;
+        public byte f_card_RxThreshold_val;    //Felica的接收灵敏度
+        public byte f_conduct_w;
+        public byte f_conduct_val;
+        public byte user_control_w;
+        public byte user_control_val;         //paypass认证需求，指定按键值，按下时强制退出交易*/	/*Felica的电导率*/
+        public byte reserved[];                //保留字节，用于将来扩展；写入时应全清零
+
+        public PICC_PARA() {
+            drv_ver = new byte[5];
+            drv_date = new byte[12];
+            reserved = new byte[72];
+        }
+    }
+
+    public static class DetectInfo {
+        public String CardType;
+        public String SerialInfo;
+        public String Cid;
+        public String Other;
+        public byte Cid_Array[];
+        public byte SerialInfo_Array[];
+
+        public DetectInfo() {
+            CardType = new String();
+            SerialInfo = new String();
+            Other = new String();
+            Cid = new String();
+
+            Cid_Array = new byte[10];
+            SerialInfo_Array = new byte[20];
+        }
+    }
+
+//    public class ErrocCode {
+//        public final static int PICC_STATUS_SUCCESS = 0x00;            //成功
+//        public final static int PICC_STATUS_ARGUMENTS_ERROR = 0x01;           //参数错误
+//        public final static int PICC_STATUS_NOT_OPEN = 0x02;           //射频模块未开启
+//        public final static int PICC_STATUS_NO_CARD = 0x03;           //未搜寻到卡片(感应区内无指定类型的卡片)
+//        public final static int PICC_STATUS_MANY_CARD = 0x04;           //感应区内卡片过多(出现通讯冲突)
+//        public final static int PICC_STATUS_ERROR_PROTOCOL = 0x06;          //协议错误(卡片应答中出现违反协议规定的数据)
+//        public final static int PICC_STATUS_CARD_NO_ACTIVE = 0x13;          //卡片未激活
+//        public final static int PICC_STATUS_CARDS_CONFLICT = 0x14;          //多卡冲突?
+//        public final static int PICC_STATUS_TIMEOUT = 0x15;          //超时无响应
+//        //public final static int   PICC_STATUS_DATA_LONG      =       0x16 ;          //协议错误
+//        public final static int PICC_STATUS_COMMUNICAT_ERROR = 0x17;         //通信传输错误
+//        public final static int PICC_STATUS_M1_CARD_Authentication_ERROR = 0x18;    //M1卡认证失败
+//        public final static int PICC_STATUS_SECTION_NO_Authentication = 0x19;   //扇区未认证
+//        public final static int PICC_STATUS_DATA_FORMAT_ERROR = 0x1A;   //数值块数据格式有误
+//        public final static int PICC_STATUS_CARD_IN_INDUCTION_ZONE = 0x1B;     //卡片仍在感应区内
+//        public final static int PICC_STATUS_CARD_STATE_ERROR = 0x1C;        //卡片状态错误(如A/B卡调用M1卡接口, 或M1卡调用PiccIsoCommand接口)
+//        public final static int PICC_STATUS_CARD_ABORT = 0xFF;        //接口芯片不存在或异常
+//    }
+
+    /**
+     * @param version
+     */
+    public Picc(int version) {
+        if (version < 110) {
+            System.loadLibrary("piccV108");
+        } else if (version < 116) {
+            System.loadLibrary("piccV115");
+        } else {
+            System.loadLibrary("piccV116");
+        }
+    }
+
+    public int open() {
+        return Native_Picc_Open();
+    }
+
+    public int setup(byte mode, PICC_PARA para) {
+        return Native_Picc_Setup(mode, para);
+    }
+
+    public int sendIsoCommand(byte cid, ApduSend Send, ApduResp Resp) {
+        return Native_Picc_IsoCommand(cid, Send, Resp);
+    }
+
+    public int remove(byte mode, byte cid) {
+        return Native_Picc_Remove(mode, cid);
+    }
+
+    public int close() {
+        return Native_Picc_Close();
+    }
+
+    public int m1Authority(byte Type, byte BlkNo, byte Pwd[], byte SerialNo[]) {
+        return Native_Picc_M1Authority(Type, BlkNo, Pwd, SerialNo);
+    }
+
+    public int readM1Block(byte BlkNo, byte BlkValue[], int BlkLen) {
+        return Native_Picc_M1ReadBlock(BlkNo, BlkValue, BlkLen);
+    }
+
+    public int writeM1Block(byte BlkNo, byte BlkValue[], int BlkLen) {
+        return Native_Picc_M1WriteBlock(BlkNo, BlkValue, BlkLen);
+    }
+
+    public int operateM1(byte Type, byte BlkNo, byte Value[], byte UpdateBlkNo) {
+        return Native_Picc_M1Operate(Type, BlkNo, Value, UpdateBlkNo);
+    }
+
+    public int light(byte ucLedIndex, byte ucOnOff) {
+        return Native_Picc_Light(ucLedIndex, ucOnOff);
+    }
+
+    public int initFelica(byte ucRate, byte ucPol) {
+        return Native_Picc_InitFelica(ucRate, ucPol);
+    }
+
+    public int exchangeCmd(int uiSendLen, String paucInData, int puiRecLen[], String paucOutData) {
+        return Native_Picc_CmdExchange(uiSendLen, paucInData, puiRecLen, paucOutData);
+    }
+
+    public int detect(byte Mode, DetectInfo info) {
+        return Native_Picc_Detect(Mode, info);
+    }
+
+    private native final int Native_Picc_Open();
+
+    private native final int Native_Picc_Setup(byte mode, PICC_PARA para);
+
+    private native final int Native_Picc_IsoCommand(byte cid, ApduSend ApduSend, ApduResp ApduRecv);
+
+    private native final int Native_Picc_Remove(byte mode, byte cid);
+
+    private native final int Native_Picc_Close();
+
+    private native final int Native_Picc_M1Authority(byte Type, byte BlkNo, byte Pwd[], byte SerialNo[]);
+
+    private native final int Native_Picc_M1ReadBlock(byte BlkNo, byte BlkValue[], int BlkLen);
+
+    private native final int Native_Picc_M1WriteBlock(byte BlkNo, byte BlkValue[], int BlkLen);
+
+    private native final int Native_Picc_M1Operate(byte Type, byte BlkNo, byte Value[], byte UpdateBlkNo);
+
+    private native final int Native_Picc_Light(byte ucLedIndex, byte ucOnOff);
+
+    private native final int Native_Picc_InitFelica(byte ucRate, byte ucPol);
+
+    private native final int Native_Picc_CmdExchange(int uiSendLen, String paucInData, int puiRecLen[], String paucOutData);
+
+    private native final int Native_Picc_Detect(byte Mode, DetectInfo info);
+};
diff --git a/app/src/main/java/com/newcapec/serial/SerialPort.java b/app/src/main/java/com/newcapec/serial/SerialPort.java
new file mode 100644
index 0000000..f8099fb
--- /dev/null
+++ b/app/src/main/java/com/newcapec/serial/SerialPort.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2009 Cedric Priscal
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License. 
+ */
+
+package com.newcapec.serial;
+
+import java.io.IOException;
+
+public class SerialPort {
+
+	private static final String TAG = "SerialPort";
+	static {
+		System.loadLibrary("serial_port");
+	}
+	
+	/**
+	 * @name    open
+	 * @desc    ??????1
+	 * @param : ??
+	 * @return  0-???, ????-???
+	 * @throws IOException  ??
+	 */
+	public int open(int port, int baudrate, int flags)	
+	{
+		return Native_Serial_Open(port, baudrate, flags);
+	}
+	
+	/**
+	 * @name    sendMsg
+	 * @desc    ????????
+	 * @param : ??
+	 * @return  0-???, ????-???
+	 * @throws IOException  ??
+	 */
+	public int sendMsg(byte[] msg)	
+	{
+		return Native_Serial_SendMsg(msg);
+	}
+	
+	/**
+	 * @name    recvMsg
+	 * @desc    ????????
+	 * @param : ??
+	 * @return  0-???, ????-???
+	 * @throws IOException  ??
+	 */
+	public byte[] recvMsg()	
+	{
+		return Native_Serial_RecvMsg();
+	}	
+	
+	/**
+	 * @name    close
+	 * @desc    ??????
+	 * @param : ??
+	 * @return  0-???, ????-???
+	 * @throws IOException  ??
+	 */
+	public int close()	
+	{
+		return Native_Serial_Close();
+	}	
+	
+		
+	private native final int	Native_Serial_Open(int port, int baudrate, int flags);
+	private native final int	Native_Serial_SendMsg(byte[] msg);
+	private native final byte[]	Native_Serial_RecvMsg();
+	private native final int	Native_Serial_Close();
+	
+}
diff --git a/app/src/main/java/com/supwisdom/activities/auxscreen/AuxScreenController.kt b/app/src/main/java/com/supwisdom/activities/auxscreen/AuxScreenController.kt
new file mode 100644
index 0000000..156367d
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/auxscreen/AuxScreenController.kt
@@ -0,0 +1,263 @@
+package com.supwisdom.auxscreen
+
+import android.graphics.Color
+import com.newcapec.jni.AuxScreen
+import com.supwisdom.utils.CommonUtil
+import java.util.concurrent.locks.ReentrantLock
+
+/**
+ * @author gqy
+ * @version 1.0.1
+ * @date 2018/7/11
+ * @desc 小屏控制器
+ */
+class AuxScreenController private constructor() {
+    private var auxScreen = AuxScreen()
+    private val xStart = 15
+    private val xSecStart = 240
+    private val sTitle = "refreshTitle"
+    private val sContent = "refreshContent"
+    private val sBottom = "refreshBottom"
+    private val lock = ReentrantLock()
+    private val refreshMap = hashMapOf<String, Any>()
+    private val auxRunnable = AuxRunnable()
+    private var isExit = false
+    private var taskThread: Thread? = null
+
+    companion object {
+        @Volatile
+        private var auxController: AuxScreenController? = null
+
+        fun getInstance(): AuxScreenController {
+            if (null == auxController) {
+                synchronized(AuxScreenController::class.java) {
+                    if (null == auxController) {
+                        auxController = AuxScreenController()
+                    }
+                }
+            }
+            return auxController!!
+        }
+    }
+
+    /**
+     * 刷新标题栏
+     * @param title 标题
+     */
+    fun refreshTitle(title: String) {
+        lock.lock()
+        refreshMap[sTitle] = title
+        lock.unlock()
+    }
+
+    private fun localRefreshTitle(title: String) {
+        auxScreen.setBgcolor(Color.parseColor("#FFFFFF"))
+        auxScreen.clrLine(0, 50)
+        auxScreen.setBgcolor(Color.parseColor("#FFFFFF"))
+        auxScreen.setFontSize(20)
+        auxScreen.setFgcolor(Color.parseColor("#000000"))
+        auxScreen.textOut(xStart, 15, title)
+    }
+
+    /**
+     * 内容显示
+     * @param list 显示内容 size<=5
+     */
+    fun refreshContent(list: List<String>) {
+        lock.lock()
+        refreshMap[sContent] = list
+        lock.unlock()
+    }
+
+    private fun localRefreshContent(list: List<String>) {
+        auxScreen.setBgcolor(Color.parseColor("#F2F2F2"))
+        clearCenterContent()
+
+        val size = list.size
+        auxScreen.setFgcolor(Color.parseColor("#000000"))
+        when (size) {
+            0 -> {
+
+            }
+            1 -> {
+                auxScreen.setFontSize(40)
+                auxScreen.textOut(xStart, 140, getNotEmptyString(list[0]))
+            }
+            2 -> {
+                auxScreen.setFontSize(35)
+                for (index in 0 until size) {
+                    auxScreen.textOut(xStart, 120 + 60 * index, getNotEmptyString(list[index]))
+                }
+            }
+            3 -> {
+                auxScreen.setFontSize(30)
+                for (index in 0 until size) {
+                    auxScreen.textOut(xStart, 100 + 50 * index, getNotEmptyString(list[index]))
+                }
+            }
+            4 -> {
+                auxScreen.setFontSize(25)
+                for (index in 0 until size) {
+                    auxScreen.textOut(xStart, 80 + 45 * index, getNotEmptyString(list[index]))
+                }
+            }
+            5 -> {
+                auxScreen.setFontSize(20)
+                for (index in 0 until size) {
+                    auxScreen.textOut(xStart, 70 + 40 * index, getNotEmptyString(list[index]))
+                }
+            }
+            6 -> {
+                auxScreen.setFontSize(15)
+                for (index in 0 until size) {
+                    auxScreen.textOut(xStart, 60 + 35 * index, getNotEmptyString(list[index]))
+                }
+            }
+            7, 8 -> {
+                auxScreen.setFontSize(25)
+                for (index in 0 until (size + 1) / 2) {
+                    auxScreen.textOut(xStart, 80 + 45 * index, getNotEmptyString(list[2 * index]))
+                    if (2 * index + 1 < size) {
+                        auxScreen.textOut(xSecStart, 80 + 45 * index, getNotEmptyString(list[2 * index + 1]))
+                    }
+                }
+            }
+            9, 10 -> {
+                auxScreen.setFontSize(20)
+                for (index in 0 until (size + 1) / 2) {
+                    auxScreen.textOut(xStart, 70 + 40 * index, getNotEmptyString(list[2 * index]))
+                    if (2 * index + 1 < size) {
+                        auxScreen.textOut(xSecStart, 70 + 40 * index, getNotEmptyString(list[2 * index + 1]))
+                    }
+                }
+            }
+            else -> {
+                auxScreen.setFontSize(15)
+                for (index in 0 until (size + 1) / 2) {
+                    auxScreen.textOut(xStart, 60 + 35 * index, getNotEmptyString(list[2 * index]))
+                    if (2 * index + 1 < size) {
+                        auxScreen.textOut(xSecStart, 60 + 35 * index, getNotEmptyString(list[2 * index + 1]))
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 处理输入的空字符串
+     */
+    private fun getNotEmptyString(input: String?): String {
+        if (input == null || input.isEmpty()) {
+            return " "
+        }
+        return input
+    }
+
+    /**
+     * 刷新底部状态
+     * @param bottom 提示
+     */
+    fun refreshBottom(bottom: String) {
+        lock.lock()
+        refreshMap[sBottom] = bottom
+        lock.unlock()
+    }
+
+    private fun localRefreshBootom(bottom: String) {
+        auxScreen.setBgcolor(Color.parseColor("#FFFFFF"))
+        auxScreen.clrLine(269, 319)
+
+        auxScreen.setFontSize(20)
+        auxScreen.setFgcolor(Color.parseColor("#000000"))
+        auxScreen.textOut(15, 284, bottom)
+    }
+
+    /**
+     * 清空中间的内容
+     * @注意：此处必须一行一行的清除，底层bug
+     */
+    private fun clearCenterContent() {
+        auxScreen.clrLine(50, 100)
+        auxScreen.clrLine(100, 150)
+        auxScreen.clrLine(150, 200)
+        auxScreen.clrLine(200, 250)
+        auxScreen.clrLine(250, 269)
+        auxScreen.setFontSize(50)
+    }
+
+    /**
+     * 打开小屏
+     */
+    fun open() {
+        auxScreen.open()
+        if (taskThread == null) {
+            isExit = false
+            taskThread = Thread(auxRunnable)
+            taskThread!!.start()
+        }
+    }
+
+    /**
+     * 关闭小屏
+     */
+    fun close() {
+        auxScreen.close()
+        isExit = true
+        taskThread?.interrupt()
+        taskThread = null
+    }
+
+    /**
+     * 初始化小屏
+     */
+    private fun init() {
+        auxScreen.setBgcolor(Color.parseColor("#F2F2F2"))
+        auxScreen.cls()
+        auxScreen.setSpace(5, 5)
+        auxScreen.selectFont(AuxScreen.FONT_CODE_UTF8)
+    }
+
+    inner class AuxRunnable : Runnable {
+        override fun run() {
+            init()
+            while (!isExit) {
+                try {
+                    try {
+                        lock.lock()
+                        val title = refreshMap[sTitle]
+                        if (title != null) {
+                            localRefreshTitle(title as String)
+                            refreshMap.remove(sTitle)
+                        }
+                    } finally {
+                        lock.unlock()
+                    }
+                    try {
+                        lock.lock()
+                        val content = refreshMap[sContent]
+                        if (content != null) {
+                            localRefreshContent(content as List<String>)
+                            refreshMap.remove(sContent)
+                        }
+                    } finally {
+                        lock.unlock()
+                    }
+                    try {
+                        lock.lock()
+                        val bottom = refreshMap[sBottom]
+                        if (bottom != null) {
+                            localRefreshBootom(bottom as String)
+                            refreshMap.remove(sBottom)
+                        }
+                    } finally {
+                        lock.unlock()
+                    }
+                } catch (ex: Exception) {
+                    ex.printStackTrace()
+                }
+                CommonUtil.doSleep(20)
+            }
+        }
+    }
+}
+
diff --git a/app/src/main/java/com/supwisdom/activities/auxscreen/AuxScreenViewSchedule.kt b/app/src/main/java/com/supwisdom/activities/auxscreen/AuxScreenViewSchedule.kt
new file mode 100644
index 0000000..896e3a6
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/auxscreen/AuxScreenViewSchedule.kt
@@ -0,0 +1,51 @@
+package com.supwisdom.activities.auxscreen
+
+import android.os.Handler
+import android.os.HandlerThread
+import android.os.Message
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+class AuxScreenViewSchedule private constructor() {
+    private val mExector: Runnable? = null
+    private var mAuxWorkHandler: Handler
+    private var mHandlerThread: HandlerThread
+
+    companion object {
+        private var _instance: AuxScreenViewSchedule? = null
+        fun getInstancs(): AuxScreenViewSchedule {
+            if (_instance == null)
+                _instance =
+                    AuxScreenViewSchedule()
+            return _instance!!
+        }
+    }
+
+    init {
+        mHandlerThread = HandlerThread("AuxScreenViewThread")
+
+        mHandlerThread.start()
+
+        mAuxWorkHandler = object : Handler(mHandlerThread.looper) {
+            override// 消息处理的操作
+            fun handleMessage(msg: Message) {
+                super.handleMessage(msg)
+            }
+        }
+    }
+
+    fun Post(r: Runnable, attr: Int) {
+        //定时任务
+        //mAuxWorkHandler.getLooper().getQueue()
+        mAuxWorkHandler.removeCallbacks(r)
+        mAuxWorkHandler.post(r)
+    }
+
+    fun PostDelayed(r: Runnable, millis: Int) {
+        //定时任务
+        //mAuxWorkHandler.getLooper().getQueue()
+        mAuxWorkHandler.postDelayed(r, millis.toLong())
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/consume/ConsumeActivity.kt b/app/src/main/java/com/supwisdom/activities/consume/ConsumeActivity.kt
new file mode 100644
index 0000000..f8da627
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/consume/ConsumeActivity.kt
@@ -0,0 +1,10 @@
+package com.supwisdom.activities.consume
+
+import com.supwisdom.activities.BaseActivity
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+class ConsumeActivity : BaseActivity(), IConsumeView {
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/consume/IConsumeView.kt b/app/src/main/java/com/supwisdom/activities/consume/IConsumeView.kt
new file mode 100644
index 0000000..bca0fb1
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/consume/IConsumeView.kt
@@ -0,0 +1,8 @@
+package com.supwisdom.activities.consume
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+interface IConsumeView {
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/init/IInitView.kt b/app/src/main/java/com/supwisdom/activities/init/IInitView.kt
new file mode 100644
index 0000000..1f989f0
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/init/IInitView.kt
@@ -0,0 +1,15 @@
+package com.supwisdom.activities.init
+
+import android.app.Activity
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+interface IInitView {
+    fun getActivity(): Activity
+
+    fun showSWToastInfo(msg: String, showway: Int)
+
+    fun jumpToNextActivity()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/init/InitActivity.kt b/app/src/main/java/com/supwisdom/activities/init/InitActivity.kt
new file mode 100644
index 0000000..c8785d0
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/init/InitActivity.kt
@@ -0,0 +1,244 @@
+package com.supwisdom.activities.init
+
+import android.app.Activity
+import android.net.nsd.NsdServiceInfo
+import android.os.Bundle
+import android.support.v7.widget.LinearLayoutManager
+import android.support.v7.widget.RecyclerView
+import android.widget.Button
+import android.widget.EditText
+import android.widget.RadioButton
+import android.widget.TextView
+import com.supwisdom.R
+import com.supwisdom.activities.BaseActivity
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.activities.init.adapter.NsdServerConfigAdapter
+import com.supwisdom.activities.init.mode.NsdClient
+import com.supwisdom.activities.init.mode.NsdClientApi
+import com.supwisdom.activities.load.LoadActivity
+import com.supwisdom.auxscreen.AuxScreenController
+import com.supwisdom.entity.ConfigParaRecord
+import com.supwisdom.service.NtpClient
+import com.supwisdom.utils.CommonUtil
+import com.supwisdom.utils.DateUtil
+import com.supwisdom.utils.PublicDef
+import com.supwisdom.utils.ThreadPool
+import com.supwisdom.view.BigSwDialog
+import com.supwisdom.view.SWToast
+import java.util.*
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+@Suppress("DEPRECATION")
+class InitActivity : BaseActivity(), IInitView {
+    private lateinit var presenter: InitPresenter
+    private lateinit var vDevphyid: EditText
+    private lateinit var vServerIp: EditText
+    private lateinit var vUri: EditText
+    private lateinit var vPort: EditText
+    private lateinit var vNsdResult: TextView
+    private lateinit var vRadioPayMode: RadioButton
+    private lateinit var vRadioDepositMode: RadioButton
+    private lateinit var vRadioThirdPayMode: RadioButton
+    private lateinit var vRadioThirdLoginMode: RadioButton
+    private lateinit var vRadioGateMode: RadioButton
+    private var nsdClient: NsdClient? = null
+    private var nsdServiceIp: String? = null
+    private var nsdServicePort: Int = 0
+    private var dialogNsdConfig: BigSwDialog? = null
+    private var nsdConfigAdapter: NsdServerConfigAdapter? = null
+    private val pos = SPApplication.getInstance().getPos()
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_init)
+        initView()
+        initData()
+    }
+
+    private fun initData() {
+        presenter = InitPresenter(this)
+        var record = pos.getConfigPara()
+        if (record == null) {
+            record = ConfigParaRecord()
+            record.mode = 0
+            record.devphyid = "12345678"
+            record.epayIP = "127.0.0.1"
+            record.epayPort = 8080
+            record.epayUri = "epayapi"
+        }
+        record.initOK = false
+        pos.replaceConfigPara(record)
+        val cfgRecord = pos.getConfigPara()!!
+
+//        when {
+//            cfgRecord.mode == PublicDef.TERMINAL_DEPOSIT_MODE -> vRadioDepositMode.isChecked = true
+//            cfgRecord.mode == PublicDef.TERMINAL_THIRD_PAY_MODE -> vRadioThirdPayMode.isChecked = true
+//            cfgRecord.mode == PublicDef.TERMINAL_GATE_MODE -> vRadioGateMode.isChecked = true
+//            cfgRecord.mode == PublicDef.TERMINAL_THIRD_LOGIN_MODE -> vRadioThirdLoginMode.isChecked = true
+//            else -> vRadioPayMode.isChecked = true
+//        }
+        vDevphyid.setText(cfgRecord.devphyid)
+        vServerIp.setText(cfgRecord.epayIP)
+        vUri.setText(cfgRecord.epayUri)
+        vPort.setText(cfgRecord.epayPort.toString())
+
+        nsdClient = NsdClient(this, "epay-reg-server", object : NsdClient.IServerFound {
+            override fun onServerFound(serviceInfo: NsdServiceInfo) {
+                nsdServiceIp = serviceInfo.host?.hostAddress
+                nsdServicePort = serviceInfo.port
+                if (nsdServiceIp != null) {
+                    asyncGetConfigName()
+                }
+            }
+
+            override fun onServerFail() {
+
+            }
+        })
+    }
+
+    private fun initView() {
+        this.findViewById<Button>(R.id.tv_settings).setOnClickListener {
+            //            CommonUtil.sendBroadcast(applicationContext, false)
+            CommonUtil.startNetSetting(this@InitActivity)
+        }
+        this.findViewById<TextView>(R.id.btn_save).setOnClickListener {
+            //            val mode = when {
+//                vRadioDepositMode.isChecked -> PublicDef.TERMINAL_DEPOSIT_MODE
+//                vRadioThirdPayMode.isChecked -> PublicDef.TERMINAL_THIRD_PAY_MODE
+//                vRadioThirdLoginMode.isChecked -> PublicDef.TERMINAL_THIRD_LOGIN_MODE
+//                vRadioGateMode.isChecked -> PublicDef.TERMINAL_GATE_MODE
+//                else -> PublicDef.TERMINAL_PAY_MODE
+//            }
+            presenter.saveConfigParam(
+                0,
+                CommonUtil.getEditView(vDevphyid), CommonUtil.getEditView(vServerIp),
+                CommonUtil.getEditView(vUri), CommonUtil.getEditView(vPort)
+            )
+        }
+        this.findViewById<Button>(R.id.tv_nsd_query).setOnClickListener {
+            if (nsdServiceIp == null) {
+                showSWToastInfo("nsd未连接", PublicDef.TOAST_SHOW_DOUBT)
+                return@setOnClickListener
+            }
+            asyncGetConfigName()
+        }
+        vNsdResult = this.findViewById(R.id.tv_nsd_result) as TextView
+        vRadioPayMode = this.findViewById(R.id.rb_pay_mode) as RadioButton
+        vRadioDepositMode = this.findViewById(R.id.rb_deposit_mode) as RadioButton
+        vRadioThirdPayMode = this.findViewById(R.id.rb_third_pay_mode) as RadioButton
+        vRadioThirdLoginMode = this.findViewById(R.id.rb_third_login_mode) as RadioButton
+        vDevphyid = this.findViewById(R.id.tv_devphyid) as EditText
+        vServerIp = this.findViewById(R.id.tv_server_ip) as EditText
+        vUri = this.findViewById(R.id.tv_uri_root) as EditText
+        vPort = this.findViewById(R.id.tv_server_port) as EditText
+    }
+
+    override fun onResume() {
+        super.onResume()
+        nsdClient!!.start()
+        refresh()
+    }
+
+    override fun onStop() {
+        super.onStop()
+        nsdClient!!.stop()
+    }
+
+    private fun refresh() {
+        AuxScreenController.getInstance().refreshTitle("通讯参数设置")
+        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDate())
+        AuxScreenController.getInstance().refreshContent(Arrays.asList("设备第一次使用", "请联系管理员", "在大屏配置参数"))
+    }
+
+    private fun asyncGetConfigName() {
+        ThreadPool.getShortPool().execute(Runnable {
+            try {
+                val ret = NsdClientApi(nsdServiceIp!!, nsdServicePort).getNsdServerConfigList()
+                runOnUiThread {
+                    vNsdResult.text = ret.retmsg
+                    if (ret.retcode == PublicDef.SUCCESS) {
+                        if (ret.list!!.isEmpty()) {
+                            vNsdResult.text = "未找到配置项"
+                            return@runOnUiThread
+                        } else if (ret.list!!.size == 1) {
+                            asyncGetConfigFromNsdServer(ret.list!![0])
+                            return@runOnUiThread
+                        }
+                        vNsdResult.setTextColor(resources.getColor(R.color.light_blue2))
+                        if (dialogNsdConfig == null) {
+                            dialogNsdConfig = BigSwDialog(this, PublicDef.DIALOG_TYPE_NSD_CONFIG)
+                            val vConfigList = dialogNsdConfig!!.findViewById(R.id.rv_config_list) as RecyclerView
+                            vConfigList.layoutManager = LinearLayoutManager(this)
+                            vConfigList.addItemDecoration(NsdServerConfigAdapter.ItemDecoration(10))
+                            nsdConfigAdapter =
+                                NsdServerConfigAdapter(this, object : NsdServerConfigAdapter.ConfigNameListener {
+                                    override fun callback(configName: String) {
+                                        asyncGetConfigFromNsdServer(configName)
+                                        dialogNsdConfig!!.dismiss()
+                                    }
+                                })
+                            vConfigList.adapter = nsdConfigAdapter
+                        }
+                        nsdConfigAdapter!!.setList(ret.list)
+                        nsdConfigAdapter!!.notifyDataSetChanged()
+                        dialogNsdConfig!!.show()
+                    } else {
+                        vNsdResult.setTextColor(resources.getColor(R.color.cl_red))
+                    }
+                }
+            } catch (ex: Exception) {
+                runOnUiThread {
+                    vNsdResult.text = "异常:${ex.message}"
+                    vNsdResult.setTextColor(resources.getColor(R.color.cl_red))
+                }
+            }
+        })
+    }
+
+    private fun asyncGetConfigFromNsdServer(configName: String) {
+        ThreadPool.getShortPool().execute(Runnable {
+            try {
+                val ret = NsdClientApi(nsdServiceIp!!, nsdServicePort).getEcardConfigParam(configName)
+                NtpClient().startCalibrateTime(ret.systime)
+                runOnUiThread {
+                    vNsdResult.text = ret.retmsg
+                    if (ret.retcode == PublicDef.SUCCESS) {
+                        vNsdResult.setTextColor(resources.getColor(R.color.light_blue2))
+                        if (ret.mode == 0) {
+                            vRadioPayMode.isChecked = true
+                        } else {
+                            vRadioDepositMode.isChecked = true
+                        }
+                        vDevphyid.setText(ret.devphyid)
+                        vServerIp.setText(ret.epayIP)
+                        vUri.setText(ret.epayUri)
+                        vPort.setText(ret.epayPort.toString())
+                    } else {
+                        vNsdResult.setTextColor(resources.getColor(R.color.cl_red))
+                    }
+                }
+            } catch (ex: Exception) {
+                runOnUiThread {
+                    vNsdResult.text = "异常:${ex.message}"
+                    vNsdResult.setTextColor(resources.getColor(R.color.cl_red))
+                }
+            }
+        })
+    }
+
+    override fun jumpToNextActivity() {
+        jumpActivity(LoadActivity::class.java)
+    }
+
+    override fun getActivity(): Activity {
+        return this
+    }
+
+    override fun showSWToastInfo(msg: String, showway: Int) {
+        SWToast.show(applicationContext, msg, showway)
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/init/InitPresenter.kt b/app/src/main/java/com/supwisdom/activities/init/InitPresenter.kt
new file mode 100644
index 0000000..7f19261
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/init/InitPresenter.kt
@@ -0,0 +1,78 @@
+package com.supwisdom.activities.init
+
+import android.text.TextUtils
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.activities.YktSession
+import com.supwisdom.entity.ConfigParaRecord
+import com.supwisdom.entity.ControlParaRecord
+import com.supwisdom.entity.DynamicParaRecord
+import com.supwisdom.utils.CommonUtil
+import com.supwisdom.utils.PublicDef
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+class InitPresenter constructor(iInitView: IInitView) {
+    private val iInitView = iInitView
+    private val pos = SPApplication.getInstance().getPos()
+
+    fun saveConfigParam(mode: Int, devphyid: String, serverip: String, uri: String, port: String) {
+        val record = pos.getConfigPara() ?: ConfigParaRecord()
+        record.mode = mode
+        record.devphyid = devphyid
+        if (TextUtils.isEmpty(devphyid)) {
+            iInitView.showSWToastInfo("终端机编号不能为空!", PublicDef.TOAST_SHOW_DOUBT)
+            return
+        }
+        record.devphyid = devphyid.replace(" ", "")
+
+        if (TextUtils.isEmpty(serverip)) {
+            iInitView.showSWToastInfo("服务器IP不能为空!", PublicDef.TOAST_SHOW_DOUBT)
+            return
+        }
+        record.epayIP = serverip.replace(" ", "")
+        try {
+            val tmpPort = Integer.valueOf(port)
+            if (tmpPort > 65535) {
+                iInitView.showSWToastInfo("端口不能大于65535", PublicDef.TOAST_SHOW_DOUBT)
+                return
+            }
+            record.epayPort = tmpPort
+        } catch (e: Exception) {
+            iInitView.showSWToastInfo("端口不合法,请确认!", PublicDef.TOAST_SHOW_DOUBT)
+            return
+        }
+
+        if (TextUtils.isEmpty(uri)) {
+            iInitView.showSWToastInfo("URI不能为空!", PublicDef.TOAST_SHOW_DOUBT)
+            return
+        }
+        record.initOK = false
+        record.epayUri = uri.replace(" ", "")
+        record.shopPwd = PublicDef.PASSWD_SHOP_DEFAULT
+        pos.replaceConfigPara(record)
+
+        val dyRecord = DynamicParaRecord()
+        dyRecord.cardverno = "000000000000"
+//        dyRecord.setAppId(PublicDef.APP_ID)
+//        dyRecord.setAppSecret(PublicDef.APP_SECRET)
+        pos.replaceDynamicPara(dyRecord)
+
+        YktSession.getInstance().setWebAPISession(
+            record.epayIP!!,
+            record.epayPort,
+            record.epayUri!!,
+            record.devphyid!!,
+            CommonUtil.getCommunicateTime()
+        )
+        iInitView.jumpToNextActivity()
+    }
+
+    fun saveControlPara(name: String, value: String): Boolean {
+        val record = pos.getControlPara(name) ?: ControlParaRecord()
+        record.paraname = name
+        record.paraval = value
+        return pos.replaceControlPara(record)
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/init/adapter/NsdServerConfigAdapter.kt b/app/src/main/java/com/supwisdom/activities/init/adapter/NsdServerConfigAdapter.kt
new file mode 100644
index 0000000..8f6e4f9
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/init/adapter/NsdServerConfigAdapter.kt
@@ -0,0 +1,70 @@
+package com.supwisdom.activities.init.adapter
+
+import android.content.Context
+import android.graphics.Rect
+import android.support.v7.widget.RecyclerView
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.LinearLayout
+import android.widget.TextView
+import com.supwisdom.R
+
+/**
+ * @author zzq
+ * @date 2018/7/12
+ * @desc nsd server 参数配置列表
+ */
+class NsdServerConfigAdapter constructor(context: Context, callback: ConfigNameListener) :
+    RecyclerView.Adapter<NsdServerConfigAdapter.Holder>() {
+    private val context = context
+    private val list = ArrayList<String>()
+    private val listener = callback
+    fun setList(data: List<String>?) {
+        list.clear()
+        if (data != null) {
+            list.addAll(data)
+        }
+    }
+
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
+        return Holder(LayoutInflater.from(context).inflate(R.layout.item_init_nsd_config_list, parent, false))
+    }
+
+    override fun getItemCount(): Int {
+        return list.size
+    }
+
+    override fun onBindViewHolder(holder: Holder, position: Int) {
+        holder.vConfigId.text = "配置$position:"
+        holder.vConfigName.text = list[position]
+        holder.vConfig.setOnClickListener {
+            listener.callback(list[position])
+        }
+    }
+
+    inner class Holder constructor(itemView: View) : RecyclerView.ViewHolder(itemView) {
+        var vConfigName: TextView
+        var vConfigId: TextView
+        var vConfig: LinearLayout
+
+        init {
+            vConfigId = itemView.findViewById(R.id.tv_config_id) as TextView
+            vConfigName = itemView.findViewById(R.id.tv_config_name) as TextView
+            vConfig = itemView.findViewById(R.id.ll_config) as LinearLayout
+        }
+    }
+
+    class ItemDecoration constructor(space: Int) : RecyclerView.ItemDecoration() {
+        private val space = space
+        override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) {
+            outRect.left = space
+            outRect.right = space
+            outRect.bottom = space
+        }
+    }
+
+    interface ConfigNameListener {
+        fun callback(configName: String)
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/init/bean/EcardConfigParamBean.kt b/app/src/main/java/com/supwisdom/activities/init/bean/EcardConfigParamBean.kt
new file mode 100644
index 0000000..538dbb3
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/init/bean/EcardConfigParamBean.kt
@@ -0,0 +1,17 @@
+package com.supwisdom.activities.init.bean
+
+import com.supwisdom.bean.BaseResp
+
+/**
+ * @author zzq
+ * @date 2018/7/11
+ * @desc 配置结果
+ */
+class EcardConfigParamBean constructor(retcode: Int, retmsg: String) : BaseResp(retcode, retmsg) {
+    var mode: Int = 0
+    var devphyid: String? = null
+    var epayIP: String? = null
+    var epayUri: String? = null
+    var epayPort: Int = 0
+    var systime: Long = 0
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/init/bean/EcardConfigParamRetBean.java b/app/src/main/java/com/supwisdom/activities/init/bean/EcardConfigParamRetBean.java
new file mode 100644
index 0000000..184c457
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/init/bean/EcardConfigParamRetBean.java
@@ -0,0 +1,54 @@
+package com.supwisdom.activities.init.bean;
+
+/**
+ * @author zzq
+ * @date 2018/7/12
+ * @desc nsd server返回结果
+ */
+public class EcardConfigParamRetBean {
+    private String _id;
+    private String name;
+    private String timestamp;
+    private String url;
+    private long system;
+
+    public String get_id() {
+        return _id;
+    }
+
+    public void set_id(String _id) {
+        this._id = _id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getTimestamp() {
+        return timestamp;
+    }
+
+    public void setTimestamp(String timestamp) {
+        this.timestamp = timestamp;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public long getSystem() {
+        return system;
+    }
+
+    public void setSystem(long system) {
+        this.system = system;
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/activities/init/bean/NsdServerConfigRetBean.kt b/app/src/main/java/com/supwisdom/activities/init/bean/NsdServerConfigRetBean.kt
new file mode 100644
index 0000000..d6caa8f
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/init/bean/NsdServerConfigRetBean.kt
@@ -0,0 +1,12 @@
+package com.supwisdom.activities.init.bean
+
+import com.supwisdom.bean.BaseResp
+
+/**
+ * @author zzq
+ * @date 2018/7/12
+ * @desc nsd server 返回配置列表
+ */
+class NsdServerConfigRetBean constructor(retcode: Int, retmsg: String) : BaseResp(retcode, retmsg) {
+    var list: List<String>? = null
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/init/mode/NsdClient.kt b/app/src/main/java/com/supwisdom/activities/init/mode/NsdClient.kt
new file mode 100644
index 0000000..2f3bf18
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/init/mode/NsdClient.kt
@@ -0,0 +1,106 @@
+package com.supwisdom.activities.init.mode
+
+import android.content.Context
+import android.net.nsd.NsdManager
+import android.net.nsd.NsdServiceInfo
+import android.util.Log
+
+class NsdClient constructor(context: Context, serviceName: String, callback: IServerFound) {
+    private val TAG = NsdClient::class.java.simpleName
+    /**
+     * NSD_SERVICE_NAME和NSD_SERVER_TYPE需要与服务器端完全一致
+     */
+    private val NSD_SERVER_TYPE = "_http._tcp."
+    private val context = context
+    private val serviceName = serviceName
+    private val mIServerFound = callback
+
+    private var mDiscoveryListener: NsdManager.DiscoveryListener? = null
+    private var mResolverListener: NsdManager.ResolveListener? = null
+    private var mNsdManager: NsdManager? = null
+    private var singleFlag = false
+
+
+    fun start() {
+        mNsdManager = context.getSystemService(Context.NSD_SERVICE) as NsdManager
+        initializeDiscoveryListener()
+        mNsdManager!!.discoverServices(NSD_SERVER_TYPE, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener)
+        initializeResolveListener()
+    }
+
+    /**
+     * 扫描未被解析前的 NsdServiceInfo
+     * 用于服务发现的回调调用接口
+     */
+    private fun initializeDiscoveryListener() {
+        mDiscoveryListener = object : NsdManager.DiscoveryListener {
+            override fun onStartDiscoveryFailed(serviceType: String, errorCode: Int) {
+                mNsdManager!!.stopServiceDiscovery(this)
+                Log.e(TAG, "onStartDiscoveryFailed():")
+            }
+
+            override fun onStopDiscoveryFailed(serviceType: String, errorCode: Int) {
+                mNsdManager!!.stopServiceDiscovery(this)
+                Log.e(TAG, "onStopDiscoveryFailed():")
+            }
+
+            override fun onDiscoveryStarted(serviceType: String) {
+                Log.e(TAG, "onDiscoveryStarted():")
+            }
+
+            override fun onDiscoveryStopped(serviceType: String) {
+                Log.e(TAG, "onDiscoveryStopped():")
+            }
+
+            /**
+             *
+             * @param serviceInfo
+             */
+            override fun onServiceFound(serviceInfo: NsdServiceInfo) {
+
+                //根据咱服务器的定义名称，指定解析该 NsdServiceInfo
+                if (serviceInfo.serviceName == serviceName) {
+                    if (!singleFlag) {
+                        singleFlag = true
+                        mNsdManager!!.resolveService(serviceInfo, mResolverListener)
+                    }
+                }
+            }
+
+            override fun onServiceLost(serviceInfo: NsdServiceInfo) {
+                Log.e(TAG, "onServiceLost(): serviceInfo=$serviceInfo")
+            }
+        }
+    }
+
+    /**
+     * 解析未 调用未被解析的 NsdServiceInfo
+     */
+    private fun initializeResolveListener() {
+        mResolverListener = object : NsdManager.ResolveListener {
+            override fun onResolveFailed(serviceInfo: NsdServiceInfo, errorCode: Int) {}
+
+            override fun onServiceResolved(serviceInfo: NsdServiceInfo) {
+                mIServerFound.onServerFound(serviceInfo)
+            }
+        }
+    }
+
+
+    fun stop() {
+        mNsdManager!!.stopServiceDiscovery(mDiscoveryListener)
+        singleFlag = false
+    }
+
+    interface IServerFound {
+        /**
+         * 回調 指定解析的结果
+         */
+        fun onServerFound(serviceInfo: NsdServiceInfo)
+
+        /**
+         * 無合適 回調失敗
+         */
+        fun onServerFail()
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/init/mode/NsdClientApi.kt b/app/src/main/java/com/supwisdom/activities/init/mode/NsdClientApi.kt
new file mode 100644
index 0000000..79d8813
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/init/mode/NsdClientApi.kt
@@ -0,0 +1,81 @@
+package com.supwisdom.activities.init.mode
+
+import com.beust.klaxon.JsonArray
+import com.beust.klaxon.Parser
+import com.supwisdom.activities.init.bean.EcardConfigParamBean
+import com.supwisdom.activities.init.bean.EcardConfigParamRetBean
+import com.supwisdom.activities.init.bean.NsdServerConfigRetBean
+import com.supwisdom.okhttp.NetworkHandler
+import com.supwisdom.utilities.CommonUtil
+import com.supwisdom.utilities.GsonUtil
+import com.supwisdom.utilities.PublicDef
+import org.apache.http.HttpStatus
+
+/**
+ * @author zzq
+ * @date 2018/7/11
+ * @desc 从nsd-server获取数据
+ */
+class NsdClientApi constructor(ip: String, port: Int) {
+    private var url: String = "http://$ip:$port"
+
+    fun getEcardConfigParam(configName: String): EcardConfigParamBean {
+        val resp = NetworkHandler.getInstance().get("$url/ns/$configName", null)
+                ?: return EcardConfigParamBean(PublicDef.ERROR, "请求超时")
+        if (resp.retcode != HttpStatus.SC_OK) {
+            return EcardConfigParamBean(resp.retcode, "错误码=${resp.retcode},${resp.retmsg}")
+        }
+        try {
+            val retBean = GsonUtil.GsonToBean(resp.retjson, EcardConfigParamRetBean::class.java)
+                    ?: return EcardConfigParamBean(PublicDef.ERROR, "解析为空")
+            val ret = EcardConfigParamBean(PublicDef.SUCCESS, "获取成功")
+            ret.systime = retBean.system
+            retBean.url!!.split("&", " ").forEach {
+                val keyValue = it.split("=")
+                when {
+                    keyValue[0].compareTo("mode", ignoreCase = true) == 0 -> {
+                        if (!CommonUtil.isNumeric(keyValue[1])) {
+                            return EcardConfigParamBean(PublicDef.ERROR, "mode不是数字")
+                        }
+                        ret.mode = keyValue[1].toInt()
+                    }
+                    keyValue[0].compareTo("id", ignoreCase = true) == 0 -> {
+                        if (!CommonUtil.isNumeric(keyValue[1])) {
+                            return EcardConfigParamBean(PublicDef.ERROR, "id不是数字")
+                        }
+                        ret.devphyid = keyValue[1]
+                    }
+                    keyValue[0].compareTo("ip", ignoreCase = true) == 0 -> {
+                        ret.epayIP = keyValue[1]
+                    }
+                    keyValue[0].compareTo("uri", ignoreCase = true) == 0 -> {
+                        ret.epayUri = keyValue[1]
+                    }
+                    keyValue[0].compareTo("port", ignoreCase = true) == 0 -> {
+                        if (!CommonUtil.isNumeric(keyValue[1])) {
+                            return EcardConfigParamBean(PublicDef.ERROR, "port不是数字")
+                        }
+                        ret.epayPort = keyValue[1].toInt()
+                    }
+                }
+            }
+            return ret
+        } catch (ex: Exception) {
+            ex.printStackTrace()
+            return EcardConfigParamBean(PublicDef.ERROR, "异常:${ex.message}")
+        }
+    }
+
+    fun getNsdServerConfigList(): NsdServerConfigRetBean {
+        val resp = NetworkHandler.getInstance().get("$url/list", null)
+                ?: return NsdServerConfigRetBean(PublicDef.ERROR, "请求超时")
+        if (resp.retcode != HttpStatus.SC_OK) {
+            return NsdServerConfigRetBean(resp.retcode, "错误码=${resp.retcode},${resp.retmsg}")
+        }
+        return NsdServerConfigRetBean(PublicDef.SUCCESS, "成功").apply {
+            this.list = (Parser().parse(StringBuilder(resp.retjson)) as JsonArray<String>).map {
+                it
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/load/ILoadView.kt b/app/src/main/java/com/supwisdom/activities/load/ILoadView.kt
new file mode 100644
index 0000000..e94d5c0
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/load/ILoadView.kt
@@ -0,0 +1,17 @@
+package com.supwisdom.activities.load
+
+import android.app.Activity
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+interface ILoadView {
+    fun getActivity(): Activity
+
+    fun showProgress(hint: String, clearlast: Boolean)
+
+    fun showFinish()
+
+    fun jumpToUnregister(errmsg: String)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/load/LoadActivity.kt b/app/src/main/java/com/supwisdom/activities/load/LoadActivity.kt
new file mode 100644
index 0000000..dccbe29
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/load/LoadActivity.kt
@@ -0,0 +1,99 @@
+package com.supwisdom.activities.load
+
+import android.app.Activity
+import android.content.Intent
+import android.os.Bundle
+import android.view.View
+import android.widget.TextView
+import android.widget.Toast
+import com.supwisdom.R
+import com.supwisdom.activities.BaseActivity
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.activities.unregister.UnregisterActivity
+import com.supwisdom.auxscreen.AuxScreenController
+import com.supwisdom.utils.DateUtil
+import java.lang.StringBuilder
+import java.util.ArrayList
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+class LoadActivity : BaseActivity(), ILoadView {
+    private lateinit var presenter: LoadPresenter
+    private lateinit var vLoadPro: TextView
+    private val procontent = StringBuilder()
+    private val auxList = ArrayList<String>()
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_load)
+
+        initView()
+        initData()
+    }
+
+    override fun onResume() {
+        super.onResume()
+        presenter.start()
+        refresh()
+    }
+
+    private fun refresh() {
+        procontent.setLength(0)
+        auxList.clear()
+        AuxScreenController.getInstance().refreshTitle("设备参数加载")
+        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDate())
+        AuxScreenController.getInstance().refreshContent(auxList)
+    }
+
+    private fun initData() {
+        presenter = LoadPresenter(this)
+    }
+
+    private fun initView() {
+        this.findViewById<View>(R.id.btn_back).setOnClickListener {
+            if (presenter.isLoading()) {
+                Toast.makeText(applicationContext, "正在加载信息", Toast.LENGTH_SHORT).show()
+            } else {
+                this@LoadActivity.finish()
+            }
+        }
+        vLoadPro = findViewById<View>(R.id.tv_load_pro) as TextView
+    }
+
+    override fun getActivity(): Activity {
+        return this
+    }
+
+    override fun showProgress(hint: String, clearlast: Boolean) {
+        procontent.append("\n").append(hint)
+        vLoadPro.text = procontent.toString()
+        if (clearlast) {
+            auxList.removeAt(auxList.size - 1)
+        }
+        auxList.add(hint)
+        AuxScreenController.getInstance().refreshContent(showFormatAux())
+    }
+
+    override fun showFinish() {
+
+    }
+
+    override fun jumpToUnregister(errmsg: String) {
+        val intent = Intent()
+        intent.putExtra("errmsg", errmsg)
+        intent.setClass(this, UnregisterActivity::class.java!!)
+        startActivity(intent)
+    }
+
+    private fun showFormatAux(): List<String> {
+        val list = ArrayList<String>()
+        val size = auxList.size
+        list.addAll(auxList)
+        for (i in size..4) {
+            list.add(" ")
+        }
+        return list
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/load/LoadPresenter.kt b/app/src/main/java/com/supwisdom/activities/load/LoadPresenter.kt
new file mode 100644
index 0000000..701e029
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/load/LoadPresenter.kt
@@ -0,0 +1,60 @@
+package com.supwisdom.activities.load
+
+import android.os.Handler
+import android.os.Looper
+import android.os.Message
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.utils.CommonUtil
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+class LoadPresenter constructor(iLoadView: ILoadView) {
+    private val iLoadView = iLoadView
+    private val pos = SPApplication.getInstance().getPos()
+    private lateinit var handler: Handler
+
+    init {
+        createHandler()
+    }
+
+    private val LOAD_SUCCESS = 1
+    private val JUMP_TO_UNREGISTER = 2
+    private val LOAD_PROGRESS = 3
+    private val LOAD_DONE = 3
+
+    private var hasInit: Boolean = false
+    private var loading: Boolean = false
+
+    fun isLoading(): Boolean {
+        return loading
+    }
+
+    fun start() {
+
+    }
+
+    private fun createHandler() {
+        handler = object : Handler(Looper.getMainLooper()) {
+            override fun handleMessage(msg: Message) {
+                when (msg.what) {
+                    LOAD_DONE -> iLoadView.showProgress(msg.obj as String, true)
+                    LOAD_PROGRESS -> iLoadView.showProgress(msg.obj as String, false)
+                    JUMP_TO_UNREGISTER -> iLoadView.jumpToUnregister(msg.obj as String)
+                    LOAD_SUCCESS -> {
+                        CommonUtil.doSleep(3000)
+                        iLoadView.showFinish()
+                    }
+                }
+            }
+        }
+    }
+
+    private fun sendMessage(code: Int, info: String) {
+        val msg = Message()
+        msg.what = code
+        msg.obj = info
+        handler.sendMessage(msg)
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/unregister/UnregisterActivity.kt b/app/src/main/java/com/supwisdom/activities/unregister/UnregisterActivity.kt
new file mode 100644
index 0000000..9ce56b4
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/unregister/UnregisterActivity.kt
@@ -0,0 +1,60 @@
+package com.supwisdom.activities.unregister
+
+import android.content.Intent
+import android.os.Bundle
+import android.view.KeyEvent
+import android.widget.TextView
+import com.supwisdom.R
+import com.supwisdom.activities.BaseActivity
+import com.supwisdom.activities.init.InitActivity
+import com.supwisdom.auxscreen.AuxScreenController
+import com.supwisdom.utils.DateUtil
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+class UnregisterActivity:BaseActivity() {
+    private lateinit var vErrmsg: TextView
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        this.setContentView(R.layout.activity_unregister)
+
+        initView()
+    }
+
+    private fun initView() {
+        val backBtn = this.findViewById(R.id.tv_back) as TextView
+        backBtn.setOnClickListener {
+            jumpActivity(InitActivity::class.java)
+        }
+        vErrmsg = this.findViewById(R.id.tv_errmsg) as TextView
+    }
+
+    override fun dispatchKeyEvent(event: KeyEvent?): Boolean {
+        return super.dispatchKeyEvent(event)
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+    }
+
+    override fun onResume() {
+        super.onResume()
+        val errmsg = intent.getStringExtra("errmsg")
+        refresh(errmsg)
+        vErrmsg.text = errmsg
+    }
+
+    private fun refresh(errmsg: String) {
+        AuxScreenController.getInstance().refreshTitle("设备注册状态")
+        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDate())
+        AuxScreenController.getInstance().refreshContent(listOf("设备未注册", errmsg))
+    }
+
+    override fun onNewIntent(intent: Intent) {
+        super.onNewIntent(intent)
+        this.intent.putExtra("errmsg", intent.getStringExtra("errmsg"))
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/upgrade/UpgradeAcvitity.kt b/app/src/main/java/com/supwisdom/activities/upgrade/UpgradeAcvitity.kt
index 025873d..0e57a3b 100644
--- a/app/src/main/java/com/supwisdom/activities/upgrade/UpgradeAcvitity.kt
+++ b/app/src/main/java/com/supwisdom/activities/upgrade/UpgradeAcvitity.kt
@@ -1,22 +1,179 @@
 package com.supwisdom.activities.upgrade
 
+import android.content.Intent
+import android.net.Uri
+import android.os.Build
 import android.os.Bundle
+import android.os.CountDownTimer
+import android.support.v4.content.FileProvider
+import android.view.KeyEvent
+import android.widget.Button
+import android.widget.TextView
+import com.supwisdom.R
 import com.supwisdom.activities.BaseActivity
+import com.supwisdom.auxscreen.AuxScreenController
+import com.supwisdom.activities.upgrade.mode.EpayUpgradeApi
+import com.supwisdom.utils.CommonUtil
+import com.supwisdom.utils.DateUtil
+import com.supwisdom.utils.ThreadPool
+import java.io.File
+import java.util.*
 
 /**
  ** create by zzq on 2019/7/24
  ** @desc
  **/
+@Suppress("DEPRECATION")
 class UpgradeAcvitity : BaseActivity() {
+    private lateinit var vResult: TextView
+    private lateinit var vUpgradeMsg: TextView
+    private lateinit var vServerUrl: TextView
+    private lateinit var vPosOldVersion: TextView
+    private lateinit var vPosVersion: TextView
+    private var isUpgrading = false
+    @Volatile
+    private var keyActive = true
+
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_upgrade)
+        initView()
+        initData()
     }
 
-    override fun onDestroy() {
-        super.onDestroy()
+    private fun initData() {
+        vPosOldVersion.text = CommonUtil.getVersionName(this)
+    }
+
+    private fun initView() {
+        vResult = this.findViewById(R.id.tv_result) as TextView
+        vUpgradeMsg = this.findViewById(R.id.tv_upgrade_msg) as TextView
+
+        vServerUrl = this.findViewById(R.id.tv_server_url) as TextView
+        vPosOldVersion = this.findViewById(R.id.tv_old_version) as TextView
+        vPosVersion = this.findViewById(R.id.tv_pos_version) as TextView
+        this.findViewById<Button>(R.id.tv_upgrade).setOnClickListener {
+            asyncUpgrade()
+        }
+    }
+
+    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
+        if (event.action == KeyEvent.ACTION_DOWN) {
+            if (isUpgrading || !keyActive) {
+                return super.dispatchKeyEvent(event)
+            }
+            resetCounter(200)
+
+            when (event.keyCode) {
+                KeyEvent.KEYCODE_DEL ->
+                    //cancel
+                    finish()
+                KeyEvent.KEYCODE_ENTER -> {
+                    //ok
+                    isUpgrading = true
+                    AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("正在升级", "请稍等..."))
+                    asyncUpgrade()
+                }
+            }
+        }
+        return super.dispatchKeyEvent(event)
     }
 
     override fun onResume() {
         super.onResume()
+        keyActive = true
+        refresh()
+    }
+
+    private fun refresh() {
+        isUpgrading = false
+        AuxScreenController.getInstance().refreshTitle("应用在线升级")
+        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDate())
+        AuxScreenController.getInstance().refreshContent(
+            Arrays.asList(
+                "当前版本>>", CommonUtil.getVersionName(applicationContext),
+                "确认 --应用升级", "取消 --退出"
+            )
+        )
+    }
+
+    private val upgradeApiCallback = object : EpayUpgradeApi.CallbackInterface {
+        override fun progresss(pro: Int) {
+            runOnUiThread {
+                vUpgradeMsg.text = "$pro%"
+                vUpgradeMsg.setTextColor(resources.getColor(R.color.black))
+                AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("正在下载", "$pro%"))
+            }
+        }
+
+        override fun success(filepath: String) {
+            runOnUiThread {
+                isUpgrading = false
+                vUpgradeMsg.text = "下载成功"
+                vUpgradeMsg.setTextColor(resources.getColor(R.color.black))
+                AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("下载应用成功", "请在大屏确认升级"))
+                val apkFile = File(filepath)
+                installAPK(apkFile)
+            }
+        }
+
+        override fun failed(errmsg: String) {
+            runOnUiThread {
+                isUpgrading = false
+                vUpgradeMsg.text = errmsg
+                vUpgradeMsg.setTextColor(resources.getColor(R.color.cl_red))
+                AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("升级失败", "原因:", errmsg))
+            }
+        }
+    }
+
+    /**
+     * 开始下载apk
+     */
+    fun asyncUpgrade() {
+        ThreadPool.getDownloadPool().execute(Runnable {
+            EpayUpgradeApi(upgradeApiCallback).upgrade(CommonUtil.getVersionName(this))
+        })
+    }
+
+    /**
+     * 安装apk
+     */
+    private fun installAPK(apkFile: File) {
+        val intent = Intent(Intent.ACTION_VIEW)
+        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+            intent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
+            val contentUri = FileProvider.getUriForFile(
+                this, "com.supwisdom.charge.fileprovider", apkFile
+            )
+            intent.setDataAndType(contentUri, "application/vnd.android.package-archive")
+        } else {
+            intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive")
+        }
+        startActivity(intent)
+    }
+
+    private var counter: ContinuePressTimer? = null
+
+    private fun resetCounter(timems: Long) {
+        if (counter == null) {
+            counter = ContinuePressTimer(timems, 100)
+        }
+        counter!!.cancel()
+        keyActive = false
+        counter!!.start()
+    }
+
+    private inner class ContinuePressTimer internal constructor(millisInFuture: Long, countDownInterval: Long) :
+        CountDownTimer(millisInFuture, countDownInterval) {
+
+        override fun onTick(millisUntilFinished: Long) {
+
+        }
+
+        override fun onFinish() {
+            keyActive = true
+        }
     }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/upgrade/mode/EpayUpgradeApi.kt b/app/src/main/java/com/supwisdom/activities/upgrade/mode/EpayUpgradeApi.kt
new file mode 100644
index 0000000..1545002
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/upgrade/mode/EpayUpgradeApi.kt
@@ -0,0 +1,177 @@
+package com.supwisdom.activities.upgrade.mode
+
+import android.text.TextUtils
+import com.supwisdom.activities.YktSession
+import com.supwisdom.bean.UpgradeInfoRetBean
+import com.supwisdom.okhttp.WebParams
+import com.supwisdom.utils.*
+import org.apache.http.HttpStatus
+import java.io.File
+import java.io.FileInputStream
+import java.io.FileOutputStream
+import java.net.HttpURLConnection
+import java.net.URL
+import java.util.*
+
+/**
+ * @author zzq
+ * @date 2019/4/9
+ * @desc 在线升级
+ */
+class EpayUpgradeApi constructor(callbackInterface: CallbackInterface) {
+    private val TIMEOUT = 5 * 1000// 超时
+    private val callbackInterface = callbackInterface
+    private val POSID = "chargepos"
+
+    fun upgrade(versionName: String) {
+        val resp = getAppVersion()
+        if (resp.retcode != PublicDef.SUCCESS) {
+            callbackInterface.failed(resp.retmsg!!)
+            return
+        }
+        val updateFile = FileUtil.getUpdateFile("$POSID.zip")
+        if (updateFile == null) {
+            callbackInterface.failed("创建本地文件失败")
+            return
+        }
+        if (!downloadUpdateFile(resp.packageurl!!, updateFile, resp.packageversion!!)) {
+            return
+        }
+        parseDownloadFile(updateFile.absolutePath, resp.packageversion!!)
+    }
+
+    private fun downloadUpdateFile(downUrl: String, file: File, versionName: String): Boolean {
+//            val downStep = 1// 提示step
+        var downStep = 0// 提示step
+        val totalSize: Int// 文件总大小
+        var downloadCount = 0// 已经下载好的大小
+        var updateCount = 0// 已经上传的文件大小
+        try {
+            val url = URL(downUrl)
+            val urlConnection = url.openConnection() as HttpURLConnection
+            urlConnection.connectTimeout = TIMEOUT
+            urlConnection.readTimeout = TIMEOUT
+            urlConnection.doOutput = true
+            urlConnection.doInput = true
+            urlConnection.useCaches = false
+            // setting serialized
+            urlConnection.setRequestProperty("Content-type", "application/x-java-serialized-object")
+            //default is GET
+            urlConnection.requestMethod = "POST"
+            urlConnection.setRequestProperty("Charsert", "UTF-8")
+            urlConnection.setRequestProperty("connection", "Keep-Alive")
+            urlConnection.addRequestProperty("version", versionName)
+
+            urlConnection.addRequestProperty("username", "supwisdom")
+            urlConnection.addRequestProperty("password", "supwisdom")
+            urlConnection.addRequestProperty("filename", "$POSID.apk")
+
+            //connect to server (tcp)
+            urlConnection.connect()
+            // 获取下载文件的size
+            totalSize = urlConnection.contentLength
+            if (urlConnection.responseCode != HttpStatus.SC_OK) {
+                urlConnection.disconnect()
+                callbackInterface.failed("下载文件失败:错误码=${urlConnection.responseCode}")
+                return false
+            }
+            val inputStream = urlConnection.inputStream
+            val outputStream = FileOutputStream(file, false)// 文件存在则覆盖掉
+            val buffer = ByteArray(1024)
+            while (true) {
+                val readSize = inputStream.read(buffer)
+                if (readSize < 0) {
+                    break
+                }
+                outputStream.write(buffer, 0, readSize)
+                downloadCount += readSize// 实时获取下载到的大小
+
+                val progress = downloadCount * 1.0 / totalSize
+                val pro = Math.round(progress * 100).toInt()
+                if (pro - downStep >= 1) {
+                    downStep++
+                    CommonUtil.doSleep(100)
+                    callbackInterface.progresss(pro)
+                }
+            }
+            urlConnection.disconnect()
+            inputStream.close()
+            outputStream.close()
+            return true
+        } catch (e: Exception) {
+            e.printStackTrace()
+            callbackInterface.failed("下载文件异常:${e.message}")
+            return false
+        }
+    }
+
+    private fun parseDownloadFile(zipFilePath: String, versionName: String): Boolean {
+        try {
+            val index = zipFilePath.lastIndexOf("/")
+            val unZipFilePath = zipFilePath.substring(0, index)
+            ZipUtil.unzip(zipFilePath, unZipFilePath, false)
+            val apkFile = File("$unZipFilePath/$POSID.apk")
+            if (!apkFile.exists()) {
+                callbackInterface.failed("未找到文件$POSID.apk")
+                return false
+            }
+
+            val fileHash256 = CryptUtil.HASH256(FileInputStream(apkFile), "nzoqPYMIu91VViA/mEIG5FtJXi8=")
+            if (fileHash256 == null) {
+                callbackInterface.failed("计算文件校验数据错误")
+                return false
+            }
+            val signFile = FileInputStream("$unZipFilePath/hash256.sign")
+            val buffer = ByteArray(1024)
+            val length = signFile.read(buffer, 0, buffer.size)
+            if (length < 0) {
+                callbackInterface.failed("读取校验文件失败")
+                return false
+            }
+            signFile.close()
+            val signHash256 = String(Arrays.copyOfRange(buffer, 0, length))
+            if (!fileHash256.equals(signHash256, ignoreCase = true)) {
+                callbackInterface.failed("文件校验错误")
+                return false
+            }
+            callbackInterface.success("$unZipFilePath/$POSID.apk")
+            return true
+        } catch (e: Exception) {
+            e.printStackTrace()
+            callbackInterface.failed("文件校验异常:${e.message}")
+            return false
+        }
+    }
+
+    private fun getAppVersion(): UpgradeInfoRetBean {
+        val params = WebParams()
+        params.setParameter("version_package_id", "com.supwisdom.$POSID")
+            .setParameter("sourcetype", "pos")
+
+        val signdata = params.getParameterString("version_package_id")
+        val resp = YktSession.getInstance().sendYktRequestPost("/common/apk/version", signdata, params)
+            ?: return UpgradeInfoRetBean(PublicDef.ERROR, "获取版本号网络超时")
+        if (resp.retcode != HttpStatus.SC_OK) {
+            return UpgradeInfoRetBean(resp.retcode, resp.retmsg!!)
+        }
+        return try {
+            val bean = GsonUtil.GsonToBean(resp.retjson!!, UpgradeInfoRetBean::class.java)
+            when {
+                TextUtils.isEmpty(bean.packageversion) -> UpgradeInfoRetBean(PublicDef.ERROR, "获取版本号为空")
+                TextUtils.isEmpty(bean.packageurl) -> UpgradeInfoRetBean(PublicDef.ERROR, "获取升级链接为空")
+                else -> bean
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            UpgradeInfoRetBean(PublicDef.ERROR, "获取版本号JSON错误:${e.message}")
+        }
+    }
+
+    interface CallbackInterface {
+        fun progresss(pro: Int)
+
+        fun success(filepath: String)
+
+        fun failed(errmsg: String)
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/bean/BaseResp.kt b/app/src/main/java/com/supwisdom/bean/BaseResp.kt
index bb60f03..ac5fb29 100644
--- a/app/src/main/java/com/supwisdom/bean/BaseResp.kt
+++ b/app/src/main/java/com/supwisdom/bean/BaseResp.kt
@@ -4,5 +4,14 @@
  ** create by zzq on 2019/7/24
  ** @desc
  **/
-open class BaseResp constructor(retcode: Int, retmsg: String) {
+open class BaseResp {
+    constructor(retcode: Int, retmsg: String?) {
+        this.retcode = retcode
+        this.retmsg = retmsg
+    }
+
+    constructor()
+
+    var retcode: Int = 0
+    var retmsg: String? = null
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/bean/UpgradeInfoRetBean.kt b/app/src/main/java/com/supwisdom/bean/UpgradeInfoRetBean.kt
new file mode 100644
index 0000000..d32ccff
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/bean/UpgradeInfoRetBean.kt
@@ -0,0 +1,10 @@
+package com.supwisdom.bean
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+class UpgradeInfoRetBean constructor(retcode: Int, retmsg: String) : BaseResp(retcode, retmsg) {
+    var packageversion: String? = null
+    var packageurl: String? = null
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/db/ControlParaDao.kt b/app/src/main/java/com/supwisdom/db/ControlParaDao.kt
new file mode 100644
index 0000000..8998aa8
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/db/ControlParaDao.kt
@@ -0,0 +1,101 @@
+package com.supwisdom.db
+
+import android.content.ContentValues
+import android.content.Context
+import android.database.Cursor
+import com.supwisdom.entity.ControlParaRecord
+import java.util.concurrent.locks.Lock
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+class ControlParaDao constructor(context: Context) {
+    private val dbHelper = DBParaHelper.getInstance(context)
+    private val TABLE = DBParaHelper.TABLE_NAME_CONTROLPARA
+
+    fun getLock(): Lock {
+        return dbHelper.getLock()
+    }
+
+    fun replace(record: ControlParaRecord): Boolean {
+        val db = dbHelper.readableDatabase
+        val values = getContentValues(record)
+        try {
+            db.beginTransaction()
+            if (db.replace(TABLE, null, values) > 0) {
+                db.setTransactionSuccessful()
+                return true
+            }
+        } finally {
+            db.endTransaction()
+        }
+        return false
+    }
+
+    fun update(record: ControlParaRecord): Boolean {
+        val db = dbHelper.writableDatabase
+        val values = getContentValues(record)
+        try {
+            db.beginTransaction()
+            if (db.update(
+                    TABLE,
+                    values,
+                    BeanPropEnum.ControlPara.paraname.toString() + "=?",
+                    arrayOf(record.paraname)
+                ) > 0
+            ) {
+                db.setTransactionSuccessful()
+                return true
+            }
+        } finally {
+            db.endTransaction()
+        }
+        return false
+    }
+
+    fun get(paraname: String): ControlParaRecord? {
+        val db = dbHelper.readableDatabase
+        var cursor: Cursor? = null
+        try {
+            cursor = db.query(
+                TABLE, null, BeanPropEnum.ControlPara.paraname.toString() + "=?",
+                arrayOf(paraname), null, null, null
+            )
+            if (cursor != null && cursor.moveToNext()) {
+                return getRecord(cursor)
+            }
+        } finally {
+            cursor?.close()
+        }
+        return null
+    }
+
+    fun clear(): Boolean {
+        val db = dbHelper.writableDatabase
+        try {
+            db.beginTransaction()
+            if (db.delete(TABLE, null, null) < 0) {
+                return false
+            }
+            db.setTransactionSuccessful()
+            return true
+        } finally {
+            db.endTransaction()
+        }
+    }
+
+    private fun getRecord(cursor: Cursor): ControlParaRecord {
+        val record = ControlParaRecord()
+        record.paraname = cursor.getString(cursor.getColumnIndex(BeanPropEnum.ControlPara.paraname.toString()))
+        record.paraval = cursor.getString(cursor.getColumnIndex(BeanPropEnum.ControlPara.paraval.toString()))
+        return record
+    }
+
+    private fun getContentValues(record: ControlParaRecord): ContentValues {
+        val values = ContentValues()
+        values.put(BeanPropEnum.ControlPara.paraname.toString(), record.paraname)
+        values.put(BeanPropEnum.ControlPara.paraval.toString(), record.paraval)
+        return values
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/db/Pos.kt b/app/src/main/java/com/supwisdom/db/Pos.kt
index eff19ce..79caa4b 100644
--- a/app/src/main/java/com/supwisdom/db/Pos.kt
+++ b/app/src/main/java/com/supwisdom/db/Pos.kt
@@ -16,6 +16,7 @@
     private var dyRecord: DynamicParaRecord? = null
     private val sysParaDao = SysParaDao(context)
     private var sysRecord: SysParaRecord? = null
+    private val controlParaDao = ControlParaDao(context)
     private val transdtlOnlineDao = TransdtlOnlineDao(sdContext)
     private val transdtlOfflineDao = TransdtlOfflineDao(sdContext)
 
@@ -50,6 +51,24 @@
         return cfgRecord
     }
 
+    fun replaceControlPara(record: ControlParaRecord): Boolean {
+        try {
+            controlParaDao.getLock().lock()
+            return controlParaDao.replace(record)
+        } finally {
+            controlParaDao.getLock().unlock()
+        }
+    }
+
+    fun getControlPara(paraname: String): ControlParaRecord? {
+        try {
+            controlParaDao.getLock().lock()
+            return controlParaDao.get(paraname)
+        } finally {
+            controlParaDao.getLock().unlock()
+        }
+    }
+
     fun replaceDynamicPara(record: DynamicParaRecord): Boolean {
         try {
             dynamicParaDao.getLock().lock()
@@ -144,6 +163,7 @@
             transdtlOfflineDao.getLock().unlock()
         }
     }
+
     fun saveTransdtlOffline(record: TransdtlOfflineRecord): Boolean {
         try {
             transdtlOfflineDao.getLock().lock()
diff --git a/app/src/main/java/com/supwisdom/entity/ControlParaRecord.kt b/app/src/main/java/com/supwisdom/entity/ControlParaRecord.kt
new file mode 100644
index 0000000..9028aa7
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/entity/ControlParaRecord.kt
@@ -0,0 +1,10 @@
+package com.supwisdom.entity
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+class ControlParaRecord {
+    var paraname: String? = null
+    var paraval: String? = null
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/okhttp/TransResp.kt b/app/src/main/java/com/supwisdom/okhttp/TransResp.kt
index 1ff26d9..3215172 100644
--- a/app/src/main/java/com/supwisdom/okhttp/TransResp.kt
+++ b/app/src/main/java/com/supwisdom/okhttp/TransResp.kt
@@ -4,13 +4,15 @@
  ** create by zzq on 2019/7/24
  ** @desc
  **/
-class TransResp constructor(retcode: Int, retmsg: String) {
+class TransResp constructor(retcode: Int, retmsg: String?) {
     /**
      * HTTP返回码 retcode 200 success
      */
+    var retcode: Int = retcode
     /**
      * retmsg 返回消息，如果是200 则为空，非200则为返回错误信息
      */
+    var retmsg: String? = retmsg
     /**
      * 返回json信息
      */
diff --git a/app/src/main/java/com/supwisdom/utils/CommonUtil.kt b/app/src/main/java/com/supwisdom/utils/CommonUtil.kt
index aaeac12..91af8f7 100644
--- a/app/src/main/java/com/supwisdom/utils/CommonUtil.kt
+++ b/app/src/main/java/com/supwisdom/utils/CommonUtil.kt
@@ -12,6 +12,8 @@
 import android.os.Build
 import android.os.PowerManager
 import android.provider.Settings
+import android.widget.EditText
+import com.supwisdom.activities.SPApplication
 import java.io.File
 import java.io.FileOutputStream
 import java.io.PrintWriter
@@ -32,6 +34,22 @@
         }
     }
 
+    fun getEditView(et: EditText): String {
+        return et.text.toString().trim { it <= ' ' }.replace(" ", "")
+    }
+
+    fun getCommunicateTime(): Int {
+        var commTime = 2
+        val sysRecord = SPApplication.getInstance().getPos().getSysPara()
+        if (sysRecord != null) {
+            commTime = sysRecord.commTime
+            if (commTime == 0) {
+                commTime = 2
+            }
+        }
+        return commTime
+    }
+
     fun YuanToFen(yuan: Double): Int {
         return Math.round(yuan * 100).toInt()
     }
diff --git a/app/src/main/java/com/supwisdom/utils/CryptUtil.kt b/app/src/main/java/com/supwisdom/utils/CryptUtil.kt
new file mode 100644
index 0000000..d1677e6
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/utils/CryptUtil.kt
@@ -0,0 +1,126 @@
+package com.supwisdom.utils
+
+import java.io.InputStream
+import java.io.UnsupportedEncodingException
+import java.security.InvalidKeyException
+import java.security.MessageDigest
+import java.security.NoSuchAlgorithmException
+import javax.crypto.Mac
+import javax.crypto.spec.SecretKeySpec
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+object CryptUtil {
+    fun HASH256(text: String): String? {
+        return algorithm2(text, "SHA-256", true)
+    }
+
+    fun HASH256(fis: InputStream): String? {
+        return algorithm(fis, "SHA-256")
+    }
+
+    fun HASH256(fis: InputStream, extData: String): String? {
+        return algorithm(fis, "SHA-256", extData)
+    }
+
+    fun HASH512(text: String): String? {
+        return algorithm2(text, "SHA-512", true)
+    }
+
+    fun MD5(text: String): String? {
+        return algorithm2(text, "MD5", false)
+    }
+
+    fun HMACSHA1(data: String, key: String): String? {
+        try {
+            val algorithm = "HmacSHA1"
+            val mac = Mac.getInstance(algorithm)
+            val spec = SecretKeySpec(key.toByteArray(), algorithm)
+            mac.init(spec)
+            val byteHMAC = mac.doFinal(data.toByteArray())
+            return byteHMAC.encodeHex()
+        } catch (e: InvalidKeyException) {
+            e.printStackTrace()
+        } catch (ignore: NoSuchAlgorithmException) {
+            ignore.printStackTrace()
+        }
+        return null
+    }
+
+    private fun algorithm2(text: String?, algorithm: String, isUpperCase: Boolean): String? {
+        if (text != null && text.isNotEmpty()) {
+            try {
+                //创建具有指定算法名称的信息摘要
+                val md = MessageDigest.getInstance(algorithm)
+                //使用指定的字节数组对摘要进行最后更新，然后完成摘要计算
+                val results = md.digest(text.toByteArray(charset("UTF-8")))
+                //将得到的字节数组变成字符串返回
+                val resultString = results.encodeHex()
+                return if (isUpperCase) {
+                    resultString.toUpperCase()
+                } else {
+                    resultString.toLowerCase()
+                }
+            } catch (ex: NoSuchAlgorithmException) {
+                ex.printStackTrace()
+            } catch (ex: UnsupportedEncodingException) {
+                ex.printStackTrace()
+            }
+        }
+        return null
+    }
+
+    private fun algorithm(fis: InputStream, algorithm: String): String? {
+        try {
+            //拿到一个MD5转换器,如果想使用SHA-1或SHA-256，则传入SHA-1,SHA-256
+            val md = MessageDigest.getInstance(algorithm)
+
+            //分多次将一个文件读入，对于大型文件而言，比较推荐这种方式，占用内存比较少。
+            val buffer = ByteArray(1024)
+            var length: Int
+            while (true) {
+                length = fis.read(buffer, 0, 1024)
+                if (length < 0) {
+                    break
+                }
+                md.update(buffer, 0, length)
+            }
+            fis.close()
+            //转换并返回包含16个元素字节数组,返回数值范围为-128到127
+            return md.digest().encodeHex()
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return null
+        }
+
+    }
+
+    private fun algorithm(fis: InputStream, algorithm: String, extData: String): String? {
+        try {
+            //拿到一个MD5转换器,如果想使用SHA-1或SHA-256，则传入SHA-1,SHA-256
+            val md = MessageDigest.getInstance(algorithm)
+
+            //分多次将一个文件读入，对于大型文件而言，比较推荐这种方式，占用内存比较少。
+            val buffer = ByteArray(1024)
+            var length: Int
+            while (true) {
+                length = fis.read(buffer, 0, 1024)
+                if (length < 0) {
+                    break
+                }
+                md.update(buffer, 0, length)
+            }
+            fis.close()
+            md.update(extData.toByteArray(charset("UTF-8")))
+
+            //转换并返回包含16个元素字节数组,返回数值范围为-128到127
+            return md.digest().encodeHex()
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return null
+        }
+
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/utils/GsonUtil.kt b/app/src/main/java/com/supwisdom/utils/GsonUtil.kt
new file mode 100644
index 0000000..2c6d722
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/utils/GsonUtil.kt
@@ -0,0 +1,30 @@
+package com.supwisdom.utils
+
+import com.alibaba.fastjson.JSON
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+object GsonUtil {
+    /**
+     * 转成json
+     *
+     * @param object
+     * @return
+     */
+    fun GsonString(obj: Any): String {
+        return JSON.toJSONString(obj)
+    }
+
+    /**
+     * 转成bean
+     *
+     * @param gsonString
+     * @param cls
+     * @return
+     */
+    fun <T> GsonToBean(gsonString: String, cls: Class<T>): T {
+        return JSON.parseObject(gsonString, cls)
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/utils/PublicDef.kt b/app/src/main/java/com/supwisdom/utils/PublicDef.kt
index b860920..14fc606 100644
--- a/app/src/main/java/com/supwisdom/utils/PublicDef.kt
+++ b/app/src/main/java/com/supwisdom/utils/PublicDef.kt
@@ -40,4 +40,21 @@
     const val TRANSFLAG_PWD_CONSUME = 0x04 // 密码消费
 
     const val BG_SERVICE_NAME = "com.supwisdom.service.BackgroundTaskService"
+
+    /**
+     * Toast show
+     */
+    const val TOAST_SHOW_CRY = 1
+    const val TOAST_SHOW_SMILE = 2
+    const val TOAST_SHOW_DOUBT = 3
+
+    const val DIALOG_TYPE_BIG_PICTURE = 1
+    const val DIALOG_TYPE_PURCHASE = 2
+    const val DIALOG_TYPE_PASSWORD = 3
+    const val DIALOG_TYPE_SELECT_ORDER = 4
+    const val DIALOG_TYPE_DPS_CONFIRM = 5
+    const val DIALOG_TYPE_SCAN_RVS_CONFIRM = 6
+    const val DIALOG_TYPE_ORDINARY_CONSUME = 7
+    const val DIALOG_TYPE_DEPOSIT = 8
+    const val DIALOG_TYPE_NSD_CONFIG = 9
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/utils/ZipUtil.kt b/app/src/main/java/com/supwisdom/utils/ZipUtil.kt
new file mode 100644
index 0000000..37f1d09
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/utils/ZipUtil.kt
@@ -0,0 +1,194 @@
+package com.supwisdom.utils
+
+import org.apache.commons.lang3.StringUtils
+import java.io.*
+import java.util.*
+import java.util.zip.*
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+object ZipUtil {
+    /**
+     * 递归压缩文件夹
+     *
+     * @param srcRootDir 压缩文件夹根目录的子路径
+     * @param file       当前递归压缩的文件或目录对象
+     * @param zos        压缩文件存储对象
+     * @throws Exception
+     */
+    @Throws(Exception::class)
+    private fun zip(srcRootDir: String, file: File?, zos: ZipOutputStream) {
+        if (file == null) {
+            throw Exception("file is null")
+        }
+
+        //如果是文件，则直接压缩该文件
+        if (file.isFile) {
+            var count: Int
+            val bufferLen = 1024
+            val data = ByteArray(bufferLen)
+
+            //获取文件相对于压缩文件夹根目录的子路径
+            var subPath = file.absolutePath
+            val index = subPath.indexOf(srcRootDir)
+            if (index != -1) {
+                subPath = subPath.substring(srcRootDir.length + File.separator.length)
+            }
+            val entry = ZipEntry(subPath)
+            zos.putNextEntry(entry)
+            val bis = BufferedInputStream(FileInputStream(file))
+            while (true) {
+                count = bis.read(data, 0, bufferLen)
+                if (count < 0) {
+                    break
+                }
+                zos.write(data, 0, count)
+            }
+            bis.close()
+            zos.closeEntry()
+        } else {
+            //压缩目录中的文件或子目录
+            val childFileList = file.listFiles()
+            for (aChildFileList in childFileList!!) {
+                aChildFileList.absolutePath.indexOf(file.absolutePath)
+                zip(srcRootDir, aChildFileList, zos)
+            }
+        }//如果是目录，则压缩整个目录
+    }
+
+    /**
+     * 对文件或文件目录进行压缩
+     *
+     * @param srcPath     要压缩的源文件路径。如果压缩一个文件，则为该文件的全路径；如果压缩一个目录，则为该目录的顶层目录路径
+     * @param zipPath     压缩文件保存的路径。注意：zipPath不能是srcPath路径下的子文件夹
+     * @param zipFileName 压缩文件名
+     * @throws Exception
+     */
+    @Throws(Exception::class)
+    fun zip(srcPath: String, zipPath: String, zipFileName: String) {
+        if (StringUtils.isEmpty(srcPath) || StringUtils.isEmpty(zipPath) || StringUtils.isEmpty(zipFileName)) {
+            throw Exception("传入参数为空")
+        }
+        try {
+            val srcFile = File(srcPath)
+            //判断压缩文件保存的路径是否为源文件路径的子文件夹，如果是，则抛出异常（防止无限递归压缩的发生）
+            if (srcFile.isDirectory && zipPath.contains(srcPath)) {
+                throw Exception("zipPath must not be the child directory of srcPath.")
+            }
+
+            //判断压缩文件保存的路径是否存在，如果不存在，则创建目录
+            val zipDir = File(zipPath)
+            if (!zipDir.exists() || !zipDir.isDirectory) {
+                zipDir.mkdirs()
+            }
+
+            //创建压缩文件保存的文件对象
+            val zipFilePath = zipPath + File.separator + zipFileName
+            val zipFile = File(zipFilePath)
+            if (zipFile.exists()) {
+                //检测文件是否允许删除，如果不允许删除，将会抛出SecurityException
+                val securityManager = SecurityManager()
+                securityManager.checkDelete(zipFilePath)
+                //删除已存在的目标文件
+                zipFile.delete()
+            }
+
+            val cos = CheckedOutputStream(FileOutputStream(zipFile), CRC32())
+            val zos = ZipOutputStream(cos)
+
+            //如果只是压缩一个文件，则需要截取该文件的父目录
+            var srcRootDir = srcPath
+            if (srcFile.isFile) {
+                val index = srcPath.lastIndexOf(File.separator)
+                if (index != -1) {
+                    srcRootDir = srcPath.substring(0, index)
+                }
+            }
+            //调用递归压缩方法进行目录或文件压缩
+            zip(srcRootDir, srcFile, zos)
+            zos.flush()
+            zos.close()
+        } catch (e: Exception) {
+            throw e
+        }
+
+    }
+
+    /**
+     * 解压缩zip包
+     *
+     * @param zipFilePath        zip文件的全路径
+     * @param unzipFilePath      解压后的文件保存的路径
+     * @param includeZipFileName 解压后的文件保存的路径是否包含压缩文件的文件名。true-包含；false-不包含
+     */
+    @Throws(Exception::class)
+    fun unzip(zipFilePath: String, unzipFilePath: String, includeZipFileName: Boolean) {
+        var unzipFilePath = unzipFilePath
+        if (StringUtils.isEmpty(zipFilePath) || StringUtils.isEmpty(unzipFilePath)) {
+            throw Exception("传入参数为空")
+        }
+        val zipFile = File(zipFilePath)
+        //如果解压后的文件保存路径包含压缩文件的文件名，则追加该文件名到解压路径
+        if (includeZipFileName) {
+            var fileName = zipFile.name
+            if (StringUtils.isNotEmpty(fileName)) {
+                fileName = fileName.substring(0, fileName.lastIndexOf("."))
+            }
+            unzipFilePath = unzipFilePath + File.separator + fileName
+        }
+        //创建解压缩文件保存的路径
+        val unzipFileDir = File(unzipFilePath)
+        if (!unzipFileDir.exists() || !unzipFileDir.isDirectory) {
+            unzipFileDir.mkdirs()
+        }
+
+        //开始解压
+        val bufferSize = 1024
+        val buffer = ByteArray(bufferSize)
+        val zip = ZipFile(zipFile)
+        val entries = zip.entries() as Enumeration<ZipEntry>
+        //循环对压缩包里的每一个文件进行解压
+        while (entries.hasMoreElements()) {
+            val entry = entries.nextElement()
+            //构建压缩包中一个文件解压后保存的文件全路径
+            val entryFilePath = unzipFilePath + File.separator + entry.name
+            //构建解压后保存的文件夹路径
+            val index = entryFilePath.lastIndexOf(File.separator)
+            var entryDirPath = ""
+            if (index != -1) {
+                entryDirPath = entryFilePath.substring(0, index)
+            }
+            val entryDir = File(entryDirPath)
+            //如果文件夹路径不存在，则创建文件夹
+            if (!entryDir.exists() || !entryDir.isDirectory) {
+                entryDir.mkdirs()
+            }
+
+            //创建解压文件
+            val entryFile = File(entryFilePath)
+            if (entryFile.exists()) {
+                //检测文件是否允许删除，如果不允许删除，将会抛出SecurityException
+                val securityManager = SecurityManager()
+                securityManager.checkDelete(entryFilePath)
+                //删除已存在的目标文件
+                entryFile.delete()
+            }
+
+            //写入文件
+            val bos = BufferedOutputStream(FileOutputStream(entryFile))
+            val bis = BufferedInputStream(zip.getInputStream(entry))
+            var count: Int
+            while (true) {
+                count = bis.read(buffer, 0, bufferSize)
+                if (count < 0) {
+                    break
+                }
+                bos.write(buffer, 0, count)
+            }
+            bos.flush()
+            bos.close()
+        }
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/view/BigProgressDialog.kt b/app/src/main/java/com/supwisdom/view/BigProgressDialog.kt
new file mode 100644
index 0000000..9fd9825
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/view/BigProgressDialog.kt
@@ -0,0 +1,47 @@
+package com.supwisdom.view
+
+import android.app.Activity
+import android.app.ProgressDialog
+import android.content.Context
+import android.view.Gravity
+import android.widget.TextView
+import com.supwisdom.R
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+@Suppress("DEPRECATION")
+class BigProgressDialog constructor(context: Context, strMessage: String, cancelable: Boolean) :
+    ProgressDialog(context) {
+    private var tvMsg: TextView
+
+    init {
+        this.show()
+        this.setContentView(R.layout.dialog_progress)
+        this.window!!.attributes.gravity = Gravity.CENTER
+        tvMsg = this.findViewById<TextView>(R.id.loadingmsg)
+        this.setCancelable(cancelable)
+        setCanceledOnTouchOutside(false)
+        tvMsg.text = strMessage
+    }
+
+    fun setMsg(msg: String) {
+        tvMsg.text = msg
+    }
+
+    override fun show() {
+        if (!(context as Activity).isFinishing) {
+            //防止activity处于销毁状态
+            //android.view.WindowManager$BadTokenException: Unable to add window
+            // -- token android.os.BinderProxy@41b43ec0 is not valid; is your activity running
+            super.show()
+        }
+    }
+
+    override fun dismiss() {
+        if (!(context as Activity).isFinishing) {
+            super.dismiss()
+        }
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/view/BigSwDialog.kt b/app/src/main/java/com/supwisdom/view/BigSwDialog.kt
new file mode 100644
index 0000000..45fa8f3
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/view/BigSwDialog.kt
@@ -0,0 +1,30 @@
+package com.supwisdom.view
+
+import android.content.Context
+import android.view.KeyEvent
+import com.supwisdom.R
+import com.supwisdom.utils.PublicDef
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+class BigSwDialog constructor(context: Context, dialogType: Int) : DialogBase(context) {
+    init {
+        when (dialogType) {
+            PublicDef.DIALOG_TYPE_PASSWORD -> this.setContentView(R.layout.dialog_password)
+            PublicDef.DIALOG_TYPE_NSD_CONFIG -> this.setContentView(R.layout.dialog_init_nsd_config)
+        }
+        this.setCancelable(false)
+        this.setCanceledOnTouchOutside(false)
+    }
+
+    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
+        if (event.action == KeyEvent.ACTION_DOWN) {
+            when (event.keyCode) {
+                KeyEvent.KEYCODE_DEL -> dismiss()
+            }
+        }
+        return super.dispatchKeyEvent(event)
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/view/RecyclerViewUtil.kt b/app/src/main/java/com/supwisdom/view/RecyclerViewUtil.kt
index 58d4fa2..7af0cd0 100644
--- a/app/src/main/java/com/supwisdom/view/RecyclerViewUtil.kt
+++ b/app/src/main/java/com/supwisdom/view/RecyclerViewUtil.kt
@@ -9,7 +9,7 @@
  * @date 2018/6/21
  * @desc TODO
  */
-class RecyclerViewUtil {
+object RecyclerViewUtil {
     class ItemDecoration constructor(top: Int, bottom: Int, left: Int, right: Int) : RecyclerView.ItemDecoration() {
         private val top = top
         private val bottom = bottom
diff --git a/app/src/main/java/com/supwisdom/view/SWToast.kt b/app/src/main/java/com/supwisdom/view/SWToast.kt
new file mode 100644
index 0000000..deb3fa2
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/view/SWToast.kt
@@ -0,0 +1,53 @@
+package com.supwisdom.view
+
+import android.content.Context
+import android.view.Gravity
+import android.view.LayoutInflater
+import android.view.View
+import android.widget.ImageView
+import android.widget.TextView
+import android.widget.Toast
+import com.supwisdom.R
+import com.supwisdom.utils.PublicDef
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+object SWToast {
+    fun show(context: Context, msg: String, showway: Int) {
+        val Inflater = LayoutInflater.from(context)
+        val layout = Inflater.inflate(R.layout.sw_toast, null)
+
+        val cry = layout.findViewById(R.id.pic_cry) as ImageView
+        val smile = layout.findViewById(R.id.pic_smile) as ImageView
+        val doubt = layout.findViewById(R.id.pic_doubt) as ImageView
+        if (showway == PublicDef.TOAST_SHOW_CRY) {
+            cry.visibility = View.VISIBLE
+            smile.visibility = View.GONE
+            doubt.visibility = View.GONE
+        } else if (showway == PublicDef.TOAST_SHOW_SMILE) {
+            cry.visibility = View.GONE
+            smile.visibility = View.VISIBLE
+            doubt.visibility = View.GONE
+        } else if (showway == PublicDef.TOAST_SHOW_DOUBT) {
+            cry.visibility = View.GONE
+            smile.visibility = View.GONE
+            doubt.visibility = View.VISIBLE
+        } else {
+            cry.visibility = View.GONE
+            smile.visibility = View.VISIBLE
+            doubt.visibility = View.GONE
+        }
+
+        // set a message
+        val toastText = layout.findViewById(R.id.toasttext) as TextView
+        toastText.text = msg
+        // Toast...
+        val toast = Toast(context)
+        toast.setGravity(Gravity.CENTER, 0, 0)
+        toast.duration = Toast.LENGTH_SHORT
+        toast.view = layout
+        toast.show()
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_init.xml b/app/src/main/res/layout/activity_init.xml
new file mode 100644
index 0000000..24c9d45
--- /dev/null
+++ b/app/src/main/res/layout/activity_init.xml
@@ -0,0 +1,160 @@
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              xmlns:tools="http://schemas.android.com/tools"
+              android:layout_width="fill_parent"
+              android:layout_height="fill_parent"
+              android:background="@color/light_blue2"
+              tools:context="com.supwisdom.activities.init.InitActivity">
+    <!--终端编号输入界面-->
+    <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_margin="20dp"
+            android:background="@drawable/corner_bg_white"
+            android:gravity="center_horizontal"
+            android:orientation="vertical">
+        <!--标题-->
+        <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="10dp"
+                android:gravity="center"
+                android:text="请填写以下信息"
+                android:textColor="@color/light_blue2"
+                android:textSize="@dimen/enable_title_text_size"/>
+
+        <ScrollView
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:scrollbars="none">
+
+            <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:orientation="vertical"
+                    android:padding="10dp">
+
+                <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:orientation="horizontal"
+                        android:weightSum="2">
+
+                    <Button
+                            android:id="@+id/tv_nsd_query"
+                            style="@style/init_param_title_btn_name_style"
+                            android:text="动态参数获取"/>
+
+                    <Button
+                            android:id="@+id/tv_settings"
+                            style="@style/init_param_title_btn_name_style"
+                            android:text="进入设置界面"/>
+                </LinearLayout>
+
+                <TextView
+                        android:id="@+id/tv_nsd_result"
+                        style="@style/init_param_name_style"/>
+
+                <TextView
+                        style="@style/init_param_name_style"
+                        android:text="终端MODE"/>
+
+                <RadioGroup
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content">
+
+                    <RadioButton
+                            android:id="@+id/rb_pay_mode"
+                            style="@style/init_param_mode_style"
+                            android:checked="true"
+                            android:text="消费模式"/>
+
+                    <RadioButton
+                            android:id="@+id/rb_deposit_mode"
+                            style="@style/init_param_mode_style"
+                            android:visibility="gone"
+                            android:text="充值模式"/>
+
+                    <RadioButton
+                            android:id="@+id/rb_third_pay_mode"
+                            style="@style/init_param_mode_style"
+                            android:visibility="gone"
+                            android:text="对接消费模式"/>
+
+                    <RadioButton
+                            android:id="@+id/rb_third_login_mode"
+                            style="@style/init_param_mode_style"
+                            android:visibility="gone"
+                            android:text="对接签到模式"/>
+
+                    <RadioButton
+                            android:id="@+id/rb_gate_mode"
+                            style="@style/init_param_mode_style"
+                            android:visibility="gone"
+                            android:text="闸机(入)模式(点击切换)"/>
+                </RadioGroup>
+
+                <TextView
+                        style="@style/init_param_name_style"
+                        android:text="终端物理ID"/>
+
+                <EditText
+                        android:id="@+id/tv_devphyid"
+                        style="@style/init_param_name_style"
+                        android:inputType="numberDecimal"
+                        android:maxLength="8"
+                        android:text="20000001"/>
+
+                <TextView
+                        style="@style/init_param_name_style"
+                        android:text="服务器IP"/>
+
+                <EditText
+                        android:id="@+id/tv_server_ip"
+                        style="@style/init_param_name_style"
+                        android:text="172.28.201.101"/>
+
+                <TextView
+                        style="@style/init_param_name_style"
+                        android:text="服务器URI"/>
+
+                <EditText
+                        android:id="@+id/tv_uri_root"
+                        style="@style/init_param_name_style"
+                        android:maxLines="1"
+                        android:text="epayapi"/>
+
+
+                <TextView
+                        style="@style/init_param_name_style"
+                        android:text="服务器PORT"/>
+
+                <EditText
+                        android:id="@+id/tv_server_port"
+                        style="@style/init_param_name_style"
+                        android:inputType="numberDecimal"
+                        android:maxLength="5"
+                        android:maxLines="1"
+                        android:text="9100"/>
+
+                <TextView
+                        android:id="@+id/btn_save"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_gravity="center"
+                        android:layout_marginTop="20dp"
+                        android:background="@drawable/select_bg_keyboard"
+                        android:paddingLeft="20dp"
+                        android:paddingTop="10dp"
+                        android:paddingRight="20dp"
+                        android:paddingBottom="10dp"
+                        android:text="保 存"
+                        android:textColor="@color/light_blue2"
+                        android:textSize="35sp"/>
+
+                <TextView
+                        android:layout_width="match_parent"
+                        android:layout_height="500dp"/>
+            </LinearLayout>
+        </ScrollView>
+    </LinearLayout>
+</LinearLayout>
diff --git a/app/src/main/res/layout/activity_load.xml b/app/src/main/res/layout/activity_load.xml
new file mode 100644
index 0000000..b6d9c86
--- /dev/null
+++ b/app/src/main/res/layout/activity_load.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:layout_width="fill_parent"
+              android:layout_height="fill_parent"
+              android:background="@color/light_blue2">
+
+    <LinearLayout
+            android:id="@+id/ll_enable_step"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_margin="20dp"
+            android:background="@drawable/corner_bg_white"
+            android:gravity="center_horizontal"
+            android:orientation="vertical">
+        <!--标题-->
+        <TextView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="10dp"
+                android:gravity="center"
+                android:text="正在加载设备参数"
+                android:textColor="@color/light_blue2"
+                android:textSize="@dimen/enable_title_text_size"/>
+        <!--中间内容-->
+        <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="400dp"
+                android:layout_gravity="center_horizontal"
+                android:layout_marginTop="20dp"
+                android:orientation="vertical"
+                android:padding="10dp">
+
+            <TextView
+                    android:id="@+id/tv_load_pro"
+                    style="@style/load_info_text_style"
+                    android:text=" "/>
+        </LinearLayout>
+        <!--底下俩按钮-->
+        <TextView
+                android:id="@+id/btn_back"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="10dp"
+                android:background="@drawable/select_bg_keyboard"
+                android:paddingLeft="20dp"
+                android:paddingTop="10dp"
+                android:paddingRight="20dp"
+                android:paddingBottom="10dp"
+                android:text="返 回"
+                android:textColor="@color/light_blue2"
+                android:textSize="30sp"/>
+    </LinearLayout>
+</LinearLayout>
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
deleted file mode 100644
index 980638c..0000000
--- a/app/src/main/res/layout/activity_main.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<android.support.constraint.ConstraintLayout
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        xmlns:tools="http://schemas.android.com/tools"
-        xmlns:app="http://schemas.android.com/apk/res-auto"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        tools:context=".MainActivity">
-
-    <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="Hello World!"
-            app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintLeft_toLeftOf="parent"
-            app:layout_constraintRight_toRightOf="parent"
-            app:layout_constraintTop_toTopOf="parent"/>
-
-</android.support.constraint.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_unregister.xml b/app/src/main/res/layout/activity_unregister.xml
new file mode 100644
index 0000000..5bcd6cb
--- /dev/null
+++ b/app/src/main/res/layout/activity_unregister.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent"
+    android:background="@color/light_blue2">
+
+    <LinearLayout
+        android:id="@+id/ll_enable_step"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_margin="20dp"
+        android:background="@drawable/corner_bg_white"
+        android:gravity="center_horizontal"
+        android:orientation="vertical">
+        <!--标题-->
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="10dp"
+            android:gravity="center"
+            android:text="设备未注册"
+            android:textColor="@color/light_blue2"
+            android:textSize="@dimen/enable_title_text_size" />
+
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="10dp"
+            android:padding="10dp"
+            android:text="说明: 设备参数配置已保存,后续只需签到认证成功即可使用"
+            android:textColor="@color/light_blue2"
+            android:textSize="30sp" />
+
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="10dp"
+            android:padding="10dp"
+            android:text="设备注册失败信息:"
+            android:textColor="@color/light_blue2"
+            android:textSize="30sp" />
+
+        <TextView
+            android:id="@+id/tv_errmsg"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:padding="10dp"
+            android:textColor="@color/cl_red"
+            android:textSize="30sp" />
+
+        <TextView
+            android:id="@+id/tv_back"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="10dp"
+            android:background="@drawable/select_bg_keyboard"
+            android:paddingBottom="10dp"
+            android:paddingLeft="20dp"
+            android:paddingRight="20dp"
+            android:paddingTop="10dp"
+            android:text="返 回"
+            android:textColor="@color/light_blue2"
+            android:textSize="30sp" />
+    </LinearLayout>
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_upgrade.xml b/app/src/main/res/layout/activity_upgrade.xml
new file mode 100644
index 0000000..f4e1fa0
--- /dev/null
+++ b/app/src/main/res/layout/activity_upgrade.xml
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent"
+              android:background="@color/light_blue2"
+              android:orientation="vertical">
+
+    <ScrollView
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_margin="20dp"
+            android:background="@drawable/corner_bg_white"
+            android:fillViewport="true"
+            android:scrollbars="none">
+
+        <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="vertical">
+            <TextView
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="10dp"
+                    android:gravity="center"
+                    android:text="软件在线升级"
+                    android:textColor="@color/light_blue2"
+                    android:textSize="30sp"/>
+            <TableLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content">
+
+                <TableRow>
+
+                    <TextView
+                            style="@style/upgrade_text_value_style"
+                            android:text="结\u3000\u3000果："/>
+
+                    <TextView
+                            android:id="@+id/tv_result"
+                            style="@style/upgrade_text_value_style"/>
+                </TableRow>
+
+                <TableRow android:layout_marginTop="15dp">
+
+                    <TextView
+                            style="@style/upgrade_text_value_style"
+                            android:text="升级地址："/>
+
+                    <TextView
+                            android:id="@+id/tv_server_url"
+                            style="@style/upgrade_text_value_style"/>
+                </TableRow>
+
+                <TableRow android:layout_marginTop="15dp">
+
+                    <TextView
+                            style="@style/upgrade_text_value_style"
+                            android:text="当前版本："/>
+
+                    <TextView
+                            android:id="@+id/tv_old_version"
+                            style="@style/upgrade_text_value_style"/>
+                </TableRow>
+
+                <TableRow android:layout_marginTop="15dp">
+
+                    <TextView
+                            style="@style/upgrade_text_value_style"
+                            android:text="升级版本："/>
+
+                    <TextView
+                            android:id="@+id/tv_pos_version"
+                            style="@style/upgrade_text_value_style"/>
+                </TableRow>
+
+                <TableRow android:layout_marginTop="15dp">
+
+                    <TextView
+                            style="@style/upgrade_text_value_style"
+                            android:text="升级进度："/>
+
+                    <TextView
+                            android:id="@+id/tv_upgrade_msg"
+                            style="@style/upgrade_text_value_style"/>
+                </TableRow>
+            </TableLayout>
+
+            <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="30dp"
+                    android:gravity="center_vertical"
+                    android:orientation="horizontal">
+
+                <Button
+                        android:id="@+id/tv_upgrade"
+                        style="@style/upgrade_text_value_style"
+                        android:layout_marginStart="50dp"
+                        android:layout_marginEnd="50dp"
+                        android:text="升级"/>
+
+            </LinearLayout>
+        </LinearLayout>
+    </ScrollView>
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/dialog_init_nsd_config.xml b/app/src/main/res/layout/dialog_init_nsd_config.xml
new file mode 100644
index 0000000..301e484
--- /dev/null
+++ b/app/src/main/res/layout/dialog_init_nsd_config.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="400dp"
+    android:layout_height="500dp"
+    android:layout_gravity="center"
+    android:background="@drawable/corner_bg_white"
+    android:orientation="vertical">
+
+    <TextView
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="10dp"
+        android:gravity="center"
+        android:text="参数配置列表"
+        android:textColor="@color/light_blue2"
+        android:textSize="35sp"
+        android:textStyle="bold" />
+
+    <android.support.v7.widget.RecyclerView
+        android:id="@+id/rv_config_list"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_marginTop="10dp"
+        android:orientation="vertical" />
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/dialog_password.xml b/app/src/main/res/layout/dialog_password.xml
new file mode 100644
index 0000000..7b62bbd
--- /dev/null
+++ b/app/src/main/res/layout/dialog_password.xml
@@ -0,0 +1,281 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout
+    android:id="@+id/ll_float_password"
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="@drawable/order_btn_purchase"
+        android:orientation="vertical">
+        <!--上半部分-->
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="center_horizontal"
+            android:orientation="vertical">
+            <!--提示文字-->
+            <TextView
+                android:id="@+id/tv_float_password_title"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/float_password_left_word_margin_top"
+                android:text="请输入卡密码"
+                android:textColor="@color/password_hint"
+                android:textSize="@dimen/float_password_hint_size"
+                android:textStyle="bold"/>
+            <!--密码输入框-->
+            <LinearLayout
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/float_password_left_obj_gap"
+                android:orientation="horizontal">
+                <!--密码1-->
+                <RelativeLayout
+                    android:layout_width="@dimen/float_password_pwd_size"
+                    android:layout_height="@dimen/float_password_pwd_size">
+
+                    <ImageView
+                        android:layout_width="fill_parent"
+                        android:layout_height="fill_parent"
+                        android:background="@drawable/password_pwd_frame"/>
+
+                    <ImageView
+                        android:id="@+id/float_password_img1"
+                        android:layout_width="20dp"
+                        android:layout_height="20dp"
+                        android:layout_margin="26dp"
+                        android:layout_marginTop="26dp"
+                        android:scaleType="fitXY"
+                        android:src="@drawable/purchase_cardread"/>
+                </RelativeLayout>
+                <!--密码2-->
+                <RelativeLayout
+                    android:layout_width="@dimen/float_password_pwd_size"
+                    android:layout_height="@dimen/float_password_pwd_size"
+                    android:layout_marginLeft="@dimen/float_password_left_obj_gap">
+
+                    <ImageView
+                        android:layout_width="fill_parent"
+                        android:layout_height="fill_parent"
+                        android:background="@drawable/password_pwd_frame"/>
+
+                    <ImageView
+                        android:id="@+id/float_password_img2"
+                        android:layout_width="20dp"
+                        android:layout_height="20dp"
+                        android:layout_margin="26dp"
+                        android:layout_marginTop="26dp"
+                        android:scaleType="fitXY"
+                        android:src="@drawable/purchase_cardread"/>
+                </RelativeLayout>
+                <!--密码3-->
+                <RelativeLayout
+                    android:layout_width="@dimen/float_password_pwd_size"
+                    android:layout_height="@dimen/float_password_pwd_size"
+                    android:layout_marginLeft="@dimen/float_password_left_obj_gap">
+
+                    <ImageView
+                        android:layout_width="fill_parent"
+                        android:layout_height="fill_parent"
+                        android:background="@drawable/password_pwd_frame"/>
+
+                    <ImageView
+                        android:id="@+id/float_password_img3"
+                        android:layout_width="20dp"
+                        android:layout_height="20dp"
+                        android:layout_margin="26dp"
+                        android:layout_marginTop="26dp"
+                        android:scaleType="fitXY"
+                        android:src="@drawable/purchase_cardread"/>
+                </RelativeLayout>
+                <!--密码4-->
+                <RelativeLayout
+                    android:layout_width="@dimen/float_password_pwd_size"
+                    android:layout_height="@dimen/float_password_pwd_size"
+                    android:layout_marginLeft="@dimen/float_password_left_obj_gap">
+
+                    <ImageView
+                        android:layout_width="fill_parent"
+                        android:layout_height="fill_parent"
+                        android:background="@drawable/password_pwd_frame"/>
+
+                    <ImageView
+                        android:id="@+id/float_password_img4"
+                        android:layout_width="20dp"
+                        android:layout_height="20dp"
+                        android:layout_margin="26dp"
+                        android:layout_marginTop="26dp"
+                        android:scaleType="fitXY"
+                        android:src="@drawable/purchase_cardread"/>
+                </RelativeLayout>
+                <!--密码5-->
+                <RelativeLayout
+                    android:layout_width="@dimen/float_password_pwd_size"
+                    android:layout_height="@dimen/float_password_pwd_size"
+                    android:layout_marginLeft="@dimen/float_password_left_obj_gap">
+
+                    <ImageView
+                        android:layout_width="fill_parent"
+                        android:layout_height="fill_parent"
+                        android:background="@drawable/password_pwd_frame"/>
+
+                    <ImageView
+                        android:id="@+id/float_password_img5"
+                        android:layout_width="20dp"
+                        android:layout_height="20dp"
+                        android:layout_margin="26dp"
+                        android:layout_marginTop="26dp"
+                        android:scaleType="fitXY"
+                        android:src="@drawable/purchase_cardread"/>
+                </RelativeLayout>
+                <!--密码6-->
+                <RelativeLayout
+                    android:layout_width="@dimen/float_password_pwd_size"
+                    android:layout_height="@dimen/float_password_pwd_size"
+                    android:layout_marginLeft="@dimen/float_password_left_obj_gap">
+
+                    <ImageView
+                        android:layout_width="fill_parent"
+                        android:layout_height="fill_parent"
+                        android:background="@drawable/password_pwd_frame"/>
+
+                    <ImageView
+                        android:id="@+id/float_password_img6"
+                        android:layout_width="20dp"
+                        android:layout_height="20dp"
+                        android:layout_margin="26dp"
+                        android:layout_marginTop="26dp"
+                        android:scaleType="fitXY"
+                        android:src="@drawable/purchase_cardread"/>
+                </RelativeLayout>
+            </LinearLayout>
+        </LinearLayout>
+
+        <!--下半部分-->
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginBottom="10dp"
+            android:layout_marginTop="@dimen/float_password_right_margin_top"
+            android:gravity="center_horizontal"
+            android:orientation="vertical">
+            <!--第一行按键-->
+            <LinearLayout
+                android:layout_width="wrap_content"
+                android:layout_height="@dimen/float_password_btn_size"
+                android:orientation="horizontal">
+
+                <ImageView
+                    android:id="@+id/float_password_btn1"
+                    android:layout_width="@dimen/float_password_btn_size"
+                    android:layout_height="@dimen/float_password_btn_size"
+                    android:src="@drawable/pass_one_normal"/>
+
+                <ImageView
+                    android:id="@+id/float_password_btn2"
+                    android:layout_width="@dimen/float_password_btn_size"
+                    android:layout_height="@dimen/float_password_btn_size"
+                    android:layout_marginLeft="@dimen/float_password_right_btn_margin"
+                    android:src="@drawable/pass_two_normal"/>
+
+                <ImageView
+                    android:id="@+id/float_password_btn3"
+                    android:layout_width="@dimen/float_password_btn_size"
+                    android:layout_height="@dimen/float_password_btn_size"
+                    android:layout_marginLeft="@dimen/float_password_right_btn_margin"
+                    android:src="@drawable/pass_three_normal"/>
+            </LinearLayout>
+            <!--第二行按钮-->
+            <LinearLayout
+                android:layout_width="wrap_content"
+                android:layout_height="@dimen/float_password_btn_size"
+                android:layout_marginTop="@dimen/float_password_right_btn_margin"
+                android:orientation="horizontal">
+
+                <ImageView
+                    android:id="@+id/float_password_btn4"
+                    android:layout_width="@dimen/float_password_btn_size"
+                    android:layout_height="@dimen/float_password_btn_size"
+                    android:src="@drawable/pass_four_normal"/>
+
+                <ImageView
+                    android:id="@+id/float_password_btn5"
+                    android:layout_width="@dimen/float_password_btn_size"
+                    android:layout_height="@dimen/float_password_btn_size"
+                    android:layout_marginLeft="@dimen/float_password_right_btn_margin"
+                    android:src="@drawable/pass_five_normal"/>
+
+                <ImageView
+                    android:id="@+id/float_password_btn6"
+                    android:layout_width="@dimen/float_password_btn_size"
+                    android:layout_height="@dimen/float_password_btn_size"
+                    android:layout_marginLeft="@dimen/float_password_right_btn_margin"
+                    android:src="@drawable/pass_six_normal"/>
+            </LinearLayout>
+            <!--第三行按钮-->
+            <LinearLayout
+                android:layout_width="wrap_content"
+                android:layout_height="@dimen/float_password_btn_size"
+                android:layout_marginTop="@dimen/float_password_right_btn_margin"
+                android:orientation="horizontal">
+
+                <ImageView
+                    android:id="@+id/float_password_btn7"
+                    android:layout_width="@dimen/float_password_btn_size"
+                    android:layout_height="@dimen/float_password_btn_size"
+                    android:src="@drawable/pass_seven_normal"/>
+
+                <ImageView
+                    android:id="@+id/float_password_btn8"
+                    android:layout_width="@dimen/float_password_btn_size"
+                    android:layout_height="@dimen/float_password_btn_size"
+                    android:layout_marginLeft="@dimen/float_password_right_btn_margin"
+                    android:src="@drawable/pass_eight_normal"/>
+
+                <ImageView
+                    android:id="@+id/float_password_btn9"
+                    android:layout_width="@dimen/float_password_btn_size"
+                    android:layout_height="@dimen/float_password_btn_size"
+                    android:layout_marginLeft="@dimen/float_password_right_btn_margin"
+                    android:src="@drawable/pass_nine_normal"/>
+            </LinearLayout>
+            <!--第四行按钮-->
+            <LinearLayout
+                android:layout_width="wrap_content"
+                android:layout_height="@dimen/float_password_btn_size"
+                android:layout_marginBottom="10dp"
+                android:layout_marginTop="@dimen/float_password_right_btn_margin"
+                android:orientation="horizontal">
+
+                <TextView
+                    android:id="@+id/float_password_cancel"
+                    android:layout_width="@dimen/float_password_btn_size"
+                    android:layout_height="@dimen/float_password_btn_size"
+                    android:background="@drawable/btn_red_normal"
+                    android:gravity="center"
+                    android:text="取消"
+                    android:textColor="@color/white"
+                    android:textSize="30sp"/>
+
+                <ImageView
+                    android:id="@+id/float_password_btn0"
+                    android:layout_width="@dimen/float_password_btn_size"
+                    android:layout_height="@dimen/float_password_btn_size"
+                    android:layout_marginLeft="@dimen/float_password_right_btn_margin"
+                    android:src="@drawable/pass_zero_normal"/>
+
+                <ImageView
+                    android:id="@+id/float_password_btn_delete"
+                    android:layout_width="@dimen/float_password_btn_size"
+                    android:layout_height="@dimen/float_password_btn_size"
+                    android:layout_marginLeft="@dimen/float_password_right_btn_margin"
+                    android:src="@drawable/pass_delete_normal"/>
+            </LinearLayout>
+        </LinearLayout>
+    </LinearLayout>
+</RelativeLayout>
+
+
diff --git a/app/src/main/res/layout/dialog_progress.xml b/app/src/main/res/layout/dialog_progress.xml
new file mode 100644
index 0000000..f2c8fb8
--- /dev/null
+++ b/app/src/main/res/layout/dialog_progress.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="@drawable/pay_ret_dialog_bg"
+    android:orientation="vertical"
+    android:gravity="center"
+    android:paddingTop="30dp"
+    android:paddingBottom="30dp"
+    android:paddingLeft="30dp"
+    android:paddingRight="30dp">
+
+    <ProgressBar
+        android:id="@+id/loadingImageView"
+        style="@style/myProgressBarStyleLarge"
+        android:layout_width="200dp"
+        android:layout_height="200dp"
+        android:layout_gravity="center"
+        android:padding="20dp" />
+
+    <TextView
+        android:id="@+id/loadingmsg"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center"
+        android:textColor="@android:color/white"
+        android:text="正在处理,请不要拿走卡片..."
+        android:textSize="30dp"
+        android:layout_marginBottom="30dp"
+        android:layout_marginTop="10dp" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_init_nsd_config_list.xml b/app/src/main/res/layout/item_init_nsd_config_list.xml
new file mode 100644
index 0000000..735e6f9
--- /dev/null
+++ b/app/src/main/res/layout/item_init_nsd_config_list.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/ll_config"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="@drawable/corner_bg_gray"
+    android:orientation="horizontal">
+
+    <TextView
+        android:id="@+id/tv_config_id"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:maxLines="1"
+        android:padding="10dp"
+        android:textColor="@color/light_blue2"
+        android:textSize="30sp"
+        android:textStyle="bold" />
+
+    <TextView
+        android:id="@+id/tv_config_name"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="10dp"
+        android:maxLines="1"
+        android:padding="10dp"
+        android:textColor="@color/light_blue2"
+        android:textSize="30sp"
+        android:textStyle="bold" />
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/sw_toast.xml b/app/src/main/res/layout/sw_toast.xml
new file mode 100644
index 0000000..bdc5081
--- /dev/null
+++ b/app/src/main/res/layout/sw_toast.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent"
+              android:background="@drawable/corner_bg"
+              android:gravity="center"
+              android:orientation="horizontal"
+              android:padding="5dp">
+
+    <ImageView
+        android:id="@+id/pic_cry"
+        android:layout_width="60dp"
+        android:layout_height="60dp"
+        android:layout_gravity="center"
+        android:scaleType="fitXY"
+        android:src="@drawable/toast_cry"
+        android:visibility="gone"/>
+
+    <ImageView
+        android:id="@+id/pic_smile"
+        android:layout_width="60dp"
+        android:layout_height="60dp"
+        android:layout_gravity="center"
+        android:scaleType="fitXY"
+        android:src="@drawable/toast_smile"/>
+
+    <ImageView
+        android:id="@+id/pic_doubt"
+        android:layout_width="60dp"
+        android:layout_height="60dp"
+        android:layout_gravity="center"
+        android:scaleType="fitXY"
+        android:src="@drawable/toast_doubt"
+        android:visibility="gone"/>
+
+    <TextView
+        android:id="@+id/toasttext"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="链路检测失败"
+        android:textColor="@color/black"
+        android:textSize="45dp"
+        android:textStyle="bold"/>
+</LinearLayout>
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index dae37ff..07cae7a 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -1,5 +1,4 @@
 <resources>
-
     <color name="black_overlay">#66000000</color>
     <color name="btn_light_blue">#5bc0de</color>
     <color name="light_gray">#ffa2a2a2</color>
