إنتل إديسون Intel IoT Analytics Cloud: إرسال SMS و RESTful Client على ASP.NET

تحليلات Intel IoT
الجزء الأخير من العمل مع Intel IoT Analytics Cloud . إضافة إرسال إشعارات SMS باستخدام بوابات HTTP وإنشاء عميل RESTful بسيط على ASP.NET. تلخيص.

إرسال إشعارات SMS باستخدام بوابة HTTP
في عمل سابق بواسطة Intel Edison. العمل مع سحابة Intel IoT Analytics: إنشاء القواعد وإرسال الإشعارات ؛ تم تشكيل القواعد التي تسمح لك بإرسال: إشعار بالبريد الإلكتروني وإدارة طاقة الترحيل. إرسال رسائل SMS ، إضافة إلى هاتين القاعدتين التي تم إنشاؤها.
قواعد:
  • Higth_temp_PowerOnRelay_and_send_to_web@devdotnet.org
  • Low_temp_PowerOffRelay_and_send_to_web@devdotnet.org

سوف نستخدم بوابة smsc.ru SMS . واجهة برمجة التطبيقات متاحة هنا .

لإرسال رسالة SMS ، يكفي إنشاء وإرسال طلب GET من النموذج:

smsc.ru/sys/send.php؟login=&psw=&phones=&mes= ، حيث:
تسجيل الدخول - تسجيل دخول العميل
- كلمة مرور العميل أو تجزئة كلمة مرور MD5 في الحالة الصغيرة .
الهواتف - الرقم بالتنسيق الدولي بدون علامة "+"
- نص الرسالة المراد إرسالها.
ليست هناك حاجة لإضافة رؤوس ، كل شيء بسيط للغاية. سنشكل

طلبين:
smsc.ru/sys/send.php؟login=tele **** & psw = d46d70eb6 ****** & phones = 79232 ****** & mes = Relay_power_ON
smsc.ru/sys/send. php؟ login = tele **** & psw = d46d70eb6 ****** & phones = 79232 ****** & mes = Relay_power_OFF انتقل
إلى قسم القواعد ، افتح القاعدةHigth_temp_PowerOnRelay_and_send_to_web@devdotnet.org.

أضف نوع الإخطارات - نقطة نهاية HTTP وأدخل عنوان URL .
تحليلات Intel IoT

سنجعل أيضًا Low_temp_PowerOffRelay_and_send_to_web@devdotnet.org للقاعدة الثانية .

تلقى SMS على الهاتف
Intel IoT Analytics

من ناقص وظيفة إرسال الرسائل القصيرة ، من الضروري ملاحظة عدم القدرة على إرسال البيانات الديناميكية ، على سبيل المثال ، لا يمكنك إرسال قراءة المستشعر الحالية.

عميل RESTful بسيط على ASP.NET Razor سنشكل
صفحة تعرض قراءات المستشعر الحالية: درجة الحرارة والضغط. سنضع جزء التحكم على الصفحة: تشغيل التتابع و LED. Cloud API متاح هنا . التنفيذ على ASP.NET Razor netf 4.5. للعمل مع JSON ، يتم استخدام مكتبة Newtonsoft.Json. يحتوي ملف Web.config على تسجيل الدخول وكلمة المرور للوصول إلى السحابة. المثال ليس حلاً كاملاً ، ولكنه عرض بسيط لاستخدام واجهة برمجة التطبيقات.

كالعادة ، نحصل على الرمز المميز ، قسم في تفويض ويكي :
الرمز
string GetNewToken()
            {
                // login  pass
                string strLogin, strPass;
                strLogin = System.Configuration.ConfigurationManager.AppSettings["Login"];
                strPass = System.Configuration.ConfigurationManager.AppSettings["Pass"];
                //,  .
                //https://github.com/enableiot/iotkit-api/wiki/Authorization
                // JSON
                var obj = new
                {
                    username = strLogin,
                    password = strPass
                };
                string postData = JsonConvert.SerializeObject(obj, Formatting.Indented);
                //HttpWebRequest
                HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create("https://dashboard.us.enableiot.com/v1/api/auth/token");
                httpWebRequest.Method = "POST";
                httpWebRequest.ContentType = "application/json";
                //
                byte[] byte1 = System.Text.Encoding.UTF8.GetBytes(postData);
                httpWebRequest.ContentLength = byte1.Length;
                httpWebRequest.GetRequestStream().Write(byte1, 0, byte1.Length);
                httpWebRequest.GetRequestStream().Close();
                //
                StreamReader reader = new StreamReader(httpWebRequest.GetResponse().GetResponseStream());
                JObject objResponse = JObject.Parse(reader.ReadToEnd());
                return (string)objResponse["token"];
            }


