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()[].Split(new string[] { "ret=" }, StringSplitOptions.None)[];
Send("/login");
Send("=name=" + username);
Send("=response=00" + EncodePassword(password, hash), true);
if (Read()[] == "!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, , velikost.Length);
connection.Write(bajty, , 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, , velikost.Length);
connection.Write(bajty, , bajty.Length);
connection.WriteByte();
}
public List<string> Read()
{
List<string> output = new List<string>();
string o = "";
byte[] tmp = new byte[];
long count;
while (true)
{
tmp[] = (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[] == )
{
output.Add(o);
if (o.Substring(, ) == "!done")
{
break;
}
else
{
o = "";
continue;
}
}
else
{
if (tmp[] < 0x80)
{
count = tmp[];
}
else
{
if (tmp[] < 0xC0)
{
int tmpi = BitConverter.ToInt32(new byte[] { (byte)connection.ReadByte(), tmp[], , }, );
count = tmpi ^ 0x8000;
}
else
{
if (tmp[] < 0xE0)
{
tmp[] = (byte)connection.ReadByte();
int tmpi = BitConverter.ToInt32(new byte[] { (byte)connection.ReadByte(), tmp[], tmp[], }, );
count = tmpi ^ 0xC00000;
}
else
{
if (tmp[] < 0xF0)
{
tmp[] = (byte)connection.ReadByte();
tmp[] = (byte)connection.ReadByte();
int tmpi = BitConverter.ToInt32(new byte[] { (byte)connection.ReadByte(), tmp[], tmp[], tmp[] }, );
count = tmpi ^ 0xE0000000;
}
else
{
if (tmp[] == 0xF0)
{
tmp[] = (byte)connection.ReadByte();
tmp[] = (byte)connection.ReadByte();
tmp[] = (byte)connection.ReadByte();
tmp[] = (byte)connection.ReadByte();
count = BitConverter.ToInt32(tmp, );
}
else
{
//Error in packet reception, unknown length
break;
}
}
}
}
}
} for (int i = ; i < count; i++)
{
o += (Char)connection.ReadByte();
}
}
return output;
}
byte[] EncodeLength(int delka)
{
if (delka < 0x80)
{
byte[] tmp = BitConverter.GetBytes(delka);
return new byte[] { tmp[] };
}
if (delka < 0x4000)
{
byte[] tmp = BitConverter.GetBytes(delka | 0x8000);
return new byte[] { tmp[], tmp[] };
}
if (delka < 0x200000)
{
byte[] tmp = BitConverter.GetBytes(delka | 0xC00000);
return new byte[] { tmp[], tmp[], tmp[] };
}
if (delka < 0x10000000)
{
byte[] tmp = BitConverter.GetBytes(delka | 0xE0000000);
return new byte[] { tmp[], tmp[], tmp[], tmp[] };
}
else
{
byte[] tmp = BitConverter.GetBytes(delka);
return new byte[] { 0xF0, tmp[], tmp[], tmp[], tmp[] };
}
} public string EncodePassword(string Password, string hash)
{
byte[] hash_byte = new byte[hash.Length / ];
for (int i = ; i <= hash.Length - ; i += )
{
hash_byte[i / ] = Byte.Parse(hash.Substring(i, ), System.Globalization.NumberStyles.HexNumber);
}
byte[] heslo = new byte[ + Password.Length + hash_byte.Length];
heslo[] = ;
Encoding.ASCII.GetBytes(Password.ToCharArray()).CopyTo(heslo, );
hash_byte.CopyTo(heslo, + 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;
} }

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

下面这是一个 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") > )
{
message.Message = reg1.Match(item).ToString();
message.Success = false;
break;
} if (item.IndexOf("ret") > )
{
message.Message = reg2.Match(item).ToString();
message.Success = true;
break;
} if (item.IndexOf("done") > )
{
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") > )
{
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;
} }

注意以下几点

修改 class MK 里面的文件

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

修改为

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

即可接收汉字了

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

