{"id":498857,"date":"2026-10-15T23:45:52","date_gmt":"2026-10-15T20:45:52","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=498857"},"modified":"2026-10-15T23:45:52","modified_gmt":"2026-10-15T20:45:52","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=498857","title":{"rendered":"\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0446\u0438\u0444\u0440\u043e\u0432\u043e\u0433\u043e \u0440\u0430\u0434\u0438\u043e\u043b\u044e\u0431\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u043d\u0430\u00a0\u0431\u0430\u0437\u0435 OFDM. PHY\u2011\u0443\u0440\u043e\u0432\u0435\u043d\u044c"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 <a href=\"https:\/\/habr.com\/en\/articles\/1070804\/\" rel=\"noopener nofollow\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438<\/a> \u0431\u044b\u043b\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0440\u0430\u0431\u043e\u0442\u044b PHY-\u0443\u0440\u043e\u0432\u043d\u044f \u0440\u0430\u0434\u0438\u043e\u043b\u044e\u0431\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e OFDM-\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043a \u0441\u0440\u0435\u0434\u0435 (MAC) \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043a\u0430\u043d\u0430\u043b\u043e\u043c (LLC), \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0445 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0442\u0440\u0430\u043d\u0441\u0438\u0432\u0435\u0440\u0430\u043c\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432\u043e\u0437\u043d\u0438\u043a\u0448\u0438\u0435 \u043f\u0440\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u044f.<\/p>\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0439 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 OFDM-\u043c\u043e\u0434\u0435\u043c \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u043b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 PHY-\u0443\u0440\u043e\u0432\u0435\u043d\u044c. \u0414\u043b\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0433\u043e \u043e\u0431\u043c\u0435\u043d\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\u043c\u0438 \u0441\u0435\u0442\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0445 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u0438, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u043a\u0430\u043d\u0430\u043b\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432.<\/p>\n<p>\u0412 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043c\u043e\u0434\u0435\u043b\u044c\u044e OSI \u043a\u0430\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 MAC \u0438 LLC \u043f\u043e\u0434\u0443\u0440\u043e\u0432\u043d\u0438. \u041f\u043e\u0434\u0443\u0440\u043e\u0432\u0435\u043d\u044c MAC (Medium Access Control) \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439 \u0432 \u0441\u0440\u0435\u0434\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438. \u0424\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 LLC (Logical Link Control) \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c, \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043d\u044f\u0442\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438\u0445 \u043a\u0432\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 (\u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435) \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u0446\u0438\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432.<\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0434\u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0439 OFDM-\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0438\u0437 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u043e\u0434\u043d\u043e\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 (\u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u0444\u0430) \u0432 \u043f\u043e\u043b\u043d\u043e\u0434\u0443\u043f\u043b\u0435\u043a\u0441\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0441\u0432\u044f\u0437\u0438.<\/p>\n<h3>TL;DR<\/h3>\n<p>\u0411\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u043e\u0432 (FSM) \u0438 \u0441\u043e\u043f\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u0420\u0430\u0434\u0438\u043e\u043b\u044e\u0431\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 &#171;\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435.<\/p>\n<p>\u041f\u043e\u0434 \u0441\u043f\u043e\u0439\u043b\u0435\u0440\u043e\u043c \u043a\u0440\u0430\u0442\u043a\u043e\u0435 \u0438\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0432\u043e\u043f\u0440\u043e\u0441-\u043e\u0442\u0432\u0435\u0442:<\/p>\n<details class=\"spoiler\">\n<summary>Hidden text<\/summary>\n<div class=\"spoiler__content\">\n<ul>\n<li>\n<p>\u0412: \u0447\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c \u043d\u0430 PHY-\u0443\u0440\u043e\u0432\u043d\u0435?<br \/>\u041e: \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b 16-QAM, 32-QAM \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438, \u0441\u043d\u0438\u0436\u0435\u043d PAPR, \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d \u044d\u043a\u0432\u0430\u043b\u0430\u0439\u0437\u0435\u0440, \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u0430\u043a\u0435\u0442\u0430, \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u043f\u0440\u0435\u0430\u043c\u0431\u0443\u043b\u044b.<\/p>\n<\/li>\n<li>\n<p>\u0412: \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0441 \u044d\u043a\u0432\u0430\u043b\u0430\u0439\u0437\u0435\u0440\u043e\u043c?<br \/>\u041e: \u044d\u0444\u0444\u0435\u043a\u0442 \u0434\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u0438 (\u0440\u0430\u0437\u043c\u044b\u0442\u0438\u044f) \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u044f \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u0412\u0438\u043d\u0435\u0440\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0412: \u043a\u0430\u043a\u043e\u0439 \u0442\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u0430\u043a\u0435\u0442\u0430?<br \/>\u041e: \u0434\u043b\u0438\u043d\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0430 10 \u0431\u0438\u0442\u043d\u044b\u043c \u043f\u043e\u043b\u0435\u043c len (\u0434\u043e 1023 \u0431\u0438\u0442 \u043d\u0430 \u0431\u043b\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445).<\/p>\n<\/li>\n<li>\n<p>\u0412: \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0441 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u043e\u043c?<br \/>\u041e: \u0442\u0435\u0445\u0434\u043e\u043b\u0433, \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 \u0433\u0438\u043f\u043e\u0442\u0435\u0437 ZC-\u043f\u0440\u0435\u0430\u043c\u0431\u0443\u043b\u044b \u043d\u0438\u0432\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043b \u0433\u0440\u0443\u0431\u0443\u044e \u043e\u0446\u0435\u043d\u043a\u0443 \u043f\u0440\u0435\u0430\u043c\u0431\u0443\u043b\u044b \u041d\u044c\u044e\u043c\u0430\u043d\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0412: \u0447\u0442\u043e \u0437\u0430 MAC \u0438 LLC?<br \/>\u041e: \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0443\u0437\u043b\u0430\u043c\u0438 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u0438 \u043e\u0431\u043c\u0435\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0412: \u043a\u0430\u043a \u043e\u043d\u0438 \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u044b?<br \/>\u041e: \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u043d\u0430\u044f (FSM) \u043b\u043e\u0433\u0438\u043a\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u043e\u0439 OFDM-\u043c\u043e\u0434\u0435\u043c\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0412: \u0430 \u043a\u0430\u043a \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442?<br \/>\u041e: \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u044b, \u0441\u0445\u043e\u0436\u0438\u0435 \u043f\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e \u0441 \u043f\u0430\u043a\u0435\u0442\u0430\u043c\u0438 \u0432 TCP\/IP.<\/p>\n<\/li>\n<li>\n<p>\u0412: \u043a\u0430\u043a \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435?<br \/>\u041e: \u0442\u0440\u0435\u0445\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0435 \u0440\u0443\u043a\u043e\u043f\u043e\u0436\u0430\u0442\u0438\u0435 \u0432 \u043f\u043e\u043b\u0443\u0434\u0443\u043f\u043b\u0435\u043a\u0441\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0412: \u043a\u0430\u043a \u0432 \u043f\u043e\u043b\u0443\u0434\u0443\u043f\u043b\u0435\u043a\u0441\u0435 \u0440\u0435\u0448\u0435\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 &#171;\u043d\u0430\u0432\u0441\u0442\u0440\u0435\u0447\u0443&#187;?<br \/>\u041e: \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0442\u0430\u0439\u043c-\u0441\u043b\u043e\u0442\u043e\u0432, \u043f\u0440\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0438 \u0443\u0437\u043b\u044b \u0434\u043e\u0433\u043e\u0432\u0430\u0440\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043a\u0442\u043e \u0432 \u043a\u0430\u043a\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443.<\/p>\n<\/li>\n<li>\n<p>\u0412: \u043a\u0430\u043a\u043e\u0439 \u043f\u0438\u043d\u0433?<br \/>\u041e: \u0432 \u043b\u0430\u0431\u043e\u0440\u0430\u0442\u043e\u0440\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u0430\u0445 \u043f\u0438\u043d\u0433 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 5 \u0441\u0435\u043a \u0438\u0437-\u0437\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u044b, \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u043e\u0433 200-300 \u043c\u0441.\u00a0<\/p>\n<\/li>\n<li>\n<p>\u0412: \u043a\u0430\u043a\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445?<br \/>\u041e: \u043f\u043e \u043e\u0446\u0435\u043d\u043a\u0435 \u043a\u0430\u043d\u0430\u043b\u0430 \u0443\u0437\u043b\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442 \u0441 \u043a\u0430\u043a\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u0433\u043e\u0442\u043e\u0432\u044b \u0432\u0435\u0441\u0442\u0438 \u043f\u0440\u0438\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445; \u0432 \u043f\u0438\u043a\u0435 \u0434\u043e 1500 \u0431\u0438\u0442\/\u0441\u0435\u043a \u0441 16-QAM \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0435\u0439 \u0438 \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u043d\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u043a\u043e\u0434\u0435\u0440\u0430 (\u043f\u0440\u043e\u0440\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435\u043c); \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c 32-QAM \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u0435\u0449\u0435 \u0432\u044b\u0448\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0412: \u043a\u0430\u043a \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f?<br \/>\u041e: \u0440\u0435\u0436\u0438\u043c Stop-and-Wait \u0441 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435\u043c \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u0438 \u0440\u0435\u0436\u0438\u043c bulk, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u043a\u043e\u043f \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0435\u0434\u0438\u043d\u043e\u0436\u0434\u044b.<\/p>\n<\/li>\n<li>\n<p>\u0412: \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c ARQ?<br \/>\u041e: \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<\/li>\n<li>\n<p>\u0412: \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c?<br \/>\u041e: \u0442\u0435\u043a\u0441\u0442 (\u043e\u0442\u043a\u0440\u044b\u0442\u043e \u0438\u043b\u0438 \u0441\u043e \u0441\u0436\u0430\u0442\u0438\u0435\u043c), \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<h2>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0430 PHY-\u0443\u0440\u043e\u0432\u043d\u0435<\/h2>\n<p>\u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c MAC \u0438 LLC-\u0443\u0440\u043e\u0432\u043d\u0435\u0439, \u043c\u043e\u0434\u0435\u0440\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0434\u0432\u0435\u0440\u0433\u0441\u044f \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439 (PHY) \u0443\u0440\u043e\u0432\u0435\u043d\u044c. \u0411\u044b\u043b \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u043c\u0435\u0442\u043e\u0434 \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 16-QAM, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 4 \u0431\u0438\u0442 \u043d\u0430 \u043e\u0434\u0438\u043d \u043f\u043e\u0434\u043d\u0435\u0441\u0443\u0449\u0438\u0439 \u0441\u0438\u043c\u0432\u043e\u043b. \u0422\u0430\u043a\u0436\u0435 \u0431\u044b\u043b\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u043d\u0435\u0441\u0443\u0449\u0438\u0445 \u0432 \u043e\u0434\u043d\u043e\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u0435, \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0447\u0430\u0441\u0442\u043e\u0442 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 46.875 \u0413\u0446. \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c\u044b\u0439 OFDM-\u0441\u0438\u043c\u0432\u043e\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u0435\u0442\u043a\u0443 \u0438\u0437 53 \u043e\u0440\u0442\u043e\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u0434\u043d\u0435\u0441\u0443\u0449\u0438\u0445.<\/p>\n<h3>PSK-\u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u044f<\/h3>\n<p>\u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0430\u0445 1, 2, 3 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0441\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0439 \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0438\u043c \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u0438\u0442.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/d6\/f2\/b6\/d6f2b6cb9a56575950e5e1714fc89051.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 1. \u0421\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0435 BPSK.\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 1. \u0421\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0435 BPSK.\" width=\"1622\" height=\"1770\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/d6\/f2\/b6\/d6f2b6cb9a56575950e5e1714fc89051.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/d6\/f2\/b6\/d6f2b6cb9a56575950e5e1714fc89051.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 1. \u0421\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0435 BPSK.<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f BPSK:<\/p>\n<pre><code class=\"python\">_MAPPING_TABLE = {    (0,): -1 + 0j,    (1,): 1 + 0j,}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper\"><\/span><\/a><\/div><\/pre>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/38\/52\/5c\/38525c5bab94d6c11761e157cd38fa0a.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 2. \u0421\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0435 QPSK.\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 2. \u0421\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0435 QPSK.\" width=\"1772\" height=\"1769\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/38\/52\/5c\/38525c5bab94d6c11761e157cd38fa0a.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/38\/52\/5c\/38525c5bab94d6c11761e157cd38fa0a.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 2. \u0421\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0435 QPSK.<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f QPSK:<\/p>\n<pre><code class=\"python\">_NORM = np.sqrt(2.0)_MAPPING_TABLE = {    (0, 0): (-1.0 - 1j) \/ _NORM,    (0, 1): (-1.0 + 1j) \/ _NORM,    (1, 1): (1.0 + 1j) \/ _NORM,    (1, 0): (1.0 - 1j) \/ _NORM,}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/d6\/39\/03\/d639032f478cf0f7f6c64e8fa7dccc27.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 3. \u0421\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0435 16-QAM.\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 3. \u0421\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0435 16-QAM.\" width=\"1779\" height=\"1748\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/d6\/39\/03\/d639032f478cf0f7f6c64e8fa7dccc27.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/d6\/39\/03\/d639032f478cf0f7f6c64e8fa7dccc27.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 3. \u0421\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0435 16-QAM.<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f 16-QAM:<\/p>\n<pre><code class=\"python\">_NORM = np.sqrt(10.0)_MAPPING_TABLE = {    (0, 0, 0, 0): (-3.0 - 3j) \/ _NORM,    (0, 0, 0, 1): (-3.0 - 1j) \/ _NORM,    (0, 0, 1, 1): (-3.0 + 1j) \/ _NORM,    (0, 0, 1, 0): (-3.0 + 3j) \/ _NORM,    (0, 1, 0, 0): (-1.0 - 3j) \/ _NORM,    (0, 1, 0, 1): (-1.0 - 1j) \/ _NORM,    (0, 1, 1, 1): (-1.0 + 1j) \/ _NORM,    (0, 1, 1, 0): (-1.0 + 3j) \/ _NORM,    (1, 1, 0, 0): (1.0 - 3j) \/ _NORM,    (1, 1, 0, 1): (1.0 - 1j) \/ _NORM,    (1, 1, 1, 1): (1.0 + 1j) \/ _NORM,    (1, 1, 1, 0): (1.0 + 3j) \/ _NORM,    (1, 0, 0, 0): (3.0 - 3j) \/ _NORM,    (1, 0, 0, 1): (3.0 - 1j) \/ _NORM,    (1, 0, 1, 1): (3.0 + 1j) \/ _NORM,    (1, 0, 1, 0): (3.0 + 3j) \/ _NORM,}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0443\u0440\u043d\u043e\u0439 \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u043d\u043e\u0439 \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 16-QAM \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u043b\u043e\u0442\u043d\u044b\u043c \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0435\u043c, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043e 4 \u0431\u0438\u0442\u0430 \u0432 \u043e\u0434\u043d\u043e\u043c \u0441\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u0435. \u0414\u043b\u044f \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u0432 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u0437\u0430\u043c\u0438\u0440\u0430\u043d\u0438\u0439 \u0438 \u0448\u0443\u043c\u043e\u0432 \u043f\u0440\u0438 \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0434 \u0413\u0440\u0435\u044f.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435, \u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u044f 32-QAM, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0449\u0430\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441 \u0434\u043e 5 \u0431\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432 \u0441\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0438\u043c\u043e\u0432\u043b\u0435.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/b1\/86\/ec\/b186ec78374fda1fe01057a4452e6281.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 4. \u0421\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0435 32-QAM.\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 4. \u0421\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0435 32-QAM.\" width=\"1700\" height=\"1769\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/b1\/86\/ec\/b186ec78374fda1fe01057a4452e6281.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/b1\/86\/ec\/b186ec78374fda1fe01057a4452e6281.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 4. \u0421\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0435 32-QAM.<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f 16-QAM:<\/p>\n<pre><code class=\"python\">_NORM = np.sqrt(20.0)_MAPPING_TABLE = {    (0, 0, 0, 0, 0): (-3.0 - 5j) \/ _NORM, (0, 0, 0, 0, 1): (-3.0 - 3j) \/ _NORM,    (0, 0, 0, 1, 1): (-3.0 - 1j) \/ _NORM, (0, 0, 0, 1, 0): (-3.0 + 1j) \/ _NORM,    (0, 0, 1, 1, 0): (-3.0 + 3j) \/ _NORM, (0, 0, 1, 1, 1): (-3.0 + 5j) \/ _NORM,    (0, 1, 0, 0, 0): (-1.0 - 5j) \/ _NORM, (0, 1, 0, 0, 1): (-1.0 - 3j) \/ _NORM,    (0, 1, 0, 1, 1): (-1.0 - 1j) \/ _NORM, (0, 1, 0, 1, 0): (-1.0 + 1j) \/ _NORM,    (0, 1, 1, 1, 0): (-1.0 + 3j) \/ _NORM, (0, 1, 1, 1, 1): (-1.0 + 5j) \/ _NORM,    (1, 1, 0, 0, 0): (1.0 - 5j) \/ _NORM, (1, 1, 0, 0, 1): (1.0 - 3j) \/ _NORM,    (1, 1, 0, 1, 1): (1.0 - 1j) \/ _NORM, (1, 1, 0, 1, 0): (1.0 + 1j) \/ _NORM,    (1, 1, 1, 1, 0): (1.0 + 3j) \/ _NORM, (1, 1, 1, 1, 1): (1.0 + 5j) \/ _NORM,    (1, 0, 0, 0, 0): (3.0 - 5j) \/ _NORM, (1, 0, 0, 0, 1): (3.0 - 3j) \/ _NORM,    (1, 0, 0, 1, 1): (3.0 - 1j) \/ _NORM, (1, 0, 0, 1, 0): (3.0 + 1j) \/ _NORM,    (1, 0, 1, 1, 0): (3.0 + 3j) \/ _NORM, (1, 0, 1, 1, 1): (3.0 + 5j) \/ _NORM,    (0, 0, 1, 0, 0): (-5.0 - 3j) \/ _NORM, (0, 0, 1, 0, 1): (-5.0 - 1j) \/ _NORM,    (0, 1, 1, 0, 1): (-5.0 + 1j) \/ _NORM, (0, 1, 1, 0, 0): (-5.0 + 3j) \/ _NORM,    (1, 0, 1, 0, 0): (5.0 - 3j) \/ _NORM, (1, 0, 1, 0, 1): (5.0 - 1j) \/ _NORM,    (1, 1, 1, 0, 1): (5.0 + 1j) \/ _NORM, (1, 1, 1, 0, 0): (5.0 + 3j) \/ _NORM,}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<blockquote>\n<p>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<br \/>32-QAM \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u044f \u0431\u044b\u043b\u0430 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u043a \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438. \u0422\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0430 \u043d\u0435 \u0431\u044b\u043b\u0430 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043e\u043d\u0430 \u0438\u043c\u0435\u0435\u0442 \u0441\u0442\u0430\u0442\u0443\u0441 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439. \u041f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u044f \u0441 \u0434\u0430\u043d\u043d\u044b\u043c \u0442\u0438\u043f\u043e\u043c \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 \u043d\u0435 \u0443\u0432\u0435\u043d\u0447\u0430\u043b\u0438\u0441\u044c \u0443\u0441\u043f\u0435\u0445\u043e\u043c \u0438\u0437-\u0437\u0430 \u0434\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u0438 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0439 (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0441\u043c. \u043d\u0438\u0436\u0435). \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0435 \u043b\u0430\u0431\u043e\u0440\u0430\u0442\u043e\u0440\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u044e\u0442 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430.<\/p>\n<\/blockquote>\n<p>\u041f\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 OFDM \u043a \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438, \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e\u0439 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u0445 \u0441\u0435\u043c\u043f\u043b\u043e\u0432 (\u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043d\u0430 1 \u0441\u0435\u043c\u043f\u043b \u0438\u043d\u0434\u0443\u0446\u0438\u0440\u0443\u0435\u0442 \u0444\u0430\u0437\u043e\u0432\u044b\u0439 \u0441\u0434\u0432\u0438\u0433, \u0430 \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u044c \u0432 3 \u0441\u0435\u043c\u043f\u043b\u0430 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043f\u043e\u043b\u043d\u043e\u0439 \u043f\u043e\u0442\u0435\u0440\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0434\u0435\u043c\u043e\u0434\u0443\u043b\u044f\u0442\u043e\u0440\u0430 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0438\u0433\u043d\u0430\u043b), \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u0432\u0443\u0445\u044d\u0442\u0430\u043f\u043d\u0443\u044e \u0441\u0445\u0435\u043c\u0443 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438, \u0431\u0430\u0437\u0438\u0440\u0443\u044e\u0449\u0435\u0439\u0441\u044f \u043d\u0430 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 \u043f\u0440\u0435\u0430\u043c\u0431\u0443\u043b \u041d\u044c\u044e\u043c\u0430\u043d\u0430 \u0438 \u0417\u0430\u0434\u043e\u0432\u0430-\u0427\u0443 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043a\u043e\u0433\u0435\u0440\u0435\u043d\u0442\u043d\u044b\u043c \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u043c\u0435\u0445\u043e\u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u0412 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 \u0433\u0438\u043f\u043e\u0442\u0435\u0437 \u0432 \u0448\u0438\u0440\u043e\u043a\u043e\u0439 \u043f\u043e\u043b\u043e\u0441\u0435 \u0447\u0430\u0441\u0442\u043e\u0442 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u043e\u043c \u043f\u0440\u0435\u0430\u043c\u0431\u0443\u043b\u044b \u041d\u044c\u044e\u043c\u0430\u043d\u0430. \u0414\u0435\u0442\u0435\u043a\u0442\u043e\u0440 ZC-\u043f\u0440\u0435\u0430\u043c\u0431\u0443\u043b\u044b \u0435\u0434\u0438\u043d\u043e\u0440\u0430\u0437\u043e\u0432\u043e \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u0442\u043e\u0447\u043d\u0443\u044e \u043e\u0446\u0435\u043d\u043a\u0443 CFO \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0441\u0432\u043e\u0435\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u043b\u043e\u0441\u044b \u0447\u0430\u0441\u0442\u043e\u0442 \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0442\u043e\u0447\u043d\u044b\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043d\u0430\u0447\u0430\u043b\u0430 OFDM-\u0441\u0438\u0433\u043d\u0430\u043b\u0430.<\/p>\n<blockquote>\n<p>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<\/p>\n<p>\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u044d\u0442\u043e\u0442 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0434\u043e\u043b\u0433 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043b \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u0442\u043e\u0447\u043d\u043e\u0439 \u043e\u0446\u0435\u043d\u043a\u0438 CFO \u043f\u043e ZC-\u043f\u0440\u0435\u0430\u043c\u0431\u0443\u043b\u0435 \u043d\u0438\u0432\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0433\u0440\u0443\u0431\u043e\u0433\u043e \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u043f\u043e \u043f\u0440\u0435\u0430\u043c\u0431\u0443\u043b\u0435 \u041d\u044c\u044e\u043c\u0430\u043d\u0430. \u0422\u0430\u043a, \u0435\u0441\u043b\u0438 \u043e\u0446\u0435\u043d\u043a\u0430 \u041d\u044c\u044e\u043c\u0430\u043d\u0430 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043b\u0430 \u0441\u0434\u0432\u0438\u0433 \u0432 101.3 \u0413\u0446, \u0442\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c ZC \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u043b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 -101.5 \u0413\u0446, \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e\u043c\u043f\u0435\u043d\u0441\u0438\u0440\u0443\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0443\u044e \u043f\u043e\u043f\u0440\u0430\u0432\u043a\u0443, \u0447\u0442\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u043b\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u0430.<\/p>\n<p>\u0414\u0430\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u043b\u0430\u0441\u044c \u0432 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445, \u043a\u043e\u0433\u0434\u0430 \u0432 \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u043c \u0442\u0440\u0430\u043a\u0442\u0435 \u043f\u043e\u043c\u0438\u043c\u043e \u0447\u0430\u0441\u0442\u043e\u0442\u043d\u043e\u0433\u043e \u0434\u0440\u0435\u0439\u0444\u0430 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u043d\u044b\u0435 \u043d\u0435\u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0441\u0442\u0438 \u0438 \u0444\u0430\u0437\u043e\u0432\u044b\u0435 \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u0430.<\/p>\n<\/blockquote>\n<pre><code>coarse: 27.4511Hz fine: -0.0596Hzcoarse: 27.4387Hz fine: -0.1148Hzcoarse: 27.4294Hz fine: 0.0565Hzcoarse: 27.4118Hz fine: -0.0813Hz<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h3>\u0421\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u043f\u0438\u043a-\u0444\u0430\u043a\u0442\u043e\u0440\u0430<\/h3>\n<p>\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u0441 \u0446\u0435\u043b\u044c\u044e \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u044f PAPR \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u043b\u0441\u044f \u043c\u0435\u0442\u043e\u0434 \u043a\u043b\u0438\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 (CAF), \u0437\u0430\u0434\u0430\u0447\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044e \u0432\u044b\u0441\u043e\u043a\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0435\u0439 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0438\u0445 \u0432\u043d\u0435\u043f\u043e\u043b\u043e\u0441\u043d\u044b\u0445 \u0441\u043f\u0435\u043a\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0445. \u041c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u043b\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0435 PAPR \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u043b\u043e \u043a \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044e \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u043e\u0436\u043d\u044b\u0445 \u043e\u0446\u0435\u043d\u043e\u043a CFO.<\/p>\n<pre><code class=\"python\">class OFDMWavModem(OFDMIQModem):    DEFAULT_SAMPLE_RATE = 12000    CAF_COUNT = 3    def mod_payload_signal(self, header_payload: npt.NDArray[np.uint8], packet_payload: npt.NDArray[np.uint8],                           mode: ModType) -&gt; npt.NDArray[np.float64]:        assert self.CAF_COUNT &gt;= 1        signal_full = super().mod_payload_signal(header_payload, packet_payload, mode)        for _ in range(self.CAF_COUNT):            signal_full = clip_and_filter(                signal_full,                papr_cutoff_db=6.0, cutoff_freq_hz=3000,                fs_hz=self.DEFAULT_SAMPLE_RATE)        gain = 0.9        signal = signal_full \/ np.max(np.abs(signal_full)) * gain        return signal<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 CAF_COUNT=3 \u0431\u044b\u043b\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u044d\u043c\u043f\u0438\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0443\u0442\u0435\u043c. \u041f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0435 PAPR \u043f\u0440\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043d\u0435\u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0445 \u0444\u0430\u0437\u043e\u0432\u044b\u0445 \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u0439 \u0441\u0438\u0433\u043d\u0430\u043b\u0430.<\/p>\n<pre><code class=\"python\">class OFDMSoundModem(OFDMWavModem):    def _get_mode_256(self) -&gt; dict:        return dict(            mapper=BPSKMapper,            sample_rate=self.DEFAULT_SAMPLE_RATE,            fft_bins=256,            freq_lo=300,            freq_hi=2750,            zc_preamble_root=31,            zc_preamble_len=53,            zc_preamble_count=4,            zc_pilots_root=57,            zc_pilots_count=11,            cp_percent=0.25,            sym_tile=4,            max_cfo=8,            detection_threshold=0.20,        )    def _get_mode_128(self) -&gt; dict:        return dict(            mapper=BPSKMapper,            sample_rate=self.DEFAULT_SAMPLE_RATE,            fft_bins=128,            freq_lo=300,            freq_hi=2400,            zc_preamble_root=17,            zc_preamble_len=23,            zc_preamble_count=4,            zc_pilots_root=3,            zc_pilots_count=7,            cp_percent=0.25,            sym_tile=4,            max_cfo=4,            detection_threshold=0.20,        )    _get_modem_params = _get_mode_256<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043f\u0435\u043a\u0442\u0440\u0430 \u0438\u0437 53 \u043f\u043e\u0434\u043d\u0435\u0441\u0443\u0449\u0438\u0445 \u0431\u044b\u043b\u0430 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u0430\u044f \u043f\u043e\u043b\u043e\u0441\u0430 \u0447\u0430\u0441\u0442\u043e\u0442, \u043e\u0442 300 \u0434\u043e 2750 \u0413\u0446. \u041f\u043e\u0434 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u043f\u0438\u043b\u043e\u0442-\u0441\u0438\u0433\u043d\u0430\u043b\u044b \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043e 11 \u043f\u043e\u0434\u043d\u0435\u0441\u0443\u0449\u0438\u0445. \u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u043c \u0441\u043f\u0435\u043a\u0442\u0440\u0430 \u0431\u044b\u043b \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0447\u0430\u0441\u0442\u043e\u0442\u043d\u044b\u0445 \u0433\u0438\u043f\u043e\u0442\u0435\u0437 \u043f\u0440\u0438 \u043f\u043e\u0438\u0441\u043a\u0435 \u043f\u0440\u0435\u0430\u043c\u0431\u0443\u043b\u044b \u0432 \u0441\u0438\u0433\u043d\u0430\u043b\u0435 (\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>max_cfo=8<\/code>).<\/p>\n<h3>\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043f\u0430\u043a\u0435\u0442\u0430<\/h3>\n<p>\u0411\u0430\u0437\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043d\u0435 \u043f\u0440\u0435\u0442\u0435\u0440\u043f\u0435\u043b\u0430 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439. \u041f\u043e\u0434 \u043f\u043e\u043b\u0435 <code>len<\/code> \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043e 10 \u0431\u0438\u0442, \u0447\u0442\u043e \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b \u0434\u043b\u0438\u043d\u043e\u0439 \u0434\u043e 1023 \u0431\u0438\u0442.<\/p>\n<blockquote>\n<p>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<br \/>\u0412\u0432\u0438\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u0446\u0438\u0438 \u0441 \u043d\u0443\u043b\u0435\u0432\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u0430 \u043d\u0435 \u043a\u0440\u0430\u0442\u0435\u043d \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u0434\u0432\u043e\u0439\u043a\u0438. \u0410\u0432\u0442\u043e\u0440 \u043e\u0442\u0434\u0430\u0435\u0442 \u0441\u0435\u0431\u0435 \u043e\u0442\u0447\u0435\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0431\u0435\u0441\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0434\u043b\u0438\u043d\u044b, \u043d\u043e \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u043e\u0439 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u0446\u0438\u0438 \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043f\u0440\u0435\u043d\u0435\u0431\u0440\u0435\u0433.<\/p>\n<\/blockquote>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"73\" width=\"73\">\n<p align=\"left\">\u041f\u043e\u043b\u0435<\/p>\n<\/td>\n<td data-colwidth=\"109\" width=\"109\">\n<p align=\"left\">\u0422\u0438\u043f<\/p>\n<\/td>\n<td data-colwidth=\"122\" width=\"122\">\n<p align=\"left\">\u0420\u0430\u0437\u043c\u0435\u0440 (\u0431\u0438\u0442)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"73\" width=\"73\">\n<p align=\"left\">ver<\/p>\n<\/td>\n<td data-colwidth=\"109\" width=\"109\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"122\" width=\"122\">\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u043e\u043c\u0435\u0440 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"73\" width=\"73\">\n<p align=\"left\">typ<\/p>\n<\/td>\n<td data-colwidth=\"109\" width=\"109\">\n<p align=\"left\">PacketType<\/p>\n<\/td>\n<td data-colwidth=\"122\" width=\"122\">\n<p align=\"left\">4<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0422\u0438\u043f \u043f\u0430\u043a\u0435\u0442\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"73\" width=\"73\">\n<p align=\"left\">mod<\/p>\n<\/td>\n<td data-colwidth=\"109\" width=\"109\">\n<p align=\"left\">ModType<\/p>\n<\/td>\n<td data-colwidth=\"122\" width=\"122\">\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0422\u0438\u043f \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"73\" width=\"73\">\n<p align=\"left\">spd<\/p>\n<\/td>\n<td data-colwidth=\"109\" width=\"109\">\n<p align=\"left\">CCSpeed<\/p>\n<\/td>\n<td data-colwidth=\"122\" width=\"122\">\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"73\" width=\"73\">\n<p align=\"left\">len<\/p>\n<\/td>\n<td data-colwidth=\"109\" width=\"109\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"122\" width=\"122\">\n<p align=\"left\">10<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0420\u0430\u0437\u043c\u0435\u0440 \u043f\u0430\u043a\u0435\u0442\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"73\" width=\"73\">\n<p align=\"left\">CRC<\/p>\n<\/td>\n<td data-colwidth=\"109\" width=\"109\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"122\" width=\"122\">\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0421\u0443\u043c\u043c\u0430\u0440\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0435\u043c\u043a\u043e\u0441\u0442\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 28 \u0431\u0438\u0442.<\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430:<\/p>\n<pre><code class=\"python\">@bit_packet@dataclassclass Header(PacketCRC8):    ver: int = field(default=IntField(2, min_val=1))    typ: PacketType = field(default=EnumField(PacketType, 4))    mod: ModType = field(default=EnumField(ModType, 2))    spd: CCSpeed = field(default=EnumField(CCSpeed, 2))    len: int = field(default=IntField(10, min_val=1))<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <code>ModType<\/code> \u043f\u043e\u043b\u044f mod \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0430 \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 16-QAM \u0438 32-QAM.<\/p>\n<pre><code class=\"python\">class ModType(Enum):    BPSK = 0    QPSK = 1    QAM16 = 2    QAM32 = 3<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043e\u043b\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f spd \u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.<\/p>\n<pre><code class=\"python\">class CCSpeed(Enum):    R13 = 0  # 1\/3 slow    R12 = 1  # 1\/2    R23 = 2  # 2\/3    R34 = 3  # 3\/4 fast<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438, \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u043c\u0435\u0445\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c BPSK \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u0441\u0432\u0435\u0440\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u2153.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430: <code>Header(ver=1, typ=&lt;PacketType.BEACON: 0&gt;, mod=&lt;ModType.BPSK: 0&gt;, spd=&lt;CCSpeed.R13: 0&gt;, len=90)<\/code><\/p>\n<p>\u0411\u0438\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435: <code>01_0000_00_00_0001011010_[01111001]<\/code>.<\/p>\n<h3>\u042d\u043a\u0432\u0430\u043b\u0430\u0439\u0437\u0435\u0440 \u0438 \u0444\u0438\u043b\u044c\u0442\u0440 \u0412\u0438\u043d\u0435\u0440\u0430<\/h3>\n<p>\u0412 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\/\u0448\u0443\u043c (SNR) \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u044d\u043a\u0432\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u0412\u0438\u043d\u0435\u0440\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u043b \u0434\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u044e \u0441\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u044f (\u0440\u0438\u0441\u0443\u043d\u043e\u043a 5), \u0447\u0442\u043e \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0439 \u0432\u044b\u0441\u0448\u0438\u0445 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a (BER).<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/6a\/1d\/84\/6a1d8444d7679f81457413072e68ad0c.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 5. \u0414\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u044f \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u0412\u0438\u043d\u0435\u0440\u0430 \u043f\u0440\u0438 \u0432\u044b\u0441\u043e\u043a\u043e\u043c SNR.\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 5. \u0414\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u044f \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u0412\u0438\u043d\u0435\u0440\u0430 \u043f\u0440\u0438 \u0432\u044b\u0441\u043e\u043a\u043e\u043c SNR.\" width=\"486\" height=\"242\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/6a\/1d\/84\/6a1d8444d7679f81457413072e68ad0c.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/6a\/1d\/84\/6a1d8444d7679f81457413072e68ad0c.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 5. \u0414\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u044f \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u0412\u0438\u043d\u0435\u0440\u0430 \u043f\u0440\u0438 \u0432\u044b\u0441\u043e\u043a\u043e\u043c SNR.<\/figcaption><\/div>\n<\/figure>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/5d\/6b\/ce\/5d6bce8377f9297a0bb848290c2e03ca.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 6. \u0412\u043b\u0438\u044f\u043d\u0438\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u0412\u0438\u043d\u0435\u0440\u0430 \u043f\u0440\u0438 \u0441\u0438\u043b\u044c\u043d\u043e\u0439 \u0434\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u044f.\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 6. \u0412\u043b\u0438\u044f\u043d\u0438\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u0412\u0438\u043d\u0435\u0440\u0430 \u043f\u0440\u0438 \u0441\u0438\u043b\u044c\u043d\u043e\u0439 \u0434\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u044f.\" width=\"486\" height=\"242\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/5d\/6b\/ce\/5d6bce8377f9297a0bb848290c2e03ca.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/5d\/6b\/ce\/5d6bce8377f9297a0bb848290c2e03ca.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 6. \u0412\u043b\u0438\u044f\u043d\u0438\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u0412\u0438\u043d\u0435\u0440\u0430 \u043f\u0440\u0438 \u0441\u0438\u043b\u044c\u043d\u043e\u0439 \u0434\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u044f.<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u0430\u043d\u043d\u044b\u0439 \u044d\u0444\u0444\u0435\u043a\u0442 \u0431\u044b\u043b \u0432\u044b\u0437\u0432\u0430\u043d \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0432 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0435 \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0432\u0435\u0441\u043e\u0432 \u0412\u0438\u043d\u0435\u0440\u0430. \u041f\u0440\u0438 \u0432\u044b\u0441\u043e\u043a\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u0445 SNR \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u0438\u0441\u043f\u0435\u0440\u0441\u0438\u0438 \u0448\u0443\u043c\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u043b\u043e\u0441\u044c \u0441\u043d\u0438\u0437\u0443 \u043d\u0430 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u0435\u0440\u0435\u0440\u0435\u0433\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0444\u0438\u043b\u044c\u0442\u0440 \u0432\u043d\u043e\u0441\u0438\u043b \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e\u0435 \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0432 \u043d\u0435\u0438\u0441\u043a\u0430\u0436\u0435\u043d\u043d\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b. \u0414\u043b\u044f \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u0432 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u044d\u043a\u0432\u0430\u043b\u0430\u0439\u0437\u0435\u0440\u0430 \u0431\u044b\u043b\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430 \u0434\u0438\u0441\u043f\u0435\u0440\u0441\u0438\u0438 \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u043d\u043e-\u0447\u0430\u0441\u0442\u043e\u0442\u043d\u043e\u0439 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 (\u0410\u0427\u0425), \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u043e\u0439 \u043f\u043e\u0441\u043b\u0435 \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u043c Zero Forcing. \u041d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u044d\u0442\u043e\u0439 \u043e\u0446\u0435\u043d\u043a\u0438 \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u044b\u0439 \u0444\u0438\u043b\u044c\u0442\u0440 \u0412\u0438\u043d\u0435\u0440\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u2014 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043f\u043e\u0434\u043d\u0435\u0441\u0443\u0449\u0438\u0445 \u0441 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u044c\u044e \u0434\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 (\u0440\u0438\u0441\u0443\u043d\u043e\u043a 7).<\/p>\n<pre><code class=\"python\">core_channel = H_abs_init[4:-4]channel_ripple = np.max(core_channel) - np.min(core_channel)if channel_ripple &gt; 0.6:    H_est = self._channel_estimate_wiener(pilots_ref, pilots, self._pilot_carriers, curr_noise_var)    equalized_all = (demod_channel * np.conj(H_est)) \/ (np.abs(H_est) ** 2 + curr_noise_var)    equalized_data_symbols = equalized_all[self._data_local_indices]else:    H_est = H_est_init    equalized_data_symbols = data_init<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043e\u0446\u0435\u043d\u043a\u0438 \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0435\u0439 \u0410\u0427\u0425 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u043e\u0434\u043d\u0435\u0441\u0443\u0449\u0438\u0445. \u042d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u0435\u043d\u0441\u0430\u0446\u0438\u0438 \u0441\u043f\u0430\u0434\u0430 \u0410\u0427\u0425 \u0432 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u043e\u043b\u043e\u0441\u0430\u0445 \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0433\u043e \u0442\u0440\u0430\u043a\u0442\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u043b\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432\u043b\u0438\u044f\u043d\u0438\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u0443\u0442\u0435\u0447\u043a\u0438 \u0441\u043f\u0435\u043a\u0442\u0440\u0430 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e \u0447\u0430\u0441\u0442\u043e\u0442\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430.<\/p>\n<p>\u041f\u043e\u0440\u043e\u0433\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 0.6 \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <code>channel_ripple<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0442\u0435\u043f\u0435\u043d\u044c \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0438 \u0410\u0427\u0425 \u043f\u043e \u043f\u043e\u0434\u043d\u0435\u0441\u0443\u0449\u0438\u043c. \u041f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0440\u043e\u0433\u0430 \u0437\u0430\u0442\u0443\u0445\u0430\u043d\u0438\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u0434\u043d\u0435\u0441\u0443\u0449\u0438\u0445 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 \u0443\u0440\u043e\u0432\u043d\u044f \u043e\u0442 -3 \u0434\u043e -4 \u0434\u0411. \u0412 \u044d\u0442\u0438\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u044d\u043a\u0432\u0430\u043b\u0430\u0439\u0437\u0435\u0440\u0430 Zero Forcing \u0438\u0437-\u0437\u0430 \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u0443\u0441\u0438\u043b\u0435\u043d\u0438\u044f \u0448\u0443\u043c\u0430, \u0447\u0442\u043e \u043e\u0431\u0443\u0441\u043b\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u0412\u0438\u043d\u0435\u0440\u0430.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/b2\/ac\/0a\/b2ac0a322af509fb839714b74647da94.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 7. \u0421\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0435 16-QAM \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f ZF-\u044d\u043a\u0432\u0430\u043b\u0430\u0439\u0437\u0435\u0440\u0430.\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 7. \u0421\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0435 16-QAM \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f ZF-\u044d\u043a\u0432\u0430\u043b\u0430\u0439\u0437\u0435\u0440\u0430.\" width=\"491\" height=\"245\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/b2\/ac\/0a\/b2ac0a322af509fb839714b74647da94.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/b2\/ac\/0a\/b2ac0a322af509fb839714b74647da94.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 7. \u0421\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0435 16-QAM \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f ZF-\u044d\u043a\u0432\u0430\u043b\u0430\u0439\u0437\u0435\u0440\u0430.<\/figcaption><\/div>\n<\/figure>\n<blockquote>\n<p>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<br \/>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u043e\u0433\u043e \u0432 BPSK \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438, \u043d\u0430 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u044f \u043e\u043d \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 \u0434\u0432\u0443\u0445 \u0430\u043d\u043e\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043a\u0430\u043a \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b. \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0441\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0435 \u0432\u0441\u0435\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 \u043f\u0430\u043a\u0435\u0442\u0430 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u0435\u0434\u0438\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0442\u043e\u0447\u0435\u043a.<\/p>\n<\/blockquote>\n<h3>\u0414\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u043e\u0432<\/h3>\n<p>\u0412\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0439 \u0431\u0443\u0444\u0435\u0440, \u0433\u043b\u0443\u0431\u0438\u043d\u0430 \u043f\u0430\u043c\u044f\u0442\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u0430 \u043d\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434. \u0414\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u043e\u043c, \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 (\u0440\u0438\u0441\u0443\u043d\u043e\u043a 8).<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/86\/d1\/6c\/86d16c575ba4d0e5d743882559122afd.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 8. \u0413\u0440\u0430\u0444 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 8. \u0413\u0440\u0430\u0444 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.\" width=\"1091\" height=\"543\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/86\/d1\/6c\/86d16c575ba4d0e5d743882559122afd.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/86\/d1\/6c\/86d16c575ba4d0e5d743882559122afd.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 8. \u0413\u0440\u0430\u0444 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u0435 \u0438 \u0430\u043d\u0430\u043b\u0438\u0437 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 process, \u043d\u0430 \u0432\u0445\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u043e\u0434\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u044b\u0439 \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0441\u043e \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u044b.<\/p>\n<blockquote>\n<p>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<br \/>\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0413\u0438\u043b\u044c\u0431\u0435\u0440\u0442\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0432\u0435\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430, \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u0438\u0437 \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u044b.<\/p>\n<\/blockquote>\n<pre><code class=\"python\">def process(self, signal: np.ndarray):    if len(signal) &gt; 0:        self._append_buffer(signal)    if self.decoder_state == DecoderState.DETECT:        self._reset_curr_state()        if offset := self.modem.find_preamble(self.decoder_buffer[self.decoder_buffer_ptr:]):            est_time, est_cfo = offset            self.curr_cfo = est_cfo            self._preamble_found(self.curr_cfo, self.decoder_buffer_ptr + est_time)            self.decoder_buffer_ptr += est_time            self._set_decoding_mode(Header, ModType.BPSK, CCSpeed.R13, Header.PACKET_SIZE)            self.decoder_state = DecoderState.COLLECT_HEADER        else:            return...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412 \u043c\u0435\u0442\u043e\u0434\u0435 process \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0439 \u0431\u0443\u0444\u0435\u0440 (\u0441\u043c. \u0434\u0430\u043b\u0435\u0435) \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <code>DETECT<\/code> \u0432 \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u043d\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0438\u0441\u043a \u043f\u0440\u0435\u0430\u043c\u0431\u0443\u043b\u044b. \u041f\u0440\u0438 \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0438 \u043f\u043e\u0440\u043e\u0433\u0430 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 <em>preamble<\/em>found \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043f\u0430\u043a\u0435\u0442\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 <code>COLLECT_HEADER<\/code>. \u041e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441 \u044d\u0442\u0438\u043c \u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0440\u0435\u0436\u0438\u043c \u0434\u0435\u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 BPSK \u0441\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u0441\u0432\u0435\u0440\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0435\u0440\u0430 \u2153, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0441\u0435\u043c\u043f\u043b\u0430 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u043a \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c\u043e\u0439 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0435\u0430\u043c\u0431\u0443\u043b\u044b.<\/p>\n<pre><code class=\"python\">...    if self.decoder_state in (DecoderState.COLLECT_HEADER, DecoderState.COLLECT_BODY):        if self.curr_samples_required is None:            self.curr_samples_required = self.modem.get_packet_num_samples(                self.curr_mod_type, self.curr_cc_speed, self.curr_packet_size            )        if len(self.decoder_buffer) - self.decoder_buffer_ptr &gt;= self.curr_samples_required:            if self.decoder_state == DecoderState.COLLECT_HEADER:                self.decoder_state = DecoderState.DECODE_HEAD            else:                self.decoder_state = DecoderState.DECODE_BODY        else:            return...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 COLLECT (<code>COLLECT_HEADER<\/code>, <code>COLLECT_BODY<\/code>) \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u043c \u0431\u0443\u0444\u0435\u0440\u0435.\u00a0<\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>get_packet_num_samples<\/code> \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0441\u0435\u043c\u043f\u043b\u043e\u0432, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0434\u043b\u044f \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f OFDM-\u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043f\u0440\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043c\u0430\u0445 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0442\u0438\u043f\u0435 \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438.<\/p>\n<p>\u041f\u0440\u0438 \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0438 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043c\u0430 \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f DECODE (<code>DECODE_HEAD<\/code>, <code>DECODE_BODY<\/code>).<\/p>\n<pre><code class=\"python\">...    if self.decoder_state in (DecoderState.DECODE_HEAD, DecoderState.DECODE_BODY):        if response := self.modem.demod(                self.decoder_buffer[self.decoder_buffer_ptr:], self.curr_cfo,                mod_type=self.curr_mod_type,                cc_speed=self.curr_cc_speed,                packet_size=self.curr_packet_size,                decoder=self.curr_codec):            self._demod_response(response)            self.decoder_buffer_ptr += self.curr_samples_required            packet = response.packet            if self.decoder_state == DecoderState.DECODE_HEAD:                self._set_decoding_mode(PACKET_CODECS[packet.typ], packet.mod, packet.spd, packet.len)                self.decoder_state = DecoderState.COLLECT_BODY            elif self.decoder_state == DecoderState.DECODE_BODY:                self._set_decoding_mode(None, None, None, None)                self.decoder_state = DecoderState.PROCESS_PACKET            else:                raise DecoderFSMInvalidState...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 DECODE (<code>DECODE_HEAD<\/code>, <code>DECODE_BODY<\/code>) \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u0435\u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u044f \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u0440\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043f\u0440\u0438\u043d\u044f\u0442\u044b\u0439 \u0431\u043b\u043e\u043a \u043f\u0430\u043a\u0435\u0442\u0430. \u0415\u0441\u043b\u0438 \u0431\u044b\u043b \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a (<code>DECODE_HEAD<\/code>), \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0438\u0437 packet, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 \u043f\u0430\u043a\u0435\u0442\u0430, \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0435\u0433\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 <code>PROCESS_PACKET<\/code>.<\/p>\n<pre><code class=\"python\">...            self.curr_EsN0_packet += response.EsN0_packet            self.curr_EsN0_carriers += response.EsN0_carriers            self.curr_sym_count += response.sym_count            self.curr_bits_count += response.bits_count            self.curr_bits_error += response.bits_error            self.curr_samples_count += response.samples_count            packet.parent = self.curr_packet  # Link parent packet            self.curr_packet = packet            self.curr_samples_required = None...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043c\u0435\u0442\u0440\u0438\u043a \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0434\u0443\u0440\u043e\u0432\u043d\u044f LLC \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0443 \u043f\u0430\u043a\u0435\u0442\u0430, \u043a \u0442\u0435\u043b\u0443 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0432 \u043f\u043e\u043b\u0435 parent.<\/p>\n<pre><code class=\"python\">...        elif self.decoder_state == DecoderState.DECODE_HEAD:            self.decoder_state = DecoderState.DECODE_HEAD_FAILED        elif self.decoder_state == DecoderState.DECODE_BODY:            self.decoder_state = DecoderState.DECODE_BODY_FAILED        else:            raise DecoderFSMInvalidState...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0434\u0435\u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438.<\/p>\n<pre><code class=\"python\">...    if self.decoder_state == DecoderState.DECODE_HEAD_FAILED:        self._decode_failed(True, False)        self.decoder_state = DecoderState.DETECT    if self.decoder_state == DecoderState.DECODE_BODY_FAILED:        self._decode_failed(False, True)        self.decoder_state = DecoderState.DETECT...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u043c, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0434\u0435\u0442\u0435\u043a\u0446\u0438\u0438 \u043f\u0440\u0435\u0430\u043c\u0431\u0443\u043b\u044b. \u041c\u0435\u0442\u043e\u0434 <code>_decode_failed<\/code> \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435.<\/p>\n<pre><code class=\"python\">...    if self.decoder_state == DecoderState.PROCESS_PACKET:        BER = self.curr_bits_error \/ self.curr_bits_count        EsN0_carriers_dB = dB_vectorized(self.curr_EsN0_carriers \/ self.curr_sym_count)        EsN0_packet_dB = dB(self.curr_EsN0_packet \/ self.curr_sym_count)        SNR_packet_dB = EsN0_packet_dB - self.modem._snr_off        samples = self.curr_samples_count        speed = self.curr_bits_count * self.modem.DEFAULT_SAMPLE_RATE \/ samples        self._process_packet(self.curr_packet, EsN0_carriers_dB, EsN0_packet_dB, SNR_packet_dB, BER, speed)        self.decoder_state = DecoderState.DETECT<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <code>PROCESS_PACKET<\/code> \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432, \u0440\u0430\u0441\u0447\u0435\u0442 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u044d\u043d\u0435\u0440\u0433\u0438\u0438 OFDM-\u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043a \u0441\u043f\u0435\u043a\u0442\u0440\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0438 \u0448\u0443\u043c\u0430, \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u043b\u044c\u043d\u043e\u0433\u043e SNR \u0438 \u043e\u0446\u0435\u043d\u043a\u0430 \u0431\u0438\u0442\u043e\u0432\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f. \u0414\u0430\u043b\u0435\u0435 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f\u00a0 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 <code>_process_packet<\/code> \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>DETECT<\/code>.<\/p>\n<p>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430:<\/p>\n<pre><code class=\"python\">def _append_buffer(self, signal: np.ndarray) -&gt; None:    length = len(signal)    self.decoder_buffer = np.roll(self.decoder_buffer, -length)    self.decoder_buffer[-length:] = signal    self.decoder_buffer_ptr = max(0, self.decoder_buffer_ptr - length)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u0431\u0443\u0441\u043b\u043e\u0432\u043b\u0435\u043d\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0434\u0435\u0442\u0435\u043a\u0446\u0438\u0438 \u043f\u0440\u0435\u0430\u043c\u0431\u0443\u043b\u044b \u0438 \u0434\u0435\u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 OFDM-\u0434\u0430\u043d\u043d\u044b\u0445. <em>\u0414\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0438 \u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u0432\u043e\u0434\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u043e\u0432 \u0441 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u043c\u0435\u0436\u0434\u0443 \u0443\u0440\u043e\u0432\u043d\u044f\u043c\u0438 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439.<\/em><\/p>\n<h2>MAC \u0438 LLC \u0443\u0440\u043e\u0432\u043d\u0438<\/h2>\n<p>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043c\u043e\u0434\u0435\u043c\u0430 \u0432 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e \u0441\u0432\u044f\u0437\u0438 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0438 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0430\u043a\u0435\u0442\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u0438 \u043a \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c \u043a\u0430\u043d\u0430\u043b\u0430 \u0441\u0432\u044f\u0437\u0438.<\/p>\n<p>\u041d\u0430\u0434 PHY \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u043f\u043e\u0434\u0443\u0440\u043e\u0432\u043d\u044f MAC, \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u044e\u0449\u0430\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430, \u0432 \u0437\u0430\u0434\u0430\u0447\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u0445\u043e\u0434\u0438\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0443\u0437\u043b\u0430\u043c\u0438 \u0432 \u043a\u0430\u043d\u0430\u043b\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0442\u0440\u0430\u0444\u0438\u043a\u0430.<\/p>\n<p>\u041f\u043e\u0434\u0443\u0440\u043e\u0432\u0435\u043d\u044c LLC \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438, \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0435\u043c\u043e\u0439 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f. FSM \u0441\u0435\u0441\u0441\u0438\u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u0433\u043e\u0435 \u0441\u043e\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0435 \u0440\u0435\u0433\u043b\u0430\u043c\u0435\u043d\u0442\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430, \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0438\u0440\u0443\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0435\u043c\u0430 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438, \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044f \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0438 \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u0443\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438, \u043a\u0432\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 ARQ-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.<\/p>\n<p>\u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 9 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/8c\/0b\/12\/8c0b12e5423a91be950db1245921e09d.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 9. \u0418\u0435\u0440\u0430\u0440\u0445\u0438\u044f \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0443\u0440\u043e\u0432\u043d\u0435\u0439.\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 9. \u0418\u0435\u0440\u0430\u0440\u0445\u0438\u044f \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0443\u0440\u043e\u0432\u043d\u0435\u0439.\" width=\"424\" height=\"327\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/8c\/0b\/12\/8c0b12e5423a91be950db1245921e09d.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/8c\/0b\/12\/8c0b12e5423a91be950db1245921e09d.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 9. \u0418\u0435\u0440\u0430\u0440\u0445\u0438\u044f \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0443\u0440\u043e\u0432\u043d\u0435\u0439.<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438, \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0441\u0435\u0441\u0441\u0438\u0438 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b\u0439 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0440\u0430\u0434\u0438\u043e\u043a\u0430\u043d\u0430\u043b\u0430 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0435\u0439 \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0447\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u0443\u044e \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u043d\u0430\u043b\u0430 \u0441\u0432\u044f\u0437\u0438. \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 9 \u043e\u043d \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d \u043a\u0430\u043a \u0431\u043b\u043e\u043a &#171;AMC&#187; (Adaptive Modulation and Coding).<\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0434\u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0439 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0443\u0437\u043b\u0430\u043c\u0438.<\/p>\n<h2>\u0422\u0438\u043f\u044b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439<\/h2>\n<p>\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e 2 \u0442\u0438\u043f\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439: \u043f\u0430\u043a\u0435\u0442-\u043c\u0430\u044f\u043a \u0438 \u043f\u0430\u043a\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043e\u0431\u0443\u0441\u043b\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043d\u0430 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u043f\u0435\u0440\u0435\u0447\u0435\u043d\u044c <code>PacketType<\/code> \u0431\u044b\u043b \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d.<\/p>\n<pre><code class=\"python\">class PacketType(Enum):    BEACON = 0    CONN = 1    CONN_ACK = 2    PING = 3    PONG = 4    RTS = 5    CTS = 6    DATA = 7    ACK = 8    NACK = 9    SACK = 10    EOT = 11<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0434 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u043f\u0430\u043a\u0435\u0442\u0430 \u043f\u0430\u043a\u0435\u0442\u0430 \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043e 4 \u0431\u0438\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0434\u043e 16 \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043f\u0430\u043a\u0435\u0442\u043e\u0432.<\/p>\n<p>\u0412 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043f\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u043c \u0433\u0440\u0443\u043f\u043f\u0430\u043c.<\/p>\n<p>\u041f\u0430\u043a\u0435\u0442\u044b <code>BEACON<\/code>, <code>CONN<\/code>, <code>CONN_ACK<\/code> \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0442 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f. \u041f\u0430\u043a\u0435\u0442\u044b <code>PING<\/code> \u0438 <code>PONG<\/code> \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043a\u0430\u043d\u0430\u043b\u0438 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f. \u0421\u0438\u0433\u043d\u0430\u043b\u044b <code>RTS<\/code> (Request To Send), <code>CTS<\/code> (Clear To Send) \u0438\u043d\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0442 \u043e \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 \u0438 \u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u041e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u0442\u0438\u043f\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u0435\u043c\u0430.<\/p>\n<h2>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043f\u0430\u043a\u0435\u0442\u043e\u0432<\/h2>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0434\u043b\u044f \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0445 \u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432.<\/p>\n<p>\u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432\u043e \u0432\u0441\u0435\u0445 \u043f\u0430\u043a\u0435\u0442\u0430\u0445 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c big-endian \u043f\u043e\u0440\u044f\u0434\u043a\u0430.<\/p>\n<h3>Beacon<\/h3>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431\u0449\u0435\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430. \u041f\u0430\u043a\u0435\u0442 Beacon \u0441\u043b\u0443\u0436\u0438\u0442 \u0434\u043b\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u043d\u0446\u0438\u0438 \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0430\u043a\u0435\u0442\u0430:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\">\u041f\u043e\u043b\u0435<\/p>\n<\/td>\n<td data-colwidth=\"120\" width=\"120\">\n<p align=\"left\">\u0422\u0438\u043f<\/p>\n<\/td>\n<td data-colwidth=\"126\" width=\"126\">\n<p align=\"left\">\u0420\u0430\u0437\u043c\u0435\u0440 (\u0431\u0438\u0442)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\">callsign<\/p>\n<\/td>\n<td data-colwidth=\"120\" width=\"120\">\n<p align=\"left\">str<\/p>\n<\/td>\n<td data-colwidth=\"126\" width=\"126\">\n<p align=\"left\">53<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041b\u044e\u0431\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043f\u043e\u0437\u044b\u0432\u043d\u043e\u0439 \u0441\u0442\u0430\u043d\u0446\u0438\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\">qth<\/p>\n<\/td>\n<td data-colwidth=\"120\" width=\"120\">\n<p align=\"left\">str<\/p>\n<\/td>\n<td data-colwidth=\"126\" width=\"126\">\n<p align=\"left\">25<\/p>\n<\/td>\n<td>\n<p align=\"left\">6 \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u044b\u0439 QTH-\u043b\u043e\u043a\u0430\u0442\u043e\u0440<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\">mode<\/p>\n<\/td>\n<td data-colwidth=\"120\" width=\"120\">\n<p align=\"left\">BeaconMode<\/p>\n<\/td>\n<td data-colwidth=\"126\" width=\"126\">\n<p align=\"left\">4<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0420\u0435\u0436\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u0430\u044f\u043a\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\">[CRC]<\/p>\n<\/td>\n<td data-colwidth=\"120\" width=\"120\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"126\" width=\"126\">\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0421\u0443\u043c\u043c\u0430\u0440\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0435\u043c\u043a\u043e\u0441\u0442\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 90 \u0431\u0438\u0442 (11.25 \u0431\u0430\u0439\u0442).<\/p>\n<p>\u0420\u0435\u0436\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0430\u044f\u043a\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0438\u0437 <code>BeaconMode<\/code>.<\/p>\n<pre><code class=\"python\">class BeaconMode(Enum):    CQ = 0    CQ_DX = 1    CQ_AS = 2    CQ_NA = 3    CQ_SA = 4    CQ_EU = 5    CQ_AF = 6    CQ_OC = 7    BEACON = 15<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0424\u043b\u0430\u0433 <code>CQ<\/code> \u2014 \u0446\u0438\u0440\u043a\u0443\u043b\u044f\u0440\u043d\u044b\u0439 \u043e\u0431\u0449\u0438\u0439 \u0432\u044b\u0437\u043e\u0432 \u0432\u0441\u0435\u0445 \u043a\u043e\u0440\u0440\u0435\u0441\u043f\u043e\u043d\u0434\u0435\u043d\u0442\u043e\u0432; \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b <code>CQ_DX<\/code>\u2026<code>CQ_OC<\/code> \u0437\u0430\u0434\u0430\u044e\u0442 \u0441\u0435\u043b\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0441 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0435\u0439 \u043f\u043e \u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043c. \u041f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 <code>BEACON<\/code> \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0432\u044f\u0437\u0438 \u043d\u0435 \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e \u2014 \u0441\u0442\u0430\u043d\u0446\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438 \u0432 \u044d\u0444\u0438\u0440\u0435.<\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u0430:<\/p>\n<pre><code class=\"python\">@bit_packet@dataclassclass Beacon(PacketCRC8):    PACKET_TYPE: ClassVar[Final[PacketType]] = PacketType.BEACON    callsign: str = field(default=CallsignField(53))    qth: str = field(default=QTHField(25))    mode: BeaconMode = field(default=EnumField(BeaconMode, 4))<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0437\u044b\u0432\u043d\u043e\u0439 \u0438 QTH-\u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043e\u0434\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c Base38, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u043c\u0443 \u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435 FT-8.<\/p>\n<pre><code class=\"python\">ALPHABET = \" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\/\"ALPHABET_LEN = len(ALPHABET)MAX_CALL_LEN = 6MAX_QTH_LEN = 6def callsign_to_int(callsign: str) -&gt; int:    s = callsign.strip().upper()[:MAX_CALL_LEN].ljust(MAX_CALL_LEN, \" \")    val = 0    for char in s:        val = val * ALPHABET_LEN + ALPHABET.index(char)    return valdef int_to_callsign(val: int) -&gt; str:    chars = []    for _ in range(MAX_CALL_LEN):        chars.append(ALPHABET[val % ALPHABET_LEN])        val \/\/= ALPHABET_LEN    return \"\".join(reversed(chars)).strip()def qth6_to_int(qth: str) -&gt; int:    q = qth.upper()    assert len(q) == MAX_QTH_LEN    off = ord('A')    lon_field = ord(q[0]) - off    lat_field = ord(q[1]) - off    lon_sq = int(q[2])    lat_sq = int(q[3])    lon_sub = ord(q[4]) - off    lat_sub = ord(q[5]) - off    val = lon_field    val = val * 18 + lat_field    val = val * 10 + lon_sq    val = val * 10 + lat_sq    val = val * 24 + lon_sub    val = val * 24 + lat_sub    return valdef int_to_qth6(val: int) -&gt; str:    lat_sub = val % 24    val \/\/= 24    lon_sub = val % 24    val \/\/= 24    lat_sq = val % 10    val \/\/= 10    lon_sq = val % 10    val \/\/= 10    lat_field = val % 18    val \/\/= 18    lon_field = val % 18    off = ord('A')    return f\"{chr(lon_field + off)}{chr(lat_field + off)}{lon_sq}{lat_sq}{chr(lon_sub + off)}{chr(lat_sub + off)}\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430: <code>Beacon(callsign='R9FEU', qth='LO87cx', mode=&lt;BeaconMode.CQ: 0&gt;)<\/code><\/p>\n<p>\u0411\u0438\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435: <code>000000000000000000000100001011000100011010011110101100101_1101100011000000001110000_[00100100]<\/code><\/p>\n<pre><code class=\"python\">def mod_beacon_signal(self, callsign: str, qth: str,                      mode: BeaconMode = BeaconMode.BEACON) -&gt; npt.NDArray:    packet = Beacon(callsign, qth, mode)    return self.mod_packet_signal(packet, PacketType.BEACON, mod_type=ModType.BPSK, cc_speed=CCSpeed.R13)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h3>Connect<\/h3>\n<p>\u0423\u0447\u0430\u0441\u0442\u043d\u0438\u043a, \u043f\u0440\u0438\u043d\u044f\u0432\u0448\u0438\u0439 \u0441\u0438\u0433\u043d\u0430\u043b Beacon \u043c\u043e\u0436\u0435\u0442 \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441 \u0443\u0437\u043b\u043e\u043c, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044f \u0432 \u044d\u0444\u0438\u0440 \u043f\u0430\u043a\u0435\u0442 <code>Connect<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0437\u044b\u0432\u043d\u043e\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0439 \u0441\u0442\u0430\u043d\u0446\u0438\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0437\u044b\u0432\u043d\u043e\u0439 \u0438 \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b.<\/p>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0430\u043a\u0435\u0442\u0430:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"137\" width=\"137\">\n<p align=\"left\">\u041f\u043e\u043b\u0435<\/p>\n<\/td>\n<td data-colwidth=\"57\" width=\"57\">\n<p align=\"left\">\u0422\u0438\u043f<\/p>\n<\/td>\n<td data-colwidth=\"126\" width=\"126\">\n<p align=\"left\">\u0420\u0430\u0437\u043c\u0435\u0440 (\u0431\u0438\u0442)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"137\" width=\"137\">\n<p align=\"left\">called<\/p>\n<\/td>\n<td data-colwidth=\"57\" width=\"57\">\n<p align=\"left\">str<\/p>\n<\/td>\n<td data-colwidth=\"126\" width=\"126\">\n<p align=\"left\">53<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u043e\u0437\u044b\u0432\u043d\u043e\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0433\u043e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"137\" width=\"137\">\n<p align=\"left\">caller<\/p>\n<\/td>\n<td data-colwidth=\"57\" width=\"57\">\n<p align=\"left\">str<\/p>\n<\/td>\n<td data-colwidth=\"126\" width=\"126\">\n<p align=\"left\">53<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u043e\u0437\u044b\u0432\u043d\u043e\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"137\" width=\"137\">\n<p align=\"left\">qth<\/p>\n<\/td>\n<td data-colwidth=\"57\" width=\"57\">\n<p align=\"left\">str<\/p>\n<\/td>\n<td data-colwidth=\"126\" width=\"126\">\n<p align=\"left\">25<\/p>\n<\/td>\n<td>\n<p align=\"left\">QTH-\u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"137\" width=\"137\">\n<p align=\"left\">caller_conn_id<\/p>\n<\/td>\n<td data-colwidth=\"57\" width=\"57\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"126\" width=\"126\">\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"137\" width=\"137\">\n<p align=\"left\">[CRC]<\/p>\n<\/td>\n<td data-colwidth=\"57\" width=\"57\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"126\" width=\"126\">\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0421\u0443\u043c\u043c\u0430\u0440\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0435\u043c\u043a\u043e\u0441\u0442\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 147 \u0431\u0438\u0442 (18.375 \u0431\u0430\u0439\u0442).<\/p>\n<p>\u041d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043e\u0431\u043c\u0435\u043d \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u0440\u0430\u0434\u0438\u043e\u043b\u044e\u0431\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u043f\u043e\u0437\u044b\u0432\u043d\u044b\u0445, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442, \u043a\u043e\u043c\u0443 \u0438 \u043e\u0442 \u043a\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u043e\u0432\u0430\u043d \u043f\u0430\u043a\u0435\u0442.<\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u0430:<\/p>\n<pre><code class=\"python\">@bit_packet@dataclassclass Conn(PacketCRC8):    PACKET_TYPE: ClassVar[Final[PacketType]] = PacketType.CONN    called: str = field(default=CallsignField(53))    caller: str = field(default=CallsignField(53))    qth: str = field(default=QTHField(25))    caller_conn_id: int = field(default=IntField(8))    def __post_init__(self):        assert self.called != self.caller<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430:\u00a0<code>Conn(called='R1ABC', caller='R2ABC', qth='LO88AA', caller_conn_id=1)<\/code><\/p>\n<p>\u0411\u0438\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435: <code>00000000000000000000010000100100001100000100000000110_00000000000000000000010000100101001011101100100010110_0101110110001101000000000_00000001_[10110111]<\/code><\/p>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438: BPSK, CC \u2153.<\/p>\n<pre><code class=\"python\">def mod_connect_signal(self, called: str, caller: str, caller_qth: str, caller_conn_id: int) -&gt; npt.NDArray:    packet = Conn(called, caller, caller_qth, caller_conn_id)    return self.mod_packet_signal(packet, PacketType.CONN, mod_type=ModType.BPSK, cc_speed=CCSpeed.R13)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h3>Connect acknowledge<\/h3>\n<p>\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u043e\u0439 \u043f\u0430\u043a\u0435\u0442\u0430 <code>ConnAck<\/code> \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0433\u043e. \u041f\u043e\u0437\u044b\u0432\u043d\u044b\u0435 \u043e\u0431\u0435\u0438\u0445 \u0441\u0442\u0430\u043d\u0446\u0438\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e. \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e <code>caller_conn_id+1<\/code>.<\/p>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0430\u043a\u0435\u0442\u0430:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"139\" width=\"139\">\n<p align=\"left\">\u041f\u043e\u043b\u0435<\/p>\n<\/td>\n<td data-colwidth=\"63\" width=\"63\">\n<p align=\"left\">\u0422\u0438\u043f<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"left\">\u0420\u0430\u0437\u043c\u0435\u0440 (\u0431\u0438\u0442)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"139\" width=\"139\">\n<p align=\"left\">called<\/p>\n<\/td>\n<td data-colwidth=\"63\" width=\"63\">\n<p align=\"left\">str<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"left\">53<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u043e\u0437\u044b\u0432\u043d\u043e\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0433\u043e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"139\" width=\"139\">\n<p align=\"left\">caller<\/p>\n<\/td>\n<td data-colwidth=\"63\" width=\"63\">\n<p align=\"left\">str<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"left\">53<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u043e\u0437\u044b\u0432\u043d\u043e\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"139\" width=\"139\">\n<p align=\"left\">caller_conn_id<\/p>\n<\/td>\n<td data-colwidth=\"63\" width=\"63\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"139\" width=\"139\">\n<p align=\"left\">called_conn_id<\/p>\n<\/td>\n<td data-colwidth=\"63\" width=\"63\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0433\u043e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"139\" width=\"139\">\n<p align=\"left\">mod<\/p>\n<\/td>\n<td data-colwidth=\"63\" width=\"63\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041c\u043e\u0434\u0443\u043b\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"139\" width=\"139\">\n<p align=\"left\">master_window<\/p>\n<\/td>\n<td data-colwidth=\"63\" width=\"63\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0420\u0430\u0437\u043c\u0435\u0440 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0432\u0435\u0434\u0443\u0449\u0435\u0433\u043e \u0443\u0437\u043b\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"139\" width=\"139\">\n<p align=\"left\">start_lag<\/p>\n<\/td>\n<td data-colwidth=\"63\" width=\"63\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0422\u0430\u0439\u043c\u0430\u0443\u0442 \u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0433\u043e \u043e\u0431\u043c\u0435\u043d\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"139\" width=\"139\">\n<p align=\"left\">[CRC]<\/p>\n<\/td>\n<td data-colwidth=\"63\" width=\"63\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0421\u0443\u043c\u043c\u0430\u0440\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0435\u043c\u043a\u043e\u0441\u0442\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 154 \u0431\u0438\u0442 (19.25 \u0431\u0430\u0439\u0442).<\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u0430:<\/p>\n<pre><code class=\"python\">@bit_packet@dataclassclass ConnAck(PacketCRC8):    PACKET_TYPE: ClassVar[Final[PacketType]] = PacketType.CONN_ACK    caller: str = field(default=CallsignField(53))    called: str = field(default=CallsignField(53))    caller_conn_id: int = field(default=IntField(8))    called_conn_id: int = field(default=IntField(8))    mod: int = field(default=IntField(8))    master_window: int = field(default=IntField(8))    start_lag: int = field(default=IntField(8))    def __post_init__(self):        assert self.called != self.caller        assert 0 &lt; self.master_window &lt; self.mod<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430:\u00a0<code>ConnAck(caller='R2ABC', called='R1ABC', caller_conn_id=1, called_conn_id=1, mod=2, master_window=1, start_lag=30)<\/code><\/p>\n<p>\u0411\u0438\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435: <code>00000000000000000000010000100101001011101100100010110_00000000000000000000010000100100001100000100000000110_00000001_00000001_00000010_00000001_00011110_[00111111]<\/code><\/p>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438: BPSK, CC \u2153.<\/p>\n<pre><code class=\"python\">def mod_connect_ack_signal(self, caller: str, called: str, caller_conn_id: int, called_conn_id: int, mod: int,                           master_window: int, start_lag: int) -&gt; npt.NDArray:    packet = ConnAck(caller, called, caller_conn_id, called_conn_id, mod, master_window, start_lag)    return self.mod_packet_signal(packet, PacketType.CONN_ACK, mod_type=ModType.BPSK, cc_speed=CCSpeed.R13)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h3>Ping<\/h3>\n<p>\u041a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u043f\u0430\u043a\u0435\u0442-\u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u0432\u044f\u0437\u0438 \u0438 \u0437\u0430\u043c\u0435\u0440\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0442\u043a\u043b\u0438\u043a\u0430 \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\u043c\u0438 \u0441\u0435\u0442\u0438. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0447\u0430\u0441\u043e\u0432 \u0443\u0437\u043b\u0430-\u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f.<\/p>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0430\u043a\u0435\u0442\u0430:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u041f\u043e\u043b\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0422\u0438\u043f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0420\u0430\u0437\u043c\u0435\u0440 (\u0431\u0438\u0442)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">conn_id<\/p>\n<\/td>\n<td>\n<p align=\"left\">int<\/p>\n<\/td>\n<td>\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">ID \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">trans_id<\/p>\n<\/td>\n<td>\n<p align=\"left\">int<\/p>\n<\/td>\n<td>\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u043e\u043c\u0435\u0440 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">time<\/p>\n<\/td>\n<td>\n<p align=\"left\">int<\/p>\n<\/td>\n<td>\n<p align=\"left\">20<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u0442\u043c\u0435\u0442\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">[CRC]<\/p>\n<\/td>\n<td>\n<p align=\"left\">int<\/p>\n<\/td>\n<td>\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0421\u0443\u043c\u043c\u0430\u0440\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0435\u043c\u043a\u043e\u0441\u0442\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 44 (5.5 \u0431\u0430\u0439\u0442) \u0431\u0438\u0442.<\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u0430:<\/p>\n<pre><code class=\"python\">@dataclassclass ConnPacketABC(PacketCRC):    conn_id: int = field(default=IntField(8))@dataclassclass ConnTransPacketABC(PacketCRC8, ConnPacketABC):    trans_id: int = field(default=IntField(8))@bit_packet@dataclassclass Ping(ConnTransPacketABC):    PACKET_TYPE: ClassVar[Final[PacketType]] = PacketType.PING    time: int = field(default=IntField(20))<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430:\u00a0<code>Ping(conn_id=1, trans_id=2, time=1048570)<\/code>.<\/p>\n<p>\u0411\u0438\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435: <code>00000001_000000101_1111111111111111010_[01101111]<\/code>.<\/p>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438: BPSK, CC \u2153.<\/p>\n<pre><code class=\"python\">def mod_ping_signal(self, conn_id: int, trans_id: int, time: int) -&gt; npt.NDArray:    packet = Ping(conn_id, trans_id, time)    return self.mod_packet_signal(packet, PacketType.PING, mod_type=ModType.BPSK, cc_speed=CCSpeed.R13)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h3>Pong<\/h3>\n<p>\u041f\u0430\u043a\u0435\u0442-\u043e\u0442\u0432\u0435\u0442 \u043d\u0430 ping-\u0437\u0430\u043f\u0440\u043e\u0441. \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u0430 ping. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438\u0437 ping \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u0430.<\/p>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0430\u043a\u0435\u0442\u0430:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"116\" width=\"116\">\n<p align=\"left\">\u041f\u043e\u043b\u0435<\/p>\n<\/td>\n<td data-colwidth=\"60\" width=\"60\">\n<p align=\"left\">\u0422\u0438\u043f<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"left\">\u0420\u0430\u0437\u043c\u0435\u0440 (\u0431\u0438\u0442)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"116\" width=\"116\">\n<p align=\"left\">conn_id<\/p>\n<\/td>\n<td data-colwidth=\"60\" width=\"60\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">ID \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"116\" width=\"116\">\n<p align=\"left\">trans_id<\/p>\n<\/td>\n<td data-colwidth=\"60\" width=\"60\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u043e\u043c\u0435\u0440 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"116\" width=\"116\">\n<p align=\"left\">remote_time<\/p>\n<\/td>\n<td data-colwidth=\"60\" width=\"60\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"left\">20<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u0442\u043c\u0435\u0442\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"116\" width=\"116\">\n<p align=\"left\">local_delta<\/p>\n<\/td>\n<td data-colwidth=\"60\" width=\"60\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"left\">17<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u0440\u0435\u043c\u044f \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"116\" width=\"116\">\n<p align=\"left\">[CRC]<\/p>\n<\/td>\n<td data-colwidth=\"60\" width=\"60\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0421\u0443\u043c\u043c\u0430\u0440\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0435\u043c\u043a\u043e\u0441\u0442\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 61 \u0431\u0438\u0442 (7.625 \u0431\u0430\u0439\u0442).<\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u0430:<\/p>\n<pre><code class=\"python\">@bit_packet@dataclassclass Pong(ConnTransPacketABC):    PACKET_TYPE: ClassVar[Final[PacketType]] = PacketType.PONG    remote_time: int = field(default=IntField(20))    local_delta: int = field(default=IntField(17))<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430:\u00a0<code>Pong(conn_id=1, trans_id=2, remote_time=86300, local_delta=46300)<\/code>.<\/p>\n<p>\u0411\u0438\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435: <code>00000001_00000010_00010101000100011100_01011010011011100_[11011110]<\/code>.<\/p>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438: BPSK, CC \u2153.<\/p>\n<pre><code class=\"python\">def mod_pong_signal(self, conn_id: int, trans_id: int, remote_time: int, local_delta: int) -&gt; npt.NDArray:    packet = Pong(conn_id, trans_id, remote_time, local_delta)    return self.mod_packet_signal(packet, PacketType.PONG, mod_type=ModType.BPSK, cc_speed=CCSpeed.R13)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h3>Request To Send<\/h3>\n<p>\u041f\u0430\u043a\u0435\u0442-\u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0431\u043b\u043e\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 \u043f\u0430\u043a\u0435\u0442\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u0440\u0435\u0439\u043c\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0431\u0438\u0442\u0430\u0445 \u0438 \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0444\u0440\u0435\u0439\u043c\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0437\u0435\u043b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c. \u0422\u0430\u043a\u0436\u0435 \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0442\u0438\u043f \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445: \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, RSSI, \u043b\u0438\u0431\u043e \u0436\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0431\u0430\u0439\u0442.<\/p>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0430\u043a\u0435\u0442\u0430:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"127\" width=\"127\">\n<p align=\"left\">\u041f\u043e\u043b\u0435<\/p>\n<\/td>\n<td data-colwidth=\"127\" width=\"127\">\n<p align=\"left\">\u0422\u0438\u043f<\/p>\n<\/td>\n<td data-colwidth=\"121\" width=\"121\">\n<p align=\"left\">\u0420\u0430\u0437\u043c\u0435\u0440 (\u0431\u0438\u0442)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"127\" width=\"127\">\n<p align=\"left\">conn_id<\/p>\n<\/td>\n<td data-colwidth=\"127\" width=\"127\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"121\" width=\"121\">\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">ID \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"127\" width=\"127\">\n<p align=\"left\">trans_id<\/p>\n<\/td>\n<td data-colwidth=\"127\" width=\"127\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"121\" width=\"121\">\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u043e\u043c\u0435\u0440 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"127\" width=\"127\">\n<p align=\"left\">frame_len<\/p>\n<\/td>\n<td data-colwidth=\"127\" width=\"127\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"121\" width=\"121\">\n<p align=\"left\">10<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0420\u0430\u0437\u043c\u0435\u0440 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u043e \u0437\u0430 \u0440\u0430\u0437 \u0444\u0440\u0435\u0439\u043c\u0430 \u0432 \u0431\u0438\u0442\u0430\u0445<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"127\" width=\"127\">\n<p align=\"left\">frames_count<\/p>\n<\/td>\n<td data-colwidth=\"127\" width=\"127\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"121\" width=\"121\">\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u0444\u0440\u0435\u0439\u043c\u043e\u0432<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"127\" width=\"127\">\n<p align=\"left\">data_type<\/p>\n<\/td>\n<td data-colwidth=\"127\" width=\"127\">\n<p align=\"left\">RTSDataType<\/p>\n<\/td>\n<td data-colwidth=\"121\" width=\"121\">\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0422\u0438\u043f \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"127\" width=\"127\">\n<p align=\"left\">[CRC]<\/p>\n<\/td>\n<td data-colwidth=\"127\" width=\"127\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"121\" width=\"121\">\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0421\u0443\u043c\u043c\u0430\u0440\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0435\u043c\u043a\u043e\u0441\u0442\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 44 \u0431\u0438\u0442 (5.5 \u0431\u0430\u0439\u0442).<\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u0430:<\/p>\n<pre><code class=\"python\">@bit_packet@dataclassclass RTS(ConnTransPacketABC):    PACKET_TYPE: ClassVar[Final[PacketType]] = PacketType.RTS    frame_len: int = field(default=IntField(10))    frames_count: int = field(default=IntField(8))    data_type: RTSDataType = field(default=EnumField(RTSDataType, 2))<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044f <code>data_type<\/code>:<\/p>\n<pre><code class=\"python\">class RTSDataType(Enum):    TEXT = 0    COMPRESSED_TEXT = 1    RSSI = 2    RAW_BYTES = 3<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430:\u00a0<code>RTS(conn_id=1, trans_id=2, frame_len=10, frames_count=5, data_type=&lt;RTSDataType.RAW_BYTES: 3&gt;)<\/code>.<\/p>\n<p>\u0411\u0438\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435: <code>00000001_00000010_0000001010_00000101_11_[01110100]<\/code>.<\/p>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438: BPSK, CC \u2153.<\/p>\n<pre><code class=\"python\">def mod_rts_signal(self, conn_id: int, trans_id: int, frame_len: int, frames_count: int,                   data_type: RTSDataType) -&gt; npt.NDArray:    packet = RTS(conn_id, trans_id, frame_len=frame_len, frames_count=frames_count, data_type=data_type)    return self.mod_packet_signal(packet, PacketType.RTS, mod_type=ModType.BPSK, cc_speed=CCSpeed.R13)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h3>Clear To Send<\/h3>\n<p>\u041f\u0430\u043a\u0435\u0442-\u043e\u0442\u0432\u0435\u0442 \u043d\u0430 RTS \u0437\u0430\u043f\u0440\u043e\u0441, \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u044e\u0449\u0438\u0439 \u0438\u043b\u0438 \u043e\u043f\u0440\u043e\u0432\u0435\u0440\u0433\u0430\u044e\u0449\u0438\u0439 \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f. \u0412 \u043f\u0430\u043a\u0435\u0442\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f CTS \u0441\u0442\u0430\u0442\u0443\u0441, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0439 \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u044c \u0438\u043b\u0438 \u043d\u0435\u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435. \u0422\u0430\u043a\u0436\u0435 \u0432 \u043e\u0442\u0432\u0435\u0442\u0435 \u0443\u0437\u0435\u043b \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u043e\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u0447\u0438\u043a\u0430 \u0437\u0430\u0434\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c FEC-\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0430\u043a\u0435\u0442\u0430:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"84\" width=\"84\">\n<p align=\"left\">\u041f\u043e\u043b\u0435<\/p>\n<\/td>\n<td data-colwidth=\"103\" width=\"103\">\n<p align=\"left\">\u0422\u0438\u043f<\/p>\n<\/td>\n<td data-colwidth=\"121\" width=\"121\">\n<p align=\"left\">\u0420\u0430\u0437\u043c\u0435\u0440 (\u0431\u0438\u0442)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"84\" width=\"84\">\n<p align=\"left\">conn_id<\/p>\n<\/td>\n<td data-colwidth=\"103\" width=\"103\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"121\" width=\"121\">\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">ID \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"84\" width=\"84\">\n<p align=\"left\">trans_id<\/p>\n<\/td>\n<td data-colwidth=\"103\" width=\"103\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"121\" width=\"121\">\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u043e\u043c\u0435\u0440 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"84\" width=\"84\">\n<p align=\"left\">status<\/p>\n<\/td>\n<td data-colwidth=\"103\" width=\"103\">\n<p align=\"left\">CTSStatus<\/p>\n<\/td>\n<td data-colwidth=\"121\" width=\"121\">\n<p align=\"left\">3<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u0442\u0430\u0442\u0443\u0441 \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u0435\u043c\u0430 \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"84\" width=\"84\">\n<p align=\"left\">mod<\/p>\n<\/td>\n<td data-colwidth=\"103\" width=\"103\">\n<p align=\"left\">ModType<\/p>\n<\/td>\n<td data-colwidth=\"121\" width=\"121\">\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0438\u043f \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"84\" width=\"84\">\n<p align=\"left\">speed<\/p>\n<\/td>\n<td data-colwidth=\"103\" width=\"103\">\n<p align=\"left\">CCSpeed<\/p>\n<\/td>\n<td data-colwidth=\"121\" width=\"121\">\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u0436\u0438\u0434\u0430\u0435\u043c\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"84\" width=\"84\">\n<p align=\"left\">[CRC]<\/p>\n<\/td>\n<td data-colwidth=\"103\" width=\"103\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"121\" width=\"121\">\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0421\u0443\u043c\u043c\u0430\u0440\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0435\u043c\u043a\u043e\u0441\u0442\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 31 \u0431\u0438\u0442 (3.875 \u0431\u0430\u0439\u0442).<\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u0430:<\/p>\n<pre><code class=\"python\">@bit_packet@dataclassclass CTS(ConnTransPacketABC):    PACKET_TYPE: ClassVar[Final[PacketType]] = PacketType.CTS    status: CTSStatus = field(default=EnumField(CTSStatus, 3))    mod: ModType = field(default=EnumField(ModType, 2))    speed: CCSpeed = field(default=EnumField(CCSpeed, 2))<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u0432 \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u0435\u043c\u0430:<\/p>\n<pre><code class=\"python\">class CTSStatus(Enum):    SEND_BULK = 0    SEND_SIMPLE = 1    REDUCE = 2  # Reduce frame size    BUSY = 3  # Wait for next retry    REJECT = 4  # This data is not interest for me, delete it<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>SEND_BULK<\/code> \u0437\u0430\u0434\u0430\u0435\u0442 \u0440\u0435\u0436\u0438\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043a\u0443\u0447\u0438, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u0447\u0438\u043a \u0432\u044b\u0434\u0430\u0435\u0442 \u043f\u0430\u0447\u043a\u043e\u0439 \u0444\u0440\u0435\u0439\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a \u0435\u0434\u0438\u043d\u043e\u0440\u0430\u0437\u043e\u0432\u043e \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442 \u043a\u0430\u043a\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u043e\u043d \u043f\u0440\u0438\u043d\u044f\u043b.<\/p>\n<p>\u0421\u0442\u0430\u0442\u0443\u0441 <code>SEND_SIMPLE<\/code> \u0437\u0430\u0434\u0430\u0435\u0442 \u0441\u0438\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u0447\u0438\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 Stop-and-Wait, \u043e\u0436\u0438\u0434\u0430\u044f \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0430 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p><code>REDUCE<\/code> \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e RTS-\u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438.<\/p>\n<p>\u0422\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u043f\u043e\u0437\u0436\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c <code>BUSY<\/code> .<\/p>\n<p>\u0421\u0442\u0430\u0442\u0443\u0441 <code>REJECT<\/code> \u2014 \u043f\u043e\u043b\u043d\u044b\u0439 \u043e\u0442\u043a\u0430\u0437 \u0438 \u043d\u0435\u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430:\u00a0<code>CTS(conn_id=1, trans_id=2, status=&lt;CTSStatus.SEND_BULK: 0&gt;, mod=&lt;ModType.QAM16: 2&gt;, speed=&lt;CCSpeed.R34: 3&gt;)<\/code>.<\/p>\n<p>\u0411\u0438\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435: <code>00000001_00000010_000_10_11_[00000100]<\/code>.<\/p>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438: BPSK, CC \u2153.<\/p>\n<pre><code class=\"python\">def mod_cts_signal(self, conn_id: int, trans_id: int, status: CTSStatus, mod: ModType = ModType.BPSK,                   speed: CCSpeed = CCSpeed.R13) -&gt; npt.NDArray:    packet = CTS(conn_id, trans_id, status=status, mod=mod, speed=speed)    return self.mod_packet_signal(packet, PacketType.CTS, mod_type=ModType.BPSK, cc_speed=CCSpeed.R13)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h3>End Of Transmission<\/h3>\n<p>\u0421\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043f\u0430\u043a\u0435\u0442, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0439 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0444\u0440\u0435\u0439\u043c\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044f \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043e \u043a\u043e\u043d\u0446\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438.<\/p>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0430\u043a\u0435\u0442\u0430:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"118\" width=\"118\">\n<p align=\"left\">\u041f\u043e\u043b\u0435<\/p>\n<\/td>\n<td data-colwidth=\"107\" width=\"107\">\n<p align=\"left\">\u0422\u0438\u043f<\/p>\n<\/td>\n<td data-colwidth=\"125\" width=\"125\">\n<p align=\"left\">\u0420\u0430\u0437\u043c\u0435\u0440 (\u0431\u0438\u0442)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"118\" width=\"118\">\n<p align=\"left\">conn_id<\/p>\n<\/td>\n<td data-colwidth=\"107\" width=\"107\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"125\" width=\"125\">\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">ID \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"118\" width=\"118\">\n<p align=\"left\">trans_id<\/p>\n<\/td>\n<td data-colwidth=\"107\" width=\"107\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"125\" width=\"125\">\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u043e\u043c\u0435\u0440 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"118\" width=\"118\">\n<p align=\"left\">reason_code<\/p>\n<\/td>\n<td data-colwidth=\"107\" width=\"107\">\n<p align=\"left\">EotReason<\/p>\n<\/td>\n<td data-colwidth=\"125\" width=\"125\">\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043e\u0434 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"118\" width=\"118\">\n<p align=\"left\">[CRC]<\/p>\n<\/td>\n<td data-colwidth=\"107\" width=\"107\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"125\" width=\"125\">\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0421\u0443\u043c\u043c\u0430\u0440\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0435\u043c\u043a\u043e\u0441\u0442\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 26 \u0431\u0438\u0442 (3.25 \u0431\u0430\u0439\u0442).<\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u0430:<\/p>\n<pre><code class=\"python\">@bit_packet@dataclassclass Eot(ConnTransPacketABC):    PACKET_TYPE: ClassVar[Final[PacketType]] = PacketType.EOT    reason_code: EotReason = field(default=EnumField(EotReason, 2))<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u043a\u043e\u0434\u043e\u0432 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438:<\/p>\n<pre><code class=\"python\">class EotReason(Enum):    SUCCESS = 0    PARTIAL = 1    ABORT = 2<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 <code>EotReason<\/code> \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u0441\u0430\u043c\u0438 \u0437\u0430 \u0441\u0435\u0431\u044f. \u041d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0434 <code>SUCCESS<\/code>.<\/p>\n<blockquote>\n<p>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<br \/><code>PARTIAL<\/code> \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, <code>ABORT<\/code> \u2014 \u043f\u0440\u0438 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c.<\/p>\n<\/blockquote>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438: BPSK, CC \u2153.<\/p>\n<pre><code class=\"python\">def mod_eot_signal(self, conn_id: int, trans_id: int,                   mod_type: typing.Optional[ModType] = None,                   cc_speed: typing.Optional[CCSpeed] = None) -&gt; npt.NDArray:    packet = Eot(conn_id, trans_id, EotReason.SUCCESS)    return self.mod_packet_signal(packet, PacketType.EOT, mod_type, cc_speed)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h3>Acknowledgment<\/h3>\n<p>\u041f\u0430\u043a\u0435\u0442\u044b <code>Ack<\/code> \u0438 <code>Nack<\/code> \u0441\u043b\u0443\u0436\u0430\u0442 \u0434\u043b\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0449\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0430 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0430\u043a\u0435\u0442\u043e\u0432:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"93\" width=\"93\">\n<p align=\"left\">\u041f\u043e\u043b\u0435<\/p>\n<\/td>\n<td data-colwidth=\"55\" width=\"55\">\n<p align=\"left\">\u0422\u0438\u043f<\/p>\n<\/td>\n<td data-colwidth=\"122\" width=\"122\">\n<p align=\"left\">\u0420\u0430\u0437\u043c\u0435\u0440 (\u0431\u0438\u0442)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"93\" width=\"93\">\n<p align=\"left\">conn_id<\/p>\n<\/td>\n<td data-colwidth=\"55\" width=\"55\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"122\" width=\"122\">\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">ID \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"93\" width=\"93\">\n<p align=\"left\">trans_id<\/p>\n<\/td>\n<td data-colwidth=\"55\" width=\"55\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"122\" width=\"122\">\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u043e\u043c\u0435\u0440 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"93\" width=\"93\">\n<p align=\"left\">frame_id<\/p>\n<\/td>\n<td data-colwidth=\"55\" width=\"55\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"122\" width=\"122\">\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0444\u0440\u0435\u0439\u043c\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"93\" width=\"93\">\n<p align=\"left\">[CRC]<\/p>\n<\/td>\n<td data-colwidth=\"55\" width=\"55\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"122\" width=\"122\">\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0421\u0443\u043c\u043c\u0430\u0440\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0435\u043c\u043a\u043e\u0441\u0442\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 32 \u0431\u0438\u0442 (4 \u0431\u0430\u0439\u0442).<\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u0430:<\/p>\n<pre><code class=\"python\">@bit_packet@dataclassclass Ack(ConnTransPacketABC):    PACKET_TYPE: ClassVar[Final[PacketType]] = PacketType.ACK    frame_id: int = field(default=IntField(8))@dataclassclass Nack(Ack):    PACKET_TYPE: ClassVar[Final[PacketType]] = PacketType.NACK<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0421\u0438\u0433\u043d\u0430\u043b\u044b <code>Ack<\/code> \u0438 <code>Nack<\/code> \u0438\u043c\u0435\u044e\u0442 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c \u0432 \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0435 \u043d\u0430 PHY-\u0443\u0440\u043e\u0432\u043d\u0435.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430:\u00a0<br \/><code>Ack(conn_id=1, trans_id=2, frame_id=3)<\/code>;<br \/><code>Nack(conn_id=1, trans_id=2, frame_id=3)<\/code>.<\/p>\n<p>\u0411\u0438\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435: <code>00000001_00000010_00000011_[01100011]<\/code>.<\/p>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438: BPSK, CC \u2153.<\/p>\n<pre><code class=\"python\">def mod_ack_signal(self, conn_id: int, trans_id: int, frame_id: int,                   mod_type: typing.Optional[ModType] = None,                   cc_speed: typing.Optional[CCSpeed] = None) -&gt; npt.NDArray:    packet = Ack(conn_id, trans_id, frame_id)    return self.mod_packet_signal(packet, PacketType.ACK, mod_type, cc_speed)def mod_nack_signal(self, conn_id: int, trans_id: int, frame_id: int,                    mod_type: typing.Optional[ModType] = None,                    cc_speed: typing.Optional[CCSpeed] = None) -&gt; npt.NDArray:    packet = Nack(conn_id, trans_id, frame_id)    return self.mod_packet_signal(packet, PacketType.NACK, mod_type, cc_speed)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h3>Selective Acknowledgment<\/h3>\n<p>\u041f\u0430\u043a\u0435\u0442 Sack \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u0441\u0435\u043b\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0430\u0447\u043a\u0438 \u043f\u0440\u0438\u043d\u044f\u0442\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0430\u043a\u0435\u0442\u043e\u0432:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"91\" width=\"91\">\n<p align=\"left\">\u041f\u043e\u043b\u0435<\/p>\n<\/td>\n<td data-colwidth=\"59\" width=\"59\">\n<p align=\"left\">\u0422\u0438\u043f<\/p>\n<\/td>\n<td data-colwidth=\"125\" width=\"125\">\n<p align=\"left\">\u0420\u0430\u0437\u043c\u0435\u0440 (\u0431\u0438\u0442)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"91\" width=\"91\">\n<p align=\"left\">conn_id<\/p>\n<\/td>\n<td data-colwidth=\"59\" width=\"59\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"125\" width=\"125\">\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">ID \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"91\" width=\"91\">\n<p align=\"left\">trans_id<\/p>\n<\/td>\n<td data-colwidth=\"59\" width=\"59\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"125\" width=\"125\">\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u043e\u043c\u0435\u0440 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"91\" width=\"91\">\n<p align=\"left\">frame_id<\/p>\n<\/td>\n<td data-colwidth=\"59\" width=\"59\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"125\" width=\"125\">\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0444\u0440\u0435\u0439\u043c\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"91\" width=\"91\">\n<p align=\"left\">mask<\/p>\n<\/td>\n<td data-colwidth=\"59\" width=\"59\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"125\" width=\"125\">\n<p align=\"left\">16<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0411\u0443\u043b\u0435\u0432\u0430 \u043c\u0430\u0441\u043a\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043d\u044f\u0442\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"91\" width=\"91\">\n<p align=\"left\">[CRC]<\/p>\n<\/td>\n<td data-colwidth=\"59\" width=\"59\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"125\" width=\"125\">\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0421\u0443\u043c\u043c\u0430\u0440\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0435\u043c\u043a\u043e\u0441\u0442\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 40 \u0431\u0438\u0442 (5 \u0431\u0430\u0439\u0442).<\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u0430:<\/p>\n<pre><code class=\"python\">@bit_packet@dataclassclass Sack(ConnTransPacketABC):    PACKET_TYPE: ClassVar[Final[PacketType]] = PacketType.SACK    frame_id: int = field(default=IntField(8))    mask: int = field(default=IntField(16))    def is_ok(self, index: int) -&gt; bool:        return bool(self.mask &amp; (1 &lt;&lt; index))    def is_all_ok(self, count: int) -&gt; bool:        assert 0 &lt; count &lt;= 16        mask = (1 &lt;&lt; count) - 1        return (self.mask &amp; mask) == mask<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f \u043c\u0430\u0441\u043a\u0438 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043e 16 \u0431\u0438\u0442, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043e\u0434\u043d\u0438\u043c Sack-\u043f\u0430\u043a\u0435\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c \u0437\u0430 \u0440\u0430\u0437 \u0434\u043e 16 \u0444\u0440\u0435\u0439\u043c\u043e\u0432. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043e \u043a\u0430\u043a \u0440\u0430\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u043f\u0442\u0438\u043c\u0443\u043c \u0434\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438. \u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u043e\u0432 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u0435\u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0444\u0440\u0435\u0439\u043c\u043e\u0432 \u0432 RTS \u0437\u0430\u043f\u0440\u043e\u0441\u0435.<\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>is_ok<\/code> \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0430\u0441\u043a\u0443 \u0441 \u043d\u043e\u043c\u0435\u0440\u043e\u043c \u0431\u0438\u0442\u0430, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 \u043d\u043e\u043c\u0435\u0440\u0443 \u0444\u0440\u0435\u0439\u043c\u0430 \u0438\u0437 \u043f\u0440\u0438\u043d\u044f\u0442\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>is_all_ok<\/code> \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u0432\u0441\u0435 \u0431\u0438\u0442\u044b \u0432 \u043c\u0430\u0441\u043a\u0435 \u0438\u0441\u0442\u0438\u043d\u043d\u044b, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0431\u044b\u043b\u0430 \u043f\u0440\u0438\u043d\u044f\u0442\u0430 \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430:\u00a0<code>Sack(conn_id=1, trans_id=2, frame_id=3, mask=15)<\/code>.<\/p>\n<p>\u0411\u0438\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435: <code>00000001_00000010_00000011_0000000000001111_[11100111]<\/code>.<\/p>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438: BPSK, CC \u2153.<\/p>\n<pre><code class=\"python\">def mod_sack_signal(self, conn_id: int, trans_id: int, frame_id: int, mask: int,                    mod_type: typing.Optional[ModType] = None,                    cc_speed: typing.Optional[CCSpeed] = None) -&gt; npt.NDArray:    packet = Sack(conn_id, trans_id, frame_id, mask)    return self.mod_packet_signal(packet, PacketType.SACK, mod_type, cc_speed)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h3>Data bytes<\/h3>\n<p>\u0422\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 DataBytes, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0449\u0438\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0430\u043a\u0435\u0442\u0430:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"88\" width=\"88\">\n<p align=\"left\">\u041f\u043e\u043b\u0435<\/p>\n<\/td>\n<td data-colwidth=\"61\" width=\"61\">\n<p align=\"left\">\u0422\u0438\u043f<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"left\">\u0420\u0430\u0437\u043c\u0435\u0440 (\u0431\u0438\u0442)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"88\" width=\"88\">\n<p align=\"left\">conn_id<\/p>\n<\/td>\n<td data-colwidth=\"61\" width=\"61\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">ID \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"88\" width=\"88\">\n<p align=\"left\">trans_id<\/p>\n<\/td>\n<td data-colwidth=\"61\" width=\"61\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u043e\u043c\u0435\u0440 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"88\" width=\"88\">\n<p align=\"left\">frame_id<\/p>\n<\/td>\n<td data-colwidth=\"61\" width=\"61\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0444\u0440\u0435\u0439\u043c\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"88\" width=\"88\">\n<p align=\"left\">payload<\/p>\n<\/td>\n<td data-colwidth=\"61\" width=\"61\">\n<p align=\"left\">bits<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"left\">max 960<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"88\" width=\"88\">\n<p align=\"left\">[CRC]<\/p>\n<\/td>\n<td data-colwidth=\"61\" width=\"61\">\n<p align=\"left\">int<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"left\">16<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0435\u043c\u043a\u043e\u0441\u0442\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0434\u043e 1000 \u0431\u0438\u0442 (125 \u0431\u0430\u0439\u0442).<\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u0430:<\/p>\n<pre><code class=\"python\">@bit_packet@dataclassclass DataBytes(PacketCRC16, ConnPacketABC):    PACKET_TYPE: ClassVar[Final[PacketType]] = PacketType.DATA    frame_id: int = field(default=IntField(8))    payload: bytes = field(default=VarBitsField(120 * 8, min_len=1))<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043e\u043b\u0435 payload \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b, \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0432 960 \u0431\u0438\u0442. \u0412\u043c\u0435\u0441\u0442\u0435 \u0441 CRC-16 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u0445\u0432\u043e\u0441\u0442\u0435 \u043f\u0430\u043a\u0435\u0442\u0430.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430:\u00a0<code>DataBytes(conn_id=12, frame_id=34, payload=b'\\xff\\xff\\xff')<\/code>.<\/p>\n<p>\u0411\u0438\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435: <code>00001100_00100010_111111111111111111111111_[1001001001101101]<\/code>.<\/p>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438: BPSK\/QPSK\/16-QAM, CC \u2153 \u00bd \u2154 \u00be.<\/p>\n<pre><code class=\"python\">def mod_data_signal(self, conn_id: int, frame_id: int, data: bytes,                    mod_type: typing.Optional[ModType] = None,                    cc_speed: typing.Optional[CCSpeed] = None) -&gt; npt.NDArray:    packet = DataBytes(conn_id, frame_id, data)    return self.mod_packet_signal(packet, PacketType.DATA, mod_type, cc_speed)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0442\u0438\u043f \u043f\u0430\u043a\u0435\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c PSK \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0439 \u0432\u044b\u0441\u0448\u0435\u0433\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0438 \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u043d\u044b\u043c\u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044f\u043c\u0438 \u0441\u0432\u0435\u0440\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0435\u0440\u0430.<\/p>\n<h2>\u0421\u0435\u0442\u0435\u0432\u043e\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435<\/h2>\n<p>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u0448\u0438\u0440\u043e\u043a\u043e\u0432\u0435\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0432\u044b\u0437\u043e\u0432\u0430 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0442\u0440\u043e\u0439\u043d\u043e\u0433\u043e \u0440\u0443\u043a\u043e\u043f\u043e\u0436\u0430\u0442\u0438\u044f (three-way handshake). \u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430, \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0443\u0437\u043b\u0430\u043c\u0438, \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0430 \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 10.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/d6\/da\/b9\/d6dab936a08490775b6484d5e0971019.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 10. \u0413\u0440\u0430\u0444 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f.\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 10. \u0413\u0440\u0430\u0444 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f.\" width=\"740\" height=\"708\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/d6\/da\/b9\/d6dab936a08490775b6484d5e0971019.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/d6\/da\/b9\/d6dab936a08490775b6484d5e0971019.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 10. \u0413\u0440\u0430\u0444 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f.<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 11 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0443\u0437\u043b\u0430\u043c\u0438.<\/p>\n<p>\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0433\u043b\u0430\u043c\u0435\u043d\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442, \u0447\u0442\u043e \u0443\u0437\u0435\u043b, \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043e\u0431\u0449\u0438\u0439 \u0432\u044b\u0437\u043e\u0432, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u0442\u0430\u0442\u0443\u0441 \u0432\u0435\u0434\u0443\u0449\u0435\u0433\u043e (master), \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a \u043a\u043e\u0440\u0440\u0435\u0441\u043f\u043e\u043d\u0434\u0435\u043d\u0442\u044b, \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0449\u0438\u0435 \u0441 \u043d\u0438\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435, \u2014 \u0432\u0435\u0434\u043e\u043c\u044b\u0445 (slave).<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/b5\/03\/5e\/b5035ec5f53dc18669e5eec69d375e4d.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 11. \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0443\u0437\u043b\u0430\u043c\u0438.\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 11. \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0443\u0437\u043b\u0430\u043c\u0438.\" width=\"764\" height=\"468\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/b5\/03\/5e\/b5035ec5f53dc18669e5eec69d375e4d.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/b5\/03\/5e\/b5035ec5f53dc18669e5eec69d375e4d.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 11. \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0443\u0437\u043b\u0430\u043c\u0438.<\/figcaption><\/div>\n<\/figure>\n<p>\u0421\u0442\u0430\u0434\u0438\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0432\u044f\u0437\u0438 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0432\u0435\u0434\u0443\u0449\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0430 \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d\u0438\u044e \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0441\u043e\u043a\u0435\u0442\u0430, \u0441 \u0442\u0435\u043c \u043e\u0442\u043b\u0438\u0447\u0438\u0435\u043c, \u0447\u0442\u043e \u0432\u0435\u0434\u0443\u0449\u0435\u043c\u0443 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0441\u0432\u043e\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043f\u0443\u0442\u0435\u043c \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 <code>Beacon<\/code> \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u043e\u0437\u044b\u0432\u043d\u043e\u0433\u043e \u0438 \u0444\u043b\u0430\u0433\u0430 <code>CQ<\/code>. \u0412\u0435\u0434\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u0442 \u043f\u0430\u043a\u0435\u0442\u044b <code>CQ Beacon<\/code> \u0441 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u043c \u0432 30 \u0441\u0435\u043a\u0443\u043d\u0434 \u0434\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0432 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440: <code>Beacon(callsign='R1HAM', qth='KO85TR', mode=&lt;BeaconMode.CQ: 0&gt;)<\/code>.<\/p>\n<p>\u0412\u0435\u0434\u043e\u043c\u044b \u0443\u0437\u043b\u044b, \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u043a\u0430\u043d\u0430\u043b\u0430, \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u044e\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441 \u0432\u0435\u0434\u0443\u0449\u0438\u043c \u0443\u0437\u043b\u043e\u043c. \u041f\u0435\u0440\u0432\u044b\u0439 \u044d\u0442\u0430\u043f \u0440\u0443\u043a\u043e\u043f\u043e\u0436\u0430\u0442\u0438\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u043f\u0430\u043a\u0435\u0442\u0430 Conn \u0432\u0435\u0434\u043e\u043c\u044b\u043c \u0443\u0437\u043b\u043e\u043c. \u0412 \u043a\u0430\u043d\u0430\u043b \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u043e\u0437\u044b\u0432\u043d\u044b\u0435 \u0432\u0435\u0434\u0443\u0449\u0435\u0433\u043e \u0438 \u0432\u0435\u0434\u043e\u043c\u043e\u0433\u043e \u0443\u0437\u043b\u043e\u0432, \u0430 \u0442\u0430\u043a\u0436\u0435 QTH-\u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c, \u0432\u0435\u0434\u043e\u043c\u044b\u0439 \u0443\u0437\u0435\u043b \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0435 8-\u0431\u0438\u0442\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043e\u0442 0 \u0434\u043e 255 \u0434\u043b\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0441\u0432\u043e\u0435\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440: <code>Conn(called='R1HAM', caller='R2HOR', qth='KO59DW', caller_conn_id=14)<\/code>.<\/p>\n<p>\u0412 30-\u0438 \u0441\u0435\u043a\u0443\u043d\u0434\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430\u0445, \u043c\u0435\u0436\u0434\u0443 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043c\u0430\u044f\u043a\u0430, \u0432\u0435\u0434\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0440\u0435\u0436\u0438\u043c \u043f\u0440\u0438\u0435\u043c\u0430 \u0434\u043b\u044f \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0430\u0434\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0435\u043c\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 Conn, \u0432\u0435\u0434\u0443\u0449\u0438\u0439 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0432\u0435\u0434\u0443\u0449\u0438\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 <code>ConnAck<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0432\u0437\u0430\u0438\u043c\u043d\u043e \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442 \u043f\u043e\u0437\u044b\u0432\u043d\u043e\u0439 \u0432\u0435\u0434\u0443\u0449\u0435\u0433\u043e, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442 \u0444\u0430\u043a\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u043e\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>caller_conn_id+1<\/code>. \u0414\u0430\u043d\u043d\u0430\u044f \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u0435\u043c\u0430 \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 Conn \u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f.<\/p>\n<p>\u0412\u0435\u0434\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f, \u0432\u044b\u0431\u0438\u0440\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0435 8-\u0431\u0438\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0432\u0435\u0434\u043e\u043c\u043e\u0433\u043e \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u0441\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u043c\u0430\u0440\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u043e\u0442\u043d\u0435\u0441\u0442\u0438 \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0449\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0441 \u044d\u0442\u0438\u043c \u043a \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438.<\/p>\n<blockquote>\n<p>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<br \/>\u0412\u0432\u0438\u0434\u0443 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 53-\u0431\u0438\u0442\u043d\u044b\u0445 \u043f\u043e\u0437\u044b\u0432\u043d\u044b\u0445 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0430\u043a\u0435\u0442\u0435, \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0446\u0438\u0444\u0440\u043e\u0432\u043e\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u0435\u0441\u0441\u0438\u0438, \u0430 \u043f\u043e\u0437\u044b\u0432\u043d\u044b\u0435 \u0441\u0442\u0430\u043d\u0446\u0438\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u0445 \u043d\u0430 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435.<\/p>\n<\/blockquote>\n<h3>\u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0442\u0430\u0439\u043c-\u0441\u043b\u043e\u0442\u043e\u0432<\/h3>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0440\u0430\u0434\u0438\u043e\u043e\u0431\u043c\u0435\u043d \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u043f\u043e\u043b\u0443\u0434\u0443\u043f\u043b\u0435\u043a\u0441\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435, \u0432\u0435\u0434\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b \u0440\u0435\u0433\u043b\u0430\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043a\u0430\u043d\u0430\u043b\u043e\u0432, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044f \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0442\u0430\u0439\u043c-\u0441\u043b\u043e\u0442\u043e\u0432, \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0443\u0437\u043b\u044b \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u044e\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u0446\u0438\u044e \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.<\/p>\n<blockquote>\n<p>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<br \/>\u0412 \u043f\u043e\u043b\u0443\u0434\u0443\u043f\u043b\u0435\u043a\u0441\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u043f\u0440\u0430\u0432\u043e \u043d\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u0446\u0438\u044e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043c\u0443 \u0443\u0437\u043b\u0443, \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0447\u0430\u0441\u044b \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u043c \u0435\u0433\u043e \u0442\u0430\u0439\u043c-\u0441\u043b\u043e\u0442\u0430. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 \u0443\u0437\u0435\u043b \u043e\u0431\u044f\u0437\u0430\u043d \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e, \u043f\u043e \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0438 \u043f\u0440\u0438\u0435\u043c\u0430.<\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u0435\u043c \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0440\u0430\u043d\u0441\u0438\u0432\u0435\u0440\u0430 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b, \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0442\u0430\u0439\u043c-\u0441\u043b\u043e\u0442\u043e\u0432 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0438\u0445 \u043f\u0440\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u043d\u043e\u0439 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438 \u0432 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u044d\u0444\u0438\u0440.<\/p>\n<\/blockquote>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440: <code>ConnAck(caller='R2HOR', called='R1HAM', caller_conn_id=15, called_conn_id=31, mod=60, master_window=30, start_lag=30)<\/code>.<\/p>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b <code>mod<\/code> \u0438 <code>master_window<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0442\u0430\u0439\u043c-\u0441\u043b\u043e\u0442\u0430. \u041e\u0431\u0449\u0430\u044f \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0442\u0430 \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u043f\u043e\u043b\u044f <code>mod<\/code> \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044f <code>master_window<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430, \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0437\u0430 \u0432\u0435\u0434\u0443\u0449\u0438\u043c \u0443\u0437\u043b\u043e\u043c. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0434\u043b\u044f \u0432\u0435\u0434\u043e\u043c\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0432\u044b\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u044b\u0435 \u0440\u0430\u0437\u043d\u043e\u0441\u0442\u0438 <code>mod - master_window<\/code> \u0441\u0435\u043a\u0443\u043d\u0434.<\/p>\n<blockquote>\n<p>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<br \/>\u041f\u043e\u043b\u0435 <code>mod<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0443\u043b\u044c \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0435\u043a\u0443\u043d\u0434 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0447\u0430\u0441\u043e\u0432. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043f\u0440\u0438 <code>mod=60<\/code> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u0447\u0430\u0441\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043d\u0443\u043b\u0435\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0432 60 \u0441\u0435\u043a\u0443\u043d\u0434.<\/p>\n<\/blockquote>\n<p>\u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 12 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0438 \u0442\u0430\u0439\u043c-\u0441\u043b\u043e\u0442\u0430. \u041f\u043e\u043c\u0438\u043c\u043e \u0441\u0442\u0440\u043e\u0433\u043e\u0433\u043e \u0441\u043e\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u043e\u043d, \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u0445 \u0441\u043b\u043e\u0442\u043e\u0432 \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0437\u0430\u0449\u0438\u0442\u043d\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u044b \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439 \u0432\u0441\u0442\u0440\u0435\u0447\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438. \u042d\u0442\u043e\u0442 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0437\u0430\u0434\u0430\u043d \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438 \u0440\u0430\u0432\u0435\u043d 5 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u043c.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/47\/06\/46\/4706464b089ea80cd733ba97b7f82bff.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 12. \u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0443\u0447\u0430\u0441\u0442\u043a\u043e\u0432 \u0442\u0430\u0439\u043c-\u0441\u043b\u043e\u0442\u0430 \u043c\u0435\u0436\u0434\u0443 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430\u043c\u0438.\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 12. \u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0443\u0447\u0430\u0441\u0442\u043a\u043e\u0432 \u0442\u0430\u0439\u043c-\u0441\u043b\u043e\u0442\u0430 \u043c\u0435\u0436\u0434\u0443 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430\u043c\u0438.\" width=\"1103\" height=\"278\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/47\/06\/46\/4706464b089ea80cd733ba97b7f82bff.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/47\/06\/46\/4706464b089ea80cd733ba97b7f82bff.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 12. \u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0443\u0447\u0430\u0441\u0442\u043a\u043e\u0432 \u0442\u0430\u0439\u043c-\u0441\u043b\u043e\u0442\u0430 \u043c\u0435\u0436\u0434\u0443 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430\u043c\u0438.<\/figcaption><\/div>\n<\/figure>\n<p>\u0412 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u0435\u043d\u044f\u044e\u0449\u0435\u043c\u0441\u044f \u043a\u0430\u043d\u0430\u043b\u0435 \u0441\u0432\u044f\u0437\u0438 \u0441 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0442\u0435\u0440\u044c, <code>ConnAck<\/code> \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0434\u043e\u0439\u0442\u0438 \u0434\u043e \u043a\u043e\u0440\u0440\u0435\u0441\u043f\u043e\u043d\u0434\u0435\u043d\u0442\u0430. \u0414\u043b\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0437\u0430\u0446\u0438\u043a\u043b\u0438\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0440\u0443\u043a\u043e\u043f\u043e\u0436\u0430\u0442\u0438\u0439, \u0432\u0435\u0434\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b \u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u0435 <code>ConnAck<\/code> \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u0435 <code>start_lag<\/code>. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u0435\u0442\u0430, \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u0435\u0434\u043e\u043c\u043e\u043c\u0443 \u0443\u0437\u043b\u0443 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u0435\u043c \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u0431\u0435\u0437 \u043f\u0440\u0430\u0432\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u0435\u0434\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b \u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u0443\u0435\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0443\u0447\u0430\u0441\u0442\u043e\u043a \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0432\u044f\u0437\u0438 \u0438 \u0442\u0430\u043a\u0436\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0435\u0434\u043e\u043c\u043e\u043c\u0443 \u0443\u0437\u043b\u0443 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u0437\u0430\u0449\u0438\u0442\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043e\u0431\u0449\u0435\u0439 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u043e\u0439 \u0442\u0430\u0439\u043c-\u0441\u043b\u043e\u0442\u043e\u0432.<\/p>\n<pre><code class=\"python\">TIME_MOD = 60MASTER_WINDOW = 30START_LAG = 30GUARD_TIME = 5.0<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0422\u0440\u0438\u0433\u0433\u0435\u0440 \u0442\u0430\u0439\u043c-\u0441\u043b\u043e\u0442\u0430:<\/p>\n<pre><code class=\"python\">@propertydef tx_allowed(self) -&gt; bool:    now = int(get_time()    time_pos = now % self._time_mod...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0422\u0430\u0439\u043c-\u0441\u043b\u043e\u0442 \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code>time_pos<\/code> \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<pre><code class=\"python\">...    is_connecting = self._conn_state.is_connecting    if self.is_master:        return is_connecting or time_pos &lt; (self._time_master_wnd - self.GUARD_TIME)...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0430 \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e. \u0414\u043b\u044f \u0432\u0435\u0434\u0443\u0449\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u0441\u043b\u043e\u0442\u0435 <code>_time_master_wnd<\/code>.<\/p>\n<pre><code class=\"python\">...    if is_connecting or now &lt; self._time_start:        return False...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0432\u0435\u0434\u043e\u043c\u043e\u043c\u0443 \u0443\u0437\u043b\u0443 \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d \u0432\u044b\u0445\u043e\u0434 \u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0434\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 <code>start_lag<\/code>.<\/p>\n<pre><code class=\"python\">...    wnd_start = self._time_master_wnd    wnd_end = self._time_mod - self.GUARD_TIME    return wnd_start &lt;= time_pos &lt; wnd_end<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u043f\u0430\u0434\u0430\u043d\u0438\u044f \u0432 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u043b\u043e\u0442 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0437\u0430\u0449\u0438\u0442\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 <code>GUARD_TIME<\/code>.<\/p>\n<p>\u041f\u0440\u0438 \u043f\u0440\u0438\u0435\u043c\u0435 \u043f\u0430\u043a\u0435\u0442\u0430 <code>ConnAck<\/code>, \u0432\u0435\u0434\u043e\u043c\u044b\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442 \u0444\u0430\u043a\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 <code>Ack<\/code>. \u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043e\u0431\u0430 \u043a\u043e\u0440\u0440\u0435\u0441\u043f\u043e\u043d\u0434\u0435\u043d\u0442\u0430 \u0432\u0437\u0432\u043e\u0434\u044f\u0442 \u0444\u043b\u0430\u0433 \u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f (\u0440\u0438\u0441\u0443\u043d\u043e\u043a 11).<\/p>\n<p>\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>LISTENING<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u043c \u0438 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u044b\u043c \u0434\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u044f\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0436\u0438\u043c\u0430 \u043e\u0431\u0449\u0435\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430. \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u043c\u0435\u0436\u0434\u0443 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0445 \u043f\u043e\u043f\u044b\u0442\u043e\u043a \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0438 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0430\u043c\u0438, \u043f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>CLOSED<\/code>.<\/p>\n<pre><code class=\"python\">MAX_RETRANSMITS = 5RETRANSMIT_TIMEOUT = 10.0CQ_INTERVAL = 30.0RX_ACK_EVERY_PACKETS = 5RX_ACK_TIMEOUT = 2.0<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041b\u043e\u0433\u0438\u043a\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u043d\u0430\u0434 \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u043e\u043c.<\/p>\n<pre><code class=\"python\">def process(self, signal: np.ndarray):    super().process(signal)    now = get_time()    if self._conn_state == ConnectionState.LISTENING:        if now - self._last_cq_time &gt;= self.CQ_INTERVAL:            self._last_cq_time = now            self._send_cq()        return...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <code>LISTENING<\/code> \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 CQ-\u043c\u0430\u044f\u043a\u0430.<\/p>\n<pre><code class=\"python\">...    if self._conn_state == ConnectionState.CLOSED:        return...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438 \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0438 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <code>CLOSED<\/code> \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u043b\u043e\u0433\u0438\u043a\u0438.<\/p>\n<pre><code class=\"python\">...    if self._conn_state in (ConnectionState.CONNECTING, ConnectionState.HANDSHAKE):        if now - self._last_tx_time &gt; self.RETRANSMIT_TIMEOUT:            if self._retransmit_count &gt;= self.MAX_RETRANSMITS:                self._set_connection_state(ConnectionState.CLOSED)                return            self._retransmit()            return...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <code>CONNECTING<\/code> \u0438 <code>HANDSHAKE<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u043e\u0432 \u0438 \u043e\u0446\u0435\u043d\u043a\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430.<\/p>\n<pre><code class=\"python\">...    if self._conn_state == ConnectionState.CONNECTED:        self._session_loop()<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f, \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0446\u0438\u043a\u043b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f <code>_session_loop<\/code>.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430:<\/p>\n<pre><code class=\"python\">def _retransmit(self) -&gt; None:    if self._last_signal_sent is not None:        self._retransmit_count += 1        self._send_signal(self._last_signal_sent)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>_setup_connection<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0442\u0430\u0439\u043c-\u0441\u043b\u043e\u0442\u043e\u0432 \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043a\u0443 <code>t_ime_start<\/code> \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 <code>start_lag<\/code> (\u0441\u043c. \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u044b\u0448\u0435).<\/p>\n<pre><code class=\"python\">def _setup_connection(self, mod: int, master_window: int, start_lag: int) -&gt; None:    self._time_mod = mod    self._time_master_wnd = master_window    self._time_start = self._detector_time + start_lag<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>_process_packet<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u043a\u043e\u0433\u0434\u0430 \u0434\u0435\u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 \u043d\u0430 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430.<\/p>\n<pre><code class=\"python\">def _process_packet(self, packet: PacketCRC, EsN0_carriers_dB: npt.NDArray[np.float64], EsN0_dB: float,                    SNR: float, BER: float, speed: float) -&gt; None:    now = get_time()    if self._conn_state == ConnectionState.LISTENING:        self._last_cq_time = now        if isinstance(packet, Conn) and packet.called == self._callsign:            if self._can_connect(packet.caller, packet.qth):                self._remote_callsign = packet.caller                self._remote_qth = packet.qth                self._conn_id = self._gen_conn_id()                self._tmp_conn_id = packet.caller_conn_id                self._set_connection_state(ConnectionState.HANDSHAKE)                self._retransmit_count = 0                self._send_conn_ack()        return...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <code>LISTENING<\/code> (\u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430 CQ-\u0437\u0430\u043f\u0440\u043e\u0441) \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 <code>Conn<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u0443\u0437\u043b\u0443. \u041c\u0435\u0442\u043e\u0434 <code>_can_connect<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u0442\u043e\u0440\u0438\u0447\u043d\u0443\u044e \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044e \u043f\u043e \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u044f\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u043f\u043e\u0437\u044b\u0432\u043d\u043e\u0433\u043e ITU-\u0437\u043e\u043d\u0430\u043c \u0438 \u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c QTH. \u041f\u0440\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0442\u0440\u0435\u0445\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0433\u043e \u0440\u0443\u043a\u043e\u043f\u043e\u0436\u0430\u0442\u0438\u044f <code>HANDSHAKE<\/code>.<\/p>\n<pre><code class=\"python\">...    if self._conn_state == ConnectionState.HANDSHAKE:        if isinstance(packet, Conn) and packet.caller == self._remote_callsign:            if self._last_signal_sent is not None:                self._send_signal(self._last_signal_sent)            return        if isinstance(packet, Ack) and packet.conn_id == self._conn_id:            self._set_connection_state(ConnectionState.CONNECTED)            self._handle_connected()            self._time_start = now            self._last_signal_sent = None        return...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <code>HANDSHAKE<\/code> \u0443\u0437\u0435\u043b \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f. \u0415\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u043e\u0439 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e <code>conn_id<\/code>, \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>CONNECTED<\/code> \u0441 \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u044f <code>_handle_connected<\/code>.<\/p>\n<p><em>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0443\u0437\u0435\u043b \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 <\/em><code><em>Conn<\/em><\/code><em> (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437-\u0437\u0430 \u043f\u043e\u0442\u0435\u0440\u044c \u0432 \u043a\u0430\u043d\u0430\u043b\u0435 \u0441\u0432\u044f\u0437\u0438), \u043e\u043f\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u0435\u0442 <\/em><code><em>Ack<\/em><\/code><em>-\u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435.<\/em><\/p>\n<pre><code class=\"python\">...    if self._conn_state == ConnectionState.CONNECTING:        if isinstance(packet,                      ConnAck) and packet.caller == self._callsign and packet.called == self._remote_callsign:            if packet.caller_conn_id != self._tmp_conn_id + 1:                self._set_connection_state(ConnectionState.CLOSED)                return            self._conn_id = packet.called_conn_id            signal = self.modem.mod_ack_signal(self._conn_id, self._get_seq_id(),                                               frame_id=0)  # target_id here is zero            self._send_signal(signal)            self._set_connection_state(ConnectionState.CONNECTED)            self._handle_connected()            self._setup_connection(packet.mod, packet.master_window, packet.start_lag)            self._last_signal_sent = None        return...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>CONNECTING<\/code> \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f (\u043c\u0435\u0442\u043e\u0434 <code>connect_to<\/code>). \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u043e\u0442 \u0432\u0435\u0434\u0443\u0449\u0435\u0433\u043e \u0443\u0437\u043b\u0430. \u041f\u0430\u043a\u0435\u0442 <code>ConnAck<\/code> \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u043d\u044b\u043c \u043f\u0440\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u0441 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u043e\u043c +1 \u043a \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u043c\u0443 <code>_tmp_conn_id<\/code>.<\/p>\n<pre><code class=\"python\">...    if self._conn_state == ConnectionState.CONNECTED:        if isinstance(packet, ConnAck) and packet.called_conn_id == self._conn_id:            signal = self.modem.mod_ack_signal(self._conn_id, self._get_seq_id(),                                               frame_id=0)  # target_id here is zero            self._send_signal(signal)            return        kwargs = dict(EsN0_carriers_dB=EsN0_carriers_dB, EsN0_dB=EsN0_dB, SNR=SNR, BER=BER)        if isinstance(packet, ConnPacketABC) and packet.conn_id == self._conn_id:            self._handle_session_packet(packet, **kwargs)            return        self._handle_unknown_packet(packet, **kwargs)        return<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <code>CONNECTED<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 <em>conn<\/em>id \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0443 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f. \u041f\u0430\u043a\u0435\u0442\u044b, \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443, \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0432 <code>_handle_session_packet<\/code> \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0441\u0435\u0441\u0441\u0438\u0438. \u041f\u0430\u043a\u0435\u0442\u044b \u043d\u0435 \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043f\u0435\u0440\u0435\u0441\u044b\u043b\u0430\u044e\u0442\u0441\u044f \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a <code>_handle_unknown_packet<\/code>.<\/p>\n<h2>\u0421\u0435\u0441\u0441\u0438\u044f<\/h2>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\u043c\u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0435\u0441\u0441\u0438\u044f, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0430\u044f \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0430\u043a\u0435\u0442\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u041d\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 (ARQ, Automatic Repeat reQuest).<\/p>\n<h3>\u041f\u0430\u043a\u0435\u0442\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430<\/h3>\n<p>\u041f\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u043d\u0438\u0437\u043a\u043e\u0439 \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043c\u043e\u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0435\u0434\u0438\u043d\u044b\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u0432 \u043d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u043c \u0440\u0430\u0434\u0438\u043e\u043a\u0430\u043d\u0430\u043b\u0435, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043d\u0430 \u0431\u043b\u043e\u043a\u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430.<\/p>\n<p>\u041f\u0440\u0438 \u0442\u0430\u043a\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u0430\u0437\u043e\u0432\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u043e\u0447\u0435\u0440\u0435\u0434\u043d\u0430\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435\u043c \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0435\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 (\u0440\u0438\u0441\u0443\u043d\u043e\u043a 13).<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/4f\/d8\/66\/4fd86633c468deac4d15a764ce05d707.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 13. \u041f\u0430\u043a\u0435\u0442\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435\u043c \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430.\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 13. \u041f\u0430\u043a\u0435\u0442\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435\u043c \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430.\" width=\"599\" height=\"848\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/4f\/d8\/66\/4fd86633c468deac4d15a764ce05d707.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/4f\/d8\/66\/4fd86633c468deac4d15a764ce05d707.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 13. \u041f\u0430\u043a\u0435\u0442\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435\u043c \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430.<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a \u0432 \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u0445 \u0441\u0432\u043e\u0435\u0433\u043e \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0442\u0430\u0439\u043c-\u0441\u043b\u043e\u0442\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 RTS \u0437\u0430\u043f\u0440\u043e\u0441. \u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u0438\u0435\u043c\u0430 \u043f\u0430\u043a\u0435\u0442\u0430 CTS \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0441 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 (Stop-and-Wait) \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u0430. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u0442\u0435\u0440\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 \u0438\u043b\u0438 \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u044f \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u0443\u044e \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u041f\u0440\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u043f\u0440\u0438\u0435\u043c\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u043a \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445. \u042d\u0442\u043e\u0442 \u0446\u0438\u043a\u043b \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0441\u044f \u0434\u043e \u043f\u043e\u043b\u043d\u043e\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0432\u0441\u0435\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u0424\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 EOF-\u043f\u0430\u043a\u0435\u0442 \u0441\u043b\u0443\u0436\u0438\u0442 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c \u043a\u043e\u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438. \u041b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u0442\u043e\u0442 \u043f\u0430\u043a\u0435\u0442 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u0432 \u043e\u0431\u0449\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043a \u043d\u0435\u043c\u0443 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0438 ARQ-\u0437\u0430\u043f\u0440\u043e\u0441\u0430.<\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0440\u0435\u0436\u0438\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 <code>SEND_SIMPLE<\/code>. \u0414\u0430\u043d\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0435\u0439 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c\u044e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u0442\u0440\u043e\u0433\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0431\u043b\u043e\u043a\u043e\u0432 \u0438 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0438\u0445 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f. \u041c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u0441\u043e\u043a\u043e\u0439 (\u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043f\u0430\u043a\u0435\u0442\u0430 \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0439 \u0432 \u043d\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438), \u043d\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043e\u0431\u043c\u0435\u043d\u0430 \u0441\u0438\u043b\u044c\u043d\u043e \u0441\u043d\u0438\u0436\u0430\u0435\u0442\u0441\u044f \u0438\u0437-\u0437\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0437\u0430\u0434\u0435\u0440\u0436\u0435\u043a (\u043f\u0438\u043d\u0433\u0430) \u0438 \u043e\u0432\u0435\u0440\u0445\u0435\u0434\u0430, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u043c \u0442\u0440\u0430\u0444\u0438\u043a\u043e\u043c.<\/p>\n<h3>Bulk-\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430<\/h3>\n<p>Bulk-\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 (\u0440\u0438\u0441\u0443\u043d\u043e\u043a 14) \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0432\u044b\u0441\u043e\u043a\u043e\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0431\u043b\u043e\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u044d\u0444\u0438\u0440 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c, \u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u0433\u0440\u0443\u043f\u043f\u043e\u0432\u043e\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/09\/b2\/4e\/09b24e9a51f0479ba2f1fcc1c0c2be10.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 14. Bulk-\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0433\u0440\u0443\u043f\u043f\u043e\u0432\u044b\u043c \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435\u043c \u043f\u0430\u043a\u0435\u0442\u043e\u0432.\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 14. Bulk-\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0433\u0440\u0443\u043f\u043f\u043e\u0432\u044b\u043c \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435\u043c \u043f\u0430\u043a\u0435\u0442\u043e\u0432.\" width=\"598\" height=\"846\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/09\/b2\/4e\/09b24e9a51f0479ba2f1fcc1c0c2be10.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/09\/b2\/4e\/09b24e9a51f0479ba2f1fcc1c0c2be10.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 14. Bulk-\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0433\u0440\u0443\u043f\u043f\u043e\u0432\u044b\u043c \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435\u043c \u043f\u0430\u043a\u0435\u0442\u043e\u0432.<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u044f EOT-\u043f\u0430\u043a\u0435\u0442\u0430, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 Sack-\u043f\u0430\u043a\u0435\u0442. \u0421\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0430\u044f\u0441\u044f \u0432 \u043d\u0435\u043c \u0431\u0438\u0442\u043e\u0432\u0430\u044f \u043c\u0430\u0441\u043a\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043a\u0430\u043a\u0438\u0435 \u0441\u0442\u0430\u0442\u0443\u0441 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0434\u0430\u044e\u0449\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0431\u0438\u0442\u043e\u0432\u0443\u044e \u043c\u0430\u0441\u043a\u0443 \u0438 \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u0443\u044e \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u0445 \u0431\u043b\u043e\u043a\u043e\u0432, \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0430\u0441\u044c \u043e\u0448\u0438\u0431\u043a\u043e\u0439. \u0414\u0430\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0441\u044f \u0434\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u0432\u0441\u0435\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0440\u0438\u0441\u0443\u043d\u043e\u043a 15).<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/26\/35\/9a\/26359a212388bc0be6e2f85dbded2297.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 15. \u041f\u043e\u0432\u0442\u043e\u0440\u043d\u0430\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432.\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 15. \u041f\u043e\u0432\u0442\u043e\u0440\u043d\u0430\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432.\" width=\"660\" height=\"606\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/26\/35\/9a\/26359a212388bc0be6e2f85dbded2297.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/26\/35\/9a\/26359a212388bc0be6e2f85dbded2297.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 15. \u041f\u043e\u0432\u0442\u043e\u0440\u043d\u0430\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432.<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 bulk-\u0440\u0435\u0436\u0438\u043c\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u0432\u044b\u0441\u0438\u0442\u044c \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438\u0437\u0434\u0435\u0440\u0436\u043a\u0438 \u043d\u0430 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0439 \u0442\u0440\u0430\u0444\u0438\u043a.<\/p>\n<h3>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f<\/h3>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432\u0435\u0434\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b \u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u0443\u0435\u0442 \u0447\u0430\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 \u0432 \u0442\u0430\u0439\u043c-\u0441\u043b\u043e\u0442\u0435 \u0434\u043b\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043d\u0443\u0436\u0434, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 ping-\u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u0412\u0435\u0434\u043e\u043c\u044b\u0439 \u0443\u0437\u0435\u043b \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 pong-\u043e\u0442\u0432\u0435\u0442 (\u0440\u0438\u0441\u0443\u043d\u043e\u043a 16).<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/ba\/cc\/20\/bacc2009a14c146a92b1d095575ebf2f.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 16. \u041f\u0438\u043d\u0433-\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0432 \u0442\u0430\u0439\u043c\u0441\u043b\u043e\u0442\u0435 \u043c\u0430\u0441\u0442\u0435\u0440\u0430.\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 16. \u041f\u0438\u043d\u0433-\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0432 \u0442\u0430\u0439\u043c\u0441\u043b\u043e\u0442\u0435 \u043c\u0430\u0441\u0442\u0435\u0440\u0430.\" width=\"540\" height=\"328\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/ba\/cc\/20\/bacc2009a14c146a92b1d095575ebf2f.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/ba\/cc\/20\/bacc2009a14c146a92b1d095575ebf2f.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 16. \u041f\u0438\u043d\u0433-\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0432 \u0442\u0430\u0439\u043c\u0441\u043b\u043e\u0442\u0435 \u043c\u0430\u0441\u0442\u0435\u0440\u0430.<\/figcaption><\/div>\n<\/figure>\n<p>\u0410\u043d\u0430\u043b\u0438\u0437 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 ping-\u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u043e\u0434\u0435\u043c\u043e\u0432 \u043f\u0440\u0438 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0442\u0435\u0440\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0432 \u043a\u0430\u043d\u0430\u043b\u0435.<\/p>\n<p>\u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 17 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u0433\u0440\u0430\u0444 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0435\u0441\u0441\u0438\u0438.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/89\/74\/79\/897479c3178b66b3f2f92be4babd0551.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 17. \u0413\u0440\u0430\u0444 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0441\u0435\u0441\u0441\u0438\u0438.\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 17. \u0413\u0440\u0430\u0444 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0441\u0435\u0441\u0441\u0438\u0438.\" width=\"1196\" height=\"699\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/89\/74\/79\/897479c3178b66b3f2f92be4babd0551.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/89\/74\/79\/897479c3178b66b3f2f92be4babd0551.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 17. \u0413\u0440\u0430\u0444 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0441\u0435\u0441\u0441\u0438\u0438.<\/figcaption><\/div>\n<\/figure>\n<p>\u041e\u0431\u0449\u0438\u0439 \u043f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439:<\/p>\n<pre><code class=\"python\">class SessionState(Enum):    IDLE = 0    PING_AWAIT = 1    CTS_AWAIT = 2    DATA_TRANSFER = 3    DATA_CONFIRM_AWAIT = 4    DATA_AWAIT = 5    EOT_ACK_AWAIT = 6    @property    def is_awaiting(self) -&gt; bool:        cls = self.__class__        return self in (            cls.PING_AWAIT, cls.CTS_AWAIT, cls.DATA_CONFIRM_AWAIT, cls.DATA_AWAIT, cls.EOT_ACK_AWAIT        )<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0440\u0430\u0431\u043e\u0442\u044b FSM \u043b\u043e\u0433\u0438\u043a\u0438 \u0441\u0435\u0441\u0441\u0438\u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442 \u0432 \u0441\u0435\u0431\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438:<\/p>\n<pre><code class=\"python\">class Session(Connection):    PING_INTERVAL = 60.0  # sec    DEFAULT_RTS_INTERVAL = 20.0  # sec    DEFAULT_FRAME_LEN = 40 * 8  # bits    MAX_FRAMES = 1 &lt;&lt; 8    DEFAULT_IDLE_TIMEOUT = 180.0<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>PING_INTERVAL<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043a\u0430\u043a \u0447\u0430\u0441\u0442\u043e \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <code>IDLE<\/code> \u0431\u0443\u0434\u0435\u0442 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 Ping-\u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043e\u0442 \u0432\u0435\u0434\u0443\u0449\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u043a \u0432\u0435\u0434\u043e\u043c\u043e\u043c\u0443.<\/p>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>DEFAULT_RTS_INTERVAL<\/code> \u0437\u0430\u0434\u0430\u0435\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043c\u0435\u0436\u0434\u0443 \u0446\u0438\u043a\u043b\u0430\u043c\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 RTS-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.<\/p>\n<p>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>DEFAULT_FRAME_LEN<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0432\u0435\u0440\u0445\u043d\u044e\u044e \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 \u043f\u0430\u043a\u0435\u0442\u0443 Data).<\/p>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>MAX_FRAMES<\/code> \u0437\u0430\u0434\u0430\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u043b\u043e\u043a\u043e\u0432 \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u0445 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0439 \u043f\u0430\u043a\u0435\u0442\u043d\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438.<\/p>\n<p>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>DEFAULT_IDLE_TIMEOUT<\/code> \u0437\u0430\u0434\u0430\u0435\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438, \u043f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u0435\u0441\u0441\u0438\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439.<\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>_session_loop<\/code> \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u0441\u0435\u0441\u0441\u0438\u0438:<\/p>\n<pre><code class=\"python\">def _session_loop(self):    now = get_time()    if self._last_tx_tms is not None and now - self._last_tx_tms &gt; self.DEFAULT_IDLE_TIMEOUT:        self.close()        return    if self._session_state != SessionState.IDLE:        if now - self._last_progress_tms &gt; self._activity_timeout:            if self._session_state == SessionState.DATA_AWAIT:                self._tx_block = None                self._set_session_state(SessionState.IDLE)                self._rx_buffer.clear()                self._rx_buffer_dtype = None                self._rx_pending_payloads.clear()                return            elif now - self._last_signal_tms &gt; self._activity_timeout:                self._tx_block = None                self._set_session_state(SessionState.IDLE)                return...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0442\u0430\u0439\u043c-\u0430\u0443\u0442\u0430 \u0441\u0435\u0441\u0441\u0438\u0438: \u043f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>_activity_timeout<\/code> \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u0441\u0435\u0441\u0441\u0438\u044e \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>IDLE<\/code>. \u041f\u0440\u0438 \u043f\u0440\u0435\u043e\u0434\u043e\u043b\u0435\u043d\u0438\u0438 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u043e\u0440\u043e\u0433\u0430 <code>DEFAULT_IDLE_TIMEOUT<\/code> \u0441\u0435\u0441\u0441\u0438\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f.<\/p>\n<pre><code class=\"python\">...    is_session_active = self._session_state not in (SessionState.IDLE, SessionState.PING_AWAIT)    if is_session_active:        self.rx_packets_since_last_ack = 0    if self.is_master:        if self._session_state == SessionState.IDLE and now - self._last_ping_time &gt; self.PING_INTERVAL:            self._last_ping_time = now            signal = self.modem.mod_ping_signal(                self._conn_id, trans_id=self._get_seq_id(), time=time_monotonic_ms(self.MONOTONIC_TIME_MOD)            )            self._set_session_state(SessionState.PING_AWAIT)            self._send_signal(signal)            return...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u0442\u0430\u0439\u043c-\u0441\u043b\u043e\u0442\u0435 \u0432\u0435\u0434\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u043e\u0446\u0435\u043d\u043a\u0443 \u043a\u0430\u043d\u0430\u043b\u0430 \u043f\u0443\u0442\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 Ping-\u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043e\u0442\u0432\u0435\u0442\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430 Pong \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <code>PING_AWAIT<\/code>.<\/p>\n<pre><code class=\"python\">...    if (self._session_state == SessionState.IDLE            and len(self._tx_buffer) &gt; 0            and self.tx_allowed            and (now - self._last_ping_time &gt; self.GUARD_TIME)):        assert self._tx_block is None        assert len(self._tx_buffer) &lt; self._max_tx_block_len        self._tx_block = TXBlock(            frame_len=self._frame_len,            data=self._tx_buffer[0],            rts_interval=self.DEFAULT_RTS_INTERVAL,            last_rts=now        )        self._tx_block.retry_count = 0        signal = self.modem.mod_rts_signal(            self._conn_id, trans_id=self._get_seq_id(),            **self._tx_block.get_rts_args()        )        self._set_session_state(SessionState.CTS_AWAIT)        self._send_signal(signal)        return...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <code>IDLE<\/code> \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0431\u0443\u0444\u0435\u0440\u0430 \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u0440\u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432 \u0441 \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u043c\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0442\u0430\u0439\u043c-\u0441\u043b\u043e\u0442\u0430 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442 <code>TXBlock<\/code> (\u0441\u043c. \u0434\u0430\u043b\u0435\u0435), \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0431\u043b\u043e\u043a\u0438 \u0438 \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438.<\/p>\n<p>\u041e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 RTS, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>CTS_AWAIT<\/code> \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0449\u0438\u0445 CTS-\u043e\u0442\u0432\u0435\u0442\u043e\u0432.<\/p>\n<pre><code class=\"python\">...    elif self._session_state == SessionState.CTS_AWAIT and self.tx_allowed:        if self._tx_block is not None and now - self._tx_block.last_rts &gt; self._tx_block.rts_interval:            if self._tx_block.retry_count &gt;= self._tx_block.max_retries:                self._tx_block = None                self._set_session_state(SessionState.IDLE)                self.close()                return            self._tx_block.retry_count += 1            self._tx_block.last_rts = now            signal = self.modem.mod_rts_signal(                self._conn_id, trans_id=self._get_seq_id(),                **self._tx_block.get_rts_args()            )            self._send_signal(signal)        return...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0442\u0430\u0439\u043c\u0435\u0440\u043e\u0432 \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 RTS \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <code>CTS_AWAIT<\/code>. \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <code>retry_count<\/code> \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.<\/p>\n<pre><code class=\"python\">...    elif self._session_state == SessionState.DATA_TRANSFER and self.tx_allowed:        if not self._tx_block.eof:            wire_frame_id = self._tx_block.current_frame_idx % 256            signal = self.modem.mod_data_signal(                self._conn_id, frame_id=wire_frame_id, data=self._tx_block.current_data_block,                **self._get_data_signal_extra_args()           )            self._tx_block.last_tx_time = now            self._tx_block.retry_count = 0            if self._current_cts_status == CTSStatus.SEND_BULK:                self._tx_block.pop_current_frame()            else:                self._set_session_state(SessionState.DATA_CONFIRM_AWAIT)            self._send_signal(signal)            return        else:            self._set_session_state(SessionState.EOT_ACK_AWAIT)            if self._tx_block.eot_trans_id == 0:                self._tx_block.eot_trans_id = self._gen_trans_id()            signal = self.modem.mod_eot_signal(self._conn_id, trans_id=self._tx_block.eot_trans_id)            self._tx_block.last_tx_time = now            self._tx_block.retry_count = 0            self._send_signal(signal)            return...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <code>DATA_TRANSFER<\/code>, \u044f\u0432\u043b\u044f\u044e\u0449\u0438\u043c\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u043f\u0440\u0438 \u043e\u0431\u043c\u0435\u043d\u0435 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0431\u043b\u043e\u043a\u043e\u0432 \u0438\u0437 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b <code>_tx_block<\/code> \u0438 \u0438\u0445 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0432 \u043a\u0430\u043d\u0430\u043b. \u041f\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0432\u0441\u0435\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0440\u0438 \u0438\u0441\u0442\u0438\u043d\u043d\u043e\u0441\u0442\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u044f <code>self._tx_block.eof<\/code> \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f EOT-\u0441\u0438\u0433\u043d\u0430\u043b, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u044f EOT (<code>EOT_ACK_AWAIT<\/code>).<\/p>\n<p>\u041d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u043e\u0431\u0430 \u0440\u0435\u0436\u0438\u043c\u0430 \u043f\u0430\u043a\u0435\u0442\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438: Bulk \u0438 Stop-and-Wait, \u0447\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f <code>_current_cts_status<\/code>.<\/p>\n<pre><code class=\"python\">...    elif self._session_state == SessionState.DATA_CONFIRM_AWAIT and self.tx_allowed:        if now - self._tx_block.last_tx_time &gt; self._tx_block.retry_timeout:            if self._tx_block.retry_count &gt;= self._tx_block.max_retries:                self._tx_block = None                self._set_session_state(SessionState.IDLE)                self.close()                return            self._tx_block.retry_count += 1            self._tx_block.last_tx_time = now            wire_frame_id = self._tx_block.current_frame_idx % 256            signal = self.modem.mod_data_signal(                self._conn_id, frame_id=wire_frame_id, data=self._tx_block.current_data_block,                **self._get_data_signal_extra_args()           )            self._send_signal(signal)        return...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>DATA_CONFIRM_AWAIT<\/code> \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 Stop-and-Wait.<\/p>\n<pre><code class=\"python\">...    elif self._session_state == SessionState.EOT_ACK_AWAIT and self.tx_allowed:        if now - self._tx_block.last_tx_time &gt; self._tx_block.retry_timeout:            if self._tx_block.retry_count &gt;= self._tx_block.max_retries:                self._tx_block = None                self._set_session_state(SessionState.IDLE)                self.close()                return            self._tx_block.retry_count += 1            self._tx_block.last_tx_time = now            signal = self.modem.mod_eot_signal(self._conn_id, trans_id=self._tx_block.eot_trans_id)            self._send_signal(signal)        return<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u0430\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 EOT-\u043f\u0430\u043a\u0435\u0442\u0430 \u0438 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 retry_count \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <code>EOT_ACK_AWAIT<\/code>. \u041f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 retry_count \u043b\u0438\u043c\u0438\u0442\u0430 \u0441\u0435\u0441\u0441\u0438\u044f \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>IDLE<\/code>.<\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043b\u043e\u0433\u0438\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u043e\u0432 \u0440\u0430\u0437\u043d\u0435\u0441\u0435\u043d\u0430 \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0435 \u0443\u0440\u043e\u0432\u043d\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 (\u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u0442\u0430\u0439\u043c\u0435\u0440\u043e\u0432 \u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u043e\u0442 \u043c\u043e\u0434\u0435\u043c\u0430), \u043c\u0435\u0442\u043e\u0434 <code>_handle_session_packet<\/code> \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0442\u0432\u0435\u0442\u043e\u0432, \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0449\u0438\u0445 \u043e\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430.<\/p>\n<pre><code class=\"python\">def _handle_session_packet(self, packet: PacketCRC, **kwargs) -&gt; None:    now = get_time()    self._last_signal_tms = now    self._last_tx_tms = now    if isinstance(packet, Ping):        delta_ms = int((now - self._detector_time) * 1000)        signal = self.modem.mod_pong_signal(            self._conn_id, trans_id=packet.trans_id, remote_time=packet.time, local_delta=delta_ms        )        self._send_signal(signal)        return...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 Ping-\u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u041e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u0430\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u0430\u043a\u0435\u0442\u0430 Pong.<\/p>\n<pre><code class=\"python\">...    if isinstance(packet, Pong):        if self._session_state != SessionState.PING_AWAIT:            self._handle_unexpected_packet(packet)        delta_ms = monotonic_delta(            time_monotonic_ms(self.MONOTONIC_TIME_MOD), packet.remote_time, self.MONOTONIC_TIME_MOD        )        self._ping_ms = delta_ms - packet.local_delta        self._handle_ping(self._ping_ms)        self._set_session_state(SessionState.IDLE)        return...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 Ping-\u043e\u0442\u0432\u0435\u0442\u0430: \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u0441\u0435\u0441\u0441\u0438\u0438 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0438\u0437 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f <code>PING_AWAIT<\/code> \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>IDLE<\/code>.<\/p>\n<p><em>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u043d\u0430\u044f \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u043d\u043e\u0442\u043e\u043d\u043d\u043e\u0433\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0430\u0439\u043c\u0435\u0440\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e <\/em><code><em>MONOTONIC_TIME_MOD<\/em><\/code><em> (1048576, \u0447\u0442\u043e \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c\u0443 \u043e\u043a\u043d\u0443 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0440\u044f\u0434\u043a\u0430 30 \u043c\u0438\u043d\u0443\u0442).<\/em><\/p>\n<pre><code class=\"python\">...    if isinstance(packet, RTS):        if self._session_state == SessionState.EOT_ACK_AWAIT:            if self._tx_block is not None:                self._tx_block.tx_allowed = False                self._tx_block.retry_count = 0        status = self._handle_rts(packet.frame_len, packet.frames_count, packet.data_type)        if status == CTSStatus.REDUCE:            self._set_session_state(SessionState.IDLE)        else:            self._set_session_state(SessionState.DATA_AWAIT)            self._rx_expected_seq = 0            self._rx_expected_count = packet.frames_count            self._rx_pending_payloads.clear()            self._rx_session_mode = CTSStatus.SEND_BULK        signal = self.modem.mod_cts_signal(            self._conn_id, trans_id=packet.trans_id, status=status, **self._get_cts_signal_extra_args()        )        self._send_signal(signal)        return...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 RTS: \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0443 \u043f\u0440\u0438\u0435\u043c\u043d\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u0434\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0430\u043a\u0435\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438. \u0420\u0435\u0436\u0438\u043c bulk-\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0437\u0430\u0434\u0430\u043d \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u043b\u0430\u0433\u043e\u043c <code>SEND_BULK<\/code>. <em>\u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043d\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435.<\/em><\/p>\n<pre><code class=\"python\">...    if isinstance(packet, CTS):        if packet.status == CTSStatus.REDUCE:            self._frame_len = self.DEFAULT_FRAME_LEN            self._tx_block = None            self._set_session_state(SessionState.IDLE)            return        if packet.status in (CTSStatus.SEND_BULK, CTSStatus.SEND_SIMPLE):            assert self._tx_block is not None            self._current_cts_status = packet.status            self._tx_block.tx_allowed = True            self._set_session_state(SessionState.DATA_TRANSFER)            return        if packet.status == CTSStatus.REJECT:            self._tx_block = None            self._set_session_state(SessionState.IDLE)            return        return...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 CTS \u043e\u0442\u0432\u0435\u0442\u0430, \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e \u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438, \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0430 <code>DATA_TRANSFER<\/code>. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430, \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0442\u043c\u0435\u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438, \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f, \u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u0441\u0435\u0441\u0441\u0438\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>IDLE<\/code>.<\/p>\n<pre><code class=\"python\">...    if isinstance(packet, (DataBytes, Eot)):        if isinstance(packet, Eot) and self._session_state == SessionState.IDLE:            signal = self.modem.mod_ack_signal(self._conn_id, trans_id=packet.trans_id, frame_id=0)            self._send_signal(signal)            return        if self._session_state != SessionState.DATA_AWAIT:            self._handle_unexpected_packet(packet)            return...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438\u0435\u043c \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0432\u043d\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f <code>DATA_AWAIT<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a <code>_handle_unexpected_packet<\/code>.<\/p>\n<pre><code class=\"python\">...        if isinstance(packet, DataBytes):            self._last_progress_tms = now            diff = (packet.frame_id - self._rx_expected_seq) % 256            if diff &gt; 128:                if self._rx_session_mode != CTSStatus.SEND_BULK:                    signal = self.modem.mod_ack_signal(self._conn_id, trans_id=self._gen_trans_id(),                                                      frame_id=packet.frame_id)                    self._send_signal(signal)                return...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0440\u0430\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0431\u043b\u043e\u043a\u043e\u0432 \u043f\u0440\u0438 \u0438\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0439 \u043f\u043e\u0442\u0435\u0440\u0435 \u0438 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 \u043f\u0440\u0438 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0435\u0430\u043d\u0441\u0430\u0445 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0441\u0432\u044f\u0437\u0438.<\/p>\n<pre><code class=\"python\">...            if packet.frame_id not in self._rx_pending_payloads:                self._rx_pending_payloads[packet.frame_id] = packet.payload            moved = False            while self._rx_expected_seq in self._rx_pending_payloads:                payload = self._rx_pending_payloads.pop(self._rx_expected_seq)                self._handle_rx_data(payload)                self._rx_expected_seq = (self._rx_expected_seq + 1) % 256                moved = True...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438\u043d\u044f\u0442\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u043c \u0431\u0443\u0444\u0435\u0440\u0435 <code>_rx_pending_payloads<\/code>. <\/p>\n<pre><code class=\"python\">...            if packet.frame_id != self._rx_expected_seq and not moved:                if self._rx_session_mode != CTSStatus.SEND_BULK:                    signal = self.modem.mod_nack_signal(self._conn_id, frame_id=self._rx_expected_seq)                    self._send_signal(signal)                return...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412 \u0440\u0435\u0436\u0438\u043c\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 Stop-and-Wait \u0443\u0437\u0435\u043b-\u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 Nack \u043e\u0442\u0432\u0435\u0442 \u043f\u0440\u0438 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0438 \u0440\u0430\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c \u043f\u0440\u0438\u043d\u044f\u0442\u043e\u0433\u043e \u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f <code>_rx_expected_seq<\/code>.<\/p>\n<pre><code class=\"python\">...            if self._rx_session_mode != CTSStatus.SEND_BULK:                signal = self.modem.mod_ack_signal(self._conn_id, trans_id=self._gen_trans_id(),                                                  frame_id=packet.frame_id)                self._send_signal(signal)            return...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0424\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u044f \u0431\u043b\u043e\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<pre><code class=\"python\">...        else:            if self._rx_session_mode == CTSStatus.SEND_BULK:                block_mask = 0                for idx in range(self._rx_expected_count):                    if idx &lt; self._rx_expected_seq or idx in self._rx_pending_payloads:                        block_mask |= (1 &lt;&lt; idx)                signal = self.modem.mod_sack_signal(                    self._conn_id, trans_id=packet.trans_id, frame_id=0, mask=block_mask                )                self._send_signal(signal)                if self._rx_expected_seq == self._rx_expected_count and len(self._rx_pending_payloads) == 0:                    self._last_rx_trans_id = packet.trans_id                    self._last_rx_total_count = self._rx_expected_count                    self._last_rx_mask = block_mask                    self._set_session_state(SessionState.IDLE)                    self._handle_rx_eot()                    self._last_ping_time = now                else:                    self._set_session_state(SessionState.DATA_AWAIT)...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 EOT-\u043f\u0430\u043a\u0435\u0442\u0430. \u041f\u0440\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 Bulk \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0440\u0438\u043d\u044f\u0442\u044b\u0445 \u0432 <code>_rx_pending_payloads<\/code> \u043a\u043b\u044e\u0447\u0435\u0439 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0431\u0438\u0442\u043e\u0432\u0430\u044f \u043c\u0430\u0441\u043a\u0430 <code>block_mask<\/code>.<\/p>\n<p>\u0421\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043c\u0430\u0441\u043a\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u0435 Sack-\u043f\u0430\u043a\u0435\u0442\u0430.<\/p>\n<pre><code class=\"python\">...            else:                signal = self.modem.mod_ack_signal(self._conn_id, trans_id=packet.trans_id, frame_id=0)                self._send_signal(signal)                self._set_session_state(SessionState.IDLE)                self._handle_rx_eot()                self._last_ping_time = now            return...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412 \u0440\u0435\u0436\u0438\u043c\u0435 Stop-and-Wait \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u0430 EOT.<\/p>\n<pre><code class=\"python\">...    if isinstance(packet, Ack):        if self._tx_block is None:            self._handle_unexpected_packet(packet)            return        if self._session_state == SessionState.DATA_CONFIRM_AWAIT:            self._tx_block.pop_current_frame()            self._set_session_state(SessionState.DATA_TRANSFER)            return        if self._session_state == SessionState.EOT_ACK_AWAIT:            if packet.trans_id == self._tx_block.eot_trans_id:                if len(self._tx_buffer) &gt; 0:                    del self._tx_buffer[0]                self._tx_block = None                self._set_session_state(SessionState.IDLE)                self._last_ping_time = now                return            self._handle_unexpected_packet(packet)            return        return...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 Ack-\u043f\u0430\u043a\u0435\u0442\u0430. \u041f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0439 \u0431\u043b\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0431\u043b\u043e\u043a. \u0415\u0441\u043b\u0438 \u0441\u0435\u0441\u0441\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u0430\u0441\u044c \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <code>EOT_ACK_AWAIT<\/code>, \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 <code>_tx_buffer<\/code> \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u044b\u0439 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0435\u0441\u0441\u0438\u0438.<\/p>\n<pre><code class=\"python\">...    if isinstance(packet, Nack):        if self._session_state in (SessionState.DATA_TRANSFER, SessionState.DATA_CONFIRM_AWAIT) and self._tx_block:            failed_frame_idx = packet.frame_id            if failed_frame_idx not in self._tx_block._frames_to_tx:                self._tx_block._frames_to_tx.insert(0, failed_frame_idx)            self._tx_block.retry_count = 0            self._set_session_state(SessionState.DATA_TRANSFER)        return...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 Nack \u043e\u0442\u0432\u0435\u0442\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0439 \u0431\u043b\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0434\u043b\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438.<\/p>\n<pre><code class=\"python\">...    if isinstance(packet, Sack):        if self._tx_block is None:            self._handle_unexpected_packet(packet)            return        if self._session_state == SessionState.EOT_ACK_AWAIT:            if packet.trans_id != self._tx_block.eot_trans_id:                self._handle_unexpected_packet(packet)                return            total_frames = self._tx_block.data_blocks_count            if packet.is_all_ok(total_frames):                if len(self._tx_buffer) &gt; 0:                    del self._tx_buffer[0]                self._tx_block = None                self._set_session_state(SessionState.IDLE)                self._last_ping_time = now            else:                failed_frames = []                for idx in range(total_frames):                    if not packet.is_ok(idx):                        failed_frames.append(idx)                self._tx_block._frames_to_tx = failed_frames                self._tx_block.retry_count = 0                self._set_session_state(SessionState.DATA_TRANSFER)            return        return<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <code>TXBlock<\/code> \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445:<\/p>\n<pre><code class=\"python\">@dataclassclass TXBlock:    frame_len: int  # bits    data: SessionBytes    rts_interval: float    retry_timeout: float = 10.0    max_retries: int = 5    last_rts: float = 0.0    tx_allowed: bool = False    _frames_to_tx: list = None    last_tx_time: float = 0.0    retry_count: int = 0    eot_trans_id: int = 0    def __post_init__(self):        if self._frames_to_tx is None:            self._frames_to_tx = list(range(self.data_blocks_count))    def get_rts_args(self) -&gt; dict:        data_type = self.data.RTS_DATA_TYPE        return dict(frame_len=self.frame_len, frames_count=self.data_blocks_count, data_type=data_type, )    @property    def data_block_len(self) -&gt; int:        return math.ceil(self.frame_len \/ 8)...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0431\u043b\u043e\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0432 \u0431\u0430\u0439\u0442\u0430\u0445) \u0434\u043b\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0441\u043a\u043e\u043b\u044c\u0437\u044f\u0449\u0435\u0433\u043e \u043e\u043a\u043d\u0430.<\/p>\n<pre><code class=\"python\">...    @property    def data_blocks_count(self) -&gt; int:        return math.ceil(len(self.data) \/ self.data_block_len)...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u0449\u0435\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0431\u043b\u043e\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0441\u043a\u043e\u043b\u044c\u0437\u044f\u0449\u0435\u0433\u043e \u043e\u043a\u043d\u0430.<\/p>\n<pre><code class=\"python\">...    def get_data_block(self, block_num: int) -&gt; bytes:        assert 0 &lt;= block_num &lt; self.data_blocks_count        return self.data[block_num * self.data_block_len:(block_num + 1) * self.data_block_len]    @property    def current_frame_idx(self) -&gt; int:        assert not self.eof        return self._frames_to_tx[0]    @property    def current_data_block(self) -&gt; bytes:        return self.get_data_block(self.current_frame_idx)...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0431\u0430\u0439\u0442, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u0443\u0435\u043c\u043e\u043c\u0443 \u0431\u043b\u043e\u043a\u0443 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<pre><code class=\"python\">...    def pop_current_frame(self) -&gt; int:        return self._frames_to_tx.pop(0)    @property    def eof(self) -&gt; bool:        return len(self._frames_to_tx) == 0<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>pop_current_frame<\/code> \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0431\u043b\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438.<br \/>\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>eof<\/code> \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043d\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0438\u0441\u0447\u0435\u0440\u043f\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438.<\/p>\n<h3>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438<\/h3>\n<p>\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 BPSK \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u2153 \u0441\u0432\u0435\u0440\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0435\u0440\u0430. \u042d\u0442\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0438 \u043f\u043e\u043c\u0435\u0445\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u0432 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u0441\u0438\u043b\u044c\u043d\u044b\u0445 \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u0439, \u043d\u043e \u0441\u043d\u0438\u0436\u0430\u0435\u0442 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u0443\u044e \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0434\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f.<\/p>\n<p>\u041f\u0440\u0438 \u0432\u044b\u0441\u043e\u043a\u043e\u043c \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\/\u0448\u0443\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e. \u0410\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043e\u0431\u043c\u0435\u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c: \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043a\u0430\u043d\u0430\u043b\u0430 \u0438 \u0432 \u043e\u0442\u0432\u0435\u0442\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u0430\u0445 CTS \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0445\u0435\u043c\u0443 \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0446\u0438\u043a\u043b\u043e\u0432 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0440\u0438\u0441\u0443\u043d\u043e\u043a 18).<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/65\/28\/0e\/65280edf71a6f94e9d56ad584a4ca5ac.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 18. \u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 RTS\/CTS-\u043f\u0430\u043a\u0435\u0442\u043e\u0432.\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 18. \u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 RTS\/CTS-\u043f\u0430\u043a\u0435\u0442\u043e\u0432.\" width=\"438\" height=\"528\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/65\/28\/0e\/65280edf71a6f94e9d56ad584a4ca5ac.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/65\/28\/0e\/65280edf71a6f94e9d56ad584a4ca5ac.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 18. \u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 RTS\/CTS-\u043f\u0430\u043a\u0435\u0442\u043e\u0432.<\/figcaption><\/div>\n<\/figure>\n<p>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u0442 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0432\u044b\u0448\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u043e\u0433\u0438\u043a\u0438 \u0441\u0435\u0441\u0441\u0438\u0438.<\/p>\n<pre><code class=\"python\">class AMCSession(Session):    SNR_HISTORY_DEEP = 10    BER_HISTORY_DEEP = 10    QPSK_FRAME_LEN = 80 * 8  # bits    QAM16_FRAME_LEN = 120 * 8  # bits    MOD_FRAME_LEN = {        ModType.QPSK: QPSK_FRAME_LEN,        ModType.QAM16: QAM16_FRAME_LEN    }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043a\u0430\u043d\u0430\u043b\u0430 \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043c\u0435\u0434\u0438\u0430\u043d\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 BER \u0438 SNR \u043f\u043e \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u043d\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432.<\/p>\n<p>\u0413\u043b\u0443\u0431\u0438\u043d\u0430 \u0441\u043a\u043e\u043b\u044c\u0437\u044f\u0449\u0435\u0433\u043e \u043e\u043a\u043d\u0430 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 <code>SNR_HISTORY_DEEP<\/code> \u0438 <code>BER_HISTORY_DEEP<\/code>.<\/p>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0445 \u0441\u0445\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u0443\u044e \u0435\u043c\u043a\u043e\u0441\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u0430 \u043f\u0440\u0438 \u0442\u043e\u0439 \u0436\u0435 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0430. \u0420\u0430\u0437\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0440\u0435\u0436\u0438\u043c\u043e\u0432 QPSK \u0438 16-QAM \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 <code>QPSK_FRAME_LEN<\/code> \u0438 <code>QAM16_FRAME_LEN<\/code>.<\/p>\n<blockquote>\n<p>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<br \/>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u043d\u044b \u044d\u043c\u043f\u0438\u0440\u0438\u0447\u0435\u0441\u043a\u0438.<\/p>\n<\/blockquote>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>_handle_session_packet<\/code> \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043e\u0442 \u043c\u043e\u0434\u0435\u043c\u0430 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 BER \u0438 SNR, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0439.<\/p>\n<pre><code class=\"python\">def _handle_session_packet(self, packet: PacketCRC, **kwargs) -&gt; None:    assert \"SNR\" in kwargs    assert \"BER\" in kwargs    self._snr_history.append(kwargs[\"SNR\"])    self._ber_history.append(kwargs[\"BER\"])    if isinstance(packet, CTS):        if packet.status in (CTSStatus.SEND_BULK, CTSStatus.SEND_SIMPLE):            self._data_mod_type = packet.mod            self._data_cc_speed = packet.speed            self._frame_len = self.MOD_FRAME_LEN.get(self._data_mod_type, self.DEFAULT_FRAME_LEN)    return super()._handle_session_packet(packet, **kwargs)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 CTS \u043e\u0442\u0432\u0435\u0442\u0430, \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u0440\u0438\u043d\u044f\u0442\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043a\u043e\u0434\u0435\u0440\u0430.<\/p>\n<p>\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0432\u044b\u0431\u043e\u0440\u0430 \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043a\u043e\u0434\u0435\u0440\u0430:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\">SNR (dB)<\/p>\n<\/td>\n<td>\n<p align=\"left\">BER (%)<\/p>\n<\/td>\n<td>\n<p align=\"left\">Mod<\/p>\n<\/td>\n<td>\n<p align=\"left\">CC speed<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"left\">BPSK<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2153<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">&lt; -4.0<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"left\">BPSK<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2153<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">&lt; 1.0<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"left\">BPSK<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u00bd<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">&lt; 4.5<\/p>\n<\/td>\n<td>\n<p align=\"left\">&gt;= 0.01<\/p>\n<\/td>\n<td>\n<p align=\"left\">QPSK<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2153<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">&lt; 4.5<\/p>\n<\/td>\n<td>\n<p align=\"left\">&lt; 0.01<\/p>\n<\/td>\n<td>\n<p align=\"left\">QPSK<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u00bd<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">&lt; 7.5<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"left\">QPSK<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u00be<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">&gt;= 7.5<\/p>\n<\/td>\n<td>\n<p align=\"left\">&gt; 0.005<\/p>\n<\/td>\n<td>\n<p align=\"left\">16-QAM<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2153<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<blockquote>\n<p>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<br \/>\u0421\u0445\u0435\u043c\u0430 32-QAM \u0431\u044b\u043b\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438, \u0432\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0438 \u0447\u0435\u0433\u043e \u043e\u043d\u0430 \u043d\u0435 \u043f\u0440\u043e\u0448\u043b\u0430 \u043f\u043e\u043b\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u0439 \u0438 \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u0432 \u043e\u0431\u0449\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438.<\/p>\n<\/blockquote>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>_calc_link_parameters<\/code> \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0443\u0441\u0440\u0435\u0434\u043d\u0435\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 BER \u0438 SNR, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044f \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0434 \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f.<\/p>\n<pre><code class=\"python\">@propertydef median_snr(self) -&gt; typing.Optional[float]:    if len(self._snr_history) &lt; 2:        return None    return float(np.median(list(self._snr_history)))@propertydef median_ber(self) -&gt; typing.Optional[float]:    if len(self._ber_history) &lt; 2:        return None    return float(np.median(list(self._ber_history)))def _calc_link_parameters(self) -&gt; typing.Tuple[ModType, CCSpeed]:    snr = self.median_snr    ber = self.median_ber    if snr is None or ber is None:        return ModType.BPSK, CCSpeed.R13    if snr &lt; -4.0:        return ModType.BPSK, CCSpeed.R13    elif snr &lt; 1.0:        return ModType.BPSK, CCSpeed.R12    elif snr &lt; 4.5:        if ber &lt; 0.01:            return ModType.QPSK, CCSpeed.R12        return ModType.QPSK, CCSpeed.R13    elif snr &lt; 7.5:        return ModType.QPSK, CCSpeed.R34    else:        if ber &gt; 0.005:            return ModType.QAM16, CCSpeed.R13    return ModType.QAM16, CCSpeed.R12<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 RTS-\u0437\u0430\u043f\u0440\u043e\u0441\u0430:<\/p>\n<pre><code class=\"python\">def _handle_rts(self, frame_len: int, frames_count: int, data_type: RTSDataType) -&gt; CTSStatus:    base_status = super()._handle_rts(frame_len, frames_count, data_type)    if base_status == CTSStatus.REJECT:        return base_status    mod, _ = self._calc_link_parameters()    if frame_len &gt; self.DEFAULT_FRAME_LEN and mod != ModType.QAM16:        return CTSStatus.REDUCE    return base_status<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u043d\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0443\u0445\u0443\u0434\u0448\u0435\u043d\u0438\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430, \u0443\u0437\u0435\u043b\u00a0 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043e\u0442\u0432\u0435\u0442 \u0441\u043e \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u043c <code>REDUCE<\/code>, \u0442\u0440\u0435\u0431\u0443\u044f \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438.<\/p>\n<p>\u0414\u0438\u043d\u0430\u043c\u0438\u043a\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438 \u0441\u043c\u0435\u043d\u0435 \u0441\u0445\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 \u0438 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 19.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/ce\/25\/65\/ce25654b1333402a07101aabfd66c9d1.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 19. \u0414\u0438\u043d\u0430\u043c\u0438\u043a\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0432 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u0430\u043d\u0430\u043b\u0430.\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 19. \u0414\u0438\u043d\u0430\u043c\u0438\u043a\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0432 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u0430\u043d\u0430\u043b\u0430.\" width=\"627\" height=\"100\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/ce\/25\/65\/ce25654b1333402a07101aabfd66c9d1.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/ce\/25\/65\/ce25654b1333402a07101aabfd66c9d1.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 19. \u0414\u0438\u043d\u0430\u043c\u0438\u043a\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0432 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u0430\u043d\u0430\u043b\u0430.<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0440\u0438 \u043b\u0430\u0431\u043e\u0440\u0430\u0442\u043e\u0440\u043d\u044b\u0445 \u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u044f\u0445 \u0432 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u043f\u043e\u043c\u0435\u0445 \u043f\u0438\u043a\u043e\u0432\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 (\u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u0430\u044f \u043a\u0430\u043a \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043c\u0430 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043a \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u0430\u043a\u0435\u0442\u0430) \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0430 1542.65 \u0431\u0438\u0442\/\u0441.<\/p>\n<blockquote>\n<p>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<br \/>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0438\u043d\u0433 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u043b 5964 \u043c\u0441. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0431\u0443\u0444\u0435\u0440\u0430 \u043f\u0440\u0438 \u0437\u0430\u0445\u0432\u0430\u0442\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0430\u0443\u0437 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0432 \u0437\u0432\u0443\u043a\u043e\u0432\u0443\u044e \u043a\u0430\u0440\u0442\u0443.<br \/>\u0422\u0430\u043a\u0436\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u0438 32-QAM \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0431\u0443\u0434\u0435\u0442 \u0435\u0449\u0435 \u0432\u044b\u0448\u0435.<\/p>\n<\/blockquote>\n<h3>\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f<\/h3>\n<p>\u041d\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043d\u0430 \u0442\u0438\u043f \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0430\u0439\u0442. \u041d\u0430 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0430 \u0434\u0432\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438: \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<p>\u0414\u043b\u044f \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043e\u0431\u043c\u0435\u043d\u0430 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d \u0440\u0435\u0436\u0438\u043c \u0441\u0436\u0430\u0442\u0438\u044f. \u042e\u043d\u0438\u043a\u043e\u0434-\u0442\u0435\u043a\u0441\u0442 \u0441\u0436\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c unishox2. \u041f\u0440\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435 \u0441\u0436\u0430\u0442\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 RTS \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u043b\u0430\u0433 <code>COMPRESSED_TEXT<\/code>.<\/p>\n<p>\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u0434 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u043e\u0439 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0434\u0435\u043a\u0430\u043c\u0438 \u043d\u0430 \u0431\u0430\u0437\u0435 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 <code>SessionBytes<\/code>.<\/p>\n<pre><code class=\"python\">class SessionBytes(bytes):    RTS_DATA_TYPE = None    def __new__(cls, payload: typing.Union[str, bytes]):        assert cls.RTS_DATA_TYPE is not None        assert cls.RTS_DATA_TYPE in RTS_DATA_TYPES        data = cls._to_bytes(payload)        return super().__new__(cls, data)    @classmethod    @abstractmethod    def _to_bytes(cls, payload: typing.Union[str, bytes]) -&gt; bytes:        ...    @abstractmethod    def from_bytes(self) -&gt; typing.Union[str, bytes]:        ...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0422\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 UTF-8 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0430\u0439\u0442, \u0430 \u043f\u0440\u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435.<\/p>\n<pre><code class=\"python\">class TextBytes(SessionBytes):    RTS_DATA_TYPE = RTSDataType.TEXT    @classmethod    def _to_bytes(cls, payload: typing.Union[str, bytes]) -&gt; bytes:        if isinstance(payload, bytes):            return payload        return payload.encode(\"utf-8\", errors=\"ignore\")    def from_bytes(self) -&gt; typing.Union[str, bytes]:        return self.decode(\"utf-8\", errors=\"ignore\")<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041a\u043b\u0430\u0441\u0441 <code>TextCompressedBytes<\/code> \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u0443\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043a\u043e\u043c\u043f\u0440\u0435\u0441\u0441\u0438\u0438 \u0438 \u0434\u0435\u043a\u043e\u043c\u043f\u0440\u0435\u0441\u0441\u0438\u0438 \u0431\u0430\u0439\u0442 \u0432 UTF-8 \u0441\u0442\u0440\u043e\u043a\u0438.<\/p>\n<pre><code class=\"python\">class TextCompressedBytes(SessionBytes):    RTS_DATA_TYPE = RTSDataType.COMPRESSED_TEXT    @classmethod    def _to_bytes(cls, payload: typing.Union[str, bytes]) -&gt; bytes:        if isinstance(payload, bytes):            return payload        compressed, _ = unishox2.compress(payload)        return compressed    def from_bytes(self) -&gt; typing.Union[str, bytes]:        decompressed = unishox2.decompress(self, 4096)        return decompressed<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0431\u0435\u0437 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439. \u041a\u043e\u0434\u0435\u043a RawBytes \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0440\u043e\u043b\u044c \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044f \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u0443\u044e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438 \u0438\u0445 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435 \u043d\u0430 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c.<\/p>\n<pre><code class=\"python\">class RawBytes(SessionBytes):    RTS_DATA_TYPE = RTSDataType.RAW_BYTES    @classmethod    def _to_bytes(cls, payload: typing.Union[str, bytes]) -&gt; bytes:        return payload    def from_bytes(self) -&gt; typing.Union[str, bytes]:        return self<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h2>\u0417\u0430\u043f\u0443\u0441\u043a \u0434\u0438\u0430\u043b\u043e\u0433\u0430 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0443\u0437\u043b\u0430\u043c\u0438<\/h2>\n<p>\u0420\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c MAC \u0438 LLC \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b\u0430\u0441\u044c \u043f\u0443\u0442\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0434\u0432\u0443\u0445 \u0443\u0437\u043b\u043e\u0432 \u0441 \u043e\u0431\u0449\u0438\u043c \u0437\u0432\u0443\u043a\u043e\u0432\u044b\u043c \u043a\u0430\u043d\u0430\u043b\u043e\u043c, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0449\u0435\u0439 \u0432\u0437\u0430\u0438\u043c\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430. \u0414\u043b\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0439 \u0432 \u0441\u0445\u0435\u043c\u0443 \u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u0439 \u0431\u044b\u043b \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u0441\u043d\u0438\u0444\u0444\u0435\u0440 (\u0440\u0438\u0441\u0443\u043d\u043e\u043a 20).<\/p>\n<details class=\"spoiler\">\n<summary>\u041b\u043e\u0433\u0438 \u0432\u0435\u0434\u0443\u0449\u0435\u0433\u043e \u0443\u0437\u043b\u0430:<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>23:20:26 [   INFO] Start server (R1HAM @ KO85TR)...23:20:26 [   INFO] Found device: Monitor of Meteor Lake-P HD Audio Controller Speaker23:20:26 [   INFO] Channels: 223:20:26 [   INFO] Init sound output...23:20:27 [   INFO] Start semiduplex connection...23:20:35 [   INFO] Received packet: Conn(called='R1HAM', caller='R2HOR', qth='KO59DW', caller_conn_id=184)23:20:42 [   INFO] --- Hamlet (Master) Stage 1: Sending long text (132 bytes) ---23:20:42 [   INFO] Received packet: Ack(conn_id=125, trans_id=1, frame_id=0)23:20:49 [   INFO] PING: 5518ms23:20:49 [   INFO] Received packet: Pong(conn_id=125, trans_id=1, remote_time=452873, local_delta=698)23:21:06 [   INFO] Received packet: CTS(conn_id=125, trans_id=2, status=&lt;CTSStatus.SEND_BULK: 0&gt;, mod=&lt;ModType.QPSK: 1&gt;, speed=&lt;CCSpeed.R12: 1&gt;)23:21:21 [   INFO] Received packet: Sack(conn_id=125, trans_id=184, frame_id=0, mask=3)23:21:33 [   INFO] Received packet: RTS(conn_id=125, trans_id=2, frame_len=320, frames_count=3, data_type=&lt;RTSDataType.COMPRESSED_TEXT: 1&gt;)23:21:41 [   INFO] Received packet: DataBytes(conn_id=125, frame_id=0, payload=b'\\x87\\xbfi\\x85\\x7f\\n\\xe1C\\xf3\\xe2\\x17\\xcdwQ^\\xf3\\xbe\\x94vk\\xe3\\x8a\\xae\\x89\/?+\\x8a\\xdfC\\xec\\x82\\xb6\\xa2\\x94vk\\xad\\x91A')23:21:47 [   INFO] Received packet: DataBytes(conn_id=125, frame_id=1, payload=b'\\xd5\\xbf\\xdf\\x85\\xae\\xfe|\\xdc*\\xf8Q\\xd9\\xaex\\xbf\\x8f\\x84\\x11\\xdaazn8zT=\\x9e\\xd7k\\xd2\\xf5:j\\xf0\\xcb)\\xd3\\x91\\xf6A')23:21:52 [   INFO] Received packet: DataBytes(conn_id=125, frame_id=2, payload=b'\\xd5,\\xa8^\\xd4&gt;\\xe1\\xf6')23:21:55 [   INFO] [Buffer Trace] Current buffer size: 139 bytes (Contains 'K': True)23:21:55 [   INFO] &gt;=== RECEIVED FULL TEXT ===What if it tempt you toward the flood, my lord? Or to the dreadful summit of the cliff That beetles o'er his base into the sea? Do not go!=====================23:21:55 [   INFO] --- Hamlet (Master) Stage 2: Sending text (147 bytes) ---23:21:55 [   INFO] Received packet: Eot(conn_id=125, trans_id=174, reason_code=&lt;EotReason.SUCCESS: 0&gt;)23:22:07 [   INFO] Received packet: CTS(conn_id=125, trans_id=3, status=&lt;CTSStatus.REDUCE: 2&gt;, mod=&lt;ModType.QPSK: 1&gt;, speed=&lt;CCSpeed.R34: 3&gt;)23:22:13 [   INFO] Received packet: CTS(conn_id=125, trans_id=4, status=&lt;CTSStatus.SEND_BULK: 0&gt;, mod=&lt;ModType.QAM16: 2&gt;, speed=&lt;CCSpeed.R12: 1&gt;)23:22:30 [   INFO] Received packet: Sack(conn_id=125, trans_id=242, frame_id=0, mask=7)23:22:35 [   INFO] Received packet: RTS(conn_id=125, trans_id=3, frame_len=320, frames_count=2, data_type=&lt;RTSDataType.COMPRESSED_TEXT: 1&gt;)23:22:41 [   INFO] Received packet: DataBytes(conn_id=125, frame_id=0, payload=b'\\x87f\\xbd\\xe7\\xf9\\xe9t\\xf5\\xe1\\xeea\\xaf{\\x8e\\xca\\xfc\\xcf\\xb5\\xe4\\xc5\\xd6\\x13A\\x14\\xbd\\xfbL+\\xd6\\xbb\\xb5\\xef|p\\xa3\\xb5\\xe9s^X')23:22:45 [   INFO] Received packet: DataBytes(conn_id=125, frame_id=1, payload=b'\\xfb \\xd5yq\\xda\\xf3\\xd9^\\x96\\xea!\\xe2\\xbcQ\\xd9\\xadD\\xc3U\\xf0\\x83\\xa7\\x9eg\\x7fd\\xc9\\x93\\x0f\\xb2')23:22:48 [   INFO] [Buffer Trace] Current buffer size: 114 bytes (Contains 'K': True)23:22:48 [   INFO] &gt;=== RECEIVED FULL TEXT ===He waxes desperate with imagination. To what issue will this come? Something is rotten in the state of Denmark...=====================23:22:48 [   INFO] --- Hamlet (Master) Stage 3: Sending VERY long text (188 bytes) ---23:22:48 [   INFO] Received packet: Eot(conn_id=125, trans_id=242, reason_code=&lt;EotReason.SUCCESS: 0&gt;)23:23:06 [   INFO] Received packet: CTS(conn_id=125, trans_id=5, status=&lt;CTSStatus.SEND_BULK: 0&gt;, mod=&lt;ModType.QAM16: 2&gt;, speed=&lt;CCSpeed.R12: 1&gt;)23:23:17 [   INFO] Received packet: Sack(conn_id=125, trans_id=181, frame_id=0, mask=1)23:23:33 [   INFO] Received packet: RTS(conn_id=125, trans_id=4, frame_len=960, frames_count=1, data_type=&lt;RTSDataType.COMPRESSED_TEXT: 1&gt;)23:23:41 [   INFO] Received packet: DataBytes(conn_id=125, frame_id=0, payload=b'\\x85.\\xa7\\xe5Nt\\xb2\\xfd\\xbbA%\\xeb\\xbc(\\xedzW\\xa5\\xefY\\xd6\\xeb\\xbe\\x96\\xa3s\\x9e\\xcc}\\xd0Nt\\xa3\\xb3\\xdb\\xf8\\xad\\xb5:Rg\\x82m{_\\xd3W\\x0b\\xdd\\xf1\\xcdyd\\xd0Gg\\xb6\\xa7my\\xad\\xb5\\x1d\\xaf=\\xb4\\xaf\\x17g?O\\x14\\xe7I\\xce\\xe3\\xb1$\\x1d\\xabs\\x17D\\x90Gi\\xc5;k\\xad\\xb9\\xf3\\n\\xbe\\x15\\xe2\\xf9\\xae\\xfb^;_\\x15\\xaa\\xf1\\xdb\\xe4\\x9a\\x0fjU\\x83\\xee\\x1fe')23:23:44 [   INFO] [Buffer Trace] Current buffer size: 190 bytes (Contains 'K': True)23:23:44 [   INFO] &gt;=== RECEIVED FULL TEXT ===O day and night, but this is wondrous strange! And therefore as a stranger give it welcome. There are more things in heaven and earth, Horatio, Than are dreamt of in your philosophy. Go on!=====================23:23:44 [   INFO] --- Hamlet (Master): Grand Dialogue Finished Successfully! ---23:23:44 [   INFO] Received packet: Eot(conn_id=125, trans_id=53, reason_code=&lt;EotReason.SUCCESS: 0&gt;)23:24:51 [   INFO] PING: 5548ms23:24:51 [   INFO] Received packet: Pong(conn_id=125, trans_id=6, remote_time=694702, local_delta=681)23:25:28 [   INFO] Finished.<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041b\u043e\u0433\u0438 \u0432\u0435\u0434\u043e\u043c\u043e\u0433\u043e \u0443\u0437\u043b\u0430:<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041b\u043e\u0433\u0438 \u0432\u0435\u0434\u043e\u043c\u043e\u0433\u043e \u0443\u0437\u043b\u0430:<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>23:20:32 [   INFO] Start client (R2HOR @ KO59DW)...23:20:32 [   INFO] Connect to R1HAM23:20:32 [   INFO] Found device: Monitor of Meteor Lake-P HD Audio Controller Speaker23:20:32 [   INFO] Channels: 223:20:32 [   INFO] Init sound output...23:20:32 [   INFO] Start semiduplex connection...23:20:39 [   INFO] --- Horatio (Slave) Stage 1: Waiting for Hamlet's speech... ---23:20:39 [   INFO] Setup connection mod=60, master_window=30, start_lag=30, tms_str='23:21:08'23:20:39 [   INFO] Received packet: ConnAck(caller='R2HOR', called='R1HAM', caller_conn_id=185, called_conn_id=125, mod=60, master_window=30, start_lag=30)23:20:45 [   INFO] Received packet: Ping(conn_id=125, trans_id=1, time=452873)23:21:03 [   INFO] Received packet: RTS(conn_id=125, trans_id=2, frame_len=320, frames_count=2, data_type=&lt;RTSDataType.COMPRESSED_TEXT: 1&gt;)23:21:10 [   INFO] Received packet: DataBytes(conn_id=125, frame_id=0, payload=b'\\x84R\\xf4\\xc9*\\xda\\xca\\x85\\x063Gi\\x85zQ\\xd9\\xaf\\xce\\xefQu\\x83h=\\xfb8\\xec\\xf6\\x87\\xb4^\\x96W\\xae\\x1e\\xd5\\xe2\\x8e\\xcdy')23:21:14 [   INFO] Received packet: DataBytes(conn_id=125, frame_id=1, payload=b'\\xbc\\xe9E-w\\xf8\\xf8{A\\x1d\\x9a\\xd7\\x17\\x9e\\xdaS\\x9d)\\xde\\xeb\\xdfJ\\xbe\\x15w\\x8d\\xcf\\xb3\\xae\\xfa_\\x15\\xb8\\xef\\x8c\\x992a\\xf6')23:21:18 [   INFO] [Buffer Trace] Current buffer size: 132 bytes (Contains 'K': True)23:21:18 [   INFO] &gt;=== RECEIVED FULL TEXT ===To be, or not to be, that is the question: Whether 'tis nobler in the mind to suffer The slings and arrows of outrageous fortune...=====================23:21:18 [   INFO] --- Horatio (Slave) Stage 1: Sending text (139 bytes) ---23:21:18 [   INFO] Received packet: Eot(conn_id=125, trans_id=184, reason_code=&lt;EotReason.SUCCESS: 0&gt;)23:21:36 [   INFO] Received packet: CTS(conn_id=125, trans_id=2, status=&lt;CTSStatus.SEND_BULK: 0&gt;, mod=&lt;ModType.BPSK: 0&gt;, speed=&lt;CCSpeed.R12: 1&gt;)23:21:59 [   INFO] Received packet: Sack(conn_id=125, trans_id=174, frame_id=0, mask=7)23:22:04 [   INFO] Received packet: RTS(conn_id=125, trans_id=3, frame_len=640, frames_count=2, data_type=&lt;RTSDataType.COMPRESSED_TEXT: 1&gt;)23:22:10 [   INFO] Received packet: RTS(conn_id=125, trans_id=4, frame_len=320, frames_count=3, data_type=&lt;RTSDataType.COMPRESSED_TEXT: 1&gt;)23:22:16 [   INFO] Received packet: DataBytes(conn_id=125, frame_id=0, payload=b'\\x85\\xc2\\xf7\\x9f\\xa7\\xa5\\xe5\\xadE\\xf1\\xc14\\x1e\\xd4\\xab\\t \\xb1\\xed\\xc7\\x0b\\xe2\\xb8\\xe2\\xbd\\xd4vl}\\xd0y\\xf9_\\x13\\rs\\xbbzU\\xde')23:22:20 [   INFO] Received packet: DataBytes(conn_id=125, frame_id=1, payload=b\"\\x14\\xe7K\\xcc\\xfd\\xbd'&lt;\\xf6^\\x1cG\\xca\\x9d\\xc3\\xdf\\xca\\xbcQ\\xda\\xf4\\xbdW_('K\\xb4\\xef\\xaf\\x95:Q\\xd9\\xa0\\xc7\\xe5\\xce..\")23:22:24 [   INFO] Received packet: DataBytes(conn_id=125, frame_id=2, payload=b'\\xb0{ic\\xdf\\xd3\\x1fs\\x1d\\x84}\\xc3\\xec')23:22:26 [   INFO] [Buffer Trace] Current buffer size: 147 bytes (Contains 'K': True)23:22:26 [   INFO] &gt;=== RECEIVED FULL TEXT ===It waves me still. Go on, I'll follow thee! My fate cries out and makes each petty artery in this body As hardy as the Nemean lion's nerve! Go on!=====================23:22:26 [   INFO] --- Horatio (Slave) Stage 2: Sending text (114 bytes) ---23:22:26 [   INFO] Received packet: Eot(conn_id=125, trans_id=242, reason_code=&lt;EotReason.SUCCESS: 0&gt;)23:22:38 [   INFO] Received packet: CTS(conn_id=125, trans_id=3, status=&lt;CTSStatus.SEND_BULK: 0&gt;, mod=&lt;ModType.QAM16: 2&gt;, speed=&lt;CCSpeed.R12: 1&gt;)23:22:51 [   INFO] Received packet: Sack(conn_id=125, trans_id=242, frame_id=0, mask=3)23:23:03 [   INFO] Received packet: RTS(conn_id=125, trans_id=5, frame_len=960, frames_count=1, data_type=&lt;RTSDataType.COMPRESSED_TEXT: 1&gt;)23:23:10 [   INFO] Received packet: DataBytes(conn_id=125, frame_id=0, payload=b\"\\x85\\xa9\\xf2\\xa3\\xb7\\xca\\xf8\\x98\\xec\\xf6=\\xb4\\xb5\\xe2\\xf7pI\\x07U^G\\xb7K\\xe2\\xb6\\xa5r\\xf7\\x13x\\xa1\\xef\\xca\\x8a^\\xf3\\xc7\\xda\\x8e\\xcde\\xfbv\\x82H'\\x0cq(\\xec\\xd7S\\xf2\\xb9\\xac\\xf8\\xbc\\x1e\\xdd(\\xa5\\xf1:\\x85x\\xbe\/oD\\x90E\\xf1\\xc2\\x8e\\xcd|W~\\x17;\\xbf\/K\\xaa\\xc6\\xaf\\x17\\x9f\\x95\\xd4\\xfc\\xe9W\\xc2\\xc9\\x8e\\xfbh'mz\\xef\\xbc\\x859\\xd2\\xf1\\xdf~\\xc3\\xdb\\xa5&gt;\\xf3\\xf2L&gt;\\xcb\")23:23:14 [   INFO] [Buffer Trace] Current buffer size: 188 bytes (Contains 'K': True)23:23:14 [   INFO] &gt;=== RECEIVED FULL TEXT ===I am thy father's spirit, Doom'd for a certain term to walk the night, And for the day confin'd to fast in fires, Till the foul crimes done in my days of nature Are burnt and purg'd away.=====================23:23:14 [   INFO] --- Horatio (Slave) Stage 3: Sending final long text (190 bytes) ---23:23:14 [   INFO] Received packet: Eot(conn_id=125, trans_id=181, reason_code=&lt;EotReason.SUCCESS: 0&gt;)23:23:36 [   INFO] Received packet: CTS(conn_id=125, trans_id=4, status=&lt;CTSStatus.SEND_BULK: 0&gt;, mod=&lt;ModType.QAM16: 2&gt;, speed=&lt;CCSpeed.R12: 1&gt;)23:23:47 [   INFO] Received packet: Sack(conn_id=125, trans_id=53, frame_id=0, mask=1)23:24:47 [   INFO] Received packet: Ping(conn_id=125, trans_id=6, time=694702)23:25:27 [   INFO] Finished.<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432 \u043e\u0431\u043c\u0435\u043d\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043b\u043e\u0433 \u043c\u0435\u0436\u0434\u0443 \u0413\u0430\u043c\u043b\u0435\u0442\u043e\u043c (R1HAM) \u0438 \u0413\u043e\u0440\u0430\u0446\u0438\u043e (R2HOR). \u041b\u043e\u0433\u0438\u043a\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0431\u044b\u043b\u0430 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0434\u0438\u0430\u043b\u043e\u0433\u0430: \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0443\u0437\u0435\u043b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043b \u0432 \u0440\u0435\u0436\u0438\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u0432\u043e\u0435\u0439 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0438.<\/p>\n<p>\u0412 \u043b\u043e\u0433\u0430\u0445 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c CTS \u043f\u0430\u043a\u0435\u0442\u044b \u0441 \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u044f\u043c\u0438 QPSK \u0438 QAM16, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043a\u043e\u0434\u0435\u0440\u0430 \u0434\u043e \u00be.<\/p>\n<p>\u0414\u043b\u044f \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0441\u0436\u0430\u0442\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430. \u0417\u0430\u043f\u0438\u0441\u0438 &#171;<code>RECEIVED FULL TEXT<\/code>&#187; \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u044e\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u043d\u044f\u0442\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0438\u0445 \u0434\u0435\u043a\u043e\u043c\u043f\u0440\u0435\u0441\u0441\u0438\u044e \u0432 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442.<\/p>\n<p>\u0412\u044b\u0432\u043e\u0434 \u0441\u0442\u0440\u043e\u043a\u0438 &#171;<code>Hamlet (Master): Grand Dialogue Finished Successfully!<\/code>&#187; \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442 \u043f\u043e\u043b\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430 \u0441\u0432\u044f\u0437\u0438. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0441\u0435\u0441\u0441\u0438\u044f \u043f\u0435\u0440\u0435\u0448\u043b\u0430 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f Keep-Alive, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f Ping-\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0436\u0434\u0435\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u044b\u0432\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/21\/7e\/b4\/217eb49f0a4b36daac200426b488c86e.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 20. \u0421\u043d\u0438\u0444\u0444\u0435\u0440 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043f\u0430\u043a\u0435\u0442\u043e\u0432.\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 20. \u0421\u043d\u0438\u0444\u0444\u0435\u0440 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043f\u0430\u043a\u0435\u0442\u043e\u0432.\" width=\"1302\" height=\"891\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/21\/7e\/b4\/217eb49f0a4b36daac200426b488c86e.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/21\/7e\/b4\/217eb49f0a4b36daac200426b488c86e.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 20. \u0421\u043d\u0438\u0444\u0444\u0435\u0440 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043f\u0430\u043a\u0435\u0442\u043e\u0432.<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/18\/c4\/54\/18c4542184334adb44b0d9adfabefc8a.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 21. \u0418\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0439 \u0432\u044b\u0437\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c\u0438 \u0432 \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u0435.\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 21. \u0418\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0439 \u0432\u044b\u0437\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c\u0438 \u0432 \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u0435.\" width=\"1302\" height=\"891\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/18\/c4\/54\/18c4542184334adb44b0d9adfabefc8a.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/18\/c4\/54\/18c4542184334adb44b0d9adfabefc8a.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 21. \u0418\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0439 \u0432\u044b\u0437\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c\u0438 \u0432 \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u0435.<\/figcaption><\/div>\n<\/figure>\n<h2>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h2>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u0441\u0438\u043d\u0442\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0442\u0435\u0441\u0442\u043e\u0432, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0432 \u043f\u043e\u043b\u0443\u0434\u0443\u043f\u043b\u0435\u043a\u0441\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435, \u0431\u044b\u043b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u043c\u0430\u044f\u043a\u0438, \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0441 \u043d\u0438\u043c\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0438 \u043e\u0431\u043c\u0435\u043d\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438.<\/p>\n<p>\u041e\u0431\u043c\u0435\u043d \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043b\u0441\u044f \u0447\u0435\u0440\u0435\u0437 loopback \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u044b.<\/p>\n<p>\u0413\u0430\u043c\u043b\u0435\u0442 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u043b \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u0435\u0434\u0443\u0449\u0435\u0433\u043e \u0443\u0437\u043b\u0430. \u0415\u0433\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u043b\u0430\u0441\u044c \u0432 \u043f\u043e\u0441\u044b\u043b\u043a\u0435 CQ-\u0441\u0438\u0433\u043d\u0430\u043b\u0430 (\u0440\u0438\u0441\u0443\u043d\u043e\u043a 22) \u0438, \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435 \u0437\u043d\u0430\u043c\u0435\u043d\u0438\u0442\u043e\u0433\u043e \u043c\u043e\u043d\u043e\u043b\u043e\u0433\u0430 (\u0440\u0438\u0441\u0443\u043d\u043e\u043a 23).<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/d4\/5a\/49\/d45a49773f75dece31f2a0814acc6634.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 22. \u041e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435 CQ-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 22. \u041e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435 CQ-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.\" width=\"1202\" height=\"761\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/d4\/5a\/49\/d45a49773f75dece31f2a0814acc6634.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/d4\/5a\/49\/d45a49773f75dece31f2a0814acc6634.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 22. \u041e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435 CQ-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/ce\/b6\/05\/ceb605741e17b71e57adf62e762fb885.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 23. \u041f\u0440\u0438\u0435\u043c \u0442\u0435\u043a\u0441\u0442\u0430.\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 23. \u041f\u0440\u0438\u0435\u043c \u0442\u0435\u043a\u0441\u0442\u0430.\" width=\"1202\" height=\"761\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/ce\/b6\/05\/ceb605741e17b71e57adf62e762fb885.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/ce\/b6\/05\/ceb605741e17b71e57adf62e762fb885.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 23. \u041f\u0440\u0438\u0435\u043c \u0442\u0435\u043a\u0441\u0442\u0430.<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/21\/2a\/74\/212a742616b3d4263d999647258a5523.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 24. \u0410\u0427\u0425 \u044d\u043a\u0432\u0430\u043b\u0430\u0439\u0437\u0435\u0440\u0430 \u0438 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432.\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 24. \u0410\u0427\u0425 \u044d\u043a\u0432\u0430\u043b\u0430\u0439\u0437\u0435\u0440\u0430 \u0438 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432.\" width=\"1302\" height=\"891\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/21\/2a\/74\/212a742616b3d4263d999647258a5523.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/21\/2a\/74\/212a742616b3d4263d999647258a5523.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 24. \u0410\u0427\u0425 \u044d\u043a\u0432\u0430\u043b\u0430\u0439\u0437\u0435\u0440\u0430 \u0438 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432.<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0438\u0437-\u0437\u0430 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u044b, \u0447\u0430\u0441\u0442\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u043b\u0430 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f, \u043a\u043e\u0433\u0434\u0430 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u044f \u0441\u0438\u043b\u044c\u043d\u043e \u0438\u0441\u043a\u0430\u0436\u0430\u043b\u0438\u0441\u044c (\u0440\u0438\u0441\u0443\u043d\u043e\u043a 25). \u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u043a\u043e\u0433\u0435\u0440\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u044f \u0438 \u044d\u043a\u0432\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u044f \u0434\u043e \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u0430 \u0441\u0432\u0435\u0440\u0442\u043e\u0447\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438 \u0443\u0440\u043e\u0432\u043d\u044f\u0445 BER \u043f\u043e\u0440\u044f\u0434\u043a\u0430 5-7%.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/14\/1a\/aa\/141aaaec82749fbb36113bd56b83320b.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 25. \u0418\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u044f \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0438\u0435 \u0432 \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u0435.\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 25. \u0418\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u044f \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0438\u0435 \u0432 \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u0435.\" width=\"1202\" height=\"761\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/14\/1a\/aa\/141aaaec82749fbb36113bd56b83320b.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/14\/1a\/aa\/141aaaec82749fbb36113bd56b83320b.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 25. \u0418\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u044f \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0438\u0435 \u0432 \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u0435.<\/figcaption><\/div>\n<\/figure>\n<blockquote>\n<p>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<br \/>\u041f\u043e\u043c\u0438\u043c\u043e \u0434\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u044f, \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u043b\u0441\u044f \u044d\u0444\u0444\u0435\u043a\u0442 \u0435\u0433\u043e \u0440\u0430\u0437\u0432\u043e\u0440\u043e\u0442\u0430 (\u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043d\u0430 10 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 \u043f\u0440\u043e\u0442\u0438\u0432 \u0447\u0430\u0441\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u0435\u043b\u043a\u0438).\u00a0<\/p>\n<p>\u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u0434\u043e\u043b\u0433\u043e \u0431\u044b\u043b\u0430 \u043d\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u0430. \u0411\u044b\u043b\u0438 \u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u044b \u044d\u043a\u0432\u0430\u043b\u0430\u0439\u0437\u0435\u0440, \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f (<em>\u0437\u0434\u0435\u0441\u044c \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0441\u0434\u0432\u0438\u0433 \u043d\u0430 3 \u0441\u0435\u043c\u043f\u043b\u0430 \u0434\u0435\u043b\u0430\u043b \u0434\u0435\u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u044e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0439, \u0430 \u043f\u0440\u0438 \u0441\u0434\u0432\u0438\u0433\u0435 \u043d\u0430 2 \u0441\u0435\u043c\u043f\u043b\u0430 \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u0431\u044b\u043b \u0431\u043b\u0438\u0437\u043e\u043a \u043a 90 \u0433\u0440\u0430\u0434\u0443\u0441\u0430\u043c; \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435 \u043a \u0442\u0435\u0437\u0438\u0441\u0443 \u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f ZC-\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0435\u0439<\/em>), \u0442\u0430\u0439\u043b\u0438\u043d\u0433 OFDM-\u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u0438 \u043f\u0440\u043e\u0447\u0435\u0439 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439. \u0414\u0435-\u0444\u0430\u043a\u0442\u043e, \u043f\u043e\u0434\u043c\u0435\u043d\u0438\u0432 \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u044b \u043d\u0430 \u0441\u0438\u0433\u043d\u0430\u043b \u0438\u0437 wav \u0444\u0430\u0439\u043b\u0430, \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0438\u0441\u0447\u0435\u0437\u043b\u0430, \u0447\u0442\u043e \u0432 \u0438\u0442\u043e\u0433\u0435 \u043e\u0441\u0442\u0430\u0432\u0438\u043b\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u043e\u0437\u0440\u0435\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u2014 \u0437\u0432\u0443\u043a\u043e\u0432\u0443\u044e \u043a\u0430\u0440\u0442\u0443.\u00a0<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 ALSA \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0439 \u043f\u0440\u043e\u043f\u0430\u043b\u0430.<\/p>\n<\/blockquote>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/e2\/f6\/af\/e2f6af794e06550101ced2fdf7b5d6ff.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 26. \u041b\u043e\u0433 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a\u0430.\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 26. \u041b\u043e\u0433 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a\u0430.\" width=\"1202\" height=\"761\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/e2\/f6\/af\/e2f6af794e06550101ced2fdf7b5d6ff.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/e2\/f6\/af\/e2f6af794e06550101ced2fdf7b5d6ff.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 26. \u041b\u043e\u0433 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a\u0430.<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/bd\/d7\/77\/bdd77735e6b044c227eaef9527ce6df4.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 27. \u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 27. \u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.\" width=\"1202\" height=\"761\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/bd\/d7\/77\/bdd77735e6b044c227eaef9527ce6df4.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/bd\/d7\/77\/bdd77735e6b044c227eaef9527ce6df4.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 27. \u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u043c\u043e\u043d\u043e\u043b\u043e\u0433 \u0413\u0430\u043c\u043b\u0435\u0442\u0430 \u0431\u044b\u043b \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0440\u0438\u043d\u044f\u0442 (\u0440\u0438\u0441\u0443\u043d\u043e\u043a 26), \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0431\u044b\u043b\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 (\u0440\u0438\u0441\u0443\u043d\u043e\u043a 30), \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u044b\u043b\u043e \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0432 \u043b\u043e\u0433\u0430\u0445 \u0432\u0435\u0434\u0443\u0449\u0435\u0433\u043e \u0443\u0437\u043b\u0430:<\/p>\n<pre><code>18:53:33 [   INFO] Received packet: RTS(conn_id=235, trans_id=2, frame_len=320, frames_count=1, data_type=&lt;RTSDataType.COMPRESSED_TEXT: 1&gt;)18:53:39 [   INFO] Received packet: DataBytes(conn_id=235, frame_id=0, payload=b'\\x86\\xca\\x80&gt;\\x01\\x87q\\xb4\\x1b\\xafg\\xb5\\xba\\xf6{&amp;\\x82\\xbe\\x9e\\xc9\\x97')18:53:43 [   INFO]=== RECEIVED FULL TEXT ===R9FEU: Roger roger. Over.=====================18:53:43 [   INFO] Received packet: Eot(conn_id=235, trans_id=86, reason_code=&lt;EotReason.SUCCESS: 0&gt;)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<blockquote>\n<p>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<br \/>\u041e\u0442\u043c\u0435\u0442\u043a\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 27 \u0438 \u043b\u043e\u0433\u0430\u0445 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0430\u0432\u0442\u043e\u0440 \u0437\u0430\u0431\u044b\u043b \u0441\u0432\u043e\u0435\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442.<\/p>\n<\/blockquote>\n<h2>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u0438 \u044d\u0444\u0438\u0440\u0430<\/h2>\n<p>\u0418\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u044f \u0432 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445, \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u043d\u044b\u0445 \u043a \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0440\u0430\u0434\u0438\u043e\u044d\u0444\u0438\u0440\u0443, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0438\u0441\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0438\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430 \u043a\u0430\u043d\u0430\u043b\u043e\u0432 \u0441\u0432\u044f\u0437\u0438. \u041e\u043d \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043b \u0448\u0438\u0440\u043e\u043a\u043e\u043f\u043e\u043b\u043e\u0441\u043d\u044b\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0443\u0440\u043d\u044b\u0439 (IQ) \u0441\u0438\u0433\u043d\u0430\u043b, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u043f\u043e\u0442\u043e\u043a \u043c\u043e\u0434\u0435\u043c\u0430 \u043f\u043e\u0434\u0432\u0435\u0440\u0433\u0430\u043b\u0441\u044f \u043e\u0434\u043d\u043e\u043f\u043e\u043b\u043e\u0441\u043d\u043e\u0439 \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u043d\u043e\u0439 \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 \u0441 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0431\u043e\u043a\u043e\u0432\u043e\u0439 \u043f\u043e\u043b\u043e\u0441\u043e\u0439 (USB).<\/p>\n<p>\u041a\u043e\u0434 \u043c\u043e\u0434\u0443\u043b\u044f\u0442\u043e\u0440\u0430:<\/p>\n<pre><code class=\"python\">import numpy as npfrom scipy.signal import resample_polyfrom scipy.io.wavfile import write, readfrom scipy.signal import hilbertdef mod_DSB(time, freq_carrier, mod_signal):    carrier = np.exp(1j * 2 * np.pi * freq_carrier * time)    envelope = mod_signal    return envelope * carrierdef mod_USB(time, freq_carrier, mod_signal):    envelope = hilbert(mod_signal)    return mod_DSB(time, freq_carrier, envelope)...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>mod_DSB<\/code> \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0434\u0432\u0443\u0445\u043f\u043e\u043b\u043e\u0441\u043d\u0443\u044e \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u043d\u0443\u044e \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u044e \u0441 \u043f\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u043d\u0435\u0441\u0443\u0449\u0435\u0439 (DSB-SC). \u041a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u0430\u044f \u043e\u0433\u0438\u0431\u0430\u044e\u0449\u0430\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0443\u0442\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0413\u0438\u043b\u044c\u0431\u0435\u0440\u0442\u0430 \u043a \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 \u0441\u0438\u0433\u043d\u0430\u043b\u0443.<\/p>\n<pre><code class=\"python\">...def rand(shape):    return np.random.normal(0, 1, size=shape)fs = int(1e6)...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>rand<\/code> \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043e\u0442\u0441\u0447\u0435\u0442\u044b \u0430\u0434\u0434\u0438\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0431\u0435\u043b\u043e\u0433\u043e \u0433\u0430\u0443\u0441\u0441\u043e\u0432\u0430 \u0448\u0443\u043c\u0430. \u0427\u0430\u0441\u0442\u043e\u0442\u0430 \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0437\u0430\u0434\u0430\u043d\u0430 \u0440\u0430\u0432\u043d\u043e\u0439 1.0 \u041c\u0413\u0446.<\/p>\n<pre><code class=\"python\">...src_sr, src_data = read(\"\/tmp\/ofdm-signal-src.wav\")duration = len(src_data) \/ src_srpayload = resample_poly(src_data \/ 32768, fs, src_sr)time = np.arange(fs * duration) \/ fsusb_signal = mod_USB(time, 50000, payload)...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0427\u0430\u0441\u0442\u043e\u0442\u0430 \u043d\u0435\u0441\u0443\u0449\u0435\u0439 USB-\u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0437\u0430\u0434\u0430\u043d\u0430 \u0440\u0430\u0432\u043d\u043e\u0439 50.0 \u043a\u0413\u0446.<\/p>\n<pre><code class=\"python\">...amp = 1.0iq_signal = usb_signal * ampiq_signal \/= np.max(np.abs(iq_signal))snr_db = 6.0p_signal = np.mean(np.abs(iq_signal) ** 2)p_noise = p_signal \/ (10 ** (snr_db \/ 10))...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\/\u0448\u0443\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 6\u0434\u0411 (\u0441\u043b\u0430\u0431\u044b\u0439, \u0435\u0434\u0432\u0430 \u0437\u0430\u043c\u0435\u0442\u043d\u044b\u0439 \u0448\u0443\u043c).<\/p>\n<pre><code class=\"python\">...noise = (rand(iq_signal.shape) + 1j * rand(iq_signal.shape)) * np.sqrt(p_noise \/ 2)iq_signal = iq_signal + noise...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0434\u0434\u0438\u0442\u0438\u0432\u043d\u043e\u0435 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u0435 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0443\u0440\u043d\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0441 \u0448\u0443\u043c\u043e\u0432\u043e\u0439 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0439.<\/p>\n<pre><code class=\"python\">...iq_output = np.vstack((iq_signal.real, iq_signal.imag)).Twrite(\"\/tmp\/ofdm-sdr-iq.wav\", fs, (iq_output * 32767).astype(np.int16))<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 28 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f IQ-\u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 sdrpp.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/47\/21\/7b\/47217b469187390d227d8e77a32becfa.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 28. \u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 IQ-\u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0432 sdrpp.\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 28. \u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 IQ-\u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0432 sdrpp.\" width=\"1545\" height=\"682\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/47\/21\/7b\/47217b469187390d227d8e77a32becfa.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/47\/21\/7b\/47217b469187390d227d8e77a32becfa.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 28. \u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 IQ-\u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0432 sdrpp.<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 29 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u0435\u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 \u0441\u043d\u0438\u0444\u0435\u0440\u043e\u043c \u0441\u0438\u0433\u043d\u0430\u043b\u0430, \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439 sdrpp.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/09\/95\/39\/099539ed305addc2048bc3e755f1373a.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 29. \u041f\u0440\u0438\u0435\u043c \u0441\u043d\u0438\u0444\u0444\u0435\u0440\u043e\u043c \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0438\u0437 sdrpp.\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 29. \u041f\u0440\u0438\u0435\u043c \u0441\u043d\u0438\u0444\u0444\u0435\u0440\u043e\u043c \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0438\u0437 sdrpp.\" width=\"1302\" height=\"891\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/09\/95\/39\/099539ed305addc2048bc3e755f1373a.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/09\/95\/39\/099539ed305addc2048bc3e755f1373a.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 29. \u041f\u0440\u0438\u0435\u043c \u0441\u043d\u0438\u0444\u0444\u0435\u0440\u043e\u043c \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0438\u0437 sdrpp.<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0432 sdrpp \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c AGC, \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0438\u0437 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0443\u0440\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0431\u044b\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0434\u0435\u043c\u043e\u0434\u0443\u043b\u044f\u0442\u043e\u0440:<\/p>\n<pre><code class=\"python\">import numpy as npfrom scipy.signal import resample_poly, butter, lfilterfrom scipy.io.wavfile import write, readdef lowpass_filter(s, cutoff, fs):    nyq = 0.5 * fs    normal_cutoff = cutoff \/ nyq    b, a = butter(5, normal_cutoff, btype='low')    return lfilter(b, a, s)...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f \u043f\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u043f\u043e\u043b\u043e\u0441\u043d\u044b\u0445 \u0438\u0437\u043b\u0443\u0447\u0435\u043d\u0438\u0439 \u043f\u0440\u0438 \u0434\u0435\u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 USB-\u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0444\u0438\u043b\u044c\u0442\u0440 \u043d\u0438\u0436\u043d\u0438\u0445 \u0447\u0430\u0441\u0442\u043e\u0442 \u0411\u0430\u0442\u0442\u0435\u0440\u0432\u043e\u0440\u0442\u0430. \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>nyq<\/code> \u0437\u0430\u0434\u0430\u0435\u0442 \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u041d\u0430\u0439\u043a\u0432\u0438\u0441\u0442\u0430, \u0440\u0430\u0432\u043d\u0443\u044e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0435 \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430.<\/p>\n<pre><code class=\"python\">...def demod_USB(fs, fc, s, sr):    t = np.arange(len(s)) \/ fs    shifted = s * np.exp(-2j * np.pi * fc * t)    filtered = lowpass_filter(shifted, sr * 0.5, fs)    signal = resample_poly(filtered, sr, fs)    return np.real(signal)...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u043e\u0433\u043e USB-\u0434\u0435\u043c\u043e\u0434\u0443\u043b\u044f\u0442\u043e\u0440\u0430: \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u0443\u044e \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0442\u0443 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u043f\u0435\u0440\u0435\u043d\u043e\u0441 \u0441\u043f\u0435\u043a\u0442\u0440\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0438\u0437 \u0432\u044b\u0441\u043e\u043a\u043e\u0447\u0430\u0441\u0442\u043e\u0442\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0432 \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u043f\u043e\u043b\u043e\u0441\u0443 (\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0446\u0438\u0444\u0440\u043e\u0432\u043e\u0433\u043e \u0433\u0435\u0442\u0435\u0440\u043e\u0434\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f). \u041f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0424\u041d\u0427 \u043f\u043e\u0434\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u043a\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435, \u043b\u0435\u0436\u0430\u0449\u0438\u0435 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u043f\u043e\u043b\u043e\u0441\u044b \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>resample_poly<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0434\u0430\u0443\u043d\u0441\u0435\u043c\u043f\u043b\u0438\u043d\u0433 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0434\u043e \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<pre><code class=\"python\">...fs, data = read(\"\/tmp\/ofdm-sdr-iq.wav\")data = data \/ 32768.0iq_signal = data[:, 0] + 1j * data[:, 1]fc_target = 50000audio = demod_USB(fs, fc_target, iq_signal, 12000)write(\"\/tmp\/out.wav\", 12000, (audio * 32767).astype(np.int16))<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <code>fc_target<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u043d\u0435\u0441\u0443\u0449\u0435\u0439, \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043f\u0440\u0438 \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 USB-\u0441\u0438\u0433\u043d\u0430\u043b\u0430. \u0427\u0430\u0441\u0442\u043e\u0442\u0430 \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 12.0 \u043a\u0413\u0446.<\/p>\n<p><em>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043d\u0430 Python\/numpy \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 SDR \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a.<\/em><\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/fd\/fd\/a3\/fdfda380f63a9c9b324945f618e16644.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 30. \u0410\u043d\u0430\u043b\u0438\u0437 \u0434\u0435\u043c\u043e\u0434\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0441\u043d\u0438\u0444\u0444\u0435\u0440\u043e\u043c.\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 30. \u0410\u043d\u0430\u043b\u0438\u0437 \u0434\u0435\u043c\u043e\u0434\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0441\u043d\u0438\u0444\u0444\u0435\u0440\u043e\u043c.\" width=\"1302\" height=\"891\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/fd\/fd\/a3\/fdfda380f63a9c9b324945f618e16644.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/fd\/fd\/a3\/fdfda380f63a9c9b324945f618e16644.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 30. \u0410\u043d\u0430\u043b\u0438\u0437 \u0434\u0435\u043c\u043e\u0434\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0441\u043d\u0438\u0444\u0444\u0435\u0440\u043e\u043c.<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 30 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0434\u0435\u043c\u043e\u0434\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430.<\/p>\n<blockquote>\n<p>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<br \/>\u041c\u043e\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u0432 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0438\u044f\u0445 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 SNR. \u042d\u0444\u0444\u0435\u043a\u0442 \u0441\u0432\u044f\u0437\u0430\u043d \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u0440\u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0431\u044b\u043b\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u043d\u0438\u0436\u0435\u043d\u0430 \u0435\u0433\u043e \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u0430. \u0422\u043e \u0435\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0433\u0440\u043e\u043c\u043a\u0438\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0444\u0430\u0437\u043e\u0432\u044b\u043c \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u044f\u043c \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0438 \u0434\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u044f (\u0440\u0438\u0441\u0443\u043d\u043e\u043a 34). \u0422\u0430\u043a\u0436\u0435, \u043f\u0440\u0438 \u0432\u044b\u0441\u043e\u043a\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u0445 \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u044b \u043a\u0440\u0438\u0432\u0430\u044f \u0410\u0427\u0425 \u043a\u0430\u043d\u0430\u043b\u0430 \u0432\u044b\u0448\u043b\u0430 \u0437\u0430 \u0433\u0430\u0431\u0430\u0440\u0438\u0442\u044b \u0433\u0440\u0430\u0444\u0438\u043a\u0430.<\/p>\n<\/blockquote>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/ab\/17\/68\/ab176869ac6a699f95b3374529cfc5d3.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 31. \u0414\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u044f \u043f\u0440\u0438 \u0432\u044b\u0441\u043e\u043a\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u0445 \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u044b.\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 31. \u0414\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u044f \u043f\u0440\u0438 \u0432\u044b\u0441\u043e\u043a\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u0445 \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u044b.\" width=\"1302\" height=\"891\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/ab\/17\/68\/ab176869ac6a699f95b3374529cfc5d3.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/ab\/17\/68\/ab176869ac6a699f95b3374529cfc5d3.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 31. \u0414\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u044f \u043f\u0440\u0438 \u0432\u044b\u0441\u043e\u043a\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u0445 \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u044b.<\/figcaption><\/div>\n<\/figure>\n<h2>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u044d\u0444\u0438\u0440\u0435<\/h2>\n<p>\u041a\u0430\u043a \u0438 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u0442\u0435\u0441\u0442 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u043b\u0441\u044f \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u0423\u041a\u0412 \u0442\u0440\u0430\u043d\u0441\u0438\u0432\u0435\u0440\u0430 ICOM IC-9700 \u0438 SDR-\u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a\u0430 RX-888 \u043f\u043e\u0434 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c SDR Console.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u0435, \u0431\u044b\u043b \u0437\u0430\u043f\u0438\u0441\u0430\u043d \u0432 \u043e\u0434\u0438\u043d wav-\u0444\u0430\u0439\u043b, \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0435, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u0439 \u043a \u0442\u0440\u0430\u043d\u0441\u0438\u0432\u0435\u0440\u0443.\u00a0<\/p>\n<p>\u0412 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 SDR Console \u044d\u0444\u0438\u0440 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u043b\u0441\u044f \u0432 \u0444\u0430\u0439\u043b \u0441 IQ \u0434\u0430\u043d\u043d\u044b\u043c\u0438. \u041f\u0440\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 1.0 \u041c\u0413\u0446.<\/p>\n<p>\u0414\u0435\u043c\u043e\u0434\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u0437 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0441\u0438\u0433\u043d\u0430\u043b \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u043b\u0441\u044f \u043d\u0430 \u0432\u0445\u043e\u0434 \u0441\u043d\u0438\u0444\u0444\u0435\u0440\u0430 \u0434\u043b\u044f \u043e\u0446\u0435\u043d\u043a\u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u0434\u0435\u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438.<\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u0431\u044b\u043b\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 sdrpp \u0434\u043b\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0438\u0437 IQ \u043f\u043e\u0442\u043e\u043a\u0430 (\u0440\u0438\u0441\u0443\u043d\u043e\u043a 32).<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/c8\/ff\/15\/c8ff15286e50a96d9ec97e2c8fe69cdb.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 32. \u0421\u043f\u0435\u043a\u0442\u0440 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0432 srpp (\u043a\u043e\u043d\u0442\u0440\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u0444\u0438\u0440\u043d\u044b\u0445 \u0448\u0443\u043c\u0430 \u0441\u043d\u0438\u0436\u0435\u043d\u0430).\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 32. \u0421\u043f\u0435\u043a\u0442\u0440 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0432 srpp (\u043a\u043e\u043d\u0442\u0440\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u0444\u0438\u0440\u043d\u044b\u0445 \u0448\u0443\u043c\u0430 \u0441\u043d\u0438\u0436\u0435\u043d\u0430).\" width=\"472\" height=\"747\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/c8\/ff\/15\/c8ff15286e50a96d9ec97e2c8fe69cdb.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/c8\/ff\/15\/c8ff15286e50a96d9ec97e2c8fe69cdb.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 32. \u0421\u043f\u0435\u043a\u0442\u0440 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0432 srpp (\u043a\u043e\u043d\u0442\u0440\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u0444\u0438\u0440\u043d\u044b\u0445 \u0448\u0443\u043c\u0430 \u0441\u043d\u0438\u0436\u0435\u043d\u0430).<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 33 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0434\u0435\u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u0447\u0442\u043e \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0441\u0432\u044f\u0437\u0438 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0437\u0432\u0443\u043a\u043e\u0432\u044b\u0445 \u0442\u0440\u0430\u043a\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0430, \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u0441\u0438\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0437\u0440\u0443\u0448\u0430\u044e\u0449\u0435\u0435 \u0432\u043e\u0437\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043d\u0430 \u0441\u0438\u0433\u043d\u0430\u043b, \u0445\u043e\u0442\u044c \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0430 DSP \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0438\u0432\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u044b.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/0d\/06\/63\/0d06633708e74029237875a542081d29.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 33. \u0414\u0435\u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u044f \u043f\u0430\u043a\u0442\u043e\u0432 \u0438\u0437 \u0437\u0430\u043f\u0438\u0441\u0438 \u044d\u0444\u0438\u0440\u0430.\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 33. \u0414\u0435\u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u044f \u043f\u0430\u043a\u0442\u043e\u0432 \u0438\u0437 \u0437\u0430\u043f\u0438\u0441\u0438 \u044d\u0444\u0438\u0440\u0430.\" width=\"1302\" height=\"891\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/0d\/06\/63\/0d06633708e74029237875a542081d29.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/0d\/06\/63\/0d06633708e74029237875a542081d29.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 33. \u0414\u0435\u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u044f \u043f\u0430\u043a\u0442\u043e\u0432 \u0438\u0437 \u0437\u0430\u043f\u0438\u0441\u0438 \u044d\u0444\u0438\u0440\u0430.<\/figcaption><\/div>\n<\/figure>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u044b\u043b\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 MAC \u0438 LLC \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0432 \u0441\u0430\u043c\u043e\u0434\u0435\u043b\u044c\u043d\u043e\u043c, \u0440\u0430\u0434\u0438\u043e\u043b\u044e\u0431\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435 \u043d\u0430 \u0431\u0430\u0437\u0435 OFDM. \u041d\u0430 PHY-\u0443\u0440\u043e\u0432\u043d\u0435 \u0431\u044b\u043b\u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043d\u043e\u0432\u044b\u0435 \u0441\u0445\u0435\u043c\u044b \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0439, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0447\u0430\u0441\u0442\u043e\u0442\u043d\u0430\u044f \u0441\u0435\u0442\u043a\u0430 \u043e\u0440\u0442\u043e\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u0434\u043d\u0435\u0441\u0443\u0449\u0438\u0445, \u043c\u043e\u0434\u0435\u0440\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d \u044d\u043a\u0432\u0430\u043b\u0430\u0439\u0437\u0435\u0440. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0432\u044f\u0437\u0438, \u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438, \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u0430\u043a \u0432 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u0438, \u0442\u0430\u043a \u0438 \u043f\u0440\u0438 \u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u044f\u0445 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0440\u0430\u0434\u0438\u043e\u044d\u0444\u0438\u0440\u0435.<\/p>\n<p>\u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0441\u0442\u0435\u043a\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432 \u0432\u043e \u043c\u043d\u043e\u0433\u043e\u043c \u0431\u044b\u043b\u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u044b \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u044d\u0442\u0430\u043f\u044b, \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u044b\u0435 \u0434\u043b\u044f \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u0432 \u0431\u0435\u0441\u043f\u0440\u043e\u0432\u043e\u0434\u043d\u043e\u0439 \u0441\u0432\u044f\u0437\u0438 Wi-Fi \u0438 5G.<\/p>\n<p>\u0412 \u0441\u0442\u0430\u0442\u044c\u044e \u043d\u0435 \u0432\u043e\u0448\u043b\u0438 32-QAM \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u044f \u0438 \u043e\u0431\u043c\u0435\u043d RSSI \u043c\u0435\u0436\u0434\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0443\u0437\u043b\u0430\u043c\u0438.<\/p>\n<p><em>Subscribed it, gave&#8217;t the impression, placed it safely. Now, the next day was our sea-fight.<\/em><\/p>\n<\/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:\/\/habr.com\/ru\/articles\/1095010\/\">https:\/\/habr.com\/ru\/articles\/1095010\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u0431\u044b\u043b\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0440\u0430\u0431\u043e\u0442\u044b PHY-\u0443\u0440\u043e\u0432\u043d\u044f \u0440\u0430\u0434\u0438\u043e\u043b\u044e\u0431\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e OFDM-\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043a \u0441\u0440\u0435\u0434\u0435 (MAC) \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043a\u0430\u043d\u0430\u043b\u043e\u043c (LLC), \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0445 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0442\u0440\u0430\u043d\u0441\u0438\u0432\u0435\u0440\u0430\u043c\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432\u043e\u0437\u043d\u0438\u043a\u0448\u0438\u0435 \u043f\u0440\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u044f.\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0439 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 OFDM-\u043c\u043e\u0434\u0435\u043c \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u043b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 PHY-\u0443\u0440\u043e\u0432\u0435\u043d\u044c. \u0414\u043b\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0433\u043e \u043e\u0431\u043c\u0435\u043d\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\u043c\u0438 \u0441\u0435\u0442\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0445 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u0438, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u043a\u0430\u043d\u0430\u043b\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432.\u0412 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043c\u043e\u0434\u0435\u043b\u044c\u044e OSI \u043a\u0430\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 MAC \u0438 LLC \u043f\u043e\u0434\u0443\u0440\u043e\u0432\u043d\u0438. \u041f\u043e\u0434\u0443\u0440\u043e\u0432\u0435\u043d\u044c MAC (Medium Access Control) \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439 \u0432 \u0441\u0440\u0435\u0434\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438. \u0424\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 LLC (Logical Link Control) \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c, \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043d\u044f\u0442\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438\u0445 \u043a\u0432\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 (\u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435) \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u0446\u0438\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432.\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0434\u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0439 OFDM-\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0438\u0437 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u043e\u0434\u043d\u043e\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 (\u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u0444\u0430) \u0432 \u043f\u043e\u043b\u043d\u043e\u0434\u0443\u043f\u043b\u0435\u043a\u0441\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0441\u0432\u044f\u0437\u0438.TL;DR\u0411\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u043e\u0432 (FSM) \u0438 \u0441\u043e\u043f\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u0420\u0430\u0434\u0438\u043e\u043b\u044e\u0431\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 &#171;\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435.\u041f\u043e\u0434 \u0441\u043f\u043e\u0439\u043b\u0435\u0440\u043e\u043c \u043a\u0440\u0430\u0442\u043a\u043e\u0435 \u0438\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0432\u043e\u043f\u0440\u043e\u0441-\u043e\u0442\u0432\u0435\u0442:Hidden text\u0412: \u0447\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c \u043d\u0430 PHY-\u0443\u0440\u043e\u0432\u043d\u0435?\u041e: \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b 16-QAM, 32-QAM \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438, \u0441\u043d\u0438\u0436\u0435\u043d PAPR, \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d \u044d\u043a\u0432\u0430\u043b\u0430\u0439\u0437\u0435\u0440, \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u0430\u043a\u0435\u0442\u0430, \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u043f\u0440\u0435\u0430\u043c\u0431\u0443\u043b\u044b.\u0412: \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0441 \u044d\u043a\u0432\u0430\u043b\u0430\u0439\u0437\u0435\u0440\u043e\u043c?\u041e: \u044d\u0444\u0444\u0435\u043a\u0442 \u0434\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u0438 (\u0440\u0430\u0437\u043c\u044b\u0442\u0438\u044f) \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u044f \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u0412\u0438\u043d\u0435\u0440\u0430.\u0412: \u043a\u0430\u043a\u043e\u0439 \u0442\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u0430\u043a\u0435\u0442\u0430?\u041e: \u0434\u043b\u0438\u043d\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0430 10 \u0431\u0438\u0442\u043d\u044b\u043c \u043f\u043e\u043b\u0435\u043c len (\u0434\u043e 1023 \u0431\u0438\u0442 \u043d\u0430 \u0431\u043b\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445).\u0412: \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0441 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u043e\u043c?\u041e: \u0442\u0435\u0445\u0434\u043e\u043b\u0433, \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 \u0433\u0438\u043f\u043e\u0442\u0435\u0437 ZC-\u043f\u0440\u0435\u0430\u043c\u0431\u0443\u043b\u044b \u043d\u0438\u0432\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043b \u0433\u0440\u0443\u0431\u0443\u044e \u043e\u0446\u0435\u043d\u043a\u0443 \u043f\u0440\u0435\u0430\u043c\u0431\u0443\u043b\u044b \u041d\u044c\u044e\u043c\u0430\u043d\u0430.\u0412: \u0447\u0442\u043e \u0437\u0430 MAC \u0438 LLC?\u041e: \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0443\u0437\u043b\u0430\u043c\u0438 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u0438 \u043e\u0431\u043c\u0435\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\u0412: \u043a\u0430\u043a \u043e\u043d\u0438 \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u044b?\u041e: \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u043d\u0430\u044f (FSM) \u043b\u043e\u0433\u0438\u043a\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u043e\u0439 OFDM-\u043c\u043e\u0434\u0435\u043c\u0430.\u0412: \u0430 \u043a\u0430\u043a \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442?\u041e: \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u044b, \u0441\u0445\u043e\u0436\u0438\u0435 \u043f\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e \u0441 \u043f\u0430\u043a\u0435\u0442\u0430\u043c\u0438 \u0432 TCP\/IP.\u0412: \u043a\u0430\u043a \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435?\u041e: \u0442\u0440\u0435\u0445\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0435 \u0440\u0443\u043a\u043e\u043f\u043e\u0436\u0430\u0442\u0438\u0435 \u0432 \u043f\u043e\u043b\u0443\u0434\u0443\u043f\u043b\u0435\u043a\u0441\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435.\u0412: \u043a\u0430\u043a \u0432 \u043f\u043e\u043b\u0443\u0434\u0443\u043f\u043b\u0435\u043a\u0441\u0435 \u0440\u0435\u0448\u0435\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 &#171;\u043d\u0430\u0432\u0441\u0442\u0440\u0435\u0447\u0443&#187;?\u041e: \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0442\u0430\u0439\u043c-\u0441\u043b\u043e\u0442\u043e\u0432, \u043f\u0440\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0438 \u0443\u0437\u043b\u044b \u0434\u043e\u0433\u043e\u0432\u0430\u0440\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043a\u0442\u043e \u0432 \u043a\u0430\u043a\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443.\u0412: \u043a\u0430\u043a\u043e\u0439 \u043f\u0438\u043d\u0433?\u041e: \u0432 \u043b\u0430\u0431\u043e\u0440\u0430\u0442\u043e\u0440\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u0430\u0445 \u043f\u0438\u043d\u0433 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 5 \u0441\u0435\u043a \u0438\u0437-\u0437\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u044b, \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u043e\u0433 200-300 \u043c\u0441.\u00a0\u0412: \u043a\u0430\u043a\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445?\u041e: \u043f\u043e \u043e\u0446\u0435\u043d\u043a\u0435 \u043a\u0430\u043d\u0430\u043b\u0430 \u0443\u0437\u043b\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442 \u0441 \u043a\u0430\u043a\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u0433\u043e\u0442\u043e\u0432\u044b \u0432\u0435\u0441\u0442\u0438 \u043f\u0440\u0438\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445; \u0432 \u043f\u0438\u043a\u0435 \u0434\u043e 1500 \u0431\u0438\u0442\/\u0441\u0435\u043a \u0441 16-QAM \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0435\u0439 \u0438 \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u043d\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u043a\u043e\u0434\u0435\u0440\u0430 (\u043f\u0440\u043e\u0440\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435\u043c); \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c 32-QAM \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u0435\u0449\u0435 \u0432\u044b\u0448\u0435.\u0412: \u043a\u0430\u043a \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f?\u041e: \u0440\u0435\u0436\u0438\u043c Stop-and-Wait \u0441 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435\u043c \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u0438 \u0440\u0435\u0436\u0438\u043c bulk, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u043a\u043e\u043f \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0435\u0434\u0438\u043d\u043e\u0436\u0434\u044b.\u0412: \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c ARQ?\u041e: \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.\u0412: \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c?\u041e: \u0442\u0435\u043a\u0441\u0442 (\u043e\u0442\u043a\u0440\u044b\u0442\u043e \u0438\u043b\u0438 \u0441\u043e \u0441\u0436\u0430\u0442\u0438\u0435\u043c), \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0430 PHY-\u0443\u0440\u043e\u0432\u043d\u0435\u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c MAC \u0438 LLC-\u0443\u0440\u043e\u0432\u043d\u0435\u0439, \u043c\u043e\u0434\u0435\u0440\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0434\u0432\u0435\u0440\u0433\u0441\u044f \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439 (PHY) \u0443\u0440\u043e\u0432\u0435\u043d\u044c. \u0411\u044b\u043b \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u043c\u0435\u0442\u043e\u0434 \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 16-QAM, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 4 \u0431\u0438\u0442 \u043d\u0430 \u043e\u0434\u0438\u043d \u043f\u043e\u0434\u043d\u0435\u0441\u0443\u0449\u0438\u0439 \u0441\u0438\u043c\u0432\u043e\u043b. \u0422\u0430\u043a\u0436\u0435 \u0431\u044b\u043b\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u043d\u0435\u0441\u0443\u0449\u0438\u0445 \u0432 \u043e\u0434\u043d\u043e\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u0435, \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0447\u0430\u0441\u0442\u043e\u0442 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 46.875 \u0413\u0446. \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c\u044b\u0439 OFDM-\u0441\u0438\u043c\u0432\u043e\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u0435\u0442\u043a\u0443 \u0438\u0437 53 \u043e\u0440\u0442\u043e\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u0434\u043d\u0435\u0441\u0443\u0449\u0438\u0445.PSK-\u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u044f\u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0430\u0445 1, 2, 3 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0441\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0439 \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0438\u043c \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u0438\u0442.\u0420\u0438\u0441\u0443\u043d\u043e\u043a 1. \u0421\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0435 BPSK.\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f BPSK:_MAPPING_TABLE = {    (0,): -1 + 0j,    (1,): 1 + 0j,}\u0420\u0438\u0441\u0443\u043d\u043e\u043a 2. \u0421\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0435 QPSK.\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f QPSK:_NORM = np.sqrt(2.0)_MAPPING_TABLE = {    (0, 0): (-1.0 &#8212; 1j) \/ _NORM,    (0, 1): (-1.0 + 1j) \/ _NORM,    (1, 1): (1.0 + 1j) \/ _NORM,    (1, 0): (1.0 &#8212; 1j) \/ _NORM,}\u0420\u0438\u0441\u0443\u043d\u043e\u043a 3. \u0421\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0435 16-QAM.\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f 16-QAM:_NORM = np.sqrt(10.0)_MAPPING_TABLE = {    (0, 0, 0, 0): (-3.0 &#8212; 3j) \/ _NORM,    (0, 0, 0, 1): (-3.0 &#8212; 1j) \/ _NORM,    (0, 0, 1, 1): (-3.0 + 1j) \/ _NORM,    (0, 0, 1, 0): (-3.0 + 3j) \/ _NORM,    (0, 1, 0, 0): (-1.0 &#8212; 3j) \/ _NORM,    (0, 1, 0, 1): (-1.0 &#8212; 1j) \/ _NORM,    (0, 1, 1, 1): (-1.0 + 1j) \/ _NORM,    (0, 1, 1, 0): (-1.0 + 3j) \/ _NORM,    (1, 1, 0, 0): (1.0 &#8212; 3j) \/ _NORM,    (1, 1, 0, 1): (1.0 &#8212; 1j) \/ _NORM,    (1, 1, 1, 1): (1.0 + 1j) \/ _NORM,    (1, 1, 1, 0): (1.0 + 3j) \/ _NORM,    (1, 0, 0, 0): (3.0 &#8212; 3j) \/ _NORM,    (1, 0, 0, 1): (3.0 &#8212; 1j) \/ _NORM,    (1, 0, 1, 1): (3.0 + 1j) \/ _NORM,    (1, 0, 1, 0): (3.0 + 3j) \/ _NORM,}\u041c\u0435\u0442\u043e\u0434 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0443\u0440\u043d\u043e\u0439 \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u043d\u043e\u0439 \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 16-QAM \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u043b\u043e\u0442\u043d\u044b\u043c \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0435\u043c, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043e 4 \u0431\u0438\u0442\u0430 \u0432 \u043e\u0434\u043d\u043e\u043c \u0441\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u0435. \u0414\u043b\u044f \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u0432 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u0437\u0430\u043c\u0438\u0440\u0430\u043d\u0438\u0439 \u0438 \u0448\u0443\u043c\u043e\u0432 \u043f\u0440\u0438 \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0434 \u0413\u0440\u0435\u044f.\u0422\u0430\u043a\u0436\u0435, \u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u044f 32-QAM, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0449\u0430\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441 \u0434\u043e 5 \u0431\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432 \u0441\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0438\u043c\u043e\u0432\u043b\u0435.\u0420\u0438\u0441\u0443\u043d\u043e\u043a 4. \u0421\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0435 32-QAM.\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f 16-QAM:_NORM = np.sqrt(20.0)_MAPPING_TABLE = {    (0, 0, 0, 0, 0): (-3.0 &#8212; 5j) \/ _NORM, (0, 0, 0, 0, 1): (-3.0 &#8212; 3j) \/ _NORM,    (0, 0, 0, 1, 1): (-3.0 &#8212; 1j) \/ _NORM, (0, 0, 0, 1, 0): (-3.0 + 1j) \/ _NORM,    (0, 0, 1, 1, 0): (-3.0 + 3j) \/ _NORM, (0, 0, 1, 1, 1): (-3.0 + 5j) \/ _NORM,    (0, 1, 0, 0, 0): (-1.0 &#8212; 5j) \/ _NORM, (0, 1, 0, 0, 1): (-1.0 &#8212; 3j) \/ _NORM,    (0, 1, 0, 1, 1): (-1.0 &#8212; 1j) \/ _NORM, (0, 1, 0, 1, 0): (-1.0 + 1j) \/ _NORM,    (0, 1, 1, 1, 0): (-1.0 + 3j) \/ _NORM, (0, 1, 1, 1, 1): (-1.0 + 5j) \/ _NORM,    (1, 1, 0, 0, 0): (1.0 &#8212; 5j) \/ _NORM, (1, 1, 0, 0, 1): (1.0 &#8212; 3j) \/ _NORM,    (1, 1, 0, 1, 1): (1.0 &#8212; 1j) \/ _NORM, (1, 1, 0, 1, 0): (1.0 + 1j) \/ _NORM,    (1, 1, 1, 1, 0): (1.0 + 3j) \/ _NORM, (1, 1, 1, 1, 1): (1.0 + 5j) \/ _NORM,    (1, 0, 0, 0, 0): (3.0 &#8212; 5j) \/ _NORM, (1, 0, 0, 0, 1): (3.0 &#8212; 3j) \/ _NORM,    (1, 0, 0, 1, 1): (3.0 &#8212; 1j) \/ _NORM, (1, 0, 0, 1, 0): (3.0 + 1j) \/ _NORM,    (1, 0, 1, 1, 0): (3.0 + 3j) \/ _NORM, (1, 0, 1, 1, 1): (3.0 + 5j) \/ _NORM,    (0, 0, 1, 0, 0): (-5.0 &#8212; 3j) \/ _NORM, (0, 0, 1, 0, 1): (-5.0 &#8212; 1j) \/ _NORM,    (0, 1, 1, 0, 1): (-5.0 + 1j) \/ _NORM, (0, 1, 1, 0, 0): (-5.0 + 3j) \/ _NORM,    (1, 0, 1, 0, 0): (5.0 &#8212; 3j) \/ _NORM, (1, 0, 1, 0, 1): (5.0 &#8212; 1j) \/ _NORM,    (1, 1, 1, 0, 1): (5.0 + 1j) \/ _NORM, (1, 1, 1, 0, 0): (5.0 + 3j) \/ _NORM,}\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:32-QAM \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u044f \u0431\u044b\u043b\u0430 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u043a \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438. \u0422\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0430 \u043d\u0435 \u0431\u044b\u043b\u0430 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043e\u043d\u0430 \u0438\u043c\u0435\u0435\u0442 \u0441\u0442\u0430\u0442\u0443\u0441 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439. \u041f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u044f \u0441 \u0434\u0430\u043d\u043d\u044b\u043c \u0442\u0438\u043f\u043e\u043c \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 \u043d\u0435 \u0443\u0432\u0435\u043d\u0447\u0430\u043b\u0438\u0441\u044c \u0443\u0441\u043f\u0435\u0445\u043e\u043c \u0438\u0437-\u0437\u0430 \u0434\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u0438 \u0441\u043e\u0437\u0432\u0435\u0437\u0434\u0438\u0439 (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0441\u043c. \u043d\u0438\u0436\u0435). \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0435 \u043b\u0430\u0431\u043e\u0440\u0430\u0442\u043e\u0440\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u044e\u0442 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430.\u041f\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 OFDM \u043a \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438, \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e\u0439 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u0445 \u0441\u0435\u043c\u043f\u043b\u043e\u0432 (\u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043d\u0430 1 \u0441\u0435\u043c\u043f\u043b \u0438\u043d\u0434\u0443\u0446\u0438\u0440\u0443\u0435\u0442 \u0444\u0430\u0437\u043e\u0432\u044b\u0439 \u0441\u0434\u0432\u0438\u0433, \u0430 \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u044c \u0432 3 \u0441\u0435\u043c\u043f\u043b\u0430 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043f\u043e\u043b\u043d\u043e\u0439 \u043f\u043e\u0442\u0435\u0440\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0434\u0435\u043c\u043e\u0434\u0443\u043b\u044f\u0442\u043e\u0440\u0430 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0438\u0433\u043d\u0430\u043b), \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u0432\u0443\u0445\u044d\u0442\u0430\u043f\u043d\u0443\u044e \u0441\u0445\u0435\u043c\u0443 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438, \u0431\u0430\u0437\u0438\u0440\u0443\u044e\u0449\u0435\u0439\u0441\u044f \u043d\u0430 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 \u043f\u0440\u0435\u0430\u043c\u0431\u0443\u043b \u041d\u044c\u044e\u043c\u0430\u043d\u0430 \u0438 \u0417\u0430\u0434\u043e\u0432\u0430-\u0427\u0443 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043a\u043e\u0433\u0435\u0440\u0435\u043d\u0442\u043d\u044b\u043c \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u043c\u0435\u0445\u043e\u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u043e\u0441\u0442\u0438.\u0412 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 \u0433\u0438\u043f\u043e\u0442\u0435\u0437 \u0432 \u0448\u0438\u0440\u043e\u043a\u043e\u0439 \u043f\u043e\u043b\u043e\u0441\u0435 \u0447\u0430\u0441\u0442\u043e\u0442 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u043e\u043c \u043f\u0440\u0435\u0430\u043c\u0431\u0443\u043b\u044b \u041d\u044c\u044e\u043c\u0430\u043d\u0430. \u0414\u0435\u0442\u0435\u043a\u0442\u043e\u0440 ZC-\u043f\u0440\u0435\u0430\u043c\u0431\u0443\u043b\u044b \u0435\u0434\u0438\u043d\u043e\u0440\u0430\u0437\u043e\u0432\u043e \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u0442\u043e\u0447\u043d\u0443\u044e \u043e\u0446\u0435\u043d\u043a\u0443 CFO \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0441\u0432\u043e\u0435\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u043b\u043e\u0441\u044b \u0447\u0430\u0441\u0442\u043e\u0442 \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0442\u043e\u0447\u043d\u044b\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043d\u0430\u0447\u0430\u043b\u0430 OFDM-\u0441\u0438\u0433\u043d\u0430\u043b\u0430.\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u044d\u0442\u043e\u0442 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0434\u043e\u043b\u0433 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043b \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u0442\u043e\u0447\u043d\u043e\u0439 \u043e\u0446\u0435\u043d\u043a\u0438 CFO \u043f\u043e ZC-\u043f\u0440\u0435\u0430\u043c\u0431\u0443\u043b\u0435 \u043d\u0438\u0432\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0433\u0440\u0443\u0431\u043e\u0433\u043e \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u043f\u043e \u043f\u0440\u0435\u0430\u043c\u0431\u0443\u043b\u0435 \u041d\u044c\u044e\u043c\u0430\u043d\u0430. \u0422\u0430\u043a, \u0435\u0441\u043b\u0438 \u043e\u0446\u0435\u043d\u043a\u0430 \u041d\u044c\u044e\u043c\u0430\u043d\u0430 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043b\u0430 \u0441\u0434\u0432\u0438\u0433 \u0432 101.3 \u0413\u0446, \u0442\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c ZC \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u043b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 -101.5 \u0413\u0446, \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e\u043c\u043f\u0435\u043d\u0441\u0438\u0440\u0443\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0443\u044e \u043f\u043e\u043f\u0440\u0430\u0432\u043a\u0443, \u0447\u0442\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u043b\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u0430.\u0414\u0430\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u043b\u0430\u0441\u044c \u0432 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445, \u043a\u043e\u0433\u0434\u0430 \u0432 \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u043c \u0442\u0440\u0430\u043a\u0442\u0435 \u043f\u043e\u043c\u0438\u043c\u043e \u0447\u0430\u0441\u0442\u043e\u0442\u043d\u043e\u0433\u043e \u0434\u0440\u0435\u0439\u0444\u0430 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u043d\u044b\u0435 \u043d\u0435\u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0441\u0442\u0438 \u0438 \u0444\u0430\u0437\u043e\u0432\u044b\u0435 \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u0430.coarse: 27.4511Hz fine: -0.0596Hzcoarse: 27.4387Hz fine: -0.1148Hzcoarse: 27.4294Hz fine: 0.0565Hzcoarse: 27.4118Hz fine: -0.0813Hz\u0421\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u043f\u0438\u043a-\u0444\u0430\u043a\u0442\u043e\u0440\u0430\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u0441 \u0446\u0435\u043b\u044c\u044e \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u044f PAPR \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u043b\u0441\u044f \u043c\u0435\u0442\u043e\u0434 \u043a\u043b\u0438\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 (CAF), \u0437\u0430\u0434\u0430\u0447\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044e \u0432\u044b\u0441\u043e\u043a\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0435\u0439 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0438\u0445 \u0432\u043d\u0435\u043f\u043e\u043b\u043e\u0441\u043d\u044b\u0445 \u0441\u043f\u0435\u043a\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0445. \u041c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u043b\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0435 PAPR \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u043b\u043e \u043a \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044e \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u043e\u0436\u043d\u044b\u0445 \u043e\u0446\u0435\u043d\u043e\u043a CFO.class OFDMWavModem(OFDMIQModem):    DEFAULT_SAMPLE_RATE = 12000    CAF_COUNT = 3    def mod_payload_signal(self, header_payload: npt.NDArray[np.uint8], packet_payload: npt.NDArray[np.uint8],                           mode: ModType) -&gt; npt.NDArray[np.float64]:        assert self.CAF_COUNT &gt;= 1        signal_full = super().mod_payload_signal(header_payload, packet_payload, mode)        for _ in range(self.CAF_COUNT):            signal_full = clip_and_filter(                signal_full,                papr_cutoff_db=6.0, cutoff_freq_hz=3000,                fs_hz=self.DEFAULT_SAMPLE_RATE)        gain = 0.9        signal = signal_full \/ np.max(np.abs(signal_full)) * gain        return signal\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 CAF_COUNT=3 \u0431\u044b\u043b\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u044d\u043c\u043f\u0438\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0443\u0442\u0435\u043c. \u041f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0435 PAPR \u043f\u0440\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043d\u0435\u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0445 \u0444\u0430\u0437\u043e\u0432\u044b\u0445 \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u0439 \u0441\u0438\u0433\u043d\u0430\u043b\u0430.class OFDMSoundModem(OFDMWavModem):    def _get_mode_256(self) -&gt; dict:        return dict(            mapper=BPSKMapper,            sample_rate=self.DEFAULT_SAMPLE_RATE,            fft_bins=256,   &#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-498857","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/498857","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=498857"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/498857\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=498857"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=498857"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=498857"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}