قراءة البيانات ، قسم في wiki Data-API :
الرمز
void GetStateSensors(string strToken, Dictionary<string, string> dicSensors)
            {
                // 
                //https://github.com/enableiot/iotkit-api/wiki/Data-API
                // JSON
                var obj = new
                {
                    from = -20,
                    targetFilter = new { deviceList = new[] { "9e-8d-22-0c-50-7b" } },
                    metrics = new[] { new {
						id="99fb5b73-a9e2-4ae0-8a0d-45e6a7cc0541",
						op="none"
					},
                    new {
						id="b3731f8a-4f31-414d-a072-b364b1792b5b",
						op="none"
					}
				}
                };
                string postData = JsonConvert.SerializeObject(obj, Formatting.Indented);
                //HttpWebRequest
                HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create("https://dashboard.us.enableiot.com/v1/api/accounts/4c8c6b2e-c54f-4df5-8bbb-a5e59df85aaa/data/search");
                httpWebRequest.Method = "POST";
                httpWebRequest.ContentType = "application/json";
                //Headers
                httpWebRequest.Headers.Add("Authorization", "Bearer " + strToken);
                httpWebRequest.Headers.Add("accountId", "4c8c6b2e-c54f-4df5-8bbb-a5e59df85aaa");
                //
                byte[] byte1 = System.Text.Encoding.UTF8.GetBytes(postData);
                httpWebRequest.ContentLength = byte1.Length;
                httpWebRequest.GetRequestStream().Write(byte1, 0, byte1.Length);
                httpWebRequest.GetRequestStream().Close();
                //
                StreamReader reader = new StreamReader(httpWebRequest.GetResponse().GetResponseStream());
                JObject objResponse = JObject.Parse(reader.ReadToEnd());
                //add Dic
                string strValueSensor = (string)objResponse["series"][0]["points"][0]["value"];
                dicSensors.Add("pressure", strValueSensor);
                strValueSensor = (string)objResponse["series"][1]["points"][0]["value"];
                strValueSensor = Math.Round(decimal.Parse(strValueSensor, System.Globalization.CultureInfo.CreateSpecificCulture("en")), 2).ToString();
                dicSensors.Add("temperature", strValueSensor);
            }


ملخص الواجهة
تحليلات Intel IoT


