一、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);
}
}