525 lines
16 KiB
C#
525 lines
16 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.ComponentModel;
|
||
using System.Data;
|
||
using System.Drawing;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Windows.Forms;
|
||
using System.ServiceModel;
|
||
using elelab;
|
||
using System.ServiceModel.Description;
|
||
using System.Threading;
|
||
using System.Net;
|
||
using System.IO;
|
||
using System.Runtime.Serialization.Json;
|
||
namespace DNLightSvr
|
||
{
|
||
public partial class form1 : Form
|
||
{
|
||
static log4net.ILog log = log4net.LogManager.GetLogger("light");
|
||
private ServiceHost host = null;
|
||
public static List<ELabel> labelPool = new List<ELabel>();
|
||
string svrUrl = "http://127.0.0.1:9998/DNlightSvc";
|
||
string wmsUrl = "";
|
||
string postUrl = "";
|
||
|
||
public form1()
|
||
{
|
||
InitializeComponent();
|
||
}
|
||
|
||
private void Form1_Load(object sender, EventArgs e)
|
||
{
|
||
//StartPosition = FormStartPosition.CenterParent;
|
||
|
||
startHost();
|
||
//btnTest.Visible = false;
|
||
}
|
||
void startHost()
|
||
{
|
||
// lbStatus.Text = "服务启动失败";
|
||
try
|
||
{
|
||
initPorts();
|
||
svrUrl = System.Configuration.ConfigurationManager.AppSettings["BaseUri"];
|
||
wmsUrl = System.Configuration.ConfigurationManager.AppSettings["WMSuri"];
|
||
Uri baseAddress = new Uri(svrUrl);
|
||
LightService service = new LightService();
|
||
service.clearO += this.clearOrder;
|
||
service.lightUp += this.lightUp;
|
||
|
||
host = new ServiceHost(service, baseAddress);
|
||
elelab.DNLights.lightOffEvent += testPicked;
|
||
|
||
WebHttpBinding binding = new WebHttpBinding();
|
||
ServiceEndpoint endpoint = host.AddServiceEndpoint(typeof(ILightService), binding, baseAddress);
|
||
WebHttpBehavior httpBehavior = new WebHttpBehavior();
|
||
endpoint.Behaviors.Add(httpBehavior);
|
||
host.Opened += delegate
|
||
{
|
||
addLog("服务已启动");
|
||
if (InvokeRequired)
|
||
{
|
||
this.Invoke(new showStatus(delegate()
|
||
{
|
||
lbStatus.Text = "服务已启动";
|
||
lbUrl.Text ="亮灯服务地址:" + svrUrl + "\r\n\nWMS回传地址: " + wmsUrl;
|
||
|
||
}));
|
||
}
|
||
else
|
||
{
|
||
lbStatus.Text = "服务已启动";
|
||
lbUrl.Text = "亮灯服务地址:" + svrUrl + "\r\n\nWMS回传地址: " + wmsUrl;
|
||
}
|
||
};
|
||
host.Open();
|
||
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
addLog("启动服务失败: " + e.Message);
|
||
MessageBox.Show("启动服务失败: " + e.Message);
|
||
}
|
||
|
||
|
||
}
|
||
|
||
private void initPorts()
|
||
{
|
||
elelab.DNLights.initPort();
|
||
|
||
List<int> ports = elelab.DNLights.getActiveComports();
|
||
if (ports.Count > 0)
|
||
{
|
||
lbPorts.Text = "活动端口:";
|
||
foreach (int i in ports)
|
||
{
|
||
lbPorts.Text += " com" +i + ",";
|
||
}
|
||
lbPorts.Text = lbPorts.Text.Substring(0, lbPorts.Text.Length - 1);
|
||
}
|
||
else
|
||
{
|
||
lbPorts.Text = "请检查控制器连接,并重启服务";
|
||
}
|
||
}
|
||
|
||
bool lightUp(ELabel[] labels)
|
||
{
|
||
//TODO: 把传来的实体按portNo分组,按portNo 分别点亮
|
||
|
||
Dictionary<int, List<ELabel>> lbsOrder = new Dictionary<int, List<ELabel>>(); //按orderNo 分组
|
||
Dictionary<int, List<ELabel>> lbsPort ; //按port分组
|
||
foreach (ELabel el in labels)
|
||
{
|
||
if (el == null)
|
||
{
|
||
break;
|
||
}
|
||
|
||
if (el.orderNo > 200 || el.orderNo < 1)
|
||
{
|
||
|
||
// addLog( "orderNo 只能取1-200范围的值");
|
||
// addLog("eorderNo 错误:" + getJson(el));
|
||
|
||
}
|
||
|
||
// lbsPort.ContainsKey(el.port);
|
||
// if (!lbsPort.Keys.Contains(el.port))
|
||
if (!lbsOrder.ContainsKey(el.orderNo))
|
||
{
|
||
lbsOrder[el.orderNo] = new List<ELabel>();
|
||
}
|
||
|
||
lbsOrder[el.orderNo].Add(el);
|
||
|
||
}
|
||
|
||
foreach (int keyOrder in lbsOrder.Keys)
|
||
{
|
||
List<ELabel> lbs = lbsOrder[keyOrder];
|
||
lbsPort = new Dictionary<int, List<ELabel>>();
|
||
foreach (ELabel el in lbs)
|
||
{
|
||
// lbsPort.ContainsKey(el.port);
|
||
// if (!lbsPort.Keys.Contains(el.port))
|
||
if (!lbsPort.ContainsKey(el.port))
|
||
{
|
||
lbsPort[el.port] = new List<ELabel>();
|
||
}
|
||
|
||
lbsPort[el.port].Add(el);
|
||
|
||
}
|
||
|
||
|
||
foreach (int keyPort in lbsPort.Keys)
|
||
{
|
||
Thread.Sleep(100);
|
||
if (!doLightUp(keyOrder,keyPort, lbsPort[keyPort]))
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
}
|
||
return true;
|
||
// int port = 5;
|
||
// doLightUp(port, lables);
|
||
|
||
|
||
}
|
||
bool doLightUp(int orderNo,int portNo, List<ELabel> lables)
|
||
{
|
||
int[] ids = new int[lables.Count];
|
||
int[] address = new int[lables.Count]; ;//标签坐标(行、列)
|
||
int[] counts = new int[lables.Count]; ;//显示数量
|
||
int[] colors = new int[lables.Count]; ;
|
||
|
||
|
||
for (int i = 0; i < lables.Count; i++)
|
||
{
|
||
ids[i] = lables[i].labelId;
|
||
address[i] = lables[i].address;
|
||
counts[i] = lables[i].count;
|
||
colors[i] = lables[i].color;
|
||
|
||
}
|
||
//elelab.DNLights.initPort();
|
||
|
||
bool result = false;
|
||
if (orderNo == 0)
|
||
{
|
||
result = DNLights.lightLabels(portNo, colors, ids, address, counts);
|
||
}
|
||
else
|
||
{
|
||
result = DNLights.lightLabels(orderNo, portNo, colors, ids, address, counts);
|
||
|
||
}
|
||
if (!result)
|
||
{
|
||
addLog(string.Format("亮灯失败: orderNo {0},portNo{1} ",orderNo,portNo));
|
||
|
||
}
|
||
|
||
return result;
|
||
|
||
|
||
}
|
||
|
||
delegate void showStatus();
|
||
void testPicked(int orderNo, int eleId, int color, int eleAddress, int count)
|
||
{
|
||
if (InvokeRequired)
|
||
{
|
||
this.Invoke(new showStatus(delegate()
|
||
{
|
||
returnResult(orderNo, eleId, color, eleAddress, count);
|
||
}));
|
||
|
||
}
|
||
else
|
||
{
|
||
returnResult(orderNo, eleId, color, eleAddress, count);
|
||
}
|
||
|
||
}
|
||
|
||
private void returnResult(int orderNo, int eleId, int color, int eleAddress, int count)
|
||
{
|
||
//to show result
|
||
|
||
//to call client and send data
|
||
|
||
|
||
|
||
ELabel lb = new ELabel();
|
||
lb.count = count;
|
||
lb.color = color;
|
||
lb.address = eleAddress;
|
||
lb.orderNo = orderNo;
|
||
lb.labelId = eleId;
|
||
String url = svrUrl + "testPost";
|
||
addLog("收到按键返回事件,开始回传...");
|
||
addLog(getJson(lb));
|
||
|
||
|
||
// String s = getJson(lb);
|
||
postUrl = wmsUrl;
|
||
Thread threadPreProcess = new Thread(new ParameterizedThreadStart(HttpPost));
|
||
threadPreProcess.IsBackground = true;
|
||
threadPreProcess.Start(lb);
|
||
|
||
}
|
||
|
||
private void btnStart_Click(object sender, EventArgs e)
|
||
{
|
||
Thread threadPreProcess = new Thread(startHost);
|
||
threadPreProcess.IsBackground = true;
|
||
threadPreProcess.Start();
|
||
//startHost();
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// GET请求与获取结果
|
||
/// </summary>
|
||
public void HttpGet(string Url, string postDataStr)
|
||
{
|
||
try
|
||
{
|
||
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url + (string.IsNullOrEmpty(postDataStr) ? "" : "?") + postDataStr);
|
||
request.Method = "GET";
|
||
request.ContentType = "text/html;charset=UTF-8";
|
||
request.Timeout = 10000;
|
||
request.BeginGetResponse(new AsyncCallback(Compleate), request);
|
||
|
||
|
||
|
||
/*
|
||
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
|
||
Stream myResponseStream = response.GetResponseStream();
|
||
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8);
|
||
string retString = myStreamReader.ReadToEnd();
|
||
myStreamReader.Close();
|
||
myResponseStream.Close();
|
||
return retString;
|
||
*/
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
addLog("http get error: "+ ex.Message);
|
||
}
|
||
}
|
||
|
||
private void HttpPost(Object ticket)
|
||
{
|
||
//string Url = svrUrl + "testPost";
|
||
DataContractJsonSerializer serializer = new DataContractJsonSerializer(ticket.GetType());
|
||
MemoryStream stream = new MemoryStream();
|
||
serializer.WriteObject(stream, ticket);
|
||
byte[] dataBytes = new byte[stream.Length];
|
||
stream.Position = 0;
|
||
stream.Read(dataBytes, 0, (int)stream.Length);
|
||
string param = Encoding.UTF8.GetString(dataBytes);
|
||
byte[] bs = Encoding.ASCII.GetBytes(param);
|
||
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(postUrl);
|
||
req.Method = "POST";
|
||
req.ContentType = "application/json";
|
||
req.ContentLength = bs.Length;
|
||
using (Stream reqStream = req.GetRequestStream())
|
||
{
|
||
reqStream.Write(bs, 0, bs.Length);
|
||
}
|
||
|
||
req.BeginGetResponse(new AsyncCallback(Compleate), req);
|
||
/*
|
||
HttpWebResponse hwr = req.GetResponse() as HttpWebResponse;
|
||
System.IO.StreamReader myreader = new System.IO.StreamReader(hwr.GetResponseStream(), Encoding.UTF8);
|
||
string responseText = myreader.ReadToEnd();
|
||
Console.WriteLine( responseText);
|
||
* */
|
||
|
||
}
|
||
|
||
public void Compleate(IAsyncResult asyncResult)
|
||
{
|
||
try
|
||
{
|
||
HttpWebRequest req = (asyncResult.AsyncState as HttpWebRequest);
|
||
HttpWebResponse res = req.EndGetResponse(asyncResult) as HttpWebResponse;
|
||
StreamReader reader = new StreamReader(res.GetResponseStream());
|
||
string responseText = reader.ReadToEnd();
|
||
Console.WriteLine(responseText);
|
||
this.Invoke(new showStatus(delegate()
|
||
{
|
||
addLog( "收到服务器响应:\n" + responseText);
|
||
}));
|
||
|
||
|
||
Console.WriteLine(responseText);
|
||
// MessageBox.Show(reader.ReadToEnd());
|
||
}
|
||
catch(Exception e)
|
||
{
|
||
addLog("错误消息:" +e.Message);
|
||
string errStack = "";
|
||
foreach (char s in e.StackTrace)
|
||
{
|
||
errStack += s;
|
||
}
|
||
addLog(errStack);
|
||
|
||
//MessageBox.Show("获取失败.");
|
||
}
|
||
}
|
||
|
||
|
||
private void btnBack_Click(object sender, EventArgs e)
|
||
{
|
||
postUrl = wmsUrl;
|
||
addLog("开始测试回传WMS");
|
||
Thread threadPreProcess = new Thread(new ParameterizedThreadStart(HttpPost));
|
||
threadPreProcess.IsBackground = true;
|
||
threadPreProcess.Start(new ELabel());
|
||
|
||
//HttpPost(url,lb);
|
||
}
|
||
|
||
private void btnTestrequest_Click(object sender, EventArgs e)
|
||
{
|
||
|
||
String url ="http://127.0.0.1:9998/DNlightSvc/test";
|
||
HttpGet(url, null);
|
||
}
|
||
public string getJson(ELabel label)
|
||
{
|
||
string json = String.Format("\"labelId\":{0},\"address\":{1},\"count\":{2},\"color\":{3},\"port\":{4},\"orderNo\":{5}"
|
||
, label.labelId, label.address, label.count, label.color, label.port,label.orderNo);
|
||
// Console.Write("get the lable: " + json);
|
||
|
||
return "{"+ json +"}";
|
||
}
|
||
|
||
|
||
|
||
void addLog(string info)
|
||
{
|
||
if (InvokeRequired)
|
||
{
|
||
this.Invoke(new showStatus(delegate()
|
||
{
|
||
doLogTxt(info);
|
||
}));
|
||
}
|
||
else
|
||
{
|
||
doLogTxt(info);
|
||
}
|
||
}
|
||
|
||
|
||
void doLogTxt(string info)
|
||
{
|
||
if (this.textLog.Lines.Length > 100)
|
||
{
|
||
this.textLog.Text = "";
|
||
}
|
||
|
||
while (info.Length < 100)
|
||
{
|
||
info += " ";
|
||
}
|
||
log.Debug(getMsg("ServiceForm", info));
|
||
|
||
info = " " + System.DateTime.Now +" "+ info;
|
||
this.textLog.Text = info + "\r\n" + this.textLog.Text;
|
||
|
||
|
||
}
|
||
|
||
|
||
|
||
static string getMsg(string className, string msg)
|
||
{
|
||
return string.Format("{0} {1}",className,msg);
|
||
}
|
||
|
||
private void btnTest_Click(object sender, EventArgs e)
|
||
{
|
||
int color = 0;
|
||
for (int i = 1; i < 6; i++)
|
||
{
|
||
color++;
|
||
if (color > 7)
|
||
{
|
||
color = 0;
|
||
}
|
||
testLight(i+1, color);
|
||
Thread.Sleep(100);
|
||
//break;
|
||
}
|
||
}
|
||
|
||
void testLight(int orderNo,int color)
|
||
{
|
||
|
||
ELabel[] els = new ELabel[9];
|
||
|
||
for (int i = 1; i < 10; i++)
|
||
{
|
||
ELabel el = new ELabel();
|
||
|
||
el.labelId = i;
|
||
el.count = new Random().Next(1, 8888);
|
||
el.address = new Random().Next(1, 88);
|
||
el.color = color;// new Random().Next(1, 6);
|
||
el.port = 6;
|
||
el.orderNo = orderNo;
|
||
|
||
els[i-1] = el;
|
||
Thread.Sleep(100);
|
||
}
|
||
|
||
/*for (int i = 5; i < 9; i++)
|
||
{
|
||
ELabel el1 = new ELabel();
|
||
el1.labelId = i;// new Random().Next(5, 9);
|
||
el1.count = new Random().Next(1, 8666);
|
||
el1.address = new Random().Next(1, 86);
|
||
el1.color = color; //new Random().Next(1, 6);
|
||
el1.port = 9;
|
||
el1.orderNo = orderNo;
|
||
|
||
els[i-1] = el1;
|
||
}
|
||
*/
|
||
postUrl = svrUrl + "lightLabels";
|
||
addLog("开始测试亮灯");
|
||
Thread threadPreProcess = new Thread(new ParameterizedThreadStart(HttpPost));
|
||
threadPreProcess.IsBackground = true;
|
||
threadPreProcess.Start(els);
|
||
}
|
||
|
||
bool clearOrder(ClearOrder order)
|
||
{
|
||
foreach (int port in order.ports)
|
||
{
|
||
if (!elelab.DNLights.clearOrder(order.orderNo, port))
|
||
{
|
||
addLog("清除订单失败");
|
||
addLog(string.Format("端口: {0},订单:{1}",port,order.orderNo));
|
||
return false;
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
private void btnRefresh_Click(object sender, EventArgs e)
|
||
{
|
||
System.Diagnostics.Process.Start(System.Reflection.Assembly.GetExecutingAssembly().Location);
|
||
System.Environment.Exit(0);
|
||
}
|
||
|
||
private void btnClear_Click(object sender, EventArgs e)
|
||
{
|
||
elelab.DNLights.clearOrder(1, 6);
|
||
}
|
||
|
||
private void btnReset_Click(object sender, EventArgs e)
|
||
{
|
||
elelab.DNLights.resetDevice();
|
||
}
|
||
|
||
private void form1_FormClosing(object sender, FormClosingEventArgs e)
|
||
{
|
||
elelab.DNLights.resetDevice();
|
||
}
|
||
|
||
}
|
||
}
|