تحررك السحابة لجمع البيانات من بناء بنيتك الأساسية ، مما يقلل من تكلفة شراء الأجهزة والبرامج. تكوين الأجهزة ، وأجهزة الاستشعار بسيطة للغاية. لا تسمح واجهة برمجة التطبيقات المطورة بتلقي البيانات وإدارة الجهاز فحسب ، بل أيضًا بإنشاء لوحة الإدارة الخاصة بها. يتم إرسال البيانات دون تأخير كبير ، لا تضيع الطلبات. يتوفر دوران: المسؤول والمستخدم. لإضافة مستخدم ، يحتاج المسؤول إلى تحديد بريد إلكتروني جديد ، وسيتم إرسال رسالة دعوة إلى هذا العنوان. في عملية تسجيل مستخدم جديد ، سيُسأل المستخدم عن قبول دعوة للوصول (دعوة). وبالتالي ، يشارك المستخدم في إدارة حسابه ، بما في ذلك تغييرات كلمة المرور. من العيوبمن المستحيل تضمين قراءات المستشعر في رسالة SMS ، فقط قالب معد مسبقًا. بالنسبة للبريد الإلكتروني ، لا توجد قوالب ، فقط طريقة عرض قياسية مع لوحة قراءة مستشعر. تم اكتشاف ميزة أخرى ، تتكون في تسلسل قواعد المعالجة. في بعض الأحيان لوحظت حالة مع إيقاف تشغيل التتابع مباشرة بعد التشغيل. علاوة على ذلك ، وفقًا لمنطق التتابع ، كان من المفترض أن يتم إيقاف التشغيل فقط بعد انخفاض درجة الحرارة إلى أقل من 28 درجة مئوية. ولم تتضمن شروط منطق القواعد والرمز على الجهاز أخطاء. تم حل الموقف من خلال عرض سجل التنبيهات ، تتم إضافة تنبيهات جديدة إلى نهاية القائمة.في بعض الأحيان لوحظت حالة مع إيقاف تشغيل التتابع مباشرة بعد التشغيل. علاوة على ذلك ، وفقًا لمنطق التتابع ، كان من المفترض أن يتم إيقاف التشغيل فقط بعد انخفاض درجة الحرارة إلى أقل من 28 درجة مئوية. ولم تتضمن شروط منطق القواعد والرمز على الجهاز أخطاء. تم حل الموقف من خلال عرض سجل التنبيهات ، تتم إضافة تنبيهات جديدة إلى نهاية القائمة.في بعض الأحيان لوحظت حالة مع إيقاف تشغيل التتابع مباشرة بعد التشغيل. علاوة على ذلك ، وفقًا لمنطق التتابع ، كان من المفترض أن يتم إيقاف التشغيل فقط بعد انخفاض درجة الحرارة إلى أقل من 28 درجة مئوية. ولم تتضمن شروط منطق القواعد والرمز على الجهاز أخطاء. تم حل الموقف من خلال عرض سجل التنبيهات ، تتم إضافة تنبيهات جديدة إلى نهاية القائمة.
تحليلات Intel IoT
كان الحدث 39 هو آخر حدث يعمل ، على الرغم من أنه سبق الحدث 38 في الوقت المناسب. تم تشغيل التتابع لثانية ، وتم إيقاف تشغيله ، على الرغم من زيادة درجة الحرارة. ربما يرجع ذلك إلى عدم اكتمال الخدمة بعد. حاليًا ، سحابة Intel IoT Analytics قيد التطوير (حالة BETA).

تطبيق
اختبار إصدار العمل من web.devdotnet.org .
المشروع متاح هنا .
مصدر
web.config
<configuration>
  <appSettings>
    <add key="Login" value="***"/>
    <add key="Pass" value="***"/>
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5">
      <assemblies>
        <add assembly="Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add assembly="System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
      </assemblies>
    </compilation>
    <httpRuntime targetFramework="4.5"/>
  </system.web>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>


index.cshtml
@using System.Net.Http
@using Newtonsoft.Json
@using Newtonsoft.Json.Linq