ROS:ROS操作类MK.cs的更多相关文章

  1. C# 网络常用操作类NetHelper.cs

    一个非常完整的网络操作帮助类,包含20多个常用方法,例如: IP地址的验证以及截取. 端口的验证. 电子邮件的发送. 获取计算机名. IP地址的获取以及TCP. UDP连接的创建和数据发送等. usi ...

  2. 开发C# .net时使用的数据库操作类SqlHelp.cs

    练习开发WPF程序的时候,是这样写的,虽然很简单,相必很多新手会用到,所以拿来共享一下, using System; using System.Collections.Generic; using S ...

  3. C# ADO.NET操作数据库 SqlHelp.cs类

    刚开始练习ADONET的时候,练习的一个SQLHelp.cs  数据库操作类,很简单,但是也很实用 using System; using System.Collections.Generic; us ...

  4. 一个非常好的C#字符串操作处理类StringHelper.cs

    /// <summary> /// 类说明:Assistant /// 编 码 人:苏飞 /// 联系方式:361983679 /// 更新网站:http://www.sufeinet.c ...

  5. Util应用程序框架公共操作类(九):Lambda表达式扩展

    上一篇对Lambda表达式公共操作类进行了一些增强,本篇使用扩展方法对Lambda表达式进行扩展. 修改Util项目的Extensions.Expression.cs文件,代码如下. using Sy ...

  6. Util应用程序框架公共操作类(三):数据类型转换公共操作类(扩展篇)

    上一篇以TDD方式介绍了数据类型转换公共操作类的开发,并提供了单元测试和实现代码,本文将演示通过扩展方法来增强公共操作类,以便调用时更加简化. 下面以字符串转换为List<Guid>为例进 ...

  7. Util应用程序框架公共操作类(二):数据类型转换公共操作类(源码篇)

    上一篇介绍了数据类型转换的一些情况,可以看出,如果不进行封装,有可能导致比较混乱的代码.本文通过TDD方式把数据类型转换公共操作类开发出来,并提供源码下载. 我们在 应用程序框架实战十一:创建VS解决 ...

  8. FlexPaper+SWFTool+操作类=在线预览PDF

    引言 由于客户有在线预览PDF格式的需求,在网上找了一下解决方案,觉得FlexPaper用起来还是挺方便的,flexpaper是将pdf转换为swf格式的文件预览的,所以flexpaper一般和swf ...

  9. 【C#】分享基于Win32 API的服务操作类(解决ManagedInstallerClass.InstallHelper不能带参数安装的问题)

    注:这里的服务是指Windows 服务. ------------------201508250915更新------------------ 刚刚得知TransactedInstaller类是支持带 ...

随机推荐

  1. 【原创】重装Windows系统后Android studio无需重装,直接迁移

    每次重装Windows系统后重装各种开发环境让人苦不堪言,比如VS2013 +补丁,没有个小半天根本搞不定! 对与Android的开发者,同样安装JDK+Android Studio + Adnroi ...

  2. Hadoop分布式文件系统HDFS

    HDFS的探究: HDFS HDFS是 Hadoop Distribute File System的缩写,是谷歌GFS分布式文件系统的开源实现,Apache Hadoop的一个子项目,HDFS基于流数 ...

  3. CS229 6.13 Neurons Networks Implements of stack autoencoder

    对于加深网络层数带来的问题,(gradient diffuse  局部最优等)可以使用逐层预训练(pre-training)的方法来避免 Stack-Autoencoder是一种逐层贪婪(Greedy ...

  4. 为什么使能RPS/RFS, 或者RSS/网卡多队列后,QPS反而下降?

    http://laoar.github.io/blog/2017/05/07/rps/ TL;DR RPS 即receive side steering,利用网卡的多队列特性,将每个核分别跟网卡的一个 ...

  5. 「2017 山东一轮集训 Day6」子序列(矩阵快速幂)

    /* 找出了一个dp式子 是否能够倍增优化 我推的矩阵不太一样 是 1 0 0 0 0 0 0 0 0 -1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 2 求得逆矩阵大概就是 1 0 0 ...

  6. 关于elment-ui树形控件Tree的使用

    如果简单使用的tree树形控件,按照Element ui Tree 树形控件 官方文档使用即可,基本上能够完成大部分的需求. 但是如果需要对树形结构进行额外操作,仅仅根据官方文档提供的方案的话,可能就 ...

  7. android 开发 实现一个带图片Image的ListView

    注意:这种实现方法不是实现ListView的最优方法,只是希望通过练习了解ListView的实现原理 思维路线: 1.创建drawable文件夹将要使用的图片导入进去 2.写一个类,用于存放图片ID数 ...

  8. Ansible:遇到错误 "sudo: /etc/sudoers is world writable\r\nsudo: no valid sudoers sources found, quitting

    执行ansible-playbook时,遇到该错误: 经过检查发现是因为在Linux中 /etc/sudoers该文件必须是只读权限的才行,故我们需要修改其权限为440,到root账户下修改,直接ch ...

  9. spring配置和下载

    步骤一:下载 Spring 的开发包: 官网:http://spring.io/ 下 载 地 址 : http://repo.springsource.org/libs-release-local/o ...

  10. ROS-by-example的安装

    在这里我之前用的VM12安装成功之后,仿真器机器人会有问题,故把电脑做成双系统的形式来重新安装: 环境:Ubuntu14.04 LTS 32bits ROS版本:ROS Indigo 在学习本部分之后 ...