ldj/epickHost/Form1.cs

1649 lines
50 KiB
C#
Raw Normal View History

2023-05-23 16:13:17 +08:00
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 elelab;
using DeiNiu.wms.win.utils;
using System.Configuration;
using System.Threading;
using System.ServiceModel;
using DeiNiu.wms.win;
using System.ServiceModel.Description;
using DeiNiu.Utils;
using Model;
using System.Net;
using System.IO;
using System.Runtime.Serialization.Json;
using System.Timers;
namespace epickHost
{
public partial class FormHost : Form
{
static log4net.ILog log = log4net.LogManager.GetLogger("light");
String oCom = "";
Dictionary<int, dnwms> coms = new Dictionary<int, dnwms>();
dnwms activePort;
int currentPort = 0;
private ServiceHost host = null;
public static List<ELabel> labelPool = new List<ELabel>();
string svrUrl = "http://127.0.0.1:9998/DNLight";
private string postUrl="";
void startHost2()
{
// lbStatus.Text = "服务启动失败";
string startupOk = "服务已启动";
try
{
svrUrl = System.Configuration.ConfigurationManager.AppSettings["BaseUri"];
Uri baseAddress = new Uri(svrUrl);
ServiceLight service = new ServiceLight();
service.turnOnLts += this.turnOnLights;
service.turnOffLts += this.turnOffLights;
service.lightUp += this.lightUp;
service.resetPort += this.resetPort;
service.getCarIpAddress += this.getCarIpAddress;
service.clearLablesByPortOrder += this.clearLablesByPortOrder;
service.outMsg += this.addLog;
service.turnOffLb += this.turnOffLable;
elelab.pick.lightOffEvent += testPicked;
host = new ServiceHost(service, baseAddress);
WebHttpBinding binding = new WebHttpBinding();
ServiceEndpoint endpoint = host.AddServiceEndpoint(typeof(IServiceLight), binding, baseAddress);
WebHttpBehavior httpBehavior = new WebHttpBehavior();
endpoint.Behaviors.Add(httpBehavior);
List<string> lstIp =Util.GetLocalIpAddress("InterNetwork");
string showSvr = svrUrl;
if (lstIp.Count > 0)
{
showSvr = svrUrl.Replace("127.0.0.1", lstIp[0]);
}
host.Opened += delegate
{
if (InvokeRequired)
{
this.Invoke(new showStatus(delegate()
{
lbStatus.Text = startupOk;
txtboxUrl.Text = showSvr;
addLog("服务已启动");
// addLog("累计亮灯次数:" + getConfigValue("count"));
}));
}
else
{
lbStatus.Text = startupOk;
txtboxUrl.Text = showSvr;
addLog("服务已启动");
// addLog("累计亮灯次数:" + getConfigValue("count"));
// lbStatus.Text = "服务启动失败";
// lbUrl.Text ="";
}
};
host.Open();
}
catch (Exception e)
{
2023-05-23 16:13:17 +08:00
MessageBox.Show("启动服务失败: "+e.Message);
addLog(e.StackTrace);
2023-05-23 16:13:17 +08:00
}
}
private bool turnOffLable(List<ELabel> lables)
{
foreach(ELabel lable in lables)
{
pick.turnOffLabel(currentPort, lable.labelId);
}
return true;
}
private Cart getCarIpAddress(string carNo)
{
string ip = getConfigValue(carNo);
if (!vaildService())
{
ip = "无法获取IP地址";
}
if (String.IsNullOrEmpty(ip))
{
ip= "";
}
Cart cart = new Cart();
cart.carNo = carNo;
cart.ip = ip;
ip = String.Format("\"carNo\":\"{0}\",\"ip\":\"{1}\"",carNo, ip);
ip = "{" + ip + "}";
addLog(ip);
Thread threadPreProcess = new Thread(clearDis);
threadPreProcess.IsBackground = true;
threadPreProcess.Start();
// clearDis();
return cart;
}
public FormHost()
{
InitializeComponent();
elelab.pick.init_port(enumLabelPickType.seed);
Thread threadPreProcess = new Thread(startHost2);
threadPreProcess.IsBackground = true;
threadPreProcess.Start();
if (elelab.pick.activeComports.Count == 0)
{
lbLightInfo.Text = "拣选设备连接错误";
lbComStatus.Text = "拣选设备连接错误";
}
else
{
initcoms();
lbLightInfo.Text = "控制器就绪";
lbComStatus.Text = "控制器就绪";
}
comcolor.SelectedIndex = 0;
txtUrl.Text = System.Configuration.ConfigurationManager.AppSettings["BaseUri"];
txtCallBack.Text = System.Configuration.ConfigurationManager.AppSettings["WMSuri"];
readRowIds();
string tmp = System.Configuration.ConfigurationManager.AppSettings["hostInterv"];
if (!string.IsNullOrEmpty(tmp))
{
try { nud.Value = Convert.ToInt32(tmp); } catch { }
}
initialTimer();
initialTimer2();
}
private void Form1_Load(object sender, EventArgs e)
{
comboxcolor.SelectedIndex = 0;
}
private void initcoms()
{
String[] Portname = System.IO.Ports.SerialPort.GetPortNames();
comComs.Items.Clear();
oCom = System.Configuration.ConfigurationManager.AppSettings["Com"];
int oldIndex = 0;
try
{
for (int i = 0; i < Portname.Length; i++)
{
//col.Add(i);
comComs.Items.Add(Portname[i]);
if (!string.IsNullOrEmpty(oCom) && oCom == Portname[i])
{
oldIndex = i;
}
}
}
finally
{
}
comComs.SelectedIndex = oldIndex;
btnCom.Enabled = comComs.Items.Count > 0;
if (comComs .Items.Count > 0)
{
for (int i = comComs.Items.Count-1; i >= 0; i--)
{
int port = Convert.ToInt16(comComs.Items[i].ToString().Substring(3));
initialCom(port);
}
}
btnReset.Enabled = currentPort > 0;
}
void initialCom(int port)
{
try
{
//int port = Convert.ToInt16(comComs.Text.Substring(3));
resetLights();
if (coms.Keys.Contains(port))
{
if (String.IsNullOrEmpty(oCom) || !oCom.Equals(comComs.Text))
{
WriteConfig("Com", comComs.Text);
oCom = comComs.Text;
}
currentPort = port;
this.lbComStatus.Text = string.Format(comComs.Text + " 打开{0}", "成功");
}
else
{
this.lbComStatus.Text = string.Format(comComs.Text + " 打开{0}", "失败");
}
}
catch (Exception e)
{
lbComStatus.Text = string.Format(e.Message);
}
}
private void resetLights()
{
if (comComs.Items.Count == 0 || String.IsNullOrEmpty(comComs.Text))
{
return;
}
int port = Convert.ToInt16(comComs.Text.Substring(3));
if (unart_manage.com_manage[port] == null)
{
return;
}
activePort = unart_manage.com_manage[port].init_port;
if (pick.reset_device(port))
{
coms[port] = activePort;
}
}
protected void WriteConfig(string key, string value)
{
//ShowText("正在写入配置文件!请稍等....");
string appConfigPath = Application.StartupPath + "\\" + Application.ProductName + ".exe";
ConfigurationOperator co = new ConfigurationOperator(appConfigPath, ConfigType.ExeConfig);
co.AddAppSetting(key, value);
co.Save();
}
int baseLightId = 5000;
bool turnOnLights(int portNo, List<ELight> lights)
{
if (portNo == 0)
{
portNo = currentPort;
}
// bool rt=false;
List<ELight> fail = new List<ELight>();
log.Debug("start light on request ------>");
foreach (ELight el in lights)
{
channel_led id = new channel_led();
id.channel_id = baseLightId + el.lightId;
//id.config_word = led_rgb;
id.color = el.which;
id.state = 1;
if (el.port == 0)
{
el.port = portNo;
}
if (!pick.turnOnLight(el.port, id))
{
log.Debug(getJson(el) + " light on failed. redo...");
fail.Add(el);
}
else
{
log.Debug(getJson(el));
}
Thread.Sleep(50);
}
if (fail.Count > 0)
{
turnOnLights(portNo, fail);
}
log.Debug("<----------- end light on request ");
return fail.Count==0;
}
bool turnOffLights(int portNo, List<ELight> lights)
{
if (portNo == 0)
{
portNo = currentPort;
}
bool rt = false;
List<ELight> fail = new List<ELight>();
log.Debug("start light off request ------>");
foreach (ELight el in lights)
{
channel_led id = new channel_led();
id.channel_id = baseLightId + el.lightId;
//id.config_word = led_rgb;
id.color = el.which;
id.state = 1;
if (el.port == 0)
{
el.port = portNo;
}
if (!pick.turnOffLight(el.port, id))
{
log.Debug(getJson(el) + " light off failed. redo...");
fail.Add(el);
}
else {
log.Debug(getJson(el));
}
Thread.Sleep(50);
}
if (fail.Count > 0)
{
turnOffLights(portNo, fail);
}
log.Debug("<----------- end light off request ");
return fail.Count == 0;
}
private byte getFloor()
{
byte floor =0;
/*if (InvokeRequired)
{
this.Invoke(new showStatus(delegate()
{
int color = Convert.ToByte(comboxcolor.SelectedIndex) + 1;
floor= Convert.ToByte(color);
}));
}
else
{
int color = Convert.ToByte(comboxcolor.SelectedIndex) + 1;
floor = Convert.ToByte(color);
}
*/
int color = comboxcolor.SelectedIndex;
floor = Convert.ToByte(color);
return floor;
}
private void btnReset_Click(object sender, EventArgs e)
{
}
private void btnTest_Click(object sender, EventArgs e)
{
}
private void btnReset_Click_1(object sender, EventArgs e)
{
}
private void tabPage2_Click(object sender, EventArgs e)
{
}
private void btnTestOn_Click(object sender, EventArgs e)
{
Thread threadPreProcess = new Thread(new ParameterizedThreadStart(turnOnLight));
threadPreProcess.IsBackground = true;
threadPreProcess.Start(getFloor());
}
delegate void showStatus();
void turnOnLight(object floor)
{
svrUrl = System.Configuration.ConfigurationManager.AppSettings["BaseUri"];
// svrUrl = svrUrl + "turnOnLightById?id={0}";
svrUrl = svrUrl + "turnOnLight?id={0}&which={1}&port={2}";
string lightId = txtLightId.Text.ToString();
int id = Convert.ToInt16(lightId);
// int color = 0;
string portNo = currentPort + "";
svrUrl = string.Format(svrUrl, id, floor, portNo);
// this.lbOnUrl.Text = svrUrl;
this.Invoke(new showStatus(delegate()
{ txtOut.Text += "Turn On Light:--> \r\n " + svrUrl + "\r\n";
lbOnStatus.Text = HttpGet(svrUrl, null);
}));
// lbOnStatus.Text = HttpGet(svrUrl, null);
}
void turnOffLight(object floor)
{
svrUrl = System.Configuration.ConfigurationManager.AppSettings["BaseUri"];
// svrUrl = svrUrl + "turnOffLightById?id={0}";
svrUrl = svrUrl + "turnOffLight?id={0}&which={1}&port={2}";
string lightId = this.txtLightId.Text;
int id = Convert.ToInt16(lightId);
string portNo = currentPort + "";
svrUrl = string.Format(svrUrl, id, floor, portNo);
//this.lbOffLight.Text = svrUrl;
// lbOnStatus.Text = HttpGet(svrUrl, null);
this.Invoke(new showStatus(delegate()
{ txtOut.Text += "Turn Off Light:--> \r\n " + svrUrl + "\r\n";
lbOnStatus.Text = HttpGet(svrUrl, null);
}));
}
private void btnTestOff_Click(object sender, EventArgs e)
{
Thread threadPreProcess = new Thread(new ParameterizedThreadStart(turnOffLight));
threadPreProcess.IsBackground = true;
threadPreProcess.Start(getFloor());
}
/// <summary>
/// GET请求与获取结果
/// </summary>
public static string 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;
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)
{
return ex.Message;
}
}
private void btnReset_Click_2(object sender, EventArgs e)
{
resetLights();
}
private void btnCom_Click(object sender, EventArgs e)
{
int port = Convert.ToInt16(comComs.Text.Substring(3));
initialCom(port);
}
private void btnUrl_Click(object sender, EventArgs e)
{
svrUrl = System.Configuration.ConfigurationManager.AppSettings["BaseUri"];
if (svrUrl.Equals(txtUrl.Text))
{
return;
}
WriteConfig("BaseUri", txtUrl.Text);
MessageBox.Show("地址修改成功,重启程序后生效。", "通知", MessageBoxButtons.OK, MessageBoxIcon.Information);
restart();
}
Dictionary<string,string> dicRowId = new Dictionary<string,string >(); //
bool lightUp(List<ELabel> labels)
{
//TODO 把传来的实体按portNo分组按portNo 分别点亮
writeBadRowIds();
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);
string rowKey = getRowKey(el);
dicRowId[rowKey] = el.rowId+"";
}
foreach (int keyPort in lbsPort.Keys)
{
if (!doLightUp(keyOrder, keyPort, lbsPort[keyPort]))
{
return false ;
} Thread.Sleep(100);
}
}
return true ;
}
string getRowKey(ELabel el)
{
return el.labelId + ":" + el.color;
}
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]; ;
addLog("receive light request --->");
for (int i = 0; i < lables.Count; i++)
{
ids[i] = lables[i].labelId;
address[i] = lables[i].num1;
counts[i] = lables[i].num3;
colors[i] = lables[i].color;
string json = getJson(lables[i]);
addLog(json);
}
addLog("<--- receive light request end");
//elelab.DNLights.initPort();
if (portNo == 0 && currentPort > 0)
{
portNo = currentPort;
}
bool result = false;
//result = DNLights.lightLabels(portNo, colors, ids, address, counts);
if (chkClear.Checked)
{
if (orderNo <= 0)
{
orderNo = 1;
}
}
saveRowIds();
result = elelab.pick.lightLabels(lables,chkClear.Checked, orderNo, portNo, enumLabelPickType.seed);
if (!result)
{
addLog(string.Format("亮灯失败: orderNo: {0},portNo: {1} ", orderNo, portNo));
}
else
{
addLog(string.Format("亮灯成功: orderNo: {0},portNo: {1} ", orderNo, portNo));
int cnt = Convert.ToInt32( getConfigValue("count"))+1;
writeConfig("count", cnt + "");
}
return result;
}
char splitStr = '%';
/// <summary>
/// rowId 保存到配置文件
/// 每次亮灯时调用
/// </summary>
private void saveRowIds()
{
string value = "";
foreach(string rowKey in dicRowId.Keys)
{
value+=rowKey+"#"+dicRowId[rowKey]+splitStr;
}
writeConfig("rowIds", value);
}
/// <summary>
/// 从配置文件读取rowId 和亮灯信息
/// 程序启动时调用
/// </summary>
private void readRowIds()
{
try {
string[] vs = getConfigValue("rowIds") .Split(splitStr);
dicRowId.Clear();
foreach(string value in vs)// 21:2#1234567
{
string[] tmp = value.Split('#');
if (tmp.Length > 1)
{
dicRowId[tmp[0]] = tmp[1];
}
}
}
catch(Exception ex)
{
addLog(ex.Message);
}
readBadRowIds();
}
/// <summary>
///
///
/// </summary>
List<string> badRowIds = new List<string>();
/// <summary>
/// 按灭时加入新rowId
/// 接口返回时去除rowId
/// </summary>
// List<string> finishedRowIds = new List<string>();
/// <summary>
/// 从配置文件读取返回接口失败的rowId
/// 程序启动时调用
/// 亮灯时调用
/// </summary>
private void readBadRowIds()
{
try
{
badRowIds = getConfigValue("badRowIds").Split(splitStr).ToList();
}
catch (Exception ex)
{
addLog(ex.Message);
}
}
/// <summary>
/// 保存接口失败的rowId
/// 调用失败时保存
/// </summary>
private void writeBadRowIds()
{
//if (badRowIds.Count == 0)
// return;
string value = "";
foreach (string rowId in badRowIds)
{
value += rowId + splitStr;
}
writeConfig("badRowIds", value);
}
void clearLablesByPortOrder(int port, int order)
{
if (port == -1)
{
port = currentPort;
}
if (order == -1)
{
order = 1;
}
elelab.pick.clearDis(port, order);
addLog("port " + currentPort + " cleared");
}
private void clearDis()
{
clearLablesByPortOrder(currentPort, 1);
}
/*void lightUp(List<ELabel> lables)
{
int portNo = currentPort;
if (portNo == 0)
{
addLog("无活动端口,亮灯失败");
return;
}
elelab.pick.init_port(enumLabelPickType.seed);
elelab.pick.lightLabels(lables, portNo, enumLabelPickType.seed);
}
*/
// delegate void showStatus();
void testPicked(int orderNo, int eleId, int color, int eleAddress, int count,int num2)
{
ELabel lb = new ELabel();
lb.num3 = count;
lb.color = color;
lb.num1 = eleAddress;
lb.orderNo = orderNo;
lb.labelId = eleId;
lb.num2 = num2;
int rowId = dicRowId.ContainsKey(getRowKey(lb)) ? Convert.ToInt32(dicRowId[getRowKey(lb)]) : 0;
lb.rowId = rowId;
if (rowId>0)
{
badRowIds.Add(rowId+"");
}
testPickedRowId(lb.rowId); //调用客户第三方的api通知灯已经灭掉了
/*
if (InvokeRequired)
{
this.Invoke(new showStatus(delegate()
{
returnResult(lb);
}));
}
else
{
returnResult(lb);
}
*/
}
void testPickedRowId(int rowId)
{
ELabel lb = new ELabel();
lb.rowId = rowId;
if (InvokeRequired)
{
this.Invoke(new showStatus(delegate ()
{
returnResult(lb);
}));
}
else
{
returnResult(lb);
}
}
private void returnResult(ELabel lb)
{
//to show result
//to call client and send data
String url = svrUrl + "testPost";
addLog("收到按键返回事件,开始回传..." + getJson(lb));
// addLog(getJson(lb));
string rowId = lb.rowId + "";
// if (dicRowId.ContainsKey(getRowKey(lb)))
// rowId = dicRowId[getRowKey(lb)];
2023-05-23 16:13:17 +08:00
// String s = getJson(lb);
postUrl = System.Configuration.ConfigurationManager.AppSettings["WMSuri"];
if (postUrl.StartsWith("http"))
{
Thread threadPreProcess = new Thread(new ParameterizedThreadStart(HttpPost));
threadPreProcess.IsBackground = true;
threadPreProcess.Start(lb);
}
else if (postUrl.StartsWith("https"))
{
Thread threadPreProcess = new Thread(new ParameterizedThreadStart(HttpsPost));
threadPreProcess.IsBackground = true;
threadPreProcess.Start(lb);
}
2023-05-23 16:13:17 +08:00
}
private void returnResult(int orderNo, int eleId, int color, int eleAddress, int count, int num2)
{
//to show result
//to call client and send data
ELabel lb = new ELabel();
lb.num3 = count;
lb.color = color;
lb.num1 = eleAddress;
lb.orderNo = orderNo;
lb.labelId = eleId;
lb.num2 = num2;
String url = svrUrl + "testPost";
addLog("收到按键返回事件,开始回传...");
addLog(getJson(lb));
// String s = getJson(lb);
postUrl = System.Configuration.ConfigurationManager.AppSettings["WMSuri"];
Thread threadPreProcess = new Thread(new ParameterizedThreadStart(HttpPost));
threadPreProcess.IsBackground = true;
threadPreProcess.Start(lb);
}
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;
try
2023-05-23 16:13:17 +08:00
{
using (Stream reqStream = req.GetRequestStream())
{
reqStream.Write(bs, 0, bs.Length);
}
req.BeginGetResponse(new AsyncCallback(Compleate), req);
}
catch(Exception e)
{
addLog(e.Message);
2023-05-23 16:13:17 +08:00
}
/*
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);
* */
}
private void HttpsPost(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;
2023-05-23 16:13:17 +08:00
try
{
using (Stream reqStream = req.GetRequestStream())
{
reqStream.Write(bs, 0, bs.Length);
}
2023-05-23 16:13:17 +08:00
req.BeginGetResponse(new AsyncCallback(Compleate), req);
}
catch (Exception e)
2023-05-23 16:13:17 +08:00
{
addLog(e.Message);
}
/*
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("收到服务器响应: " + responseText);
addLog("-------------------------------------------------------------");
}));
if (res.StatusCode == HttpStatusCode.OK)
{
// ELabel elb = new ELabel();
// elb.rowId = 1;
// elb.labelId = 2;
// responseText = getJson(elb);
// addLog("---->");
// addLog(getJson(elb));
// addLog("<----");
var mStream = new MemoryStream(Encoding.Default.GetBytes(responseText));
try {
ELabel lb = (ELabel)jsonSerializer.ReadObject(mStream);
string rowid = lb.rowId + "";
addLog("收到服务器响应 rowid: " + rowid );
if (badRowIds.Contains(rowid))
{
badRowIds.Remove(rowid);
addLog(" 已处理 rowid: " + rowid );
// return;
}
}
catch(Exception er) {
addLog("收到服务器响应:\n" + responseText +", 不包含亮灯数据");
}
}
else
{
writeBadRowIds();
}
// 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("获取失败.");
}
}
System.Runtime.Serialization.Json.DataContractJsonSerializer jsonSerializer
= new DataContractJsonSerializer(typeof(ELabel));
public string getJson(ELabel label)
{
return Util.getLbJson(label);
}
public string getJson(ELight light)
{
string json = "";
/* if (label.port == 0) //按键返回信息
{
json = String.Format("\"labelId\":{0},\"num1\":{1},\"num2\":{2},\"color\":{3},\"orderNo\":{4}"
, label.labelId, label.num1, label.num2 , label.color, label.orderNo);
}else //亮灯信息
*/
json = String.Format("\"lightId\":{0},\"which\":{1}, \"port\":{2}"
, light.lightId, light.which, light.port);
return "{" + json + "}";
}
delegate void showLog();
void addLog(string info)
{
if (InvokeRequired)
{
this.Invoke(new showLog(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;
if (this.textBoxLog.Lines.Length > 100)
{
this.textBoxLog.Text = "";
}
this.textBoxLog.Text = "\r\n" + info + "\r\n" + this.textBoxLog.Text;
if (this.txtOut.Lines.Length > 100)
{
this.txtOut.Text = "";
}
this.txtOut.Text = "\r\n" + info + "\r\n" + this.txtOut.Text;
}
static string getMsg(string className, string msg)
{
return string.Format("{0} {1}", className, msg);
}
ELabel getTestLabel()
{
int color = comcolor.SelectedIndex + 1;
int num1 = 0;
int num2 = 0;
int num3 = 0;
int id = 1;
try
{
num1 = Convert.ToInt16(txtNumber1.Text);
num2 = Convert.ToInt32(txtNum2.Text);
num3 = Convert.ToInt32(txtNum3.Text);
id = Convert.ToInt32(txtLabelId.Text);
}
catch
{
MessageBox.Show("请输入整数");
return new ELabel();
}
ELabel el = new ELabel();
el.rowId = new Random().Next();
el.labelId = id;
el.num2 = num2;
el.num3 = num3;
el.num1 = num1;
el.color = color;// new Random().Next(1, 6);
el.port = currentPort;
return el;
}
private void btnTestLabel_Click(object sender, EventArgs e)
{
svrUrl = System.Configuration.ConfigurationManager.AppSettings["BaseUri"];
List<ELabel> list = new List<ELabel>();
list.Add(getTestLabel());
lightUp(list);
/* postUrl = svrUrl + "lightLabels";
addLog("开始测试亮灯");
Thread threadPreProcess = new Thread(new ParameterizedThreadStart(HttpPost));
threadPreProcess.IsBackground = true;
threadPreProcess.Start(els);
addLog(postUrl);
String json = "亮灯数据:["+ getJson(el) +"]";
addLog(json);
*/
/*
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)
{
svrUrl = System.Configuration.ConfigurationManager.AppSettings["BaseUri"];
ELabel[] els = new ELabel[3];
for (int i = 1; i < 4; i++)
{
ELabel el = new ELabel();
el.labelId = i;
el.num3 = new Random().Next(1, 8888);
el.num1 = new Random().Next(1, 88);
el.color = color;// new Random().Next(1, 6);
el.port = currentPort;
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);
}
private void btnRestart_Click(object sender, EventArgs e)
{
restart();
}
private void restart()
{
System.Diagnostics.Process.Start(System.Reflection.Assembly.GetExecutingAssembly().Location);
System.Environment.Exit(0);
}
private void btnCallback_Click(object sender, EventArgs e)
{
postUrl = System.Configuration.ConfigurationManager.AppSettings["WMSuri"];
if (postUrl.Equals(this.txtCallBack.Text))
{
return;
}
WriteConfig("WMSuri", txtCallBack.Text);
restart();
}
private void btnTestBack_Click(object sender, EventArgs e)
{
postUrl = System.Configuration.ConfigurationManager.AppSettings["WMSuri"]; ;
addLog("开始测试回传WMS");
Thread threadPreProcess = new Thread(new ParameterizedThreadStart(HttpPost));
threadPreProcess.IsBackground = true;
threadPreProcess.Start(getTestLabel());
}
bool resetPort(int port)
{
if (port <= 0)
{
port = currentPort;
}
if (pick.reset_device(port))
{
addLog("Reset Port " + port + " succeed.");
return true;
}
addLog("Reset Port " + port + " failed.");
return false;
}
private void FormHost_FormClosing(object sender, FormClosingEventArgs e)
{
writeBadRowIds();
resetPort(0);
}
/// <summary>
/// 写入配置信息
/// </summary>
protected void writeConfig(string key, string value)
{
//ShowText("正在写入配置文件!请稍等....");
string appConfigPath = Application.StartupPath + "\\" + Application.ProductName + ".exe";
ConfigurationOperator co = new ConfigurationOperator(appConfigPath, ConfigType.ExeConfig);
co.AddAppSetting(key, value);
co.Save();
}
protected string getConfigValue(string key)
{
return System.Configuration.ConfigurationManager.AppSettings[key];
}
private void label13_Click(object sender, EventArgs e)
{
}
private void btnSetCartIP_Click(object sender, EventArgs e)
{
string carNo = "",ip="";
string carIp = txtCartIp.Text;
string[] ss = carIp.Split(':');
if (ss.Length > 1)
{
carNo = ss[0];
ip = ss[1];
writeConfig(carNo, ip);
MessageBox.Show("设置成功");
txtCartIp.Text = "";
restart();
}
}
private bool vaildService()
{
string cnt = getConfigValue("Service");
int value = Convert.ToInt32(cnt);
if (value > 0)
{
value++;
writeConfig("Service",value+"");
return value > 3000000;
}
else
{
return true;
}
}
bool isShowID = true;
private void btnShowId_Click(object sender, EventArgs e)
{
if (isShowID)
{
btnShowId.Text = "Clear ID";
pick.displayLabels(currentPort);
}
else
{
btnShowId.Text = "Show ID";
pick.clearLabels(currentPort);
}
isShowID = !isShowID;
}
private void txtBarcode_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
}
}
int index = -1;
private void txtBarcode_TextChanged(object sender, EventArgs e)
{
string barcode = txtBarcode.Text;
if (barcode.Length == 9)
{
txtBarcode.SelectAll();
}
else
{
return;
}
if (index >= 0 && index<=5)
{
turnOffLight(index); Thread.Sleep(100);
}
switch (barcode)
{
case "H-1-3-209":
index = 0;
break;
case "H-1-3-208":
index = 1;
break;
case "H-1-3-207":
index = 2;
break;
case "H-1-3-206":
index = 3;
break;
case "H-1-3-205":
index = 4;
break;
default:
index = 6;
break;
}
if (index < 5)
{
lbLightColor.Text = "格子编号010"+(index +1);
string log = barcode + " 识别成功,格子 " + (index+1) + " 开始亮灯...";
txtOut.Text = log + "\r\n";
turnOnLight(index);
}
else
{
lbLightColor.Text = "无法识别";
string log = barcode + " 无法识别,亮灯失败!!!!!" ;
txtOut.Text = log + "\r\n";
}
}
void resetLights(int port)
{
postUrl = " http://192.168.0.102:9998/DNlight/resetPort";
Thread threadPreProcess = new Thread(new ParameterizedThreadStart(HttpPost));
threadPreProcess.IsBackground = true;
threadPreProcess.Start(port);
}
private void btnOffLabel_Click(object sender, EventArgs e)
{
svrUrl = System.Configuration.ConfigurationManager.AppSettings["BaseUri"];
int color = comcolor.SelectedIndex + 1;
int num1 = 0;
int num2 = 0;
int num3 = 0;
int id = 1;
try
{
num1 = Convert.ToInt16(txtNumber1.Text);
num2 = Convert.ToInt32(txtNum2.Text);
num3 = Convert.ToInt32(txtNum3.Text);
id = Convert.ToInt32(txtLabelId.Text);
}
catch
{
MessageBox.Show("请输入整数");
return;
}
ELabel el = new ELabel();
el.labelId = id;
el.num2 = num2;
el.num3 = num3;
el.num1 = num1;
el.color = color;// new Random().Next(1, 6);
el.port = currentPort;
ELabel[] els = new ELabel[1];
els[0] = el;
postUrl = svrUrl + "labelOff";
addLog("开始测试关闭标签");
Thread threadPreProcess = new Thread(new ParameterizedThreadStart(HttpPost));
threadPreProcess.IsBackground = true;
threadPreProcess.Start(els);
addLog(postUrl);
String json = "关闭标签数据:[" + getJson(el) + "]";
addLog(json);
}
private void label3_Click(object sender, EventArgs e)
{
}
System.Timers.Timer timer = new System.Timers.Timer();//实例化Timer类
private void initialTimer()
{
int intTime = Convert.ToInt32( nud.Value)*1000;
intTime = intTime > 0 ? intTime : 10000;
timer.Interval = intTime;//设置间隔时间,为毫秒;
timer.Elapsed += new System.Timers.ElapsedEventHandler(checkHost);//到达时间的时候执行事件;
timer.AutoReset = true;//设置是执行一次false还是一直执行(true)
timer.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件
timer.Start();
}
bool isChecking = false;
private void checkHost(object sender, ElapsedEventArgs e)
{
if (isChecking)
{
addLog(" check is working..... return");
return;
}
isChecking = true;
addLog("开始检查及再次回调服务。。。。。--->" );
if (badRowIds.Count == 0)
{
isChecking = false;
addLog("待处理数量: " + badRowIds.Count);
addLog("<--- 结束再次回调服务 ");
return;
}
List<string> rowIds = new List<string>();
foreach (string row in badRowIds)
{
if (string.IsNullOrEmpty(row))
{
continue;
}
rowIds.Add(row);
}
badRowIds.Clear();
foreach (string row in rowIds)
{
if (string.IsNullOrEmpty(row))
{
continue;
}
badRowIds.Add(row);
addLog("待处理数据: " + rowIds +" ");
}
addLog("待处理数量: " + rowIds.Count);
foreach (string row in rowIds)
{
if (string.IsNullOrEmpty(row))
{
continue;
}
addLog("开始回调 row ID " + row);
testPickedRowId(Convert.ToInt32(row));
Thread.Sleep(500);
}
rowIds.Clear();
foreach (string row in badRowIds)
{
if (string.IsNullOrEmpty(row))
{
continue;
}
rowIds.Add(row);
}
if (rowIds.Count > 0)
{
addLog("待处理回调异常记录: ");
foreach (string row in rowIds)
{
if (string.IsNullOrEmpty(row))
{
continue;
}
addLog("rowId: " + row);
}
}
addLog("<--- 结束再次回调服务 ");
writeBadRowIds();
isChecking =false;
}
private void nud_ValueChanged(object sender, EventArgs e)
{ int intTime = Convert.ToInt32(nud.Value) * 1000;
WriteConfig("hostInterv", nud.Value + "");
timer.Stop();
timer.Interval = intTime;//设置间隔时间,为毫秒;
timer.Start();
}
private void lbComStatus_Click(object sender, EventArgs e)
{
}
System.Timers.Timer timer2 = new System.Timers.Timer();//实例化Timer类
//每2小时重启服务
private void initialTimer2()
{
//int intTime = 1* 60 * 1000; //1分
int intTime = 8 * 60 * 60 * 1000; //8小时
2023-05-23 16:13:17 +08:00
timer2.Interval = intTime;//设置间隔时间,为毫秒;
timer2.Elapsed += new System.Timers.ElapsedEventHandler(reset);//到达时间的时候执行事件;
timer2.AutoReset = true;//设置是执行一次false还是一直执行(true)
timer2.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件
timer2.Start();
2023-05-23 16:13:17 +08:00
}
private void reset(object sender, ElapsedEventArgs e)
{
int hour = System.DateTime.Now.Hour;
addLog("current hour is " + hour);
if (hour >7 && hour <19)
{
return;
}
addLog("Restarting....Service..... " );
2023-05-23 16:13:17 +08:00
restart();
}
}
}