{"id":131,"date":"2023-03-02T10:22:42","date_gmt":"2023-03-02T02:22:42","guid":{"rendered":"http:\/\/111.229.253.159\/?p=131"},"modified":"2025-12-25T15:40:37","modified_gmt":"2025-12-25T07:40:37","slug":"%e7%89%a9%e8%81%94%e7%bd%91%e6%8b%8d%e7%85%a7%e6%89%93%e5%8d%a1%e5%83%8f%e6%9c%ba","status":"publish","type":"post","link":"https:\/\/niuguodong.com\/index.php\/2023\/03\/02\/%e7%89%a9%e8%81%94%e7%bd%91%e6%8b%8d%e7%85%a7%e6%89%93%e5%8d%a1%e5%83%8f%e6%9c%ba\/","title":{"rendered":"\u7269\u8054\u7f51\u62cd\u7167\u6253\u5361\u50cf\u673a"},"content":{"rendered":"\n<p>\u63d0\u5230\u76d1\u63a7\u8bbe\u5907\uff0c\u4eba\u4eec\u4f1a\u9996\u5148\u60f3\u5230\u76d1\u63a7\u6444\u50cf\u5934\uff0c\u8fd9\u79cd\u76d1\u63a7\u8bbe\u5907\u6240\u4f20\u8f93\u7684\u6570\u636e\u662f\u89c6\u9891\u6570\u636e\uff0c\u800c\u672c\u8bbe\u8ba1\u7684\u7269\u8054\u7f51\u5728\u7ebf\u76f8\u673a\u7ec8\u7aef\u7cfb\u7edf\u6240\u8981\u4f20\u8f93\u7684\u662f\u56fe\u7247\u6570\u636e\uff0c\u5728\u63d0\u4f9b\u5b9a\u65f6\u76d1\u63a7\u80fd\u529b\u7684\u540c\u65f6\uff0c\u63d0\u4f9b\u4e00\u4e2a\u66f4\u8f7b\u91cf\u7ea7\u3001\u6d88\u8017\u6570\u636e\u91cf\u66f4\u5c0f\u3001\u66f4\u7a33\u5b9a\u3001\u529f\u80fd\u66f4\u5b9e\u7528\u7684\u7269\u8054\u7f51\u5728\u7ebf\u76f8\u673a\u7ec8\u7aef\u7cfb\u7edf\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u7279\u6027<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u7269\u8054\u7f51\u5728\u7ebf\u76f8\u673a\u7ec8\u7aef\u7cfb\u7edf\u57fa\u4e8eFreeRTOS\u5b9e\u65f6\u64cd\u4f5c\u7cfb\u7edf\u8bbe\u8ba1\u3002<\/li>\n\n\n\n<li>\u901a\u8fc7\u57fa\u4e8eTCP\u7684\u81ea\u5b9a\u4e49IoT\u901a\u4fe1\u534f\u8bae\u8fde\u63a5\u5230\u670d\u52a1\u7aef\u3002\n<ul class=\"wp-block-list\">\n<li>\u81ea\u5b9a\u4e49IoT\u901a\u4fe1\u534f\u8bae\u5e26\u6709\u5e94\u7b54\u673a\u5236\u3001\u81ea\u52a8\u91cd\u4f20\u673a\u5236\u3001CRC\u6821\u9a8c\u3001AES\u52a0\u5bc6\u673a\u5236\u3002<\/li>\n\n\n\n<li>\u81ea\u5b9a\u4e49IoT\u901a\u4fe1\u534f\u8bae\u5e26\u6709\u6ce8\u518c\u3001\u767b\u5f55\u3001\u5bf9\u65f6\u3001\u53c2\u6570\u4e0b\u53d1\u3001\u53c2\u6570\u8bf7\u6c42\u3001\u8bbe\u5907\u63a7\u5236\u3001\u6587\u4ef6\u4e0a\u4f20\u3001\u6587\u4ef6\u4e0b\u8f7d\u7684\u901a\u7528\u670d\u52a1\u6d41\u7a0b\u3002<\/li>\n\n\n\n<li>\u81ea\u52a8\u7f51\u7edc\u91cd\u8fde\u673a\u5236\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>OTA\u5347\u7ea7\u673a\u5236<\/li>\n\n\n\n<li>\u8fd0\u884c\u4fe1\u606f\u7edf\u8ba1\u529f\u80fd\uff1a\u8bb0\u5f55\u8bbe\u5907\u72b6\u6001\u3001\u6bcf\u6b21\u5f00\u673a\u7684\u539f\u56e0\u3001\u8bbe\u5907\u5f00\u673a\u6b21\u6570\u3001\u8fd0\u884c\u65f6\u957f<\/li>\n\n\n\n<li>\u652f\u63016\u79cd\u5de5\u4f5c\u6a21\u5f0f\uff1a\u5f85\u673a\u6a21\u5f0f\u3001\u8282\u80fd\u6a21\u5f0f\u3001\u5b9e\u65f6\u6a21\u5f0f\u3001\u534a\u5b9e\u65f6\u6a21\u5f0f\u3001\u5b9a\u65f6\u6a21\u5f0f\u3001\u534a\u5b9a\u65f6\u6a21\u5f0f\u3002\u7075\u6d3b\u9002\u5e94\u4e0d\u540c\u7684\u5e94\u7528\u573a\u666f\u3002<\/li>\n\n\n\n<li>\u4f9b\u7535\u72b6\u6001\u76d1\u6d4b\uff1a\u53ef\u76d1\u6d4b\u7ec8\u7aef\u8bbe\u5907\u7684\u4f9b\u7535\u72b6\u6001\uff0c\u5e76\u5411\u670d\u52a1\u7aef\u53d1\u51fa\u65ad\u7535\u544a\u8b66\u3002<\/li>\n\n\n\n<li>\u8fdc\u7a0b\u63a7\u5236\uff1a\u91cd\u542f\u3001\u6062\u590d\u51fa\u5382\u8bbe\u7f6e\u3001\u84dd\u7259\u5f00\u5173\u3001\u63a7\u5236\u62cd\u7167\u3001OTA\u5347\u7ea7\u3002<\/li>\n\n\n\n<li>\u53c2\u6570\u8bbe\u5b9a\uff1a\u7ec8\u7aef\u8bbe\u5907\u7684\u914d\u7f6e\u53c2\u6570\u53ef\u4ee5\u8fdc\u7a0b\u66f4\u6539\u3002<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u786c\u4ef6\u90e8\u5206<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u6210\u54c1\u5c55\u793a<\/h3>\n\n\n\n<div class=\"wp-block-group is-layout-grid wp-container-core-group-is-layout-9649a0d9 wp-block-group-is-layout-grid\">\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/niuguodong.com\/wp-content\/uploads\/2022\/07\/image.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"785\" height=\"589\" data-original=\"https:\/\/niuguodong.com\/wp-content\/uploads\/2022\/07\/image.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-350\"  sizes=\"auto, (max-width: 785px) 100vw, 785px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/niuguodong.com\/wp-content\/uploads\/2022\/07\/image-1.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"309\" height=\"259\" data-original=\"https:\/\/niuguodong.com\/wp-content\/uploads\/2022\/07\/image-1.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-351\"  sizes=\"auto, (max-width: 309px) 100vw, 309px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/niuguodong.com\/wp-content\/uploads\/2022\/07\/image-2.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"310\" height=\"241\" data-original=\"https:\/\/niuguodong.com\/wp-content\/uploads\/2022\/07\/image-2.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-352\"  sizes=\"auto, (max-width: 310px) 100vw, 310px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/niuguodong.com\/wp-content\/uploads\/2022\/07\/image-3.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"324\" height=\"265\" data-original=\"https:\/\/niuguodong.com\/wp-content\/uploads\/2022\/07\/image-3.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-353\"  sizes=\"auto, (max-width: 324px) 100vw, 324px\" \/><\/div><\/figure>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\">\u62c6\u89e3\u5c55\u793a<\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/niuguodong.com\/wp-content\/uploads\/2022\/07\/image-4.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"429\" data-original=\"https:\/\/niuguodong.com\/wp-content\/uploads\/2022\/07\/image-4.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-354\" style=\"aspect-ratio:2.3869993783855787;width:793px;height:auto\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">\u786c\u4ef6\u67b6\u6784<\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/niuguodong.com\/wp-content\/uploads\/2022\/07\/image-5.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"871\" height=\"619\" data-original=\"https:\/\/niuguodong.com\/wp-content\/uploads\/2022\/07\/image-5.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-355\" style=\"aspect-ratio:1.4071456615626228;width:478px;height:auto\"  sizes=\"auto, (max-width: 871px) 100vw, 871px\" \/><\/div><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">PCB<\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/niuguodong.com\/wp-content\/uploads\/2022\/07\/image-6.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"744\" height=\"735\" data-original=\"https:\/\/niuguodong.com\/wp-content\/uploads\/2022\/07\/image-6.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-356\" style=\"aspect-ratio:1.0122840566557547;width:480px;height:auto\"  sizes=\"auto, (max-width: 744px) 100vw, 744px\" \/><\/div><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">\u5e94\u7528\u73b0\u573a<\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/niuguodong.com\/wp-content\/uploads\/2022\/07\/image-7.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"631\" data-original=\"https:\/\/niuguodong.com\/wp-content\/uploads\/2022\/07\/image-7.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-357\" style=\"aspect-ratio:1.6228454131071333;width:740px;height:auto\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">\u7aef\u4fa7\u8f6f\u4ef6<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u5f00\u53d1\u5de5\u5177<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5f00\u53d1\u73af\u5883\uff1aESP-IDF, VSCode<\/li>\n\n\n\n<li>\u5f00\u53d1\u8bed\u8a00\uff1aC<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u7aef\u4fa7\u6846\u67b6<\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/niuguodong.com\/wp-content\/uploads\/2022\/07\/image-8.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"763\" data-original=\"https:\/\/niuguodong.com\/wp-content\/uploads\/2022\/07\/image-8.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-358\" style=\"aspect-ratio:1.34212103055722;width:738px;height:auto\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">\u5de5\u4f5c\u6a21\u5f0f<\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/niuguodong.com\/wp-content\/uploads\/2022\/07\/image-9.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"906\" height=\"593\" data-original=\"https:\/\/niuguodong.com\/wp-content\/uploads\/2022\/07\/image-9.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-359\" style=\"aspect-ratio:1.5278369852502345;width:731px;height:auto\"  sizes=\"auto, (max-width: 906px) 100vw, 906px\" \/><\/div><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">OTA\u5347\u7ea7\u7b56\u7565<\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/niuguodong.com\/wp-content\/uploads\/2022\/07\/image-10.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"834\" data-original=\"https:\/\/niuguodong.com\/wp-content\/uploads\/2022\/07\/image-10.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-360\" style=\"aspect-ratio:1.2278457884158598;width:700px;height:auto\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">IoT\u5e73\u53f0\u5c55\u793a<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u84dd\u7259\u6253\u5361\u4e0e\u7167\u7247\u8bb0\u5f55<\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/niuguodong.com\/wp-content\/uploads\/2022\/07\/\u84dd\u7259\u6253\u5361.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"485\" data-original=\"https:\/\/niuguodong.com\/wp-content\/uploads\/2022\/07\/\u84dd\u7259\u6253\u5361.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-630\" style=\"aspect-ratio:2.111381666797581;width:776px;height:auto\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">\u65ad\u7535\u544a\u8b66<\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/niuguodong.com\/wp-content\/uploads\/2022\/07\/\u65ad\u7535\u544a\u8b66.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"487\" data-original=\"https:\/\/niuguodong.com\/wp-content\/uploads\/2022\/07\/\u65ad\u7535\u544a\u8b66.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-632\" style=\"aspect-ratio:2.102710525286502;width:776px;height:auto\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">IoT\u7ba1\u7406\u5e73\u53f0<\/h3>\n\n\n\n<p>IoT\u7ba1\u7406\u5e73\u53f0\u652f\u6301\u5e94\u7528\u7ba1\u7406\u3001\u8bbe\u5907\u7ba1\u7406\u3001\u8bbe\u5907\u6d88\u606f\u65e5\u5fd7\u7ba1\u7406\u3001\u534f\u8bae\u6570\u636e\u7c7b\u578b\u5b9a\u4e49\u3001\u8bbe\u5907\u53c2\u6570\u7ba1\u7406\u529f\u80fd<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/niuguodong.com\/wp-content\/uploads\/2022\/07\/IoT\u7ba1\u7406\u5e73\u53f0.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"486\" data-original=\"https:\/\/niuguodong.com\/wp-content\/uploads\/2022\/07\/IoT\u7ba1\u7406\u5e73\u53f0.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-633\" style=\"width:772px;height:auto\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">OTA\u7ba1\u7406\u5e73\u53f0<\/h3>\n\n\n\n<p>\u652f\u6301\u7248\u672c\u7ba1\u7406\u3001\u81ea\u5b9a\u4e49\u767d\u540d\u5355\u7b49\u529f\u80fd<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/niuguodong.com\/wp-content\/uploads\/2022\/07\/OTA\u7ba1\u7406\u5e73\u53f0.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"540\" data-original=\"https:\/\/niuguodong.com\/wp-content\/uploads\/2022\/07\/OTA\u7ba1\u7406\u5e73\u53f0.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-634\" style=\"width:782px;height:auto\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">\u5c0f\u7a0b\u5e8f\u5e94\u7528\u5c55\u793a<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/niuguodong.com\/wp-content\/uploads\/2022\/07\/\u5c0f\u7a0b\u5e8f\u5e94\u7528\u5c55\u793a.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"461\" height=\"1024\" data-original=\"https:\/\/niuguodong.com\/wp-content\/uploads\/2022\/07\/\u5c0f\u7a0b\u5e8f\u5e94\u7528\u5c55\u793a.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-635\" style=\"aspect-ratio:0.4501969611705121;width:279px;height:auto\"  sizes=\"auto, (max-width: 461px) 100vw, 461px\" \/><\/div><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">\u7aef\u4fa7\u90e8\u5206\u4ee3\u7801\u5b9e\u73b0<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u4f20\u8f93\u63a7\u5236\u5c42\u5e27\u683c\u5f0f<\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/niuguodong.com\/wp-content\/uploads\/2022\/07\/image-16.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"764\" height=\"200\" data-original=\"https:\/\/niuguodong.com\/wp-content\/uploads\/2022\/07\/image-16.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-366\" style=\"aspect-ratio:3.82033467071142;width:614px;height:auto\"  sizes=\"auto, (max-width: 764px) 100vw, 764px\" \/><\/div><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/niuguodong.com\/wp-content\/uploads\/2022\/07\/image-17.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"762\" height=\"424\" data-original=\"https:\/\/niuguodong.com\/wp-content\/uploads\/2022\/07\/image-17.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-367\" style=\"aspect-ratio:1.797201456775925;width:616px;height:auto\"  sizes=\"auto, (max-width: 762px) 100vw, 762px\" \/><\/div><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">\u4f20\u8f93\u63a7\u5236\u5c42\u7a97\u53e3\u53d1\u9001\u90e8\u5206<\/h3>\n\n\n\n<p>\u5bfb\u627e\u7a7a\u95f2\u7a97\u53e3\u4f4d\uff0c\u7ec4\u5305\uff0c\u53d1\u9001<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>static uint8_t MyTSFC_FindIdle_Windows(my_tsfc_windows_t** windows_array, my_tsfc_windows_t** idle_fp)\n{\n    uint8_t i=0;\n    for(i=0; i&lt;MY_TSFC_WINDOWS_SIZE; i++)\n    {\n        if(windows_array&#91;i]!=NULL)\n        {\n            if(windows_array&#91;i]->state==tsf_win_fps_idle)\n            {\n                *idle_fp = windows_array&#91;i];\n                break;\n            }\n        }\n        else\n        {\n            ESP_LOGE(\"MyTSFC_FindIdle_Windows()\", \"error: windows_array&#91;%d]!=NULL is false\\n\", i);\n        }\n    }\n    return i;\n}\n\nstatic void MyTSFC_NoAck_Mark( my_tsfc_windows_t* idle_fp, my_tsfc_queue_t* queue_data, uint32_t crc_, int index)\n{\n    idle_fp->state = tsf_win_fps_send_noack;\n    ESP_LOGI(\"MyTSFC_NoAck_Mark()\", \"sn=%d, crc=0x%08x, frame_len=%d\", \\\n    my_tsfc_send_windows_array&#91;index]->frame_sn, crc_, idle_fp->data_len);\n    idle_fp->start_timestamp = esp_timer_get_time()\/1000;\n\n    my_tsfc_statistic.up.frame_count_total++;\n    my_tsfc_statistic.up.data_count_total+=idle_fp->data_len;\n    if(queue_data->my_tsfc_data_type==msg_frame)\n    {\n        my_tsfc_statistic.up.frame_count_type_msg++;\n        my_tsfc_statistic.up.frame_count_type_msg_valid++;\n    }\n    else if(queue_data->my_tsfc_data_type==data_frame)\n    {\n        my_tsfc_statistic.up.frame_count_type_data++;\n        my_tsfc_statistic.up.frame_count_type_data_valid++;\n    }\n    else if(queue_data->my_tsfc_data_type==ack_frame)\n    {\n        my_tsfc_statistic.up.frame_count_type_ack++;\n    }\n    else if(queue_data->my_tsfc_data_type==cd_frame)\n    {\n        my_tsfc_statistic.up.frame_count_type_cc++;\n    }\n}\n\nstatic int MyTSFC_Packager_To_Windows(my_tsfc_windows_t** windows_array, my_tsfc_queue_t* queue_data)\n{\n    int ret = 0;\n    if(windows_array==NULL)\n    {\n        ESP_LOGE(\"MyTSFC_Packager_To_Windows()\", \"error: windows_array==NULL\\n\");\n        return -1;\n    }\n \n    my_tsfc_windows_t* idle_fp = NULL;\n \n    xSemaphoreTake(my_tsfc_send_windowsMutexSemaphore, portMAX_DELAY);\n    \/\/\u5bfb\u627e\u7a7a\u95f2\u7a97\u53e3\u4f4d\n    uint8_t idle_posi = MyTSFC_FindIdle_Windows(windows_array, &amp;idle_fp);\n \n    if(idle_fp!=NULL)\n    {\n        if(queue_data->len &lt;= TSFC_FRAME_DATA_SIZE_MAX)\n        {\n            \/\/\u52a0\u5165\u5934\u90e8\n            idle_fp->data->head.type = queue_data->my_tsfc_data_type;\n            idle_fp->data->head.pd = MY_TSFC_PD;\n \n            idle_fp->data->sn = my_tsfc_send_windows_frame_counter++;\n            \n            idle_fp->data->app_id = my_tsfc_info.app_id;\n            idle_fp->data->data_len = queue_data->len;\n \n            \/\/\u52a0\u5165\u6570\u636e\u90e8\u5206\n            memcpy(idle_fp->data->data, queue_data->data, queue_data->len);\n \n            \/\/\u8865\u9f50\uff0c16\u5b57\u8282\u5bf9\u9f50\uff0c\u7528\u4e8eAES\u52a0\u5bc6\n            if(idle_fp->data->data_len%16)\n            {\n                memset(idle_fp->data->data+idle_fp->data->data_len, 0, 16-(idle_fp->data->data_len%16));\n                idle_fp->data->data_len+=(16-idle_fp->data->data_len%16);\n            }\n \n            \/\/\u52a0\u5bc6\n            #if MY_TSFC_DEBUG_CHECK_AES\n            if(My_EspAes_Cipher(my_tsfc_info.aes_ctx, (void*)idle_fp->data->data, idle_fp->data->data_len, (void*)idle_fp->data->data, idle_fp->data->data_len))\n            {\n                ESP_LOGE(\"MyTSFC_Packager_To_Windows()\", \"error: MyAes_Cipher()\\n\");\n                ret = 2;\n                goto MyTSFC_Packager_To_Windows_return;\n            }\n            #endif\n \n            uint16_t idle_fp_data_data_len = idle_fp->data->data_len;\n            \n            \/\/\u8ba1\u7b97CRC\n            uint32_t* p_crc = (uint32_t*)(idle_fp->data->data+idle_fp_data_data_len);\n            *p_crc = crc_32((void*)idle_fp->data, idle_fp_data_data_len+8);\n            uint32_t crc_ = *((uint32_t*)p_crc);\n            \/\/\u52a0\u5165TAIL\n            memcpy(p_crc+1, MY_TSF_DATAFRAME_TAIL, strlen(MY_TSF_DATAFRAME_TAIL));\n \n \n            \/\/\u8bbe\u7f6e\u72b6\u6001\n            idle_fp->frame_type = queue_data->my_tsfc_data_type;\n            idle_fp->data_len = idle_fp_data_data_len+16;\n            idle_fp->timeout_time = frame_ack_time_out_time;\/\/ms\n            idle_fp->frame_position = idle_posi;\n            idle_fp->id = queue_data->id;\n            \n            idle_fp->frame_sn = idle_fp->data->sn;\n            \/\/ my_tsfc_send_windows_frame_counter++;\n            if(my_tsfc_send_windows_frame_counter%MY_TSFC_WINDOWS_SIZE==0)\n            {\n                \/\/ ESP_LOGI(\"MyTSFC_Packager()\", \"my_tsfc_windows_enough = 1\");\n                my_tsfc_windows_enough = true;\n            }\n \n            \/\/\u53d1\u9001\u5230\u9a71\u52a8\u4f20\u8f93\u5c42\n            int err = MyWHGM5_TcpSendData(idle_fp->data, idle_fp->data_len, 1000, idle_fp->id);\n            \/\/ ESP_LOGI(\"MyTSFC_Packager_To_Windows()\", \"err=%d\", err);\n            if(!err)\n            {\n                MyTSFC_NoAck_Mark( idle_fp, queue_data, crc_, idle_posi);\n \n                ret = 0;\n                goto MyTSFC_Packager_To_Windows_return;\n            }\n            else\n            {\n                ESP_LOGE(\"MyTSFC_Packager_To_Windows()\", \"MyWHGM5_TcpSendData() timeout\");\n            }\n        }\n        else\n        {\n            ESP_LOGE(\"MyTSFC_Packager_To_Windows()\", \"error: queue_data->len=%d\\n\", queue_data->len);\n        }\n    }\n    else\n    {\n        ESP_LOGE(\"MyTSFC_Packager_To_Windows()\", \"idle_fp!=NULL is false\\n\");\n        ret = 3;\n        goto MyTSFC_Packager_To_Windows_return;\n    }\n    \n    MyTSFC_Packager_To_Windows_return:\n    xSemaphoreGive(my_tsfc_send_windowsMutexSemaphore);\n    return ret;\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u4f20\u8f93\u63a7\u5236\u5c42\u63a5\u6536\u90e8\u5206<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u5934\u90e8\u5904\u7406<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>static my_tsf_ackcode_t MyTSFC_Rcv_Check_FrameHead(my_tsfc_rcv_frame_info_t* p_frame_info)\n{\n    if(p_frame_info==NULL)\n    {\n        return -1;\n    }\n    if(p_frame_info->p_frame_start==NULL)\n    {\n        return -2;\n    }\n \n    \/\/\u8bfb\u53d6\u5e27\u5934\n    my_tsf_frame_head_t* my_tsf_frame_head = (my_tsf_frame_head_t*)(p_frame_info->p_frame_start);\n    char* frame_start_byte = (char*)(p_frame_info->p_frame_start);\n    if(!(my_tsf_frame_head->type>=my_tsf_frametype_min&amp;&amp;my_tsf_frame_head->type&lt;=my_tsf_frametype_max))\n    {\n        p_frame_info->sn++;\n        return tsf_ackcode_frametype_unrecognized;\n    }\n    if(my_tsf_frame_head->pd!=MY_TSFC_PD)\n    {\n        #if MY_TSFC_DEBUG_CHECK_PD\n        ESP_LOGE(\"MyTSFC_Rcv_Check_FrameHead()\", \"error tsf_ackcode_pd_unsupported, my_tsf_frame_head->pd=0x%x\\n\", my_tsf_frame_head->pd);\n        return tsf_ackcode_pd_unsupported;\n        #else\n        ESP_LOGE(\"MyTSFC_Rcv_Check_FrameHead()\", \"error tsf_ackcode_pd_unsupported, my_tsf_frame_head->pd=0x%x, ignore!\\n\", my_tsf_frame_head->pd);\n        #endif\n    }\n    \/\/\u83b7\u53d6\u5e27\u5934\u4fe1\u606f\n    p_frame_info->type = my_tsf_frame_head->type;\n    p_frame_info->pd = my_tsf_frame_head->pd;\n \n    \/\/\u83b7\u53d6sn\u3001appid\u3001data_len\u3001crc\n    p_frame_info->sn = *((uint8_t*)(frame_start_byte+2));\n    if(my_tsf_frame_head->type==msg_frame||my_tsf_frame_head->type==data_frame)\n    {\n        p_frame_info->app_id = my_endian_conversion_16(*((uint16_t*)(frame_start_byte+4)));\n        p_frame_info->data_len = my_endian_conversion_16(*((uint16_t*)(frame_start_byte+6)));\n        p_frame_info->crc_original = my_endian_conversion_32(*(uint32_t*)(frame_start_byte+p_frame_info->data_len+8));\n    }\n    else\n    {\n        p_frame_info->crc_original = my_endian_conversion_32(*(uint32_t*)(frame_start_byte+4));\n        if(my_tsf_frame_head->type==ack_frame)\n        {\n            p_frame_info->ack_code = *((uint8_t*)(frame_start_byte+3));\n        }\n    }\n \n    if(my_tsf_frame_head->type==ack_frame)\n    {\n        if(p_frame_info->ack_code!=tsf_ackcode_success)\n        {\n            ESP_LOGW(\"MyTSFC_Rcv_Check_FrameHead()\", \"ack_code error, p_frame_info->ack_code=0x%x!\\n\", p_frame_info->ack_code);\n        }\n    }\n \n    \/\/\u6bd4\u5bf9app_id\n    if(my_tsf_frame_head->type==msg_frame||my_tsf_frame_head->type==data_frame)\n    {\n        if(p_frame_info->app_id!=my_tsfc_info.app_id)\n        {\n            #if MY_TSFC_DEBUG_CHECK_APPID\n            ESP_LOGE(\"MyTSFC_Rcv_Check_FrameHead()\", \"error tsf_ackcode_appid_unrecognized, p_frame_info->app_id=0x%x\", \\\n            p_frame_info->app_id);\n            return tsf_ackcode_appid_unrecognized;\n            #else\n            ESP_LOGE(\"MyTSFC_Rcv_Check_FrameHead()\", \"error tsf_ackcode_appid_unrecognized, p_frame_info->app_id=0x%x, ignore!\", \\\n            p_frame_info->app_id);\n            #endif\n        }\n    }\n \n    \/\/\u6bd4\u5bf9\u6570\u636e\u957f\u5ea6\u662f\u5426\u4e00\u81f4\n    if(my_tsf_frame_head->type==msg_frame||my_tsf_frame_head->type==data_frame)\n    {\n        if(p_frame_info->frame_len &lt; p_frame_info->data_len+16)\n        {\n            ESP_LOGE(\"MyTSFC_Rcv_Check_FrameHead()\", \"error tsf_ackcode_insufficient_len, p_frame_info->frame_len=%d\\n\", p_frame_info->frame_len);\n            return tsf_ackcode_insufficient_len;\n        }\n    }\n    else\n    {\n        if(p_frame_info->frame_len!=12)\n        {\n            ESP_LOGE(\"MyTSFC_Rcv_Check_FrameHead()\", \"error tsf_ackcode_insufficient_len, p_frame_info->frame_len=%d\\n\", p_frame_info->frame_len);\n            return tsf_ackcode_insufficient_len;\n        }\n    }\n \n    \/\/\u8ba1\u7b97crc\u5e76\u6bd4\u5bf9\n    if(my_tsf_frame_head->type==msg_frame||my_tsf_frame_head->type==data_frame)\n    {\n        p_frame_info->crc_calcu_result = crc_32((void*)my_tsf_frame_head, p_frame_info->data_len+8);\n    }\n    else\n    {\n        p_frame_info->crc_calcu_result = crc_32((void*)my_tsf_frame_head, 4);\n    }\n    \n    if(p_frame_info->crc_original!=p_frame_info->crc_calcu_result)\n    {\n        #if MY_TSFC_DEBUG_CHECK_CRC\n        ESP_LOGE(\"MyTSFC_Rcv_Check_FrameHead()\", \"error tsf_ackcode_crc_check_error, 0x%08x:0x%08x\", \\\n        p_frame_info->crc_original, p_frame_info->crc_calcu_result);\n        return tsf_ackcode_appid_unrecognized;\n        #else\n        ESP_LOGE(\"MyTSFC_Rcv_Check_FrameHead()\", \"error tsf_ackcode_crc_check_error, 0x%08x:0x%08x, ignore!\", \\\n        p_frame_info->crc_original, p_frame_info->crc_calcu_result);\n        #endif\n    }\n \n    p_frame_info->p_frame_data_start = frame_start_byte+8;\n    \/\/AES\u89e3\u5bc6\n    #if MY_TSFC_DEBUG_CHECK_AES\n    if(my_tsf_frame_head->type==msg_frame)\n    {\n        my_tsf_msgframe_t* p_msgframe = (my_tsf_msgframe_t*)p_frame_info->p_frame_start;\n        if(My_EspAes_InvCipher(my_tsfc_info.aes_ctx, (void*)p_msgframe->data, p_frame_info->data_len, (void*)p_msgframe->data, p_frame_info->data_len))\n        {\n            #if MY_TSFC_DEBUG_CHECK_AES\n            ESP_LOGE(\"MyTSFC_Rcv_Check_FrameHead()\", \"error tsf_ackcode_decrypt_error\");\n            return tsf_ackcode_decrypt_error;\n            #else\n            ESP_LOGE(\"MyTSFC_Rcv_Check_FrameHead()\", \"error tsf_ackcode_decrypt_error, ignore!\");\n            #endif\n        }\n    }\n    else if(my_tsf_frame_head->type==data_frame)\n    {\n        my_tsf_dataframe_t* p_dataframe = (my_tsf_dataframe_t*)p_frame_info->p_frame_start;\n        if(My_EspAes_InvCipher(my_tsfc_info.aes_ctx, (void*)p_dataframe->data, p_frame_info->data_len, (void*)p_dataframe->data, p_frame_info->data_len))\n        {\n            #if MY_TSFC_DEBUG_CHECK_AES\n            ESP_LOGE(\"MyTSFC_Rcv_Check_FrameHead()\", \"error tsf_ackcode_decrypt_error\");\n            return tsf_ackcode_decrypt_error;\n            #else\n            ESP_LOGE(\"MyTSFC_Rcv_Check_FrameHead()\", \"error tsf_ackcode_decrypt_error, ignore!\");\n            #endif\n        }\n    }\n    #endif\n \n    return tsf_ackcode_success;\n}\n \nstatic int MyTSFC_Rcv_Frame_Uni_Check(my_tsfc_rcv_frame_info_t* p_frame_info)\n{\n    if((p_frame_info->sn &lt; 8) || (p_frame_info->sn >= 256-8))\n    {\n        return 0;\n    }\n    uint8_t sn_uni_check = 1;\n \n    \/\/\u68c0\u67e5sn\u6709\u65e0\u91cd\u590d\n    int m = 0;\n    for(m=0; m&lt;MY_TSFC_WINDOWS_SIZE; m++)\n    {\n        if(p_frame_info->rcv_windows_posi_mark&#91;m]==p_frame_info->sn)\n        {\n            break;\n        }\n    }\n    if(m>=MY_TSFC_WINDOWS_SIZE)\n    {\/\/\u7a97\u53e3\u5185\u6ca1\u6709\u91cd\u590d\u7684sn\n        sn_uni_check = 0;\n        if(p_frame_info->rcv_windows_posi_mark_index>=MY_TSFC_WINDOWS_SIZE)\n        {\n            p_frame_info->rcv_windows_posi_mark_index = 0;\n        }\n        p_frame_info->rcv_windows_posi_mark&#91;p_frame_info->rcv_windows_posi_mark_index]=p_frame_info->sn;\n        p_frame_info->rcv_windows_posi_mark_index++;\n    }\n    else\n    {\n        my_tsfc_statistic.error.sn_repeat_error_count++;\n        ESP_LOGE(\"MyTSFC_Rcv_Task()\", \"rcv similar frame_sn=%d, abandon the frame\", p_frame_info->sn);\n    }\n    return sn_uni_check;\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u63a5\u6536\u89e3\u5305<\/h4>\n\n\n\n<p>\u63d0\u53d6\u51fa\u5e94\u7528\u670d\u52a1\u5c42\u6570\u636e<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>static void MyTSFC_Rcv_Task(void* param)\n{\n    my_whgm5_queue_item_t* p_rcv_buf=NULL;\n    char* rcv_buf = (char*)calloc(MyTSFC_Rcv_Task_rcvbuf_field_size, sizeof(my_tsf_dataframe_t));\n    int rcv_len = 0;\n    int tail_pos = 0;\n    char* p_frame_start = NULL;\n    char* p_frame_end = NULL;\n    char* cur_read_pointer_posi = rcv_buf;\n    char* p_empty_position = rcv_buf;\n \n    char* p_good_bugfix_good_tail_posi = NULL;\n \n    int i = 0;\n    \n    int rcv_frame_count = 0;\n \n \n    my_tsfc_rcv_frame_info_t my_tsfc_rcv_frame_info;\n    memset(my_tsfc_rcv_frame_info.rcv_windows_posi_mark, -1, sizeof(my_tsfc_rcv_frame_info.rcv_windows_posi_mark));\n    my_tsfc_rcv_frame_info.rcv_windows_posi_mark_index = 0;\n \n    int clear_uni_check_mark = 0;\n \n    for(;;)\n    {\n        if(my_tsfc_info.tsfc_work_state == TSFC_WORK_STATE_OK)\n        {\n            clear_uni_check_mark = 0;\n            if(!MyWHGM5_TcpRcvData(&amp;p_rcv_buf, portMAX_DELAY))\n            {\n                memcpy(p_empty_position, p_rcv_buf->data, p_rcv_buf->len);\n                rcv_len = p_rcv_buf->len;\n                \n                p_empty_position+=rcv_len;\n                do\n                {\n                    my_tsfc_GOOD_bugfix:\n                    if(p_good_bugfix_good_tail_posi==NULL)\n                    {\n                        tail_pos = MatchString(cur_read_pointer_posi, p_empty_position-cur_read_pointer_posi, MY_TSF_DATAFRAME_TAIL, strlen(MY_TSF_DATAFRAME_TAIL));\n                    }\n                    else\n                    {\n                        tail_pos+=4;\n                        tail_pos += MatchString(p_good_bugfix_good_tail_posi, p_empty_position-p_good_bugfix_good_tail_posi, MY_TSF_DATAFRAME_TAIL, strlen(MY_TSF_DATAFRAME_TAIL));\n                        p_good_bugfix_good_tail_posi = NULL;\n                    }\n                    \/\/if( (p_frame_tail = FindBinary(p_read, remain_len, MY_TSF_DATAFRAME_TAIL, strlen(MY_TSF_DATAFRAME_TAIL)) )!=NULL)MatchString\n                    \n                    if(tail_pos!=0xffff)\n                    {\n                        p_frame_start = cur_read_pointer_posi;\n                        p_frame_end = p_frame_start+tail_pos+4;\n                        \n                        rcv_frame_count++;\n \n                        my_tsfc_statistic.down.data_count_total+= (p_frame_end-p_frame_start);\n                        \/\/----------------------\n                        \/\/\u89e3\u6790\u5934\u90e8\n                        my_tsfc_rcv_frame_info.p_frame_start = p_frame_start;\n                        my_tsfc_rcv_frame_info.frame_len = p_frame_end-p_frame_start;\n                        int err = MyTSFC_Rcv_Check_FrameHead(&amp;my_tsfc_rcv_frame_info);\n                        \n                        if(my_tsfc_rcv_frame_info.type==msg_frame||my_tsfc_rcv_frame_info.type==data_frame)\n                        {\n                            if(err!=tsf_ackcode_success)\n                            {\n \n                                ESP_LOGE(\"MyTSFC_Rcv_Task()\", \"Check_FrameHead error, err=0x%x(%d)\\n\", err, err);\n                                \n                                if(err!=tsf_ackcode_frametype_unrecognized)\n                                {\n                                    if(err==tsf_ackcode_insufficient_len)\n                                    {\n                                        p_good_bugfix_good_tail_posi = p_frame_end;\n                                        goto my_tsfc_GOOD_bugfix;\n                                    }\n                                    if(MyTSFC_Ack(my_tsfc_rcv_frame_info.sn, err, 1000, 1, 1))\n                                    {\n                                        ESP_LOGE(\"MyTSFC_Rcv_Task()\", \"MyTSFC_Ack error:\\n\");\n                                    }\n                                }\n \n                                goto MyTSFC_Rcv_Task_frame_move;\n                            }\n \n                            int frame_uni_check = MyTSFC_Rcv_Frame_Uni_Check(&amp;my_tsfc_rcv_frame_info);\n                            \/\/ frame_uni_check = 0;\n                            if(!frame_uni_check)\n                            {\n                                my_tsfc_rcv_windows_frame_counter++;\n                                my_tsfc_statistic.down.frame_count_type_msg_valid++;\n \n                                \/\/\u53d1\u9001\u5230\u961f\u5217\n                                int find_empty_count = 0;\n                                do\n                                {\n                                    for(i=0; i&lt;MY_TSFC_QUEUE_LEN; i++)\n                                    {\n                                        if(!my_tsfc_rcv_queue_array&#91;i]->valid)\n                                        {\n                                            int queue_send_ret = pdTRUE;\n                                            memcpy(my_tsfc_rcv_queue_array&#91;i]->data, my_tsfc_rcv_frame_info.p_frame_data_start, my_tsfc_rcv_frame_info.data_len);\n                                            my_tsfc_rcv_queue_array&#91;i]->len = my_tsfc_rcv_frame_info.data_len;\n                                            my_tsfc_rcv_queue_array&#91;i]->my_tsfc_data_type = my_tsfc_rcv_frame_info.type;\n                                            my_tsfc_rcv_queue_array&#91;i]->sn = my_tsfc_rcv_frame_info.sn;\n                                            my_tsfc_rcv_queue_array&#91;i]->id = 1;\n                                            my_tsfc_rcv_queue_array&#91;i]->valid = 1;\n \n                                            queue_send_ret = xQueueSend(my_tsfc_rcv_queue, &amp;my_tsfc_rcv_queue_array&#91;i], 1000 \/ portTICK_PERIOD_MS);\n                                            if(queue_send_ret!=pdTRUE)\n                                            {\n                                                ESP_LOGE(\"MyTSFC_Rcv_Task()\", \"xQueueSend ERROR, queue_send_ret=%d\\n\", queue_send_ret);\n                                            }\n                                            break;\n                                        }\n                                    }\n                                    if(i>=MY_TSFC_QUEUE_LEN)\n                                    {\n                                        ESP_LOGE(\"MyTSFC_Rcv_Task()\", \"not find empty in rcv queue count=%d\\n\", find_empty_count);\n                                        vTaskDelay(50 \/ portTICK_PERIOD_MS);\n                                    }\n                                    else\n                                    {\n                                        break;\n                                    }\n                                } while ((++find_empty_count&lt;3)&amp;&amp;(i>=MY_TSFC_QUEUE_LEN));\n                                if(find_empty_count>=3)\n                                {\n                                    ESP_LOGE(\"MyTSFC_Rcv_Task()\", \"not find empty in rcv queue finally!!!\\n\");\n                                }\n                                else\n                                {\n                                    find_empty_count = 0;\n                                }\n \n                                if(MyTSFC_Ack(my_tsfc_rcv_frame_info.sn, tsf_ackcode_success, 1000, 1, 1))\n                                {\n                                    ESP_LOGE(\"MyTSFC_Rcv_Task()\", \"msg_frame:ack error:tsf_ackcode_success\\n\");\n                                }\n                            }\n                            else\n                            {\n                                ESP_LOGE(\"MyTSFC_Rcv_Task()\", \"sn_uni_check error!\\n\");                                        \n                                \/\/\u6682\u65f6\u5904\u7406\u4f5c \u5e94\u7b54 \u5904\u7406\u6210\u529f\n                                if(MyTSFC_Ack(my_tsfc_rcv_frame_info.sn, tsf_ackcode_success, 1000, 1, 1))\n                                {\n                                    ESP_LOGE(\"MyTSFC_Rcv_Task()\", \"msg_frame:ack error:tsf_ackcode_success\\n\");\n                                }\n                            }\n                        }\n                        \n                        else if(my_tsfc_rcv_frame_info.type==ack_frame)\n                        {\n                            my_tsfc_statistic.down.frame_count_valid++;\n                            my_tsfc_statistic.down.frame_count_type_ack++;\n \n                            ESP_LOGI(\"MyTSFC_Rcv_Task()\", \"-ack_frame-, ack_sn=%d\", my_tsfc_rcv_frame_info.sn);\n                            \n                            if(my_tsfc_rcv_frame_info.ack_code==tsf_ackcode_success)\n                            {\n                                MyTSFC_ClearWindowAfterAck(my_tsfc_rcv_frame_info.sn);\n                            }\n                            else if(my_tsfc_rcv_frame_info.ack_code==tsf_ackcode_frametype_unrecognized)\n                            {\n \n                            }\n                            else\n                            {\n                                ESP_LOGE(\"MyTSFC_Rcv_Task()\", \"ack_code error=0x%0x, resend_sn=%d!\\n\", my_tsfc_rcv_frame_info.ack_code, my_tsfc_rcv_frame_info.sn);\n                                int k = 0;\n                                for( ; k&lt;MY_TSFC_WINDOWS_SIZE; k++)\n                                {\n                                    if(my_tsfc_rcv_frame_info.sn==my_tsfc_send_windows_array&#91;k]->frame_sn)\n                                    {\n                                        if(my_tsfc_send_windows_array&#91;k]->state==tsf_win_fps_send_noack)\n                                            break;\n                                    }\n                                }\n                                if(k&lt;MY_TSFC_WINDOWS_SIZE)\n                                {\n                                    if(!MyWHGM5_TcpSendData(my_tsfc_send_windows_array&#91;k]->data, my_tsfc_send_windows_array&#91;k]->data_len, 1000, my_tsfc_send_windows_array&#91;k]->id))\n                                    {\n                                        ESP_LOGW(\"MyTSFC_Rcv_Task()\", \"resend_sn=%d!\\n\", my_tsfc_rcv_frame_info.sn);\n                                    }\n                                    else\n                                    {\n                                        ESP_LOGW(\"MyTSFC_Rcv_Task()\", \"failed to resend_sn=%d!\\n\", my_tsfc_rcv_frame_info.sn);\n                                    }\n                                }\n                                else\n                                {\n                                    ESP_LOGE(\"MyTSFC_Rcv_Task()\", \"not find sn=%d!\\n\", my_tsfc_rcv_frame_info.sn);\n                                }\n                            }\n                        }\n                        else if(my_tsfc_rcv_frame_info.type==cd_frame)\n                        {\n                            my_tsfc_statistic.down.frame_count_valid++;\n                            my_tsfc_statistic.down.frame_count_type_cc++;\n                            ESP_LOGI(\"MyTSFC_Rcv_Task()\", \"-cd_frame-\");\n                            \/\/my_tsf_checkcnctframe_t* checkcnct = (my_tsf_checkcnctframe_t*)p_frame_start;\n \n                            if(MyTSFC_Ack(my_tsfc_rcv_frame_info.sn, tsf_ackcode_success, 1000, 1, 1))\n                            {\n                                ESP_LOGE(\"MyTSFC_Rcv_Task()\", \"cd_frame:ack error:tsf_ackcode_success\\n\");\n                            }\n                        }\n                        MyTSFC_Rcv_Task_frame_move:\n                        cur_read_pointer_posi+=tail_pos+4;\n                    }\n                    else\n                    {\n                        if(p_empty_position>rcv_buf+(MyTSFC_Rcv_Task_rcvbuf_field_size\/2)*sizeof(my_tsf_dataframe_t))\n                        {\n                            memset(rcv_buf, 0, cur_read_pointer_posi-rcv_buf);\n                            memcpy(rcv_buf, cur_read_pointer_posi, p_empty_position-cur_read_pointer_posi);\n                            memset(cur_read_pointer_posi, 0, p_empty_position-cur_read_pointer_posi);\n                            p_empty_position = rcv_buf + (p_empty_position-cur_read_pointer_posi);\n                            cur_read_pointer_posi = rcv_buf;\n                        }\n                        else\n                        {\n \n                        }\n                        break;\n                    }\n                } while (p_empty_position-cur_read_pointer_posi>0);\n \n                if(p_empty_position==cur_read_pointer_posi)\n                {\n                    memset(rcv_buf, 0, p_empty_position-rcv_buf);\n                    p_empty_position = rcv_buf;\n                    cur_read_pointer_posi = rcv_buf;\n                }\n                p_rcv_buf->valid = 0;\n            }\n        }\n        else\n        {\n            if(!clear_uni_check_mark)\n            {\n                ESP_LOGE(\"MyTSFC_Rcv_Task()\", \"connection error, clear rcv_task marks!\");\n                clear_uni_check_mark = 1;\n                memset(rcv_buf, 0, MyTSFC_Rcv_Task_rcvbuf_field_size*sizeof(my_tsf_dataframe_t));\n                rcv_len = 0;\n                tail_pos = 0;\n                p_frame_start = NULL;\n                p_frame_end = NULL;\n                cur_read_pointer_posi = rcv_buf;\n                p_empty_position = rcv_buf;\n                \n                i = 0;\n                \n                \/\/ rcv_frame_count = 0;\n                MyTSFC_Rcv_Frame_Uni_Check_info_clear(&amp;my_tsfc_rcv_frame_info);\n            }\n            vTaskDelay(100 \/ portTICK_PERIOD_MS);\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u5e94\u7528\u670d\u52a1\u5c42\u53d1\u9001<\/h3>\n\n\n\n<p>\u53d1\u9001\u81f3\u4f20\u8f93\u63a7\u5236\u5c42<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>static void MyASL_Send_Task(void* param)\n{\n    int queue_rcv_ret = pdFALSE;\n    char* asl_send_buf = (char*)calloc(1, 5120+MY_ASL_PACK_SIZE_MAX+1);\n    my_asl_queue_t* queue_rcv_item = NULL;\n    uint32_t data_packager_count = 0;\n    uint32_t packed_len;\n \n    if(asl_send_buf==NULL)\n    {\n        ESP_LOGE(\"MyASL_Send_Task()\", \"asl_send_buf==NULL\\n\");\n    }\n \n    for(;;)\n    {\n        \/\/\u961f\u5217\u63a5\u6536\n        queue_rcv_ret = xQueueReceive(my_asl_send_queue, &amp;queue_rcv_item, portMAX_DELAY);\n        if(queue_rcv_ret==pdTRUE)\n        {\n            if(queue_rcv_item!=NULL)\n            {\n                if(queue_rcv_item->valid)\n                {\n                    data_packager_count = 0;\n                    if((queue_rcv_item->data!=NULL))\n                    {\n                        do\n                        {\n                            data_packager_count = MyASL_DataBlockTsf_Packager(asl_send_buf, MY_ASL_PACK_SIZE_MAX, queue_rcv_item->data, queue_rcv_item->len, data_packager_count, MY_ASL_PACK_SIZE_MAX, &amp;packed_len);\n \n                            \/\/\u53d1\u9001\u5230\u4f20\u8f93\u63a7\u5236\u5c42\n                            if(queue_rcv_item->my_asl_data_type==datablock_tsf)\n                            {\n                                MyTSFC_Send(data_frame, queue_rcv_item->sn, asl_send_buf, packed_len, 1000, 1);\n                            }\n                            else\n                            {\n                                MyTSFC_Send(msg_frame, queue_rcv_item->sn, asl_send_buf, packed_len, 1000, 1);\n                            }\n                            \/\/\u53d1\u9001\u5931\u8d25\u5c06\u963b\u585e\n \n                        } while (data_packager_count&lt;queue_rcv_item->len);\n                    }\n                    \/\/\u6e05\u7a7a\u961f\u5217\u7f13\u51b2\u533a\n                    queue_rcv_item->valid = 0;\n \n                    \/\/\u53d1\u9001\u5b8c\u6210\u4e8b\u4ef6\n \n                }\n            }\n            else\n            {\n                ESP_LOGE(\"MyASL_Send_Task()\", \"queue_rcv_item!=NULL is false\\n\");\n            }\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u5e94\u7528\u670d\u52a1\u5c42\u63a5\u6536<\/h3>\n\n\n\n<p>\u4ece\u4f20\u8f93\u63a7\u5236\u5c42\u63a5\u6536<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int MyAsl_EventList_Matching(uint8_t* list, uint16_t list_len, uint8_t id)\n{\n    for(int i=0; i&lt;list_len; i++)\n\t{\n\t\tfor(int j=0; j&lt;2; j++)\n\t\t{\n\t\t\tif(*(list+i*2+j)==id)\n\t\t\t{\n\t\t\t\tif(j==0)\n\t\t\t\t{\n\t\t\t\t\treturn *(list+i*2+j+1);\n\t\t\t\t}\n\t\t\t\telse if(j==1)\n\t\t\t\t{\n\t\t\t\t\treturn *(list+i*2+j-1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n    return -1;\n}\n\nstatic void MyASL_Rcv_Task(void* param)\n{\n    my_tsfc_queue_t* p_rcv_buf=NULL;\n    char* rcv_buf = (char*)calloc(2, 4096);\n \n    uint8_t my_asl_eventlist_id_table&#91;20]&#91;2];\n    int i=0;\n    uint16_t table_len = 0;\n    my_asl_eventlist_id_table&#91;i]&#91;0] = dev_reg_req, my_asl_eventlist_id_table&#91;i]&#91;1] = dev_reg_res, i++;\n    my_asl_eventlist_id_table&#91;i]&#91;0] = dev_login_req, my_asl_eventlist_id_table&#91;i]&#91;1] = dev_login_res, i++;\n    my_asl_eventlist_id_table&#91;i]&#91;0] = net_time_sync_req, my_asl_eventlist_id_table&#91;i]&#91;1] = net_time_sync_res, i++;\n    my_asl_eventlist_id_table&#91;i]&#91;0] = dev_param_req, my_asl_eventlist_id_table&#91;i]&#91;1] = dev_param_res, i++;\n    my_asl_eventlist_id_table&#91;i]&#91;0] = dev_param_update_indication, my_asl_eventlist_id_table&#91;i]&#91;1] = dev_param_update_res, i++;\n    my_asl_eventlist_id_table&#91;i]&#91;0] = dev_param_query_indication, my_asl_eventlist_id_table&#91;i]&#91;1] = dev_param_query_res, i++;\n    my_asl_eventlist_id_table&#91;i]&#91;0] = dev_param_report, my_asl_eventlist_id_table&#91;i]&#91;1] = dev_param_report_res, i++;\n    my_asl_eventlist_id_table&#91;i]&#91;0] = dev_ctrl_param_indication, my_asl_eventlist_id_table&#91;i]&#91;1] = dev_ctrl_param_res, i++;\n    my_asl_eventlist_id_table&#91;i]&#91;0] = dev_measure_report, my_asl_eventlist_id_table&#91;i]&#91;1] = 0, i++;\n    my_asl_eventlist_id_table&#91;i]&#91;0] = dev_event_report, my_asl_eventlist_id_table&#91;i]&#91;1] = dev_event_res, i++;\n    my_asl_eventlist_id_table&#91;i]&#91;0] = file_upload_req, my_asl_eventlist_id_table&#91;i]&#91;1] = file_upload_res, i++;\n    my_asl_eventlist_id_table&#91;i]&#91;0] = file_down_req, my_asl_eventlist_id_table&#91;i]&#91;1] = file_down_res, i++;\n    my_asl_eventlist_id_table&#91;i]&#91;0] = data_direct_tsf_req, my_asl_eventlist_id_table&#91;i]&#91;1] = data_direct_tsf_res, i++;\n    my_asl_eventlist_id_table&#91;i]&#91;0] = file_tsf_finish, my_asl_eventlist_id_table&#91;i]&#91;1] = 0, i++;\n    my_asl_eventlist_id_table&#91;i]&#91;0] = datablock_tsf, my_asl_eventlist_id_table&#91;i]&#91;1] = 0, i++;\n    table_len = i;\n \n    for(;;)\n    {\n        MyTSFC_RcvData(&amp;p_rcv_buf, portMAX_DELAY);\n        memcpy(rcv_buf, p_rcv_buf->data, p_rcv_buf->len);\n        \n        my_asl_head_t* my_asl_head = (my_asl_head_t*)p_rcv_buf->data;\n        if(my_asl_head->vercode==0x01)\n        {\n            #if DEBUG_PRINT_LEVEL_my_asl_PRINT >= MY_DEBUG_PRINT_LEVEL_1_SIMPLE\n            ESP_LOGI(\"MyASL_Rcv_Task()\", \"my_asl_head->type=%x\\n\", my_asl_head->type);\n            #endif\n            int event_id = MyAsl_EventList_Matching(my_asl_eventlist_id_table, table_len, my_asl_head->type);\n            if(event_id>=0)\n            {\n                uint16_t retcode = my_endian_conversion_16(*((uint16_t*)(p_rcv_buf->data+sizeof(my_asl_head_t))));\n                if(retcode==aslrc_TokenWrong)\n                {\n                    if(my_asl_info.MyAslECCB_Callback!=NULL)\n                    {\n                        my_asl_info.MyAslECCB_Callback(retcode);\n                    }\n                }\n                my_asl_rcvdata_cache_t* my_asl_rcvdata_cache = (my_asl_rcvdata_cache_t*)MyAslEvent_GetItem_Storage_ById(&amp;my_asl_event_list, event_id);\n                if(my_asl_rcvdata_cache!=NULL)\n                {\n                    if(!my_asl_rcvdata_cache->valid)\n                    {\n                        memcpy(my_asl_rcvdata_cache->data, p_rcv_buf->data, p_rcv_buf->len);\n                        my_asl_rcvdata_cache->type = my_asl_head->type;\n                        my_asl_rcvdata_cache->len = p_rcv_buf->len;\n                    }\n                    else\n                    {\n                        ESP_LOGE(\"MyASL_Rcv_Task()\", \"my_asl_rcvdata_cache->valid is True\");\n                    }\n                    MyAslEvent_Delete(&amp;my_asl_event_list, event_id);\n                    if(my_asl_rcvdata_cache->taskhandle!=NULL)\n                    {\n                        xTaskNotify(my_asl_rcvdata_cache->taskhandle, 1, eSetValueWithOverwrite);\n                    }\n                    else\n                    {\n                        ESP_LOGE(\"MyASL_Rcv_Task()\", \"my_asl_rcvdata_cache->taskhandle==NULL\");\n                    }\n                }\n                else\n                {\n                    MyASL_DPU_Send(my_asl_head->type, p_rcv_buf->data, p_rcv_buf->len, 5000, 1);\n                }\n            }\n            else\n            {\n                ESP_LOGE(\"MyASL_Rcv_Task()\", \"not found id=0x%x in my_asl_eventlist_id_table\", my_asl_head->type);\n            }\n        }\n        else\n        {\n            ESP_LOGE(\"MyASL_Rcv_Task()\", \"error:asl protocol version not support=%d, required=%d\\n\", my_asl_head->vercode, 1);\n        }\n \n        p_rcv_buf->valid = 0;\n    }\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u5de5\u4f5c\u6a21\u5f0f<\/h3>\n\n\n\n<p>\u6839\u636e\u8bbe\u5b9a\uff0c\u751f\u6210\u4ece\u4e00\u59290\u65f6\u7b97\u8d77\u7684\u5de5\u4f5c\u8ba1\u5212\u65f6\u95f4\u8868\uff0c\u53ef\u8de8\u5929<\/p>\n\n\n\n<p>\u6839\u636e\u5de5\u4f5c\u8ba1\u5212\u8868\u5524\u9192\u6216\u8fdb\u5165\u7761\u7720<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include \"my_workmode.h\"\n \n#if MY_WORKMODE_FUNC\n \n#include \"my_time.h\"\n#include \"my_lowpower.h\"\n#include \"my_debug.h\"\n \n#include &lt;esp_log.h>\n \n \nmy_workmode_info_t my_workmode_info;\n \n \nint MyWorkmode_WorkList_To_SleepList(workplan_list_item_t* p_worklist, int workplan_num, sleepplan_list_item_t* p_sleeplist, int sleepplan_num)\n{\n\tif(p_worklist==NULL)\n\t{\n\t\tESP_LOGE(\"WorkList_To_SleepList()\", \"p_worklist==NULL\");\n\t\treturn -1;\n\t}\n\tif(p_sleeplist==NULL)\n\t{\n\t\tESP_LOGE(\"WorkList_To_SleepList()\", \"p_sleeplist==NULL\");\n\t\treturn -1;\n\t}\n\tif(sleepplan_num&lt;workplan_num)\n\t{\n\t\tESP_LOGE(\"WorkList_To_SleepList()\", \"sleepplan_num&lt;workplan_num\");\n\t\treturn -11;\n\t}\n\tif(workplan_num&lt;=0)\n\t{\n\t\tESP_LOGE(\"WorkList_To_SleepList()\", \"workplan_num&lt;=0\");\n\t\treturn -12;\n\t}\n \n\t\/\/\u5c06\u5de5\u4f5c\u8868\u6309\u5f00\u59cb\u65f6\u95f4\u6392\u5e8f\n\tworkplan_list_item_t workplan_temp;\n\tfor(int j=0; j&lt;workplan_num-1; j++)\n\t{\n\t\tfor(int i=j+1; i&lt;workplan_num; i++)\n\t\t{\n\t\t\tif((p_worklist+j)->work_start_time > (p_worklist+i)->work_start_time)\n\t\t\t{\n\t\t\t\tworkplan_temp.work_start_time = (p_worklist+i)->work_start_time;\n\t\t\t\tworkplan_temp.work_end_time = (p_worklist+i)->work_end_time;\n \n\t\t\t\t(p_worklist+i)->work_start_time = (p_worklist+j)->work_start_time;\n\t\t\t\t(p_worklist+i)->work_end_time = (p_worklist+j)->work_end_time;\n \n\t\t\t\t(p_worklist+j)->work_start_time = workplan_temp.work_start_time;\n\t\t\t\t(p_worklist+j)->work_end_time = workplan_temp.work_end_time;\n\t\t\t}\n\t\t}\n\t}\n \n\t\/\/\u8ba1\u7b97\u7761\u7720\u5217\u8868\n\tfor(int i=0; i&lt;workplan_num; i++)\n\t{\n\t\t\/\/\u7761\u7720\u5f00\u59cb\u65f6\u95f4\u5c31\u662f\u5de5\u4f5c\u7ed3\u675f\u65f6\u95f4\n\t\t(p_sleeplist+i)->sleep_start_time = (p_worklist+i)->work_end_time;\n \n\t\t\/\/\u6839\u636e\u524dworkplan_num-1\u9879\u5de5\u4f5c\u8ba1\u5212\u8ba1\u7b97\u51fa\u5bf9\u5e94\u7684\u7761\u7720\u8ba1\u5212\n\t\tif(i&lt;workplan_num-1)\n\t\t{\n\t\t\t\/\/\u6ca1\u6709\u8de8\u5929\n\t\t\tif((p_worklist+i)->work_end_time - (p_worklist+i)->work_start_time > 0)\n\t\t\t{\n\t\t\t\t\/\/workplan_num+1\u9879\u7684\u5f00\u59cb\u65f6\u95f4\u5927\u4e8eworkplan_num\u9879\u7684\u7ed3\u675f\u65f6\u95f4\u624d\u4f1a\u8ba1\u7b97\u7761\u7720\u4fdd\u6301\u65f6\u95f4\uff0c\u5426\u5219\u5c06\u8fd9\u9879\u5de5\u4f5c\u8ba1\u5212\u5bf9\u5e94\u7684\u7761\u7720\u8ba1\u5212\u7f6e\u96f6\n\t\t\t\tif((p_worklist+i+1)->work_start_time - (p_worklist+i)->work_end_time > 0)\n\t\t\t\t{\n\t\t\t\t\t(p_sleeplist+i)->sleep_keep_time = (p_worklist+i+1)->work_start_time - (p_worklist+i)->work_end_time;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t(p_sleeplist+i)->sleep_start_time = 0;\n\t\t\t\t\t(p_sleeplist+i)->sleep_keep_time = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t\/\/\u8c8c\u4f3c\u4e0d\u9700\u8981\u8fd9\u4e2a\u5206\u652f\uff0c\u56e0\u4e3a\u82e5\u51fa\u73b0\u8de8\u5929\u7684\u60c5\u51b5\uff0c\u7ecf\u8fc7\u524d\u4e00\u6b65\u7684 \u5bf9\u5de5\u4f5c\u8868\u6392\u5e8f\u540e\uff0c\u8de8\u5929\u7684\u90a3\u4e00\u9879\u603b\u662f\u5728\u5de5\u4f5c\u8868\u7684\u6700\u540e\u4e00\u9879\uff0c\u4e0d\u4f1a\u5230\u4e0a\u4e00\u5c42if\u4e2d\u6765\n\t\t\t}\n\t\t}\n\t\t\/\/\u5de5\u4f5c\u8868\u7684\u7b2c\u6839\u636e\u524dworkplan_num\u9879\uff0c\u4e5f\u5c31\u662f\u6700\u540e\u4e00\u9879\n\t\telse\n\t\t{\n\t\t\t\/\/\u6ca1\u6709\u8de8\u5929\n\t\t\tif((p_worklist+i)->work_end_time - (p_worklist+i)->work_start_time > 0)\n\t\t\t{\n\t\t\t\t\/\/\u68c0\u67e5\u8fd9\u4e2a\u5de5\u4f5c\u8868\u4e2d\u6709\u51e0\u9879\u6709\u6548\u7684\u8ba1\u5212\n\t\t\t\tint n = 0;\n\t\t\t\tint y = 0;\n\t\t\t\tfor(n=0; n&lt;workplan_num; n++)\n\t\t\t\t{\n\t\t\t\t\tif(((p_worklist+n)->work_end_time!=0)&amp;&amp;((p_worklist+n)->work_start_time!=0))\n\t\t\t\t\t{\n\t\t\t\t\t\ty++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\/\/\u53ea\u6709\u4e00\u9879\uff0c\u5176\u4ed6\u90fd\u662f0\n\t\t\t\tif(y==1)\n\t\t\t\t{\n\t\t\t\t\t\/\/\u7761\u7720\u65f6\u95f4\u662f\u4e00\u5929\u7684\u79d2\u6570\u51cf\u53bb\u5de5\u4f5c\u8868\u4e2d\u4ec5\u6709\u7684\u4e00\u9879\u5de5\u4f5c\u8ba1\u5212\u7684\u7ed3\u675f\u65f6\u95f4\u518d\u52a0\u4e0a\u8fd9\u9879\u8ba1\u5212\u81ea\u5df1\u7684\u5f00\u59cb\u65f6\u95f4\n\t\t\t\t\t(p_sleeplist+i)->sleep_keep_time = 24*3600-(p_worklist+i)->work_end_time + (p_worklist+i)->work_start_time;\n\t\t\t\t}\n\t\t\t\t\/\/\u6709\u591a\u9879\u8ba1\u5212\n\t\t\t\telse\n\t\t\t\t{\n                    \/\/\u627e\u51fa\u5de5\u4f5c\u8868\u4e2d\u5f00\u59cb\u65f6\u95f4\u6700\u5c0f\u7684\u90a3\u9879\u8ba1\u5212\u7684\u5f00\u59cb\u65f6\u95f4\n\t\t\t\t\tint32_t min_start_time = 86400+1;\n\t\t\t\t\tfor(int m=0; m&lt;workplan_num; m++)\n\t\t\t\t\t{\n\t\t\t\t\t\tif((p_worklist+m)->work_end_time - (p_worklist+m)->work_start_time > 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(min_start_time > (p_worklist+m)->work_start_time)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tmin_start_time = (p_worklist+m)->work_start_time;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\/\/\u7761\u7720\u65f6\u95f4\u662f\u4e00\u5929\u7684\u79d2\u6570\u51cf\u53bb\u5de5\u4f5c\u8868\u6700\u540e\u4e00\u9879\u5de5\u4f5c\u8ba1\u5212\u7684\u7ed3\u675f\u65f6\u95f4\u52a0\u4e0a\u5de5\u4f5c\u8868\u6700\u65e9\u5f00\u59cb\u7684\u8ba1\u5212\u7684\u5f00\u59cb\u65f6\u95f4\n\t\t\t\t\t(p_sleeplist+i)->sleep_keep_time = 24*3600-(p_worklist+i)->work_end_time + min_start_time;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\/\/\u6700\u540e\u4e00\u9879\u8ba1\u5212\u8de8\u5929\u4e86\n\t\t\telse if((p_worklist+i)->work_end_time - (p_worklist+i)->work_start_time &lt; 0)\n\t\t\t{\n\t\t\t\t\/\/\u68c0\u67e5\u8fd9\u4e2a\u5de5\u4f5c\u8868\u4e2d\u6709\u51e0\u9879\u6709\u6548\u7684\u8ba1\u5212\n\t\t\t\tint n = 0;\n\t\t\t\tint y = 0;\n\t\t\t\tfor(n=0; n&lt;workplan_num; n++)\n\t\t\t\t{\n\t\t\t\t\tif(((p_worklist+n)->work_end_time!=0)&amp;&amp;((p_worklist+n)->work_start_time!=0))\n\t\t\t\t\t{\n\t\t\t\t\t\ty++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\/\/\u53ea\u6709\u4e00\u9879\uff0c\u5176\u4ed6\u90fd\u662f0\n\t\t\t\tif(y==1)\n\t\t\t\t{\n\t\t\t\t\t\/\/\u7761\u7720\u65f6\u95f4\u662f\u5de5\u4f5c\u8868\u4e2d\u4ec5\u6709\u7684\u4e00\u9879\u5de5\u4f5c\u8ba1\u5212\u7684\u5f00\u59cb\u65f6\u95f4\u518d\u52a0\u4e0a\u8fd9\u9879\u8ba1\u5212\u81ea\u5df1\u7684\u7ed3\u675f\u65f6\u95f4\uff0c\u56e0\u4e3a\u8de8\u5929\u80af\u5b9a\u662f\u5f00\u59cb\u65f6\u95f4\u6bd4\u7ed3\u675f\u65f6\u95f4\u79d2\u6570\u5927\n\t\t\t\t\t\/\/\u9664\u975e\u8de8\u5929\u4e4b\u540e\u53c8\u57ae\u4e8624*3600\u79d2\uff0c\u90a3\u5c06\u4f1a\u5bfc\u81f4\u8fd9\u4e2a\u5f0f\u5b50\u8ba1\u7b97\u51fa\u7684\u7ed3\u679c\u5f88\u5927\uff01\uff01\uff01\n\t\t\t\t\t(p_sleeplist+i)->sleep_keep_time = (p_worklist+i)->work_start_time - (p_worklist+i)->work_end_time;\n\t\t\t\t}\n\t\t\t\t\/\/\u6709\u591a\u9879\u8ba1\u5212\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t\/\/\u627e\u51fa\u5de5\u4f5c\u8868\u4e2d\u5f00\u59cb\u65f6\u95f4\u6700\u5c0f\u7684\u90a3\u9879\u8ba1\u5212\u7684\u5f00\u59cb\u65f6\u95f4\n\t\t\t\t\tint32_t min_start_time = 86400+1;\n\t\t\t\t\tfor(int m=0; m&lt;workplan_num; m++)\n\t\t\t\t\t{\n\t\t\t\t\t\tif((p_worklist+m)->work_end_time - (p_worklist+m)->work_start_time > 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(min_start_time > (p_worklist+m)->work_start_time)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tmin_start_time = (p_worklist+m)->work_start_time;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\/\/\u548c\u524d\u9762\u4e00\u6837\uff0c\u4ecd\u9700\u8981\u5224\u65ad\u6700\u65e9\u5f00\u59cb\u65f6\u95f4\u662f\u5426\u665a\u4e8e\u672c\u9879\u8ba1\u5212\u7684\u7ed3\u675f\u65f6\u95f4\n\t\t\t\t\tif(min_start_time - (p_worklist+i)->work_end_time > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\t\/\/\u7761\u7720\u65f6\u95f4\u662f\u5de5\u4f5c\u8868\u4e2d\u6700\u65e9\u5f00\u59cb\u7684\u90a3\u9879\u8ba1\u5212\u7684\u5f00\u59cb\u65f6\u95f4\u51cf\u53bb\u8de8\u5929\u540e\u7684\u7ed3\u675f\u65f6\u95f4\n\t\t\t\t\t\t(p_sleeplist+i)->sleep_keep_time = min_start_time - (p_worklist+i)->work_end_time;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t(p_sleeplist+i)->sleep_start_time = 0;\n\t\t\t\t\t\t(p_sleeplist+i)->sleep_keep_time = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if((p_worklist+i)->work_end_time - (p_worklist+i)->work_start_time == 0)\n\t\t\t{\n\t\t\t\t(p_sleeplist+i)->sleep_start_time = 0;\n\t\t\t\t(p_sleeplist+i)->sleep_keep_time = 0;\n\t\t\t}\n\t\t}\n\t}\n \n\t\/\/\u5408\u5e76\u7761\u7720\u8868\u4e2d\u7684\u8de8\u5929\u5206\u5272\uff0c\u95f4\u9699\u4e3a0\u7684\uff0c\u76f8\u90bb\u4e24\u9879\uff08\u8fd9\u4e00\u6b65\u8981\u4e0d\u8981\u65e0\u6240\u8c13\uff09\n\tfor(int i=0; i&lt;workplan_num; i++)\n\t{\n\t\tif((p_sleeplist+i)->sleep_start_time + (p_sleeplist+i)->sleep_keep_time == 24*3600)\n\t\t{\n\t\t\tfor(int j=0; j&lt;workplan_num; j++)\n\t\t\t{\n\t\t\t\tif(((p_sleeplist+j)->sleep_start_time==0)&amp;&amp;((p_sleeplist+j)->sleep_keep_time>0))\n\t\t\t\t{\n\t\t\t\t\t(p_sleeplist+i)->sleep_keep_time += (p_sleeplist+j)->sleep_keep_time;\n\t\t\t\t\t(p_sleeplist+j)->sleep_keep_time = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n \n\treturn 0;\n}\n \nstatic int MyWorkmode_PickSleepKeepTime_Afterfirstpoweron(my_workmode_conf_t* conf)\n{\n\ttime_t cur_time_in_day = MyTime_GetTime()%(3600*24);\n \n\tESP_LOGI(\"MyWorkmode_PickSleepKeepTime_Afterfirstpoweron()\", \"cur_time_in_day=%ld\\n\", cur_time_in_day);\n \n\t\/\/\u82e5\u5f53\u524d\u65f6\u95f4\u5904\u4e8e\u5de5\u4f5c\u65f6\u6bb5\uff0c\u5219\u76f4\u63a5\u5c06fisrt_poweron_sleep_keep_time\u7f6e\u96f6\n\tfor(int i=0; i&lt;5; i++)\n\t{\n\t\tif(( (conf->workplan_list+i)->work_start_time > 0 ) &amp;&amp; ( (conf->workplan_list+i)->work_end_time > 0 ) )\n\t\t{\n\t\t\tif( (conf->workplan_list+i)->work_end_time - (conf->workplan_list+i)->work_start_time > 0 )\n\t\t\t{\n\t\t\t\tif( (cur_time_in_day >= (conf->workplan_list+i)->work_start_time) &amp;&amp; \\\n\t\t\t\t\t(cur_time_in_day &lt; (conf->workplan_list+i)->work_end_time))\n\t\t\t\t{\n\t\t\t\t\tconf->fisrt_poweron_sleep_keep_time = 0;\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( (conf->workplan_list+i)->work_start_time - (conf->workplan_list+i)->work_end_time > 0 )\n\t\t\t{\n\t\t\t\tif( (cur_time_in_day >= (conf->workplan_list+i)->work_start_time) || \\\n\t\t\t\t\t(cur_time_in_day &lt; (conf->workplan_list+i)->work_end_time) )\n\t\t\t\t{\n\t\t\t\t\tconf->fisrt_poweron_sleep_keep_time = 0;\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\/\/\u6765\u5230\u8fd9\u91cc\u8bf4\u660e\u5f53\u524d\u65f6\u95f4\u4e0d\u5728\u5de5\u4f5c\u65f6\u6bb5\n \n\t\/\/\u67e5\u627e\u6709\u65e0\u8de8\u5929\u5de5\u4f5c\u8ba1\u5212\n\tint i_ftdp = 0;\n\tfor(i_ftdp=0; i_ftdp&lt;5; i_ftdp++)\n\t{\n\t\tif(( (conf->workplan_list+i_ftdp)->work_start_time > 0 ) &amp;&amp; ( (conf->workplan_list+i_ftdp)->work_end_time > 0 ) )\n\t\t{\n\t\t\tif( (conf->workplan_list+i_ftdp)->work_start_time - (conf->workplan_list+i_ftdp)->work_end_time > 0 )\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n \n\t\/\/\u5de5\u4f5c\u8868\u4e2d\u65e0\u8de8\u5929\u5de5\u4f5c\u8ba1\u5212\n\tif(i_ftdp>=5)\n\t{\n\t\t\/\/\u627e\u5230\u5de5\u4f5c\u8868\u4e2d\u5728\u4e00\u5929\u4e4b\u5185\u6700\u540e\u7ed3\u675f\u7684\u90a3\u9879\u8ba1\u5212\u7684\u7ed3\u675f\u65f6\u95f4\n\t\tint32_t max_end_time = 0;\n\t\tfor(int m=0; m&lt;5; m++)\n\t\t{\n\t\t\tif(( (conf->workplan_list+m)->work_start_time > 0 ) &amp;&amp; ( (conf->workplan_list+m)->work_end_time > 0 ) )\n\t\t\t{\n\t\t\t\tif((conf->workplan_list+m)->work_end_time > max_end_time)\n\t\t\t\t{\n\t\t\t\t\tmax_end_time = (conf->workplan_list+m)->work_end_time;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n \n\t\t\/\/\u5f53\u524d\u65f6\u95f4\u8d85\u8fc7\u4e86\u4e00\u5929\u4e4b\u5185\u6700\u665a\u7ed3\u675f\u7684\u90a3\u9879\u5de5\u4f5c\u8ba1\u5212\u7684\u7ed3\u675f\u65f6\u95f4\uff08\u9690\u85cf\u6210\u7acb\uff1a\u80af\u5b9a\u6ca1\u8d85\u8fc7\u51cc\u6668\uff0c\u82e5\u8d85\u8fc7\u51cc\u6668\uff0c\u6761\u4ef6\u4e0d\u53ef\u80fd\u6210\u7acb\uff09\n\t\tif(cur_time_in_day > max_end_time)\n\t\t{\n\t\t\t\/\/\u67e5\u627e\u5de5\u4f5c\u8868\u4e2d\u4e00\u5929\u5185\u6700\u65e9\u5f00\u59cb\u7684\u90a3\u9879\u8ba1\u5212\u7684\u5f00\u59cb\u65f6\u95f4\n\t\t\tint32_t min_start_time = 86400+1;\n\t\t\tfor(int m=0; m&lt;5; m++)\n\t\t\t{\n\t\t\t\tif(( (conf->workplan_list+m)->work_start_time > 0 ) &amp;&amp; ( (conf->workplan_list+m)->work_end_time > 0 ) )\n\t\t\t\t{\n\t\t\t\t\tif((conf->workplan_list+m)->work_start_time &lt; min_start_time)\n\t\t\t\t\t{\n\t\t\t\t\t\tmin_start_time = (conf->workplan_list+m)->work_start_time;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\/\/fisrt_poweron_sleep_keep_time\u4e00\u5929\u7684\u79d2\u6570\u51cf\u53bb\u5f53\u524d\u65f6\u95f4\u518d\u52a0\u4e0a\u4e00\u5929\u4e2d\u6700\u65e9\u90a3\u9879\u8ba1\u5212\u7684\u5f00\u59cb\u65f6\u95f4\n\t\t\tconf->fisrt_poweron_sleep_keep_time = 24*3600 - cur_time_in_day + min_start_time;\n\t\t\treturn 0;\n\t\t}\n\t\t\/\/\u5f53\u524d\u65f6\u95f4\u6ca1\u6709\u8d85\u8fc7\u4e00\u5929\u4e4b\u5185\u6700\u665a\u7ed3\u675f\u7684\u90a3\u9879\u5de5\u4f5c\u8ba1\u5212\u7684\u7ed3\u675f\u65f6\u95f4\n\t\telse\n\t\t{\n\t\t\t\/\/\u5728\u5de5\u4f5c\u8868\u4e2d\u67e5\u627e\u4e0b\u4e00\u9879\u6700\u65e9\u7684\u8ba1\u5212\uff0c\u4ee5\u5f53\u524d\u65f6\u95f4\u4e3a\u53c2\u8003\n\t\t\tint32_t next_min_start_time = 86400+1;\n\t\t\tfor(int m=0; m&lt;5; m++)\n\t\t\t{\n\t\t\t\tif(( (conf->workplan_list+m)->work_start_time > 0 ) &amp;&amp; ( (conf->workplan_list+m)->work_end_time > 0 ) )\n\t\t\t\t{\n\t\t\t\t\tif((conf->workplan_list+m)->work_start_time > cur_time_in_day)\n\t\t\t\t\t{\n\t\t\t\t\t\tif((conf->workplan_list+m)->work_start_time &lt; next_min_start_time)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnext_min_start_time = (conf->workplan_list+m)->work_start_time;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(cur_time_in_day&lt;next_min_start_time)\n\t\t\t{\n\t\t\t\t\/\/\u8ba1\u7b97fisrt_poweron_sleep_keep_time\u8ddd\u79bb\u4e0b\u4e00\u9879\u8ba1\u5212\u5f00\u59cb\u7684\u65f6\u95f4\n\t\t\t\tconf->fisrt_poweron_sleep_keep_time = next_min_start_time - cur_time_in_day;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t\/\/\u4e0d\u5e94\u8be5\u5230\u8fbe\u8fd9\u91cc\n\t\t\t\tconf->fisrt_poweron_sleep_keep_time = 0;\n\t\t\t\tESP_LOGE(\"MyWorkmode_PickSleepKeepTime_Afterfirstpoweron()\", \"error2\");\n\t\t\t}\n\t\t\treturn 0;\n\t\t}\n\t\t\/\/\u4e0d\u5e94\u8be5\u5230\u8fbe\u8fd9\u91cc\n\t\treturn 0;\n\t}\n\t\/\/\u5de5\u4f5c\u8868\u4e2d\u6709\u8de8\u5929\u5de5\u4f5c\u8ba1\u5212\n\telse\n\t{\n\t\t\/\/\u627e\u51fa\u8de8\u5929\u8ba1\u5212\n\t\tint frdp_index = 0;\n\t\tfor(frdp_index=0; frdp_index&lt;5; frdp_index++)\n\t\t{\n\t\t\tif((conf->workplan_list+frdp_index)->work_start_time - (conf->workplan_list+frdp_index)->work_end_time > 0)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t\/\/\u5982\u679c\u5f53\u524d\u65f6\u95f4\u5728\u8de8\u5929\u8ba1\u5212\u7ed3\u675f\u4e4b\u540e\uff0c\uff08\u9690\u85cf\u6210\u7acb\uff1a\u5f53\u524d\u65f6\u95f4\u80af\u5b9a\u4e0d\u5728\u5de5\u4f5c\u65f6\u6bb5\u4e4b\u5185\uff09\n\t\tif(cur_time_in_day>(conf->workplan_list+frdp_index)->work_end_time)\n\t\t{\n\t\t\t\/\/\u5728\u5de5\u4f5c\u8868\u4e2d\u67e5\u627e\u4e0b\u4e00\u9879\u6700\u65e9\u7684\u8ba1\u5212\uff0c\u4ee5\u5f53\u524d\u65f6\u95f4\u4e3a\u53c2\u8003\n\t\t\tint32_t next_min_start_time = 86400+1;\n\t\t\tfor(int m=0; m&lt;5; m++)\n\t\t\t{\n\t\t\t\tif((conf->workplan_list+m)->work_start_time > cur_time_in_day)\n\t\t\t\t{\n\t\t\t\t\tif((conf->workplan_list+m)->work_start_time &lt; next_min_start_time)\n\t\t\t\t\t{\n\t\t\t\t\t\tnext_min_start_time = (conf->workplan_list+m)->work_start_time;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(cur_time_in_day&lt;next_min_start_time)\n\t\t\t{\n\t\t\t\/\/\u8ba1\u7b97fisrt_poweron_sleep_keep_time\u8ddd\u79bb\u4e0b\u4e00\u9879\u8ba1\u5212\u5f00\u59cb\u7684\u65f6\u95f4\n \n\t\t\t\tconf->fisrt_poweron_sleep_keep_time = next_min_start_time - cur_time_in_day;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t\/\/\u4e0d\u5e94\u8be5\u5230\u8fbe\u8fd9\u91cc\n\t\t\t\tconf->fisrt_poweron_sleep_keep_time = 0;\n\t\t\t\tESP_LOGE(\"MyWorkmode_PickSleepKeepTime_Afterfirstpoweron()\", \"error2\");\n\t\t\t}\n\t\t\treturn 0;\n\t\t}\n\t\telse if(cur_time_in_day&lt;(conf->workplan_list+frdp_index)->work_start_time)\n\t\t{\n\t\t\t\/\/\u4e0d\u5e94\u8be5\u5230\u8fbe\u8fd9\u91cc\n \n\t\t\t\/\/\u4e0d\u9700\u8981\u8fd9\u4e2a\u5206\u652f\uff0c\u56e0\u4e3a\u8de8\u5929\u7684\u7ed3\u675f\u65f6\u95f4\u80af\u5b9a\u662f\u6574\u4e2a\u5de5\u4f5c\u8868\u4e2d\u6700\u65e9\u7684\u65f6\u95f4\uff0c\u8de8\u5929\u5de5\u4f5c\u8ba1\u5212\u7684\u5f00\u59cb\u65f6\u95f4\u80af\u5b9a\u662f\u6574\u4e2a\u5de5\u4f5c\u8868\u4e2d\u6700\u665a\u7684\u65f6\u95f4\n\t\t\t\/\/\u6240\u4ee5\uff1a\u5982\u679c\u5f53\u524d\u65f6\u95f4\u65e2\u4e0d\u5728\u5de5\u4f5c\u8ba1\u5212\u5185\uff0c\u53c8\u5c0f\u4e8e\u8de8\u5929\u8ba1\u5212\u7684\u5f00\u59cb\u65f6\u95f4\uff0c\u90a3\u4e48\u80af\u5b9a\u4f1a\u8fdb\u5165\u4e0a\u4e00\u4e2a\u5206\u652f\u3002\n\t\t}\n\t\telse\n\t\t{\n\t\t\t\/\/\u4e0d\u5e94\u8be5\u5230\u8fbe\u8fd9\u91cc\n\t\t}\n\t}\n \n\tESP_LOGE(\"MyWorkmode_PickSleepKeepTime_Afterfirstpoweron()\", \"error3\");\n\tconf->fisrt_poweron_sleep_keep_time = 0;\n \n \n\treturn 0;\n}\n \nint MyWorkmode_Check_WhetherInWorktime(my_workmode_conf_t* conf)\n{\n\tint ret = 0;\n \n\ttime_t cur_time_in_day = MyTime_GetTime()%(3600*24);\n \n\t\/\/ ESP_LOGI(\"MyWorkmode_Check_WhetherInWorktime()\", \"cur_time_in_day=%ld\\n\", cur_time_in_day);\n \n\tint zero_check_index=0;\n\tfor(zero_check_index=0; zero_check_index&lt;5; zero_check_index++)\n\t{\n\t\tif(( (conf->workplan_list+zero_check_index)->work_start_time != 0 ) &amp;&amp; ( (conf->workplan_list+zero_check_index)->work_end_time != 0 ) )\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n\tif(zero_check_index==5)\n\t{\n\t\treturn 1;\n\t}\n \n\t\/\/\u82e5\u5f53\u524d\u65f6\u95f4\u5904\u4e8e\u5de5\u4f5c\u65f6\u6bb5\uff0c\u5219\u76f4\u63a5\u5c06fisrt_poweron_sleep_keep_time\u7f6e\u96f6\n\tfor(int i=0; i&lt;5; i++)\n\t{\n\t\tif(( (conf->workplan_list+i)->work_start_time > 0 ) &amp;&amp; ( (conf->workplan_list+i)->work_end_time > 0 ) )\n\t\t{\n\t\t\tif( (conf->workplan_list+i)->work_end_time - (conf->workplan_list+i)->work_start_time > 0 )\n\t\t\t{\n\t\t\t\tif( (cur_time_in_day >= (conf->workplan_list+i)->work_start_time) &amp;&amp; \\\n\t\t\t\t\t(cur_time_in_day &lt; (conf->workplan_list+i)->work_end_time))\n\t\t\t\t{\n\t\t\t\t\tconf->fisrt_poweron_sleep_keep_time = 0;\n\t\t\t\t\tret = 1;\n\t\t\t\t\tgoto MyWorkmode_Check_WhetherInWorktime_goto;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( (conf->workplan_list+i)->work_start_time - (conf->workplan_list+i)->work_end_time > 0 )\n\t\t\t{\n\t\t\t\tif( (cur_time_in_day >= (conf->workplan_list+i)->work_start_time) || \\\n\t\t\t\t\t(cur_time_in_day &lt; (conf->workplan_list+i)->work_end_time) )\n\t\t\t\t{\n\t\t\t\t\tconf->fisrt_poweron_sleep_keep_time = 0;\n\t\t\t\t\tret = 1;\n\t\t\t\t\tgoto MyWorkmode_Check_WhetherInWorktime_goto;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\/\/\u6765\u5230\u8fd9\u91cc\u8bf4\u660e\u5f53\u524d\u65f6\u95f4\u4e0d\u5728\u5de5\u4f5c\u65f6\u6bb5\n\tMyWorkmode_Check_WhetherInWorktime_goto:\n\tif(ret)\n\t{\n\t\t\/\/ ESP_LOGI(\"MyWorkmode_Check_WhetherInWorktime()\", \"It's working time\\n\");\n\t}\n\telse\n\t{\n\t\t\/\/ ESP_LOGI(\"MyWorkmode_Check_WhetherInWorktime()\", \"It's not working time\\n\");\n\t}\n\treturn ret;\n}\n \nint MyWorkmode_Check(void)\n{\n    time_t cur_time_in_day = MyTime_GetTime()%(3600*24);\n    uint32_t sleep_keep_time = 0;\n    uint8_t wakeup_reason = MYLOWPOWER_WAKEUP_TYPE_NO_SLEEP;\n \n    switch(my_workmode_info.conf.workmode)\n    {\n        int i=0;\n        case(workmode_standby):break;\n        case(workmode1_realtime):break;\n        case(workmode2_semirealtime):\n\t\t\tfor(i=0; i&lt;5; i++)\n\t\t\t{\n\t\t\t\tif((my_workmode_info.conf.sleepplan_list&#91;i].sleep_start_time>0) &amp;&amp; (my_workmode_info.conf.sleepplan_list&#91;i].sleep_keep_time>0))\n\t\t\t\t{\n\t\t\t\t\tif(my_workmode_info.conf.sleepplan_list&#91;i].sleep_start_time + my_workmode_info.conf.sleepplan_list&#91;i].sleep_keep_time &lt; 24*3600)\n\t\t\t\t\t{\n\t\t\t\t\t\tif( ( cur_time_in_day >= my_workmode_info.conf.sleepplan_list&#91;i].sleep_start_time ) &amp;&amp; \\\n\t\t\t\t\t\t\t( cur_time_in_day &lt; my_workmode_info.conf.sleepplan_list&#91;i].sleep_start_time + my_workmode_info.conf.sleepplan_list&#91;i].sleep_keep_time ) )\n\t\t\t\t\t\t{\n                \t\t\tsleep_keep_time = my_workmode_info.conf.sleepplan_list&#91;i].sleep_keep_time - (cur_time_in_day - my_workmode_info.conf.sleepplan_list&#91;i].sleep_start_time);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif( ( ( cur_time_in_day >= my_workmode_info.conf.sleepplan_list&#91;i].sleep_start_time ) &amp;&amp; (cur_time_in_day&lt;24*3600) ) )\n\t\t\t\t\t\t{\n                \t\t\tsleep_keep_time = my_workmode_info.conf.sleepplan_list&#91;i].sleep_keep_time - (cur_time_in_day - my_workmode_info.conf.sleepplan_list&#91;i].sleep_start_time);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if( cur_time_in_day &lt; my_workmode_info.conf.sleepplan_list&#91;i].sleep_keep_time-(24*3600-my_workmode_info.conf.sleepplan_list&#91;i].sleep_start_time) )\n\t\t\t\t\t\t{\n                \t\t\tsleep_keep_time = my_workmode_info.conf.sleepplan_list&#91;i].sleep_keep_time - (cur_time_in_day + 24*3600 - my_workmode_info.conf.sleepplan_list&#91;i].sleep_start_time);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tESP_LOGI(\"MyWorkmode_Check(workmode2_semirealtime)\", \"i=%d, sleep_keep_time=%ds\", i, sleep_keep_time);\n        break;\n\t\tcase(workmode_energy_saving):\n\t\t\tESP_LOGI(\"MyWorkmode_Check(workmode3_timer)\", \"workmode_energy_saving\");\n        case(workmode3_timer):\n\t\t\tsleep_keep_time = my_workmode_info.conf.workmode3_timer_sleep_keep_time;\n\t\t\tESP_LOGI(\"MyWorkmode_Check(workmode3_timer)\", \"sleep_keep_time=%ds\", sleep_keep_time);\n        break;\n        case(workmode4_semitimer):\n\t\tfor(i=0; i&lt;5; i++)\n\t\t\t{\n\t\t\t\tif((my_workmode_info.conf.sleepplan_list&#91;i].sleep_start_time>0) &amp;&amp; (my_workmode_info.conf.sleepplan_list&#91;i].sleep_keep_time>0))\n\t\t\t\t{\n\t\t\t\t\tif(my_workmode_info.conf.sleepplan_list&#91;i].sleep_start_time + my_workmode_info.conf.sleepplan_list&#91;i].sleep_keep_time &lt; 24*3600)\n\t\t\t\t\t{\n\t\t\t\t\t\tif( ( cur_time_in_day >= my_workmode_info.conf.sleepplan_list&#91;i].sleep_start_time ) &amp;&amp; \\\n\t\t\t\t\t\t\t( cur_time_in_day &lt; my_workmode_info.conf.sleepplan_list&#91;i].sleep_start_time + my_workmode_info.conf.sleepplan_list&#91;i].sleep_keep_time ) )\n\t\t\t\t\t\t{\n                \t\t\tsleep_keep_time = my_workmode_info.conf.sleepplan_list&#91;i].sleep_keep_time - (cur_time_in_day - my_workmode_info.conf.sleepplan_list&#91;i].sleep_start_time);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif( ( ( cur_time_in_day >= my_workmode_info.conf.sleepplan_list&#91;i].sleep_start_time ) &amp;&amp; (cur_time_in_day&lt;24*3600) ) )\n\t\t\t\t\t\t{\n                \t\t\tsleep_keep_time = my_workmode_info.conf.sleepplan_list&#91;i].sleep_keep_time - (cur_time_in_day - my_workmode_info.conf.sleepplan_list&#91;i].sleep_start_time);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if( cur_time_in_day &lt; my_workmode_info.conf.sleepplan_list&#91;i].sleep_keep_time-(24*3600-my_workmode_info.conf.sleepplan_list&#91;i].sleep_start_time) )\n\t\t\t\t\t\t{\n                \t\t\tsleep_keep_time = my_workmode_info.conf.sleepplan_list&#91;i].sleep_keep_time - (cur_time_in_day + 24*3600 - my_workmode_info.conf.sleepplan_list&#91;i].sleep_start_time);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(i>=5)\n\t\t\t{\n\t\t\t\tif(my_workmode_info.conf.workmode3_timer_sleep_keep_time>0)\n\t\t\t\t{\n\t\t\t\t\tsleep_keep_time = my_workmode_info.conf.workmode3_timer_sleep_keep_time;\n\t\t\t\t}\n\t\t\t}\n\t\t\tESP_LOGI(\"MyWorkmode_Check(workmode4_semitimer)\", \"i=%d, sleep_keep_time=%ds\", i, sleep_keep_time);\n        break;\n    }\n \n\tESP_LOGI(\"MyWorkmode_Check()\", \"final sleep_keep_time=%ds\", sleep_keep_time);\n\tif(sleep_keep_time>0)\n\t{\n\t\tif(sleep_keep_time > MYWORKMODE_ONCE_SLEEP_TIME_ULIMIT)\n\t\t{\n\t\t\tsleep_keep_time = MYWORKMODE_ONCE_SLEEP_TIME_ULIMIT;\n\t\t}\n\t\tmy_workmode_info.MyLowPower_Init_BeforeSleep();\n\t\tMyTime_PrintTime();\n\t\twakeup_reason = MyLowPower_EnterLightSleepFor(sleep_keep_time);\n\t\tMyTime_PrintTime();\n\t\tmy_workmode_info.MyLowPower_Init_AfterWakeup(wakeup_reason);\n\t}\n \n    if(wakeup_reason!=MYLOWPOWER_WAKEUP_TYPE_NO_SLEEP)\n    {\n        \n    }\n    return wakeup_reason;\n}\n \nvoid MyWorkmode_CallbackRegister_MyLowPower_Init_BeforeWakeup(void (*callback_func_beforesleep)(void))\n{\n\tmy_workmode_info.MyLowPower_Init_BeforeSleep = callback_func_beforesleep;\n}\n \nvoid MyWorkmode_CallbackRegister_MyLowPower_Init_AfterWakeup(void (*callback_func_aftersleep)(int))\n{\n\tmy_workmode_info.MyLowPower_Init_AfterWakeup = callback_func_aftersleep;\n}\n \nint MyWorkmode_Init(my_workmode_conf_t* conf, void (*callback_func_beforesleep)(void), void (*callback_func_aftersleep)(int))\n{\n \n    MyWorkmode_WorkList_To_SleepList(conf->workplan_list, 5, conf->sleepplan_list, 5);\n\tMyWorkmode_PickSleepKeepTime_Afterfirstpoweron(conf);\n \n    if(conf!=NULL)\n    {\n        memcpy(&amp;my_workmode_info.conf, conf, sizeof(my_workmode_info.conf));\n    }\n    else\n    {\n        my_workmode_info.conf.workmode = myworkmode_workmode_default;\n    }\n \n\tif(callback_func_beforesleep!=NULL)\n\t{\n\t\tMyWorkmode_CallbackRegister_MyLowPower_Init_BeforeWakeup(callback_func_beforesleep);\n\t}\n\tif(callback_func_aftersleep!=NULL)\n\t{\n\t\tMyWorkmode_CallbackRegister_MyLowPower_Init_AfterWakeup(callback_func_aftersleep);\n\t}\n \n    return 0;\n}\n \nint MyWorkmode_ReLoad_Conf(my_workmode_conf_t* conf)\n{\n    return MyWorkmode_Init(conf, NULL, NULL);\n}\n \nmy_workmode_t MyWorkmode_GetCurrentWorkmode(void)\n{\n    return my_workmode_info.conf.workmode;\n}\n \n#endif<\/code><\/pre>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u84dd\u7259\u6253\u5361+\u5b9a\u65f6\u62cd\u7167<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[4,3],"tags":[],"class_list":["post-131","post","type-post","status-publish","format-standard","hentry","category-4","category-3"],"_links":{"self":[{"href":"https:\/\/niuguodong.com\/index.php\/wp-json\/wp\/v2\/posts\/131","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/niuguodong.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/niuguodong.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/niuguodong.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/niuguodong.com\/index.php\/wp-json\/wp\/v2\/comments?post=131"}],"version-history":[{"count":0,"href":"https:\/\/niuguodong.com\/index.php\/wp-json\/wp\/v2\/posts\/131\/revisions"}],"wp:attachment":[{"href":"https:\/\/niuguodong.com\/index.php\/wp-json\/wp\/v2\/media?parent=131"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/niuguodong.com\/index.php\/wp-json\/wp\/v2\/categories?post=131"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/niuguodong.com\/index.php\/wp-json\/wp\/v2\/tags?post=131"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}