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 labelPool = new List(); 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 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> lbsOrder = new Dictionary>(); //按orderNo 分组 Dictionary> 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(); } lbsOrder[el.orderNo].Add(el); } foreach (int keyOrder in lbsOrder.Keys) { List lbs = lbsOrder[keyOrder]; lbsPort = new Dictionary>(); 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(); } 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 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(); } /// /// GET请求与获取结果 /// 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(); } } }