C#实现onetnet平台的设备添加,数据读取,属性修改等常见功能

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;
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值