public object[] ReadValue(string deviceAddress, string[] points) { var client = new Way.Lib.NetStream(this.Address, this.Port); var json = Newtonsoft.Json.JsonConvert.SerializeObject(new Command() { Type = "ReadValue", DeviceAddress = deviceAddress, Points = points }); byte[] bs = System.Text.Encoding.UTF8.GetBytes(json); client.Write(bs.Length); client.Write(bs); object[] values = new object[points.Length]; for (int i = 0; i < points.Length; i++) { int index = client.ReadInt(); PointValueType valueType = (PointValueType)client.ReadInt(); if (valueType == PointValueType.Short) { values[index] = client.ReadShort(); } else if (valueType == PointValueType.Int) { values[index] = client.ReadInt(); } else if (valueType == PointValueType.Float) { values[index] = client.ReadFloat(); } else if (valueType == PointValueType.String) { values[index] = System.Text.Encoding.UTF8.GetString(client.ReceiveDatas(client.ReadInt())); } else { throw new Exception($"not support value type {valueType}"); } } client.Dispose(); return(values); }
/// <summary> /// /// </summary> /// <param name="deviceAddress">设备地址</param> /// <param name="points">点路径</param> /// <param name="interval">更新时间间隔,单位:毫秒</param> /// <param name="onReceiveValue"></param> /// <param name="onError"></param> public Way.Lib.NetStream AddPointToWatch(string deviceAddress, string[] points, int interval, Action <string, object> onReceiveValue, Action <string> onError) { if (interval < 1000) { interval = 1000; } try { var client = new Way.Lib.NetStream(this.Address, this.Port); var json = Newtonsoft.Json.JsonConvert.SerializeObject(new Command() { Type = "AddPointToWatch", DeviceAddress = deviceAddress, Points = points, Interval = interval }); byte[] bs = System.Text.Encoding.UTF8.GetBytes(json); client.Write(bs.Length); client.Write(bs); Task.Run(() => { while (true) { try { int index = client.ReadInt(); PointValueType valueType = (PointValueType)client.ReadInt(); if (valueType == PointValueType.Short) { onReceiveValue(points[index], client.ReadShort()); } else if (valueType == PointValueType.Int) { onReceiveValue(points[index], client.ReadInt()); } else if (valueType == PointValueType.Float) { onReceiveValue(points[index], client.ReadFloat()); } else if (valueType == PointValueType.String) { var str = System.Text.Encoding.UTF8.GetString(client.ReceiveDatas(client.ReadInt())); onReceiveValue(points[index], str); } else { throw new Exception($"not support value type {valueType}"); } } catch (Exception ex) { client.Close(); onError(ex.Message); return; } } }); return(client); } catch (Exception ex) { onError(ex.Message); } return(null); }