xml的通讯,其实可以分解为几个步骤:
机器人发送到上位机:机器人程序将变量或者数值写入xml的元素中→机器人将xml发送通过服务端发送到上位机的服务端→服务端接受到数据,按照xml的格式解析其中元素。
RET=EKI_Init("XmlCallBack")//初始化xml文件
RET=EKI_Open("XmlCallBack")//打开(相当于客户端请求连接)
//将变量或值写入到xml文件的元素中
;FOLD Write data to connection
; Write frame to <LastPos X="" Y="" Z="" A="" B="" C=""/>
RET=EKI_SetFrame("XmlCallBack","Robot/Data/LastPos",TOOL_DATA[1])
; Write real to <ActPos X="" />
RET=EKI_SetReal("XmlCallBack","Robot/Data/ActPos/@X",1000.12)
; Write int to <Status></Status>
RET=EKI_SetInt("XmlCallBack","Robot/Status", 12345678)
; Write string to <Mode></Mode>
RET=EKI_SetString("XmlCallBack","Robot/Mode","ConnectSensor")
; Write bool to <LightOn></LightOn>
RET=EKI_SetBool("XmlCallBack","Robot/RobotLamp/GrenLamp/LightOn",true)
;ENDFOLD (Write data to connection)
//发送xml到服务端
RET = EKI_Send("XmlCallBack","Robot")
上位机服务端获取到的数据是:
<Robot><Data><LastPos X="483.980011" Y="7.210000"Z="239.869995" A="0.000000" B="0.000000"C="0.000000"></LastPos><ActPosX="1000.119995"></ActPos></Data><Status>12345678</Status><Mode>ConnectSensor</Mode><RobotLamp><GrenLamp><LightOn>1</LightOn></GrenLamp></RobotLamp></Robot>
然后对数据进行逐个元素的解析就可以了。要增加变量,只要对应在mxl文件,机器人程序和上位机解析过程中添加就可以了。
上位机发送到机器人:上位机将变量写成xml格式,利用客户端发送到机器人中的xml文件→机器人读取xml文件中的元素值到程序中的变量
写成xml格式:
sendstr = sendstr +"<Sensor><Status><IsActive>FALSE</IsActive></Status></Sensor>";
sendstr = sendstr + "<Sensor><Read><xyzabc X='10.0'Y='20.0' Z='30.0' A='40.0' B='50.0'C='60.0'></xyzabc></Read</Sensor>";
然后是tcp发送
/// <summary>
/// 将字符串发送给机器人
/// </summary>
/// <paramname="str"></param>
private voidsendToRobot(string str)
{
string sendstr;
str = str.Replace(" ", "");
string[] fields = str.Split(',');
string header = "<Sensor>", tail ="</Sensor>";//变量xml文件中的父元素
sendstr = header;
//设置xml文件中变量的值,格式:<变量名>变量值</变量名>
foreach (string item in fields)
{
string[] arr = item.Split('=');
sendstr += "<" + arr[0] + ">" + arr[1] + "</" + arr[0] +">";
}
sendstr += tail;
//这些变量的某些中间父元素与前面的不同,所以另外写
sendstr = sendstr +"<Sensor><Status><IsActive>FALSE</IsActive></Status></Sensor>";
sendstr = sendstr + "<Sensor><Read><xyzabc X='10.0'Y='20.0' Z='30.0' A='40.0' B='50.0'C='60.0'></xyzabc></Read></Sensor>";
string strDataLine = sendstr;
try
{
Byte[] sendData = Encoding.UTF8.GetBytes(strDataLine);
foreach (DictionaryEntry de in _sessionTable)
{
EndPoint temp = (EndPoint)de.Key;
{
for (int i = 0; i < theIndex; i++)
{
if (theListClient[i, 1] == "1")
{
if (temp.ToString() == theListClient[i, 0])
{
try
{
Client[i].SendTo(sendData, temp);
}
catch (Exception ex)
{
}
}
}
}
}
}
}
catch
{ }
}
等发送完成之后,机器人再读取
机器人从xml元素中读取值或者属性并赋予创建的变量
RET=EKI_GetString("XmlCallBack","Sensor/Message",valueChar[])
RET=EKI_GetInt("XmlCallBack","Sensor/Nmb",valueInt)
RET=EKI_GetBool("XmlCallBack","Sensor/Status/IsActive",valueBOOL)
RET=EKI_GetFrame("XmlCallBack","Sensor/Read/xyzabc",valueFrame)
然后就可以在机器人程序中使用,或者通过查看变量值检测是否正确。