ble_fota.bin 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539
  1. ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿTAULÀ¥��Z¥Z¥�����þ4Z¥Z¥Æîble_file_fota.luac^��þ¥
  2. Lua\S�“
  3. 
  4. xV�����������(w@@@Rble_file_fota.lua������������©r ���K��J@@€JÀ@�JÀ@‚J€Á‚‹��Š�ƒ·kŠ€Â„Š�Ã…Š€Ã†ì���,A��l���¬Á��
  5. €�‡€à¬�
  6. €ˆ&��&�€���� is_upgradi=�ng� total_size��������recei¤�ved_size upgrade_file/ble_fotDÙa.bin service_uuidF000char_R—uuid_cmdF001char_uuid_data,³F002max_packet_sizeÈ��������procproc_disconnect��������bL(���-����� ����@�@@�C�€�$@�`�€@�À@�A���@�$@€€A�ÀA�$@€�&¤��€����fotafinishloginfo¹> FOTA_CMD正在é‡�å�¯è®¾å¤‡..�?.rtosreboot��������� ���*��dy�*���*���*���+���+���+���+���+��ƒë�,���,���,���-����������_ENV�0I
  7. ���Ÿ���� ��F�@�G@À��€��ÁÀ�� úAA�$��AA�œ��d@�\��� €Á�@€F�ÈÍ@�GÀÁ��€��Á��d@€&�€�L@B�Á€�d€x<€†�@�‡@@Á€����@€�†ÁB�‡CÁA�p��€�¤€¤@��€Á�@€†�@�‡@@Á€‰����¤@€œ���!€€‡À€†ÀB�‡�DÁ@:2����A��¤€�Æ�@�Ç@À���AÁ�€áX�Á�ä@€Æ�@�Ç@À���AA�ä@€Æ€ 1E�ÇÀÅ䀀�â���€ €Æ�@�Ç@À���A¢¦�ä@€Æ�@�Ç@À���AA�ä@€Æ€F�ÇÀÂÆÇ�ä€�â����€Æ�@�Ç@À���AAC�ä@€HÀG�H€��H€È�Æ�@�Ç@À���AÁõf�� �ÆÈ�B �FÇ�ä@€Æ�@�Ç@À�–|��A� �ä@€€(€Æ�@�ÇÀÁ���AÁ �ä@–\€�'€†�@�‡ÀAÁ€��
  8. �¤@€€%€€¯êÄ�@"€†�@�‡@@Á€��A
  9. �¤@€†€Ç�¢@&��@€†�@�‡€JÁ€��Á
  10. �¤@€&�€�†�1É@�‡@@Á€�� �¤@€†�@�‡@@Á€��A0a �FAÈ���¤@€†�@�‡@@Á€��� �F‘wÈ���¤@€†@È�Æ�È�À�À€†�@�‡@™’@Á€��Á �¤@€†�@�‡@@Á€�� �¤@Š€†@L�‡€LÆ�Ç�¤€�Æ�@�Ç@À���AÁ> �€�Á�ä@€Æ€E�Ç�ÍÇ�äÀ�F [@�GAÀ����ÁA �‚ �@€� �À�dAˆ¡€â���@€"��À€F@�GAÀ����Áìd�dA€F@�GAÀ����ÁA�dA€F�N�GÁS|Î…�Á�dA€€€F@�GÁÁ����ÁA|ï�dA€�€†�@�‡ÀAÁ€����¤@€†�,’@�‡@@Á€��Á�¤@€H�P�†�Ç�¢����ÉA€†€F�‡ÀFÆ�Ç�¤€�¢���@€†�@�‡@2—@Á€��A�¤@€�€†�@�‡€JÁ€���)Œ�¤@€†€E�‡ÀPÃ���¤@�†�@�‡@@Á€lI���¤@€€€†�@�‡€JÁ€��A�@ïÀ�†ÁB�‡CÁA��€�¤€¤@��&�€�F�„��loginfo FOTA_CMD收到åÈÏ‘½ä»¤æ•°æ�®:toHex长度:��¾J�����error命令数æ�®ä¸ºç©ºvïbyteè§£æž�命令ç �:stringv
  11. format (0x%02X)处ç�†å¼€å§‹ƒùå�‡çº§å‘½ä»¤�������unpack<ò¹I4�������文件总大å°�:å™r­—节åˆ�始化FOTAå­�系统...î;fotainitFOTAåˆ�始化æˆ�åŠ8~ŸFOTA底层准备就绪osrÈÑemove upgrade_file已清ç�†æ—õ§ä¸´æ—¶æ–‡ä»¶ is_upgrading t/^otal_sizereceived_size��������l�å�‡çº§çжæ€�已设置 总大&�å°�:临时文件:准备接æ”õ[¶å›ºä»¶æ•°æ�®...FOTAåˆ�始化å�ò¤±è´¥(开始命令格å¼�错误ï值Œé•¿åº¦ä¸�è¶³处ç�†ç»“æ�Ÿå�‡ç¬}º§å‘½ä»¤warn+未处于å�‡çº§ç� жæ€�,忽略结æ�Ÿå‘½ä»¤验莻¯�文件完整性... 已接收:R; 应接收:文件完整性验Ÿ.è¯�通过开始执行FOTAå�‡çº3ާ...io fileSize文件大å°�×ó:fileFOTAå�‡çº§ç»“æžœ:resuùlt:isDone: FOTAå�‡çº§æˆ�功ïut¼�V2ç§’å�Žè®¾å¤‡å°†è‡ªåЍé‡�å�¯Ux...,é‡�å�¯å�Žé€šè¿‡æ—¥å¿—判æ–ÎŽ­æœ€ç»ˆæ˜¯å�¦å�‡çº§æˆ�功sys „«timerStartÐ������FOTAå�‡çº§å–«¤±è´¥文件ä¸�完整,å�‡çº§ålV¤±è´¥清ç�†å�‡çº§çжæ€�...�´Û已删除临时文件删除临Ñj时文件失败finishå�‡çº§æórµ�程结æ�Ÿ未知命令ç �:��Ù6������� ��1���1���1���1���1œþ���1���1���1���1���4���4���4���5©ƒ���5���5���5���5���6���:���:���:[m���;���;���;���;���;���;���;���;Oµ���;���;���;���>���>���?���?���?È���?���?���B���B���B���D���D���D ”���D���D���D���E���E���E���E���EBŠ���E���E���H���H���H���H���H���Iæî���I���I���I���I���J���J���J���J���J���M���M���M���M���M���P���PU ���P���P���P���P���Q���Q���Q���Q7=���Q���U���V���W���Y���Y���Y���YßË���Z���Z���[���[���Y���\���\���\ܳ���\���\���\���^���^���^���^���^à×���_���a���a���a���a���a���b���exÆ���e���f���f���f���f���f���i���i¡���i���j���j���j���j���j���k���oò™���o���o���o���o���p���p���p���pwÉ���p���p���p���q���q���q���q���qÈ.���q���q���s���s���s���s���t���tÈ#���t���t���t���w���w���w���w���wx���x���x���x���x���y���y���y���yPx���y���y���y���z���z���z���z���{Ú·���{���{���{���{���{���{���{���{½½���}���}���}���}���~���~���~���~Ÿ¬���~�����������������������„���„����„���„���„���„���†���†���†���†Ø"���†���‡���‰���‰���‰���‰���‰����Õ�������������������Ž���‘���‘���‘�~���’���’���’���’���’���’���“���“¿Q���“���“���“���“���•���•���•���•Ù¤���•���š���š���š���š���›���›���›'^���›���›���›��������������������Ó����������������������������Ÿ���ù½��� cmd_data���� ��cmd��� ��Ñ total_size0���m���
  12. file_size©��7-�Ö���result´���Ö���isDone´���Ö“z������_ENVupgrade_state ble_rÜceboot�£���É���� W���F�@�G@À��€�Òç�ÁÀ����A�d@€F@Á�b@��@€F�@×7�G€Á��€��ÁÀ�d@€&�€�F�@�G@À��€�!§�Á��AÂ�d@�F€B�GÀÂ�†@Â�Á��d€€1Fb���@ €Œ@Ã����¤@€Œ€Ã�¤@�†Àù˜�Ü����À�H€€‡†�D�‡@DÆÀÃ��Ä�Ò��¶ïÏÀĤ€�ÆÀÃ�EAEÐ��_€ÅÀ�Âõ€ÆÀÃ��Ä�!À�À€Æ�@�Ç@À���AÁ/ �€�Á�B�FÂÃ��‚�Æ‚Ä�Ã�ä@�wËÆ�@�Ç@À���A�†ÁÃ�Á�ä@€€§�€†�@�‡@GÁ€����FAÂ�¤@�HÀÇ‚†�H¼�‡@HÃ���¤@�&�€�"���loginfo�ø
  13. FOTA_DATA收到数æ�®åŒ…,éäu•¿åº¦:字节 is_upgradingwaUrn%未处于å�‡çº§çжæ€�,忽çÖÛ•¥æ•°æ�®写入文件: upgrade©_fileioopenabwriteclos”¼ereceived_sizemathfloor td~otal_sized�������max_packet_s>Ãize2���������������å�‡çº§è¿›9@度:%(/)#æ•°æ�®å†™å…¥æˆ®b�功,当å‰�总计:error打õ开文件失败:�fotafinish)ˆ���������W���¤���¤���¤���¤�à“��¤���¤���¤���§���§���§���¨���¨�¦É��¨���¨���¨���©���­���­���­���­�'u��­���­���®���®���®���®���®���¯��‘��¯���±���±���±���²���²���µ���µ�Zÿ��µ���µ���¸���¸���¸���¸���¸���¸�Ù—��¸���»���»���»���»���»���»���¼�Ó��¼���¼���¼���½���½���½���½���½�ù ��½���¾���¾���¾���¾���¾���½���Á�á^��Á���Á���Á���Á���Á���Á���Á���Ã�Út��Ã���Ã���Ã���Ã���Ã���Æ���Ç���Ç�^b��Ç���Ç���É������data����W���x©file���W��� progress-���J�����éO�_ENVupgrade_stateconfig�Ï���Hë����R���Æ�@�Ç@À���AÁ��€��À0Ù€� A$�ä@��Æ@A�Ç€Á ÁA�$��F|Â�LÁÁd�ä€��AA��ALÁÁ�d��†Å´AÂ�ŒÁA¤�$���FAA�G�ÁŒÁÁ�¤��Æh�Â�ÌÁÁä�d���†@�‡A@Á���Â�A.r�€€ÁB���Aƒ�€€¤A€â���éy�€"���€†@�‡A@Á���Â�¤A€…Ï�À�¤A�À€b���€†@�‡A@Áœ0����¤A€…€À�¤A��€†@�‡ÌÑADÁ���‚�@€�¤A�@€†@�‡ADÁt‘���Â�@��¤A�&�€����login,foble_file_fota处ç�†å†™å…¥æ6{•°æ�®toHexstringfindlowedNr service_uuidchar_uuid_cmd[char_uuid_dataUUID匹é…�结果j]:æœ�务匹é…�:命令匹é…�:|Ùæ•°æ�®åŒ¹é…�:%命令特å¾�值åŸ!Œ¹é…�,处ç�†å‘½ä»¤%æ•°æ�®ç‰¹å¥}¾�值匹é…�,处ç�†æ•°æ�®warnÏ未知的特å¾�值UUID:未矹¥çš„æœ�务UUID:���������Rò���Ð���Ð���Ð���Ð���Ð���Ð���Ð���Ð*¶���Ð���Ó���Ó���Ó���Ó���Ó���Ó���Ó¾ä���Ó���Ô���Ô���Ô���Ô���Ô���Ô���Ôå����Ô���Õ���Õ���Õ���Õ���Õ���Õ���ÕY���Õ���×���×���×���×���Ø���Ø���ÙÓn���Ù���Ú���Ú���×���Ü���Ü���Ý���Ýh·���ß���ß���ß���ß���ß���à���à���àï���à���á���á���ã���ã���ã���ã���ããê���ä���ä���ä���ä���æ���æ���æ���æS.���æ���æ���ç���é���é���é���é���é<y���é���ë������ service_uuid����(LR���
  14. char_uuid����R���data����R–Ë���is_service_match���R��� is_¥;cmd_match���R���is_data_match!þ<���R������_ENVconfighandle_c½Uommand handle_data�î���þ������4º���@�@@�A€���À��$@€�Á�"����¹€�@�@A�A€���€�$@€HÀA‚�Â�"�P��À�€@B�€B�F�Â�$@�ÀB��C�C�y<��$@�&�€� ���loginfoble_f*¥ile_fota处ç�†è¿žæŽ¥æ–­å¼€äº‹äöÙ»¶ is_upgradingerror+å�‡çº§èe¿‡ç¨‹ä¸­è¿žæŽ¥æ–­å¼€ï¼Œç»ˆæ­¢å�‡d级� upgrade_fileosremovevèfotafinish������������ï��ó�ï���ï���ï���ï���ò���ò���ò���ó��Â��ó���ó���ó���ó���ô���÷���÷���÷��F­�ø���ø���ø���ø���ü���ü���ü���ü��yñ�þ����������_ENVupgrade_stateÂU���������������������"���èë#���$���%���&���-���Ÿ���É���ë���iýÏ���þ���î����������ble_filj>e_fota������upgrade_state���PD���config ������ ble_reboot �±�����handle_command ������ ha%Indle_data���������_ENVZ¥Z¥”… ble_main.luacœ��þÚLuaS�”o“
  15. 
  16. xV�����������(w@@ble´ó_main.lua���������>������D���qÖ@@��€†€@�ÁÀ��¤€�@��À�€†€@�ÓÁ��¤€�@���@�Ë@�Ê�ƒʀ„Ê�Ã…—AʀÆÊ�ćÀ�ƒÄ�€Ë€BD�‚DF‚A�xnGBÂ$‚�K�†BD�‡‚DÆ‚A�Ǥ‚�x1ÆÂD�ÇÅÃD�CEÕƒkB�‹�ÆBD�wǂăA�CCä‚�ÃD�EFÃD�GCÅ-C«B�ëA€,��lB��¬‚��Æ‚E�ÇÂÅòí��@�äB€&�€����packetfi�Õlerequireble_file_fotable_ìpacket_fota BLE_MAINconfig dékevice_name Air8000_FOTA servicÉoe_uuidF000char_uuid_cmdF00¡Œ1char_uuid_dataF002max_pacC™ket_size�������stringfromH(ùexbleWRITE
  17. WRITE_CMDsys htaskInitEx��������>���|����÷í���Æ�@�Ç@À���AÁ��€€�ä@�Æ�A�T×Ç@ÁÀ€�€€Æ�@�Ç@À���A���Á�øÇBâ���€ÇBÌAÂä��âA����€çcÁ��ä@€ÆÀB�Ç�À�A����A�À�¿õä@€€2€Æ�A�Ç€ÃÀ€�@€Æ�@�Ç@À–!���AÁ���ÇADâA����€Á��ä@€œÆÆÀB�Ç�À�A������ÇADä@€�-€—ðÆ�A�ÇÀÄÀ€�À €Æ�@�Ç@À���A�á|ä@€¢����€Ç@Eâ���@€Ç€Eâ���Ùù€�€ÇÀEâ@��@€Æ�@�Ç�Æ���AA�¾ä@€&�€�Ç@EÌ@Âä€��E AB$��BGÁE†@�‡A@Á���‚�@€¤A�†@�ce‡A@Á���Â�@�¤A�†@�‡A@Á���:�\€�B�¤A€†ÁB�‡CÅ€�‚��”šA‚�€�¤A€�€Æ�A�ÇÀÇÀ€�@€RÎÆ�@�Ç@À���A�ä@€€€Æ�A�Ç@ÈíMÀ€�À€Æ�@�Ç@À���A���Á�ÇÁEëâ���€ÇÁEÌAÂä��âA����€Á �Õnä@€€€Æ�A�Ç@ÉÀ€�@€Æ�@�Ç@ÀOŠ���A� ��Á �ÇJÂ�GBJb���€ÊaGBJLBÂd‚�bB����€A‚�ä@€�€œãÆ�A�Ç€ÊÀ€�@€Æ�@�Ç@À���AÁ
  18. �(oä@€€€Æ�@�Ç@À���A �€€�ä@�Ç4¢���€ €Æ@K���ä€�€Ë@ €Æ�@�bÇ@À���AÁ �œ�ä@�Æ�L���ä�ä›�€BK�@€$‚�@L@€@�B@ÀA‚���‚ �À�à �LCÂd�$B��@€ÛÒ@�B@A‚���‚ �À� �FCK�€€úÀd�$B��é€��jùÀ€Æ�@�Ç@À���¬¼AA �†AK�À�¤�ä@��&�€�6���loeginfo
  19. BLE_EVENT收到BLE事�œä»¶:ble EVENT_CONN设备已Ã^连接地å�€:addrtoHex有÷ªçŸ¥syssendMsgCONNECTEVEÃINT_DISCONN设备已断开连掴�¥原因:reason DISCONNECTEDi& EVENT_WRITE处ç�†å†™å…¥äº‹ä»oC¶ uuid_serviceuuid_characteri‹@sticdataerror写入事件åˆÙ�‚æ•°ä¸�完整 æœ�务UUID:特Éå¾�值UUID:æ•°æ�®é•¿åº¦:å­—èÍ^Š‚
  20. WRITE_REQ EVENT_READ处ç� V†è¯»å�–事件EVENT_READ_VALUEA读å�–æ“�作完æˆ�æ•°æ�®:
  21. æ—$ æ•°æ�®EVENT_SCAN_REPORT 扫æí_��报告RSSI:rssi adv_addr‘ªEVENT_SCAN_STOP 扫æ��å�œæ­¢‚3其他事件类型:typetableõ¨%事件å�‚数为table,包å�«år譗段:pairsstringå�‚æ•°å­—%�段:值:类型:事件å�‚æ•wd°ç±»åž‹:���������í���?���?���?���?���?���?���B���B���B���B���+´D���D���D���D���D���D���D���D��� D���D���D���D���D���D���D���E���ëE���E���E���E���E���E���E���F���sþF���F���F���H���H���H���H���H���RÉH���H���H���H���H���I���I���I���'I���I���I���I���I���J���J���J���G'J���L���L���L���L���L���O���O���šO���O���O���O���O���O���O���O���)…O���P���P���P���P���P���Q���U���)ûU���U���V���V���V���W���Y���Y���ØY���Y���Y���Y���Z���Z���Z���Z���BZ���Z���[���[���[���[���[���[���‰ò[���\���\���\���\���\���\���\���‰©\���]���]���]���]���_���_���_���Ý©_���_���_���`���`���`���`���b��� b���b���b���b���b���b���b���b���ÃSb���b���b���b���b���b���b���c���WPc���c���c���e���e���e���e���e���o´e���e���e���e���e���e���e���e���QŠe���e���e���e���e���f���f���f����f���h���h���h���h���h���h���k���å+k���k���k���k���k���l���l���n����Pn���n���n���n���o���o���o���o���E|o���o���p���p���p���p���q���q���q���q���q���r���r���r���r���r���Óvr���r���r���r���r���t���t���t���Õ|t���t���t���t���t���t���t���p���¾@p���v���x���x���x���x���x���x���Ix���x���|��� ���ble_dev����í���4event����í���param����í��� ser·vice_uuidT���r���
  22. char_uuidW���rͩ���dataX���r���(for generator)H\����� (for state)�����(fo
  23. r control)Ç���ã���kÈ���á���vÈ�ºØ��á������_ENV
  24. TASK_NAME����²�IJ����‹����@�@@�A€���À��$@€�€4�"@��€�€�A�@A�$€€� �€��€�"@� �€€�@�€A�A€���À�$@€���&��%a�@�@@�A€�����$@€��"@��À�ƒº€�€� @B�…�€$€€ ����"@��€ŸÆ€�@�€A�A€���€�$@€���&���@A �@@�A€���À�$@€��"@��À�€��Íq �C�…�€$€€ ����"@��€€�@Á�€A�A€���@�$@€���&���@�@@¿9�A€���€�$@€�@�@@�A€���À�$@€xH��"@���€�� �D�‹@�Æ@B�ǀēÈŠÀ€ˆÆ@B�Ç�ÅŠÀ€‰Š€ÅŠŠ€Å‹Ë�� €n�FAB�GAƆ�F�‡ÁFÁ�¤�+A��K�e†AB�‡AGÆ�G�ÇÁÇkA�ë@�ŠÀ�Œ$€€_  ����"@��€€�@�€A�A€����²�$@€���&���@�@@�A€���@�$@€!}�� €H�$@��@�@@�A€���À�Æ€G4W�ÇÀÇ$@��€�&��&�€�$���logÏ×info BLE_INIT开始åˆ�始化BMDLE...
  25. bluetoothiniterrorè¾³“�牙核心åˆ�始化失败è“�ç_b‰™æ ¸å¿ƒåˆ�始化æˆ�功bleBLó�E功能åˆ�始化失败BLE功èƒ�÷½åˆ�始化æˆ�功 gatt_createGX¶ATTæœ�务创建失败GATTæœ�åŠ>ô¡åˆ›å»ºæˆ�功é…�置广播数æ�*®... adv_create
  26. addr_modePUB0”LIC channel_map
  27. CHNLS_ALL intBv_minx������� intv_max adv_da¬€taFLAGSstringchar�������Â{COMPLETE_LOCAL_NAMEconfig d±\evice_name广播é…�置失败Í广播é…�ç½®æˆ�功
  28. adv_start#B+©LE广播已å�¯åŠ¨ï¼Œè®¾å¤‡å��ç§°Êõ:���������‹���€���€©Ý���€���€���€���ƒ���ƒ���ƒ���ƒ���ƒd¢���ƒ���ƒ���„���„���„���…���…���…ç¼���…���…���†���†���ˆ���ˆ���ˆ���ˆŠÁ���ˆ���‹���‹���‹���‹���‹���‹���‹n/���‹���Œ���Œ���Œ����������������LÔ�������Ž���Ž��������������������W���“���“���“���“���“���“���“���“Lå���”���”���”���•���•���•���•���•è���–���–���˜���˜���˜���˜���˜���›S‹���›���›���›���›���œ���œ���œ���œ¾{���œ���œ���������������ž���ž���že���Ÿ��� ���¡���¡���¢���¢���¢���¢½���¢���¢���¢���¢���£���£���£���£ƒ7���£���¤���¤���œ���¥���§���§���§´Í���¨���¨���¨���¨���¨���©���©���«…k���«���«���«���«���®���®���®���¯ˆÄ���¯���¯���¯���¯���¯���¯���±���±Ý���²����������_ENVbluetooth_dÐevice ble_device ble_event_cb gaitt_createatt_db adv_create�µ���;Hé�����h����€�…���¤€€����"@��ÿÌ@€†�À�‡@@Á€��Á��¤@€€€†�Á�‡Žê@AÅ����¤€€@��b@��@€†�À�‡4£@@Á€��Á�¤@€�€‡�Â�@B€€‡Ë“€Â�Æ�À�ÇÀÂ�AA�‡�CŒÁC¤��]ý��ä@€Àø‡�Â��D€€†�À�‡ÀBÁå‚��A�G�Â�A¤@€†€Ä¤@€�@€{Â@õ‡�Â�ÀD€ô‡€Â�Ç�EÌÀÃä€�æªAE ÁC$��G�E†À�‡ÁBÁ�Â�@B3€��À��LÃÃdƒ�B¤A€†ûUAÆÀ€��@€¤A��î†�À�‡@@Á.9€����¤@€…��¢���€�€…��ŒÀF¤üê@�†�Á�‡�GÅ��¤@�†�Á�‡@GÁ€�¤¹5@�@æ&�€����logerrorble‘i_main_task_funcble_init errorBsyswaitMsg
  29. BLE_EVENTwaitMsÓg timeout�������CONNECT���j����infoBLE设备连接æˆ�Í$功: addrtoHex DISCONNECTED?³设备断开连接,原因: Htproc_disconnect
  30. WRITE_REQ uuiįd_serviceuuid_characteristic=Ðdata收到写请求:  proc$w(异常退出, 5ç§’å�Žé‡�æ–°å¼€�Kå�¯å¹¿æ’­ adv_stop cleanMsgwÅEaitˆ��������� ������h�íŒ��¶���¹���¹���¹���º���º���»���»�è¾��»���»���»���»���À���À���À���À�…é��À���À���Â���Â���Ã���Ã���Ã���Ã�5e��Ã���Ã���Ç���Ç���Ç���È���É���É�zµ��É���É���É���É���É���É���É���É�3��Ê���Ê���Ê���Ë���Ë���Ë���Ë���Ë�DJ��Ë���Ë���Í���Í���Í���Î���Ð���Ð�m2��Ð���Ñ���Ò���Ò���Ò���Ó���Ó���Ó�cÑ��Ô���Ö���Ö���Ö���Ö���Ö���Ö���Ö�"&��Ö���Ö���Ö���Ö���Ö���×���×���×�²1��×���×���Ø���Ü���Ü���Ü���Ü���Ü�ÞÖ��ß���ß���ß���à���à���à���ä���ä�äw��ä���ä���ç���ç���ç���ç���ç���é�±Ð�����result���h���msg���h��ÅH� conn_param���'���
  31. ble_param:�ò%��R��� service_uuid=���R���
  32. chará@_uuid@���R���dataA���R������ b…—le_init_ENV
  33. TASK_NAMEble_fota_xmain ble_device>������������A�������������������������Ý���������"���#���$���%���&���'~����(���*���1���2���2���2���2���2V³���2���4���4���4���4���4���5���5
  34. á���5���5���5���6���6���8���8���8Ýn���8���8���9���9���9���9���9���:Ý~���;���|���²���é���ì���ì���ì���ìVF���ì���ì��� ���
  35. fota_mode���>��‡�ble_fota_main���>���
  36. TASK_NAM- E���>���bluetooth_device���>�^�� ble_device���>��� adv_create«K���>��� gatt_create���>���attaq_db5���>��� ble_event_cb6���>���«© ble_init7���>���ble_main_task_func8���>������_ENVZ¥Z¥bledO_packet_fota.luacÐ��þð LuaSbÌ�“
  37. 
  38. xV�����������(w@@beêle_packet_fota.lua�����������&� ���K��J@@€JÀ@�JÀ@‚JÀÀ‚‹��ŠÀA+ƒŠ@B„ŠÀB…Š@C†ì���,A��l���¬Á��
  39. €ù‡¬�
  40. €�‡&��&�€���� is_upgrad
  41. Øing� total_size��������receؘived_sizeupgrade_packet serviÓÃce_uuidF000char_uuid_cmdF0wœ01char_uuid_dataF002max_paËácket_sizeÈ�������procproc_dÚwisconnect��������(���-����� Q����@�@@�C�€�$@�€@�À@�A���>Ý@�$@€€A�ÀA�$@€�&�€����fot\¹afinishloginfo FOTA_CMD¸f正在é‡�å�¯è®¾å¤‡...rtosreb�ìoot��������� ���*���*���*���*��*’�+���+���+���+���+���,���,���,��ǽ�-����������_ENV�0���š���� ï�3£��F�@�G@À��€��ÁÀ�� A�$��AA�œAì��d@�\��� €Á�@€F�@�GÀÁ��€��Á�q;�d@€&�€�L@B�Á€�d€€†�@�‡@@Á€‡Õ����@€�†ÁB�‡CÁA��€�¤€¤@�E��€Á�@€†�@�‡@@Á€����¤@€œ�b“��!€€‡À €†ÀB�‡�DÁ@����A��¤€8¯�Æ�@�Ç@À���AÁ�€�Á�ä@€Æ�4Ç@�Ç@À���AA�ä@€Æ€E�ÇÀÅ䀀�â�7Š��€€Æ�@�Ç@À���A�ä@€Æ�@�Ç@j¾À���AA�ä@€HÀF�H€�ŽH€ÇŽH€Ç�Æ�,ƒ@�Ç@À���A��A�ÆÇ�ä@€Æ�@�Ç@ òÀ���A��ä@€@$€Æ�@�ÇÀÁ���AÁ| �ä@€À"€†�@�‡ÀAÁ€�� �¤@€@Èî!€€Ä��€†�@�‡@@Á€��A �¤@€†€¿‚Æ�¢@��@€†�@�‡€IÁ€��Á �¤@€&�[(€�†�@�‡@@Á€��
  42. �¤@€†�@�‡@@Á€÷‹��A
  43. �FAÇ���¤@€†�@�‡@@Á€���F�
  44. �FÇ���¤@€†@Ç�Æ�Ç�À�À€†�fÙ@�‡@@Á€��Á
  45. �¤@€†�@�‡@@Á€��…U �¤@€ƒ���Á€�A �A��è€ €Æ�K�ÇÁ}Ë �äA�Æ�E�ÇAÌäÁ€�âA��€€F J@�GÂÁ�‚��Á‚ �dB€F‚E�GẪ��dBVL�H�M�À€"���€F@�GBÀ�‚��ÁB›½ �dB€F@�GBÀ�‚��Á‚ �dB€F‚K�G¬vÍ…�Á�dB€ƒ�€���€çÀõ¢@���T}€Æ�@�ÇÀÁ���AA�ä@€Æ€E�ÇÀÌ”É��ä@�H�M�@€†�@�‡ÀAÁ€����¤@ Þ€H�M�†€E�‡ÀLÃ���¤@�†�@�‡@@Á€ƒ×��Á�¤@€€€†�@�‡€IÁ€���@N…€�†ÁB�‡CÁA��€�¤€¤@��&�€�=�›���loginfo FOTA_CMD收到åÈÏ‘½ä»¤æ•°æ�®:toHex长度:��¾J�����error命令数æ�®ä¸ºç©ºvïbyteè§£æž�命令ç �:stringv
  46. format (0x%02X)处ç�†å¼€å§‹ƒùå�‡çº§å‘½ä»¤�������unpack<ò¹I4�������文件总大å°�:å™r­—节åˆ�始化FOTAå­�系统...î;fotainitFOTAåˆ�始化æˆ�åŠ8~ŸFOTA底层准备就绪 is_up±grading total_sizereceived_êñsize��������upgrade_packetåV|�‡çº§çжæ€�已设置 总大å°�:û准备接收固件数æ�®...FelOTAåˆ�始化失败(开始命令gÃæ ¼å¼�错误,长度ä¸�è¶³处-.ç�†ç»“æ�Ÿå�‡çº§å‘½ä»¤warn+未šà处于å�‡çº§çжæ€�,忽略结æ�,öŸå‘½ä»¤验è¯�文件完整性..…—. 已接收: 应接收:文件~¶å®Œæ•´æ€§éªŒè¯�通过4å�‡çº§æ•;X°æ�®å·²å…¨éƒ¨æŽ¥æ”¶ï¼Œç­‰å¾…å�‡ç©óº§å®Œæˆ�...�������syswaitZ°d�������isDone校验过程å‡Kºé”™finish�FOTAå�‡çº§æˆ�功‚hï¼�V2ç§’å�Žè®¾å¤‡å°†è‡ªåЍé‡�å�æ\¯...,é‡�å�¯å�Žé€šè¿‡æ—¥å¿—判æöÜ–­æœ€ç»ˆæ˜¯å�¦å�‡çº§æˆ�功 timeÒ³rStartÐ������ 校验超时æäo–‡ä»¶ä¸�完整,å�‡çº§å¤±è´¥ç¦*»“æ�Ÿå�‡çº§å‘½ä»¤å¤„ç�†å®Œæˆ�æ=蜪知命令ç �:���������ï��0 �1���1���1���1���1���1���1���1��5‹�1���4���4���4���5���5���5���5��*à�5���6���:���:���:���;���;���;��y�;���;���;���;���;���;���;���;��¡n�>���>���?���?���?���?���?���B��:f�B���B���D���D���D���D���D���D��޽�E���E���E���E���E���E���E���H��&��H���H���H���H���I���I���I���I��üÑ�I���J���J���J���J���J���M���M��¿Ù�M���M���M���P���Q���R���S���U��T³�U���U���U���V���V���U���W���W��à�W���W���W���W���Y���Y���Y���Y��©–�Y���Z���\���\���\���\���\���]��À�`���`���a���a���a���a���a���d��­�d���d���e���e���e���e���e���f���¨�j���j���j���j���j���k���k���k��º©�k���k���k���k���l���l���l���l��l��l���l���l���n���n���n���n���o��_-�o���o���o���o���p���p���p���p��0f�p���s���t���t���t���t���u���u��-q�u���u���v���v���v���w���w���x���x���x���x���x���y���y���y���y��áÀ�z���z���}���}���~���~���~���~��þ°�~�����������������������„���„��ûû�„���„���„���…���…���t���Š���Š��íü�‹���‹���‹���‹���‹���Œ���Œ���Œ��‰Û�Œ�������Ž����������������������2½�’���“���“���“���“���–���–���–��oË�–���–���–���˜���˜���˜���˜���˜��/²�˜���˜���˜���˜���˜���˜���š���
  47. ��Ÿ�� cmd_data����ï���cmd���ï��� tbÕotal_size0���a���successš���Ò��þq� (for index)����Æ��� (for limit•7)����Æ��� (for step)����Æ���iž�_c��Å���succ¥���Å��� fotaDone¥���kïÅ������_ENVupgrade_state ble_ËYreboot�ž���È����e���F�@�G@À��€¤��ÁÀ����A�d@€F@Á�b@��@€F�Å~@�G€Á��€��ÁÀ�d@€&�€�F�@�G@À��€½“��Á��AÂ�d@�F€B�GÀÂ�€���dÀ�Æ�¡v@�Ç@À���A��A�À€�‚�@�ä@¨€b���� €ÆÀÃ���Í��HÀ€‡Æ@Â�Í�"
  48. ÄHÀ€„Æ@D�Ç€ÄÁÃ�FÁÄ�AEä€Pú�ÁÃ�FAEO�ÅA_ÀEÀ�€ÁÃ�FÁú
  49. Ä�!��À€@�A@A�����À€Bò¼�A‚�†ÂÃ�ÁÂ�ÃÄ�A�$A�@�AÛÎ@A����A�ÆÁÃ��$A€ÁÃ�FÁÄ�!�âu�À€@�A@A������$A€@€Æ�Xú@�ÇÀÇ���A�ä@€H@ȂƀB�Ç€Èî×��ä@�&�€�#���loginfo
  50. FOTA_3
  51. DATA收到数æ�®åŒ…,长度:®字节 is_upgradingwarn%未-m处于å�‡çº§çжæ€�,忽略数æ�v^® 处ç�†åˆ†æ®µæ•°æ�®ï¼ŒåŒ…åº�å�«·:upgrade_packetfotarun分段写入结果:result:isDvone:received_size�������ma&’thfloor total_sized�������oïmax_packet_size2��������������Í…�å�‡çº§è¿›åº¦:%(/)#æ•xL°æ�®å†™å…¥æˆ�功,当å‰�总计:Pë.所有数æ�®å·²æŽ¥æ”¶ï¼Œç­‰å¾…mNå�‡çº§å®Œæˆ�...error分段况â™å…¥å¤±è´¥�finish�������¨��e���Ÿ���Ÿ���Ÿ���Ÿ���Ÿ���Ÿ���Ÿ�Ih��¢���¢���¢���£���£���£���£���£�
  52. 4��¤���¨���¨���¨���¨���¨���¨���©�r ��©���©���©���ª���ª���ª���ª���ª�
  53. ��ª���ª���ª���ª���¬���¬���®���®�~ ��®���®���¯���¯���¯���²���²���²��e��²���²���²���²���µ���µ���µ���µ�^Õ��µ���µ���¶���¶���¶���¶���·���·�«^��·���·���·���·���¸���¸���¸���¸�Nõ��¸���·���»���»���»���»���»���»�~Ò��»���¾���¾���¾���¾���¿���¿���¿�çO��¿���¿���À���Â���Â���Â���Â���Â�Ìæ��Å���Æ���Æ���Æ���Æ���È������dáata����e���result���e���isDon³„e���e��� progress3���Y������_d$ENVupgrade_stateconfig�Î���ê�� ��R���Æ�@�Ç@À���AÁ��€��À€�b A$�ä@��Æ@A�Ç€Á ÁA�$��FÂ�x4LÁÁd�ä€��AA��ALÁÁ�d��†AÂ�›ùŒÁA¤�$���FAA�G�ÁŒÁÁ�¤��Æ�Â�ø”ÌÁÁä�d���†@�‡A@Á���Â�A�µÚ€€ÁB���Aƒ�€€¤A€â����€ÀË"���€†@�‡A@Á���Â�¤A€…�íYÀ�¤A�À€b���€†@�‡A@Á���܉�¤A€…€À�¤A��€†@�‡AD½¥Á���‚�@€�¤A�@€†@�‡ADÁ���ý'Â�@��¤A�&�€����loginfoEŸble_packet_fota处ç�†å†™å…¥æ• y°æ�®toHexstringfindlowerÕA service_uuidchar_uuid_cmdc¼!har_uuid_dataUUID匹é…�结果:`þæœ�务匹é…�:命令匹é…�:úþæ•°æ�®åŒ¹é…�:%命令特å¾�å€¼åŒ H¹é…�,处ç�†å‘½ä»¤%æ•°æ�®ç‰¹å¾ã£�值匹é…�,处ç�†æ•°æ�®warn„Û未知的特å¾�值UUID:未知2Òçš„æœ�务UUID:���������R�‚Y��Ï���Ï���Ï���Ï���Ï���Ï���Ï���Ï�'À��Ï���Ò���Ò���Ò���Ò���Ò���Ò���Ò�_„��Ò���Ó���Ó���Ó���Ó���Ó���Ó���Ó�î��Ó���Ô���Ô���Ô���Ô���Ô���Ô���Ô�)w��Ô���Ö���Ö���Ö���Ö���×���×���Ø�ž1��Ø���Ù���Ù���Ö���Û���Û���Ü���Ü�šX��Þ���Þ���Þ���Þ���Þ���ß���ß���ß�óu��ß���à���à���â���â���â���â���â�0I��ã���ã���ã���ã���å���å���å���å��M��å���å���æ���è���è���è���è���è�?ô��è���ê������ service_uuid����Rµ ���
  54. char_uuid����R���data����R�E��is_service_match���R��� is_c¾md_match���R���is_data_match!�‚��R������_ENVconfighandle_co}Æmmand handle_data�î���ù�������$«��@�@@�A€���À��$@€�Á�"���@“[€�@�@A�A€���€�$@€HÀA‚�B�@BD¯�C���$@�&�€�
  55. ���loginfobl¼üe_packet_fota处ç�†è¿žæŽ¥æ–­å¼ðœ€äº‹ä»¶ is_upgradingerror+å�‡çº§è¿‡ç¨‹ä¸­è¿žæŽ¥æ–­å¼€ï¼Œç»ˆæ�­¢å�‡çº§�fotafinish����� �������ï���ï���ï���ï���ï���ò���’ò���ò���ó���ó���ó���ó���ó���ô���È÷���÷���÷���÷���ù����������_EN*ïVupgrade_state������������B���������"���#���$���%���&���-‹ø���š���È���ê���Î���ù���î���û���ûëà������ble_packet_fota������H
  56. upgrade_state������config ���‰��� ble_reboot ������handle_c‡Óommand ������ handle_data����<Ò�����_ENVZ¥Z¥ main.luacrã��þŸLuaS�“
  57. 
  58. xV�����������(w@
  59. @main.lua���������"��Äy�@@€À@��A�@A�A€�†�@�Æ€@�$@�ª|ÀA�"���@€ÀA��B�A@�$@�€BÜÖ�ÀB�FÀA�G�Ã��@�$@€,�����‡ÀC‚7��D�F€C�$@�@D�A€�$@�ÀC�ÀD­ �$@€�&�€����PROJECT
  60. fota_tes«!tVERSION 001.000.001loginîùfomainwdtinit(#������syF²stimerLoopStartfeed¸ ������G·print_versionsys taskInit¾¸require ble_mainrun������� <�M���S���������@�@@�A€��$@�« À@��A�A@��€�ÆÀA�$@�À@��A�Ü@A��$@��ü&�€� ���syswait�¸ ������loginfofotaversi´´onVERSIONhezhou ble_fota tesÂat������������O���O���O���O���PÙQ���P���P���P���P���P���Q���Q���QȾ���Q���Q���S����������_ENV"���š‹!���"���&���&���&���&���&���&���8v+���+���+���-���-���-���-���/���üÂ/���/���/���/���/���S���M���T���ã¼T���T���T���W���W���W���[���[���[���[����������_ENVZ¥Z¥ expr/lorer.htmlúD��þ« <!DOCTYPE htk8ml>
  61. <html lang="zh-CN">
  62. <head>¸
  63. <meta charset="UTF-8">
  64. ÀŠ <meta name="viewport" content=ÖM"width=device-width, initial-scaá¼le=1.0">
  65. <title>LuatOS æ–‡ä7Ø»¶ç®¡ç�†ç³»ç»Ÿ</title>
  66. <sty]®le>
  67. body {
  68. Dî font-family: 'Microsoft YaHei',Y• Arial, sans-serif;
  69. Ç background-color: #f5f5f5;
  70. A margin: 0;
  71. 6] padding: 20px;
  72. colçöor: #333;
  73. }
  74. .càÒontainer {
  75. max-widtʇh: 1200px;
  76. margin: ‹auto;
  77. background: wŠÂhite;
  78. padding: 20pxF¿;
  79. border-radius: 8pF{x;
  80. box-shadow: 0 0 •r10px rgba(0, 0, 0, 0.1);
  81. �™ }
  82. .header {
  83. ºï background: #2c3e50;
  84. 3G color: white;
  85. W¥ padding: 15px;
  86. borIÊder-radius: 5px;
  87. maŠrrgin-bottom: 20px;
  88. ¥display: flex;
  89. justZÌify-content: space-between;
  90. /« align-items: center;
  91. >– }
  92. .login-form { b£
  93. max-width: 400px;
  94. wß margin: 100px auto; aJ
  95. padding: 40px;
  96. ¦ð background: white;
  97. ³Ž border-radius: 8px;
  98. ä? box-shadow: 0 0 20px rÝgba(0, 0, 0, 0.1);
  99. }
  100. 2G .form-group {
  101. Jâ margin-bottom: 15px;
  102. !Ú}
  103. label {
  104. šïdisplay: block;
  105. marœ}gin-bottom: 5px;
  106. foñmnt-weight: bold;
  107. }
  108. Ìó input[type="text"], input[táéype="password"] {
  109. w‰3idth: 100%;
  110. paddingfÖ: 10px;
  111. border: 1px C solid #ddd;
  112. borderðè-radius: 4px;
  113. box-sÁjizing: border-box;
  114. }
  115. É button {
  116. bac
  117. kground-color: #3498db;
  118. éW color: white;
  119. ›border: none;
  120. paddiXng: 10px 20px;
  121. bordA er-radius: 4px;
  122. curLÂsor: pointer;
  123. font-tXsize: 16px;
  124. }
  125. Äæbutton:hover {
  126. back"îground-color: #2980b9;
  127. ‘œ}
  128. .file-list {
  129. 
  130. width: 100%;
  131. b±8order-collapse: collapse;
  132. 7 margin-top: 20px;
  133. �ƒ }
  134. .file-list th, .filΦe-list td {
  135. paddingȈ: 12px;
  136. text-align:pG left;
  137. border-botto?m: 1px solid #ddd;
  138. }
  139. wf .file-list th {
  140. �Ä background-color: #f8f9fa;
  141. /â font-weight: bold;
  142. àR }
  143. .file-list tr¤ª:hover {
  144. backgroundކ-color: #f5f5f5;
  145. }
  146. :Ñ .download-btn {
  147. ª background-color: #27ae60;
  148. #� color: white;
  149. )5 padding: 5px 10px;
  150. ì text-decoration: none;
  151. ö
  152. border-radius: 3px;
  153. T font-size: 12px;
  154. ™ }
  155. .download-btn:hovüWer {
  156. background-colÉor: #219a52;
  157. }
  158. Ù .delete-btn {
  159. back6ground-color: #e74c3c;
  160. `" color: white;
  161. b½ìorder: none;
  162. paddineRg: 5px 10px;
  163. borderE@-radius: 3px;
  164. font-uBsize: 12px;
  165. cursor:½õ pointer;
  166. }
  167. .döEelete-btn:hover {
  168. b•hackground-color: #c0392b;
  169. › }
  170. .breadcrumb {
  171. @Û padding: 10px 0;
  172. )v margin-bottom: 20px;
  173. ¨‹ }
  174. .breadcrumb a { Q
  175. color: #3498db;
  176. ‡ text-decoration: none;�%
  177. cursor: pointer;
  178. ³ò }
  179. .breadcrumb aC¸:hover {
  180. text-decorÁation: underline;
  181. }
  182. îØ .hidden {
  183. disºìplay: none;
  184. }
  185. é".error {
  186. color: #e7øx4c3c;
  187. margin-top: 1®C0px;
  188. }
  189. </style>
  190. <� /head>
  191. <body>
  192. <div class="ºcontainer">
  193. <!-- 登录yí页é�¢ -->
  194. <div id="log·inPage" class="login-form">
  195. ¼ <h2>LuatOS 文件管ç�†Þù系统登录</h2>
  196. <ð4div class="form-group">
  197. Ö <label for="username">çêH”¨æˆ·å��:</label>
  198. ß <input type="text" id="usernaÏ’me">
  199. </div>
  200. x9 <div class="form-group">
  201. úþ <label for="password">密ç �:</label>
  202. AÌ <input type="password" idk0="password">
  203. </div>o 
  204. <button onclick="l‘åogin()">登录</button>
  205. — <div id="loginError" class=Åõ"error hidden"></div>
  206. <�v/div>
  207. <!-- 文件管çG7�†é¡µé�¢ -->
  208. <div id="f°¦ilePage" class="hidden">
  209. X <div class="header">
  210. 4ž <h1>LuatOS 文件管œÒç�†ç³»ç»Ÿ</h1>
  211. Ã<div>
  212. <buttY!on onclick="scanFiles()" style="hØmargin-right: 10px;">扫æ��æ–‡ä»ó¶</button>
  213. ç®<button onclick="logout()">退å‡rκ登录</button>
  214. «Ä </div>
  215. </div>
  216. ¢ <div class="breadcruèmb" id="breadcrumb">
  217. e) <a onclick="navigateTo('/'j²)">根目录</a>
  218. –° <span> | </span>
  219. ´¢ <a onclick="navigateTo('/sd'®)">TF/SD目录</a>
  220. @></div>
  221. <table claRss="file-list">
  222. �l <thead>
  223. <tÿçr>
  224. <th>6�称</th>
  225. oª <th>大å°�</th>
  226. â <th>æ“�作</th>
  227. @@ </tr>
  228. áù </thead>
  229. PY <tbody id="fileListBody">
  230. Þ </tbody>
  231. Îb </table>
  232. </div>
  233. Nî </div>
  234. <script>
  235. Ã. let currentPath = '/';
  236. _ let isLoggedIn = false;
  237. ¹Ý function login() {
  238. 7 const username = document.îògetElementById('username').valuea;
  239. const password = ©¹document.getElementById('passwor?¢d').value;
  240. fetch(��'/login', {
  241. metO£hod: 'POST',
  242. hehmaders: {
  243. 'C{Êontent-Type': 'application/json'C÷,
  244. },
  245. c credentials: 'include', /jV/ 确���和接收cookies
  246. ¸’ body: JSON.strinà€gify({username: username, password: password})
  247. })
  248. ¶t .then(response => { ~È
  249. // 打å�°æ‰€æœ‰æ¹å“�应头,查看Cookie设置
  250. ±€ console.log('ç™»Á0录å“�应头:', response.headersz
  251. );
  252. return respoЫnse.json();
  253. })
  254. d .then(data => {
  255. 8c console.log('登录å“�~›åº”æ•°æ�®:', data);
  256. 8‘ if (data.success) {
  257. ž’ isLoggedIn = true;¡C
  258. // 存储s'´ession_id到localStorage作为夳°‡ç”¨è®¤è¯�æ–¹å¼�
  259. æø if (data.session_id) {
  260. |O localStoraóNge.setItem('session_id', data.seÒ8ssion_id);
  261. › console.log('已存储Sessio¹nID到localStorage:', data.sessixon_id);
  262. }
  263. : document.get¤DElementById('loginPage').classLi@qst.add('hidden');
  264. Ë document.getElementById('�ŒfilePage').classList.remove('hid©Pden');
  265. load4Files('/luadb');
  266. U } else {
  267. »¯document.getElementById('loginErAÿror').textContent = data.message6 || '登录失败';
  268. ]æ document.getElementById¨ò('loginError').classList.remove(('hidden');
  269. }
  270. Àò })
  271. .catcîlh(error => {
  272. coÅínsole.error('登录请求错误:{ù', error);
  273. docuå_ment.getElementById('loginError'§#).textContent = '登录请求失m"è´¥';
  274. document.5getElementById('loginError').clabËssList.remove('hidden');
  275. þ });
  276. }
  277. Èÿfunction logout() {
  278. ôE fetch('/logout', {
  279. T� method: 'POST',
  280. † credentials: 'include' // €Úç¡®ä¿�å�‘é€�cookies
  281. îL })
  282. .then(() => {
  283. Î isLoggedIn = falCðse;
  284. // 清除lo½calStorage中的session_id
  285. Yü localStorage.removeIT�tem('session_id');
  286. þ´ document.getElementById('filÔePage').classList.add('hidden');)Ž
  287. document.getElÃementById('loginPage').classListâÇ.remove('hidden');
  288. ãU document.getElementById('useSžrname').value = '';
  289. Œ² document.getElementById('pa ssword').value = '';
  290. §ò document.getElementById('l©àoginError').classList.add('hidde”än');
  291. });
  292. }s×
  293. // 扫æ��文件函æ•�°
  294. function scanFiles() ÑÙ{
  295. if (!isLoggedIn) dreturn;
  296. // 获å�–#J用户å��和密ç �用于URLå�‚æ•,P°è®¤è¯�
  297. const usern¿*ame = document.getElementById('uübsername')?.value || 'admin';
  298. ùÿ const password = docum�ent.getElementById('password')?.\:value || '123456';
  299. ¸h // 构建带认è¯�å�‚数的扫›¥æ��请求URL
  300. const ±?url = '/scan-files?username=' + ʺencodeURIComponent(username) +
  301. NF '&passworh÷d=' + encodeURIComponent(passworedd);
  302. console.log('QÚå�‘é€�文件扫æ��请求,URL:'2Ž, url);
  303. // 显示?œæ‰«æ��æ��示
  304. alert(ˆ·'开始扫æ��文件,请查看瘳»ç»Ÿæ—¥å¿—了解扫æ��进度...qX');
  305. fetch(url, { ۍ
  306. method: 'GET', xú
  307. credentials: 'ikNnclude'
  308. })
  309. øZ .then(response => {
  310. æÂ if (!response.ok) {
  311. ð throw new ErrÈQor('扫æ��请求错误: ' + resp­gonse.status);
  312. }V†
  313. return respons^¹e.json();
  314. })
  315. Á .then(data => {
  316. \ñ console.log('扫æ��å“�应‘”:', data);
  317. if )Á(data && data.success) {
  318. îp alert('文件扫æ�Žœ�完æˆ�ï¼�已扫æ��到 ' + data.ŸÝfoundFiles + ' 个文件,显ç¤ ºæ‰«æ��到的用户文件。'); qb
  319. // é‡�新劊ƒ è½½æ–‡ä»¶åˆ—表
  320. )É loadFiles(currentPath);
  321. µƒ } else {
  322. ” alert('文件扫æ��»¬å¤±è´¥: ' + (data.message || 'æœSªçŸ¥é”™è¯¯'));
  323. ?Û}
  324. })
  325. .1²catch(error => {
  326. ·” console.error('扫æ��文件请ãæ±‚错误:', error);
  327. - alert('扫æ��文件请求åk¤±è´¥');
  328. });
  329. ° }
  330. function loadFilSÉes(path) {
  331. if (!isL±¬oggedIn) return;
  332. ³// 准备请求头
  333. <Œconst headers = {
  334. è· 'Content-Type': 'application/sjson'
  335. };
  336. Õà // 由于传统认è¯�æ–¹å¼�¡ ä¸�å�¯é� ï¼Œæˆ‘们使用URLå�‚æ•”<°è®¤è¯�
  337. // 获å�–ç”~0¨æˆ·å��和密ç �用于URLå�‚æ•°èþú®¤è¯�
  338. const usernam¦&e = document.getElementById('useÚ†rname')?.value || 'admin';
  339. 7$ const password = documenót.getElementById('password')?.vaµölue || '123456';
  340. oæ// 构建带认è¯�å�‚æ•°çš„URL
  341. P const url = '/list?pOÈath=' + encodeURIComponent(path)ÔÑ +
  342. '&us$¶ername=' + encodeURIComponent(usuername) +
  343. ò� '&password=' + encodeURICompoŸ�nent(password);
  344. cÄ-onsole.log('使用URLå�‚数认诺v�,请求URL:', url);
  345. Š fetch(url, {
  346. ÝÁ credentials: 'include', // ço”¡®ä¿�å�‘é€�cookies
  347. Å headers: headers
  348. u… })
  349. .then(responseù„ => {
  350. if (!respþEonse.ok) {
  351. ½!throw new Error('网络å“�应错‘误: ' + response.status);
  352. Im }
  353. rÕleturn response.json();
  354. ±í })
  355. .then(data =º�> {
  356. console.log?+('文件列表数�:', data);
  357. ÅK
  358. // å�ªä½¿ç”¨æœ6Å�务器返回的数æ�®
  359. ßN if (data && data.successY[ && Array.isArray(data.files)) {eœ
  360. displayFilÊ@es(data.files, path);
  361. Â } else {
  362. ° // 如果数æ�®æ— æ•ˆï¼Œæ˜¾Bu示空列表
  363. Äý displayFiles([], path);
  364. Ÿ }
  365. ½ñupdateBreadcrumb(path);
  366. ÉB })
  367. .catch(erro Îr => {
  368. console.�!error('加载文件列表错误:Ù7', error);
  369. // åu$�‘生错误时显示空列表
  370. Ì/ displayFiles([], I path);
  371. updateBrð·eadcrumb(path);
  372. });æ:
  373. }
  374. function ΩdisplayFiles(files, path) {
  375. m± const tbody = document.º§getElementById('fileListBody'); c£
  376. tbody.innerHTML = '™Û';
  377. // 确�filesA 是数组
  378. if (!ArraT<y.isArray(files)) {
  379. @Œ files = [];
  380. } KÛ
  381. console.log('显ç=줺文件数é‡�:', files.length);xú
  382. files.forEach(fi®¡le => {
  383. // ç¡®äÿ�文件对象有必è¦�的属性ÅO
  384. const safeFileP° = {
  385. name: X file.name || "未知文件å��", AÜ
  386. size: file.eTsize || 0,
  387. ê‘isDirectory: file.isDirectory ||ã& false,
  388. pat­!h: file.path || (path + '/' + (f\ôile.name || "未知文件å��")) ¸-
  389. };
  390. F³ const row = document.crea[ìteElement('tr');
  391. q! let nameCell, actionCell;
  392. �â if (safeFile.isDi¼Ðrectory) {
  393. ÀínameCell = `<td><a href="#" onclÛ6ick="navigateTo('${encodeURICompXÞonent(path + '/' + safeFile.namezì)}')">${safeFile.name}/</a></td>Ãâ`;
  394. actionCeŸll = '<td></td>';
  395. Ó_ } else {
  396. ¡ nameCell = `<td>${safeFile.name‰T}</td>`;
  397. //µH 为下载链接添加URLå�‚æ•°è6Š®¤è¯�
  398. constLâ username = document.getElementB'ßyId('username')?.value || 'admin
  399. ';
  400. const paЏssword = document.getElementByIdu3('password')?.value || '123456';ôw
  401. const downOloadUrl = '/download?path=' + enocodeURIComponent(safeFile.path) ¤+
  402. Ø '&username=' + encode_xURIComponent(username) +
  403. Æ4 ôQ '&password=' + encodeURIComponªŒent(password);
  404. ÿ // 添加下载和删除æŒûï‰é’®
  405. action)PCell = `<td>
  406. ‚ <a href="${downloadUrl}" c¥lass="download-btn" style="margi¨
  407. n-right: 5px;">下载</a>
  408. _r <button class�è="delete-btn" onclick="deleteFil¥äe('${encodeURIComponent(safeFileýº.path)}')">删除</button>
  409. —ù </td>`;
  410. Mâ }
  411. ro,0w.innerHTML = `
  412. ¼Ø ${nameCell}
  413. òF <td>${formatSize(safeFile.(Msize)}</td>
  414. Á ${actionCell}
  415. Y7`;
  416. tbody.appendoYChild(row);
  417. });
  418. Qq }
  419. // 删除文äë”»¶å‡½æ•°
  420. function deletÀŸeFile(filePath) {
  421. i°gf (confirm('确定è¦�删除这ä¸3€ªæ–‡ä»¶å�—?')) {
  422. œ // 获å�–用户å��和密ç �ç‚U”¨äºŽURLå�‚数认è¯�
  423. ® const username = document.îògetElementById('username')?.valuùÔe || 'admin';
  424. cLonst password = document.getElem·ÉentById('password')?.value || '1Ö23456';
  425. // 枸„建带认è¯�å�‚数的删除请æQÒ±‚URL
  426. const urlÍ` = '/delete?path=' + filePath + Ý;
  427. '&u•Ìsername=' + encodeURIComponent(uÑLsername) +
  428. 8H '&password=' + encodeURI‡TComponent(password);
  429. Ôõ console.log('使用URLå��¢‚数认è¯�进行删除æ“�作,覭¯·æ±‚URL:', url);
  430. Y¼ fetch(url, {
  431. ä¤ method: 'POST',
  432. åw credentials: 'includ@¿e'
  433. })
  434. ™F .then(response => respon†ªse.json())
  435. .theñÞn(data => {
  436. Ýî if (data.success) {
  437. s| // 删除æˆ�功å�޲"é‡�新加载文件列表
  438. OF loadFiles(curr45entPath);
  439. }XQ else {
  440. êí alert('删除失败: ' + (data.BLmessage || '未知错误'));
  441. ‡ }
  442. ¨R })
  443. .catch(›error => {
  444. ‹8alert('删除请求失败');
  445. ÝÃ });
  446. }>
  447. }
  448. function ΩupdateBreadcrumb(path) {
  449. —w const breadcrumb = documen—­t.getElementById('breadcrumb'); Þð
  450. // 先设置根ç›|ª®å½•å’ŒTF/SD目录链接
  451. )^ breadcrumb.innerHTML = '<aÑ onclick="navigateTo(\'\')">æ ¹çi×›®å½•</a><span> | </span><a onclÑñick="navigateTo(\'/sd\')">TF/SDçë™›®å½•</a>';
  452. // ç„}¦¶å�Žæ·»åР当å‰�路径的层次çJ»“构(如果ä¸�是根目录)e4
  453. if (path !== '/' &ÿÌ& path !== '/sd') {
  454. Tµ const parts = path.split('/ûd').filter(p => p);
  455. Ï let current = '';
  456. ŸB // 仅在é�žæ ¹ç›®å½•å’�öŒé�žSD目录时添加分隔符
  457. ñÕ breadcrumb.inner<·HTML += ' > ';
  458. Dà parts.forEach((part, index) =>ñm {
  459. current Ĵ+= '/' + part;
  460. ` if (index > 0) {
  461. ïr breadcrumb.innerHT·4ML += ' > ';
  462. ¾ }
  463. breadcr Üumb.innerHTML += '<a onclick="naé¯vigateTo(\'' + current + '\')">'áH + part + '</a>';
  464. 9ª });
  465. }
  466. }õ
  467. function navigateTo(ÄEpath) {
  468. currentPathAš = path;
  469. loadFiles(üMpath);
  470. }
  471. funáPction formatSize(bytes) {
  472. ßž if (bytes === 0) return 'É,0 B';
  473. const k = 102ÑH4;
  474. const sizes = ['‹ÚB', 'KB', 'MB', 'GB'];
  475. …6 const i = Math.floor(Math.loêžg(bytes) / Math.log(k));
  476. € return parseFloat((bytes /Šo Math.pow(k, i)).toFixed(2)) + '¤z ' + sizes[i];
  477. }
  478. ŸÄ // æ ¼å¼�化日期函数已Úz移除
  479. // å�¯åЍå�Žæ£ìJ€æŸ¥è®¤è¯�状æ€�
  480. window�.onload = function() {
  481. ÿÝ fetch('/check-auth', {
  482. K" credentials: 'includ@¿e' // ç¡®ä¿�å�‘é€�cookies
  483. ¥ })
  484. .then(res‡Yponse => response.json())
  485. b\ .then(data => {
  486. \ñ if (data.authenticated) ÂR{
  487. isLoggedIžn = true;
  488. d9Øocument.getElementById('loginPag©Êe').classList.add('hidden');
  489. fä document.getElK‡ementById('filePage').classList.®±remove('hidden');
  490. r( loadFiles('/luadb');
  491. ¸- }
  492. }); -³
  493. };
  494. </script>
  495. </bo´‘dy>
  496. </html>
  497. Z¥Z¥.airm2m_alA%l_crc#.bin���þ_
  498. …wž`9�’oÔ\’Ïþþº����������������������������åH��������������������������������€)��������������������������������€)��������������������������������€)��������������������������������€)��������������������������������€)��������������������������������€)��������������������������������€)��������������������������������€)��������������������������������€)