@{
    //   Session
    string strToken;
    strToken = (string)Session["Token"];
    if (strToken == null)
    {
        strToken = GetNewToken();
        Session["Token"] = strToken;
    }
    //Action
    if (Request["command"] != null)
    {
        string strCommand = (string)Request["command"];
        SetSateActuation(strToken,strCommand);
    }
    //  Sensors
    Dictionary<string, string> dicSensors = new Dictionary<string, string>();
    GetStateSensors(strToken, dicSensors);
    //  Actuation
    bool boolValueLED, boolValueRelay;
    GetStateActuations(strToken, out boolValueLED, out boolValueRelay);
}
        @functions {
            // Pass a user name to this method.
            string GetNewToken()
            {
                // login  pass
                string strLogin, strPass;
                strLogin = System.Configuration.ConfigurationManager.AppSettings["Login"];
                strPass = System.Configuration.ConfigurationManager.AppSettings["Pass"];
                //,  .
                //https://github.com/enableiot/iotkit-api/wiki/Authorization
                // JSON
                var obj = new
                {
                    username = strLogin,
                    password = strPass
                };
                string postData = JsonConvert.SerializeObject(obj, Formatting.Indented);
                //HttpWebRequest
                HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create("https://dashboard.us.enableiot.com/v1/api/auth/token");
                httpWebRequest.Method = "POST";
                httpWebRequest.ContentType = "application/json";
                //
                byte[] byte1 = System.Text.Encoding.UTF8.GetBytes(postData);
                httpWebRequest.ContentLength = byte1.Length;
                httpWebRequest.GetRequestStream().Write(byte1, 0, byte1.Length);
                httpWebRequest.GetRequestStream().Close();
                //
                StreamReader reader = new StreamReader(httpWebRequest.GetResponse().GetResponseStream());
                JObject objResponse = JObject.Parse(reader.ReadToEnd());
                return (string)objResponse["token"];
            }
            void GetStateSensors(string strToken, Dictionary<string, string> dicSensors)
            {
                // 
                //https://github.com/enableiot/iotkit-api/wiki/Data-API
                // JSON
                var obj = new
                {
                    from = -20,
                    targetFilter = new { deviceList = new[] { "9e-8d-22-0c-50-7b" } },
                    metrics = new[] { new {
						id="99fb5b73-a9e2-4ae0-8a0d-45e6a7cc0541",
						op="none"
					},
                    new {
						id="b3731f8a-4f31-414d-a072-b364b1792b5b",
						op="none"
					}
				}
                };
                string postData = JsonConvert.SerializeObject(obj, Formatting.Indented);
                //HttpWebRequest
                HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create("https://dashboard.us.enableiot.com/v1/api/accounts/4c8c6b2e-c54f-4df5-8bbb-a5e59df85aaa/data/search");
                httpWebRequest.Method = "POST";
                httpWebRequest.ContentType = "application/json";
                //Headers
                httpWebRequest.Headers.Add("Authorization", "Bearer " + strToken);
                httpWebRequest.Headers.Add("accountId", "4c8c6b2e-c54f-4df5-8bbb-a5e59df85aaa");
                //
                byte[] byte1 = System.Text.Encoding.UTF8.GetBytes(postData);
                httpWebRequest.ContentLength = byte1.Length;
                httpWebRequest.GetRequestStream().Write(byte1, 0, byte1.Length);
                httpWebRequest.GetRequestStream().Close();
                //
                StreamReader reader = new StreamReader(httpWebRequest.GetResponse().GetResponseStream());
                JObject objResponse = JObject.Parse(reader.ReadToEnd());
                //add Dic
                string strValueSensor = (string)objResponse["series"][0]["points"][0]["value"];
                dicSensors.Add("pressure", strValueSensor);
                strValueSensor = (string)objResponse["series"][1]["points"][0]["value"];
                strValueSensor = Math.Round(decimal.Parse(strValueSensor, System.Globalization.CultureInfo.CreateSpecificCulture("en")), 2).ToString();
                dicSensors.Add("temperature", strValueSensor);
            }

            void GetStateActuations(string strToken, out bool boolValueLED, out bool boolValueRelay)
            {
                //  Actuation
                //https://github.com/enableiot/iotkit-api/wiki/Control-Device-API
                //HttpWebRequest
                HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create("https://dashboard.us.enableiot.com/v1/api/accounts/4c8c6b2e-c54f-4df5-8bbb-a5e59df85aaa/control/devices/9e-8d-22-0c-50-7b?from=-60000");
                httpWebRequest.Method = "GET";
                //Headers
                httpWebRequest.Headers.Add("Authorization", "Bearer " + strToken);
                httpWebRequest.Headers.Add("accountId", "4c8c6b2e-c54f-4df5-8bbb-a5e59df85aaa");
                //
                StreamReader reader = new StreamReader(httpWebRequest.GetResponse().GetResponseStream());
                JArray jArr = (JArray)JsonConvert.DeserializeObject(reader.ReadToEnd());
                //Parse data
                Dictionary<long, string> dicSensorLED = new Dictionary<long, string>();
                Dictionary<long, string> dicSensorRelay = new Dictionary<long, string>();
                long longTicks;
                foreach (JObject item in jArr)
                {
                    longTicks = DateTime.Parse((string)item["created"]).Ticks;
                    if ((string)item["command"] == "LED.v1.0")
                    {
                        if (!dicSensorLED.ContainsKey(longTicks)) dicSensorLED.Add(longTicks, (string)item["params"][0]["value"]);
                    }
                    else
                    {
                        if (!dicSensorRelay.ContainsKey(longTicks)) dicSensorRelay.Add(longTicks, (string)item["params"][0]["value"]);
                    }
                }
                //find last value
                string strValueLED = dicSensorLED[dicSensorLED.Max(x => x.Key)];
                string strValueRelay = dicSensorRelay[dicSensorRelay.Max(x => x.Key)];
                //
                if (strValueLED == "0") boolValueLED = false; else boolValueLED = true;
                if (strValueRelay == "0") boolValueRelay = false; else boolValueRelay = true;
                }

            void SetSateActuation(string strToken, string strCommand)
            {
                //  Actuation
                //https://github.com/enableiot/iotkit-api/wiki/Control-Device-API
                // 
                string strComponentId, strName, strValue, strComplexCommands;
                switch (strCommand)
                {
                    case "led_on":
                        {
                            strComponentId="64dbdbee-e181-403f-8b51-0872e11a289e";
                            strName="LED";
                            strValue = "1";
                            strComplexCommands = "led1_ON";
                            break;
                        }
                    case "led_off":
                        {
                            strComponentId = "64dbdbee-e181-403f-8b51-0872e11a289e";
                            strName = "LED";
                            strValue = "0";
                            strComplexCommands = "led1_OFF";
                            break;
                        }
                    case "relay_on":
                        {
                            strComponentId = "5f72e39a-463a-4e57-bac7-9b32debfd865";
                            strName = "RELAY";
                            strValue = "1";
                            strComplexCommands = "relay1_ON";
                            break;
                        }
                    case "relay_off":
                        {
                            strComponentId = "5f72e39a-463a-4e57-bac7-9b32debfd865";
                            strName = "RELAY";
                            strValue = "0";
                            strComplexCommands = "relay1_OFF";
                            break;
                        }
                    default:
                        // You can use the default case.
                        return;
                }
                // JSON
                var obj = new
                {
                    commands = new[] { new {
                    componentId = strComponentId,
                    parameters= new[] { new
                                        {
                                            name=strName,
                                            value=strValue
                                        }
                    },
                    transport="ws"
                }
                },
                    complexCommands = new[] { strComplexCommands }
                };
                string postData = JsonConvert.SerializeObject(obj, Formatting.Indented);
                //HttpWebRequest
                HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create("https://dashboard.us.enableiot.com/v1/api/accounts/4c8c6b2e-c54f-4df5-8bbb-a5e59df85aaa/control");
                httpWebRequest.Method = "POST";
                httpWebRequest.ContentType = "application/json";
                //Headers
                httpWebRequest.Headers.Add("Authorization", "Bearer " + strToken);
                httpWebRequest.Headers.Add("accountId", "4c8c6b2e-c54f-4df5-8bbb-a5e59df85aaa");
                //
                byte[] byte1 = System.Text.Encoding.UTF8.GetBytes(postData);
                httpWebRequest.ContentLength = byte1.Length;
                httpWebRequest.GetRequestStream().Write(byte1, 0, byte1.Length);
                httpWebRequest.GetRequestStream().Close();
                //
                httpWebRequest.GetResponse();
                }
            }
        }

        <html>
        <head>
            <title> RESTful   Intel IoT Analytics  ASP.NET Razor</title>
        </head>
        <body>
            <h1> RESTful   Intel IoT Analytics  ASP.NET Razor</h1>
