三、openTCS4.12 Http接口创建运输订单(可用于二次开发)
openTCS官方提供关了Web API的文档
http://www.opentcs.org/docs/4.12/developer/web-api/index.html
1.运输订单
Get方法(可以在浏览器地址栏直接输入测试)
http://127.0.0.1:55200/v1/transportOrders
返回所有的运输订单:
[ {
“name” : “TOrder-0fa56142-3e0a-4702-8eef-39136c82b8f1”,
“category” : “-”,
“state” : “FINISHED”,
“intendedVehicle” : null,
“processingVehicle” : “AGV2”,
“destinations” : [ {
“locationName” : “WorkPlace”,
“operation” : “Work”,
“state” : “FINISHED”,
“properties” : []
}]
},{
“name” : “Move-24d8eb37-1251-426b-af41-4604511ff4c9”,
“category” : “-”,
“state” : “BEING_PROCESSED”,
“intendedVehicle” : “AGV2”,
“processingVehicle” : “AGV2”,
“destinations” : [{
“locationName” : “Point1”,
“operation” : “MOVE”,
“state” : “TRAVELLING”,
“properties” : []
}]
}]
2.根据订单号获取运输订单信息
GET方法:
http://127.0.0.1:55200/v1/transportOrders/{orderNum}
例如
http://127.0.0.1:55200/v1/transportOrders/TOrder-0fa56142-3e0a-4702-8eef-39136c82b8f1
返回:
{
“name” : “TOrder-0fa56142-3e0a-4702-8eef-39136c82b8f1”,
“category” : “-”,
“state” : “FINISHED”,
“intendedVehicle” : null,
“processingVehicle” : “AGV2”,
“destinations” : [ {
“locationName” : “WorkPlace”,
“operation” : “Work”,
“state” : “FINISHED”,
“properties” : []
}]
}
3.创建订单
Post方法:
http://127.0.0.1:55200/v1/transportOrders/{orderNum}
orderNum随机生成(建议用UUID)
contentType为:application/json
Post数据如下:
创建运输订单
{
“intendedVehicle” : null,
“destinations” : [ {
“locationName” : “Load1”,
“operation” : “Load”,
“properties” : [ ]
}, {
“locationName” : “Unload1”,
“operation” : “Unload”,
“properties” : [ ]
} ]
}
或者移动订单
{
“intendedVehicle” : “AGV1”,
“destinations” : [ {
“locationName” : “Point5”,
“operation” : “MOVE”,
“properties” : [ ]
} ]
}
返回:
Successful operation
4.取消订单
POST方法
http://127.0.0.1:55200/v1/transportOrders/{orderNum}/withdrawal
返回
Successful operation
5.获取小车信息
GET方法
http://127.0.0.1:55200/v1/vehicles
返回:
[ {
“name” : “AGV1”,
“properties” : {
“tcs:preferredAdapterClass” : “org.opentcs.virtualvehicle.LoopbackCommunicationAdapterFactory”,
“IP” :“192.168.1.100”,
“Port” : “4001”
},
“length” : 1000,
“energyLevelGood” : 90,
“energyLevelCritical” : 30,
“energyLevel” : 100,
“integrationLevel” : “TO_BE_UTILIZED”,
“procState” : “IDLE”,
“transportOrder” : null,
“currentPosition” : “0,5”,
“state” : “IDLE”
}, {
“name” : “AGV2”,
“properties” : {
“tcs:preferredAdapterClass” : “org.opentcs.virtualvehicle.LoopbackCommunicationAdapterFactory”,
“IP” : “192.168.1.101”,
“Port” : “4001”
},
“length” : 1000,
“energyLevelGood” : 90,
“energyLevelCritical” : 30,
“energyLevel” : 100,
“integrationLevel” : “TO_BE_UTILIZED”,
“procState” : “PROCESSING_ORDER”,
“transportOrder” : “Move-24d8eb37-1251-426b-af41-4604511ff4c9”,
“currentPosition” : “0,0”,
“state” : “IDLE”
}]
6.根据小车编号获得小车信息
GET方法
http://127.0.0.1:55200/v1/vehicles/{vehicleName}
例如
http://127.0.0.1:55200/v1/vehicles/AGV1
返回:
{
“name” : “AGV1”,
“properties” : {
“tcs:preferredAdapterClass” : “org.opentcs.virtualvehicle.LoopbackCommunicationAdapterFactory”,
“IP” : “192.168.1.100”,
“Port” : “4001”
},
“length” : 1000,
“energyLevelGood” : 90,
“energyLevelCritical” : 30,
“energyLevel” : 100,
“integrationLevel” : “TO_BE_UTILIZED”,
“procState” : “IDLE”,
“transportOrder” : null,
“currentPosition” : “0,5”,
“state” : “IDLE”
}
7.取消正在执行任务的小车
POST方法:
http://127.0.0.1:55200/v1/vehicles/{vehicleName}/withdrawal
例如
http://127.0.0.1:55200/v1/vehicles/AGV1/withdrawal
返回:
Successful operation
特别注意:
在创建订单的时候,系统会报错
将OrderHandler第165行修改成如下即可
附C# Http操作工具类
public class HttpMethods
{
private static readonly string DefaultUserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";
/// <summary>
/// get方法请求服务器
/// </summary>
/// <param name="url"></param>
/// <param name="parametersDict"></param>
/// <param name="timeout"></param>
/// <returns></returns>
public static string DoGet(string url, Dictionary<string, string> parametersDict, int? timeout)
{
if (parametersDict != null && parametersDict.Count != 0)
{
if (!url.Contains("?"))
url = url + "?";
foreach (string key in parametersDict.Keys)
{
url = url + key + "=" + parametersDict[key] + "&";
}
url = url.Substring(0, url.Length - 1);
}
try
{
HttpWebResponse response = CreateGetHttpResponse(url, timeout, null, null);
using (Stream responseStream = response.GetResponseStream())
{
using (StreamReader sReader = new StreamReader(responseStream))
{
return sReader.ReadToEnd();
}
}
}
catch (Exception exp)
{
return null;
}
}
/// <summary>
/// 创建GET方式的HTTP请求
/// </summary>
/// <param name="url">请求的URL</param>
/// <param name="timeout">请求的超时时间</param>
/// <param name="userAgent">请求的客户端浏览器信息,可以为空</param>
/// <param name="cookies">随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空</param>
/// <returns></returns>
public static HttpWebResponse CreateGetHttpResponse(string url, int? timeout, string userAgent, CookieCollection cookies)
{
if (string.IsNullOrEmpty(url))
{
throw new ArgumentNullException("url");
}
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.Method = "GET";
request.UserAgent = DefaultUserAgent;
if (!string.IsNullOrEmpty(userAgent))
{
request.UserAgent = userAgent;
}
if (timeout.HasValue)
{
request.Timeout = timeout.Value;
}
if (cookies != null)
{
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(cookies);
}
return request.GetResponse() as HttpWebResponse;
}
/// <summary>
/// 创建POST方式的HTTP请求
/// </summary>
/// <param name="url">请求的URL</param>
/// <param name="parameters">随同请求POST的参数名称及参数值字典</param>
/// <param name="timeout">请求的超时时间</param>
/// <param name="userAgent">请求的客户端浏览器信息,可以为空</param>
/// <param name="requestEncoding">发送HTTP请求时所用的编码</param>
/// <param name="cookies">随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空</param>
/// <returns></returns>
public static HttpWebResponse CreatePostHttpResponse(string url, IDictionary<string, string> parameters, int? timeout, string userAgent, Encoding requestEncoding, CookieCollection cookies, string contentType)
{
if (string.IsNullOrEmpty(url))
{
throw new ArgumentNullException("url");
}
if (requestEncoding == null)
{
throw new ArgumentNullException("requestEncoding");
}
HttpWebRequest request = null;
//如果是发送HTTPS请求
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
{
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
request = WebRequest.Create(url) as HttpWebRequest;
request.ProtocolVersion = HttpVersion.Version10;
}
else
{
request = WebRequest.Create(url) as HttpWebRequest;
}
request.Method = "POST";
request.ContentType = contentType;
if (!string.IsNullOrEmpty(userAgent))
{
request.UserAgent = userAgent;
}
else
{
request.UserAgent = DefaultUserAgent;
}
if (timeout.HasValue)
{
request.Timeout = timeout.Value;
}
if (cookies != null)
{
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(cookies);
}
//如果需要POST数据
if (!(parameters == null || parameters.Count == 0))
{
StringBuilder buffer = new StringBuilder();
int i = 0;
foreach (string key in parameters.Keys)
{
if (i > 0)
{
buffer.AppendFormat("&{0}={1}", key, parameters[key]);
}
else
{
buffer.AppendFormat("{0}={1}", key, parameters[key]);
}
i++;
}
byte[] data = requestEncoding.GetBytes(buffer.ToString());
using (Stream stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
}
return request.GetResponse() as HttpWebResponse;
}
/// <summary>
/// 创建POST方式的HTTP请求
/// </summary>
/// <param name="url">请求的URL</param>
/// <param name="parameters">随同请求POST的参数名称及参数值字典</param>
/// <param name="timeout">请求的超时时间</param>
/// <param name="userAgent">请求的客户端浏览器信息,可以为空</param>
/// <param name="requestEncoding">发送HTTP请求时所用的编码</param>
/// <param name="cookies">随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空</param>
/// <returns></returns>
public static HttpWebResponse CreatePostHttpResponse(string url, string data, int? timeout, string userAgent, Encoding requestEncoding, CookieCollection cookies, string contentType)
{
if (string.IsNullOrEmpty(url))
{
throw new ArgumentNullException("url");
}
if (requestEncoding == null)
{
throw new ArgumentNullException("requestEncoding");
}
HttpWebRequest request = null;
//如果是发送HTTPS请求
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
{
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
request = WebRequest.Create(url) as HttpWebRequest;
request.ProtocolVersion = HttpVersion.Version10;
}
else
{
request = WebRequest.Create(url) as HttpWebRequest;
}
request.Method = "POST";
request.ContentType = contentType;
if (!string.IsNullOrEmpty(userAgent))
{
request.UserAgent = userAgent;
}
else
{
request.UserAgent = DefaultUserAgent;
}
if (timeout.HasValue)
{
request.Timeout = timeout.Value;
}
if (cookies != null)
{
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(cookies);
}
//如果需要POST数据
if (!data.IsNullOrEmpty())
{
byte[] datas = requestEncoding.GetBytes(data);
using (Stream stream = request.GetRequestStream())
{
stream.Write(datas, 0, data.Length);
}
}
return request.GetResponse() as HttpWebResponse;
}
private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
return true; //总是接受
}
/// <summary>
/// Post方法请求服务器
/// </summary>
/// <param name="url"></param>
/// <param name="parametersDict"></param>
/// <param name="timeout"></param>
/// <returns></returns>
public static string DoPost(string url, Dictionary<string, string> parametersDict, int? timeout)
{
try
{
HttpWebResponse response = CreatePostHttpResponse(url, parametersDict, timeout, null, Encoding.UTF8, null, "application/x-www-form-urlencoded");
using (Stream responseStream = response.GetResponseStream())
{
using (StreamReader sReader = new StreamReader(responseStream))
{
return sReader.ReadToEnd();
}
}
}
catch (Exception exp)
{
return null;
}
}
/// <summary>
/// Post方法请求服务器
/// </summary>
/// <param name="url"></param>
/// <param name="parametersDict"></param>
/// <param name="timeout"></param>
/// <returns></returns>
public static string DoPostJson(string url, string data, int? timeout)
{
try
{
HttpWebResponse response = CreatePostHttpResponse(url, data, timeout, null, Encoding.UTF8, null, "application/json");
using (Stream responseStream = response.GetResponseStream())
{
using (StreamReader sReader = new StreamReader(responseStream))
{
return sReader.ReadToEnd();
}
}
}
catch (Exception exp)
{
return null;
}
}
}
调用方法如下:
获得AGV信息
string url = "http://127.0.0.1:55200/v1/vehicles";
string retValue = HttpMethods.DoGet(url, null, 1000);
//json解析
创建订单如下:
string data ="{\"intendedVehicle\":\"AGV1\",\"destinations\":[{\"locationName\":\"Point5\",\"operation\":\"MOVE\",\"properties\":[ ]}]}";;
string orderName = "TOrder-" + DateTime.Today.ToString("yyyyMMdd") + Guid.NewGuid().ToString().Replace("-", "").ToUpper().Substring(0, 10);
string url = "http://127.0.0.1:55200/v1/transportOrders/" + orderName;
string str = HttpMethods.DoPostJson(url, data, 1000);
预知后事如何,请听下回分解