• 无人地磅自助机开发总结(七)通过http请求与命令字向后台进行数据交互


    这个例子是向后台发送卡号机器码以及mac地址获取地磅的设置信息

    1.请求数据时需要发送的字段

    LoadometerSettingByAccessCardPacket.cs

    nuget引入

    Newtonsoft.Json.dll

     public  class LoadometerSettingByAccessCardPacket
        {
            [Newtonsoft.Json.JsonIgnore]
            public string cmd { get; set;}
    
            public LoadometerSettingByAccessCardPacket()
            {
                cmd = "LoadometerSettingByAccessCard";
              
            }
    
            /// <summary>
            /// 门禁卡编号
            /// </summary>
            public string accesscardnum { get; set; }
    
            /// <summary>
            /// 机器码
            /// </summary>
             public string mcode { get; set; }
    
            /// <summary>
            ///Mac地址
            /// </summary>
            public string macaddress { get; set; }
        }

    2.发送请求类

    Packet.cs

     public class Packet
        {/// <summary>
        /// 发送请求类
        /// </summary>
            private string responseJsonStr;      // request json & response json  字符串
            private string requestJsonStr;
            private byte[] contentByte;  // request byte[] & response byte[]
    
            /// <summary>
            /// 发送数据
            /// </summary>
            public string data { get; set; }
            /// <summary>
            /// 命令
            /// </summary>
            public string cmd { get; set; }
            public string RequestData(LoadometerSettingByAccessCardPacket pacSend)
            {
                requestJsonStr = GetJson(pacSend);
                contentByte = System.Text.Encoding.UTF8.GetBytes(requestJsonStr);
                // 压缩contentByte
                contentByte = ZipHelper.Compress(contentByte);
                // 加密contentByte
                contentByte = DESHelper.Encrypt(contentByte);
                contentByte = HttpRequest.PostRequest(contentByte); //Send packet
    
                // 解密contentByte
                contentByte = DESHelper.Decrypt(contentByte);
                // 解压contentByte
                contentByte = ZipHelper.Decompress(contentByte);
                responseJsonStr = System.Text.Encoding.UTF8.GetString(contentByte);
                return responseJsonStr;
            }
    
            /// 获取数据发送JSON
            /// </summary>
            /// <param name="obj"></param>
            /// <returns></returns>
            public string GetJson(LoadometerSettingByAccessCardPacket obj)
            {
                try
                {
                    cmd = obj.cmd;
                    data = JsonConvert.SerializeObject(obj, Formatting.Indented, new JsonSerializerSettings
                    {
                        //ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()
                        ContractResolver = new UnderlineSplitContractResolver()
                    });
    
                    return JsonConvert.SerializeObject(this, Formatting.Indented, new JsonSerializerSettings
                    {
                        ContractResolver = new UnderlineSplitContractResolver()
                    });
                }
                catch
                {
                    return "";
                }
            }
        }

    3.压缩类

    ZipHelper.cs

      public class ZipHelper
        {
    
            /// <summary>
            /// 压缩byte[]
            /// </summary>
            /// <param name="data"></param>
            /// <returns>返回压缩后的byte[]</returns>
            public static byte[] Compress(byte[] data)
            {
                if (data == null)
                {
                    return null;
                }
                using (MemoryStream ms = new MemoryStream())
                {
                    GZipStream compressedzipStream = new GZipStream(ms, CompressionMode.Compress, true);
                    compressedzipStream.Write(data, 0, data.Length);
                    compressedzipStream.Close();
                    return ms.ToArray();
                }
            }
            /// <summary>
            /// 压缩字符串
            /// </summary>
            /// <param name="str"></param>
            /// <returns>压缩后的字符串</returns>
            public static string Compress(string str)
            {
                if (string.IsNullOrEmpty(str))
                {
                    return "";
                }
                byte[] data = System.Text.Encoding.UTF8.GetBytes(str);
                return Encoding.UTF8.GetString(Compress(data));
            }
    
            /// <summary>
            /// 解压byte[]
            /// </summary>
            /// <param name="zippedData"></param>
            /// <returns>解压后的byte[]</returns>
            public static byte[] Decompress(byte[] data)
            {
                if (data == null)
                {
                    return null;
                }
                using (MemoryStream outBuffer = new MemoryStream())
                {
                    MemoryStream ms = new MemoryStream(data);
                    GZipStream compressedzipStream = new GZipStream(ms, CompressionMode.Decompress);
                    byte[] block = new byte[1024];
                    while (true)
                    {
                        int bytesRead = compressedzipStream.Read(block, 0, block.Length);
                        if (bytesRead <= 0)
                            break;
                        else
                            outBuffer.Write(block, 0, bytesRead);
                    }
                    compressedzipStream.Close();
                    ms.Close();
                    return outBuffer.ToArray();
                }
            }
            /// <summary>
            /// 解压字符串
            /// </summary>
            /// <param name="str"></param>
            /// <returns>解压后的字符串</returns>
            public static string Decompress(string str)
            {
                if (string.IsNullOrEmpty(str))
                {
                    return "";
                }
                else
                {
                    byte[] data = Encoding.UTF8.GetBytes(str);
                    return Encoding.UTF8.GetString(Decompress(data));
                }
            }
        }
    

     4.加密解密类 

    DESHelper.cs

       public class DESHelper
        {
            #region 加密
            /// <summary> 加密字符串   
            /// </summary>  
            /// <param name="str">要加密的字符串</param>  
            /// <returns>加密后的字符串</returns>  
            public static string Encrypt(string str)
            {
                if (string.IsNullOrEmpty(str))
                {
                    return "";
                }
                byte[] data = Encoding.UTF8.GetBytes(str);
                return Encoding.UTF8.GetString(Encrypt(data));
            }
            /// <summary> 加密byte[]   
            /// </summary>  
            /// <param name="str">要加密的byte[]</param>  
            /// <returns>加密后的byte[]</returns>  
            public static byte[] Encrypt(byte[] data)
            {
                if (data == null)
                {
                    return null;
                }
                try
                {
                    using (MemoryStream MStream = new MemoryStream())//实例化内存流对象  
                    {
                        DESCryptoServiceProvider descsp = new DESCryptoServiceProvider();   //实例化加/解密类对象   
                        byte[] key = Encoding.UTF8.GetBytes("STEEL021"); //定义字节数组,用来存储密钥    
                        //使用内存流实例化加密流对象   
                        CryptoStream CStream = new CryptoStream(MStream, descsp.CreateEncryptor(key, key), CryptoStreamMode.Write);
                        CStream.Write(data, 0, data.Length);  //向加密流中写入数据      
                        CStream.FlushFinalBlock();//释放加密流    
                        CStream.Close();
                        return MStream.ToArray();
                    }
                }
                catch
                {
                    return null;
                }
            }
            #endregion
    
            #region 解密
            /// <summary>  
            /// 解密字符串   
            /// </summary>  
            /// <param name="str">要解密的字符串</param>  
            /// <returns>解密后的字符串</returns>  
            public static string Decrypt(string str)
            {
                if (string.IsNullOrEmpty(str))
                {
                    return "";
                }
                byte[] data = Encoding.UTF8.GetBytes(str);//定义字节数组,用来存储要解密的字符串  
                return Encoding.UTF8.GetString(Decrypt(data));
            }
            /// <summary>  
            /// 解密byte[]   
            /// </summary>  
            /// <param name="str">要解密的byte[] </param>  
            /// <returns>解密后的byte[] </returns>  
            public static byte[] Decrypt(byte[] data)
            {
                if (data == null)
                {
                    return null;
                }
                try
                {
                    using (MemoryStream MStream = new MemoryStream())//实例化内存流对象
                    {
                        DESCryptoServiceProvider descsp = new DESCryptoServiceProvider();   //实例化加/解密类对象    
                        byte[] key = Encoding.UTF8.GetBytes("STEEL021"); //定义字节数组,用来存储密钥    
                        //使用内存流实例化解密流对象       
                        CryptoStream CStream = new CryptoStream(MStream, descsp.CreateDecryptor(key, key), CryptoStreamMode.Write);
                        CStream.Write(data, 0, data.Length);      //向解密流中写入数据     
                        CStream.FlushFinalBlock();               //释放解密流    
                        CStream.Close();
                        return MStream.ToArray();
                    }
                }
                catch
                {
                    return null;
                }
            }
            #endregion
        }

    5.发送Http请求类

    HttpRequest.cs

       public class HttpRequest
        {
            /// <summary>
            /// Post方式发送Http请求
            /// </summary>
            /// <param name="packetData">数据</param>
            /// <param name="mes">异常信息</param>
            /// <returns></returns>
            public static byte[] PostRequest(byte[] packetData)
            {
                try
                {
                    var listByte = new List<byte>();
    
                    HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://180.166.99.4:20361/restapi/atm");
    
                    req.Method = "POST";
                    req.ContentType = "application/x-www-form-urlencoded";
                    req.ContentLength = packetData.Length;
                    req.Timeout = 120000;
    
                    using (Stream reqStream = req.GetRequestStream())
                    {
                        reqStream.Write(packetData, 0, packetData.Length);
                    }
    
                    using (HttpWebResponse myResponse = (HttpWebResponse)req.GetResponse())
                    {
                        BinaryReader reader = new BinaryReader(myResponse.GetResponseStream());
    
                        byte[] buffer = new byte[1024];
    
                        while (true)
                        {
                            int count = reader.Read(buffer, 0, buffer.Length);
                            if (count <= 0) break;
                            listByte.AddRange(buffer.Take(count));
                        }
                    }
    
                    return listByte.ToArray();
                }
                catch (Exception e)
                {
                               
                    return null;
                }
            }
        }

    6.UnderlineSplitContractResolver.cs

     public class UnderlineSplitContractResolver : DefaultContractResolver
        {
            protected override string ResolvePropertyName(string propertyName)
            {
                return CamelCaseToUnderlineSplit(propertyName);
            }
    
            private string CamelCaseToUnderlineSplit(string name)
            {
                return name.ToLower();
            }
        }

    7.从后台返回的设置信息

    SettingPC.cs

    public class SettingPC
        {    //地磅名
            public string loadometerName { get; set; }
            //mac地址
            public string loadometerMacAddress { get; set; }
            //仓库
            public string warehouse { get; set; }
            //仓库id
            public string warehouseId { get; set; }
            //电话号
            public string phone { get; set; }
            //晚上音量
            public string volumeNight { get; set; }
            //白天音量
            public string volumeDay { get; set; }
            public string msg { get; set; }
            public string status { get; set; }       
            public string data { get; set; }//取出json中的data,重新转成json再解析
    
        }

    8.发送请求,和后台进行数据交互,获取后台返回数据

    引用System.Web.Extensions.dll

     LoadometerSettingByAccessCardPacket rcpacket = new LoadometerSettingByAccessCardPacket();         
                rcpacket.accesscardnum = "01181630630533377565";
                string license = Computer.Instance().GetATMAll();//获取机器码
                rcpacket.mcode = license;
                rcpacket.macaddress = "089798FC1748";
                Packet instance = new Packet(); 
                var responsejson=  instance.RequestData(rcpacket);
    
                JavaScriptSerializer js = new JavaScriptSerializer() { MaxJsonLength = Int32.MaxValue };   //实例化一个能够序列化数据的类
                SettingPC setting = js.Deserialize<SettingPC>(responsejson);    //将json数据转化为对象类型并赋值给setting         
                string data= setting.data;//将data字符串取出来转成json重新解析
                var msg=setting.msg;
                var status = setting.status;
                if (status!= "1")
                {
                    MessageBox.Show(msg);
                    return;
                }
             
                JObject redata = (JObject)JsonConvert.DeserializeObject(data);
                SettingPC settingdata = js.Deserialize<SettingPC>(redata.ToString());
                string name = settingdata.warehouse;
                MessageBox.Show(name);

    注:前面七项都是为发送请求写好的类,第八项解析俩次是因为获取的json嵌入了俩层。

  • 相关阅读:
    A1052. Linked List Sorting (25)
    A1032. Sharing (25)
    A1022. Digital Library (30)
    A1071. Speech Patterns (25)
    A1054. The Dominant Color (20)
    A1060. Are They Equal (25)
    A1063. Set Similarity (25)
    电子码表
    矩阵键盘
    对象追踪、临时对象追踪、绝对坐标与相对坐标
  • 原文地址:https://www.cnblogs.com/king10086/p/15380934.html
Copyright © 2020-2023  润新知