{"id":277150,"date":"2016-03-29T10:33:03","date_gmt":"2016-03-29T06:33:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=277150"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=277150","title":{"rendered":"Alljoyn: \u0432\u0437\u0433\u043b\u044f\u0434 embedded \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430. \u0427\u0430\u0441\u0442\u044c 3: \u041f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043d\u0430 \u041c\u041a SAMD21"},"content":{"rendered":"<p>       <iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"https:\/\/www.youtube.com\/embed\/9zMct9rVH3w?feature=oembed\" frameborder=\"0\" allowfullscreen><\/iframe><br \/>  \u0412 <a href=\"https:\/\/habrahabr.ru\/company\/rainbow\/blog\/273859\/\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445<\/a> \u043c\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043b\u0438\u0441\u044c \u0441 \u043e\u0441\u043d\u043e\u0432\u0430\u043c\u0438 Alljoyn \u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438, \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0449\u0438\u043c\u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0435. \u041f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 \u0434\u043b\u044f \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430. \u041a\u0440\u0430\u0442\u043a\u043e \u043d\u0430\u043f\u043e\u043c\u043d\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 LSF (Lighting Software Framework).<br \/>  \u0412 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 LSF \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e \u0442\u0440\u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438:  <\/p>\n<ul>\n<li>Thin-\u043b\u0430\u043c\u043f\u043e\u0447\u043a\u0430 (lamp service),<\/li>\n<li>Router (lighting controller service),<\/li>\n<li>\u00ab\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u00bb (lighting sample application).<\/li>\n<\/ul>\n<p>  Thin-\u043b\u0430\u043c\u043f\u043e\u0447\u043a\u0430 \u044d\u0442\u043e \u0442\u0430 \u0447\u0430\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u00ab\u043a\u0440\u0443\u0442\u0438\u0442\u0441\u044f\u00bb \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435 \u043d\u0430\u0448\u0435\u0439 \u0443\u043c\u043d\u043e\u0439 \u043b\u0430\u043c\u043f\u043e\u0447\u043a\u0438. \u0418\u043c\u0435\u043d\u043d\u043e \u0435\u044e \u043c\u044b \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0438 \u0437\u0430\u0439\u043c\u0435\u043c\u0441\u044f. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0431\u044b\u043b\u043e \u0432\u0435\u0441\u044c\u043c\u0430 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0440\u0430\u043d\u0435\u0435, \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0440\u0430\u0437 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u0431\u0443\u0434\u0435\u043c.<a name=\"habracut\"><\/a><\/p>\n<p>  \u0413\u043b\u0430\u0432\u043d\u043e\u0435, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043b\u0438\u0446\u0430 \u0431\u044b\u043b\u0438 \u0432 \u043e\u0434\u043d\u043e\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438, \u0430 Router \u0431\u044b\u043b \u00ab\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439\u00bb (\u0441\u043c. <a href=\"https:\/\/habrahabr.ru\/company\/rainbow\/blog\/273859\/\">\u043f\u0435\u0440\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0446\u0438\u043a\u043b\u0430<\/a>).<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/eca\/110\/9cb\/eca1109cbdd143a2a9a4e596cd8b3038.png\"\/>  <\/p>\n<h5>\u041d\u0430\u0448\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f<\/h5>\n<p>  \u0412 \u0440\u043e\u043b\u0438 \u00ab\u043b\u0430\u043c\u043f\u043e\u0447\u043a\u0438\u00bb (\u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438) \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u0430\u044f \u043f\u043b\u0430\u0442\u0430 \u0441 <a href=\"http:\/\/www.atmel.com\/tools\/ATSAMD21-XPRO.aspx?tab=overview\">samd21<\/a> \u0438 <a href=\"http:\/\/www.atmel.com\/tools\/ATWINC1500-XPRO.aspx\">wifi \u043c\u043e\u0434\u0443\u043b\u0435\u043c winc 1500<\/a>, \u0432 \u0440\u043e\u043b\u0438 Router&#8217;\u0430 \u2014 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0432 Ubuntu <b>lighting controller service<\/b>. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c sample app LSF \u043d\u0430 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0435 Android, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0441 \u0441\u0430\u0439\u0442\u0430 Allseen \u0430\u043b\u044c\u044f\u043d\u0441\u0430 \u0441\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 <a href=\"https:\/\/wiki.allseenalliance.org\/tsc\/connected_lighting\">\u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u0433\u0440\u0443\u043f\u043f\u044b<\/a>.<\/p>\n<p>  \u041a\u043e\u0434 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0439 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u043f\u0438\u0441\u0430\u043b\u0441\u044f \u043d\u0430 \u0431\u0430\u0437\u0435 \u043a\u043e\u0434\u0430 \u0434\u043b\u044f arduino (Thin Core) \u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043d\u0430 <a href=\"https:\/\/git.allseenalliance.org\/cgit\/lighting\/service_framework.git\/tree\/thin_core_library\/lamp_service?id=v15.04\">\u0433\u0438\u0442\u0445\u0430\u0431\u0435 \u0434\u043b\u044f \u00ab\u043b\u0430\u043c\u043f\u043e\u0447\u043a\u0438\u00bb<\/a>. \u041a\u0430\u043a \u043d\u0430\u043c \u0442\u043e\u0433\u0434\u0430 \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u044d\u0442\u043e \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0431\u043b\u0438\u0437\u043a\u0438\u0439 \u043a \u0447\u0438\u0441\u0442\u043e\u043c\u0443 \u0421\u0438 \u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043a\u0438 \u043f\u0440\u0438\u043c\u0435\u0440. \u041d\u043e \u043a\u0430\u043a \u043f\u043e\u0437\u0436\u0435 \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u043e\u0441\u044c, \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0432\u043e \u043c\u043d\u043e\u0433\u043e\u043c \u043d\u0435 \u0434\u043e\u0434\u0435\u043b\u0430\u043d \u0438 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0434\u0430\u0436\u0435 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 Thin \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u0422\u0430\u043a \u0447\u0442\u043e \u0434\u043e\u0434\u0435\u043b\u044b\u0432\u0430\u0442\u044c\/\u043f\u0435\u0440\u0435\u0434\u0435\u043b\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043c\u043d\u043e\u0433\u043e.<br \/>  \u0412\u0435\u0441\u044c \u043a\u043e\u0434 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 3 \u0447\u0430\u0441\u0442\u0438: \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 Thin Core Alljoyn, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u00ab\u043b\u0430\u043c\u043f\u044b\u00bb LSF, \u0438 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 (hal \u0443\u0440\u043e\u0432\u0435\u043d\u044c, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438).<\/p>\n<h5>\u041a\u043e\u0434 \u0434\u043b\u044f Thin Core<\/h5>\n<p>  \u041f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c hal \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0434\u043b\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u0445\u043e\u0434\u0430 \u0432 \u0441\u0435\u0442\u044c. \u0423 \u043d\u0430\u0441 \u043e\u043d \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u043e\u0434\u043d\u044f\u0442\u0438\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043f\u043e UDP (\u0434\u043b\u044f \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u043e\u0433\u043e \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u044f Thin \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 \u0441\u0435\u0442\u0438 Alljoyn \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e mdns), \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435\/\u043f\u0440\u0438\u0435\u043c\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e UDP, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u043d\u044f\u0442\u0438\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043f\u043e TCP \u0438 \u043f\u0440\u0438\u0435\u043c\u0435\/\u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u0441\u0435\u0442\u0438. <br \/>  \u0412\u0441\u0435 \u044d\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 aj_net.\u0441.<br \/>  \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 \u0431\u044b\u043b\u043e \u0442\u043e, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0441\u0435\u0442\u044c\u044e \u0432 arduino \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043f\u043e \u0444\u043b\u0430\u0433\u0443, \u0430 \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u0434\u043b\u044f winc \u043f\u043e \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044e, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f winc \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u0435\u043d \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u043f\u0440\u043e\u0441\u0430 \u0444\u043b\u0430\u0433\u043e\u0432, \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u043c. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u0440\u043e \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 winc1500 \u043c\u044b \u043f\u0438\u0441\u0430\u043b\u0438 \u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043d\u0430\u0448\u0438\u0445 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 <a href=\"https:\/\/habrahabr.ru\/company\/rainbow\/blog\/275359\/\">\u0441\u0442\u0430\u0442\u0435\u0439<\/a>. <br \/>  \u041d\u0430\u0447\u0430\u0442\u044c \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c hal \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043f\u0440\u043e\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043f\u043e UDP \u0438 TCP. \u0412 \u043d\u0438\u0445 \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044e: \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u0438\u0435\u043c\u0430\/\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0438 \u0431\u0443\u0444\u0435\u0440\u044b \u043f\u0440\u0438\u0435\u043c\u0430\/\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u0434 \u0434\u043b\u044f UDP (\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 main)<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">AJ_Status AJ_Net_MCastUp(AJ_NetSocket* netSock) {     uint8_t ret = 1;     if (ret != 1)     {         return AJ_ERR_READ;     }     else      { \t\tnetSock-&gt;rx.bufStart = udp_data_rx; \t\tnetSock-&gt;rx.bufSize = sizeof(udp_data_rx); \t\tnetSock-&gt;rx.readPtr = udp_data_rx; \t\tnetSock-&gt;rx.writePtr = udp_data_rx; \t\tnetSock-&gt;rx.direction = AJ_IO_BUF_RX;                 netSock-&gt;rx.recv = AJ_Net_RecvFrom; \t\tnetSock-&gt;tx.bufStart = udp_data_tx; \t\tnetSock-&gt;tx.bufSize = sizeof(udp_data_tx); \t\tnetSock-&gt;tx.readPtr = udp_data_tx; \t\tnetSock-&gt;tx.writePtr = udp_data_tx; \t\tnetSock-&gt;tx.direction = AJ_IO_BUF_TX;                 netSock-&gt;tx.send = AJ_Net_SendTo;     }     return AJ_OK; }  int main(void) { ... \/\/ Initialize socket address structure. \taddr.sin_family = AF_INET; \taddr.sin_port = _htons(MAIN_WIFI_M2M_SERVER_PORT); \taddr.sin_addr.s_addr = _htonl(MAIN_WIFI_M2M_SERVER_IP); \t\t \tsrc_addr.sin_family = AF_INET; \tsrc_addr.sin_port = _htons(MAIN_WIFI_M2M_SERVER_PORT); \t\/\/_htons(52148); \tsrc_addr.sin_addr.s_addr = _htonl(MAIN_WIFI_M2M_SERVER_IP); \t\t\t\t \t\/\/ Initialize Wi-Fi parameters structure. \tmemset((uint8_t *)&param, 0, sizeof(tstrWifiInitParam)); \t \/\/ Initialize Wi-Fi driver with data and status callbacks.         param.pfAppWifiCb = wifi_cb; \tret = m2m_wifi_init(&param); \tif (M2M_SUCCESS != ret) \t{ \t   printf(&quot;main: m2m_wifi_init call error!(%d)\\r\\n&quot;, ret); \t   while (1); \t} \t\/\/ Initialize socket module \tsocketInit(); \tregisterSocketCallback(socket_cb, NULL);  \t\/\/ Connect to router. \tm2m_wifi_connect((char *)MAIN_WLAN_SSID, sizeof(MAIN_WLAN_SSID), MAIN_WLAN_AUTH, (char *)MAIN_WLAN_PSK, M2M_WIFI_CH_ALL); \tprintf(&quot;m2m_wifi_connect!\\r\\n&quot;); ... } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u0434 \u0434\u043b\u044f TCP<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">AJ_Status AJ_Net_Connect(AJ_BusAttachment* bus, const AJ_Service* service) {     int ret;      if (!(service-&gt;addrTypes & AJ_ADDR_TCP4))      {         return AJ_ERR_CONNECT;     }             printf(&quot;AJ_Net_Connect()\\n&quot;);         addr.sin_port = _htons(service-&gt;ipv4port);         addr.sin_addr.s_addr = _htonl(service-&gt;ipv4); \tprintf(&quot;AJ_Net_Connect(): ipv4= %x, port = %d\\n&quot;,addr.sin_addr.s_addr,\taddr.sin_port);         tcp_client_socket = socket(AF_INET, SOCK_STREAM, 0); \tret=connect(tcp_client_socket, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)); \tprintf(&quot;AJ_Net_Connect(): connect\\n&quot;); \twhile(tcp_ready_to_send==0) \t{ \t\tm2m_wifi_handle_events(NULL); \t} \t printf(&quot;AJ_Net_Connect(): connect OK\\n&quot;);         if (ret == -1)  \t{            return AJ_ERR_CONNECT;         }  \telse \t{           bus-&gt;sock.rx.bufStart = AJ_in_data_tcp;           bus-&gt;sock.rx.bufSize = sizeof(AJ_in_data_tcp);           bus-&gt;sock.rx.readPtr = AJ_in_data_tcp;           bus-&gt;sock.rx.writePtr = AJ_in_data_tcp;           bus-&gt;sock.rx.direction = AJ_IO_BUF_RX;           bus-&gt;sock.rx.recv = AJ_Net_Recv;           bus-&gt;sock.tx.bufStart = tcp_data_tx;           bus-&gt;sock.tx.bufSize = sizeof(tcp_data_tx);           bus-&gt;sock.tx.readPtr = tcp_data_tx;           bus-&gt;sock.tx.writePtr = tcp_data_tx;           bus-&gt;sock.tx.direction = AJ_IO_BUF_TX;           bus-&gt;sock.tx.send = AJ_Net_Send;           printf(&quot;AJ_Net_Connect(): connect() success: status=AJ_OK\\n&quot;);           return AJ_OK;     }     printf(&quot;AJ_Net_Connect(): connect() failed: %d: status=AJ_ERR_CONNECT\\n&quot;, ret);     return AJ_ERR_CONNECT; } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041f\u043e UDP \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c mdns \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u043d\u0438\u0445. \u041f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u043f\u043e\u0441\u044b\u043b\u043a\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0435\u0441\u0442\u044c \u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u043d\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443. \u0415\u0441\u043b\u0438 \u0434\u0430, \u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0444\u043b\u0430\u0433\u043e\u0432. \u0415\u0441\u043b\u0438 \u0444\u043b\u0430\u0433 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d (\u043e\u043d \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 callback&#8217;\u0435), \u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0443\u0441\u043f\u0435\u0448\u043d\u043e, \u0438\u043d\u0430\u0447\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 \u0437\u0430\u043f\u0438\u0441\u0438.  <\/p>\n<pre><code class=\"cpp\">AJ_Status AJ_Net_SendTo(AJ_IOBuffer* buf) {     int ret;     uint32_t tx = AJ_IO_BUF_AVAIL(buf);     if (tx &gt; 0)     {        ret = sendto(rx_socket, buf-&gt;readPtr, tx, 0, (struct sockaddr *)&addr, sizeof(addr));        m2m_wifi_handle_events(NULL);        if (sock_tx_state != 1)         {             return AJ_ERR_WRITE;        }         buf-&gt;readPtr += ret;     }     AJ_IO_BUF_RESET(buf);     return AJ_OK; } <\/code><\/pre>\n<p>  \u041f\u0440\u0438 \u043f\u0440\u0438\u0435\u043c\u0435 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0441 \u0432\u044b\u0445\u043e\u0434\u043e\u043c \u043f\u043e \u0442\u0430\u0439\u043c-\u0430\u0443\u0442\u0443 \u0438\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u043f\u043e\u0441\u044b\u043b\u043a\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u0440\u0438\u0435\u043c\u0430 \u0438 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0444\u043b\u0430\u0433\u043e\u0432. \u0417\u043d\u0430\u0442\u043e\u043a\u0438 arduino \u0437\u0430\u043c\u0435\u0442\u044f\u0442, \u0447\u0442\u043e \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e millis (\u043e\u043d\u0430 \u0431\u044b\u043b\u0430 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043d\u0430 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043d\u0430\u0448\u0438\u043c\u0438 \u0440\u0435\u0430\u043b\u0438\u044f\u043c\u0438). \u0415\u0441\u043b\u0438 \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u0441\u044b\u043b\u043a\u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0435\u043b \u043f\u043e \u0442\u0430\u0439\u043c-\u0430\u0443\u0442\u0443, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u0447\u0442\u0435\u043d\u0438\u044f, \u0438\u043d\u0430\u0447\u0435 \u0441\u0442\u0430\u0442\u0443\u0441 AJ_OK.  <\/p>\n<pre><code class=\"cpp\">AJ_Status AJ_Net_RecvFrom(AJ_IOBuffer* buf, uint32_t len, uint32_t timeout) {     AJ_Status status = AJ_OK;     int ret;     uint32_t rx = AJ_IO_BUF_SPACE(buf);     unsigned long Recv_lastCall = millis();      while ((sock_rx_state==0) && (millis() - Recv_lastCall &lt; timeout))     { \trecv(rx_socket, udp_data_rx, MAIN_WIFI_M2M_BUFFER_SIZE, 0); \tm2m_wifi_handle_events(NULL);\t\t     }     ret=sock_rx_state;     if (ret == -1)      {         printf(&quot;AJ_Net_RecvFrom(): read() fails. status=AJ_ERR_READ\\n&quot;);         status = AJ_ERR_READ;     }     else     {         if (ret != -1)  \t{             AJ_DumpBytes(&quot;AJ_Net_RecvFrom&quot;, buf-&gt;writePtr, ret);         }         buf-&gt;writePtr += ret;         status = AJ_OK;     }     printf(&quot;AJ_Net_RecvFrom(): status=%s\\n&quot;, AJ_StatusText(status));     return status; } <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u0435\u043c\u0430\/\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043f\u043e TCP. \u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u043c\u0430\u043b\u043e \u0447\u0435\u043c \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043f\u043e UDP.  <\/p>\n<pre><code class=\"cpp\">AJ_Status AJ_Net_Send(AJ_IOBuffer* buf) {     uint32_t ret;     uint32_t tx = AJ_IO_BUF_AVAIL(buf);      printf(&quot;AJ_Net_Send(buf=0x%p)\\n&quot;, buf);     if (tx &gt; 0)      { \tsend(tcp_client_socket, buf-&gt;readPtr, tx, 0);         buf-&gt;readPtr += tcp_tx_ready; \ttcp_tx_ready=0;     }     AJ_IO_BUF_RESET(buf);     return AJ_OK; } <\/code><\/pre>\n<p>  \u0410 \u0432\u043e\u0442 \u0441 \u043f\u0440\u0438\u0435\u043c\u043e\u043c \u0432\u0441\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435. \u041e\u0431\u0449\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0442\u0430\u043a\u043e\u0439 \u0436\u0435, \u043a\u0430\u043a \u0432 UDP, \u043d\u043e \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u043a\u043e\u0434\u0430\u0445 \u0431\u044b\u043b\u0430 \u0435\u0449\u0435 \u043a\u0443\u0447\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a, \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043e\u043d\u0438 \u0442\u0430\u043c \u0434\u0435\u043b\u0430\u044e\u0442 \u0438 \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u043d\u0438 \u043d\u0443\u0436\u043d\u044b \u043c\u043d\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0430 \u0442\u043e\u0442 \u043a\u043e\u0434.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0440\u0438\u0435\u043c \u043f\u043e TCP<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">AJ_Status AJ_Net_Recv(AJ_IOBuffer* buf, uint32_t len, uint32_t timeout) {     AJ_Status status = AJ_ERR_READ;     uint32_t ret;     uint32_t rx = AJ_IO_BUF_SPACE(buf);     uint32_t recvd = 0;     unsigned long Recv_lastCall = millis();      \/\/ first we need to clear out our buffer     uint32_t M = 0;     if (rxLeftover != 0)     { \t\/\/ there was something leftover from before, \t\tM = min(rx, rxLeftover); \t\tmemcpy(buf-&gt;writePtr, rxDataStash, M);  \/\/ copy leftover into buffer. \t\tbuf-&gt;writePtr += M;  \/\/ move the data pointer over \t\tmemmove(rxDataStash, rxDataStash + M, rxLeftover - M); \/\/ shift left-overs toward the start. \t\trxLeftover -= M; \t\trecvd += M; \t\t\/\/ we have read as many bytes as we can \t\t\/\/ higher level isn't requesting any more \t\tif (recvd == rx) \t\t{  \t\t\treturn AJ_OK; \t\t} \t} \tif ((M != 0) && (rxLeftover != 0))  \t{ \t   printf(&quot;AJ_Net_REcv(): M was: %d, rxLeftover was: %d\\n&quot;, M, rxLeftover); \t} \twhile ((tcp_rx_ready==0) && (millis() - Recv_lastCall &lt; timeout)) \t{ \t\trecv(tcp_client_socket, tcp_data_rx, sizeof(tcp_data_rx), 0);\t \t\tm2m_wifi_handle_events(NULL); \t}          if (tcp_rx_ready==0)  \t{ \t\tprintf(&quot;AJ_Net_Recv(): timeout. status=AJ_ERR_TIMEOUT\\n&quot;);                 status = AJ_ERR_TIMEOUT;         }  \telse \t{     \t   memcpy(AJ_in_data_tcp, tcp_data_rx,tcp_rx_ready); \t   uint32_t askFor = rx; \t   askFor -= M; \t   ret=tcp_rx_ready; \t   if (askFor &lt; ret)  \t   { \t\t   printf(&quot;AJ_Net_Recv(): BUFFER OVERRUN: askFor=%u, ret=%u\\n&quot;, askFor, ret); \t   }            if (ret == -1)  \t   { \t        printf(&quot;AJ_Net_Recv(): read() failed. status=AJ_ERR_READ\\n&quot;); \t        status = AJ_ERR_READ; \t   }  \t   else \t   { \t        AJ_DumpBytes(&quot;Recv&quot;, buf-&gt;writePtr, ret); \t        if (ret &gt; askFor)  \t\t{ \t\t        printf(&quot;AJ_Net_Recv(): new leftover %d\\n&quot;, ret - askFor); \t\t        \/\/ now shove the extra into the stash \t\t        memcpy(rxDataStash + rxLeftover, buf-&gt;writePtr + askFor, ret - askFor); \t\t        rxLeftover += (ret - askFor); \t\t        buf-&gt;writePtr += rx; \t\t} \t\telse \t\t{ \t\t        buf-&gt;writePtr += ret; \t        } \t        status = AJ_OK;         }     }     tcp_rx_ready=0;     return status; } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0415\u0449\u0435 \u043e\u0434\u0438\u043d \u0432\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u2014 LocalGUID \u2014 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 (\u0441\u043c. <a href=\"https:\/\/habrahabr.ru\/company\/rainbow\/blog\/278845\/\">\u0432\u0442\u043e\u0440\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u0438<\/a>), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0447\u0435\u0441\u0442\u043d\u043e \u043f\u043e\u0437\u0430\u0438\u043c\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0438 (\u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438) \u0443 \u043b\u0430\u043c\u043f\u043e\u0447\u043a\u0438, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043d\u0430 \u043b\u0438\u043d\u0443\u043a\u0441\u0435.<br \/>  \u041e\u0434\u043d\u043e \u0438\u0437 \u0432\u0430\u0436\u043d\u044b\u0445 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439: \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 mdns ip \u0430\u0434\u0440\u0435\u0441 \u043b\u0430\u043c\u043f\u043e\u0447\u043a\u0438 \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u044f\u0432\u043d\u043e. \u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0440\u0443\u0447\u043a\u0430\u043c\u0438, \u0442\u043e \u043d\u0430\u0434\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u043d\u043e\u0433\u043e ip \u0430\u0434\u0440\u0435\u0441\u0430 (\u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c dhcp \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0430\u0434\u0440\u0435\u0441\u0430 \u0432 \u0441\u0435\u0442\u0438) \u0438 \u0435\u0433\u043e \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u043f\u0430\u043a\u0435\u0442. \u042d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0435: aj_disco.c \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438: ComposeMDnsReq(&#8230;).<\/p>\n<h5>\u041a\u043e\u0434 \u0434\u043b\u044f \u00ab\u043b\u0430\u043c\u043f\u043e\u0447\u043a\u0438\u00bb<\/h5>\n<p>  \u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0435\u043c \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0430\u043c\u043e\u0439 \u00ab\u043b\u0430\u043c\u043f\u043e\u0447\u043a\u0438\u00bb \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0445 LSF. \u0414\u043b\u044f \u0438\u043d\u0434\u0438\u043a\u0430\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u0430\u043a \u043b\u0430\u043c\u043f\u043e\u0447\u043a\u0438 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434 \u043d\u0430 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0435. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 \u0436\u0435\u043b\u0435\u0437\u0435 \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c\/\u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434.<\/p>\n<p>  \u0412 \u0445\u043e\u0434\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u00ab\u0437\u0430\u0441\u0442\u0430\u0432\u0438\u043b\u0438\u00bb \u0435\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u041f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u0438\u0445 \u0432\u0441\u0435 \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u043c, \u043e\u0442\u043c\u0435\u0442\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0436\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b.<\/p>\n<p>  HAL \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u00ab\u043b\u0430\u043c\u043f\u043e\u0447\u043a\u043e\u0439\u00bb \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <b>OEM_LS_TransitionStateFields<\/b>, \u0444\u0430\u0439\u043b <b>OEM_LS_Code.c<\/b>. \u041c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043c\u0435\u043d\u0435\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e, \u043d\u043e \u0442\u0430\u043a \u043a\u0430\u043a hal \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\/\u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u043d\u0435 \u0441\u0442\u0430\u043b\u0438 \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u043d\u0430 \u044d\u0442\u043e \u043c\u043d\u043e\u0433\u043e \u0441\u0438\u043b \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.  <\/p>\n<pre><code class=\"cpp\">LampResponseCode OEM_LS_TransitionStateFields(LampStateContainer* newStateContainer, uint64_t timestamp, uint32_t transitionPeriod) {     \/\/OEMs should do the following operations just before transitioning the state         LampState state;     \/* Retrieve the current state of the Lamp *\/     LAMP_GetState(&state);     \/* Update the requisite fields to new values *\/     if (newStateContainer-&gt;stateFieldIndicators & LAMP_STATE_ON_OFF_FIELD_INDICATOR)  \t{         state.onOff = newStateContainer-&gt;state.onOff;         printf(&quot;%s: Updating OnOff to %u\\n&quot;, __func__, state.onOff); \t\tprintf(&quot;----------------state.onOff=%d-----------------------\\n&quot;,state.onOff); \t\tif (state.onOff==1) \t\t{ \t\t\tport_pin_set_output_level(LED_0_PIN, LED_0_ACTIVE); \t\t} \t\telse \t\t{ \t\t\tport_pin_set_output_level(LED_0_PIN, LED_0_INACTIVE); \t\t}\t\t     } ... } <\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0438\u043c\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0444\u0430\u0439\u043b\u0430 <b>OEM_LS_Provisioning.c<\/b>.<\/p>\n<p>  \u0412\u0441\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u0438 \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043d\u0435\u043a\u0443\u044e NVRAM. \u041a\u0430\u043a \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043c\u044b \u043d\u0435 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0435\u0437\u0434\u0435 \u0433\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0437\u0430\u043f\u0438\u0441\u044c\/\u0447\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 NVRAM \u043c\u044b \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0438 \u043a\u043e\u0434 \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0432 \u043d\u0430\u0448\u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u044f\u0445.<\/p>\n<p>  \u041f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u00ab\u0433\u0440\u0430\u0431\u043b\u0438\u00bb, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043d\u0430\u0441\u0442\u0443\u043f\u0430\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e (\u0431\u044b\u043b\u0438 \u0438 \u0442\u0443\u043f\u0438\u043a\u043e\u0432\u044b\u0435 \u0432\u0435\u0442\u0432\u0438, \u0447\u0430\u0441\u0442\u044c \u0437\u0430\u0431\u044b\u043b\u0430\u0441\u044c). \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u043b\u0438 \u043e \u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u0445 \u0438\u0445 \u00ab\u043e\u0442\u043b\u043e\u0432\u0430\u00bb \u2014 \u0431\u0440\u0430\u0442\u044c \u0437\u0430\u0432\u0435\u0434\u043e\u043c\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u0434 linux), \u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 WireShark \u043e\u0431\u043c\u0435\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c. <br \/>  \u041d\u043e \u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u00ab\u0433\u0440\u0430\u0431\u043b\u0438\u00bb \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u044b, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0443\u043c\u0438\u043b\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0435\u0439 \u043f\u0440\u043e\u0434\u0443\u043c\u0430\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u0438, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u043e\u0439 (\u043d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e!). \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u043d\u0430 \u0432\u0438\u0434\u0435\u043e \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p>  \u041a\u043e\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432\u044b\u043b\u043e\u0436\u0435\u043d \u043d\u0430 <a href=\"https:\/\/github.com\/marus-ka\/alljoyn_lsf_lamp\">\u0433\u0438\u0442\u0445\u0430\u0431<\/a>               <\/p>\n<div class=\"clear\"><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habrahabr.ru\/post\/278363\/\"> https:\/\/habrahabr.ru\/post\/278363\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>       <iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"https:\/\/www.youtube.com\/embed\/9zMct9rVH3w?feature=oembed\" frameborder=\"0\" allowfullscreen><\/iframe><br \/>  \u0412 <a href=\"https:\/\/habrahabr.ru\/company\/rainbow\/blog\/273859\/\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445<\/a> \u043c\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043b\u0438\u0441\u044c \u0441 \u043e\u0441\u043d\u043e\u0432\u0430\u043c\u0438 Alljoyn \u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438, \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0449\u0438\u043c\u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0435. \u041f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 \u0434\u043b\u044f \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430. \u041a\u0440\u0430\u0442\u043a\u043e \u043d\u0430\u043f\u043e\u043c\u043d\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 LSF (Lighting Software Framework).<br \/>  \u0412 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 LSF \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e \u0442\u0440\u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438:  <\/p>\n<ul>\n<li>Thin-\u043b\u0430\u043c\u043f\u043e\u0447\u043a\u0430 (lamp service),<\/li>\n<li>Router (lighting controller service),<\/li>\n<li>\u00ab\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u00bb (lighting sample application).<\/li>\n<\/ul>\n<p>  Thin-\u043b\u0430\u043c\u043f\u043e\u0447\u043a\u0430 \u044d\u0442\u043e \u0442\u0430 \u0447\u0430\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u00ab\u043a\u0440\u0443\u0442\u0438\u0442\u0441\u044f\u00bb \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435 \u043d\u0430\u0448\u0435\u0439 \u0443\u043c\u043d\u043e\u0439 \u043b\u0430\u043c\u043f\u043e\u0447\u043a\u0438. \u0418\u043c\u0435\u043d\u043d\u043e \u0435\u044e \u043c\u044b \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0438 \u0437\u0430\u0439\u043c\u0435\u043c\u0441\u044f. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0431\u044b\u043b\u043e \u0432\u0435\u0441\u044c\u043c\u0430 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0440\u0430\u043d\u0435\u0435, \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0440\u0430\u0437 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u0431\u0443\u0434\u0435\u043c.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-277150","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/277150","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=277150"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/277150\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=277150"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=277150"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=277150"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}