• ROS:ROS操作类MK.cs


        class MK
        {
            Stream connection;
            TcpClient con;
    
            public MK(string ip,int port)
            {
                con = new TcpClient();
                con.Connect(ip, port);
                connection = (Stream)con.GetStream();
            }
            public void Close()
            {
                connection.Close();
                con.Close();
            }
            public bool Login(string username, string password)
            {
                Send("/login", true);
                string hash = Read()[0].Split(new string[] { "ret=" }, StringSplitOptions.None)[1];
                Send("/login");
                Send("=name=" + username);
                Send("=response=00" + EncodePassword(password, hash), true);
                if (Read()[0] == "!done")
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            public void Send(string co)
            {
                byte[] bajty = Encoding.GetEncoding("GB2312").GetBytes(co.ToCharArray());
                byte[] velikost = EncodeLength(bajty.Length);
    
                connection.Write(velikost, 0, velikost.Length);
                connection.Write(bajty, 0, bajty.Length);
            }
            public void Send(string co, bool endsentence)
            {
                byte[] bajty = Encoding.GetEncoding("GB2312").GetBytes(co.ToCharArray());
                byte[] velikost = EncodeLength(bajty.Length);
                connection.Write(velikost, 0, velikost.Length);
                connection.Write(bajty, 0, bajty.Length);
                connection.WriteByte(0);
            }
            public List<string> Read()
            {
                List<string> output = new List<string>();
                string o = "";
                byte[] tmp = new byte[4];
                long count;
                while (true)
                {
                    tmp[3] = (byte)connection.ReadByte();
                    //if(tmp[3] == 220) tmp[3] = (byte)connection.ReadByte(); it sometimes happend to me that 
                    //mikrotik send 220 as some kind of "bonus" between words, this fixed things, not sure about it though
                    if (tmp[3] == 0)
                    {
                        output.Add(o);
                        if (o.Substring(0, 5) == "!done")
                        {
                            break;
                        }
                        else
                        {
                            o = "";
                            continue;
                        }
                    }
                    else
                    {
                        if (tmp[3] < 0x80)
                        {
                            count = tmp[3];
                        }
                        else
                        {
                            if (tmp[3] < 0xC0)
                            {
                                int tmpi = BitConverter.ToInt32(new byte[] { (byte)connection.ReadByte(), tmp[3], 0, 0 }, 0);
                                count = tmpi ^ 0x8000;
                            }
                            else
                            {
                                if (tmp[3] < 0xE0)
                                {
                                    tmp[2] = (byte)connection.ReadByte();
                                    int tmpi = BitConverter.ToInt32(new byte[] { (byte)connection.ReadByte(), tmp[2], tmp[3], 0 }, 0);
                                    count = tmpi ^ 0xC00000;
                                }
                                else
                                {
                                    if (tmp[3] < 0xF0)
                                    {
                                        tmp[2] = (byte)connection.ReadByte();
                                        tmp[1] = (byte)connection.ReadByte();
                                        int tmpi = BitConverter.ToInt32(new byte[] { (byte)connection.ReadByte(), tmp[1], tmp[2], tmp[3] }, 0);
                                        count = tmpi ^ 0xE0000000;
                                    }
                                    else
                                    {
                                        if (tmp[3] == 0xF0)
                                        {
                                            tmp[3] = (byte)connection.ReadByte();
                                            tmp[2] = (byte)connection.ReadByte();
                                            tmp[1] = (byte)connection.ReadByte();
                                            tmp[0] = (byte)connection.ReadByte();
                                            count = BitConverter.ToInt32(tmp, 0);
                                        }
                                        else
                                        {
                                            //Error in packet reception, unknown length
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                    }
    
                    for (int i = 0; i < count; i++)
                    {
                        o += (Char)connection.ReadByte();
                    }
                }
                return output;
            }
            byte[] EncodeLength(int delka)
            {
                if (delka < 0x80)
                {
                    byte[] tmp = BitConverter.GetBytes(delka);
                    return new byte[1] { tmp[0] };
                }
                if (delka < 0x4000)
                {
                    byte[] tmp = BitConverter.GetBytes(delka | 0x8000);
                    return new byte[2] { tmp[1], tmp[0] };
                }
                if (delka < 0x200000)
                {
                    byte[] tmp = BitConverter.GetBytes(delka | 0xC00000);
                    return new byte[3] { tmp[2], tmp[1], tmp[0] };
                }
                if (delka < 0x10000000)
                {
                    byte[] tmp = BitConverter.GetBytes(delka | 0xE0000000);
                    return new byte[4] { tmp[3], tmp[2], tmp[1], tmp[0] };
                }
                else
                {
                    byte[] tmp = BitConverter.GetBytes(delka);
                    return new byte[5] { 0xF0, tmp[3], tmp[2], tmp[1], tmp[0] };
                }
            }
    
            public string EncodePassword(string Password, string hash)
            {
                byte[] hash_byte = new byte[hash.Length / 2];
                for (int i = 0; i <= hash.Length - 2; i += 2)
                {
                    hash_byte[i / 2] = Byte.Parse(hash.Substring(i, 2), System.Globalization.NumberStyles.HexNumber);
                }
                byte[] heslo = new byte[1 + Password.Length + hash_byte.Length];
                heslo[0] = 0;
                Encoding.ASCII.GetBytes(Password.ToCharArray()).CopyTo(heslo, 1);
                hash_byte.CopyTo(heslo, 1 + Password.Length);
    
                Byte[] hotovo;
                System.Security.Cryptography.MD5 md5;
    
                md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
    
                hotovo = md5.ComputeHash(heslo);
    
                //Convert encoded bytes back to a 'readable' string
                string navrat = "";
                foreach (byte h in hotovo)
                {
                    navrat += h.ToString("x2");
                }
                return navrat;
            }
    
        }
    View Code

    此类操作类,不需要修改,直接引用即可

    下面这是一个 ROS  的 activeuser类

        class RosMkClass
        {
            AppSetting _setting;
            public RosMkClass(AppSetting setting)
            {
                _setting = setting;
            }
    
            /// <summary>
            /// 软路由返回的消息类
            /// </summary>
            class Ros_Message
            {
                /// <summary>
                /// 是否成功,成功为true 不成功为false
                /// </summary>
                public bool Success { get; set; }
                /// <summary>
                /// 软路由返回的消息
                /// </summary>
                public string Message { get; set; }
            }
    
            private Ros_Message fenxi(List<string> list)
            {
                Ros_Message message = new Ros_Message();
                message.Success = false;
                foreach (string item in list)
                {
                    Regex reg1 = new Regex(@"(?<=message=).*(?=.tag)");
                    Regex reg2 = new Regex(@"(?<=ret=*).*(?=.tag)");
    
                    if (item.IndexOf("message") > 0)
                    {
                        message.Message = reg1.Match(item).ToString();
                        message.Success = false;
                        break;
                    }
    
                    if (item.IndexOf("ret") > 0)
                    {
                        message.Message = reg2.Match(item).ToString();
                        message.Success = true;
                        break;
                    }
    
                    if (item.IndexOf("done") > 0)
                    {
                        message.Success = true;
                        break;
                    }
    
                }
    
                return message;
    
    
            }
    
            public class RosActiveUser
            {
    
                public RosActiveUser(string RetString)
                {
                    Regex rg = new Regex(@"(?<=.id=*).*(?==name)");
                    _ID = rg.Match(RetString).ToString();
                    rg = new Regex(@"(?<=name=).*(?==service)");
                    _username = rg.Match(RetString).ToString();
                    rg = new Regex(@"(?<=caller-id=).*(?==address)");
                    _macaddress = rg.Match(RetString).ToString();
                }
    
    
                private string _ID;
    
                public string ID
                {
                    get { return _ID; }
                    set { _ID = value; }
                }
    
                private string _username;
    
                public string Username
                {
                    get { return _username; }
                    set { _username = value; }
                }
    
                private string _macaddress;
                public string MacAddress
                {
                    get { return _macaddress; }
                    set { _macaddress = value; }
                }
                    
    
    
            }
    
    
            private List<RosActiveUser> activelist()
            {
                MK mk = new MK(_setting.Ros_IP, _setting.Ros_Port);
                List<string> list = new List<string>();
                List<RosActiveUser> activelist = new List<RosActiveUser>();
                if (mk.Login(_setting.Ros_Admin, _setting.Ros_Password))
                {
                    
                    mk.Send(string.Format("/ppp/active/print"));
                    mk.Send(".tag=act", true);
                    list.AddRange(mk.Read());
                    mk.Close();
                }
                
                foreach (string item in list)
                {
                    if (item.IndexOf(".tag=act") > 0)
                    {
                        activelist.Add(new RosActiveUser(item));
                    }
                }
    
    
                return activelist;
            }
    
    
            private Ros_Message Ros_ActiveRemove(string username)
            {
                List<RosActiveUser> ActList = activelist();
                List<string> list = new List<string>();
    
                RosActiveUser act = ActList.Find(a => a.Username == username);
    
                if (act != null)
                {
    
                        MK mk = new MK(_setting.Ros_IP, _setting.Ros_Port);
                        if (mk.Login(_setting.Ros_Admin, _setting.Ros_Password))
                        {
                            mk.Send("/ppp/active/remove");
                            mk.Send(string.Format("=.id=*{0}", act.ID));  //"=.id=张刚"
                            mk.Send(".tag=ss1", true);
                            list.AddRange(mk.Read());
                            mk.Close();
                        }
    
                }
    
               return fenxi(list);
            }
    
    
    
    
            private Ros_Message Ros_SecretRemove(string name)
            {
                List<string> list = new List<string>();
                MK mk = new MK(_setting.Ros_IP, _setting.Ros_Port);
                if (mk.Login(_setting.Ros_Admin, _setting.Ros_Password))
                {
                    mk.Send("/ppp/secret/remove");
                    mk.Send(string.Format("=.id={0}", name));  //"=.id=张刚"
                    mk.Send(".tag=ss1", true);
                    list.AddRange(mk.Read());
                    mk.Close();
                }
                return fenxi(list);
            }
    
    
    
    
    
    
    
            private Ros_Message Ros_Create(Teacher teacher)
            {
                List<string> list = new List<string>();
                MK mk = new MK(_setting.Ros_IP, _setting.Ros_Port);
                if (mk.Login(_setting.Ros_Admin, _setting.Ros_Password))
                {
                    mk.Send("/ppp/secret/add");
                    mk.Send(string.Format("=name={0}", teacher.UserName));
                    mk.Send(string.Format("=password={0}", teacher.Password));
                    mk.Send(string.Format("=service={0}", "pppoe"));
                    mk.Send(string.Format("=profile=profile{0}", teacher.Level));
                    mk.Send(string.Format("=comment={0}", teacher.Name));
                    mk.Send(".tag=ss2", true);
                    list.AddRange(mk.Read());
                    mk.Close();
                }
                return fenxi(list);
            }
            /// <summary>
            /// 查看 ROS 是不否可以连接成功.检测 ROS 的设置参数.
            /// </summary>
            /// <returns>是否连接成功!</returns>
            public bool Ros_Connected()
            {
                bool isconn = false;
                MK mk = new MK(_setting.Ros_IP, _setting.Ros_Port);
                isconn = mk.Login(_setting.Ros_Admin, _setting.Ros_Password);
                mk.Close();
                return isconn;
            }
    
    
            public string UpdateAccount(Teacher teacher) //汉字姓名
            {
                Ros_Message sec = Ros_SecretRemove(teacher.Name);
                Ros_Message sct = Ros_ActiveRemove(teacher.Oldname);
                Ros_Message ms  = Ros_Create(teacher);
                return ms.Success + ":" +sec.Message+"&&"+sct.Message+"&&"+ms.Message;
            }
    
            public string RemoveActive(string oldname)
            {
                return Ros_ActiveRemove(oldname).Message;
            }
    
    
        }
    View Code

    注意以下几点

    修改 class MK 里面的文件

    byte[] bajty = Encoding.ASCII.GetBytes(co.ToCharArray());

    修改为

    byte[] bajty = Encoding.GetEncoding("GB2312").GetBytes(co.ToCharArray());

    即可接收汉字了

    删除用户的时候,需要 使用 ID编号    如   *212

  • 相关阅读:
    食谱
    食谱
    食谱
    无题
    重要通知
    幼儿食谱
    安卓应用开发常用代码
    安卓开发环境搭建
    《浪潮之巅》读书笔记——第11章 摩托罗拉
    预制redis数据
  • 原文地址:https://www.cnblogs.com/lujin49/p/3541030.html
Copyright © 2020-2023  润新知