C#上位机获取OneNET云平台数据----HTTP

本文详细描述了一个Windows应用,通过HTTPGET从OneNET云平台获取JSON数据,解析变量并显示在界面上,同时支持定时更新和本地TXT文件存储。应用涉及参数设置、数据处理和文件操作功能。
摘要由CSDN通过智能技术生成

一、HTTP(GET)

我这里采用的是HTTP协议中的GET请求的形式获取OneNET云平台上的数据,关于HTTP中的GET请求我这里就不在多介绍了,不懂得可以搜一搜,在网上了解熟悉一下。

二、项目介绍

本项目主要是通过OneNET设备URL和设备API-KEY获取到云平台JSON格式的数据,然后解析JSON数据,将变量值提取出来显示在接收区,并且能够将数据保存在本地磁盘中,以TXT文件的形式进行保存。

三、窗口页面布局

1.窗口1

这个页面是窗口1,主要分为三个板块,第一个板块为参数设置区,主要用于设置OneNET相关的参数和获取OneNET云平台数据的周期时间;第二个板块为数据接收区,主要作用就是获取的数据在此区域进行显示,以及数据说明;第三个板块为存储区,主要设置存储文件名和存储路径。

2.窗口2

窗口2是点击窗口1中的参数设置button,然后跳转到窗口2页面来,在这里进行设置OneNET云平台相关参数。

这里页面布局就不讲解了,可以参考我之前开发的串口调试器的教程。

四、程序实现

1.点击参数设置跳转到窗口2,并接收窗口2的数据
private void button1_Click(object sender, EventArgs e)
        {
            Form2 form2 = new Form2();
            form2.ShowDialog();

            if (form2.form_URL != null && form2.form_TIME != null && form2.form_KEY != null)
            {
                // 在窗口2关闭后获取窗口2中的值
                saveURLFromForm2 = form2.form_URL;
                saveAPI_KEYFromForm2 = form2.form_KEY;
                saveTimeFromForm2 = int.Parse(form2.form_TIME);

                label10.Text = saveURLFromForm2;
                label12.Text = saveAPI_KEYFromForm2 = form2.form_KEY;
                label14.Text = " " + saveTimeFromForm2 + " ms";
            }
        }
2.窗口2传递数据 
public string form_URL { get; private set; }
public string form_KEY { get; private set; }
public string form_TIME { get; private set; }


private void button2_Click(object sender, EventArgs e)
        {
            form_URL = textBox2.Text;
            form_KEY = textBox1.Text;
            form_TIME = "" + (int)numericUpDown1.Value;
            this.Close();
        }
3.获取OneNET云平台JSON数据
private void Get()
        {
            string url = label10.Text;//设备地址
            string api_key = label12.Text;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "GET";
            SetHeaderValue(request.Headers, "api-key", api_key);//设备API地址和 首部参数
            request.Host = "api.heclouds.com";
            request.ProtocolVersion = new Version(1, 1);
            request.ContentType = "text/html;charset=UTF-8";
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream myResponseStream = response.GetResponseStream();
            StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
            string retString = myStreamReader.ReadToEnd();
            myStreamReader.Close();
            myResponseStream.Close();

            my_jiexi_Json(retString);
        }



// HTTP协议报文头加入
        public static void SetHeaderValue(WebHeaderCollection header, string name, string value)
        {
            var property = typeof(WebHeaderCollection).GetProperty("InnerCollection", BindingFlags.Instance | BindingFlags.NonPublic);
            if (property != null)
            {
                var collection = property.GetValue(header, null) as NameValueCollection;
                collection[name] = value;
            }
        }
4.解析JSON数据
public void my_jiexi_Json(string str)
        {
            // 解析 JSON 字符串
            JObject obj = JObject.Parse(str);

            // 获取 TDS、Temp 和 PH 的值
            TDS = GetValue(obj, "TDS");
            Temp = GetValue(obj, "Temp");
            PH = GetValue(obj, "PH");

            label2.Text = Temp + " (℃)";
            label5.Text = TDS + " (PPM)";
            label7.Text = PH + " (mol/L)";
            Console.WriteLine("ph:" + PH + "  TDS:" + TDS + "  Temp:" + Temp);
        }


public static float GetValue(JObject obj, string id)
        {
            // 获取 data.datastreams 中的值
            JArray datastreams = (JArray)obj["data"]["datastreams"];
            foreach (JObject datastream in datastreams)
            {
                // 检查当前 datastream 是否为目标 id
                if ((string)datastream["id"] == id)
                {
                    // 获取 datapoints 中的第一个值(假设只有一个值)
                    JArray datapoints = (JArray)datastream["datapoints"];
                    foreach (JObject datapoint in datapoints)
                    {
                        // 返回 value 值
                        return (float)datapoint["value"];
                    }
                }
            }
            // 如果没有找到对应 id 的值,返回 float.NaN
            return float.NaN;
        }
5.定时获取OneNET数据
①添加定时器控件

②.双击定时器控件,配置定时器程序
private Timer timer = new Timer();


private void timer1_Tick(object sender, EventArgs e)
        {
            string text = label14.Text.Replace("ms", "");
            int interval;
            if (int.TryParse(text, out interval))
            {
                timer.Interval = interval;
            }
            else
            {
                MessageBox.Show("刷新时间获取失败!");
            }

            Get();
        }
③.时间自增,自增到timer.Interval后进去timer1_Tick函数中

这里配置好后,就可以定时获取到OneNET云平台中的数据

④.开启和关闭定时器
private void button4_Click(object sender, EventArgs e)
        {
            // 启动定时器
            timer.Start();
        }


private void button5_Click(object sender, EventArgs e)
        {
            timer.Stop();
        }
6.以TXT文件保存获取到的数据
①.选择路径

点击选择路径控件会打开本地磁盘,用户可自选文件进行保存。

private void button2_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog { ShowNewFolderButton = true };
            folderBrowserDialog.Description = "请选择文件路径";
            if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
            {
                textBox1.Text = folderBrowserDialog.SelectedPath;
            }
        }
②.保存程序 
private void button3_Click(object sender, EventArgs e)
        {
            string file_name = textBox2.Text;
            string file_path = textBox1.Text;

            string fullPath = Path.Combine(file_path, file_name);
            // 保存数据到文件
            SaveDataToFile(fullPath, TDS, Temp, PH);
        }

        public static void SaveDataToFile(string filePath, float TDS, float Temp, float PH)
        {
            write_count += 1;
            try
            {
                // 创建目录(如果不存在)
                Directory.CreateDirectory(Path.GetDirectoryName(filePath));

                // 写入数据到文件(追加模式)
                using (StreamWriter writer = new StreamWriter(filePath, true))
                {
                    writer.WriteLine("数据" + write_count + ":");
                    writer.WriteLine("①:TDS: " + TDS);
                    writer.WriteLine("②:Temp: " + Temp);
                    writer.WriteLine("③:PH: " + PH);
                    writer.WriteLine("\r\n");
                }

                MessageBox.Show("保存成功!");

            }
            catch (Exception ex)
            {
                MessageBox.Show("保存数据错误:" + ex.Message);
            }
        }

五、效果展示

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值