<p>: @DateTime.Now.ToString()</p>
    <p>   <a href="https://github.com/enableiot/iotkit-api/wiki/Api-Home">api  intel iot analytics.</a></p>
    <p>  API :</p>
    <ol>
        <li>,  </li>
        <li>   (sensor)</li>
        <li>   (Actuation)</li>
    </ol>
    <h3> </h3>
    <p>: @dicSensors["temperature"] *</p>
    <p>: @dicSensors["pressure"] </p>
     @if (boolValueLED==false)
        {
            <p>LED: OFF</p>
        }
     else
     {
        <p>LED: ON</p>
     }

    @if (boolValueRelay == false)
    {
        <p>: OFF</p>
    }
    else
    {
        <p>: ON</p>
    }
    <form name="formaction" action="~/index.cshtml" method="get">
        <h3> Actuation</h3>
        <p> LED: 
            <button name="command" type="submit" value="led_on"> ON </button>
            <button name="command" type="submit" value="led_off"> OFF </button>
        </p>
        <p> : 
            <button name="command" type="submit" value="relay_on"> ON </button>
            <button name="command" type="submit" value="relay_off"> OFF </button>
        </p>
        <p></p>
        <p>
            <button name="update" type="submit">   </button>
        </p>
    </form>
</body>
</html>


جدول المحتويات
  1. إنتل إديسون البداية الأولى
  2. إنتل إديسون العمل مع Intel IoT Analytics Cloud: تسجيل البيانات وإرسالها
  3. إنتل إديسون العمل مع Intel IoT Analytics Cloud: إنشاء القواعد وإرسال الإشعارات
  4. إنتل إديسون Intel IoT Analytics Cloud: إرسال SMS و RESTful Client على ASP.NET

Source: https://habr.com/ru/post/ar384929/


All Articles