001package gu.dtalk.client;
002
003import com.google.common.base.Predicates;
004import com.google.common.base.Strings;
005
006import gu.dtalk.ConnectReq;
007import gu.dtalk.exception.DtalkException;
008import gu.dtalk.redis.DefaultCustomRedisConfigProvider;
009import gu.dtalk.redis.RedisConfigType;
010import gu.simplemq.Channel;
011import gu.simplemq.redis.JedisPoolLazy;
012import net.gdface.utils.BinaryUtils;
013
014import static gu.dtalk.client.SampleConsoleConfig.*;
015
016/**
017 * 简单字符终端实现
018 * @author guyadong
019 *
020 */
021public class SampleConsole extends BaseConsole {
022
023        public SampleConsole(String devmac, RedisConfigType config) {
024                super(devmac, config);
025        }
026        /**
027         * 使用密码验证连接合法性<br>
028         * 向dtalk引擎发送包含连接密码和本机mac地址的json连接请求字符串({@link ConnectReq}),
029         * 收到回复的请求通道名,即连接成功
030         * @see gu.dtalk.client.BaseConsole#authorize()
031         */
032        @Override
033        protected boolean authorize() {
034                        System.out.println("Input password  of Device,default password is last 4 character of device MAC address(lowercase):");
035                        ConnectReq req = new ConnectReq();
036                        req.mac = BinaryUtils.toHex(temminalMac);
037                        Channel<ConnectReq> conch = new Channel<>(connchname, ConnectReq.class);
038                        String pwd = null;
039                        while ((reqChannel == null) && !(pwd=scanLine(Predicates.<String>alwaysTrue())).isEmpty()) {
040                                req.pwd = BinaryUtils.getMD5String(pwd.getBytes());
041                                syncPublish(conch,req);
042                        }
043                        if(reqChannel != null){
044                                System.out.println("PASSWORD validate passed");
045                                return true;
046                        }
047                        return false;
048                }
049
050        public static void main(String []args){
051                CONSOLE_CONFIG.parseCommandLine(args);
052                DefaultCustomRedisConfigProvider.initredisParameters(CONSOLE_CONFIG.getRedisParameters());
053                System.out.println("Text terminal for Device Talk is starting(设备交互字符终端启动)");
054                String devmac = CONSOLE_CONFIG.getMac();
055                // 否则提示输入命令行参数
056                if(Strings.isNullOrEmpty(devmac)){
057                        devmac = inputMac();
058                }
059                RedisConfigType config;
060                try {
061                        config = RedisConfigType.lookupRedisConnect();
062                } catch (DtalkException e) {
063                        System.out.println(e.getMessage());
064                        return;
065                }
066                logger.info("use config={}",config.toString());
067                // 创建redis连接实例
068                JedisPoolLazy.createDefaultInstance( config.readRedisParam() );
069
070                SampleConsole client = new SampleConsole(devmac, config);
071                client.setStackTrace(CONSOLE_CONFIG.isTrace()).start();
072
073        }
074
075}