From b6b1f1187a07c578b2faf5a1882d39ff088e0046 Mon Sep 17 00:00:00 2001 From: helloyifa <447523396@qq.com> Date: Thu, 10 Jul 2025 11:49:34 +0800 Subject: [PATCH] =?UTF-8?q?1.=E6=B7=BB=E5=8A=A0MCP=20=E6=9C=AC=E5=9C=B0?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=20=20,IOT=E7=9B=B8=E5=85=B3=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E6=94=B9=E7=94=A8MCP=E5=8D=8F=E8=AE=AE=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=202.=E4=BF=AE=E6=94=B9BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bk_idk/components/bk_cli/cli_ota.c | 3 + .../gen_kconfig_doc.cpython-310.pyc | Bin 0 -> 7604 bytes .../__pycache__/kconfiglib.cpython-310.pyc | Bin 0 -> 158625 bytes .../config/gen_files_list.txt | 2 +- .../beken_packager/partition_bootloader.json | 14 +- .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 291 bytes .../__pycache__/bl1_sign.cpython-310.pyc | Bin 0 -> 2397 bytes .../__pycache__/bl2_sign.cpython-310.pyc | Bin 0 -> 1696 bytes .../__pycache__/common.cpython-310.pyc | Bin 0 -> 4458 bytes .../__pycache__/compress.cpython-310.pyc | Bin 0 -> 1514 bytes .../copy_json_data_csv.cpython-310.pyc | Bin 0 -> 2787 bytes .../scripts/__pycache__/crc.cpython-310.pyc | Bin 0 -> 1333 bytes .../__pycache__/encrypt.cpython-310.pyc | Bin 0 -> 1267 bytes .../__pycache__/gen_code.cpython-310.pyc | Bin 0 -> 968 bytes .../__pycache__/gen_license.cpython-310.pyc | Bin 0 -> 990 bytes .../__pycache__/gen_mpc.cpython-310.pyc | Bin 0 -> 1668 bytes .../__pycache__/gen_ota.cpython-310.pyc | Bin 0 -> 1314 bytes .../__pycache__/gen_otp.cpython-310.pyc | Bin 0 -> 3128 bytes .../__pycache__/gen_otp_map.cpython-310.pyc | Bin 0 -> 4492 bytes .../__pycache__/gen_partition.cpython-310.pyc | Bin 0 -> 2816 bytes .../__pycache__/gen_ppc.cpython-310.pyc | Bin 0 -> 2262 bytes .../__pycache__/gen_security.cpython-310.pyc | Bin 0 -> 1961 bytes .../__pycache__/genbl1.cpython-310.pyc | Bin 0 -> 4570 bytes .../scripts/__pycache__/mpc.cpython-310.pyc | Bin 0 -> 770 bytes .../scripts/__pycache__/ota.cpython-310.pyc | Bin 0 -> 1710 bytes .../scripts/__pycache__/otp.cpython-310.pyc | Bin 0 -> 1601 bytes .../scripts/__pycache__/pack.cpython-310.pyc | Bin 0 -> 1815 bytes .../__pycache__/parse_csv.cpython-310.pyc | Bin 0 -> 3254 bytes .../__pycache__/partition.cpython-310.pyc | Bin 0 -> 36754 bytes .../__pycache__/pk_hash.cpython-310.pyc | Bin 0 -> 1868 bytes .../scripts/__pycache__/ppc.cpython-310.pyc | Bin 0 -> 2999 bytes .../__pycache__/rotpk_hash.cpython-310.pyc | Bin 0 -> 3587 bytes .../__pycache__/security.cpython-310.pyc | Bin 0 -> 1949 bytes .../scripts/__pycache__/sign.cpython-310.pyc | Bin 0 -> 2357 bytes .../solution_generator.cpython-310.pyc | Bin 0 -> 13430 bytes .../scripts/__pycache__/steps.cpython-310.pyc | Bin 0 -> 4212 bytes .../__pycache__/xts_aes.cpython-310.pyc | Bin 0 -> 1857 bytes .../ota-rbl/__pycache__/aes.cpython-310.pyc | Bin 0 -> 3795 bytes .../__pycache__/aes_tables.cpython-310.pyc | Bin 0 -> 6066 bytes .../__pycache__/xts_aes.cpython-310.pyc | Bin 0 -> 2430 bytes .../beken_wss_paopao/main/CMakeLists.txt | 2 + .../projects/beken_wss_paopao/main/app_main.c | 3 +- .../beken_wss_paopao/main/application.c | 268 ++++ .../beken_wss_paopao/main/application.h | 9 +- .../projects/beken_wss_paopao/main/bat_main.c | 2 +- .../projects/beken_wss_paopao/main/bat_main.h | 21 +- .../main/beken_sdk/beken_rtc.c | 139 +- .../beken_wss_paopao/main/iot/iot_lamp.c | 2 +- .../main/iot/iot_sleep_helper.c | 13 +- .../main/iot/iot_sleep_helper.h | 2 +- .../beken_wss_paopao/main/iot/iot_speaker.c | 2 +- .../beken_wss_paopao/main/mcp/mcp_server.c | 1221 +++++++++++++++++ .../beken_wss_paopao/main/mcp/mcp_server.h | 137 ++ .../main/websocket_rtc_demo.c | 57 +- 54 files changed, 1767 insertions(+), 130 deletions(-) create mode 100644 bk_aidk/bk_avdk/bk_idk/tools/build_tools/kconfig_new/__pycache__/gen_kconfig_doc.cpython-310.pyc create mode 100644 bk_aidk/bk_avdk/bk_idk/tools/build_tools/kconfig_new/__pycache__/kconfiglib.cpython-310.pyc create mode 100644 bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/__init__.cpython-310.pyc create mode 100644 bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/bl1_sign.cpython-310.pyc create mode 100644 bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/bl2_sign.cpython-310.pyc create mode 100644 bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/common.cpython-310.pyc create mode 100644 bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/compress.cpython-310.pyc create mode 100644 bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/copy_json_data_csv.cpython-310.pyc create mode 100644 bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/crc.cpython-310.pyc create mode 100644 bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/encrypt.cpython-310.pyc create mode 100644 bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/gen_code.cpython-310.pyc create mode 100644 bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/gen_license.cpython-310.pyc create mode 100644 bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/gen_mpc.cpython-310.pyc create mode 100644 bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/gen_ota.cpython-310.pyc create mode 100644 bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/gen_otp.cpython-310.pyc create mode 100644 bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/gen_otp_map.cpython-310.pyc create mode 100644 bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/gen_partition.cpython-310.pyc create mode 100644 bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/gen_ppc.cpython-310.pyc create mode 100644 bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/gen_security.cpython-310.pyc create mode 100644 bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/genbl1.cpython-310.pyc create mode 100644 bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/mpc.cpython-310.pyc create mode 100644 bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/ota.cpython-310.pyc create mode 100644 bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/otp.cpython-310.pyc create mode 100644 bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/pack.cpython-310.pyc create mode 100644 bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/parse_csv.cpython-310.pyc create mode 100644 bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/partition.cpython-310.pyc create mode 100644 bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/pk_hash.cpython-310.pyc create mode 100644 bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/ppc.cpython-310.pyc create mode 100644 bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/rotpk_hash.cpython-310.pyc create mode 100644 bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/security.cpython-310.pyc create mode 100644 bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/sign.cpython-310.pyc create mode 100644 bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/solution_generator.cpython-310.pyc create mode 100644 bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/steps.cpython-310.pyc create mode 100644 bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/xts_aes.cpython-310.pyc create mode 100644 bk_aidk/bk_avdk/bk_idk/tools/env_tools/rtt_ota/ota-rbl/__pycache__/aes.cpython-310.pyc create mode 100644 bk_aidk/bk_avdk/bk_idk/tools/env_tools/rtt_ota/ota-rbl/__pycache__/aes_tables.cpython-310.pyc create mode 100644 bk_aidk/bk_avdk/bk_idk/tools/env_tools/rtt_ota/ota-rbl/__pycache__/xts_aes.cpython-310.pyc create mode 100755 bk_aidk/projects/beken_wss_paopao/main/mcp/mcp_server.c create mode 100755 bk_aidk/projects/beken_wss_paopao/main/mcp/mcp_server.h diff --git a/bk_aidk/bk_avdk/bk_idk/components/bk_cli/cli_ota.c b/bk_aidk/bk_avdk/bk_idk/components/bk_cli/cli_ota.c index 8e74673d..99df39d4 100755 --- a/bk_aidk/bk_avdk/bk_idk/components/bk_cli/cli_ota.c +++ b/bk_aidk/bk_avdk/bk_idk/components/bk_cli/cli_ota.c @@ -113,6 +113,9 @@ char *https_url = NULL; int bk_https_ota_download(const char *url); void bk_https_start_download(beken_thread_arg_t arg) { int ret; + //退出WEBSOCKET + + //退出语音识别 ret = bk_https_ota_download(https_url); if(ret != BK_OK) { os_printf("%s download fail, ret:%d\r\n", __func__, ret); diff --git a/bk_aidk/bk_avdk/bk_idk/tools/build_tools/kconfig_new/__pycache__/gen_kconfig_doc.cpython-310.pyc b/bk_aidk/bk_avdk/bk_idk/tools/build_tools/kconfig_new/__pycache__/gen_kconfig_doc.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..508c2c3bd56a066c4c55301f8787154cf7cd93e8 GIT binary patch literal 7604 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 literal 0 HcmV?d00001 diff --git a/bk_aidk/bk_avdk/bk_idk/tools/build_tools/kconfig_new/__pycache__/kconfiglib.cpython-310.pyc b/bk_aidk/bk_avdk/bk_idk/tools/build_tools/kconfig_new/__pycache__/kconfiglib.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4bcac75f490ad40a96296e9a30d74cb91c987c38 GIT binary patch literal 158625 zcmeFadyrh$o!>Xz)AK-M0D|CKqNuCkV`eB|h5)G-MNk4kki?1rC;$|xrnsY?xp#mb z%ya{{djQUGKue-l+SNYv+J|>n+6DGuTWfDpc9M$YIB~^EB`#M|PO4I_a%UaKWhbu9 zCVwQ}*a>Yf^ZEYHO=hd#ovAE!teg! z@X$ZdkMh66{P;9~-Jcm58cK&6Lun^#yK;XJ%Dx;oYv ztLUBD%J}N8#;({!luZ-p_e5t6jf8ec(oA`GLlR>2IVDrVsJfL+MmH&C{uL zCViOmbo$}+0Oy(XU^>hB;dCy2g!6~fL+N482hvB=$2cEMKazfw^KAOD^y8f8(odw1 zbABZKWcmc>L+O$9NzRAUPo9O=_&L2sSr_XTyX!>mW9OsXvC(<9| z{PFZN>GPaFk)BLXaekbho=#t&r=Lteo1Wp$6Y1IX9OonHi|OY$KbgLizRdYk>F3i1 z=TE1vq+j5CG<`Mwan4Vr^XV7UX1egb;l?rMc`;4XjO(Yyq3p-LRayUJWk~-S=6t5{nd~z~sm~9!D_4iI=c)Jn zo7FEIZk%kKYMgGo(D-cQOyg|hT;s*Y=Nd0HUT%E8(P+HV_(J2=#*a7V8((ZR8w-ua zM%u_4OO5l53yoG|xpA?v(pYV@8=c0b#^pxd=r($dwZ@gk)y8X$^~Ofy^~Pr7TH}q@ zP8w!-lzvQ>^>%Q_sto?YhnlUdI3r&Q-}SF*M2N_I7SEnCkv zve&cC?2Ysr-`n-umE}Lx_)>PU@#XAH<15*z#+zBU@zt!|_=)U`jjv_b8eh*YG=4H` zHGV2p?5EP7%f69*GyCcETdmQ?&oJLVo1Jd_T(;Tx zX7+mHTiN->x3jeIo$P1RZ)ZOT6u+5%C;L|V-R#?p;ydXZyz^boKhN)9;C_X2l~%3s z^V#RJpUYm#zLUM2eLMSn_N}aueX}*v_=W5jv(woN*_kZO&S%Tn#jIzedd-dK!rnJ4 zjbE}dn>-yneLiWn(2NY1fzX&T8T-Or|gN zdY8J7&&^%EdUf_6McTg}=%du{IG!dh!3oxA9Ia&V>DKEKvH zpUw7O>&?{N&9&T$Cf)UJFI(--*6U}pEa_dyk_(;H>=LDuW-kdXo^SOotS!tgc2?)s zR+gG8t&J?7D-BcwY9=e4_W3NYcRWl~XRE!Kg#id6hYrs^GW*B@YbZd2;#~%7(7MuW ztuz-_vZU3n`|eY0_H)P2oIP>+)Pdych1TK)2iNH*R-4P6{K*5!6RWMZySUWsEnawX zCh4tRTFDM1+3fk*`t+g02NIfmWQGpaU+fCxrLNPkM*V!Nz4lt-pqgA|xOVqs^J2Et zqC352em?7U<1~lq{^8E``ZEA(YjXzx-35?fok91qe5nb@z?@5Y=SnNh(qv&>uhbpF zbi=I9#lG2~185eT?PP(uyL4%##k)3=jNxQ?GQ}(=&DE)-lh@UUDSL4$S?je{TD|qh z>-8jgAi2solY^H}AB>ZqH?Ph*1X$~4Iq1^^(Qb+hbE{1-D(B=tH*2jVn~7`vUv3+& zt%H{i)$1=c^EOlccyg-KOD;9LHt#%1dL4d(CctK8C0T4TD4UY2Ip~|X+3pC2Rw_%u znip2Grb=bJu*&2t*$b`~cu+TK(}qC4KAW8ACEW|1wH4-#H}ck%R&zyd+T;3av%S__ zSy^Y!yGg4z)lHVyy1bh#taKJHCLL;q6i_{jubpLSSFci0s}1OTOlUi6It=P)PU{bA zH9sEElVYB(Y)2D@@qDLqF&Y~ra;qy5#ywFQ;g+&fGbKztM>o?}o-Ot|Fo|{(R4V{FCz{Z0 zoo~06T7VnCig0mn5!5^YjuOSSNfzNE@NL1)ciyUIWPnZUGd*CGu

}*vY4lJb^&A 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 Z-xQbS^feTpW~Icem^dl$m*+p7`Tv5BBU}Ig literal 0 HcmV?d00001 diff --git a/bk_aidk/bk_avdk/bk_idk/tools/build_tools/part_table_tools/config/gen_files_list.txt b/bk_aidk/bk_avdk/bk_idk/tools/build_tools/part_table_tools/config/gen_files_list.txt index aa7c49c1..06238673 100755 --- a/bk_aidk/bk_avdk/bk_idk/tools/build_tools/part_table_tools/config/gen_files_list.txt +++ b/bk_aidk/bk_avdk/bk_idk/tools/build_tools/part_table_tools/config/gen_files_list.txt @@ -1 +1 @@ -/home/harmony/armino/LFV2/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_packager/partition_bk7256_ota_a_new.json +/home/harmony/work/bk7258_iR58/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_packager/partition_bk7256_ota_a_new.json diff --git a/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_packager/partition_bootloader.json b/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_packager/partition_bootloader.json index cdae4920..5d5818e6 100644 --- a/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_packager/partition_bootloader.json +++ b/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_packager/partition_bootloader.json @@ -12,28 +12,28 @@ "name": "app", "flash_name": "beken_onchip_crc", "offset": "0x00011000", - "len": "2584K" + "len": "2856K" }, { "magic": "0x45503130", "name": "app1", "flash_name": "beken_onchip_crc", - "offset": "0x00297000", - "len": "408K" + "offset": "0x002db000", + "len": "1496K" }, { "magic": "0x45503130", "name": "app2", "flash_name": "beken_onchip_crc", - "offset": "0x002fd000", - "len": "136K" + "offset": "0x00451000", + "len": "476K" }, { "magic": "0x45503130", "name": "download", "flash_name": "beken_onchip", - "offset": "0x0031f000", - "len": "1792K" + "offset": "0x004c8000", + "len": "3196K" } ] } \ No newline at end of file diff --git a/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/__init__.cpython-310.pyc b/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..104a936a2bf70e5a5a370d291e7ba4dd62c9ef30 GIT binary patch literal 291 zcmYk2O=`n15QQbXO`MP%#GzDB2+1Op&;xYQWz*hGvW7pHM1N(T41L(t+8)eBc8z`y^$4r5Gt` zq>K0RF-|OZK?P-W90}95$XqxP$5IQ|*$~H<;DJm3OSehG^|4&z4qR2~2K>}B*ThGS58^};C|JOfZ#1%PMU#bVQ%>e$HF O^kkoYq#y-NJ)?icR!ohZ{yvyX2)@} zT1!abinzg{L~<@jJ#gXg;4hdfr`)+viI(@qA9b6GwdT#tn>TOXy!U=@oYrb(0^iTS zf7bugBjhiftbPVe?nBGI0Ky2P1F}Es=|0tSW8Yu~GY95FqI(N^i`hSreVaL~1iiyt z=0RU#^Z{v>&p{K}JEuUKRMGdkCNkz9*g#xppF_+31|rD`nV5z71kOG+CKfX$wxos4 z%oF3M+QccGsZr1~O3Alimj%BQlaj=}L$d2*;NtH)XoUqDtbzcw3;PKOt3%kENpH-1D=jm-st}es1|Y%vYpoC=WLPKgeDVMZPxYCZU7_W(tHT zK?no}q4L=}2mRdF80;s!LR5cIVl4 zdZ0`^w~iOrR{`U?@+lE-!v&u4c0Y}Qgd$Fp%P#t<&x2RcoET`$G62_zET}z(5rm6MewV>zI&qYMc?kg*gR$AQlS3%tJ%m z(i}^3F#qj>0(CI|S?Sc7ILU_~>4N0PTGCremM=)Y1CkYx{7Oq!my)#$l2wqfSsk%< zs;!X@yM#ECrNYs8YZL~q0XpWKxxIfdldVM*km<5@b{P<~GjR)d>cQ>2!YfM5+$FGf zg>ArEV^WsoN0p*fl-X6b`8v9E4ftghTdUa9tG}(Tf)}f79q)x0)HvMQ6PWh-Mvo_4 zgp&J<kUe#Zx~mnC2vNvIf$^nc@l%EI;h*8iwSVB(Fz*nH!SO7g8J zISL06^B39fhg})Ll>|N;c_Thr-d>w69As~z^umuT^-5rl=j+QAbfWfAsIFh1)JL|Z`!eS&Ywp&31ucIdHKVWxAzD3)(PT%|+@$xqu$%I+P9L`|W@0w)Kzr02Fl5Ws47egXLP6 z2~^MM#FOwS7w{Yv=7}{a7v(8E!^f~Zg$Jr|06KQzo!J0QvmgL47avcZ`qo~)0VxoN z;&>S>9gT=f;oG*C-p;T48-y)@FvqcQGk|gp3L04bqV5;Vc|2)I)o(JKSBQ<9%4qFmEiVuP(T+LB*#qZMxzn zbhAXb4I|}r(-i-9& C>w>%h literal 0 HcmV?d00001 diff --git a/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/bl2_sign.cpython-310.pyc b/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/bl2_sign.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc95df254a3a07acb169e416ebebb6da45dfccf9 GIT binary patch literal 1696 zcmZ8iJ8$Dg5av=8NlDbhKHG6F&EnFW0@Jb$+{J};2=XXn1i4gh2#ULw7?E6Ix%8a~ zs=EA!GzSAonIeB^+f>)3b`fNDDLTqg;OxwBcIWZUj#$6nHQ@R6 M+lKL%5_TUG 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 literal 0 HcmV?d00001 diff --git a/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/compress.cpython-310.pyc b/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/compress.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..886c66a3546c59a05b2f313cea33765dbf89c9d1 GIT binary patch literal 1514 zcmZWp&5I*N6tAlO%=hQ$pa{9fg^7yeE}|kk3JdD)vRM#=(sa5inKqs7Y;|SF3DqFP zyEi>73(3)g|AR;Wh7!DZ%5{%>(O2D*%*b|8uipFB?|sy(qLW&!jNtp__q*r6Itcxv zjhi0<<5QUFJ0K{cI6|Xh#Uq^CWJD;TMr1rj)Et@AqV`W{WKldseP;(==>86a>|=%B z4$+SY1v=>dI|8Ky^9*MC0*F(T5sEW|lFSt7d%PhMZEa#@GHim;)Yx~R(f8Vh@7a9`9mby_WuEy-%Kp3- zHDp~!6itZLkd0@E)}E8BDVw0xr2(=bO{mezTB0ReYt7Yp>#}l)QrT3tfE0PMc7DR9 zZ0}E2R3Y0?L0h(E4Z6^gWYd9_8yu3+KG8eu$SI(3P zjVd!)uvnRM4O){ZNw{jAJ^1S3qtAy!@9vim&c5)5BjrTNbQ;D}Wl=U>PL-K5HdEI4 zQZR_fnNO7wK^!|3d>IIxB!K-39tx)FkjqO09xjAOL#`aYjJ;q^mF+JeIaO8=B`ND4 zDLafOVZ@Y^EJd!g_xH82;o%}6{drIB`1qZRoxrjIE?jgGW`~WiS?-BWBeM-GU(-en3!N2Mj7^+fRY^5 zb{D%j?!wxHT{qvUVzP6O-Q3>=l>GbfFa7}}=-a#v3vXy~3_{sZ2%MC+G@>ba8*YeG Z&2m4QCv+LHPxRAIs~~hj7{nx1@*ieZq=Nte literal 0 HcmV?d00001 diff --git a/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/copy_json_data_csv.cpython-310.pyc b/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/copy_json_data_csv.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..df1b3a847a745eebc592b60a3b8686d80bdf7853 GIT binary patch literal 2787 zcmb7GOK;pZ5GJYTY9DqT$Bhv;bMVAL7Jo~&;UNvhaxTlK^A3O_F7t# zT00iBmpa!V$fcK}fPL(txBePldrE&oU+4_wwYAQps00p&!_jcWnfb`H+4KlJKm2lM z<2rD^;h_2$Ft`m(-T}f1r#-S#_H>2nF24%D;77o^@Ob0 zoGz2L{Q~Ter4VWLIa%jJkVXV;gWa08L&0)s!{j!1z?Q{bu;r zl3l;#R->&b@dsH9QW=W4pUG~R_V@iwnI=9DvcM1JZl}Mmz`r<&GvBYl^3nxjQ=49* z9?d^^!@hP#pM?}Y89gmv(1hOKU6{$pCOw4R-Gn{dG&nsnhICA3at1P%S%)?^3i>1Y zi5*c&^w=!e$=E3giOW?^!7mhc)hZ z4IAK1vuJ=f&7yhODqP%|stwFW_@`g1R&<8WEaj71P!wTV6djCu-jGo^5OKEOfzan3 z<}YUE{LS3MEG~IPMQ#nUwT~CtRJlHLkhUK6pJObi#h646;;L!eTECgPy$AIkl&nYxtjj zQ2teJ!SeGr1?Kw;B)JQM@2)(8Kc#!^31NXu*g%xIna0U!fh(t%uCK#3>PlB;+K&>@ zftV<>mj+x}eGw;_G9WI>7E!<>q3k^f74)^TPxoZICF*G19Ys#LqqwP>u4@e8F^eHk zjbqn!K$IOPs30zDBd}H}Zeqk>7q%hNYx}AO0rPi*-XIb)sOY4S4fxsnFgm;Y=U%au z6QC!r0-2`MbdpU%^C(a{_xF_L(H1q~b)jznou=%sxj(1s9*i#klXw4T*v1kH_aB=E zpWlHQ1DaQXk8un>Rgf}|7{JR}iTN6UGEM*r0nDlZ7LM)0Jefy}0Afc}Jk-`5gfHL` z$SCj(0Llc=a1QAAB}4)^fyU0UwyAm4W(D|20oaxiWL(s5*Ov10B26cWL&NuX20^c!5qQ9gE|LW#cx9*%L_~oIh-a`q z%U$A8*KS_GhRs( zXN?8|4m}mpQx7c#?=gq|2mMQQ?P>cb^pZY}H`Ggs&od`ku<&XPE zdp<&c*$_f_zo`3g}!t!D#GhX{yGPhwto-yztvZptJ+~9Wb!A}Z-+&i{DyvqdSGCD zgc_`U5$nYVUz~N}W)^!hQKnqVF5KTSur*qkkJ z{A33EVbAbHaX2k2MrCiuxRU21<3p6?+yrH%8mBd+=SoeS71Uz1krn-yz1g~$J7h63 z7=D>?L^2mHByECO!sxIXtsSV4!Kvw-gS64|3W<+k>pzeCN9C0Fj}kF0iS=$&^!SB1)$vtDu6^#FQRaNxohYS3p6N`^M0-m@QoZCan{q7&l1I6IQseUl`GW j!T4!8g<>_U8yvQr!V;PAll9Se?7JxKH_~Qf`z7)(wOLd` literal 0 HcmV?d00001 diff --git a/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/encrypt.cpython-310.pyc b/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/encrypt.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..90fe6862d6f30061b4d3221562c091c600918841 GIT binary patch literal 1267 zcmZuwOK%e~5VpO~h9r~{0YV&lBnUO)%>g0ALtIdiC=wz!4c~Qg6@!Z_yg*Y?KXAv$`1-= z5B-yaf%5>wTmp~;SAi9%U>`|Y*#`|(v6hQu-qX{O?M0Bg8fXU~k3h_AfP%g83&IHq z1z{jwftFu*fI)%Lum}L7A_R;Df%0^_z2^LZoL(#OdWknmyy?O;@28n`4Pz5+c_M_C z#<*ylb2CUsE>dG#CImw6j`!M;^Nq~yUD3sg9whcpkYKL=tgzU_LUyG&`gb$ zLlHpkQGUg(K8nu5GEyCl4Ut4lJp0C19z~20zoqrMcS@KS~Qum5VFWfjAc;}X*V{U$$f^- z?bxC3(P!Y=DX-9}M@m-gQsCWp-yM&4CrJzjA%gYo*SqYugU}yi>@MKY8Ep9h1Vt3* z=n7GXx;ehAwbN*~(Va$j8|^jP2i>9FujneE_yP^Rd&r2+?=i?B*7!wY?Co*^bYQ=S zEpI?5xZB*jaWPWZWZF1@9O_ZuB9{iVXHjQ^z|*DP2Hzp&(Ev17J`LCSd+-CT(M@mT z-Z?5{i z_7*k~LJ?Nzr?$j4m}Io76F&dXQ8#9NLsw&|vCz2uiK-)b_GTsz^R8)_vF;nXnX4Yy mQ`^z#Ui*@5e%tqsFvaNL^-R!t&fb_mMIM5Hs_^a;IsX8Yg(7+Y literal 0 HcmV?d00001 diff --git a/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/gen_license.cpython-310.pyc b/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/gen_license.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6d2ddec2645f6c645ecdaf8f36581d3fd99d8cb GIT binary patch literal 990 zcmY*Y&2G~`5O#hJ5QxMHiQ5nk5GjqTh>8kOMVc02Q8`kaQni<8V^8c=?On6GuIoF` zz=;>&zzg-tTX165Nz-=Z{rPrhXTNV|ExX;0L-zB}VRF!NoWB;_wkgfh!h z&P0e%a+A~-ZNd!eAm^JPa%mX(Gdhu1AXoQ2ftf9FAWMwN-@9&EmP1yP9!eFv=~|L@ zPrS*o9~|!x@$Iowk)qb1@O!}($zE2#a$**;CGkyJ2~q)z71ExOmU*eT;UXS@mMc>- zg*DxXYoqwGFb`64E3#8Hj#I#*T$5#=_i7_BoHpiTX@aIhi=i*=46U-6LC ziMU`fLM*RP2@(Z4s*Gz}UQHCEnpDa&ZkVap?q0=Rv8>bFmY6;UF$z@7romQx0Fe~0 z4P-Lns|vVz+3j>YuX4rWjDe)`Tior0^lTqkgV2PUZc}F*dc+OC-?(|K7n^eac9ebe zb@wlE6Pcl#FqKJBxusN>?(*{8Xm5YPXM6iJUoalowFSFcj}{s!Q|+R-TC8VF`ztI8 z!)aBAisweVr04d^VP4%liP7BR7nYwT(QYV9)9*KxIBwrf4w+32kdVoZY~Rm zZ{RCl0N{kvlvyFYlg`t*62yn6Z^@Gwd^^1|qF zx+AIbJT1B+I}E4Tz8Hus9IFJlMJ$t%D!P5(3`ggHOfXw7YMfpmi$h67e4n< zhpO?~DeNHi2SjcgN&TkerWS?z8;juS$E5QAqpBwGn_wvbyCd)^$QW-`0iOfC&60jX z%AjX`=zUq^t!JdFz3K4z52C{Qezf_&E%5}C*9PzlDal>~+JbU&9WE>B&xDdU%yb;n z?n`k9-L+}j0UCs@Jk~Z(V)dSCmm8T8$r|X>wKb@!I3CIM0Bv9$*}MB>a(7njwKR{T zv{+yH_u%AyoM(k<7b;Ro+)gspUMhB%_}=c5z4q7bw-TFLHc-3!L$6l|bvX~jWFg{Q zilS&|xoSsg($55c5Y#7g@qvg3ZS1VLI0VL>*}?o!$TS*_%sFjuB@?0DEfJ5U(DwGL zpT3niGn3%$ z6X)YhNzWJobDAa+ldK)coK)IIHQE9V(|X{fOpD@OC%*}t;!6Mvv`Opcv#AYx6Gja= zKKu~gH9VKv?3SU~J2Q+A;p&xlo!Bea4DUgVIh!pUUaYx!b5;RS&|olwOwkKysFMCp z{$OS*END3f^JL+4D(94#NyMJDHYeVO6p<3`2|Ie!scY-|A2;MZ(54+O_Q!o~=a6rc zZi&_;I%b{TP7oy{9^ftu8dHGoNl2pjg@GK@)?PbJ$FLXA0p^d-Vjq@Qqr^e-} j^Qhp4apQ&=D1U93^KmNHaS95osn2{c3Z-Jc-TL$&tu%?r literal 0 HcmV?d00001 diff --git a/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/gen_ota.cpython-310.pyc b/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/gen_ota.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c15f6c38e85b4042759e7866e234bebc39487472 GIT binary patch literal 1314 zcma)6Pj3=I6rb5YKq+AV>&2wn^nj+)7#n-gM!H=a(g=iNwe>KeI|JRY?2_4~Ed~qnSn+- z8XX7j*a$})JU3RQiGk&zy}71JcQV;0^OGDTC2{WV)t3zU^@ zm(4FOJzMeT7im1o=4O3b{Ym zKD<CKEmio1DJOv$s6%kPqnT-NMi7qXt1l#UEUnk2W?$0d!3N<3{8GdpIF z7op!Lz#Eb9dfM0$F=@Tc4uxEvT*{E)-p#C0*v%KsjpUe6VHiU5>dX~k$E#Fqw<2`P z_8Xv%xE(Mq@4kr1x5E!O%(2oGdZS)vy#LBD*W%53kPL~i7nF$QAA->c%C^IV3W&gE z5v`Rh?h&_CV?uLaz~_iR0NP(Pb>P)l>Y&7Hp4&_vdAyq1uRedevP$g2$|~5TWK)Te z(qUiAW8is?pJMJI>0A4(%3RV2Y(RaB+x5UtRRDqVPwGuEJ+O)8xn;XT$FQbI2|pz|utCH5f8*aVI($xBRPLLh-E4uq-z#a5}QkzQM#cr+t=T5+rz zRZ(TG6r8vKRnCzE|AI3=psyS#AGvVg0U1x-zVZ|gVx-s??axm+Ol`{u_t zcK)0vy?!7fKVgvLWWMsyA zOkxv^b7Ya6BO`sxn^U|s#pkAYdy3bm`1}-K$oS7HLOax<7?W?w_u3;$Ny3+6J>z2? zqc7h%vN0-2j&y`074A_^HHKiVC_M-ZpqxZpDd0EN15AuA%}!2PI!~llez~Fe<1uUe)A7l*$I1W zWyj^cFxX$gKD#UJ-K(wjO~<>tzKOKsdZ1*E`yfTdiZJw}6&5^jQmV~%S>OzWhtjCS zy}pQ6x+n=nf4RRe%h?EUNQ|p2L^W(|YEy%ju&thW=4e%~qK2PGqmD{d_M1gw0pDcO ztYKnt(%@t}&_<@9hd52EqEC{Bd5FuvoV1s{Hi$ps{zfESpS-GTbOD=jO^Gx zv>uUBKF-6HMKUTNE+ZCC^k0ESI_eYBCbUkGuEN?_nmf#)=Nw$Yk)9UmI?7d~8;FyU z7LfnfNaM`=@;`W2UX}N&Q{IdJ#d~o5l>DT5`Cq>)?E87l@g}_Tr8X)F0@vU=Y{9Ev z>R(+OmE-bZAug#pCpG*crdY}Qa6=ShdO*J=u=Tw@sw7sGWRAUtn!>SWCeh3!nwzL8 z9&4(Jrm8d_;#O?nbD-mF$~Vc^H2P`}D(Xm`k8D#@rK)%@H(#VFwR3RXI&v&bQbiy%x*5~d${pA z?oK-!+;G7ipoFuCWubi9xObYgc~4fieK*>1Toz>>7nDZ`_X0n3A@eDV(cUqG`~3U| z5#!Fgea5kB&YNkz7T!}i^u)e%OK|`1(%Y_ZGihnkfh?csIl-zf(tPXfkKVk^)uEpr zQO_YYG*uy+vivxJUA8Zc!0j<Xqr9Zxx#SEM8M`%GHsP7ES` z1qUdtyRYB5{q8%m()ODU$Kz+$*}+^ZzBR$~CzEK@RB!T&V|o?oXU6mfMwyLyy|ww6 zUYnpdHhCWH@or;z0kA*}&)^pwwmrb3yAuZ6UU&I^gwfMINegI}3)r6T1#Eb!aJiP` zu!fVMhB>TxLCyDs@L7!o;JLxI;ib#9lR^BG&17JIx2cz<5%yWYD>zg>gN?KXeM}!_ z&h4WDWZ~{aqSUcHkvO9h;sI_XVVHo6CE`uxNFB}6#B~<2`mD6oTvpZKD@s1oAG9$j zr_XxMwuh^_oG#AsLYKL4AQCy4DkZ0qo1%T;8jG^HHwcmMn#|USifm=*006| zTRV$anCYjAlJn@p(lX6iv_s2dK9k$Da;g+PoMM~ys?ds7r3Gr?qp+%}aTloe`NiK$ zMebrCbu%fsv^rrAFL$`xrWdp2$JI@$m>5qaO5F>2k}Z1+*Ydz;H`E<9QhyW11JX)o F{sJpLNHhQd literal 0 HcmV?d00001 diff --git a/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/gen_otp_map.cpython-310.pyc b/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/gen_otp_map.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3335db0b6669eb2d3d34413025624fafd1690fa6 GIT binary patch literal 4492 zcma)A-BTOM5#L#TvJw~@Y=d*L=iuxhZ1Z8Czs?*v0m4Vl7LI_}#^yGQW+XOV?TXzM zhP70c6s}70kg7bTQk8NQe!PeLL;IS_gZ~9rr7qpG(f~f;M5>+nZTHNtdwOPiMsj+4 zH3dF@`{&%&zfUX5zwqVgM}?Pf;PJkNf+>tx%6e3jbt2x?byd`{^%zrG%!;onP{*xA zExDc~h+|d?WC@mhqpYVHSy6JS_rRtU-xDZvBqZZdWUAcPEwjvRkC##1`SbzkfhPu! zr^dkz(o%foKxr!PNQ*Rymto3^QdL^2PYzV3z9WBD{8*FxQK=9XWAQg>miUX>iZx>k z%Eq}?{7=e3ycvhSiDu#e+ya#Jlg)TDxv#cTP4ytvOuZvS*}mwfS&F4Wn)Z7RG}eRC zX8IuGXZOK&gqbE$Mxv}ly%P0FbV{OriB3y&Mxp_U1|>Qx(K(6EOEe_WutXOm`k6$Z zN%V7x4trdbvP%+Ci9VNTM50lNzL4m$L{}vGg+ybBV9t7)D$L3z#2w+5V5vU5DQNAe}g_6}m~( z{X=0>Z)4J%>9*`f$1dn^zD-E|mu>y6BYiru+mUShy*uSEl-(By@;(fxBL&~rM{(T+!=MS)1_RBX4XxmZRC;Oz8J$&D| z5=D)D)68ZRmLJ02b8ll&{4jce=7+Id5M@D>i^EDKaZYLV;<%b(9siYV|6Ppof%Lf( zg>R2UW~uGUo#Z9hy@U8hmUytVrS2@@`_^4%Yl4_lL4PK{4)8E(z7_a!m_|L7!V&Tr8CI;@ZQ9 zl+v*y>bd+%fnKN6IXXE$K0{ZxIITOt#~IyhR4UZ;sOU95sRh67LZ4q)06S}|`tqV) z$`>CLy3*fh(}P3QV9e#7hs;jHr%r{shF#?pEqpwH;&SBw<3j1t(#p!xauM9`YT;(v zLecT*ma)Sr#Ea3oYwkdxf&C=OjN{ALAt>_3V?xPx7VW5>7=I z;(J|*Um31#+Ew)V>8GjNbKH%3da66O>-;~=i_4|CrG@U%n4Zpw-FrM5702B)MVw!J z(&xqe63%AVa7^DoW_q01@wZ@dWw0N2VP7gPt?H8aME0AK-Ly@gRt(d^7BAU_k4 zz&*PGd1g;=^h?h@-))qAEl|PzL1b<~!oGP!_bIiF8V7q9JJRXfC^alRXkgRno*AHC z*u`Fv-l*d81ZU@hVk5KdVA19=|AHo)8&O%5HKp)Sbk zuJdYa$1zzBT4eRIW68JC6RF4B{h>>A?v{_Ax#eKs@XQ^Fj^Pn4_~;;pbtMks3)+dk z2gwasE3dU<7a;uQgcl$W9}2}E;QF(Xfmp5L|y$w;!4n z@xown8!kZV#8jx7ER18U+$<=gq8CuuGXr-I$h_|C_weeWDfRakm0&POT2t1h_;xF6R}pREYtJDEFu#YzG0Vn zn29`!R4G)!-8oFu3?J^gNyuQE+zn$O4@o6V0Wk*EJ&(Q&p)DbT1ro+BxEDq%0{>5N z#j@!Cc=|J-@(!Sg6OF{xI6N8|Bx!iVZifQ`o!;{u7f&tyH8w2#(r{!dXXD#X-;Ntk4~_KS{3wujg#A{gnJn!_3vpT%Dz9`3F*xEX!3P-oTu0upD-82|tP literal 0 HcmV?d00001 diff --git a/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/gen_partition.cpython-310.pyc b/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/gen_partition.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d336962f67939c9283ab0d0180e34e831e6fbdf2 GIT binary patch literal 2816 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 literal 0 HcmV?d00001 diff --git a/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/gen_security.cpython-310.pyc b/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/gen_security.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..33a9ca04c2601dc5105e9e67ccdd752c6e4c54f8 GIT binary patch literal 1961 zcmZuyUr*as6!&$U#F&`zr|noPtrm+6Pk|OEfgp(9ORY8|;z)~pR zAfP%5(K8^^4eDdtGO6Ry;Gbne>y|^cxBG?adt5B-?c>7!-n(+PyQUeo)o^qz3r|-N z8L`Vw zZ^jWn(@*dmqMEBwRs)0xaFZXG1Mz${NEaD3e5wTt%a&u>9YVDw?E1!w=8~$6f$g?A z3ATpd%yP$po3E`r-`w(4C7k_GJbHa_P{UQY`?yjq1oOjt9I0q4L{)S#oGTub-|oG` z)l%`OQsNej-?1>wJR`rpxgE^jGxKzjB|+m$;$`IE!TmsZzf=xV+!oT{ZZ_6m<-rIB zf)J#*0CXDqdm>SbGNe+^?T%S;ci&rjm>N{O@gQ3C!Q;- zpsDde6?uy@1iP6~u2QqZEWZ~@Zksw`+IAZa%V~s3LQgyJI)_cl_^1d~kL%J?*Yz=| z&Ou=@;{sF{^XkHvVa#QrL_b-6IB$8lZW~?`8x%O}6D8ro7{&~TxUEp3t+wBTDeTa2 z*28eVyy+5(J>Ouyo(eNjT*widUN=m;9lvhbG?a&Mi0YvfSt~8WWG;4$7X4FTOOW&z zE7x>eG}km(%XNCWbC;dvPS0NDx3;lW+1dsk8y4XhHoEbfi@xjHUXD6l9CN4ij5@gE zTY!2dv)aCwYXCCL;YGU_E{+1&be+1@fOFeag+#ocfXGNevnYckQ9%;$e96G45Z_Tm zPG#8V^o|1=b|hFcfX|?eIMf{IfrkuY-$4L9&F0|6z6HYnZO-uD7JtE%>9(K@>Px# literal 0 HcmV?d00001 diff --git a/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/genbl1.cpython-310.pyc b/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/genbl1.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd4ccb151788abdbccf74b59792df31f39213d3b GIT binary patch literal 4570 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 literal 0 HcmV?d00001 diff --git a/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/otp.cpython-310.pyc b/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/otp.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fddc4fb821ac220d778f059ec20d92fd467b67d4 GIT binary patch literal 1601 zcmZux&2Jk;6rY)${jlpePH0+!Kr&DcMkp4DiXH+gq$xr|E=p2pEumrKnIwblU3X@j zG}ii*UMp@~04X_g;2)YRr-(C`A_VWP>nM>rqxYLPZ@%8X_kNo%EK~`!pa1ycfJTJ; ziIdAMfXQ7Diy(=l1Ja$1v`fo5>oUn?FbH;t=p-V2gVCzQ3hqmJXHG6P54nS>;qFM@Ap&f!bGA^~OfK;~wsxH`LLq4G_Bq zP>@q{My4=I+GnOJ**59{=ncuYiKC}XhG&$5-{3>k@qB0N;ij)W*!f0mZ*Dx?`fBH~ z5AT2e_4cN3pt19ybFnbFnY&SQn2wrrZ<@-O+^n?%AC5;OWqdry_xE+S@56EhKg|A4 z%mVoK;)nJ@K2+_4)C}|NxP6qHetWn7$w#;E2)%Xt4(KA)5^W+qoQ*hjc|Ndhl^u$i zwyXLo6Jw{rYI{bHoNa?&YolYoXq|ywV(#8D#-#?3(1h|*>dY*Hp$BrMF__&2u}uI) zFrko4+6^$FkU}mYnV3o$LEvH^KydE&F!=L^I?4u!y#av9DCik2h@b@nWM$B42g0?W zGwsBl$%mq64?UNuOMR#_sh+|rw`#EG6Ic;@kbNIz#T z8m-a^CUb4R)WZ*(H>~dpNa^AWP&An`2Tn>V*>m<&e;PRYBP#+KNdBBn;ghFf!S9jp zznw-dC?XlHk`p?OOFb_2q|}pDA}c3sS}7_;*e7P)@zb!NzYtk1V!&&^ajZHQ$?yb6 zysP%|OjsmESX5po{lGlBIJfYsb8xD@N??Blw8d58Vi+6fhg|wKgdoT3k&p&rvp1md&(feJkt^~0<84W zjF;yPFi&1<&SoRPX7Y+fu0nrUg241`}$o0eG&SYFCzat7@*Jc?AI(;A1#Dt0PmM zHBGbzCO`7Ac4{cJy!7_fA~Q>{7rnC|18`c0j!ddSufuo)qz*cc5o46m2x_qQ5Bt0N zFJEc=#aAXvSdUlgz0-=YcrhSC_^J@YT#g5**MxX7P6sbn>e`AU`0FX*v>PaM6I>`A zy2OOiU8IA-th@nY6MzJKO<0YWR^Thk?JQdF!6IZKHCC0>OW@xj`s&!0!7I1F>UN*3 X&z$@WYr^7N_)~$-Sit{Fs>{j$-0Xo? literal 0 HcmV?d00001 diff --git a/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/pack.cpython-310.pyc b/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/pack.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a5d8d90f9241166d8545d06bf967fc4f217e37e9 GIT binary patch literal 1815 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%0A%QUzxxzm`CQliqSG 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 literal 0 HcmV?d00001 diff --git a/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/sign.cpython-310.pyc b/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/sign.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c66b6fda543cd230c4bd15ab3d24c04b817f446f GIT binary patch literal 2357 zcmZuzOOF#r5bo~jdDtF%9}of&2~Hp+Mq({Cf^a}l9#W8^$Py4KiZ7#C_w0JS;~A%? z&BADWTCP!Uxsa8-#~kv9`kE8h99I#fs>fcufJa?jUEN((Q}tDivu3kS;P=Ph-wq$t z2>AyWt3L}CU&F|M03wK>3F%ie?NhU6eP(8>Z<(3*xtZ<0Ets$p=O=QX2rlerMA(O{ z?+W^ebetEUkMv$ppdG5|jRCG#f2WqWKpGLW29_Ga68sqjTefhX5wPV74`y4`L>*?w zX!kXL6z`?IlUfeb)+o=?fwQ9A10KhBF!B$;hmw^fASDG#OA9C~IZ&&#fpS3?5Bn3P zb_s8~&*asTjOcSBtRuY5(%NFpOY1o~GFp@~a_3%Y9aCY$jc-(KUKbAT3-<`5l&FUA z4q+}KYH;Gmg^rrhX)W&a#r@FSub2Go`^tx#mS`NZ-HRr9;Ii@rBXUGo9PL*p=wci~J>?dm%Cams@m3%;|dYbwi<9M%&2 zpT>zWY-1wPu>gJ0jY>(i@bF!YxP=%B)l^1sWuP?6a?K~98fvFjfy=57IHQ7~h$F9S<|EX&)Hc9!U;dECM4KW!4@^ns` zCeVJbxVFGZJ`D0`uz(402>l(bW&}=gF?dJiZK)?p(}SYc#?ZHK?zc~P`=)3Y8_U$0 z3c_O&F(q9j81omHBKQP2aVnxzb^NLnE`wCt2QpSsRX120+LhBZ7>tGXWE6@dP9tsS z3a~5RgKdc@k{{whE~ev2$2J(z{^|>v`jQ{xAqzCU0U&uDHW2UmCqR740Xr>#^92h~ z1VCS>mtVH{d0KzP+4@V)764zq} literal 0 HcmV?d00001 diff --git a/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/solution_generator.cpython-310.pyc b/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/solution_generator.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eaa4643313dcd248c75c336b1bf1a3618a889767 GIT binary patch literal 13430 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 OGm<&0eKb=@z5M@`#@8qS literal 0 HcmV?d00001 diff --git a/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/steps.cpython-310.pyc b/bk_aidk/bk_avdk/bk_idk/tools/env_tools/beken_utils/scripts/__pycache__/steps.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8a361d755410692f89e2911cd0ca95516cd2ea9f GIT binary patch literal 4212 zcmbtX&u<&Y72erjT#`$Qlw~*WuQ;vKmT4;4ZrwO(nmP$wG-xXawpt^(Y?hoQwGzo) z%#M^$pwNSQ@2x0M6cCR-^grldGS{4P?u|f=d~bG_B54Jw5fby>%-iA4y!XEO<}qnB zY6d=k|Mz?Qf7vvQ&uOsyF)_H0mi-5U8=MV|j}2~eYsmI;Z5G-pv|VVY&~BkCh4u5rfAE?SO z84Tj_Ksk{RiBLA|61%DP<6#tx!%_6q5Ow@|-rd4`{0x+l6)t?UJT=bt=0jmG1D) zb~hfMRAqk@WV-A3(xY2Jn5HzE`&raG60w|Y_p;-8C6S@-G}BPXSjNdXqj87nP3nLx z2_IWie(qZ@8TaGCRai1Id#wEWOtfKG0f9v`(8$66-iMIJlw36b);?vD;J{|=)SQ~! zyly-(OgLoYduA~>cH79Ve+nn*`w^OU*4kAJS>6w`{il|)lQbGD`yfjohe^nvT7r(B zVtvKj6-=OB0*6Q*GUk< za-m~Yr*$T^MM-&i_Bqk;WMum5fkuYDk0ynoW&!Yi699(&p9_ zAvk9Xzd~)zIqPnA!(ES_7@g-Lq;jyMoz{+|aXInAt|# z1Q&Tz=imyjV!f@IK^$>bFT(EciVf^fG)WM$l?BL&E%fGFsfb6Rm;|G69QUJ465v$5 zw1&gs#S{#JUcw`dN$1w~t?k?M?<~#K4=HNni0e5GiX!D~o08nQsxhXlhkNfT?{NWX z@ExXi3s3}w_z_-z(q23OfHYp_esKtM^i%}7 zpdqABylRx$)vpq_@RV$MK62X|uyri)wtlo&fWo1?5}WIhYZHL=`7cBFCVpPosU|k7W1%_`#2n7*T^wIWktTh>EBB+;SkQ0Gy@(RN45RGsTgy60d!qfp3xFCdD zK?rs3F9@NrP6*-#_Kx#Lp7%w9TPPlgS6~ywZbGx*52<&P#H%DIX~l^aKPH3DPKSE0 zk@zWzpOM%mu|tAVByN+qL*nNo=;qYqD(+J6mn0}{;vNYKy?6_vQxU(SKBZFpngoGT z{02f*3Y>`hWLjhMJe}I9V%mF{Rh|ShPbZxN&#W<=gx}-oN?IKl7HRzqgBRj?liP=; zcuTt6LF&vU4kyN6Bsph%?oygHhc{L^TwkBh^LX{)pC3GW^5}!T2RbQpzn6?s5oNlF zP!_mCv%F5*yh+qSDK6QW#ux0|%#YSrt zuW1^$;{iq510h#uD5cM9Gh^o9wybNy_X~Ew$-lTWSL?QuY8v(qH40CfR2ETH5(%oc zzAm`Rqo2~DQqBGls0_j=%L|Fd#TZ484zbcTa5V0TNh(znHCH5LkRIl@DlxOF!zigD zq{Z#aGP0h7n*OJSGOc$=@XcBfIozoj`9A(;;a|unFm|p9x=U4s3cfV$<(&~as1?US z`DZ9MBb{X@&952)k3yu1|3=CyiAz;V59rU_MJ15~k4hkYsp~616N^5C8Vh<~OAcvx p(XF7ow?_#-8b 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 literal 0 HcmV?d00001 diff --git a/bk_aidk/bk_avdk/bk_idk/tools/env_tools/rtt_ota/ota-rbl/__pycache__/aes_tables.cpython-310.pyc b/bk_aidk/bk_avdk/bk_idk/tools/env_tools/rtt_ota/ota-rbl/__pycache__/aes_tables.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f625bd248e47468a68a763e422b2313049158334 GIT binary patch literal 6066 zcmeI0J8zv?6^4%;Cw7v_aHjwyB)SxkeP4S^2q8Ke3h2_9eVth2*dyB+lA0euGX+CO zfy7@x`~@nvRQU@C5uWuWcF;&bOMz!{ZazNW_pSB3?|RocfAr|Vj-TKB;U~}j`0d^9 zulnR)f9~_-$Nane3pZmo_D*+CcXRjKy|MrK-qZc<(H$P$nfvq3IQVS;>A}4F(Qe%R z-QKVFwnz7FA06I4I?_iU9X!3az2pAv>kn=pJ-mJN!Mpb!&U^E4JHpX+)JLE1ZTBC( zyZ_R=`!Bz{|H`}jufDtg+UI-Y>z^Gyy}$j{H#p}9WA7Kc$KQO-mF<4^r``T;m%MZl zY0IUSR*&8oo5Zy>htwvi*X(+cv1%+qmZ@We>gp=J265dqS)+KDeDZ5a?>^Kxt+zC)v(~J&{BV7k zZvE{1nS@}ahbl7tNFfee#3z$&Sfe}VYB4#7G-u;ynVb+p*Op6C8O0Co6RwcXWrtLMg(9`6N66^}Cjofk-<7bO0g>3vv zW+v-nlvZ-;){Zi#UAbgyQyC@C5=yf(%Pf7y=<-;(S4wXN4NbwN9Be6WnAJ?=5H@WP zL}yB>gXa5Gqt9&xQ+=7)QX*MR`t-hJSDK@0S$xQof`?8SI8=*)GYa0-M4i0n#n4MM zEx1)7g3ENX+LSn<;sR|?u~ioeWog5@D0F)1HKwE&lR!*M+2i1iskqd|gdEKpbF?xb z%*LP<6h3fdYCm#q#^m1m@TM-AA!ZX>Zazelh5@meSFe7VrB5Jc7;mignY#O0thIqg zCmEeC$#Q-5xwwRx#8aFu!MQ1Q_?Y8#t9YS2UE)}YJ}+yl&=6OkvLs5DoSBu{w`m)? zN`8jc({NHKb{(yoH6`~E>!RIb)C|7aphj<-wa%gzCrAY}QI3_xNft_7&2Z2swQv%> z(CJkT7`8C#M47Rfo@Z;#LtgZyBx@102{M6AMsjI_iwy~qI82xEc>nbtj_~>oKaUSy zV+*_2ceuGYxVd?J@b>XNec|wnuWoO<{T1)MeaHL1;&VUb?_NLDn@4)1M$3Ekg^MG- z(HAb%oOxC6zVItvy?w{~Uu^&zT+28b8Vv0=VzMcw8Y*Eh2(v7mrlg)8N1HIGY>Rr1 z?RHos4tg8jWHzwL$_Z?I2sI}+LfIyACqbGIg zfi{L8VW8=QGY3)Rx3MWGkPT3qnrq!$NX z{P9{h5I6w9v1xth6Adj7v^&#k^iPu=4aS9NZRcoe-GO#yTG=_ap@o6=WgRY@3B!nn zC7M-f)TBv{2H{b(2B)Sej)o+fQE9}a362INieD-Gr09-ij#idQMzq-c(U>FlT!YEmReffx~#rc)I|Nw6%6Q7HsI1JnzknY$p4 z|005g0Pr~^5y7>13>}Ou2uJWPZUMLlesK{TOI!fyfmI^&0f-j>d*GJ9)B(B$a2^;% zB6#9-0P2AkO9!WdClLpLO-cm6k{1Aa;FKJ}r8ImOj4TL6@G5lymnB!2~xfEg)&1?`pXspm)3nU&yB7l%2_yma1d5(FO$#WZd75E1O)n5c(-b*x zni9}La}?KXnp_|U!!(7Vg{DbLs(G4aHcgX}RMS9|H%}9!gXaN{**tL}DLfHq^5$uR zl<+)YGMlFn9@W!;G;f|t$WYG(PP2J36IneOsPpFOBm(t(U^knmFC>nq-#}1kcB837 zgDFk2G|SV}NHc{Zl4huEXoF%enneDBhz?bA3Mb(>m_bd6g9T2qal_r zEAi=30!6A6D^rw7F*=^GxV(XXG%mj|BFM^)EDC?wSTwvSFR2p$G^1d#Lir=ULCj(_ zgA;fq^ku-$DbCr(z8YDp0TMN)93Ah;tEKq{mjLds%(Au*)n z@EGzFWK3o_ zD+=HR93lZm28>GMJI*!%#{iZCynti94Ygzf@-1VhbCBvS7fTey#z<=zIqhqW<`0x4 z6rRgukk1w2dU3*q!jl}a0^udf!~r!=aV89V@IncOM(DKaG@naGjFBd=j8G)U#SXLs zVZhb9(Bv(U0$xFzoF>DNjEc*!b_ngoTuAv0B|R=0C3;y5{i8`n-NZF)p!*SV|Xddwvv3W90M4c6AH9;i=MSF3Bg-s$s zz{$W`v3*S-JR#^7f)=s>yosymP_+maQsY2GphbWQ1o%mq%GM)Ti|6oR1PJf|?1Bp} zpo@5%zj1eNgMv~gJasp}z^P6JeZgAZa~AO+3kvD>KYEf;UGS%9ZMwo-KxVJw*w zn@lA&YitAT8)=R9QE;|DUDC)M2$=a=xo`!@FgO?#kg1yxEvC>8f;-Kltj$n_iZx>s zMcsp?mT+Q$s_Ae=IbFjGj-l)8WLW_(fK?Y86kbEDhSS9;Q&nq7)Nm;jjkRJ3%F_^~ z;feM)mg1@*QNtfCB3T-%Ay&h0K^TjXry*6tEBYbLvCN?MO!HV>fZtmdWY3oEDos>3 z#2SH$C7TftfK&&X0YC+}GHwjeP11p?*U?}ddI{0cUL0g-IKf#<2#Cv}>I^Umx8u~| zJ6RnH5dhRx3l8oPjxLF8Yltfmo-&RHJ~+C%sSZ7Cwa5(w?AH`M^P$19Qv(e>%-j9Q$8 zFHA7;#-Yi;jI4p6RJjo#At{f?hwsSV`R{Q@^{#PsZ z_~G?YJ2|VD{p95O{)@9`^X2KudUbvG^0=M9ynb|Y_UXL1oX2mU9&UH@^7?Ljb;aGc zo}aut?&qg3o}Y1dc6n9Lu8yDAtBaGD*WbJO)Bo_E@BG`}bw2&W=PypLPChw3>GkU5 z{OtPRf@A!Cckx~QrbKW4)}K5(e?Ff)s~6AD&t5(G)%nH8Puj<9cKP_^=P~p6xSkAs z?YMsW_FkV}ou8jxKAC5q9>0BbadmZkepR3F@B0_+^huqU$5*wT&dVQs^6L8NhtJQ) zi_`fd{l@6>m)sof4({yl9lSYssJHtc?C;(C$AiNMd-~tO-ya;^Jla3f-y9t7@9n=i Sc<|qE@BR7Ur~7+HZ~h4ld|rY8 literal 0 HcmV?d00001 diff --git a/bk_aidk/bk_avdk/bk_idk/tools/env_tools/rtt_ota/ota-rbl/__pycache__/xts_aes.cpython-310.pyc b/bk_aidk/bk_avdk/bk_idk/tools/env_tools/rtt_ota/ota-rbl/__pycache__/xts_aes.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a1eb457a031f1734c83bfe43bb1ed21debb8585 GIT binary patch literal 2430 zcmZ`)&2QT_6elT4mKDd#ytHYDpdB_~tG6x=3Uuqi$kMIbZayp>Fa#(#MN}IlvgA-o zTO0H#9op+oyC&Evhy6pm?&NcBJFI(;iXFF0DUc!``9ApG?>**=ivfZ5$6w#>{^=9) zH!kLz1B*@Q#iuYxB56vt@y}A)XWNXDABl7%e?cTaV%v_STcqty;4JC2sd4UqzZKzP zzA;#ALNB^7#AKUFvdtuw>;(Y`t>>^eE3nh0tsK&vRnOtTZDJCcA@)|)H=SDP!e)Hq>W zm|C1gYB(s3TRw}!{kCIx5vPxhvmXyt4UU}>g^v8^*UoOgU<8^DI~Uot^!! z@7%p7lArG0gSiM3i8K*Dt^T+y^E@p&arRVHGgX!%FT)P>FV#-kd0rL*>{uHNjW0x! zC8ZD^=qvD|ExJla?^T{yo9;$v{IucRg^n&cYr&w&F*rq&J-P?3KXL4}AHua3#X#jz zTogivWvGxzp`tcZ01skK-wOpl=t&QM#6j+*BdoxARx2B}3j4_^PF z?WiUSLZzlAW9#v$;)N&~?8fR+&F=#P3Q-uhnci~&5xQvF8Zg1@AV!KC6dkdLaJEPo z^Oxi?wMg_!DxH$O0=xjQod@tAyCu`EbP+?6?=$s@c8?wDolr`u)7pid+BI^-9*{?^ zu?J4(+ST55qB$VU!Fd;5?`nQR$Nb>-g~V}9*Q5hdf3CQsf59dFF3Ij{M+wcx{*1q# z)nHwpt#JqRSxz7Ijf2Ww9e`|m!xb`K(19enhRDZVYY*28x?Wj`x}H4BduHDxr7B98J*o~vY0 zWY}O(W!Dv8wyv`2ffz4t!O)~P*b)usRd$s&XoLCm8s&_`oU?$ooMpO1TQp#!<;y(z zMp|IT%}VAvEJ`SsSdbyA?8q5&?Pv}uz=7^qIsh8!B}F>Kn)m*f-xz`|=x10sG>Ezn z%TwC3mpWyJJ~wn&-S7eoem4#KJ2KorD{Lk4$>_7UFJQeokA;foohGQyL7Msk2dnD# zY&O%ZIzYRFbkq!Zb^77J)OUtu94ZwK+iq0=U8~zhSA7g8O+AaBiHc~2T}ZqM+bFd_ z2P{z^;^DK=l}j)4hUu7M7!vz}Ntl%6h>W37kKutur(r(QZW9pwA;tL; z^wH|nSC{2wuU*H-Fbn&!5GD|!pUcA(=M5na4#TwCQCRcs8>aA`sGb-MjnzMA(?#I$ zbwK|Y_#FAfr#|-`_-;083isOF_&Z4!7EzK^Pb6a9Ze1qN_}$914RmOM(e+7#wb*~l C*$u$} literal 0 HcmV?d00001 diff --git a/bk_aidk/projects/beken_wss_paopao/main/CMakeLists.txt b/bk_aidk/projects/beken_wss_paopao/main/CMakeLists.txt index c7397dda..b381c0f0 100755 --- a/bk_aidk/projects/beken_wss_paopao/main/CMakeLists.txt +++ b/bk_aidk/projects/beken_wss_paopao/main/CMakeLists.txt @@ -26,6 +26,8 @@ list(APPEND srcs iot/iot_sleep_helper.c iot/thing.c iot/iot_ota.c + mcp/mcp_server.c + application.c ) if (CONFIG_NETWORK_AUTO_RECONNECT) list(APPEND srcs diff --git a/bk_aidk/projects/beken_wss_paopao/main/app_main.c b/bk_aidk/projects/beken_wss_paopao/main/app_main.c index d0934f83..4008fbcb 100755 --- a/bk_aidk/projects/beken_wss_paopao/main/app_main.c +++ b/bk_aidk/projects/beken_wss_paopao/main/app_main.c @@ -42,7 +42,7 @@ #include "app_main.h" #include "spi_led.h" #include "bat_main.h" - +#include "application.h" extern void user_app_main(void); extern void rtos_set_user_app_entry(beken_thread_function_t entry); @@ -673,6 +673,7 @@ static void handle_system_event(key_event_t event) //poka ws2812_init(); thing_init(); + app_start(); init_bat_timer(); // spi_led_init(); bk_printf("VER:%s\r\n","1.0.6"); diff --git a/bk_aidk/projects/beken_wss_paopao/main/application.c b/bk_aidk/projects/beken_wss_paopao/main/application.c index e69de29b..23d5fd99 100755 --- a/bk_aidk/projects/beken_wss_paopao/main/application.c +++ b/bk_aidk/projects/beken_wss_paopao/main/application.c @@ -0,0 +1,268 @@ +#include +#include +#include +#include +#include +#include +#include "bk_private/bk_init.h" +#include +#include +#include "components/webclient.h" +#include "cJSON.h" +#include "components/bk_uid.h" +#include "bk_genie_comm.h" + +#include "thing.h" +#include "iot_lamp.h" +#include "iot_speaker.h" +#include "iot_sleep_helper.h" +#include "bat_main.h" +#include "application.h" +#include "mcp/mcp_server.h" +#include "beken_rtc.h" + +#include "iot_lamp.h" +#include "iot_speaker.h" +#include "iot_sleep_helper.h" +#include "bat_main.h" +#include "spi_led.h" +#include "app_event.h" + +#define TAG "APP" +#define LOGI(...) BK_LOGI(TAG, ##__VA_ARGS__) +#define LOGW(...) BK_LOGW(TAG, ##__VA_ARGS__) +#define LOGE(...) BK_LOGE(TAG, ##__VA_ARGS__) +#define LOGD(...) BK_LOGD(TAG, ##__VA_ARGS__) + + + +static ReturnValue sleep_helper_set_mode_callback(const PropertyList* properties) { + Property* mode_prop = property_list_get_by_name(properties, "mode"); + if (!mode_prop || property_get_type(mode_prop) != PROPERTY_TYPE_INTEGER) { + return return_value_create_string("{\"error\":\"Invalid level parameter\"}"); + } + + int mode = property_get_integer_value(mode_prop); + sleep_helper_set_mode(mode); + LOGE("sleep_helper_setmode ->%d\n",mode); + return return_value_create_string("{\"success\":true}"); +} + +static ReturnValue sleep_helper_set_level_callback(const PropertyList* properties) { + Property* level_prop = property_list_get_by_name(properties, "mode"); + if (!level_prop || property_get_type(level_prop) != PROPERTY_TYPE_INTEGER) { + return return_value_create_string("{\"error\":\"Invalid level parameter\"}"); + } + int level = property_get_integer_value(level_prop); + sleep_helper_set_level(level); + LOGE("sleep_helper_set_level ->%d\n",level); + return return_value_create_string("{\"success\":true}"); +} + +static ReturnValue sleep_helper_open_callback(const PropertyList* properties) { + LOGE("sleep_helper_open_callback\n"); + int result = sleep_helper_open(); + if(result == -1){ + return return_value_create_string("{\"success\":false,\"error\":\"耳夹未接入\"}"); + }else{ + return return_value_create_string("{\"success\":true}"); + } + //return return_value_create_string("{\"success\":true}"); +} + +static ReturnValue sleep_helper_close_callback(const PropertyList* properties) { + LOGE("sleep_helper_close_callback\n"); + sleep_helper_close(); + return return_value_create_string("{\"success\":true}"); +} + +// 设备状态工具回调 +static ReturnValue get_device_status_callback(const PropertyList* properties) { + cJSON* status = cJSON_CreateObject(); + + //软件版本 + cJSON* application = cJSON_CreateObject(); + cJSON_AddStringToObject(application, "version", APPLICATION_VERSION); + cJSON_AddItemToObject(status, "application", application); + + //扬声器状态 + cJSON* audio_speaker = cJSON_CreateObject(); + cJSON_AddNumberToObject(audio_speaker, "volume", speaker_volume_get_current()); + cJSON_AddItemToObject(status, "audio_speaker", audio_speaker); + //灯光状态 不需要获取 肉眼所见 + cJSON* light = cJSON_CreateObject(); + cJSON_AddNumberToObject(light, "brightness", lamp_get_bright()); + //cJSON_AddStringToObject(screen, "theme", "light"); + cJSON_AddItemToObject(status, "light", light); + //电池状态 + cJSON* battery = cJSON_CreateObject(); + cJSON_AddNumberToObject(battery, "level", battery_get_percent()); + cJSON_AddItemToObject(status, "battery", battery); + + char *jsonString = cJSON_PrintUnformatted(status); + + ReturnValue ret = return_value_create_string(jsonString); + cJSON_Delete(status); + return ret; +} + +// 设置音量工具回调 +static ReturnValue set_volume_callback(const PropertyList* properties) { + Property* volume_prop = property_list_get_by_name(properties, "volume"); + if (!volume_prop || property_get_type(volume_prop) != PROPERTY_TYPE_INTEGER) { + return return_value_create_string("{\"error\":\"Invalid volume parameter\"}"); + } + + int volume = property_get_integer_value(volume_prop); + LOGE("board_set_volume ->%d\n",volume); + //board_set_volume(volume); + //uint32_t speaker_volume_get_current(); + speaker_set_volume(volume); + return return_value_create_string("{\"success\":true}"); +} + +// 设置亮度工具回调 +static ReturnValue set_brightness_callback(const PropertyList* properties) { + Property* brightness_prop = property_list_get_by_name(properties, "brightness"); + if (!brightness_prop || property_get_type(brightness_prop) != PROPERTY_TYPE_INTEGER) { + return return_value_create_string("{\"error\":\"Invalid brightness parameter\"}"); + } + int brightness = property_get_integer_value(brightness_prop); + if(brightness == 0){ + ws2812_led_clear_all(); + }else{ + //ws2812_set_all_led(0xFFFFFF,brightness); + ws2812_set_all_led_brightness(brightness); + } + LOGE("board_set_brightness ->%d\n",brightness); + return return_value_create_string("{\"success\":true}"); +} + +// 设置主题工具回调 +static ReturnValue set_theme_callback(const PropertyList* properties) { + Property* theme_prop = property_list_get_by_name(properties, "theme"); + if (!theme_prop || property_get_type(theme_prop) != PROPERTY_TYPE_STRING) { + return return_value_create_string("{\"error\":\"Invalid theme parameter\"}"); + } + const char* theme = property_get_string_value(theme_prop); + LOGE("board_set_theme ->%s\n",theme); + return return_value_create_string("{\"success\":true}"); +} + +// 拍照工具回调 +static ReturnValue take_photo_callback(const PropertyList* properties) { + ReturnValue ret = return_value_create_string("photo_data"); + return ret; +} + +// OTA升级检测工具回调 +static ReturnValue ota_update_device_callback(const PropertyList* properties) { + // ReturnValue ret = return_value_create_string("photo_data"); + // 电量低于25 不允许执行OTA + int battery = battery_get_percent(); + if (battery < 25) + { + LOGE("power low bat:%d ,don't ota !!\n", battery); + app_event_send_msg(APP_EVT_LOW_VOLTAGE, 0); + return return_value_create_string("{\"success\":false,\"error\":\"电量低,不允许升级设备\"}"); + } + iot_lamp_check_ota(); + return return_value_create_string("{\"success\":true}"); +} + +// 设备助眠仪状态回调 +static ReturnValue sleep_helper_get_device_status_callback(const PropertyList* properties) { + + cJSON* status = cJSON_CreateObject(); + //助眠仪的状态 + cJSON* sleep_helper = cJSON_CreateObject(); + + cJSON_AddNumberToObject(sleep_helper, "model", sleep_helper_get_mode()); + cJSON_AddNumberToObject(sleep_helper, "level", sleep_helper_get_level()); + cJSON_AddItemToObject(status, "sleep_helper", sleep_helper); + + char *jsonString = cJSON_PrintUnformatted(status); + ReturnValue ret = return_value_create_string(jsonString); + cJSON_Delete(status); + return ret; +} + +void app_mcp_init(){ + + McpServer* mcp_server = mcp_server_get_instance(); + // 助眠仪模式 + { + PropertyList* props = property_list_create(); + Property* prop_mode = property_create_integer("mode", false, 0, true, 0, 3); + property_list_add_property(props, prop_mode); + mcp_server_add_tool_with_params(mcp_server, "self.sleep_helper.set_mode", "设置助眠仪的模式", props, sleep_helper_set_mode_callback); + } + // 助眠仪等级 + { + PropertyList* props = property_list_create(); + Property* prop_level = property_create_integer("level", false, 1, true, 1, 9); + property_list_add_property(props, prop_level); + mcp_server_add_tool_with_params(mcp_server, "self.sleep_helper.set_level", "设置助眠仪的等级", props, sleep_helper_set_level_callback); + } + //打开助眠仪 + { + PropertyList* props = property_list_create(); + mcp_server_add_tool_with_params(mcp_server, "self.sleep_helper.open", "打开助眠仪", props, sleep_helper_open_callback); + } + //关闭助眠仪 + { + PropertyList* props = property_list_create(); + mcp_server_add_tool_with_params(mcp_server, "self.sleep_helper.close", "关闭助眠仪", props, sleep_helper_close_callback); + } + + // 获取助眠仪状态 + { + PropertyList* props = property_list_create(); + mcp_server_add_tool_with_params(mcp_server, "self.sleep_helper.get_status", + "获取助眠仪状态 (mode=0 表示已经关闭, mode=1 表示模式1, mode=2 表示模式2,mode=3 表示模式3,level (0-9)分别代表9个不同等级", props, sleep_helper_get_device_status_callback); + } + + // 添加获取设备状态工具 + { + PropertyList* props = property_list_create(); + mcp_server_add_tool_with_params(mcp_server, "self.get_device_status", "获取软件版本,设备音量,灯光亮度,设备电池状态", props, get_device_status_callback); + } + + // 添加设置音量工具 + { + PropertyList* props = property_list_create(); + Property* volume_prop = property_create_integer("volume", false, 0, true, 0, 100); + property_list_add_property(props, volume_prop); + + //Property* vol_prop = property_create_integer("vol", false, 0, true, 0, 100); + //property_list_add_property(props, vol_prop); + mcp_server_add_tool_with_params( + mcp_server, + "self.audio_speaker.set_volume", + "Set the volume of the audio speaker. If the current volume is unknown, you must call `self.get_device_status` tool first and then call this tool.", + props, set_volume_callback); + + } + // 添加设置亮度工具 + { + PropertyList* props = property_list_create(); + Property* brightness_prop = property_create_integer("brightness", false, 0, true, 0, 100); + property_list_add_property(props, brightness_prop); + mcp_server_add_tool_with_params(mcp_server, "self.screen.set_brightness", "Set screen brightness", props, set_brightness_callback); + } + // 添加拍照工具 + //{ + // PropertyList* props = property_list_create(); + // mcp_server_add_tool_with_params(mcp_server, "take_photo", "Take a photo", props, take_photo_callback); + //} + + // OTA + { + PropertyList* props = property_list_create(); + mcp_server_add_tool_with_params(mcp_server, "self.ota.update_device", "更新拍拍灯乐小牛软件,执行该指令需要和用户二次确认才允许下发这个指令", props, ota_update_device_callback); + } +} + +void app_start(){ + app_mcp_init(); +} \ No newline at end of file diff --git a/bk_aidk/projects/beken_wss_paopao/main/application.h b/bk_aidk/projects/beken_wss_paopao/main/application.h index 90ef7805..d3acb7e3 100755 --- a/bk_aidk/projects/beken_wss_paopao/main/application.h +++ b/bk_aidk/projects/beken_wss_paopao/main/application.h @@ -80,7 +80,7 @@ enum ListeningMode { * 解决调用BLE设置灯光常亮时异常问题 */ -#define APPLICATION_VERSION "1.1.5" +#define APPLICATION_VERSION "1.1.6" #define APPLICATION_DEFULT_OTA_URL "https://xiaozhi.xa-poka.com/xiaozhi/ota/" #define APPLICATION_CONFIG_KEY_AI_URL "ai_url" /** @@ -95,10 +95,17 @@ enum ListeningMode { *助眠超时关闭 单位分钟 10 - 表示助眠10分钟后关闭 */ #define APPLICATION_DEFULT_SLEEP_TIMEOUT 10 +/** + * 使用本地MCP协议 + */ +#define APPLICATION_IOT_PROTOCOL_MCP 1 +#define APPLICATION_DEVICE_BOARD_NAME "Poka" void app_set_ota_url(char * ota_url); char* app_get_ota_url(); +void app_start(); + #ifdef __cplusplus } #endif diff --git a/bk_aidk/projects/beken_wss_paopao/main/bat_main.c b/bk_aidk/projects/beken_wss_paopao/main/bat_main.c index a1af7cfd..d6c622f6 100755 --- a/bk_aidk/projects/beken_wss_paopao/main/bat_main.c +++ b/bk_aidk/projects/beken_wss_paopao/main/bat_main.c @@ -52,7 +52,7 @@ #define BAT_DETEC_ADC_STEADY_CTRL 7 #define BAT_DETEC_ADC_SAMPLE_RATE 0 -#define BATTERY_MAX_VOLTAGE 4200 +#define BATTERY_MAX_VOLTAGE 4100 #define BATTERY_MIN_VOLTAGE 3400 static int batt_percent = 0; diff --git a/bk_aidk/projects/beken_wss_paopao/main/bat_main.h b/bk_aidk/projects/beken_wss_paopao/main/bat_main.h index 8b4f1eb6..bc2c883a 100755 --- a/bk_aidk/projects/beken_wss_paopao/main/bat_main.h +++ b/bk_aidk/projects/beken_wss_paopao/main/bat_main.h @@ -1,3 +1,16 @@ +/************************************************************* + * + * Copyright (C) POKA + * All rights reserved. + * + *************************************************************/ +#ifndef __BATTERY_H__ +#define __BATTERY_H__ + +#ifdef __cplusplus +extern "C" { +#endif + typedef enum{ EVT_BATTERY_MAIN_CHARGING = 0, EVT_BATTERY_MAIN_LOW_VOLTAGE, @@ -14,4 +27,10 @@ void poweroff_voice(); /** * 获取电量百分百 */ -int battery_get_percent(); \ No newline at end of file +int battery_get_percent(); + +#ifdef __cplusplus +} +#endif +#endif /* __BATTERY_H__ */ + diff --git a/bk_aidk/projects/beken_wss_paopao/main/beken_sdk/beken_rtc.c b/bk_aidk/projects/beken_wss_paopao/main/beken_sdk/beken_rtc.c index 4f9d174f..6ada8cc4 100755 --- a/bk_aidk/projects/beken_wss_paopao/main/beken_sdk/beken_rtc.c +++ b/bk_aidk/projects/beken_wss_paopao/main/beken_sdk/beken_rtc.c @@ -14,6 +14,7 @@ #endif #include "bk_genie_comm.h" #include "thing.h" +#include "application.h" #define TAG "beken_rtc" #define LOGI(...) BK_LOGI(TAG, ##__VA_ARGS__) @@ -810,68 +811,39 @@ int rtc_websocket_send_text(transport web_socket, void *str, enum MsgType msgtyp case BEKEN_RTC_SEND_ABORT:{ cJSON *abortMessage = cJSON_CreateObject(); - if (abortMessage == NULL) { - - } - cJSON_AddStringToObject(abortMessage, "type", "abort") ; cJSON_AddStringToObject(abortMessage, "reason", "user_interrupted") ; - - char *jsonString = cJSON_Print(abortMessage); - + char *jsonString = cJSON_PrintUnformatted(abortMessage); websocket_client_send_text(web_socket, jsonString, strlen(jsonString), 10*1000); cJSON_Delete(abortMessage); break; } case BEKEN_RTC_SEND_LISTEN:{ - // ������ JSON ���� - cJSON *listenMessage = cJSON_CreateObject(); - if (listenMessage == NULL) { - - } - - cJSON_AddStringToObject(listenMessage, "session_id", ""); - - - cJSON_AddStringToObject(listenMessage, "type", "listen"); - - cJSON_AddStringToObject(listenMessage, "state", "detect"); - cJSON_AddStringToObject(listenMessage, "mode", "auto"); - cJSON_AddStringToObject(listenMessage, "text", "С��ͬѧ"); - - // �� cJSON ����ת��Ϊ�ַ��� - char *jsonString = cJSON_Print(listenMessage); - BK_LOGE("WebSocket", "Sending: %s\r\n", jsonString); - websocket_client_send_text(web_socket, jsonString, strlen(jsonString), 10*1000); - // ɾ�� cJSON �������ͷ��ڴ� - cJSON_Delete(listenMessage); + cJSON *listenMessage = cJSON_CreateObject(); + cJSON_AddStringToObject(listenMessage, "session_id", ""); + cJSON_AddStringToObject(listenMessage, "type", "listen"); + cJSON_AddStringToObject(listenMessage, "state", "detect"); + cJSON_AddStringToObject(listenMessage, "mode", "auto"); + cJSON_AddStringToObject(listenMessage, "text", ""); + + char *jsonString = cJSON_PrintUnformatted(listenMessage); + BK_LOGE("WebSocket", "Sending: %s\r\n", jsonString); + websocket_client_send_text(web_socket, jsonString, strlen(jsonString), 10*1000); + cJSON_Delete(listenMessage); break; } case BEKEN_RTC_SEND_START_LISTEN:{ cJSON *startlistent = cJSON_CreateObject(); - - // char *session_id = getGlobalSessionId(); - - // bk_printf("Global session_id_BEKEN_RTC_SEND_START_LISTEN: %s\n", session_id); - - // ����session_id�ֶ� - cJSON_AddStringToObject(startlistent, "session_id", ""); + extern char *getGlobalSessionId(void); + cJSON_AddStringToObject(startlistent, "session_id", getGlobalSessionId()); - // ����type�ֶ� cJSON_AddStringToObject(startlistent, "type", "listen"); - - // ����state�ֶ� cJSON_AddStringToObject(startlistent, "state", "start"); - - // ����mode�ֶ� cJSON_AddStringToObject(startlistent, "mode", "auto") ; - - // ����JSON�ַ��� - char *jsonString = cJSON_Print(startlistent); - + char *jsonString = cJSON_PrintUnformatted(startlistent); websocket_client_send_text(web_socket, jsonString, strlen(jsonString), 10*1000); cJSON_Delete(startlistent); break; @@ -879,29 +851,15 @@ int rtc_websocket_send_text(transport web_socket, void *str, enum MsgType msgtyp case BEKEN_RTC_SEND_STOP_LISTEN:{ - cJSON *stoplistent = cJSON_CreateObject(); - - // char *session_id = getGlobalSessionId(); - - // bk_printf("Global session_id_BEKEN_RTC_SEND_STOP_LISTEN: %s\n", session_id); - - // ����session_id�ֶ� - cJSON_AddStringToObject(stoplistent, "session_id", ""); - - // ����type�ֶ� - cJSON_AddStringToObject(stoplistent, "type", "listen"); - - // ����state�ֶ� - cJSON_AddStringToObject(stoplistent, "state", "stop"); - - // ����mode�ֶ� - cJSON_AddStringToObject(stoplistent, "mode", "auto") ; - - // ����JSON�ַ��� - char *jsonString = cJSON_Print(stoplistent); - - websocket_client_send_text(web_socket, jsonString, strlen(jsonString), 10*1000); - cJSON_Delete(stoplistent); + cJSON *stoplistent = cJSON_CreateObject(); + extern char *getGlobalSessionId(void); + cJSON_AddStringToObject(stoplistent, "session_id", getGlobalSessionId()); + cJSON_AddStringToObject(stoplistent, "type", "listen"); + cJSON_AddStringToObject(stoplistent, "state", "stop"); + cJSON_AddStringToObject(stoplistent, "mode", "auto"); + char *jsonString = cJSON_PrintUnformatted(stoplistent); + websocket_client_send_text(web_socket, jsonString, strlen(jsonString), 10 * 1000); + cJSON_Delete(stoplistent); break; } @@ -934,7 +892,7 @@ int rtc_websocket_send_text(transport web_socket, void *str, enum MsgType msgtyp cJSON_AddItemToObject(startMessage, "audio_params", audio_params); // �� cJSON ����ת��Ϊ�ַ��� - char *jsonString = cJSON_Print(startMessage); + char *jsonString = cJSON_PrintUnformatted(startMessage); BK_LOGI("WebSocket", "Sending: %s\r\n", jsonString); websocket_client_send_text(web_socket, jsonString, strlen(jsonString), 10*1000); // ɾ�� cJSON �������ͷ��ڴ� @@ -942,53 +900,32 @@ int rtc_websocket_send_text(transport web_socket, void *str, enum MsgType msgtyp break;} case BEKEN_RTC_SEND_HELLO:{ - // ������ JSON ���� cJSON *helloMessage = cJSON_CreateObject(); - if (helloMessage == NULL) { - //return NULL; - } - - // ���� "type" �ֶ� cJSON_AddStringToObject(helloMessage, "type", "hello"); - - // ���� "version" �ֶ� cJSON_AddNumberToObject(helloMessage, "version", 3); - - // ���� "transport" �ֶ� cJSON_AddStringToObject(helloMessage, "transport", "websocket"); - - // ���� "audio_params" JSON ���� + + #if APPLICATION_IOT_PROTOCOL_MCP + cJSON* features = cJSON_CreateObject(); + cJSON_AddBoolToObject(features, "mcp", true); + cJSON_AddItemToObject(helloMessage, "features", features); + #endif + cJSON *audio_params = cJSON_CreateObject(); - if (audio_params == NULL) { - cJSON_Delete(helloMessage); - //return NULL; - } - - // �� "audio_params" �����ֶ� + cJSON_AddStringToObject(audio_params, "format", "opus"); cJSON_AddNumberToObject(audio_params, "sample_rate", 16000); cJSON_AddNumberToObject(audio_params, "channels", 1); cJSON_AddNumberToObject(audio_params, "frame_duration", 60); - // �� "audio_params" ���ӵ��� JSON ���� cJSON_AddItemToObject(helloMessage, "audio_params", audio_params); - // �� cJSON ����ת��Ϊ�ַ��� - char *jsonString = cJSON_Print(helloMessage); - BK_LOGI("WebSocket", "Sending: %s\r\n", jsonString); + char *jsonString = cJSON_PrintUnformatted(helloMessage); + BK_LOGE("WebSocket", "Sending: %s\r\n", jsonString); websocket_client_send_text(web_socket, jsonString, strlen(jsonString), 10*1000); + cJSON_Delete(helloMessage); - // ɾ�� cJSON �������ͷ��ڴ� - cJSON_Delete(helloMessage); - - /* - n = snprintf(buf, BEKEN_RTC_TXT_SIZE, - "{\"type\":\"hello\",\"config\":{\"version\": 2,\"audio\":{\"to_server\":{\"format\":\"%s\", \"sample_rate\":%d, \"channels\":1, \"frame_duration\":%d}, \"from_server\":{\"format\":\"%s\", \"sample_rate\":%d, \"channels\":1, \"frame_duration\":%d}}}}", - ((audio_info_t *)str)->encoding_type, ((audio_info_t *)str)->adc_samp_rate, ((audio_info_t *)str)->enc_samp_interval, - ((audio_info_t *)str)->encoding_type, ((audio_info_t *)str)->dac_samp_rate, ((audio_info_t *)str)->dec_samp_interval); - BK_LOGE("WebSocket", "Sending: %s\r\n", buf); - - websocket_client_send_text(web_socket, buf, n, 10*1000);*/ + break;} case BEKEN_RTC_SEND_IOT_DESC:{ extern char *getGlobalSessionId(void); diff --git a/bk_aidk/projects/beken_wss_paopao/main/iot/iot_lamp.c b/bk_aidk/projects/beken_wss_paopao/main/iot/iot_lamp.c index 78f77508..ae2e530b 100755 --- a/bk_aidk/projects/beken_wss_paopao/main/iot/iot_lamp.c +++ b/bk_aidk/projects/beken_wss_paopao/main/iot/iot_lamp.c @@ -323,7 +323,7 @@ void iot_lamp_parser_invoke(char* cmd,char * paramters_json){ //ws2812_set_all_led(0xFFFFFF,brightness); ws2812_set_all_led_brightness(brightness); } - thing_report_iot_state_number(IOT_LAMP_DEVICE_NAME,IOT_LAMP_DEVICE_PARAM_BRIGHTNESS,brightness); + //thing_report_iot_state_number(IOT_LAMP_DEVICE_NAME,IOT_LAMP_DEVICE_PARAM_BRIGHTNESS,brightness); cJSON_Delete(params); } else if (strcmp(cmd, IOT_LAMP_DEVICE_OTA) == 0){ diff --git a/bk_aidk/projects/beken_wss_paopao/main/iot/iot_sleep_helper.c b/bk_aidk/projects/beken_wss_paopao/main/iot/iot_sleep_helper.c index 8b413539..fb7404a0 100755 --- a/bk_aidk/projects/beken_wss_paopao/main/iot/iot_sleep_helper.c +++ b/bk_aidk/projects/beken_wss_paopao/main/iot/iot_sleep_helper.c @@ -272,7 +272,7 @@ void sleep_helper_set_mode(sleep_mode mode){ sleep_msg_t msg; msg.mode = mode; rtos_push_to_queue(&sleep_helper_msg_que, &msg, BEKEN_NO_WAIT); - thing_report_iot_state_number(IOT_SLEEP_HELPER_DEVICE_NAME,IOT_SLEEP_HELPER_DEVICE_PARAM_MODE,mode); + //thing_report_iot_state_number(IOT_SLEEP_HELPER_DEVICE_NAME,IOT_SLEEP_HELPER_DEVICE_PARAM_MODE,mode); } } @@ -339,11 +339,11 @@ void sleep_helper_set_level(sleep_model_level level){ LOGE("sleep_helper period_cycle s %d duty_cycle %d\n",config.period_cycle,config.duty_cycle); bk_pwm_set_init_signal_low(pwm_chan); bk_pwm_set_period_duty(pwm_chan,&config); - thing_report_iot_state_number(IOT_SLEEP_HELPER_DEVICE_NAME,IOT_SLEEP_HELPER_DEVICE_PARAM_LEVEL,level); + //thing_report_iot_state_number(IOT_SLEEP_HELPER_DEVICE_NAME,IOT_SLEEP_HELPER_DEVICE_PARAM_LEVEL,level); } } -void sleep_helper_open(){ +int sleep_helper_open(){ if(current_mode != SLEEP_MODE_OFF){ sleep_helper_close(); } @@ -360,7 +360,7 @@ void sleep_helper_open(){ socket_insert = insert_value; if(socket_insert == 1){ LOGE("sleep_helper open fail!! cable not insert %d \n",insert_value); - return ; + return -1; } pwm_init_config_t config = {0}; @@ -375,7 +375,8 @@ void sleep_helper_open(){ //默认模式1 sleep_helper_set_mode(SLEEP_MODE_1); sleep_helper_start_timer(); - thing_report_iot_state_number(IOT_SLEEP_HELPER_DEVICE_NAME,IOT_SLEEP_HELPER_DEVICE_PARAM_MODE,SLEEP_MODE_1); + //thing_report_iot_state_number(IOT_SLEEP_HELPER_DEVICE_NAME,IOT_SLEEP_HELPER_DEVICE_PARAM_MODE,SLEEP_MODE_1); + return 0; } void sleep_helper_close(){ @@ -389,7 +390,7 @@ void sleep_helper_close(){ bk_gpio_set_output_low(GPIO_44); bk_gpio_set_output_low(GPIO_45); - thing_report_iot_state_number(IOT_SLEEP_HELPER_DEVICE_NAME,IOT_SLEEP_HELPER_DEVICE_PARAM_MODE,0); + //thing_report_iot_state_number(IOT_SLEEP_HELPER_DEVICE_NAME,IOT_SLEEP_HELPER_DEVICE_PARAM_MODE,0); } cJSON* iot_sleep_helper_get_device_desc() diff --git a/bk_aidk/projects/beken_wss_paopao/main/iot/iot_sleep_helper.h b/bk_aidk/projects/beken_wss_paopao/main/iot/iot_sleep_helper.h index 3763e41f..695687c4 100755 --- a/bk_aidk/projects/beken_wss_paopao/main/iot/iot_sleep_helper.h +++ b/bk_aidk/projects/beken_wss_paopao/main/iot/iot_sleep_helper.h @@ -65,7 +65,7 @@ typedef struct void sleep_helper_init(); -void sleep_helper_open(); +int sleep_helper_open(); void sleep_helper_close(); void sleep_helper_set_mode(sleep_mode mode); void sleep_helper_set_timeout(int timeout); diff --git a/bk_aidk/projects/beken_wss_paopao/main/iot/iot_speaker.c b/bk_aidk/projects/beken_wss_paopao/main/iot/iot_speaker.c index c0fe5a75..f440c8e9 100755 --- a/bk_aidk/projects/beken_wss_paopao/main/iot/iot_speaker.c +++ b/bk_aidk/projects/beken_wss_paopao/main/iot/iot_speaker.c @@ -209,7 +209,7 @@ void speaker_set_volume(int volume) int level = volume / 10; LOGE("speaker_setVolume--> volume :%d level:%d\n", volume, level); speaker_volume_set_abs(level, 0); - thing_report_iot_state_number(IOT_SPEAKER_DEVICE_NAME, IOT_SPEAKER_DEVICE_PARAM_VOL, volume); + //thing_report_iot_state_number(IOT_SPEAKER_DEVICE_NAME, IOT_SPEAKER_DEVICE_PARAM_VOL, volume); } } void iot_speaker_parser_invoke(char* cmd,char * paramters_json){ diff --git a/bk_aidk/projects/beken_wss_paopao/main/mcp/mcp_server.c b/bk_aidk/projects/beken_wss_paopao/main/mcp/mcp_server.c new file mode 100755 index 00000000..8bf767f5 --- /dev/null +++ b/bk_aidk/projects/beken_wss_paopao/main/mcp/mcp_server.c @@ -0,0 +1,1221 @@ +/* + * MCP Server C Implementation + * Reference: https://modelcontextprotocol.io/specification/2024-11-05 + */ + +#include "mcp_server.h" +#include +#include +#include +#include +#include +#include +#include "bk_private/bk_init.h" +#include +#include +#include "components/webclient.h" +#include "cJSON.h" +#include "components/bk_uid.h" +#include "bk_genie_comm.h" +#include "application.h" +#include "beken_rtc.h" + + + +#define TAG "MCP_SER" +#define LOGI(...) BK_LOGI(TAG, ##__VA_ARGS__) +#define LOGW(...) BK_LOGW(TAG, ##__VA_ARGS__) +#define LOGE(...) BK_LOGE(TAG, ##__VA_ARGS__) +#define LOGD(...) BK_LOGD(TAG, ##__VA_ARGS__) + + +#define DEFAULT_TOOLCALL_STACK_SIZE 6144 +#define DEFAULT_CAPACITY 20 +#define MAX_JSON_SIZE 8000 + +// 全局单例 +McpServer* g_mcp_server = NULL; + +extern rtc_session *__get_beken_rtc(void); +extern char *getGlobalSessionId(void); +extern bool g_connected_flag; +static beken_queue_t thing_msg_que = NULL; +static beken_thread_t thing_thread_hdl = NULL; +static int thing_start = 0; +typedef struct +{ + int type ; + char *data; + int data_len; +} thing_msg_t; + + + +// 线程相关 +typedef struct { + int id; + McpTool* tool; + PropertyList* properties; +} ToolCallThreadArgs; + +// 工具线程函数 +static void* tool_call_thread_func(void* arg); + +// 辅助函数 +static void send_mcp_message( char* message); +static void reply_result(int id, const char* result); +static void reply_error(int id, const char* message); +static char* escape_json_string(const char* str); +static char* strdup_safe(const char* str); +static void mcp_send_thread_task(void *arg); + +// 属性函数实现 +Property* property_create_boolean(const char* name, bool has_default, bool default_value) { + Property* property = (Property*)malloc(sizeof(Property)); + if (!property) { + LOGE( "Failed to allocate memory for property\n"); + return NULL; + } + + property->name = strdup_safe(name); + property->type = PROPERTY_TYPE_BOOLEAN; + property->has_default_value = has_default; + property->value.boolean_value = default_value; + property->has_range = false; + + return property; +} + +Property* property_create_integer(const char* name, bool has_default, int default_value, bool has_range, int min_value, int max_value) { + Property* property = (Property*)malloc(sizeof(Property)); + if (!property) { + LOGE( "Failed to allocate memory for property\n"); + return NULL; + } + + property->name = strdup_safe(name); + property->type = PROPERTY_TYPE_INTEGER; + property->has_default_value = has_default; + property->value.integer_value = default_value; + property->has_range = has_range; + property->min_value = min_value; + property->max_value = max_value; + LOGE("property_create_integer property->name:%s\n", property->name); + return property; +} + +Property* property_create_string(const char* name, bool has_default, const char* default_value) { + Property* property = (Property*)malloc(sizeof(Property)); + if (!property) { + LOGE( "Failed to allocate memory for property\n"); + return NULL; + } + + property->name = strdup_safe(name); + property->type = PROPERTY_TYPE_STRING; + property->has_default_value = has_default; + property->value.string_value = default_value ? strdup_safe(default_value) : NULL; + property->has_range = false; + + return property; +} + +void property_destroy(Property* property) { + if (!property) return; + + free(property->name); + + if (property->type == PROPERTY_TYPE_STRING && property->value.string_value) { + free(property->value.string_value); + } + + // 注意:不再释放property本身,因为它现在是数组的一部分 +} + +const char* property_get_name(const Property* property) { + return property ? property->name : NULL; +} + +PropertyType property_get_type(const Property* property) { + return property ? property->type : PROPERTY_TYPE_BOOLEAN; +} + +bool property_has_default_value(const Property* property) { + return property ? property->has_default_value : false; +} + +bool property_has_range(const Property* property) { + return property ? property->has_range : false; +} + +int property_get_min_value(const Property* property) { + return property && property->has_range ? property->min_value : 0; +} + +int property_get_max_value(const Property* property) { + return property && property->has_range ? property->max_value : 0; +} + +bool property_get_boolean_value(const Property* property) { + return property && property->type == PROPERTY_TYPE_BOOLEAN ? property->value.boolean_value : false; +} + +int property_get_integer_value(const Property* property) { + return property && property->type == PROPERTY_TYPE_INTEGER ? property->value.integer_value : 0; +} + +const char* property_get_string_value(const Property* property) { + return property && property->type == PROPERTY_TYPE_STRING ? property->value.string_value : NULL; +} + +void property_set_boolean_value(Property* property, bool value) { + if (property && property->type == PROPERTY_TYPE_BOOLEAN) { + property->value.boolean_value = value; + } +} + +void property_set_integer_value(Property* property, int value) { + if (property && property->type == PROPERTY_TYPE_INTEGER) { + property->value.integer_value = value; + } +} + +void property_set_string_value(Property* property, const char* value) { + if (property && property->type == PROPERTY_TYPE_STRING) { + if (property->value.string_value) { + free(property->value.string_value); + } + property->value.string_value = strdup_safe(value); + } +} + +char* property_to_json(const Property* property) { + if (!property) return NULL; + + char* json = NULL; + char* escaped_name = escape_json_string(property->name); + + if (property->type == PROPERTY_TYPE_BOOLEAN) { + json = (char*)malloc(strlen(escaped_name) + 50); + if (json) { + sprintf(json, "\"%s\":%s", escaped_name, property->value.boolean_value ? "true" : "false"); + } + } else if (property->type == PROPERTY_TYPE_INTEGER) { + json = (char*)malloc(strlen(escaped_name) + 50); + if (json) { + sprintf(json, "\"%s\":%d", escaped_name, property->value.integer_value); + } + } else if (property->type == PROPERTY_TYPE_STRING) { + char* escaped_value = escape_json_string(property->value.string_value ? property->value.string_value : ""); + json = (char*)malloc(strlen(escaped_name) + strlen(escaped_value) + 10); + if (json) { + sprintf(json, "\"%s\":\"%s\"", escaped_name, escaped_value); + } + free(escaped_value); + } + + free(escaped_name); + return json; +} + +// 属性列表函数实现 +PropertyList* property_list_create(void) { + return property_list_create_with_capacity(DEFAULT_CAPACITY); +} + +PropertyList* property_list_create_with_capacity(int capacity) { + PropertyList* list = (PropertyList*)malloc(sizeof(PropertyList)); + if (!list) { + LOGE( "Failed to allocate memory for property list\n"); + return NULL; + } + + list->properties = (Property*)malloc(sizeof(Property) * capacity); + if (!list->properties) { + LOGE( "Failed to allocate memory for properties array\n"); + free(list); + return NULL; + } + + list->count = 0; + list->capacity = capacity; + + return list; +} + +void property_list_destroy(PropertyList* list) { + if (!list) return; + + if (list->properties) { + for (int i = 0; i < list->count; i++) { + free(list->properties[i].name); + + if (list->properties[i].type == PROPERTY_TYPE_STRING && list->properties[i].value.string_value) { + free(list->properties[i].value.string_value); + } + } + + free(list->properties); + } + + free(list); +} + +void property_list_add_property(PropertyList* list, Property* property) { + if (!list || !property) return; + + // 检查是否需要扩容 + if (list->count >= list->capacity) { + int new_capacity = list->capacity * 2; + Property* new_properties = (Property*)realloc(list->properties, sizeof(Property) * new_capacity); + if (!new_properties) { + LOGE( "Failed to reallocate memory for properties array\n"); + return; + } + + list->properties = new_properties; + list->capacity = new_capacity; + } + + + //LOGE( "@@@ properties %s\n,",property->name); + // 复制属性到数组中 + memcpy(&list->properties[list->count], property, sizeof(Property)); + //LOGE( "^^^ properties %s\n,",list->properties[list->count].name); + + + list->count++; + + //下方代码有BUG 会引起list列表里边的值错乱 + // 释放原始属性,因为我们已经复制了它 + //free(property->name); + //if (property->type == PROPERTY_TYPE_STRING && property->value.string_value) { + // free(property->value.string_value); + //} + //free(property); + // LOGE( "~~~ properties0 %s\n,",list->properties[0].name); + // LOGE( "~~~ properties1 %s\n,",list->properties[1].name); +} + +Property* property_list_get_by_name(const PropertyList* list, const char* name) { + if (!list || !name) return NULL; + + for (int i = 0; i < list->count; i++) { + if (strcmp(list->properties[i].name, name) == 0) { + return &list->properties[i]; + } + } + + return NULL; +} + +char** property_list_get_required(const PropertyList* list, int* count) { + if (!list || !count) return NULL; + + // 计算必需属性的数量 + int required_count = 0; + for (int i = 0; i < list->count; i++) { + if (!list->properties[i].has_default_value) { + required_count++; + } + } + + *count = required_count; + if (required_count == 0) return NULL; + + // 分配必需属性数组 + char** required = (char**)malloc(sizeof(char*) * required_count); + if (!required) { + LOGE( "Failed to allocate memory for required properties array\n"); + return NULL; + } + + // 填充必需属性数组 + int index = 0; + for (int i = 0; i < list->count; i++) { + if (!list->properties[i].has_default_value) { + required[index++] = strdup_safe(list->properties[i].name); + } + } + + return required; +} + +char* property_list_to_json(const PropertyList* list) { + if (!list || list->count == 0) return strdup_safe("{}"); + + // 计算JSON字符串的大致长度 + int json_length = 2; // 开始的 { 和结束的 } + + for (int i = 0; i < list->count; i++) { + char* prop_json = property_to_json(&list->properties[i]); + if (prop_json) { + json_length += strlen(prop_json) + 2; // +2 for comma and space + free(prop_json); + } + } + + // 分配内存 + char* json = (char*)malloc(json_length + 1); // +1 for null terminator + if (!json) { + LOGE( "Failed to allocate memory for property list JSON\n"); + return NULL; + } + + // 构建JSON字符串 + strcpy(json, "{"); + int pos = 1; + + for (int i = 0; i < list->count; i++) { + char* prop_json = property_to_json(&list->properties[i]); + if (prop_json) { + if (i > 0) { + json[pos++] = ','; + json[pos++] = ' '; + } + + strcpy(json + pos, prop_json); + pos += strlen(prop_json); + free(prop_json); + } + } + + json[pos++] = '}'; + json[pos] = '\0'; + + return json; +} + +// 返回值函数实现 +ReturnValue return_value_create_boolean(bool value) { + ReturnValue ret; + ret.type = RETURN_TYPE_BOOLEAN; + ret.value.boolean_value = value; + return ret; +} + +ReturnValue return_value_create_integer(int value) { + ReturnValue ret; + ret.type = RETURN_TYPE_INTEGER; + ret.value.integer_value = value; + return ret; +} + +ReturnValue return_value_create_string(const char* value) { + ReturnValue ret; + ret.type = RETURN_TYPE_STRING; + ret.value.string_value = strdup_safe(value); + return ret; +} + +void return_value_destroy(ReturnValue* value) { + if (!value) return; + + if (value->type == RETURN_TYPE_STRING && value->value.string_value) { + free(value->value.string_value); + value->value.string_value = NULL; + } +} + +// MCP工具函数实现 +McpTool* mcp_tool_create(const char* name, const char* description, PropertyList* properties, McpToolCallback callback) { + McpTool* tool = (McpTool*)malloc(sizeof(McpTool)); + if (!tool) { + LOGE( "Failed to allocate memory for MCP tool\n"); + return NULL; + } + + tool->name = strdup_safe(name); + tool->description = strdup_safe(description); + + if (properties) { + + tool->properties = *properties; + //LOGE( "mcp_tool_create properties %d\n,",properties->count); + //LOGE( "mcp_tool_create properties %s\n,",properties->properties[0].name); + + //LOGE( "mcp_tool_create tool->properties %d\n,",tool->properties.count); + //LOGE( "mcp_tool_create tool->properties %s\n,",tool->properties.properties[0].name); + + free(properties); // 释放PropertyList结构体,但保留其内容 + } else { + tool->properties.properties = NULL; + tool->properties.count = 0; + tool->properties.capacity = 0; + } + + tool->callback = callback; + + return tool; +} + +void mcp_tool_destroy(McpTool* tool) { + if (!tool) return; + + free(tool->name); + free(tool->description); + + // 直接释放属性数组中的资源 + if (tool->properties.properties) { + for (int i = 0; i < tool->properties.count; i++) { + free(tool->properties.properties[i].name); + + if (tool->properties.properties[i].type == PROPERTY_TYPE_STRING && + tool->properties.properties[i].value.string_value) { + free(tool->properties.properties[i].value.string_value); + } + } + + free(tool->properties.properties); + } + + free(tool); +} + +const char* mcp_tool_get_name(const McpTool* tool) { + return tool ? tool->name : NULL; +} + +const char* mcp_tool_get_description(const McpTool* tool) { + return tool ? tool->description : NULL; +} + +const PropertyList* mcp_tool_get_properties(const McpTool* tool) { + return tool ? &tool->properties : NULL; +} + +char* mcp_tool_to_json(const McpTool* tool) { + if (!tool) return NULL; + + char* escaped_name = escape_json_string(tool->name); + char* escaped_description = escape_json_string(tool->description); + + //LOGE("mcp_tool_to_json escaped_name:%d\n", escaped_name); + //LOGE("mcp_tool_to_json escaped_description:%s\n\n", escaped_description); + + // 获取属性的JSON表示 + //char* properties_json = NULL; + cJSON* input_schema = cJSON_CreateObject(); + cJSON* properties_obj = cJSON_CreateObject(); + cJSON* required_array = cJSON_CreateArray(); + + cJSON_AddStringToObject(input_schema, "type", "object"); + cJSON_AddItemToObject(input_schema, "properties", properties_obj); + + // 添加属性 + for (int i = 0; i < tool->properties.count; i++) { + const Property* prop = &tool->properties.properties[i]; + // Property* prop = &(tool->properties.properties[i]); + //LOGE("mcp_tool_to_json prop->name:%d type:%d\n", prop->name,prop->type); + cJSON* prop_obj = cJSON_CreateObject(); + + // 添加属性类型 + if (prop->type == PROPERTY_TYPE_BOOLEAN) { + cJSON_AddStringToObject(prop_obj, "type", "boolean"); + } else if (prop->type == PROPERTY_TYPE_INTEGER) { + cJSON_AddStringToObject(prop_obj, "type", "integer"); + + // 添加范围 + if (prop->has_range) { + cJSON_AddNumberToObject(prop_obj, "minimum", prop->min_value); + cJSON_AddNumberToObject(prop_obj, "maximum", prop->max_value); + } + } else if (prop->type == PROPERTY_TYPE_STRING) { + cJSON_AddStringToObject(prop_obj, "type", "string"); + } + //LOGE("mcp_tool_to_json prop->name:%s\n\n", prop->name); + // 添加描述 + cJSON_AddStringToObject(prop_obj, "description", prop->name); + + // 添加到properties对象 + + cJSON_AddItemToObject(properties_obj, prop->name, prop_obj); + + // 如果是必需属性,添加到required数组 + if (!prop->has_default_value) { + cJSON_AddItemToArray(required_array, cJSON_CreateString(prop->name)); + } + } + + // 如果有必需属性,添加required数组 + if (cJSON_GetArraySize(required_array) > 0) { + cJSON_AddItemToObject(input_schema, "required", required_array); + } else { + cJSON_Delete(required_array); + } + + // 转换为JSON字符串 + char* input_schema_str = cJSON_PrintUnformatted(input_schema); + cJSON_Delete(input_schema); + + // 构建工具的JSON表示 + char* json = (char*)malloc(strlen(escaped_name) + strlen(escaped_description) + strlen(input_schema_str) + 100); + if (json) { + sprintf(json, "{\"name\":\"%s\",\"description\":\"%s\",\"inputSchema\":%s}", + escaped_name, escaped_description, input_schema_str); + } + + free(escaped_name); + free(escaped_description); + free(input_schema_str); + + return json; +} + +char* mcp_tool_call(const McpTool* tool, const PropertyList* properties) { + if (!tool || !tool->callback) return NULL; + + // 调用回调函数 + ReturnValue result = tool->callback(properties); + + // 根据返回值类型构建JSON响应 + char* json = NULL; + + if (result.type == RETURN_TYPE_BOOLEAN) { + json = (char*)malloc(20); + if (json) { + sprintf(json, "%s", result.value.boolean_value ? "true" : "false"); + } + } else if (result.type == RETURN_TYPE_INTEGER) { + json = (char*)malloc(20); + if (json) { + sprintf(json, "%d", result.value.integer_value); + } + } else if (result.type == RETURN_TYPE_STRING) { + char* escaped_value = escape_json_string(result.value.string_value ? result.value.string_value : ""); + json = (char*)malloc(strlen(escaped_value) + 3); + if (json) { + sprintf(json, "\"%s\"", escaped_value); + } + free(escaped_value); + } + + // 释放返回值中的资源 + return_value_destroy(&result); + + return json; +} + +// MCP服务器函数实现 +McpServer* mcp_server_create(void) { + McpServer* server = (McpServer*)malloc(sizeof(McpServer)); + if (!server) { + LOGE( "Failed to allocate memory for MCP server\n"); + return NULL; + } + + server->tools = (McpTool**)malloc(sizeof(McpTool*) * DEFAULT_CAPACITY); + if (!server->tools) { + LOGE( "Failed to allocate memory for tools array\n"); + free(server); + return NULL; + } + + server->tool_count = 0; + server->tool_capacity = DEFAULT_CAPACITY; + + + thing_start = 1; + bk_err_t ret = BK_OK; + ret = rtos_init_queue(&thing_msg_que, "mcp_msg_que", sizeof(thing_msg_t), 5); + if (ret != kNoErr) + { + bk_printf("create thing_msg_que queue fail\n"); + } + ret = rtos_create_thread(&thing_thread_hdl, + 4, + "mcp_send", + (beken_thread_function_t)mcp_send_thread_task, + 5 * 1024, + NULL); + if (ret != kNoErr) + { + thing_thread_hdl = NULL; + } + + return server; +} + +void mcp_server_destroy(McpServer* server) { + if (!server) return; + + for (int i = 0; i < server->tool_count; i++) { + mcp_tool_destroy(server->tools[i]); + } + + free(server->tools); + free(server); +} + +McpServer* mcp_server_get_instance(void) { + if (!g_mcp_server) { + g_mcp_server = mcp_server_create(); + if (g_mcp_server) { + mcp_server_add_common_tools(g_mcp_server); + } + } + + return g_mcp_server; +} + +// 声明外部C++函数,用于调用Board类的方法 +#ifdef __cplusplus +extern "C" { +#endif + char* board_get_status_json(void); + void board_set_volume(int volume); + void board_set_brightness(int brightness); + void board_set_theme(const char* theme); + bool board_has_camera(void); + char* board_take_photo(void); +#ifdef __cplusplus +} +#endif + + +void mcp_server_add_common_tools(McpServer* server) { + if (!server) return; + + +} + +void mcp_server_add_tool(McpServer* server, McpTool* tool) { + if (!server || !tool) return; + + // 检查是否需要扩容 + if (server->tool_count >= server->tool_capacity) { + int new_capacity = server->tool_capacity * 2; + McpTool** new_tools = (McpTool**)realloc(server->tools, sizeof(McpTool*) * new_capacity); + if (!new_tools) { + LOGE( "Failed to reallocate memory for tools array\n"); + return; + } + + server->tools = new_tools; + server->tool_capacity = new_capacity; + } + + server->tools[server->tool_count++] = tool; +} + +void mcp_server_add_tool_with_params(McpServer* server, const char* name, const char* description, PropertyList* properties, McpToolCallback callback) { + if (!server || !name || !description || !callback) return; + LOGE( "!!!!properties %d\n,",properties->count); + + McpTool* tool = mcp_tool_create(name, description, properties, callback); + if (tool) { + mcp_server_add_tool(server, tool); + } +} + +void mcp_server_parse_message(McpServer* server, const char* message) { + if (!server || !message) return; + + cJSON* json = cJSON_Parse(message); + if (!json) { + LOGE( "Failed to parse JSON message: %s\n", message); + return; + } + + mcp_server_parse_message_json(server, json); + cJSON_Delete(json); +} + +void mcp_server_parse_message_json(McpServer* server, const cJSON* json) { + if (!server || !json) return; + + // Check JSONRPC version + cJSON* version = cJSON_GetObjectItem(json, "jsonrpc"); + if (version == NULL || !cJSON_IsString(version) || strcmp(version->valuestring, "2.0") != 0) { + LOGE("Invalid JSONRPC version: %s\n", version ? version->valuestring : "null"); + return; + } + + // Check method + cJSON* method = cJSON_GetObjectItem(json, "method"); + if (method == NULL || !cJSON_IsString(method)) { + LOGE("Missing method\n"); + return; + } + + cJSON* id = cJSON_GetObjectItem(json, "id"); + if (id == NULL || !cJSON_IsNumber(id)) { + return; + } + int id_int = id->valueint; + + LOGE( "mcp:%d %s\n",id_int,method->valuestring); + // Check params + cJSON* params = cJSON_GetObjectItem(json, "params"); + // 获取消息类型 + //cJSON* type = cJSON_GetObjectItem(json, "type"); + //if (!type || !cJSON_IsString(type)) { + // LOGE( "Missing or invalid 'type' field in message\n"); + // return; + //} + + // 处理不同类型的消息 + if (strcmp(method->valuestring, "initialize") == 0) { + + char message[256] = {0}; + sprintf(message, "{\"protocolVersion\":\"2024-11-05\",\"capabilities\":{\"tools\":{}},\"serverInfo\":{\"name\":\"%s\",\"version\":\"%s\"}}", APPLICATION_DEVICE_BOARD_NAME, APPLICATION_VERSION); + reply_result(id_int, message); + } + // + else if (strcmp(method->valuestring, "tools/list") == 0) { + + LOGE( "------> tools/list\n"); + // 处理列出工具请求 + cJSON* id = cJSON_GetObjectItem(json, "id"); + if (!id || !cJSON_IsNumber(id)) { + LOGE( "Missing or invalid 'id' field in list_tools message\n"); + return; + } + //mcp_server_add_common_tools(server); + + LOGE( "------> server->tool_count :%d\n",server->tool_count); + // 构建工具列表响应 + #if 1 + cJSON* tools_array = cJSON_CreateArray(); + for (int i = 0; i < server->tool_count; i++) { + char* tool_json_str = mcp_tool_to_json(server->tools[i]); + if (tool_json_str) { + + cJSON* tool_json = cJSON_Parse(tool_json_str); + if (tool_json) { + cJSON_AddItemToArray(tools_array, tool_json); + } + LOGE("tool(%d) %s\n",i,tool_json_str); + free(tool_json_str); + } + } + #endif + cJSON* response = cJSON_CreateObject(); + cJSON_AddItemToObject(response, "tools", tools_array); + + char* response_str = cJSON_PrintUnformatted(response); + if (response_str) { + //send_mcp_message(response_str); + reply_result(id_int, response_str); + free(response_str); + } + cJSON_Delete(response); + } else if (strcmp(method->valuestring, "tools/call") == 0) { + // 处理调用工具请求 + //{"type":"mcp","payload":{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"self.screen.set_brightness","arguments":{"brightness":100}}}} + //cJSON* id = cJSON_GetObjectItem(json, "id"); + + if (!cJSON_IsObject(params)) { + LOGE( "tools/call: Missing params"); + reply_error(id_int, "Missing params"); + return; + } + cJSON* name = cJSON_GetObjectItem(params, "name"); + if (!cJSON_IsString(name)) { + LOGE( "tools/call: Missing name"); + reply_error(id_int, "Missing name"); + return; + } + cJSON* arguments = cJSON_GetObjectItem(params, "arguments"); + if (arguments != NULL && !cJSON_IsObject(arguments)) { + LOGE( "tools/call: Invalid arguments"); + reply_error(id_int, "Invalid arguments"); + return; + } + + //cJSON* name = cJSON_GetObjectItem(json, "name"); + //cJSON* arguments = cJSON_GetObjectItem(json, "arguments"); + + // 查找工具 + McpTool* tool = NULL; + for (int i = 0; i < server->tool_count; i++) { + if (strcmp(server->tools[i]->name, name->valuestring) == 0) { + tool = server->tools[i]; + break; + } + } + + if (!tool) { + reply_error(id->valueint, "Tool not found"); + return; + } + + // 解析参数 + PropertyList* props = property_list_create(); + if (!props) { + reply_error(id->valueint, "Failed to create property list"); + return; + } + + // 复制工具的属性定义 + for (int i = 0; i < tool->properties.count; i++) { + Property* prop = &tool->properties.properties[i]; + Property* new_prop = NULL; + + if (prop->type == PROPERTY_TYPE_BOOLEAN) { + new_prop = property_create_boolean(prop->name, prop->has_default_value, prop->value.boolean_value); + } else if (prop->type == PROPERTY_TYPE_INTEGER) { + new_prop = property_create_integer(prop->name, prop->has_default_value, prop->value.integer_value, prop->has_range, prop->min_value, prop->max_value); + } else if (prop->type == PROPERTY_TYPE_STRING) { + new_prop = property_create_string(prop->name, prop->has_default_value, prop->value.string_value); + } + + if (new_prop) { + property_list_add_property(props, new_prop); + } + } + + // 设置参数值 + if (arguments && cJSON_IsObject(arguments)) { + cJSON* arg; + cJSON_ArrayForEach(arg, arguments) { + LOGE("cJSON_ArrayForEach arguments %s\n",arg->string); + Property* prop = property_list_get_by_name(props, arg->string); + if (prop) { + if (prop->type == PROPERTY_TYPE_BOOLEAN && cJSON_IsBool(arg)) { + property_set_boolean_value(prop, cJSON_IsTrue(arg)); + } else if (prop->type == PROPERTY_TYPE_INTEGER && cJSON_IsNumber(arg)) { + property_set_integer_value(prop, arg->valueint); + } else if (prop->type == PROPERTY_TYPE_STRING && cJSON_IsString(arg)) { + property_set_string_value(prop, arg->valuestring); + } + } + } + } + + // 检查必需参数 + int required_count = 0; + char** required = property_list_get_required(&tool->properties, &required_count); + bool missing_required = false; + + for (int i = 0; i < required_count; i++) { + LOGE("required %s\n",required[i]); + Property* prop = property_list_get_by_name(props, required[i]); + if (!prop) { + missing_required = true; + break; + } + } + + // 释放必需参数数组 + for (int i = 0; i < required_count; i++) { + free(required[i]); + } + free(required); + + if (missing_required) { + reply_error(id->valueint, "Missing required parameters"); + property_list_destroy(props); + return; + } + + // 创建线程参数 + ToolCallThreadArgs* thread_args = (ToolCallThreadArgs*)malloc(sizeof(ToolCallThreadArgs)); + if (!thread_args) { + reply_error(id->valueint, "Failed to allocate memory for thread arguments"); + property_list_destroy(props); + return; + } + + thread_args->id = id->valueint; + thread_args->tool = tool; + thread_args->properties = props; + + // 创建线程 + bk_err_t ret = BK_OK; + ret = rtos_create_thread(NULL, BEKEN_APPLICATION_PRIORITY, + "ToolCall", + (beken_thread_function_t)tool_call_thread_func, + 5120, + thread_args); + + if (kNoErr != ret){ + reply_error(id->valueint, "Failed to create thread"); + property_list_destroy(props); + free(thread_args); + } + + } else { + LOGE("Unknown message method: %s\n", method->valuestring); + } +} + +// 工具线程函数 +static void* tool_call_thread_func(void* arg) { + ToolCallThreadArgs* thread_args = (ToolCallThreadArgs*)arg; + if (!thread_args) { + return NULL; + } + + int id = thread_args->id; + McpTool* tool = thread_args->tool; + PropertyList* properties = thread_args->properties; + + // 调用工具 + char* result = mcp_tool_call(tool, properties); + + // 发送响应 + if (result) { + reply_result(id, result); + free(result); + } else { + reply_error(id, "Tool call failed"); + } + + // 清理资源 + property_list_destroy(properties); + free(thread_args); + + return NULL; +} + + + + +static void mcp_send_thread_task(void *arg) +{ + bk_err_t ret = BK_OK; + while(thing_start){ + + thing_msg_t msg; + ret = rtos_pop_from_queue(&thing_msg_que, &msg, BEKEN_WAIT_FOREVER); + if (kNoErr == ret) + { + switch (msg.type) + { + // 发送数据到平台 + case 0: + { + //没有连接平台的情况下 不允许发送数据 + if(!g_connected_flag){ + break; + } + rtc_session *beken_rtc = __get_beken_rtc(); + if(beken_rtc == NULL){ + break; + } + transport bk_rtc_ws = beken_rtc->bk_rtc_client; + // bk_printf("!!!!!!!!!!!!!!!!\n"); + if(bk_rtc_ws == NULL){\ + break; + } + websocket_client_send_text(bk_rtc_ws, msg.data, msg.data_len, 10*1000); + os_free(msg.data); + //bk_printf("555555\n"); + break; + } + } + } + } + /* delete msg queue */ + ret = rtos_deinit_queue(&thing_msg_que); + if (ret != kNoErr) + { + bk_printf("delete spi_led_msg_que fail\n"); + } + thing_msg_que = NULL; + /* delete task */ + if(thing_thread_hdl!= NULL) { + rtos_delete_thread(&thing_thread_hdl); + thing_thread_hdl = NULL; + } + bk_printf("delete thing_thread_hdl task\n"); +} + +// 辅助函数 +static void send_mcp_message( char *message) +{ + if (!message) + return; + + // 在实际实现中,这里应该将消息发送到适当的通信通道 + // 例如,通过WebSocket、MQTT或其他通信方式 + // 这里简单地打印消息 + //LOGE("SEND MCP (%d): %s\n", strlen(message),message); + // 没有连接平台的情况下 不允许发送数据 + if (!g_connected_flag) + { + return; + } + if (thing_msg_que != NULL) + { + thing_msg_t msg; + msg.type = 0; + msg.data = os_malloc(strlen(message)+1); + strcpy(msg.data, message); + msg.data_len = strlen(message); + rtos_push_to_queue(&thing_msg_que, &msg, BEKEN_NO_WAIT); + } +} + +static void reply_result(int id, const char* result) { + if (!result) return; + + cJSON* response = cJSON_CreateObject(); + cJSON_AddStringToObject(response, "session_id", getGlobalSessionId()); + cJSON_AddStringToObject(response, "type", "mcp"); + + cJSON* playload = cJSON_CreateObject(); + cJSON_AddStringToObject(playload, "jsonrpc", "2.0"); + cJSON_AddNumberToObject(playload, "id", id); + // 尝试解析结果为JSON + cJSON* result_json = cJSON_Parse(result); + if (result_json) { + cJSON_AddItemToObject(playload, "result", result_json); + } else { + cJSON_AddStringToObject(playload, "result", result); + } + cJSON_AddItemToObject(response, "payload", playload); + + char* response_str = cJSON_PrintUnformatted(response); + if (response_str) { + send_mcp_message(response_str); + free(response_str); + } + cJSON_Delete(response); +} + +static void reply_error(int id, const char* message) { + if (!message) return; + + cJSON* response = cJSON_CreateObject(); + cJSON_AddStringToObject(response, "session_id", getGlobalSessionId()); + cJSON_AddStringToObject(response, "type", "mcp"); + + cJSON* playload = cJSON_CreateObject(); + cJSON_AddStringToObject(playload, "jsonrpc", "2.0"); + cJSON_AddNumberToObject(playload, "id", id); + + + cJSON* msg = cJSON_CreateObject(); + cJSON_AddStringToObject(msg, "message", message); + cJSON_AddItemToObject(playload, "error", msg); + cJSON_AddItemToObject(response, "payload", playload); + char* response_str = cJSON_PrintUnformatted(response); + if (response_str) { + send_mcp_message(response_str); + free(response_str); + } + + cJSON_Delete(response); +} + +static char* escape_json_string(const char* str) { + if (!str) return strdup_safe(""); + + // 计算转义后的长度 + size_t len = 0; + const unsigned char* p = (const unsigned char*)str; + while (*p) { + // 检查是否是UTF-8多字节字符的开始 + if ((*p & 0x80) == 0) { + // ASCII字符 + if (*p == '\"' || *p == '\\' || *p < 32) { + len += 2; // 需要转义 + } else { + len += 1; + } + p++; + } else if ((*p & 0xE0) == 0xC0) { + // 2字节UTF-8字符 + len += 2; + p += 2; + } else if ((*p & 0xF0) == 0xE0) { + // 3字节UTF-8字符(大多数中文) + len += 3; + p += 3; + } else if ((*p & 0xF8) == 0xF0) { + // 4字节UTF-8字符 + len += 4; + p += 4; + } else { + // 无效的UTF-8序列,按单字节处理 + len += 1; + p++; + } + } + + // 分配内存(预留额外空间以防万一) + char* escaped = (char*)malloc(len * 2 + 1); + if (!escaped) { + LOGE("Failed to allocate memory for JSON string escaping"); + return strdup_safe(str); + } + + // 转义字符 + const unsigned char* src = (const unsigned char*)str; + char* dst = escaped; + + while (*src) { + // 检查是否是UTF-8多字节字符的开始 + if ((*src & 0x80) == 0) { + // ASCII字符 + if (*src == '\"') { + *dst++ = '\\'; + *dst++ = '\"'; + } else if (*src == '\\') { + *dst++ = '\\'; + *dst++ = '\\'; + } else if (*src < 32) { + *dst++ = '\\'; + switch (*src) { + case '\b': *dst++ = 'b'; break; + case '\f': *dst++ = 'f'; break; + case '\n': *dst++ = 'n'; break; + case '\r': *dst++ = 'r'; break; + case '\t': *dst++ = 't'; break; + default: + sprintf(dst, "u%04x", *src); + dst += 5; + break; + } + } else { + *dst++ = *src; + } + src++; + } else if ((*src & 0xE0) == 0xC0 && *(src+1) && (*(src+1) & 0xC0) == 0x80) { + // 2字节UTF-8字符 + *dst++ = *src++; + *dst++ = *src++; + } else if ((*src & 0xF0) == 0xE0 && *(src+1) && (*(src+1) & 0xC0) == 0x80 && + *(src+2) && (*(src+2) & 0xC0) == 0x80) { + // 3字节UTF-8字符(大多数中文) + *dst++ = *src++; + *dst++ = *src++; + *dst++ = *src++; + } else if ((*src & 0xF8) == 0xF0 && *(src+1) && (*(src+1) & 0xC0) == 0x80 && + *(src+2) && (*(src+2) & 0xC0) == 0x80 && *(src+3) && (*(src+3) & 0xC0) == 0x80) { + // 4字节UTF-8字符 + *dst++ = *src++; + *dst++ = *src++; + *dst++ = *src++; + *dst++ = *src++; + } else { + // 无效的UTF-8序列,按单字节处理 + *dst++ = *src++; + } + } + *dst = '\0'; + + return escaped; +} + +static char* strdup_safe(const char* str) { + if (!str) return NULL; + + size_t len = strlen(str); + char* dup = (char*)malloc(len + 1); + if (dup) { + // 使用strcpy而不是memcpy,确保正确处理字符串终止符 + strcpy(dup, str); + + // 验证复制的字符串是否有效 + if (strlen(dup) != len) { + LOGW("String length mismatch after duplication\n"); + } + } else { + LOGE("Failed to allocate memory for string duplication\n"); + } + + return dup; +} \ No newline at end of file diff --git a/bk_aidk/projects/beken_wss_paopao/main/mcp/mcp_server.h b/bk_aidk/projects/beken_wss_paopao/main/mcp/mcp_server.h new file mode 100755 index 00000000..e2709a1c --- /dev/null +++ b/bk_aidk/projects/beken_wss_paopao/main/mcp/mcp_server.h @@ -0,0 +1,137 @@ +#ifndef MCP_SERVER_C_H +#define MCP_SERVER_C_H + +#include +#include +#include "cJSON.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// 属性类型枚举 +typedef enum { + PROPERTY_TYPE_BOOLEAN, + PROPERTY_TYPE_INTEGER, + PROPERTY_TYPE_STRING +} PropertyType; + +// 返回值类型枚举 +typedef enum { + RETURN_TYPE_BOOLEAN, + RETURN_TYPE_INTEGER, + RETURN_TYPE_STRING +} ReturnType; + +// 返回值联合体 +typedef struct { + ReturnType type; + union { + bool boolean_value; + int integer_value; + char* string_value; + } value; +} ReturnValue; + +// 属性结构体 +typedef struct { + char* name; + char* description; + PropertyType type; + bool has_default_value; + union { + bool boolean_value; + int integer_value; + char* string_value; + } value; + bool has_range; + int min_value; + int max_value; +} Property; + +// 属性列表结构体 +typedef struct { + Property* properties; + int count; + int capacity; +} PropertyList; + +// MCP工具回调函数类型 +typedef ReturnValue (*McpToolCallback)(const PropertyList* properties); + +// MCP工具结构体 +typedef struct { + char* name; + char* description; + PropertyList properties; + McpToolCallback callback; +} McpTool; + +// MCP服务器结构体 +typedef struct { + McpTool** tools; + int tool_count; + int tool_capacity; +} McpServer; + +// 全局单例 +extern McpServer* g_mcp_server; + +// 属性函数 +Property* property_create_boolean(const char* name, bool has_default, bool default_value); +Property* property_create_integer(const char* name, bool has_default, int default_value, bool has_range, int min_value, int max_value); +Property* property_create_string(const char* name, bool has_default, const char* default_value); +void property_destroy(Property* property); +const char* property_get_name(const Property* property); +PropertyType property_get_type(const Property* property); +bool property_has_default_value(const Property* property); +bool property_has_range(const Property* property); +int property_get_min_value(const Property* property); +int property_get_max_value(const Property* property); +bool property_get_boolean_value(const Property* property); +int property_get_integer_value(const Property* property); +const char* property_get_string_value(const Property* property); +void property_set_boolean_value(Property* property, bool value); +void property_set_integer_value(Property* property, int value); +void property_set_string_value(Property* property, const char* value); +char* property_to_json(const Property* property); + +// 属性列表函数 +PropertyList* property_list_create(void); +PropertyList* property_list_create_with_capacity(int capacity); +void property_list_destroy(PropertyList* list); +void property_list_add_property(PropertyList* list, Property* property); +Property* property_list_get_by_name(const PropertyList* list, const char* name); +char** property_list_get_required(const PropertyList* list, int* count); +char* property_list_to_json(const PropertyList* list); + +// 返回值函数 +ReturnValue return_value_create_boolean(bool value); +ReturnValue return_value_create_integer(int value); +ReturnValue return_value_create_string(const char* value); +void return_value_destroy(ReturnValue* value); + +// MCP工具函数 +McpTool* mcp_tool_create(const char* name, const char* description, PropertyList* properties, McpToolCallback callback); +void mcp_tool_destroy(McpTool* tool); +const char* mcp_tool_get_name(const McpTool* tool); +const char* mcp_tool_get_description(const McpTool* tool); +const PropertyList* mcp_tool_get_properties(const McpTool* tool); +char* mcp_tool_to_json(const McpTool* tool); +char* mcp_tool_call(const McpTool* tool, const PropertyList* properties); + +// MCP服务器函数 +McpServer* mcp_server_create(void); +void mcp_server_destroy(McpServer* server); +McpServer* mcp_server_get_instance(void); +void mcp_server_add_common_tools(McpServer* server); +void mcp_server_add_tool(McpServer* server, McpTool* tool); +void mcp_server_add_tool_with_params(McpServer* server, const char* name, const char* description, PropertyList* properties, McpToolCallback callback); +void mcp_server_parse_message(McpServer* server, const char* message); +void mcp_server_parse_message_json(McpServer* server, const cJSON* json); + +#ifdef __cplusplus +} +#endif + +#endif // MCP_SERVER_C_H \ No newline at end of file diff --git a/bk_aidk/projects/beken_wss_paopao/main/websocket_rtc_demo.c b/bk_aidk/projects/beken_wss_paopao/main/websocket_rtc_demo.c index c5d9ac91..dff72a3f 100755 --- a/bk_aidk/projects/beken_wss_paopao/main/websocket_rtc_demo.c +++ b/bk_aidk/projects/beken_wss_paopao/main/websocket_rtc_demo.c @@ -35,6 +35,8 @@ #include "thing.h" #include "iot_ota.h" #include "iot_lamp.h" +#include "application.h" +#include "mcp/mcp_server.h" #define TAG "WS_MAIN" #define LOGI(...) BK_LOGI(TAG, ##__VA_ARGS__) @@ -525,7 +527,7 @@ void rtc_websocket_msg_handle(char *json_text, unsigned int size) LOGE("Error: Failed to parse JSON text:%s\n", json_text); return; } - // bk_printf("rtc_websocket_msg_handle json_text : %s \n",json_text); + //bk_printf("TEXT: %s \n",cJSON_PrintUnformatted(root)); cJSON *type = cJSON_GetObjectItem(root, "type"); if (type == NULL) { @@ -566,6 +568,42 @@ void rtc_websocket_msg_handle(char *json_text, unsigned int size) { thing_iot_invoke(json_text); } + else if (strcmp(type->valuestring, "llm") == 0) + { + cJSON *emotion = cJSON_GetObjectItem(root, "emotion"); + if(emotion != NULL){ + LOGE("emotion--> %s\n",emotion->valuestring); + } + + } + else if (strcmp(type->valuestring, "stt") == 0) + { + cJSON *text = cJSON_GetObjectItem(root, "text"); + if(text != NULL){ + LOGE(">> %s\n",text->valuestring); + } + + } + else if (strcmp(type->valuestring, "tts") == 0) + { + cJSON *state = cJSON_GetObjectItem(root, "state"); + cJSON *text = cJSON_GetObjectItem(root, "text"); + if(state != NULL && text != NULL){ + LOGE("<< (%s) %s\n",state->valuestring,text->valuestring); + } + } + + #if APPLICATION_IOT_PROTOCOL_MCP + else if (strcmp(type->valuestring, "mcp") == 0) { + cJSON * payload = cJSON_GetObjectItem(root, "payload"); + if (cJSON_IsObject(payload)) { + //LOGE("MCP: %s\n", cJSON_PrintUnformatted(payload)); + McpServer* mcp_server = mcp_server_get_instance(); + mcp_server_parse_message_json(mcp_server, payload); + //McpServer::GetInstance().ParseMessage(payload); + } + } + #endif // else if ((strcmp(type->valuestring, "reply_text") == 0) || (strcmp(type->valuestring, "request_text") == 0)) { // text_info_t info = {0}; @@ -690,7 +728,7 @@ void sent_abort_msg() //bk_printf("rtc_websocket_send_text_BEKEN_RTC_SEND_ABORT_BEKEN_RTC_SEND_STOP_LISTEN_BEKEN_RTC_SEND_START_LISTEN\r\n"); rtc_websocket_send_text(client, (void *)(&audio_info), BEKEN_RTC_SEND_ABORT); - rtc_websocket_send_text(client, (void *)(&audio_info), BEKEN_RTC_SEND_START); + rtc_websocket_send_text(client, (void *)(&audio_info), BEKEN_RTC_SEND_START_LISTEN); // rtc_websocket_send_text(client, (void *)(&audio_info), BEKEN_RTC_SEND_STOP_LISTEN); @@ -769,12 +807,14 @@ void rtc_websocket_event_handler(void *event_handler_arg, char *event_base, int3 LOGE("Connected to WebSocket server\r\n"); rtc_websocket_send_text(client, (void *)(&audio_info), BEKEN_RTC_SEND_HELLO); rtos_delay_milliseconds(100); - rtc_websocket_send_text(client, (void *)(&audio_info), BEKEN_RTC_SEND_START); + rtc_websocket_send_text(client, (void *)(&audio_info), BEKEN_RTC_SEND_START_LISTEN); + + //2025.07.07 + //rtos_delay_milliseconds(100); + //rtc_websocket_send_text(client, (void *)(&audio_info), BEKEN_RTC_SEND_IOT_DESC); + //rtos_delay_milliseconds(20); + //thing_report_device_state(); - rtos_delay_milliseconds(100); - rtc_websocket_send_text(client, (void *)(&audio_info), BEKEN_RTC_SEND_IOT_DESC); - rtos_delay_milliseconds(20); - thing_report_device_state(); // rtc_websocket_send_text(client, (void *)(&audio_info), BEKEN_RTC_SEND_START_LISTEN); // rtos_delay_milliseconds(200); @@ -787,7 +827,7 @@ void rtc_websocket_event_handler(void *event_handler_arg, char *event_base, int3 __get_beken_rtc()->disconnecting_state++; if (__get_beken_rtc()->disconnecting_state == 1) { - app_event_send_msg(APP_EVT_RTC_CONNECTION_LOST, 0); + //app_event_send_msg(APP_EVT_RTC_CONNECTION_LOST, 0); } // beken_rtc_stop();//zhanyu @@ -1019,6 +1059,7 @@ void beken_auto_run(void) } */ //bk_https_ota_download("https://xiaozhi.xa-poka.com/xiaozhi/otaMag/download/59cc091e-eaf3-417d-a524-d5e3d95883f4"); + beken_rtc_start(); } }