onenet平台提供一系列API来实现对设备的操作和对设备的操作,本文章主要用C#实现了动态token生成,鉴权,设备增加,设备最新数据读取,设备属性修改等功能,给有需要的兄弟们参考下:
1.时间戳生成:
public double DateTimeToUnixTimeStamp(System.DateTime dateTime)
{
// 转换为UTC时间,减去时间的毫秒数,然后除以1000得到Unix时间戳
return (dateTime.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
}
2.token生成:
/// <summary>
/// onenet物联网平台 安全鉴权 Token生成算法
/// </summary>
/// <param name="res">访问资源 resource 格式为:父资源类/父资源ID/子资源类/子资源ID </param>
/// <param name="et">访问过期时间 expirationTime,unix时间 当一次访问参数中的et时间小于当前时间时,平台会认为访问参数过期从而拒绝该访问</param>
/// <param name="key"> apiKey </param>
/// <param name="method">支持hmac md5,sha1,sha256 </param>
/// <param name="version"></param>
/// <returns></returns>
public static string CreateAccessKey(string res, string et, string key, string method, string version = "2018-10-31")
{
string accessKey = "";
try
{
string StringForSignature = et + '\n' + method + '\n' + res + '\n' + version;
string sign = "";
switch (method)
{
case "sha1":
using (HMACSHA1 hmac = new HMACSHA1(Convert.FromBase64String(key)))
{
byte[] hashBytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(StringForSignature));
sign = Convert.ToBase64String(hashBytes).Replace("=", "%3D").Replace("+", "%2B").Replace("#", "%23").Replace("&", "%26").Replace("/", "%2F");
}
break;
case "sha256":
using (HMACSHA256 hmac = new HMACSHA256(Convert.FromBase64String(key)))
{
byte[] hashBytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(StringForSignature));
sign = Convert.ToBase64String(hashBytes).Replace("=", "%3D").Replace("+", "%2B").Replace("#", "%23").Replace("&", "%26").Replace("/", "%2F");
}
break;
case "md5":
using (HMACMD5 hmac = new HMACMD5(Convert.FromBase64String(key)))
{
byte[] hashBytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(StringForSignature));
sign = Convert.ToBase64String(hashBytes).Replace("=", "%3D").Replace("+", "%2B").Replace("#", "%23").Replace("&", "%26").Replace("/", "%2F");
}
break;
}
sign = UnicodeEncoding.UTF8.GetString(UnicodeEncoding.UTF8.GetBytes(sign));
accessKey = string.Format("version={0}&res={1}&et={2}&method={3}&sign={4}", version, res, et, method, sign);
}
catch (Exception ex)
{
}
return accessKey;
}
3.增加设备:
private void btn_create_Click(object sender, EventArgs e)
{
string url = "https://iot-api.heclouds.com/device/create";//设备地址
string json = "{ \"product_id\": \""+text_c_pid.Text+"\", \"device_name\": \""+text_c_pname.Text+"\", \"imei\": \""+text_c_imei.Text+"\", \"imsi\": \""+text_c_imsi.Text+"\"}";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/json;charset=utf-8";
request.Host = "iot-api.heclouds.com";
request.ProtocolVersion = new Version(1, 1);
SetHeaderValue(request.Headers, "authorization", "此处填入你自己的TOKEN,可以用工具生成,也可以用上述函数动态生成");//设备API地址和 首部参数
using (StreamWriter writer = new StreamWriter(request.GetRequestStream()))
{
writer.Write(json);
}
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();
text_show.Text = retString;
}
4.获取指定产品下的设备最新数据:
string deviceid = "你的设备ID1,你的设备ID2";//设备ID,多个使用逗号隔开
private void btn_get_Click(object sender, EventArgs e) //传感器数据获取示例代码
{
string url = "http://iot-api.heclouds.com/datapoint/current-datapoints?product_id=你自己的产品ID&device_name=" + deviceid;//设备地址,多个地址用逗号隔开,注意product_id要修改为自己的产品ID
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
SetHeaderValue(request.Headers, "authorization", "你自己的token");//设备API地址和 首部参数
request.Host = "iot-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();
text_show.Text = retString;
Root on = JsonConvert.DeserializeObject<Root>(retString);
text_show.Text="设备数量:"+ on.data.devices.Count.ToString(); //获取设备个数
foreach (var device in on.data.devices)
{
text_show.Text += ("\r\n设备序号:" + device.id); //获取设备个数
text_show.Text += ("\r\n设备名称:" + device.title); //获取设备个数
text_show.Text += ("\r\n####################################################"); //获取设备个数
foreach (var datastream in device.datastreams)
{
text_show.Text += ("\r\n数据名称:" + datastream.id+" 数值:"+datastream.value.ToString()+" 更新时间:"+datastream.at.ToString()); //获取设备个数
text_show.Text += ("\r\n------------------------------------------------------"); //获取设备个数
}
}
}
5.修改设备参数(此处修改设备的数据更新时间)利用IMEI来识别设备
private void btn_refresh_Click(object sender, EventArgs e) //修改数据更新时间,此命令为缓存命令,即将命令缓存在服务器上,等待设备下次唤醒时再更新
{
string url = "http://api.heclouds.com/nbiot/offline?imei="+text_imei.Text+"&mode=1&obj_id="+text_objid.Text+"&obj_inst_id="+text_obj_inst_id.Text+"&expired_time="+text_time.Text;//设备地址
int updateper = 0 + int.Parse(num_updateper.Value.ToString());
string json = "{ \"data\": [{\"res_id\": 26261,\"val\": "+ updateper .ToString()+ " } ] }";//更新周期定义:水位阈值*1000000+平安更新周期*1000+正常更新周期*10+报警更新周期,如1000480051,阈值单位为mm,更新周期单位分钟,代表平安更新周期是480分钟,正常是5分钟,报警是1分钟
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/json;charset=utf-8";
request.Host = "api.heclouds.com";
request.ProtocolVersion = new Version(1, 1);
string token = CreateAccessKey("products/" + text_m_pid.Text, DateTimeToUnixTimeStamp(DateTime.Now.AddDays(1)).ToString(), text_key.Text, "md5");
SetHeaderValue(request.Headers, "authorization", token);//设备API地址和 首部参数,产品级鉴权
using (StreamWriter writer = new StreamWriter(request.GetRequestStream()))
{
writer.Write(json);
}
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();
text_show.Text = retString;
}