7ping1.5初始化
authorp15692025051 <846603105@qq.com>
Tue, 15 Jul 2025 02:37:45 +0000 (10:37 +0800)
committerp15692025051 <846603105@qq.com>
Tue, 15 Jul 2025 02:37:45 +0000 (10:37 +0800)
135 files changed:
2.sdk/project/7PIN_1_5/audio.bin [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/IMEIhao.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/Low_power_warning.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_CHARGE_FULL.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_CHARGE_IN.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_CHARGE_OUT.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_READ_TIME_0.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_READ_TIME_1.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_READ_TIME_2.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_READ_TIME_3.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_READ_TIME_4.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_READ_TIME_5.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_READ_TIME_6.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_READ_TIME_7.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_READ_TIME_8.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_READ_TIME_9.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_READ_TIME_A.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_READ_TIME_B.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_READ_TIME_C.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_READ_TIME_D.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_READ_TIME_E.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_READ_TIME_F.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_READ_TIME_G.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_READ_TIME_H.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_READ_TIME_I.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_READ_TIME_J.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_READ_TIME_K.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_READ_TIME_L.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_READ_TIME_M.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_READ_TIME_N.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_READ_TIME_O.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_READ_TIME_P.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_READ_TIME_Q.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_READ_TIME_R.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_READ_TIME_S.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_READ_TIME_T.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_READ_TIME_U.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_READ_TIME_V.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_READ_TIME_W.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_READ_TIME_X.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_READ_TIME_Y.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/R_READ_TIME_Z.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/chaobingfatis.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/chenggong.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/didianguanji.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/jianquancuowu.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/key_prompt.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/liuliangtishi.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/send_tone.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/shouhou.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/xinhaoruo1.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/audio/zhengzaiguanji.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/images/customer_fs.bin [new file with mode: 0644]
2.sdk/project/7PIN_1_5/list.json [new file with mode: 0644]
2.sdk/project/7PIN_1_5/merge_bin.py [new file with mode: 0644]
2.sdk/project/7PIN_1_5/new.bat [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/EventMesh.py [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/Makefile [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/TTS音频生成.py [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/ai_VC.py [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/ai_VC_coze.py [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/ai_alarm.py [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/audio_gain.nvm [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/audio_ve.nvm [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/btn_device_ec800m.py [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/btn_device_ec800m_d15.py [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/config.json [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/constants.py [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/led.py [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/led_d15.py [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/main_1.py [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/main_init.py [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/mgr.py [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/mgr_d15.py [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/motor.py [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/pcm_stream_play_test.py [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/protocol.py [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/sleep_test.py [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/tesr.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/tiktok_rtc_demo.py [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/tts_tesr.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/tts_tesr_01.wav [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/ui.py [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/usr/R_READ_TIME_AB.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/usr/ai_VC.py [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/usr/ai_test.py [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/usr/test.mp3 [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/usr/test1.py [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/versions.py [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/EG810MCN_GA_VOLTE.mk [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/autoconf.h [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/config.in [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/config.mk [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lcd.h [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl.h [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/animimg.h [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/arc.h [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/calendar.h [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/canvas.h [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/chart.h [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/colorwheel.h [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/fs/helios.h [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/handler/task/priority.h [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/imgbtn.h [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/jpg/decode.h [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/keyboard.h [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/led.h [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/line.h [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/list.h [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/meter.h [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/msgbox.h [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/png/decode.h [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/qrcode.h [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/span.h [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/spinbox.h [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/spinner.h [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/tabview.h [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/tileview.h [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/win.h [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/mbedtls.h [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/vioce/call.h [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/mpconfigboard.h [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/DBG.7z [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base.json [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base_release_pack.zip [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/rf.bin [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/include/app_link_start_addr.h [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/ByteRTCLite.lib [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/libHeliosAPI.lib [new file with mode: 0644]
2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/ql_common_api.lib [new file with mode: 0644]
2.sdk/project/7PIN_1_5/usr/audio_gain.nvm [new file with mode: 0644]
2.sdk/project/7PIN_1_5/usr/audio_ve.nvm [new file with mode: 0644]
2.sdk/project/7PIN_1_5/usr/main.py [new file with mode: 0644]
2.sdk/project/7PIN_1_5/usr/static/audio.bin [new file with mode: 0644]
2.sdk/project/7PIN_1_5/usr/static/storage_file/wechat_record.json [new file with mode: 0644]

diff --git a/2.sdk/project/7PIN_1_5/audio.bin b/2.sdk/project/7PIN_1_5/audio.bin
new file mode 100644 (file)
index 0000000..e02e6af
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio.bin differ
diff --git a/2.sdk/project/7PIN_1_5/audio/IMEIhao.mp3 b/2.sdk/project/7PIN_1_5/audio/IMEIhao.mp3
new file mode 100644 (file)
index 0000000..a3d5ab1
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/IMEIhao.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/Low_power_warning.mp3 b/2.sdk/project/7PIN_1_5/audio/Low_power_warning.mp3
new file mode 100644 (file)
index 0000000..8308a76
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/Low_power_warning.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_CHARGE_FULL.mp3 b/2.sdk/project/7PIN_1_5/audio/R_CHARGE_FULL.mp3
new file mode 100644 (file)
index 0000000..3a77791
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_CHARGE_FULL.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_CHARGE_IN.mp3 b/2.sdk/project/7PIN_1_5/audio/R_CHARGE_IN.mp3
new file mode 100644 (file)
index 0000000..f728271
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_CHARGE_IN.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_CHARGE_OUT.mp3 b/2.sdk/project/7PIN_1_5/audio/R_CHARGE_OUT.mp3
new file mode 100644 (file)
index 0000000..cb7349d
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_CHARGE_OUT.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_0.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_0.mp3
new file mode 100644 (file)
index 0000000..ef1e1e6
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_0.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_1.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_1.mp3
new file mode 100644 (file)
index 0000000..b11b6c9
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_1.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_2.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_2.mp3
new file mode 100644 (file)
index 0000000..33b9586
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_2.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_3.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_3.mp3
new file mode 100644 (file)
index 0000000..238cce3
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_3.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_4.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_4.mp3
new file mode 100644 (file)
index 0000000..fc24035
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_4.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_5.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_5.mp3
new file mode 100644 (file)
index 0000000..f7121cd
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_5.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_6.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_6.mp3
new file mode 100644 (file)
index 0000000..a25d723
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_6.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_7.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_7.mp3
new file mode 100644 (file)
index 0000000..6db018c
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_7.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_8.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_8.mp3
new file mode 100644 (file)
index 0000000..010b21e
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_8.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_9.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_9.mp3
new file mode 100644 (file)
index 0000000..daee9a2
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_9.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_A.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_A.mp3
new file mode 100644 (file)
index 0000000..9e3b496
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_A.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_B.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_B.mp3
new file mode 100644 (file)
index 0000000..afb6dcd
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_B.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_C.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_C.mp3
new file mode 100644 (file)
index 0000000..8f8e258
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_C.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_D.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_D.mp3
new file mode 100644 (file)
index 0000000..d6fbbc4
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_D.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_E.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_E.mp3
new file mode 100644 (file)
index 0000000..95939c5
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_E.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_F.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_F.mp3
new file mode 100644 (file)
index 0000000..2325b44
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_F.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_G.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_G.mp3
new file mode 100644 (file)
index 0000000..94ff84f
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_G.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_H.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_H.mp3
new file mode 100644 (file)
index 0000000..72b95a8
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_H.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_I.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_I.mp3
new file mode 100644 (file)
index 0000000..e33c235
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_I.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_J.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_J.mp3
new file mode 100644 (file)
index 0000000..f40ce36
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_J.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_K.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_K.mp3
new file mode 100644 (file)
index 0000000..7b6e8f5
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_K.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_L.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_L.mp3
new file mode 100644 (file)
index 0000000..9ba631b
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_L.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_M.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_M.mp3
new file mode 100644 (file)
index 0000000..63a1d50
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_M.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_N.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_N.mp3
new file mode 100644 (file)
index 0000000..5dd67d3
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_N.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_O.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_O.mp3
new file mode 100644 (file)
index 0000000..773b044
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_O.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_P.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_P.mp3
new file mode 100644 (file)
index 0000000..116774a
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_P.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_Q.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_Q.mp3
new file mode 100644 (file)
index 0000000..c4567c1
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_Q.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_R.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_R.mp3
new file mode 100644 (file)
index 0000000..3b4b93e
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_R.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_S.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_S.mp3
new file mode 100644 (file)
index 0000000..d5ab4bd
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_S.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_T.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_T.mp3
new file mode 100644 (file)
index 0000000..02a7d01
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_T.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_U.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_U.mp3
new file mode 100644 (file)
index 0000000..d08163b
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_U.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_V.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_V.mp3
new file mode 100644 (file)
index 0000000..72b78db
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_V.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_W.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_W.mp3
new file mode 100644 (file)
index 0000000..13fbd53
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_W.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_X.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_X.mp3
new file mode 100644 (file)
index 0000000..e58fd7b
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_X.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_Y.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_Y.mp3
new file mode 100644 (file)
index 0000000..4d6ba45
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_Y.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_Z.mp3 b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_Z.mp3
new file mode 100644 (file)
index 0000000..f5a10c2
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/R_READ_TIME_Z.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/chaobingfatis.mp3 b/2.sdk/project/7PIN_1_5/audio/chaobingfatis.mp3
new file mode 100644 (file)
index 0000000..ed46c4f
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/chaobingfatis.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/chenggong.mp3 b/2.sdk/project/7PIN_1_5/audio/chenggong.mp3
new file mode 100644 (file)
index 0000000..23a28b7
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/chenggong.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/didianguanji.mp3 b/2.sdk/project/7PIN_1_5/audio/didianguanji.mp3
new file mode 100644 (file)
index 0000000..00f8279
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/didianguanji.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/jianquancuowu.mp3 b/2.sdk/project/7PIN_1_5/audio/jianquancuowu.mp3
new file mode 100644 (file)
index 0000000..2b37679
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/jianquancuowu.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/key_prompt.mp3 b/2.sdk/project/7PIN_1_5/audio/key_prompt.mp3
new file mode 100644 (file)
index 0000000..2baf48b
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/key_prompt.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/liuliangtishi.mp3 b/2.sdk/project/7PIN_1_5/audio/liuliangtishi.mp3
new file mode 100644 (file)
index 0000000..0e28be6
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/liuliangtishi.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/send_tone.mp3 b/2.sdk/project/7PIN_1_5/audio/send_tone.mp3
new file mode 100644 (file)
index 0000000..42cef22
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/send_tone.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/shouhou.mp3 b/2.sdk/project/7PIN_1_5/audio/shouhou.mp3
new file mode 100644 (file)
index 0000000..9b72f65
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/shouhou.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/xinhaoruo1.mp3 b/2.sdk/project/7PIN_1_5/audio/xinhaoruo1.mp3
new file mode 100644 (file)
index 0000000..2c49711
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/xinhaoruo1.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/audio/zhengzaiguanji.mp3 b/2.sdk/project/7PIN_1_5/audio/zhengzaiguanji.mp3
new file mode 100644 (file)
index 0000000..0f59a86
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/audio/zhengzaiguanji.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/images/customer_fs.bin b/2.sdk/project/7PIN_1_5/images/customer_fs.bin
new file mode 100644 (file)
index 0000000..4633dda
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/images/customer_fs.bin differ
diff --git a/2.sdk/project/7PIN_1_5/list.json b/2.sdk/project/7PIN_1_5/list.json
new file mode 100644 (file)
index 0000000..af90ba1
--- /dev/null
@@ -0,0 +1 @@
+['chaobingfatis', 'chenggong', 'didianguanji', 'IMEIhao', 'jianquancuowu', 'key_prompt', 'liuliangtishi', 'Low_power_warning', 'R_CHARGE_FULL', 'R_CHARGE_IN', 'R_CHARGE_OUT', 'R_READ_TIME_0', 'R_READ_TIME_1', 'R_READ_TIME_2', 'R_READ_TIME_3', 'R_READ_TIME_4', 'R_READ_TIME_5', 'R_READ_TIME_6', 'R_READ_TIME_7', 'R_READ_TIME_8', 'R_READ_TIME_9', 'R_READ_TIME_A', 'R_READ_TIME_B', 'R_READ_TIME_C', 'R_READ_TIME_D', 'R_READ_TIME_E', 'R_READ_TIME_F', 'R_READ_TIME_G', 'R_READ_TIME_H', 'R_READ_TIME_I', 'R_READ_TIME_J', 'R_READ_TIME_K', 'R_READ_TIME_L', 'R_READ_TIME_M', 'R_READ_TIME_N', 'R_READ_TIME_O', 'R_READ_TIME_P', 'R_READ_TIME_Q', 'R_READ_TIME_R', 'R_READ_TIME_S', 'R_READ_TIME_T', 'R_READ_TIME_U', 'R_READ_TIME_V', 'R_READ_TIME_W', 'R_READ_TIME_X', 'R_READ_TIME_Y', 'R_READ_TIME_Z', 'send_tone', 'shouhou', 'xinhaoruo1', 'zhengzaiguanji']
\ No newline at end of file
diff --git a/2.sdk/project/7PIN_1_5/merge_bin.py b/2.sdk/project/7PIN_1_5/merge_bin.py
new file mode 100644 (file)
index 0000000..c12eb7a
--- /dev/null
@@ -0,0 +1,46 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""
+@FileName : merge_bin.py
+@Author   : zhen.guo
+@Email    : zhen.guo@quectel.com
+@Date     : 2022-08-05 09:58:14
+"""
+import os
+output_list = []
+# 文件名--》下标
+def text_to_hash(filename: str) -> str:
+    output_list.append(filename.split("\\")[-1][:-4])
+    print(str(len(output_list)-1) + filename[-4:])
+    return str(len(output_list)-1) + filename[-4:]
+
+
+def merge_bin(res='res.bin', *args):
+    # 入参文件夹和文件处理
+    file_list = []
+    for i in args:
+        if os.path.isdir(i):
+            for j in os.walk(i):
+                for x in j[2]:
+                    file_list.append(j[0] + x)
+        else:
+            file_list.append(i)
+    f = open(res, 'wb')
+    fileheader = bytes("montage", 'utf-8') + bytes(1) + bytes.fromhex('%08X' % len(file_list))[::-1]
+    filebyte, bytesize, filebody = b'', 0, b''
+    for i in file_list:
+        print(i)
+        filename_byte = bytes(text_to_hash(i), 'utf-8')
+        filebyte += (filename_byte + bytes(128-len(filename_byte)) + bytes.fromhex('%08X' % (len(file_list)*136 + 12 + bytesize))[::-1] + bytes.fromhex('%08X' % os.path.getsize(i))[::-1])
+        bytesize += os.path.getsize(i)
+        filebody += open(i, 'rb').read()
+    f.write(fileheader + filebyte + filebody)
+    f.close()
+    print(output_list)
+    with open('list.json', 'w') as f:
+        f.write(str(output_list))
+    print("----MERGE SUCCESS----")
+    return output_list
+
+output_list = merge_bin(".\\usr\\static\\audio.bin", ".\\audio\\")
\ No newline at end of file
diff --git a/2.sdk/project/7PIN_1_5/new.bat b/2.sdk/project/7PIN_1_5/new.bat
new file mode 100644 (file)
index 0000000..bd2d9ea
--- /dev/null
@@ -0,0 +1,39 @@
+@echo off
+
+md images
+del images /q
+@GOTO :STEP1
+..\..\Helios_SDK\tools\ASR_1606\win32\mklfs.exe -c ext -b 4096 -r 4096 -p 4096 -s 1048576 -i .\images\ext_fs.bin
+if errorlevel 1 (
+    echo "ext_fs.binÉú³Éʧ°Ü !!!!!!!!!!!!!!! "
+    goto exit
+)
+if errorlevel 0 (
+    echo "ext_fs.binÉú³É³É¹¦ !!!!!!!!!!!!!!! "
+)
+:STEP1
+
+..\..\Helios_SDK\tools\ASR_1606\win32\mklfs.exe -c usr -b 4096 -r 4096 -p 4096 -s 1376256 -i .\images\customer_fs.bin
+if errorlevel 1 (
+    echo "customer_fs.binÉú³Éʧ°Ü Çë¼ì²éusrĿ¼ÊÇ·ñ´óÓÚ316K!!!!!!!!!!!!!!!"
+    goto exit
+)
+if errorlevel 0 (
+    echo "customer_fs.binÉú³É³É¹¦ !!!!!!!!!!!!!!! "
+)
+
+%copy font\ext_font.bin images\ext_font.bin%
+
+..\..\Helios_SDK\tools\common\win32\7z\7z a sdk\system\platform\ASR_1606\boards\EG810MCN_GA_VOLTE\images\firmware_base_release_pack.zip .\images\
+if errorlevel 0 (
+    echo imagesѹËõ³É¹¦!!!!!!!!!!!!!!
+)
+if errorlevel 1 (
+    echo imagesѹËõʧ°Ü!!!!!!!!!!!!!!!!!!
+    goto exit
+)
+xcopy  sdk\ ..\..\Helios_SDK\ /e/h/y
+cd ..\..\Helios_SDK
+helios make services/microPython @EG810MCN_GA_VOLTE EG810MCN_GA_VOLTE
+cd ..
+:exit
\ No newline at end of file
diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/EventMesh.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/EventMesh.py
new file mode 100644 (file)
index 0000000..912b3d0
--- /dev/null
@@ -0,0 +1,133 @@
+import _thread
+import usys
+import versions
+import ql_fs
+
+model = "D15"
+project = "D15"
+platform = "D15"#格物平台 不用的话选择空
+
+# project = "D10"
+# model = "D10"
+# platform = "D10"#格物平台 不用的话选择空
+#platform = "gewu"#格物平台 不用的话选择空 如果需要联通入库的需求就要打开 不需要就得写空通过变量区分
+
+# platform = "D15"#格物平台 不用的话选择空
+
+# model = "G10W_DT_YBX_"
+
+softversion = "{}_{}".format(project,versions.Version)
+builTime = "{}".format(versions.Build_Time)
+
+class EventStore(object):
+    def __init__(self):
+        self.map = dict()
+        self.log = None
+        self.__filters = []
+
+    def add_filter(self, flt):
+        self.__filters.append(flt)
+
+    def append(self, event, cb):
+        self.map[event] = cb
+
+    def fire_async(self, event, msg,thread_size):
+        if event in self.map:
+            #print("fire_async:thread_size:{}".format(thread_size))
+            if thread_size != None:
+                _thread.stack_size(thread_size)
+                #print("fire_async:thread_size:{}".format(thread_size))
+            _thread.start_new_thread(self.map[event], (event, msg))
+            if thread_size != None:
+                _thread.stack_size(8*1024)
+            if self.log:
+                self.log.info("ASYNC executed (event) -> {} (params) -> {} (result) -> {}".format(event, msg, None))
+
+    def fire_sync(self, event, msg):
+        res = None
+        try:
+            if event in self.map:
+                res = self.map[event](event, msg)
+        except Exception as e:
+            usys.print_exception(e)
+            if self.log:
+                self.log.info("ERROR executed (event) -> {} (params) -> {} (result) -> {}".format(event, msg, res))
+        if event not in self.__filters:
+            if self.log:
+                self.log.info("SYNC executed (event) -> {} (params) -> {} (result) -> {}".format(event, msg, res))
+        return res
+
+
+event_store = EventStore()
+
+
+def subscribe(event, cb):
+    """
+    subscribe event and cb
+    """
+    return event_store.append(event, cb)
+
+
+def publish(event, msg=None):
+    """
+    publish event and msg
+    """
+    return publish_sync(event, msg)
+
+
+def publish_async(event, msg=None,thread_size = None):
+    """
+    异步发送
+    """
+    return event_store.fire_async(event, msg,thread_size)
+
+
+def publish_sync(event, msg=None):
+    """
+    同步发送
+    """
+    return event_store.fire_sync(event, msg)
+
+
+def set_log(log_adapter):
+    event_store.log = log_adapter
+
+
+def add_filter(flt):
+    event_store.add_filter(flt)
+
+def callback_wrapper(callback):#按键回调
+    def wrapped_callback(*args, **kwargs):
+        try:
+            return callback(*args, **kwargs)
+        except Exception as e:
+            # 在这里处理异常,例如打印错误信息,保存到日志文件,等等。
+            print('Exception in callback:', e)
+            # 如果需要,你可以在这里重新抛出异常
+            # raise
+    return wrapped_callback
+
+
+import utime
+import uos
+debug_Log = 1
+def debug_log(*data):
+    if debug_Log != 0 :
+        print(data)
+Txt_Log = 0
+def txt_log(data):
+    if Txt_Log != 0 :
+        print(data)
+        try:
+            check_file = ql_fs.path_exists("usr/log.txt")
+
+            if check_file == True:
+                f_stat = uos.stat("usr/log.txt")
+                if f_stat[6] > 50*1024:
+                    uos.remove("usr/log.txt") 
+        except Exception as e:
+            usys.print_exception(e)
+        with open("/usr/log.txt","a",encoding="utf-8") as fd:
+            d_time = utime.localtime()
+            data_tmp = "%02d-%02d %02d:%02d:%02d :"%(d_time[1],d_time[2],d_time[3],d_time[4],d_time[5])
+            fd.write(data_tmp+data+"\n")
diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/Makefile b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/Makefile
new file mode 100644 (file)
index 0000000..80fbcdd
--- /dev/null
@@ -0,0 +1,1177 @@
+# Copyright (c) Quectel Wireless Solution, Co., Ltd.All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#env
+TOP := ../../..
+ROOT := $(TOP)/../..
+
+KCONFIG_CONFIG_DIR := ../../../../..
+include $(KCONFIG_CONFIG_DIR)/config/$(KCONFIG_CONFIG)
+
+ifeq ("$(origin V)", "command line")
+BUILD_VERBOSE=$(V)
+endif
+ifndef BUILD_VERBOSE
+BUILD_VERBOSE = 0
+endif
+# ifeq ($(BUILD_VERBOSE),0)
+# Q = @
+# else
+# Q =
+# endif
+
+BUILD ?= build
+FROZEN_MPY_DIR ?= .
+
+RM = rm
+ECHO = echo
+CP = cp
+MKDIR = mkdir
+SED = sed
+CAT = cat
+TOUCH = touch
+
+MAKE_MANIFEST = $(PYTHON) $(TOP)/tools/makemanifest.py
+MAKE_FROZEN = $(PYTHON) $(TOP)/tools/make-frozen.py
+#because E-safeNet, mpy-cross could not read the py file, rename as notepad++
+ifeq ($(strip $(HOST)),linux)
+MPY_CROSS = $(TOP)/ports/quectel/tools/mpy-cross
+else
+MPY_CROSS = $(TOP)/ports/quectel/tools/notepad++.exe
+endif
+MPY_TOOL = $(PYTHON) $(TOP)/tools/mpy-tool.py
+
+QSTR_DEFS = source/qstrdefsport.h
+#py
+PY_SRC ?= $(TOP)/py
+HEADER_BUILD = $(TOP)/genhdr
+PY_QSTR_DEFS = $(PY_SRC)/qstrdefs.h
+ifneq ($(QSTR_AUTOGEN_DISABLE),1)
+QSTR_DEFS_COLLECTED = $(HEADER_BUILD)/qstrdefs.collected.h
+endif
+QSTR_GLOBAL_DEPENDENCIES += $(PY_SRC)/mpconfig.h source/mpconfigport.h
+CSUPEROPT = -O3
+ifeq ($(strip $(PLAT)),ECR6600)
+MPY_CROSS_FLAGS += -march=xtensa
+else
+MPY_CROSS_FLAGS += -march=armv7m
+endif
+# Enable building 32-bit code on 64-bit host.
+ifeq ($(MICROPY_FORCE_32BIT),1)
+CC += -m32
+CXX += -m32
+LD += -m32
+endif
+
+# External modules written in C.
+ifneq ($(USER_C_MODULES),)
+# pre-define USERMOD variables as expanded so that variables are immediate
+# expanded as they're added to them
+SRC_USERMOD :=
+C_FLAGS_USERMOD :=
+LD_FLAGS_USERMOD :=
+$(foreach module, $(wildcard $(USER_C_MODULES)/*/micropython.mk), \
+    $(eval USERMOD_DIR = $(patsubst %/,%,$(dir $(module))))\
+    $(info Including User C Module from $(USERMOD_DIR))\
+       $(eval include $(module))\
+)
+
+SRC_MOD += $(patsubst $(USER_C_MODULES)/%.c,%.c,$(SRC_USERMOD))
+C_FLAGS_MOD += $(C_FLAGS_USERMOD)
+LD_FLAGS_MOD += $(LD_FLAGS_USERMOD)
+endif
+
+# py object files
+PY_CORE_O_BASENAME = $(addprefix py/,\
+       mpstate.o \
+       nlr.o \
+       nlrx86.o \
+       nlrx64.o \
+       nlrthumb.o \
+       nlrpowerpc.o \
+       nlrxtensa.o \
+       nlrsetjmp.o \
+       malloc.o \
+       gc.o \
+       pystack.o \
+       qstr.o \
+       vstr.o \
+       mpprint.o \
+       unicode.o \
+       mpz.o \
+       reader.o \
+       lexer.o \
+       parse.o \
+       scope.o \
+       compile.o \
+       emitcommon.o \
+       emitbc.o \
+       asmbase.o \
+       asmx64.o \
+       emitnx64.o \
+       asmx86.o \
+       emitnx86.o \
+       asmthumb.o \
+       emitnthumb.o \
+       emitinlinethumb.o \
+       asmarm.o \
+       emitnarm.o \
+       asmxtensa.o \
+       emitnxtensa.o \
+       emitinlinextensa.o \
+       emitnxtensawin.o \
+       formatfloat.o \
+       parsenumbase.o \
+       parsenum.o \
+       emitglue.o \
+       persistentcode.o \
+       runtime.o \
+       runtime_utils.o \
+       scheduler.o \
+       nativeglue.o \
+       pairheap.o \
+       ringbuf.o \
+       stackctrl.o \
+       argcheck.o \
+       warning.o \
+       profile.o \
+       map.o \
+       obj.o \
+       objarray.o \
+       objattrtuple.o \
+       objbool.o \
+       objboundmeth.o \
+       objcell.o \
+       objclosure.o \
+       objcomplex.o \
+       objdeque.o \
+       objdict.o \
+       objenumerate.o \
+       objexcept.o \
+       objfilter.o \
+       objfloat.o \
+       objfun.o \
+       objgenerator.o \
+       objgetitemiter.o \
+       objint.o \
+       objint_longlong.o \
+       objint_mpz.o \
+       objlist.o \
+       objmap.o \
+       objmodule.o \
+       objobject.o \
+       objpolyiter.o \
+       objproperty.o \
+       objnone.o \
+       objnamedtuple.o \
+       objrange.o \
+       objreversed.o \
+       objset.o \
+       objsingleton.o \
+       objslice.o \
+       objstr.o \
+       objstrunicode.o \
+       objstringio.o \
+       objtuple.o \
+       objtype.o \
+       objzip.o \
+       opmethods.o \
+       sequence.o \
+       stream.o \
+       binary.o \
+       builtinimport.o \
+       builtinevex.o \
+       builtinhelp.o \
+       modarray.o \
+       modbuiltins.o \
+       modcollections.o \
+       modgc.o \
+       modio.o \
+       modmath.o \
+       modcmath.o \
+       modmicropython.o \
+       modstruct.o \
+       modsys.o \
+       moduerrno.o \
+       modthread.o \
+       vm.o \
+       bc.o \
+       showbc.o \
+       repl.o \
+       smallint.o \
+       frozenmod.o \
+       )
+
+PY_EXTMOD_O_BASENAME = \
+       extmod/moductypes.o \
+       extmod/modujson.o \
+       extmod/modure.o \
+       extmod/moduzlib.o \
+       extmod/moduheapq.o \
+       extmod/modutimeq.o \
+       extmod/modubinascii.o \
+       extmod/virtpin.o \
+       extmod/machine_mem.o \
+       extmod/machine_pinbase.o \
+       extmod/machine_signal.o \
+       extmod/machine_pulse.o \
+       extmod/machine_i2c.o \
+       extmod/machine_spi.o \
+       extmod/modbluetooth.o \
+       extmod/modurandom.o \
+       extmod/moduselect.o \
+       extmod/moduasyncio.o \
+       extmod/moduwebsocket.o \
+       extmod/modwebrepl.o \
+       extmod/modframebuf.o \
+       extmod/vfs.o \
+       extmod/vfs_blockdev.o \
+       extmod/vfs_reader.o \
+       extmod/vfs_posix.o \
+       extmod/vfs_posix_file.o \
+       extmod/vfs_fat.o \
+       extmod/vfs_fat_file.o \
+       extmod/vfs_lfs.o \
+       extmod/utime_mphal.o \
+       extmod/uos_dupterm.o \
+       extmod/modussl_mbedtls.o \
+       extmod/moduhashlib.o \
+       extmod/moducryptolib.o \
+       lib/embed/abort_.o \
+       lib/utils/printf.o \
+       lib/utils/sys_stdio_mphal.o
+
+ifeq ($(strip $(PLAT)),Qualcomm)
+PY_EXTMOD_O_BASENAME += \
+       extmod/vfs_efs.o \
+       extmod/vfs_efs_file.o
+endif
+
+ifeq ($(strip $(PLAT)), $(filter $(PLAT),Unisoc Unisoc_8910_R05))
+PY_EXTMOD_O_BASENAME += \
+       extmod/vfs_temp.o \
+       extmod/vfs_temp_file.o
+endif
+
+# Sources that may contain qstrings
+SRC_QSTR_IGNORE = py/nlr%
+SRC_QSTR += $(SRC_MOD) $(filter-out $(SRC_QSTR_IGNORE),$(PY_CORE_O_BASENAME:.o=.c)) $(PY_EXTMOD_O_BASENAME:.o=.c)
+SRC_QSTR += \
+                       source/modalipay.c \
+                       source/audio_audio.c \
+                       source/audio_queue.c \
+                       source/audio_record.c \
+                       source/audio_tts.c \
+                       source/audiocodec_rt5616.c \
+                       source/callbackdeal.c \
+                       source/camera_capture.c \
+                       source/camera_preview.c \
+                       source/camera_scandecode.c \
+                       source/devreport.c \
+                       source/machine_extint.c \
+                       source/machine_hw_spi.c \
+                       source/machine_iic.c \
+                       source/machine_iic_simulation.c \
+                       source/machine_keypad.c \
+                       source/machine_lcd.c \
+                       source/machine_nandflash.c \
+                       source/machine_pin.c \
+                       source/machine_rtc.c \
+                       source/machine_timer.c \
+                       source/machine_uart.c \
+                       source/machine_wdt.c \
+                       source/misc_adc.c \
+                       source/misc_power.c \
+                       source/misc_powerkey.c \
+                       source/misc_pwm.c \
+                       source/misc_temperature.c \
+                       source/misc_usb.c \
+                       source/misc_usbnet.c \
+                       source/modatcmd.c \
+                       source/modaudio.c \
+                       source/modaudiocodec.c \
+                       source/modble.c \
+                       source/modbt.c \
+                       source/modcamera.c \
+                       source/modcelllocator.c \
+                       source/modcelllocator_qpy.c \
+                       source/locator.c \
+                       source/modcsd.c \
+                       source/moddatacall.c \
+                       source/moddev.c \
+                       source/modethernet.c \
+                       source/modethernet_dm9051.c \
+                       source/modethernet_w5500.c \
+                       source/modethernet_ch395.c \
+                       source/modexample.c \
+                       source/modfota.c \
+                       source/modgnss.c \
+                       source/modlpm.c \
+                       source/modlvgl.c \
+                       source/modlwm2m.c \
+                       source/modmachine.c \
+                       source/modmisc.c \
+                       source/modnb.c \
+                       source/modnet.c \
+                       source/modostimer.c \
+                       source/modpoc.c \
+                       source/modqrcode.c \
+                       source/modrtmp.c \
+                       source/modsecuredata.c \
+                       source/modsensor.c \
+                       source/modsha1.c \
+                       source/modsim.c \
+                       source/modslipif.c \
+                       source/modsms.c \
+                       source/modsocket.c \
+                       source/modtp.c \
+                       source/moduos.c \
+                       source/modutils.c \
+                       source/modutime.c \
+                       source/modvoicecall.c \
+                       source/modwifilocator.c \
+                       source/modwifiscan.c \
+                       source/nb_aep.c \
+                       source/nb_oc.c \
+                       source/nb_onenet.c \
+                       source/quecpython.c \
+                       source/sensor_sn95500.c \
+                       source/sensor_icckey.c \
+                       source/sensor_gnss.c \
+                       source/tp_gt9xx.c \
+                       source/tp_xpt2046.c \
+                       source/tp_cst816.c \
+                       source/modGsensor.c \
+                       source/modGsensor_SC7A20.c \
+                       source/modHsensor.c \
+                       source/modHsensor_GH3018.c \
+                       source/modVideoCall.c \
+                       source/modVideoCall_juphoon.c \
+                       source/modHsensor_HX3918.c \
+                       source/modrsa.c \
+                       source/utils_crc32.c \
+                       source/http_parser.c \
+                       source/modwebserver.c \
+                       source/modethernet_yt8512h.c \
+                       source/sim_esim.c \
+                       source/modG711.c \
+                       source/modG729.c \
+                       source/modcan_mcp2515.c \
+                       source/modextuart_wk2114.c \
+                       source/modextgpio_aw9523.c \
+                       source/machine_key.c \
+                       source/lpm_wakeup.c \
+                       source/sensor_handmic_key.c     \
+                       source/modnetwork.c     \
+                       source/modwlan_ASR5803.c \
+                       source/machine_soft_spi.c \
+                       source/code128_p.c \
+                       source/modwlan.c\
+                       source/modwlan.c \
+                       source/modmask.c \
+                       source/modVad.c \
+                       source/machine_one_wire.c
+
+
+ifeq ($(strip $(PLAT)),RDA)
+SRC_QSTR += $(ROOT)/components/quecsdk/cloud/python/modquecIot-BC25old.c
+else
+SRC_QSTR += $(ROOT)/components/quecsdk/cloud/python/modquecIot.c
+endif
+
+ifeq ($(CONFIG_USQLITE), y)
+SRC_QSTR += lib/usqlite/usqlite_connection.c \
+                       lib/usqlite/usqlite_cursor.c \
+                       lib/usqlite/usqlite_row.c \
+                       lib/usqlite/usqlite_file.c \
+                       lib/usqlite/usqlite_mem.c \
+                       lib/usqlite/usqlite_vfs.c \
+                       lib/usqlite/usqlite_utils.c \
+                       lib/usqlite/usqlite.c \
+                       lib/usqlite/usqlite_module.c
+
+INC += -Ilib/usqlite
+endif
+
+$(BUILD)/%.pp: %.c
+       @$(ECHO) "PreProcess $<"
+       $(Q)$(CPP) $(C_FLAGS) -Wp,-C,-dD,-dI -o $@ $<
+
+# Anything that depends on FORCE will be considered out-of-date
+FORCE:
+.PHONY: FORCE
+
+$(HEADER_BUILD):
+       $(MKDIR) -p $@
+
+#$(HEADER_BUILD)/mpversion.h: FORCE | $(HEADER_BUILD)
+#      $(Q)$(PYTHON) $(PY_SRC)/makeversionhdr.py $@
+# mpconfigport.mk is optional, but changes to it may drastically change
+# overall config, so they need to be caught
+MPCONFIGPORT_MK = $(wildcard mpconfigport.mk)
+
+# qstr data
+# Adding an order only dependency on $(HEADER_BUILD) causes $(HEADER_BUILD) to get
+# created before we run the script to generate the .h
+# Note: we need to protect the qstr names from the preprocessor, so we wrap
+# the lines in "" and then unwrap after the preprocessor is finished.
+# See more information about this process in docs/develop/qstr.rst.
+$(HEADER_BUILD)/qstrdefs.generated.h: $(PY_QSTR_DEFS) $(QSTR_DEFS) $(QSTR_DEFS_COLLECTED) $(PY_SRC)/makeqstrdata.py source/mpconfigport.h $(MPCONFIGPORT_MK) $(PY_SRC)/mpconfig.h | $(HEADER_BUILD)
+       @$(ECHO) "GEN $@"
+       $(Q)$(CAT) $(PY_QSTR_DEFS) $(QSTR_DEFS) $(QSTR_DEFS_COLLECTED) | $(SED) 's/^Q(.*)/"&"/' | $(CPP) $(C_FLAGS) - | $(SED) 's/^\"\(Q(.*)\)\"/\1/' > $(HEADER_BUILD)/qstrdefs.preprocessed.h
+       $(Q)$(PYTHON) $(PY_SRC)/makeqstrdata.py $(HEADER_BUILD)/qstrdefs.preprocessed.h > $@
+
+# Compressed error strings.
+$(HEADER_BUILD)/compressed.split: $(HEADER_BUILD)/qstr.i.last
+       @$(ECHO) "GEN $@"
+       $(Q)$(PYTHON) $(PY_SRC)/makeqstrdefs.py split compress $< $(HEADER_BUILD)/compress _
+       $(Q)$(TOUCH) $@
+       
+$(HEADER_BUILD)/compressed.collected: $(HEADER_BUILD)/compressed.split
+       @$(ECHO) "GEN $@"
+       $(Q)$(PYTHON) $(PY_SRC)/makeqstrdefs.py $(CAT) compress _ $(HEADER_BUILD)/compress $@
+       
+$(HEADER_BUILD)/compressed.data.h: $(HEADER_BUILD)/compressed.collected
+       @$(ECHO) "GEN $@"
+       $(Q)$(PYTHON) $(PY_SRC)/makecompresseddata.py $< > $@
+       
+# build a list of registered modules for py/objmodule.c.
+$(HEADER_BUILD)/moduledefs.h: $(SRC_QSTR) $(QSTR_GLOBAL_DEPENDENCIES) | $(HEADER_BUILD)
+       @$(ECHO) "GEN $@"
+       $(Q)$(PYTHON) $(PY_SRC)/makemoduledefs.py --vpath="., $(TOP), $(USER_C_MODULES)" $(SRC_QSTR) > $@
+
+SRC_QSTR += $(HEADER_BUILD)/moduledefs.h
+
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/config
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/include
+
+ifeq ($(strip $(PLAT)),Qualcomm)
+INC += -I$(COMPILER_PATH)/armv7m-none-eabi/libc/include
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/c-utility
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/c-utility/inc
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/c-utility/inc/azure_c_shared_utility
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/c-utility/pal
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/c-utility/pal/generic
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/iothub_client
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/iothub_client/inc
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/iothub_client/inc/internal
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/serializer
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/serializer/inc
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/umqtt
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/umqtt/inc
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/umqtt/inc/azure_umqtt_c
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/qapi
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/threadx_api
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include
+INC += -I$(ROOT)/system/at
+INC += -I$(ROOT)/system/esim
+endif
+
+INC += -I.
+INC += -I$(HEADER_BUILD)
+INC += -I$(TOP)
+INC += -I$(TOP)/py
+INC += -I$(TOP)/extmod
+INC += -I$(TOP)/lib/utils
+INC += -I$(TOP)/lib/mp-readline
+INC += -I$(TOP)/lib/littlefs
+INC += -I$(TOP)/lib/netutils
+INC += -I$(TOP)/lib/timeutils
+INC += -I$(TOP)/ports/quectel/core
+INC += -I$(TOP)/ports/quectel/core/source
+INC += -I$(TOP)/ports/quectel/core/py
+INC += -I$(ROOT)/peripheral
+INC += -I$(ROOT)/system/include
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/include
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include
+INC += -I$(ROOT)/system/debug
+INC += -I$(ROOT)/system/dev
+INC += -I$(ROOT)/system/fs
+INC += -I$(ROOT)/system/hal
+INC += -I$(ROOT)/system/gnss
+INC += -I$(ROOT)/system/network
+INC += -I$(ROOT)/system/at
+INC += -I$(ROOT)/system/aliiot
+
+ifeq ($(strip $(PLAT)),ASR_1803s)
+INC += -I$(ROOT)/system/csd
+INC += -I$(ROOT)/system/esim
+endif
+ifeq ($(strip $(PLAT)),ASR_1606)
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include
+endif
+
+ifeq ($(strip $(PLAT)),Unisoc)
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/apps
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/priv
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/prot
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/netif
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix/arpa
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix/net
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix/netinet
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix/sys
+INC += -I$(ROOT)/system/at
+endif
+
+ifeq ($(strip $(PLAT)),Unisoc_8910_R05)
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/apps
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/priv
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/prot
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/netif
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/netif/ppp
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/netif/ppp/polarssl
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix/arpa
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix/net
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix/netinet
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix/sys
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/stdc
+endif
+
+ifeq ($(strip $(PLAT)),EIGEN)
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include/lwip
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include/lwip/apps
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include/lwip/priv
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include/lwip/prot
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include/arch
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include/netif
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include/posix
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include/posix/sys
+endif
+
+ifeq ($(strip $(PLAT)),Unisoc_8850)
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/apps
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/priv
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/prot
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/netif
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/netif/ppp
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/netif/ppp/polarssl
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix/arpa
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix/net
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix/netinet
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix/sys
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/stdc
+endif
+
+ifeq ($(strip $(PLAT)),RDA)
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include/arch
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/apps
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/priv
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/prot
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/netif
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix/arpa
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix/net
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix/netinet
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix/sys
+endif
+
+ifeq ($(strip $(PLAT)), $(filter $(PLAT),ASR ASR_1803s))
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include
+INC += -I$(ROOT)/system/at
+endif
+
+ifeq ($(strip $(PLAT)),ECR6600)
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include
+endif
+
+ifeq (y, $(CONFIG_MBEDTLS))
+INC += -I$(ROOT)/system/mbedtls
+INC += -I$(ROOT)/system/mbedtls/include
+INC += -I$(ROOT)/system/mbedtls/include/mbedtls
+INC += -I$(ROOT)/system/mbedtls/library
+INC += -I$(ROOT)/system/mbedtls/port/helios/inc
+endif
+INC += -I$(ROOT)/system/network
+INC += -I$(ROOT)/system/os
+INC += -I$(ROOT)/system/startup
+INC += -I$(ROOT)/system/fota
+INC += -I$(ROOT)/system/bt
+INC += -I$(ROOT)/system/at
+ifeq (y, $(CONFIG_LVGL))
+INC += -I$(TOP)/lib/lvgl
+INC += -I$(TOP)/lib/lvgl/src
+INC += -I$(TOP)/lib/lvgl/src/core
+INC += -I$(TOP)/lib/lvgl/src/draw
+INC += -I$(TOP)/lib/lvgl/src/extra
+INC += -I$(TOP)/lib/lvgl/src/font
+INC += -I$(TOP)/lib/lvgl/src/gpu
+INC += -I$(TOP)/lib/lvgl/src/hal
+INC += -I$(TOP)/lib/lvgl/src/misc
+INC += -I$(TOP)/lib/lvgl/src/widgts
+endif
+INC += -I$(ROOT)/driver
+INC += -I$(ROOT)/driver/lcd
+ifeq (y, $(CONFIG_QRCODE))
+INC += -I$(ROOT)/components/qrcode
+endif
+ifeq (y, $(CONFIG_QUECTHING))
+INC += -I$(ROOT)/components/quecsdk/cloud
+INC += -I$(ROOT)/components/quecsdk/driverLayer
+INC += -I$(ROOT)/components/quecsdk/thirdLib/mqtt
+INC += -I$(ROOT)/components/quecsdk/thirdLib/cJSON
+INC += -I$(ROOT)/components/quecsdk/kernel
+endif
+ifeq ($(CONFIG_SPINAND), y)
+INC += -I$(ROOT)/components/fs/include
+INC += -I$(ROOT)/components/fs/yaffs/src/direct
+INC += -I$(ROOT)/components/fs/yaffs/src/port
+INC += -I$(ROOT)/components/fs/yaffs/src
+INC += -I$(ROOT)/components/fs/yaffs
+endif
+ifeq ($(CONFIG_RTMP), y)
+INC += -I$(ROOT)/components/rtmpdump/librtmp/inc
+INC += -I$(ROOT)/components/rtmpdump/libz/inc
+endif
+INC += -I$(ROOT)/utilities
+ifeq ($(CONFIG_JPEG), y)
+INC += -I$(ROOT)/components/jpeg/jpeg-9c
+INC += -I$(ROOT)/components/jpeg
+endif
+ifeq ($(CONFIG_HX3918), y)
+INC += -I$(ROOT)/components/HX3918
+endif
+ifeq ($(CONFIG_GH301x), y)
+INC += -I$(ROOT)/components/GH301x
+endif
+ifeq ($(CONFIG_SC7A20), y)
+INC += -I$(ROOT)/components/SC7A20
+endif
+ifeq ($(CONFIG_juphoon), y)
+INC += -I$(ROOT)/components/juphoon
+endif
+ifeq ($(CONFIG_POC_BND), y)
+INC += -I$(ROOT)/components/poc
+INC += -I$(ROOT)/components/poc/bnd/inc
+endif
+ifeq ($(CONFIG_POC_BND_XIN), y)
+INC += -I$(ROOT)/components/poc
+INC += -I$(ROOT)/components/poc/bnd_xin/inc
+endif
+ifeq ($(CONFIG_POC_SL), y)
+INC += -I$(ROOT)/components/poc
+INC += -I$(ROOT)/components/poc/sl/inc
+endif
+ifeq ($(CONFIG_POC_QS), y)
+INC += -I$(ROOT)/components/poc
+INC += -I$(ROOT)/components/poc/qs/inc
+endif
+#Stephen.Gao add 2022/11/23
+ifeq ($(CONFIG_POC_ZZD), y)
+INC += -I$(ROOT)/components/poc
+INC += -I$(ROOT)/components/poc/zzd/inc
+endif
+#Stephen.Gao add 2023/01/06
+ifeq ($(CONFIG_POC_YDWL), y)
+INC += -I$(ROOT)/components/poc
+INC += -I$(ROOT)/components/poc/ydwl/inc
+endif
+
+ifeq ($(CONFIG_POC_SLPOC), y)
+INC += -I$(ROOT)/components/poc  -I$(ROOT)/components/poc/slpoc/src
+INC += -I$(ROOT)/components/poc/slpoc/inc
+SRC_QSTR += $(ROOT)/components/poc/slpoc/src/modpoc_slpoc.c
+endif
+
+ifeq ($(CONFIG_POC_RDA_BND), y)
+INC += -I$(ROOT)/components/poc  -I$(ROOT)/components/poc/rda_bnd/src
+INC += -I$(ROOT)/components/poc/rda_bnd/inc
+SRC_QSTR += $(ROOT)/components/poc/rda_bnd/src/modpocrda.c
+endif
+
+
+ifeq (y,$(CONFIG_DECODE_ZBAR))
+INC += -I$(ROOT)/components/decode/ZBar/zbar
+INC += -I$(ROOT)/components/decode/ZBar/include
+INC += -I$(ROOT)/components/decode/ZBar/zbar/decoder
+INC += -I$(ROOT)/components/decode/ZBar/zbar/qrcode
+endif
+ifeq (y,$(CONFIG_DECODE_QUECTEL))
+INC += -I$(ROOT)/components/decode/quectel/inc
+endif
+
+ifeq (y,$(CONFIG_DECODE_QINGYA))
+ifneq ($(strip $(PLAT)),ASR)
+ifneq ($(strip $(PLAT)),ASR_1606)
+INC += -I$(ROOT)/components/decode/qingya
+endif
+endif
+endif
+
+ifeq ($(CONFIG_SPI_SDCARD), y)
+INC += -I$(ROOT)/components/fs/fatfs/include
+endif
+
+ifeq ($(CONFIG_AUDIO_G711_COMPRESS), y)
+INC += -I$(ROOT)/components/audio/G711
+endif
+ifeq ($(strip $(PLAT)),EIGEN)
+INC += -I$(ROOT)/components/audio
+endif
+
+ifeq ($(CONFIG_GMSSL), y)
+INC += -I$(ROOT)/components/GMSSL/include
+INC += -I$(ROOT)/components/GMSSL/include/gmssl
+endif
+
+ifeq ($(CONFIG_AUDIO_G729_COMPRESS), y)
+INC += -I$(ROOT)/components/audio/G729
+INC += -I$(ROOT)/components/audio/G729/src
+INC += -I$(ROOT)/components/audio/G729/include
+endif
+
+# compiler settings
+CWARN = -Wall -Werror
+CWARN += -Wpointer-arith -Wuninitialized
+C_FLAGS = $(INC) $(CWARN) -std=gnu99 $(C_FLAGS_MOD) $(COPT) $(C_FLAGS_EXTRA)
+C_FLAGS += -fdata-sections -ffunction-sections -fno-asynchronous-unwind-tables --include=../../../../../../config/autoconf.h
+
+LD_FLAGS_ARCH = -Wl,-Map=$@.map,--cref -Wl,--gc-sections
+LD_FLAGS = $(LD_FLAGS_MOD) $(LD_FLAGS_ARCH) -lm $(LD_FLAGS_EXTRA)
+
+D_FLAGS += $(foreach dflag, $(DFLAGS), -D$(dflag))
+D_FLAGS += -DMP_CONFIGFILE="\"ports/quectel/core/source/mpconfigport.h\"" \
+                 -DMICROPY_MPTHREADPORT_H="\"ports/quectel/core/source/mpthreadport.h\"" \
+                 -DMICROPY_MPHALPORT_H="\"ports/quectel/core/source/mphalport.h\""
+
+vpath %.S . $(TOP) $(USER_C_MODULES)
+$(BUILD)/%.o: %.S
+       @$(ECHO) "CC $<"
+       $(Q)$(CC) $(C_FLAGS) $(D_FLAGS) -c -o $@ $<
+
+vpath %.s . $(TOP) $(USER_C_MODULES)
+$(BUILD)/%.o: %.s
+       @$(ECHO) "AS $<"
+       $(Q)$(AS) -o $@ $<
+QSTR_GEN_EXTRA_C_FLAGS += -DNO_QSTR
+vpath %.c . $(TOP) $(USER_C_MODULES)
+$(BUILD)/%.pp: %.c
+       @$(ECHO) "PreProcess $<"
+       $(Q)$(CPP) $(C_FLAGS) $(D_FLAGS) -Wp,-C,-dD,-dI -o $@ $<
+
+#$(OBJ): | $(HEADER_BUILD)/qstrdefs.generated.h $(HEADER_BUILD)/mpversion.h
+
+
+$(HEADER_BUILD)/qstr.i.last: $(SRC_QSTR) $(QSTR_GLOBAL_DEPENDENCIES) | $(QSTR_GLOBAL_REQUIREMENTS)
+       @$(ECHO) "GEN $@"
+       @rm -f $@ $@.dep
+       @for src in $(if $(filter $?,$(QSTR_GLOBAL_DEPENDENCIES)),$^,$(if $?,$?,$^)); \
+       do \
+               echo $$src >> $@.dep; \
+       done
+       @while read -r src; \
+               do \
+                       echo processing on $$src ...; \
+                       $(CPP) $(QSTR_GEN_EXTRA_C_FLAGS) $(C_FLAGS) $(D_FLAGS) $$src >> $@; \
+       done < $@.dep
+
+$(HEADER_BUILD)/qstr.split: $(HEADER_BUILD)/qstr.i.last
+       @$(ECHO) "GEN $@"
+       $(Q)$(PYTHON) $(PY_SRC)/makeqstrdefs.py split qstr $(HEADER_BUILD)/qstr.i.last $(HEADER_BUILD)/qstr $(QSTR_DEFS_COLLECTED)
+       $(Q)$(TOUCH) $@
+
+$(QSTR_DEFS_COLLECTED): $(HEADER_BUILD)/qstr.split
+       @$(ECHO) "GEN $@"
+       $(Q)$(PYTHON) $(PY_SRC)/makeqstrdefs.py cat qstr $(HEADER_BUILD)/qstr.i.last $(HEADER_BUILD)/qstr $(QSTR_DEFS_COLLECTED)
+
+
+$(BUILD)/%.mpy: $(FROZEN_MPY_DIR)/%.py
+       @$(ECHO) "MPY $<"
+       $(Q)$(MKDIR) -p $(dir $@)
+       $(Q)$(MPY_CROSS) -o $@ -s $(<:$(FROZEN_MPY_DIR)/%=%) $(MPY_CROSS_FLAGS) $<
+
+ifeq ($(strip $(PLAT)),RDA)
+frozen_mpy_list =      $(BUILD)/_boot_RDA.mpy \
+                                       $(BUILD)/system.mpy \
+                                       $(BUILD)/dataCall.mpy \
+                                       $(BUILD)/umqtt.mpy \
+                                       $(BUILD)/sys_bus.mpy \
+                                       $(BUILD)/queue.mpy \
+                                       $(BUILD)/log.mpy \
+                                       $(BUILD)/request.mpy \
+                                       $(BUILD)/ql_fs.mpy \
+                                       $(BUILD)/app_fota_mount.mpy \
+                                       $(BUILD)/app_fota_download.mpy \
+                                       $(BUILD)/checksum.mpy \
+                                       $(BUILD)/file_crc32.mpy \
+                                       $(BUILD)/app_fota_updater.mpy \
+                                       $(BUILD)/app_fota.mpy \
+                                       $(BUILD)/backup_restore.mpy \
+                                       $(BUILD)/event_message.mpy \
+                                       $(BUILD)/ntptime.mpy \
+                                       $(BUILD)/checkNet.mpy \
+                                       $(BUILD)/uping.mpy \
+                                       $(BUILD)/ymodem.mpy \
+
+ifeq ($(strip $(BOARD)),$(filter $(strip $(BOARD)),BC25B8PA_LBS))
+       frozen_mpy_list +=      $(BUILD)/cellLocator.mpy 
+endif
+
+else ifeq ($(strip $(PLAT)),ASR_1803s)
+frozen_mpy_list =      $(BUILD)/_boot.mpy \
+                                       $(BUILD)/system.mpy \
+                                       $(BUILD)/checkNet.mpy \
+                                       $(BUILD)/ntptime.mpy \
+                                       $(BUILD)/dataCall.mpy \
+                                       $(BUILD)/log.mpy \
+                                       $(BUILD)/request.mpy \
+                                       $(BUILD)/umqtt.mpy \
+                                       $(BUILD)/ql_fs.mpy \
+                                       $(BUILD)/app_fota_mount.mpy \
+                                       $(BUILD)/app_fota_download.mpy \
+                                       $(BUILD)/checksum.mpy \
+                                       $(BUILD)/file_crc32.mpy \
+                                       $(BUILD)/app_fota_updater.mpy \
+                                       $(BUILD)/app_fota.mpy \
+                                       $(BUILD)/backup_restore.mpy \
+                                       $(BUILD)/queue.mpy \
+                                       $(BUILD)/sys_bus.mpy \
+                                       $(BUILD)/event_message.mpy \
+                                       $(BUILD)/bak_util.mpy \
+                                       $(BUILD)/cellLocator.mpy \
+                                       $(BUILD)/ftplib.mpy \
+                                       $(BUILD)/ftplibtls.mpy \
+                                       $(BUILD)/uwebsocket.mpy \
+                                       $(BUILD)/uping.mpy \
+                                       $(BUILD)/ymodem.mpy \
+
+else ifeq ($(strip $(PLAT)),Qualcomm)
+frozen_mpy_list =      $(BUILD)/_boot_Qualcomm.mpy \
+                                       $(BUILD)/system.mpy \
+                                       $(BUILD)/checkNet.mpy \
+                                       $(BUILD)/ntptime.mpy \
+                                       $(BUILD)/dataCall.mpy \
+                                       $(BUILD)/umqtt.mpy \
+                                       $(BUILD)/log.mpy \
+                                       $(BUILD)/request.mpy \
+                                       $(BUILD)/ql_fs.mpy \
+                                       $(BUILD)/app_fota_download.mpy \
+                                       $(BUILD)/checksum.mpy \
+                                       $(BUILD)/file_crc32.mpy \
+                                       $(BUILD)/app_fota_mount.mpy \
+                                       $(BUILD)/app_fota_updater.mpy \
+                                       $(BUILD)/app_fota.mpy \
+                                       $(BUILD)/backup_restore.mpy \
+                                       $(BUILD)/queue.mpy \
+                                       $(BUILD)/sys_bus.mpy \
+                                       $(BUILD)/event_message.mpy \
+                                       $(BUILD)/bak_util.mpy \
+                                       $(BUILD)/uwebsocket.mpy \
+                                       $(BUILD)/uping.mpy \
+                                       $(BUILD)/ymodem.mpy \
+
+else ifeq ($(strip $(PLAT)),ASR_1606)
+ifeq ($(strip $(BOARD)),$(filter $(strip $(BOARD)),EC600MCN_CC EC800MCN_CC EC600MCN_CC_EXT EC600MCN_LF_SLPOC))
+frozen_mpy_list =      $(BUILD)/_boot.mpy \
+                                       $(BUILD)/system.mpy \
+                                       $(BUILD)/dataCall.mpy \
+                                       $(BUILD)/umqtt.mpy \
+                                       $(BUILD)/queue.mpy \
+                                       $(BUILD)/log.mpy \
+                                       $(BUILD)/request.mpy \
+                                       $(BUILD)/ql_fs.mpy \
+                                       $(BUILD)/app_fota_mount.mpy \
+                                       $(BUILD)/app_fota_download.mpy \
+                                       $(BUILD)/checksum.mpy \
+                                       $(BUILD)/file_crc32.mpy \
+                                       $(BUILD)/app_fota_updater.mpy \
+                                       $(BUILD)/app_fota.mpy \
+                                       $(BUILD)/backup_restore.mpy \
+                                       $(BUILD)/ntptime.mpy \
+                                       $(BUILD)/checkNet.mpy \
+                                       $(BUILD)/ymodem.mpy
+
+else ifeq ($(strip $(BOARD)),$(filter $(strip $(BOARD)),EC600MCN_CC_EXT_TTS))
+frozen_mpy_list =      $(BUILD)/_boot.mpy \
+                                       $(BUILD)/dataCall.mpy \
+                                       $(BUILD)/file_crc32.mpy \
+                                       $(BUILD)/ntptime.mpy \
+                                       $(BUILD)/ymodem.mpy
+else
+frozen_mpy_list =      $(BUILD)/_boot.mpy \
+                                       $(BUILD)/umqtt.mpy \
+                                       $(BUILD)/ntptime.mpy \
+                                       $(BUILD)/request.mpy \
+                                       $(BUILD)/log.mpy \
+                                       $(BUILD)/aLiYun.mpy \
+                                       $(BUILD)/hmac.mpy \
+                                       $(BUILD)/hashlib.mpy \
+                                       $(BUILD)/base64.mpy \
+                                       $(BUILD)/TenCentYun.mpy \
+                                       $(BUILD)/file_sha256.mpy \
+                                       $(BUILD)/checksum.mpy \
+                                       $(BUILD)/checkNet.mpy \
+                                       $(BUILD)/dataCall.mpy \
+                                       $(BUILD)/ql_fs.mpy \
+                                       $(BUILD)/app_fota_mount.mpy \
+                                       $(BUILD)/app_fota_download.mpy\
+                                       $(BUILD)/app_fota_updater.mpy \
+                                       $(BUILD)/app_fota.mpy \
+                                       $(BUILD)/backup_restore.mpy \
+                                       $(BUILD)/file_crc32.mpy \
+                                       $(BUILD)/system.mpy \
+                                       $(BUILD)/gnss.mpy \
+                                       $(BUILD)/unzip.mpy \
+                                       $(BUILD)/queue.mpy \
+                                       $(BUILD)/sys_bus.mpy \
+                                       $(BUILD)/event_message.mpy \
+                                       $(BUILD)/hls.mpy \
+                                       $(BUILD)/wifilocator.mpy \
+                                       $(BUILD)/cellLocator.mpy \
+                                       $(BUILD)/bak_util.mpy \
+                                       $(BUILD)/uwebsocket.mpy \
+                                       $(BUILD)/uping.mpy \
+                                       $(BUILD)/ymodem.mpy \
+                                       $(BUILD)/common.mpy \
+                                       $(BUILD)/constants.mpy \
+                                       $(BUILD)/EventMesh.mpy \
+                                       $(BUILD)/mgr.mpy \
+                                       $(BUILD)/protocol.mpy \
+                                       $(BUILD)/ui.mpy \
+                                       $(BUILD)/main_init.mpy \
+                                       $(BUILD)/versions.mpy \
+                                       $(BUILD)/motor.mpy \
+                                       $(BUILD)/ai_VC.mpy \
+                                       $(BUILD)/ai_alarm.mpy \
+
+endif
+
+else ifeq ($(strip $(PLAT)),Unisoc_8850)
+ifeq ($(strip $(BOARD)),$(filter $(strip $(BOARD)),EC600GCN_LD EC600GCN_LD_YM EC800GCN_LD EC800GCN_LD_HRXM))
+frozen_mpy_list =      $(BUILD)/_boot.mpy \
+                                       $(BUILD)/umqtt.mpy \
+                                       $(BUILD)/ntptime.mpy \
+                                       $(BUILD)/request.mpy \
+                                       $(BUILD)/log.mpy \
+                                       $(BUILD)/checksum.mpy \
+                                       $(BUILD)/checkNet.mpy \
+                                       $(BUILD)/dataCall.mpy \
+                                       $(BUILD)/ql_fs.mpy \
+                                       $(BUILD)/app_fota_mount.mpy \
+                                       $(BUILD)/app_fota_download.mpy\
+                                       $(BUILD)/app_fota_updater.mpy \
+                                       $(BUILD)/app_fota.mpy \
+                                       $(BUILD)/backup_restore.mpy \
+                                       $(BUILD)/file_crc32.mpy \
+                                       $(BUILD)/system.mpy \
+                                       $(BUILD)/queue.mpy \
+                                       $(BUILD)/sys_bus.mpy \
+                                       $(BUILD)/event_message.mpy \
+                                       $(BUILD)/bak_util.mpy \
+                                       $(BUILD)/ymodem.mpy \
+                                       
+else
+frozen_mpy_list =      $(BUILD)/_boot.mpy \
+                                       $(BUILD)/umqtt.mpy \
+                                       $(BUILD)/ntptime.mpy \
+                                       $(BUILD)/request.mpy \
+                                       $(BUILD)/log.mpy \
+                                       $(BUILD)/aLiYun.mpy \
+                                       $(BUILD)/hmac.mpy \
+                                       $(BUILD)/hashlib.mpy \
+                                       $(BUILD)/base64.mpy \
+                                       $(BUILD)/TenCentYun.mpy \
+                                       $(BUILD)/file_sha256.mpy \
+                                       $(BUILD)/checksum.mpy \
+                                       $(BUILD)/checkNet.mpy \
+                                       $(BUILD)/dataCall.mpy \
+                                       $(BUILD)/ql_fs.mpy \
+                                       $(BUILD)/app_fota_mount.mpy \
+                                       $(BUILD)/app_fota_download.mpy\
+                                       $(BUILD)/app_fota_updater.mpy \
+                                       $(BUILD)/app_fota.mpy \
+                                       $(BUILD)/backup_restore.mpy \
+                                       $(BUILD)/file_crc32.mpy \
+                                       $(BUILD)/system.mpy \
+                                       $(BUILD)/gnss.mpy \
+                                       $(BUILD)/unzip.mpy \
+                                       $(BUILD)/queue.mpy \
+                                       $(BUILD)/sys_bus.mpy \
+                                       $(BUILD)/event_message.mpy \
+                                       $(BUILD)/hls.mpy \
+                                       $(BUILD)/wifilocator.mpy \
+                                       $(BUILD)/bak_util.mpy \
+                                       $(BUILD)/ftplib.mpy \
+                                       $(BUILD)/ftplibtls.mpy \
+                                       $(BUILD)/uwebsocket.mpy \
+                                       $(BUILD)/uping.mpy \
+                                       $(BUILD)/ymodem.mpy \
+                                       
+endif
+
+else ifeq ($(strip $(PLAT)),EIGEN)
+ifeq ($(strip $(BOARD)),$(filter $(strip $(BOARD)),EC800ECN_LC_WDF))
+frozen_mpy_list =      $(BUILD)/_boot_WDF.mpy \
+                                       $(BUILD)/umqtt.mpy \
+                                       $(BUILD)/dataCall.mpy \
+                                       $(BUILD)/log.mpy \
+                                       $(BUILD)/request.mpy \
+                                       $(BUILD)/aLiYun.mpy \
+                                       $(BUILD)/hmac.mpy \
+                                       $(BUILD)/hashlib.mpy \
+                                       $(BUILD)/ntptime.mpy \
+                                       $(BUILD)/checksum.mpy \
+                                       $(BUILD)/checkNet.mpy \
+                                       $(BUILD)/ql_fs.mpy \
+                                       $(BUILD)/app_fota_mount.mpy \
+                                       $(BUILD)/app_fota_download.mpy\
+                                       $(BUILD)/app_fota_updater.mpy \
+                                       $(BUILD)/app_fota.mpy \
+                                       $(BUILD)/backup_restore.mpy \
+                                       $(BUILD)/file_crc32.mpy \
+                                       $(BUILD)/system.mpy \
+                                       $(BUILD)/queue.mpy \
+                                       $(BUILD)/sys_bus.mpy \
+                                       $(BUILD)/event_message.mpy \
+                                       $(BUILD)/bak_util.mpy \
+                                       $(BUILD)/ftplib.mpy \
+                                       $(BUILD)/ftplibtls.mpy \
+                                       $(BUILD)/ymodem.mpy \
+
+else
+frozen_mpy_list =      $(BUILD)/_boot.mpy \
+                                       $(BUILD)/umqtt.mpy \
+                                       $(BUILD)/dataCall.mpy \
+                                       $(BUILD)/log.mpy \
+                                       $(BUILD)/request.mpy \
+                                       $(BUILD)/aLiYun.mpy \
+                                       $(BUILD)/hmac.mpy \
+                                       $(BUILD)/hashlib.mpy \
+                                       $(BUILD)/ntptime.mpy \
+                                       $(BUILD)/checksum.mpy \
+                                       $(BUILD)/checkNet.mpy \
+                                       $(BUILD)/ql_fs.mpy \
+                                       $(BUILD)/app_fota_mount.mpy \
+                                       $(BUILD)/app_fota_download.mpy\
+                                       $(BUILD)/app_fota_updater.mpy \
+                                       $(BUILD)/app_fota.mpy \
+                                       $(BUILD)/backup_restore.mpy \
+                                       $(BUILD)/file_crc32.mpy \
+                                       $(BUILD)/system.mpy \
+                                       $(BUILD)/queue.mpy \
+                                       $(BUILD)/sys_bus.mpy \
+                                       $(BUILD)/event_message.mpy \
+                                       $(BUILD)/bak_util.mpy \
+                                       $(BUILD)/ftplib.mpy \
+                                       $(BUILD)/ftplibtls.mpy \
+                                       $(BUILD)/cellLocator.mpy \
+                                       $(BUILD)/ymodem.mpy \
+                                       
+endif
+
+else ifeq ($(strip $(PLAT)),ECR6600)
+frozen_mpy_list =      $(BUILD)/_boot_WIFI.mpy \
+                                       $(BUILD)/umqtt.mpy \
+                                       $(BUILD)/request.mpy \
+                                       $(BUILD)/ql_fs.mpy \
+                                       $(BUILD)/queue.mpy \
+                                       $(BUILD)/sys_bus.mpy \
+
+else
+ifeq ($(strip $(BOARD)),$(filter $(strip $(BOARD)),EC600UEU_AB_POC))
+frozen_mpy_list =      $(BUILD)/_boot.mpy \
+                                       $(BUILD)/ntptime.mpy \
+                                       $(BUILD)/log.mpy \
+                                       $(BUILD)/file_sha256.mpy \
+                                       $(BUILD)/checksum.mpy \
+                                       $(BUILD)/checkNet.mpy \
+                                       $(BUILD)/dataCall.mpy \
+                                       $(BUILD)/ql_fs.mpy \
+                                       $(BUILD)/app_fota_mount.mpy \
+                                       $(BUILD)/app_fota_download.mpy\
+                                       $(BUILD)/app_fota_updater.mpy \
+                                       $(BUILD)/app_fota.mpy \
+                                       $(BUILD)/backup_restore.mpy \
+                                       $(BUILD)/file_crc32.mpy \
+                                       $(BUILD)/system.mpy \
+                                       $(BUILD)/queue.mpy \
+                                       $(BUILD)/bak_util.mpy \
+                                       $(BUILD)/ymodem.mpy 
+else
+frozen_mpy_list =      $(BUILD)/_boot.mpy \
+                                       $(BUILD)/umqtt.mpy \
+                                       $(BUILD)/ntptime.mpy \
+                                       $(BUILD)/request.mpy \
+                                       $(BUILD)/log.mpy \
+                                       $(BUILD)/aLiYun.mpy \
+                                       $(BUILD)/hmac.mpy \
+                                       $(BUILD)/hashlib.mpy \
+                                       $(BUILD)/base64.mpy \
+                                       $(BUILD)/TenCentYun.mpy \
+                                       $(BUILD)/file_sha256.mpy \
+                                       $(BUILD)/checksum.mpy \
+                                       $(BUILD)/checkNet.mpy \
+                                       $(BUILD)/dataCall.mpy \
+                                       $(BUILD)/ql_fs.mpy \
+                                       $(BUILD)/app_fota_mount.mpy \
+                                       $(BUILD)/app_fota_download.mpy\
+                                       $(BUILD)/app_fota_updater.mpy \
+                                       $(BUILD)/app_fota.mpy \
+                                       $(BUILD)/backup_restore.mpy \
+                                       $(BUILD)/file_crc32.mpy \
+                                       $(BUILD)/system.mpy \
+                                       $(BUILD)/gnss.mpy \
+                                       $(BUILD)/unzip.mpy \
+                                       $(BUILD)/queue.mpy \
+                                       $(BUILD)/sys_bus.mpy \
+                                       $(BUILD)/event_message.mpy \
+                                       $(BUILD)/hls.mpy \
+                                       $(BUILD)/wifilocator.mpy \
+                                       $(BUILD)/bak_util.mpy \
+                                       $(BUILD)/ftplib.mpy \
+                                       $(BUILD)/ftplibtls.mpy \
+                                       $(BUILD)/uwebsocket.mpy \
+                                       $(BUILD)/uping.mpy \
+                                       $(BUILD)/ymodem.mpy 
+endif
+endif
+
+$(BUILD)/_frozen_mpy.c: $(frozen_mpy_list) $(HEADER_BUILD)/qstrdefs.generated.h
+       @$(ECHO) "MISC freezing bytecode"
+       $(Q)$(MPY_TOOL) -f -q $(HEADER_BUILD)/qstrdefs.preprocessed.h $(frozen_mpy_list) > $@
+
+$(BUILD):
+       $(Q)echo creating directory: $@
+       -$(Q)$(MKDIR) $@
+
+all:$(BUILD) $(HEADER_BUILD)/qstrdefs.generated.h $(HEADER_BUILD)/moduledefs.h  $(HEADER_BUILD)/compressed.data.h $(BUILD)/_frozen_mpy.c
+
+clean:
+       @echo ----- cleaning microPython private target
+       @rm -rf $(HEADER_BUILD)
+       @rm -rf $(BUILD)
+       @echo ----- done.
diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/TTS音频生成.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/TTS音频生成.py
new file mode 100644 (file)
index 0000000..9c1eb2e
--- /dev/null
@@ -0,0 +1,124 @@
+
+import utime
+import audio
+from machine import Pin
+import osTimer
+import _thread
+from queue import Queue
+import uwebsocket
+import usys
+import EventMesh
+import constants
+import ujson
+
+
+import gc
+AI_audio_queue = Queue(100)
+aud = audio.Audio(0)
+aud.set_pa(Pin.GPIO29)
+
+def AI_client_tts_recv(cli,fd):
+
+    while True:
+        try:
+            # 死循环接收数据
+            
+            recv_data = cli.recv()
+            if not recv_data:
+                # 服务器关闭连接或客户端关闭连接
+                print("AI_client_tts_recv close!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")
+                print("AI_client_tts_recv close!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")
+                break
+            try:
+                # print("AI_client_tts_recv :{}".format(len(recv_data)))
+                #结束标志{"header":{"event":"EndSynthesis","msg":"success","status":20000000,"task_id":"ffd727e620000803280c5a6498d0e321"}}
+                if isinstance(recv_data, str):
+                    print("AI_client_tts_recv:str recv_data:{}".format(recv_data))
+                    if recv_data.find('\"event\":\"EndSynthesis\"') != -1:
+                        print("EndSynthesis!!!!!!!!!!!!!!!!!\r\n")
+                        print("EndSynthesis!!!!!!!!!!!!!!!!!!\r\n")
+                        cli.close()
+                        fd.close()
+                else:
+                    fd.write(recv_data)
+                    AI_audio_queue.put([recv_data,""])
+                #utime.sleep_ms(1000)
+            except Exception as e:
+                usys.print_exception(e)
+                
+        except Exception as e:
+                usys.print_exception(e)
+                break
+
+def websocket_connect_tts(fd_neme,tts_str):
+    print("websocket_connect_tts {},{}!!!!!!!!!".format(fd_neme,tts_str))
+    fd=open(fd_neme,'w')
+    try:
+       
+        AI_client_tts = uwebsocket.Client.connect('ws://118.145.158.207:80/tts/long-text-stream', debug=False)
+    except Exception as e: #网络连接异常
+        usys.print_exception(e)
+        print("websocket_connect_tts ERROR:{}\r\n".format(e))
+        
+    print("websocket_connect_tts:AI_client_tts {}\r\n".format(AI_client_tts))
+    # 线程接收数据
+
+    #_thread.stack_size(20*1024)
+    AI_client_tts_recv_id = _thread.start_new_thread(AI_client_tts_recv, (AI_client_tts,fd))
+    AI_audio_queue_thread_id = _thread.start_new_thread(AI_audio_queue_thread, ())
+    #_thread.stack_size(8*1024)
+    #AI_client_tts_send()
+#def AI_client_tts_send(data_str):
+    data_str = "该设备的流量可能已用完,请及时充值,您的卡号为:"
+    data_l = {}
+    data_l ={
+        "header": {
+            "event": "LongTextStream",
+            "trace_id": "5864123541"
+        },
+        "payload": {
+            "voice":"xiaoyun",#"xiaoyun",
+            "format":"mp3",
+            "sample_rate":8000,
+            "volume":100,
+            "speech_rate":2,
+            "text":"%s"%(tts_str)
+        }
+    }
+    json_data = ujson.dumps(data_l)
+    AI_client_tts.send(json_data)
+# 音频队列        
+def AI_audio_queue_thread():
+    while True:
+        try:
+            if AI_audio_queue.empty() :
+                # if count_t%200 == 0:
+                #     print("AI_send_data_queue.empty")
+                utime.sleep_ms(5)
+            else:
+                #print("AI_audio_queue_thread")
+
+                data = AI_audio_queue.get()
+                
+                #AI_client_tts_data_len=len(data)
+                print("audio_queue:len:{} \r\n".format(len(data[0]),data[1]))
+                if len(data[0]) > 1:
+                    try:
+
+                        tmp= aud.playStream(3, data[0])#播放音频流
+
+                        print("出:{}!!!".format(len(data[0])))
+                        mem = gc.mem_free()
+                        print('1剩余内存RAM:{} KB'.format(mem / 1024))
+                    except Exception as e:
+                        print("AI_audio_queue_thread:ERROR:")
+                        usys.print_exception(e)
+
+                    utime.sleep_ms(2)
+        except Exception as e:
+            print("AI_audio_queue_thread:ERROR:")
+            usys.print_exception(e)
+
+websocket_connect_tts("/usr/jianquancuowu.mp3","当前使用人数较多,请稍候重试")
+# for i in range(10):
+#     websocket_connect_tts("/usr/static/R_READ_TIME_{}.mp3".format(i),"{}".format(i))
\ No newline at end of file
diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/ai_VC.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/ai_VC.py
new file mode 100644 (file)
index 0000000..a60a2a7
--- /dev/null
@@ -0,0 +1,4231 @@
+from common import Abstract, LogAdapter
+import EventMesh
+import uwebsocket
+import usys
+import gc
+import urandom
+import uhashlib
+import ubinascii
+import ujson
+import osTimer
+import _thread
+from queue import Queue
+import utime
+import audio
+import uos
+from machine import Pin
+from machine import ExtInt
+from machine import WDT
+import modem
+import sim
+import net
+import base64
+import ucryptolib
+import urandom as random
+import request
+import ql_fs
+from misc import Power,USB,PowerKey
+import ntptime
+import machine
+import dataCall
+import constants
+import versions
+try:
+    import VAD
+except Exception as e:
+    usys.print_exception(e)
+try:   
+    import usr.ai_alarm as _ai_alarm
+except Exception as e:
+    usys.print_exception(e)
+    import ai_alarm as _ai_alarm
+#dev_type = "G10"
+dev_type = "7PIN_BK"#小瑞
+#dev_type = "7PIN_BK_coze"#k扣子小瑞
+#dev_type = "7PIN_BK_EU"#英文小瑞
+#dev_type = "7PIN_coze"#柒牌扣子
+#dev_type = "7PIN"#柒牌
+#dev_type = 'momo'#食梦貘
+#dev_type = 'sjgq'#四季甘泉
+#dev_type = 'szbst'#深圳百事通
+#dev_type = 'jswm'#金三完美
+#dev_type = 'jswm_BOX'#金三完美柒牌盒子
+#dev_type = 'csh'#慈善会
+class AI_led(Abstract):
+    def __init__(self):
+        if dev_type == "G10" or dev_type == 'jswm':
+            self.led_red = Pin(Pin.GPIO36, Pin.OUT, Pin.PULL_PD, 0)
+            self.led_green = Pin(Pin.GPIO44, Pin.OUT, Pin.PULL_PD, 1)
+            self.led_blue = Pin(Pin.GPIO21, Pin.OUT, Pin.PULL_PD, 1)
+        elif dev_type == "7PIN_BK_EU":
+            self.led_red = Pin(Pin.GPIO36, Pin.OUT, Pin.PULL_PD, 0)
+            #self.led_green = Pin(Pin.GPIO21, Pin.OUT, Pin.PULL_PD, 1)
+            self.led_green = Pin(Pin.GPIO8, Pin.OUT, Pin.PULL_PD, 1)
+            self.led_blue = Pin(Pin.GPIO19, Pin.OUT, Pin.PULL_PD, 1)
+        else:
+            self.led_red = Pin(Pin.GPIO36, Pin.OUT, Pin.PULL_PD, 0)
+            self.led_green = Pin(Pin.GPIO21, Pin.OUT, Pin.PULL_PD, 1)
+            self.led_blue = Pin(Pin.GPIO19, Pin.OUT, Pin.PULL_PD, 1)
+
+        #=1 红灯闪,=2白灯闪,=3绿灯闪,=4全部灯闪
+        self.led_flicker_flag = 0
+        self.led_flicker_on_off_flag = 0
+        self.led_flicker_timer = osTimer()
+        
+        EventMesh.subscribe("open_led_red",self.open_led_red)
+        EventMesh.subscribe("open_led_blue",self.open_led_blue)
+        EventMesh.subscribe("open_led_green",self.open_led_green)
+        EventMesh.subscribe("open_led_all",self.open_led_all)
+        EventMesh.subscribe("open_led_red_blue",self.open_led_red_blue)
+        EventMesh.subscribe("open_led_red_green",self.open_led_red_green)
+        EventMesh.subscribe("flicker_led_red",self.flicker_led_red)
+        EventMesh.subscribe("flicker_led_blue",self.flicker_led_blue)
+        EventMesh.subscribe("flicker_led_green",self.flicker_led_green)
+        EventMesh.subscribe("flicker_led_all",self.flicker_led_all)
+        EventMesh.subscribe("close_led",self.close_led)
+        EventMesh.publish("open_led_red")
+
+    def flicker_led_red(self,event,msg):
+        self.led_flicker_flag = 1
+        self.led_flicker_timer.start(1500, 1, self.led_flicker_timer_cb)
+
+    def flicker_led_blue(self,event,msg):
+        self.led_flicker_flag = 2
+        self.led_flicker_timer.start(1500, 1, self.led_flicker_timer_cb)
+
+    def flicker_led_green(self,event,msg):
+        self.led_flicker_flag = 3
+        self.led_flicker_timer.start(1500, 1, self.led_flicker_timer_cb)
+
+    def flicker_led_all(self,event,msg):
+        self.led_flicker_flag = 4
+        self.led_flicker_timer.start(1500, 1, self.led_flicker_timer_cb)
+
+    def led_flicker_timer_cb(self, *args, **kwargs):
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.led_flicker_timer_cb_})  
+    def led_flicker_timer_cb_(self):
+        if self.led_flicker_flag == 0:
+            self.led_flicker_timer.stop()
+            return
+        if self.led_flicker_on_off_flag == 0:
+            self.led_red.write(0)
+            self.led_blue.write(0)
+            self.led_green.write(0)
+            self.led_flicker_on_off_flag = 1
+        else:
+            self.led_flicker_on_off_flag = 0
+            if self.led_flicker_flag == 1:
+                self.led_blue.write(0)
+                self.led_green.write(0)
+                self.led_red.write(1)
+            elif self.led_flicker_flag == 2:
+                self.led_red.write(0)
+                self.led_green.write(0)
+                self.led_blue.write(1)
+            elif self.led_flicker_flag == 3:
+                self.led_red.write(0)
+                self.led_blue.write(0)
+                self.led_green.write(1)
+            elif self.led_flicker_flag == 4:
+                self.led_blue.write(1)
+                self.led_green.write(1)
+                self.led_red.write(1)
+
+    def open_led_red(self,event,msg):
+        #print("open_led_red")
+        self.led_flicker_flag = 0
+        #self.led_red.write(0)
+        self.led_blue.write(0)
+        self.led_green.write(0)
+        self.led_red.write(1)
+
+    def open_led_blue(self,event,msg):
+        #print("open_led_blue")
+        self.led_flicker_flag = 0
+        self.led_red.write(0)
+        #self.led_blue.write(0)
+        self.led_green.write(0)
+        self.led_blue.write(1)
+
+    def open_led_green(self,event,msg):
+        #print("open_led_green")
+        self.led_flicker_flag = 0
+        self.led_red.write(0)
+        self.led_blue.write(0)
+        #self.led_green.write(0)
+        self.led_green.write(1)
+
+    def open_led_red_blue(self,event,msg):
+        #print("open_led_blue")
+        self.led_flicker_flag = 0
+        self.led_red.write(1)
+        #self.led_blue.write(0)
+        self.led_green.write(0)
+        self.led_blue.write(1)
+
+    def open_led_red_green(self,event,msg):
+        #print("open_led_blue")
+        self.led_flicker_flag = 0
+        self.led_red.write(1)
+        #self.led_blue.write(0)
+        self.led_green.write(1)
+        self.led_blue.write(0)
+
+    def open_led_all(self,event,msg):
+        #print("open_led_all")
+        self.led_flicker_flag = 0
+        #self.led_red.write(0)
+        self.led_blue.write(1)
+        self.led_green.write(1)
+        self.led_red.write(1)
+
+    def close_led(self,event,msg):
+        #print("close_led")
+        self.led_flicker_flag = 0
+        self.led_red.write(0)
+        self.led_blue.write(0)
+        self.led_green.write(0)
+def set_ipv4_datacall():
+       # 获取第一路的APN,ipType 等信息
+       pdpCtx = dataCall.getPDPContext(1)
+       if pdpCtx != -1:
+               if pdpCtx[0] != 0:
+                       # 如果不是用户需要的ipv4,使用如下方式配置,使用如下方式配置
+                       ret = dataCall.setPDPContext(1, 0,pdpCtx[1],pdpCtx[2],pdpCtx[3],pdpCtx[4])
+                       if ret == 0:
+                               print('配置成功。')
+                               # cfun0/1后按照配置的信息进行拨号
+                               net.setModemFun(0)
+                               net.setModemFun(1)
+                       else:
+                               print('配置失败。')
+               else:
+                       print('已经配置为IPv4')
+       else:
+               print('获取PDP Context失败。')
+audio_buf = ['chaobingfatis', 'chenggong', 'didianguanji', 'IMEIhao', 'jianquancuowu', 'key_prompt', 'liuliangtishi', 'Low_power_warning', 'R_CHARGE_FULL', 'R_CHARGE_IN', 'R_CHARGE_OUT', 'R_READ_TIME_0', 'R_READ_TIME_1', 'R_READ_TIME_2', 'R_READ_TIME_3', 'R_READ_TIME_4', 'R_READ_TIME_5', 'R_READ_TIME_6', 'R_READ_TIME_7', 'R_READ_TIME_8', 'R_READ_TIME_9', 'R_READ_TIME_A', 'R_READ_TIME_B', 'R_READ_TIME_C', 'R_READ_TIME_D', 'R_READ_TIME_E', 'R_READ_TIME_F', 'R_READ_TIME_G', 'R_READ_TIME_H', 'R_READ_TIME_I', 'R_READ_TIME_J', 'R_READ_TIME_K', 'R_READ_TIME_L', 'R_READ_TIME_M', 'R_READ_TIME_N', 'R_READ_TIME_O', 'R_READ_TIME_P', 'R_READ_TIME_Q', 'R_READ_TIME_R', 'R_READ_TIME_S', 'R_READ_TIME_T', 'R_READ_TIME_U', 'R_READ_TIME_V', 'R_READ_TIME_W', 'R_READ_TIME_X', 'R_READ_TIME_Y', 'R_READ_TIME_Z', 'send_tone', 'shouhou', 'xinhaoruo1', 'zhengzaiguanji']
+class AI_dev(Abstract):
+    # AI
+    def __init__(self):
+        # if(dev_type != "7PIN"):
+        #     set_ipv4_datacall()
+        self.is_wdt = 0 #是否开启看门狗
+        #AT+QDAI=1,0,0,1,0,0,1,1PCM音频输出设置为主模式、短同步、16 kHz采样率和256 kHz时钟频率,采样位深为16bit,使用的时间间隙数量为1,并且使用第一个时间间隙。
+        audio.set_qdai_cfg(1,0,0,2,0,1,1,1)
+        self.VBATT_tab = {"charge_full":4300,"100" :4250 ,  "90":4179 , "80":4070, "60": 3883, "40":3770, "20":3699,  "10":3652,"5":3600,}
+        self.KeyAI_status = 0
+        self.KeyAI_timer_count = 0
+        self.KeyAI_long_press = 0
+        self.KeyAI_press = 0
+        if self.is_wdt == 1:
+            self.wdt = WDT(30) #开启看门狗
+        # self.wdt_timer = osTimer()
+        # self.wdt_timer.start(5000, 1, self.wdt_timer_cb)
+        count = 0
+        while True:
+            count += 1
+            if count > 20 :
+                break
+            data = dataCall.getInfo(1, 0)
+            print("data call INFO {}".format(data))
+            if data[2][0]:
+                self.network_state = 1
+                break
+            print("等待网络 {}...".format(count))
+            utime.sleep_ms(500)
+        self.KeyAI_timer = osTimer()
+        if dev_type == "G10" :
+            self.extint_AI = ExtInt(ExtInt.GPIO19,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)
+            self.pwk_key = ExtInt(ExtInt.GPIO26, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.pwk_extint_cb)
+        elif dev_type == 'jswm':
+            self.extint_AI = ExtInt(ExtInt.GPIO26,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)
+            self.pwk_key = ExtInt(ExtInt.GPIO19, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.pwk_extint_cb)
+        elif dev_type == "7PIN_BK_EU":
+            self.pwk_key = ExtInt(ExtInt.GPIO41, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.pwk_extint_cb)
+            self.extint_AI = ExtInt(ExtInt.GPIO5,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)
+        else:
+            self.pwk_key = ExtInt(ExtInt.GPIO41, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.pwk_extint_cb)
+            #self.extint_AI = ExtInt(ExtInt.GPIO19,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)
+            self.extint_AI = ExtInt(ExtInt.GPIO22,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)
+        self.extint_AI.enable()
+        self.pwk_key_status = 0
+        self.pwk_key_timer_count = 0
+        self.pwk_key_long_press = 0
+        self.pwk_key_press = 0
+        self.pwk_key_timer = osTimer()
+        #self.pwk_key = ExtInt(ExtInt.GPIO26, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_DISABLE, self.pwk_extint_cb)
+        
+        self.pwk_key.enable() 
+        print("AI_dev:1")
+        self.btnInfo_queue = Queue(100)
+        self.btnInfo_queue_count = 0
+        _thread.stack_size(16*1024)
+        self.btnInfo_queue_thread_id = _thread.start_new_thread(self.btnInfo_queue_thread, ())
+        _thread.stack_size(8*1024)
+        EventMesh.subscribe("publish_AI_btnInfo",self.publish_AI_btnInfo)
+        EventMesh.subscribe("get_battery",self.get_battery)
+        EventMesh.subscribe("audio_montage_play",self.audio_montage_play)
+        EventMesh.subscribe("paly_iccid_imei",self.paly_iccid_imei)
+        EventMesh.subscribe("paly_device_res_error",self.paly_device_res_error)
+        EventMesh.subscribe("Power_off",self.pwk_key_Long_Press)
+        
+        print("AI_dev:2")
+        self.pk = PowerKey()
+        self.pk.powerKeyEventRegister(self.powerKey_callback)
+        self.usb = USB()
+        self.usb.setCallback(self.usb_event_cb)
+        self.usb_status = self.usb.getStatus()
+        self.usb_charge_flag = 0 
+        self.Low_power_warning_timer = 0
+        self.AI_dev_timer = osTimer()
+        self.AI_dev_timer.start(10000, 1, self.AI_dev_timer_cb)
+        print("AI_dev:AI_dev_timer")
+        self.aud = audio.Audio(0)
+        self.Low_power_warning_flag = 0
+        self.VC_TTS_volume =  EventMesh.publish("get_storage_config","VC_TTS_volume")#音量配置
+        if self.VC_TTS_volume == None:
+            self.VC_TTS_volume = 100
+        self.aud.setVolume(self.VC_TTS_volume //10)
+        #self.aud.play(1,0,'U:/static/xianyikaiji.mp3')#开机音频
+        #EventMesh.publish("audio_montage_play",["xianyikaiji.mp3"])
+        #EventMesh.publish("publish_AI_btnInfo",{"func":self.ntptime_cb})
+        self.check_rest_timer_count = 0
+        print("AI_dev:end")
+    def ntptime_cb(self):
+        #ntptime.settime(8)
+        print("timer:{}!!!!!!!!\r\n".format(utime.localtime()))
+    def usb_event_cb(self, state):
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.usb_event,"data":state})
+
+    def usb_event(self, state):    
+        status = state
+        self.usb_charge_flag = 0
+        if status == 1:#插入USB
+            print("charge R_CHARGE_in")
+            self.usb_status = 1
+            VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")#获取vc是否在运行
+            if VC_satrt_flag == None:
+                VC_satrt_flag = 0
+            if VC_satrt_flag == 0:
+                self.aud.stop()
+                #EventMesh.publish("flicker_led_red")#充电闪灯
+                #self.aud.play(1,1,'U:/static/R_CHARGE_IN.mp3')
+                EventMesh.publish("open_led_red")#充电红灯常亮
+                EventMesh.publish("audio_montage_play",["R_CHARGE_IN.mp3"])
+            self.Low_power_warning_flag  = 0
+            pass
+        elif status == 0:#拨出usbs
+            self.usb_status = 0
+            VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")#获取vc是否在运行
+            if VC_satrt_flag == None:
+                VC_satrt_flag = 0
+            if VC_satrt_flag == 0:
+                self.aud.stop()
+                EventMesh.publish("close_led")
+                EventMesh.publish("audio_montage_play",["R_CHARGE_OUT.mp3"])
+                #self.aud.play(1,1,'U:/static/R_CHARGE_OUT.mp3')
+    def btnInfo_queue_thread(self):
+        while True:
+            data = self.btnInfo_queue.get()
+            self.btnInfo_queue_count-=1
+            #EventMesh.debug_log("Info_queue:data = {}".format(data))
+            if data != None:
+                try:
+                    if "data" in data :
+                        data["func"](data["data"])
+                    else :
+                        data["func"]()
+                except Exception as e:
+                    #EventMesh.debug_log("btnInfo_queue:ERROR:{}".format(e))
+                    if "data" in data :
+                        print(data["data"])
+                    usys.print_exception(e)
+    def publish_AI_btnInfo(self,event,msg):
+        #print("publish_AI_btnInfo 1")
+        self.btnInfo_queue.put(msg)
+        self.btnInfo_queue_count+=1
+        if self.btnInfo_queue_count > 80:
+            self.btnInfo_queue_count =0
+            print("事件处理线程队列出问题,重启!!!!!!!!!!!!!!")
+            print("线程:{} 队列:{}".format(_thread.threadIsRunning(self.btnInfo_queue_thread_id),self.btnInfo_queue.size()))
+            # if _thread.threadIsRunning(self.btnInfo_queue_thread_id):
+            #     _thread.stop_thread(self.btnInfo_queue_thread_id)
+            # _thread.stack_size(10*1024)
+            # self.btnInfo_queue_thread_id = _thread.start_new_thread(self.btnInfo_queue_thread, ())
+            # _thread.stack_size(8*1024)
+            # self.btnInfo_queue.clear()
+            # self.btnInfo_queue = Queue(100)
+            EventMesh.publish("VC_error") #播放报错
+            utime.sleep_ms(1000)
+            self.aud.stopPlayStream()
+            self.aud.stopAll()
+            Power.powerRestart()
+            EventMesh.publish("set_storage_config",["powerRestart",1])
+        #print("publish_AI_btnInfo 2")
+    def powerKey_callback(self, status):
+        print("powerKey_callback:{}".format(status))
+
+    def pwk_extint_cb(self,args):#pwk
+        try:
+            self.pwk_key_status = int(args[1])
+            if self.pwk_key_status == 0:
+                self.pwk_key_status = 1
+            else:
+                self.pwk_key_status = 0
+                pass
+            if self.pwk_key_status == 0:#按下
+                
+                if self.pwk_key_press == 0 :
+                    self.pwk_key.disable()
+                    self.pwk_key_press = 1
+                    self.pwk_key_long_press = 0
+                    self.pwk_key_timer.start(100, 1, self.pwk_key_timer_cb)
+                    self.pwk_key_timer_count = 0
+                    #EventMesh.publish("AI_key_press")
+        except Exception as e: 
+            usys.print_exception(e)
+    def pwk_key_timer_cb(self, *args, **kwargs):
+    #     EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_timer_cb_})
+    # def pwk_key_timer_cb_(self) :
+        try:
+            self.pwk_key_status = self.pwk_key.read_level()
+            self.pwk_key_timer_count +=1
+            if self.pwk_key_timer_count >= 10*3: #长按3s 
+                #print("pwk_key_long_press {}".format(self.pwk_key_long_press))
+                if self.pwk_key_long_press == 0:
+                        self.pwk_key_long_press = 1
+                        #EventMesh.publish("AI_key_long_press")
+                        EventMesh.publish("audio_montage_play",["zhengzaiguanji.mp3"])
+                        #self.aud.play(1,0,'U:/static/zhengzaiguanji.mp3')#关机音频
+                        EventMesh.publish("open_led_red")
+                        utime.sleep_ms(2000)
+                        self.aud.stopPlayStream()
+                        self.aud.stopAll()
+                        Power.powerDown()
+                        #print("AI_key_release")
+                        #EventMesh.publish("pwk_key_long_press")
+                        #EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_Long_Press})  
+            if self.pwk_key_status == 1:#松开
+                #print("pwk_key_timer_cb:{}".format(self.pwk_key_timer_count))
+                key_count = 5
+                if dev_type == "7PIN_BK" or dev_type == "7PIN_BK_EU"or dev_type == "7PIN_BK_coze":
+                    key_count = 3
+                if self.pwk_key_timer_count >= key_count: #防抖200ms
+                    #EventMesh.publish("AI_key_release")
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_release})
+                    self.pwk_key.enable()
+                    self.pwk_key_timer.stop()
+                    self.pwk_key_timer_count = 0
+                    self.pwk_key_press = 0
+            
+        except Exception as e: 
+            usys.print_exception(e) 
+            
+    def keyAI_extint_cb(self,args):#call 2
+        try:
+            #print("AI_btn:keyAI_extint_cb{}".format(args[1]))
+            self.KeyAI_status = int(args[1])
+            if self.KeyAI_status == 0:
+                self.KeyAI_status = 1
+            else:
+                self.KeyAI_status = 0
+            
+            if self.KeyAI_status == 0:#按下
+                if self.KeyAI_press == 0 :
+                    EventMesh.publish(constants.EVENT.SYSTEM_UP)#唤醒休眠
+                    self.extint_AI.disable()
+                    self.KeyAI_press = 1
+                    self.KeyAI_long_press = 0
+                    self.KeyAI_timer.start(100, 1, self.KeyAI_timer_cb)
+                    self.KeyAI_timer_count = 0
+                    #EventMesh.publish("AI_key_press")
+                    if dev_type == "7PIN" or dev_type == "7PIN_coze" :
+                        self.aud.aud_tone_play(10,200)#播放按键音
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_press})  
+        except Exception as e: 
+            usys.print_exception(e)
+    def KeyAI_timer_cb(self, *args, **kwargs):
+    #     EventMesh.publish("publish_AI_btnInfo",{"func":self.KeyAI_timer_cb_})
+    # def KeyAI_timer_cb_(self):
+        try:
+            self.KeyAI_status = self.extint_AI.read_level()
+            self.KeyAI_timer_count +=1
+            if self.KeyAI_timer_count >= 10*1 : #长按1s 
+                if self.KeyAI_long_press == 0:
+                    self.KeyAI_long_press = 1
+                    #EventMesh.publish("AI_key_long_press")
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_long_press})  
+            elif self.KeyAI_timer_count >= 10*8:#关机
+                if dev_type == 'jswm' or dev_type == 'jswm_BOX':
+                    EventMesh.publish("audio_montage_play",["zhengzaiguanji.mp3"])
+                    #self.aud.play(1,0,'U:/static/zhengzaiguanji.mp3')#关机音频
+                    EventMesh.publish("open_led_red")
+                    utime.sleep_ms(2000)
+                    self.aud.stopPlayStream()
+                    self.aud.stopAll()
+                    Power.powerDown()
+            if self.KeyAI_status == 1:#松开
+                #print("KeyAI_timer_cb:{}".format(self.KeyAI_timer_count))
+                key_count = 5
+                if dev_type == "7PIN_BK"or dev_type == "7PIN_BK_EU"or dev_type == "7PIN_BK_coze":
+                    key_count = 3
+                if self.KeyAI_timer_count >= key_count: #防抖200ms
+                    #EventMesh.publish("AI_key_release")
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_release})  
+                    self.extint_AI.enable()
+                    self.KeyAI_timer.stop()
+                    self.KeyAI_timer_count = 0
+                    self.KeyAI_press = 0
+            
+        except Exception as e: 
+            usys.print_exception(e) 
+       
+    def AI_key_press(self):
+        self.check_rest_timer_count = 0
+        print("AI_key_press")
+        EventMesh.publish("AI_key_press")
+
+    def AI_key_long_press(self):
+        self.check_rest_timer_count = 0
+        print("AI_key_long_press")
+        EventMesh.publish("AI_key_long_press")
+        
+    def AI_key_release(self):
+        print("AI_key_release")
+        EventMesh.publish("AI_key_release")
+        
+    def pwk_key_Long_Press(self,event=None,msg=None):
+        self.check_rest_timer_count = 0
+        print("pwk_key_long_press!!!!!!!")
+        print("pwk_key_long_press!!!!!!!")
+        
+        # EventMesh.publish("paly_iccid_imei")
+        # return
+        EventMesh.publish("audio_montage_play",["zhengzaiguanji.mp3"])
+        #self.aud.play(1,0,'U:/static/zhengzaiguanji.mp3')#关机音频
+        EventMesh.publish("open_led_red")
+        utime.sleep_ms(3000)
+        self.aud.stopPlayStream()
+        self.aud.stopAll()
+        Power.powerDown()
+        #print("AI_key_release")
+        #EventMesh.publish("pwk_key_long_press")
+        
+    def pwk_key_release(self):
+        self.check_rest_timer_count = 0
+        #print("pwk_key_release")
+        EventMesh.publish("pwk_key_release")
+
+    
+    def wdt_timer_cb(self, *args, **kwargs):
+        if self.is_wdt == 1:
+            self.wdt.feed()
+
+    def AI_dev_timer_cb(self, *args, **kwargs):
+        #print("AI_dev_timer_cb")
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_dev_timer_event})  
+    def AI_dev_timer_event(self):
+        #EventMesh.publish("audio_montage_play",["liuliangtishi.mp3"])
+        if self.is_wdt == 1:
+            self.wdt.feed()
+        VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")#获取vc是否在运行
+        if VC_satrt_flag == None:
+            VC_satrt_flag = 0
+        Vbatt = Power.getVbatt()
+        if self.usb_status == 1 and VC_satrt_flag == 0:
+            EventMesh.publish("open_led_red")#充电红灯常亮
+        if  self.usb_status == 1 and Vbatt>=self.VBATT_tab["charge_full"]and VC_satrt_flag == 0:#充电充满
+            EventMesh.publish("open_led_green")
+            if self.usb_charge_flag == 0 :
+                EventMesh.publish("audio_montage_play",["R_CHARGE_FULL.mp3"])
+                #self.aud.play(1,0,'U:/static/R_CHARGE_FULL.mp3')#充电已满
+                self.usb_charge_flag = 1
+        if  self.usb_status == 0 and Vbatt<self.VBATT_tab["20"]and VC_satrt_flag == 0 and self.Low_power_warning_flag ==0:#低电报警
+            self.Low_power_warning_flag  = 1
+            EventMesh.publish("flicker_led_red")
+            #self.aud.play(1,0,'Low_power_warning.mp3')
+            # self.Low_power_warning_timer+=1
+            # if self.Low_power_warning_timer >= 2:
+            #     self.Low_power_warning_timer = 0
+            EventMesh.publish("audio_montage_play",["Low_power_warning.mp3"])
+        if  self.usb_status == 0 and Vbatt>=self.VBATT_tab["20"]and VC_satrt_flag == 0:#没有充电,电量又正常,关灯
+            EventMesh.publish("close_led")
+
+        if  self.usb_status == 0 and Vbatt<self.VBATT_tab["5"]:    
+            EventMesh.publish("audio_montage_play",["didianguanji.mp3"])
+            utime.sleep_ms(4500)
+            self.aud.stopPlayStream()
+            self.aud.stopAll()
+            Power.powerDown()
+
+        self.check_rest_timer_count += 1
+        if self.check_rest_timer_count >= 8640:#24小时没按键,则关机
+            self.pwk_key_Long_Press()
+        
+    def get_battery(self, event=None, msg=None):
+        Vbatt = Power.getVbatt()
+        if Vbatt>self.VBATT_tab["90"]:
+            return 100
+        if Vbatt>self.VBATT_tab["80"]:
+            return 90
+        if Vbatt>self.VBATT_tab["60"]:
+            return 80
+        if Vbatt>self.VBATT_tab["40"]:
+            return 60
+        if Vbatt>self.VBATT_tab["20"]:
+            return 40
+        if Vbatt>self.VBATT_tab["10"]:
+            return 20
+        if Vbatt<=self.VBATT_tab["10"]:
+            return 10
+    def audio_montage_play(self,event,msg):
+        self.aud.stopPlayStream()
+        self.aud.stopAll()
+        str_data='mp3files='
+        for i in msg:
+            try:
+                str_tmp = i.replace(".mp3","")
+                str_data+="{}.mp3+".format(audio_buf.index(str_tmp))
+            except Exception as e:
+                    usys.print_exception(e)    
+        str_data = str_data[:-1]
+        print("audio_montage_play:{}".format(str_data))
+        self.aud.montage_play('U:/static/audio.bin',1,1,str_data)
+        
+    def paly_iccid_imei(self,event,msg):
+        str_data = 'mp3files={}.mp3+'.format(audio_buf.index("liuliangtishi"))#流量提示
+        imei  = modem.getDevImei()
+        iccid = sim.getIccid()
+        print("paly_iccid_imei:ICCID:{}".format(iccid))
+        if iccid != -1 and len(iccid) > 5:
+            iccid = iccid.upper()
+            if len(iccid) <20:
+                for i in range(20-len(iccid)):
+                    iccid = "0"+iccid
+            str_data += '{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+'.format(audio_buf.index("R_READ_TIME_{}".format(iccid[0]))\
+                ,audio_buf.index("R_READ_TIME_{}".format(iccid[1])),audio_buf.index("R_READ_TIME_{}".format(iccid[2])),audio_buf.index("R_READ_TIME_{}".format(iccid[3])),\
+                audio_buf.index("R_READ_TIME_{}".format(iccid[4])),audio_buf.index("R_READ_TIME_{}".format(iccid[5])),audio_buf.index("R_READ_TIME_{}".format(iccid[6])),audio_buf.index("R_READ_TIME_{}".format(iccid[7])),\
+                audio_buf.index("R_READ_TIME_{}".format(iccid[8])),audio_buf.index("R_READ_TIME_{}".format(iccid[9])),audio_buf.index("R_READ_TIME_{}".format(iccid[10])),audio_buf.index("R_READ_TIME_{}".format(iccid[11])),\
+                audio_buf.index("R_READ_TIME_{}".format(iccid[12])),audio_buf.index("R_READ_TIME_{}".format(iccid[13])),audio_buf.index("R_READ_TIME_{}".format(iccid[14])),audio_buf.index("R_READ_TIME_{}".format(iccid[15])),\
+                audio_buf.index("R_READ_TIME_{}".format(iccid[16])),audio_buf.index("R_READ_TIME_{}".format(iccid[17])),audio_buf.index("R_READ_TIME_{}".format(iccid[18])),audio_buf.index("R_READ_TIME_{}".format(iccid[19])))
+        str_data += '{}.mp3+'.format(audio_buf.index("shouhou"))#可联系售后解决,联系方式见售后客服电话是400-886-8777或到微信公众号柒牌SEVENBRAND自行充值:
+        self.aud.montage_play('U:/static/audio.bin',1,1,str_data)
+    #鉴权出错,播放imei号
+    def paly_device_res_error(self,event,msg):
+        str_data = 'mp3files={}.mp3+'.format(audio_buf.index("jianquancuowu"))#AI功能异常,请联系客户查询,设备号为:
+        imei  = modem.getDevImei()
+        imei = imei.upper()
+        str_data += '{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(imei[0]))\
+                ,audio_buf.index("R_READ_TIME_{}".format(imei[1])),audio_buf.index("R_READ_TIME_{}".format(imei[2])),audio_buf.index("R_READ_TIME_{}".format(imei[3])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[4])),audio_buf.index("R_READ_TIME_{}".format(imei[5])),audio_buf.index("R_READ_TIME_{}".format(imei[6])),audio_buf.index("R_READ_TIME_{}".format(imei[7])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[8])),audio_buf.index("R_READ_TIME_{}".format(imei[9])),audio_buf.index("R_READ_TIME_{}".format(imei[10])),audio_buf.index("R_READ_TIME_{}".format(imei[11])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[12])),audio_buf.index("R_READ_TIME_{}".format(imei[13])),audio_buf.index("R_READ_TIME_{}".format(imei[14])))
+        #print("str_data:{}".format(str_data))
+        self.aud.montage_play('U:/static/audio.bin',1,1,str_data)
+
+#存储信息
+class getStorageDataManager(Abstract):#获取内存数据
+        def __init__(self):
+            self.config_data = {}
+            check = ql_fs.path_exists("/usr/static/storage_file/config.json")
+            if check == True:
+                with open("/usr/static/storage_file/config.json","r") as fd:
+                    self.config_data = ujson.load(fd)
+            else :
+                self.config_data = {'old_time': 0, 'flip_sw': 0}
+                pass
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_storage_data", self.set_storage_data)
+            EventMesh.subscribe("set_storage_config", self.set_storage_config)
+            EventMesh.subscribe("get_storage_data", self.get_storage_data)
+            EventMesh.subscribe("get_storage_config", self.get_storage_config)
+
+        def set_storage_data(self, event, msg): 
+            # EventMesh.debug_log("set_storage_data:{}".format(msg))
+            if msg != None:
+                self.config_data = msg
+                with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:
+                    ujson.dump(self.config_data,fd)
+        
+
+        def set_storage_config(self,event,msg): 
+            # EventMesh.debug_log("set_storage_key_data1:{}".format(msg))
+            if len(msg) >= 2:
+                self.config_data[msg[0]]=msg[1]
+                # EventMesh.debug_log("set_storage_key_data2:{}".format(self.config_data[msg[0]]))
+                EventMesh.publish("publish_message_event_ui",{"func":self.set_storage_save,"data":0})
+        def set_storage_save(self, data): 
+            with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:
+                ujson.dump(self.config_data,fd)
+        def get_storage_data(self, event, msg): 
+            # EventMesh.debug_log("get_storage_data:{}".format(self.config_data))
+            return self.config_data 
+        def get_storage_config(self,event,msg):
+            # EventMesh.debug_log("get_storage_key_data1:{}".format(msg))
+            b = msg in self.config_data.keys()
+            if b == True:
+                # EventMesh.debug_log("get_storage_key_data2:{}".format(self.config_data[msg]))
+                return self.config_data[msg]
+            else :
+                return None
+            # try:
+            #     return self.config_data[msg]
+            # except:
+            #     EventMesh.debug_log("get_storage_key_data:none key:{}",msg)
+            #     return None
+#设备资源授权平台
+class device_res_author(Abstract):
+   
+    def __init__(self) :
+        print("device_res_author __init__ start !!!!!!!!!!!!!!!!!")
+        self.deviceId = modem.getDevImei()#"876226002022574"
+        self.SHA1_BLOCK_SIZE = 64
+        self.PAD_BLOCK_SIZE = 16
+        self.SHA256 = uhashlib.sha256
+        self.pad = lambda s: s + chr(self.PAD_BLOCK_SIZE - len(s) % self.PAD_BLOCK_SIZE) * (self.PAD_BLOCK_SIZE - len(s) % self.PAD_BLOCK_SIZE)
+        # 除去补16字节的多余字符
+        self.unpad = lambda s: s[:-s[-1]]
+        #K01
+        # self.key = b"MWrMZjdtcPhj41jWuoqFAhTmqyFluqj1" 
+        # self.pid = "qAtdDOGXgXYjT2HGFr3a"
+        #G15
+        # self.key = b"3LWfBicxfRZ3ZAqmZCFuvMdGUXdAFWkb" 
+        # self.pid = "qLx4Pu4mSUQxyfVKGLXG"
+        #7pin
+        self.key = b"uKLrChwrxA1LklgBc3VwawYjUkbT3BgX" 
+        self.pid = "cqxJZi5CNgzjS3mX21Zw"
+        # if dev_type == 'jswm' or dev_type == 'jswm_BOX':#金三完美
+        #     self.key = b"FuXG4ptpGbzvKbdB4vpUypisbENgy2nB" 
+        #     self.pid = "DieBeXahZHLrjSnORbgN"
+        self.dev_res_timer = osTimer()
+        self.dev_res_timer.start(20000, 1, self.dev_timer_cb)
+        self.dev_res_timerCount = 0
+        self.ud_token_timer = osTimer()
+        self.ud_token_timer.start(10000, 1, self.ud_token_timer_cb)
+        self.ud_token_timer_Count = 0
+        self.dev_token = None
+        self.res_error_count = 0
+        self.ntptime_flag = 0
+        EventMesh.subscribe("get_dev_token", self.get_dev_token)
+        EventMesh.subscribe("update_dev_token", self.update_dev_token)
+        EventMesh.subscribe("dev_active", self.dev_active)
+        EventMesh.subscribe("dev_sign_in", self.dev_sign_in)
+        EventMesh.subscribe("dev_NTP", self.dev_NTP)
+        #EventMesh.publish_async("dev_NTP",thread_size = 8192)
+
+        # count = 0
+        # while True:
+        #     if self.ntptime_flag == 1:
+        #         break
+        #     utime.sleep_ms(1)
+        #     count+=1
+        #     if count>600:
+        #         break
+        # EventMesh.publish_async("dev_active",thread_size = 8192)
+        # EventMesh.publish_async("dev_sign_in",thread_size = 8192)
+
+        self.dev_NTP()#获取时间
+        self.dev_active() #设备激活
+        self.dev_sign_in() #设备登入
+        print("device_res_author __init__ end !!!!!!!!!!!!!!!!!")
+
+    def get_dev_token(self, event, msg): 
+        return self.dev_token
+    #网络校时
+    def dev_NTP(self, event=None, msg=None):
+        response = None
+        try:
+            print("dev_NTP1")
+            url =None
+            if dev_type == "7PIN_BK_EU":#英文小瑞
+                url = "http://dmp-global.raisound.com/bz-api/dev/time"
+            else:
+                url = "http://dmp.raisound.com/bz-api/dev/time"
+            response = request.get(url,timeout=5)
+            data = response.json()
+            print("dev_NTP:{}".format(data))
+            if data:
+                try:
+                    timeSecond = data["data"]["timestamp"]//1000
+                    
+                    next_alarm_time = utime.localtime(timeSecond)
+                    print("timeSecond {} next_alarm_time {}".format(timeSecond,next_alarm_time))
+                    machine.RTC().datetime((next_alarm_time[0],next_alarm_time[1],next_alarm_time[2],next_alarm_time[6],next_alarm_time[3],next_alarm_time[4],next_alarm_time[5],0))
+                    self.ntptime_flag  = 1
+                except Exception as e:
+                        usys.print_exception(e)
+        except Exception as e:
+            usys.print_exception(e)
+        if response != None:
+            response.close() 
+        print("dev_NTP end")
+    def dev_timer_cb(self, *args): #设备资源管理鉴权平台定时器
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.dev_timer_cb_}) 
+
+    def dev_timer_cb_(self):    
+        #if EventMesh.DEV_RES_MANAGE_AUTHEN_PLATFORM == 1:
+        try:
+            if self.dev_token == None:
+                if self.ntptime_flag == 0:
+                    self.ntptime_flag  = 1
+                    EventMesh.publish_async("dev_NTP",thread_size = 8192)
+                    #EventMesh.publish("publish_AI_btnInfo",{"func":self.dev_NTP})
+                print("timer:{}!!!!!!!!\r\n".format(utime.localtime()))
+                EventMesh.publish_async("dev_active",thread_size = 8192)
+                EventMesh.publish_async("dev_sign_in",thread_size = 8192)
+                # self.dev_active() #设备激活
+                # self.dev_sign_in() #设备登入
+                self.dev_res_timerCount+=1
+                if self.dev_res_timerCount > 3: #开机一分钟内没有获取到密码和token 等下一次更新令牌在走登入 激活流程
+                    self.dev_res_timerCount=0
+                    self.dev_res_timer.stop()
+        except Exception as e:
+            usys.print_exception(e)
+    def ud_token_timer_cb(self, *args): 
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.ud_token_timer_cb_}) 
+
+    def ud_token_timer_cb_(self):   
+        try:
+            #print("ud_token_timer_!!!!")
+            self.ud_token_timer_Count+=1
+            if self.ud_token_timer_Count >= 720: #定时10*3000s时更新token
+                self.ud_token_timer_Count = 0
+                EventMesh.publish_async("dev_sign_in",thread_size = 8192)
+        except Exception as e:
+            usys.print_exception(e)    
+    def get_sim_Status(self):
+        return sim.getStatus() 
+    def HMAC(self,k, m):
+    
+        KEY_BLOCK = k + (b'\0' * (self.SHA1_BLOCK_SIZE - len(k)))
+        KEY_INNER = bytes((x ^ 0x36) for x in KEY_BLOCK)
+        KEY_OUTER = bytes((x ^ 0x5C) for x in KEY_BLOCK)
+        inner_message = KEY_INNER + m
+        outer_message = KEY_OUTER + self.SHA256(inner_message).digest()
+        return self.SHA256(outer_message)
+    def get_hmac_sha256(self,k, m):
+        data = self.HMAC(k, m).digest()
+        # print("HMAC(k, m).digest():", data)
+        # print("HMAC(k, m).digest():", ubinascii.hexlify(data))
+        hex_data = ubinascii.hexlify(data)
+        hex_data = hex_data.decode('ascii')
+        return hex_data
+    # 加密函数
+    def aes_CBC_Encrypt(self,data, key, iv):  # CBC模式的加密函数,data为明文,key为16字节密钥,iv为16字节的偏移量
+        key = key.encode('utf-8')
+        iv = iv.encode('utf-8')  # CBC 模式下的偏移量
+        data = self.pad(data)  # 补位
+        data = data.encode('utf-8')
+        aes = ucryptolib.aes(key,ucryptolib.MODE_CBC,iv)
+        result = base64.b64encode(aes.encrypt(data))
+        return str(result, 'utf-8')  # 以字符串的形式返回
+
+    # 解密函数
+    def aes_CBC_Decrypt(self,data, key, iv):  # CBC模式的解密函数,data为密文,key为16字节密钥
+        key = key.encode('utf-8')
+        iv = iv.encode('utf-8')
+        
+        aes = ucryptolib.aes(key,ucryptolib.MODE_CBC,iv) #CBC模式
+
+        # decrypt AES解密  B64decode为base64 转码
+        result = aes.decrypt(base64.b64decode(data))
+        result = self.unpad(result)  # 除去补16字节的多余字符
+        return str(result, 'utf-8')  # 以字符串的形式返回
+    #激活接口 没有密码走激活
+    def dev_active(self, event=None, msg=None):
+        signal = net.csqQueryPoll()
+        if signal == -1 or self.get_sim_Status() != 1:#网络不正常
+            print("dev_active 无 SIM卡!!!!!!!!\r\n")
+            return
+        print("dev_active 1\r\n")
+        # 签名内容: = deviceId+pid+timeStamp
+        dev_pass = ""
+        dev_pass = EventMesh.publish("get_storage_config","dev_pass")
+        print("dev_pass:{}\r\n".format(dev_pass))
+        if dev_pass == None:
+            dev_pass = ""
+        if dev_pass == "" or dev_pass == None:
+            try:
+                date_tmp = utime.localtime() #获取当前时间
+                print("date_tmp:{}\r\n".format(date_tmp)) #转换时间戳s
+                timeStamp = (utime.mktime(date_tmp))*1000#获取时间戳ms
+                deviceId = self.deviceId #"876226002022574" #以imei号
+                pid = self.pid
+                key = self.key
+                sign_data = "{}{}{}".format(deviceId,pid,timeStamp)  #签名内容
+                print("sign_data:{}\r\n".format(sign_data))
+                sha256_hex = self.get_hmac_sha256(key,sign_data)
+                print("sha256_hex:{}\r\n".format(sha256_hex))
+
+                data = {
+                    "deviceId":"{}".format(deviceId), #设备名
+                    "pid":pid, #产品PID
+                    "sign":"{}".format(sha256_hex), #HMACSHA256签名后的数据
+                    "timeStamp":timeStamp, #要以ms的形式
+                    "signMethod":"HMACSHA256" #签名方式 HMACSHA256
+                }
+                print(ujson.dumps(data))
+                headers_T ={"Content-Type":"application/json"}
+                url =None
+                if dev_type == "7PIN_BK_EU":#英文小瑞
+                    url = "http://dmp-global.raisound.com/bz-api/dev/auth/active"
+                else:
+                    url = "http://dmp.raisound.com/bz-api/dev/auth/active"
+                data =ujson.dumps(data)
+                response = None
+                response_result = 0
+                try:
+                    response = request.put(url,data=data,headers = headers_T,timeout=5)
+                    response_result = 1
+                except Exception as e:
+                    usys.print_exception(e)   
+                    print("put error!!!!!\r\n")
+                    response_result = 0
+                
+                IV = "" #偏移量
+                PASSWORD= "" #服务器返回后的加密内容 密码
+                if response_result == 1: #访问成功ip
+                    if response.status_code == 200:
+                        print("headers:{}".format(response.headers))
+                        content = response.content
+                        c = next(content)
+                        # "api.xcloudtech.com"
+                        # d_server_port = 9000
+                        data =  ujson.loads(c)
+                        # data = response.json()
+                        print("data-{}".format(data))
+                        if data != None:
+                            if "success" in data:
+                                if data['success'] == True:
+                                    if "data" in data:
+                                        data_tmp = data["data"]
+                                        if "nonce" in data_tmp: #偏移量
+                                            IV = data_tmp["nonce"]
+                                        if "password" in data_tmp:
+                                            PASSWORD = data_tmp["password"]
+                                            # EventMesh.publish("set_storage_config",["dev_pass",PASS])
+                                if data["code"] == 20001:#鉴权成功
+                                    pass
+                                elif data["code"] > 50000:#
+                                    self.res_error_count+=1
+                                    if self.res_error_count>=3:
+                                        self.res_error_count = 0
+                                        
+                                        EventMesh.publish("paly_device_res_error")
+                                    if data["code"] == 50003:#时间错误
+                                        self.ntptime_flag  = 0
+                        if PASSWORD != None and IV != None:
+                            if len(PASSWORD) != 0 and len(IV) != 0:
+                                password = PASSWORD
+                                iv = IV
+                                #解密 之后保存本地下一次登入做使用
+                                decrypt_data = self.aes_CBC_Decrypt(password, self.key, iv) #对服务器下发的密码进行解密
+                                print("decrypt_data {}".format(decrypt_data))
+                                EventMesh.publish("set_storage_config",["dev_pass",decrypt_data])    
+                    print("IV:{}\r\n PASS:{}".format(IV,PASSWORD))
+                if response != None:
+                    response.close()  
+            except Exception as e:
+                usys.print_exception(e)   
+            print("dev_active end\r\n")
+            return [response_result,PASSWORD,IV]
+    #随机生成16个字节的字符串作为加密的IV 偏移量
+    def generate_random_string(self,length=16): 
+        random_str = ""
+        chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
+        for i in range(length):
+            random_str+=chars[random.randint(0,length)]
+        return random_str
+
+    #设备登入 没有Token 走登入获取token
+    def dev_sign_in(self, event=None, msg=None):
+        signal = net.csqQueryPoll()
+        if signal == -1 or self.get_sim_Status() != 1:#网络不正常
+            print("dev_sign_in 无 SIM卡!!!!!!!!\r\n")
+            return
+        print("dev_sign_in 1")
+        token = ""
+        try:
+            token = self.dev_token
+            dev_pass = EventMesh.publish("get_storage_config","dev_pass") 
+            #print("token:{}\r\n".format(token))
+            if token == None:
+                token = ""
+            if dev_pass == None:
+                dev_pass = ""
+            if len(dev_pass) == 0:#没有密码
+                return
+            #if token == None or token == "":
+            if 1: #返回结果成功
+                #获取本地保存的密码
+                decrypt_data=EventMesh.publish("get_storage_config","dev_pass")
+                # decrypt_data = self.aes_CBC_Decrypt(password, self.key, iv) #对服务器下发的密码进行解密
+                print("decrypt_data {}".format(decrypt_data))
+                #随机生成16个字符串 设备生成做加密使用
+                random_string = self.generate_random_string(16) #随机的16个字符串
+                enc_iv = random_string #加密的IV偏移量
+                #设备端进行密码加密
+                encrypt_data = self.aes_CBC_Encrypt(decrypt_data, self.key, enc_iv)
+                print("encrypt_data {}".format(encrypt_data))
+
+                #登入数据
+                deviceId = self.deviceId
+                sign_in_data = {
+                    "deviceId":"{}".format(deviceId), #设备ID
+                    "password":"{}".format(encrypt_data), #加密的数据
+                    "nonce":"{}".format(random_string) #随机的16个字符串
+                }
+                print(ujson.dumps(sign_in_data))
+                sign_url =None
+                if dev_type == "7PIN_BK_EU":#英文小瑞
+                    sign_url = "http://dmp-global.raisound.com/bz-api/dev/auth/sign_in" #登入地址
+                else:
+                    sign_url = "http://dmp.raisound.com/bz-api/dev/auth/sign_in" #登入地址
+                headers_T ={"Content-Type":"application/json"}
+                response_result = 0
+                response = 0
+                try:
+                    response = request.post(sign_url,data=ujson.dumps(sign_in_data),headers = headers_T,timeout=5)
+                    response_result = 1
+                except Exception as e:
+                    usys.print_exception(e)   
+                    print("post error!!!!!\r\n")
+                    response_result = 0
+                # {'msg': '', 'code': 20001, 'success': True, 
+                # 'data': {'deviceId': '876226002022574', 
+                # 'token': '95436a9e09fd0ff89feb8825257dca982f'}
+                # }
+                
+                #self.dev_token = ""
+                if response_result == 1:
+                    if response.status_code == 200:
+                        content = response.content
+                        c = next(content)
+                        data =  ujson.loads(c)
+                        print("data-{}".format(data))
+                        if data != None:
+                            if "success" in data:
+                                if data['success'] == True: #登入成功
+                                    if "data" in data:
+                                        data_tmp = data["data"]
+                                        if "token" in data_tmp: #token
+                                            self.dev_token = data_tmp["token"]
+                                else:#报错清空密钥
+                                    print("登录失败,清空密钥")
+                                    EventMesh.publish("set_storage_config",["dev_pass",""])
+                                if data["code"] == 50003:#时间错误
+                                    self.ntptime_flag  = 0
+                              
+                print("token:{}\r\n".format(self.dev_token))
+                if response != None:
+                    response.close()
+                pass
+        except Exception as e:
+                    print("post error!!!!!\r\n")
+                    response_result = 0
+        print("dev_sign_in end")
+    #获取新的令牌 更新token
+    def update_dev_token(self, event=None, msg=None):
+        print("update_dev_token")
+        try:
+            dev_pass = ""
+            dev_pass = EventMesh.publish("get_storage_config","dev_pass")
+            
+            if dev_pass == None:
+                dev_pass = ""
+            if len(dev_pass) == 0: #没有密码走激活
+                print("no dev_pass:{}\r\n".format(dev_pass))
+                EventMesh.publish("dev_active")
+            token = self.dev_token
+            if token == None:
+                token = ""
+            if len(token) == 0: #没有token走登入
+                print("no dev_token:{}\r\n".format(token))
+                #self.dev_sign_in()
+                EventMesh.publish("dev_sign_in")
+            dev_tokenip =None
+            if dev_type == "7PIN_BK_EU":#英文小瑞
+                dev_tokenip = "http://dmp-global.raisound.com/bz-api/dev/auth/token" #设备新令牌更新地址
+            else:
+                dev_tokenip = "http://dmp.raisound.com/bz-api/dev/auth/token" #设备新令牌更新地址
+            token = self.dev_token
+            if token == None:
+                token = ""
+            if len(token) != 0:
+                response_result=0
+                response = None
+                headers_T = {"bz-dt":"{}".format(token)}
+                try:
+                    response = request.get(dev_tokenip,headers = headers_T,timeout=5)
+                    response_result = 1
+                except Exception as e:
+                    print("get error!!!!!\r\n")
+                    response_result = 0
+                if response_result == 1:
+                    if response.status_code == 200:
+                        try:
+                            headers_data = response.headers
+                            # print("headers_data!!!!! headers_data:{}\r\n".format(headers_data))
+                            if "bz-dt" in headers_data: #bz-dt字段是否在头部数据里面 如果有就需要更新
+                                bz_dt = headers_data["bz-dt"] 
+                                self.dev_token = bz_dt.replace(" ", "") #去掉所有的空格符
+                                print("update_dev_token:{}".format(self.dev_token))
+                        except Exception as e:
+                            print("headers_data!!!!! error\r\n")
+                if response != None:
+                    response.close()
+        except Exception as e:
+            usys.print_exception(e)   
+        print("update_dev_token end")
+        
+#OTA升级
+class OTA():
+    def __init__(self):
+        #EventMesh.subscribe("min_sys_ota",self.min_sys_ota)
+        self.downloadFileVoURL1= ""
+        self.downloadFileVoURL2= ""
+    #小系统升级,返回0,没有升级;返回,1有升级,正在执行升级;返回2,电压不够
+    def min_sys_ota(self,event=None,msg=None):
+        print("min_sys_ota")
+        signal = net.csqQueryPoll()
+        if signal == -1 or sim.getStatus()  != 1:#网络不正常
+            print("min_sys_ota 无 SIM卡!!!!!!!!\r\n")
+            return 0
+        # return 0
+        response = None
+        ret_str =0
+        self.downloadFileVoURL1= ""
+        self.downloadFileVoURL2= ""
+        try:
+            sourceVersion = versions.Build_Time
+            sourceVersion = "7PIN-"+sourceVersion[:10]+"-"+sourceVersion[11:-3]
+            print("sourceVersion:{}".format(sourceVersion))
+            sourceVersion = sourceVersion.replace(" ", "0")
+            print("sourceVersion2:{}".format(sourceVersion))
+            #url = "http://iot.api.thisiot.com/ota/task?deviceId=860132060348836&sourceVersion=2024-12-20-15:35-1"
+            url =None
+            if dev_type == "7PIN_BK_EU":#英文小瑞
+                url = "http://dmp-global.raisound.com/bz-api/ota/task?deviceId={}&sourceVersion={}".format(modem.getDevImei(),sourceVersion)
+            if dev_type == "7PIN" or dev_type == "7PIN_coze":#柒牌
+                url = "http://ota.qipai.com/bz-cmp-api/api/task?deviceId={}&sourceVersion={}".format(modem.getDevImei(),sourceVersion)
+            else:
+                url = "http://dmp.raisound.com/bz-api/ota/task?deviceId={}&sourceVersion={}".format(modem.getDevImei(),sourceVersion)
+
+            print(url)
+            response = request.get(url,timeout=5)
+            if response.status_code == 200:
+                data = response.json()
+                print("OTA升级请求:{}".format(data))
+                
+                if data:
+                    try:
+                        if data["code"] == 20007:#有新版本
+                            if "fileList"in data["data"]:
+                                if len(data["data"]["fileList"]) == 2:
+                                    for fileList in data["data"]["fileList"]:
+                                        if fileList["fileName"] == "dfota_2.bin":
+                                            self.downloadFileVoURL2 = fileList["url"]
+                                        elif fileList["fileName"] == "dfota_1.bin":
+                                            self.downloadFileVoURL1 = fileList["url"]
+                            
+                        if data["code"] == 20006:#已是最新版本
+                            ret_str = 0
+                                    
+                    except Exception as e:
+                            usys.print_exception(e)
+            else:
+                print("min_sys_ota get error")
+            response.close()
+        except Exception as e:
+            usys.print_exception(e)
+            if response != None:
+                response.close()
+        
+        print("min_sys_ota:downloadFileVoURL1:{},\ndownloadFileVoURL2:{}".format(self.downloadFileVoURL1,self.downloadFileVoURL2))
+        print("min_sys_ota end") 
+        if self.downloadFileVoURL2!="" and self.downloadFileVoURL1!="":
+            battery = EventMesh.publish("get_battery")
+            if battery>=40:
+                self.ota_timer = osTimer()
+                self.ota_timer.start(15000, 0, self.ota_timer_cb)
+                ret_str =  1  
+            else:
+                ret_str =  2
+        return ret_str
+    
+    def ota_timer_cb(self, *args, **kwargs):
+        import fota
+        fota_obj = fota() 
+        fota_obj.httpDownload(url1=self.downloadFileVoURL1,url2=self.downloadFileVoURL2)
+    #ota升级结果返回,开机时调用一次即可
+    def ota_result(self,event=None,msg=None):
+        response = None
+        try:
+            currentVersion = versions.Build_Time
+            currentVersion = "7PIN-"+currentVersion[:10]+"-"+currentVersion[11:-3]
+            print("currentVersion1:{}".format(currentVersion))
+            currentVersion = currentVersion.replace(" ", "0")
+            print("currentVersion2:{}".format(currentVersion))
+            url =None
+            if dev_type == "7PIN_BK_EU":#英文小瑞
+                url = "http://dmp-global.raisound.com/bz-api/ota/result?deviceId={}&currentVersion={}".format(modem.getDevImei(),currentVersion)
+            if dev_type == "7PIN" or dev_type == "7PIN_coze":#柒牌
+                url = "http://ota.qipai.com/bz-cmp-api/api/result?deviceId={}&currentVersion={}".format(modem.getDevImei(),currentVersion)
+            else:
+                url = "http://dmp.raisound.com/bz-api/ota/result?deviceId={}&currentVersion={}".format(modem.getDevImei(),currentVersion)
+            print(url)
+            response = request.post(url,timeout=5)
+            if response.status_code == 200:
+                data = response.json()
+                print("OTA升级结果上报:{}".format(data))
+            else:
+                print("ota_result  error!!!!")
+                for i in response.text:
+                    print(i)
+            response.close()
+        except Exception as e:
+            usys.print_exception(e)
+            if response != None:
+                response.close()
+    #ICCID上传
+    def pots_ICCID(self,event=None,msg=None):
+        response = None
+        try:
+            iccid = sim.getIccid()
+            if iccid != -1 and len(iccid) > 5:
+                print("pots_ICCID:{}".format(iccid))
+                #Headers = {'Transfer-Encodong':'chunked'}
+                token = EventMesh.publish("get_dev_token")
+                headers_T = None
+                if token:
+                    headers_T = {"bz-dt":"{}".format(token)}
+                #http://dmp.raisound.com/bz-api/dev/iccid?deviceId=866610001099679&iccid=89860002192307889057
+                url =None
+                if dev_type == "7PIN_BK_EU":#英文小瑞
+                    url = "http://dmp-global.raisound.com/bz-api/dev/iccid?deviceId={}&iccid={}".format(modem.getDevImei(),iccid)
+                else:
+                    url = "http://dmp.raisound.com/bz-api/dev/iccid?deviceId={}&iccid={}".format(modem.getDevImei(),iccid)
+                print("{} H:{}".format(url,headers_T))
+                response = request.post(url,headers = headers_T,timeout=5)
+                if response.status_code == 200:
+                    data = response.json()
+                    print("pots_ICCID:{}".format(data))
+                else:
+                    print("pots_ICCID  error!!!!")
+                    for i in response.text:
+                        print(i)
+                response.close()
+        except Exception as e:
+            usys.print_exception(e)
+            if response != None:
+                response.close()
+#阿里VC状态枚举
+VC_State_None=0
+VC_State_Listening=1#听
+VC_State_SpeechStart=2#说开始
+VC_State_SpeechIng=3#正在说
+VC_State_SpeechEnd=4#说结束
+VC_State_RequestToRespond=5 #TTS请求或者chat请求
+VC_State_Thinking=6#想(chat)
+VC_State_Responding=7#音频播放
+VC_State_TTSStart=8
+VC_State_TTSData=9
+VC_State_TTSFinish=10
+VC_State_TTSEnd=11
+VC_State_TTSError=12
+VC_State_DialogError=13
+VC_State_End=14
+
+VC_record_TYPE_PCM = 0
+VC_record_TYPE_AMR = 1
+VC_play_TYPE_PCM = 0
+VC_play_TYPE_MP3 = 1
+
+#websocket发送数据编号
+# AI_client_asr_num = 0
+# AI_client_chat_num = 1
+# AI_client_tts_num = 2
+AI_client_VC_num = 3
+AI_client_asr_num = 4
+
+
+class AI_VC(Abstract):
+    # AI
+    
+    def __init__(self):
+        # import voiceCall
+        # voiceCall.callStart("10086")
+        # return
+        
+        try:
+            self.http_get_config()#获取/更新配置参数
+        except Exception as e:
+            usys.print_exception(e)
+        self.VC_30S_timer = osTimer()
+        self.VC_30S_timer.start(30000, 1, self.VC_30S_timer_cb)
+        self.get_config_timer_count = 0
+        self.record_data_save_flag = 0 #是否保存录音文件
+        self.play_data_save_flag = 0#是否保存tts数据到文件
+        self.record_fd = None
+        self.play_fd = None
+        self.is_VC_ACK = 0 #是否开启ack应答模式
+        self.is_long_record = 0 #是否开启长录音模式(语音打断模式)
+        self.ai_OTA = OTA()
+        self.is_auth = 1 #是否开启dmp鉴权
+        #self.VC_mode = 1 #0:短按连续问答模式 1:长按录音模式
+        self.VC_mode = EventMesh.publish("get_storage_config","VC_mode")#
+        if self.VC_mode == None :
+            self.VC_mode = 0
+        self.is_up_error= 0 #是否上传错误id
+        self.Close_flag =0 #=1时,连续对话播放完音频就退出
+        EventMesh.subscribe("play_tts",self.play_tts)
+        self.AI_alarm = _ai_alarm.AI_alarm()
+        self.error_data = []
+        self.asr_taskid  = ""
+        self.VC_taskid  = ""
+        self.VC_server = 2 #0柒牌正式服务器,1:测试服务器1,2:测试服务器2
+        
+        EventMesh.publish("AI_alarm_open")#
+        self.server_ip = EventMesh.publish("get_storage_config","server_ip")#
+        if self.server_ip == None:
+            if self.VC_server == 1:# 
+                self.server_ip="118.145.158.207:22083"
+            elif self.VC_server == 2:# 
+                self.server_ip="118.145.158.207:22082"
+            elif self.VC_server == 4:# 
+                self.server_ip="118.145.158.207:22084"
+            elif self.VC_server == 5:# 
+                self.server_ip="amp-wss.raisound.com"
+            elif self.VC_server == 6:# 
+                self.server_ip="118.145.158.207:22080"
+            elif self.VC_server == 7:# 
+                self.server_ip="118.145.158.207:22080"
+            elif self.VC_server == 8:# 
+                self.server_ip="115.190.94.208:22080"
+            elif self.VC_server == 86:# 
+                self.server_ip="118.145.158.207:22086"    
+            else:
+                #self.server_ip="sevenpin.qipai.com.cn"
+                self.server_ip="118.145.158.207:22082"
+            if dev_type == 'jswm' or dev_type == 'jswm_BOX':# 
+                #self.server_ip="115.190.94.208:22080"
+                self.server_ip="118.145.158.207:22086"   
+            elif dev_type == "7PIN" :
+                #self.server_ip="sevenpin.qipai.com.cn"
+                # self.server_ip="220.160.104.34"
+                # self.server_ip="118.145.158.207:22082"
+                # self.server_ip="118.145.158.207:22080/22087"
+                self.server_ip="ai.qipai.com"
+                #self.server_ip="sevenpin1.qipai.com.cn:22082"
+            elif dev_type == "G10":
+                self.server_ip="115.190.94.208:22080"
+            elif dev_type == "sjgq":
+                self.server_ip="118.145.158.207:22084"
+            elif dev_type == "7PIN_BK" or dev_type == 'csh'or dev_type == "7PIN_BK_coze"or dev_type == 'momo':
+                #self.server_ip="amp.raisound.com"
+                self.server_ip="118.145.158.207:22086"
+                #self.server_ip="115.190.94.208:22080"
+            elif dev_type == "7PIN_coze":
+                self.server_ip="118.145.158.207:22086"
+            elif  dev_type == "7PIN_BK_EU":
+                #self.server_ip="amp-global.raisound.com"
+                self.server_ip="amp-cdn-test.raisound.com"
+
+        #开机提示音
+        self.power_on_tone = EventMesh.publish("get_storage_config","power_on_tone")#
+        if dev_type != "7PIN"  and dev_type != "7PIN_coze"and dev_type != "jswm" and  dev_type != 'jswm_BOX' and dev_type != "7PIN_BK":
+            self.power_on_tone = None
+        if self.power_on_tone == None:
+            if dev_type == "G10":
+                self.power_on_tone = "已开机,您好!我是北科瑞讯智能 AI bot_name"
+            elif dev_type == "7PIN_BK"or dev_type == "7PIN_BK_coze":
+                self.power_on_tone = "-bot_name来了!我们一起来愉快地聊天吧!" 
+            elif  dev_type == "7PIN_BK_EU":
+                self.power_on_tone = "Hi. May I help you ?" 
+            elif dev_type == 'momo':
+                self.power_on_tone = "DuloDulo,我是上古神兽食梦貘,主人可以叫我momo,我来自《山海经》,是一只以梦为食的神秘灵兽,每当颜色朦胧、人们入睡时,我就会悄悄飞到人们的床头,用我长长的鼻子把噩梦统统吞噬掉,只留下甜甜的美梦。从今往后,就由我守护在主人身边,一起度过每一个星河璀璨的夜晚。"
+            elif dev_type == "sjgq":
+                self.power_on_tone = "您好!我是巴马四季甘泉的智能助手。我可以为你解答各种各样的问题,像是有关巴马四季甘泉知识库、中基长寿科学产品、卫斯曼院士国际先进医疗中心的问题,还有日常生活与工作、旅游信息、健康咨询、教育与学习、情感交流、全球资讯、世界文化等方面的问题哦。你有没有这方面的问题想要问我呀?"
+            elif dev_type == "szbst":
+                self.power_on_tone = "深圳百事通来了!请问您有什么需要我帮忙的吗?" 
+            elif dev_type == 'jswm'or dev_type == 'jswm_BOX':
+                self.power_on_tone = "我来陪你聊天了"
+            elif dev_type == 'csh':
+                self.power_on_tone = "欢迎使用助手小福"  
+            else:
+                self.power_on_tone = "您好!我是世界首创柒牌男装AI生活好帮手-bot_name, 很高兴为您服务,我可以帮您解答柒牌公司知识库、日常生活与工作、旅游信息、健康与运动咨询、教育与学习、情感交流、全球资讯、世界文化等问题!请问您有什么需要我帮忙的吗?" 
+                
+
+        self.VC_record_TYPE = VC_record_TYPE_PCM #0:PCM 1:AMR
+        self.VC_play_TYPE = VC_play_TYPE_PCM #0:PCM 1:mp3 
+        self.VC_record_samplerate = 16000
+        self.VC_play_samplerate = 16000
+        self.VAD_data_len = 640 #10ms数据
+        self.is_VAD = 0#=1打开vad打断
+        # ARG_sample_rate,             // 采样率
+        # ARG_channel,                // 通道数
+        # ARG_frame_size,              // 每帧字节数
+        # ARG_energy_threshold,        // 能量阈值
+        # ARG_voice_time,              // 语音持续时间阈值(ms)
+        # ARG_silence_time,            // 静音持续时间阈值(ms)
+        # ARG_silence_start_threshold, // 静音开始阈值(ms)
+        self.vad = None
+        if self.is_VAD == 1:
+            self.vad = VAD.VAD(self.VC_record_samplerate ,1,self.VAD_data_len,600,100,300,100)
+        self.speech_rate = EventMesh.publish("get_storage_config","speech_rate")#语速配置
+        if self.speech_rate == None:
+            self.speech_rate = 0
+        
+        self.vad_silence = EventMesh.publish("get_storage_config","vad_silence")#语速配置
+        if self.vad_silence == None:
+            if dev_type == "7PIN" or dev_type == "7PIN_coze":
+                self.vad_silence = 200
+            else:
+                self.vad_silence = 300
+
+        self.VC_TTS_voice_type = EventMesh.publish("get_storage_config","VC_TTS_voice_type")#音色配置
+        if self.VC_TTS_voice_type == None :
+            if dev_type == "G10" or  dev_type == "7PIN_BK"or dev_type == "szbst" :
+                self.VC_TTS_voice_type = {   
+                                            "女":{
+                                            "bot_name":"小瑞",
+                                            "voice":"zh_female_wanwanxiaohe_moon_bigtts" ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "男":{
+                                            "bot_name":"小瑞",
+                                            "voice":"zh_male_wennuanahu_moon_bigtts"  ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "童":{
+                                            "bot_name":"小瑞",
+                                            "voice":"ICL_zh_female_huoponvhai_tob"  ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "粤":{
+                                            "bot_name":"小瑞",
+                                            "voice":"zh_female_wanqudashu_moon_bigtts" ,
+                                            "lang":"zh-hk" 
+                                            },
+                                            "四川":{
+                                            "bot_name":"小瑞",
+                                            "voice":"zh_female_daimengchuanmei_moon_bigtts",
+                                            "lang":"&lang=zh-cn-sc"  
+                                            },
+                                            "瑞小蜜":{
+                                            "bot_name":"瑞小蜜",
+                                            "voice":"zh_male_tiancaitongsheng_mars_bigtts",
+                                            "lang":"&lang=zh-cn-sc" , 
+                                            "bot_id":"7491251662036811816",#瑞小蜜
+                                            },
+                                            "瑞小粉":{
+                                            "bot_name":"瑞小粉",
+                                            "voice":"ICL_zh_female_tiaopigongzhu_tob",
+                                            "bot_id":"7501268622456045603",#瑞小粉
+                                            "lang":"&lang=zh-cn-sc"  
+                                            },
+                                            "个性":{
+                                            "bot_name":"小瑞",
+                                            "voice":"zh_male_sunwukong_mars_bigtts" ,
+                                            "lang":"zh-cn" 
+                                            }
+                                           
+                                        }
+            elif  dev_type == "7PIN_BK_coze":
+                self.VC_TTS_voice_type = {   
+                                            "女":{
+                                            "bot_name":"小瑞",
+                                            "voice":"7468518753626488869" ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "男":{
+                                            "bot_name":"小瑞",
+                                            "voice":"7426720361732980745"  ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "童":{
+                                            "bot_name":"小瑞",
+                                            "voice":"7468512265151676443"  ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "粤":{
+                                            "bot_name":"啊瑞",
+                                            "voice":"7481299960428888103" ,
+                                            "lang":"zh-hk" 
+                                            },
+                                            "四川":{
+                                            "bot_name":"小瑞",
+                                            "voice":"7426720361732931593",
+                                            "lang":"&lang=zh-cn-sc"  
+                                            },
+                                            "个性":{
+                                            "bot_name":"小瑞",
+                                            "voice":"7468512265134850099" ,
+                                            "lang":"zh-cn" 
+                                            }
+                                           
+                                        }
+            elif  dev_type == "7PIN_BK_EU":
+                                            self.VC_TTS_voice_type = {   
+                                            "女":{
+                                            "bot_name":"Rose",
+                                            "voice":"zh_female_shuangkuaisisi_emo_v2_mars_bigtts" ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "男":{
+                                            "bot_name":"Jack",
+                                            "voice":"zh_male_wennuanahu_moon_bigtts"  ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "童":{
+                                            "bot_name":"Ray",
+                                            "voice":"zh_female_mengyatou_mars_bigtts"  ,
+                                            "lang":"zh-cn"
+                                            },
+                                           
+                                        }
+            elif dev_type == "csh":
+                self.VC_TTS_voice_type = {   
+                                            "女":{
+                                            "bot_name":"小福",
+                                            "voice":"zh_female_wanwanxiaohe_moon_bigtts" ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "男":{
+                                            "bot_name":"小福",
+                                            "voice":"zh_male_wennuanahu_moon_bigtts"  ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "童":{
+                                            "bot_name":"小福",
+                                            "voice":"ICL_zh_female_huoponvhai_tob"  ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "粤":{
+                                            "bot_name":"小福",
+                                            "voice":"zh_female_wanqudashu_moon_bigtts" ,
+                                            "lang":"zh-hk" 
+                                            },
+                                            "四川":{
+                                            "bot_name":"小福",
+                                            "voice":"zh_female_daimengchuanmei_moon_bigtts",
+                                            "lang":"&lang=zh-cn-sc"  
+                                            },
+                                        }
+            elif dev_type == 'jswm'or dev_type == 'jswm_BOX':
+                self.VC_TTS_voice_type = {   
+                                            
+                                            "林悦":{
+                                            "bot_name":"林悦",
+                                            #"voice":"ICL_zh_female_xingganyujie_tob",
+                                            "voice":"zh_female_yuanqinvyou_moon_bigtts" ,
+                                            "lang":"&lang=zh-cn-sc"  ,
+                                            "bot_id":"7490824341572075555",#AI语音APP女神经理
+                                            "workflow_id":"",
+                                            "openai_option":{
+                                                # "model": "intimate-pro-32k-250115",
+                                                # "system":{
+                                                #     "type": "file",
+                                                #     "content": "1567d9e19ac09269d8ce6c887494ff01",
+                                                # },
+                                            },
+
+                                            },
+                                            "黄文新":{
+                                            "bot_name":"黄文新",
+                                            "voice":"zh_male_wennuanahu_moon_bigtts" ,           
+                                            "lang":"zh-cn" ,
+                                            "bot_id":"7490825075302973440",#开朗男友
+                                            "workflow_id":"",
+                                            "openai_option":{
+                                                # "model": "intimate-pro-32k-250115",
+                                                # "system":{
+                                                #     "type": "file",
+                                                #     "content": "2731e1e9d7150807795c4b5ab1e01e1b",
+                                                # },
+                                            },
+                                            },
+                                           
+                                        }
+            elif dev_type == 'momo':
+                self.VC_TTS_voice_type = {   
+                                            "女":{
+                                            "bot_name":"食梦貘",
+                                            "voice":"zh_female_linjia_mars_bigtts" ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "男":{
+                                            "bot_name":"食梦貘",
+                                            "voice":"zh_male_yangguangqingnian_mars_bigtts"  ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "童":{
+                                            "bot_name":"食梦貘",
+                                            "voice":"ICL_zh_female_huoponvhai_tob"  ,
+                                            "lang":"zh-cn"
+                                            },
+                }
+            elif dev_type == 'sjgq':
+                self.VC_TTS_voice_type = {   
+                                            "女":{
+                                            "bot_name":"小巴",
+                                            "voice":"zh_female_wanwanxiaohe_moon_bigtts" ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "男":{
+                                            "bot_name":"小巴",
+                                            "voice":"zh_male_wennuanahu_moon_bigtts"  ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "童":{
+                                            "bot_name":"小巴",
+                                            "voice":"ICL_zh_female_huoponvhai_tob"  ,
+                                            "lang":"zh-cn"
+                                            },
+                }
+            elif  dev_type == "7PIN_coze":
+                self.VC_TTS_voice_type = {   
+                                            "女":{
+                                            "bot_name":"柒妹妹",
+                                            "voice":"7468518753626488869" ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "男":{
+                                            "bot_name":"柒先生",
+                                            "voice":"7426720361732980745"  ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "童":{
+                                            "bot_name":"柒乐乐",
+                                            "voice":"7468512265151676443"  ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "粤":{
+                                            "bot_name":"柒先生",
+                                            "voice":"7481299960428888103" ,
+                                            "lang":"zh-hk" 
+                                            },
+                                            "四川":{
+                                            "bot_name":"柒妹妹",
+                                            "voice":"7426720361732931593",
+                                            "lang":"&lang=zh-cn-sc"  
+                                            },
+                                            "个性":{
+                                            "bot_name":"柒先生",
+                                            "voice":"7468512265134850099" ,
+                                            "lang":"zh-cn" 
+                                            }
+                                           
+                                        }
+            else:
+                #女,男,童,粤,川,个性声
+                self.VC_TTS_voice_type = {   
+                                            "女":{
+                                            "bot_name":"柒妹妹",
+                                            "voice":"zh_female_wanwanxiaohe_moon_bigtts" ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "男":{
+                                            "bot_name":"柒先生",
+                                            "voice":"zh_male_wennuanahu_moon_bigtts"  ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "童":{
+                                            "bot_name":"柒乐乐",
+                                            "voice":"ICL_zh_female_huoponvhai_tob"  ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "粤":{
+                                            "bot_name":"柒先生",
+                                            "voice":"zh_female_wanqudashu_moon_bigtts" ,
+                                            "lang":"zh-hk" 
+                                            },
+                                            "四川":{
+                                            "bot_name":"柒妹妹",
+                                            "voice":"zh_female_daimengchuanmei_moon_bigtts",
+                                            "lang":"&lang=zh-cn-sc"  
+                                            },
+                                            "个性":{
+                                            "bot_name":"柒先生",
+                                            "voice":"zh_male_sunwukong_mars_bigtts" ,
+                                            "lang":"zh-cn" 
+                                            },
+                                            "英语":{
+                                            "bot_name":"柒先生",
+                                            "voice":"en_male_smith_mars_bigtts" ,
+                                            "lang":"zh-cn" 
+                                            }
+                                            
+                                           
+                                        }
+            
+            # self.VC_TTS_voice_type = {0:"zh_female_xinlingjitang_moon_bigtts",1:"zh_male_wennuanahu_moon_bigtts",2:"ICL_zh_female_huoponvhai_tob",
+            #                           3:"aliyun::longjiaxin",4:"zh_female_daimengchuanmei_moon_bigtts"}
+            #self.VC_TTS_voice_type = ["aliyun::longxiaoxia","aliyun::longnan","aliyun::longling"]
+            
+            #EventMesh.publish("set_storage_config",["VC_TTS_voice_type",self.VC_TTS_voice_type])
+
+        try:
+            self.VC_TTS_voice_key = EventMesh.publish("get_storage_config","VC_TTS_voice_key")#音色配置
+            if self.VC_TTS_voice_key == None :
+                if dev_type == "7PIN_BK"or dev_type == "7PIN_BK_EU"or dev_type == "7PIN_BK_coze":
+                    self.VC_TTS_voice_key = "童"
+                    #self.VC_TTS_voice_key = "男"
+                elif dev_type == 'momo':
+                    self.VC_TTS_voice_key = "女"
+                elif dev_type == "jswm"or dev_type == 'jswm_BOX':
+                    self.VC_TTS_voice_key = "林悦"    
+                else:
+                    self.VC_TTS_voice_key = "男"
+            if self.VC_TTS_voice_key in self.VC_TTS_voice_type:
+                pass
+            else:
+                self.VC_TTS_voice_key = list(self.VC_TTS_voice_type.keys())[0]
+            print("音色配置:{}:{}\r\n\r\n".format(self.VC_TTS_voice_key,self.VC_TTS_voice_type[self.VC_TTS_voice_key]))
+            self.VC_TTS_volume =  EventMesh.publish("get_storage_config","VC_TTS_volume")#音量配置
+        except Exception as e:
+            usys.print_exception(e)
+        #配置词
+        self.commands_mode = 2 #=1用大模型判断命令,=0用服务器本地插件判断命令 =2用设备本地判断方式
+        if dev_type == "7PIN_BK"or dev_type == "7PIN_BK_EU"or dev_type == "7PIN_BK_coze":
+            self.commands_mode = 2
+        self.commands =  [
+            {
+                "command": "切换音色",#命令
+                "patterns": [ #多种问法,说法
+                    "声音改成", "声音改为", "改成", "改为", "换成", "切换成", "变成", "声音"
+                    "使用", "设置声音为", "把声音改成", "声音切换到", "用","声音切换的"
+                ],
+                "exact_matches": ["声音改成", "声音改为", "改成", "改为"],#精确匹配的完整短语
+                "has_param": True,# 是否包含参数
+                "param_regexp": r"(?P<cmd_parameter>(男|难|女|童|同|粤|广东话|粤语|四川话|川普|四川口音))",#参数提取正则表达式
+                "require_full_match": False,#是否要求完全匹配
+                "negative_patterns": [],#否定模式(避免误触发)
+                "keyword_threshold": 0.6#关键词匹配阈值
+            },
+            {
+                "command": "音量加大",
+                "patterns": [
+                    "音量加大","音量大", "声音大" ,"声音加大","听不清楚","声音太小","太小声了"
+                ],
+                "exact_matches": [],
+                "has_param": False,
+                "param_regexp": "",
+                "require_full_match": False,
+                "negative_patterns": ["声音太大"],
+                "keyword_threshold": 1
+            },
+            {
+                "command": "音量减小",
+                "patterns": [
+                    "音量减小","音量小", "声音小","你太吵了","声音太大","太大声了"
+                ],
+                "exact_matches": [],
+                "has_param": False,
+                "param_regexp": "",
+                "require_full_match": False,
+                "negative_patterns": ["声音太小"],
+                "keyword_threshold": 0.8
+            },
+            {
+                "command": "关机",
+                "patterns": [
+                    "关机", "关闭电源"
+                ],
+                "exact_matches": ["关机", "关闭电源"],
+                "has_param": False,
+                "param_regexp": "",
+                "require_full_match": True,
+                "negative_patterns": [],
+                "keyword_threshold": 0.8
+            },
+            {
+                "command": "进入工厂模式",
+                "patterns": [
+                    "进入工厂模式"
+                ],
+                "exact_matches": ["进入工厂模式"],
+                "has_param": False,
+                "param_regexp": "",
+                "require_full_match": True,
+                "negative_patterns": [],
+                "keyword_threshold": 0.8
+            },
+            {
+            
+                "command": "再见",
+                "patterns": [
+                    "再见","拜拜","我要走了"
+                ],
+                "exact_matches": [],
+                "has_param": False,
+                "param_regexp": "",
+                "require_full_match": False,
+                "negative_patterns": [],
+                "keyword_threshold": 0.8
+            },
+            {
+            
+                "command": "查询信号",
+                "patterns": [
+                    "查询信号","信号怎样","信号是多少","信号怎么样"
+                ],
+                "exact_matches": [],
+                "has_param": False,
+                "param_regexp": "",
+                "require_full_match": False,
+                "negative_patterns": ["查询"],
+                "keyword_threshold": 0.8
+            },   
+            {
+            
+                "command": "查询卡号",
+                "patterns": [
+                    "查询卡号","卡号","iccid号","ICCID号"
+                ],
+                "exact_matches": [],
+                "has_param": False,
+                "param_regexp": "",
+                "require_full_match": False,
+                "negative_patterns": ["查询"],
+                "keyword_threshold": 0.8
+            },  
+            {
+            
+                "command": "查询设备号",
+                "patterns": [
+                    "设备号","查询设备号","查询IMEI号"
+                ],
+                "exact_matches": [],
+                "has_param": False,
+                "param_regexp": "",
+                "require_full_match": False,
+                "negative_patterns": ["查询"],
+                "keyword_threshold": 0.8
+            },
+            {
+                "command": "OTA升级",
+                "patterns": [
+                    "OTA升级"
+                ],
+                "exact_matches": ["OTA升级"],
+                "has_param": False,
+                "param_regexp": "",
+                "require_full_match": True,
+                "negative_patterns": [],
+                "keyword_threshold": 1
+            },    
+            {
+                "command": "查询服务器地址",
+                "patterns": [
+                    "查询服务器地址"
+                ],
+                "exact_matches": [],
+                "has_param": False,
+                "param_regexp": "",
+                "require_full_match": False,
+                "negative_patterns": ["查询"],
+                "keyword_threshold": 0.9
+            }   
+            ,    
+            {
+                "command": "切换对话模式",
+                "patterns": [
+                    "切换对话模式","切换兑换模式"
+                ],
+                "exact_matches": [],
+                "has_param": False,
+                "param_regexp": "",
+                "require_full_match": False,
+                "negative_patterns": [],
+                "keyword_threshold": 0.8
+            },  
+            {
+                "command": "查询版本",
+                "patterns": [
+                    "查询版本号","软件版本"
+                ],
+                "exact_matches": [],
+                "has_param": False,
+                "param_regexp": "",
+                "require_full_match": False,
+                "negative_patterns": ["查询"],
+                "keyword_threshold": 0.6
+            }, 
+        ]
+        if self.VC_TTS_volume == None:
+            self.VC_TTS_volume = 100
+        self.AI_audio_queue_thread_id = 0
+        self.AI_audio_queue_thread_lock = 0
+        self.AI_VC_send_data_queue_thread_id = 0
+        self.AI_VC_send_data_queue_thread_lock = 0
+        self.AI_ASR_send_data_queue_thread_id = 0
+        self.AI_ASR_send_data_queue_thread_lock = 0
+        self.AI_record_tmp_queue = Queue(100)
+        self.AI_ASR_send_data_queue = Queue(200)
+        self.AI_VC_send_data_queue = Queue(100)
+        self.AI_audio_queue = Queue(100)
+        #self.AI_WS_connect_Queue = Queue(100) #释放用
+        self.AI_TTS_str = ""
+        self.AI_ASR_str = ""
+        self.AI_ASR_flag = 0
+        self.AI_ASR_str_tmp = ""
+        self.AI_ASR_send_buf_len = 0
+        self.AI_ASR_text_tmp = ""
+        self.AI_ASR_text_repet_count = 0
+        # #开始线程
+        # if self.AI_audio_queue_thread_id ==0:
+        #     self.AI_audio_queue_thread_id = _thread.start_new_thread(self.AI_audio_queue_thread, ())
+        # else:
+        #     print("AI_VC_start :AI_audio_queue_thread_id != 0 ")
+        # if self.AI_VC_send_data_queue_thread_id == 0:    
+        #     self.AI_VC_send_data_queue_thread_id = _thread.start_new_thread(self.AI_VC_send_data_queue_thread, ())
+            
+        self.VC_state = VC_State_None #阿里ai VC状态
+        self.VC_dialog_id = ""#
+        self.VC_message_id=None
+        self.VC_task_id =None
+        self.AI_client_VC = None
+        self.AI_client_VC_recv_id = 0
+        self.AI_client_VC_recv_lock = 0
+        self.AI_client_VC_isconnect =0
+        self.AI_client_VC_debug =0
+
+        self.asr_state = VC_State_None #阿里VC_ASR VC状态
+        self.key_state = 0
+
+        self.AI_client_asr = None
+        self.AI_client_asr_recv_id = 0
+        self.AI_client_asr_recv_lock = 0
+        self.AI_client_asr_isconnect =0
+        self.AI_ASR_timer =  osTimer()
+        self.AI_ASR_timer_count = 0
+        self.AI_client_asr_debug =0
+        self.AI_ASR_check_timeout = 0
+        self.AI_ASR_error_timeout = 0
+        self.VC_Thinking_timerout = 0
+
+        self.record_pcm = None
+        self.play_pcm = None
+        self.VC_record_thread_id = 0
+        self.VC_record_thread_lock = 0
+        self.VC_pingping_timerout = 0
+        self.asr_pingping_timerout = 0
+        self.factory_timer = osTimer()
+        self._1S_timer = osTimer()
+        self.Audio_buf_size = 16*1024
+        self.record = audio.Record()
+        #self.record.end_callback(self.record_callback)
+        self.record.gain_set(4,10)
+        #self.record.gain_set(4,12)
+        self.aud = audio.Audio(0)
+        self.aud.setCallback(self.audio_cb)
+        #self.aud.setVolume(self.VC_TTS_volume //10)
+        self.audio_play_state = 1 #音频播放完状态
+        self.close_timerout = 0
+        self.LocalRespondingEnded_timerout = 0
+
+        self.VC_Play_flag = 0
+        self.play_flag = 0
+        self.VC_record_state_flag = 0
+        self.AI_key_long_press_flag = 0
+        self.websocket_error_count = 0
+
+        self.tts_in_data_len = 0
+        self.tts_out_data_len = 0
+        self.VC_satrt_flag = 0
+        self.session_id = ""
+        EventMesh.subscribe("AI_key_press", self.AI_key_press)
+        EventMesh.subscribe("AI_key_release", self.AI_key_release)
+        EventMesh.subscribe("AI_key_long_press", self.AI_key_long_press)
+        EventMesh.subscribe("pwk_key_release", self.pwk_key_release)
+        EventMesh.subscribe("get_AI_audio_queue", self.get_AI_audio_queue)
+        EventMesh.subscribe("get_VC_satrt_flag", self.get_VC_satrt_flag)
+        EventMesh.subscribe("VC_error", self.VC_error)
+        EventMesh.subscribe("audio_test", self.audio_test)
+        EventMesh.subscribe("audio_test_close", self.audio_test_close)
+        EventMesh.subscribe("set_record_data_save_flag", self.set_record_data_save_flag)
+        EventMesh.publish("close_led")
+        self.dialog_attributes_provider =  EventMesh.publish("get_storage_config","dialog_attributes_provider")#智能体类型配置
+        if self.dialog_attributes_provider == None:
+            self.dialog_attributes_provider = "coze"
+        self.outbound_attributess_provider = EventMesh.publish("get_storage_config","outbound_attributess_provider")#tts服务选择
+        if self.outbound_attributess_provider == None:
+            self.outbound_attributess_provider = "volcengine"
+        self.inbound_attributess_provider = EventMesh.publish("get_storage_config","inbound_attributess_provider")#tts服务选择
+        if self.inbound_attributess_provider == None:
+            if  dev_type == "7PIN" or  dev_type == "7PIN_coze" :
+                self.inbound_attributess_provider = "xun-fei"
+            else:
+                self.inbound_attributess_provider = "volcengine"
+        self.bot_name = "柒先生"
+        try:
+            if "bot_name" in self.VC_TTS_voice_type[self.VC_TTS_voice_key]:
+                self.bot_name = self.VC_TTS_voice_type[self.VC_TTS_voice_key]["bot_name"]
+            else:
+                print("not bot_name!!!!!!!!!!!!!!!!!!!!!!")
+        except Exception as e:
+            usys.print_exception(e)
+        try:
+            if self.ai_OTA.min_sys_ota()==1:
+            #if 0:    
+                self.AI_TTS_str = "检测到有新版本需要升级啦!升级时可千万别断电或乱按哦,升级完成后设备会自动重启,重启就代表升级成功"
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+            # if self.ai_OTA.min_sys_ota()==2:
+            #     self.AI_TTS_str = "检测到有新版本需要升级啦!电量低于40%,无法保证升级正常执行,请充满电后重启设备再次升级!"
+            #     EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+            else:
+                try:
+                    self.ai_OTA.ota_result()
+                    self.ai_OTA.pots_ICCID()
+                except Exception as e:
+                    usys.print_exception(e)
+                #开机提示语,如果联网失败,直接提示信号弱
+                
+                
+                #EventMesh.publish("get_storage_config",["powerRestart",1])
+                powerRestart =  EventMesh.publish("get_storage_config","powerRestart")#=1非正常重启
+                if powerRestart == None:
+                    powerRestart = 0
+                if powerRestart == 1:
+                    EventMesh.publish("set_storage_config",["powerRestart",0])
+                    
+                else:
+                    pass
+                    self.AI_TTS_str = self.power_on_tone.replace("bot_name", self.bot_name)
+                    print("开机提示:{}".format(self.AI_TTS_str))
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                
+                
+
+        except Exception as e:
+            usys.print_exception(e)
+
+    def audio_test(self,event = None, msg = None):
+        self.VC_Speech_Start()   
+        self.VC_Play_Start()      
+    def audio_test_close(self,event = None, msg = None):
+        self.VC_Speech_End()   
+        self.VC_Play_End()    
+        if self.record_data_save_flag == 1:
+            if self.record_fd :
+                self.record_fd.close()
+            self.record_fd = None
+    def set_record_data_save_flag(self,event = None, msg = None):
+        self.record_data_save_flag = msg
+    def post_processor_after_instantiation(self):
+        pass
+    def get_AI_audio_queue(self, event, msg):
+        return self.AI_audio_queue
+    def get_VC_satrt_flag(self, event, msg):
+        return self.VC_satrt_flag
+
+
+    def VC_30S_timer_cb(self, *args): #
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_30S_timer_cb_}) 
+
+    def VC_30S_timer_cb_(self):    
+        self.get_config_timer_count += 1
+        if self.get_config_timer_count >= 2*60*2:#2小时更新配置参数
+            self.get_config_timer_count = 0
+            try:
+                self.http_get_config()#获取/更新配置参数
+            except Exception as e:
+                usys.print_exception(e)
+    #提交错误id           
+    def ud_error(self,error_data):
+        response = None
+        if self.is_up_error == 1:
+            try:
+                # currentVersion = versions.Build_Time
+                # currentVersion = "7PIN-"+currentVersion[:10]+"-"+currentVersion[11:-3]
+                url = "http://{}/health?task_id={}".format(self.server_ip,error_data[0]+error_data[1])
+                print(url)
+                response = request.get(url,timeout=5)
+                if response.status_code == 200:
+
+                    print("ud_error:ok")
+                else:
+                    print("ud_error  error!!!!")
+                    for i in response.text:
+                        print(i)
+                response.close()
+            except Exception as e:
+                usys.print_exception(e)
+                if response != None:
+                    response.close()
+    #获取配置参数
+    def http_get_config(self, event=None, msg=None):
+        print("http_get_config")
+
+        response = None
+        #http://180.184.206.142/bz-api/dev/config?deviceId=xxx
+        try:
+            url=None
+            if dev_type == "7PIN_BK_EU":#英文小瑞
+                url = "http://dmp-global.raisound.com/bz-api/dev/config/{}".format(modem.getDevImei())
+            elif dev_type == "7PIN" or dev_type == "7PIN_coze":#柒牌
+                url = "http://ota.qipai.com/bz-cmp-api/api/config/{}".format(modem.getDevImei())
+            else:
+                url = "http://dmp.raisound.com/bz-api/dev/config/{}".format(modem.getDevImei())
+                
+                
+            print(url)
+            response = request.get(url,timeout=5)
+            if response.status_code == 200:
+                data = response.json()
+                print("http_get_config:{}".format(data))
+                
+                if data:
+                    try:
+                        if data["code"] == 20000:#有配置
+                            if data["data"] :
+                                if "version" in data["data"]:
+                                    config_version = EventMesh.publish("get_storage_config","config_version")#音量配置
+                                    if config_version != data["data"]["version"]:
+                                        config_version = data["data"]["version"]
+                                        EventMesh.publish("set_storage_config",["config_version",config_version])
+                                        if "VC_TTS_voice_type" in data["data"]:
+                                            self.VC_TTS_voice_type = data["data"]["VC_TTS_voice_type"]
+                                            EventMesh.publish("set_storage_config",["VC_TTS_voice_type",self.VC_TTS_voice_type])
+                                            print("配置VC_TTS_voice_type成功")
+                                        if "server_ip" in data["data"]:
+                                            self.server_ip = data["data"]["server_ip"]
+                                            EventMesh.publish("set_storage_config",["server_ip",self.server_ip])
+                                            print("配置server_ip成功")
+                                        if "power_on_tone" in data["data"]:
+                                            self.power_on_tone = data["data"]["power_on_tone"]
+                                            EventMesh.publish("set_storage_config",["power_on_tone",self.power_on_tone])
+                                            print("配置power_on_tone成功")
+                                        if "dialog_attributes_provider" in data["data"]:
+                                            self.dialog_attributes_provider = data["data"]["dialog_attributes_provider"]
+                                            EventMesh.publish("set_storage_config",["dialog_attributes_provider",self.dialog_attributes_provider])
+                                        if "outbound_attributess_provider" in data["data"]:
+                                            self.outbound_attributess_provider = data["data"]["outbound_attributess_provider"]
+                                            EventMesh.publish("set_storage_config",["outbound_attributess_provider",self.outbound_attributess_provider])
+                                        if "inbound_attributess_provider" in data["data"]:
+                                            self.inbound_attributess_provider = data["data"]["inbound_attributess_provider"]
+                                            EventMesh.publish("set_storage_config",["inbound_attributess_provider",self.inbound_attributess_provider])
+                    except Exception as e:
+                            usys.print_exception(e)
+            else:
+                print("status_code:{}".format(response.status_code))
+                print("http_get_config:error!!!!!!!!!!")
+            response.close()
+        except Exception as e:
+            usys.print_exception(e)
+            if response != None:
+                response.close()
+
+    def audio_cb(self,event):
+        if event == 0:
+            self.audio_play_state =1
+            #EventMesh.publish("set_audio_state", 1)
+            print('audio-play start.')
+        elif event == 7:
+            self.audio_play_state = 0
+            #EventMesh.publish("set_audio_state", 0)   
+            print('audio-play finish.!!!!!!')
+
+    def AI_key_press(self, event, msg):#按键按下
+        print("AI_key_press")
+        self.get_config_timer_count = 0
+        self.key_state = 1
+        self.Close()
+        # if dev_type == "7PIN" :
+        #     self.aud.aud_tone_play(10,200)#播放按键音
+        #self.aud.aud_tone_play(10,200)#播放按键音
+        self.AI_TTS_str = ""#"你好,有什么吩咐"
+        self.AI_ASR_str = ""
+        self.AI_ASR_str_tmp = ""
+        self.VC_state = VC_State_None
+        # if self.VC_state != VC_State_None:
+        #     EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+        #     EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(10)})
+        #if self.VC_record_state_flag >1:#如果在录音,就先停止录音
+        self.VC_Speech_End()
+
+        self.VC_Speech_Start()    
+        self.AI_VC_start() 
+        # if dev_type != "7PIN":
+        #     self.chenggong_tone()
+        # self.Close()
+        # self.AI_VC_start()
+        self.AI_key_long_press_flag = 0
+        
+
+    def AI_key_release(self, event, msg):#按键弹起
+        print("AI_key_release123")
+        self.key_state = 0
+        if self.AI_key_long_press_flag == 1 :#有长按
+            #self.AI_client_VC_end_speech()
+            #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(1000)})
+            #EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_asr_StopTranscription_requset})
+            #self.AI_client_asr_StopTranscription_requset()#请求停止
+            if self.VC_mode == 1 :#长按单次问答模式
+                # if self.AI_ASR_str_tmp != "":
+                print("AI_key_release:asr_str:{}".format(self.AI_ASR_str))  
+                #     EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start})
+                self.AI_client_VC_end_speech()
+                pass
+            
+        else :
+            if self.VC_mode == 1 :#长按单次问答模式
+                # try:
+                #     EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+                # except Exception as e:
+                #     usys.print_exception(e)
+                #EventMesh.publish("publish_AI_btnInfo",{"func":self.key_prompt})  #提示请您按住中间的按钮开始讲话,讲完松开即可   
+                if dev_type == "7PIN_BK_EU":
+                    self.AI_TTS_str = "Please press and hold the button to speak. "
+                else:
+                    self.AI_TTS_str = "请您按住中间的按钮开始讲话,讲完松开即可 "
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start})
+                pass
+                
+                #self.VC_Speech_End()
+    def AI_key_long_press(self, event, msg):#按键长按
+        print("AI_key_long_press")
+        if dev_type == 'jswm' or dev_type == 'jswm_BOX'  :
+            self.Close()
+        else:
+            self.AI_key_long_press_flag = 1
+
+    def pwk_key_release(self, event, msg):#电源键短按,关闭
+        print("pwk_key_release")
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+
+    def key_prompt(self):
+        EventMesh.publish("audio_montage_play",["key_prompt.mp3"])
+        #self.aud.play(1,1,'U:/static/key_prompt.mp3')#提示请您按住中间的按钮开始讲话,讲完松开即可
+    def VC_error(self, event, msg):#错误播报
+        self.websocket_error()
+        #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error}) 
+    def set_VC_record_state_flag(self,data):
+        
+        self.VC_record_state_flag = data
+        print("set_VC_record_state_flag:{}".format(self.VC_record_state_flag))
+    #开始录音,不缓存,直接发
+    def VC_Speech_Start_now(self):
+        self.VC_Speech_Start()
+        if self.VC_record_state_flag  == 1:
+            self.VC_record_state_flag =2
+        print("VC_Speech_Start_now:{}".format(self.VC_record_state_flag))
+    #开始录音,先缓存到buf,等服务器响应再发
+    def VC_Speech_Start(self):
+        try:
+            
+            #self.VC_state =  VC_State_SpeechStart
+            print("VC_Speech_Start VC_record_state_flag:{} self.AI_ASR_flag:{}!!!!!!!!".format(self.VC_record_state_flag,self.AI_ASR_flag))  
+            if self.AI_ASR_flag  != 0:
+                return
+            
+            if self.VC_record_state_flag  == 0:
+                
+                self.VC_record_thread_close()#关闭录音线程
+                _thread.stack_size(self.Audio_buf_size+8*1024)
+                self.VC_record_thread_id = _thread.start_new_thread(self.VC_record_thread,())
+                _thread.stack_size(8*1024)
+                print("self.VC_record_thread_id:{}".format(self.VC_record_thread_id))
+                try:
+                    
+                    if self.VC_record_TYPE == VC_record_TYPE_AMR :
+                        try :
+                            self.record.stream_start(audio.Record.AMRNB, self.VC_record_samplerate, 0)
+                        except Exception as e:
+                                usys.print_exception(e)
+                    elif self.VC_record_TYPE == VC_record_TYPE_PCM:
+                        print("record_pcm.stream_read_start()!!!!!!!!!!!!")
+                        self.record.stream_start(audio.Record.WAV, self.VC_record_samplerate, 0)
+                        # if self.record_pcm != None:
+                        #     try:
+                        #         self.record_pcm.stream_stop()
+                        #         self.record_pcm.close()
+                        #         self.record_pcm = None
+                        #     except Exception as e:
+                        #         usys.print_exception(e)
+                        # if self.record_pcm == None:        
+                        #     ret = self.record_pcm = audio.Audio.PCM(0,1,16000,0,1,2)
+                        #     print("audio.Audio.PCM:ret:{}".format(ret))
+                        #     ret = self.record_pcm.stream_read_start()
+                        #     print("self.record_pcm.stream_read_start:ret:{}".format(ret))
+                except Exception as e:
+                    usys.print_exception(e) 
+                
+                self.VC_record_state_flag = 1
+                
+        except Exception as e:
+            self.websocket_error()
+            self.VC_record_state_flag = 1
+            self.VC_Speech_End()#关闭录音
+            usys.print_exception(e)   
+    #停止录音
+    def VC_Speech_End(self):
+        try:
+            self.AI_ASR_flag = 0
+            self.AI_ASR_str_tmp = ""
+            self.AI_ASR_str = ""
+            #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_asr})
+              
+            if self.VC_record_state_flag == 0:
+                return
+            #self.AI_client_asr_StopTranscription_requset()#请求停止
+            if self.VC_record_TYPE == VC_record_TYPE_AMR:
+                self.record.stream_stop()
+                self.record.stop()#关闭录音
+                Record_read_buf = bytearray(self.Audio_buf_size)
+                for i in range(10):
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)
+                    print("Record_len:!!!!!!{}".format(Record_len))
+                    if Record_len <= 0:
+                        break
+            elif self.VC_record_TYPE == VC_record_TYPE_PCM:
+                self.record.stream_stop()
+                self.record.stop()#关闭录音
+                Record_read_buf = bytearray(self.Audio_buf_size)
+                for i in range(10):
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)
+                    print("Record_len:!!!!!!{}".format(Record_len))
+                    if Record_len <= 0:
+                        break
+                # if self.record_pcm != None:
+                #     try:
+                #         self.record_pcm.stream_stop()
+                #         self.record_pcm.close()
+                #         self.record_pcm = None
+                #     except Exception as e:
+                #         usys.print_exception(e)
+        except Exception as e:
+            usys.print_exception(e)
+        self.VC_record_thread_close()#关闭录音线程
+        if self.AI_record_tmp_queue.empty() != True:
+            self.AI_record_tmp_queue.clear()
+        
+        self.VC_record_state_flag = 0
+        print("VC_Speech_End VC_record_state_flag:{}!!!!!!!!".format(self.VC_record_state_flag))   
+    #关闭录音线程   
+    def VC_record_thread_close(self): 
+        if self.VC_record_thread_id != 0:
+            count =50
+            while True:
+                count -= 1
+                if self.VC_record_thread_lock == 1:
+                    self.VC_record_thread_lock = 2
+                if self.VC_record_thread_lock == 0 or count <=0:
+                    break
+                else:
+                    print("VC_record_thread_thread going:{}...".format(count))
+                    utime.sleep_ms(1)
+            self.VC_record_thread_lock = 0
+            print("VC_record_thread_thread_close")
+            try:
+                _thread.stop_thread(self.VC_record_thread_id)
+            except Exception as e:
+                usys.print_exception(e)
+        self.VC_record_thread_id = 0
+    #获取录音数据
+    def VC_record_thread(self):
+        ##return
+        print("VC_record_thread start!!!!!!!!!!!!!!!!!!!!\r\n")
+        count = 0
+        RequestToSpeak_flag = 0
+        # try:
+        #     uos.remove('/usr/test.pcm')
+        # except Exception as e:
+        #     usys.print_exception(e)
+        #record_data_queue = Queue(100)
+        #fd = open('/usr/test.pcm','w')
+        # if self.VC_record_TYPE == 1:
+        #     h_data= [0x23,0x21 ,0x41 ,0x4D ,0x52 ,0x0A ]
+        #     h_data_b = bytes(h_data)
+        #     self.AI_client_VC_send(h_data_b)
+        AI_record_tmp_queue_len = 0
+        vad_buf = bytearray()
+        VAD_data_count = 0
+        vad_state = 0
+        self.VAD_count = 0
+        while True:
+            try:
+                if self.VC_record_thread_lock == 2:
+                    break
+                self.VC_record_thread_lock = 1
+                # 死循环接收数据
+                #if self.VC_state ==  VC_State_SpeechStart:
+                Record_read_buf = bytearray(self.Audio_buf_size)
+                
+                Record_len = 0
+                if self.VC_record_TYPE == VC_record_TYPE_PCM:#pcm
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)
+                    #utime.sleep_ms(60)
+                    
+                else :
+                    
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)
+                    utime.sleep_ms(600)
+
+                #Record_len = 1024*2
+                #print("VC_record_thread:{}".format(Record_len))
+                if Record_len > 0:
+                    read_buf = bytes(Record_read_buf[:Record_len])
+                    print("Record_len:{}".format(Record_len))
+                    #VAD检测
+                    if self.is_VAD == 1:
+                        vad_state = 0
+                        tmp_c = 1000
+                        while True:
+                            tmp_c -=1
+                            if tmp_c <=0:
+                                break
+                            #vad_buf_len = len(vad_buf)
+                            if VAD_data_count == 0:#没数据的时候
+                                vad_buf = Record_read_buf[:self.VAD_data_len]
+                                VAD_data_count = self.VAD_data_len
+                                self.vad.custom_vad_reset()#重置vad
+                            else:#有数据的时候
+                                if Record_len - VAD_data_count < self.VAD_data_len :#剩余长度不够一次填充,先保留,但不填算法
+                                    vad_buf = Record_read_buf[VAD_data_count:Record_len]
+                                    VAD_data_count = 0
+                                    break
+                                else:#剩余长度够填一次数据
+                                    vad_buf = Record_read_buf[VAD_data_count:VAD_data_count+self.VAD_data_len]
+                                    VAD_data_count += len(vad_buf)
+                            #print("vad_buf_len:{},{}".format(len(vad_buf),VAD_data_count))
+                            
+                            if len(vad_buf) >= self.VAD_data_len:
+                                vad_state = self.vad.custom_vad_process(vad_buf,len(vad_buf))#给vad数据
+                                #print("vad_state:{}".format(vad_state))
+                                
+                            if VAD_data_count >= Record_len:
+                                VAD_data_count = 0
+                                break
+                            if vad_state == 1:
+                                print("检测到VAD=1!!!!!!!!!!!!!")
+                                print("检测到VAD=1!!!!!!!!!!!!!")
+                                print("检测到VAD=1!!!!!!!!!!!!!")
+                                
+                                EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Play_Pause,"data":1})#停止音频
+                                # EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_RequestToSpeak})#打断
+                                # RequestToSpeak_flag = 1
+                                
+                                self.VAD_count+=1
+                                if self.VAD_count >= 20: 
+                                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_RequestToSpeak})#打断
+                                        
+                            else:
+                                if self.VAD_count != 0:
+                                    EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Play_Pause,"data":0})#恢复音频播放
+                                self.VAD_count  = 0
+                    if self.VC_state >= VC_State_TTSStart:
+                        pass
+                        if vad_state == 1:
+                            self.AI_record_tmp_queue.put(read_buf)#入缓存队列
+                            AI_record_tmp_queue_len += len(read_buf)
+                            
+                       
+                    else:
+                        VAD_data_count = 0
+                        if self.VC_record_state_flag <=1 :#没发送前先存起来
+                            self.AI_record_tmp_queue.put(read_buf)
+                            AI_record_tmp_queue_len += len(read_buf)
+                        else:
+                            AI_record_tmp_queue_len = 0
+                            while True:
+                                if self.AI_record_tmp_queue.empty() == True:
+                                    break
+                                else:
+                                    pass
+                                    self.AI_client_VC_send(self.AI_record_tmp_queue.get())  #发送之前存的数据
+                            self.AI_client_VC_send(read_buf)   
+                    
+                    if self.record_data_save_flag == 1:
+                        if self.record_fd == None:
+                            try:
+                                uos.remove('/usr/record_data.pcm')
+                            except Exception as e:
+                                usys.print_exception(e)
+                            self.record_fd = open('/usr/record_data.pcm','w')
+                        if self.record_fd != None:
+                            self.record_fd.write(read_buf)
+                            print("write record:{}".format(len(read_buf)))
+                            # count+=Record_len
+                            # if count >150*1024:
+                            #     self.record_fd.close()
+                                #self.record_fd = None
+
+                    
+                    
+
+                    #print("VC_record_thread:{}".format(len(read_buf)))
+                    #count+=len(read_buf)
+                # if count>=500*1024:#结束
+                #     self.AI_client_VC_end_speech()
+                #     break
+                # count+=1
+                # if count %10 == 0:
+                #     print("VC_record_thread on line {} asr recv :{} send:{}".format(self.VC_record_state_flag,_thread.threadIsRunning(self.AI_client_asr_recv_id),_thread.threadIsRunning(self.AI_VC_send_data_queue_thread_id)))
+                
+                # if self.VC_state >=  VC_State_SpeechEnd:
+                #     break
+                
+            except Exception as e:
+                    usys.print_exception(e)
+                    #break
+            self.VC_record_thread_lock = 0
+            utime.sleep_ms(100)
+        #fd.close()
+        print("VC_record_thread:exit")
+        self.VC_record_thread_id = 0#线程退出
+        self.VC_record_thread_lock = 0
+###################################################### VC ###################################################################################
+    def websocket_connect_VC(self):
+        print("websocket_connect_VC:{} e:{}!!!!!!!!!!!!!!!!!!!!!".format(self.AI_client_VC_isconnect,self.AI_client_VC_debug))
+        if self.AI_client_VC_isconnect == 1:
+            return
+        # 创建VC客户端
+        try:
+            signal = net.csqQueryPoll()
+            if signal == -1 or sim.getStatus() != 1:#网络正常
+                self.websocket_error()
+                return
+            
+            req_str = ""
+            ack = ""
+            if self.is_VC_ACK == 1:
+                ack = "ack=1"
+            lang = "lang=zh-cn"#普通话测试环境
+            try:
+                if "loang" in self.VC_TTS_voice_type[self.VC_TTS_voice_key]:
+                    lang = self.VC_TTS_voice_type[self.VC_TTS_voice_key]["lang"]
+                else:
+                    print("not lang!!!!!!!!!!!!!!!!!!!!!!")
+            except Exception as e:
+                usys.print_exception(e)
+            
+            #女,男,童,粤,川
+            self.bot_name = "柒先生"
+            try:
+                if "bot_name" in self.VC_TTS_voice_type[self.VC_TTS_voice_key]:
+                    self.bot_name = self.VC_TTS_voice_type[self.VC_TTS_voice_key]["bot_name"]
+                else:
+                    print("not bot_name!!!!!!!!!!!!!!!!!!!!!!")
+            except Exception as e:
+                usys.print_exception(e)
+            
+            # Headers = {'X-NLS-Token':'0c8b8f05a46f423096be64a9c4c46310'}
+            # self.AI_client_VC = uwebsocket.Client.connect('wss://nls-gateway-cn-beijing.aliyuncs.com/ws/v1',headers=Headers, debug=False)
+            token = EventMesh.publish("get_dev_token")
+            print("token:{}".format(token))
+            
+            req_str = "vc/chat?is_auth={}".format(self.is_auth)
+            if dev_type == '7PIN_BK_coze' or dev_type == '7PIN_coze':
+                req_str = "vc/coze?is_auth={}".format(self.is_auth)
+            elif dev_type == 'jswm' or dev_type == 'jswm_BOX':
+                req_str = "vc/agent?is_auth={}".format(self.is_auth)
+
+            if(token):
+                url = 'ws://{}/{}&dt={}'.format(self.server_ip,req_str,token)
+            else:
+                url = 'ws://{}/{}'.format(self.server_ip,req_str)
+            #url = 'ws://115.190.94.208:22080/vc/coze?dt={}'.format(token)
+            
+            print("VC VC:url{}".format(url))
+            self.AI_client_VC = uwebsocket.Client.connect(url, debug=True)
+            #self.AI_WS_connect_Queue.put(self.AI_client_VC)
+
+       
+            print("websocket_connect_VC:OK!!!!!!!!!!!!!!!!!!!!!")
+        except Exception as e: #网络连接异常
+            usys.print_exception(e)
+            print("websocket_connect_VC error!!!\r\n")
+            str_error = str(e)
+            if str_error.find("[Errno 22] EINVAL")!= -1: 
+                print("websocket_connect_VC:str_error:{}".format(str_error))
+                print("[Errno 22] EINVAL!!!\r\n")
+                print("[Errno 22] EINVAL!!!\r\n")
+                print("[Errno 22] EINVAL!!!\r\n")
+                print("[Errno 22] EINVAL!!!\r\n")
+                self.websocket_error()
+                EventMesh.publish("set_storage_config",["powerRestart",1])#调试临时关闭
+                utime.sleep_ms(1000)
+                self.aud.stopPlayStream()
+                self.aud.stopAll()
+                Power.powerRestart()
+                
+            self.websocket_error()
+            return
+        #print("AI_client_VC:{}".format(self.AI_client_VC))
+        if self.AI_client_VC == None:
+            EventMesh.publish("update_dev_token")#获取token
+            self.websocket_error()
+            return
+        self.AI_client_VC_debug+=1
+        utime.sleep_ms(10)
+        self.AI_client_VC.settimeout(5)
+        #self.AI_VC_send_data_queue_thread_close()#关闭发送线程
+        if self.AI_VC_send_data_queue_thread_id == 0:    
+            _thread.stack_size(self.Audio_buf_size+8*1024)
+            self.AI_VC_send_data_queue_thread_id = _thread.start_new_thread(self.AI_VC_send_data_queue_thread, ())
+            _thread.stack_size(8*1024)
+            print("AI_VC_start :AI_VC_send_data_queue_thread_id :{} ".format(self.AI_VC_send_data_queue_thread_id))
+        self.AI_client_VC_recv_thread_close()#关闭读线程
+        # 线程接收数据
+        _thread.stack_size(self.Audio_buf_size+8*1024)
+        self.AI_client_VC_recv_id = _thread.start_new_thread(self.AI_client_VC_recv, (self.AI_client_VC,))
+        _thread.stack_size(8*1024)
+        self.AI_client_VC_isconnect = 1
+        print("websocket_connect_VC end")
+
+    def websocket_error(self,TTS_str=None):
+        print("websocket_error1!!!!")
+        self.Close()
+        print("websocket_error1.1!!!!")
+        print("websocket_error!!!!")
+        print("websocket_error!!!!")
+        self.VC_Thinking_timerout = 0
+        self.VC_satrt_flag = 0
+        self.AI_TTS_str = ""
+        self.AI_ASR_str = ""
+        self.AI_ASR_str_tmp = ""
+        self.AI_ASR_flag  = 0
+        self.VC_Speech_End()
+        EventMesh.publish("close_led")
+        if TTS_str == None:
+            self.websocket_error_count+=1
+            # if self.websocket_error_count <=3:
+            #     EventMesh.publish("audio_montage_play",["xinhaoruo1.mp3"])
+            if self.websocket_error_count <10 :
+                EventMesh.publish("audio_montage_play",["xinhaoruo1.mp3"])
+            elif self.websocket_error_count >=10:
+                EventMesh.publish("paly_iccid_imei")    
+            # else:
+            #     EventMesh.publish("audio_montage_play",["R_SIM_FAILE.mp3"])
+            #self.aud.play(1,1,'U:/static/R_SIM_FAILE.mp3')
+            if self.websocket_error_count <3 :
+                utime.sleep_ms(3000)
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start})
+        else:
+            print("websocket_error:tts:{}".format(TTS_str))
+            self.AI_TTS_str = TTS_str
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start})
+            self.Close_flag = 1
+        print("websocket_error2")
+       
+        
+        print("websocket_error4")
+        
+
+    def websocket_deconnect_VC(self):
+        #print("websocket_deconnect_VC {}!!!!!!!".format(self.AI_client_VC_isconnect))
+        print("websocket_deconnect_VC!!!!!!!")
+        self.AI_client_VC_recv_thread_close()#关闭读线程
+        self.AI_client_VC_recv_id = 0
+        if self.AI_client_VC_isconnect == 1 or self.AI_client_VC!=None:
+            try:
+                self.AI_client_VC_isconnect = 0
+                count = 500
+                while True:#等待发完数据
+                    count-=1
+                    if count <=0 or self.AI_VC_send_data_queue_thread_lock == 0:
+                        break
+                    utime.sleep_ms(1)
+                
+                try:
+                    self.AI_client_VC.close()
+                    self.AI_client_VC_debug -=1
+                    #self.AI_client_VC=None
+                except Exception as e:
+                    usys.print_exception(e)
+                    try :
+                        self.AI_client_VC.close()
+                        self.AI_client_VC_debug -=1
+                        #self.AI_client_VC=None
+                    except Exception as e:
+                        usys.print_exception(e)
+                try :
+                    self.AI_client_VC._close()
+                except Exception as e:
+                    usys.print_exception(e)
+                self.AI_client_VC = None
+            except Exception as e:
+                usys.print_exception(e)
+        print("websocket_deconnect_VC {}!!!!!!!".format(self.AI_client_VC_isconnect))
+    #websocket发送ping
+    def AI_client_VC_ping(self):
+        pass
+        if self.AI_client_VC_isconnect == 1:
+            #self.AI_client_VC.write_frame(0x09,b'ping ping')
+            self.AI_client_VC_send("ping")
+            print("VC: ping ping")
+
+    #websocket发送数据    
+    def AI_client_VC_send(self,data_str):
+        # if isinstance(data_str, str):#是字符串
+        #     print("AI_client_VC_send:{}".format(data_str))
+        #     pass
+        # else:
+        #     print("AI_client_VC_send:len{}".format(len(data_str)))
+        self.AI_VC_send_data_queue.put([AI_client_VC_num,data_str]) 
+     #关闭数据发送线程
+    def AI_VC_send_data_queue_thread_close(self):
+        if self.AI_VC_send_data_queue_thread_id != 0:
+            count =500
+            while True:
+                count -= 1
+                if self.AI_VC_send_data_queue_thread_lock == 0 or count <=0:
+                    break
+                else:
+                    self.AI_VC_send_data_queue_thread_lock = 2
+                    print("AI_VC_send_data_queue_thread going:{}...".format(count))
+                    utime.sleep_ms(1)
+                    if self.AI_VC_send_data_queue.empty()!=True:
+                        self.AI_VC_send_data_queue.clear()
+            self.AI_VC_send_data_queue_thread_lock = 0
+            print("AI_VC_send_data_queue_thread_close")
+            try:
+                _thread.stop_thread(self.AI_VC_send_data_queue_thread_id)
+            except Exception as e:
+                usys.print_exception(e)
+        self.AI_VC_send_data_queue_thread_id = 0
+    #发送数据队列
+    def AI_VC_send_data_queue_thread(self):
+        print("AI_VC_send_data_queue_thread:start")
+        count_t = 0
+        while True:
+            if self.AI_VC_send_data_queue_thread_lock == 2:
+                print("AI_VC_send_data_queue_thread,该退出了")
+                break  
+            if self.AI_VC_send_data_queue.empty() :#不能去掉,去掉会卡死
+                self.AI_VC_send_data_queue_thread_lock = 0  
+                count_t+=1
+                # if count_t%200 == 0:
+                #     print("self.AI_VC_send_data_queue.empty")
+                utime.sleep_ms(1)
+            else:
+                #data[0]是websocket连接对象编号,data[1]是数据
+                #print("AI_VC_send_data_queue_thread:get")
+                
+                self.AI_VC_send_data_queue_thread_lock = 1
+                data = self.AI_VC_send_data_queue.get()
+                
+                
+                #print("AI_VC_send_data_queue_thread:num{} len{}".format(data[0],len(data[1])))
+                if data != None:
+                    try:
+                        #data["func"](data["data"])
+                        # 发送数据
+                        #bytes_data = bytes(data[1])
+                        #data[0].send(data[1])
+                        #print("AI_VC_send_data_queue_thread:len:{}".format(len(data[1])))
+                        #print("AI_VC_send_data_queue_thread on line asr recv :{} vc recv:{}".format(_thread.threadIsRunning(self.AI_client_asr_recv_id),_thread.threadIsRunning(self.AI_client_VC_recv_id)))
+                        if data[0] == AI_client_VC_num:
+                            
+                            if isinstance(data[1], str):#是字符串
+                                self.VC_pingping_timerout = 0
+                                print("VC VC: send_data:{}".format(data[1]))
+                            else:
+                                print("VC: send_data len:{}".format(len(data[1])))
+                            if self.AI_client_VC != None and self.AI_client_VC_isconnect == 1:
+                                self.AI_client_VC.send(data[1])
+                            else:
+                                print("VC VC: send_data:ERROR:{}".format(len(data[1])))
+                            #print("VC: send_data end")
+    
+                        #print("VC: send_data end")
+                    except Exception as e:
+                        print("DeviceInfo_queue_thread:ERROR:{}".format(e))
+                        usys.print_exception(e)
+                        if data[0] == AI_client_VC_num:
+                            #self.websocket_error()
+                            pass
+
+                            
+                            try:
+                                if self.AI_client_VC_isconnect != 0:
+                                    print("VC发送数据错误,退出")
+                                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"VC发送出错了,请重试"}) 
+                                    self.ud_error(["VC",self.VC_taskid])
+                            except Exception as e: #网络连接异常
+                                usys.print_exception(e)
+
+                    utime.sleep_ms(1)
+        self.AI_VC_send_data_queue_thread_lock = 0              
+    #VC关闭读线程
+    def AI_client_VC_recv_thread_close(self):
+        if self.AI_client_VC_recv_id != 0:
+            count =500
+            while True:
+                count -= 1
+                if self.AI_client_VC_recv_lock == 1:
+                    self.AI_client_VC_recv_lock = 2
+                if self.AI_client_VC_recv_lock == 0 or count <=0:
+                    break
+                else:
+                    print("AI_client_VC_recv_thread going:{}...".format(count))
+                    utime.sleep_ms(1)
+            self.AI_client_VC_recv_lock = 0
+            print("AI_client_VC_recv_thread_close")
+            try:
+                _thread.stop_thread(self.AI_client_VC_recv_id)
+            except Exception as e:
+                usys.print_exception(e)
+        self.AI_client_VC_recv_id = 0
+    #Ai VC websocket返回数据       
+    def AI_client_VC_recv(self,cli):
+        count = 0
+        asr_led_flag = 0
+        tts_led_flag = 0
+        while True:
+            try:
+                # 死循环接收数据
+                self.AI_client_VC_recv_lock = 0
+
+                count+=1
+                if self.VC_state >= VC_State_TTSStart and (self.tts_in_data_len - self.tts_out_data_len > 64*1024 or count>5):
+                    count = 0
+                    utime.sleep_ms(1)
+                if self.VC_state < VC_State_TTSStart:
+                    utime.sleep_ms(1)
+                recv_data = cli.recv()
+                if self.AI_client_VC_recv_lock == 2:
+                    print("AI_client_VC_recv 该退出了")
+                    break
+                self.AI_client_VC_recv_lock = 1
+                self.close_timerout = 0#服务器有返回清零退出时间
+                if recv_data == "websocket close":
+                    # 服务器关闭连接
+                    print("VC 服务器关闭连接!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+                    #self.AI_client_VC_isconnect = 0
+                    #self.websocket_deconnect_VC()
+                    #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_asr}) 
+                    # #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(1500)})
+                    #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_connect_asr}) 
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"VC连接断开了,请重试"}) 
+                    self.ud_error(["VC",self.VC_taskid])
+                    break
+                elif recv_data == "":#客户端关闭连接
+                    print("VC VC :客户端关闭连接")
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"VC连接断开了,请重试"}) 
+                    self.ud_error(["VC",self.VC_taskid])
+                    break
+                try:
+                    self.websocket_error_count = 0
+                    if isinstance(recv_data, str):#返回的是字符串
+                        print("VC VC:recv_data:{}".format(recv_data))
+                        jsload_data =  ujson.loads(recv_data)
+                        #print("AI_client_VC_recv jsload_data = {}".format(jsload_data))
+                        
+                        if jsload_data["event"] == "started" :#会话开始
+                            #payload = jsload_data["payload"]
+                            # self.VC_dialog_id = payload["dialog_id"] 
+                            # self.VC_task_id = jsload_data["task_id"] 
+                            EventMesh.publish("open_led_blue")
+                            
+                            print("VC:Started!!!!!!!!\r\n")
+                            if self.AI_TTS_str == "":
+                                #开始上传语音
+                                if dev_type != "7PIN" and dev_type != "7PIN_coze":
+                                    self.chenggong_tone()
+                                if self.VC_mode == 0    :
+                                    self.VC_record_state_flag  =2
+                                else:
+                                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_send_speech})
+                                    
+                                
+                            else:
+                                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_synthesis})
+                            self.VC_state =  VC_State_None  
+                        elif jsload_data["event"] == "config.update" :#配置更新中,需要停止录音
+                            self.VC_state = VC_State_End
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})
+
+                        elif jsload_data["event"] == "asr.started" :#asr开始 
+                            self.VC_state =  VC_State_SpeechStart
+                            if self.VC_mode == 1    :
+                                self.VC_record_state_flag = 2
+                            EventMesh.publish("open_led_blue")
+                        elif jsload_data["event"] == "asr.result" :#asr结果
+                            self.AI_ASR_str = jsload_data["payload"]["content"]
+                            
+                            EventMesh.publish("open_led_blue")
+                        elif jsload_data["event"] == "asr.completed" :#asr 终止的标识 
+                            print("self.commands_mode:{}".format(self.commands_mode))
+                            if self.commands_mode ==2:
+                                ret= self.check_text(self.AI_ASR_str)
+                                if ret == 0:#配置指令
+                                            
+                                    if self.AI_VC_send_data_queue.empty()!=True:
+                                        self.AI_VC_send_data_queue.clear()
+                                    if self.AI_ASR_send_data_queue.empty()!=True:
+                                        self.AI_ASR_send_data_queue.clear()
+                                    self.AI_ASR_send_buf_len = 0
+                                    EventMesh.publish("open_led_all")
+                                    try:
+                                        
+                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})
+                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_VC}) 
+                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                                    except Exception as e:
+                                        usys.print_exception(e)
+                                    continue
+                                elif ret == 1:#不处理
+                                    pass    
+                            #self.VC_Speech_End()
+                            #EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})
+                            if self.record_data_save_flag == 1:
+                                if self.record_fd :
+                                    self.record_fd.close()
+                                self.record_fd = None
+                            # if dev_type != "7PIN" :
+                            #EventMesh.publish("publish_AI_btnInfo",{"func":self.send_tone}) 
+                        elif jsload_data["event"] == "vad.silence" :#VAD 终止的标识 
+                            pass
+                            #EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})
+                        elif jsload_data["event"] == "llm.created" :#会话开始
+                            EventMesh.publish("open_led_red_green")#
+                            self.VC_state = VC_State_Thinking
+                            # EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Play_Start})
+                            pass
+                        elif jsload_data["event"] == "llm.delta" :#llm返回数据
+                            if self.is_VAD == 0:
+                                if self.VC_record_state_flag == 1:#llm返回数据还没停止,就先停止
+                                    EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})
+                        elif jsload_data["event"] == "tts.started" :#tts开始
+                            self.VC_state = VC_State_TTSStart
+                            if self.is_VAD == 0:
+                                EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Play_Start})
+                            
+                            #self.VC_Play_Start()
+                            EventMesh.publish("open_led_green")#绿色
+                        elif jsload_data["event"] == "tts.completed" :#tts结束
+                            EventMesh.publish("open_led_green")#绿色
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Play_Start})
+                            self.LocalRespondingEnded_timerout = 8
+                            self.VC_state = VC_State_TTSEnd
+                            pass
+
+                        elif jsload_data["event"] == "canceled" :#打断
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_Start_now})#开始录音
+                            self.VC_state = VC_State_None
+                        elif jsload_data["event"] == "completed" :#会话结束
+                            #EventMesh.publish("open_led_green")#绿色
+                            
+                            self.LocalRespondingEnded_timerout = 8
+                            self.VC_state = VC_State_End
+                            pass
+                        elif jsload_data["event"] == "command" :#命令匹配
+                            ret = -1
+                            try:
+                                if self.commands_mode ==1:
+                                    if len(jsload_data["payload"]["functions"])>0:
+                                        
+                                        cmd = jsload_data["payload"]["functions"][0]["function"]["arguments"]
+                                        print("llm:cmd:{}".format(cmd))
+                                        cmd = ujson.loads(cmd)
+                                        ret = self.check_text_llm(cmd)
+                                elif self.commands_mode ==0:
+
+                                    cmd = jsload_data["payload"]
+                                    print("server:cmd:{}".format(cmd))
+                                    ret = self.check_text_server(cmd)
+                                else:
+                                    cmd = jsload_data["payload"]["functions"][0]["function"]["arguments"]
+                                    print("llm:cmd:{}".format(cmd))
+                                    cmd = ujson.loads(cmd)
+                                    ret = self.check_text_llm(cmd)
+                            except Exception as e:
+                                usys.print_exception(e)       
+                            if ret == -1:
+                                if self.AI_TTS_str  =="":
+                                    self.AI_TTS_str = "抱歉,没找到对应操作,可以换个说法试试" 
+                            #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(10)})
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_VC}) 
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                        elif jsload_data["event"] == "failed":#接口返回错误
+                            if jsload_data["payload"]["error"] == "concurrency_limit_exceeded":
+                                EventMesh.publish("publish_AI_btnInfo",{"func":self.concurrency_limit_exceeded_tone}) 
+                                
+                                #utime.sleep_ms(4000)
+                                
+                            else:
+                                EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":jsload_data["payload"]["message"]}) 
+                            pass
+                    else:#下发音频数据
+                        #self.AI_ASR_str = ""#下发音频后清掉asr结果
+                        
+                        
+                        EventMesh.publish("open_led_green")#绿色
+                        
+                        print("下发音频数据1:{}".format(len(recv_data)))
+                        
+                        if self.play_data_save_flag == 1:
+                            if self.play_fd ==None:
+                                try:
+                                    uos.remove('/usr/play_data.pcm')
+                                except Exception as e:
+                                    usys.print_exception(e)
+                                self.play_fd = open('/usr/play_data.pcm','w')
+                            if self.play_fd !=None:
+                                self.play_fd.write(recv_data)
+                        # print("下发音频数据2:{}".format(len(recv_data)))
+                        #if self.VC_state >= VC_State_TTSStart:
+                            #self.put_record_data([recv_data,""])
+                        if self.VC_play_TYPE == VC_play_TYPE_PCM:
+                            if self.play_pcm != None:
+                                try:
+                                    #print("play_pcm.stream_write !!!")
+                                    buf_len = self.play_pcm.stream_get_buf_len()
+                                    count_tmp = 1000
+                                    while buf_len < len(recv_data):
+                                        utime.sleep_ms(1)
+                                        count_tmp-=1
+                                        if count_tmp<=0 or self.play_pcm == None:
+                                            break
+                                        buf_len = self.play_pcm.stream_get_buf_len()
+                                    #print("buf已满,等待释放:buf_len:{},count_tmp:{}".format(buf_len,count_tmp))
+                                except Exception as e:
+                                    usys.print_exception(e)
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.put_record_data,"data":[recv_data,""]}) 
+                        utime.sleep_ms(1)
+                except Exception as e:
+                    usys.print_exception(e)
+                
+            except Exception as e:
+                    error_str = str(e)
+                    #print("VC VC:e:{}".format(error_str))
+                    if error_str.find("[Errno 110] ETIMEDOUT")!= -1 or error_str.find("[Errno 115] ")!= -1:
+                        print("VC VC:recv 正常报错:{}".format(error_str))
+                        pass
+                    else:
+                        usys.print_exception(e)
+                        #self.websocket_error()
+                        print("VC VC :读数据报错,退出")
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"VC出错了,请重试"}) 
+                        self.ud_error(["VC",self.VC_taskid])
+                        break
+        self.AI_client_VC_isconnect = 0
+        self.AI_client_VC_recv_id = 0 
+        self.AI_client_VC_recv_lock = 0
+        print("AI_client_VC_recv END!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+    
+    def put_record_data(self,data):
+        #print("下发音频数据1:{}".format(len(data[0])))
+        ret=self.AI_audio_queue.put(data)
+        self.tts_in_data_len += len(data[0])
+        #print("下发音频数据2:{},{}".format(len(data[0]),self.tts_in_data_len))
+    #msg[0]是tts播放字符串,msg[1]是是否关闭当前tts
+    def play_tts(self,event = None,msg= None):
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.play_tts_cb,"data":msg}) 
+        
+    def play_tts_cb(self,data):
+        try:
+            tts_str = data[0]
+            is_close_VC = data[1]
+            if tts_str != "":
+                self.AI_TTS_str = tts_str
+            if is_close_VC != None:
+                self.Close_flag = is_close_VC
+            if self.AI_VC_send_data_queue.empty()!=True:
+                self.AI_VC_send_data_queue.clear()
+            if self.AI_ASR_send_data_queue.empty()!=True:
+                self.AI_ASR_send_data_queue.clear()
+            EventMesh.publish("open_led_all")
+            self.AI_ASR_send_buf_len = 0
+            self.VC_Speech_End()
+            self.websocket_deconnect_VC()
+            self.AI_VC_start()
+            
+            # EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})
+            # EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_VC}) 
+            # EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+        except Exception as e:
+                usys.print_exception(e)   
+        pass
+    def check_text_server(self,cmd):
+        return -1
+        
+    def check_text_llm(self,cmd):
+        try:
+                text = cmd["command"]["chinese_description"]
+                if text.find("切换音色") != -1:
+                    text = cmd["command"]["params_json"]
+                    try:
+                        for key in self.VC_TTS_voice_type:
+                            if  text.find(key) != -1 :
+                                self.VC_TTS_voice_key = key
+                                EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                                self.AI_TTS_str = "了解,声音已切换" 
+                                return 0
+                    except Exception as e:
+                        usys.print_exception(e)    
+                    if  text.find("男") != -1 :
+                        if "男" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "男"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+
+                            self.AI_TTS_str = "了解,声音已切换" 
+                            return 0
+                    if text.find("女") != -1 :
+                        if "女" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "女"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+       
+                            self.AI_TTS_str = "了解,声音已切换" 
+                            return 0
+                    if text.find("同声") != -1 or text.find("童") != -1 :
+                        if "童" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "童"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+
+                            self.AI_TTS_str = "了解,声音已切换" 
+                            return 0
+                    if text.find("粤") != -1 or text.find("越野") != -1 or text.find("广东话") != -1:
+                        if "粤" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "粤"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+
+                            self.AI_TTS_str = "了解,声音已切换" 
+                            return 0
+                    if text.find("四川") != -1 :
+                        if "四川" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "四川"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+
+                            self.AI_TTS_str = "了解,声音已切换" 
+                            return 0
+                    if text.find("个性") != -1 :
+                        if "个性" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "个性"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+
+                            self.AI_TTS_str = "了解,声音已切换" 
+                            return 0
+                    if text.find("英语") != -1 :
+                        if "英语" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "英语"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+
+                            self.AI_TTS_str = "了解,声音已切换" 
+                            return 0
+                    self.AI_TTS_str = "很抱歉,没找到对应声音" 
+                    return 0
+                if text.find("切换对话模式") != -1:
+                    if self.VC_mode == 0:
+                       self.VC_mode = 1
+                       self.AI_TTS_str = "了解,已切换到单对话模式" 
+                    else:
+                        self.VC_mode = 0 
+                        self.AI_TTS_str = "了解,已切换到长对话模式" 
+                    EventMesh.publish("set_storage_config",["VC_mode",self.VC_mode])
+
+
+                    return 0
+                if text.find("音量调整") != -1:
+                        text = cmd["command"]["params_json"]
+                        text = ujson.loads(text)
+                        volume = text["n"]
+                        if volume >100 or volume<0:
+                            self.AI_TTS_str = "音量调整超出范围了,只能0-100哦" 
+                        else:
+                            self.VC_TTS_volume = volume
+                            self.aud.setVolume(self.VC_TTS_volume //10)
+                            EventMesh.publish("set_storage_config",["VC_TTS_volume",self.VC_TTS_volume])
+                            self.AI_TTS_str = "了解,音量已经调整,当前音量是{}".format(self.VC_TTS_volume)
+                        return 0
+                if text.find("音量增大") != -1:
+                        self.VC_TTS_volume += 10
+                        if self.VC_TTS_volume > 100:
+
+                            self.AI_TTS_str = "音量已经是最大啦" 
+                            self.VC_TTS_volume = 100
+                        else:
+                            self.aud.setVolume(self.VC_TTS_volume //10)
+                            EventMesh.publish("set_storage_config",["VC_TTS_volume",self.VC_TTS_volume])
+  
+                            self.AI_TTS_str = "了解,音量已经调大了,当前音量是{}".format(self.VC_TTS_volume)
+                            
+                        return 0
+                if text.find("音量减小") != -1:
+                    self.VC_TTS_volume -= 10
+                    if self.VC_TTS_volume < 0:
+                        self.VC_TTS_volume = 0
+                        #EventMesh.publish("audio_montage_play",["yinliangyizuixiao.mp3"])
+                        #self.aud.play(1,0,'U:/static/yinliangyizuixiao.mp3')#音量已最小
+                        self.AI_TTS_str = "音量已经是最小啦"
+                    else:
+                        self.aud.setVolume(self.VC_TTS_volume //10)
+                        EventMesh.publish("set_storage_config",["VC_TTS_volume",self.VC_TTS_volume])
+
+                        self.AI_TTS_str = "好嘞,音量已经调小了,当前音量是{}".format(self.VC_TTS_volume)
+                    return 0
+                
+                if text.find("语速增大") != -1:
+                        self.speech_rate += 10
+                        if self.speech_rate > 50:
+
+                            self.AI_TTS_str = "语速已经是最快了" 
+                            self.speech_rate = 50
+                        else:
+                            
+                            EventMesh.publish("set_storage_config",["speech_rate",self.speech_rate])
+  
+                            self.AI_TTS_str = "明白,语速已经调快了,当前语速是{}".format(self.speech_rate)
+                            
+                        return 0
+                if text.find("语速减小") != -1:
+                    self.speech_rate -= 10
+                    if self.speech_rate < -50:
+                        self.speech_rate = -50
+                        #EventMesh.publish("audio_montage_play",["yinliangyizuixiao.mp3"])
+                        #self.aud.play(1,0,'U:/static/yinliangyizuixiao.mp3')#音量已最小
+                        self.AI_TTS_str = "语速已经是最慢了"
+                    else:
+                        EventMesh.publish("set_storage_config",["speech_rate",self.speech_rate])
+
+                        self.AI_TTS_str = "明白,语速已经调慢了,当前语速是{}".format(self.speech_rate)
+                    return 0
+                
+                if text.find("进入工厂模式") != -1 :
+                    self.factory_mode()
+                    return 1
+                if text.find("查询") != -1:
+                    if text.find("信号") != -1 :
+                        signal = net.csqQueryPoll()
+                        
+                        self.AI_TTS_str = "当前信号{}".format(signal)
+                        return 0
+                    if text.find("电量") != -1 :
+                        battery = EventMesh.publish("get_battery")
+                        print("电量查询:{}".format(battery))
+                        #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)])
+                        #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余
+                        self.AI_TTS_str = "电量剩余百分之{}".format(battery)
+                        return 0
+                    if text.find("电压") != -1 :
+                        Vbatt = Power.getVbatt()
+                        #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)])
+                        #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余
+                        self.AI_TTS_str = "当前电池电压{}".format(Vbatt)
+                        return 0
+
+                    if text.find("卡号") != -1 :
+                        iccid = sim.getIccid()
+                        if iccid != -1 and len(iccid) > 5:
+                            print("iccid{}".format(iccid))
+                            self.AI_TTS_str = "当前卡号为:{}".format(iccid)
+                        else:
+                            self.AI_TTS_str = "卡号查询失败"
+                        return 0
+                    if text.find("设备号") != -1 :
+                        imei = modem.getDevImei()
+                        if imei != -1 and len(imei) > 5:
+                            print("IMEI:{}".format(imei))
+                            self.AI_TTS_str = "当前设备号为:{}".format(imei)
+                        else:
+                            self.AI_TTS_str = "设备号查询失败"
+                        return 0
+                    if text.find("版本") != -1 :
+                        sourceVersion = versions.Build_Time
+                        self.AI_TTS_str ="Mr-Seven-"+sourceVersion
+                        return 0
+                    if text.find("服务器地址") != -1 :
+                        self.AI_TTS_str ="服务器地址"+self.server_ip
+                        return 0
+                if text.find("升级") != -1 and (text.find("OTA") != -1 or text.find("ota") != -1):
+                    if self.ai_OTA.min_sys_ota()==1:
+                        self.AI_TTS_str = "有新版本,准备开始升级,升级过程会多次重启设备,请保证流量充足及电量充足"
+                    else:
+                        self.AI_TTS_str = "当前已是最新版本"
+                    return 0
+                
+                if len(text)<20 and (text.find("再见") != -1 or text.find("拜拜") != -1 or text.find("关闭对话") != -1):
+                    #EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+                    self.AI_TTS_str = "好嘞,再见,我们下次再聊"
+                    self.Close_flag = 1
+                    return 0
+                if len(text)<12 and (text.find("关机") != -1 ):
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+                    EventMesh.publish("Power_off")
+                    return 1
+                if text.find("闹钟设定") != -1:
+                    
+                    # {
+                    #     "event":"command",
+                    #     "payload":{
+                    #         "dialog_id":"d5ef6fc424834bc4915107c76b2c6d7e_1750671489126798340",
+                    #         "functions":[
+                    #         {
+                    #             "id":"56867702528670853",
+                    #             "type":"function",
+                    #             "function":{
+                    #                 "name":"device_action",
+                    #                 "arguments":"{\"command\":{\"chinese_description\":\"闹钟设定\",\"english_description\":\"alarm\",\"fail_prompt\":\"设定闹钟失败\",\"params_json\":\"{\\\"alarm\\\": [{\\\"alarm_content\\\": \\\"无\\\", \\\"alarm_timer\\\": \\\"7:00\\\", \\\"alarm_type\\\": \\\"单次\\\", \\\"repeat_day\\\": [\\\"2025-06-24\\\"], \\\"repeat_min\\\": 0, \\\"valid_time\\\": \\\"\\\"}]}\",\"succeed_prompt\":\"设定闹钟成功\"}}"
+                    #             }
+                    #         }
+                    #     ]
+                    #     },
+                    #     "sid":"d5ef6fc424834bc4915107c76b2c6d7e"
+                    # }
+
+                    text = cmd["command"]["params_json"]
+                    print("params_json:{}".format(text))
+
+                    try:
+                        alarm =  ujson.loads(text)
+                        add_alarm_tmp = EventMesh.publish("AI_add_alarm",alarm["alarm"])
+                        if add_alarm_tmp[0]> 0:
+                            self.AI_TTS_str = add_alarm_tmp[1]
+                            return 1
+                    except Exception as e:
+                        usys.print_exception(e)
+        except Exception as e:
+                usys.print_exception(e)
+        self.AI_TTS_str  = cmd["command"]["fail_prompt"]
+        return -1
+    def check_text(self,text):
+        print("check_text:len:{}".format(len(text)))
+        if len(text)>60:
+            return -1
+        try:
+            if isinstance(text, str): 
+                if dev_type != 'jswm' and dev_type != 'jswm_BOX':#金三完美,不使用设备切换角色
+                    # if len(text)<25 and (text.find("你好") != -1 or text.find("您好") != -1) :
+                    #     try:
+                    #         for key in self.VC_TTS_voice_type:
+                    #             if  text.find(key) != -1 :
+                    #                 self.VC_TTS_voice_key = key
+                    #                 EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                    #                 self.AI_TTS_str = "嗨,{}来了,有什么吩咐".format(self.VC_TTS_voice_key)
+                    #                 return 0
+                    #     except Exception as e:
+                    #         usys.print_exception(e) 
+                    #     return -1
+                    if text.find("声音") != -1 and text.find("改") != -1:
+                        try:
+                            for key in self.VC_TTS_voice_type:
+                                if  text.find(key) != -1 :
+                                    self.VC_TTS_voice_key = key
+                                    EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                                    self.AI_TTS_str = "更改成功" 
+                                    return 0
+                        except Exception as e:
+                            usys.print_exception(e)    
+                        if  text.find("男") != -1 :
+                            if "男" in self.VC_TTS_voice_type:
+                                self.VC_TTS_voice_key = "男"
+                                EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                                # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                                #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                                self.AI_TTS_str = "更改成功" 
+                                return 0
+                        if text.find("女") != -1 :
+                            if "女" in self.VC_TTS_voice_type:
+                                self.VC_TTS_voice_key = "女"
+                                EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                                # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                                #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                                self.AI_TTS_str = "更改成功" 
+                                return 0
+                        if text.find("同声") != -1 or text.find("童") != -1 :
+                            if "童" in self.VC_TTS_voice_type:
+                                self.VC_TTS_voice_key = "童"
+                                EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                                # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                                #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                                self.AI_TTS_str = "更改成功" 
+                                return 0
+                        if text.find("粤") != -1 or text.find("越野") != -1 or text.find("广东话") != -1:
+                            if "粤" in self.VC_TTS_voice_type:
+                                self.VC_TTS_voice_key = "粤"
+                                EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                                # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                                #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                                self.AI_TTS_str = "更改成功" 
+                                return 0
+                        if text.find("四川") != -1 :
+                            if "四川" in self.VC_TTS_voice_type:
+                                self.VC_TTS_voice_key = "四川"
+                                EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                                # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                                #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                                self.AI_TTS_str = "更改成功" 
+                                return 0
+                        if text.find("个性") != -1 :
+                            if "个性" in self.VC_TTS_voice_type:
+                                self.VC_TTS_voice_key = "个性"
+                                EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                                # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                                #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                                self.AI_TTS_str = "更改成功" 
+                                return 0
+                        if text.find("英语") != -1 :
+                            if "英语" in self.VC_TTS_voice_type:
+                                self.VC_TTS_voice_key = "英语"
+                                EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                                # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                                #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                                self.AI_TTS_str = "更改成功" 
+                                return 0
+                        self.AI_TTS_str = "更改失败,没找到对应声音" 
+                        return 0
+                if text.find("切换对话模式") != -1:
+                    if dev_type == "7PIN_BK_EU":
+                        if self.VC_mode == 0:
+                            self.VC_mode = 1
+                            self.AI_TTS_str = "change dialogue mode" 
+                        else:
+                            self.VC_mode = 0 
+                            self.AI_TTS_str = "pushtalk mode" 
+                    else:
+                        if self.VC_mode == 0:
+                            self.VC_mode = 1
+                            self.AI_TTS_str = "已切换到单对话模式" 
+                        else:
+                            self.VC_mode = 0 
+                            self.AI_TTS_str = "已切换到长对话模式" 
+                    EventMesh.publish("set_storage_config",["VC_mode",self.VC_mode])
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+
+                    return 0
+                if text.find("音量") != -1:
+                    if  text.find("加") != -1 :
+                        self.VC_TTS_volume += 10
+                        if self.VC_TTS_volume > 100:
+                            #EventMesh.publish("audio_montage_play",["yinliangyizuida.mp3"])
+                            #self.aud.play(1,0,'U:/static/yinliangyizuida.mp3')#音量已最大
+                            self.AI_TTS_str = "音量已最大" 
+                            self.VC_TTS_volume = 100
+                        else:
+                            self.aud.setVolume(self.VC_TTS_volume //10)
+                            EventMesh.publish("set_storage_config",["VC_TTS_volume",self.VC_TTS_volume])
+                            #EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#配置成功
+                            self.AI_TTS_str = "配置成功,当前音量 {}".format(self.VC_TTS_volume)
+                            
+                        return 0
+                    if text.find("减") != -1:
+                        self.VC_TTS_volume -= 10
+                        if self.VC_TTS_volume < 0:
+                            self.VC_TTS_volume = 0
+                            #EventMesh.publish("audio_montage_play",["yinliangyizuixiao.mp3"])
+                            #self.aud.play(1,0,'U:/static/yinliangyizuixiao.mp3')#音量已最小
+                            self.AI_TTS_str = "音量已最小"
+                        else:
+                            self.aud.setVolume(self.VC_TTS_volume //10)
+                            EventMesh.publish("set_storage_config",["VC_TTS_volume",self.VC_TTS_volume])
+                            #EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#配置成功
+                            self.AI_TTS_str = "配置成功,当前音量 {}".format(self.VC_TTS_volume)
+                        return 0
+                
+                if text.find("进入工厂模式") != -1 :
+                    self.factory_mode()
+                    return 1
+                if text.find("查询") != -1:
+
+                    if text.find("信号") != -1 :
+                        signal = net.csqQueryPoll()
+                        
+                        self.AI_TTS_str = "当前信号{}".format(signal)
+                        return 0
+                    if text.find("电量") != -1 :
+                        battery = EventMesh.publish("get_battery")
+                        print("电量查询:{}".format(battery))
+                        #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)])
+                        #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余
+                        self.AI_TTS_str = "电量剩余百分之{}".format(battery)
+                        return 0
+                    if text.find("电压") != -1 :
+                        Vbatt = Power.getVbatt()
+                        #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)])
+                        #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余
+                        self.AI_TTS_str = "当前电池电压{}".format(Vbatt)
+                        return 0
+
+                    if text.find("卡号") != -1 :
+                        iccid = sim.getIccid()
+                        if iccid != -1 and len(iccid) > 5:
+                            print("iccid{}".format(iccid))
+                            self.AI_TTS_str = "当前卡号为:{}".format(iccid)
+                        else:
+                            self.AI_TTS_str = "卡号查询失败"
+                        return 0
+                    if text.find("设备号") != -1 :
+                        imei = modem.getDevImei()
+                        if imei != -1 and len(imei) > 5:
+                            print("IMEI:{}".format(imei))
+                            self.AI_TTS_str = "当前设备号为:{}".format(imei)
+                        else:
+                            self.AI_TTS_str = "设备号查询失败"
+                        return 0
+                    if text.find("版本") != -1 :
+                        sourceVersion = versions.Build_Time
+                        self.AI_TTS_str ="Mr-Seven-"+sourceVersion
+                        return 0
+                    if text.find("服务器地址") != -1 :
+                        self.AI_TTS_str ="服务器地址"+self.server_ip
+                        return 0
+                
+                if text.find("讲话") != -1 or text.find("说话") != -1:
+                    if text.find("快") != -1 and text.find("太") == -1 :
+                        self.speech_rate += 10
+                        if self.speech_rate > 50:
+
+                            self.AI_TTS_str = "语速已经是最快了" 
+                            self.speech_rate = 50
+                        else:
+                            
+                            EventMesh.publish("set_storage_config",["speech_rate",self.speech_rate])
+
+                            self.AI_TTS_str = "明白,语速已经调快了,当前语速是{}".format(self.speech_rate)
+                            
+                        return 0
+                    if text.find("慢") != -1 and text.find("太") == -1 :
+                        self.speech_rate -= 10
+                        if self.speech_rate < -50:
+                            self.speech_rate = -50
+                            #EventMesh.publish("audio_montage_play",["yinliangyizuixiao.mp3"])
+                            #self.aud.play(1,0,'U:/static/yinliangyizuixiao.mp3')#音量已最小
+                            self.AI_TTS_str = "语速已经是最慢了"
+                        else:
+                            EventMesh.publish("set_storage_config",["speech_rate",self.speech_rate])
+
+                            self.AI_TTS_str = "明白,语速已经调慢了,当前语速是{}".format(self.speech_rate)
+                        return 0
+                if len(text)<22 and(text.find("聆听") != -1 or text.find("明天")!= -1) :
+                    #print("text len :{}".format(len(text)))
+                    if text.find("快") != -1 and text.find("太") == -1 :
+                        self.vad_silence -= 200
+                        if self.vad_silence < 100:
+
+                            self.AI_TTS_str = "已经是最快了" 
+                            self.vad_silence = 100
+                        else:
+                            self.AI_TTS_str = "配置成功,当前语音断句速度是{}毫秒".format(self.vad_silence)
+                        EventMesh.publish("set_storage_config",["vad_silence",self.vad_silence])   
+                        return 0
+                    if text.find("慢") != -1 and text.find("太") == -1 :
+                        self.vad_silence += 200
+                        if self.vad_silence > 2000:
+                            self.vad_silence = 2000
+                            #EventMesh.publish("audio_montage_play",["yinliangyizuixiao.mp3"])
+                            #self.aud.play(1,0,'U:/static/yinliangyizuixiao.mp3')#音量已最小
+                            self.AI_TTS_str = "已经是最慢了"
+                        else:
+                            self.AI_TTS_str = "配置成功,当前语音断句速度是{}毫秒".format(self.vad_silence)
+                        EventMesh.publish("set_storage_config",["vad_silence",self.vad_silence])
+                        return 0
+                if text.find("升级") != -1 and (text.find("OTA") != -1 or text.find("ota") != -1):
+                    if self.ai_OTA.min_sys_ota()==1:
+                        self.AI_TTS_str = "有新版本,准备开始升级,升级过程会多次重启设备,请保证流量充足及电量充足"
+                    else:
+                        self.AI_TTS_str = "当前已是最新版本"
+                    return 0
+                
+                if len(text)<16 and (text.find("再见") != -1 or text.find("拜拜") != -1 or text.find("关闭对话") != -1):
+                    #EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+                    if dev_type != "7PIN" and dev_type != "7PIN_coze":#柒牌
+                        self.AI_TTS_str = "好嘞,再见,我们下次再聊"
+                        self.Close_flag = 1
+                        return 0
+                    else:
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+                        return 1
+                if len(text)<12 and (text.find("关机") != -1 ):
+                    if dev_type == "7PIN" or dev_type == "7PIN_coze":#柒牌
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+                        return 1
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+                    EventMesh.publish("Power_off")
+                    return 1
+        except Exception as e:
+                usys.print_exception(e)
+        return -1
+    #获取trace_id
+    def get_trace_id(self):
+        t = utime.mktime(utime.localtime())
+        t = t*1000+urandom.randint(0, 1000)
+        md5_data = "{}".format(t)#md5签名
+        sign_data = ""
+        hash_obj = uhashlib.md5(md5_data)
+        res = hash_obj.digest()
+
+        # 转成十六进制表示
+        sign_data = ubinascii.hexlify(res)
+        sign_data = sign_data.decode('ascii')
+        return sign_data
+    
+    def get_session_id(self,data = "session_id"):
+        t = utime.mktime(utime.localtime())
+        t = t*1000+urandom.randint(0, 1000)
+        md5_data = "{}{}".format(data,t)#md5签名
+        sign_data = ""
+        hash_obj = uhashlib.md5(md5_data)
+        res = hash_obj.digest()
+
+        # 转成十六进制表示
+        sign_data = ubinascii.hexlify(res)
+        sign_data = sign_data.decode('ascii')
+        return sign_data
+    
+    def get_new_message_id(self):
+        message_id = self.get_trace_id()+"aaa"+self.get_trace_id()
+        self.VC_message_id=message_id[:32]
+        return self.VC_message_id 
+    def get_new_task_id(self):
+        task_id = self.get_trace_id()+"aaa"+self.get_trace_id()
+        self.VC_task_id=task_id[:32]
+        return self.VC_task_id
+    #开始播放声音
+    def VC_Play_Start(self):
+        self.tts_in_data_len = 0
+        self.tts_out_data_len = 0
+        if self.VC_Play_flag == 0:
+            try:
+                if self.VC_play_TYPE == VC_play_TYPE_PCM:
+                    if self.play_pcm == None:        
+                        self.play_pcm = audio.Audio.PCM(0,1,self.VC_play_samplerate,1,1,2)
+                        #self.play_pcm.setVolume(11)
+                        ret = self.play_pcm.stream_write_start()
+                        print("self.record_pcm.stream_write_start:ret:{}".format(ret))
+                elif self.VC_play_TYPE == VC_play_TYPE_MP3:
+                    pass
+                self.VC_Play_flag = 1
+            except Exception as e:
+                self.VC_Play_End()
+                usys.print_exception(e)
+    #暂停/继续声音播放   Pause_flag = 1暂停
+    def VC_Play_Pause(self,Pause_flag):
+        try:
+            if self.VC_play_TYPE == VC_play_TYPE_PCM:
+                if self.play_pcm != None:    
+                    self.play_pcm.stream_pause(Pause_flag)
+        except Exception as e:
+            self.VC_Play_End()
+            usys.print_exception(e)
+    #停止播放声音
+    def VC_Play_End(self):
+        self.VC_Play_flag = 0
+        if self.VC_play_TYPE == VC_play_TYPE_PCM:
+            if self.VC_play_samplerate == 8000:
+                self.aud.stopPlayStream()
+                self.aud.stopAll()
+            elif self.VC_play_samplerate == 16000:
+                if self.play_pcm != None:
+                    print("Close:play_pcm.close()!!!!!!!!!!!!!!!!!!")
+                    try:
+                        self.play_pcm.stream_stop()
+                        self.play_pcm.close()
+                    except Exception as e:
+                        usys.print_exception(e)
+                    self.play_pcm=None
+                self.aud.stopPlayStream()
+                self.aud.stopAll()
+        elif self.VC_play_TYPE == VC_play_TYPE_MP3:
+            self.aud.stopPlayStream()
+            self.aud.stopAll()
+        if self.AI_audio_queue.empty()!=True:
+            self.AI_audio_queue.clear()
+        
+
+    def _1S_timer_cb(self,*argc):
+        EventMesh.publish("publish_AI_btnInfo",{"func":self._1S_timer_cb_}) 
+
+    def _1S_timer_cb_(self):    
+    
+        EventMesh.publish("system_sleep_rest")#防止黑屏
+        self.close_timerout += 1
+        if self.close_timerout > 60 and self.VC_mode != 1 :#:#20秒没数据就close 长按单次问答模式不关
+            
+            if self.VC_state >= VC_State_SpeechIng:
+                print("接口无响应,超时退出")
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"接口超时了。请重试"}) 
+                self.ud_error(["VC",self.VC_taskid])
+            else:
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+        
+        # print("get_audio_state !!!!!{} {} {}\r\n".format(self.play_end,EventMesh.publish("get_audio_state"),self.play_flag))
+        if self.LocalRespondingEnded_timerout>0  :#
+            self.LocalRespondingEnded_timerout -= 1
+            print("LocalRespondingEnded_timerout:{}".format(self.LocalRespondingEnded_timerout))
+            if self.LocalRespondingEnded_timerout <= 0 or self.play_pcm == None or(self.play_pcm != None and self.play_pcm.stream_is_empty() == 1) :#超时或者音频播放完,
+                self.LocalRespondingEnded_timerout = 0
+                if self.VC_mode == 1 :#长按单次问答模式
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+                else:
+                    EventMesh.publish("open_led_blue")
+                    if self.Close_flag == 1:
+                        self.Close_flag = 0
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+                    else:
+                        #utime.sleep_ms(1000)
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Play_End})
+                        #EventMesh.publish("publish_AI_btnInfo",{"func":self.chenggong_tone})
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_Start_now})#开始录音
+                        self.VC_state = VC_State_None
+                    #通知服务器播放结束
+                    #self.AI_client_VC_LocalRespondingEnded()
+
+        self.VC_pingping_timerout+=1
+        if self.VC_pingping_timerout>3:
+            self.VC_pingping_timerout=0
+            self.AI_client_VC_ping()
+        # self.asr_pingping_timerout += 1
+        # if self.asr_pingping_timerout>3:
+        #     self.asr_pingping_timerout=0
+        #     self.AI_client_asr_ping()    
+        if self.VC_Thinking_timerout > 0 and self.VC_Thinking_timerout < 100:#VC Thinking超时后重新开始
+            print("VC_Thinking_timerout:{}!!!!!!!!!!!!!!!!!!!!!".format(self.VC_Thinking_timerout))
+            self.VC_Thinking_timerout -=1
+            if self.VC_Thinking_timerout == 0:
+                self.VC_Thinking_timerout = 100
+                print("Thinking重试,重试!!!!!!!!!!!!!!!!!!!!!")
+                self.VC_state = VC_State_None
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                pass
+        
+    #VC开始
+    def AI_VC_start(self):
+        print("AI_VC_start1")
+        self.VC_satrt_flag = 1
+        if self.VC_Thinking_timerout < 100:
+            self.VC_Thinking_timerout = 0
+        EventMesh.publish("open_led_all")
+        self.VC_Play_End()#关闭音频播放
+        print("AI_VC_start2")
+        #self.aud.aud_tone_play(16,200)#播放按键音
+        self.LocalRespondingEnded_timerout = 0
+        self.close_timerout = 0
+
+        
+        #
+        if self.AI_client_VC_isconnect == 0:#没连接的时候请求开始
+            self.websocket_connect_VC()#连接服务器
+            
+            #utime.sleep_ms(50)
+        else:
+            print("self.VC_state :{}".format(self.VC_state ))
+            
+        if self.AI_client_VC_isconnect == 0:
+            return
+        self.AI_client_VC_start_requset()
+        print("AI_VC_start3")
+         
+        self.VC_state = VC_State_None
+        if self.AI_TTS_str == "":#没有tts要播放的时候才开始录音
+            #开始asr录音
+            self.VC_Speech_Start()#开启线程获取录音数据
+           
+                
+        #     pass
+        print("AI_VC_start4")
+        #self.VC_Play_Start()
+        #EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Play_Start})
+        #开始线程
+        
+        # if self.AI_VC_send_data_queue_thread_id == 0:    
+        #     _thread.stack_size(self.Audio_buf_size+8*1024)
+        #     self.AI_VC_send_data_queue_thread_id = _thread.start_new_thread(self.AI_VC_send_data_queue_thread, ())
+        #     _thread.stack_size(8*1024)
+        #     print("AI_VC_start :AI_VC_send_data_queue_thread_id :{} ".format(self.AI_VC_send_data_queue_thread_id))
+        
+        if self.AI_audio_queue_thread_id ==0:
+            _thread.stack_size(24*1024)
+            self.AI_audio_queue_thread_id = _thread.start_new_thread(self.AI_audio_queue_thread, ())
+            _thread.stack_size(8*1024)
+            print("AI_VC_start :AI_audio_queue_thread_id :{} ".format(self.AI_audio_queue_thread_id))
+        else:
+            print("AI_VC_start :AI_audio_queue_thread_id != 0 ")
+        self._1S_timer.start(1000,1,self._1S_timer_cb)
+        # self.VC_pingping_timerout = 0
+        # self.asr_pingping_timerout = 0
+        print("AI_VC_start5")
+    #开始会话
+    def AI_client_VC_start_requset(self):
+        voice="zh_male_wennuanahu_moon_bigtts"
+        try:
+            voice = self.VC_TTS_voice_type[self.VC_TTS_voice_key]["voice"]
+        except Exception as e:
+            usys.print_exception(e)    
+        #voice="zh_female_dongmanxiaoyang_moon_bigtts"
+ 
+        json_data = \
+        {
+            "header": {
+                "event": "Start",
+                "trace_id": self.get_trace_id(),
+            },
+            "payload": {
+                "simple_response": True,#不返回llm过程文本
+                "device_id": modem.getDevImei(),
+                
+                "user_agent": "AudioClient/1.0",
+                "dialog_attributes": {
+                    #"provider": "doubao",
+                    "provider": "coze",
+
+                    "cfg": {
+                        "disable_empty_prompt" : True,#拦截空字符请求大模型
+                        "custom_variables": {
+                            "name": self.bot_name,
+                            },
+                        "greeting":{
+                            "enabled":False,
+                            "content":""
+                        },
+                        "openai_option":{
+                           },
+
+                        "bot_option": {
+                            "use_workflow": True,
+                            #"input_format": "text",
+                            "bot_id":"7462617881076351002",#语言助手
+                            "workflow_id":"7462621757327196187",
+                           
+                        }
+                    }
+                },
+                "outbound_attributes": {
+                    "provider": "volcengine",
+                    "cfg": {
+                        "format": "pcm",
+                        "sample_rate": self.VC_play_samplerate,
+                        "bit_rate": 16,
+                        "channel": 1,
+                        "volume": self.VC_TTS_volume,
+                        #"voice": "7426720361732980745",
+                        "voice": voice,#音色
+                        "speech_rate": self.speech_rate,#语速
+                        "chunk_interval_ms": 30,  # 配置每段音频入队间隔时间 100ms
+                    }
+                },
+                "inbound_attributes": {
+                    "provider": "xun-fei",#
+                    #"provider": "volcengine",
+                    "disable_vad":True,
+                    "vad_silence":self.vad_silence,
+                    "interrupt_options":{
+                        "concatenate_results":True,
+                        "thinking_time_only": True,
+                    },
+                    "cfg": {
+                        "format": "pcm",
+                        "sample_rate": self.VC_record_samplerate,
+                        "bit_rate": 16,
+                        "channel": 1,
+                        "enable_punctuation": True,
+                        "enable_itn":True,
+                        "keywords":[]
+                    }
+                },
+                "commands":self.commands,
+            }
+        }
+        # "bot_id":"7481164663863459850",#鸭子
+        # "workflow_id":"7480485093845991443",
+        # "bot_id":"7462617881076351002",#语言助手
+        # "workflow_id":"7462621757327196187",
+        # "bot_id":"7469964258592931852",#深圳百事通
+        # "workflow_id":"7469968083063603241",
+        # "bot_id":"7411071327182438412",#柒牌
+        # "workflow_id":"7469049680291610636",
+        json_data["payload"]["outbound_attributes"]["provider"]=self.outbound_attributess_provider#TTS音色服务选择,火山
+        json_data["payload"]["inbound_attributes"]["provider"]=self.inbound_attributess_provider#ASR服务选择,火山
+        if dev_type == "7PIN_BK"or dev_type == "7PIN_BK_coze"or dev_type == "G10":#小瑞
+            json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]="7462617881076351002"#语言助手
+            json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]="7462621757327196187"
+            # json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]="7486697248416989193"#极简
+            # json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]="7486698347416649778"
+            #json_data["payload"]["dialog_attributes"]["provider"]="doubao"#豆包
+            #json_data["payload"]["inbound_attributes"]["vad_silence"] = 200
+            #if self.VC_TTS_voice_type[self.VC_TTS_voice_key]["bot_id"] !="":
+            if "bot_id" in self.VC_TTS_voice_type[self.VC_TTS_voice_key]:
+                json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]=self.VC_TTS_voice_type[self.VC_TTS_voice_key]["bot_id"]
+                if "workflow_id" in self.VC_TTS_voice_type[self.VC_TTS_voice_key]:
+                    json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]= self.VC_TTS_voice_type[self.VC_TTS_voice_key]["workflow_id"]
+                else:
+                    json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]=""
+                if json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"] == "":
+                    json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["use_workflow"]=False
+            
+
+            keywords = []#热词
+            for key in self.VC_TTS_voice_type:
+                keywords.append(key) 
+            json_data["payload"]["inbound_attributes"]["cfg"]["keywords"] = keywords
+        elif dev_type == "7PIN_BK_EU":
+            json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]="7493368740600446995"#英文
+            json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]="7493369551587213323"
+        elif dev_type == "csh":
+            json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]="7490852493640384538"#慈善会
+            json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["use_workflow"]=False
+            json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]=""
+        elif dev_type == "7PIN" :#柒牌
+            json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]=""#
+            json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]=""
+            #json_data["payload"]["inbound_attributes"]["vad_silence"] = 1000
+        elif dev_type == "7PIN_coze":
+            json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]=""#
+            json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]=""
+            json_data["payload"]["dialog_attributes"]["provider"]="qipai"
+        #
+        elif dev_type == 'momo':#食梦貘
+            json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]="7491256313561825332"
+            json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]=""
+            json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["use_workflow"]=False
+            if "bot_id" in self.VC_TTS_voice_type[self.VC_TTS_voice_key]:
+                json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]=self.VC_TTS_voice_type[self.VC_TTS_voice_key]["bot_id"]
+                if "workflow_id" in self.VC_TTS_voice_type[self.VC_TTS_voice_key]:
+                    json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]= self.VC_TTS_voice_type[self.VC_TTS_voice_key]["workflow_id"]
+                else:
+                    json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]=""
+                if json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"] == "":
+                    json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["use_workflow"]=False
+            
+
+            keywords = []#热词
+            for key in self.VC_TTS_voice_type:
+                keywords.append(key) 
+            json_data["payload"]["inbound_attributes"]["cfg"]["keywords"] = keywords
+        elif dev_type == 'sjgq':#四季甘泉
+            json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]="7472201279826690111"
+            json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]="472203898494500914"
+            pass
+        elif dev_type == 'szbst':#深圳百事通
+            json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]="7469964258592931852"
+            json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]="7469968083063603241"
+        elif dev_type == 'jswm' or dev_type == 'jswm_BOX':#金三完美
+            #json_data["payload"]["device_id"]= "WangQunTestID"
+            if self.VC_TTS_voice_type[self.VC_TTS_voice_key]["bot_id"] !="":
+                json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]=self.VC_TTS_voice_type[self.VC_TTS_voice_key]["bot_id"]
+            if self.VC_TTS_voice_type[self.VC_TTS_voice_key]["workflow_id"] == "":
+                json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["use_workflow"]=False
+                json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]= ""             
+            else:
+                json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]= self.VC_TTS_voice_type[self.VC_TTS_voice_key]["workflow_id"]
+            if self.VC_TTS_voice_type[self.VC_TTS_voice_key]["openai_option"] :
+                json_data["payload"]["dialog_attributes"]["cfg"]["openai_option"] =self.VC_TTS_voice_type[self.VC_TTS_voice_key]["openai_option"]
+            keywords = []#热词
+            for key in self.VC_TTS_voice_type:
+                keywords.append(key) 
+            json_data["payload"]["inbound_attributes"]["cfg"]["keywords"] = keywords
+        if self.dialog_attributes_provider != None:
+            json_data["payload"]["dialog_attributes"]["provider"] = self.dialog_attributes_provider
+        if self.commands_mode !=0 :
+            json_data["payload"]["commands"] = []
+        if self.VC_mode == 0 :#and dev_type != "7PIN_BK_coze":#长对话模式打开vad
+            json_data["payload"]["inbound_attributes"]["disable_vad"] = False
+        self.VC_state = VC_State_None
+        self.AI_client_VC_send(ujson.dumps(json_data))
+ 
+    #开始上传语音
+    def AI_client_VC_send_speech(self):
+        json_data = \
+        {
+            "header": {
+                "event": "audio.create",
+                
+            },
+        }
+        
+        if self.VC_mode == 1:#单对话模式
+            self.AI_client_VC_send(ujson.dumps(json_data))
+        
+
+            
+            
+        
+        
+        self.VC_state =  VC_State_SpeechStart
+    #结束上传语音
+    def AI_client_VC_end_speech(self):
+        json_data = \
+        {
+            "header": {
+                "event": "audio.completed",
+                
+            },
+        }
+        self.AI_client_VC_send(ujson.dumps(json_data))
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})
+
+  
+    #客户端打断对话
+    def AI_client_VC_RequestToSpeak(self):
+        json_data = \
+        {
+            "event": "cancel",
+            "payload": {}
+        }
+        print("AI_client_VC_RequestToSpeak!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        # EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) 
+        # EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_send,"data":ujson.dumps(json_data)}) 
+        # utime.sleep_ms(1)
+        self.websocket_deconnect_VC()
+        self.AI_audio_queue_thread_close()
+        self.VC_state = VC_State_None
+        #self.Close()
+        self.AI_VC_start() 
+    #TTS播放
+    def AI_client_VC_synthesis(self):
+        json_data = \
+        {
+            "event": "synthesis",
+            "payload": {
+                "text": self.AI_TTS_str
+            }
+        }
+        self.AI_TTS_str = ""
+        print("AI_client_VC_synthesis!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        # if self.VC_state == VC_State_RequestToRespond:
+        #     print("AI_client_VC_RequestToRespond 重复 tts_str:{}\nasr_str:{}".format(self.AI_TTS_str,self.AI_ASR_str))
+        self.AI_client_VC_send(ujson.dumps(json_data))
+    
+    def chenggong_tone(self):
+        EventMesh.publish("audio_montage_play",["chenggong.mp3"])    
+    def send_tone(self):
+        EventMesh.publish("audio_montage_play",["send_tone.mp3"])
+    def concurrency_limit_exceeded_tone(self):
+        self.Close()
+        EventMesh.publish("audio_montage_play",["chaobingfatis.mp3"])    #播放超并发提醒
+    #给服务器回应ack
+
+      
+    ############################################
+    #关闭音频播放线程
+    def AI_audio_queue_thread_close(self):
+        print("AI_audio_queue_thread_close1!!!!!!!!!!!!!!!!!!!!!!")
+        if self.AI_audio_queue_thread_id != 0:
+            count =500
+            while True:
+                count -= 1
+                if self.AI_audio_queue_thread_lock == 0 or count <=0:
+                    break
+                else:
+                    self.AI_audio_queue_thread_lock = 2
+                    print("AI_audio_queue_thread going:{}...".format(count))
+                    utime.sleep_ms(1)
+            self.AI_audio_queue_thread_lock = 0
+            print("AI_audio_queue_thread_close2!!!!!!!!!!!!!!!!!")
+            try:
+                _thread.stop_thread(self.AI_audio_queue_thread_id)
+            except Exception as e:
+                usys.print_exception(e)
+        self.AI_audio_queue_thread_id = 0
+    # 音频队列        
+    def AI_audio_queue_thread(self):
+        print("AI_audio_queue_thread start")
+        count = 0
+        if self.AI_audio_queue.empty()!=True:
+            self.AI_audio_queue.clear()
+            print("音频数据还有剩余!!!!!!!!!!!!")
+        while True:
+            try:
+                if self.AI_audio_queue_thread_lock == 2:
+                        print("AI_audio_queue_thread 该退出了")
+                        break
+                #
+                count+=1
+                if count%500 == 1:
+                    print("AI_audio_queue_thread on")
+                utime.sleep_ms(1)
+                #print("AI_audio_queue_thread")
+                if self.AI_audio_queue.empty() :
+                    self.AI_audio_queue_thread_lock = 0
+                    
+                    
+                else:
+                    self.AI_audio_queue_thread_lock = 1
+                    data = self.AI_audio_queue.get()
+                    self.close_timerout = 0
+                    if self.play_flag == 0:
+                        self.play_flag =1
+                    #self.AI_client_tts_data_len=len(data)
+                    #print("audio_queue:len:{}".format(len(data[0])))
+                    
+                    if len(data[0]) > 10:
+                        for i in range(5): 
+                            if self.VC_Play_flag == 0:
+                                self.VC_Play_Start()
+                                utime.sleep_ms(2)
+                            else:
+                                break
+                        try:
+                            if self.VC_play_TYPE == VC_play_TYPE_PCM:
+                                # if self.VC_play_samplerate == 8000:
+                                #     tmp= self.aud.playStream(1,data[0] )
+                                # else:
+                                    write_buf = bytearray(data[0])
+                                    #print("play_pcm.stream_write1 len:{}".format(len(write_buf)))
+                                    if self.play_pcm != None:
+                                        #print("play_pcm.stream_write !!!")
+                                        ret = self.play_pcm.stream_write(write_buf,len(write_buf))
+                                        #ret= self.aud.playStream(1, data[0])#播放音频流
+                                        self.tts_out_data_len += ret
+                                        #print("play_pcm.stream_write2:{}".format(self.tts_out_data_len))
+                            elif self.VC_play_TYPE == VC_play_TYPE_MP3:
+                                tmp= self.aud.playStream(3, data[0])#播放音频流
+                                
+                                if tmp != 0:
+                                    print("2playStream:error tmp:{} data len:{}!!!!!!!!!!!!".format(tmp,len(data[0])))
+                                    # # #播放失败的时候填充WAV头
+                                    # data_len = len(data[0])
+                                    # data_len_b = data_len.to_bytes(4,'little')#数据长度转16进制数组
+                                    # h_data = [ 0x52 ,0x49 ,0x46 ,0x46 #,0x24 ,0x00 ,0x00 ,0x00 #文件标识、文件大小
+                                    #         ,0x57 ,0x41 ,0x56 ,0x45 ,0x66 ,0x6D ,0x74 ,0x20  #文件格式、格式块标识符
+                                    #         ,0x10 ,0x00 ,0x00 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x80 ,0x3E ,0x00 ,0x00  #格式块大小4、音频格式2、声道数2、采样率4
+                                    #         ,0x80 ,0x3E ,0x00 ,0x00 ,0x02 ,0x00 ,0x10 ,0x00 ,0x64 ,0x61 ,0x74 ,0x61]#每秒字节数4、数据块对齐2、位深度2、data4
+                                    # h_data_b = bytes(h_data)
+                                    # file_len = data_len+len(h_data_b)+4+4
+                                    # file_len_b = file_len.to_bytes(4,'little')#文件长度转16进制数组
+                                    # h_data_b = h_data_b[:4]+file_len_b+h_data_b[4:]+data_len_b
+                                    # #self.aud.playStream(2, h_data_b)#播放音频流
+                                    # tmp= self.aud.playStream(2, h_data_b+data[0])#播放音频流
+                                    # print("3playStream:tmp:{} !!!!!!!!!!!!".format(tmp))
+                            
+                            
+                            mem = gc.mem_free()
+                            #print('1剩余内存RAM:{} KB'.format(mem / 1024))
+                        except Exception as e:
+                            print("AI_audio_queue_thread:ERROR:")
+                            usys.print_exception(e)
+                    
+                    # if self.VC_state == VC_State_TTSEnd and self.AI_audio_queue.empty() :#self.AI_audio_queue为空且tts下发结束
+                    #     #通知服务器播放结束
+                    #     self.AI_client_VC_LocalRespondingEnded()
+            except Exception as e:
+                print("AI_audio_queue_thread:ERROR:")
+                usys.print_exception(e)
+        self.AI_audio_queue_thread_lock = 0
+        #print("AI_audio_queue_thread:exit")
+    def factory_mode(self):
+        print("factory_mode")
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.factory_start}) 
+    def factory_start(self):
+        self.factory_timer.start(3000, 1, self.factory_timer_cb)
+    def factory_timer_cb(self, *args, **kwargs):
+        print("factory_timer_cb play......")
+        #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+        EventMesh.publish("audio_montage_play",["xinhaoruo1.mp3"])
+
+    def Close(self):
+        self.VC_Thinking_timerout = 0
+        self.VC_satrt_flag = 0
+        self.AI_TTS_str = ""
+        self.AI_ASR_str = ""
+        self.AI_ASR_str_tmp = ""
+        self.AI_ASR_flag  = 0
+        self.AI_ASR_check_timeout = 0
+        self.AI_ASR_error_timeout = 0
+        self.LocalRespondingEnded_timerout = 0
+        print("ai_VC Close1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        EventMesh.publish("close_led")
+        self.tts_in_data_len = 0
+        self.tts_out_data_len = 0
+        #必须先销毁线程,不然线程会容易报错
+        
+        try:
+            self.AI_audio_queue_thread_close()#销毁音频线程
+        except Exception as e:
+            usys.print_exception(e)
+        try:
+            self.AI_VC_send_data_queue_thread_close()#销毁数据发送线程
+        except Exception as e: 
+            usys.print_exception(e)
+        
+        self.VC_Speech_End()
+        
+        print("ai_VC Close1.1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        self.VC_init()
+        print("ai_VC Close1.2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        
+        try:
+            self.websocket_deconnect_VC()
+        except Exception as e:
+            usys.print_exception(e)
+        
+
+        
+
+
+        print("ai_VC Close1.3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        
+        print("ai_VC Close2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        
+        
+        self.AI_ASR_timer.stop()
+        self._1S_timer.stop()
+        self.factory_timer.stop()
+        
+        if self.record_data_save_flag == 1:
+            if self.record_fd :
+                self.record_fd.close()
+            self.record_fd = None
+        if self.play_data_save_flag == 1:
+            if self.play_fd !=None:
+                self.play_fd.close()
+                self.play_fd = None
+        print("ai_VC Close3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")
+        
+        if self.AI_VC_send_data_queue.empty()!=True:
+            self.AI_VC_send_data_queue.clear()
+
+        self.AI_ASR_send_buf_len = 0
+        #self.AI_WS_connect_Queue.put(self.AI_client_VC)
+        EventMesh.publish("close_led")
+        # try:
+        #     while True:
+        #         if self.AI_WS_connect_Queue.empty()!=True:
+        #             AI_WS_connect = self.AI_WS_connect_Queue.get()
+        #             if AI_WS_connect :
+        #                 try:
+        #                     AI_WS_connect._close()
+        #                     AI_WS_connect = None
+        #                 except Exception as e:
+        #                     usys.print_exception(e)
+        #             else:
+        #                 print("websocket链接已为空")
+        #         else:
+        #             break
+        # except Exception as e:
+        #     usys.print_exception(e)
+
+    def VC_init2(self):
+        self.VC_init()
+        
+        print("ai_VC VC_init2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        try:
+            self.websocket_deconnect_VC()
+        except Exception as e:
+            usys.print_exception(e)
+        print("ai_VC Close3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")
+        self._1S_timer.stop()
+        if self.AI_VC_send_data_queue.empty()!=True:
+            self.AI_VC_send_data_queue.clear()
+
+        self.AI_ASR_send_buf_len = 0
+        if self.AI_audio_queue.empty()!=True:
+            self.AI_audio_queue.clear()
+    def VC_init(self):
+        
+        print("VC_init:AI_VC_send_data_queue:size:{}".format(self.AI_VC_send_data_queue.size()))
+        
+        
+        print("VC_init2")
+        #self.VC_Speech_End()
+        print("VC_init3")
+        self.VC_Play_End()
+        print("VC_init4")
+        
+        if self.AI_audio_queue.empty()!=True:
+            self.AI_audio_queue.clear()
+        # num = EventMesh.publish("get_volum_size")
+        # if num == None:
+        #     num = 8
+        # self.aud.setVolume(num)#恢复原始音量
+        
+
diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/ai_VC_coze.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/ai_VC_coze.py
new file mode 100644 (file)
index 0000000..a39f20e
--- /dev/null
@@ -0,0 +1,3629 @@
+from common import Abstract, LogAdapter
+import EventMesh
+import uwebsocket
+import usys
+import gc
+import urandom
+import uhashlib
+import ubinascii
+import ujson
+import osTimer
+import _thread
+from queue import Queue
+import utime
+import audio
+import uos
+from machine import Pin
+from machine import ExtInt
+from machine import WDT
+import modem
+import sim
+import net
+import base64
+import ucryptolib
+import urandom as random
+import request
+import ql_fs
+from misc import Power,USB,PowerKey
+import ntptime
+import machine
+import dataCall
+import constants
+import versions
+
+dev_type = "G10"
+#dev_type = "7PIN_BK"#小瑞
+#dev_type = "7PIN"#柒牌
+#dev_type = 'momo'#食梦貘
+#dev_type = 'sjgq'#四季甘泉
+class AI_led(Abstract):
+    def __init__(self):
+        if dev_type == "G10":
+            self.led_red = Pin(Pin.GPIO36, Pin.OUT, Pin.PULL_PD, 0)
+            self.led_green = Pin(Pin.GPIO44, Pin.OUT, Pin.PULL_PD, 1)
+            self.led_blue = Pin(Pin.GPIO21, Pin.OUT, Pin.PULL_PD, 1)
+        else:
+            self.led_red = Pin(Pin.GPIO36, Pin.OUT, Pin.PULL_PD, 0)
+            self.led_green = Pin(Pin.GPIO21, Pin.OUT, Pin.PULL_PD, 1)
+            self.led_blue = Pin(Pin.GPIO19, Pin.OUT, Pin.PULL_PD, 1)
+
+        #=1 红灯闪,=2白灯闪,=3绿灯闪,=4全部灯闪
+        self.led_flicker_flag = 0
+        self.led_flicker_on_off_flag = 0
+        self.led_flicker_timer = osTimer()
+        
+        EventMesh.subscribe("open_led_red",self.open_led_red)
+        EventMesh.subscribe("open_led_blue",self.open_led_blue)
+        EventMesh.subscribe("open_led_green",self.open_led_green)
+        EventMesh.subscribe("open_led_all",self.open_led_all)
+        EventMesh.subscribe("open_led_red_blue",self.open_led_red_blue)
+        EventMesh.subscribe("open_led_red_green",self.open_led_red_green)
+        EventMesh.subscribe("flicker_led_red",self.flicker_led_red)
+        EventMesh.subscribe("flicker_led_blue",self.flicker_led_blue)
+        EventMesh.subscribe("flicker_led_green",self.flicker_led_green)
+        EventMesh.subscribe("flicker_led_all",self.flicker_led_all)
+        EventMesh.subscribe("close_led",self.close_led)
+        EventMesh.publish("open_led_red")
+
+    def flicker_led_red(self,event,msg):
+        self.led_flicker_flag = 1
+        self.led_flicker_timer.start(1500, 1, self.led_flicker_timer_cb)
+
+    def flicker_led_blue(self,event,msg):
+        self.led_flicker_flag = 2
+        self.led_flicker_timer.start(1500, 1, self.led_flicker_timer_cb)
+
+    def flicker_led_green(self,event,msg):
+        self.led_flicker_flag = 3
+        self.led_flicker_timer.start(1500, 1, self.led_flicker_timer_cb)
+
+    def flicker_led_all(self,event,msg):
+        self.led_flicker_flag = 4
+        self.led_flicker_timer.start(1500, 1, self.led_flicker_timer_cb)
+
+    def led_flicker_timer_cb(self, *args, **kwargs):
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.led_flicker_timer_cb_})  
+    def led_flicker_timer_cb_(self):
+        if self.led_flicker_flag == 0:
+            self.led_flicker_timer.stop()
+            return
+        if self.led_flicker_on_off_flag == 0:
+            self.led_red.write(0)
+            self.led_blue.write(0)
+            self.led_green.write(0)
+            self.led_flicker_on_off_flag = 1
+        else:
+            self.led_flicker_on_off_flag = 0
+            if self.led_flicker_flag == 1:
+                self.led_blue.write(0)
+                self.led_green.write(0)
+                self.led_red.write(1)
+            elif self.led_flicker_flag == 2:
+                self.led_red.write(0)
+                self.led_green.write(0)
+                self.led_blue.write(1)
+            elif self.led_flicker_flag == 3:
+                self.led_red.write(0)
+                self.led_blue.write(0)
+                self.led_green.write(1)
+            elif self.led_flicker_flag == 4:
+                self.led_blue.write(1)
+                self.led_green.write(1)
+                self.led_red.write(1)
+
+    def open_led_red(self,event,msg):
+        #print("open_led_red")
+        self.led_flicker_flag = 0
+        #self.led_red.write(0)
+        self.led_blue.write(0)
+        self.led_green.write(0)
+        self.led_red.write(1)
+
+    def open_led_blue(self,event,msg):
+        #print("open_led_blue")
+        self.led_flicker_flag = 0
+        self.led_red.write(0)
+        #self.led_blue.write(0)
+        self.led_green.write(0)
+        self.led_blue.write(1)
+
+    def open_led_green(self,event,msg):
+        #print("open_led_green")
+        self.led_flicker_flag = 0
+        self.led_red.write(0)
+        self.led_blue.write(0)
+        #self.led_green.write(0)
+        self.led_green.write(1)
+
+    def open_led_red_blue(self,event,msg):
+        #print("open_led_blue")
+        self.led_flicker_flag = 0
+        self.led_red.write(1)
+        #self.led_blue.write(0)
+        self.led_green.write(0)
+        self.led_blue.write(1)
+
+    def open_led_red_green(self,event,msg):
+        #print("open_led_blue")
+        self.led_flicker_flag = 0
+        self.led_red.write(1)
+        #self.led_blue.write(0)
+        self.led_green.write(1)
+        self.led_blue.write(0)
+
+    def open_led_all(self,event,msg):
+        #print("open_led_all")
+        self.led_flicker_flag = 0
+        #self.led_red.write(0)
+        self.led_blue.write(1)
+        self.led_green.write(1)
+        self.led_red.write(1)
+
+    def close_led(self,event,msg):
+        #print("close_led")
+        self.led_flicker_flag = 0
+        self.led_red.write(0)
+        self.led_blue.write(0)
+        self.led_green.write(0)
+
+audio_buf = ['chenggong', 'didianguanji', 'IMEIhao', 'jianquancuowu', 'key_prompt', 'liuliangtishi', 'Low_power_warning', 'R_CHARGE_FULL', 'R_CHARGE_IN', 'R_CHARGE_OUT', 'R_READ_TIME_0', 'R_READ_TIME_1', 'R_READ_TIME_2', 'R_READ_TIME_3', 'R_READ_TIME_4', 'R_READ_TIME_5', 'R_READ_TIME_6', 'R_READ_TIME_7', 'R_READ_TIME_8', 'R_READ_TIME_9', 'R_READ_TIME_A', 'R_READ_TIME_B', 'R_READ_TIME_C', 'R_READ_TIME_D', 'R_READ_TIME_E', 'R_READ_TIME_F', 'R_READ_TIME_G', 'R_READ_TIME_H', 'R_READ_TIME_I', 'R_READ_TIME_J', 'R_READ_TIME_K', 'R_READ_TIME_L', 'R_READ_TIME_M', 'R_READ_TIME_N', 'R_READ_TIME_O', 'R_READ_TIME_P', 'R_READ_TIME_Q', 'R_READ_TIME_R', 'R_READ_TIME_S', 'R_READ_TIME_T', 'R_READ_TIME_U', 'R_READ_TIME_V', 'R_READ_TIME_W', 'R_READ_TIME_X', 'R_READ_TIME_Y', 'R_READ_TIME_Z', 'send_tone', 'shouhou', 'xinhaoruo1', 'zhengzaiguanji']
+class AI_dev(Abstract):
+    # AI
+    def __init__(self):
+        self.is_wdt = 0 #是否开启看门狗
+
+        self.VBATT_tab = {"charge_full":4300,"100" :4250 ,  "90":4179 , "80":4070, "60": 3883, "40":3770, "20":3699,  "10":3652,"5":3600,}
+        self.KeyAI_status = 0
+        self.KeyAI_timer_count = 0
+        self.KeyAI_long_press = 0
+        self.KeyAI_press = 0
+        if self.is_wdt == 1:
+            self.wdt = WDT(30) #开启看门狗
+        # self.wdt_timer = osTimer()
+        # self.wdt_timer.start(5000, 1, self.wdt_timer_cb)
+        count = 0
+        while True:
+            count += 1
+            if count > 20 :
+                break
+            data = dataCall.getInfo(1, 0)
+            print("data call INFO {}".format(data))
+            if data[2][0]:
+                self.network_state = 1
+                break
+            print("等待网络 {}...".format(count))
+            utime.sleep_ms(500)
+        self.KeyAI_timer = osTimer()
+        if dev_type == "G10":
+            self.extint_AI = ExtInt(ExtInt.GPIO19,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)
+            self.pwk_key = ExtInt(ExtInt.GPIO26, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.pwk_extint_cb)
+        else:
+            self.pwk_key = ExtInt(ExtInt.GPIO41, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.pwk_extint_cb)
+            #self.extint_AI = ExtInt(ExtInt.GPIO19,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)
+            self.extint_AI = ExtInt(ExtInt.GPIO22,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)
+        self.extint_AI.enable()
+        self.pwk_key_status = 0
+        self.pwk_key_timer_count = 0
+        self.pwk_key_long_press = 0
+        self.pwk_key_press = 0
+        self.pwk_key_timer = osTimer()
+        #self.pwk_key = ExtInt(ExtInt.GPIO26, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_DISABLE, self.pwk_extint_cb)
+        
+        self.pwk_key.enable() 
+        print("AI_dev:1")
+        self.btnInfo_queue = Queue(100)
+        self.btnInfo_queue_count = 0
+        _thread.stack_size(16*1024)
+        self.btnInfo_queue_thread_id = _thread.start_new_thread(self.btnInfo_queue_thread, ())
+        _thread.stack_size(8*1024)
+        EventMesh.subscribe("publish_AI_btnInfo",self.publish_AI_btnInfo)
+        EventMesh.subscribe("get_battery",self.get_battery)
+        EventMesh.subscribe("audio_montage_play",self.audio_montage_play)
+        EventMesh.subscribe("paly_iccid_imei",self.paly_iccid_imei)
+        EventMesh.subscribe("paly_device_res_error",self.paly_device_res_error)
+        print("AI_dev:2")
+        self.pk = PowerKey()
+        self.pk.powerKeyEventRegister(self.powerKey_callback)
+        self.usb = USB()
+        self.usb.setCallback(self.usb_event_cb)
+        self.usb_status = self.usb.getStatus()
+        self.usb_charge_flag = 0 
+        self.Low_power_warning_timer = 0
+        self.AI_dev_timer = osTimer()
+        self.AI_dev_timer.start(10000, 1, self.AI_dev_timer_cb)
+        print("AI_dev:AI_dev_timer")
+        self.aud = audio.Audio(0)
+        self.Low_power_warning_flag = 0
+        self.VC_TTS_volume =  EventMesh.publish("get_storage_config","VC_TTS_volume")#音量配置
+        if self.VC_TTS_volume == None:
+            self.VC_TTS_volume = 100
+        self.aud.setVolume(self.VC_TTS_volume //10)
+        #self.aud.play(1,0,'U:/static/xianyikaiji.mp3')#开机音频
+        #EventMesh.publish("audio_montage_play",["xianyikaiji.mp3"])
+        #EventMesh.publish("publish_AI_btnInfo",{"func":self.ntptime_cb})
+        self.check_rest_timer_count = 0
+        print("AI_dev:end")
+    def ntptime_cb(self):
+        #ntptime.settime(8)
+        print("timer:{}!!!!!!!!\r\n".format(utime.localtime()))
+    def usb_event_cb(self, state):
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.usb_event,"data":state})
+
+    def usb_event(self, state):    
+        status = state
+        self.usb_charge_flag = 0
+        if status == 1:#插入USB
+            print("charge R_CHARGE_in")
+            self.usb_status = 1
+            VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")#获取vc是否在运行
+            if VC_satrt_flag == None:
+                VC_satrt_flag = 0
+            if VC_satrt_flag == 0:
+                self.aud.stop()
+                #EventMesh.publish("flicker_led_red")#充电闪灯
+                #self.aud.play(1,1,'U:/static/R_CHARGE_IN.mp3')
+                EventMesh.publish("open_led_red")#充电红灯常亮
+                EventMesh.publish("audio_montage_play",["R_CHARGE_IN.mp3"])
+            self.Low_power_warning_flag  = 0
+            pass
+        elif status == 0:#拨出usbs
+            self.usb_status = 0
+            VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")#获取vc是否在运行
+            if VC_satrt_flag == None:
+                VC_satrt_flag = 0
+            if VC_satrt_flag == 0:
+                self.aud.stop()
+                EventMesh.publish("close_led")
+                EventMesh.publish("audio_montage_play",["R_CHARGE_OUT.mp3"])
+                #self.aud.play(1,1,'U:/static/R_CHARGE_OUT.mp3')
+    def btnInfo_queue_thread(self):
+        while True:
+            data = self.btnInfo_queue.get()
+            self.btnInfo_queue_count-=1
+            #EventMesh.debug_log("Info_queue:data = {}".format(data))
+            if data != None:
+                try:
+                    if "data" in data :
+                        data["func"](data["data"])
+                    else :
+                        data["func"]()
+                except Exception as e:
+                    #EventMesh.debug_log("btnInfo_queue:ERROR:{}".format(e))
+                    usys.print_exception(e)
+    def publish_AI_btnInfo(self,event,msg):
+        #print("publish_AI_btnInfo 1")
+        self.btnInfo_queue.put(msg)
+        self.btnInfo_queue_count+=1
+        if self.btnInfo_queue_count > 80:
+            self.btnInfo_queue_count =0
+            print("事件处理线程队列出问题,重启!!!!!!!!!!!!!!")
+            print("线程:{} 队列:{}".format(_thread.threadIsRunning(self.btnInfo_queue_thread_id),self.btnInfo_queue.size()))
+            # if _thread.threadIsRunning(self.btnInfo_queue_thread_id):
+            #     _thread.stop_thread(self.btnInfo_queue_thread_id)
+            # _thread.stack_size(10*1024)
+            # self.btnInfo_queue_thread_id = _thread.start_new_thread(self.btnInfo_queue_thread, ())
+            # _thread.stack_size(8*1024)
+            # self.btnInfo_queue.clear()
+            # self.btnInfo_queue = Queue(100)
+            EventMesh.publish("VC_error") #播放报错
+            utime.sleep_ms(1000)
+            self.aud.stopPlayStream()
+            self.aud.stopAll()
+            Power.powerRestart()
+            EventMesh.publish("set_storage_config",["powerRestart",1])
+        #print("publish_AI_btnInfo 2")
+    def powerKey_callback(self, status):
+        print("powerKey_callback:{}".format(status))
+
+    def pwk_extint_cb(self,args):#pwk
+        try:
+            self.pwk_key_status = int(args[1])
+            if self.pwk_key_status == 0:
+                self.pwk_key_status = 1
+            else:
+                self.pwk_key_status = 0
+                pass
+            if self.pwk_key_status == 0:#按下
+                
+                if self.pwk_key_press == 0 :
+                    self.pwk_key.disable()
+                    self.pwk_key_press = 1
+                    self.pwk_key_long_press = 0
+                    self.pwk_key_timer.start(100, 1, self.pwk_key_timer_cb)
+                    self.pwk_key_timer_count = 0
+                    #EventMesh.publish("AI_key_press")
+        except Exception as e: 
+            usys.print_exception(e)
+    def pwk_key_timer_cb(self, *args, **kwargs):
+    #     EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_timer_cb_})
+    # def pwk_key_timer_cb_(self) :
+        try:
+            self.pwk_key_status = self.pwk_key.read_level()
+            self.pwk_key_timer_count +=1
+            if self.pwk_key_timer_count >= 10*3: #长按3s 
+                #print("pwk_key_long_press {}".format(self.pwk_key_long_press))
+                if self.pwk_key_long_press == 0:
+                        self.pwk_key_long_press = 1
+                        #EventMesh.publish("AI_key_long_press")
+                        EventMesh.publish("audio_montage_play",["zhengzaiguanji.mp3"])
+                        #self.aud.play(1,0,'U:/static/zhengzaiguanji.mp3')#关机音频
+                        EventMesh.publish("open_led_red")
+                        utime.sleep_ms(2000)
+                        self.aud.stopPlayStream()
+                        self.aud.stopAll()
+                        Power.powerDown()
+                        #print("AI_key_release")
+                        EventMesh.publish("pwk_key_long_press")
+                        #EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_Long_Press})  
+            if self.pwk_key_status == 1:#松开
+                #print("pwk_key_timer_cb:{}".format(self.pwk_key_timer_count))
+                key_count = 5
+                if dev_type == "7PIN_BK":
+                    key_count = 3
+                if self.pwk_key_timer_count >= key_count: #防抖200ms
+                    #EventMesh.publish("AI_key_release")
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_release})
+                    self.pwk_key.enable()
+                    self.pwk_key_timer.stop()
+                    self.pwk_key_timer_count = 0
+                    self.pwk_key_press = 0
+            
+        except Exception as e: 
+            usys.print_exception(e) 
+            
+    def keyAI_extint_cb(self,args):#call 2
+        try:
+            #print("AI_btn:keyAI_extint_cb{}".format(args[1]))
+            self.KeyAI_status = int(args[1])
+            if self.KeyAI_status == 0:
+                self.KeyAI_status = 1
+            else:
+                self.KeyAI_status = 0
+            
+            if self.KeyAI_status == 0:#按下
+                if self.KeyAI_press == 0 :
+                    EventMesh.publish(constants.EVENT.SYSTEM_UP)#唤醒休眠
+                    self.extint_AI.disable()
+                    self.KeyAI_press = 1
+                    self.KeyAI_long_press = 0
+                    self.KeyAI_timer.start(100, 1, self.KeyAI_timer_cb)
+                    self.KeyAI_timer_count = 0
+                    #EventMesh.publish("AI_key_press")
+                    if dev_type == "7PIN" :
+                        self.aud.aud_tone_play(10,200)#播放按键音
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_press})  
+        except Exception as e: 
+            usys.print_exception(e)
+    def KeyAI_timer_cb(self, *args, **kwargs):
+    #     EventMesh.publish("publish_AI_btnInfo",{"func":self.KeyAI_timer_cb_})
+    # def KeyAI_timer_cb_(self):
+        try:
+            self.KeyAI_status = self.extint_AI.read_level()
+            self.KeyAI_timer_count +=1
+            if self.KeyAI_timer_count >= 10*1: #长按3s 
+                if self.KeyAI_long_press == 0:
+                        self.KeyAI_long_press = 1
+                        #EventMesh.publish("AI_key_long_press")
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_long_press})  
+            if self.KeyAI_status == 1:#松开
+                #print("KeyAI_timer_cb:{}".format(self.KeyAI_timer_count))
+                key_count = 5
+                if dev_type == "7PIN_BK":
+                    key_count = 3
+                if self.KeyAI_timer_count >= key_count: #防抖200ms
+                    #EventMesh.publish("AI_key_release")
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_release})  
+                    self.extint_AI.enable()
+                    self.KeyAI_timer.stop()
+                    self.KeyAI_timer_count = 0
+                    self.KeyAI_press = 0
+            
+        except Exception as e: 
+            usys.print_exception(e) 
+       
+    def AI_key_press(self):
+        self.check_rest_timer_count = 0
+        print("AI_key_press")
+        EventMesh.publish("AI_key_press")
+
+    def AI_key_long_press(self):
+        self.check_rest_timer_count = 0
+        print("AI_key_long_press")
+        EventMesh.publish("AI_key_long_press")
+        
+    def AI_key_release(self):
+        print("AI_key_release")
+        EventMesh.publish("AI_key_release")
+        
+    def pwk_key_Long_Press(self):
+        self.check_rest_timer_count = 0
+        print("pwk_key_long_press!!!!!!!")
+        print("pwk_key_long_press!!!!!!!")
+        
+        # EventMesh.publish("paly_iccid_imei")
+        # return
+        EventMesh.publish("audio_montage_play",["zhengzaiguanji.mp3"])
+        #self.aud.play(1,0,'U:/static/zhengzaiguanji.mp3')#关机音频
+        EventMesh.publish("open_led_red")
+        utime.sleep_ms(3000)
+        self.aud.stopPlayStream()
+        self.aud.stopAll()
+        Power.powerDown()
+        #print("AI_key_release")
+        EventMesh.publish("pwk_key_long_press")
+        
+    def pwk_key_release(self):
+        self.check_rest_timer_count = 0
+        #print("pwk_key_release")
+        EventMesh.publish("pwk_key_release")
+
+    
+    def wdt_timer_cb(self, *args, **kwargs):
+        if self.is_wdt == 1:
+            self.wdt.feed()
+
+    def AI_dev_timer_cb(self, *args, **kwargs):
+        #print("AI_dev_timer_cb")
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_dev_timer_event})  
+    def AI_dev_timer_event(self):
+        if self.is_wdt == 1:
+            self.wdt.feed()
+        VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")#获取vc是否在运行
+        if VC_satrt_flag == None:
+            VC_satrt_flag = 0
+        Vbatt = Power.getVbatt()
+        if self.usb_status == 1 and VC_satrt_flag == 0:
+            EventMesh.publish("open_led_red")#充电红灯常亮
+        if  self.usb_status == 1 and Vbatt>=self.VBATT_tab["charge_full"]and VC_satrt_flag == 0:#充电充满
+            EventMesh.publish("open_led_green")
+            if self.usb_charge_flag == 0 :
+                EventMesh.publish("audio_montage_play",["R_CHARGE_FULL.mp3"])
+                #self.aud.play(1,0,'U:/static/R_CHARGE_FULL.mp3')#充电已满
+                self.usb_charge_flag = 1
+        if  self.usb_status == 0 and Vbatt<self.VBATT_tab["20"]and VC_satrt_flag == 0 and self.Low_power_warning_flag ==0:#低电报警
+            self.Low_power_warning_flag  = 1
+            EventMesh.publish("flicker_led_red")
+            #self.aud.play(1,0,'Low_power_warning.mp3')
+            # self.Low_power_warning_timer+=1
+            # if self.Low_power_warning_timer >= 2:
+            #     self.Low_power_warning_timer = 0
+            EventMesh.publish("audio_montage_play",["Low_power_warning.mp3"])
+
+        if  self.usb_status == 0 and Vbatt<self.VBATT_tab["5"]:    
+            EventMesh.publish("audio_montage_play",["didianguanji.mp3"])
+            utime.sleep_ms(4500)
+            self.aud.stopPlayStream()
+            self.aud.stopAll()
+            Power.powerDown()
+
+        self.check_rest_timer_count += 1
+        if self.check_rest_timer_count >= 8640:#24小时没按键,则关机
+            self.pwk_key_Long_Press()
+        
+    def get_battery(self, event=None, msg=None):
+        Vbatt = Power.getVbatt()
+        if Vbatt>self.VBATT_tab["90"]:
+            return 100
+        if Vbatt>self.VBATT_tab["80"]:
+            return 90
+        if Vbatt>self.VBATT_tab["60"]:
+            return 80
+        if Vbatt>self.VBATT_tab["40"]:
+            return 60
+        if Vbatt>self.VBATT_tab["20"]:
+            return 40
+        if Vbatt>self.VBATT_tab["10"]:
+            return 20
+        if Vbatt<=self.VBATT_tab["10"]:
+            return 10
+    def audio_montage_play(self,event,msg):
+        self.aud.stopPlayStream()
+        self.aud.stopAll()
+        str_data='mp3files='
+        for i in msg:
+            try:
+                str_tmp = i.replace(".mp3","")
+                str_data+="{}.mp3+".format(audio_buf.index(str_tmp))
+            except Exception as e:
+                    usys.print_exception(e)    
+        str_data = str_data[:-1]
+        print("audio_montage_play:{}".format(str_data))
+        self.aud.montage_play('U:/static/audio.bin',1,1,str_data)
+        
+    def paly_iccid_imei(self,event,msg):
+        str_data = 'mp3files={}.mp3+'.format(audio_buf.index("liuliangtishi"))#流量提示
+        imei  = modem.getDevImei()
+        iccid = sim.getIccid()
+        print("paly_iccid_imei:ICCID:{}".format(iccid))
+        if iccid != -1 and len(iccid) > 5:
+            iccid = iccid.upper()
+            if len(iccid) <20:
+                for i in range(20-len(iccid)):
+                    iccid = "0"+iccid
+            str_data += '{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+'.format(audio_buf.index("R_READ_TIME_{}".format(iccid[0]))\
+                ,audio_buf.index("R_READ_TIME_{}".format(iccid[1])),audio_buf.index("R_READ_TIME_{}".format(iccid[2])),audio_buf.index("R_READ_TIME_{}".format(iccid[3])),\
+                audio_buf.index("R_READ_TIME_{}".format(iccid[4])),audio_buf.index("R_READ_TIME_{}".format(iccid[5])),audio_buf.index("R_READ_TIME_{}".format(iccid[6])),audio_buf.index("R_READ_TIME_{}".format(iccid[7])),\
+                audio_buf.index("R_READ_TIME_{}".format(iccid[8])),audio_buf.index("R_READ_TIME_{}".format(iccid[9])),audio_buf.index("R_READ_TIME_{}".format(iccid[10])),audio_buf.index("R_READ_TIME_{}".format(iccid[11])),\
+                audio_buf.index("R_READ_TIME_{}".format(iccid[12])),audio_buf.index("R_READ_TIME_{}".format(iccid[13])),audio_buf.index("R_READ_TIME_{}".format(iccid[14])),audio_buf.index("R_READ_TIME_{}".format(iccid[15])),\
+                audio_buf.index("R_READ_TIME_{}".format(iccid[16])),audio_buf.index("R_READ_TIME_{}".format(iccid[17])),audio_buf.index("R_READ_TIME_{}".format(iccid[18])),audio_buf.index("R_READ_TIME_{}".format(iccid[19])))
+        str_data += '{}.mp3+'.format(audio_buf.index("shouhou"))#可联系售后解决,联系方式见售后客服电话是400-886-8777或到微信公众号柒牌SEVENBRAND自行充值:
+        self.aud.montage_play('U:/static/audio.bin',1,1,str_data)
+    #鉴权出错,播放imei号
+    def paly_device_res_error(self,event,msg):
+        str_data = 'mp3files={}.mp3+'.format(audio_buf.index("jianquancuowu"))#AI功能异常,请联系客户查询,设备号为:
+        imei  = modem.getDevImei()
+        imei = imei.upper()
+        str_data += '{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(imei[0]))\
+                ,audio_buf.index("R_READ_TIME_{}".format(imei[1])),audio_buf.index("R_READ_TIME_{}".format(imei[2])),audio_buf.index("R_READ_TIME_{}".format(imei[3])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[4])),audio_buf.index("R_READ_TIME_{}".format(imei[5])),audio_buf.index("R_READ_TIME_{}".format(imei[6])),audio_buf.index("R_READ_TIME_{}".format(imei[7])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[8])),audio_buf.index("R_READ_TIME_{}".format(imei[9])),audio_buf.index("R_READ_TIME_{}".format(imei[10])),audio_buf.index("R_READ_TIME_{}".format(imei[11])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[12])),audio_buf.index("R_READ_TIME_{}".format(imei[13])),audio_buf.index("R_READ_TIME_{}".format(imei[14])))
+        #print("str_data:{}".format(str_data))
+        self.aud.montage_play('U:/static/audio.bin',1,1,str_data)
+
+#存储信息
+class getStorageDataManager(Abstract):#获取内存数据
+        def __init__(self):
+            self.config_data = {}
+            check = ql_fs.path_exists("/usr/static/storage_file/config.json")
+            if check == True:
+                with open("/usr/static/storage_file/config.json","r") as fd:
+                    self.config_data = ujson.load(fd)
+            else :
+                self.config_data = {'old_time': 0, 'flip_sw': 0}
+                pass
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_storage_data", self.set_storage_data)
+            EventMesh.subscribe("set_storage_config", self.set_storage_config)
+            EventMesh.subscribe("get_storage_data", self.get_storage_data)
+            EventMesh.subscribe("get_storage_config", self.get_storage_config)
+
+        def set_storage_data(self, event, msg): 
+            # EventMesh.debug_log("set_storage_data:{}".format(msg))
+            if msg != None:
+                self.config_data = msg
+                with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:
+                    ujson.dump(self.config_data,fd)
+        
+
+        def set_storage_config(self,event,msg): 
+            # EventMesh.debug_log("set_storage_key_data1:{}".format(msg))
+            if len(msg) >= 2:
+                self.config_data[msg[0]]=msg[1]
+                # EventMesh.debug_log("set_storage_key_data2:{}".format(self.config_data[msg[0]]))
+                EventMesh.publish("publish_message_event_ui",{"func":self.set_storage_save,"data":0})
+        def set_storage_save(self, data): 
+            with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:
+                ujson.dump(self.config_data,fd)
+        def get_storage_data(self, event, msg): 
+            # EventMesh.debug_log("get_storage_data:{}".format(self.config_data))
+            return self.config_data 
+        def get_storage_config(self,event,msg):
+            # EventMesh.debug_log("get_storage_key_data1:{}".format(msg))
+            b = msg in self.config_data.keys()
+            if b == True:
+                # EventMesh.debug_log("get_storage_key_data2:{}".format(self.config_data[msg]))
+                return self.config_data[msg]
+            else :
+                return None
+            # try:
+            #     return self.config_data[msg]
+            # except:
+            #     EventMesh.debug_log("get_storage_key_data:none key:{}",msg)
+            #     return None
+#设备资源授权平台
+class device_res_author(Abstract):
+   
+    def __init__(self) :
+        print("device_res_author __init__ start !!!!!!!!!!!!!!!!!")
+        self.deviceId = modem.getDevImei()#"876226002022574"
+        self.SHA1_BLOCK_SIZE = 64
+        self.PAD_BLOCK_SIZE = 16
+        self.SHA256 = uhashlib.sha256
+        self.pad = lambda s: s + chr(self.PAD_BLOCK_SIZE - len(s) % self.PAD_BLOCK_SIZE) * (self.PAD_BLOCK_SIZE - len(s) % self.PAD_BLOCK_SIZE)
+        # 除去补16字节的多余字符
+        self.unpad = lambda s: s[:-s[-1]]
+        #K01
+        # self.key = b"MWrMZjdtcPhj41jWuoqFAhTmqyFluqj1" 
+        # self.pid = "qAtdDOGXgXYjT2HGFr3a"
+        #G15
+        # self.key = b"3LWfBicxfRZ3ZAqmZCFuvMdGUXdAFWkb" 
+        # self.pid = "qLx4Pu4mSUQxyfVKGLXG"
+        #7pin
+        self.key = b"uKLrChwrxA1LklgBc3VwawYjUkbT3BgX" 
+        self.pid = "cqxJZi5CNgzjS3mX21Zw"
+        
+        self.dev_res_timer = osTimer()
+        self.dev_res_timer.start(20000, 1, self.dev_timer_cb)
+        self.dev_res_timerCount = 0
+        self.ud_token_timer = osTimer()
+        self.ud_token_timer.start(10000, 1, self.ud_token_timer_cb)
+        self.ud_token_timer_Count = 0
+        self.dev_token = None
+        self.res_error_count = 0
+        self.ntptime_flag = 0
+        EventMesh.subscribe("get_dev_token", self.get_dev_token)
+        EventMesh.subscribe("update_dev_token", self.update_dev_token)
+        EventMesh.subscribe("dev_active", self.dev_active)
+        EventMesh.subscribe("dev_sign_in", self.dev_sign_in)
+        EventMesh.subscribe("dev_NTP", self.dev_NTP)
+        #EventMesh.publish_async("dev_NTP",thread_size = 8192)
+
+        # count = 0
+        # while True:
+        #     if self.ntptime_flag == 1:
+        #         break
+        #     utime.sleep_ms(1)
+        #     count+=1
+        #     if count>600:
+        #         break
+        # EventMesh.publish_async("dev_active",thread_size = 8192)
+        # EventMesh.publish_async("dev_sign_in",thread_size = 8192)
+
+        self.dev_NTP()#获取时间
+        self.dev_active() #设备激活
+        self.dev_sign_in() #设备登入
+        print("device_res_author __init__ end !!!!!!!!!!!!!!!!!")
+
+    def get_dev_token(self, event, msg): 
+        return self.dev_token
+    #网络校时
+    def dev_NTP(self, event=None, msg=None):
+        response = None
+        try:
+            print("dev_NTP1")
+            url = "http://dmp.raisound.com/bz-api/dev/time"
+            response = request.get(url,timeout=5)
+            data = response.json()
+            print("dev_NTP:{}".format(data))
+            if data:
+                try:
+                    timeSecond = data["data"]["timestamp"]//1000
+                    
+                    next_alarm_time = utime.localtime(timeSecond)
+                    print("timeSecond {} next_alarm_time {}".format(timeSecond,next_alarm_time))
+                    machine.RTC().datetime((next_alarm_time[0],next_alarm_time[1],next_alarm_time[2],next_alarm_time[6],next_alarm_time[3],next_alarm_time[4],next_alarm_time[5],0))
+                    self.ntptime_flag  = 1
+                except Exception as e:
+                        usys.print_exception(e)
+        except Exception as e:
+            usys.print_exception(e)
+        if response != None:
+            response.close() 
+        print("dev_NTP end")
+    def dev_timer_cb(self, *args): #设备资源管理鉴权平台定时器
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.dev_timer_cb_}) 
+
+    def dev_timer_cb_(self):    
+        #if EventMesh.DEV_RES_MANAGE_AUTHEN_PLATFORM == 1:
+        try:
+            if self.dev_token == None:
+                if self.ntptime_flag == 0:
+                    self.ntptime_flag  = 1
+                    EventMesh.publish_async("dev_NTP",thread_size = 8192)
+                    #EventMesh.publish("publish_AI_btnInfo",{"func":self.dev_NTP})
+                print("timer:{}!!!!!!!!\r\n".format(utime.localtime()))
+                EventMesh.publish_async("dev_active",thread_size = 8192)
+                EventMesh.publish_async("dev_sign_in",thread_size = 8192)
+                # self.dev_active() #设备激活
+                # self.dev_sign_in() #设备登入
+                self.dev_res_timerCount+=1
+                if self.dev_res_timerCount > 3: #开机一分钟内没有获取到密码和token 等下一次更新令牌在走登入 激活流程
+                    self.dev_res_timerCount=0
+                    self.dev_res_timer.stop()
+        except Exception as e:
+            usys.print_exception(e)
+    def ud_token_timer_cb(self, *args): 
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.ud_token_timer_cb_}) 
+
+    def ud_token_timer_cb_(self):   
+        try:
+            #print("ud_token_timer_!!!!")
+            self.ud_token_timer_Count+=1
+            if self.ud_token_timer_Count >= 720: #定时10*3000s时更新token
+                self.ud_token_timer_Count = 0
+                EventMesh.publish_async("dev_sign_in",thread_size = 8192)
+        except Exception as e:
+            usys.print_exception(e)    
+    def get_sim_Status(self):
+        return sim.getStatus() 
+    def HMAC(self,k, m):
+    
+        KEY_BLOCK = k + (b'\0' * (self.SHA1_BLOCK_SIZE - len(k)))
+        KEY_INNER = bytes((x ^ 0x36) for x in KEY_BLOCK)
+        KEY_OUTER = bytes((x ^ 0x5C) for x in KEY_BLOCK)
+        inner_message = KEY_INNER + m
+        outer_message = KEY_OUTER + self.SHA256(inner_message).digest()
+        return self.SHA256(outer_message)
+    def get_hmac_sha256(self,k, m):
+        data = self.HMAC(k, m).digest()
+        # print("HMAC(k, m).digest():", data)
+        # print("HMAC(k, m).digest():", ubinascii.hexlify(data))
+        hex_data = ubinascii.hexlify(data)
+        hex_data = hex_data.decode('ascii')
+        return hex_data
+    # 加密函数
+    def aes_CBC_Encrypt(self,data, key, iv):  # CBC模式的加密函数,data为明文,key为16字节密钥,iv为16字节的偏移量
+        key = key.encode('utf-8')
+        iv = iv.encode('utf-8')  # CBC 模式下的偏移量
+        data = self.pad(data)  # 补位
+        data = data.encode('utf-8')
+        aes = ucryptolib.aes(key,ucryptolib.MODE_CBC,iv)
+        result = base64.b64encode(aes.encrypt(data))
+        return str(result, 'utf-8')  # 以字符串的形式返回
+
+    # 解密函数
+    def aes_CBC_Decrypt(self,data, key, iv):  # CBC模式的解密函数,data为密文,key为16字节密钥
+        key = key.encode('utf-8')
+        iv = iv.encode('utf-8')
+        
+        aes = ucryptolib.aes(key,ucryptolib.MODE_CBC,iv) #CBC模式
+
+        # decrypt AES解密  B64decode为base64 转码
+        result = aes.decrypt(base64.b64decode(data))
+        result = self.unpad(result)  # 除去补16字节的多余字符
+        return str(result, 'utf-8')  # 以字符串的形式返回
+    #激活接口 没有密码走激活
+    def dev_active(self, event=None, msg=None):
+        signal = net.csqQueryPoll()
+        if signal == -1 or self.get_sim_Status() != 1:#网络不正常
+            print("dev_active 无 SIM卡!!!!!!!!\r\n")
+            return
+        print("dev_active 1\r\n")
+        # 签名内容: = deviceId+pid+timeStamp
+        dev_pass = ""
+        dev_pass = EventMesh.publish("get_storage_config","dev_pass")
+        print("dev_pass:{}\r\n".format(dev_pass))
+        if dev_pass == None:
+            dev_pass = ""
+        if dev_pass == "" or dev_pass == None:
+            try:
+                date_tmp = utime.localtime() #获取当前时间
+                print("date_tmp:{}\r\n".format(date_tmp)) #转换时间戳s
+                timeStamp = (utime.mktime(date_tmp))*1000#获取时间戳ms
+                deviceId = self.deviceId #"876226002022574" #以imei号
+                pid = self.pid
+                key = self.key
+                sign_data = "{}{}{}".format(deviceId,pid,timeStamp)  #签名内容
+                print("sign_data:{}\r\n".format(sign_data))
+                sha256_hex = self.get_hmac_sha256(key,sign_data)
+                print("sha256_hex:{}\r\n".format(sha256_hex))
+
+                data = {
+                    "deviceId":"{}".format(deviceId), #设备名
+                    "pid":pid, #产品PID
+                    "sign":"{}".format(sha256_hex), #HMACSHA256签名后的数据
+                    "timeStamp":timeStamp, #要以ms的形式
+                    "signMethod":"HMACSHA256" #签名方式 HMACSHA256
+                }
+                print(ujson.dumps(data))
+                headers_T ={"Content-Type":"application/json"}
+                url = "http://dmp.raisound.com/bz-api/dev/auth/active"
+                data =ujson.dumps(data)
+                response = None
+                response_result = 0
+                try:
+                    response = request.put(url,data=data,headers = headers_T,timeout=5)
+                    response_result = 1
+                except Exception as e:
+                    usys.print_exception(e)   
+                    print("put error!!!!!\r\n")
+                    response_result = 0
+                
+                IV = "" #偏移量
+                PASSWORD= "" #服务器返回后的加密内容 密码
+                if response_result == 1: #访问成功ip
+                    if response.status_code == 200:
+                        print("headers:{}".format(response.headers))
+                        content = response.content
+                        c = next(content)
+                        # "api.xcloudtech.com"
+                        # d_server_port = 9000
+                        data =  ujson.loads(c)
+                        # data = response.json()
+                        print("data-{}".format(data))
+                        if data != None:
+                            if "success" in data:
+                                if data['success'] == True:
+                                    if "data" in data:
+                                        data_tmp = data["data"]
+                                        if "nonce" in data_tmp: #偏移量
+                                            IV = data_tmp["nonce"]
+                                        if "password" in data_tmp:
+                                            PASSWORD = data_tmp["password"]
+                                            # EventMesh.publish("set_storage_config",["dev_pass",PASS])
+                                if data["code"] == 20001:#鉴权成功
+                                    pass
+                                elif data["code"] > 50000:#时间错误
+                                    self.res_error_count+=1
+                                    if self.res_error_count>=3:
+                                        self.res_error_count = 0
+                                        #EventMesh.publish("paly_device_res_error")
+                                    if data["code"] == 50003:#时间错误
+                                        self.ntptime_flag  = 0
+                        if PASSWORD != None and IV != None:
+                            if len(PASSWORD) != 0 and len(IV) != 0:
+                                password = PASSWORD
+                                iv = IV
+                                #解密 之后保存本地下一次登入做使用
+                                decrypt_data = self.aes_CBC_Decrypt(password, self.key, iv) #对服务器下发的密码进行解密
+                                print("decrypt_data {}".format(decrypt_data))
+                                EventMesh.publish("set_storage_config",["dev_pass",decrypt_data])    
+                    print("IV:{}\r\n PASS:{}".format(IV,PASSWORD))
+                if response != None:
+                    response.close()  
+            except Exception as e:
+                usys.print_exception(e)   
+            print("dev_active end\r\n")
+            return [response_result,PASSWORD,IV]
+    #随机生成16个字节的字符串作为加密的IV 偏移量
+    def generate_random_string(self,length=16): 
+        random_str = ""
+        chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
+        for i in range(length):
+            random_str+=chars[random.randint(0,length)]
+        return random_str
+
+    #设备登入 没有Token 走登入获取token
+    def dev_sign_in(self, event=None, msg=None):
+        signal = net.csqQueryPoll()
+        if signal == -1 or self.get_sim_Status() != 1:#网络不正常
+            print("dev_sign_in 无 SIM卡!!!!!!!!\r\n")
+            return
+        print("dev_sign_in 1")
+        token = ""
+        try:
+            token = self.dev_token
+            dev_pass = EventMesh.publish("get_storage_config","dev_pass") 
+            #print("token:{}\r\n".format(token))
+            if token == None:
+                token = ""
+            if dev_pass == None:
+                dev_pass = ""
+            if len(dev_pass) == 0:#没有密码
+                return
+            #if token == None or token == "":
+            if 1: #返回结果成功
+                #获取本地保存的密码
+                decrypt_data=EventMesh.publish("get_storage_config","dev_pass")
+                # decrypt_data = self.aes_CBC_Decrypt(password, self.key, iv) #对服务器下发的密码进行解密
+                print("decrypt_data {}".format(decrypt_data))
+                #随机生成16个字符串 设备生成做加密使用
+                random_string = self.generate_random_string(16) #随机的16个字符串
+                enc_iv = random_string #加密的IV偏移量
+                #设备端进行密码加密
+                encrypt_data = self.aes_CBC_Encrypt(decrypt_data, self.key, enc_iv)
+                print("encrypt_data {}".format(encrypt_data))
+
+                #登入数据
+                deviceId = self.deviceId
+                sign_in_data = {
+                    "deviceId":"{}".format(deviceId), #设备ID
+                    "password":"{}".format(encrypt_data), #加密的数据
+                    "nonce":"{}".format(random_string) #随机的16个字符串
+                }
+                print(ujson.dumps(sign_in_data))
+                sign_url = "http://dmp.raisound.com/bz-api/dev/auth/sign_in" #登入地址
+                headers_T ={"Content-Type":"application/json"}
+                response_result = 0
+                response = 0
+                try:
+                    response = request.post(sign_url,data=ujson.dumps(sign_in_data),headers = headers_T,timeout=5)
+                    response_result = 1
+                except Exception as e:
+                    usys.print_exception(e)   
+                    print("post error!!!!!\r\n")
+                    response_result = 0
+                # {'msg': '', 'code': 20001, 'success': True, 
+                # 'data': {'deviceId': '876226002022574', 
+                # 'token': '95436a9e09fd0ff89feb8825257dca982f'}
+                # }
+                
+                #self.dev_token = ""
+                if response_result == 1:
+                    if response.status_code == 200:
+                        content = response.content
+                        c = next(content)
+                        data =  ujson.loads(c)
+                        print("data-{}".format(data))
+                        if data != None:
+                            if "success" in data:
+                                if data['success'] == True: #登入成功
+                                    if "data" in data:
+                                        data_tmp = data["data"]
+                                        if "token" in data_tmp: #token
+                                            self.dev_token = data_tmp["token"]
+                                if data["code"] == 50003:#时间错误
+                                    self.ntptime_flag  = 0
+                print("token:{}\r\n".format(self.dev_token))
+                if response != None:
+                    response.close()
+                pass
+        except Exception as e:
+                    print("post error!!!!!\r\n")
+                    response_result = 0
+        print("dev_sign_in end")
+    #获取新的令牌 更新token
+    def update_dev_token(self, event=None, msg=None):
+        print("update_dev_token")
+        try:
+            dev_pass = ""
+            dev_pass = EventMesh.publish("get_storage_config","dev_pass")
+            
+            if dev_pass == None:
+                dev_pass = ""
+            if len(dev_pass) == 0: #没有密码走激活
+                print("no dev_pass:{}\r\n".format(dev_pass))
+                EventMesh.publish("dev_active")
+            token = self.dev_token
+            if token == None:
+                token = ""
+            if len(token) == 0: #没有token走登入
+                print("no dev_token:{}\r\n".format(token))
+                #self.dev_sign_in()
+                EventMesh.publish("dev_sign_in")
+            dev_tokenip = "http://dmp.raisound.com/bz-api/dev/auth/token" #设备新令牌更新地址
+            token = self.dev_token
+            if token == None:
+                token = ""
+            if len(token) != 0:
+                response_result=0
+                response = None
+                headers_T = {"bz-dt":"{}".format(token)}
+                try:
+                    response = request.get(dev_tokenip,headers = headers_T,timeout=5)
+                    response_result = 1
+                except Exception as e:
+                    print("get error!!!!!\r\n")
+                    response_result = 0
+                if response_result == 1:
+                    if response.status_code == 200:
+                        try:
+                            headers_data = response.headers
+                            # print("headers_data!!!!! headers_data:{}\r\n".format(headers_data))
+                            if "bz-dt" in headers_data: #bz-dt字段是否在头部数据里面 如果有就需要更新
+                                bz_dt = headers_data["bz-dt"] 
+                                self.dev_token = bz_dt.replace(" ", "") #去掉所有的空格符
+                                print("update_dev_token:{}".format(self.dev_token))
+                        except Exception as e:
+                            print("headers_data!!!!! error\r\n")
+                if response != None:
+                    response.close()
+        except Exception as e:
+            usys.print_exception(e)   
+        print("update_dev_token end")
+        
+#OTA升级
+class OTA():
+    def __init__(self):
+        #EventMesh.subscribe("min_sys_ota",self.min_sys_ota)
+        self.downloadFileVoURL1= ""
+        self.downloadFileVoURL2= ""
+    #小系统升级,返回0,没有升级;返回,1有升级,正在执行升级;返回2,电压不够
+    def min_sys_ota(self,event=None,msg=None):
+        print("min_sys_ota")
+        signal = net.csqQueryPoll()
+        if signal == -1 or sim.getStatus()  != 1:#网络不正常
+            print("min_sys_ota 无 SIM卡!!!!!!!!\r\n")
+            return 0
+        # return 0
+        response = None
+        ret_str =0
+        self.downloadFileVoURL1= ""
+        self.downloadFileVoURL2= ""
+        try:
+            sourceVersion = versions.Build_Time
+            sourceVersion = "7PIN-"+sourceVersion[:10]+"-"+sourceVersion[11:-3]
+            print("sourceVersion:{}".format(sourceVersion))
+            sourceVersion = sourceVersion.replace(" ", "0")
+            print("sourceVersion2:{}".format(sourceVersion))
+            #url = "http://iot.api.thisiot.com/ota/task?deviceId=860132060348836&sourceVersion=2024-12-20-15:35-1"
+            url = "http://dmp.raisound.com/bz-api/ota/task?deviceId={}&sourceVersion={}".format(modem.getDevImei(),sourceVersion)
+            print(url)
+            response = request.get(url,timeout=5)
+            if response.status_code == 200:
+                data = response.json()
+                print("min_sys_ota1:{}".format(data))
+                
+                if data:
+                    try:
+                        if data["code"] == 20007:#有新版本
+                            if "fileList"in data["data"]:
+                                if len(data["data"]["fileList"]) == 2:
+                                    for fileList in data["data"]["fileList"]:
+                                        if fileList["fileName"] == "dfota_2.bin":
+                                            self.downloadFileVoURL2 = fileList["url"]
+                                        elif fileList["fileName"] == "dfota_1.bin":
+                                            self.downloadFileVoURL1 = fileList["url"]
+                            
+                        if data["code"] == 20006:#已是最新版本
+                            ret_str = 0
+                                    
+                    except Exception as e:
+                            usys.print_exception(e)
+            else:
+                print("min_sys_ota get error")
+            response.close()
+        except Exception as e:
+            usys.print_exception(e)
+            if response != None:
+                response.close()
+        
+        print("min_sys_ota:downloadFileVoURL1:{},\ndownloadFileVoURL2:{}".format(self.downloadFileVoURL1,self.downloadFileVoURL2))
+        print("min_sys_ota end") 
+        if self.downloadFileVoURL2!="" and self.downloadFileVoURL1!="":
+            battery = EventMesh.publish("get_battery")
+            if battery>=40:
+                self.ota_timer = osTimer()
+                self.ota_timer.start(15000, 0, self.ota_timer_cb)
+                ret_str =  1  
+            else:
+                ret_str =  2
+        return ret_str
+    
+    def ota_timer_cb(self, *args, **kwargs):
+        import fota
+        fota_obj = fota() 
+        fota_obj.httpDownload(url1=self.downloadFileVoURL1,url2=self.downloadFileVoURL2)
+    #ota升级结果返回,开机时调用一次即可
+    def ota_result(self,event=None,msg=None):
+        response = None
+        try:
+            currentVersion = versions.Build_Time
+            currentVersion = "7PIN-"+currentVersion[:10]+"-"+currentVersion[11:-3]
+            print("currentVersion1:{}".format(currentVersion))
+            currentVersion = currentVersion.replace(" ", "0")
+            print("currentVersion2:{}".format(currentVersion))
+            url = "http://dmp.raisound.com/bz-api/ota/result?deviceId={}&currentVersion={}".format(modem.getDevImei(),currentVersion)
+            print(url)
+            response = request.post(url,timeout=5)
+            if response.status_code == 200:
+                data = response.json()
+                print("ota_result:{}".format(data))
+            else:
+                print("ota_result  error!!!!")
+                for i in response.text:
+                    print(i)
+            response.close()
+        except Exception as e:
+            usys.print_exception(e)
+            if response != None:
+                response.close()
+    #ICCID上传
+    def pots_ICCID(self,event=None,msg=None):
+        response = None
+        try:
+            iccid = sim.getIccid()
+            if iccid != -1 and len(iccid) > 5:
+                print("pots_ICCID:{}".format(iccid))
+                #Headers = {'Transfer-Encodong':'chunked'}
+                #http://dmp.raisound.com/bz-api/dev/iccid?deviceId=866610001099679&iccid=89860002192307889057
+                url = "http://dmp.raisound.com/bz-api/dev/iccid?deviceId={}&iccid={}".format(modem.getDevImei(),iccid)
+                print(url)
+                response = request.post(url,timeout=5)
+                if response.status_code == 200:
+                    data = response.json()
+                    print("pots_ICCID:{}".format(data))
+                else:
+                    print("pots_ICCID  error!!!!")
+                    for i in response.text:
+                        print(i)
+                response.close()
+        except Exception as e:
+            usys.print_exception(e)
+            if response != None:
+                response.close()
+#阿里VC状态枚举
+VC_State_None=0
+VC_State_Listening=1#听
+VC_State_SpeechStart=2#说开始
+VC_State_SpeechIng=3#正在说
+VC_State_SpeechEnd=4#说结束
+VC_State_RequestToRespond=5 #TTS请求或者chat请求
+VC_State_Thinking=6#想(chat)
+VC_State_Responding=7#音频播放
+VC_State_TTSStart=8
+VC_State_TTSData=9
+VC_State_TTSFinish=10
+VC_State_TTSEnd=11
+VC_State_TTSError=12
+VC_State_DialogError=13
+VC_State_End=14
+
+VC_record_TYPE_PCM = 0
+VC_record_TYPE_AMR = 1
+VC_play_TYPE_PCM = 0
+VC_play_TYPE_MP3 = 1
+
+#websocket发送数据编号
+# AI_client_asr_num = 0
+# AI_client_chat_num = 1
+# AI_client_tts_num = 2
+AI_client_VC_num = 3
+AI_client_asr_num = 4
+
+
+class AI_VC(Abstract):
+    # AI
+    
+    def __init__(self):
+        try:
+            self.http_get_config()#获取/更新配置参数
+        except Exception as e:
+            usys.print_exception(e)
+        self.VC_30S_timer = osTimer()
+        self.VC_30S_timer.start(30000, 1, self.VC_30S_timer_cb)
+        self.get_config_timer_count = 0
+        self.record_data_save_flag = 0 #是否保存录音文件
+        self.play_data_save_flag = 0 #是否保存tts数据到文件
+        self.record_fd = None
+        self.play_fd = None
+        self.is_VC_ACK = 0 #是否开启ack应答模式
+        self.is_long_record = 0 #是否开启长录音模式(语音打断模式)
+        self.ai_OTA = OTA()
+        self.is_auth = 0 #是否开启dmp鉴权
+        #self.VC_mode = 0 #0:短按连续问答模式 1:长按录音模式
+        self.VC_mode = EventMesh.publish("get_storage_config","VC_mode")#
+        if self.VC_mode == None :
+            self.VC_mode = 0
+        self.is_up_error= 0 #是否上传错误id
+        self.error_data = []
+        self.asr_taskid  = ""
+        self.VC_taskid  = ""
+        self.VC_server = 2 #0柒牌正式服务器,1:测试服务器1,2:测试服务器2
+
+        self.server_ip = EventMesh.publish("get_storage_config","server_ip")#
+        if self.server_ip == None:
+            if self.VC_server == 1:# 
+                self.server_ip="118.145.158.207:22083"
+            elif self.VC_server == 2:# 
+                self.server_ip="118.145.158.207:22082"
+            elif self.VC_server == 4:# 
+                self.server_ip="118.145.158.207:22084"
+            elif self.VC_server == 5:# 
+                self.server_ip="amp-wss.raisound.com"
+            elif self.VC_server == 6:# 
+                self.server_ip="118.145.158.207:22080"
+            else:
+                self.server_ip="sevenpin.qipai.com.cn"
+
+            if dev_type == 'momo':# 
+                self.server_ip="118.145.158.207:22080"
+            elif dev_type == "7PIN":
+                self.server_ip="sevenpin.qipai.com.cn"
+            elif dev_type == "sjgq":
+                self.server_ip="118.145.158.207:22084"
+        #开机提示音
+        self.power_on_tone = EventMesh.publish("get_storage_config","power_on_tone")#
+        if dev_type != "7PIN":
+            self.power_on_tone = None
+        if self.power_on_tone == None:
+            if dev_type == "G10":
+                self.power_on_tone = "已开机,您好!我是北科瑞讯智能 AI bot_name"
+            elif dev_type == "7PIN_BK":
+                self.power_on_tone = "小瑞来了!我们一起来愉快地聊天吧!" 
+            elif dev_type == "momo":
+                self.power_on_tone = "DuloDulo,我是上古神兽食梦貘,主人可以叫我momo,我来自《山海经》,是一只以梦为食的神秘灵兽,每当颜色朦胧、人们入睡时,我就会悄悄飞到人们的床头,用我长长的鼻子把噩梦统统吞噬掉,只留下甜甜的美梦。从今往后,就由我守护在主人身边,一起度过每一个星河璀璨的夜晚。"
+            elif dev_type == "sjgq":
+                self.power_on_tone = "您好!我是巴马四季甘泉的智能助手。我可以为你解答各种各样的问题,像是有关巴马四季甘泉知识库、中基长寿科学产品、卫斯曼院士国际先进医疗中心的问题,还有日常生活与工作、旅游信息、健康咨询、教育与学习、情感交流、全球资讯、世界文化等方面的问题哦。你有没有这方面的问题想要问我呀?"
+            else:
+                self.power_on_tone = "您好!我是世界首创柒牌男装AI生活好帮手-bot_name, 很高兴为您服务,我可以帮您解答柒牌公司知识库、日常生活与工作、旅游信息、健康与运动咨询、教育与学习、情感交流、全球资讯、世界文化等问题!请问您有什么需要我帮忙的吗?" 
+                
+
+        self.VC_record_TYPE = VC_record_TYPE_PCM #0:PCM 1:AMR
+        self.VC_play_TYPE = VC_play_TYPE_PCM #0:PCM 1:mp3 
+        self.VC_record_samplerate = 16000
+        self.VC_play_samplerate = 16000
+        
+        self.VC_TTS_voice_type = EventMesh.publish("get_storage_config","VC_TTS_voice_type")#音色配置
+        if self.VC_TTS_voice_type == None or ("男" in self.VC_TTS_voice_type) == False:
+            if dev_type == "G10" or  dev_type == "7PIN_BK":
+                self.VC_TTS_voice_type = {   
+                                            "女":{
+                                            "bot_name":"小瑞",
+                                            "voice":"zh_female_wanwanxiaohe_moon_bigtts" ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "男":{
+                                            "bot_name":"小瑞",
+                                            "voice":"zh_male_wennuanahu_moon_bigtts"  ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "童":{
+                                            "bot_name":"小瑞",
+                                            "voice":"ICL_zh_female_huoponvhai_tob"  ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "粤":{
+                                            "bot_name":"小瑞",
+                                            "voice":"zh_female_wanqudashu_moon_bigtts" ,
+                                            "lang":"zh-hk" 
+                                            },
+                                            "四川":{
+                                            "bot_name":"小瑞",
+                                            "voice":"zh_female_daimengchuanmei_moon_bigtts",
+                                            "lang":"&lang=zh-cn-sc"  
+                                            },
+                                            "个性":{
+                                            "bot_name":"小瑞",
+                                            "voice":"zh_male_sunwukong_mars_bigtts" ,
+                                            "lang":"zh-cn" 
+                                            }
+                                           
+                                        }
+            elif dev_type == 'momo':
+                self.VC_TTS_voice_type = {   
+                                            "女":{
+                                            "bot_name":"食梦貘",
+                                            "voice":"zh_female_shaoergushi_mars_bigtts" ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "男":{
+                                            "bot_name":"食梦貘",
+                                            "voice":"zh_male_yangguangqingnian_mars_bigtts"  ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "童":{
+                                            "bot_name":"食梦貘",
+                                            "voice":"ICL_zh_female_huoponvhai_tob"  ,
+                                            "lang":"zh-cn"
+                                            },
+                }
+            elif dev_type == 'sjgq':
+                self.VC_TTS_voice_type = {   
+                                            "女":{
+                                            "bot_name":"小巴",
+                                            "voice":"zh_female_wanwanxiaohe_moon_bigtts" ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "男":{
+                                            "bot_name":"小巴",
+                                            "voice":"zh_male_wennuanahu_moon_bigtts"  ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "童":{
+                                            "bot_name":"小巴",
+                                            "voice":"ICL_zh_female_huoponvhai_tob"  ,
+                                            "lang":"zh-cn"
+                                            },
+                }
+            else:
+                #女,男,童,粤,川,个性声
+                self.VC_TTS_voice_type = {   
+                                            "女":{
+                                            "bot_name":"柒妹妹",
+                                            "voice":"huoshan::zh_female_wanwanxiaohe_moon_bigtts" ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "男":{
+                                            "bot_name":"柒先生",
+                                            "voice":"huoshan::zh_male_wennuanahu_moon_bigtts"  ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "童":{
+                                            "bot_name":"柒乐乐",
+                                            "voice":"huoshan::ICL_zh_female_huoponvhai_tob"  ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "粤":{
+                                            "bot_name":"柒先生",
+                                            "voice":"huoshan::zh_female_wanqudashu_moon_bigtts" ,
+                                            "lang":"zh-hk" 
+                                            },
+                                            "四川":{
+                                            "bot_name":"柒妹妹",
+                                            "voice":"huoshan::zh_female_daimengchuanmei_moon_bigtts",
+                                            "lang":"&lang=zh-cn-sc"  
+                                            },
+                                            "个性":{
+                                            "bot_name":"柒先生",
+                                            "voice":"huoshan::zh_male_sunwukong_mars_bigtts" ,
+                                            "lang":"zh-cn" 
+                                            },
+                                            "英语":{
+                                            "bot_name":"柒先生",
+                                            "voice":"huoshan::en_male_smith_mars_bigtts" ,
+                                            "lang":"zh-cn" 
+                                            }
+                                            
+                                           
+                                        }
+            
+            # self.VC_TTS_voice_type = {0:"zh_female_xinlingjitang_moon_bigtts",1:"zh_male_wennuanahu_moon_bigtts",2:"ICL_zh_female_huoponvhai_tob",
+            #                           3:"aliyun::longjiaxin",4:"zh_female_daimengchuanmei_moon_bigtts"}
+            #self.VC_TTS_voice_type = ["aliyun::longxiaoxia","aliyun::longnan","aliyun::longling"]
+            
+            #EventMesh.publish("set_storage_config",["VC_TTS_voice_type",self.VC_TTS_voice_type])
+
+        try:
+            self.VC_TTS_voice_key = EventMesh.publish("get_storage_config","VC_TTS_voice_key")#音色配置
+            if self.VC_TTS_voice_key == None :
+                if dev_type == "7PIN_BK":
+                    self.VC_TTS_voice_key = "童"
+                elif dev_type == "momo":
+                    self.VC_TTS_voice_key = "男"
+                else:
+                    self.VC_TTS_voice_key = "男"
+            if self.VC_TTS_voice_key in self.VC_TTS_voice_type:
+                pass
+            else:
+                self.VC_TTS_voice_key = list(self.VC_TTS_voice_type.keys())[0]
+            print("音色配置:{}:{}\r\n\r\n".format(self.VC_TTS_voice_key,self.VC_TTS_voice_type[self.VC_TTS_voice_key]))
+            self.VC_TTS_volume =  EventMesh.publish("get_storage_config","VC_TTS_volume")#音量配置
+        except Exception as e:
+            usys.print_exception(e)
+
+        if self.VC_TTS_volume == None:
+            self.VC_TTS_volume = 100
+        self.AI_audio_queue_thread_id = 0
+        self.AI_audio_queue_thread_lock = 0
+        self.AI_VC_send_data_queue_thread_id = 0
+        self.AI_VC_send_data_queue_thread_lock = 0
+        self.AI_ASR_send_data_queue_thread_id = 0
+        self.AI_ASR_send_data_queue_thread_lock = 0
+        self.AI_record_tmp_queue = Queue(100)
+        self.AI_ASR_send_data_queue = Queue(200)
+        self.AI_VC_send_data_queue = Queue(100)
+        self.AI_audio_queue = Queue(100)
+        #self.AI_WS_connect_Queue = Queue(100) #释放用
+        self.AI_TTS_str = ""
+        self.AI_ASR_str = ""
+        self.AI_ASR_flag = 0
+        self.AI_ASR_str_tmp = ""
+        self.AI_ASR_send_buf_len = 0
+        self.AI_ASR_text_tmp = ""
+        self.AI_ASR_text_repet_count = 0
+        # #开始线程
+        # if self.AI_audio_queue_thread_id ==0:
+        #     self.AI_audio_queue_thread_id = _thread.start_new_thread(self.AI_audio_queue_thread, ())
+        # else:
+        #     print("AI_VC_start :AI_audio_queue_thread_id != 0 ")
+        # if self.AI_VC_send_data_queue_thread_id == 0:    
+        #     self.AI_VC_send_data_queue_thread_id = _thread.start_new_thread(self.AI_VC_send_data_queue_thread, ())
+            
+        self.VC_state = VC_State_None #阿里ai VC状态
+        self.VC_dialog_id = ""#
+        self.VC_message_id=None
+        self.VC_task_id =None
+        self.AI_client_VC = None
+        self.AI_client_VC_recv_id = 0
+        self.AI_client_VC_recv_lock = 0
+        self.AI_client_VC_isconnect =0
+        self.AI_client_VC_debug =0
+
+        self.asr_state = VC_State_None #阿里VC_ASR VC状态
+        self.key_state = 0
+
+        self.AI_client_asr = None
+        self.AI_client_asr_recv_id = 0
+        self.AI_client_asr_recv_lock = 0
+        self.AI_client_asr_isconnect =0
+        self.AI_ASR_timer =  osTimer()
+        self.AI_ASR_timer_count = 0
+        self.AI_client_asr_debug =0
+        self.AI_ASR_check_timeout = 0
+        self.AI_ASR_error_timeout = 0
+        self.VC_Thinking_timerout = 0
+        self.VC_Speech_end_timerout = 0
+
+        self.record_pcm = None
+        self.play_pcm = None
+        self.VC_record_thread_id = 0
+        self.VC_record_thread_lock = 0
+        self.VC_pingping_timerout = 0
+        self.asr_pingping_timerout = 0
+        self.factory_timer = osTimer()
+        self._1S_timer = osTimer()
+        self.Audio_buf_size = 16*1024
+        self.record = audio.Record()
+        #self.record.end_callback(self.record_callback)
+        self.record.gain_set(4,10)
+        #self.record.gain_set(4,12)
+        self.aud = audio.Audio(0)
+        self.aud.setCallback(self.audio_cb)
+        #self.aud.setVolume(self.VC_TTS_volume //10)
+        self.audio_play_state = 1 #音频播放完状态
+        self.close_timerout = 0
+        self.LocalRespondingEnded_timerout = 0
+        
+        self.play_flag = 0
+        self.VC_record_state_flag = 0
+        self.AI_key_long_press_flag = 0
+        self.websocket_error_count = 0
+
+        self.tts_in_data_len = 0
+        self.tts_out_data_len = 0
+        self.VC_satrt_flag = 0
+        self.session_id = ""
+        EventMesh.subscribe("AI_key_press", self.AI_key_press)
+        EventMesh.subscribe("AI_key_release", self.AI_key_release)
+        EventMesh.subscribe("AI_key_long_press", self.AI_key_long_press)
+        EventMesh.subscribe("pwk_key_release", self.pwk_key_release)
+        EventMesh.subscribe("get_AI_audio_queue", self.get_AI_audio_queue)
+        EventMesh.subscribe("get_VC_satrt_flag", self.get_VC_satrt_flag)
+        EventMesh.subscribe("VC_error", self.VC_error)
+        
+        EventMesh.publish("close_led")
+
+        self.bot_name = "柒先生"
+        try:
+            if "bot_name" in self.VC_TTS_voice_type[self.VC_TTS_voice_key]:
+                self.bot_name = self.VC_TTS_voice_type[self.VC_TTS_voice_key]["bot_name"]
+            else:
+                print("not bot_name!!!!!!!!!!!!!!!!!!!!!!")
+        except Exception as e:
+            usys.print_exception(e)
+        try:
+            if self.ai_OTA.min_sys_ota()==1:
+            #if 0:    
+                self.AI_TTS_str = "检测到有新版本需要升级啦!升级时可千万别断电或乱按哦,升级完成后设备会自动重启,重启就代表升级成功"
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+            # if self.ai_OTA.min_sys_ota()==2:
+            #     self.AI_TTS_str = "检测到有新版本需要升级啦!电量低于40%,无法保证升级正常执行,请充满电后重启设备再次升级!"
+            #     EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+            else:
+                try:
+                    self.ai_OTA.ota_result()
+                    self.ai_OTA.pots_ICCID()
+                except Exception as e:
+                    usys.print_exception(e)
+                #开机提示语,如果联网失败,直接提示信号弱
+                
+                #"voice":{"女":"柒妹妹-huoshan::zh_female_wanwanxiaohe_moon_bigtts","男":"柒先生-huoshan::zh_male_wennuanahu_moon_bigtts","童":"柒乐乐huoshan::ICL_zh_female_huoponvhai_tob","广东":"柒先生-huoshan::zh_female_wanqudashu_moon_bigtts","四川":"柒妹妹-huoshan::zh_female_daimengchuanmei_moon_bigtts","个性":"柒先生-zh_male_sunwukong_mars_bigtts"}
+                #EventMesh.publish("get_storage_config",["powerRestart",1])
+                powerRestart =  EventMesh.publish("get_storage_config","powerRestart")#=1非正常重启
+                if powerRestart == None:
+                    powerRestart = 0
+                if powerRestart == 1:
+                    EventMesh.publish("set_storage_config",["powerRestart",0])
+                    
+                else:
+                    
+                    self.AI_TTS_str = self.power_on_tone.replace("bot_name", self.bot_name)
+                    print("开机提示:{}".format(self.AI_TTS_str))
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                
+                
+
+        except Exception as e:
+            usys.print_exception(e)
+
+        
+    def post_processor_after_instantiation(self):
+        pass
+    def get_AI_audio_queue(self, event, msg):
+        return self.AI_audio_queue
+    def get_VC_satrt_flag(self, event, msg):
+        return self.VC_satrt_flag
+
+
+    def VC_30S_timer_cb(self, *args): #
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_30S_timer_cb_}) 
+
+    def VC_30S_timer_cb_(self):    
+        self.get_config_timer_count += 1
+        if self.get_config_timer_count >= 2*60*2:#2小时更新配置参数
+            self.get_config_timer_count = 0
+            try:
+                self.http_get_config()#获取/更新配置参数
+            except Exception as e:
+                usys.print_exception(e)
+    #提交错误id           
+    def ud_error(self,error_data):
+        response = None
+        if self.is_up_error == 1:
+            try:
+                # currentVersion = versions.Build_Time
+                # currentVersion = "7PIN-"+currentVersion[:10]+"-"+currentVersion[11:-3]
+                url = "http://{}/health?task_id={}".format(self.server_ip,error_data[0]+error_data[1])
+                print(url)
+                response = request.get(url,timeout=5)
+                if response.status_code == 200:
+
+                    print("ud_error:ok")
+                else:
+                    print("ud_error  error!!!!")
+                    for i in response.text:
+                        print(i)
+                response.close()
+            except Exception as e:
+                usys.print_exception(e)
+                if response != None:
+                    response.close()
+    #获取配置参数
+    def http_get_config(self, event=None, msg=None):
+        print("http_get_config")
+
+        response = None
+        #http://180.184.206.142/bz-api/dev/config?deviceId=xxx
+        try:
+            url = "http://dmp.raisound.com/bz-api/dev/config/{}".format(modem.getDevImei())
+            print(url)
+            response = request.get(url,timeout=5)
+            if response.status_code == 200:
+                data = response.json()
+                print("http_get_config:{}".format(data))
+                
+                if data:
+                    try:
+                        if data["code"] == 20000:#有配置
+                            if data["data"] :
+                                if "version" in data["data"]:
+                                    config_version = EventMesh.publish("get_storage_config","config_version")#音量配置
+                                    if config_version != data["data"]["version"]:
+                                        config_version = data["data"]["version"]
+                                        EventMesh.publish("set_storage_config",["config_version",config_version])
+                                        if "VC_TTS_voice_type" in data["data"]:
+                                            self.VC_TTS_voice_type = data["data"]["VC_TTS_voice_type"]
+                                            EventMesh.publish("set_storage_config",["VC_TTS_voice_type",self.VC_TTS_voice_type])
+                                            print("配置VC_TTS_voice_type成功")
+                                        if "server_ip" in data["data"]:
+                                            self.server_ip = data["data"]["server_ip"]
+                                            EventMesh.publish("set_storage_config",["server_ip",self.server_ip])
+                                            print("配置server_ip成功")
+                                        if "power_on_tone" in data["data"]:
+                                            self.power_on_tone = data["data"]["power_on_tone"]
+                                            EventMesh.publish("set_storage_config",["power_on_tone",self.power_on_tone])
+                                            print("配置power_on_tone成功")
+
+                    except Exception as e:
+                            usys.print_exception(e)
+            else:
+                print("status_code:{}".format(response.status_code))
+                print("http_get_config:error!!!!!!!!!!")
+            response.close()
+        except Exception as e:
+            usys.print_exception(e)
+            if response != None:
+                response.close()
+
+    def audio_cb(self,event):
+        if event == 0:
+            self.audio_play_state =1
+            #EventMesh.publish("set_audio_state", 1)
+            print('audio-play start.')
+        elif event == 7:
+            self.audio_play_state = 0
+            #EventMesh.publish("set_audio_state", 0)   
+            print('audio-play finish.!!!!!!')
+
+    def AI_key_press(self, event, msg):#按键按下
+        print("AI_key_press")
+        self.get_config_timer_count = 0
+        self.key_state = 1
+        #self.aud.aud_tone_play(10,200)#播放按键音
+        self.AI_TTS_str = ""#"你好,有什么吩咐"
+        self.AI_ASR_str = ""
+        self.AI_ASR_str_tmp = ""
+        self.VC_state = VC_State_None
+        # if self.VC_state != VC_State_None:
+        #     EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+        #     EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(10)})
+        #if self.VC_record_state_flag >1:#如果在录音,就先停止录音
+        self.VC_Speech_End()
+
+        self.VC_Speech_Start()    
+        self.AI_VC_start() 
+        # self.Close()
+        # self.AI_VC_start()
+        self.AI_key_long_press_flag = 0
+
+    def AI_key_release(self, event, msg):#按键弹起
+        print("AI_key_release123")
+        self.key_state = 0
+        if self.AI_key_long_press_flag == 1 :#有长按
+            #self.AI_client_VC_end_speech()
+            EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(1000)})
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_asr_StopTranscription_requset})
+            #self.AI_client_asr_StopTranscription_requset()#请求停止
+            if self.VC_mode == 1 :#长按单次问答模式
+                if self.AI_ASR_str_tmp != "":
+                    print("AI_key_release:asr_str:{}".format(self.AI_ASR_str))  
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start})
+            
+        else :
+            if self.VC_mode == 1 :#长按单次问答模式
+                # try:
+                #     EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+                # except Exception as e:
+                #     usys.print_exception(e)
+                # EventMesh.publish("publish_AI_btnInfo",{"func":self.key_prompt})  #提示请您按住中间的按钮开始讲话,讲完松开即可   
+                self.AI_TTS_str = "请您按住中间的按钮开始讲话,讲完松开即可 "
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start})
+
+                
+                #self.VC_Speech_End()
+    def AI_key_long_press(self, event, msg):#按键长按
+        print("AI_key_long_press")
+        self.AI_key_long_press_flag = 1
+
+    def pwk_key_release(self, event, msg):#电源键短按,关闭
+        print("pwk_key_release")
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+
+    def key_prompt(self):
+        EventMesh.publish("audio_montage_play",["key_prompt.mp3"])
+        #self.aud.play(1,1,'U:/static/key_prompt.mp3')#提示请您按住中间的按钮开始讲话,讲完松开即可
+    def VC_error(self, event, msg):#错误播报
+        self.websocket_error()
+        #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error}) 
+#****************************************ASR连接**********************************************************************
+    def websocket_connect_asr(self):
+        print("websocket_connect_asr:{} e:{}!!!!!!!!!!!!!!!!!!!!!".format(self.AI_client_asr_isconnect,self.AI_client_asr_debug))
+        self.AI_ASR_text_repet_count = 0
+        self.AI_ASR_check_timeout = 0
+        self.AI_ASR_error_timeout = 0
+        self.AI_ASR_text_tmp = ""
+        if self.AI_client_asr_isconnect == 1:
+            return
+        # 创建ASR客户端
+        try:
+            signal = net.csqQueryPoll()
+            if signal == -1 or sim.getStatus() != 1:#网络正常
+                self.websocket_error()
+                return
+
+            # self.AI_client_asr = uwebsocket.Client.connect('wss://nls-gateway-cn-beijing.aliyuncs.com/ws/v1',headers=Headers, debug=False)
+            req_str = ""
+            platform = "platform=huoshan"
+            #platform= "platform=xfyun-ita"
+            platform= "platform=xfyun-bigmodel-ita"
+            lang = "lang=zh-cn"#普通话测试环境
+            try:
+                if "loang" in self.VC_TTS_voice_type[self.VC_TTS_voice_key]:
+                    lang = self.VC_TTS_voice_type[self.VC_TTS_voice_key]["lang"]
+                else:
+                    print("not lang!!!!!!!!!!!!!!!!!!!!!!")
+            except Exception as e:
+                usys.print_exception(e)
+            req_str = "asr/ws?is_auth={}&{}&{}".format(self.is_auth,platform,lang)
+            print("req_str:{}".format(req_str))
+            token = EventMesh.publish("get_dev_token")
+            print("token:{}".format(token))
+            url = 'ws://{}/{}&dt={}'.format(self.server_ip,req_str,token)
+            print("websocket_connect_asr URL:{}".format(url))
+            self.AI_client_asr = uwebsocket.Client.connect(url, debug=True)#
+            #self.AI_WS_connect_Queue.put(self.AI_client_asr)
+            
+        except Exception as e: #网络连接异常
+            usys.print_exception(e)
+            
+            print("websocket_connect_asr error!!!\r\n")
+            #self.connect_timerout_popup(2)  
+            str_error = str(e)
+            if str_error.find("[Errno 22] EINVAL")!= -1: 
+                self.websocket_error()
+                print("[Errno 22] EINVAL!!!\r\n")
+                print("[Errno 22] EINVAL!!!\r\n")
+                print("[Errno 22] EINVAL!!!\r\n")
+                print("[Errno 22] EINVAL!!!\r\n")
+                EventMesh.publish("set_storage_config",["powerRestart",1])#调试临时关闭
+                utime.sleep_ms(1000)
+                self.aud.stopPlayStream()
+                self.aud.stopAll()
+                Power.powerRestart()
+                
+            self.websocket_error()
+            
+            return
+        if self.AI_client_asr == None:
+            EventMesh.publish_async("update_dev_token",thread_size = 8192)#获取token
+            return 
+        self.AI_client_asr_debug+=1
+        utime.sleep_ms(10)
+        #self.AI_client_asr.settimeout(5)
+        #开启发送线程
+        if self.AI_ASR_send_data_queue_thread_id == 0:    
+            _thread.stack_size(self.Audio_buf_size+8*1024)
+            self.AI_ASR_send_data_queue_thread_id = _thread.start_new_thread(self.AI_ASR_send_data_queue_thread, ())
+            _thread.stack_size(8*1024)
+            print("AI_VC_start :AI_ASR_send_data_queue_thread_id :{} ".format(self.AI_ASR_send_data_queue_thread_id))
+        print("websocket_connect_asr 222!!!\r\n")
+        self.AI_client_asr_recv_thread_close()#关闭读线程
+        # 创建线程接收数据
+        _thread.stack_size(self.Audio_buf_size+8*1024)
+        self.AI_client_asr_recv_id = _thread.start_new_thread(self.AI_client_asr_recv, (self.AI_client_asr,))
+        _thread.stack_size(8*1024)
+        self.AI_client_asr_isconnect = 1
+        self.AI_ASR_timer.start(1000, 1, self.AI_ASR_timer_cb)
+        self.AI_client_asr_start_requset()#开始请求
+        print("websocket_connect_asr:OK!!!!!!!!!!!!!!!!!!!!!")
+
+    def websocket_deconnect_asr(self):
+        print("websocket_deconnect_asr {}!!!!!!!".format(self.AI_client_asr_isconnect))
+        print("websocket_deconnect_asr!!!!!!!")
+        self.AI_ASR_text_repet_count = 0
+        self.AI_ASR_text_tmp = ""
+        self.AI_ASR_timer.stop()
+        #self.AI_ASR_send_data_queue_thread_close()#关闭发送线程
+        self.AI_client_asr_recv_thread_close()#关闭读线程
+        if self.AI_client_asr_isconnect == 1 or self.AI_client_asr!= None:
+            try:
+                self.AI_client_asr_isconnect = 0
+                count = 500
+                while True:#等待发完数据
+                    count-=1
+                    if count <=0 or self.AI_ASR_send_data_queue_thread_lock == 0:
+                        break
+                    print("等待发送完成:{}".format(count))
+                    if self.AI_ASR_send_data_queue.empty()!=True:
+                        self.AI_ASR_send_data_queue.clear()
+                    utime.sleep_ms(1)
+                
+                try:
+                    self.AI_client_asr_StopTranscription_requset()#发送停止ASR
+                    self.AI_client_asr.close()
+                except Exception as e:
+                    usys.print_exception(e)
+                    utime.sleep_ms(200)#再尝试关闭一次
+                    try:
+                        self.AI_client_asr.close()
+                        
+                    except Exception as e:
+                        usys.print_exception(e)
+                self.AI_client_asr_debug-=1
+                try:
+                    self.AI_client_asr._close()
+                except Exception as e:
+                    usys.print_exception(e)
+                self.AI_client_asr = None
+            except Exception as e:
+                usys.print_exception(e)
+        print("websocket_deconnect_asr {}!!!!!!!".format(self.AI_client_asr_isconnect))
+
+    #websocket发送数据    
+    def AI_client_asr_send(self,data_str):
+        # if isinstance(data_str, str):#是字符串
+        #     print("ASR ASR AI_client_asr_send:{}".format(data_str))
+        #     pass
+        # else:
+        #     pass
+        #     #print("ASR ASR AI_client_asr_send:len:{}".format(len(data_str)))
+        self.AI_ASR_send_data_queue.put([AI_client_asr_num,data_str]) 
+
+    def AI_client_asr_ping(self):
+        pass
+        if self.AI_client_asr_isconnect == 1:
+            #self.AI_client_asr.write_frame(0x09,b'ping ping')
+            self.AI_client_asr_send("ping")
+    def set_AI_ASR_flag(self,data):
+        self.AI_ASR_flag = data
+    def AI_ASR_timer_cb(self, *args): #
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_ASR_timer_cb_}) 
+
+    def AI_ASR_timer_cb_(self):    
+        if self.AI_ASR_check_timeout > 0:
+            print("AI_ASR_check_timeout:{}".format(self.AI_ASR_check_timeout))
+            self.AI_ASR_check_timeout-=1
+            if self.AI_ASR_check_timeout <=0:
+                self.AI_ASR_check_timeout = 0
+                self.AI_ASR_error_timeout = 3#发送停止后3秒后没正式结果就提示
+                #EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_asr_StopTranscription_requset})
+                
+        if self.AI_ASR_error_timeout>0:
+            self.AI_ASR_error_timeout-=1
+            print("AI_ASR_error_timeout:{}".format(self.AI_ASR_error_timeout))  
+            if self.AI_ASR_error_timeout <= 0:
+                self.AI_ASR_error_timeout = 0
+                #if self.AI_ASR_str == "":
+                if self.AI_ASR_str_tmp == "" and self.AI_ASR_str == "" and self.AI_ASR_text_tmp == "":
+                    self.AI_TTS_str = "没有识别到您说话,请重试" 
+                else :
+                    self.AI_ASR_str = self.AI_ASR_str_tmp + self.AI_ASR_str+self.AI_ASR_text_tmp
+                    self.AI_ASR_str_tmp = self.AI_ASR_str
+                print("AI_ASR_error_timeout2:重连:{}!!!!!!!!!!\r\n".format(self.AI_ASR_str) )
+                print("AI_ASR_error_timeout2:重连:{}!!!!!!!!!!\r\n".format(self.AI_ASR_str) )
+                print("AI_ASR_error_timeout2:重连:{}!!!!!!!!!!\r\n".format(self.AI_ASR_str) )
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_asr}) 
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_connect_asr}) #重连ASR
+                #EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End}) #重连ASR
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start})
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.set_AI_ASR_flag,"data":1})#设置以打断过一次
+                if self.VC_record_state_flag > 1:
+                    self.VC_record_state_flag =1
+        pass
+    #关闭ASR数据发送线程
+    def AI_ASR_send_data_queue_thread_close(self):
+        if self.AI_ASR_send_data_queue_thread_id != 0:
+            count =500
+            while True:
+                count -= 1     
+                if self.AI_ASR_send_data_queue_thread_lock == 0 or count <=0:
+                    break
+                else:
+                    self.AI_ASR_send_data_queue_thread_lock = 2
+                    print("AI_ASR_send_data_queue_thread going:{}...".format(count))
+                    utime.sleep_ms(1)
+            self.AI_ASR_send_data_queue_thread_lock = 0
+            print("AI_ASR_send_data_queue_thread_close")
+            try:
+                _thread.stop_thread(self.AI_ASR_send_data_queue_thread_id)
+            except Exception as e:
+                usys.print_exception(e)
+        self.AI_ASR_send_data_queue_thread_id = 0
+    #发送数据队列
+    def AI_ASR_send_data_queue_thread(self):
+        print("AI_ASR_send_data_queue_thread:start")
+        count_t = 0
+        while True:
+            if self.AI_ASR_send_data_queue_thread_lock == 2:
+                print("AI_ASR_send_data_queue_thread:该退出了")
+                break
+            if self.AI_ASR_send_data_queue.empty() :#不能去掉,去掉会卡死
+                self.AI_ASR_send_data_queue_thread_lock = 0  
+                count_t+=1
+                utime.sleep_ms(1)
+            else:
+                #data[0]是websocket连接对象编号,data[1]是数据
+                #print("AI_ASR_send_data_queue_thread:get")
+                
+                self.AI_ASR_send_data_queue_thread_lock = 1
+                data = self.AI_ASR_send_data_queue.get()
+                #print("AI_ASR_send_data_queue_thread:num{} len{}".format(data[0],len(data[1])))
+                if data != None:
+                    try:
+                        # 发送数据
+                        if data[0] == AI_client_asr_num:
+                            self.AI_ASR_send_buf_len -= len(data[1])
+                            self.asr_pingping_timerout = 0
+                            if self.AI_client_asr != None and self.AI_client_asr_isconnect == 1:
+                                self.AI_client_asr.send(data[1])
+                                if isinstance(data[1], str):#是字符串
+                                    print("ASR ASR: send_data:{}".format(data[1]))
+                                # else:
+                                #     print("ASR ASR: send_data!:{}".format(len(data[1])))
+                            else:
+                                if isinstance(data[1], str):#是字符串
+                                    print("ASR ASR: send_data error!!!:{}".format(data[1]))
+                                else:
+                                    print("ASR ASR: send_data error!!!:{}".format(len(data[1])))
+
+                    except Exception as e:
+                        usys.print_exception(e)
+                        if data[0] == AI_client_asr_num: 
+                            if self.AI_client_asr_isconnect != 0:
+                                print("ASR发送数据错误,退出")
+                                EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"ASR发送出错了,请重试"}) 
+                                self.ud_error(["asr",self.asr_taskid])
+                            #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_connect_asr}) #重连
+                    utime.sleep_ms(1)
+        self.AI_ASR_send_data_queue_thread_lock = 0    
+
+    #ASR关闭读线程
+    def AI_client_asr_recv_thread_close(self):
+        if self.AI_client_asr_recv_id != 0:
+            count =500
+            while True:
+                count -= 1
+                if self.AI_client_asr_recv_lock == 1:
+                    self.AI_client_asr_recv_lock = 2
+                if self.AI_client_asr_recv_lock == 0 or count <=0:
+                    break
+                else:
+                    print("AI_client_asr_recv_thread going:{}...".format(count))
+                    utime.sleep_ms(1)
+            self.AI_client_asr_recv_lock = 0
+            print("AI_client_asr_recv_thread_close")
+            try:
+                _thread.stop_thread(self.AI_client_asr_recv_id)
+            except Exception as e:
+                usys.print_exception(e)
+        self.AI_client_asr_recv_id = 0
+
+    #Ai ASR websocket返回数据       
+    def AI_client_asr_recv(self,cli):
+        while True:
+            try:
+                # 死循环接收数据
+                self.AI_client_asr_recv_lock = 0
+                utime.sleep_ms(1)
+                recv_data = cli.recv()
+                if self.AI_client_asr_recv_lock == 2:#要关闭线程了
+                    print("AI_client_asr_recv 该退出了")
+                    break
+                self.AI_client_asr_recv_lock = 1
+                self.close_timerout = 0#服务器有返回清零退出时间
+                if recv_data == "websocket close":
+                    # 服务器关闭连接
+                    print("ASR 服务器主动关闭连接!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+                    
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"ASR连接断开了,请重试"}) 
+                    self.ud_error(["asr",self.asr_taskid])
+                    break
+                elif recv_data == "":#客户端关闭连接
+                    print("ASR ASR :客户端关闭连接")
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"ASR连接断开了,请重试"}) 
+                    self.ud_error(["asr",self.asr_taskid])
+                    break
+                try:
+                    if isinstance(recv_data, str):
+                        jsload_data =  ujson.loads(recv_data)
+                        print("ASR ASR recv_data: {}".format(jsload_data))
+                        if jsload_data["status"] != 20000000:#返回错误
+                            print("ASR返回非20000000状态码,退出")
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"ASR出错了,请重试"}) 
+                            self.ud_error(["asr",self.asr_taskid])
+                            break
+                        
+                        if jsload_data["task_id"] != None:
+                            self.asr_taskid  = jsload_data["task_id"]
+                        if jsload_data["event"] != None:
+                            if jsload_data["event"] == "TranscriptionStarted": #开始录音
+                                self.VC_record_state_flag = 2
+                                self.VC_state =  VC_State_SpeechStart
+                                EventMesh.publish("open_led_blue")
+                                self.AI_ASR_error_timeout = 0
+                                
+                                pass
+
+                            elif jsload_data["event"] == "Changed" or jsload_data["event"] == "SentenceEnd" : #开始录音Changed
+                                # if self.VC_record_state_flag == 2:
+                                #     
+                                
+                                self.AI_ASR_timer_count = 0
+                                if jsload_data["result"]["result"]:
+                                    #self.AI_listen_text = str(jsload_data["result"]["result"])
+                                    text= str(jsload_data["result"]["result"])
+                                    print("ASR recv self.VC_state :{}".format(self.VC_state))
+                                    if self.is_long_record == 0:
+                                        if self.VC_state >= VC_State_TTSStart:#开始播音后不响应asr结果
+                                            print("asr continue")
+                                            continue
+                                    EventMesh.publish("open_led_blue")
+                                    
+                                    if jsload_data["result"]["is_end"] == True:  #asr结束
+                                        self.AI_ASR_check_timeout = 0
+                                        self.AI_ASR_error_timeout = 0
+                                        self.AI_ASR_text_repet_count = 0
+                                        self.AI_ASR_text_tmp = ""
+                                        self.VC_record_state_flag = 4
+                                        ret= self.check_text(text)
+                                        if ret == 0:#配置指令
+                                            
+                                            if self.AI_VC_send_data_queue.empty()!=True:
+                                                self.AI_VC_send_data_queue.clear()
+                                            if self.AI_ASR_send_data_queue.empty()!=True:
+                                                self.AI_ASR_send_data_queue.clear()
+                                            self.AI_ASR_send_buf_len = 0
+                                            EventMesh.publish("open_led_all")
+                                            try:
+                                                
+                                                EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})
+                                                #print("AI_client_asr_recv VC_Speech_End") 
+                                                EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_VC}) 
+                                                #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_asr})
+                                                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                                            except Exception as e:
+                                                usys.print_exception(e)
+                                            continue
+                                        elif ret == 1:#不处理
+                                            pass
+                                        else:#正常asr
+                                            if self.VC_mode == 0 :#连续问答模式
+                                                self.AI_ASR_str = text#
+                                                if self.AI_ASR_flag == 0:#d第一次识别,没有打断
+                                                    self.AI_ASR_str_tmp = self.AI_ASR_str
+                                                else:#第二次识别,打断了
+                                                    self.AI_ASR_str = self.AI_ASR_str_tmp+text
+                                                    print("ASR ASR 打断 续集 AI_ASR_str {}".format(self.AI_ASR_str))
+                                                    self.AI_ASR_str_tmp = self.AI_ASR_str
+                                                    if self.is_long_record != 0:
+                                                        #if self.VC_state >= VC_State_TTSStart:#如果已经播放了,关闭VC连接,重新打开,处理音频数据太多问题
+                                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_VC})#关闭vc连接
+                                                self.AI_ASR_flag  = 1
+                                                print("asr recv :asr_str:{}".format(self.AI_ASR_str))  
+                                                #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,"data":(500)}) #等一秒
+                                                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                                            elif self.VC_mode == 1:#单对话模式
+                                                self.AI_ASR_str += text#
+                                                self.AI_ASR_str_tmp = self.AI_ASR_str
+                                                if self.key_state == 0:#按键已经弹起
+                                                    self.AI_ASR_str_tmp =""
+                                                    print("asr recv :asr_str:{}".format(self.AI_ASR_str))  
+                                                    #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,"data":(500)}) #等一秒
+                                                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                                        self.VC_state =  VC_State_SpeechEnd
+                                    elif jsload_data["result"]["is_end"] == False:
+                                        
+                                        self.VC_state =  VC_State_SpeechIng
+                                        if self.AI_ASR_text_tmp != "" and self.AI_ASR_text_tmp  == text:
+                                            pass
+                                            # self.AI_ASR_text_repet_count+=1
+                                            # if self.AI_ASR_text_repet_count>=40:#重复30次下发一样结果,就报错
+                                            #     print("asr 错误,无正式结果:{}".format(text))
+                                            #     #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error})#
+                                            #     EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"ASR出错了,请重试"}) 
+                                        else:
+                                            self.AI_ASR_check_timeout = 5 #5秒没更新结果,强制stop
+                                            self.AI_ASR_error_timeout = 0
+                                            self.AI_ASR_text_repet_count = 0
+                                        if self.VC_mode == 0 :#连续问答模式
+                                            self.AI_ASR_text_tmp = text
+                                            self.VC_record_state_flag = 3
+                                            if self.AI_ASR_flag ==1 :#如果已经识别过一次asr
+                                                self.AI_ASR_flag = 2
+                                                print("asr 打断,关闭VC连接")
+                                                self.AI_ASR_str = ""
+                                                if self.is_long_record != 0:
+                                                    self.VC_Play_End()
+                                                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_VC})#关闭vc连接
+                                                # EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_connect_VC})#连接服务器
+                                                # EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_start_requset})#请求
+                                                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                                                EventMesh.publish("publish_AI_btnInfo",{"func":EventMesh.publish,"data":"open_led_blue"})#
+                                        elif self.VC_mode ==1:#单对话模式
+                                            self.AI_ASR_str_tmp =""
+                        
+                except Exception as e:
+                    usys.print_exception(e)
+                
+            except Exception as e:
+                    error_str = str(e)
+                    print("ASR ASR:e:{}".format(error_str))
+                    #usys.print_exception(e)
+                    if error_str.find("[Errno 110]")!= -1:
+                        #print("ASR ASR:recv TIMEDOUT 正常")
+                        pass
+                    else:
+                        usys.print_exception(e)
+                        print("{}".format(cli))
+                        #self.websocket_error()
+                        print("ASR读数据报错,退出")
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"ASR出错了,请重试"})#
+                        self.ud_error(["asr",self.asr_taskid])
+                        break
+        self.AI_client_asr_isconnect = 0
+        self.AI_client_asr_recv_id = 0 
+        self.AI_client_asr_recv_lock = 0
+        print("AI_client_asr_recv END!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+    #ASR开始会话
+    def AI_client_asr_start_requset(self):
+        self.session_id  = self.get_session_id()
+        json_data = \
+        { 
+            "header":{
+                "event":"StartTranscription",
+                "trace_id":self.get_trace_id()
+                },
+            "payload":{
+                "format":"pcm",
+                "sample_rate":self.VC_record_samplerate,
+                 "session_id": self.session_id ,
+                }
+            
+        }
+        if self.VC_record_TYPE == VC_record_TYPE_AMR :
+            json_data["payload"]["format"]='amr'
+            pass
+        
+        self.AI_ASR_error_timeout = 5
+        self.AI_client_asr_send(ujson.dumps(json_data))
+    #ASR终止
+    def AI_client_asr_StopTranscription_requset(self):   
+        print("AI_client_asr_StopTranscription_requset!!!!!")
+        json_data = \
+        {
+            "header":{
+                "event":"StopTranscription",
+                "trace_id":self.get_trace_id()
+                }
+        }
+
+        #self.AI_client_asr_send(ujson.dumps(json_data))
+        if self.AI_client_asr != None and self.AI_client_asr_isconnect == 1:
+            self.AI_client_asr.send(ujson.dumps(json_data))
+                
+     #开始录音
+    def VC_Speech_Start(self):
+        try:
+            
+            #self.VC_state =  VC_State_SpeechStart
+            print("VC_Speech_Start VC_record_state_flag:{} self.AI_ASR_flag:{}!!!!!!!!".format(self.VC_record_state_flag,self.AI_ASR_flag))  
+            if self.AI_ASR_flag  != 0:
+                return
+            
+            if self.VC_record_state_flag  == 0:
+                if dev_type != "7PIN" :
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.chenggong_tone}) 
+                #self.websocket_connect_asr()   
+                self.VC_record_thread_close()#关闭录音线程
+                _thread.stack_size(self.Audio_buf_size+8*1024)
+                self.VC_record_thread_id = _thread.start_new_thread(self.VC_record_thread,())
+                _thread.stack_size(8*1024)
+                print("self.VC_record_thread_id:{}".format(self.VC_record_thread_id))
+                try:
+                    
+                    if self.VC_record_TYPE == VC_record_TYPE_AMR :
+                        try :
+                            self.record.stream_start(audio.Record.AMRNB, self.VC_record_samplerate, 0)
+                        except Exception as e:
+                                usys.print_exception(e)
+                    elif self.VC_record_TYPE == VC_record_TYPE_PCM:
+                        print("record_pcm.stream_read_start()!!!!!!!!!!!!")
+                        self.record.stream_start(audio.Record.WAV, self.VC_record_samplerate, 0)
+                        # if self.record_pcm != None:
+                        #     try:
+                        #         self.record_pcm.stream_stop()
+                        #         self.record_pcm.close()
+                        #         self.record_pcm = None
+                        #     except Exception as e:
+                        #         usys.print_exception(e)
+                        # if self.record_pcm == None:        
+                        #     ret = self.record_pcm = audio.Audio.PCM(0,1,16000,0,1,2)
+                        #     print("audio.Audio.PCM:ret:{}".format(ret))
+                        #     ret = self.record_pcm.stream_read_start()
+                        #     print("self.record_pcm.stream_read_start:ret:{}".format(ret))
+                except Exception as e:
+                    usys.print_exception(e) 
+                    
+                self.VC_record_state_flag = 2
+        except Exception as e:
+            self.websocket_error()
+            self.VC_record_state_flag = 1
+            self.VC_Speech_End()#关闭录音
+            usys.print_exception(e)
+
+    #停止录音
+    def VC_Speech_End(self):
+        try:
+            self.AI_ASR_flag = 0
+            self.AI_ASR_str_tmp = ""
+            self.AI_ASR_str = ""
+            #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_asr})
+              
+            if self.VC_record_state_flag == 0:
+                return
+            #self.AI_client_asr_StopTranscription_requset()#请求停止
+            if self.VC_record_TYPE == VC_record_TYPE_AMR:
+                self.record.stream_stop()
+                self.record.stop()#关闭录音
+                Record_read_buf = bytearray(self.Audio_buf_size)
+                for i in range(10):
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)
+                    print("Record_len:!!!!!!{}".format(Record_len))
+                    if Record_len <= 0:
+                        break
+            elif self.VC_record_TYPE == VC_record_TYPE_PCM:
+                self.record.stream_stop()
+                self.record.stop()#关闭录音
+                Record_read_buf = bytearray(self.Audio_buf_size)
+                for i in range(10):
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)
+                    print("Record_len:!!!!!!{}".format(Record_len))
+                    if Record_len <= 0:
+                        break
+                # if self.record_pcm != None:
+                #     try:
+                #         self.record_pcm.stream_stop()
+                #         self.record_pcm.close()
+                #         self.record_pcm = None
+                #     except Exception as e:
+                #         usys.print_exception(e)
+        except Exception as e:
+            usys.print_exception(e)
+        self.VC_record_thread_close()#关闭录音线程
+        if self.AI_record_tmp_queue.empty() != True:
+            self.AI_record_tmp_queue.clear()
+        # try:
+        #     self.websocket_deconnect_asr()
+        # except Exception as e:
+        #     usys.print_exception(e)  
+        self.VC_record_state_flag = 0
+        print("VC_Speech_End VC_record_state_flag:{}!!!!!!!!".format(self.VC_record_state_flag))   
+    #关闭录音线程   
+    def VC_record_thread_close(self): 
+        if self.VC_record_thread_id != 0:
+            count =50
+            while True:
+                count -= 1
+                if self.VC_record_thread_lock == 1:
+                    self.VC_record_thread_lock = 2
+                if self.VC_record_thread_lock == 0 or count <=0:
+                    break
+                else:
+                    print("VC_record_thread_thread going:{}...".format(count))
+                    utime.sleep_ms(1)
+            self.VC_record_thread_lock = 0
+            print("VC_record_thread_thread_close")
+            try:
+                _thread.stop_thread(self.VC_record_thread_id)
+            except Exception as e:
+                usys.print_exception(e)
+        self.VC_record_thread_id = 0
+    #获取录音数据
+    def VC_record_thread(self):
+        ##return
+        print("VC_record_thread start!!!!!!!!!!!!!!!!!!!!\r\n")
+        count = 0
+        # try:
+        #     uos.remove('/usr/test.pcm')
+        # except Exception as e:
+        #     usys.print_exception(e)
+        #record_data_queue = Queue(100)
+        #fd = open('/usr/test.pcm','w')
+        # if self.VC_record_TYPE == 1:
+        #     h_data= [0x23,0x21 ,0x41 ,0x4D ,0x52 ,0x0A ]
+        #     h_data_b = bytes(h_data)
+        #     self.AI_client_VC_send(h_data_b)
+        AI_record_tmp_queue_len = 0
+        while True:
+            try:
+                if self.VC_record_thread_lock == 2:
+                    break
+                self.VC_record_thread_lock = 1
+                # 死循环接收数据
+                #if self.VC_state ==  VC_State_SpeechStart:
+                Record_read_buf = bytearray(self.Audio_buf_size)
+                
+                Record_len = 0
+                if self.VC_record_TYPE == VC_record_TYPE_PCM:#pcm
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)
+                    utime.sleep_ms(20)
+                    
+                else :
+                    
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)
+                    utime.sleep_ms(600)
+
+                #Record_len = 1024*2
+                #print("VC_record_thread:{}".format(Record_len))
+                if Record_len > 0:
+                    read_buf = bytes(Record_read_buf[:Record_len])
+                    if self.record_data_save_flag == 1:
+                        if self.record_fd == None:
+                            try:
+                                uos.remove('/usr/record_data.pcm')
+                            except Exception as e:
+                                usys.print_exception(e)
+                            self.record_fd = open('/usr/record_data.pcm','w')
+                        if self.record_fd != None:
+                            self.record_fd.write(read_buf)
+                            print("write record:{}".format(len(read_buf)))
+                            # count+=Record_len
+                            # if count >150*1024:
+                            #     self.record_fd.close()
+                                #self.record_fd = None
+                    # if self.VC_record_state_flag >= 2:
+                    #     self.AI_client_asr_send(read_buf)
+                    
+                    if self.VC_record_state_flag <=1 :#没发送前先存起来
+                        self.AI_record_tmp_queue.put(read_buf)
+                        AI_record_tmp_queue_len += len(read_buf)
+                    else:
+                        AI_record_tmp_queue_len = 0
+                        while True:
+                            if self.AI_record_tmp_queue.empty() == True:
+                                break
+                            else:
+                                self.AI_client_VC_input_audio_buffer_append(self.AI_record_tmp_queue.get())
+                                #self.AI_client_asr_send(self.AI_record_tmp_queue.get())  #发送之前存的数据
+                        #self.AI_client_asr_send(read_buf)   
+                        self.AI_client_VC_input_audio_buffer_append(read_buf)
+                    #print("VC_record_thread:{}".format(len(read_buf)))
+                    #count+=len(read_buf)
+                # if count>=500*1024:#结束
+                #     self.AI_client_VC_end_speech()
+                #     break
+                # count+=1
+                # if count %10 == 0:
+                #     print("VC_record_thread on line {} asr recv :{} send:{}".format(self.VC_record_state_flag,_thread.threadIsRunning(self.AI_client_asr_recv_id),_thread.threadIsRunning(self.AI_VC_send_data_queue_thread_id)))
+                
+                # if self.VC_state >=  VC_State_SpeechEnd:
+                #     break
+                
+            except Exception as e:
+                    usys.print_exception(e)
+                    #break
+            self.VC_record_thread_lock = 0
+            utime.sleep_ms(100)
+        #fd.close()
+        print("VC_record_thread:exit")
+        self.VC_record_thread_id = 0#线程退出
+        self.VC_record_thread_lock = 0
+###################################################### VC ###################################################################################
+    def websocket_connect_VC(self):
+        print("websocket_connect_VC:{} e:{}!!!!!!!!!!!!!!!!!!!!!".format(self.AI_client_VC_isconnect,self.AI_client_VC_debug))
+        if self.AI_client_VC_isconnect == 1:
+            return
+        # 创建VC客户端
+        try:
+            signal = net.csqQueryPoll()
+            if signal == -1 or sim.getStatus() != 1:#网络正常
+                self.websocket_error()
+                return
+            try:
+                if "bot_name" in self.VC_TTS_voice_type[self.VC_TTS_voice_key]:
+                    self.bot_name = self.VC_TTS_voice_type[self.VC_TTS_voice_key]["bot_name"]
+                else:
+                    print("not bot_name!!!!!!!!!!!!!!!!!!!!!!")
+            except Exception as e:
+                usys.print_exception(e)
+            
+            # Headers = {'X-NLS-Token':'0c8b8f05a46f423096be64a9c4c46310'}
+            # self.AI_client_VC = uwebsocket.Client.connect('wss://nls-gateway-cn-beijing.aliyuncs.com/ws/v1',headers=Headers, debug=False)
+            
+            url="wss://ws.coze.cn/v1/chat?bot_id=7462617881076351002"
+            print("VC VC:url{}".format(url))
+            Headers = {"Authorization":"Bearer pat_SSaiOzccrRLaQEaB4sdshvHZQzqjeWD5jq2GWPVoWRx4N8XcdraHWYqdDjK5zpR1"}
+            self.AI_client_VC = uwebsocket.Client.connect(url, headers=Headers,debug=True)
+            #self.AI_WS_connect_Queue.put(self.AI_client_VC)
+
+       
+            print("websocket_connect_VC:OK!!!!!!!!!!!!!!!!!!!!!")
+        except Exception as e: #网络连接异常
+            usys.print_exception(e)
+            print("websocket_connect_VC error!!!\r\n")
+            str_error = str(e)
+            if str_error.find("[Errno 22] EINVAL")!= -1: 
+                print("websocket_connect_VC:str_error:{}".format(str_error))
+                print("[Errno 22] EINVAL!!!\r\n")
+                print("[Errno 22] EINVAL!!!\r\n")
+                print("[Errno 22] EINVAL!!!\r\n")
+                print("[Errno 22] EINVAL!!!\r\n")
+                self.websocket_error()
+                EventMesh.publish("set_storage_config",["powerRestart",1])#调试临时关闭
+                utime.sleep_ms(1000)
+                self.aud.stopPlayStream()
+                self.aud.stopAll()
+                Power.powerRestart()
+                
+            self.websocket_error()
+            return
+        #print("AI_client_VC:{}".format(self.AI_client_VC))
+        if self.AI_client_VC == None:
+            EventMesh.publish("update_dev_token")#获取token
+            self.websocket_error()
+            return
+        self.AI_client_VC_debug+=1
+        utime.sleep_ms(10)
+        #self.AI_client_VC.settimeout(5)
+        #self.AI_VC_send_data_queue_thread_close()#关闭发送线程
+        if self.AI_VC_send_data_queue_thread_id == 0:    
+            _thread.stack_size(self.Audio_buf_size+8*1024)
+            self.AI_VC_send_data_queue_thread_id = _thread.start_new_thread(self.AI_VC_send_data_queue_thread, ())
+            _thread.stack_size(8*1024)
+            print("AI_VC_start :AI_VC_send_data_queue_thread_id :{} ".format(self.AI_VC_send_data_queue_thread_id))
+        self.AI_client_VC_recv_thread_close()#关闭读线程
+        # 线程接收数据
+        _thread.stack_size(self.Audio_buf_size+8*1024)
+        self.AI_client_VC_recv_id = _thread.start_new_thread(self.AI_client_VC_recv, (self.AI_client_VC,))
+        _thread.stack_size(8*1024)
+        self.AI_client_VC_isconnect = 1
+        print("websocket_connect_VC end")
+
+    def websocket_error(self,TTS_str=None):
+        print("websocket_error1!!!!")
+        self.Close()
+        print("websocket_error1.1!!!!")
+        print("websocket_error!!!!")
+        print("websocket_error!!!!")
+        self.VC_Thinking_timerout = 0
+        self.VC_satrt_flag = 0
+        self.AI_TTS_str = ""
+        self.AI_ASR_str = ""
+        self.AI_ASR_str_tmp = ""
+        self.AI_ASR_flag  = 0
+        self.VC_Speech_End()
+        EventMesh.publish("close_led")
+        if TTS_str == None:
+            self.websocket_error_count+=1
+            # if self.websocket_error_count <=3:
+            #     EventMesh.publish("audio_montage_play",["xinhaoruo1.mp3"])
+            if self.websocket_error_count <10 :
+                EventMesh.publish("audio_montage_play",["xinhaoruo1.mp3"])
+            elif self.websocket_error_count >=10:
+                EventMesh.publish("paly_iccid_imei")    
+            # else:
+            #     EventMesh.publish("audio_montage_play",["R_SIM_FAILE.mp3"])
+            #self.aud.play(1,1,'U:/static/R_SIM_FAILE.mp3')
+            if self.websocket_error_count <3 :
+                utime.sleep_ms(3000)
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start})
+        else:
+            print("websocket_error:tts:{}".format(TTS_str))
+            self.AI_TTS_str = TTS_str
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start})
+        print("websocket_error2")
+       
+        
+        print("websocket_error4")
+        
+
+    def websocket_deconnect_VC(self):
+        #print("websocket_deconnect_VC {}!!!!!!!".format(self.AI_client_VC_isconnect))
+        print("websocket_deconnect_VC!!!!!!!")
+        self.AI_client_VC_recv_thread_close()#关闭读线程
+        self.AI_client_VC_recv_id = 0
+        if self.AI_client_VC_isconnect == 1 or self.AI_client_VC!=None:
+            try:
+                self.AI_client_VC_isconnect = 0
+                count = 500
+                while True:#等待发完数据
+                    count-=1
+                    if count <=0 or self.AI_VC_send_data_queue_thread_lock == 0:
+                        break
+                    utime.sleep_ms(1)
+                
+                try:
+                    self.AI_client_VC.close()
+                    self.AI_client_VC_debug -=1
+                    #self.AI_client_VC=None
+                except Exception as e:
+                    usys.print_exception(e)
+                    try :
+                        self.AI_client_VC.close()
+                        self.AI_client_VC_debug -=1
+                        #self.AI_client_VC=None
+                    except Exception as e:
+                        usys.print_exception(e)
+                try :
+                    self.AI_client_VC._close()
+                except Exception as e:
+                    usys.print_exception(e)
+                self.AI_client_VC = None
+            except Exception as e:
+                usys.print_exception(e)
+        print("websocket_deconnect_VC {}!!!!!!!".format(self.AI_client_VC_isconnect))
+    #websocket发送ping
+    def AI_client_VC_ping(self):
+        pass
+        if self.AI_client_VC_isconnect == 1:
+            #self.AI_client_VC.write_frame(0x09,b'ping ping')
+            self.AI_client_VC_send("ping")
+            #print("websocket ping ping")
+
+    #websocket发送数据    
+    def AI_client_VC_send(self,data_str):
+        # if isinstance(data_str, str):#是字符串
+        #     print("AI_client_VC_send:{}".format(data_str))
+        #     pass
+        # else:
+        #     print("AI_client_VC_send:len{}".format(len(data_str)))
+        self.AI_VC_send_data_queue.put([AI_client_VC_num,data_str]) 
+     #关闭数据发送线程
+    def AI_VC_send_data_queue_thread_close(self):
+        if self.AI_VC_send_data_queue_thread_id != 0:
+            count =500
+            while True:
+                count -= 1
+                if self.AI_VC_send_data_queue_thread_lock == 0 or count <=0:
+                    break
+                else:
+                    self.AI_VC_send_data_queue_thread_lock = 2
+                    print("AI_VC_send_data_queue_thread going:{}...".format(count))
+                    utime.sleep_ms(1)
+                    if self.AI_VC_send_data_queue.empty()!=True:
+                        self.AI_VC_send_data_queue.clear()
+            self.AI_VC_send_data_queue_thread_lock = 0
+            print("AI_VC_send_data_queue_thread_close")
+            try:
+                _thread.stop_thread(self.AI_VC_send_data_queue_thread_id)
+            except Exception as e:
+                usys.print_exception(e)
+        self.AI_VC_send_data_queue_thread_id = 0
+    #发送数据队列
+    def AI_VC_send_data_queue_thread(self):
+        print("AI_VC_send_data_queue_thread:start")
+        count_t = 0
+        while True:
+            if self.AI_VC_send_data_queue_thread_lock == 2:
+                print("AI_VC_send_data_queue_thread,该退出了")
+                break  
+            if self.AI_VC_send_data_queue.empty() :#不能去掉,去掉会卡死
+                self.AI_VC_send_data_queue_thread_lock = 0  
+                count_t+=1
+                # if count_t%200 == 0:
+                #     print("self.AI_VC_send_data_queue.empty")
+                utime.sleep_ms(1)
+            else:
+                #data[0]是websocket连接对象编号,data[1]是数据
+                #print("AI_VC_send_data_queue_thread:get")
+                
+                self.AI_VC_send_data_queue_thread_lock = 1
+                data = self.AI_VC_send_data_queue.get()
+                
+                
+                #print("AI_VC_send_data_queue_thread:num{} len{}".format(data[0],len(data[1])))
+                if data != None:
+                    try:
+                        #data["func"](data["data"])
+                        # 发送数据
+                        #bytes_data = bytes(data[1])
+                        #data[0].send(data[1])
+                        #print("AI_VC_send_data_queue_thread:len:{}".format(len(data[1])))
+                        #print("AI_VC_send_data_queue_thread on line asr recv :{} vc recv:{}".format(_thread.threadIsRunning(self.AI_client_asr_recv_id),_thread.threadIsRunning(self.AI_client_VC_recv_id)))
+                        if data[0] == AI_client_VC_num:
+                            self.VC_pingping_timerout = 0
+                            if isinstance(data[1], str):#是字符串
+                                if len(data[1])<600:
+                                    print("VC VC: send_data:{}".format(data[1]))
+                                else:
+                                    pass
+                                    #print("VC VC: send_data:{}...".format(data[1][:300]))
+                            #print("VC: send_data len:{}".format(len(data[1])))
+                            if self.AI_client_VC != None and self.AI_client_VC_isconnect == 1:
+                                self.AI_client_VC.send(data[1])
+                            else:
+                                print("VC VC: send_data:ERROR:{}".format(data[1]))
+                            #print("VC: send_data end")
+    
+                        #print("VC: send_data end")
+                    except Exception as e:
+                        print("DeviceInfo_queue_thread:ERROR:{}".format(e))
+                        usys.print_exception(e)
+                        if data[0] == AI_client_VC_num:
+                            #self.websocket_error()
+                            pass
+
+                            
+                            try:
+                                if self.AI_client_VC_isconnect != 0:
+                                    print("VC发送数据错误,退出")
+                                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"VC发送出错了,请重试"}) 
+                                    self.ud_error(["VC",self.VC_taskid])
+                            except Exception as e: #网络连接异常
+                                usys.print_exception(e)
+
+                    utime.sleep_ms(1)
+        self.AI_VC_send_data_queue_thread_lock = 0              
+    #VC关闭读线程
+    def AI_client_VC_recv_thread_close(self):
+        if self.AI_client_VC_recv_id != 0:
+            count =500
+            while True:
+                count -= 1
+                if self.AI_client_VC_recv_lock == 1:
+                    self.AI_client_VC_recv_lock = 2
+                if self.AI_client_VC_recv_lock == 0 or count <=0:
+                    break
+                else:
+                    print("AI_client_VC_recv_thread going:{}...".format(count))
+                    utime.sleep_ms(1)
+            self.AI_client_VC_recv_lock = 0
+            print("AI_client_VC_recv_thread_close")
+            try:
+                _thread.stop_thread(self.AI_client_VC_recv_id)
+            except Exception as e:
+                usys.print_exception(e)
+        self.AI_client_VC_recv_id = 0
+    #Ai VC websocket返回数据       
+    def AI_client_VC_recv(self,cli):
+        count = 0
+
+        while True:
+            try:
+                # 死循环接收数据
+                self.AI_client_VC_recv_lock = 0
+                if self.is_VC_ACK == 1:
+                    self.AI_client_VC_Read()
+                #EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_Read})
+                count+=1
+                if self.VC_state >= VC_State_TTSStart and (self.tts_in_data_len - self.tts_out_data_len > 64*1024 or count>5):
+                    count = 0
+                    utime.sleep_ms(1)
+                if self.VC_state < VC_State_TTSStart:
+                    utime.sleep_ms(1)
+                recv_data = cli.recv()
+                if self.AI_client_VC_recv_lock == 2:
+                    print("AI_client_VC_recv 该退出了")
+                    break
+                self.AI_client_VC_recv_lock = 1
+                self.close_timerout = 0#服务器有返回清零退出时间
+                if recv_data == "websocket close":
+                    # 服务器关闭连接
+                    print("VC 服务器关闭连接!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+                    #self.AI_client_VC_isconnect = 0
+                    #self.websocket_deconnect_VC()
+                    #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_asr}) 
+                    # #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(1500)})
+                    #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_connect_asr}) 
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"VC连接断开了,请重试"}) 
+                    self.ud_error(["VC",self.VC_taskid])
+                    break
+                elif recv_data == "":#客户端关闭连接
+                    print("VC VC :客户端关闭连接")
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"VC连接断开了,请重试"}) 
+                    self.ud_error(["VC",self.VC_taskid])
+                    break
+                try:
+                    self.websocket_error_count = 0
+                    if isinstance(recv_data, str):#返回的是字符串
+                        if len(recv_data)<300:
+                            print("VC VC:recv_data:{}".format(recv_data))
+                        else:
+                            print("VC VC:recv_data long :{}".format(recv_data[:300]))
+                        jsload_data =  ujson.loads(recv_data)
+                        #print("AI_client_VC_recv jsload_data = {}".format(jsload_data))
+                        if jsload_data["event_type"] == "chat.updated" :#会话开始
+                            print("VC:Started!!!!!!!!\r\n")
+                            print("VC:Started!!!!!!!!\r\n")
+                            print("VC:Started!!!!!!!!\r\n")
+                            
+                            self.AI_client_VC_send_speech()#开始上传语音
+                        elif jsload_data["event_type"] == "conversation.audio_transcript.update" :#音频转译
+                            self.VC_Speech_end_timerout = 2
+                            self.AI_ASR_str = jsload_data["data"]['content']
+                            if self.AI_ASR_str.find("。") != -1 or self.AI_ASR_str.find("?") != -1 or self.AI_ASR_str.find("!") != -1:
+                                self.VC_Speech_end_timerout = 0
+                                self.AI_client_VC_end_speech()#发送说话终止
+
+                        elif jsload_data["event_type"] == "conversation.chat.created" :#开始对话    
+                            self.open_play_flag = 0
+                            if self.play_data_save_flag == 1:
+                                try:
+                                    uos.remove('/usr/play_data.pcm')
+                                except Exception as e:
+                                    usys.print_exception(e)
+                                self.play_fd = open('/usr/play_data.pcm','w')
+                        
+                        elif  jsload_data["event_type"] == "conversation.message.delta":#返回大模型回答数据
+                            if self.open_play_flag == 0:
+                                EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Play_Start})#打开播放
+                                self.open_play_flag =1
+                        elif  jsload_data["event_type"] == "conversation.audio.delta":#下发音频数据
+                            
+                            audio_data = ubinascii.a2b_base64(jsload_data["data"]['content'])
+                            print("下发音频数据1:{}".format(len(audio_data)))
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.put_record_data,"data":[audio_data,""]}) 
+                            if self.play_data_save_flag == 1:
+                                if self.play_fd !=None:
+                                    self.play_fd.write(audio_data)
+                        elif  jsload_data["event_type"] == "conversation.audio.completed":#结束播放
+                            if self.play_data_save_flag == 1:
+                                if self.play_fd !=None:
+                                    print("输出音频文件关闭")
+                                    self.play_fd.close()
+
+                        # elif jsload_data["event"]  == "SpeechContent" :#asr转译
+                        #     print("VC:SpeechContent!!!!!!!!\r\n")
+                        #     payload = jsload_data["payload"]
+                            
+                            
+                        #     if(payload['finished'] == True):#asr结束
+                        #         self.VC_state =  VC_State_SpeechEnd
+                        #         #self.VC_Speech_End()#停止录音
+                        #         text = payload["text"]
+                        #         if self.check_text(text) == 0:
+                        #             if self.AI_VC_send_data_queue.empty()!=True:
+                        #                 self.AI_VC_send_data_queue.clear()
+                        #             if self.AI_ASR_send_data_queue.empty()!=True:
+                        #                 self.AI_ASR_send_data_queue.clear()
+                        #             self.AI_ASR_send_buf_len = 0
+                        #             EventMesh.publish("open_led_all")
+                        #             try:
+                        #                 EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_VC}) 
+                        #                 EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End}) 
+                                        
+                        #                 # EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_asr})
+                        #                 EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                        #             except Exception as e:
+                        #                 usys.print_exception(e)
+                                
+                        #         pass
+                        #     else:
+                        #         pass
+
+                        # elif jsload_data["event"]  == "SpeechEnded" :#服务器下发ASR说话结束
+                        #     self.VC_state =  VC_State_SpeechEnd
+                        # elif jsload_data["event"]  == "RespondingContent" :#chat回答      
+                        #     pass
+                            
+                        # elif jsload_data["event"]  == "RespondingStarted" :#音频开始下发
+                        #     self.play_flag = 0
+                        #     self.VC_state = VC_State_TTSStart
+                        #     if self.is_long_record == 0:
+                        #         EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})#
+                        #     else:
+                        #         self.AI_ASR_str_tmp = ""
+                        #         self.AI_ASR_str = ""
+                        #     EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Play_Start})
+                        #     self.VC_Thinking_timerout = 0#关闭超时重试
+                        #     # self.VC_Play_Start()
+                        #     EventMesh.publish("open_led_green")#绿色
+                        #     #self.tts_fd = open('/usr/tts_tesr.pcm','w')
+                        #     if self.play_data_save_flag == 1:
+                        #         try:
+                        #             uos.remove('/usr/play_data.pcm')
+                        #         except Exception as e:
+                        #             usys.print_exception(e)
+                        #         self.play_fd = open('/usr/play_data.pcm','w')
+                            
+                        #     pass
+                        # elif jsload_data["event"]  == "RespondingEnded" :#音频下发结束
+                        #     #if self.VC_state == VC_State_TTSStart:
+                            
+                        #     print("RespondingEnded!!!!!!" )
+                        #     self.VC_state = VC_State_TTSEnd
+                        #     self.LocalRespondingEnded_timerout = 10 #最长倒数10秒发送音频结束或者终止对话
+                        #     if self.VC_mode == 0 :#连续问答模式
+                        #         #EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})#调试临时打开
+                        #         if dev_type != "7PIN_BK":
+                        #             EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_Start})#开始录音 
+                        #         pass
+                        #     if self.play_data_save_flag == 1:
+                        #         if self.play_fd !=None:
+                        #             self.play_fd.close()
+                        #     #self.tts_fd.close()
+                        #     #pass
+                        # elif jsload_data["event"]  == "DialogStateChanged" :#状态切换事件
+                        #     payload = jsload_data["payload"]
+                        #     if payload["state"] == "Listening":#可以说了
+                        #         self.VC_state = VC_State_Listening
+                        #         if self.AI_TTS_str != "" or self.AI_ASR_str != "":#有tts数据,则请求TTS数据,没有就请求开始上传语音
+                        #             self.AI_client_VC_RequestToRespond()
+                        #         else:
+                        #             pass
+                        #             #self.VC_Speech_Start()#开启线程获取录音数据
+                        #             if self.is_long_record == 0:
+                        #                 EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_Start})#
+                        #             #self.AI_client_VC_send_speech()#开始上传语音
+                                
+                        #         #EventMesh.publish("open_led_red")
+                        #     if payload["state"] == "Thinking":#思考
+                        #         self.VC_state = VC_State_Thinking
+                        #         if self.VC_Thinking_timerout == 0:
+                        #             self.VC_Thinking_timerout = 15#倒计时15秒,如果没有音频数据返回就重试
+                        #         EventMesh.publish("open_led_red_green")#黄色
+                        #     if payload["state"] == "Responding":#开始音频播放
+                        #         #self.VC_state = VC_State_Responding#
+                        #         pass
+                        # elif jsload_data["event"]  == "RequestAccepted" :#请求上传语音被允许
+                        #     #self.VC_state =  VC_State_Responding
+                        #     #self.AI_client_VC_send_speech()#开始上传语音
+                        #     pass
+                    else:#下发音频数据
+                        #self.AI_ASR_str = ""#下发音频后清掉asr结果
+                        
+                        print("下发音频数据1:{}".format(len(recv_data)))
+                        
+                        if self.play_data_save_flag == 1:
+                            if self.play_fd !=None:
+                                self.play_fd.write(recv_data)
+                        # print("下发音频数据2:{}".format(len(recv_data)))
+                        if self.VC_state >= VC_State_TTSStart:
+                            #self.put_record_data([recv_data,""])
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.put_record_data,"data":[recv_data,""]}) 
+                        utime.sleep_ms(1)
+                except Exception as e:
+                    usys.print_exception(e)
+                
+            except Exception as e:
+                    
+                    error_str = str(e)
+                    #print("VC VC:e:{}".format(error_str))
+                    if error_str.find("[Errno 110] ETIMEDOUT")!= -1:
+                        #print("VC VC:recv TIMEDOUT 正常")
+                        pass
+                    else:
+                        usys.print_exception(e)
+                        #self.websocket_error()
+                        print("VC VC :读数据报错,退出")
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"VC出错了,请重试"}) 
+                        self.ud_error(["VC",self.VC_taskid])
+                        break
+        self.AI_client_VC_isconnect = 0
+        self.AI_client_VC_recv_id = 0 
+        self.AI_client_VC_recv_lock = 0
+        print("AI_client_VC_recv END!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+    def put_record_data(self,data):
+        #print("下发音频数据1:{}".format(len(data[0])))
+        ret=self.AI_audio_queue.put(data)
+        self.tts_in_data_len += len(data[0])
+        #print("下发音频数据2:{},{}".format(len(data[0]),self.tts_in_data_len))
+    def check_text(self,text):
+        if len(text)>60:
+            return -1
+        try:
+            if isinstance(text, str): 
+                if text.find("声音") != -1 and text.find("改") != -1:
+                    try:
+                        for key in self.VC_TTS_voice_type:
+                            if  text.find(key) != -1 :
+                                self.VC_TTS_voice_key = key
+                                EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                                self.AI_TTS_str = "更改成功" 
+                                return 0
+                    except Exception as e:
+                        usys.print_exception(e)    
+                    if  text.find("男") != -1 :
+                        if "男" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "男"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                            self.AI_TTS_str = "更改成功" 
+                            return 0
+                    if text.find("女") != -1 :
+                        if "女" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "女"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                            self.AI_TTS_str = "更改成功" 
+                            return 0
+                    if text.find("同声") != -1 or text.find("童") != -1 :
+                        if "童" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "童"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                            self.AI_TTS_str = "更改成功" 
+                            return 0
+                    if text.find("粤") != -1 or text.find("越野") != -1 or text.find("广东话") != -1:
+                        if "粤" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "粤"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                            self.AI_TTS_str = "更改成功" 
+                            return 0
+                    if text.find("四川") != -1 :
+                        if "四川" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "四川"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                            self.AI_TTS_str = "更改成功" 
+                            return 0
+                    if text.find("个性") != -1 :
+                        if "个性" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "个性"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                            self.AI_TTS_str = "更改成功" 
+                            return 0
+                    if text.find("英语") != -1 :
+                        if "英语" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "英语"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                            self.AI_TTS_str = "更改成功" 
+                            return 0
+                    self.AI_TTS_str = "更改失败,没找到对应声音" 
+                    return 0
+                if text.find("切换对话模式") != -1:
+                    if self.VC_mode == 0:
+                       self.VC_mode = 1
+                       self.AI_TTS_str = "已切换到单对话模式" 
+                    else:
+                        self.VC_mode = 0 
+                        self.AI_TTS_str = "已切换到长对话模式" 
+                    EventMesh.publish("set_storage_config",["VC_mode",self.VC_mode])
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+
+                    return 0
+                if text.find("音量") != -1:
+                    if  text.find("加") != -1 :
+                        self.VC_TTS_volume += 10
+                        if self.VC_TTS_volume > 100:
+                            #EventMesh.publish("audio_montage_play",["yinliangyizuida.mp3"])
+                            #self.aud.play(1,0,'U:/static/yinliangyizuida.mp3')#音量已最大
+                            self.AI_TTS_str = "音量已最大" 
+                            self.VC_TTS_volume = 100
+                        else:
+                            self.aud.setVolume(self.VC_TTS_volume //10)
+                            EventMesh.publish("set_storage_config",["VC_TTS_volume",self.VC_TTS_volume])
+                            #EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#配置成功
+                            self.AI_TTS_str = "配置成功,当前音量 {}".format(self.VC_TTS_volume)
+                            
+                        return 0
+                    if text.find("减") != -1:
+                        self.VC_TTS_volume -= 10
+                        if self.VC_TTS_volume < 0:
+                            self.VC_TTS_volume = 0
+                            #EventMesh.publish("audio_montage_play",["yinliangyizuixiao.mp3"])
+                            #self.aud.play(1,0,'U:/static/yinliangyizuixiao.mp3')#音量已最小
+                            self.AI_TTS_str = "音量已最小"
+                        else:
+                            self.aud.setVolume(self.VC_TTS_volume //10)
+                            EventMesh.publish("set_storage_config",["VC_TTS_volume",self.VC_TTS_volume])
+                            #EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#配置成功
+                            self.AI_TTS_str = "配置成功,当前音量 {}".format(self.VC_TTS_volume)
+                        return 0
+                
+                if text.find("进入工厂模式") != -1 :
+                    self.factory_mode()
+                    return 1
+                if text.find("查询") != -1:
+
+                    if text.find("信号") != -1 :
+                        signal = net.csqQueryPoll()
+                        
+                        self.AI_TTS_str = "当前信号{}".format(signal)
+                        return 0
+                    if text.find("电量") != -1 :
+                        battery = EventMesh.publish("get_battery")
+                        print("电量查询:{}".format(battery))
+                        #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)])
+                        #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余
+                        self.AI_TTS_str = "电量剩余百分之{}".format(battery)
+                        return 0
+                    if text.find("电压") != -1 :
+                        Vbatt = Power.getVbatt()
+                        #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)])
+                        #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余
+                        self.AI_TTS_str = "当前电池电压{}".format(Vbatt)
+                        return 0
+
+                    if text.find("卡号") != -1 :
+                        iccid = sim.getIccid()
+                        if iccid != -1 and len(iccid) > 5:
+                            print("iccid{}".format(iccid))
+                            self.AI_TTS_str = "当前卡号为:{}".format(iccid)
+                        else:
+                            self.AI_TTS_str = "卡号查询失败"
+                        return 0
+                    if text.find("设备号") != -1 :
+                        imei = modem.getDevImei()
+                        if imei != -1 and len(imei) > 5:
+                            print("IMEI:{}".format(imei))
+                            self.AI_TTS_str = "当前设备号为:{}".format(imei)
+                        else:
+                            self.AI_TTS_str = "设备号查询失败"
+                        return 0
+                    if text.find("版本") != -1 :
+                        sourceVersion = versions.Build_Time
+                        self.AI_TTS_str ="Mr-Seven-"+sourceVersion
+                        return 0
+                    if text.find("服务器地址") != -1 :
+                        self.AI_TTS_str ="服务器地址"+self.server_ip
+                        return 0
+                if text.find("升级") != -1 and (text.find("OTA") != -1 or text.find("ota") != -1):
+                    if self.ai_OTA.min_sys_ota()==1:
+                        self.AI_TTS_str = "有新版本,准备开始升级,升级过程会多次重启设备,请保证流量充足及电量充足"
+                    else:
+                        self.AI_TTS_str = "当前已是最新版本"
+                    return 0
+                
+                if len(text)<12 and (text.find("再见") != -1 or text.find("拜拜") != -1):
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+                    return 1
+        except Exception as e:
+                usys.print_exception(e)
+        return -1
+    #获取trace_id
+    def get_trace_id(self):
+        t = utime.mktime(utime.localtime())
+        t = t*1000+urandom.randint(0, 1000)
+        md5_data = "{}".format(t)#md5签名
+        sign_data = ""
+        hash_obj = uhashlib.md5(md5_data)
+        res = hash_obj.digest()
+
+        # 转成十六进制表示
+        sign_data = ubinascii.hexlify(res)
+        sign_data = sign_data.decode('ascii')
+        return sign_data
+    
+    def get_session_id(self,data = "session_id"):
+        t = utime.mktime(utime.localtime())
+        t = t*1000+urandom.randint(0, 1000)
+        md5_data = "{}{}".format(data,t)#md5签名
+        sign_data = ""
+        hash_obj = uhashlib.md5(md5_data)
+        res = hash_obj.digest()
+
+        # 转成十六进制表示
+        sign_data = ubinascii.hexlify(res)
+        sign_data = sign_data.decode('ascii')
+        return sign_data
+    
+    def get_new_message_id(self):
+        message_id = self.get_trace_id()+"aaa"+self.get_trace_id()
+        self.VC_message_id=message_id[:32]
+        return self.VC_message_id 
+    def get_new_task_id(self):
+        task_id = self.get_trace_id()+"aaa"+self.get_trace_id()
+        self.VC_task_id=task_id[:32]
+        return self.VC_task_id
+    #开始播放声音
+    def VC_Play_Start(self):
+        self.tts_in_data_len = 0
+        self.tts_out_data_len = 0
+        if self.VC_play_TYPE == VC_play_TYPE_PCM:
+            # if self.VC_play_samplerate == 8000:
+            #     pass
+            # elif self.VC_play_samplerate == 16000:
+            #     if self.play_pcm == None:        
+            #         self.play_pcm = audio.Audio.PCM(0,1,16000,1,1,2)
+            #         #self.play_pcm.setVolume(11)
+            #         ret = self.play_pcm.stream_write_start()
+            #         print("self.record_pcm.stream_write_start:ret:{}".format(ret))
+            if self.play_pcm == None:
+                self.play_pcm = audio.Audio.PCM(0,1,self.VC_play_samplerate,1,1,2)
+                #self.play_pcm.setVolume(11)
+            ret = self.play_pcm.stream_write_start()
+            print("音频初始化:self.record_pcm.stream_write_start:ret:{}".format(ret))       
+        elif self.VC_play_TYPE == VC_play_TYPE_MP3:
+            pass
+    #停止播放声音
+    def VC_Play_End(self):
+        if self.VC_play_TYPE == VC_play_TYPE_PCM:
+            if self.VC_play_samplerate == 8000:
+                self.aud.stopPlayStream()
+                self.aud.stopAll()
+            else:
+                if self.play_pcm != None:
+                    print("Close:play_pcm.close()!!!!!!!!!!!!!!!!!!")
+                    try:
+                        self.play_pcm.stream_stop()
+                        self.play_pcm.close()
+                    except Exception as e:
+                        usys.print_exception(e)
+                    self.play_pcm=None
+                self.aud.stopPlayStream()
+                self.aud.stopAll()
+        elif self.VC_play_TYPE == VC_play_TYPE_MP3:
+            self.aud.stopPlayStream()
+            self.aud.stopAll()
+   
+    def _1S_timer_cb(self,*argc):
+        EventMesh.publish("publish_AI_btnInfo",{"func":self._1S_timer_cb_}) 
+
+    def _1S_timer_cb_(self):    
+    
+        EventMesh.publish("system_sleep_rest")#防止黑屏
+        self.close_timerout += 1
+        if self.close_timerout > 60:#20秒没数据就close
+            
+            if self.VC_state >= VC_State_SpeechIng:
+                print("接口无响应,超时退出")
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"接口超时了。请重试"}) 
+                self.ud_error(["VC",self.VC_taskid])
+            else:
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+        # print("get_audio_state !!!!!{} {} {}\r\n".format(self.play_end,EventMesh.publish("get_audio_state"),self.play_flag))
+        if self.LocalRespondingEnded_timerout>0  :#
+            self.LocalRespondingEnded_timerout -= 1
+            print("LocalRespondingEnded_timerout:{}".format(self.LocalRespondingEnded_timerout))
+            if self.LocalRespondingEnded_timerout <= 0 or (self.play_pcm != None and self.play_pcm.stream_is_empty() == 1) :#超时或者音频播放完,
+                self.LocalRespondingEnded_timerout = 0
+                if self.VC_mode == 1 :#长按单次问答模式
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+                else:
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_Start})#开始录音
+                    #通知服务器播放结束
+                    self.AI_client_VC_LocalRespondingEnded()
+        self.VC_pingping_timerout+=1
+        if self.VC_pingping_timerout>3:
+            self.VC_pingping_timerout=0
+            #self.AI_client_VC_ping()
+        self.asr_pingping_timerout += 1
+        if self.asr_pingping_timerout>3:
+            self.asr_pingping_timerout=0
+            self.AI_client_asr_ping()    
+        if self.VC_Thinking_timerout > 0 and self.VC_Thinking_timerout < 100:#VC Thinking超时后重新开始
+            print("VC_Thinking_timerout:{}!!!!!!!!!!!!!!!!!!!!!".format(self.VC_Thinking_timerout))
+            self.VC_Thinking_timerout -=1
+            if self.VC_Thinking_timerout == 0:
+                self.VC_Thinking_timerout = 100
+                print("Thinking重试,重试!!!!!!!!!!!!!!!!!!!!!")
+                self.VC_state = VC_State_None
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                pass
+        if self.VC_Speech_end_timerout >0:
+            self.VC_Speech_end_timerout-=1
+            if self.VC_Speech_end_timerout <=0:
+                self.VC_Speech_end_timerout = 0
+                self.AI_client_VC_end_speech()#发送说话终止
+    #VC开始
+    def AI_VC_start(self):
+        print("AI_VC_start1")
+        self.VC_satrt_flag = 1
+        if self.VC_Thinking_timerout < 100:
+            self.VC_Thinking_timerout = 0
+        EventMesh.publish("open_led_all")
+        self.VC_Play_End()#关闭音频播放
+        print("AI_VC_start2")
+        #self.aud.aud_tone_play(16,200)#播放按键音
+        self.LocalRespondingEnded_timerout = 0
+        self.close_timerout = 0
+
+        
+        #
+        if self.AI_client_VC_isconnect == 0:#没连接的时候请求开始
+            self.websocket_connect_VC()#连接服务器
+            self.AI_client_VC_start_requset()
+            #utime.sleep_ms(50)
+        else:
+            print("self.VC_state :{}".format(self.VC_state ))
+            if self.VC_state > VC_State_SpeechStart:
+                #客户端打断对话
+                print("打断对话")
+                # self.websocket_deconnect_VC()
+                # self.websocket_connect_VC()#连接服务器
+                # self.AI_client_VC_start_requset()
+                self.AI_client_VC_RequestToSpeak()
+            elif self.VC_state == VC_State_Listening:
+                #直接chat
+                print("直接chat")
+                self.AI_client_VC_RequestToRespond()
+                return 
+            else:
+                print("异常状态")
+                #self.AI_client_VC_RequestToSpeak()
+                self.websocket_deconnect_VC()
+                self.websocket_connect_VC()#连接服务器
+                self.AI_client_VC_start_requset()
+        if self.AI_client_VC_isconnect == 0:
+            return
+        print("AI_VC_start3")
+         
+        self.VC_state = VC_State_None
+        if self.AI_TTS_str == "":#没有tts要播放的时候才开始录音
+            #开始asr录音
+            self.VC_Speech_Start()
+        #     pass
+        print("AI_VC_start4")
+        
+        #开始线程
+        
+        # if self.AI_VC_send_data_queue_thread_id == 0:    
+        #     _thread.stack_size(self.Audio_buf_size+8*1024)
+        #     self.AI_VC_send_data_queue_thread_id = _thread.start_new_thread(self.AI_VC_send_data_queue_thread, ())
+        #     _thread.stack_size(8*1024)
+        #     print("AI_VC_start :AI_VC_send_data_queue_thread_id :{} ".format(self.AI_VC_send_data_queue_thread_id))
+        
+        if self.AI_audio_queue_thread_id ==0:
+            _thread.stack_size(24*1024)
+            self.AI_audio_queue_thread_id = _thread.start_new_thread(self.AI_audio_queue_thread, ())
+            _thread.stack_size(8*1024)
+            print("AI_VC_start :AI_audio_queue_thread_id :{} ".format(self.AI_audio_queue_thread_id))
+        else:
+            print("AI_VC_start :AI_audio_queue_thread_id != 0 ")
+        self._1S_timer.start(1000,1,self._1S_timer_cb)
+        # self.VC_pingping_timerout = 0
+        # self.asr_pingping_timerout = 0
+        print("AI_VC_start5")
+    #开始会话
+    def AI_client_VC_start_requset(self):
+        voice="huoshan::zh_male_wennuanahu_moon_bigtts"
+        try:
+            voice = self.VC_TTS_voice_type[self.VC_TTS_voice_key]["voice"]
+        except Exception as e:
+            usys.print_exception(e)    
+        json_data =\
+        {
+            "id": "event_id",
+            "event_type": "chat.update",
+            "data": {
+                "chat_config": {
+                    "auto_save_history": True, #保存历史记录。默认 true
+                    #"conversation_id": "1235984as1d54", #conversation_id
+                    "user_id": "86952145024",  #标识当前与智能体的用户,由使用方自行定义、生成与维护。user_id 用于标识对话中的不同用户,不同的 user_id,其对话的上下文消息、数据库等对话记忆数据互相隔离。如果不需要用户数据隔离,可将此参数固定为一个任意字符串
+                    "meta_data": {}, #附加信息,通常用于封装一些业务相关的字段。查看对话消息详情时,系统会透传此附加信息。
+                    "custom_variables": {}, #智能体中定义的变量。在智能体prompt中设置变量{{key}}后,可以通过该参数传入变量值,同时支持Jinja2语法。详细说明可参考变量示例。变量名只支持英文字母和下划线。
+                    "extra_params": {},   #附加参数,通常用于特殊场景下指定一些必要参数供模型判断,例如指定经纬度,并询问智能体此位置的天气。自定义键值对格式,其中键(key)仅支持设置为:latitude:纬度,此时值(Value)为纬度值,例如39.9800718。longitude:经度,此时值(Value)为经度值,例如116.309314。
+                    "parameters": {"custom_var_1": "测试"}
+                },
+                "input_audio": {         #输入音频格式
+                    "format": "pcm",       #输入音频格式,支持 pcm/wav/ogg。默认 wav
+                    "codec": "pcm",         #输入音频编码。 pcm/opus。默认 pcm
+                    "samplate_rate": self.VC_record_samplerate,  #采样率
+                    "channel": 1, #通道数
+                    "bit_depth": 16 #位深
+                },
+                "output_audio": {        #输出音频格式
+                    "codec": "pcm",        #pcm/opus 输出音频格式, 默认 pcm
+                    "pcm_config": {
+                        "sample_rate": self.VC_play_samplerate,   #码率
+                        
+                    },
+                    "speech_rate": 50,  #回复的语速,取值范围 [-50, 100],默认为 0,-50 表示 0.5 倍速,100 表示 2倍速
+                    #"voice_id": "zh_female_shaoergushi_mars_bigtts"
+                },
+                "turn_detection": {
+                               "type":                "server_vad",
+                               "prefix_padding_ms":   600,
+                               "silence_duration_ms": 500,
+                       },
+            }
+        }
+        # if self.VC_play_TYPE == VC_play_TYPE_PCM:
+        #     json_data["payload"]["out_format"]='pcm'
+        # if self.VC_record_TYPE == VC_record_TYPE_AMR :
+        #     json_data["payload"]["in_format"]='amr'
+        #     pass
+        # if self.VC_mode == 1:
+        #     json_data["payload"]["voice_detection"]='disable'
+        self.VC_state = VC_State_None
+        self.AI_client_VC_send(ujson.dumps(json_data))
+ 
+    #开始上传语音
+    def AI_client_VC_send_speech(self):
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"SendSpeech"
+                },
+            "payload":
+            {
+                "dialog_id":self.VC_dialog_id,
+                "session_id": self.session_id ,
+            }
+        }
+        #self.AI_client_VC_send(ujson.dumps(json_data))
+        self.VC_Speech_Start()#开启线程获取录音数据
+        self.VC_state =  VC_State_SpeechStart
+    def AI_client_VC_input_audio_buffer_append(self,data):
+        json_data = \
+        {
+            "id": "event_id",
+            "event_type": "input_audio_buffer.append",
+            "data": {
+            "delta": ubinascii.b2a_base64(data)
+            }
+        }
+        self.AI_client_VC_send(ujson.dumps(json_data))
+    #结束上传语音
+    def AI_client_VC_end_speech(self):
+        json_data = \
+        {
+            "id": "event_id",
+            "event_type": "input_audio_buffer.complete",
+            "data": {}
+        }
+        self.AI_client_VC_send(ujson.dumps(json_data))
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.send_tone}) 
+
+    #通知服务器开始播放
+    def AI_client_VC_LocalRespondingStarted(self):
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"LocalRespondingStarted"
+                },
+            "payload":{
+                "dialog_id":self.VC_dialog_id,
+                "session_id": self.session_id ,
+                }
+        }
+        self.AI_client_VC_send(ujson.dumps(json_data))
+    #通知服务器播放结束
+    def AI_client_VC_LocalRespondingEnded(self):
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"LocalRespondingEnded"
+                },
+            "payload":{
+                "dialog_id":self.VC_dialog_id,
+                "session_id": self.session_id ,
+                }
+        }
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) 
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_send,"data":ujson.dumps(json_data)}) 
+        # json_data = \
+        # {
+        #     "header":{
+        #         "trace_id":self.get_trace_id(),
+        #         "event":"AAAAAAAAAAAAAA1"
+        #         },
+        #     "payload":{
+        #         "dialog_id":self.VC_dialog_id,
+        #         "session_id": self.session_id ,
+        #         }
+        # }
+        # EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_send,"data":ujson.dumps(json_data)}) 
+        # utime.sleep_ms(1)
+        # self.AI_client_VC_send(ujson.dumps(json_data))
+        self.VC_state = VC_State_End
+    #客户端打断对话
+    def AI_client_VC_RequestToSpeak(self):
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"RequestToSpeak"
+                },
+            "payload":{
+                "dialog_id":self.VC_dialog_id,
+                "session_id": self.session_id ,
+                }
+        }
+        print("AI_client_VC_RequestToSpeak!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) 
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_send,"data":ujson.dumps(json_data)}) 
+        # utime.sleep_ms(1)
+    #请求TTS或者chat事件
+    def AI_client_VC_RequestToRespond(self):
+        self.session_id  = self.get_session_id()#调试临时打开
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"RequestToRespond"
+                },
+            "payload":{
+                "dialog_id":self.VC_dialog_id,
+                "session_id": self.session_id ,
+                "type":"transcript",#prompt是跳过asr,transcript是跳过asr和大模型
+                "text":""
+                }
+        }
+
+        print("AI_client_VC_RequestToRespond!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        # if self.VC_state == VC_State_RequestToRespond:
+        #     print("AI_client_VC_RequestToRespond 重复 tts_str:{}\nasr_str:{}".format(self.AI_TTS_str,self.AI_ASR_str))
+        self.VC_state = VC_State_RequestToRespond
+        if self.AI_TTS_str != "":
+            json_data["payload"]["text"] = self.AI_TTS_str
+            json_data["payload"]["type"] = "transcript"
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) 
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_send,"data":ujson.dumps(json_data)}) 
+            self.AI_TTS_str = ""
+        elif self.AI_ASR_str != "":
+            json_data["payload"]["text"] = self.AI_ASR_str
+            json_data["payload"]["type"] = "prompt"
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) 
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_send,"data":ujson.dumps(json_data)})
+            if dev_type != "7PIN" :
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.send_tone}) 
+            #
+            #self.AI_ASR_str = ""
+        # utime.sleep_ms(1)
+    def chenggong_tone(self):
+        EventMesh.publish("audio_montage_play",["chenggong.mp3"])    
+    def send_tone(self):
+        EventMesh.publish("audio_montage_play",["send_tone.mp3"])
+    #给服务器回应ack
+    def AI_client_VC_Read(self):
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"Read"
+                },
+            "payload":{
+                "dialog_id":self.VC_dialog_id
+                }
+        }
+        print("AI_client_VC_Read!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        
+        #for i in range(6): 
+            #EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_send,"data":ujson.dumps(json_data)}) 
+        # utime.sleep_ms(1)
+        if self.AI_client_VC != None and self.AI_client_VC_isconnect == 1:
+            self.AI_client_VC.send(ujson.dumps(json_data))
+      
+    ############################################
+    #关闭音频播放线程
+    def AI_audio_queue_thread_close(self):
+        print("AI_audio_queue_thread_close1!!!!!!!!!!!!!!!!!!!!!!")
+        if self.AI_audio_queue_thread_id != 0:
+            count =500
+            while True:
+                count -= 1
+                if self.AI_audio_queue_thread_lock == 0 or count <=0:
+                    break
+                else:
+                    self.AI_audio_queue_thread_lock = 2
+                    print("AI_audio_queue_thread going:{}...".format(count))
+                    utime.sleep_ms(1)
+            self.AI_audio_queue_thread_lock = 0
+            print("AI_audio_queue_thread_close2!!!!!!!!!!!!!!!!!")
+            try:
+                _thread.stop_thread(self.AI_audio_queue_thread_id)
+            except Exception as e:
+                usys.print_exception(e)
+        self.AI_audio_queue_thread_id = 0
+    # 音频队列        
+    def AI_audio_queue_thread(self):
+        print("AI_audio_queue_thread start")
+        count = 0
+        while True:
+            try:
+                if self.AI_audio_queue_thread_lock == 2:
+                        print("AI_audio_queue_thread 该退出了")
+                        break
+                #
+                count+=1
+                if count%500 == 1:
+                    print("AI_audio_queue_thread on")
+                utime.sleep_ms(1)
+                #print("AI_audio_queue_thread")
+                if self.AI_audio_queue.empty() :
+                    self.AI_audio_queue_thread_lock = 0
+                    
+                    
+                else:
+                    self.AI_audio_queue_thread_lock = 1
+                    data = self.AI_audio_queue.get()
+                    self.close_timerout = 0
+                    if self.play_flag == 0:
+                        self.play_flag =1
+                        print("AI_client_VC_LocalRespondingStarted!!!")
+                        self.AI_client_VC_LocalRespondingStarted()#通知服务器开始播放
+                    #self.AI_client_tts_data_len=len(data)
+                    print("audio_queue:len:{}".format(len(data[0])))
+                    if len(data[0]) > 10:
+                        try:
+                            if self.VC_play_TYPE == VC_play_TYPE_PCM:
+                                # if self.VC_play_samplerate == 8000:
+                                #     tmp= self.aud.playStream(1,data[0] )
+                                # elif self.VC_play_samplerate == 16000:
+                                
+                                
+                                    
+                                    write_buf = bytearray(data[0])
+                                    #print("play_pcm.stream_write1!!")
+                                    if self.play_pcm != None:
+                                        print("play_pcm.stream_write !!!")
+                                        ret = self.play_pcm.stream_write(write_buf,len(write_buf))
+                                        #ret= self.aud.playStream(1, data[0])#播放音频流
+                                        self.tts_out_data_len += ret
+                                        #print("play_pcm.stream_write:{}".format(self.tts_out_data_len))
+                            elif self.VC_play_TYPE == VC_play_TYPE_MP3:
+                                tmp= self.aud.playStream(3, data[0])#播放音频流
+                                
+                                if tmp != 0:
+                                    print("2playStream:error tmp:{} data len:{}!!!!!!!!!!!!".format(tmp,len(data[0])))
+                                    # # #播放失败的时候填充WAV头
+                                    # data_len = len(data[0])
+                                    # data_len_b = data_len.to_bytes(4,'little')#数据长度转16进制数组
+                                    # h_data = [ 0x52 ,0x49 ,0x46 ,0x46 #,0x24 ,0x00 ,0x00 ,0x00 #文件标识、文件大小
+                                    #         ,0x57 ,0x41 ,0x56 ,0x45 ,0x66 ,0x6D ,0x74 ,0x20  #文件格式、格式块标识符
+                                    #         ,0x10 ,0x00 ,0x00 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x80 ,0x3E ,0x00 ,0x00  #格式块大小4、音频格式2、声道数2、采样率4
+                                    #         ,0x80 ,0x3E ,0x00 ,0x00 ,0x02 ,0x00 ,0x10 ,0x00 ,0x64 ,0x61 ,0x74 ,0x61]#每秒字节数4、数据块对齐2、位深度2、data4
+                                    # h_data_b = bytes(h_data)
+                                    # file_len = data_len+len(h_data_b)+4+4
+                                    # file_len_b = file_len.to_bytes(4,'little')#文件长度转16进制数组
+                                    # h_data_b = h_data_b[:4]+file_len_b+h_data_b[4:]+data_len_b
+                                    # #self.aud.playStream(2, h_data_b)#播放音频流
+                                    # tmp= self.aud.playStream(2, h_data_b+data[0])#播放音频流
+                                    # print("3playStream:tmp:{} !!!!!!!!!!!!".format(tmp))
+                            
+                            
+                            mem = gc.mem_free()
+                            #print('1剩余内存RAM:{} KB'.format(mem / 1024))
+                        except Exception as e:
+                            print("AI_audio_queue_thread:ERROR:")
+                            usys.print_exception(e)
+                    
+                    # if self.VC_state == VC_State_TTSEnd and self.AI_audio_queue.empty() :#self.AI_audio_queue为空且tts下发结束
+                    #     #通知服务器播放结束
+                    #     self.AI_client_VC_LocalRespondingEnded()
+            except Exception as e:
+                print("AI_audio_queue_thread:ERROR:")
+                usys.print_exception(e)
+        self.AI_audio_queue_thread_lock = 0
+        #print("AI_audio_queue_thread:exit")
+    def factory_mode(self):
+        print("factory_mode")
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.factory_start}) 
+    def factory_start(self):
+        self.factory_timer.start(3000, 1, self.factory_timer_cb)
+    def factory_timer_cb(self, *args, **kwargs):
+        print("factory_timer_cb play......")
+        #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+        EventMesh.publish("audio_montage_play",["xinhaoruo1.mp3"])
+
+    def Close(self):
+        self.VC_Thinking_timerout = 0
+        self.VC_satrt_flag = 0
+        self.AI_TTS_str = ""
+        self.AI_ASR_str = ""
+        self.AI_ASR_str_tmp = ""
+        self.AI_ASR_flag  = 0
+        self.AI_ASR_check_timeout = 0
+        self.AI_ASR_error_timeout = 0
+        print("ai_VC Close1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        EventMesh.publish("close_led")
+        self.tts_in_data_len = 0
+        self.tts_out_data_len = 0
+        #必须先销毁线程,不然线程会容易报错
+        try:
+            self.AI_ASR_send_data_queue_thread_close()#销毁ASR发送线程
+        except Exception as e:
+            usys.print_exception(e)
+        try:
+            self.AI_audio_queue_thread_close()#销毁音频线程
+        except Exception as e:
+            usys.print_exception(e)
+        try:
+            self.AI_VC_send_data_queue_thread_close()#销毁数据发送线程
+        except Exception as e: 
+            usys.print_exception(e)
+        
+        self.VC_Speech_End()
+        print("ai_VC Close1.1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        self.VC_init()
+        
+        print("ai_VC Close1.2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        
+        try:
+            self.websocket_deconnect_asr()
+        except Exception as e:
+            usys.print_exception(e)
+        try:
+            self.websocket_deconnect_VC()
+        except Exception as e:
+            usys.print_exception(e)
+        print("ai_VC Close1.3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        
+        print("ai_VC Close2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        
+        
+        self.AI_ASR_timer.stop()
+        self._1S_timer.stop()
+        self.factory_timer.stop()
+        
+        if self.record_data_save_flag == 1:
+            if self.record_fd :
+                self.record_fd.close()
+            self.record_fd = None
+        if self.play_data_save_flag == 1:
+            if self.play_fd !=None:
+                self.play_fd.close()
+        print("ai_VC Close3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")
+        
+        if self.AI_VC_send_data_queue.empty()!=True:
+            self.AI_VC_send_data_queue.clear()
+        if self.AI_ASR_send_data_queue.empty()!=True:
+            self.AI_ASR_send_data_queue.clear()
+        self.AI_ASR_send_buf_len = 0
+        #self.AI_WS_connect_Queue.put(self.AI_client_VC)
+
+        # try:
+        #     while True:
+        #         if self.AI_WS_connect_Queue.empty()!=True:
+        #             AI_WS_connect = self.AI_WS_connect_Queue.get()
+        #             if AI_WS_connect :
+        #                 try:
+        #                     AI_WS_connect._close()
+        #                     AI_WS_connect = None
+        #                 except Exception as e:
+        #                     usys.print_exception(e)
+        #             else:
+        #                 print("websocket链接已为空")
+        #         else:
+        #             break
+        # except Exception as e:
+        #     usys.print_exception(e)
+
+    def VC_init2(self):
+        self.VC_init()
+        
+        print("ai_VC VC_init2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        try:
+            self.websocket_deconnect_VC()
+        except Exception as e:
+            usys.print_exception(e)
+        print("ai_VC Close3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")
+        self._1S_timer.stop()
+        if self.AI_VC_send_data_queue.empty()!=True:
+            self.AI_VC_send_data_queue.clear()
+        if self.AI_ASR_send_data_queue.empty()!=True:
+            self.AI_ASR_send_data_queue.clear()
+        self.AI_ASR_send_buf_len = 0
+        if self.AI_audio_queue.empty()!=True:
+            self.AI_audio_queue.clear()
+    def VC_init(self):
+        
+        print("VC_init:AI_VC_send_data_queue:size:{}".format(self.AI_VC_send_data_queue.size()))
+        
+        
+        print("VC_init2")
+        #self.VC_Speech_End()
+        print("VC_init3")
+        self.VC_Play_End()
+        print("VC_init4")
+        
+        if self.AI_audio_queue.empty()!=True:
+            self.AI_audio_queue.clear()
+        # num = EventMesh.publish("get_volum_size")
+        # if num == None:
+        #     num = 8
+        # self.aud.setVolume(num)#恢复原始音量
+        
\ No newline at end of file
diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/ai_alarm.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/ai_alarm.py
new file mode 100644 (file)
index 0000000..5085bac
--- /dev/null
@@ -0,0 +1,212 @@
+#ai闹钟
+import EventMesh
+import usys
+import ujson
+import osTimer
+import utime
+class AI_alarm():
+    """
+    sjon格式{
+    "alarm_type":"间隔闹钟", #闹钟类型。示例值:间隔闹钟(喝水提醒,重复每天闹钟)、单次闹钟(会议提醒)
+    "alarm_timestamp":1750402089,#单次闹钟触发时间戳,单位:秒。只有单次闹钟有效
+    "repeat_day":["周一","周二","周三","2025-06-20"],#按天循环规则。示例值:周一,周五,每天,2025-06-20(自定义日期)
+    "repeat_min":60,#当天是否按多少分钟循环,为0时每天只响应一次,为120时每隔2小时触发一次。示例值:120
+    "valid_time":"9-18",# 当天循环有效时间,只有当repeat_min不为0时有效。repeat_min=60时,在有效时间内1小时循环响应1次。等于空值时,当天24小时有效
+    "alarm_timer":"06:50",#触发时间。示例值:06:50 ,6点50分时触发闹钟
+    "alarm_content":"周例会",#闹钟提醒内容。为空时,播放本地默认音频,不为空时,tts循环播放内容。示例值:"喝水提醒"
+    }
+    """
+    def __init__(self):
+        self.alarm_array = EventMesh.publish("get_storage_config","alarm_array")#读取闹钟数组
+        if self.alarm_array ==None:
+            self.alarm_array =[]
+        self.AI_alarm_timer = osTimer()
+        self.alarm_min_repeat_tmp = 0
+        self.alarm_min_one_tmp = 0
+        EventMesh.subscribe("AI_alarm_close",self.AI_alarm_close)
+        EventMesh.subscribe("AI_alarm_open",self.AI_alarm_open)
+        EventMesh.subscribe("AI_alarm_poll_extern",self.AI_alarm_poll_extern)
+        EventMesh.subscribe("AI_add_alarm",self.AI_add_alarm)
+
+    def AI_alarm_open(self,event=None,msg=None):
+        self.AI_alarm_timer.start(20000, 1, self.AI_alarm_timer_cb)
+
+    def AI_alarm_timer_cb(self, *args):
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_alarm_poll}) 
+        pass
+
+
+    def AI_alarm_poll(self):#轮询调用
+        is_alarm = 0 #是否触发闹钟
+        alarm_TTS_str =""#闹钟播放tts字符串
+        repeat_day_flag = 0
+        alarm_timer_flag = 0
+        if len(self.alarm_array)>0:
+            try:
+                now_time = utime.localtime()
+                for _alarm in self.alarm_array :
+                    if _alarm["alarm_type"] == "重复":
+                        weekday = now_time[6]
+                        weekday_str = ""
+                        if weekday == 0:
+                            weekday_str = "周一"
+                        elif weekday == 1:
+                            weekday_str = "周二"
+                        elif weekday == 2:
+                            weekday_str = "周三"
+                        elif weekday == 3:
+                            weekday_str = "周四"
+                        elif weekday == 4:
+                            weekday_str = "周五"
+                        elif weekday == 5:
+                            weekday_str = "周六"
+                        elif weekday == 6:
+                            weekday_str = "周日"
+                        week = _alarm["repeat_day"]
+                        for _week in week :
+                            if weekday_str == _week:#符合周判断
+                                repeat_day_flag = 1
+                                break
+                        if repeat_day_flag == 0:#周不符合
+                            continue
+                        if _alarm["repeat_min"] ==0: #每天只提醒一次,已添加闹钟1,周一,周二,周三,6:50分提醒您周例会
+                            alarm_timer = _alarm["alarm_timer"]
+                            H_M = alarm_timer.split(':')
+                            if len(H_M) != 2:
+                                continue
+                            hour = int(H_M[0])
+                            min = int(H_M[1])
+                            if hour == now_time[3] and min == now_time[4]:
+                                alarm_timer_flag =1
+                            else:#时间不符合
+                                continue
+
+                            
+                            if  alarm_timer_flag==1:#时间符合,触发闹钟
+                                alarm_TTS_str += _alarm["alarm_content"]
+                                is_alarm = 1
+                                break
+                        else:#每天循环间提醒。已添加闹钟1,周一,周二,周三,9点到18点每隔60分钟提醒您喝水
+                            valid_time = _alarm["valid_time"]
+                            H_H = valid_time.split('-')
+                            if len(H_H) != 2:
+                                continue
+                            start_time = H_H[0].split(':')
+                            end_time = H_H[1].split(':')
+                            if len(start_time)<2 or len(end_time)<2:
+                                continue
+                            start_time_int  = int(start_time)
+                            end_time_int = int(end_time)
+                            now_h = now_time[3]
+                            if now_h>=start_time_int and now_h <= end_time_int:#在有效时间范围
+                                now_m = now_time[4]
+                                repeat_min_int = _alarm["repeat_min"]
+                                if (now_m + repeat_min_int)%repeat_min_int == 0 and self.alarm_min_repeat_tmp != now_m:#每分钟符合
+                                    self.alarm_min_repeat_tmp = now_m
+                                    alarm_TTS_str += _alarm["alarm_content"]
+                                    is_alarm = 1
+                                    continue
+                                
+                            else:
+                                continue
+                            
+                    elif _alarm["alarm_type"] == "单次":
+                        alarm_timer = _alarm["alarm_timer"]
+                        H_M = alarm_timer.split(':')
+                        if len(H_M) != 2:
+                            continue
+                        repeat_day = _alarm["repeat_day"]
+                        #print("repeat_day:{}".format(repeat_day[0]))
+                        Y_M_D = repeat_day[0].split('-')
+                        #print("Y_M_D:{}".format(Y_M_D))
+                        if len(Y_M_D)<3:
+                            continue
+                        year_int = int(Y_M_D[0])
+                        month_int = int(Y_M_D[1])
+                        day_int = int(Y_M_D[2])
+                        hour_int = int(H_M[0])
+                        minute_int = int(H_M[1])
+                        if year_int == now_time[0] and month_int == now_time[1]and day_int == now_time[2]and hour_int == now_time[3]and minute_int == now_time[4]:
+                            if self.alarm_min_one_tmp != now_time[4]:
+                                self.alarm_min_one_tmp = now_time[4]
+                                alarm_TTS_str += _alarm["alarm_content"]
+                                is_alarm = 1
+                                continue
+                        #ret_str += "{},{}点{}分提醒您:{}。".format(_alarm["repeat_day"],H_M[0],H_M[1],_alarm["alarm_content"])
+                if  is_alarm == 1 :
+                    EventMesh.publish("audio_montage_play",["chenggong.mp3"])   
+                    EventMesh.publish("play_tts",["小瑞提醒您该{}了,小瑞提醒您该{}了,小瑞提醒您该{}了".format(alarm_TTS_str,alarm_TTS_str,alarm_TTS_str),1]) 
+                    print("闹钟提醒:小瑞提醒您该{}了,小瑞提醒您该{}了,小瑞提醒您该{}了".format(alarm_TTS_str,alarm_TTS_str,alarm_TTS_str))
+            except Exception as e:
+                usys.print_exception(e)
+                pass
+
+    def AI_alarm_poll_extern(self,event=None,msg=None):#外部调用轮询间隔,关闭定时器调用
+        self.AI_alarm_timer.stop()
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_alarm_poll}) 
+
+    def AI_add_alarm(self,event=None,alarm_array_u=None):#添加闹钟数组
+        ret = 0
+        alarm_array_tmp = self.alarm_array
+        #已添加闹钟1,周一,周二,周三,6:50分提醒您周例会
+        ret_str = "已添加"
+        print("AI_add_alarm:{}".format(alarm_array_u))
+        try:
+            for _alarm in alarm_array_u :
+                if ("alarm_content" in _alarm )and (_alarm["alarm_type" ] == "重复" or _alarm["alarm_type" ] == "单次" ):#简单的判断这个配置是合法的
+
+                    ret +=1  
+                    alarm_array_tmp.append(_alarm)
+                    ret_str += "闹钟{},".format(len(alarm_array_tmp))
+                    
+                    
+                    if _alarm["alarm_type"] == "重复":
+                        
+                        if _alarm["repeat_min"] ==0: #每天只提醒一次,已添加闹钟1,周一,周二,周三,6:50分提醒您周例会
+                            alarm_timer = _alarm["alarm_timer"]
+                            H_M = alarm_timer.split(':')
+                            if len(H_M) != 2:
+                                return [-1]
+                            ret_str += "{},{}点{}分提醒您{}。".format(_alarm["repeat_day"],H_M[0],H_M[1],_alarm["alarm_content"])
+                        else:#每天循环间提醒。已添加闹钟1,周一,周二,周三,9点到18点每隔60分钟提醒您喝水
+                            valid_time = _alarm["valid_time"]
+                            H_H = valid_time.split('-')
+                            if len(H_H) != 2:
+                                return [-1]
+                            start_time = H_H[0].split(':')
+                            end_time = H_H[1].split(':')
+                            if len(start_time)<2 or len(end_time)<2:
+                                return [-1]
+                            ret_str += "{},{}点{}分到{}点{}分,每隔{}分钟提醒您{}。".format(_alarm["repeat_day"],
+                                                                              start_time[0],start_time[1],end_time[0],end_time[1],
+                                                                              _alarm["repeat_min"],_alarm["alarm_content"])
+                    elif _alarm["alarm_type"] == "单次":
+                        alarm_timer = _alarm["alarm_timer"]
+                        H_M = alarm_timer.split(':')
+                        if len(H_M) != 2:
+                            return [-1]
+                        repeat_day = _alarm["repeat_day"]
+                        print("repeat_day:{}".format(repeat_day[0]))
+                        Y_M_D = repeat_day[0].split('-')
+                        print("Y_M_D:{}".format(Y_M_D))
+                        if len(Y_M_D)<3:
+                            return [-1]
+                        ret_str += "{}年{}月{}日,{}点{}分提醒您:{}。".format(Y_M_D[0],Y_M_D[1],Y_M_D[2],H_M[0],H_M[1],_alarm["alarm_content"])
+
+                else:
+                    return [-1]
+        except Exception as e:
+                usys.print_exception(e)
+                return [-1]
+        if ret == 0:
+            self.alarm_array = alarm_array_tmp
+            EventMesh.publish("set_storage_config",["alarm_array",self.alarm_array])
+        return [ret,ret_str]
+    
+    def AI_delete_alarm(self,event=None,Num=None):#删除闹钟
+        
+        EventMesh.publish("set_storage_config",["alarm_array",self.alarm_array])
+
+    def AI_alarm_close(self):
+        self.AI_alarm_timer.stop()
+
diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/audio_gain.nvm b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/audio_gain.nvm
new file mode 100644 (file)
index 0000000..fe06d81
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/audio_gain.nvm differ
diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/audio_ve.nvm b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/audio_ve.nvm
new file mode 100644 (file)
index 0000000..a33dd45
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/audio_ve.nvm differ
diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/btn_device_ec800m.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/btn_device_ec800m.py
new file mode 100644 (file)
index 0000000..9bbf5e9
--- /dev/null
@@ -0,0 +1,3000 @@
+from common import Abstract
+import machine
+import osTimer
+from misc import PowerKey
+import EventMesh
+from machine import Pin
+from machine import ExtInt
+import constants
+import utime
+import audio
+import ql_fs
+import ujson
+import voiceCall
+from misc import Power
+from led import red_green_light,green_light_fast,led_mode,open_led_red,close_led_red,open_led_green,open_led_white,close_led_green,close_led_white
+from machine import RTC
+from queue import Queue
+import _thread
+import usys
+import sms
+from Gsensor import SC7A20
+if EventMesh.model == "D10" :
+    audio_buf = ['audio_find_haixiu', 'R_ALARM_NEW', 'R_BLOOD_SUGAR', 'R_CALL_mp3', 'R_CHARGE_FULL', 'R_CHARGE_IN', 'R_CHARGE_OUT', 'R_CUR_BATTERY_LEVEL', 'R_DRINK_ALARM', 'R_FALL_ALARM', 'R_HOME_ALARM', 'R_HSENSOR_RESULT_FAILE', 'R_HSENSOR_RESULT_HR_TITLE', 'R_HSENSOR_RESULT_OK', 'R_HSENSOR_SPO2_TITLE', 'R_HSENSOR_TEMP_TITLE', 'R_MEDICINE_ALARM', 'R_NO_SET_SOS_DIAL', 'R_NO_SET_VIDOE', 'R_NO_SIM', 'R_POWER_OFF_1', 'R_READ_STEP_0', 'R_READ_STEP_1', 'R_READ_STEP_2', 'R_READ_STEP_3', 'R_READ_STEP_4', 'R_READ_TIME_0', 'R_READ_TIME_1', 'R_READ_TIME_2', 'R_READ_TIME_3', 'R_READ_TIME_4', 'R_READ_TIME_5', 'R_READ_TIME_6', 'R_READ_TIME_7', 'R_READ_TIME_8', 'R_READ_TIME_9', 'R_READ_TIME_MIN', 'R_READ_TIME_ZHENG', 'R_RESET_ALARM', 'R_RESET_END_ALARM', 'R_SIM_CONNECT', 'R_SIM_FAILE', 'R_SLEEP_ALARM', 'R_SOS_ALERT', 'R_TSENSOR_RESULT_VALUE_DOT', 'R_UNREAD_WECHAT', 'R_VIDEO_ANSWER', 'R_VIDEO_ANSWERING', 'R_VIDEO_CALL_CONNECT', 'R_VIDEO_CALL_ENDING', 'R_VIDEO_CALL_IN', 'R_VIDEO_VOICE_IN', 'R_VIDEO_WAITING', 'R_WAKEUP_ALARM', 'R_WECHAT_RECV']
+
+
+    class intervManager(Abstract):
+        def __init__(self):
+            self.timer = osTimer()
+
+            self.pwk_timer1 = osTimer()
+            self.pwk_timer2 = osTimer()
+            self.timer1 = osTimer()
+            self.sos_timer2 = osTimer()
+            self.sos_timer1 = osTimer()
+
+            self.sos_sendtime = osTimer()
+
+            self.fall_timer1 = osTimer()
+            self.fall_timer2 = osTimer()
+
+            self.alarm_timer1 = osTimer()
+
+            self.find_timer1 = osTimer()
+            self.fall_flag = 0
+
+            self.factory_timer = osTimer()
+            
+            self.restart_timer = osTimer()
+
+            self.aud = audio.Audio(0)
+            self.aud.set_pa(Pin.GPIO29)
+            self.aud.setVolume(11)
+            self.play_count = 0
+            self.count = 0
+
+            self.get_hr_state  = 0
+            self.get_spo2_state = 0
+            self.timeSec = 0
+            self.timeTempSec = 0
+
+            self.hr_value = 0
+            self.spo2_value = 0
+            self.temp_value = 0
+
+            self.usbState = 0
+
+            self.setp_old = 0
+            self.step_tmp = ""
+            self.step_num = 0
+            self.power_off = 0
+            self.call_state = 0
+
+            self.find_state = 0
+            self.FIND_timer_count = 0
+
+            self.old_hour = 0
+            self.alarm_state = 0
+            self.alarm_timer_count = 0
+            self.old_min = 0
+            self.interInfo_queue = Queue()
+            _thread.stack_size(10*1024+64)
+            _thread.start_new_thread(self.interInfo_queue_thread, ())
+            _thread.stack_size(8*1024)
+            EventMesh.subscribe("publish_message_event_interInfo",self.publish_message_event_interInfo)
+            
+
+            self.audio_event_queue = Queue()
+            _thread.stack_size(10*1024+128)
+            _thread.start_new_thread(self.audio_event_queue_thread, ())
+            _thread.stack_size(8*1024)
+            EventMesh.subscribe("publish_message_event_audio",self.publish_message_event_audio)
+
+            self.record_test = audio.Record()
+            self.record_test.gain_set(4,12)
+
+            self.timeSecond = 0
+            self.wechat_show = 0
+            self.sort_new = {}
+            self.time_min = 0
+            self.press_btn = 0
+            self.countdown_old = 0
+            self.set_unread_wechat = 0
+            self.updateTime = 0
+            
+            self.power_on_flag = 0
+
+            self.MXA_MSG = 1
+            self.wechat_recode_list = {"num":0}
+            self.wechat_num = 0
+            self.read_data = {}
+            self.volum_size = 8 
+            self.phone_num = ''
+            self.sos_phone_num = ''
+            self.msg_tmp = ""
+            self.time_count = 0
+            self.alarm_count = 0
+            self.audio_int = 0
+
+            self.hr_auto = 0
+
+            self.temp_auto = 0
+            
+            check_txt = ql_fs.path_exists("/usr/static/storage_file/wechat_record.json")
+            if check_txt == True :
+                with open("/usr/static/storage_file/wechat_record.json","r") as fd:#音频文件编号
+                    self.wechat_recode_list = ujson.load(fd)
+                    if not self.wechat_recode_list:
+                        self.wechat_recode_list = {"num":0}
+                        self.wechat_num = 0
+            else:
+                self.wechat_recode_list = {"num":0}
+                with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:
+                    ujson.dump(self.wechat_recode_list,fd)         
+
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("open_power_on", self.open_power_on)#开机关机
+
+            EventMesh.subscribe("play_imei_event", self.play_imei_event)#播報imei号
+            EventMesh.subscribe("play_center_phone", self.play_center_phone)#拨打快捷号码
+            EventMesh.subscribe("play_cur_time_event", self.play_cur_time_event)#播放当前时间
+
+            EventMesh.subscribe("OPEN_FIND_WATCH", self.send_find_watch)#查找设备
+            EventMesh.subscribe("STOP_FIND_WATCH", self.stop_find_watch)#是否需要关闭查找设备
+            EventMesh.subscribe("close_timer_all", self.close_timer_all)#关闭相关定时器
+
+            EventMesh.subscribe("dial_sos_phone", self.dial_sos_phone)#长按3s拨打sos求助号码
+
+            EventMesh.subscribe("set_sim_mode", self.set_sim_mode)#sim检测
+
+            EventMesh.subscribe("close_hr_sop2", self.close_hr_sop2)#关闭健康测试
+            EventMesh.subscribe("set_manual_measure_mode", self.set_manual_measure_mode)#设置测试模式
+            EventMesh.subscribe("set_start_measure_time", self.set_start_measure_time)#设置开始测量的时间戳时间
+            EventMesh.subscribe("get_start_measure_time", self.get_start_measure_time)#获取开始测量的时间戳时间
+            EventMesh.subscribe("set_start_temp_measure_time", self.set_start_temp_measure_time)#设置体温开始测量的时间戳时间
+            EventMesh.subscribe("get_start_temp_measure_time", self.get_start_temp_measure_time)#获取体温开始测量的时间戳时间
+            EventMesh.subscribe("play_hr_value", self.play_hr_value)#播放心率数值
+            EventMesh.subscribe("play_spo2_value", self.play_spo2_value)#播放心率数值
+            EventMesh.subscribe("play_temp_value", self.play_temp_value)#播放体温数值
+
+            EventMesh.subscribe("play_sugar_value", self.play_sugar_value)#播放血糖数值
+
+
+            EventMesh.subscribe("set_usb", self.set_usb)#
+            EventMesh.subscribe("get_usb", self.get_usb)#
+
+            EventMesh.subscribe("play_cur_step_event", self.play_cur_step_event)#
+
+            EventMesh.subscribe("set_call_state", self.set_call_state)#1是 拨出去呼叫中 2是播进来 3 是正在通话中 0是无效
+            EventMesh.subscribe("get_call_state", self.get_call_state)#
+            EventMesh.subscribe("interup_call_event", self.interup_call_event)#
+            EventMesh.subscribe("answer_call_event", self.answer_call_event)#接听电话
+            EventMesh.subscribe("dialin_call_event", self.dialin_call_event)#电话拨进响铃
+            EventMesh.subscribe("dialing_out_event", self.dialing_out_event)#电话呼叫中
+            EventMesh.subscribe("call_test_event", self.call_test_event)#电话拨进响铃测试
+
+            EventMesh.subscribe("dial_out_call_center_cb", self.dial_out_call_center_cb)#电话拨出去
+            EventMesh.subscribe("sos_out_call_center_cb", self.sos_out_call_center_cb)#sos拨打
+
+            EventMesh.subscribe("close_audio_play", self.close_audio_play)#关闭音频
+
+
+            EventMesh.subscribe("start_wechat_record", self.start_wechat_record)#手表开始录音
+            EventMesh.subscribe("send_wechat_record", self.send_wechat_record)#发送微聊语音文件to app
+            EventMesh.subscribe("play_wechat_last_amr", self.play_wechat_last_amr)#播放微聊语音最后一条语音文件
+            EventMesh.subscribe("get_wechat_data", self.get_wechat_data)
+            EventMesh.subscribe("set_wechat_data", self.set_wechat_data)
+            EventMesh.subscribe("play_unread_wechat_infor", self.play_unread_wechat_infor)#按键播放最近一条微聊语音
+            EventMesh.subscribe("set_unread_wechat_state", self.set_unread_wechat_state)#设置未读标识
+            EventMesh.subscribe("get_unread_wechat_state", self.get_unread_wechat_state)#获取未读标志
+            EventMesh.subscribe("get_wechat_time", self.get_wechat_time)#获取微聊时间戳
+            EventMesh.subscribe("get_wechat_state", self.get_wechat_state)#获取微聊状态
+            EventMesh.subscribe("set_wechat_state", self.set_wechat_state)#设置微聊状态
+
+
+            EventMesh.subscribe("get_power_on_state", self.get_power_on_state)#获取开机标识
+            EventMesh.subscribe("get_power_off_state", self.get_power_off_state)#获取关机标识
+
+            EventMesh.subscribe("play_audio_file", self.play_audio_file)#获取播放音频文件
+
+            EventMesh.subscribe("OPEN_ALARM_RING", self.send_alarm_ring)#闹钟到点响铃
+            EventMesh.subscribe("STOP_ALARM_RING", self.stop_alarm_ring)#是否需要关闭闹钟
+
+            EventMesh.subscribe("recv_wechat_audio", self.recv_wechat_audio)#
+
+
+            EventMesh.subscribe("sos_short_press", self.sos_short_press)#sos短按事件
+
+            EventMesh.subscribe("falldown_alarm_event", self.falldown_alarm_event)#跌倒报警
+
+            EventMesh.subscribe("close_falldown_alarm_event", self.close_falldown_alarm_event)#关闭跌倒报警
+
+            EventMesh.subscribe("drink_alarm_event", self.drink_alarm_event)#该喝水了
+
+            EventMesh.subscribe("medicine_alarm_event", self.medicine_alarm_event)#该吃药了
+
+            EventMesh.subscribe("wakeup_alarm_event", self.wakeup_alarm_event)#该起床了
+
+            EventMesh.subscribe("home_alarm_event", self.home_alarm_event)#该回家了
+
+            EventMesh.subscribe("sleep_alarm_event", self.sleep_alarm_event)#该睡觉了
+
+            EventMesh.subscribe("reset_alarm_event", self.reset_alarm_event)#该休息了
+
+            EventMesh.subscribe("reset_end_alarm_event", self.reset_end_alarm_event)#休息结束了
+
+            EventMesh.subscribe("get_fall_down_state", self.get_fall_down_state)#跌倒报警标识
+
+            EventMesh.subscribe("app_factory", self.app_factory)#app恢复出厂
+
+            EventMesh.subscribe("app_restart", self.app_restart)#远程重启
+
+        
+
+        def interInfo_queue_thread(self):
+            while True:
+                data = self.interInfo_queue.get()
+                #EventMesh.debug_log("interInfo_queue_thread:data = {}".format(data))
+                if data != None:
+                    try:
+                        data["func"](data["data"])
+                    except Exception as e:
+                        EventMesh.debug_log("interInfo_queue_thread:ERROR:{}".format(e))
+                        usys.print_exception(e)
+
+        def publish_message_event_interInfo(self,event,msg):
+            self.interInfo_queue.put(msg)
+
+        def publish_call_event_cb(self, *args, **kwargs):#拨打电话
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.call_timer_cb,"data":0})  
+
+        def publish_resatrt_down_event_cb(self, *args, **kwargs):#重启设备
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.powe_resatrt_down_fun,"data":0})  
+        
+        def publish_power_down_event_cb(self, *args, **kwargs):#关机
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.power_down_fun,"data":0})  
+
+        def publish_find_watch_event_cb(self, *args, **kwargs):#查找设备
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.FIND_timer_cb,"data":0})  
+
+        def publish_alarm_ring_event_cb(self, *args, **kwargs):#闹钟响铃
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.Alarm_timer_cb,"data":0})  
+
+        def publish_reset_alarm_ring_event_cb(self, *args, **kwargs):#休息响铃
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.reset_alarm_event_cb,"data":0})  
+        
+        def publish_reset_end_alarm_ring_event_cb(self, *args, **kwargs):#休息结束响铃
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.reset_end_alarm_event_cb,"data":0})  
+        
+        def publish_sleep_alarm_ring_event_cb(self, *args, **kwargs):#睡觉响铃
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.sleep_alarm_event_cb,"data":0})  
+        
+        def publish_home_ring_event_cb(self, *args, **kwargs):#回家响铃
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.home_alarm_event_cb,"data":0})  
+
+        def publish_wakeup_ring_event_cb(self, *args, **kwargs):#起床响铃
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.wakeup_alarm_event_cb,"data":0})  
+
+        def publish_medicine_ring_event_cb(self, *args, **kwargs):#吃药响铃
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.medicine_alarm_event_cb,"data":0})  
+
+        def publish_drink_ring_event_cb(self, *args, **kwargs):#喝水响铃
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.drink_alarm_event_cb,"data":0})  
+
+        def publish_fall_done_ring_event_cb(self, *args, **kwargs):#跌倒提醒
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.falldown_alarm_cb,"data":0})  
+
+
+        def reset_alarm_event(self,args,msg):#该休息了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:
+                self.alarm_count = 0
+                self.alarm_timer1.start(2000, 1, self.publish_reset_alarm_ring_event_cb)
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_RESET_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+        def reset_alarm_event_cb(self,args):#该休息了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:
+                self.alarm_count += 1
+                if self.alarm_count >= 3:
+                    self.alarm_count = 0
+                    self.alarm_timer1.stop()
+                    return
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_RESET_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            else:
+                self.alarm_count = 0
+                self.alarm_timer1.stop()
+
+        def reset_end_alarm_event(self,args,msg):#休息结束了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:
+                self.alarm_count = 0
+                self.alarm_timer1.start(2000, 1, self.reset_end_alarm_event_cb)
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_RESET_END_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+        
+        def reset_end_alarm_event_cb(self,args):#休息结束了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:
+                self.alarm_count += 1
+                if self.alarm_count >= 3:
+                    self.alarm_count = 0
+                    self.alarm_timer1.stop()
+                    return
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_RESET_END_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            else:
+                self.alarm_count = 0
+                self.alarm_timer1.stop()
+        
+        def sleep_alarm_event(self,args,msg):#该睡觉了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:
+                self.alarm_count = 0
+                self.alarm_timer1.start(2000, 1, self.publish_sleep_alarm_ring_event_cb)
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SLEEP_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+        def sleep_alarm_event_cb(self,args):#该睡觉了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:
+                self.alarm_count += 1
+                if self.alarm_count >= 3:
+                    self.alarm_count = 0
+                    self.alarm_timer1.stop()
+                    return
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SLEEP_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            else:
+                self.alarm_count = 0
+                self.alarm_timer1.stop()
+
+
+        def home_alarm_event(self,args,msg):#该回家了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:
+                self.alarm_count = 0
+                self.alarm_timer1.start(2000, 1, self.publish_home_ring_event_cb)
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HOME_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+        
+        def home_alarm_event_cb(self,args):#该回家了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:
+                self.alarm_count += 1
+                if self.alarm_count >= 3:
+                    self.alarm_count = 0
+                    self.alarm_timer1.stop()
+                    return
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HOME_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            else:
+                self.alarm_count = 0
+                self.alarm_timer1.stop()
+        
+        def wakeup_alarm_event(self,args,msg):#该起床了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:
+                self.alarm_count = 0
+                self.alarm_timer1.start(2000, 1, self.publish_wakeup_ring_event_cb)
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_WAKEUP_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+        
+        def wakeup_alarm_event_cb(self,args):#该起床了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:
+                self.alarm_count += 1
+                if self.alarm_count >= 3:
+                    self.alarm_count = 0
+                    self.alarm_timer1.stop()
+                    return
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_WAKEUP_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            else:
+                self.alarm_count = 0
+                self.alarm_timer1.stop()
+
+
+        def medicine_alarm_event(self,args,msg):#该吃药了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:
+                self.alarm_count = 0
+                self.alarm_timer1.start(2000, 1, self.publish_medicine_ring_event_cb)
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_MEDICINE_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+
+        def medicine_alarm_event_cb(self,args):#该吃药了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:
+                self.alarm_count += 1
+                if self.alarm_count >= 3:
+                    self.alarm_count = 0
+                    self.alarm_timer1.stop()
+                    return
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_MEDICINE_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            else:
+                self.alarm_count = 0
+                self.alarm_timer1.stop()
+
+        def drink_alarm_event(self,args,msg):#该喝水了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:
+                self.alarm_count = 0
+                self.alarm_timer1.start(2000, 1, self.publish_drink_ring_event_cb)
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_DRINK_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            
+
+
+        def drink_alarm_event_cb(self,args):#该喝水了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:
+                self.alarm_count += 1# 1 2 
+                if self.alarm_count >= 3:
+                    self.alarm_count = 0
+                    self.alarm_timer1.stop()
+                    return
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_DRINK_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            else:
+                self.alarm_count = 0
+                self.alarm_timer1.stop()
+            
+        def falldown_alarm_event(self,args,msg):#跌倒报警启动中提示
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if flag == 0 and wechat_state == 0:
+                EventMesh.publish("close_timer_all")#
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_FALL_ALARM"))
+                self.time_count = 0
+                self.fall_flag = 0
+                self.fall_timer1.stop()
+                self.fall_flag = 1
+                self.fall_timer1.start(4000, 1, self.publish_fall_done_ring_event_cb)
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+
+        def falldown_alarm_cb(self,*args):
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if self.call_state == 0 and wechat_state == 0:
+                self.time_count+=1
+                if self.time_count >= 5:
+                    self.time_count = 0
+                    self.fall_timer1.stop()
+                    EventMesh.publish_async("dial_sos_phone")#拨打sos号码
+                    return
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_FALL_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            else:
+                self.time_count = 0
+                self.fall_timer1.stop()
+        
+        def close_falldown_alarm_event(self,event,msg):#跌倒挂断挂断
+            if self.fall_flag == 1:#跌倒标志
+                self.fall_flag = 0
+                self.fall_timer1.stop()
+                self.sos_timer1.stop()
+                self.sos_timer2.stop()
+                if self.call_state != 0:
+                    self.call_state = 0
+                    voiceCall.callEnd()
+                sos_flag = EventMesh.publish("get_sos_flag")
+                if sos_flag == 1:
+                    self.call_state = 0
+                    EventMesh.publish("set_sos_flag",0)
+                    EventMesh.publish("set_sos_num",0)
+                    EventMesh.publish("set_hangup_mode",0)
+
+        
+
+        def send_find_watch(self, event, msg): #发送查找设备指令
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if power_off != None:
+                if power_off == 1:
+                    return
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if flag == 0 and wechat_state == 0 and self.fall_flag == 0: 
+                EventMesh.publish("close_timer_all")#
+                self.find_state = 1
+                self.FIND_timer_count = 0
+                self.alarm_timer1.start(3000,1,self.publish_find_watch_event_cb)
+                EventMesh.publish("set_led_time_arg",[1,1,330,led_mode.LONG_LIGHT_GREEN,2,1,led_mode.OTHER_MEASURE_MODE])#測量成功
+                # EventMesh.publish("set_led_time_arg",[1000,33000,1,led_mode.FLASH_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("audio_find_haixiu"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+        
+        def stop_find_watch(self, event, msg): 
+            if self.find_state == 1:
+                self.find_state = 0
+                self.FIND_timer_count = 0
+                # EventMesh.publish("stop_led_timer")#设置参数
+                self.aud.stopPlayStream()  #播放声音 
+                self.alarm_timer1.stop()
+
+        def FIND_timer_cb(self, data):
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if flag == 0 and wechat_state == 0 and self.fall_flag == 0:
+                if self.find_state == 1:
+                    # EventMesh.debug_log("self.FIND_timer_count:{}".format(self.FIND_timer_count))
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("audio_find_haixiu"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    self.FIND_timer_count += 1
+                    if self.FIND_timer_count > 10: #120秒30s
+                        EventMesh.publish("STOP_FIND_WATCH")
+            else:
+                self.FIND_timer_count = 0
+                self.alarm_timer1.stop()
+                
+        
+        def stop_FIND(self) :
+            self.alarm_timer1.stop()
+
+        def send_alarm_ring(self, event, msg): #发送查找设备指令
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if power_off != None:
+                if power_off == 1:
+                    return
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if flag == 0 and wechat_state == 0 and self.fall_flag == 0:
+                EventMesh.publish("close_timer_all")#
+                self.alarm_state = 1
+                self.alarm_timer_count = 0
+                self.alarm_timer1.start(3000,1,self.publish_alarm_ring_event_cb)
+                # EventMesh.publish("set_led_time_arg",[1,1,330,led_mode.LONG_LIGHT_GREEN,2,1,led_mode.OTHER_MEASURE_MODE])#測量成功
+                # EventMesh.publish("set_led_time_arg",[1000,33000,1,led_mode.FLASH_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_ALARM_NEW"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+        
+        def stop_alarm_ring(self, event, msg): #停止闹钟响铃
+            if self.alarm_state == 1:
+                self.alarm_state = 0
+                self.alarm_timer_count = 0
+                # EventMesh.publish("stop_led_timer")#设置参数
+                self.aud.stopPlayStream()  #停止播放
+                self.alarm_timer1.stop()
+
+        def Alarm_timer_cb(self, data):
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if flag == 0 and wechat_state == 0 and self.fall_flag == 0:
+                if self.alarm_state == 1:
+                    # EventMesh.debug_log("self.alarm_timer_count:{}".format(self.alarm_timer_count))
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_ALARM_NEW"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    self.alarm_timer_count += 1
+                    if self.alarm_timer_count > 15: #120秒30s
+                        EventMesh.publish("STOP_ALARM_RING")
+            else:
+                self.alarm_timer_count = 0
+                self.alarm_timer1.stop()
+
+        def get_fall_down_state(self,event,msg):
+            return self.fall_flag
+
+        def sos_short_press(self,args,msg):
+            EventMesh.publish("interup_call_event")#如果在电话中强制挂断电话
+            EventMesh.publish("close_audio_play")#强制关闭音频文件播放
+            EventMesh.publish("STOP_FIND_WATCH")#停止查找设备
+            EventMesh.publish("STOP_ALARM_RING")#停止闹钟响铃
+            EventMesh.publish("play_cur_time_event")#播报当前时间
+            #播报当前时间
+
+        def recv_wechat_audio(self,event,str_data):#接收微聊语音播放
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if self.call_state == 0 and self.fall_flag == 0 and wechat_state == 0: 
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_WECHAT_RECV"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+
+
+
+        def audio_event_queue_thread(self):
+            while True:
+                data = self.audio_event_queue.get()
+                #EventMesh.debug_log("audio_event_queue:data = {}".format(data))
+                if data != None:
+                    try:
+                        data["func"](data["data"])
+                    except Exception as e:
+                        EventMesh.debug_log("audio_event_queue:ERROR:{}".format(e))
+                        usys.print_exception(e)
+        def publish_message_event_audio(self,event,msg):
+            self.audio_event_queue.put(msg)
+
+        def play_audio_file(self, *args, **kwargs):#播放音频文件
+            # EventMesh.debug_log("args",args)
+            # EventMesh.publish("publish_message_event_audio",{"func":self.play_audio_file_do,"data":args[1]})  
+            data = args[1]
+            self.play_audio_file_do(data)
+
+        def play_audio_file_do(self,data):#msg 拼接的路径文件
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            # EventMesh.debug_log("play_audio_file",data[0],data[1],open_power,power_off)#路径 str_data[1] 是否需要被打断
+            if open_power != None:
+                if open_power == 0:
+                    return
+            if power_off != None:
+                if power_off == 1:
+                    return
+            self.aud.montage_play('U:/static/audio.bin',1,data[1],data[0])
+            # EventMesh.debug_log("play_audio_file end",data[0],data[1])#路径 str_data[1] 是否需要被打断
+            
+
+
+
+
+        def powe_resatrt_down_fun(self, *args):#重启设备
+            EventMesh.publish("close_led_pin")
+            self.aud.stopPlayStream()
+            Power.powerRestart()
+
+        def power_down_fun(self, *args):
+            EventMesh.publish("close_led_pin")
+            self.aud.stopPlayStream()
+            Power.powerDown()
+
+
+
+        def close_audio_play(self, event, msg): #msg
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            if power_off != None:
+                if power_off == 1:
+                    return
+            self.aud.stopPlayStream()
+
+
+
+        def close_timer_all(self, event, msg): 
+            # EventMesh.debug_log("close_timer_all!!!!!!!!!!!!!!!!!!!")
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            if power_off != None:
+                if power_off == 1:
+                    return
+            self.aud.stopPlayStream()
+            
+            
+            self.timer.stop()
+            self.sos_timer2.stop()
+            self.sos_timer1.stop()
+            self.fall_flag = 0
+            self.fall_timer1.stop()
+            self.alarm_timer1.stop()
+        
+
+        def answer_call_event(self, event, msg): #
+            if self.call_state == 2:
+                sos_flag = EventMesh.publish("get_sos_flag")
+                if sos_flag == 1:
+                    self.call_state = 0
+                    EventMesh.publish("set_sos_flag",0)
+                    EventMesh.publish("set_sos_num",0)
+                    EventMesh.publish("set_hangup_mode",0)
+                EventMesh.publish("close_timer_all")#
+                voiceCall.callAnswer()
+
+        def set_call_state(self, event, msg): #
+            self.call_state = msg
+
+        def dialin_call_event(self, event, msg):
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if power_off != None:
+                if power_off == 1:
+                    return
+            EventMesh.publish("close_timer_all")#
+            EventMesh.publish("close_wechat_btn_timer")#
+            EventMesh.publish("set_led_time_arg",[1,2,10*10,led_mode.FLASH_LIGHT_RED,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功
+            self.timer.start(6000, 1, self.publish_call_event_cb)
+            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CALL_mp3"))
+            EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件
+            # EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+        
+        def call_timer_cb(self,data):
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if power_off != None:
+                if power_off == 1:
+                    return
+            if self.call_state != 2:
+                EventMesh.publish("stop_led_timer")#设置参数
+                EventMesh.publish("close_timer_all")#
+                return
+            EventMesh.publish("set_led_time_arg",[1,2,10*10,led_mode.FLASH_LIGHT_RED,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功
+            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CALL_mp3"))
+            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+        
+        def dial_out_call_center_cb(self, event, msg):#电话拨出去
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if power_off != None:
+                if power_off == 1:
+                    return
+            # EventMesh.debug_log("dial_out_call_center_cb",msg)
+            if self.call_state == 0:
+                self.phone_num = ''
+                EventMesh.publish("close_timer_all")#
+                if msg == None:
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_SOS_DIAL"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+                    # EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                else:
+                    self.phone_num = str(msg)
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SOS_ALERT"))
+                    EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件
+                    self.timer1.start(2000, 0, self.time_out_phone)
+                    
+        
+        def time_out_phone(self, msg):#电话拨出去
+            voiceCall.callStart(self.phone_num)
+
+        def sos_out_call_center_cb(self, event, msg):#sos电话呼叫中
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if power_off != None:
+                if power_off == 1:
+                    return
+            self.sos_phone_num = ''
+            # EventMesh.debug_log("sos_out_call_center_cb",msg)
+            if self.call_state == 0:
+            
+                EventMesh.publish("close_timer_all")#
+                if msg == None:
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_SOS_DIAL"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+                    # EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                else:
+                    sos_state =  EventMesh.publish("get_dev_state")
+
+                    tmp = 1 << 16
+                    sos_state = sos_state|tmp #第21位=1
+                    EventMesh.publish("set_dev_state",sos_state)
+
+                    EventMesh.publish(constants.EVENT.START_LOCATION,[constants.PROTOCOL.AL_SEND,sos_state]) #开始AL定位
+                    EventMesh.publish("close_timer_all")#
+                    self.sos_phone_num = msg
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SOS_ALERT"))
+                    EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件
+                    self.sos_timer1.start(2000, 0, self.sos_call_out_phone)
+                    self.sos_timer2.start(30000, 0, self.sos_time_out_phone)
+                    
+                    
+        def sos_time_out_phone(self, msg):#30s超时未打通或者信号不好则重新拨打
+            sos_flag = EventMesh.publish("get_sos_flag")
+            if sos_flag == 1:
+                if self.call_state == 0:
+                    EventMesh.publish("set_sos_info_call") 
+                    
+        def sos_call_out_phone(self, msg):#电话拨出去
+            voiceCall.callStart(self.sos_phone_num)
+        
+
+        def call_test_event(self, event, msg):
+            voiceCall.callStart(str("10086"))
+
+        def get_call_state(self, event, msg):
+            return self.call_state
+        
+        def interup_call_event(self, event, msg):#侧边金属按钮挂断来电
+            flag = EventMesh.publish("get_call_state") 
+            if flag == 2 or flag == 3:#电话通话中 或者呼叫中挂断中断
+                self.call_state = 0
+                voiceCall.callEnd()
+        
+        def dialing_out_event(self, event, msg):#侧边金属按键挂断电话呼叫中
+            flag = EventMesh.publish("get_call_state") 
+            if flag == 1 or flag == 3:#电话呼叫中
+                self.call_state = 0
+                voiceCall.callEnd()
+                
+
+
+        def play_cur_step_event(self, event, msg): #msg 1 播放当前步数
+            flag = EventMesh.publish("get_call_state") 
+            if flag == 0:#电话通话中 或者呼叫中挂断中断
+                if self.fall_flag == 0:
+                    EventMesh.publish("close_timer_all")#
+                step = EventMesh.publish("get_old_step_value")
+                EventMesh.debug_log("step",step)
+                self.setp_old = step
+                if step <= 10:#
+                    if step == 10:#十步
+                        str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    else:# 9步
+                        str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(step)),audio_buf.index("R_READ_STEP_4"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                elif step <= 100:#十 90
+                    if step == 100:
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_1"),audio_buf.index("R_READ_STEP_2"),\
+                            audio_buf.index("R_READ_STEP_4"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    else:
+                        step_tmp = str(step)
+                        shi_value = int(step_tmp[0])#十
+                        ge_value = int(step_tmp[1])#个
+                        if shi_value > 1:#大于19步
+                            if ge_value == 0:#9十步 70十步
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),\
+                                audio_buf.index("R_READ_STEP_4"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            else:#9十2步
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),\
+                                audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        else:#十9步
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\
+                            audio_buf.index("R_READ_STEP_4"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                elif step <= 1000:
+                    if step == 1000:#1千步
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_1"),\
+                        audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_STEP_4"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    else:
+                        step_tmp = str(step)#500
+                        bai_value = int(step_tmp[0])#百
+                        shi_value = int(step_tmp[1])#十
+                        ge_value = int(step_tmp[2])#个
+                        #101 110 1
+                        if shi_value > 0:#110
+                            if ge_value == 0:
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            else:
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),\
+                                audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        else:
+                            if shi_value == 0 and ge_value == 0:#500 600
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_STEP_4"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                pass
+                            else:
+
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\
+                                audio_buf.index("R_READ_STEP_4"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            pass
+                elif step <= 10000:#千
+                    if step == 10000:
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_1"),\
+                        audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_STEP_4"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        pass
+                    else:
+                        one_thousand = step//1000 #千
+                        one_hundred = step%1000 #百
+                        baishu = step%100 #十
+                        shishu = step%10 #个
+                        step_tmp = str(step)
+                        qian = int(step_tmp[0])#千
+                        bai_value = int(step_tmp[1])#百
+                        shi_value = int(step_tmp[2])#十
+                        ge_value = int(step_tmp[3])#个
+                        if bai_value <= 0:
+                            if shi_value <= 0:
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\
+                                audio_buf.index("R_READ_STEP_4"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            else:
+                                if ge_value == 0:#1020 1040
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                    audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                    audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                else:#1021 
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                    audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                    audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        else:
+                            if shi_value <= 0:#1109
+                                if ge_value == 0:#1110
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                    audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),
+                                    audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_STEP_4"))
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                else:
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                    audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),
+                                    audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\
+                                    audio_buf.index("R_READ_STEP_4"))
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            else:
+                                if ge_value == 0:#1110
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                    audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),
+                                    audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                    audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                else:#1117
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                    audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),
+                                    audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                    audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                        pass
+                elif step <= 100000:#万
+                            if step == 100000:#10万步
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3"),\
+                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_STEP_4"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            else:
+                                step_tmp = str(step)
+                                wang = int(step_tmp[0])#万
+                                qian = int(step_tmp[1])#千
+                                bai_value = int(step_tmp[2])#百
+                                shi_value = int(step_tmp[3])#十
+                                ge_value = int(step_tmp[4])#个
+                                if wang > 0 and qian > 0 and bai_value > 0:#11109 11111
+                                    if shi_value <= 0:#11109
+                                        if ge_value == 0:#11100
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_STEP_4"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                        else:#11108
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\
+                                            audio_buf.index("R_READ_STEP_4"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                            pass
+                                    else:
+                                        if ge_value == 0:#11110
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                            audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                        else:#11116
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                            audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                            pass
+                                elif wang > 0 and qian > 0:#11000 11010 11012 11008
+                                    if shi_value > 0:
+                                        if ge_value == 0:#11010
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                            audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                        else:#11016
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                            audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                    else:   
+                                        if ge_value == 0:#11000
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_STEP_4"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                        else:#11004
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\
+                                            audio_buf.index("R_READ_STEP_4"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                
+                                elif wang > 0:#1
+                                    if bai_value > 0:#百
+                                        if shi_value > 0:#10110
+                                            if ge_value == 0:#10150
+                                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),\
+                                                audio_buf.index("R_READ_STEP_4"))
+                                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                            else:
+                                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),\
+                                                audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))
+                                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                        else:#10108
+                                            if ge_value == 0:#10100
+                                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_STEP_4"))
+                                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                            else:#10108
+                                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\
+                                                audio_buf.index("R_READ_STEP_4"))
+                                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                    else:
+                                        if shi_value > 0:
+                                            if ge_value == 0:#10090
+                                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                                audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))
+                                                EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                            else:#10098
+                                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                                audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))
+                                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                        else:
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\
+                                            audio_buf.index("R_READ_STEP_4"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+        def set_usb(self, event, msg): #msg 1 正在充电 2充电已移出 3 充电已满 0
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if power_off != None:
+                if power_off == 1:
+                    return
+            flag = EventMesh.publish("get_call_state") 
+            get_hr_state = EventMesh.publish("get_hr_state")
+            get_spo2_state = EventMesh.publish("get_spo2_state")
+            get_bp_state  = EventMesh.publish("get_bp_state")
+            get_bg_state  = EventMesh.publish("get_bg_state")
+            get_temp_state  = EventMesh.publish("get_temp_state")
+            if msg == 1:
+                if get_hr_state != None and get_spo2_state != None and get_bp_state != None and get_bg_state != None and get_temp_state != None:
+                    if get_hr_state != 0:
+                        
+                        EventMesh.publish("set_hr_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 
+                        if get_hr_state == 1:
+                            EventMesh.publish("stop_led_timer")#设置参数
+                            EventMesh.publish("set_start_measure_time",0)#设置开始测量的时间戳时间
+
+                        EventMesh.debug_log("stop debug8")
+                        EventMesh.publish(constants.EVENT.STOP_HEART) 
+                    if get_spo2_state != 0:
+                        EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
+                        if get_spo2_state == 1:
+                            EventMesh.publish("stop_led_timer")#设置参数
+                        EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
+                        EventMesh.debug_log("stop debug13")
+                    if get_bp_state != 0:
+                        EventMesh.publish("set_bp_state",0)#2代表后台进入测试
+                        if get_bp_state == 1:
+                            EventMesh.publish("stop_led_timer")#设置参数
+                        EventMesh.publish(constants.EVENT.STOP_HEART)
+                        EventMesh.debug_log("stop bp debug1")
+                    if get_bg_state != 0:
+                        EventMesh.publish("set_bg_state",0)#2代表后台进入测试
+                        if get_bg_state == 1:#手动开灯关闭灯
+                            EventMesh.publish("stop_led_timer")#设置参数
+                        EventMesh.publish(constants.EVENT.STOP_HEART)
+                        EventMesh.debug_log("stop BG  debug14")
+                    if get_temp_state != 0:
+                        
+                        EventMesh.publish("set_temp_state",0)#2代表后台进入测试
+                        if get_temp_state == 1:
+                            EventMesh.publish("stop_led_timer")#设置参数
+                            EventMesh.publish("set_start_temp_measure_time",0)#
+                        EventMesh.publish(constants.EVENT.STOP_TEMP)
+                        EventMesh.debug_log("stop temp  debug14")
+            if msg == 1:
+                self.usbState = msg
+                str_buf = [1,1,10,led_mode.LONG_LIGHT_RED,4,2,led_mode.CHARGE_IN_MODE]
+                EventMesh.publish("set_led_time_arg",str_buf)#
+                if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断
+                    EventMesh.publish("close_timer_all")#
+                    self.aud.stop()
+                    self.aud.play(1,1,'U:/static/R_CHARGE_IN.mp3')
+                    # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CHARGE_IN"))
+                    # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                EventMesh.debug_log("charge R_CHARGE_IN")
+                
+                
+            elif msg == 2:
+                self.usbState = msg
+                EventMesh.publish("stop_led_timer")#设置参数
+                EventMesh.publish("set_led_time_arg",[1,1,0,led_mode.FLASH_LIGHT_GREEN,4,4,led_mode.CHARGE_OUT_MODE])#測量成功
+                EventMesh.debug_log("charge R_CHARGE_OUT")
+                if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断
+                    EventMesh.publish("close_timer_all")#
+                    self.aud.stop()
+                    self.aud.play(1,1,'U:/static/R_CHARGE_OUT.mp3')
+                    # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CHARGE_OUT"))
+                    # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                
+
+
+            elif msg == 3:
+                self.usbState = msg
+                EventMesh.debug_log("charge full")
+                str_buf = [1,1,10,led_mode.LONG_LIGHT_GREEN,4,2,led_mode.CHARGE_FULL_MODE]
+                EventMesh.publish("set_led_time_arg",str_buf)#
+                # if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断
+                #     EventMesh.publish("close_timer_all")#
+                #     str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CHARGE_FULL"))
+                #     EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                
+
+
+        def get_usb(self, event, msg):
+            return self.usbState
+        
+
+
+        def app_factory(self,event,msg):
+            if msg != None:
+                number = str(msg)
+                sms.sendPduMsg(number, 'factory# send ok', 'UCS2')
+            ret = 0
+            ret = ql_fs.path_exists("/usr/static/storage_file")#
+            if ret == True:
+                ql_fs.rmdirs("/usr/static/storage_file")
+                ql_fs.mkdirs("/usr/static/storage_file")
+            if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:
+                EventMesh.publish(constants.PROTOCOL.DLT_SEND)
+        
+            self.factory_timer.start(6*1000,0,self.factory_cb)
+            pass
+        def factory_cb(self,*argc):
+            self.aud.stopPlayStream()
+            Power.powerRestart()
+
+        def app_restart(self,event,msg):#远程发短信重启
+            if msg != None:
+                number = str(msg)
+                sms.sendPduMsg(number, 'reset# send ok', 'UCS2')
+            self.restart_timer.start(3*1000,0,self.app_restart_cb)
+            pass
+        def app_restart_cb(self,*argc):
+            Power.powerRestart()
+
+        def open_power_on(self, event, msg): #msg 1 开机 2 关机 3 重启  4恢复出厂设置 5静音关机
+            EventMesh.publish("close_timer_all")#
+            if msg == 1:
+                EventMesh.publish("close_hr_sop2")#
+                # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_POWER_OFF_1"))
+                # EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                self.pwk_timer1.start(1000,0,self.power_on_audio_cb)
+                
+            elif msg == 2:
+                flag = EventMesh.publish("get_call_state") 
+                if flag != 0:#电话呼叫中
+                    self.call_state = 0
+                    voiceCall.callEnd()
+                step = EventMesh.publish("get_old_step_value")
+                # step1 = SC7A20().get_step()
+                # step1 = EventMesh.publish(constants.EVENT.GET_STEP)
+                # step2 = EventMesh.publish("get_storage_config","old_step")
+                self.read_data = EventMesh.publish("get_storage_data")
+                # EventMesh.publish("set_test_data5",[1,step,step1,step2])
+                if step != 0:
+                    EventMesh.publish("set_storage_config",["old_step",step])
+                date_tmp = utime.localtime()
+                time_tmp = utime.mktime(date_tmp)
+                # step3 = EventMesh.publish("get_old_step_value")
+                # step4 = SC7A20().get_step()
+                # step4 = EventMesh.publish(constants.EVENT.GET_STEP)
+                # step5 = EventMesh.publish("get_storage_config","old_step")
+                # EventMesh.publish("set_test_data6",[1,step3,step4,step5])
+                EventMesh.publish("set_storage_config",["old_time",time_tmp])#关机保存一个是时间
+                EventMesh.publish("set_storage_config",["power_state",0])
+                # self.pwk_timer1.start(3000,0,self.power_off_audio_cb)
+                EventMesh.publish("close_hr_sop2")#
+                # EventMesh.debug_log("power_off_audio_cb")
+                self.aud.stop()
+                self.aud.play(1,0,'U:/static/R_POWER_OFF_1.mp3')
+                # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_POWER_OFF_1"))
+                # EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                EventMesh.publish("set_led_time_arg",[1,2,6*8,led_mode.FLASH_LIGHT_RED,6,3,led_mode.POWER_OFF_MODE])#
+                self.power_off = 1
+                self.pwk_timer2.start(6000,0,self.publish_power_down_event_cb)
+            elif msg == 3:
+                flag = EventMesh.publish("get_call_state") 
+                if flag != 0:#电话呼叫中
+                    self.call_state = 0
+                    voiceCall.callEnd()
+                EventMesh.publish("close_hr_sop2")#
+                self.aud.stop()
+                self.aud.play(1,0,'U:/static/R_POWER_OFF_1.mp3')
+                # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_POWER_OFF_1"))
+                # EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                EventMesh.publish("stop_led_timer")#设置参数
+                self.power_off = 1
+                self.timer.start(8000,0,self.publish_resatrt_down_event_cb)
+                #EventMesh.publish("set_led_time_arg",[3000,4000,1,led_mode.LONG_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE])#
+            elif msg == 4:
+                flag = EventMesh.publish("get_call_state") 
+                if flag != 0:#电话呼叫中
+                    self.call_state = 0
+                    voiceCall.callEnd()
+                EventMesh.publish("close_hr_sop2")#
+                EventMesh.publish("stop_led_timer")#设置参数
+                self.power_off = 1
+                ret = 0
+                ret = ql_fs.path_exists("/usr/static/storage_file")#
+                if ret == True:
+                    ql_fs.rmdirs("/usr/static/storage_file")
+                    ql_fs.mkdirs("/usr/static/storage_file")
+                if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:
+                    EventMesh.publish(constants.PROTOCOL.DLT_SEND)
+                self.aud.stopPlayStream()
+                self.timer.start(6*1000,0,self.fun)
+            elif msg == 5:
+                flag = EventMesh.publish("get_call_state") 
+                if flag != 0:#电话呼叫中
+                    self.call_state = 0
+                    voiceCall.callEnd()
+                step = EventMesh.publish("get_old_step_value")
+                # step1 = SC7A20().get_step()
+                # step1 = EventMesh.publish(constants.EVENT.GET_STEP)
+                # step2 = EventMesh.publish("get_storage_config","old_step")
+                self.read_data = EventMesh.publish("get_storage_data")
+                # EventMesh.publish("set_test_data7",[1,step,step1,step2])
+                if step != 0:
+                    EventMesh.publish("set_storage_config",["old_step",step])
+
+                # step3 = EventMesh.publish("get_old_step_value")
+                # step4 = SC7A20().get_step()
+                # step4 = EventMesh.publish(constants.EVENT.GET_STEP)
+                # step5 = EventMesh.publish("get_storage_config","old_step")
+                # EventMesh.publish("set_test_data8",[1,step3,step4,step5])
+                date_tmp = utime.localtime()
+                time_tmp = utime.mktime(date_tmp)
+                EventMesh.publish("set_storage_config",["old_time",time_tmp])#关机保存一个是时间
+                EventMesh.publish("set_storage_config",["power_state",1])
+                
+                EventMesh.publish("close_hr_sop2")#
+                EventMesh.publish("set_led_time_arg",[1,2,6*8,led_mode.FLASH_LIGHT_RED,6,3,led_mode.POWER_OFF_MODE])#
+                self.power_off = 1
+                self.pwk_timer2.start(6000,0,self.publish_power_down_event_cb)
+                # self.pwk_timer1.start(3000,0,self.power_off_no_audio_cb)#不需要关机铃声
+
+        def fun(self,*argc):
+            self.aud.stopPlayStream()
+            Power.powerRestart()
+            
+
+        def power_on_cb(self, msg): #msg 开机标识
+            self.power_on_flag = 1
+        def clear_power_on_cb(self, msg): #msg 开机标识
+            self.power_on_flag = 0
+        
+        def power_on_audio_cb(self, msg):
+            self.power_on_flag = 1
+            # EventMesh.debug_log("power_on_audio_cb")
+            power_state = EventMesh.publish("get_storage_config","power_state")
+            if power_state == None:
+                power_state = 0
+            # print("power_state",power_state)
+            if power_state <= 0:
+                self.aud.stop()
+                self.aud.play(1,1,'U:/static/R_POWER_OFF_1.mp3')
+            # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_POWER_OFF_1"))
+            # EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+            EventMesh.publish("set_led_time_arg",[1,2,6*8,led_mode.FLASH_LIGHT_GREEN,6,3,led_mode.OTHER_MEASURE_MODE])#測量成功
+            # EventMesh.publish("set_led_time_arg",[1000,200,10,led_mode.FLASH_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数
+            self.power_on_flag = 0
+            self.pwk_timer2.start(5000,0,self.power_on_cb)
+
+        def get_power_on_state(self, event, msg):
+            return self.power_on_flag
+        
+        def power_off_audio_cb(self, msg):
+            # EventMesh.debug_log("power_off_audio_cb")
+            self.aud.stop()
+            self.aud.play(1,0,'U:/static/R_POWER_OFF_1.mp3')
+            # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_POWER_OFF_1"))
+            # EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+            EventMesh.publish("set_led_time_arg",[1,2,6*8,led_mode.FLASH_LIGHT_RED,6,3,led_mode.POWER_OFF_MODE])#
+            self.power_off = 1
+            self.pwk_timer2.start(6000,0,self.publish_power_down_event_cb)
+        
+        def power_off_no_audio_cb(self, msg):
+            EventMesh.debug_log("power_off_no_audio_cb")
+            EventMesh.publish("set_led_time_arg",[1,2,6*8,led_mode.FLASH_LIGHT_RED,6,3,led_mode.POWER_OFF_MODE])#
+            self.power_off = 1
+            self.pwk_timer2.start(6000,0,self.publish_power_down_event_cb)
+
+        def set_power_off_cb(self, msg):
+            self.power_off = 1
+
+        def get_power_off_state(self, event, msg):
+            return self.power_off
+
+        def close_hr_sop2(self, event, msg): #msg 关闭心率血氧体温测试
+            get_hr_state = EventMesh.publish("get_hr_state")
+            get_spo2_state = EventMesh.publish("get_spo2_state")
+            get_temp_state = EventMesh.publish("get_temp_state")
+            get_bg_state = EventMesh.publish("get_bg_state")
+            get_bp_state = EventMesh.publish("get_bp_state")
+            if get_hr_state != None and get_spo2_state != None and get_temp_state != None and get_bg_state != None and get_bp_state != None:
+                if get_hr_state != 0:
+                    EventMesh.publish("set_hr_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 
+                    EventMesh.debug_log("sstop hr")
+                    EventMesh.publish(constants.EVENT.STOP_HEART) 
+                if get_spo2_state != 0 :
+                    EventMesh.debug_log("stop spo2")
+                    EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
+                    EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
+                if get_temp_state != 0:
+                    EventMesh.debug_log("stop temp")
+                    EventMesh.publish("set_temp_state",0)
+                    EventMesh.publish(constants.EVENT.STOP_TEMP)#手动体温测试
+                if  get_bg_state != 0:
+                    EventMesh.publish("set_bg_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 
+                    EventMesh.debug_log("sstop bg")
+                    EventMesh.publish(constants.EVENT.STOP_HEART) 
+
+                if  get_bp_state != 0:
+                    EventMesh.publish("set_bp_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 
+                    EventMesh.debug_log("sstop bp")
+                    EventMesh.publish(constants.EVENT.STOP_HEART) 
+
+        def set_manual_measure_mode(self, event, msg): #手动测试 1心率 2 血氧 3 体温
+            get_hr_state = EventMesh.publish("get_hr_state")
+            get_spo2_state = EventMesh.publish("get_spo2_state")
+            get_temp_state = EventMesh.publish("get_temp_state")
+            if msg == 1:
+                if get_hr_state != 1:#不是手动测试直接打断
+                    EventMesh.debug_log("set_manual_measure_mode",msg)
+                    EventMesh.publish("set_spo2_state",0)
+                    EventMesh.publish("set_bg_state",0)
+                    EventMesh.publish("set_bp_state",0)
+                    
+                    EventMesh.publish("set_hr_state",1)
+                    EventMesh.publish("clear_manual_hr_flag")
+                    EventMesh.publish("set_start_measure_time",1)#设置开始测量的时间戳时间
+                    EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN) #停止测试血氧
+                    EventMesh.publish("set_hr_blood_led",1)
+                    EventMesh.publish(constants.EVENT.START_HEART) #手动心率测试
+            elif msg == 2:
+                if get_hr_state == 0:
+                    if get_spo2_state != 1:
+                        EventMesh.debug_log("set_manual_measure_mode",msg)
+                        EventMesh.publish("set_spo2_state",1)
+                        EventMesh.publish("set_start_measure_time",1)#设置开始测量的时间戳时间
+                        EventMesh.publish("set_hr_blood_led",1)
+                        EventMesh.publish(constants.EVENT.START_BLOOD_OXYGEN) #手动血氧测试
+            elif msg == 3:
+                if get_temp_state != 1:
+                    EventMesh.debug_log("set_manual_measure_mode",msg)
+                    EventMesh.publish("clear_manual_temp_flag")
+                    EventMesh.publish("set_temp_state",1)
+                    EventMesh.publish("set_start_temp_measure_time",1)#设置开始测量的时间戳时间
+                    EventMesh.publish("set_hr_blood_led",1)
+                    EventMesh.publish(constants.EVENT.START_TEMP)#手动体温测试
+            pass
+
+
+        def set_start_measure_time(self, event, msg): #手动测试 1心
+            self.hr_auto = msg
+            pass
+
+        def get_start_measure_time(self, event, msg): #手动测试 
+
+            return  self.hr_auto
+        
+        def set_start_temp_measure_time(self, event, msg): #
+            self.temp_auto = msg
+            pass
+
+        def get_start_temp_measure_time(self, event, msg): #
+            return self.temp_auto
+
+        def mearsure_cb(self, event, msg):
+            if msg == 1:
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+            elif msg == 2:
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) 
+            elif msg == 3:
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_SPO2_TITLE"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) 
+            elif msg == 4:
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) 
+            
+            
+            
+        def play_temp_value(self, event, msg): #播放体温数值
+            flag = EventMesh.publish("get_call_state") 
+            if msg != None:
+                if flag == 0 and self.fall_flag == 0:
+                    EventMesh.publish("close_timer_all")#
+                    if msg > 0:
+                        # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))
+                        # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        EventMesh.publish("set_hr_blood_led",2)#测量成功
+                        self.temp_value = msg
+                        # self.timer.start(2*1000,1,self.play_temp_fun)
+                        self.play_temp_fun(0)
+                    else:
+                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        EventMesh.publish("set_hr_blood_led",3)#测量异常
+                else:
+                    EventMesh.publish("set_hr_blood_led",3)#测量异常
+
+        def play_temp_fun(self,argc): #播放体温数值
+            data = self.temp_value
+            if data > 42:
+                data = 42
+            data_tmp = str(data)
+            if data_tmp.find(".") != -1:
+                temp_shi = int(data_tmp.split('.')[0])//10
+                temp_ge = int(data_tmp.split('.')[0])%10
+                dot_ge = int(data_tmp.split('.')[1][:1])
+                if temp_ge > 0:#37.0
+                    if dot_ge > 0:#37.5
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\
+                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(temp_ge)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),\
+                        audio_buf.index("R_READ_TIME_{}".format(dot_ge)))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                    else:#37.0
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\
+                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(temp_ge)))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                else:#30.0 30.6
+                    if dot_ge > 0:
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\
+                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(dot_ge)))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    else:
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\
+                        audio_buf.index("R_READ_STEP_3"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+            else:
+                temp_shi = int(data_tmp)//10
+                temp_ge = int(data_tmp)%10
+
+                if temp_ge > 0:#45
+                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\
+                    audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(temp_ge)))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                else:
+                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\
+                    audio_buf.index("R_READ_STEP_3"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            
+
+        def play_hr_value(self, event, msg): #播放心率数值
+            flag = EventMesh.publish("get_call_state") 
+            if msg != None:
+                if flag == 0 and self.fall_flag == 0:
+                    EventMesh.publish("close_timer_all")#
+                    if msg >= 50:
+                        # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))
+                        # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        self.hr_value = msg
+                        EventMesh.publish("set_hr_blood_led",2)#测量成功
+                        # self.timer.start(2*1000,1,self.play_hr_fun)
+                        self.play_hr_fun(0)
+                    else:
+                        str_data ='mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        EventMesh.publish("set_hr_blood_led",3)#测量异常
+                else:
+                    EventMesh.publish("set_hr_blood_led",3)#测量异常
+        
+
+        def play_hr_fun(self,argc):#播放心率测试值
+            flag = EventMesh.publish("get_call_state") 
+            
+            if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断
+                EventMesh.publish("close_timer_all")#
+                data = self.hr_value
+                if data > 220:
+                    data = 220
+                if data < 100:
+                    if data%10 == 0:
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\
+                        audio_buf.index("R_READ_STEP_3"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    else:
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\
+                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(data%10)))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                else: 
+                    shi = (data%100)//10 #210
+                    ge = (data%100)%10
+                    #210 234
+                    if shi > 0:
+                        if ge == 0:#210 230 120
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//100)),\
+                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi)),audio_buf.index("R_READ_STEP_3"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        else:
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//100)),\
+                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi)),audio_buf.index("R_READ_STEP_3"),\
+                            audio_buf.index("R_READ_TIME_{}".format(ge)))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    else:
+                        if ge == 0:#200 100 209 108
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//100)),\
+                            audio_buf.index("R_READ_STEP_2"))
+                            EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        else:
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//100)),\
+                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge)))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+
+        def play_sugar_value(self, event, msg): #播放血糖数值
+            flag = EventMesh.publish("get_call_state") 
+            if msg != None:
+                if flag == 0 and self.fall_flag == 0:
+                    EventMesh.publish("close_timer_all")#
+                    if msg != 0:
+                        # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))
+                        # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        EventMesh.publish("set_hr_blood_led",2)#测量成功
+                        # self.timer.start(2*1000,1,self.play_spo2_fun)
+                        self.play_sugar_fun(msg)
+                    else:
+                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        EventMesh.publish("set_hr_blood_led",3)#测量异常
+                else:
+                    EventMesh.publish("set_hr_blood_led",3)#测量异常
+
+        def play_sugar_fun(self,argc):#播放血糖测试值
+            flag = EventMesh.publish("get_call_state") 
+            
+            if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断
+                EventMesh.publish("close_timer_all")#
+                data = str(argc)
+                data_shi = 0
+                data_ge = 0
+                if data.find(".") != -1:
+                    data_shi = int(data.split(".")[0])
+                    data_ge = int(data.split(".")[1])
+                else:
+                    data_shi = int(data)
+                    data_ge = 0
+
+                if data_shi != 0 and data_ge != 0:
+                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_BLOOD_SUGAR"),audio_buf.index("R_READ_TIME_{}".format(data_shi)),\
+                    audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(data_ge)))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+            else:
+                EventMesh.publish("set_hr_blood_led",3)#测量异常
+
+
+
+        def play_spo2_value(self, event, msg): #播放血样数值
+            flag = EventMesh.publish("get_call_state") 
+            if msg != None:
+                if flag == 0 and self.fall_flag == 0:
+                    EventMesh.publish("close_timer_all")#
+                    if msg >= 85:
+                        # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))
+                        # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        EventMesh.publish("set_hr_blood_led",2)#测量成功
+                        self.spo2_value = msg
+                        # self.timer.start(2*1000,1,self.play_spo2_fun)
+                        self.play_spo2_fun(0)
+                    else:
+                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        EventMesh.publish("set_hr_blood_led",3)#测量异常
+                else:
+                    EventMesh.publish("set_hr_blood_led",3)#测量异常
+
+        def play_spo2_fun(self,argc):#播放血氧测试值
+            flag = EventMesh.publish("get_call_state") 
+            
+            if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断
+                EventMesh.publish("close_timer_all")#
+                data = self.spo2_value
+                if data > 100:
+                    data = 100
+                if data == 100:
+                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_SPO2_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\
+                    audio_buf.index("R_READ_STEP_2"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                else:
+                    if data % 10 == 0:
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_SPO2_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\
+                        audio_buf.index("R_READ_STEP_3"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        pass
+                    else:
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_SPO2_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\
+                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(data%10)))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+
+        def set_sim_mode(self, event, msg): #mode 1 蓝灯闪烁 可识别卡 但未联网 2 可绑定appsim正常 3 手表不识别卡或者未插卡
+            flag = EventMesh.publish("get_call_state") 
+            if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断
+                EventMesh.publish("close_timer_all")#
+                # EventMesh.publish("stop_led_timer")#设置参数
+                mode = 0
+                signal = EventMesh.publish("get_sim_Status")
+                if signal != None:
+                    if signal == 1:#有卡 
+                        if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网提示关机
+                            mode = 2
+                        else:
+                            mode = 1
+                    else:#未插卡
+                        mode = 3
+                if mode == 1:#白色灯
+                    EventMesh.publish("set_led_time_arg",[1,2,10,led_mode.FLASH_LIGHT_WHITE,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功
+                    # EventMesh.publish("set_led_time_arg",[1000,400,1,led_mode.FLASH_LIGHT_WHITE,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SIM_FAILE"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    pass
+                elif mode == 2:#蓝灯色灯
+                    EventMesh.publish("set_led_time_arg",[1,2,10,led_mode.FLASH_LIGHT_GREEN,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功
+                    # EventMesh.publish("set_led_time_arg",[1000,400,1,led_mode.FLASH_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SIM_CONNECT"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    pass
+                elif mode == 3:#红灯闪烁
+                    EventMesh.publish("set_led_time_arg",[1,2,10,led_mode.FLASH_LIGHT_RED,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SIM"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                pass
+            
+        def dial_sos_phone(self, event, msg): #拨打紧急求助电话
+            flag = EventMesh.publish("get_call_state")
+            if flag == 0:
+            
+                signal = EventMesh.publish("screen_get_sig")
+                if signal != None:
+                    if signal >= 0 and signal <= 31:#有卡 
+                        if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网提示关机
+                            sos_number = EventMesh.publish("get_dial_sos_number")
+                            if sos_number != None:
+                                if len(sos_number) != 0:
+                                    EventMesh.publish("close_timer_all")#
+                                    EventMesh.publish("set_sos_flag",1)
+                                        
+                                else:#未设置sos紧急求助号码
+                                    EventMesh.publish("close_timer_all")#
+                                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_SOS_DIAL"))
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                    pass
+                        else:
+                            EventMesh.publish("close_timer_all")#
+                            EventMesh.publish("set_led_time_arg",[1,2,10,led_mode.FLASH_LIGHT_WHITE,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功
+                            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SIM_FAILE"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    else:#未插卡
+                        EventMesh.publish("close_timer_all")#
+                        EventMesh.publish("set_led_time_arg",[1,2,10,led_mode.FLASH_LIGHT_RED,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功
+                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SIM"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+        
+        def play_cur_time_event(self, event, msg): #播放当前时间
+            flag = EventMesh.publish("get_call_state") 
+            if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断
+                EventMesh.publish("close_timer_all")#
+                
+                data = RTC().datetime()
+                hour = data[4]
+                min = data[5]
+                # EventMesh.debug_log("hour",hour,min)
+                self.old_hour = hour
+                self.old_min = min
+                if self.old_hour == 0:
+                    if self.old_min <= 9:#00:09
+                        if self.old_min == 0:#0点整
+                            str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_0")\
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        else:#0点09分
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_0")\
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(self.old_min))\
+                            ,audio_buf.index("R_READ_TIME_MIN"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            pass
+
+                    else:
+                        if self.old_min % 10 == 0:#0点2十分 0点3十分
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_0")\
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min // 10))\
+                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            pass
+                        else:#0点2十8分
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_0")\
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min // 10))\
+                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(self.old_min % 10)),audio_buf.index("R_READ_TIME_MIN"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            pass
+
+                elif self.old_hour <= 9:#8:09 9:20 9:45
+                    if self.old_min <= 9:#9点09分
+                        if self.old_min <= 0:
+                            str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(self.old_hour))\
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            pass
+                        else:
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(self.old_hour))\
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(self.old_min))\
+                            ,audio_buf.index("R_READ_TIME_MIN"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                    else:
+                        if self.old_min % 10 == 0:#9点2十分 9点4十分
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(self.old_hour))\
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min //10))\
+                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        else:#9点2十4分
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(self.old_hour))\
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min //10))\
+                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(self.old_min % 10)),audio_buf.index("R_READ_TIME_MIN"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+
+                else:#12:0
+                    if self.old_min == 0:#12:00 13:00 15:00 20 10 11 12 13 14 15
+                        self.play_count+=1
+                        hour_shi = self.old_hour//10
+                        hour_ge = self.old_hour%10
+                        if self.old_hour == 10:#十点整
+                            str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                        elif self.old_hour == 20:
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                        else:
+                            if hour_shi <= 1:#十3点整
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\
+                                ,audio_buf.index("R_READ_TIME_{}".format(hour_ge)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                            else:
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                                ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(hour_ge)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                    else:
+                        if self.old_hour == 10:#10:09 10:10
+                            if self.old_min <= 9:
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\
+                                ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_0")\
+                                ,audio_buf.index("R_READ_TIME_{}".format(self.old_min)),audio_buf.index("R_READ_TIME_MIN"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            else:
+                                if self.old_min % 10 == 0:#十点2十分
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\
+                                    ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min//10))\
+                                    ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN"))
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                else:#十点2十1分
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\
+                                    ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min//10))\
+                                    ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(self.old_min%10))\
+                                    ,audio_buf.index("R_READ_TIME_MIN"))
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                        else:
+                            if self.old_hour < 20:#19:00
+                                if self.old_min <= 9:#19:09 
+                                    if self.old_min == 0:
+                                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_hour % 10)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))
+                                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                        pass
+                                    else:
+                                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_hour % 10)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT")\
+                                        ,audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(self.old_min % 10))\
+                                        ,audio_buf.index("R_READ_TIME_MIN"))
+                                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                    
+                                else:#19:18 19:40 19:56
+                                    if self.old_min % 10 == 0:#十9点2十分 十9点3十分
+                                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_hour % 10)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT")\
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_min // 10)),audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN"))
+                                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                    else:#十9点2十1分
+                                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_hour % 10)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT")\
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_min // 10)),audio_buf.index("R_READ_STEP_3")\
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_min % 10)),audio_buf.index("R_READ_TIME_MIN"))
+                                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                            else:
+                                hour_shi = self.old_hour//10
+                                hour_ge = self.old_hour%10
+
+                                min_shi = self.old_min//10
+                                min_ge = self.old_min%10
+
+                                #20:08 20:18  20:20
+                                if hour_ge == 0:
+                                    if self.old_min <= 9:
+                                        if self.old_min == 0:
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                            pass
+                                        else:
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_0")\
+                                            ,audio_buf.index("R_READ_TIME_{}".format(min_ge)),audio_buf.index("R_READ_TIME_MIN"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                                    else:
+                                        if min_ge == 0:#2十点2十分
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(min_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                        else:#2十点2十1分
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(min_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(min_ge)),audio_buf.index("R_READ_TIME_MIN"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                                else:#21:08 21:18
+                                    if self.old_min <= 9:
+                                        if self.old_min == 0:
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(hour_ge))\
+                                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                            pass
+                                        else:
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(hour_ge))\
+                                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_0")\
+                                            ,audio_buf.index("R_READ_TIME_{}".format(min_ge)),audio_buf.index("R_READ_TIME_MIN"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                    else:
+                                        if min_ge == 0:#2十3点3十分
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(hour_ge))\
+                                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(min_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                        else:#2十3点3十1分
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(hour_ge))\
+                                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(min_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(min_ge)),audio_buf.index("R_READ_TIME_MIN"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+
+        def play_timer_cb_1(self,*agrs):
+            return
+
+        def play_center_phone(self, event, msg): #msg
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许设备再次拨出
+            if flag == 0 and self.fall_flag == 0:
+                EventMesh.publish("close_timer_all")#
+            
+                center_dial = EventMesh.publish("get_storage_config","center_dial")
+                if center_dial != None:
+                    if len(center_dial) > 0:
+                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SOS_ALERT"))
+                        EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        voiceCall.callStart(str(center_dial))
+                        
+                    
+                else:#未设置号码
+                    # EventMesh.debug_log("play_center_phone")
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_SOS_DIAL"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    pass
+        def center_phone_cb(self,*argc): #msg
+            pass
+
+
+
+
+        def play_imei_event(self, event, msg): #msg
+            flag = EventMesh.publish("get_call_state") 
+            if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断
+                EventMesh.publish("close_timer_all")#
+                imei = EventMesh.publish(constants.EVENT.GET_IMEI)
+                EventMesh.debug_log(imei)
+                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(imei[0]))\
+                ,audio_buf.index("R_READ_TIME_{}".format(imei[1])),audio_buf.index("R_READ_TIME_{}".format(imei[2])),audio_buf.index("R_READ_TIME_{}".format(imei[3])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[4])),audio_buf.index("R_READ_TIME_{}".format(imei[5])),audio_buf.index("R_READ_TIME_{}".format(imei[6])),audio_buf.index("R_READ_TIME_{}".format(imei[7])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[8])),audio_buf.index("R_READ_TIME_{}".format(imei[9])),audio_buf.index("R_READ_TIME_{}".format(imei[10])),audio_buf.index("R_READ_TIME_{}".format(imei[11])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[12])),audio_buf.index("R_READ_TIME_{}".format(imei[13])),audio_buf.index("R_READ_TIME_{}".format(imei[14])))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+
+        def get_unread_wechat_state(self,event, msg): 
+
+            return self.set_unread_wechat
+        
+        def set_unread_wechat_state(self, event, msg): 
+            self.set_unread_wechat = msg
+
+        def get_wechat_data(self,event, msg): 
+
+            return [self.MXA_MSG ,self.wechat_recode_list]
+        
+        def set_wechat_data(self, event, msg): 
+            # EventMesh.debug_log("set_wechat_data1 ",msg,self.wechat_num)
+            self.MXA_MSG = msg[0]
+            self.wechat_recode_list = msg[1]
+            self.wechat_num = self.wechat_recode_list["num"]
+            with open("/usr/static/storage_file/wechat_record.json","w",encoding="utf-8") as fd:
+                ujson.dump(self.wechat_recode_list,fd)
+                #写编号
+            # EventMesh.debug_log("set_wechat_data2:{} ".format(self.wechat_num))
+        
+
+        def get_wechat_time(self, event, msg):
+            return  [self.press_btn,self.timeSecond]
+
+        def start_wechat_record(self, event, msg): #开始录音相关配置
+            if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网不需要录音
+                flag = EventMesh.publish("get_call_state") 
+                if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断
+                    if self.press_btn == 0:
+                        self.press_btn = 1
+                        audio_state = EventMesh.publish("get_audio_state")
+                        if audio_state == 1:
+                            self.aud.stop()
+                        EventMesh.publish("close_timer_all")#
+                        EventMesh.publish("set_led_time_arg",[1,1,160,led_mode.LONG_LIGHT_GREEN,4,2,led_mode.WECHAT_LED_MODE])#測量成功
+                        # EventMesh.publish("set_led_time_arg",[1000,1000,1,led_mode.LONG_LIGHT_GREEN,led_mode.OPEN_LONG_LIGHT_MODE,led_mode.WECHAT_LED_MODE])#測量成功
+                    
+                        date_tmp = utime.localtime()
+                        time_tmp = utime.mktime(date_tmp)
+                        self.timeSecond = time_tmp#保存按下的时间长s
+                        self.aud.setVolume(11)#设置音量最大
+                        
+                        EventMesh.debug_log("talking1.0")
+                        # if self.wechat_num >= self.MXA_MSG:
+                        #     self.wechat_num = 0 
+                        # self.wechat_num += 1
+                        # self.wechat_show = self.wechat_num
+                        # self.record_test.start("/usr/static/storage_file/{}.amr".format(self.wechat_show),16) 
+                        self.record_test.start("/usr/static/storage_file/wechat.amr",16) 
+                
+            else:
+                self.timeSecond = 0
+                self.press_btn = 0
+        def get_wechat_state(self, event, msg):
+            return self.press_btn
+        def set_wechat_state(self, event, msg):
+            self.press_btn = msg
+
+        def send_wechat_record(self, event, msg): #发送录音文件
+            if self.press_btn == 1:
+                self.press_btn = 0
+                self.record_test.stop() #停止錄音
+                EventMesh.publish("stop_led_timer")#关闭灯
+                EventMesh.publish("set_led_time_arg",[1,1,0,led_mode.FLASH_LIGHT_GREEN,4,2,led_mode.OTHER_MEASURE_MODE])#測量成功
+                # EventMesh.publish("set_led_time_arg",[0,1000,1,led_mode.LONG_LIGHT_GREEN,led_mode.OPEN_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#測量成功
+                self.countdown_old = 0
+
+                date_tmp = utime.localtime()
+                time_tmp = utime.mktime(date_tmp)
+
+                self.countdown_old = msg
+                if self.countdown_old >= 15:
+                    self.countdown_old = 15
+                if self.countdown_old <= 0:
+                    #录音时间太短
+                    return
+                else:
+                    # self.wechat_recode_list["%02d"%(self.wechat_show)] = "read:0"
+                    # self.wechat_recode_list["num"] = self.wechat_show
+                    EventMesh.debug_log("self.wechat_recode_list :{}".format(self.wechat_recode_list))
+
+                    # with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:
+                    #     ujson.dump(self.wechat_recode_list,fd)
+                    EventMesh.debug_log("send wechat data!!!!!!!!!!!!!!!!!!!!!")
+
+                    check_txt = ql_fs.path_exists("/usr/static/storage_file/wechat.amr")
+                    if check_txt == True :
+                        path = "/usr/static/storage_file/wechat.amr"
+                        with open(path,"rb") as fd:
+                            buf = bytearray(ql_fs.path_getsize(path))
+                            fd.readinto(buf)
+                            senddata = [self.countdown_old,buf]
+                            EventMesh.publish(constants.PROTOCOL.TKS_SEND,senddata)
+
+                    # with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:
+                    #     ujson.dump(self.wechat_recode_list,fd)
+                    # EventMesh.debug_log("send wechat data!!!!!!!!!!!!!!!!!!!!!")
+
+                    # check_txt = ql_fs.path_exists("/usr/static/storage_file/{}.amr".format(self.wechat_show))
+                    # if check_txt == True :
+                    #     path = "/usr/static/storage_file/{}.amr".format(self.wechat_show)
+                    #     with open(path,"rb") as fd:
+                    #         buf = bytearray(ql_fs.path_getsize(path))
+                    #         fd.readinto(buf)
+                    #         senddata = [self.countdown_old,buf]
+                    #         EventMesh.publish(constants.PROTOCOL.TKS_SEND,senddata)
+            else:
+                self.press_btn = 0
+
+
+
+        def play_wechat_last_amr(self, event, msg):#播放微聊最后一条语音文件
+            flag = EventMesh.publish("get_call_state") 
+            if flag == 0:#电话通话中 或者呼叫中挂断中断
+                EventMesh.publish("close_timer_all")#
+                if self.wechat_recode_list != None:
+                    num = 0
+                    play_state = 0
+                    if len(self.wechat_recode_list) > 1:
+                        num = int(self.wechat_recode_list["num"])
+                        #EventMesh.debug_log("self.wechat_recode_list1:{}".format(self.wechat_recode_list))
+                        if num != 0:
+                            last_num = str("%02d"%(num))
+                            last_tmp = self.wechat_recode_list[last_num]
+                            last_read = int(last_tmp.split(":")[1])
+                            if last_read == 1:#如果最后一条没有读则读最新的一条
+                                self.wechat_recode_list[last_num] = "read:0"
+                                self.wechat_recode_list["num"] = num 
+                                with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:
+                                    ujson.dump(self.wechat_recode_list,fd)
+                            else:
+                                sotr_new = {}
+                                sotr_new = sorted(self.wechat_recode_list.keys(), reverse=True)#降序排序
+                                # EventMesh.debug_log("sotr_new:{}".format(sotr_new))
+                                for i in range(len(self.wechat_recode_list)-1):#1 01 02 
+                                    key = sotr_new[i+1]
+                                    num_id = int(key)
+                                    #EventMesh.debug_log("key:{} num_id:{}".format(key,num_id))
+                                    if key in self.wechat_recode_list:#
+                                        str_tmp = self.wechat_recode_list[key]
+                                        read = int(str_tmp.split(":")[1])
+                                        if read != 0:#未读是按一下播放下一条同时删除
+                                            check_amr = ql_fs.path_exists("/usr/static/storage_file/{}.amr".format(num_id))#还要检测这个文件是否存在
+                                            if check_amr == True:
+                                                self.wechat_recode_list[key] = "read:0"
+                                                self.wechat_recode_list["num"] = num 
+                                                EventMesh.debug_log("self.wechat_recode_list2:{} num_id:{} num:{}".format(self.wechat_recode_list,num_id,num))
+                                                # self.aud.play(1, 1, '/usr/static/storage_file/{}.amr'.format(num))  #文件名前面要加上路径
+                                                play_state = 1
+                                                with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:
+                                                    ujson.dump(self.wechat_recode_list,fd)
+                                                break
+                                            else:
+                                                continue
+                                        else:
+                                            continue
+                                    else:
+                                        continue
+                            #EventMesh.debug_log("play_state:{}".format(play_state))
+                            # if play_state == 0:#
+                            check_amr = ql_fs.path_exists("/usr/static/storage_file/{}.amr".format(num))#还要检测这个文件是否存在
+                            if check_amr == True:
+                                self.aud.play(1, 1, '/usr/static/storage_file/{}.amr'.format(num))  #文件名前面要加上路径
+
+
+        def play_unread_wechat_infor(self,event,msg):#未读微聊语音
+            flag = EventMesh.publish("get_call_state") 
+            if flag == 0 and self.press_btn == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断
+                if self.wechat_recode_list != None:
+                    num = 0
+                    play_state = 0
+                    if len(self.wechat_recode_list) > 1:
+                        num = int(self.wechat_recode_list["num"])
+                        if num != 0:
+                            for i in range(len(self.wechat_recode_list)-1):#1 01 02 
+                                key = "%02d"%(i+1)
+                                if key in self.wechat_recode_list:#
+                                    str_tmp = self.wechat_recode_list[key]
+                                    read = int(str_tmp.split(":")[1])
+                                    if read == 1:#未读是按一下播放下一条同时删除
+                                        play_state = 1
+                                    else:
+                                        continue
+                                else:
+                                    continue
+                            if play_state == 1:#设置未读语音状态
+                                EventMesh.publish("set_unread_wechat_state",1)
+                            else:
+                                EventMesh.publish("set_unread_wechat_state",0)
+                                self.updateTime = 0
+
+                state = EventMesh.publish("get_unread_wechat_state")#
+                date_tmp = utime.localtime()
+                time_tmp = utime.mktime(date_tmp)
+                if state != None:
+                    if state == 1:
+                        EventMesh.publish("set_led_time_arg",[1,2,8,led_mode.FLASH_LIGHT_GREEN,8,4,led_mode.OTHER_MEASURE_MODE])#測量成功
+                        # EventMesh.publish("set_led_time_arg",[1000,400,1,led_mode.FLASH_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数
+                        if self.updateTime == 0:
+                            self.updateTime = time_tmp
+                        if self.updateTime != 0:
+                            if time_tmp - self.updateTime >= 10*60:
+                                self.updateTime = time_tmp
+                                #播放音频文件
+                                EventMesh.publish("close_timer_all")
+                                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_UNREAD_WECHAT"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    else:
+                        self.updateTime = 0
+            
+
+
+
+    class BtnDevice(Abstract):
+
+        def __init__(self, tp=None):
+            self.pk = PowerKey()
+            self.__pwk_timer = osTimer()
+            self.aud = audio.Audio(0)
+            self.aud.set_pa(Pin.GPIO29)
+            self.aud.setVolume(11)
+            # self.keypad = machine.KeyPad(1, 2)
+            self.__PowerDownTimeOut = 3000
+            self.__tp = tp
+            self.pwk_press = 0
+            self.pwk_count = 0
+            self.GPIO26_status = 1#默认是低电平
+            self.powerKey_status = 0
+            self.sosKey = 0
+            self.wechatKey = 0
+            self.sosKey_status = 1#默认是低电平
+            self.WeChatKey_status = 1#默认是低电平
+
+            self.wechatKey_timer = osTimer()
+            self.wechatKey_count = 0
+            self.wechatKey_press = 0 
+
+            self.sosKey_timer = osTimer()
+            self.sosKey_count = 0
+            self.sosKey_press = 0 
+            self.sosKey_long_press = 0
+
+            self.wechatKey_press_count = 0
+
+            self.timeSeconOld = 0
+            self.wechat_state = 0 #按下录音时的状态
+
+            
+            self.sosKey_press_count = 0
+
+
+            self.pwkey_timer = osTimer()
+            self.pwKey_press_count = 0
+            self.pwkey_count = 0
+            self.pwkey_press = 0
+            self.led_state = 0
+            self.hsensorTest_timer = osTimer()
+            self.factoryTest_timer = osTimer()
+            self.factoryTest_count = 0
+            self.factory_timesec = 0
+            self.factoryTest_led_count = 0
+            self.factoryTest_flag = 0
+            self.btnInfo_queue = Queue()
+            _thread.stack_size(10*1024+192)
+            _thread.start_new_thread(self.btnInfo_queue_thread, ())
+            _thread.stack_size(8*1024)
+            
+            EventMesh.subscribe("publish_message_event_btnInfo",self.publish_message_event_btnInfo)
+
+            EventMesh.subscribe("close_wechat_btn_timer", self.close_wechat_btn_timer)#来电强制关闭微聊语音
+
+        def btnInfo_queue_thread(self):
+            while True:
+                data = self.btnInfo_queue.get()
+                #EventMesh.debug_log("Info_queue:data = {}".format(data))
+                if data != None:
+                    try:
+                        data["func"](data["data"])
+                    except Exception as e:
+                        EventMesh.debug_log("btnInfo_queue:ERROR:{}".format(e))
+                        usys.print_exception(e)
+        def publish_message_event_btnInfo(self,event,msg):
+            self.btnInfo_queue.put(msg)
+            EventMesh.publish(constants.EVENT.SYSTEM_UP)#唤醒休眠
+            
+        def publish_wechat_btn_event_cb(self, *args, **kwargs):
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.wechatKey_press_cb,"data":0})  
+
+        def publish_soskey_btn_event_cb(self, *args, **kwargs):
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.sosKey_press_cb,"data":0})  
+
+        def publish_pwkKey_btn_event_cb(self, *args, **kwargs):
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.pwKey_press_cb,"data":0})  
+
+    
+
+        def post_processor_after_instantiation(self):
+            # self.keypad.init()
+            # self.keypad.set_callback(self.key_callback)
+        
+            self.pk.powerKeyEventRegister(self.powerKey_callback)
+            
+            self.extint = ExtInt(ExtInt.GPIO26, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_DISABLE, self.pwk_extint_cb)
+            self.extint.enable()
+
+            self.sosKey = ExtInt(ExtInt.GPIO22, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.sosKey_extint_cb)
+            self.sosKey.enable()
+
+            self.wechatKey = ExtInt(ExtInt.GPIO20, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.wechatKey_extint_cb)
+            self.wechatKey.enable()
+
+            key19 = Pin(Pin.GPIO19, Pin.OUT, Pin.PULL_PU, 0)
+
+        def pwk_extint_cb(self,args):#侧边按键
+            # self.GPIO26_status = self.extint.read_level()
+            
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if open_power != None and open_power_off != None:
+                if open_power == 0 or open_power_off == 1:
+                    return
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+            fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+            if fall_down != None:
+                if fall_down != 0 or flag == 2:
+                    return
+            self.GPIO26_status = int(args[1])
+            if self.GPIO26_status == 0:
+                self.GPIO26_status = 1
+            else:
+                self.GPIO26_status = 0
+                pass
+            self.WeChatKey_status = self.wechatKey.read_level()
+            if self.sosKey_status != 0 and self.WeChatKey_status != 0:
+                if self.GPIO26_status == 0:#按下
+                    EventMesh.publish("close_wechat_btn_timer")
+                    if self.pwkey_press == 0 :
+                        self.aud.stop()  #播放声音 
+                        # self.wechatKey_timeout_cb(0)
+                        # self.sosKey_timeout_cb(0)
+                        self.wechatKey_timer.stop()
+                        self.pwkey_timer.stop()
+                        self.sosKey_timer.stop()
+                        
+                        self.sosKey_press_count = 0
+                        self.sosKey_press = 0
+                        self.sosKey_long_press = 0
+                        self.wechatKey_press = 0
+                        self.wechat_state = 0
+                        self.wechatKey_press_count = 0
+
+                        self.pwkey_press = 1
+                        self.pwkey_count = 0
+                        self.led_state = 0
+                        self.pwkey_timer.start(100, 1, self.publish_pwkKey_btn_event_cb)
+                        # EventMesh.debug_log("key22_extint_cb:self.key22_timer.start!!!!\n")
+
+        def pwKey_press_cb(self, data):
+            '''KEY2:联动屏幕右下角或返回键长按关机'''
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if open_power != None and open_power_off != None:
+                if open_power == 0 or open_power_off == 1:
+                    self.pwkey_timer.stop()
+                    self.pwkey_count = 0
+                    self.pwkey_press = 0
+                    self.led_state = 0
+                    self.pwKey_press_count=0
+                    return
+            self.GPIO26_status = self.extint.read_level()
+            if self.pwkey_press == 1 :
+                self.pwkey_count += 1
+                if self.pwkey_count > 5:
+                    if self.led_state == 0:
+                        self.led_state = 1
+                        EventMesh.publish("set_led_time_arg",[1,1,330,led_mode.LONG_LIGHT_GREEN,2,1,led_mode.OTHER_MEASURE_MODE])#測量成功
+                    if self.pwkey_count >= 10*10:
+                        EventMesh.publish("stop_led_timer")#设置参数
+                        self.pwkey_timer.stop()
+                        self.pwkey_count = 0
+                        self.pwkey_press = 0
+                        self.pwKey_press_count = 0
+                        self.led_state = 0
+                        # if EventMesh.publish("get_sim_Status") != 1:
+                        #     EventMesh.publish("open_power_on", 2)#
+                        # else:
+                        EventMesh.publish("open_power_on", 3)#
+                        return
+                    
+                    if self.pwkey_count >= 3*10 :
+                        if EventMesh.publish("get_sim_Status") != 1:
+                            EventMesh.debug_log("长3秒关机")
+                            EventMesh.publish("stop_led_timer")#设置参数
+                            self.pwkey_timer.stop()
+                            self.pwkey_count = 0
+                            self.pwkey_press = 0
+                            self.pwKey_press_count = 0
+                            self.led_state = 0
+                            EventMesh.publish("open_power_on", 2)#
+                            return
+                            
+                    
+                if self.GPIO26_status == 1:#松开
+                    if self.pwkey_count >= 1: #防抖100ms
+                        # EventMesh.debug_log("self.GPIO26_status == 1")
+                        self.pwkey_timer.stop()
+                        self.pwkey_count = 0
+                        self.pwkey_press = 0
+                        self.led_state = 0
+                        self.pwKey_press_count+=1
+                        self.pwkey_timer.start(500, 0, self.publish_pwKey_timeout_cb_do)#松手超时1s判断
+
+        def  hsensorTest_timer_cb(self,e):
+            EventMesh.publish("system_sleep_rest")#防止黑屏 
+            w_data = EventMesh.publish(constants.EVENT.GET_WEAR)#佩戴数据
+            #EventMesh.debug_log("FactoryModeHsensorTest{}".format(data))
+        
+            c_data = self.Hsensor.get_test_data()#校准数据和工厂数据
+            # text_data = "   佩戴状态\n红外:{}活体:{}佩戴:{}\n{},{} \n{},{} \n{},{}\n校准数据:{},{},{},{}\n漏光数据:{},{},{}".format(
+            #                                             c_data[3],c_data[4],w_data,c_data[5],c_data[6],c_data[7],c_data[8],c_data[9],c_data[10],
+            #                                                 c_data[11],c_data[12],c_data[13],c_data[14],c_data[0],c_data[1],c_data[2],)
+                
+            if(self.hsensorTest_timer_count != 0):
+                    self.hsensorTest_timer_count -= 1
+                    if self.hsensorTest_timer_count%5 == 0:
+                        EventMesh.debug_log("c_data:{} {} {} {}".format(c_data[11],c_data[12],c_data[13],c_data[14]))
+                        if c_data[11] != 0 and c_data[13] != 0: #校准成功
+                            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            self.Hsensor.close() 
+                            self.Hsensor.init()
+                            self.hsensorTest_timer.stop()
+                            return
+                    if self.hsensorTest_timer_count == 0:#50秒超时,失败
+                        self.Hsensor.close() 
+                        self.Hsensor.init(); 
+                        self.hsensorTest_timer.stop()
+                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                
+        def publish_pwKey_timeout_cb_do(self, *args, **kwargs):
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.pwKey_timeout_cb,"data":0})  
+        
+        def pwKey_timeout_cb(self, data):#侧边按键
+            boot_count = EventMesh.publish("get_boot_time_count")
+            try :
+                if boot_count < 50 :#开机50秒内按键次数大于10就校准
+                    #EventMesh.debug_log("boot_count:{}".format(boot_count))
+                    if self.pwKey_press_count >= 6:
+                        self.Hsensor =  EventMesh.publish("get_Hsensor")
+                        self.hsensorTest_timer.start(1000,1,self.hsensorTest_timer_cb) 
+                        EventMesh.debug_log("打开校准模式")
+                        self.Hsensor.set_sar(1)
+                        self.Hsensor.open_test(255) #打开校准模式
+                        utime.sleep_ms(500)
+                        self.Hsensor.open_heart()
+                        self.hsensorTest_timer_count = 50
+                        self.hsensorTest_timer.start(1000,1,self.hsensorTest_timer_cb)
+                        str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_HSENSOR_SPO2_TITLE"),)
+                        EventMesh.publish("play_audio_file",[str_data,1])
+                        self.pwKey_press_count = 0
+                        return
+
+            except Exception as e:
+                usys.print_exception(e)
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if open_power != None and open_power_off != None:
+                if open_power == 0 or open_power_off == 1:
+                    self.pwkey_timer.stop()
+                    self.pwkey_count = 0
+                    self.pwkey_press = 0
+                    self.led_state = 0
+                    self.pwKey_press_count=0
+                    return
+            if self.pwKey_press_count >= 1:
+                self.pwKey_press_count = 0
+
+                # flag = EventMesh.publish("get_call_state") 
+                # if flag != 2:#如果是电话拨出去或者不在打电话中都可以执行
+                #     EventMesh.publish("stop_led_timer")#设置参数
+                #     if flag == 1:#如果是sos电话拨出去
+                #         sos_flag = EventMesh.publish("get_sos_flag")
+                #         if sos_flag == 1:
+                #             EventMesh.publish("set_sos_flag",0)
+                #             EventMesh.publish("set_sos_num",0)
+                #             EventMesh.publish("set_hangup_mode",0)
+                #     EventMesh.publish("close_hr_sop2")#
+                #     flag = EventMesh.publish("get_call_state") 
+                #     # if flag == 0 or flag == 2:#在拨出去或者通话中就不播报入网成功的语音
+                #     if flag != 1:#在拨出去或者通话中就不播报入网成功的语音
+                #         EventMesh.publish("set_sim_mode")#
+                #     EventMesh.publish("dialing_out_event")#电话呼叫中voiceCall.callEnd()
+                
+                # EventMesh.debug_log("pwKey_timeout_cb:self.pwKey_press_count >= 1")
+                flag = EventMesh.publish("get_call_state") 
+                if flag != 2:
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("dialing_out_event")#电话呼叫中voiceCall.callEnd()
+
+                    if flag == 1:#如果是sos电话拨出去
+                        sos_flag = EventMesh.publish("get_sos_flag")
+                        if sos_flag == 1:
+                            EventMesh.publish("set_sos_flag",0)
+                            EventMesh.publish("set_sos_num",0)
+                            EventMesh.publish("set_hangup_mode",0)
+                    EventMesh.publish("close_hr_sop2")#
+                    flag = EventMesh.publish("get_call_state") 
+                    if flag != 1:
+                        EventMesh.publish("set_sim_mode")#
+            
+            self.pwKey_press_count = 0
+
+        def sosKey_extint_cb(self,args):
+            power_off = EventMesh.publish("get_power_off_state")#获取关机标识
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if power_off != None and open_power != None:
+                if power_off == 1 or open_power == 0:
+                    return
+            # self.sosKey_status = self.sosKey.read_level()
+            self.sosKey_status = int(args[1])
+            if self.sosKey_status == 0:
+                self.sosKey_status = 1
+            else:
+                self.sosKey_status = 0
+                pass
+            # wechat_state = EventMesh.publish("get_wechat_state")
+            # EventMesh.debug_log('### key22_extint_cb  {} {} self.GPIO22_status:{} {} {}'.format(wechat_state,args,self.WeChatKey_status,self.GPIO26_status,self.sosKey_status)) # args[0]:gpio号 args[1]:上升沿或下降沿
+            if self.WeChatKey_status != 0 and self.GPIO26_status != 0:
+                if self.sosKey_status == 0:#按下
+                    EventMesh.publish("close_falldown_alarm_event")#sos短按事件
+                    EventMesh.publish("close_wechat_btn_timer")
+                    if self.sosKey_press == 0 :
+                        self.led_state = 0
+                        self.wechatKey_timer.stop()
+                        self.pwkey_timer.stop()
+                        self.sosKey_timer.stop()
+                        self.wechatKey_press_count = 0
+                        self.wechat_state = 0
+                        self.wechatKey_count = 0
+                        self.pwKey_press_count = 0
+                        
+                        self.pwkey_press = 0
+                        self.wechatKey_press = 0
+                        
+                        self.sosKey_long_press = 0
+                        self.sosKey_count = 0
+                        self.sosKey_press = 1
+                        self.sosKey_timer.start(100, 1, self.publish_soskey_btn_event_cb)
+            # EventMesh.debug_log("key22_extint_cb:self.key22_timer.start!!!!\n")
+
+        def sosKey_press_cb(self, data):
+            '''KEY2:联动屏幕右下角或返回键长按关机'''
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if open_power != None and open_power_off != None:
+                if open_power == 0 or open_power_off == 1:
+                    self.sosKey_timer.stop()
+                    self.sosKey_count = 0
+                    self.sosKey_press = 0
+                    self.sosKey_long_press = 0
+                    self.sosKey_press_count = 0
+                    return
+            self.sosKey_status = self.sosKey.read_level()
+            if self.sosKey_press == 1 :
+                # if self.sosKey_count <= 2:
+                    # if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网不需要录音
+                    #     EventMesh.publish("set_led_time_arg",[1000,200,1,led_mode.FLASH_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数
+                    # else:
+                    #     EventMesh.publish("set_led_time_arg",[1000,200,1,led_mode.FLASH_LIGHT_RED,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数
+                self.sosKey_count += 1
+                if self.sosKey_count >= 10*3: #长按3s sos拨号
+                    if self.sosKey_long_press == 0:
+                        self.sosKey_long_press = 1
+                        flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+                        fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+                        if fall_down != None:
+                            if fall_down != 0 or flag == 2:
+                                return
+                        EventMesh.publish_async("dial_sos_phone")#拨打sos号码
+                        return
+                    if self.sosKey_status == 1:#松开
+                        self.sosKey_count = 0
+                        self.sosKey_long_press = 0
+                        self.sosKey_press = 0
+                        self.sosKey_timer.stop()
+                        return
+
+                # EventMesh.debug_log("self.sosKey_count {}",self.sosKey_count)
+                if self.sosKey_status == 1:#松开
+                    if self.sosKey_count >= 1: #防抖100ms
+                        self.sosKey_timer.stop()
+                        self.sosKey_count = 0
+                        self.sosKey_press = 0
+                        self.sosKey_long_press = 0
+                        self.sosKey_press_count+=1
+                        self.sosKey_timer.start(500, 0, self.publish_sosKey_timeout_cb_do)#松手超时1s判断
+        def publish_sosKey_timeout_cb_do(self, *args, **kwargs):
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.sosKey_timeout_cb,"data":0})  
+        
+        def close_factory_test(self):#关闭老化测试
+            if self.factoryTest_flag == 1:
+                self.factoryTest_flag = 0
+                close_led_white()
+                close_led_red()
+                close_led_green()
+                self.factoryTest_led_count = 0
+                self.factoryTest_count = 0
+                self.aud.stopPlayStream()
+                self.factoryTest_timer.stop()
+
+        def factoryTest_timer_cb(self,e):
+            # self.factoryTest_count+=1
+            date_tmp = utime.localtime()
+            time_tmp = utime.mktime(date_tmp)
+
+            if time_tmp - self.factory_timesec > 60*60*2:#老化测试2小时自动退出
+                # self.factoryTest_count = 0
+                self.close_factory_test()
+                return
+            #播放音频 
+            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_ALARM_NEW"))
+            if EventMesh.publish("get_audio_state") == 0:
+                self.aud.montage_play('U:/static/audio.bin',1,1,str_data)
+            #led灯常亮
+            self.factoryTest_led_count+=1
+            if self.factoryTest_led_count == 1:#1  4 7  10 
+                open_led_red()
+                close_led_green()
+                close_led_white()
+            elif self.factoryTest_led_count == 2:
+                open_led_green()
+                close_led_red()
+                close_led_white()
+            elif self.factoryTest_led_count == 3: #3  6 9 12 
+                open_led_white()
+                close_led_red()
+                close_led_green()
+            if self.factoryTest_led_count >= 3+1:
+                self.factoryTest_led_count = 0
+            
+            
+
+
+            pass
+        def sosKey_timeout_cb(self, data):#
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if open_power != None and open_power_off != None:
+                if open_power == 0 or open_power_off == 1:
+                    self.sosKey_timer.stop()
+                    self.sosKey_count = 0
+                    self.sosKey_press = 0
+                    self.sosKey_long_press = 0
+                    self.sosKey_press_count = 0
+                    return
+            factory_count = EventMesh.publish("get_factory_test_time")
+            print("factory_count:%d",factory_count)
+            try :
+                if factory_count <= 30 :#开机30秒内按键次数大于15进入测试模式
+                    #EventMesh.debug_log("boot_count:{}".format(boot_count))
+                    if self.sosKey_press_count >= 15:
+                        self.factoryTest_timer.start(1000,1,self.factoryTest_timer_cb)
+                        date_tmp = utime.localtime()
+                        time_tmp = utime.mktime(date_tmp)
+                        self.factory_timesec = time_tmp
+                        self.sosKey_press_count = 0
+                        self.factoryTest_led_count = 0
+                        self.factoryTest_flag = 1
+                        return
+
+            except Exception as e:
+                usys.print_exception(e)
+
+            # EventMesh.debug_log("sosKey_press_count!!!!!!!!!!!!!! ",self.sosKey_press_count)
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+            fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+            if self.sosKey_press_count > 1:#短按十次解绑app
+                if fall_down != None:
+                    if fall_down != 0 or flag == 2:
+                        self.sosKey_press_count = 0
+                        return
+            if self.sosKey_press_count == 10:#
+                self.sosKey_press_count = 0
+                pass
+            elif self.sosKey_press_count == 6:#
+                self.sosKey_press_count = 0
+                self.close_factory_test()
+                pass
+            elif self.sosKey_press_count == 5:#功能暂时屏蔽
+                self.sosKey_press_count = 0
+                call_state = EventMesh.publish("get_call_state")
+                battery = EventMesh.publish("screen_get_battery")
+                if call_state == None:
+                    call_state = 0
+                if call_state == 0: 
+                    if battery != None:
+                        if battery[0] != "1":#在充电得时候
+                            EventMesh.publish("stop_led_timer")#设置参数
+                            EventMesh.publish("set_manual_measure_mode",3)#测量体温
+                pass
+            elif self.sosKey_press_count == 4:#拨打app快捷号码
+                self.sosKey_press_count = 0
+                EventMesh.publish("stop_led_timer")#设置参数
+                EventMesh.publish("play_center_phone")#拨打快捷号码
+                # EventMesh.publish("call_phonebook_num",3)
+                pass
+            elif self.sosKey_press_count == 3:#测试心率
+                self.sosKey_press_count = 0
+                
+                call_state = EventMesh.publish("get_call_state")
+                battery = EventMesh.publish("screen_get_battery")
+                if call_state == None:
+                    call_state = 0
+                if call_state == 0: 
+                    if battery != None:
+                        if battery[0] != "1":#在充电得时候
+                            EventMesh.publish("stop_led_timer")#设置参数
+                            EventMesh.publish("set_manual_measure_mode",1)#
+                pass
+            elif self.sosKey_press_count == 2:#播报当前步数
+                self.sosKey_press_count = 0
+                EventMesh.publish("stop_led_timer")#设置参数
+                EventMesh.publish("play_cur_step_event")#
+                pass
+            elif self.sosKey_press_count == 1:#挂断来电 短语音播报
+                self.sosKey_press_count = 0
+                EventMesh.publish("stop_led_timer")#设置参数
+                EventMesh.publish("sos_short_press")#sos短按事件
+                
+                pass
+            self.sosKey_press_count = 0
+
+
+        def wechatKey_extint_cb(self,args):
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if open_power != None and open_power_off != None:
+                if open_power == 0 or open_power_off == 1:
+                    return
+            fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+            if fall_down != None:
+                if fall_down != 0:
+                    return
+            # self.WeChatKey_status = self.wechatKey.read_level()
+            self.WeChatKey_status = int(args[1])
+            if self.WeChatKey_status == 0:
+                self.WeChatKey_status = 1
+            else:
+                self.WeChatKey_status = 0
+                pass
+            
+            # EventMesh.debug_log('### wechatKey_extint_cb  {} {} self.WeChatKey_status:{} {} {}'.format(wechat_state,args,self.sosKey_status,self.GPIO26_status,self.WeChatKey_status)) # args[0]:gpio号 args[1]:上升沿或下降沿
+            if self.sosKey_status != 0 and self.GPIO26_status != 0:
+                if self.WeChatKey_status == 0:#按下
+                    if self.wechatKey_press == 0:
+                        # self.pwKey_timeout_cb(0)
+                        # self.sosKey_timeout_cb(0)
+                        self.wechatKey_timer.stop()
+                        self.pwkey_timer.stop()
+                        self.sosKey_timer.stop()
+                        self.sosKey_press_count = 0
+                        self.sosKey_long_press = 0
+                        self.pwKey_press_count = 0
+                        self.sosKey_press = 0
+                        self.pwkey_press = 0
+                        self.wechatKey_press = 1
+                        self.led_state = 0
+                        self.wechatKey_count = 0
+                        self.wechat_state = 0
+                        self.wechatKey_timer.start(100, 1, self.publish_wechat_btn_event_cb)
+                else:
+                    # EventMesh.debug_log('### wechatKey_extint_cb end')
+                    EventMesh.publish("close_wechat_btn_timer")
+
+
+        def close_wechat_btn_timer(self,event,*argc):
+            tmp = EventMesh.publish("get_wechat_time")#获取微聊时间戳
+            wechat_time = 0
+            time_tmp = 0
+            time_sec = 0
+
+            if tmp != None:
+                if tmp[0] == 1:
+                    self.wechatKey_timer.stop()
+                    self.wechatKey_count = 0
+                    self.wechatKey_press = 0
+                    self.wechat_state = 0
+                    self.wechatKey_press_count=0
+                    
+                    date_tmp = utime.localtime()
+                    time_tmp = utime.mktime(date_tmp)
+                    time_sec = tmp[1]
+                    wechat_time = time_tmp - time_sec
+                    # EventMesh.debug_log("close_btn_timer",time_tmp,time_sec,wechat_time)
+                    if wechat_time >= 15:
+                        wechat_time = 15
+                    if wechat_time <= 0:
+                        wechat_time = 0
+                    EventMesh.publish("send_wechat_record",wechat_time)#发送录音文件内容
+        
+
+        def wechatKey_press_cb(self,data):
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if open_power != None and open_power_off != None:
+                if open_power == 0 or open_power_off == 1:
+                    self.wechatKey_timer.stop()
+                    self.wechatKey_count = 0
+                    self.wechatKey_press = 0
+                    self.wechat_state = 0
+                    self.wechatKey_press_count=0
+                    return
+            self.WeChatKey_status = self.wechatKey.read_level()
+            # print("100ms self.WeChatKey_status",self.WeChatKey_status)
+            wechat_time = 0
+            tmp = None
+            time_sec = 0
+            time_tmp = 0
+            date_tmp = utime.localtime()
+            time_tmp = utime.mktime(date_tmp)
+            '''KEY2:联动屏幕右下角或返回键长按关机'''
+            if self.wechatKey_press == 1 :#是否按下
+                tmp = EventMesh.publish("get_wechat_time")#获取微聊时间戳
+                self.wechatKey_count += 1
+                if self.wechatKey_count >= 15: #长按1s进入微聊录音
+                    flag = EventMesh.publish("get_call_state") 
+                    fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+                    if flag != None:
+                        if flag == 0 and fall_down == 0:
+                            if self.WeChatKey_status == 0:
+                                if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网不需要录音
+                                    if self.wechat_state == 0:#按下超过s开始录音
+                                        EventMesh.publish("start_wechat_record")#开始录音
+                                        self.wechat_state = 1
+                                else:
+                                    self.wechat_state = 0
+                                    self.wechatKey_timer.stop()
+                                    self.wechatKey_count = 0
+                                    self.wechatKey_press = 0
+                                    self.wechatKey_press_count=0
+                                    EventMesh.publish("set_sim_mode")#播報imei号
+                                    return
+
+                            if self.WeChatKey_status == 0:#未松手超过15s啧停止录音
+                                if self.wechat_state == 1:
+                                    if tmp != None:
+                                        if tmp[0] != 0:
+                                            time_sec = tmp[1]
+                                            if time_tmp - time_sec >= 15:
+                                                wechat_time = time_tmp - time_sec
+                                                if wechat_time >= 15:
+                                                    wechat_time = 15
+                                                EventMesh.publish("send_wechat_record",wechat_time)#发送录音文件内容
+                                                
+                                                self.wechatKey_timer.stop()
+                                                self.wechatKey_count = 0
+                                                self.wechatKey_press = 0
+                                                self.wechat_state = 0
+                                                self.wechatKey_press_count=0
+                                                return
+                            else:
+                                if self.WeChatKey_status == 1:
+                                    if self.wechat_state == 1:#如果按下时长超过1s且小于长按的时间也认为是录微聊
+                                        if tmp != None:
+                                            if tmp[0] != 0:
+                                                time_sec = tmp[1]
+                                                wechat_time = time_tmp - time_sec
+                                            # EventMesh.debug_log("WECHAT TIEM",time_tmp,time_sec,wechat_time)
+                                            if wechat_time >= 15:
+                                                wechat_time = 15
+                                        
+                                        EventMesh.publish("send_wechat_record",wechat_time)#发送录音文件内容
+                                        self.wechatKey_timer.stop()
+
+                                        self.wechatKey_count = 0
+                                        self.wechatKey_press = 0
+                                        self.wechat_state = 0
+                                        self.wechatKey_press_count=0
+                                        return
+                        else:
+                            self.wechatKey_timer.stop()
+                            self.wechatKey_count = 0
+                            self.wechat_state = 0
+                            self.wechatKey_press = 0
+                            self.wechatKey_press_count=0
+                            return
+                if self.WeChatKey_status == 1:#松开
+                    if self.wechatKey_count >= 1: #防抖100ms
+                        # EventMesh.debug_log("WeChat time!!!!!!!!!!!!!!")
+                        self.wechatKey_timer.stop()
+                        self.wechatKey_count = 0
+                        self.wechatKey_press = 0
+                        self.wechat_state = 0
+                        self.wechatKey_press_count+=1
+                        self.wechatKey_timer.start(500, 0, self.publish_wechatKey_btn_event_cb)#松手超时1s判断
+
+        def publish_wechatKey_btn_event_cb(self, *args, **kwargs):
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.wechatKey_timeout_cb,"data":0})  
+
+        def wechatKey_timeout_cb(self,data):#微聊键
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if open_power != None and open_power_off != None:
+                if open_power == 0 or open_power_off == 1:
+                    self.wechatKey_timer.stop()
+                    self.wechatKey_count = 0
+                    self.wechatKey_press = 0
+                    self.wechat_state = 0
+                    self.wechatKey_press_count=0
+                    return
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+            fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+            if self.wechatKey_press_count > 1:#
+                if fall_down != None:
+                    if fall_down != 0 or flag == 2:
+                        self.wechatKey_press_count = 0
+                        return
+            # EventMesh.debug_log("wechatKey_timeout_cb!!!!!!!!!!!!!! ",self.wechatKey_press_count)
+            if self.wechatKey_press_count == 10:#短按十次解绑app
+                self.wechatKey_press_count = 0
+                EventMesh.publish("stop_led_timer")#设置参数
+                EventMesh.publish("open_power_on", 4)#恢复出厂
+                pass
+            elif self.wechatKey_press_count == 6:#短按六次播报imei号
+                self.wechatKey_press_count = 0
+                EventMesh.publish("stop_led_timer")#设置参数
+                EventMesh.publish("play_imei_event")#播報imei号
+                pass
+            elif self.wechatKey_press_count == 4:#拨打通讯录号码三
+                self.wechatKey_press_count = 0
+                EventMesh.publish("stop_led_timer")#设置参数
+                EventMesh.publish("call_phonebook_num",3)
+                pass
+            elif self.wechatKey_press_count == 3:#拨打通讯录号码二
+                self.wechatKey_press_count = 0
+                EventMesh.publish("stop_led_timer")#设置参数
+                EventMesh.publish("call_phonebook_num",2)
+                pass
+            elif self.wechatKey_press_count == 2:#拨打通讯录号码一
+                EventMesh.publish("stop_led_timer")#设置参数
+                self.wechatKey_press_count = 0
+                EventMesh.publish("call_phonebook_num",1)
+            # EventMesh.publish("interup_call_event")#
+                pass
+            elif self.wechatKey_press_count == 1:#播放最后收到的语音
+                self.wechatKey_press_count = 0
+                EventMesh.publish("stop_led_timer")#设置参数
+                call_state = EventMesh.publish("get_call_state") 
+                if call_state == 0:
+                    fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+                    if fall_down != None:
+                        if fall_down != 0:
+                            EventMesh.publish_async("dial_sos_phone")#拨打sos号码
+                            return
+                else:
+                    if call_state == 2:#电话拨进需要接听
+                        EventMesh.publish("answer_call_event")#接听电话
+                        return
+                EventMesh.publish("play_wechat_last_amr")
+                # pass
+            self.wechatKey_press_count = 0
+
+
+        def pwk_press_cb(self, *args):
+            '''KEY2:联动屏幕右下角或返回键长按关机'''
+            if self.pwk_press == 1 :
+                
+                self.pwk_count += 1
+                EventMesh.debug_log("self.pwk_count {}",self.pwk_count)
+                if self.GPIO26_status == 1:#松开
+                    if self.pwk_count >= 1: #防抖100ms
+                        self.__pwk_timer.stop()
+                        self.pwk_count = 0
+                        self.pwk_press = 0
+                        EventMesh.debug_log("self.GPIO22_status")
+
+                if self.pwk_count > (self.__PowerDownTimeOut//100): #长按
+                    self.__pwk_timer.stop()
+                    self.pwk_count = 0
+                    self.pwk_press = 0
+                    EventMesh.debug_log("btn8_long_press")
+
+        def __ui_callback(self, para):
+        # EventMesh.debug_log("para = {}".format(para))
+            if para == 0:
+                EventMesh.publish("done_left_to_right")
+                #EventMesh.debug_log("<-")
+            elif para == 1:
+                EventMesh.publish("done_right_to_left")
+                #EventMesh.debug_log("->")
+            elif para == 2:
+                EventMesh.publish("done_bottom_to_top")
+                #EventMesh.debug_log("^")
+            elif para == 3:
+                EventMesh.publish("done_top_to_bottom")
+                #EventMesh.debug_log("V")
+            elif para == 4:
+                EventMesh.publish("done_return")
+                #EventMesh.debug_log("return")
+            elif para == 5:
+                EventMesh.publish("done_click")
+                #EventMesh.debug_log("CLICK")
+            elif para == 6:
+                EventMesh.publish("done_press")
+                #EventMesh.debug_log("press")
+            elif (para == 6):
+                EventMesh.publish("done_error")
+                #EventMesh.debug_log("error")
+
+        def key_callback(self, l_list):
+            EventMesh.debug_log("key_callback:",str(l_list))
+            if l_list[0] == 1:
+                # 马达震动预留
+                pass
+            if (l_list[1] == 3) and (l_list[2] == 0):
+                if l_list[0] == 1:
+                    #self.pwk_press = 0
+                    EventMesh.publish("btn1_press")
+                else:
+                    pass
+                    # EventMesh.publish("btn1_press")
+
+
+
+
+        def powerKey_callback(self, status):
+            EventMesh.debug_log('==pwr:', status)# 0 1 0
+            self.powerKey_status = status
+            if self.pwk_press == 1: #按按钮时不处理
+                return
+        
+            
+                
+
+        def power_key_press_cb(self, *args):
+            pass
+            # if EventMesh.publish(constants.EVENT.GET_CONNECT) == 0:#未插卡的情况下强制关机
+                # EventMesh.publish("open_power_on", 2)#
+
+
+        def start(self):
+            self.post_processor_after_instantiation()
diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/btn_device_ec800m_d15.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/btn_device_ec800m_d15.py
new file mode 100644 (file)
index 0000000..3f31f1c
--- /dev/null
@@ -0,0 +1,4012 @@
+from common import Abstract
+import machine
+import osTimer
+from misc import PowerKey
+import EventMesh
+from machine import Pin
+from machine import ExtInt
+import constants
+import utime
+import audio
+import ql_fs
+import ujson
+import voiceCall
+from misc import Power
+
+from machine import RTC
+from queue import Queue
+import _thread
+import usys
+import sms
+
+NEW_ENABLE = 0 #1代表旧的按键功能定义 0代表新的按键功能定义
+if EventMesh.model == "D15" :
+    from led_d15 import red_green_light,green_light_fast,led_mode,open_led_red,open_led_white,close_led_red,open_led_green,close_led_green,close_led_white
+
+    motor_pin = Pin(Pin.GPIO20, Pin.OUT, Pin.PULL_PD, 0)
+
+    audio_buf = ['audio_find_haixiu', 'R_ALARM_NEW', 'R_BLOOD_SUGAR', 'R_CALL_mp3', 'R_CHARGE_FULL', 'R_CHARGE_IN', 'R_CHARGE_OUT', 'R_CUR_BATTERY_LEVEL', 'R_DRINK_ALARM', 'R_FALL_ALARM', 'R_HOME_ALARM', 'R_HSENSOR_RESULT_FAILE', 'R_HSENSOR_RESULT_HR_TITLE', 'R_HSENSOR_RESULT_OK', 'R_HSENSOR_SPO2_TITLE', 'R_HSENSOR_TEMP_TITLE', 'R_MEDICINE_ALARM', 'R_NO_SET_SOS_DIAL', 'R_NO_SET_VIDOE', 'R_NO_SIM', 'R_POWER_OFF_1', 'R_READ_STEP_0', 'R_READ_STEP_1', 'R_READ_STEP_2', 'R_READ_STEP_3', 'R_READ_STEP_4', 'R_READ_TIME_0', 'R_READ_TIME_1', 'R_READ_TIME_2', 'R_READ_TIME_3', 'R_READ_TIME_4', 'R_READ_TIME_5', 'R_READ_TIME_6', 'R_READ_TIME_7', 'R_READ_TIME_8', 'R_READ_TIME_9', 'R_READ_TIME_MIN', 'R_READ_TIME_ZHENG', 'R_RESET_ALARM', 'R_RESET_END_ALARM', 'R_SIM_CONNECT', 'R_SIM_FAILE', 'R_SLEEP_ALARM', 'R_SOS_ALERT', 'R_TSENSOR_RESULT_VALUE_DOT', 'R_UNREAD_WECHAT', 'R_VIDEO_ANSWER', 'R_VIDEO_ANSWERING', 'R_VIDEO_CALL_CONNECT', 'R_VIDEO_CALL_ENDING', 'R_VIDEO_CALL_IN', 'R_VIDEO_VOICE_IN', 'R_VIDEO_WAITING', 'R_WAKEUP_ALARM', 'R_WECHAT_RECV']
+
+
+    class call:
+        CALL_OUT = 1
+        CALL_IN = 2
+        ON_CALL = 3
+
+
+    class intervManager(Abstract):
+        def __init__(self):
+            self.timer = osTimer()
+
+            self.pwk_timer1 = osTimer()
+            self.pwk_timer2 = osTimer()
+            self.timer1 = osTimer()
+            self.sos_timer2 = osTimer()
+            self.sos_timer1 = osTimer()
+
+            self.sos_sendtime = osTimer()
+
+            self.fall_timer1 = osTimer()
+            self.fall_timer2 = osTimer()
+
+            self.alarm_timer1 = osTimer()
+
+            self.find_timer1 = osTimer()
+            self.fall_flag = 0
+
+            self.factory_timer = osTimer()
+            
+            self.restart_timer = osTimer()
+
+            self.aud = audio.Audio(0)
+            self.aud.set_pa(Pin.GPIO29)
+            self.aud.setVolume(11)
+            self.play_count = 0
+            self.count = 0
+
+            self.get_hr_state  = 0
+            self.get_spo2_state = 0
+            self.timeSec = 0
+            self.timeTempSec = 0
+
+            self.hr_value = 0
+            self.spo2_value = 0
+            self.temp_value = 0
+
+            self.usbState = 0
+
+            self.setp_old = 0
+            self.step_tmp = ""
+            self.step_num = 0
+            self.power_off = 0
+            self.call_state = 0
+
+            self.find_state = 0
+            self.FIND_timer_count = 0
+
+            self.old_hour = 0
+            self.alarm_state = 0
+            self.alarm_timer_count = 0
+            self.old_min = 0
+            self.interInfo_queue = Queue()
+            _thread.stack_size(10*1024+64)
+            _thread.start_new_thread(self.interInfo_queue_thread, ())
+            _thread.stack_size(8*1024)
+            EventMesh.subscribe("publish_message_event_interInfo",self.publish_message_event_interInfo)
+            
+
+            self.audio_event_queue = Queue()
+            _thread.stack_size(10*1024+128)
+            _thread.start_new_thread(self.audio_event_queue_thread, ())
+            _thread.stack_size(8*1024)
+            EventMesh.subscribe("publish_message_event_audio",self.publish_message_event_audio)
+
+            self.record_test = audio.Record()
+            self.record_test.gain_set(4,12)
+
+            self.timeSecond = 0
+            self.wechat_show = 0
+            self.sort_new = {}
+            self.time_min = 0
+            self.press_btn = 0
+            self.countdown_old = 0
+            self.set_unread_wechat = 0
+            self.updateTime = 0
+            
+            self.power_on_flag = 0
+
+            self.MXA_MSG = 1
+            self.wechat_recode_list = {"num":0}
+            self.wechat_num = 0
+            self.read_data = {}
+            self.volum_size = 8 
+            self.phone_num = ''
+            self.sos_phone_num = ''
+            self.msg_tmp = ""
+            self.time_count = 0
+            self.alarm_count = 0
+            self.audio_int = 0
+
+            self.hr_auto = 0
+
+            self.temp_auto = 0
+
+            self.video_count = 0
+
+            self.sos_state = 0
+
+            self.video_call_state = 0#视频通话拨进来还是拨出去的状态 1代表是正在拨进或者拨出去
+
+            self.video_call_in_mode = 0 #0是语音 1是视频通话
+            
+            check_txt = ql_fs.path_exists("/usr/static/storage_file/wechat_record.json")
+            if check_txt == True :
+                with open("/usr/static/storage_file/wechat_record.json","r") as fd:#音频文件编号
+                    self.wechat_recode_list = ujson.load(fd)
+                    if not self.wechat_recode_list:
+                        self.wechat_recode_list = {"num":0}
+                        self.wechat_num = 0
+            else:
+                self.wechat_recode_list = {"num":0}
+                with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:
+                    ujson.dump(self.wechat_recode_list,fd)         
+
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("open_power_on", self.open_power_on)#开机关机
+
+            EventMesh.subscribe("play_imei_event", self.play_imei_event)#播報imei号
+            EventMesh.subscribe("play_center_phone", self.play_center_phone)#拨打快捷号码
+            EventMesh.subscribe("play_cur_time_event", self.play_cur_time_event)#播放当前时间
+
+            EventMesh.subscribe("OPEN_FIND_WATCH", self.send_find_watch)#查找设备
+            EventMesh.subscribe("STOP_FIND_WATCH", self.stop_find_watch)#是否需要关闭查找设备
+            EventMesh.subscribe("close_timer_all", self.close_timer_all)#关闭相关定时器
+
+            EventMesh.subscribe("dial_sos_phone", self.dial_sos_phone)#长按3s拨打sos求助号码
+
+            EventMesh.subscribe("set_sim_mode", self.set_sim_mode)#sim检测
+
+            EventMesh.subscribe("close_hr_sop2", self.close_hr_sop2)#关闭健康测试
+            EventMesh.subscribe("set_manual_measure_mode", self.set_manual_measure_mode)#设置测试模式
+            EventMesh.subscribe("set_start_measure_time", self.set_start_measure_time)#设置开始测量的时间戳时间
+            EventMesh.subscribe("get_start_measure_time", self.get_start_measure_time)#获取开始测量的时间戳时间
+            EventMesh.subscribe("set_start_temp_measure_time", self.set_start_temp_measure_time)#设置体温开始测量的时间戳时间
+            EventMesh.subscribe("get_start_temp_measure_time", self.get_start_temp_measure_time)#获取体温开始测量的时间戳时间
+            EventMesh.subscribe("play_hr_value", self.play_hr_value)#播放心率数值
+            EventMesh.subscribe("play_spo2_value", self.play_spo2_value)#播放心率数值
+            EventMesh.subscribe("play_temp_value", self.play_temp_value)#播放体温数值
+
+            EventMesh.subscribe("play_sugar_value", self.play_sugar_value)#播放血糖数值
+
+            EventMesh.subscribe("play_battery_level_value", self.play_battery_level_value)
+
+
+            EventMesh.subscribe("set_usb", self.set_usb)#
+            EventMesh.subscribe("get_usb", self.get_usb)#
+
+            EventMesh.subscribe("play_cur_step_event", self.play_cur_step_event)#
+
+            EventMesh.subscribe("set_call_state", self.set_call_state)#1是 拨出去呼叫中 2是播进来 3 是正在通话中 0是无效
+            EventMesh.subscribe("get_call_state", self.get_call_state)#
+            EventMesh.subscribe("interup_call_event", self.interup_call_event)#
+            EventMesh.subscribe("answer_call_event", self.answer_call_event)#接听电话
+            EventMesh.subscribe("dialin_call_event", self.dialin_call_event)#电话拨进响铃
+            EventMesh.subscribe("dialing_out_event", self.dialing_out_event)#电话呼叫中
+            EventMesh.subscribe("call_test_event", self.call_test_event)#电话拨进响铃测试
+
+            EventMesh.subscribe("dial_out_call_center_cb", self.dial_out_call_center_cb)#电话拨出去
+            EventMesh.subscribe("sos_out_call_center_cb", self.sos_out_call_center_cb)#sos拨打
+
+            EventMesh.subscribe("close_audio_play", self.close_audio_play)#关闭音频
+
+            #视频通话
+            EventMesh.subscribe("video_call_in_event", self.video_call_in_event)#视频通话拨进中
+            EventMesh.subscribe("video_call_out_cb", self.video_call_out_cb)#视频通话拨进中
+            EventMesh.subscribe("video_waite_timer_cb", self.video_waite_timer_cb)#对方正在接听中
+
+            EventMesh.subscribe("video_answer_timer_cb", self.video_answer_timer_cb)#对方已接听
+            EventMesh.subscribe("video_answer_mode_timer_cb", self.video_answer_mode_timer_cb)#对方已接听
+
+            EventMesh.subscribe("dev_video_end_timer_cb", self.dev_video_end_timer_cb)#对方未接通挂断了
+
+            
+
+            EventMesh.subscribe("get_video_in_out_state", self.get_video_in_out_state)#获取拨进还是拨出的状态
+            EventMesh.subscribe("set_video_in_out_state", self.set_video_in_out_state)#清除标识
+            
+            
+            
+
+            EventMesh.subscribe("start_wechat_record", self.start_wechat_record)#手表开始录音
+            EventMesh.subscribe("send_wechat_record", self.send_wechat_record)#发送微聊语音文件to app
+            EventMesh.subscribe("play_wechat_last_amr", self.play_wechat_last_amr)#播放微聊语音最后一条语音文件
+            EventMesh.subscribe("get_wechat_data", self.get_wechat_data)
+            EventMesh.subscribe("set_wechat_data", self.set_wechat_data)
+            EventMesh.subscribe("play_unread_wechat_infor", self.play_unread_wechat_infor)#按键播放最近一条微聊语音
+            EventMesh.subscribe("set_unread_wechat_state", self.set_unread_wechat_state)#设置未读标识
+            EventMesh.subscribe("get_unread_wechat_state", self.get_unread_wechat_state)#获取未读标志
+            EventMesh.subscribe("get_wechat_time", self.get_wechat_time)#获取微聊时间戳
+            EventMesh.subscribe("get_wechat_state", self.get_wechat_state)#获取微聊时间戳
+
+
+            EventMesh.subscribe("get_power_on_state", self.get_power_on_state)#获取开机标识
+            EventMesh.subscribe("get_power_off_state", self.get_power_off_state)#获取关机标识
+
+            EventMesh.subscribe("play_audio_file", self.play_audio_file)#获取播放音频文件
+
+            EventMesh.subscribe("OPEN_ALARM_RING", self.send_alarm_ring)#闹钟到点响铃
+            EventMesh.subscribe("STOP_ALARM_RING", self.stop_alarm_ring)#是否需要关闭闹钟
+
+            EventMesh.subscribe("recv_wechat_audio", self.recv_wechat_audio)#
+
+
+            EventMesh.subscribe("sos_short_press", self.sos_short_press)#sos短按事件
+
+            EventMesh.subscribe("falldown_alarm_event", self.falldown_alarm_event)#跌倒报警
+
+            EventMesh.subscribe("close_falldown_alarm_event", self.close_falldown_alarm_event)#关闭跌倒报警
+
+            EventMesh.subscribe("drink_alarm_event", self.drink_alarm_event)#该喝水了
+
+            EventMesh.subscribe("medicine_alarm_event", self.medicine_alarm_event)#该吃药了
+
+            EventMesh.subscribe("wakeup_alarm_event", self.wakeup_alarm_event)#该起床了
+
+            EventMesh.subscribe("home_alarm_event", self.home_alarm_event)#该回家了
+
+            EventMesh.subscribe("sleep_alarm_event", self.sleep_alarm_event)#该睡觉了
+
+            EventMesh.subscribe("reset_alarm_event", self.reset_alarm_event)#该休息了
+
+            EventMesh.subscribe("reset_end_alarm_event", self.reset_end_alarm_event)#休息结束了
+
+            EventMesh.subscribe("get_fall_down_state", self.get_fall_down_state)#跌倒报警标识
+
+            EventMesh.subscribe("app_factory", self.app_factory)#app恢复出厂
+
+            EventMesh.subscribe("app_restart", self.app_restart)#远程重启
+
+            EventMesh.subscribe("get_sos_state_out", self.get_sos_state_out)#正在拨打sos电话
+
+            EventMesh.subscribe("set_sos_state_out", self.set_sos_state_out)#清除在拨打sos电话
+
+        def interInfo_queue_thread(self):
+            while True:
+                data = self.interInfo_queue.get()
+                #EventMesh.debug_log("interInfo_queue_thread:data = {}".format(data))
+                if data != None:
+                    try:
+                        data["func"](data["data"])
+                    except Exception as e:
+                        EventMesh.debug_log("interInfo_queue_thread:ERROR:{}".format(e))
+                        usys.print_exception(e)
+
+        def publish_message_event_interInfo(self,event,msg):
+            self.interInfo_queue.put(msg)
+
+        def publish_call_event_cb(self, *args, **kwargs):#拨打电话
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.call_timer_cb,"data":0})
+
+        def publish_video_in_event_cb(self, *args, **kwargs):#视频通话拨入
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.video_in_timer_cb,"data":0})  
+
+        def publish_video_out_event_cb(self, *args, **kwargs):#拨打视频通话
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.video_out_timer_cb,"data":0})  
+
+        def publish_resatrt_down_event_cb(self, *args, **kwargs):#重启设备
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.powe_resatrt_down_fun,"data":0})  
+        
+        def publish_power_down_event_cb(self, *args, **kwargs):#关机
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.power_down_fun,"data":0})  
+
+        def publish_find_watch_event_cb(self, *args, **kwargs):#查找设备
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.FIND_timer_cb,"data":0})  
+
+        def publish_alarm_ring_event_cb(self, *args, **kwargs):#闹钟响铃
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.Alarm_timer_cb,"data":0})  
+
+        def publish_reset_alarm_ring_event_cb(self, *args, **kwargs):#休息响铃
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.reset_alarm_event_cb,"data":0})  
+        
+        def publish_reset_end_alarm_ring_event_cb(self, *args, **kwargs):#休息结束响铃
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.reset_end_alarm_event_cb,"data":0})  
+        
+        def publish_sleep_alarm_ring_event_cb(self, *args, **kwargs):#睡觉响铃
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.sleep_alarm_event_cb,"data":0})  
+        
+        def publish_home_ring_event_cb(self, *args, **kwargs):#回家响铃
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.home_alarm_event_cb,"data":0})  
+
+        def publish_wakeup_ring_event_cb(self, *args, **kwargs):#起床响铃
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.wakeup_alarm_event_cb,"data":0})  
+
+        def publish_medicine_ring_event_cb(self, *args, **kwargs):#吃药响铃
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.medicine_alarm_event_cb,"data":0})  
+
+        def publish_drink_ring_event_cb(self, *args, **kwargs):#喝水响铃
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.drink_alarm_event_cb,"data":0})  
+
+        def publish_fall_done_ring_event_cb(self, *args, **kwargs):#跌倒提醒
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.falldown_alarm_cb,"data":0})  
+
+
+        def reset_alarm_event(self,args,msg):#该休息了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
+                self.alarm_count = 0
+                self.alarm_timer1.start(2000, 1, self.publish_reset_alarm_ring_event_cb)
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_RESET_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+        def reset_alarm_event_cb(self,args):#该休息了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
+                self.alarm_count += 1
+                if self.alarm_count >= 3:
+                    self.alarm_count = 0
+                    self.alarm_timer1.stop()
+                    return
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_RESET_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            else:
+                self.alarm_count = 0
+                self.alarm_timer1.stop()
+
+        def reset_end_alarm_event(self,args,msg):#休息结束了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
+                self.alarm_count = 0
+                self.alarm_timer1.start(2000, 1, self.reset_end_alarm_event_cb)
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_RESET_END_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+        
+        def reset_end_alarm_event_cb(self,args):#休息结束了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
+                self.alarm_count += 1
+                if self.alarm_count >= 3:
+                    self.alarm_count = 0
+                    self.alarm_timer1.stop()
+                    return
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_RESET_END_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            else:
+                self.alarm_count = 0
+                self.alarm_timer1.stop()
+        
+        def sleep_alarm_event(self,args,msg):#该睡觉了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
+                self.alarm_count = 0
+                self.alarm_timer1.start(2000, 1, self.publish_sleep_alarm_ring_event_cb)
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SLEEP_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+        def sleep_alarm_event_cb(self,args):#该睡觉了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
+                self.alarm_count += 1
+                if self.alarm_count >= 3:
+                    self.alarm_count = 0
+                    self.alarm_timer1.stop()
+                    return
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SLEEP_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            else:
+                self.alarm_count = 0
+                self.alarm_timer1.stop()
+
+
+        def home_alarm_event(self,args,msg):#该回家了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
+                self.alarm_count = 0
+                self.alarm_timer1.start(2000, 1, self.publish_home_ring_event_cb)
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HOME_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+        
+        def home_alarm_event_cb(self,args):#该回家了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
+                self.alarm_count += 1
+                if self.alarm_count >= 3:
+                    self.alarm_count = 0
+                    self.alarm_timer1.stop()
+                    return
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HOME_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            else:
+                self.alarm_count = 0
+                self.alarm_timer1.stop()
+        
+        def wakeup_alarm_event(self,args,msg):#该起床了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
+                self.alarm_count = 0
+                self.alarm_timer1.start(2000, 1, self.publish_wakeup_ring_event_cb)
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_WAKEUP_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+        
+        def wakeup_alarm_event_cb(self,args):#该起床了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
+                self.alarm_count += 1
+                if self.alarm_count >= 3:
+                    self.alarm_count = 0
+                    self.alarm_timer1.stop()
+                    return
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_WAKEUP_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            else:
+                self.alarm_count = 0
+                self.alarm_timer1.stop()
+
+
+        def medicine_alarm_event(self,args,msg):#该吃药了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
+                self.alarm_count = 0
+                self.alarm_timer1.start(2000, 1, self.publish_medicine_ring_event_cb)
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_MEDICINE_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+
+        def medicine_alarm_event_cb(self,args):#该吃药了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
+                self.alarm_count += 1
+                if self.alarm_count >= 3:
+                    self.alarm_count = 0
+                    self.alarm_timer1.stop()
+                    return
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_MEDICINE_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            else:
+                self.alarm_count = 0
+                self.alarm_timer1.stop()
+
+        def drink_alarm_event(self,args,msg):#该喝水了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
+                self.alarm_count = 0
+                self.alarm_timer1.start(2000, 1, self.publish_drink_ring_event_cb)
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_DRINK_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            
+
+
+        def drink_alarm_event_cb(self,args):#该喝水了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
+                self.alarm_count += 1# 1 2 
+                if self.alarm_count >= 3:
+                    self.alarm_count = 0
+                    self.alarm_timer1.stop()
+                    return
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_DRINK_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            else:
+                self.alarm_count = 0
+                self.alarm_timer1.stop()
+            
+        def falldown_alarm_event(self,args,msg):#跌倒报警启动中提示
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if flag == 0 and wechat_state == 0 and video_state == 0:
+                EventMesh.publish("close_timer_all")#
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_FALL_ALARM"))
+                self.time_count = 0
+                self.fall_flag = 0
+                self.fall_timer1.stop()
+                self.fall_flag = 1
+                self.fall_timer1.start(4000, 1, self.publish_fall_done_ring_event_cb)
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+
+        def falldown_alarm_cb(self,*args):
+            wechat_state = EventMesh.publish("get_wechat_state")
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+            video_state = EventMesh.publish("get_video_state")
+            if flag == 0 and self.call_state == 0 and wechat_state == 0 and video_state == 0:
+                self.time_count+=1
+                if self.time_count >= 5:
+                    self.time_count = 0
+                    self.fall_timer1.stop()
+                    EventMesh.publish_async("dial_sos_phone")#拨打sos号码
+                    return
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_FALL_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            else:
+                self.time_count = 0
+                self.fall_timer1.stop()
+        
+        def close_falldown_alarm_event(self,event,msg):#跌倒挂断挂断
+            if self.fall_flag == 1:#跌倒标志
+                self.fall_flag = 0
+                self.fall_timer1.stop()
+                self.sos_timer1.stop()
+                self.sos_timer2.stop()
+                if self.call_state != 0:
+                    self.call_state = 0
+                    voiceCall.callEnd()
+                sos_flag = EventMesh.publish("get_sos_flag")
+                if sos_flag == 1:
+                    self.call_state = 0
+                    EventMesh.publish("set_sos_state_out")
+                    EventMesh.publish("set_sos_flag",0)
+                    EventMesh.publish("set_sos_num",0)
+                    EventMesh.publish("set_hangup_mode",0)
+
+        
+
+        def send_find_watch(self, event, msg): #发送查找设备指令
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if power_off != None:
+                if power_off == 1:
+                    return
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if flag == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0: 
+                EventMesh.publish("close_timer_all")#
+                self.find_state = 1
+                self.FIND_timer_count = 0
+                self.alarm_timer1.start(3000,1,self.publish_find_watch_event_cb)
+                EventMesh.publish("set_led_time_arg",[1,1,330,led_mode.LONG_LIGHT_GREEN,2,1,led_mode.OTHER_MEASURE_MODE])#測量成功
+                # EventMesh.publish("set_led_time_arg",[1000,33000,1,led_mode.FLASH_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("audio_find_haixiu"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                EventMesh.publish("set_motor_time",[1,2,8*3,8,4])#设置马达参数
+
+        def stop_find_watch(self, event, msg): 
+            if self.find_state == 1:
+                self.find_state = 0
+                self.FIND_timer_count = 0
+                # EventMesh.publish("stop_led_timer")#设置参数
+                self.aud.stopPlayStream()  #播放声音 
+                self.alarm_timer1.stop()
+                EventMesh.publish("close_motor_infor")#关闭马达和定时器
+
+        def FIND_timer_cb(self, data):
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if flag == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
+                if self.find_state == 1:
+                    # EventMesh.debug_log("self.FIND_timer_count:{}".format(self.FIND_timer_count))
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("audio_find_haixiu"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    #EventMesh.publish("set_motor_time",[1,2,8*2,8,4])#设置马达参数
+                    self.FIND_timer_count += 1
+                    if self.FIND_timer_count > 10: #120秒30s
+                        EventMesh.publish("STOP_FIND_WATCH")
+            else:
+                self.FIND_timer_count = 0
+                self.alarm_timer1.stop()
+                
+        
+        def stop_FIND(self) :
+            self.alarm_timer1.stop()
+
+        def send_alarm_ring(self, event, msg): #发送查找设备指令
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if power_off != None:
+                if power_off == 1:
+                    return
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if flag == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0 :
+                EventMesh.publish("close_timer_all")#
+                self.alarm_state = 1
+                self.alarm_timer_count = 0
+                self.alarm_timer1.start(3000,1,self.publish_alarm_ring_event_cb)
+                # EventMesh.publish("set_led_time_arg",[1,1,330,led_mode.LONG_LIGHT_GREEN,2,1,led_mode.OTHER_MEASURE_MODE])#測量成功
+                # EventMesh.publish("set_led_time_arg",[1000,33000,1,led_mode.FLASH_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_ALARM_NEW"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+        
+        def stop_alarm_ring(self, event, msg): #停止闹钟响铃
+            if self.alarm_state == 1:
+                self.alarm_state = 0
+                self.alarm_timer_count = 0
+                # EventMesh.publish("stop_led_timer")#设置参数
+                self.aud.stopPlayStream()  #停止播放
+                self.alarm_timer1.stop()
+
+        def Alarm_timer_cb(self, data):
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if flag == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
+                if self.alarm_state == 1:
+                    # EventMesh.debug_log("self.alarm_timer_count:{}".format(self.alarm_timer_count))
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_ALARM_NEW"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    self.alarm_timer_count += 1
+                    if self.alarm_timer_count > 15: #120秒30s
+                        EventMesh.publish("STOP_ALARM_RING")
+            else:
+                self.alarm_timer_count = 0
+                self.alarm_timer1.stop()
+
+        def get_fall_down_state(self,event,msg):
+            return self.fall_flag
+
+        def sos_short_press(self,args,msg):
+            EventMesh.publish("interup_call_event")#如果在电话中强制挂断电话
+            EventMesh.publish("close_audio_play")#强制关闭音频文件播放
+            EventMesh.publish("STOP_FIND_WATCH")#停止查找设备
+            EventMesh.publish("STOP_ALARM_RING")#停止闹钟响铃
+            if NEW_ENABLE == 0:#新的按键功能定义
+                video_state = EventMesh.publish("get_video_state")
+                if video_state != 0:#视频通话打入或者接听后允许挂断视频通话
+                    EventMesh.publish("video_dev_reject_cb",2)#挂断视频通话
+                    return
+            EventMesh.publish("play_cur_time_event")#播报当前时间
+            #播报当前时间
+
+        def recv_wechat_audio(self,event,str_data):#接收微聊语音播放
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if self.call_state == 0 and self.fall_flag == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0: 
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_WECHAT_RECV"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+                EventMesh.publish("set_motor_time",[1,2,10*3,10,5])#设置马达参数
+
+
+
+        def audio_event_queue_thread(self):
+            while True:
+                data = self.audio_event_queue.get()
+                #EventMesh.debug_log("audio_event_queue:data = {}".format(data))
+                if data != None:
+                    try:
+                        data["func"](data["data"])
+                    except Exception as e:
+                        EventMesh.debug_log("audio_event_queue:ERROR:{}".format(e))
+                        usys.print_exception(e)
+        def publish_message_event_audio(self,event,msg):
+            self.audio_event_queue.put(msg)
+
+        def play_audio_file(self, *args, **kwargs):#播放音频文件
+            # EventMesh.debug_log("args",args)
+            # EventMesh.publish("publish_message_event_audio",{"func":self.play_audio_file_do,"data":args[1]})  
+            data = args[1]
+            self.play_audio_file_do(data)
+
+        def play_audio_file_do(self,data):#msg 拼接的路径文件
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            # EventMesh.debug_log("play_audio_file",data[0],data[1],open_power,power_off)#路径 str_data[1] 是否需要被打断
+            if open_power != None:
+                if open_power == 0:
+                    return
+            if power_off != None:
+                if power_off == 1:
+                    return
+            self.aud.stopPlayStream()
+            self.aud.montage_play('U:/static/audio.bin',1,data[1],data[0])
+            # EventMesh.debug_log("play_audio_file end",data[0],data[1])#路径 str_data[1] 是否需要被打断
+            
+
+
+
+
+        def powe_resatrt_down_fun(self, *args):#重启设备
+            EventMesh.publish("close_led_pin")
+            self.aud.stopPlayStream()
+            Power.powerRestart()
+
+
+        def power_down_fun(self, *args):
+            EventMesh.publish("close_led_pin")
+            self.aud.stopPlayStream()
+            Power.powerDown()
+
+
+
+        def close_audio_play(self, event, msg): #msg
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            if power_off != None:
+                if power_off == 1:
+                    return
+            self.aud.stopPlayStream()
+
+
+
+        def close_timer_all(self, event, msg): 
+            # EventMesh.debug_log("close_timer_all!!!!!!!!!!!!!!!!!!!")
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            if power_off != None:
+                if power_off == 1:
+                    return
+                
+            self.aud.stopPlayStream()
+            self.timer.stop()
+            self.sos_timer2.stop()
+            self.sos_timer1.stop()
+            self.fall_flag = 0
+            self.fall_timer1.stop()
+            self.alarm_timer1.stop()
+        
+
+        def answer_call_event(self, event, msg): #
+            if self.call_state == 2:
+                sos_flag = EventMesh.publish("get_sos_flag")
+                if sos_flag == 1:
+                    self.call_state = 0
+                    EventMesh.publish("set_sos_state_out")
+                    EventMesh.publish("set_sos_flag",0)
+                    EventMesh.publish("set_sos_num",0)
+                    EventMesh.publish("set_hangup_mode",0)
+                EventMesh.publish("close_timer_all")#
+                voiceCall.callAnswer()
+
+        def set_call_state(self, event, msg): #
+            self.call_state = msg
+
+
+        def video_call_in_event(self, event, msg):#视频通话拨入
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            power_off = EventMesh.publish("get_power_off_state")#获取关机标识
+            if open_power != None and power_off != None:
+                if open_power == 0 or power_off == 1:
+                    return
+            EventMesh.publish("close_timer_all")#
+            EventMesh.publish("close_wechat_btn_timer")#
+            EventMesh.publish("set_led_time_arg",[1,2,10*2,led_mode.FLASH_LIGHT_RED,10,5,led_mode.VIDEO_MEASURE_MODE])#測量成功
+            self.video_call_state = 1
+            self.video_count=0
+            self.video_call_in_mode = msg
+            EventMesh.publish("clear_video_timer_state")
+            EventMesh.publish("set_app_dev_end_state")
+            print("voice in!!!",msg,self.video_call_in_mode)
+            if self.video_call_in_mode == 0:
+                
+                self.timer.start(2000, 1, self.publish_video_in_event_cb)
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_VOICE_IN"))
+                EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件
+            else:
+                self.timer.start(2000, 1, self.publish_video_in_event_cb)
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_CALL_IN"))
+                EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件
+            # EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+            EventMesh.publish("set_motor_time",[1,2,10*3,10,5])#设置马达参数
+        def video_in_timer_cb(self,data):
+
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            power_off = EventMesh.publish("get_power_off_state")#获取关机标识
+            if open_power != None and power_off != None:
+                if open_power == 0 or power_off == 1:
+                    return
+            
+            video_state = EventMesh.publish("get_video_state")
+            # print("video_state",video_state)
+            
+            self.video_count+=1
+            if self.video_count >= 30 or video_state == 0:#一分钟挂断视频通话
+                EventMesh.publish("video_newwork_reject_cb",None)#挂断视频通话
+                self.video_call_state = 0
+                self.video_count=0
+                self.timer.stop()
+                return
+            if video_state != 6 or self.video_call_state == 0:#视频电话呼入
+                EventMesh.publish("stop_led_timer")#设置参数
+                EventMesh.publish("close_timer_all")#
+                return
+            if self.video_call_in_mode == 0:
+                EventMesh.publish("set_led_time_arg",[1,2,10*2,led_mode.FLASH_LIGHT_RED,10,5,led_mode.VIDEO_MEASURE_MODE])#
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_VOICE_IN"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            else:
+                EventMesh.publish("set_led_time_arg",[1,2,10*2,led_mode.FLASH_LIGHT_RED,10,5,led_mode.VIDEO_MEASURE_MODE])#
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_CALL_IN"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+
+        def video_call_out_cb(self, event, msg):#视频通话拨出
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            power_off = EventMesh.publish("get_power_off_state")#获取关机标识
+            if open_power != None and power_off != None:
+                if open_power == 0 or power_off == 1:
+                    return
+            EventMesh.publish("close_timer_all")#
+            EventMesh.publish("close_wechat_btn_timer")#
+            # EventMesh.publish("set_led_time_arg",[1,2,10*10,led_mode.FLASH_LIGHT_RED,10,5,led_mode.OTHER_MEASURE_MODE])#
+            EventMesh.publish("clear_video_timer_state")
+            EventMesh.publish("set_app_dev_end_state")
+            if msg != None:
+                self.video_count = 0
+                self.video_call_state = 1
+                self.timer.start(2000, 1, self.publish_video_out_event_cb)
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_WAITING"))
+                EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件
+            else:
+                self.video_call_state = 0
+                self.video_count=0
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_VIDOE"))
+                EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件
+                pass
+        
+        def video_out_timer_cb(self,data):
+
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            power_off = EventMesh.publish("get_power_off_state")#获取关机标识
+            if open_power != None and power_off != None:
+                if open_power == 0 or power_off == 1 :
+                    return
+            video_state = EventMesh.publish("get_video_state")#加入中
+            # print("video_out_timer_cb video_state",video_state)
+            
+            self.video_count+=1
+            if self.video_count >= 30 or video_state == 0:#40s挂断视频通话 对方无响应
+                self.timer.stop()
+                EventMesh.publish("video_newwork_reject_cb",None)#挂断视频通话
+                self.video_call_state = 0
+                self.video_count = 0
+                
+                return
+            if video_state == 4 or self.video_call_state == 0:#视频电话呼出 如果接通了就不需要了
+                self.video_call_state = 0
+                self.video_count=0
+                print("video calling")
+                EventMesh.publish("stop_led_timer")#设置参数
+                EventMesh.publish("close_timer_all")#
+                return
+            
+
+            # EventMesh.publish("set_led_time_arg",[1,2,10*10,led_mode.FLASH_LIGHT_RED,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功
+            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_WAITING"))
+            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+
+        def video_waite_timer_cb(self,event,msg):#等待对方接听音频
+            print("video_waite_timer_cb 1")
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            power_off = EventMesh.publish("get_power_off_state")#获取关机标识
+            if open_power != None and power_off != None:
+                if open_power == 0 or power_off == 1 or self.video_call_state == 0:
+                    return
+            play_state = EventMesh.publish("get_audio_state")
+            if play_state == 0:
+                print("video_waite_timer_cb 2")
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_WAITING"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+        
+        
+        def video_answer_timer_cb(self,event,msg):#对方已接听可正常通话了
+            print("video_answer_timer_cb 1")
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            power_off = EventMesh.publish("get_power_off_state")#获取关机标识
+            if open_power != None and power_off != None:
+                if open_power == 0 or power_off == 1  or self.video_call_state == 0 :
+                    return
+            print("video_answer_timer_cb 2")
+            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_ANSWER"))
+            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+
+        def video_answer_mode_timer_cb(self,event,msg):#1:#正在等待对方接听中,请稍候   2:#对方已接听可正常通话 3:#正在接听中
+            # print("video_answer_mode_timer_cb 1",msg)
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            power_off = EventMesh.publish("get_power_off_state")#获取关机标识
+            if open_power != None and power_off != None:
+                if open_power == 0 or power_off == 1:
+                    return
+            # print("video_answer_mode_timer_cb 2",msg)
+            if msg == 1:#正在等待对方接听中,请稍候
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_WAITING"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            elif msg == 2:#已接通
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_ANSWER"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+                pass
+            elif msg == 3:#正在连接中...
+                if EventMesh.publish("get_audio_state") == 0:
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_ANSWERING"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+                pass
+            elif msg == 4:#对方已挂断...
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_CALL_ENDING"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+                pass
+            elif msg == 5:#对方已挂断或网络不好
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_CALL_CONNECT"))#播放音频
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+
+        def dev_video_end_timer_cb(self,event,msg):#网络不好或者对方未接通挂断了
+            self.video_call_state = 0
+            self.video_count = 0
+            print("dev_video_end_timer_cb")
+            EventMesh.publish("stop_led_timer")#设置参数
+            EventMesh.publish("close_timer_all")#
+           
+        
+        def get_video_in_out_state(self,event,msg):
+            return self.video_call_state
+        
+        def set_video_in_out_state(self,event,msg):
+            self.video_call_state = msg
+        
+
+
+        def dialin_call_event(self, event, msg):
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if power_off != None:
+                if power_off == 1:
+                    return
+            video_state = EventMesh.publish("get_video_state")
+            if video_state != 0:#视频电话呼入
+                self.call_state = 0
+                voiceCall.callEnd()
+                return
+            EventMesh.publish("close_timer_all")#
+            EventMesh.publish("close_wechat_btn_timer")#
+            EventMesh.publish("set_led_time_arg",[1,2,10*10,led_mode.FLASH_LIGHT_RED,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功
+            self.timer.start(6000, 1, self.publish_call_event_cb)
+            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CALL_mp3"))
+            EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件
+            # EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+            EventMesh.publish("set_motor_time",[1,2,10*3,10,5])#设置马达参数
+
+        def call_timer_cb(self,data):
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if power_off != None:
+                if power_off == 1:
+                    return
+            video_state = EventMesh.publish("get_video_state")
+            if video_state != 0:#视频电话呼入
+                self.call_state = 0
+                voiceCall.callEnd()
+                EventMesh.publish("stop_led_timer")#设置参数
+                EventMesh.publish("close_timer_all")#
+                return
+            if self.call_state != 2:
+                EventMesh.publish("stop_led_timer")#设置参数
+                EventMesh.publish("close_timer_all")#
+                return
+            EventMesh.publish("set_led_time_arg",[1,2,10*10,led_mode.FLASH_LIGHT_RED,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功
+            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CALL_mp3"))
+            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+        
+        def dial_out_call_center_cb(self, event, msg):#电话拨出去
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if power_off != None:
+                if power_off == 1:
+                    return
+            # EventMesh.debug_log("dial_out_call_center_cb",msg)
+            if self.call_state == 0:
+                self.phone_num = ''
+                EventMesh.publish("close_timer_all")#
+                EventMesh.publish("set_led_time_arg",[1,2,8,led_mode.FLASH_LIGHT_GREEN,8,4,led_mode.OTHER_MEASURE_MODE])#
+                if msg == None:
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_SOS_DIAL"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+                    # EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                else:
+                    self.phone_num = str(msg)
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SOS_ALERT"))
+                    EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件
+                    self.timer1.start(2000, 0, self.time_out_phone)
+
+        
+
+
+                    
+        
+        def time_out_phone(self, msg):#电话拨出去
+            voiceCall.callStart(self.phone_num)
+
+        def sos_out_call_center_cb(self, event, msg):#sos电话呼叫中
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if power_off != None:
+                if power_off == 1:
+                    return
+            self.sos_phone_num = ''
+            EventMesh.debug_log("sos_out_call_center_cb",msg)
+            if self.call_state == 0:
+                self.sos_state = 0
+                EventMesh.publish("close_timer_all")#
+                if msg == None:
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_SOS_DIAL"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+                    # EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                else:
+                    sos_state =  EventMesh.publish("get_dev_state")
+                    self.sos_state = 1
+                    tmp = 1 << 16
+                    sos_state = sos_state|tmp #第21位=1
+                    EventMesh.publish("set_dev_state",sos_state)
+
+                    EventMesh.publish(constants.EVENT.START_LOCATION,[constants.PROTOCOL.AL_SEND,sos_state]) #开始AL定位
+                    EventMesh.publish("close_timer_all")#
+                    self.sos_phone_num = msg
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SOS_ALERT"))
+                    EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件
+                    self.sos_timer1.start(2000, 0, self.sos_call_out_phone)
+                    self.sos_timer2.start(30000, 0, self.sos_time_out_phone)
+                    
+                    
+        def sos_time_out_phone(self, msg):#30s超时未打通或者信号不好则重新拨打
+            self.sos_state = 0
+            sos_flag = EventMesh.publish("get_sos_flag")
+            if sos_flag == 1:
+                if self.call_state == 0:
+                    EventMesh.publish("set_sos_state_out")
+                    EventMesh.publish("set_sos_info_call") 
+                    
+        def sos_call_out_phone(self, msg):#电话拨出去
+            voiceCall.callStart(self.sos_phone_num)
+        
+        def get_sos_state_out(self, event, msg):#正在拨打sos电话
+            return self.sos_state
+        
+        def set_sos_state_out(self, event, msg):#清除在拨打sos电话
+            self.sos_state = 0
+
+        def call_test_event(self, event, msg):
+            voiceCall.callStart(str("10086"))
+
+        def get_call_state(self, event, msg):
+            return self.call_state
+        
+        def interup_call_event(self, event, msg):#侧边金属按钮挂断来电
+            flag = EventMesh.publish("get_call_state") 
+            if flag == 2 or flag == 3:#电话通话中 或者呼叫中挂断中断
+                self.call_state = 0
+                voiceCall.callEnd()
+        
+        def dialing_out_event(self, event, msg):#侧边金属按键挂断电话呼叫中
+            flag = EventMesh.publish("get_call_state") 
+            if flag == 1 or flag == 3:#电话呼叫中 或者在正在通话中
+                self.call_state = 0
+                voiceCall.callEnd()
+                
+
+
+        def play_cur_step_event(self, event, msg): #msg 1 播放当前步数
+            flag = EventMesh.publish("get_call_state") 
+            video_state = EventMesh.publish("get_video_state")
+            if video_state != 0:
+                return
+            if flag == 0:#电话通话中 或者呼叫中挂断中断
+                if self.fall_flag == 0:
+                    EventMesh.publish("close_timer_all")#
+                step = EventMesh.publish("get_old_step_value")
+                EventMesh.debug_log("step",step)
+                self.setp_old = step
+                if step <= 10:#
+                    if step == 10:#十步
+                        str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    else:# 9步
+                        str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(step)),audio_buf.index("R_READ_STEP_4"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                elif step <= 100:#十 90
+                    if step == 100:
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_1"),audio_buf.index("R_READ_STEP_2"),\
+                            audio_buf.index("R_READ_STEP_4"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    else:
+                        step_tmp = str(step)
+                        shi_value = int(step_tmp[0])#十
+                        ge_value = int(step_tmp[1])#个
+                        if shi_value > 1:#大于19步
+                            if ge_value == 0:#9十步 70十步
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),\
+                                audio_buf.index("R_READ_STEP_4"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            else:#9十2步
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),\
+                                audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        else:#十9步
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\
+                            audio_buf.index("R_READ_STEP_4"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                elif step <= 1000:
+                    if step == 1000:#1千步
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_1"),\
+                        audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_STEP_4"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    else:
+                        step_tmp = str(step)#500
+                        bai_value = int(step_tmp[0])#百
+                        shi_value = int(step_tmp[1])#十
+                        ge_value = int(step_tmp[2])#个
+                        #101 110 1
+                        if shi_value > 0:#110
+                            if ge_value == 0:
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            else:
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),\
+                                audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        else:
+                            if shi_value == 0 and ge_value == 0:#500 600
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_STEP_4"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                pass
+                            else:
+
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\
+                                audio_buf.index("R_READ_STEP_4"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            pass
+                elif step <= 10000:#千
+                    if step == 10000:
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_1"),\
+                        audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_STEP_4"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        pass
+                    else:
+                        one_thousand = step//1000 #千
+                        one_hundred = step%1000 #百
+                        baishu = step%100 #十
+                        shishu = step%10 #个
+                        step_tmp = str(step)
+                        qian = int(step_tmp[0])#千
+                        bai_value = int(step_tmp[1])#百
+                        shi_value = int(step_tmp[2])#十
+                        ge_value = int(step_tmp[3])#个
+                        if bai_value <= 0:
+                            if shi_value <= 0:
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\
+                                audio_buf.index("R_READ_STEP_4"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            else:
+                                if ge_value == 0:#1020 1040
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                    audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                    audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                else:#1021 
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                    audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                    audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        else:
+                            if shi_value <= 0:#1109
+                                if ge_value == 0:#1110
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                    audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),
+                                    audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_STEP_4"))
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                else:
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                    audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),
+                                    audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\
+                                    audio_buf.index("R_READ_STEP_4"))
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            else:
+                                if ge_value == 0:#1110
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                    audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),
+                                    audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                    audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                else:#1117
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                    audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),
+                                    audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                    audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                        pass
+                elif step <= 100000:#万
+                            if step == 100000:#10万步
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3"),\
+                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_STEP_4"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            else:
+                                step_tmp = str(step)
+                                wang = int(step_tmp[0])#万
+                                qian = int(step_tmp[1])#千
+                                bai_value = int(step_tmp[2])#百
+                                shi_value = int(step_tmp[3])#十
+                                ge_value = int(step_tmp[4])#个
+                                if wang > 0 and qian > 0 and bai_value > 0:#11109 11111
+                                    if shi_value <= 0:#11109
+                                        if ge_value == 0:#11100
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_STEP_4"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                        else:#11108
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\
+                                            audio_buf.index("R_READ_STEP_4"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                            pass
+                                    else:
+                                        if ge_value == 0:#11110
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                            audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                        else:#11116
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                            audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                            pass
+                                elif wang > 0 and qian > 0:#11000 11010 11012 11008
+                                    if shi_value > 0:
+                                        if ge_value == 0:#11010
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                            audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                        else:#11016
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                            audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                    else:   
+                                        if ge_value == 0:#11000
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_STEP_4"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                        else:#11004
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\
+                                            audio_buf.index("R_READ_STEP_4"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                
+                                elif wang > 0:#1
+                                    if bai_value > 0:#百
+                                        if shi_value > 0:#10110
+                                            if ge_value == 0:#10150
+                                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),\
+                                                audio_buf.index("R_READ_STEP_4"))
+                                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                            else:
+                                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),\
+                                                audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))
+                                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                        else:#10108
+                                            if ge_value == 0:#10100
+                                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_STEP_4"))
+                                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                            else:#10108
+                                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\
+                                                audio_buf.index("R_READ_STEP_4"))
+                                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                    else:
+                                        if shi_value > 0:
+                                            if ge_value == 0:#10090
+                                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                                audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))
+                                                EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                            else:#10098
+                                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                                audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))
+                                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                        else:
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\
+                                            audio_buf.index("R_READ_STEP_4"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+        def set_usb(self, event, msg): #msg 1 正在充电 2充电已移出 3 充电已满 0
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if power_off != None:
+                if power_off == 1:
+                    return
+            flag = EventMesh.publish("get_call_state") 
+            video_state = EventMesh.publish("get_video_state")
+            get_hr_state = EventMesh.publish("get_hr_state")
+            get_spo2_state = EventMesh.publish("get_spo2_state")
+            get_bp_state  = EventMesh.publish("get_bp_state")
+            get_bg_state  = EventMesh.publish("get_bg_state")
+            get_temp_state  = EventMesh.publish("get_temp_state")
+            if msg == 1:
+                if get_hr_state != None and get_spo2_state != None and get_bp_state != None and get_bg_state != None and get_temp_state != None:
+                    if get_hr_state != 0:
+                        
+                        EventMesh.publish("set_hr_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 
+                        if get_hr_state == 1:
+                            EventMesh.publish("stop_led_timer")#设置参数
+                            EventMesh.publish("set_start_measure_time",0)#设置开始测量的时间戳时间
+
+                        EventMesh.debug_log("stop debug8")
+                        EventMesh.publish(constants.EVENT.STOP_HEART) 
+                    if get_spo2_state != 0:
+                        EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
+                        if get_spo2_state == 1:
+                            EventMesh.publish("stop_led_timer")#设置参数
+                        EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
+                        EventMesh.debug_log("stop debug13")
+                    if get_bp_state != 0:
+                        EventMesh.publish("set_bp_state",0)#2代表后台进入测试
+                        if get_bp_state == 1:
+                            EventMesh.publish("stop_led_timer")#设置参数
+                        EventMesh.publish(constants.EVENT.STOP_HEART)
+                        EventMesh.debug_log("stop bp debug1")
+                    if get_bg_state != 0:
+                        EventMesh.publish("set_bg_state",0)#2代表后台进入测试
+                        if get_bg_state == 1:#手动开灯关闭灯
+                            EventMesh.publish("stop_led_timer")#设置参数
+                        EventMesh.publish(constants.EVENT.STOP_HEART)
+                        EventMesh.debug_log("stop BG  debug14")
+                    if get_temp_state != 0:
+                        
+                        EventMesh.publish("set_temp_state",0)#2代表后台进入测试
+                        if get_temp_state == 1:
+                            EventMesh.publish("stop_led_timer")#设置参数
+                            EventMesh.publish("set_start_temp_measure_time",0)#
+                        EventMesh.publish(constants.EVENT.STOP_TEMP)
+                        EventMesh.debug_log("stop temp  debug14")
+            if msg == 1:
+                self.usbState = msg
+                str_buf = [1,1,10,led_mode.LONG_LIGHT_RED,4,2,led_mode.CHARGE_IN_MODE]
+                EventMesh.publish("set_led_time_arg",str_buf)#
+                if flag == 0 and self.fall_flag == 0 and video_state == 0:#电话通话中 或者呼叫中挂断中断
+                    EventMesh.publish("close_timer_all")#
+                    self.aud.stop()
+                    self.aud.play(1,1,'U:/static/R_CHARGE_IN.mp3')
+                    # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CHARGE_IN"))
+                    # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                EventMesh.debug_log("charge R_CHARGE_IN")
+                
+                
+            elif msg == 2 or msg == 0:
+                self.usbState = msg
+                EventMesh.publish("stop_led_timer")#设置参数
+                # EventMesh.publish("set_led_time_arg",[0,1000,1,led_mode.FLASH_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.CHARGE_OUT_MODE])#測量成功
+                EventMesh.publish("set_led_time_arg",[1,1,0,led_mode.FLASH_LIGHT_GREEN,4,4,led_mode.CHARGE_OUT_MODE])#測量成功
+                EventMesh.debug_log("charge R_CHARGE_OUT")
+                if flag == 0 and self.fall_flag == 0 and video_state == 0:#电话通话中 或者呼叫中挂断中断
+                    EventMesh.publish("close_timer_all")#
+                    self.aud.stop()
+                    self.aud.play(1,1,'U:/static/R_CHARGE_OUT.mp3')
+                    # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CHARGE_OUT"))
+                    # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                
+
+
+            elif msg == 3:
+                self.usbState = msg
+                EventMesh.debug_log("charge full")
+                str_buf = [1,1,10,led_mode.LONG_LIGHT_GREEN,4,2,led_mode.CHARGE_FULL_MODE]
+                EventMesh.publish("set_led_time_arg",str_buf)#
+                # if flag == 0 and self.fall_flag == 0 and video_state == 0:#电话通话中 或者呼叫中挂断中断
+                #     EventMesh.publish("close_timer_all")#
+                #     str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CHARGE_FULL"))
+                #     EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                
+
+
+        def get_usb(self, event, msg):
+            return self.usbState
+        
+
+
+        def app_factory(self,event,msg):
+            if msg != None:
+                number = str(msg)
+                sms.sendPduMsg(number, 'factory# send ok', 'UCS2')
+            ret = 0
+            ret = ql_fs.path_exists("/usr/static/storage_file")#
+            if ret == True:
+                ql_fs.rmdirs("/usr/static/storage_file")
+                ql_fs.mkdirs("/usr/static/storage_file")
+            if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:
+                EventMesh.publish(constants.PROTOCOL.DLT_SEND)
+        
+            self.factory_timer.start(6*1000,0,self.factory_cb)
+            pass
+        def factory_cb(self,*argc):
+            self.aud.stopPlayStream()
+            Power.powerRestart()
+
+        def app_restart(self,event,msg):#远程发短信重启
+            if msg != None:
+                number = str(msg)
+                sms.sendPduMsg(number, 'reset# send ok', 'UCS2')
+            self.restart_timer.start(3*1000,0,self.app_restart_cb)
+            pass
+        def app_restart_cb(self,*argc):
+            Power.powerRestart()
+
+        def open_power_on(self, event, msg): #msg 1 开机 2 关机 3 重启  4恢复出厂设置 5静音关机
+            EventMesh.publish("close_timer_all")#
+            if msg == 1:
+                EventMesh.publish("close_hr_sop2")#
+                # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_POWER_OFF_1"))
+                # EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                self.pwk_timer1.start(1000,0,self.power_on_audio_cb)
+                
+                print("open_power_on!!!!!!!\n\n\n\n")
+            elif msg == 2:
+                flag = EventMesh.publish("get_call_state") 
+                if flag != 0:#电话呼叫中
+                    self.call_state = 0
+                    voiceCall.callEnd()
+                step = EventMesh.publish("get_old_step_value")
+                # step1 = SC7A20().get_step()
+                # step1 = EventMesh.publish(constants.EVENT.GET_STEP)
+                # step2 = EventMesh.publish("get_storage_config","old_step")
+                self.read_data = EventMesh.publish("get_storage_data")
+                # EventMesh.publish("set_test_data5",[1,step,step1,step2])
+                if step != 0:
+                    EventMesh.publish("set_storage_config",["old_step",step])
+                date_tmp = utime.localtime()
+                time_tmp = utime.mktime(date_tmp)
+                # step3 = EventMesh.publish("get_old_step_value")
+                # step4 = SC7A20().get_step()
+                # step4 = EventMesh.publish(constants.EVENT.GET_STEP)
+                # step5 = EventMesh.publish("get_storage_config","old_step")
+                # EventMesh.publish("set_test_data6",[1,step3,step4,step5])
+                EventMesh.publish("set_storage_config",["old_time",time_tmp])#关机保存一个是时间
+                EventMesh.publish("set_storage_config",["power_state",0])
+                # self.pwk_timer1.start(3000,0,self.power_off_audio_cb)
+                EventMesh.publish("close_hr_sop2")#
+                # EventMesh.debug_log("power_off_audio_cb")
+                self.aud.stop()
+                self.aud.play(1,0,'U:/static/R_POWER_OFF_1.mp3')
+                # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_POWER_OFF_1"))
+                # EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                EventMesh.publish("set_led_time_arg",[1,2,6*8,led_mode.FLASH_LIGHT_RED,6,3,led_mode.POWER_OFF_MODE])#
+                self.power_off = 1
+                self.pwk_timer2.start(6000,0,self.publish_power_down_event_cb)
+            elif msg == 3:
+                flag = EventMesh.publish("get_call_state") 
+                if flag != 0:#电话呼叫中
+                    self.call_state = 0
+                    voiceCall.callEnd()
+                EventMesh.publish("close_hr_sop2")#
+                self.aud.stop()
+                self.aud.play(1,0,'U:/static/R_POWER_OFF_1.mp3')
+                # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_POWER_OFF_1"))
+                # EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                EventMesh.publish("stop_led_timer")#设置参数
+                self.power_off = 1
+                self.timer.start(8000,0,self.publish_resatrt_down_event_cb)
+                #EventMesh.publish("set_led_time_arg",[3000,4000,1,led_mode.LONG_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE])#
+            elif msg == 4:
+                flag = EventMesh.publish("get_call_state") 
+                if flag != 0:#电话呼叫中
+                    self.call_state = 0
+                    voiceCall.callEnd()
+                EventMesh.publish("close_hr_sop2")#
+                EventMesh.publish("stop_led_timer")#设置参数
+                self.power_off = 1
+                ret = 0
+                ret = ql_fs.path_exists("/usr/static/storage_file")#
+                if ret == True:
+                    ql_fs.rmdirs("/usr/static/storage_file")
+                    ql_fs.mkdirs("/usr/static/storage_file")
+                if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:
+                    EventMesh.publish(constants.PROTOCOL.DLT_SEND)
+                self.aud.stopPlayStream()
+                self.timer.start(6*1000,0,self.fun)
+            elif msg == 5:
+                flag = EventMesh.publish("get_call_state") 
+                if flag != 0:#电话呼叫中
+                    self.call_state = 0
+                    voiceCall.callEnd()
+                step = EventMesh.publish("get_old_step_value")
+                # step1 = SC7A20().get_step()
+                # step1 = EventMesh.publish(constants.EVENT.GET_STEP)
+                # step2 = EventMesh.publish("get_storage_config","old_step")
+                self.read_data = EventMesh.publish("get_storage_data")
+                # EventMesh.publish("set_test_data7",[1,step,step1,step2])
+                if step != 0:
+                    EventMesh.publish("set_storage_config",["old_step",step])
+
+                # step3 = EventMesh.publish("get_old_step_value")
+                # step4 = SC7A20().get_step()
+                # step4 = EventMesh.publish(constants.EVENT.GET_STEP)
+                # step5 = EventMesh.publish("get_storage_config","old_step")
+                # EventMesh.publish("set_test_data8",[1,step3,step4,step5])
+                date_tmp = utime.localtime()
+                time_tmp = utime.mktime(date_tmp)
+                EventMesh.publish("set_storage_config",["old_time",time_tmp])#关机保存一个是时间
+                EventMesh.publish("set_storage_config",["power_state",1])
+                
+                EventMesh.publish("close_hr_sop2")#
+                EventMesh.publish("set_led_time_arg",[1,2,6*8,led_mode.FLASH_LIGHT_RED,6,3,led_mode.POWER_OFF_MODE])#
+                self.power_off = 1
+                self.pwk_timer2.start(6000,0,self.publish_power_down_event_cb)
+                # self.pwk_timer1.start(3000,0,self.power_off_no_audio_cb)#不需要关机铃声
+
+
+
+        def fun(self,*argc):
+            self.aud.stopPlayStream()
+            Power.powerRestart()
+            
+
+        def power_on_cb(self, msg): #msg 开机标识
+            self.power_on_flag = 1
+        def clear_power_on_cb(self, msg): #msg 开机标识
+            self.power_on_flag = 0
+        
+        def power_on_audio_cb(self, msg):
+            self.power_on_flag = 1
+            # EventMesh.debug_log("power_on_audio_cb")
+            power_state = EventMesh.publish("get_storage_config","power_state")
+            #EventMesh.publish("set_motor_time",[1,2,10*2,10,5])#设置马达参数
+            if power_state == None:
+                power_state = 0
+            # print("power_state",power_state)
+            if power_state <= 0:
+                self.aud.stop()
+                self.aud.play(1,1,'U:/static/R_POWER_OFF_1.mp3')
+            # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_POWER_OFF_1"))
+            # EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+            EventMesh.publish("set_led_time_arg",[1,2,6*8,led_mode.FLASH_LIGHT_GREEN,6,3,led_mode.OTHER_MEASURE_MODE])#測量成功
+            # EventMesh.publish("set_led_time_arg",[1000,200,10,led_mode.FLASH_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数
+            self.power_on_flag = 0
+            self.pwk_timer2.start(5000,0,self.power_on_cb)
+
+        def get_power_on_state(self, event, msg):
+            return self.power_on_flag
+        
+        def power_off_audio_cb(self, msg):
+            # EventMesh.debug_log("power_off_audio_cb")
+            self.aud.stop()
+            self.aud.play(1,0,'U:/static/R_POWER_OFF_1.mp3')
+            # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_POWER_OFF_1"))
+            # EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+            EventMesh.publish("set_led_time_arg",[1,2,6*8,led_mode.FLASH_LIGHT_RED,6,3,led_mode.POWER_OFF_MODE])#
+            self.power_off = 1
+            self.pwk_timer2.start(6000,0,self.publish_power_down_event_cb)
+        
+        def power_off_no_audio_cb(self, msg):
+            EventMesh.debug_log("power_off_no_audio_cb")
+            EventMesh.publish("set_led_time_arg",[1,2,6*8,led_mode.FLASH_LIGHT_RED,6,3,led_mode.POWER_OFF_MODE])#
+            self.power_off = 1
+            self.pwk_timer2.start(6000,0,self.publish_power_down_event_cb)
+
+        def set_power_off_cb(self, msg):
+            self.power_off = 1
+
+        def get_power_off_state(self, event, msg):
+            return self.power_off
+
+        def close_hr_sop2(self, event, msg): #msg 关闭心率血氧体温测试
+            get_hr_state = EventMesh.publish("get_hr_state")
+            get_spo2_state = EventMesh.publish("get_spo2_state")
+            get_temp_state = EventMesh.publish("get_temp_state")
+            get_bg_state = EventMesh.publish("get_bg_state")
+            get_bp_state = EventMesh.publish("get_bp_state")
+            if get_hr_state != None and get_spo2_state != None and get_temp_state != None and get_bg_state != None and get_bp_state != None:
+                if get_hr_state != 0:
+                    EventMesh.publish("set_hr_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 
+                    EventMesh.debug_log("sstop hr")
+                    EventMesh.publish(constants.EVENT.STOP_HEART) 
+                if get_spo2_state != 0 :
+                    EventMesh.debug_log("stop spo2")
+                    EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
+                    EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
+                if get_temp_state != 0:
+                    EventMesh.debug_log("stop temp")
+                    EventMesh.publish("set_temp_state",0)
+                    EventMesh.publish(constants.EVENT.STOP_TEMP)#手动体温测试
+                if  get_bg_state != 0:
+                    EventMesh.publish("set_bg_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 
+                    EventMesh.debug_log("sstop bg")
+                    EventMesh.publish(constants.EVENT.STOP_HEART) 
+
+                if  get_bp_state != 0:
+                    EventMesh.publish("set_bp_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 
+                    EventMesh.debug_log("sstop bp")
+                    EventMesh.publish(constants.EVENT.STOP_HEART) 
+
+        def set_manual_measure_mode(self, event, msg): #手动测试 1心率 2 血氧 3 体温
+            get_hr_state = EventMesh.publish("get_hr_state")
+            get_spo2_state = EventMesh.publish("get_spo2_state")
+            get_temp_state = EventMesh.publish("get_temp_state")
+            if msg == 1:
+                if get_hr_state != 1:#不是手动测试直接打断
+                    EventMesh.debug_log("set_manual_measure_mode",msg)
+                    EventMesh.publish("set_spo2_state",0)
+                    EventMesh.publish("set_bg_state",0)
+                    EventMesh.publish("set_bp_state",0)
+                    
+                    EventMesh.publish("set_hr_state",1)
+                    EventMesh.publish("clear_manual_hr_flag")
+                    EventMesh.publish("set_start_measure_time",1)#设置开始测量的时间戳时间
+                    EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN) #停止测试血氧
+                    EventMesh.publish("set_hr_blood_led",1)
+                    EventMesh.publish(constants.EVENT.START_HEART) #手动心率测试
+            elif msg == 2:
+                if get_hr_state == 0:
+                    if get_spo2_state != 1:
+                        EventMesh.debug_log("set_manual_measure_mode",msg)
+                        EventMesh.publish("set_spo2_state",1)
+                        EventMesh.publish("set_start_measure_time",1)#设置开始测量的时间戳时间
+                        EventMesh.publish("set_hr_blood_led",1)
+                        EventMesh.publish(constants.EVENT.START_BLOOD_OXYGEN) #手动血氧测试
+            elif msg == 3:
+                if get_temp_state != 1:
+                    EventMesh.debug_log("set_manual_measure_mode",msg)
+                    EventMesh.publish("clear_manual_temp_flag")
+                    EventMesh.publish("set_temp_state",1)
+                    EventMesh.publish("set_start_temp_measure_time",1)#设置开始测量的时间戳时间
+                    EventMesh.publish("set_hr_blood_led",1)
+                    EventMesh.publish(constants.EVENT.START_TEMP)#手动体温测试
+            pass
+
+
+        def set_start_measure_time(self, event, msg): #手动测试 1心
+            self.hr_auto = msg
+            pass
+
+        def get_start_measure_time(self, event, msg): #手动测试 
+
+            return  self.hr_auto
+        
+        def set_start_temp_measure_time(self, event, msg): #
+            self.temp_auto = msg
+            pass
+
+        def get_start_temp_measure_time(self, event, msg): #
+            return self.temp_auto
+
+        def mearsure_cb(self, event, msg):
+            if msg == 1:
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+            elif msg == 2:
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) 
+            elif msg == 3:
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_SPO2_TITLE"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) 
+            elif msg == 4:
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) 
+            
+            
+            
+        def play_temp_value(self, event, msg): #播放体温数值
+            video_state = EventMesh.publish("get_video_state")
+            flag = EventMesh.publish("get_call_state") 
+            if msg != None:
+                if flag == 0 and self.fall_flag == 0 and video_state == 0:
+                    EventMesh.publish("close_timer_all")#
+                    if msg > 0:
+                        # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))
+                        # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        EventMesh.publish("set_hr_blood_led",2)#测量成功
+                        self.temp_value = msg
+                        # self.timer.start(2*1000,1,self.play_temp_fun)
+                        self.play_temp_fun(0)
+                    else:
+                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        EventMesh.publish("set_hr_blood_led",3)#测量异常
+                else:
+                    EventMesh.publish("set_hr_blood_led",3)#测量异常
+
+        def play_temp_fun(self,argc): #播放体温数值
+            data = self.temp_value
+            if data > 42:
+                data = 42
+            data_tmp = str(data)
+            if data_tmp.find(".") != -1:
+                temp_shi = int(data_tmp.split('.')[0])//10
+                temp_ge = int(data_tmp.split('.')[0])%10
+                dot_ge = int(data_tmp.split('.')[1][:1])
+                if temp_ge > 0:#37.0
+                    if dot_ge > 0:#37.5
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\
+                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(temp_ge)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),\
+                        audio_buf.index("R_READ_TIME_{}".format(dot_ge)))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                    else:#37.0
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\
+                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(temp_ge)))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                else:#30.0 30.6
+                    if dot_ge > 0:
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\
+                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(dot_ge)))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    else:
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\
+                        audio_buf.index("R_READ_STEP_3"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+            else:
+                temp_shi = int(data_tmp)//10
+                temp_ge = int(data_tmp)%10
+
+                if temp_ge > 0:#45
+                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\
+                    audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(temp_ge)))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                else:
+                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\
+                    audio_buf.index("R_READ_STEP_3"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            
+
+        def play_hr_value(self, event, msg): #播放心率数值
+            video_state = EventMesh.publish("get_video_state")
+            flag = EventMesh.publish("get_call_state") 
+            if msg != None:
+                if flag == 0 and self.fall_flag == 0 and video_state == 0:
+                    EventMesh.publish("close_timer_all")#
+                    if msg >= 50:
+                        # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))
+                        # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        self.hr_value = msg
+                        EventMesh.publish("set_hr_blood_led",2)#测量成功
+                        # self.timer.start(2*1000,1,self.play_hr_fun)
+                        self.play_hr_fun(0)
+                    else:
+                        str_data ='mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        EventMesh.publish("set_hr_blood_led",3)#测量异常
+                else:
+                    EventMesh.publish("set_hr_blood_led",3)#测量异常
+
+        def play_hr_fun(self,argc):#播放心率测试值
+            video_state = EventMesh.publish("get_video_state")
+            flag = EventMesh.publish("get_call_state") 
+            
+            if flag == 0 and self.fall_flag == 0 and video_state == 0:#电话通话中 或者呼叫中挂断中断
+                EventMesh.publish("close_timer_all")#
+                data = self.hr_value
+                if data > 220:
+                    data = 220
+                if data < 100:
+                    if data%10 == 0:
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\
+                        audio_buf.index("R_READ_STEP_3"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    else:
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\
+                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(data%10)))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                else: 
+                    shi = (data%100)//10 #210
+                    ge = (data%100)%10
+                    #210 234
+                    if shi > 0:
+                        if ge == 0:#210 230 120
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//100)),\
+                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi)),audio_buf.index("R_READ_STEP_3"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        else:
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//100)),\
+                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi)),audio_buf.index("R_READ_STEP_3"),\
+                            audio_buf.index("R_READ_TIME_{}".format(ge)))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    else:
+                        if ge == 0:#200 100 209 108
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//100)),\
+                            audio_buf.index("R_READ_STEP_2"))
+                            EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        else:
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//100)),\
+                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge)))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+
+        def play_battery_level_value(self, event, msg): #播放当前电量
+            flag = EventMesh.publish("get_call_state") 
+            video_state = EventMesh.publish("get_video_state")
+            if flag == 0 and self.fall_flag == 0 and video_state == 0 :#电话通话中 或者呼叫中挂断中断
+                EventMesh.publish("close_timer_all")#
+                battery = EventMesh.publish("screen_get_battery")
+                print("cur level",battery)
+                level = 100
+                if battery == None:
+                    level = 100
+                else:
+                    level = battery[1]
+                
+                data = level
+                if data > 100:
+                    data = 100
+                if data == 100:
+                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_CUR_BATTERY_LEVEL"),audio_buf.index("R_READ_TIME_1"),\
+                    audio_buf.index("R_READ_STEP_2"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    return
+                if data > 10:
+                    if data%10 == 0:
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_CUR_BATTERY_LEVEL"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\
+                        audio_buf.index("R_READ_STEP_3"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    else:
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_CUR_BATTERY_LEVEL"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\
+                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(data%10)))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                else:
+                    if data == 10:
+                        str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_CUR_BATTERY_LEVEL"),audio_buf.index("R_READ_STEP_3"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    else :
+                        str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_CUR_BATTERY_LEVEL"),audio_buf.index("R_READ_TIME_{}".format(data)))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+
+
+
+        def play_sugar_value(self, event, msg): #播放血糖数值
+            video_state = EventMesh.publish("get_video_state")
+            flag = EventMesh.publish("get_call_state") 
+            if msg != None:
+                if flag == 0 and self.fall_flag == 0 and video_state == 0:
+                    EventMesh.publish("close_timer_all")#
+                    if msg != 0:
+                        # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))
+                        # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        EventMesh.publish("set_hr_blood_led",2)#测量成功
+                        # self.timer.start(2*1000,1,self.play_spo2_fun)
+                        self.play_sugar_fun(msg)
+                    else:
+                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        EventMesh.publish("set_hr_blood_led",3)#测量异常
+                else:
+                    EventMesh.publish("set_hr_blood_led",3)#测量异常
+
+        def play_sugar_fun(self,argc):#播放血糖测试值
+            flag = EventMesh.publish("get_call_state") 
+            video_state = EventMesh.publish("get_video_state")
+            if flag == 0 and self.fall_flag == 0 and video_state == 0:#电话通话中 或者呼叫中挂断中断
+                EventMesh.publish("close_timer_all")#
+                data = str(argc)
+                data_shi = 0
+                data_ge = 0
+                if data.find(".") != -1:
+                    data_shi = int(data.split(".")[0])
+                    data_ge = int(data.split(".")[1])
+                else:
+                    data_shi = int(data)
+                    data_ge = 0
+
+                if data_shi != 0 and data_ge != 0:
+                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_BLOOD_SUGAR"),audio_buf.index("R_READ_TIME_{}".format(data_shi)),\
+                    audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(data_ge)))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+            else:
+                EventMesh.publish("set_hr_blood_led",3)#测量异常
+
+
+
+        def play_spo2_value(self, event, msg): #播放血样数值
+            flag = EventMesh.publish("get_call_state") 
+            video_state = EventMesh.publish("get_video_state")
+            if msg != None:
+                if flag == 0 and self.fall_flag == 0 and video_state == 0:
+                    EventMesh.publish("close_timer_all")#
+                    if msg >= 85:
+                        # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))
+                        # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        EventMesh.publish("set_hr_blood_led",2)#测量成功
+                        self.spo2_value = msg
+                        # self.timer.start(2*1000,1,self.play_spo2_fun)
+                        self.play_spo2_fun(0)
+                    else:
+                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        EventMesh.publish("set_hr_blood_led",3)#测量异常
+                else:
+                    EventMesh.publish("set_hr_blood_led",3)#测量异常
+
+        def play_spo2_fun(self,argc):#播放血氧测试值
+            flag = EventMesh.publish("get_call_state") 
+            
+            if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断
+                EventMesh.publish("close_timer_all")#
+                data = self.spo2_value
+                if data > 100:
+                    data = 100
+                if data == 100:
+                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_SPO2_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\
+                    audio_buf.index("R_READ_STEP_2"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                else:
+                    if data % 10 == 0:
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_SPO2_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\
+                        audio_buf.index("R_READ_STEP_3"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        pass
+                    else:
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_SPO2_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\
+                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(data%10)))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+
+        def set_sim_mode(self, event, msg): #mode 1 蓝灯闪烁 可识别卡 但未联网 2 可绑定appsim正常 3 手表不识别卡或者未插卡
+            flag = EventMesh.publish("get_call_state") 
+            video_state = EventMesh.publish("get_video_state")
+            if flag == 0 and self.fall_flag == 0 and video_state == 0 :#电话通话中 或者呼叫中挂断中断
+                EventMesh.publish("close_timer_all")#
+                # EventMesh.publish("stop_led_timer")#设置参数
+                mode = 0
+                signal = EventMesh.publish("get_sim_Status")
+                if signal != None:
+                    if signal == 1:#有卡 
+                        if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网提示关机
+                            mode = 2
+                        else:
+                            mode = 1
+                    else:#未插卡
+                        mode = 3
+                if mode == 1:#白色灯
+                    EventMesh.publish("set_led_time_arg",[1,2,10,led_mode.FLASH_LIGHT_WHITE,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功
+                    # EventMesh.publish("set_led_time_arg",[1000,400,1,led_mode.FLASH_LIGHT_WHITE,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SIM_FAILE"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    pass
+                elif mode == 2:#蓝灯色灯
+                    EventMesh.publish("set_led_time_arg",[1,2,10,led_mode.FLASH_LIGHT_GREEN,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功
+                    # EventMesh.publish("set_led_time_arg",[1000,400,1,led_mode.FLASH_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SIM_CONNECT"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    pass
+                elif mode == 3:#红灯闪烁
+                    EventMesh.publish("set_led_time_arg",[1,2,10,led_mode.FLASH_LIGHT_RED,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SIM"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                pass
+            
+        def dial_sos_phone(self, event, msg): #拨打紧急求助电话
+            flag = EventMesh.publish("get_call_state")
+            video_state = EventMesh.publish("get_video_state")
+            if flag == 0 and video_state == 0:
+            
+                signal = EventMesh.publish("screen_get_sig")
+                if signal != None:
+                    if signal >= 0 and signal <= 31:#有卡 
+                        if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网提示关机
+                            sos_number = EventMesh.publish("get_dial_sos_number")
+                            if sos_number != None:
+                                if len(sos_number) != 0:
+                                    EventMesh.publish("close_timer_all")#
+                                    EventMesh.publish("set_sos_flag",1)
+                                        
+                                else:#未设置sos紧急求助号码
+                                    EventMesh.publish("close_timer_all")#
+                                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_SOS_DIAL"))
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                    pass
+                        else:
+                            EventMesh.publish("close_timer_all")#
+                            EventMesh.publish("set_led_time_arg",[1,2,10,led_mode.FLASH_LIGHT_WHITE,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功
+                            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SIM_FAILE"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    else:#未插卡
+                        EventMesh.publish("close_timer_all")#
+                        EventMesh.publish("set_led_time_arg",[1,2,10,led_mode.FLASH_LIGHT_RED,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功
+                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SIM"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+        
+        def play_cur_time_event(self, event, msg): #播放当前时间
+            flag = EventMesh.publish("get_call_state") 
+            video_state = EventMesh.publish("get_video_state")
+            if flag == 0 and self.fall_flag == 0 and video_state == 0:#电话通话中 或者呼叫中挂断中断
+                EventMesh.publish("close_timer_all")#
+                
+                data = RTC().datetime()
+                hour = data[4]
+                min = data[5]
+                # EventMesh.debug_log("hour",hour,min)
+                self.old_hour = hour
+                self.old_min = min
+                if self.old_hour == 0:
+                    if self.old_min <= 9:#00:09
+                        if self.old_min == 0:#0点整
+                            str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_0")\
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        else:#0点09分
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_0")\
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(self.old_min))\
+                            ,audio_buf.index("R_READ_TIME_MIN"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            pass
+
+                    else:
+                        if self.old_min % 10 == 0:#0点2十分 0点3十分
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_0")\
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min // 10))\
+                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            pass
+                        else:#0点2十8分
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_0")\
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min // 10))\
+                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(self.old_min % 10)),audio_buf.index("R_READ_TIME_MIN"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            pass
+
+                elif self.old_hour <= 9:#8:09 9:20 9:45
+                    if self.old_min <= 9:#9点09分
+                        if self.old_min <= 0:
+                            str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(self.old_hour))\
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            pass
+                        else:
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(self.old_hour))\
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(self.old_min))\
+                            ,audio_buf.index("R_READ_TIME_MIN"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                    else:
+                        if self.old_min % 10 == 0:#9点2十分 9点4十分
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(self.old_hour))\
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min //10))\
+                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        else:#9点2十4分
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(self.old_hour))\
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min //10))\
+                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(self.old_min % 10)),audio_buf.index("R_READ_TIME_MIN"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+
+                else:#12:0
+                    if self.old_min == 0:#12:00 13:00 15:00 20 10 11 12 13 14 15
+                        self.play_count+=1
+                        hour_shi = self.old_hour//10
+                        hour_ge = self.old_hour%10
+                        if self.old_hour == 10:#十点整
+                            str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                        elif self.old_hour == 20:
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                        else:
+                            if hour_shi <= 1:#十3点整
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\
+                                ,audio_buf.index("R_READ_TIME_{}".format(hour_ge)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                            else:
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                                ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(hour_ge)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                    else:
+                        if self.old_hour == 10:#10:09 10:10
+                            if self.old_min <= 9:
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\
+                                ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_0")\
+                                ,audio_buf.index("R_READ_TIME_{}".format(self.old_min)),audio_buf.index("R_READ_TIME_MIN"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            else:
+                                if self.old_min % 10 == 0:#十点2十分
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\
+                                    ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min//10))\
+                                    ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN"))
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                else:#十点2十1分
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\
+                                    ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min//10))\
+                                    ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(self.old_min%10))\
+                                    ,audio_buf.index("R_READ_TIME_MIN"))
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                        else:
+                            if self.old_hour < 20:#19:00
+                                if self.old_min <= 9:#19:09 
+                                    if self.old_min == 0:
+                                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_hour % 10)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))
+                                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                        pass
+                                    else:
+                                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_hour % 10)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT")\
+                                        ,audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(self.old_min % 10))\
+                                        ,audio_buf.index("R_READ_TIME_MIN"))
+                                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                    
+                                else:#19:18 19:40 19:56
+                                    if self.old_min % 10 == 0:#十9点2十分 十9点3十分
+                                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_hour % 10)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT")\
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_min // 10)),audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN"))
+                                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                    else:#十9点2十1分
+                                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_hour % 10)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT")\
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_min // 10)),audio_buf.index("R_READ_STEP_3")\
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_min % 10)),audio_buf.index("R_READ_TIME_MIN"))
+                                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                            else:
+                                hour_shi = self.old_hour//10
+                                hour_ge = self.old_hour%10
+
+                                min_shi = self.old_min//10
+                                min_ge = self.old_min%10
+
+                                #20:08 20:18  20:20
+                                if hour_ge == 0:
+                                    if self.old_min <= 9:
+                                        if self.old_min == 0:
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                            pass
+                                        else:
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_0")\
+                                            ,audio_buf.index("R_READ_TIME_{}".format(min_ge)),audio_buf.index("R_READ_TIME_MIN"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                                    else:
+                                        if min_ge == 0:#2十点2十分
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(min_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                        else:#2十点2十1分
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(min_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(min_ge)),audio_buf.index("R_READ_TIME_MIN"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                                else:#21:08 21:18
+                                    if self.old_min <= 9:
+                                        if self.old_min == 0:
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(hour_ge))\
+                                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                            pass
+                                        else:
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(hour_ge))\
+                                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_0")\
+                                            ,audio_buf.index("R_READ_TIME_{}".format(min_ge)),audio_buf.index("R_READ_TIME_MIN"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                    else:
+                                        if min_ge == 0:#2十3点3十分
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(hour_ge))\
+                                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(min_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                        else:#2十3点3十1分
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(hour_ge))\
+                                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(min_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(min_ge)),audio_buf.index("R_READ_TIME_MIN"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+
+        def play_timer_cb_1(self,*agrs):
+            return
+
+        def play_center_phone(self, event, msg): #msg
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许设备再次拨出
+            video_state = EventMesh.publish("get_video_state")
+            if flag == 0 and self.fall_flag == 0 and video_state == 0:
+                EventMesh.publish("close_timer_all")#
+            
+                center_dial = EventMesh.publish("get_storage_config","center_dial")
+                if center_dial != None:
+                    if len(center_dial) > 0:
+                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SOS_ALERT"))
+                        EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        voiceCall.callStart(str(center_dial))
+                        
+                    
+                else:#未设置号码
+                    # EventMesh.debug_log("play_center_phone")
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_SOS_DIAL"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    pass
+        def center_phone_cb(self,*argc): #msg
+            pass
+
+
+
+
+        def play_imei_event(self, event, msg): #msg
+            flag = EventMesh.publish("get_call_state") 
+            video_state = EventMesh.publish("get_video_state")
+            if flag == 0 and self.fall_flag == 0 and video_state == 0:
+                EventMesh.publish("close_timer_all")#
+                imei = EventMesh.publish(constants.EVENT.GET_IMEI)
+                EventMesh.debug_log(imei)
+                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(imei[0]))\
+                ,audio_buf.index("R_READ_TIME_{}".format(imei[1])),audio_buf.index("R_READ_TIME_{}".format(imei[2])),audio_buf.index("R_READ_TIME_{}".format(imei[3])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[4])),audio_buf.index("R_READ_TIME_{}".format(imei[5])),audio_buf.index("R_READ_TIME_{}".format(imei[6])),audio_buf.index("R_READ_TIME_{}".format(imei[7])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[8])),audio_buf.index("R_READ_TIME_{}".format(imei[9])),audio_buf.index("R_READ_TIME_{}".format(imei[10])),audio_buf.index("R_READ_TIME_{}".format(imei[11])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[12])),audio_buf.index("R_READ_TIME_{}".format(imei[13])),audio_buf.index("R_READ_TIME_{}".format(imei[14])))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                str_data = 'mp3files=R_READ_TIME_1.mp3+R_READ_TIME_2.mp3+R_READ_TIME_3.mp3+R_READ_TIME_4.mp3+R_READ_TIME_5.mp3+R_READ_TIME_6.mp3+R_READ_TIME_7.mp3+R_READ_TIME_8.mp3+R_READ_TIME_9.mp3+R_READ_TIME_0.mp3+R_READ_TIME_1.mp3+R_READ_TIME_1.mp3+R_READ_TIME_2.mp3+R_READ_TIME_3.mp3+R_READ_TIME_4.mp3'
+                
+        def get_unread_wechat_state(self,event, msg): 
+
+            return self.set_unread_wechat
+        
+        def set_unread_wechat_state(self, event, msg): 
+            self.set_unread_wechat = msg
+
+        def get_wechat_data(self,event, msg): 
+
+            return [self.MXA_MSG ,self.wechat_recode_list]
+        
+        def set_wechat_data(self, event, msg): 
+            # EventMesh.debug_log("set_wechat_data1 ",msg,self.wechat_num)
+            self.MXA_MSG = msg[0]
+            self.wechat_recode_list = msg[1]
+            self.wechat_num = self.wechat_recode_list["num"]
+            with open("/usr/static/storage_file/wechat_record.json","w",encoding="utf-8") as fd:
+                ujson.dump(self.wechat_recode_list,fd)
+                #写编号
+            # EventMesh.debug_log("set_wechat_data2:{} ".format(self.wechat_num))
+        
+
+        def get_wechat_time(self, event, msg):
+            return  [self.press_btn,self.timeSecond]
+
+        def start_wechat_record(self, event, msg): #开始录音相关配置
+            if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网不需要录音
+                flag = EventMesh.publish("get_call_state") 
+                video_state = EventMesh.publish("get_video_state")
+                if flag == 0 and self.fall_flag == 0 and video_state == 0:
+                    if self.press_btn == 0:
+                        self.press_btn = 1
+                        audio_state = EventMesh.publish("get_audio_state")
+                        if audio_state == 1:
+                            self.aud.stop()
+                        EventMesh.publish("close_timer_all")#
+                        EventMesh.publish("set_led_time_arg",[1,1,160,led_mode.LONG_LIGHT_GREEN,4,2,led_mode.WECHAT_LED_MODE])#測量成功
+                        # EventMesh.publish("set_led_time_arg",[1000,1000,1,led_mode.LONG_LIGHT_GREEN,led_mode.OPEN_LONG_LIGHT_MODE,led_mode.WECHAT_LED_MODE])#測量成功
+                    
+                        date_tmp = utime.localtime()
+                        time_tmp = utime.mktime(date_tmp)
+                        self.timeSecond = time_tmp#保存按下的时间长s
+                        self.aud.setVolume(11)#设置音量最大
+                        
+                        EventMesh.debug_log("talking1.0")
+                        # if self.wechat_num >= self.MXA_MSG:
+                        #     self.wechat_num = 0 
+                        # self.wechat_num += 1
+                        # self.wechat_show = self.wechat_num
+                        # self.record_test.start("/usr/static/storage_file/{}.amr".format(self.wechat_show),16) 
+                        self.record_test.start("/usr/static/storage_file/wechat.amr",16) 
+                
+            else:
+                self.timeSecond = 0
+                self.press_btn = 0
+        def get_wechat_state(self, event, msg):
+            return self.press_btn
+
+        def send_wechat_record(self, event, msg): #发送录音文件
+            if self.press_btn == 1:
+                self.press_btn = 0
+                self.record_test.stop() #停止錄音
+                EventMesh.publish("stop_led_timer")#关闭灯
+                EventMesh.publish("set_led_time_arg",[1,1,0,led_mode.FLASH_LIGHT_GREEN,4,2,led_mode.OTHER_MEASURE_MODE])#測量成功
+                # EventMesh.publish("set_led_time_arg",[0,1000,1,led_mode.LONG_LIGHT_GREEN,led_mode.OPEN_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#測量成功
+                self.countdown_old = 0
+
+                date_tmp = utime.localtime()
+                time_tmp = utime.mktime(date_tmp)
+
+                self.countdown_old = msg
+                if self.countdown_old >= 15:
+                    self.countdown_old = 15
+                if self.countdown_old <= 0:
+                    #录音时间太短
+                    return
+                else:
+                    # self.wechat_recode_list["%02d"%(self.wechat_show)] = "read:0"
+                    # self.wechat_recode_list["num"] = self.wechat_show
+                    EventMesh.debug_log("self.wechat_recode_list :{}".format(self.wechat_recode_list))
+
+                    # with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:
+                    #     ujson.dump(self.wechat_recode_list,fd)
+                    EventMesh.debug_log("send wechat data!!!!!!!!!!!!!!!!!!!!!")
+
+                    check_txt = ql_fs.path_exists("/usr/static/storage_file/wechat.amr")
+                    if check_txt == True :
+                        path = "/usr/static/storage_file/wechat.amr"
+                        with open(path,"rb") as fd:
+                            buf = bytearray(ql_fs.path_getsize(path))
+                            fd.readinto(buf)
+                            senddata = [self.countdown_old,buf]
+                            EventMesh.publish(constants.PROTOCOL.TKS_SEND,senddata)
+
+                    # with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:
+                    #     ujson.dump(self.wechat_recode_list,fd)
+                    # EventMesh.debug_log("send wechat data!!!!!!!!!!!!!!!!!!!!!")
+
+                    # check_txt = ql_fs.path_exists("/usr/static/storage_file/{}.amr".format(self.wechat_show))
+                    # if check_txt == True :
+                    #     path = "/usr/static/storage_file/{}.amr".format(self.wechat_show)
+                    #     with open(path,"rb") as fd:
+                    #         buf = bytearray(ql_fs.path_getsize(path))
+                    #         fd.readinto(buf)
+                    #         senddata = [self.countdown_old,buf]
+                    #         EventMesh.publish(constants.PROTOCOL.TKS_SEND,senddata)
+            else:
+                self.press_btn = 0
+
+        def play_wechat_last_amr(self, event, msg):#播放微聊最后一条语音文件
+            flag = EventMesh.publish("get_call_state") 
+            if flag == 0:#电话通话中 或者呼叫中挂断中断
+                EventMesh.publish("close_timer_all")#
+                if self.wechat_recode_list != None:
+                    num = 0
+                    play_state = 0
+                    if len(self.wechat_recode_list) > 1:
+                        num = int(self.wechat_recode_list["num"])
+                        #EventMesh.debug_log("self.wechat_recode_list1:{}".format(self.wechat_recode_list))
+                        if num != 0:
+                            last_num = str("%02d"%(num))
+                            last_tmp = self.wechat_recode_list[last_num]
+                            last_read = int(last_tmp.split(":")[1])
+                            if last_read == 1:#如果最后一条没有读则读最新的一条
+                                self.wechat_recode_list[last_num] = "read:0"
+                                self.wechat_recode_list["num"] = num 
+                                with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:
+                                    ujson.dump(self.wechat_recode_list,fd)
+                            else:
+                                sotr_new = {}
+                                sotr_new = sorted(self.wechat_recode_list.keys(), reverse=True)#降序排序
+                                # EventMesh.debug_log("sotr_new:{}".format(sotr_new))
+                                for i in range(len(self.wechat_recode_list)-1):#1 01 02 
+                                    key = sotr_new[i+1]
+                                    num_id = int(key)
+                                    #EventMesh.debug_log("key:{} num_id:{}".format(key,num_id))
+                                    if key in self.wechat_recode_list:#
+                                        str_tmp = self.wechat_recode_list[key]
+                                        read = int(str_tmp.split(":")[1])
+                                        if read != 0:#未读是按一下播放下一条同时删除
+                                            check_amr = ql_fs.path_exists("/usr/static/storage_file/{}.amr".format(num_id))#还要检测这个文件是否存在
+                                            if check_amr == True:
+                                                self.wechat_recode_list[key] = "read:0"
+                                                self.wechat_recode_list["num"] = num 
+                                                EventMesh.debug_log("self.wechat_recode_list2:{} num_id:{} num:{}".format(self.wechat_recode_list,num_id,num))
+                                                # self.aud.play(1, 1, '/usr/static/storage_file/{}.amr'.format(num))  #文件名前面要加上路径
+                                                play_state = 1
+                                                with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:
+                                                    ujson.dump(self.wechat_recode_list,fd)
+                                                break
+                                            else:
+                                                continue
+                                        else:
+                                            continue
+                                    else:
+                                        continue
+                            #EventMesh.debug_log("play_state:{}".format(play_state))
+                            # if play_state == 0:#
+                            check_amr = ql_fs.path_exists("/usr/static/storage_file/{}.amr".format(num))#还要检测这个文件是否存在
+                            if check_amr == True:
+                                self.aud.play(1, 1, '/usr/static/storage_file/{}.amr'.format(num))  #文件名前面要加上路径
+
+        def play_unread_wechat_infor(self,event,msg):#未读微聊语音
+            flag = EventMesh.publish("get_call_state") 
+            video_state = EventMesh.publish("get_video_state")
+            if flag == 0 and self.press_btn == 0 and self.fall_flag == 0 and video_state == 0:#电话通话中 或者呼叫中挂断中断
+            
+                if self.wechat_recode_list != None:
+                    num = 0
+                    play_state = 0
+                    if len(self.wechat_recode_list) > 1:
+                        num = int(self.wechat_recode_list["num"])
+                        if num != 0:
+                            for i in range(len(self.wechat_recode_list)-1):#1 01 02 
+                                key = "%02d"%(i+1)
+                                if key in self.wechat_recode_list:#
+                                    str_tmp = self.wechat_recode_list[key]
+                                    read = int(str_tmp.split(":")[1])
+                                    if read == 1:#未读是按一下播放下一条同时删除
+                                        play_state = 1
+                                    else:
+                                        continue
+                                else:
+                                    continue
+                            if play_state == 1:#设置未读语音状态
+                                EventMesh.publish("set_unread_wechat_state",1)
+                            else:
+                                EventMesh.publish("set_unread_wechat_state",0)
+                                self.updateTime = 0
+
+                state = EventMesh.publish("get_unread_wechat_state")#
+                date_tmp = utime.localtime()
+                time_tmp = utime.mktime(date_tmp)
+                if state != None:
+                    if state == 1:
+                        EventMesh.publish("set_led_time_arg",[1,2,8,led_mode.FLASH_LIGHT_GREEN,8,4,led_mode.OTHER_MEASURE_MODE])#測量成功
+                        # EventMesh.publish("set_led_time_arg",[1000,400,1,led_mode.FLASH_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数
+                        if self.updateTime == 0:
+                            self.updateTime = time_tmp
+                        if self.updateTime != 0:
+                            if time_tmp - self.updateTime >= 10*60:
+                                self.updateTime = time_tmp
+                                #播放音频文件
+                                EventMesh.publish("close_timer_all")
+                                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_UNREAD_WECHAT"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    else:
+                        self.updateTime = 0
+            
+
+
+
+    class BtnDevice(Abstract):
+
+        def __init__(self, tp=None):
+            self.pk = PowerKey()
+            self.__pwk_timer = osTimer()
+            self.aud = audio.Audio(0)
+            self.aud.set_pa(Pin.GPIO29)
+            self.aud.setVolume(11)
+            # self.keypad = machine.KeyPad(4, 4)
+            self.__PowerDownTimeOut = 3000
+            self.__tp = tp
+            self.pwk_press = 0
+            self.pwk_count = 0
+
+            self.powerKey_status = 0
+            self.sosKey = 0
+            self.wechatKey = 0
+            self.sosKey_status = 1#默认是低电平
+            self.WeChatKey_status = 1#默认是低电平
+
+            self.wechatKey_timer = osTimer()
+            self.wechatKey_count = 0
+            self.wechatKey_press = 0 
+
+            self.sosKey_timer = osTimer()
+            self.sosKey_count = 0
+            self.sosKey_press = 0 
+            self.sosKey_long_press = 0
+
+            self.wechatKey_press_count = 0
+
+            self.timeSeconOld = 0
+            self.wechat_state = 0 #按下录音时的状态
+
+            
+            self.sosKey_press_count = 0
+
+
+           
+
+            self.extint_22 = 0
+            self.GPIO22_status = 1
+
+            self.extint_17 = 0
+            self.KeyCall2_status = 1
+
+            self.extint_7 = 1
+            self.extint_8 = 1
+
+            self.extint_19= 0
+            self.KeyCall1_status = 1
+
+            self.Keycall1_timer = osTimer()
+            self.Keycall1_count = 0
+            self.Keycall1_press = 0 
+            self.Keycall1_press_count = 0
+            self.Keycall1_long_press = 0
+
+            self.Keycall2_timer = osTimer()
+            self.Keycall2_count = 0
+            self.Keycall2_press = 0 
+            self.Keycall2_press_count = 0
+            self.Keycall2_long_press = 0
+
+            
+
+            self.pwkey_timer = osTimer()
+            self.pwk_key = 0
+            self.GPIO26_status = 1
+            self.pwKey_press_count = 0
+            self.pwkey_count = 0
+            self.pwkey_press = 0
+            self.led_state = 0
+            self.hsensorTest_timer = osTimer()
+            self.factoryTest_timer = osTimer()
+            self.factoryTest_count = 0
+            self.factoryTest_led_count = 0
+            self.factoryTest_flag = 0
+            self.factory_timesec = 0
+            self.btnInfo_queue = Queue()
+            _thread.stack_size(10*1024+192)
+            _thread.start_new_thread(self.btnInfo_queue_thread, ())
+            _thread.stack_size(8*1024)
+            
+            EventMesh.subscribe("publish_message_event_btnInfo",self.publish_message_event_btnInfo)
+
+            EventMesh.subscribe("close_wechat_btn_timer", self.close_wechat_btn_timer)#来电强制关闭微聊语音
+
+        def btnInfo_queue_thread(self):
+            while True:
+                data = self.btnInfo_queue.get()
+                #EventMesh.debug_log("Info_queue:data = {}".format(data))
+                if data != None:
+                    try:
+                        data["func"](data["data"])
+                    except Exception as e:
+                        #EventMesh.debug_log("btnInfo_queue:ERROR:{}".format(e))
+                        usys.print_exception(e)
+        def publish_message_event_btnInfo(self,event,msg):
+            self.btnInfo_queue.put(msg)
+            EventMesh.publish(constants.EVENT.SYSTEM_UP)#唤醒休眠
+            
+        def publish_wechat_btn_event_cb(self, *args, **kwargs):
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.wechatKey_press_cb,"data":0})  
+
+        def publish_soskey_btn_event_cb(self, *args, **kwargs):
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.sosKey_press_cb,"data":0})  
+
+        def publish_call1key_btn_event_cb(self, *args, **kwargs):
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.call1Key_press_cb,"data":0})  
+        
+        def publish_call2key_btn_event_cb(self, *args, **kwargs):
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.call2Key_press_cb,"data":0})  
+
+        def publish_pwkKey_btn_event_cb(self, *args, **kwargs):
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.pwKey_press_cb,"data":0})  
+
+    
+
+        def post_processor_after_instantiation(self):
+            # self.keypad.init()
+            # self.keypad.set_callback(self.key_callback)
+        
+            self.pk.powerKeyEventRegister(self.powerKey_callback)
+            
+            self.pwk_key26 = ExtInt(ExtInt.GPIO26, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_DISABLE, self.pwk_extint_cb)
+            self.pwk_key26.enable() 
+
+            self.sosKey = ExtInt(ExtInt.GPIO6,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.sosKey_extint_cb)#S0S键
+            self.sosKey.enable()
+
+            self.extint_19 = ExtInt(ExtInt.GPIO19,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.key19_extint_cb)
+            self.extint_19.enable()
+
+            self.extint_17 = ExtInt(ExtInt.GPIO7,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.key17_extint_cb)
+            self.extint_17.enable()
+
+            self.wechatKey = ExtInt(ExtInt.GPIO22, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.wechatKey_extint_cb)
+            self.wechatKey.enable()
+
+        def key17_extint_cb(self,args):#call 1
+            print("call 1!!!!!!!")
+            # EventMesh.debug_log('key17_extint_cb :{}'.format(args))
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            video_state = EventMesh.publish("get_video_state")#获取视频通话状态 5在通话状态不允许按键输入
+            get_video_state = EventMesh.publish("get_video_in_out_state")
+            dev_app_mode = EventMesh.publish("get_dev_app_mode")
+            if open_power != None and open_power_off != None and dev_app_mode != None:
+                if open_power == 0 or open_power_off == 1 or  (dev_app_mode == 1 and get_video_state != 0):
+                    return
+            fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+            if fall_down != None:
+                if fall_down != 0:
+                    return
+            
+            self.KeyCall1_status = int(args[1]) 
+            # EventMesh.debug_log('key17_extint_cb :{}'.format(args))
+            if self.KeyCall1_status == 0:
+                self.KeyCall1_status = 1
+            else:
+                self.KeyCall1_status = 0
+                pass
+            if NEW_ENABLE == 0:#新的按键功能定义
+                if self.KeyCall1_status == 0:
+                    video_state = EventMesh.publish("get_video_state")
+                    if video_state != 0:#视频通话打入或者接听后允许挂断视频通话
+                        if video_state != 6:#6是app打手表需要接通
+                            # EventMesh.publish("video_dev_reject_cb",2)#挂断视频通话
+                            return
+            self.WeChatKey_status = self.wechatKey.read_level()
+            self.GPIO26_status = self.pwk_key26.read_level()
+            self.KeyCall2_status = self.extint_19.read_level()
+            self.sosKey_status = self.sosKey.read_level()
+            # EventMesh.debug_log('key17_extint_cb',args,self.KeyCall2_status,self.WeChatKey_status,self.GPIO26_status,self.KeyCall1_status,self.sosKey_status) # args[0]:gpio号 args[1]:上升沿或下降沿
+            if self.WeChatKey_status != 0 and self.GPIO26_status != 0 and self.KeyCall2_status != 0 and self.sosKey_status != 0:
+                if self.KeyCall1_status == 0:#按下
+                    if NEW_ENABLE == 0:#新的按键功能定义
+                        video_state = EventMesh.publish("get_video_state")
+                        if video_state != 0:#视频通话打入或者接听后允许挂断视频通话
+                                if video_state == 6:#6 是app拨打手表 1 是手表打app 3 是正在视频通话中 0 关闭只有第一次视频通话打入才允许接听 接通之后不允许接听了
+                                    EventMesh.publish("video_answer_cb")
+                                else:
+                                    pass
+                                    # EventMesh.publish("video_dev_reject_cb",2)#挂断视频通话
+                                    # self.Keycall1_press_count=0
+                                    # self.wechatKey_timer.stop()
+                                    # self.pwkey_timer.stop()
+                                    # self.sosKey_timer.stop()
+                                    # self.Keycall2_timer.stop()
+                                    # self.Keycall1_timer.stop()
+                            
+                                return
+                    EventMesh.publish("close_wechat_btn_timer")
+                    if self.Keycall1_press == 0 :
+                        self.wechatKey_timer.stop()
+                        self.pwkey_timer.stop()
+                        self.sosKey_timer.stop()
+                        self.Keycall2_timer.stop()
+                        self.Keycall1_timer.stop()
+
+                        self.pwkey_count = 0
+                        self.pwkey_press = 0
+                        self.led_state = 0
+                        self.pwKey_press_count=0 #电源键
+
+                        self.sosKey_count = 0
+                        self.sosKey_press = 0
+                        self.sosKey_press_count=0#sos键
+                        self.sosKey_long_press = 0
+
+                        self.wechatKey_count = 0
+                        self.wechatKey_press = 0
+                        self.wechatKey_press_count=0#微聊键
+                        self.wechat_state = 0
+
+                        self.Keycall2_count = 0
+                        self.Keycall2_press = 0
+                        self.Keycall2_press_count = 0#call 2键
+                        self.Keycall2_long_press = 0
+
+                        self.Keycall1_count = 0
+                        self.Keycall1_press = 1
+                        self.Keycall1_long_press = 0
+                        EventMesh.publish("AI_key_press")
+                        self.Keycall1_timer.start(100, 1, self.publish_call1key_btn_event_cb)
+
+        def call1Key_press_cb(self, data):
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            video_state = EventMesh.publish("get_video_state")
+            if open_power != None and open_power_off != None:
+                if open_power == 0 or open_power_off == 1:
+                    self.Keycall1_timer.stop()
+                    self.Keycall1_count = 0
+                    self.Keycall1_press = 0
+                    self.Keycall1_press_count+=1
+                    self.Keycall1_long_press = 0
+                    return
+            '''KEY2:联动屏幕右下角或返回键长按关机'''
+            self.KeyCall1_status = self.extint_17.read_level()
+            if self.Keycall1_press == 1 :
+                self.Keycall1_count += 1
+                if self.Keycall1_count >= 10*3: #长按3s 
+                    flag = EventMesh.publish("get_call_state")#获取通话状态
+                    fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+                    if fall_down != None:
+                        if fall_down != 0 or flag == 2:
+                            self.Keycall1_count = 0
+                            self.Keycall1_press = 0
+                            self.Keycall1_press_count = 0
+                            self.Keycall1_long_press = 0
+                            self.Keycall1_timer.stop()
+                            return
+                    if self.Keycall1_long_press == 0:
+                        self.Keycall1_long_press = 1
+                        
+                        flag = EventMesh.publish("get_call_state")#获取通话状态
+                        fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+                        if fall_down != None:
+                            if fall_down != 0 or flag == 2:
+                                return
+                       
+                        return
+
+                    if self.KeyCall1_status == 1:
+                        self.Keycall1_count = 0
+                        self.Keycall1_press = 0
+                        self.Keycall1_press_count = 0
+                        self.Keycall1_long_press = 0
+                        self.Keycall1_timer.stop()
+                        return
+                    
+
+                if self.KeyCall1_status == 1:#松开
+                    if self.Keycall1_count >= 1: #防抖100ms
+                        
+                        self.Keycall1_timer.stop()
+                        self.Keycall1_count = 0
+                        self.Keycall1_press = 0
+                        self.Keycall1_press_count+=1
+                        self.Keycall1_timer.start(500, 0, self.publish_call1Key_timeout_cb_do)#松手超时1s判断
+                    
+
+        def publish_call1Key_timeout_cb_do(self, *args, **kwargs):
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.call1Key_timeout_cb,"data":0}) 
+        
+        def call1Key_timeout_cb(self, data):#
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            video_state = EventMesh.publish("get_video_state")
+            if open_power != None and open_power_off != None:
+                if open_power == 0 or open_power_off == 1 :
+                    self.Keycall1_timer.stop()
+                    self.Keycall1_count = 0
+                    self.Keycall1_press = 0
+                    self.Keycall1_press_count=0
+                    self.Keycall1_long_press = 0
+                    return
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+            fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+            print("call2Key_timeout_cb",self.Keycall2_press_count,flag)
+            if self.Keycall1_press_count > 1:#
+                if fall_down != None:
+                    if fall_down != 0 or flag != 0 or video_state != 0:#在打电话或者跌倒报警提醒中不允许按键触发
+                        self.Keycall1_press_count = 0
+                        return
+            if self.Keycall1_press_count == 3:#心率血压测试
+                self.Keycall1_press_count = 0
+                call_state = EventMesh.publish("get_call_state")
+                battery = EventMesh.publish("screen_get_battery")
+                if call_state == None:
+                    call_state = 0
+                if call_state == 0: 
+                    if battery != None:
+                        if battery[0] != "1":#在充电得时候
+                            EventMesh.publish("stop_led_timer")#设置参数
+                            EventMesh.publish("set_manual_measure_mode",1)#
+            elif self.Keycall1_press_count == 1:#
+                self.Keycall1_press_count = 0
+                EventMesh.publish("stop_led_timer")#设置参数
+                # print("video_state call",video_state)
+                # if video_state != 0:
+                #     if video_state == 6:#6 是app拨打手表 1 是手表打app 3 是正在视频通话中 0 关闭只有第一次视频通话打入才允许接听 接通之后不允许接听了
+                #         EventMesh.publish("video_answer_cb")
+                #     return
+                call_state = EventMesh.publish("get_call_state") 
+                if call_state == 2:#电话拨进需要接听
+                    EventMesh.publish("answer_call_event")#接听电话
+                    return
+                EventMesh.publish("play_cur_step_event")##播放当前步数
+            
+
+            self.Keycall1_press_count = 0
+
+
+        def key19_extint_cb(self,args):#call 2
+            #print("key19_extint_cb call 2")
+            # EventMesh.txt_log('key19_extint_cb :{}'.format(args))
+            power_off = EventMesh.publish("get_power_off_state")#获取关机标识
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            dev_app_mode = EventMesh.publish("get_dev_app_mode")
+            video_state = EventMesh.publish("get_video_state")#获取视频通话状态 5在通话状态不允许按键输入
+            get_video_state = EventMesh.publish("get_video_in_out_state")
+            if open_power != None and power_off != None and dev_app_mode != None:
+                if open_power == 0 or power_off == 1 or (dev_app_mode == 1 and get_video_state != 0): 
+                    return
+                
+            fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+            if fall_down != None:
+                if fall_down != 0:
+                    return
+            self.KeyCall2_status = int(args[1])
+            if self.KeyCall2_status == 0:
+                self.KeyCall2_status = 1
+            else:
+                self.KeyCall2_status = 0
+                pass
+            
+            if NEW_ENABLE == 0:#新的按键功能定义
+                if self.KeyCall2_status == 0:
+                    video_state = EventMesh.publish("get_video_state")
+                    if video_state != 0:#视频通话打入或者接听后允许挂断视频通话
+                        if video_state != 6:#6是app打手表需要接通
+                            # EventMesh.publish("video_dev_reject_cb",2)#挂断视频通话
+                            return
+            self.WeChatKey_status = self.wechatKey.read_level()
+            self.GPIO26_status = self.pwk_key26.read_level()
+            self.KeyCall1_status = self.extint_17.read_level()
+            self.sosKey_status = self.sosKey.read_level()
+            # EventMesh.debug_log('self.KeyCall1_status :{}',args,self.KeyCall1_status) # args[0]:gpio号 args[1]:上升沿或下降沿
+            if self.WeChatKey_status != 0 and self.GPIO26_status != 0 and self.KeyCall1_status != 0 and self.sosKey_status != 0:
+                if self.KeyCall2_status == 0:#按下
+                    EventMesh.publish("close_wechat_btn_timer")
+                    if self.Keycall2_press == 0 :
+                        self.wechatKey_timer.stop()
+                        self.pwkey_timer.stop()
+                        self.sosKey_timer.stop()
+                        self.Keycall2_timer.stop()
+                        self.Keycall1_timer.stop()
+
+                        self.pwkey_count = 0
+                        self.pwkey_press = 0
+                        self.led_state = 0
+                        self.pwKey_press_count=0
+
+                        self.sosKey_count = 0
+                        self.sosKey_press = 0
+                        self.sosKey_long_press = 0
+                        self.sosKey_press_count=0
+
+                        self.wechatKey_count = 0
+                        self.wechatKey_press = 0
+                        self.wechatKey_press_count=0
+                        self.wechat_state = 0
+            
+                        self.Keycall1_count = 0
+                        self.Keycall1_press = 0 
+                        self.Keycall1_press_count = 0
+                        self.Keycall1_long_press = 0
+
+                        self.Keycall2_count = 0
+                        self.Keycall2_press = 1
+                        self.Keycall2_long_press = 0
+                        EventMesh.publish("AI_key_press")
+                        print("key19_extint_cb AI_key_press")
+                        self.Keycall2_timer.start(100, 1, self.publish_call2key_btn_event_cb)
+
+        def call2Key_press_cb(self, data):
+
+            '''KEY2:联动屏幕右下角或返回键长按关机'''
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            video_state = EventMesh.publish("get_video_state")
+            if open_power != None and open_power_off != None:
+                if open_power == 0 or open_power_off == 1:
+                    self.Keycall2_timer.stop()
+                    self.Keycall2_count = 0
+                    self.Keycall2_press = 0
+                    self.Keycall2_press_count =0
+                    self.Keycall2_long_press = 0
+                    return
+            self.KeyCall2_status = self.extint_19.read_level()
+            if self.Keycall2_press == 1 :
+                self.Keycall2_count += 1
+                if self.Keycall2_count >= 10*3: #长按3s 
+                    flag = EventMesh.publish("get_call_state")#获取通话状态
+                    fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+                    if fall_down != None and video_state != None:
+                        if fall_down != 0 or flag != 0 or video_state != 0:
+                            self.Keycall2_count = 0
+                            self.Keycall2_press = 0
+                            self.Keycall2_press_count = 0
+                            self.Keycall2_long_press = 0
+                            self.Keycall2_timer.stop()
+                            return
+                    if self.Keycall2_long_press == 0:
+                        self.Keycall2_long_press = 1
+                        EventMesh.publish("AI_key_long_press")
+                        # EventMesh.publish("stop_led_timer")#设置参数
+                        # EventMesh.publish("call_phonebook_num",2)
+                        return
+                    if self.KeyCall2_status == 1:#松开
+                        self.Keycall2_count = 0
+                        self.Keycall2_press = 0
+                        self.Keycall2_press_count = 0
+                        self.Keycall2_long_press = 0
+                        self.Keycall2_timer.stop()
+                        EventMesh.publish("AI_key_release")
+                        return
+                    
+
+                if self.KeyCall2_status == 1:#松开
+                    if self.Keycall2_count >= 1: #防抖100ms
+                        EventMesh.publish("AI_key_release")
+                        self.Keycall2_timer.stop()
+                        self.Keycall2_count = 0
+                        self.Keycall2_press = 0
+                        self.Keycall2_press_count+=1
+                        #self.Keycall2_timer.start(500, 0, self.publish_call2Key_timeout_cb_do)#松手超时1s判断
+
+        def publish_call2Key_timeout_cb_do(self, *args, **kwargs):
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.call2Key_timeout_cb,"data":0}) 
+        
+        def call2Key_timeout_cb(self, data):#
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            video_state = EventMesh.publish("get_video_state")
+            if open_power != None and open_power_off != None:
+                if open_power == 0 or open_power_off == 1 :
+                    self.Keycall2_timer.stop()
+                    self.Keycall2_count = 0
+                    self.Keycall2_press = 0
+                    self.Keycall2_press_count=0
+                    return
+            flag = EventMesh.publish("get_call_state")#获取通话状态 
+            fall_down = EventMesh.publish("get_fall_down_state")#获取跌倒报警标识
+            # print("call1Key_timeout_cb",self.Keycall1_press_count,flag)
+            if self.Keycall2_press_count > 1:#
+                if fall_down != None:
+                    if fall_down != 0 or flag != 0 or video_state != 0:#在打电话或者跌倒报警提醒中不允许按键触发
+                        self.Keycall2_press_count = 0
+                        return
+            
+            if self.Keycall2_press_count == 3:#测试体温
+                self.Keycall2_press_count = 0
+                call_state = EventMesh.publish("get_call_state")
+                battery = EventMesh.publish("screen_get_battery")
+                if call_state == None:
+                    call_state = 0
+                if call_state == 0: 
+                    if battery != None:
+                        if battery[0] != "1":#在充电得时候
+                            EventMesh.publish("stop_led_timer")#设置参数
+                            EventMesh.publish("set_manual_measure_mode",3)#测量体温
+            elif self.Keycall2_press_count == 1:#
+                self.Keycall2_press_count = 0
+                video_state = EventMesh.publish("get_video_state") 
+                # print("video_state ",video_state)
+                if video_state != 0:
+                    if video_state == 6:#6 是app拨打手表 1 是手表打app 3 是正在视频通话中 0 关闭只有第一次视频通话打入才允许接听 接通之后不允许接听了
+                        EventMesh.publish("video_answer_cb")
+                    return
+                EventMesh.publish("stop_led_timer")#设置参数
+                call_state = EventMesh.publish("get_call_state") 
+                
+                
+                if call_state == 2:#电话拨进需要接听
+                    EventMesh.publish("answer_call_event")#接听电话
+                    return
+                EventMesh.publish("play_battery_level_value")#播放当前电量
+                
+            self.Keycall2_press_count = 0
+
+
+
+        def pwk_extint_cb(self,args):#侧边按键
+            # EventMesh.txt_log('pwk_extint_cb :{}'.format(args))
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            video_state = EventMesh.publish("get_video_state")
+            get_video_state = EventMesh.publish("get_video_in_out_state")
+            dev_app_mode = EventMesh.publish("get_dev_app_mode")
+            if open_power != None and open_power_off != None and dev_app_mode != None:
+                if open_power == 0 or open_power_off == 1 or  (dev_app_mode == 1 and get_video_state != 0):
+                    return
+            
+            flag = EventMesh.publish("get_call_state")#获取通话状态
+            fall_down = EventMesh.publish("get_fall_down_state")#获取跌倒报警标识
+            if fall_down != None:
+                if fall_down != 0 or flag == 2:
+                    return
+            self.GPIO26_status = int(args[1])
+            if self.GPIO26_status == 0:
+                self.GPIO26_status = 1
+            else:
+                self.GPIO26_status = 0
+                pass
+            if NEW_ENABLE == 0:#新的按键功能定义
+                if self.GPIO26_status == 0:
+                    video_state = EventMesh.publish("get_video_state")
+                    if video_state != 0:#视频通话打入或者接听后允许挂断视频通话
+                        if video_state == 6:#6是app打手表需要接通
+                            print("pwk_extint_cb")
+                            # EventMesh.publish("video_answer_cb")
+                        else:
+                            pass
+                            # EventMesh.publish("video_dev_reject_cb",2)#挂断视频通话
+                        return
+                    
+            self.WeChatKey_status = self.wechatKey.read_level()
+            self.KeyCall2_status = self.extint_17.read_level()
+            self.KeyCall1_status = self.extint_19.read_level()
+            self.sosKey_status = self.sosKey.read_level()
+
+            if self.WeChatKey_status != 0 and self.KeyCall1_status != 0 and self.sosKey_status != 0 and self.KeyCall2_status != 0:
+                if self.GPIO26_status == 0:#按下
+                    EventMesh.publish("close_wechat_btn_timer")
+                    if self.pwkey_press == 0 :
+                        self.aud.stop()  #播放声音 
+                        self.wechatKey_timer.stop()
+                        self.pwkey_timer.stop()
+                        self.sosKey_timer.stop()
+                        self.Keycall2_timer.stop()
+                        self.Keycall1_timer.stop()
+
+                        self.sosKey_count = 0
+                        self.sosKey_press = 0
+                        self.sosKey_press_count=0
+                        self.sosKey_long_press = 0
+
+                        self.wechatKey_count = 0
+                        self.wechatKey_press = 0
+                        self.wechatKey_press_count=0
+                        self.wechat_state = 0
+                       
+
+                        self.pwkey_press = 1
+                        self.pwkey_count = 0
+                        self.led_state = 0
+
+                        self.Keycall1_count = 0
+                        self.Keycall1_press = 0 
+                        self.Keycall1_long_press = 0
+                        self.Keycall1_press_count = 0
+                        
+                        self.Keycall2_count = 0
+                        self.Keycall2_press = 0 
+                        self.Keycall2_press_count = 0
+                        self.Keycall2_long_press = 0
+
+                        self.pwkey_timer.start(100, 1, self.publish_pwkKey_btn_event_cb)
+                        # EventMesh.debug_log("key22_extint_cb:self.key22_timer.start!!!!\n")
+
+
+
+
+        def pwKey_press_cb(self, data):
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            video_state = EventMesh.publish("get_video_state")
+            if open_power != None and open_power_off != None and video_state != None:
+                if open_power == 0 or open_power_off == 1 or video_state != 0:
+                    self.pwkey_timer.stop()
+                    self.pwkey_count = 0
+                    self.pwkey_press = 0
+                    self.led_state = 0
+                    self.pwKey_press_count=0
+                    return
+            '''KEY2:联动屏幕右下角或返回键长按关机'''
+            self.GPIO26_status = self.pwk_key26.read_level()
+
+            if self.pwkey_press == 1 :
+                self.pwkey_count += 1
+                if self.pwkey_count > 5:
+                    if self.led_state == 0:
+                        self.led_state = 1
+                        EventMesh.publish("set_led_time_arg",[1,1,330,led_mode.LONG_LIGHT_GREEN,2,1,led_mode.OTHER_MEASURE_MODE])#測量成功
+                    if self.pwkey_count >= 10*10:
+                        EventMesh.publish("stop_led_timer")#设置参数
+                        self.pwkey_timer.stop()
+                        self.pwkey_count = 0
+                        self.pwkey_press = 0
+                        self.pwKey_press_count = 0
+                        self.led_state = 0
+                        # if EventMesh.publish("get_sim_Status") != 1:
+                        #     EventMesh.publish("open_power_on", 2)#
+                        # else:
+                        EventMesh.publish("open_power_on", 3)#
+                        return
+                    
+                    if self.pwkey_count >= 3*10 :
+                        if EventMesh.publish("get_sim_Status") != 1:
+                            EventMesh.debug_log("长3秒关机")
+                            EventMesh.publish("stop_led_timer")#设置参数
+                            self.pwkey_timer.stop()
+                            self.pwkey_count = 0
+                            self.pwkey_press = 0
+                            self.pwKey_press_count = 0
+                            self.led_state = 0
+                            EventMesh.publish("open_power_on", 2)#
+                            return
+                            
+                    
+                if self.GPIO26_status == 1:#松开
+                    if self.pwkey_count >= 1: #防抖100ms
+                        # EventMesh.debug_log("self.GPIO26_status == 1")
+                        self.pwkey_timer.stop()
+                        self.pwkey_count = 0
+                        self.pwkey_press = 0
+                        self.led_state = 0
+                        self.pwKey_press_count+=1
+                        self.pwkey_timer.start(500, 0, self.publish_pwKey_timeout_cb_do)#松手超时1s判断
+
+        def  hsensorTest_timer_cb(self,e):
+            EventMesh.publish("system_sleep_rest")#防止黑屏 
+            w_data = EventMesh.publish(constants.EVENT.GET_WEAR)#佩戴数据
+            #EventMesh.debug_log("FactoryModeHsensorTest{}".format(data))
+        
+              
+        def publish_pwKey_timeout_cb_do(self, *args, **kwargs):
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.pwKey_timeout_cb,"data":0})  
+        
+        def pwKey_timeout_cb(self, data):#侧边按键
+            boot_count = EventMesh.publish("get_boot_time_count")
+
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            video_state = EventMesh.publish("get_video_state")
+            if open_power != None and open_power_off != None and video_state != None:
+                if open_power == 0 or open_power_off == 1 or video_state != 0:
+                    self.pwkey_timer.stop()
+                    self.pwkey_count = 0
+                    self.pwkey_press = 0
+                    self.led_state = 0
+                    self.pwKey_press_count=0
+                    return
+
+            if self.pwKey_press_count >= 1:
+                self.pwKey_press_count = 0
+                # flag = EventMesh.publish("get_call_state") 
+                # if flag != 2:#如果是电话拨出去或者不在打电话中都可以执行
+                #     EventMesh.publish("stop_led_timer")#设置参数
+                #     if flag == 1:#如果是sos电话拨出去
+                #         sos_flag = EventMesh.publish("get_sos_flag")
+                #         if sos_flag == 1:
+                #             EventMesh.publish("set_sos_flag",0)
+                #             EventMesh.publish("set_sos_num",0)
+                #             EventMesh.publish("set_hangup_mode",0)
+                #     EventMesh.publish("close_hr_sop2")#
+                #     flag = EventMesh.publish("get_call_state") 
+                #     # if flag == 0 or flag == 2:#在拨出去或者通话中就不播报入网成功的语音
+                #     if flag != 1:#在拨出去或者通话中就不播报入网成功的语音
+                #         EventMesh.publish("set_sim_mode")#
+                #     EventMesh.publish("dialing_out_event")#电话呼叫中voiceCall.callEnd()
+                
+                flag = EventMesh.publish("get_call_state") 
+                if flag != 2:
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("dialing_out_event")#电话呼叫中voiceCall.callEnd()
+
+                    if flag == 1:#如果是sos电话拨出去
+                        sos_flag = EventMesh.publish("get_sos_flag")
+                        if sos_flag == 1:
+                            EventMesh.publish("set_sos_state_out")
+                            EventMesh.publish("set_sos_flag",0)
+                            EventMesh.publish("set_sos_num",0)
+                            EventMesh.publish("set_hangup_mode",0)
+                    EventMesh.publish("close_hr_sop2")#
+                    flag = EventMesh.publish("get_call_state") 
+                    if flag != 1:
+                        EventMesh.publish("set_sim_mode")#
+            
+            self.pwKey_press_count = 0
+
+        def sosKey_extint_cb(self,args):
+            
+            power_off = EventMesh.publish("get_power_off_state")#获取关机标识
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if power_off != None and open_power != None:
+                if power_off == 1 or open_power == 0:
+                    return
+            self.sosKey_status = int(args[1])
+            if self.sosKey_status == 0:
+                self.sosKey_status = 1
+            else:
+                self.sosKey_status = 0
+                pass
+            get_video = EventMesh.publish("get_video_in_out_state")
+
+            self.WeChatKey_status = self.wechatKey.read_level()
+            self.GPIO26_status = self.pwk_key26.read_level()
+            self.KeyCall1_status = self.extint_19.read_level()
+            self.KeyCall2_status = self.extint_17.read_level()
+
+            # EventMesh.debug_log('sosKey_extint_cb ',args,self.sosKey_status,self.WeChatKey_status,self.KeyCall1_status,self.KeyCall2_status,self.GPIO26_status) # args[0]:gpio号 args[1]:上升沿或下降沿
+            if self.WeChatKey_status != 0 and self.GPIO26_status != 0 and self.KeyCall1_status != 0 and self.KeyCall2_status != 0:
+                if self.sosKey_status == 0:#按下
+                    if NEW_ENABLE == 0:#新的按键功能定义
+                        video_state = EventMesh.publish("get_video_state")
+                        if video_state != 0:#视频通话打入或者接听后允许挂断视频通话
+                            if video_state == 6 or get_video == 0:
+                                EventMesh.debug_log("sosKey_extint_cb",get_video,video_state)
+                                EventMesh.publish("video_dev_reject_cb",2)#挂断视频通话
+                                self.sosKey_press_count=0
+                                self.wechatKey_timer.stop()
+                                self.pwkey_timer.stop()
+                                self.sosKey_timer.stop()
+                                self.Keycall2_timer.stop()
+                                self.Keycall1_timer.stop()
+                                return
+                    EventMesh.publish("close_falldown_alarm_event")#关闭跌倒报警提醒事件
+                    EventMesh.publish("close_wechat_btn_timer")
+
+                    if self.sosKey_press == 0 :
+                        self.wechatKey_timer.stop()
+                        self.pwkey_timer.stop()
+                        self.sosKey_timer.stop()
+                        self.Keycall2_timer.stop()
+                        self.Keycall1_timer.stop()
+
+                        
+                        self.pwkey_count = 0
+                        self.pwkey_press = 0
+                        self.led_state = 0
+                        self.pwKey_press_count=0 #电源键
+
+
+                        self.wechatKey_count = 0
+                        self.wechatKey_press = 0
+                        self.wechat_state = 0
+                        self.wechatKey_press_count=0#微聊键
+
+
+                        self.sosKey_press = 1
+                        self.sosKey_long_press = 0
+                        self.sosKey_count = 0
+
+                        self.Keycall1_count = 0
+                        self.Keycall1_press = 0 
+                        self.Keycall1_long_press = 0
+                        self.Keycall1_press_count = 0
+                        
+                        self.Keycall2_count = 0
+                        self.Keycall2_press = 0 
+                        self.Keycall2_long_press = 0
+                        self.Keycall2_press_count = 0
+
+                        self.sosKey_timer.start(100, 1, self.publish_soskey_btn_event_cb)
+                        # self.sosKey_timer.start(100, 1, self.sosKey_press_cb)
+            # EventMesh.debug_log("key22_extint_cb:self.key22_timer.start!!!!\n")
+
+        def sosKey_press_cb(self, data):
+            '''KEY2:联动屏幕右下角或返回键长按关机'''
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if open_power != None and open_power_off != None:
+                if open_power == 0 or open_power_off == 1:
+                    self.sosKey_timer.stop()
+                    self.sosKey_count = 0
+                    self.sosKey_press = 0
+                    self.sosKey_long_press = 0
+                    self.sosKey_press_count = 0
+                    return
+            self.sosKey_status = self.sosKey.read_level()
+            if self.sosKey_press == 1 :
+                # if self.sosKey_count <= 2:
+                    # if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网不需要录音
+                    #     EventMesh.publish("set_led_time_arg",[1000,200,1,led_mode.FLASH_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数
+                    # else:
+                    #     EventMesh.publish("set_led_time_arg",[1000,200,1,led_mode.FLASH_LIGHT_RED,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数
+                self.sosKey_count += 1
+                if self.sosKey_count >= 10*3: #长按3s sos拨号
+                    flag = EventMesh.publish("get_call_state")#获取通话状态
+                    fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+                    video_state = EventMesh.publish("get_video_state")#获取视频通话状态
+                    if fall_down != None and video_state != None:
+                        if fall_down != 0 or flag == 2 or video_state != 0:
+                            self.sosKey_count = 0
+                            self.sosKey_long_press = 0
+                            self.sosKey_press = 0
+                            self.sosKey_timer.stop()
+                            return
+                    if self.sosKey_long_press == 0:
+                        self.sosKey_long_press = 1
+                       
+                        EventMesh.publish_async("dial_sos_phone")#拨打sos号码
+                        return
+                    if self.sosKey_status == 1:#松开
+                        self.sosKey_count = 0
+                        self.sosKey_long_press = 0
+                        self.sosKey_press = 0
+                        self.sosKey_timer.stop()
+                        return
+
+                # EventMesh.debug_log("self.sosKey_count {}",self.sosKey_count)
+                if self.sosKey_status == 1:#松开
+                    if self.sosKey_count >= 1: #防抖100ms
+                        self.sosKey_timer.stop()
+                        self.sosKey_count = 0
+                        self.sosKey_press = 0
+                        self.sosKey_long_press = 0
+                        self.sosKey_press_count+=1
+                        self.sosKey_timer.start(500, 0, self.publish_sosKey_timeout_cb_do)#松手超时1s判断
+        def publish_sosKey_timeout_cb_do(self, *args, **kwargs):
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.sosKey_timeout_cb,"data":0})  
+        # 1、长按3秒以上,进行SOS拔号;
+        # 2、短按挂断来电或挂断视频通话,平时短按一下语音报时;
+        # 3、短按三下,发起视频通话(默认第一个)
+        # 4、短按六次,播报IMEI号
+        # 5、短按十次,解绑APP,同时恢复出厂设置
+        def close_factory_test(self):#关闭老化测试
+            if self.factoryTest_flag == 1:
+                self.factoryTest_flag = 0
+                close_led_white()
+                close_led_red()
+                close_led_green()
+                self.factoryTest_led_count = 0
+                self.aud.stopPlayStream()
+                self.factoryTest_timer.stop()
+                EventMesh.publish("close_motor_infor")
+
+        def factoryTest_timer_cb(self,e):
+            # self.factoryTest_count+=1
+            date_tmp = utime.localtime()
+            time_tmp = utime.mktime(date_tmp)
+            # print("time_tmp - self.factory_timesec :%d time_tmp:%d self.factory_timesec %d\r\n",time_tmp - self.factory_timesec,time_tmp,self.factory_timesec)
+            if time_tmp - self.factory_timesec > 60*60*2:
+            # if self.factoryTest_count > 60*60*2:#老化测试2小时自动退出
+            #     self.factoryTest_count = 0
+                self.close_factory_test()
+                return
+            #播放音频 
+            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_ALARM_NEW"))
+            if EventMesh.publish("get_audio_state") == 0:
+                self.aud.montage_play('U:/static/audio.bin',1,1,str_data)
+            #led灯常亮
+            self.factoryTest_led_count+=1
+            if self.factoryTest_led_count == 1:#1  4 7  10 
+                open_led_red()
+                close_led_green()
+                close_led_white()
+            elif self.factoryTest_led_count == 2:
+                open_led_green()
+                close_led_red()
+                close_led_white()
+            elif self.factoryTest_led_count == 3: #3  6 9 12 
+                open_led_white()
+                close_led_red()
+                close_led_green()
+            if self.factoryTest_led_count >= 3+1:
+                self.factoryTest_led_count = 0
+
+            EventMesh.publish("set_motor_time",[1,2,10*1,10,5])#设置马达参数
+
+        def sosKey_timeout_cb(self, data):#
+            # print("sosKey_timeout_cb",self.sosKey_press_count)
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if open_power != None and open_power_off != None:
+                if open_power == 0 or open_power_off == 1:
+                    self.sosKey_timer.stop()
+                    self.sosKey_count = 0
+                    self.sosKey_press = 0
+                    self.sosKey_long_press = 0
+                    self.sosKey_press_count = 0
+                    return
+            factory_count = EventMesh.publish("get_factory_test_time")
+            print("factory_count:%d",factory_count)
+            try :
+                if factory_count <= 30 :#开机30秒内按键次数大于15进入测试模式
+                    #EventMesh.debug_log("boot_count:{}".format(boot_count))
+                    if self.sosKey_press_count >= 15:
+                        self.factoryTest_timer.start(1000,1,self.factoryTest_timer_cb)
+                        self.sosKey_press_count = 0
+                        self.factoryTest_led_count = 0
+                        self.factoryTest_flag = 1
+                        date_tmp = utime.localtime()
+                        time_tmp = utime.mktime(date_tmp)
+                        self.factory_timesec = time_tmp
+                        return
+
+            except Exception as e:
+                usys.print_exception(e)
+
+            if NEW_ENABLE == 1:#旧的按键定义
+                # EventMesh.debug_log("sosKey_press_count!!!!!!!!!!!!!! ",self.sosKey_press_count)
+                flag = EventMesh.publish("get_call_state")#获取通话状态
+                fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+                if self.sosKey_press_count > 1:#
+                    if fall_down != None:
+                        if fall_down != 0 or flag != 0:
+                            self.sosKey_press_count = 0
+                            return
+                if self.sosKey_press_count == 10:#
+                    self.sosKey_press_count = 0
+                    pass
+                elif self.sosKey_press_count == 6:#
+                    self.sosKey_press_count = 0
+                    self.close_factory_test()
+                    pass
+                elif self.sosKey_press_count == 5:#功能暂时屏蔽
+                    self.sosKey_press_count = 0
+                    call_state = EventMesh.publish("get_call_state")
+                    battery = EventMesh.publish("screen_get_battery")
+                    if call_state == None:
+                        call_state = 0
+                    if call_state == 0: 
+                        if battery != None:
+                            if battery[0] != "1":#在充电得时候
+                                EventMesh.publish("stop_led_timer")#设置参数
+                                EventMesh.publish("set_manual_measure_mode",3)#测量体温
+                    pass
+                elif self.sosKey_press_count == 4:#拨打app快捷号码
+                    self.sosKey_press_count = 0
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("play_center_phone")#拨打快捷号码
+                    # EventMesh.publish("call_phonebook_num",3)
+                    pass
+                elif self.sosKey_press_count == 3:#测试心率
+                    self.sosKey_press_count = 0
+                    
+                    call_state = EventMesh.publish("get_call_state")
+                    battery = EventMesh.publish("screen_get_battery")
+                    if call_state == None:
+                        call_state = 0
+                    if call_state == 0: 
+                        if battery != None:
+                            if battery[0] != "1":#在充电得时候
+                                EventMesh.publish("stop_led_timer")#设置参数
+                                EventMesh.publish("set_manual_measure_mode",1)#
+                    pass
+                elif self.sosKey_press_count == 2:#播报当前步数
+                    self.sosKey_press_count = 0
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("play_cur_step_event")#
+                    pass
+                elif self.sosKey_press_count == 1:#挂断来电 短语音播报
+                    self.sosKey_press_count = 0
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    # EventMesh.publish("call_test_event")
+                    EventMesh.publish("sos_short_press")#sos短按事件
+                    
+                    pass
+                self.sosKey_press_count = 0
+            else:
+                # EventMesh.debug_log("sosKey_press_count!!!!!!!!!!!!!! ",self.sosKey_press_count)
+                flag = EventMesh.publish("get_call_state")#获取通话状态
+                fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+                video_state = EventMesh.publish("get_video_state")#获取视频通话状态
+                
+                
+                if self.sosKey_press_count > 1:#短按十次解绑app
+                    if fall_down != None and video_state != None and flag != None:
+                        if fall_down != 0 or flag != 0 or video_state != 0:#获取视频通话状态:
+                            self.sosKey_press_count = 0
+                            return
+                if self.sosKey_press_count == 10:#
+                    self.sosKey_press_count = 0
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("open_power_on", 4)#恢复出厂
+                    pass
+                elif self.sosKey_press_count == 6:#播报IMEI号
+                    self.sosKey_press_count = 0
+                    self.close_factory_test()
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("play_imei_event")#播報imei号
+                    pass
+                elif self.sosKey_press_count == 5:#
+                    self.sosKey_press_count = 0
+                    # call_state = EventMesh.publish("get_call_state")
+                    # battery = EventMesh.publish("screen_get_battery")
+                    # if call_state == None:
+                    #     call_state = 0
+                    # if call_state == 0: 
+                    #     if battery != None:
+                    #         if battery[0] != "1":#在充电得时候
+                    #             EventMesh.publish("stop_led_timer")#设置参数
+                    #             EventMesh.publish("set_manual_measure_mode",3)#测量体温
+                    # pass
+                elif self.sosKey_press_count == 4:#
+                    self.sosKey_press_count = 0
+                    # EventMesh.publish("stop_led_timer")#设置参数
+                    # EventMesh.publish("play_center_phone")#拨打快捷号码
+                    # EventMesh.publish("call_phonebook_num",3)
+                    pass
+                elif self.sosKey_press_count == 3:#视频通话
+                    self.sosKey_press_count = 0
+                    call_state = EventMesh.publish("get_call_state")
+                    battery = EventMesh.publish("screen_get_battery")
+                    if call_state == None:
+                        call_state = 0
+                    if call_state == 0:
+                        flag = EventMesh.publish("get_call_state") 
+                        fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+                        usb_state = EventMesh.publish("get_usb")#
+                        video_state = EventMesh.publish("get_video_state")
+                        if flag != 0  or fall_down != 0:
+                            return
+                        EventMesh.publish("stop_led_timer")#设置参数
+                        EventMesh.publish("call_viode_book_num")
+                    pass
+                elif self.sosKey_press_count == 2:#播报当前步数
+                    self.sosKey_press_count = 0
+                    # EventMesh.publish("stop_led_timer")#设置参数
+                    # EventMesh.publish("play_cur_step_event")#
+                    pass
+                elif self.sosKey_press_count == 1:#挂断来电 短语音播报
+                    self.sosKey_press_count = 0
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    # EventMesh.publish("call_test_event")
+                    EventMesh.publish("sos_short_press")#sos短按事件
+                    
+                    pass
+                self.sosKey_press_count = 0
+
+
+        def wechatKey_extint_cb(self,args):
+            power_off = EventMesh.publish("get_power_off_state")#获取关机标识
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            dev_app_mode = EventMesh.publish("get_dev_app_mode")
+            video_state = EventMesh.publish("get_video_state")#获取视频通话状态 5在通话状态不允许按键输入
+            get_video_state = EventMesh.publish("get_video_in_out_state")
+
+            if open_power != None and power_off != None and dev_app_mode != None:
+                if open_power == 0 or power_off == 1 or  (dev_app_mode == 1 and get_video_state != 0):
+                    return
+            fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+            if fall_down != None:
+                if fall_down != 0:
+                    return
+            # EventMesh.txt_log('wechatKey_extint_cb :{}'.format(args))
+            self.WeChatKey_status = int(args[1])
+            if self.WeChatKey_status == 0:
+                self.WeChatKey_status = 1
+            else:
+                self.WeChatKey_status = 0
+                pass
+            if NEW_ENABLE == 0:#新的按键功能定义
+                if self.WeChatKey_status == 0:
+                    video_state = EventMesh.publish("get_video_state")
+                    if video_state != 0:#视频通话打入或者接听后允许挂断视频通话
+                        if video_state != 6:#6是app打手表需要接通
+                            # EventMesh.publish("video_dev_reject_cb",2)#挂断视频通话
+                            return
+                    
+            self.sosKey_status = self.sosKey.read_level()
+            self.GPIO26_status = self.pwk_key26.read_level()
+            self.KeyCall1_status = self.extint_19.read_level()
+            self.KeyCall2_status = self.extint_17.read_level()
+            # EventMesh.debug_log('wechatKey_extint_cb ',args,self.WeChatKey_status,self.sosKey_status,self.KeyCall1_status,self.KeyCall2_status,self.GPIO26_status) # args[0]:gpio号 args[1]:上升沿或下降沿
+            # if self.sosKey_status != 0 and self.GPIO26_status != 0:
+            if self.sosKey_status != 0 and self.GPIO26_status != 0 and self.KeyCall1_status != 0 and self.KeyCall2_status != 0:
+                if self.WeChatKey_status == 0:#按下
+                    video_state = EventMesh.publish("get_video_state")
+                    if video_state != 0:#视频通话打入或者接听后允许挂断视频通话
+                        if video_state != 6:#6是app打手表需要接通
+                            # EventMesh.publish("video_dev_reject_cb",2)#挂断视频通话
+                            # self.wechatKey_press_count = 0
+                            # self.wechatKey_timer.stop()
+                            # self.pwkey_timer.stop()
+                            # self.sosKey_timer.stop()
+                            # self.Keycall2_timer.stop()
+                            # self.Keycall1_timer.stop()
+                            return
+                    if self.wechatKey_press == 0:
+                        self.wechatKey_timer.stop()
+                        self.pwkey_timer.stop()
+                        self.sosKey_timer.stop()
+                        self.Keycall2_timer.stop()
+                        self.Keycall1_timer.stop()
+
+                        self.sosKey_press_count = 0
+                        self.sosKey_long_press = 0
+                        self.sosKey_press = 0
+                        self.sosKey_count = 0
+
+                        self.pwkey_press = 0
+                        self.pwkey_count = 0
+                        self.led_state = 0
+                        self.pwKey_press_count=0
+
+                        self.wechatKey_press = 1
+                        self.led_state = 0
+                        self.wechatKey_count = 0
+                        self.wechat_state = 0
+
+                        self.Keycall1_count = 0
+                        self.Keycall1_press = 0 
+                        self.Keycall1_long_press = 0
+                        self.Keycall1_press_count = 0
+                        
+                        self.Keycall2_count = 0
+                        self.Keycall2_press = 0 
+                        self.Keycall2_press_count = 0
+                        self.Keycall2_long_press = 0
+
+                        self.wechatKey_timer.start(100, 1, self.publish_wechat_btn_event_cb)
+                else:
+                    EventMesh.publish("close_wechat_btn_timer")
+
+        def close_wechat_btn_timer(self,event,*argc):
+            tmp = EventMesh.publish("get_wechat_time")#获取微聊时间戳
+            wechat_time = 0
+            time_tmp = 0
+            time_sec = 0
+
+            if tmp != None:
+                if tmp[0] == 1:
+                    self.wechatKey_timer.stop()
+                    self.wechatKey_count = 0
+                    self.wechatKey_press = 0
+                    self.wechatKey_press_count=0
+                    self.wechat_state = 0
+                    date_tmp = utime.localtime()
+                    time_tmp = utime.mktime(date_tmp)
+                    time_sec = tmp[1]
+                    wechat_time = time_tmp - time_sec
+                    # EventMesh.debug_log("close_btn_timer",time_tmp,time_sec,wechat_time)
+                    if wechat_time >= 15:
+                        wechat_time = 15
+                    if wechat_time <= 0:
+                        wechat_time = 0
+                    EventMesh.publish("send_wechat_record",wechat_time)#发送录音文件内容
+        
+
+        def wechatKey_press_cb(self,data):
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            video_state = EventMesh.publish("get_video_state")
+            if open_power != None and open_power_off != None:
+                if open_power == 0 or open_power_off == 1 :
+                    
+                    self.wechatKey_timer.stop()
+                    self.wechatKey_count = 0
+                    self.wechatKey_press = 0
+                    self.wechat_state = 0
+                    self.wechatKey_press_count=0
+                    return
+            self.WeChatKey_status = self.wechatKey.read_level()
+            wechat_time = 0
+            tmp = None
+            time_sec = 0
+            time_tmp = 0
+            date_tmp = utime.localtime()
+            time_tmp = utime.mktime(date_tmp)
+            '''KEY2:联动屏幕右下角或返回键长按关机'''
+            if self.wechatKey_press == 1 :#是否按下
+                tmp = EventMesh.publish("get_wechat_time")#获取微聊时间戳
+                self.wechatKey_count += 1
+                if self.wechatKey_count >= 15: #长按1s进入微聊录音
+                    flag = EventMesh.publish("get_call_state") 
+                    fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+                    if flag != None:
+                        if flag == 0 and fall_down == 0 and video_state == 0:
+                            if self.WeChatKey_status == 0:
+                                if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网不需要录音
+                                    if self.wechat_state == 0:#按下超过s开始录音
+                                        EventMesh.publish("start_wechat_record")#开始录音
+                                        self.wechat_state = 1
+                                else:
+                                    self.wechat_state = 0
+                                    self.wechatKey_timer.stop()
+                                    self.wechatKey_count = 0
+                                    self.wechatKey_press = 0
+                                    self.wechatKey_press_count=0
+                                    EventMesh.publish("set_sim_mode")#播報imei号
+                                    return
+
+                            if self.WeChatKey_status == 0:#未松手超过15s啧停止录音
+                                if self.wechat_state == 1:
+                                    if tmp != None:
+                                        if tmp[0] != 0:
+                                            time_sec = tmp[1]
+                                            if time_tmp - time_sec >= 15:
+                                                wechat_time = time_tmp - time_sec
+                                                if wechat_time >= 15:
+                                                    wechat_time = 15
+                                                EventMesh.publish("send_wechat_record",wechat_time)#发送录音文件内容
+                                                
+                                                self.wechatKey_timer.stop()
+                                                self.wechatKey_count = 0
+                                                self.wechatKey_press = 0
+                                                self.wechat_state = 0
+                                                self.wechatKey_press_count=0
+                                                return
+                            else:
+                                if self.WeChatKey_status == 1:
+                                    if self.wechat_state == 1:#如果按下时长超过1s且小于长按的时间也认为是录微聊
+                                        if tmp != None:
+                                            if tmp[0] != 0:
+                                                time_sec = tmp[1]
+                                                wechat_time = time_tmp - time_sec
+                                            # EventMesh.debug_log("WECHAT TIEM",time_tmp,time_sec,wechat_time)
+                                            if wechat_time >= 15:
+                                                wechat_time = 15
+                                        
+                                        
+                                        EventMesh.publish("send_wechat_record",wechat_time)#发送录音文件内容
+                                        self.wechatKey_timer.stop()
+                                        self.wechat_state = 0
+                                        self.wechatKey_count = 0
+                                        self.wechatKey_press = 0
+                                        self.wechatKey_press_count=0
+                                        return
+                        else:
+                            self.wechatKey_timer.stop()
+                            self.wechatKey_count = 0
+                            self.wechat_state = 0
+                            self.wechatKey_press = 0
+                            self.wechatKey_press_count = 0
+                            return
+
+                if self.WeChatKey_status == 1:#松开
+                    if self.wechatKey_count >= 1: #防抖100ms
+                        # EventMesh.debug_log("WeChat time!!!!!!!!!!!!!!")
+                        self.wechatKey_timer.stop()
+                        self.wechatKey_count = 0
+                        self.wechatKey_press = 0
+                        self.wechat_state = 0
+                        self.wechatKey_press_count+=1
+                        self.wechatKey_timer.start(500, 0, self.publish_wechatKey_btn_event_cb)#松手超时1s判断
+
+        def publish_wechatKey_btn_event_cb(self, *args, **kwargs):
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.wechatKey_timeout_cb,"data":0})  
+
+        # 1、短按一下,播放最后收到的语音或接听电话,接听视频通话;短按一下,开始语音播报能否速度快一点,现在慢了体验感有点差
+        # 2、长按1.5秒后开始录音,松开按键后,发送录音至APP;
+        # 3、短按三次,拨打通信录号码三
+        # 4、短按四次,拨打通信录号码四
+        # 5、短按五次,拨打通信录号码五
+        # 6、短按六次,拨打通信录号码六
+        # 7、短按七次,拨打通信录号码七
+        # 8、短按八次,拨打通信录号码八
+    
+        def wechatKey_timeout_cb(self,data):#微聊键
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            video_state = EventMesh.publish("get_video_state")
+            if open_power != None and open_power_off != None:
+                if open_power == 0 or open_power_off == 1:
+                    self.wechatKey_timer.stop()
+                    self.wechatKey_count = 0
+                    self.wechatKey_press = 0
+                    self.wechat_state = 0
+                    self.wechatKey_press_count=0
+                    return
+            
+            if NEW_ENABLE == 1: #旧的按键定义微聊键
+                flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+                fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+                if self.wechatKey_press_count > 1:#
+                    if fall_down != None:
+                        if fall_down != 0 or flag == 2:
+                            self.wechatKey_press_count = 0
+                            return
+                # EventMesh.debug_log("wechatKey_timeout_cb!!!!!!!!!!!!!! ",self.wechatKey_press_count)
+                if self.wechatKey_press_count == 10:#短按十次解绑app
+                    self.wechatKey_press_count = 0
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("open_power_on", 4)#恢复出厂
+                    pass
+                elif self.wechatKey_press_count == 6:#短按六次播报imei号
+                    self.wechatKey_press_count = 0
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("play_imei_event")#播報imei号
+                    pass
+                elif self.wechatKey_press_count == 4:#拨打通讯录号码三
+                    self.wechatKey_press_count = 0
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("call_phonebook_num",3)
+                    pass
+                elif self.wechatKey_press_count == 3:#拨打通讯录号码二
+                    self.wechatKey_press_count = 0
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("call_phonebook_num",2)
+                    pass
+                elif self.wechatKey_press_count == 2:#拨打通讯录号码一
+                    self.wechatKey_press_count = 0
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("call_phonebook_num",1)
+                    # EventMesh.publish("interup_call_event")#
+                    pass
+                elif self.wechatKey_press_count == 1:#播放最后收到的语音
+                    self.wechatKey_press_count = 0
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    call_state = EventMesh.publish("get_call_state") 
+                    if call_state == 0:
+                        fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+                        if fall_down != None:
+                            if fall_down != 0:
+                                EventMesh.publish_async("dial_sos_phone")#拨打sos号码
+                                return
+                    else:
+                        if call_state == 2:#电话拨进需要接听
+                            EventMesh.publish("answer_call_event")#接听电话
+                            return
+                    EventMesh.publish("play_wechat_last_amr")
+                    # pass
+                self.wechatKey_press_count = 0
+            else:
+                flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+                fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+                if self.wechatKey_press_count > 1:#
+                    if fall_down != None and flag != None and video_state != None:
+                        if fall_down != 0 or flag != 0 or video_state != 0:
+                            self.wechatKey_press_count = 0
+                            return
+                # EventMesh.debug_log("wechatKey_timeout_cb!!!!!!!!!!!!!! ",self.wechatKey_press_count)
+                if self.wechatKey_press_count == 10:#短按十次解绑app
+                    self.wechatKey_press_count = 0
+                    # EventMesh.publish("stop_led_timer")#设置参数
+                    # EventMesh.publish("open_power_on", 4)#恢复出厂
+                    pass
+                elif self.wechatKey_press_count == 8:#拨打通讯录号码八
+                    self.wechatKey_press_count = 0
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("call_phonebook_num",8)
+                    pass
+                elif self.wechatKey_press_count == 7:#拨打通讯录号码七
+                    self.wechatKey_press_count = 0
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("call_phonebook_num",7)
+                    pass
+                elif self.wechatKey_press_count == 6:#拨打通讯录号码六
+                    self.wechatKey_press_count = 0
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("call_phonebook_num",6)
+                    pass
+                elif self.wechatKey_press_count == 5:#拨打通讯录号码五
+                    self.wechatKey_press_count = 0
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("call_phonebook_num",5)
+                    pass
+                elif self.wechatKey_press_count == 4:#拨打通讯录号码四
+                    self.wechatKey_press_count = 0
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("call_phonebook_num",4)
+                    pass
+                elif self.wechatKey_press_count == 3:#拨打通讯录号码三
+                    self.wechatKey_press_count = 0
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("call_phonebook_num",3)
+                    pass
+                elif self.wechatKey_press_count == 2:#拨打通讯录号码一
+                    self.wechatKey_press_count = 0
+                    # EventMesh.publish("stop_led_timer")#设置参数
+                    # EventMesh.publish("call_phonebook_num",1)
+                    # EventMesh.publish("interup_call_event")#
+                    pass
+                elif self.wechatKey_press_count == 1:#播放最后收到的语音
+                    self.wechatKey_press_count = 0
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    video_state = EventMesh.publish("get_video_state") 
+                    # print("video_state call",video_state)
+                    if video_state != 0:
+                        if video_state == 6:#2 是app拨打手表 1 是手表打app 3 是正在视频通话中 0 关闭只有第一次视频通话打入才允许接听 接通之后不允许接听了
+                            EventMesh.publish("video_answer_cb")
+                        return
+                    call_state = EventMesh.publish("get_call_state") 
+                    if call_state == 0:
+                        fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+                        if fall_down != None:
+                            if fall_down != 0:
+                                EventMesh.publish_async("dial_sos_phone")#拨打sos号码
+                                return
+                    else:
+                        if call_state == 2:#电话拨进需要接听
+                            EventMesh.publish("answer_call_event")#接听电话
+                            return
+                    EventMesh.publish("play_wechat_last_amr")
+                    # pass
+                self.wechatKey_press_count = 0
+            
+    
+
+
+        def pwk_press_cb(self, *args):
+            '''KEY2:联动屏幕右下角或返回键长按关机'''
+            if self.pwk_press == 1 :
+                
+                self.pwk_count += 1
+                EventMesh.debug_log("self.pwk_count {}",self.pwk_count)
+                if self.GPIO26_status == 1:#松开
+                    if self.pwk_count >= 1: #防抖100ms
+                        self.__pwk_timer.stop()
+                        self.pwk_count = 0
+                        self.pwk_press = 0
+                        EventMesh.debug_log("self.pwk_press_cb")
+
+                if self.pwk_count > (self.__PowerDownTimeOut//100): #长按
+                    self.__pwk_timer.stop()
+                    self.pwk_count = 0
+                    self.pwk_press = 0
+                    EventMesh.debug_log("btn8_long_press")
+
+        def __ui_callback(self, para):
+        # EventMesh.debug_log("para = {}".format(para))
+            if para == 0:
+                EventMesh.publish("done_left_to_right")
+                #EventMesh.debug_log("<-")
+            elif para == 1:
+                EventMesh.publish("done_right_to_left")
+                #EventMesh.debug_log("->")
+            elif para == 2:
+                EventMesh.publish("done_bottom_to_top")
+                #EventMesh.debug_log("^")
+            elif para == 3:
+                EventMesh.publish("done_top_to_bottom")
+                #EventMesh.debug_log("V")
+            elif para == 4:
+                EventMesh.publish("done_return")
+                #EventMesh.debug_log("return")
+            elif para == 5:
+                EventMesh.publish("done_click")
+                #EventMesh.debug_log("CLICK")
+            elif para == 6:
+                EventMesh.publish("done_press")
+                #EventMesh.debug_log("press")
+            elif (para == 6):
+                EventMesh.publish("done_error")
+                #EventMesh.debug_log("error")
+
+        def key_callback(self, l_list):
+            EventMesh.debug_log("key_callback:",str(l_list))
+            if l_list[0] == 1:
+                # 马达震动预留
+                pass
+            if (l_list[1] == 3) and (l_list[2] == 0):
+                if l_list[0] == 1:
+                    #self.pwk_press = 0
+                    EventMesh.publish("btn1_press")
+                else:
+                    pass
+                    # EventMesh.publish("btn1_press")
+
+
+
+
+        def powerKey_callback(self, status):
+            EventMesh.debug_log('==pwr:', status)# 0 1 0
+            self.powerKey_status = status
+            if self.pwk_press == 1: #按按钮时不处理
+                return
+        
+            
+                
+
+        def power_key_press_cb(self, *args):
+            pass
+            # if EventMesh.publish(constants.EVENT.GET_CONNECT) == 0:#未插卡的情况下强制关机
+                # EventMesh.publish("open_power_on", 2)#
+
+
+        def start(self):
+            self.post_processor_after_instantiation()
diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/config.json b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/config.json
new file mode 100644 (file)
index 0000000..334b3b6
--- /dev/null
@@ -0,0 +1,12 @@
+{
+  "old_time": 0,
+  "flip_sw": 0,
+  "VC_TTS_voice_type": {
+    "3": "aliyun::longjiaxin",
+    "2": "huoshan::zh_male_tiancaitongsheng_mars_bigtts",
+    "4": "huoshan::zh_female_daimengchuanmei_moon_bigtts",
+    "1": "huoshan::zh_male_wennuanahu_moon_bigtts",
+    "0": "huoshan::zh_female_wanwanxiaohe_moon_bigtts"
+  },
+  "dev_pass": "dEX5qdAPR2lhOBRmHbgbmPKZsPAcGN"
+}
\ No newline at end of file
diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/constants.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/constants.py
new file mode 100644 (file)
index 0000000..38d9214
--- /dev/null
@@ -0,0 +1,225 @@
+class PROTOCOL:
+    LK_SEND = "LK_SEND"
+    LK_RECV = "LK_RECV"
+
+    PING_SEND = "PING_SEND"
+    PING_RECV = "PING_RECV"
+
+    KA_SEND = "KA_SEND"
+    KA_RECV = "KA_RECV"
+
+    UD_SEND = "UD_SEND"
+    UD_RECV = "UD_RECV"
+
+    CR_SEND = "CR_SEND"
+    CR_RECV = "CR_RECV"
+
+    AL_SEND = "AL_SEND"
+    AL_RECV = "AL_RECV"
+
+    FIND_SEND = "FIND_SEND"
+    FIND_RECV = "FIND_RECV"
+
+    POWEROFF_SEND = "POWEROFF_SEND"
+    POWEROFF_RECV = "POWEROFF_RECV"
+
+    PHL_SEND = "PHL_SEND"
+    PHL_RECV = "PHL_RECV"
+
+    TK_SEND = "TK_SEND"
+    TK_RECV = "TK_RECV"
+
+    TKS_SEND = "TKS_SEND"
+    TKS_RECV = "TKS_RECV"
+
+    MESSAGE_SEND = "MESSAGE_SEND"
+    MESSAGE_RECV = "MESSAGE_RECV"
+
+    WT_SEND = "WT_SEND"
+    WT_RECV = "WT_RECV"
+
+    REMIND_SEND = "REMIND_SEND"
+    REMIND_RECV = "REMIND_RECV"
+
+    HRTSTART_SEND = "hrtstart_SEND"
+    HRTSTART_RECV = "hrtstart_RECV"
+
+    HEART_SEND = "heart_SEND"
+    HEART_RECV = "heart_RECV"
+    
+    OXYGEN_SEND = "oxygen_SEND"
+    OXYGEN_RECV = "oxygen_RECV"
+
+    OXSTART_SEND = "oxstart_SEND"
+    OXSTART_RECV = "oxstart_RECV"
+
+    TEMP_SEND = "temp_SEND"
+    TEMP_RECV = "temp_RECV"
+
+    DLT_SEND = "DLT_SEND"
+    DLT_RECV = "DLT_RECV"
+
+    UPLOAD_SEND = "UPLOAD_SEND"
+    UPLOAD_RECV = "UPLOAD_RECV"
+
+    CENTER_SEND = "CENTER_SEND"
+    CENTER_RECV = "CENTER_RECV"
+
+    MONITOR_SEND = "MONITOR_SEND"
+    MONITOR_RECV = "MONITOR_RECV"
+
+    SOS_SEND = "SOS_SEND"
+    SOS_RECV = "SOS_RECV"
+
+    BOOTOFF_SEND = "BOOTOFF_SEND"
+    BOOTOFF_RECV = "BOOTOFF_RECV"
+
+    WDSTART_SEND ="wdstart_SEND"
+    WDSTART_RECV ="wdstart_RECV"
+
+
+    LOWBAT_SEND = "LOWBAT_SEND"
+    LOWBAT_RECV = "LOWBAT_RECV"
+
+    TIME_SEND = "Time_SEND"
+    TIME_RECV = "Time_RECV"
+
+    WLKEY_SEND = "WLKEY_SEND"
+    WLKEY_RECV = "WLKEY_RECV"
+
+    SILENCETIME2_SEND = "SILENCETIME2_SEND"
+    SILENCETIME2_RECV = "SILENCETIME2_RECV"
+
+    KEYBRD_SEND = "KEYBRD_SEND"
+    KEYBRD_RECV = "KEYBRD_RECV"
+
+    FALLDOWN_SEND = "FALLDOWN_SEND"
+    FALLDOWN_RECV = "FALLDOWN_RECV"
+    
+    HELP_SEND = "HELP_SEND"
+    HELP_RECV = "HELP_RECV"
+    
+    REMOVE_SEND = "REMOVE_SEND"
+    REMOVE_RECV = "REMOVE_RECV"
+
+    BLOOD_SEND = "blood_SEND"
+    BLOOD_RECV = "blood_RECV"
+
+    BLDSTART_SEND ="bldstart_SEND"
+    BLDSTART_RECV = "bldstart_RECV"
+
+    BGSTART_SEND = "bgstart_SEND"
+    BGSTART_RECV = "bgstart_RECV"
+
+    BLOODGLUSOCE_SEND = "bloodglucose_SEND"
+    BLOODGLUSOCE_RECV = "bloodglucose_RECV"
+
+    REMIND_CH_DRINK_SEND = "REMIND_CH_DRINK_SEND"
+    REMIND_CH_DRINK_RECV = "REMIND_CH_DRINK_RECV"
+
+    REMIND_CH_MEDICINE2_SEND = "REMIND_CH_MEDICINE2_SEND"
+    REMIND_CH_MEDICINE2_RECV = "REMIND_CH_MEDICINE2_RECV"
+
+    REMIND_CH_HOME_SEND = "REMIND_CH_HOME_SEND"
+    REMIND_CH_HOME_RECV = "REMIND_CH_HOME_RECV"
+
+    REMIND_CH_WAKEUP_SEND = "REMIND_CH_WAKEUP_SEND"
+    REMIND_CH_WAKEUP_RECV = "REMIND_CH_WAKEUP_RECV"
+
+    REMIND_CH_SLEEP_SEND = "REMIND_CH_SLEEP_SEND"
+    REMIND_CH_SLEEP_RECV = "REMIND_CH_SLEEP_RECV"
+
+    REMIND_CH_REST_SEND = "REMIND_CH_REST_SEND"
+    REMIND_CH_REST_RECV = "REMIND_CH_REST_RECV"
+
+    SLEEP_DATA_SEND = "SleepReport_SEND"
+    SLEEP_DATA_RECV = "SleepReport_RECV"
+
+    SLEEPTIME_SEND = "SLEEPTIME_SEND"
+    SLEEPTIME_RECV = "SLEEPTIME_RECV"
+
+    FACTORY_SEND = "FACTORY_SEND"
+    FACTORY_RECV = "FACTORY_RECV"
+
+    RESET_SEND = "RESET_SEND"
+    RESET_RECV = "RESET_RECV"
+
+    REMIND_CH_SIT_SEND = "REMIND_CH_SIT_SEND"
+    REMIND_CH_SIT_RECV = "REMIND_CH_SIT_RECV"
+
+    SCREEN_SHOW_SEND = "SCREEN_SHOW_SEND"
+    SCREEN_SHOW_RECV = "SCREEN_SHOW_RECV"
+
+    JPREG_SEND = "JPREG_SEND"
+    JPREG_RECV = "JPREG_RECV"
+
+    MEMBERS_SEND = "MEMBERS_SEND"
+    MEMBERS_RECV = "MEMBERS_RECV"
+
+    CALLING_SEND = "CALLING_SEND"
+    CALLING_RECV = "CALLING_RECV"
+    
+
+    RCALLING_SEND  = "RCALLING_SEND"
+    RCALLING_RECV  = "RCALLING_RECV"
+
+    AGTALK_SEND = "AGTALK_SEND"
+    AGTALK_RECV = "AGTALK_RECV"
+
+    RTALK_SEND = "RTALK_SEND"
+    RTALK_RECV = "RTALK_RECV"
+
+    JMEMBERS_SEND = "JMEMBERS_SEND"
+    JMEMBERS_RECV = "JMEMBERS_RECV"
+
+    RINGING_SEND = "RINGING_SEND"
+    RINGING_RECV = "RINGING_RECV"
+
+    HANGUP_SEND = "HANGUP_SEND"
+    HANGUP_RECV = "HANGUP_RECV"
+
+    CALLCANCEL_SEND ="CALLCANCEL_SEND"
+    CALLCANCEL_RECV = "CALLCANCEL_RECV"
+    
+
+class EVENT:
+    CHANNEL_SOCKET_SEND = "CHANNEL_SOCKET_SEND"
+    START_LOCATION = "START_LOCATION" 
+    START_LOCATION_TEST = "START_LOCATION_TEST" 
+    READ_LOCATION = "READ_LOCATION"  
+    CLOSE_LOCATION = "CLOSE_LOCATION"
+    GPSOPEN = "GPSOPEN"
+    GPSCLOSE = "GPSCLOSE"
+    GPSINFO = "GPSINFO"
+    WIFISCANOPEN = "WIFISCANOPEN"
+    WIFIINFO = "WIFIINFO"
+
+    GET_KEY = "GET_KEY"
+    SET_KEY = "SET_KEY"
+    GET_IMEI = "GET_IMEI"
+    GET_CID = "GET_CID"
+    SET_CID = "SET_CID"
+    GET_IMSI = "GET_IMSI"
+    GET_PASSWORD = "GET_PASSWORD"
+    SET_PASSWORD = "SET_PASSWORD"
+    GET_BATTERY = "GET_BATTERY"
+    PERSISTENT_CONFIG_GET = "PERSISTENT_CONFIG_GET"
+    PERSISTENT_CONFIG_STORE = "PERSISTENT_CONFIG_STORE"
+    SET_PING = "SET_PING"
+    GET_PING = "GET_PING"
+    SET_CONNECT = "SET_CONNECT"
+    GET_CONNECT = "GET_CONNECT"
+    GET_STEP = "GET_STEP"
+    PUSH_STEP = "PUSH_STEP"
+    SYSTEM_SLEEP = "SYSTEM_SLEEP"
+    SYSTEM_UP = "SYSTEM_UP"
+    START_HEART = "START_HEART" 
+    GET_HEART = "GET_HEART"
+    STOP_HEART = "STOP_HEART"
+    GET_WEAR = "GET_WEAR"
+    START_TEMP = "START_TEMP"
+    STOP_TEMP = "STOP_TEMP"
+    GET_TEMP = "GET_TEMP"
+    START_BLOOD_OXYGEN = "STARTT_BLOOD_OXYGEN" 
+    GET_BLOOD_OXYGEN = "GET_BLOOD_OXYGEN"
+    STOP_BLOOD_OXYGEN = "STOP_BLOOD_OXYGEN"
diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/led.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/led.py
new file mode 100644 (file)
index 0000000..a1b19e0
--- /dev/null
@@ -0,0 +1,587 @@
+from common import Abstract
+import osTimer
+import EventMesh
+from machine import Pin
+import utime
+
+from queue import Queue
+import _thread
+import usys
+
+led_red = Pin(Pin.GPIO36, Pin.OUT, Pin.PULL_PD, 0)
+
+led_green = Pin(Pin.GPIO44, Pin.OUT, Pin.PULL_PD, 0)
+
+led_white = Pin(Pin.GPIO21, Pin.OUT, Pin.PULL_PD, 0)
+
+
+
+def green_light_fast(num,freq):#快闪 num 循环闪烁次数 freq 交替闪烁的频率ms单位 
+    for i in range(num):
+        led_green.write(1)
+        utime.sleep_ms(freq)
+        led_green.write(0)
+        utime.sleep_ms(freq)
+
+def red_light_fast(num,freq):#快闪 #快闪 num 循环闪烁次数 freq 交替闪烁的频率ms单位 
+    for i in range(num):
+        led_red.write(1)
+        utime.sleep_ms(freq)
+        led_red.write(0)
+        utime.sleep_ms(freq)
+def red_light_slow(num,freq):#慢闪 #快闪 num 循环闪烁次数 freq 交替闪烁的频率ms单位 
+    for i in range(10):
+        led_red.write(1)
+        utime.sleep_ms(500)
+        led_red.write(0)
+        utime.sleep_ms(500)
+
+def red_green_light(num,freq):#红绿灯交替闪烁 
+    for i in range(num):
+        led_red.write(1)
+        utime.sleep_ms(freq)
+        led_red.write(0)
+        utime.sleep_ms(freq)
+        led_green.write(1)
+        utime.sleep_ms(freq)
+        led_green.write(0)
+        utime.sleep_ms(freq)
+
+def open_led_red():
+    led_red.write(1)
+
+def close_led_red():
+    led_red.write(0)
+
+def open_led_white():
+    led_white.write(1)
+
+def close_led_white():
+    led_white.write(0)
+
+def open_led_green():
+    led_green.write(1)
+
+def close_led_green():
+    led_green.write(0)
+
+
+
+LED_TIMER_OUT = 100 
+class led_mode:
+    LONG_LIGHT_RED = 1
+    LONG_LIGHT_GREEN = 2
+    LONG_LIGHT_WHITE = 3
+    FLASH_LIGHT_RED = 4
+    FLASH_LIGHT_GREEN = 5
+    FLASH_LIGHT_WHITE = 6
+    FLASH_LIGHT_RED_GREEN = 7
+    FLASH_LIGHT_RED_WHITE = 8
+    FLASH_LIGHT_GREEN_WHITE = 9
+    LIGHT_NONE = FLASH_LIGHT_GREEN_WHITE+1
+
+    DEFAULT_LONG_LIGHT_MODE = 0+LIGHT_NONE #默认是关闭
+    OPEN_LONG_LIGHT_MODE = 1+LIGHT_NONE#开启
+    CLOSE_LONG_LIGHT_MODE = 2+LIGHT_NONE#需要关闭
+    INTERVAL_LIGHT_RED  = 3+LIGHT_NONE
+    INTERVAL_LIGHT_GREEN  = 4+LIGHT_NONE
+    INTERVAL_LIGHT_WHITE  = 5+LIGHT_NONE
+
+    OTHER_MEASURE_MODE = 200
+
+    HEALTH_LED_MODE = 201 #健康测试模式
+    WECHAT_LED_MODE = 202 #微聊模式
+    CHARGE_IN_MODE = 203 #充电模式
+    CHARGE_OUT_MODE = 204 #充电已移出
+    CHARGE_FULL_MODE = 205 #充电已满
+    POWER_OFF_MODE = 206 #关机模式
+
+
+
+
+
+class ledEventManager(Abstract):#灯事件
+    def __init__(self):
+        self.timer = osTimer()
+        self.freq_time = 0#交替闪烁时间 最小100ms 
+        self.freq_num = 0#交替闪烁的次数
+        self.flash_light = 0
+        self.total_time = 0
+        self.long_count = 0
+        self.timer_state = 0
+        self.total_count = 0
+        self.freq = 0
+        self.led_state = 0
+        self.long_light_mode = 0
+        self.hr_state = 0
+        self.wechat_btn = 1
+        self.need_hr_btn = 0
+        self.led_open_time = 0
+        self.led_close_time = 0
+        self.led_total_time = 0#闪的总时间
+        self.led_enable = 0
+        self.led_mode = 0
+        self.working_led_mode = None
+        self.ledInfo_queue = Queue()
+        _thread.stack_size(10*1024)
+        _thread.start_new_thread(self.ledInfo_queue_thread, ())
+        _thread.stack_size(8*1024)
+        EventMesh.subscribe("publish_message_event_ledInfo",self.publish_message_event_ledInfo)
+        pass
+    
+        
+
+    def post_processor_after_instantiation(self):
+        EventMesh.subscribe("set_led_time_arg", self.set_led_time_arg)#设置参数
+        EventMesh.subscribe("get_led_state", self.get_led_state)#设置参数
+
+        EventMesh.subscribe("set_hr_blood_led", self.set_hr_blood_led)#设置参数
+
+        EventMesh.subscribe("set_find_watch_led", self.set_find_watch_led)#设置参数
+
+        EventMesh.subscribe("close_all_led", self.close_all_led)#设置参数
+
+        EventMesh.subscribe("stop_led_timer", self.stop_led_timer)#设置参数
+
+        EventMesh.subscribe("read_red_led_level", self.read_red_led_level)#读取红灯的电平状态
+
+        EventMesh.subscribe("read_green_led_level", self.read_green_led_level)#读取绿灯的电平状态
+
+        EventMesh.subscribe("read_white_led_level", self.read_white_led_level)#读取白灯的电平状态
+
+        EventMesh.subscribe("close_led_pin", self.close_led_pin)#读取白灯的电平状态def close_led_pin(self, event, msg):
+
+
+    def ledInfo_queue_thread(self):
+        while True:
+            data = self.ledInfo_queue.get()
+            #EventMesh.debug_log("ledInfo_queue:data = {}".format(data))
+            if data != None:
+                try:
+                    data["func"](data["data"])
+                except Exception as e:
+                    EventMesh.debug_log("ledInfo_queue:ERROR:{}".format(e))
+                    usys.print_exception(e)
+    def publish_message_event_ledInfo(self,event,msg):
+        self.ledInfo_queue.put(msg)
+
+    def publish_led_event_cb(self, *args, **kwargs):
+        EventMesh.publish("publish_message_event_ledInfo",{"func":self.led_fun_cb,"data":0})  
+
+    def read_red_led_level(self, event, msg): #
+        red_level = led_red.read()
+        return red_level
+
+    def read_green_led_level(self, event, msg): #
+        green_level = led_green.read()
+        return green_level
+    
+    def read_white_led_level(self, event, msg): #
+        white_level = led_green.read()
+        return white_level
+
+    def set_hr_blood_led(self, event, msg): #
+        EventMesh.debug_log("set_hr_blood_led :{}".format(msg))
+        if msg != None:
+            if msg == 1:
+                EventMesh.publish("set_led_time_arg",[1,2,10*70*2,led_mode.FLASH_LIGHT_RED_GREEN,10,5,led_mode.HEALTH_LED_MODE])#測量成功
+                # EventMesh.publish("set_led_time_arg",[1000,200,300,led_mode.FLASH_LIGHT_RED_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.HEALTH_LED_MODE])#開始測量
+            elif msg == 2:
+                EventMesh.publish("set_led_time_arg",[1,2,60,led_mode.FLASH_LIGHT_GREEN,60,30,led_mode.OTHER_MEASURE_MODE])#測量成功
+                # EventMesh.publish("set_led_time_arg",[3000,1000,1,led_mode.LONG_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#測量成功
+            elif msg == 3:#测量失败
+                EventMesh.publish("stop_led_timer")
+                # EventMesh.publish("set_led_time_arg",[1,1,1,led_mode.FLASH_LIGHT_RED,31,10*3,led_mode.OTHER_MEASURE_MODE])#測量成功
+                pass
+                # EventMesh.publish("set_led_time_arg",[1,1,30,led_mode.FLASH_LIGHT_RED,31,10*3,led_mode.OTHER_MEASURE_MODE])#测量失败
+                #加音频文件
+
+    def set_find_watch_led(self, event, msg): #查找设备
+        EventMesh.publish("OPEN_FIND_WATCH")#
+       
+        # EventMesh.publish("set_led_time_arg",[37000,1000,1,led_mode.LONG_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#查找设备绿灯长亮37s
+
+    def get_led_state(self, event, msg): #
+        return self.timer_state
+    def open_timer(self,msg): #msg 0 使能 1总的时间 2 灯模式 3 开启时间 4 关闭时间 
+        if msg != None:
+            if len(msg) != 0:
+                self.led_total_time = msg[2]#
+                # EventMesh.debug_log("open_timer:{}".format(msg))
+                if self.led_total_time != None:
+
+                    if self.led_total_time > 0:
+                        self.led_enable=msg[0]
+                        if self.led_enable != 0:
+                            self.led_mode = msg[1]
+                            self.long_light_mode = msg[3]
+                            self.led_open_time = msg[4]
+                            self.led_close_time = msg[5]
+                            self.working_led_mode = msg[6]
+                            self.long_count = 0
+
+                            if self.timer_state == 0:
+                                self.timer_state = 1
+                                self.timer.stop()
+                                # self.timer.start(LED_TIMER_OUT,1,self.led_fun_cb)
+                                self.timer.start(LED_TIMER_OUT,1,self.publish_led_event_cb)
+                
+        
+
+
+    def set_led_time_arg(self, event, msg): #msg 
+        
+        open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+        power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+        # EventMesh.debug_log("set_led_time_arg",msg,open_power,power_off)
+        if open_power != None:
+            if open_power == 0:
+                return
+        if power_off != None:
+            if power_off == 1:
+                return
+        usb_in = EventMesh.publish("get_usb")#
+        if msg != None:
+            if msg[6] != led_mode.POWER_OFF_MODE:#插入usb关机以防不亮红绿灯
+                # EventMesh.debug_log("usb_in",usb_in)
+                if usb_in != None:
+                    if usb_in == 1 or usb_in == 3:#正在充电或者充电已满都不要被打断
+                        if self.timer_state == 1:
+                            self.timer_state = 0
+                            self.timer.stop()
+                        if usb_in == 1:
+                            if self.working_led_mode != led_mode.CHARGE_IN_MODE:
+                                str_buf = [1,1,10,led_mode.LONG_LIGHT_RED,4,2,led_mode.CHARGE_IN_MODE]
+                                self.open_timer(str_buf)
+                            self.working_led_mode = led_mode.CHARGE_IN_MODE
+
+                        elif usb_in == 3:
+                            if self.working_led_mode != led_mode.CHARGE_FULL_MODE:
+                                str_buf = [1,1,10,led_mode.LONG_LIGHT_GREEN,4,2,led_mode.CHARGE_FULL_MODE]
+                                self.open_timer(str_buf)
+                            self.working_led_mode = led_mode.CHARGE_FULL_MODE
+                        
+                        return
+                    else:
+                        if msg[5] != led_mode.HEALTH_LED_MODE:
+                            self.working_led_mode = led_mode.OTHER_MEASURE_MODE
+
+                        get_hr_state = EventMesh.publish("get_hr_state")
+                        get_spo2_state = EventMesh.publish("get_spo2_state")
+                        
+                        wechat_state = EventMesh.publish("get_wechat_state")
+                        temp_state = EventMesh.publish("get_temp_state")
+                        bp_state = EventMesh.publish("get_bp_state")
+                        bg_state = EventMesh.publish("get_bg_state")
+                        EventMesh.debug_log("get_hr_state",get_hr_state,get_spo2_state,temp_state,wechat_state,self.working_led_mode)
+                        if wechat_state != None: #获取微聊状态
+                            if wechat_state == 1:
+                                if self.working_led_mode != led_mode.WECHAT_LED_MODE:#如果不在亮微聊模式需要亮微聊模式
+                                    self.timer_state = 0
+                                    self.timer.stop()
+                                    str_buf = [1,1,1,led_mode.LONG_LIGHT_GREEN,4,2,led_mode.WECHAT_LED_MODE]
+                                    self.open_timer(str_buf)
+                                    self.working_led_mode = led_mode.WECHAT_LED_MODE
+                                    return
+                                else:
+                                    return
+                            else:
+                                self.wechat_btn = 0
+                                # if get_hr_state != 0 or get_spo2_state != 0 or temp_state != 0 or bp_state != 0 or bg_state != 0 :#心率血氧优先级高
+                                if get_hr_state == 1 or get_spo2_state == 1 or temp_state == 1 \
+                                or bp_state == 1  or bg_state == 1:
+                                    if self.working_led_mode != led_mode.HEALTH_LED_MODE:#如果不在亮微聊模式需要亮微聊模式
+                                        EventMesh.debug_log("set_hr_blood_led!!!!!!!!!!")
+                                        str_buf = [1,2,10*70*2,led_mode.FLASH_LIGHT_RED_GREEN,10,5,led_mode.HEALTH_LED_MODE]#測量成功
+                                        self.timer_state = 0
+                                        self.timer.stop()
+                                        self.open_timer(str_buf)
+                                        self.working_led_mode = led_mode.HEALTH_LED_MODE
+                                        return
+                                    else:
+                                        EventMesh.debug_log("set_hr_blood_led stop!!!!!!!!!!")
+                                        return
+                                else:# 0 2都认为其他模式灯亮 不是测试健康灯
+                                    self.working_led_mode = led_mode.OTHER_MEASURE_MODE
+        self.open_timer(msg)
+
+
+   
+    # EventMesh.publish("set_led_time_arg",[1,2,2*300,led_mode.FLASH_LIGHT_RED_GREEN,2,1,led_mode.HEALTH_LED_MODE])#測量成功
+    def led_fun_cb(self, data):#
+        if self.led_enable == 0 or self.led_total_time == 0:
+            return
+        call_state = EventMesh.publish("get_call_state")
+        if call_state == None:
+            call_state = 0
+        if call_state != 0:
+            battery = EventMesh.publish("screen_get_battery")
+            if battery != None:
+                if battery[0] != "1":#在充电得时候
+                    get_hr_state = EventMesh.publish("get_hr_state")
+                    get_spo2_state = EventMesh.publish("get_spo2_state")
+                    get_temp_state = EventMesh.publish("get_temp_state")
+                    get_bp_state = EventMesh.publish("get_bp_state")
+                    get_bg_state = EventMesh.publish("get_bg_state")
+                    if get_hr_state != None and  get_spo2_state != None and get_temp_state != None and get_bp_state != None and get_bg_state != None:
+                        if get_hr_state == 1 or get_spo2_state == 1 or get_temp_state == 1 or get_bp_state == 1 or get_bg_state == 1:
+                                EventMesh.publish("close_hr_sop2")
+                                EventMesh.publish("close_led_pin")
+                                return
+        # EventMesh.debug_log("self.long_count",self.long_count)
+        if self.led_total_time != 0:
+            #红灯闪烁
+            if self.long_light_mode == led_mode.FLASH_LIGHT_RED :#
+                if self.led_mode == 1:
+                    if self.led_total_time > 0:
+                        self.led_total_time-=1
+                        if self.led_total_time > 0:
+                            close_led_green()
+                            close_led_white()
+                            open_led_red()
+                        else:
+                            EventMesh.publish("stop_led_timer")#关闭所有的灯
+                elif self.led_mode == 2:
+                    # EventMesh.debug_log("led red!!!!!!!")
+                    
+                    if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms 
+                        close_led_green()
+                        close_led_white()
+                        open_led_red()
+                    else:
+                        close_led_green()
+                        close_led_white()
+                        close_led_red()
+                    if self.long_count >= self.led_total_time-1:#大于总的时间 4
+                        EventMesh.publish("stop_led_timer")#设置参数
+                        return
+                    self.long_count+=1
+            #绿灯闪烁
+            elif self.long_light_mode == led_mode.FLASH_LIGHT_GREEN:#
+                if self.led_mode == 1:#长亮时间限制
+                    
+                    if self.led_total_time > 0:
+                        self.led_total_time-=1
+                        if self.led_total_time > 0:
+                            close_led_red()
+                            close_led_white()
+                            open_led_green()
+                        else:
+                            EventMesh.publish("stop_led_timer")#关闭所有的灯
+                        
+
+                elif self.led_mode == 2:
+                    
+                    if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms 
+                        close_led_red()
+                        close_led_white()
+                        open_led_green()
+                        pass
+                    else:
+                        close_led_green()
+                        close_led_white()
+                        close_led_red()
+                        pass
+                    
+                    if self.long_count >= self.led_total_time-1:#大于总的时间 4
+                        EventMesh.publish("stop_led_timer")#设置参数
+                        return
+                    self.long_count+=1
+            #蓝灯闪烁 暂时是白色灯
+            elif self.long_light_mode == led_mode.FLASH_LIGHT_WHITE:#
+                if self.led_mode == 1:#长亮时间限制
+                    if self.led_total_time > 0:
+                        self.led_total_time-=1
+                        if self.led_total_time > 0:
+                            close_led_red()
+                            close_led_green()
+                            open_led_white()
+                        else:
+                            EventMesh.publish("stop_led_timer")#关闭所有的灯
+                elif self.led_mode == 2:
+                    if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms 
+                        close_led_red()
+                        close_led_green()
+                        open_led_white()
+                        pass
+                    else:
+                        close_led_green()
+                        close_led_white()
+                        close_led_red()
+                        pass
+                    if self.long_count >= self.led_total_time-1:#大于总的时间 4
+                        EventMesh.publish("stop_led_timer")#设置参数
+                        return
+                    self.long_count+=1
+            #红绿灯闪烁
+            elif self.long_light_mode == led_mode.FLASH_LIGHT_RED_GREEN:#
+                
+                
+                if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms 
+                    close_led_white()#白色灯
+                    close_led_green()
+                    open_led_red()
+                    pass
+                else: 
+                    close_led_white()
+                    close_led_red()
+                    open_led_green()
+                    pass
+                if self.long_count >= self.led_total_time-1:#大于总的时间 4
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    return
+                self.long_count+=1
+            #红蓝灯闪烁 蓝变成白色灯
+            elif self.long_light_mode == led_mode.FLASH_LIGHT_RED_WHITE:#
+                if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms 
+                    close_led_white()#白色灯
+                    close_led_green()
+                    open_led_red()
+                    pass
+                else:
+                    close_led_green()
+                    close_led_red()
+                    open_led_white()
+                    pass
+                if self.long_count >= self.led_total_time-1:#大于总的时间 4
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    return
+                self.long_count+=1
+            #蓝绿灯闪烁
+            elif self.long_light_mode == led_mode.FLASH_LIGHT_GREEN_WHITE:#
+
+                
+                if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms 
+                    close_led_white()#白色灯
+                    close_led_red()
+                    open_led_green()
+                    pass
+                else:
+                    close_led_green()
+                    close_led_red()
+                    open_led_white()
+                    pass
+                if self.long_count >= self.led_total_time-1:#大于总的时间 4
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    return
+                self.long_count+=1
+            #红灯长亮
+            elif self.long_light_mode == led_mode.LONG_LIGHT_RED:#
+                close_led_white()#白色灯
+                close_led_green()
+                open_led_red()
+                self.timer.stop()
+                self.timer_state = 0
+                self.led_total_time = 0
+                self.led_enable = 0
+                self.led_mode = 0
+                self.long_light_mode = 0
+                self.led_open_time = 0
+                self.led_close_time = 0
+                self.working_led_mode = 0
+                self.long_count = 0
+
+            #绿灯长亮
+            elif self.long_light_mode == led_mode.LONG_LIGHT_GREEN:#
+                close_led_white()#白色灯
+                close_led_red()
+                open_led_green()
+                self.timer.stop()
+                self.timer_state = 0
+                self.led_total_time = 0
+                self.led_enable = 0
+                self.led_mode = 0
+                self.long_light_mode = 0
+                self.led_open_time = 0
+                self.led_close_time = 0
+                self.working_led_mode = 0
+                self.long_count = 0
+            #蓝灯长亮
+            elif self.long_light_mode == led_mode.LONG_LIGHT_WHITE:#
+                close_led_green()#白色灯
+                close_led_red()
+                open_led_white()
+                self.timer.stop()
+                self.timer_state = 0
+                self.led_total_time = 0
+                self.led_enable = 0
+                self.led_mode = 0
+                self.long_light_mode = 0
+                self.led_open_time = 0
+                self.led_close_time = 0
+                self.working_led_mode = 0
+                self.long_count = 0
+    
+    def close_led_pin(self, event, msg):
+        EventMesh.debug_log("close_led_pin!!!")
+
+        self.timer.stop()
+        self.timer_state = 0
+        self.led_total_time = 0
+        self.led_enable = 0
+        self.led_mode = 0
+        self.long_light_mode = 0
+        self.led_open_time = 0
+        self.led_close_time = 0
+        self.working_led_mode = 0
+        self.long_count = 0
+        close_led_red()
+        close_led_green()
+        close_led_white()
+
+    def stop_led_timer(self, event, msg):
+        EventMesh.publish("close_all_led")#关闭所有的灯
+    
+    def close_all_led(self, event, msg):
+        self.close_all_led_do(0)
+    def close_all_led_do(self,data):   
+        open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+        if open_power != None:
+            if open_power == 0:
+                return
+        open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+        if open_power_off != None:
+            if open_power_off == 1:
+                return
+        usb_in = EventMesh.publish("get_usb")#
+        open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+        if open_power_off != None:
+            if open_power_off != 1:
+                if usb_in != None:
+                    if usb_in == 1 or usb_in == 3:#正在充电或者充电已满都不要被打断
+                        if self.timer_state == 1:
+                            self.timer_state = 0
+                            self.timer.stop()
+                        return
+                    else:
+                        get_hr_state = EventMesh.publish("get_hr_state")
+                        get_spo2_state = EventMesh.publish("get_spo2_state")
+                        
+                        wechat_state = EventMesh.publish("get_wechat_state")
+                        temp_state = EventMesh.publish("get_temp_state")
+                        bp_state = EventMesh.publish("get_bp_state")
+                        bg_state = EventMesh.publish("get_bg_state")
+                        # EventMesh.debug_log("get_hr_state",get_hr_state,get_spo2_state,wechat_state,self.working_led_mode)
+                        if wechat_state != None: #获取微聊状态
+                            if wechat_state == 1 or get_spo2_state == 1  or get_hr_state == 1  or temp_state == 1 or bp_state == 1 \
+                                or bg_state == 1 :
+                                return
+        if self.timer_state == 1:
+            self.timer.stop()
+        self.timer_state = 0
+        self.led_total_time = 0
+        self.led_enable = 0
+        self.led_mode = 0
+        self.long_light_mode = 0
+        self.led_open_time = 0
+        self.led_close_time = 0
+        self.working_led_mode = 0
+        self.long_count = 0
+        close_led_red()
+        close_led_green()
+        close_led_white()
+        # EventMesh.debug_log("close led!!!")
+
+    def led_test_fun_cb(self, data):
+        return
+   
diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/led_d15.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/led_d15.py
new file mode 100644 (file)
index 0000000..4680da9
--- /dev/null
@@ -0,0 +1,590 @@
+from common import Abstract
+import osTimer
+import EventMesh
+from machine import Pin
+import utime
+from queue import Queue
+import _thread
+import usys
+if EventMesh.model == "D15":
+
+    led_red = Pin(Pin.GPIO36, Pin.OUT, Pin.PULL_PD, 0)
+
+    led_green = Pin(Pin.GPIO44, Pin.OUT, Pin.PULL_PD, 0)
+
+    led_white = Pin(Pin.GPIO21, Pin.OUT, Pin.PULL_PD, 0)
+
+
+
+    def green_light_fast(num,freq):#快闪 num 循环闪烁次数 freq 交替闪烁的频率ms单位 
+        for i in range(num):
+            led_green.write(1)
+            utime.sleep_ms(freq)
+            led_green.write(0)
+            utime.sleep_ms(freq)
+
+    def red_light_fast(num,freq):#快闪 #快闪 num 循环闪烁次数 freq 交替闪烁的频率ms单位 
+        for i in range(num):
+            led_red.write(1)
+            utime.sleep_ms(freq)
+            led_red.write(0)
+            utime.sleep_ms(freq)
+    def red_light_slow(num,freq):#慢闪 #快闪 num 循环闪烁次数 freq 交替闪烁的频率ms单位 
+        for i in range(10):
+            led_red.write(1)
+            utime.sleep_ms(500)
+            led_red.write(0)
+            utime.sleep_ms(500)
+
+    def red_green_light(num,freq):#红绿灯交替闪烁 
+        for i in range(num):
+            led_red.write(1)
+            utime.sleep_ms(freq)
+            led_red.write(0)
+            utime.sleep_ms(freq)
+            led_green.write(1)
+            utime.sleep_ms(freq)
+            led_green.write(0)
+            utime.sleep_ms(freq)
+
+    def open_led_red():
+        led_red.write(1)
+
+    def close_led_red():
+        led_red.write(0)
+
+    def open_led_white():
+        led_white.write(1)
+
+    def close_led_white():
+        led_white.write(0)
+
+    def open_led_green():
+        led_green.write(1)
+
+    def close_led_green():
+        led_green.write(0)
+
+
+
+    LED_TIMER_OUT = 100 
+    class led_mode:
+        LONG_LIGHT_RED = 1
+        LONG_LIGHT_GREEN = 2
+        LONG_LIGHT_WHITE = 3
+        FLASH_LIGHT_RED = 4
+        FLASH_LIGHT_GREEN = 5
+        FLASH_LIGHT_WHITE = 6
+        FLASH_LIGHT_RED_GREEN = 7
+        FLASH_LIGHT_RED_WHITE = 8
+        FLASH_LIGHT_GREEN_WHITE = 9
+        LIGHT_NONE = FLASH_LIGHT_GREEN_WHITE+1
+
+        DEFAULT_LONG_LIGHT_MODE = 0+LIGHT_NONE #默认是关闭
+        OPEN_LONG_LIGHT_MODE = 1+LIGHT_NONE#开启
+        CLOSE_LONG_LIGHT_MODE = 2+LIGHT_NONE#需要关闭
+        INTERVAL_LIGHT_RED  = 3+LIGHT_NONE
+        INTERVAL_LIGHT_GREEN  = 4+LIGHT_NONE
+        INTERVAL_LIGHT_WHITE  = 5+LIGHT_NONE
+
+        OTHER_MEASURE_MODE = 200
+
+        HEALTH_LED_MODE = 201 #健康测试模式
+        WECHAT_LED_MODE = 202 #微聊模式
+        CHARGE_IN_MODE = 203 #充电模式
+        CHARGE_OUT_MODE = 204 #充电已移出
+        CHARGE_FULL_MODE = 205 #充电已满
+        POWER_OFF_MODE = 206 #关机模式
+
+        VIDEO_MEASURE_MODE = 207 #视频通话
+
+
+
+
+
+    class ledEventManager(Abstract):#灯事件
+        def __init__(self):
+            self.timer = osTimer()
+            self.freq_time = 0#交替闪烁时间 最小100ms 
+            self.freq_num = 0#交替闪烁的次数
+            self.flash_light = 0
+            self.total_time = 0
+            self.long_count = 0
+            self.timer_state = 0
+            self.total_count = 0
+            self.freq = 0
+            self.led_state = 0
+            self.long_light_mode = 0
+            self.hr_state = 0
+            self.wechat_btn = 1
+            self.need_hr_btn = 0
+            self.led_open_time = 0
+            self.led_close_time = 0
+            self.led_total_time = 0#闪的总时间
+            self.led_enable = 0
+            self.led_mode = 0
+            self.working_led_mode = None
+            self.ledInfo_queue = Queue()
+            _thread.stack_size(10*1024)
+            _thread.start_new_thread(self.ledInfo_queue_thread, ())
+            _thread.stack_size(8*1024)
+            EventMesh.subscribe("publish_message_event_ledInfo",self.publish_message_event_ledInfo)
+            pass
+        
+            
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_led_time_arg", self.set_led_time_arg)#设置参数
+            EventMesh.subscribe("get_led_state", self.get_led_state)#设置参数
+
+            EventMesh.subscribe("set_hr_blood_led", self.set_hr_blood_led)#设置参数
+
+            EventMesh.subscribe("set_find_watch_led", self.set_find_watch_led)#设置参数
+
+            EventMesh.subscribe("close_all_led", self.close_all_led)#设置参数
+
+            EventMesh.subscribe("stop_led_timer", self.stop_led_timer)#设置参数
+
+            EventMesh.subscribe("read_red_led_level", self.read_red_led_level)#读取红灯的电平状态
+
+            EventMesh.subscribe("read_green_led_level", self.read_green_led_level)#读取绿灯的电平状态
+
+            EventMesh.subscribe("read_white_led_level", self.read_white_led_level)#读取白灯的电平状态
+
+            EventMesh.subscribe("close_led_pin", self.close_led_pin)#读取白灯的电平状态def close_led_pin(self, event, msg):
+
+
+        def ledInfo_queue_thread(self):
+            while True:
+                data = self.ledInfo_queue.get()
+                #EventMesh.debug_log("ledInfo_queue:data = {}".format(data))
+                if data != None:
+                    try:
+                        data["func"](data["data"])
+                    except Exception as e:
+                        EventMesh.debug_log("ledInfo_queue:ERROR:{}".format(e))
+                        usys.print_exception(e)
+        def publish_message_event_ledInfo(self,event,msg):
+            self.ledInfo_queue.put(msg)
+
+        def publish_led_event_cb(self, *args, **kwargs):
+            EventMesh.publish("publish_message_event_ledInfo",{"func":self.led_fun_cb,"data":0})  
+
+        def read_red_led_level(self, event, msg): #
+            red_level = led_red.read()
+            return red_level
+
+        def read_green_led_level(self, event, msg): #
+            green_level = led_green.read()
+            return green_level
+        
+        def read_white_led_level(self, event, msg): #
+            white_level = led_green.read()
+            return white_level
+
+        def set_hr_blood_led(self, event, msg): #
+            EventMesh.debug_log("set_hr_blood_led :{}".format(msg))
+            if msg != None:
+                if msg == 1:
+                    EventMesh.publish("set_led_time_arg",[1,2,10*70*2,led_mode.FLASH_LIGHT_RED_GREEN,10,5,led_mode.HEALTH_LED_MODE])#測量成功
+                    # EventMesh.publish("set_led_time_arg",[1000,200,300,led_mode.FLASH_LIGHT_RED_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.HEALTH_LED_MODE])#開始測量
+                elif msg == 2:
+                    EventMesh.publish("set_led_time_arg",[1,2,60,led_mode.FLASH_LIGHT_GREEN,60,30,led_mode.OTHER_MEASURE_MODE])#測量成功
+                    # EventMesh.publish("set_led_time_arg",[3000,1000,1,led_mode.LONG_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#測量成功
+                elif msg == 3:#测量失败
+                    EventMesh.publish("stop_led_timer")
+                    # EventMesh.publish("set_led_time_arg",[1,1,1,led_mode.FLASH_LIGHT_RED,31,10*3,led_mode.OTHER_MEASURE_MODE])#測量成功
+                    pass
+                    # EventMesh.publish("set_led_time_arg",[1,1,30,led_mode.FLASH_LIGHT_RED,31,10*3,led_mode.OTHER_MEASURE_MODE])#测量失败
+                    #加音频文件
+
+        def set_find_watch_led(self, event, msg): #查找设备
+            EventMesh.publish("OPEN_FIND_WATCH")#
+        
+            # EventMesh.publish("set_led_time_arg",[37000,1000,1,led_mode.LONG_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#查找设备绿灯长亮37s
+
+        def get_led_state(self, event, msg): #
+            return self.timer_state
+        def open_timer(self,msg): #msg 0 使能 1总的时间 2 灯模式 3 开启时间 4 关闭时间 
+            if msg != None:
+                if len(msg) != 0:
+                    self.led_total_time = msg[2]#
+                    # EventMesh.debug_log("open_timer:{}".format(msg))
+                    if self.led_total_time != None:
+
+                        if self.led_total_time > 0:
+                            self.led_enable=msg[0]
+                            if self.led_enable != 0:
+                                self.led_mode = msg[1]
+                                self.long_light_mode = msg[3]
+                                self.led_open_time = msg[4]
+                                self.led_close_time = msg[5]
+                                self.working_led_mode = msg[6]
+                                self.long_count = 0
+
+                                if self.timer_state == 0:
+                                    self.timer_state = 1
+                                    self.timer.stop()
+                                    # self.timer.start(LED_TIMER_OUT,1,self.led_fun_cb)
+                                    self.timer.start(LED_TIMER_OUT,1,self.publish_led_event_cb)
+                    
+            
+
+
+        def set_led_time_arg(self, event, msg): #msg 
+            
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            # EventMesh.debug_log("set_led_time_arg",msg,open_power,power_off)
+            if open_power != None:
+                if open_power == 0:
+                    return
+            if power_off != None:
+                if power_off == 1:
+                    return
+            usb_in = EventMesh.publish("get_usb")#
+
+            if msg != None:
+                if msg[6] != led_mode.POWER_OFF_MODE:#插入usb关机以防不亮红绿灯
+                    # EventMesh.debug_log("usb_in",usb_in)
+                    if usb_in != None:
+                        if usb_in == 1 or usb_in == 3:#正在充电或者充电已满都不要被打断
+                            if self.timer_state == 1:
+                                self.timer_state = 0
+                                self.timer.stop()
+                            if usb_in == 1:
+                                if self.working_led_mode != led_mode.CHARGE_IN_MODE:
+                                    str_buf = [1,1,10,led_mode.LONG_LIGHT_RED,4,2,led_mode.CHARGE_IN_MODE]
+                                    self.open_timer(str_buf)
+                                self.working_led_mode = led_mode.CHARGE_IN_MODE
+
+                            elif usb_in == 3:
+                                if self.working_led_mode != led_mode.CHARGE_FULL_MODE:
+                                    str_buf = [1,1,10,led_mode.LONG_LIGHT_GREEN,4,2,led_mode.CHARGE_FULL_MODE]
+                                    self.open_timer(str_buf)
+                                self.working_led_mode = led_mode.CHARGE_FULL_MODE
+                            
+                            return
+                        else:
+                            if msg[5] != led_mode.HEALTH_LED_MODE:
+                                self.working_led_mode = led_mode.OTHER_MEASURE_MODE
+
+                            get_hr_state = EventMesh.publish("get_hr_state")
+                            get_spo2_state = EventMesh.publish("get_spo2_state")
+                            
+                            wechat_state = EventMesh.publish("get_wechat_state")
+                            temp_state = EventMesh.publish("get_temp_state")
+                            bp_state = EventMesh.publish("get_bp_state")
+                            bg_state = EventMesh.publish("get_bg_state")
+                            EventMesh.debug_log("get_hr_state",get_hr_state,get_spo2_state,temp_state,wechat_state,self.working_led_mode)
+                            if wechat_state != None: #获取微聊状态
+                                if wechat_state == 1:
+                                    if self.working_led_mode != led_mode.WECHAT_LED_MODE:#如果不在亮微聊模式需要亮微聊模式
+                                        self.timer_state = 0
+                                        self.timer.stop()
+                                        str_buf = [1,1,1,led_mode.LONG_LIGHT_GREEN,4,2,led_mode.WECHAT_LED_MODE]
+                                        self.open_timer(str_buf)
+                                        self.working_led_mode = led_mode.WECHAT_LED_MODE
+                                        return
+                                    else:
+                                        return
+                                else:
+                                    self.wechat_btn = 0
+                                    # if get_hr_state != 0 or get_spo2_state != 0 or temp_state != 0 or bp_state != 0 or bg_state != 0 :#心率血氧优先级高
+                                    if get_hr_state == 1 or get_spo2_state == 1 or temp_state == 1 \
+                                    or bp_state == 1  or bg_state == 1:
+                                        if self.working_led_mode != led_mode.HEALTH_LED_MODE:#如果不在亮微聊模式需要亮微聊模式
+                                            EventMesh.debug_log("set_hr_blood_led!!!!!!!!!!")
+                                            str_buf = [1,2,10*70*2,led_mode.FLASH_LIGHT_RED_GREEN,10,5,led_mode.HEALTH_LED_MODE]#測量成功
+                                            self.timer_state = 0
+                                            self.timer.stop()
+                                            self.open_timer(str_buf)
+                                            self.working_led_mode = led_mode.HEALTH_LED_MODE
+                                            return
+                                        else:
+                                            EventMesh.debug_log("set_hr_blood_led stop!!!!!!!!!!")
+                                            return
+                                    else:# 0 2都认为其他模式灯亮 不是测试健康灯
+                                        self.working_led_mode = led_mode.OTHER_MEASURE_MODE
+
+            if EventMesh.publish("get_video_state") != 0:
+                if msg[6] != led_mode.VIDEO_MEASURE_MODE:
+                    return
+            self.open_timer(msg)
+
+
+    
+        # EventMesh.publish("set_led_time_arg",[1,2,2*300,led_mode.FLASH_LIGHT_RED_GREEN,2,1,led_mode.HEALTH_LED_MODE])#測量成功
+        def led_fun_cb(self, data):#
+            if self.led_enable == 0 or self.led_total_time == 0:
+                return
+            call_state = EventMesh.publish("get_call_state")
+            if call_state == None:
+                call_state = 0
+            if call_state != 0:
+                battery = EventMesh.publish("screen_get_battery")
+                if battery != None:
+                    if battery[0] != "1":#在充电得时候
+                        get_hr_state = EventMesh.publish("get_hr_state")
+                        get_spo2_state = EventMesh.publish("get_spo2_state")
+                        get_temp_state = EventMesh.publish("get_temp_state")
+                        get_bp_state = EventMesh.publish("get_bp_state")
+                        get_bg_state = EventMesh.publish("get_bg_state")
+                        if get_hr_state != None and  get_spo2_state != None and get_temp_state != None and get_bp_state != None and get_bg_state != None:
+                            if get_hr_state == 1 or get_spo2_state == 1 or get_temp_state == 1 or get_bp_state == 1 or get_bg_state == 1:
+                                    EventMesh.publish("close_hr_sop2")
+                                    EventMesh.publish("close_led_pin")
+                                    return
+            # EventMesh.debug_log("self.long_count",self.long_count)
+            if self.led_total_time != 0:
+                #红灯闪烁
+                if self.long_light_mode == led_mode.FLASH_LIGHT_RED :#
+                    if self.led_mode == 1:
+                        if self.led_total_time > 0:
+                            self.led_total_time-=1
+                            if self.led_total_time > 0:
+                                close_led_green()
+                                close_led_white()
+                                open_led_red()
+                            else:
+                                EventMesh.publish("stop_led_timer")#关闭所有的灯
+                    elif self.led_mode == 2:
+                        # EventMesh.debug_log("led red!!!!!!!")
+                        
+                        if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms 
+                            close_led_green()
+                            close_led_white()
+                            open_led_red()
+                        else:
+                            close_led_green()
+                            close_led_white()
+                            close_led_red()
+                        if self.long_count >= self.led_total_time-1:#大于总的时间 4
+                            EventMesh.publish("stop_led_timer")#设置参数
+                            return
+                        self.long_count+=1
+                #绿灯闪烁
+                elif self.long_light_mode == led_mode.FLASH_LIGHT_GREEN:#
+                    if self.led_mode == 1:#长亮时间限制
+                        
+                        if self.led_total_time > 0:
+                            self.led_total_time-=1
+                            if self.led_total_time > 0:
+                                close_led_red()
+                                close_led_white()
+                                open_led_green()
+                            else:
+                                EventMesh.publish("stop_led_timer")#关闭所有的灯
+                            
+
+                    elif self.led_mode == 2:
+                        
+                        if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms 
+                            close_led_red()
+                            close_led_white()
+                            open_led_green()
+                            pass
+                        else:
+                            close_led_green()
+                            close_led_white()
+                            close_led_red()
+                            pass
+                        
+                        if self.long_count >= self.led_total_time-1:#大于总的时间 4
+                            EventMesh.publish("stop_led_timer")#设置参数
+                            return
+                        self.long_count+=1
+                #蓝灯闪烁 暂时是白色灯
+                elif self.long_light_mode == led_mode.FLASH_LIGHT_WHITE:#
+                    if self.led_mode == 1:#长亮时间限制
+                        if self.led_total_time > 0:
+                            self.led_total_time-=1
+                            if self.led_total_time > 0:
+                                close_led_red()
+                                close_led_green()
+                                open_led_white()
+                            else:
+                                EventMesh.publish("stop_led_timer")#关闭所有的灯
+                    elif self.led_mode == 2:
+                        if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms 
+                            close_led_red()
+                            close_led_green()
+                            open_led_white()
+                            pass
+                        else:
+                            close_led_green()
+                            close_led_white()
+                            close_led_red()
+                            pass
+                        if self.long_count >= self.led_total_time-1:#大于总的时间 4
+                            EventMesh.publish("stop_led_timer")#设置参数
+                            return
+                        self.long_count+=1
+                #红绿灯闪烁
+                elif self.long_light_mode == led_mode.FLASH_LIGHT_RED_GREEN:#
+                    
+                    
+                    if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms 
+                        close_led_white()#白色灯
+                        close_led_green()
+                        open_led_red()
+                        pass
+                    else: 
+                        close_led_white()
+                        close_led_red()
+                        open_led_green()
+                        pass
+                    if self.long_count >= self.led_total_time-1:#大于总的时间 4
+                        EventMesh.publish("stop_led_timer")#设置参数
+                        return
+                    self.long_count+=1
+                #红蓝灯闪烁 蓝变成白色灯
+                elif self.long_light_mode == led_mode.FLASH_LIGHT_RED_WHITE:#
+                    if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms 
+                        close_led_white()#白色灯
+                        close_led_green()
+                        open_led_red()
+                        pass
+                    else:
+                        close_led_green()
+                        close_led_red()
+                        open_led_white()
+                        pass
+                    if self.long_count >= self.led_total_time-1:#大于总的时间 4
+                        EventMesh.publish("stop_led_timer")#设置参数
+                        return
+                    self.long_count+=1
+                #蓝绿灯闪烁
+                elif self.long_light_mode == led_mode.FLASH_LIGHT_GREEN_WHITE:#
+
+                    
+                    if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms 
+                        close_led_white()#白色灯
+                        close_led_red()
+                        open_led_green()
+                        pass
+                    else:
+                        close_led_green()
+                        close_led_red()
+                        open_led_white()
+                        pass
+                    if self.long_count >= self.led_total_time-1:#大于总的时间 4
+                        EventMesh.publish("stop_led_timer")#设置参数
+                        return
+                    self.long_count+=1
+                #红灯长亮
+                elif self.long_light_mode == led_mode.LONG_LIGHT_RED:#
+                    close_led_white()#白色灯
+                    close_led_green()
+                    open_led_red()
+                    self.timer.stop()
+                    self.timer_state = 0
+                    self.led_total_time = 0
+                    self.led_enable = 0
+                    self.led_mode = 0
+                    self.long_light_mode = 0
+                    self.led_open_time = 0
+                    self.led_close_time = 0
+                    self.working_led_mode = 0
+                    self.long_count = 0
+
+                #绿灯长亮
+                elif self.long_light_mode == led_mode.LONG_LIGHT_GREEN:#
+                    close_led_white()#白色灯
+                    close_led_red()
+                    open_led_green()
+                    self.timer.stop()
+                    self.timer_state = 0
+                    self.led_total_time = 0
+                    self.led_enable = 0
+                    self.led_mode = 0
+                    self.long_light_mode = 0
+                    self.led_open_time = 0
+                    self.led_close_time = 0
+                    self.working_led_mode = 0
+                    self.long_count = 0
+                #蓝灯长亮
+                elif self.long_light_mode == led_mode.LONG_LIGHT_WHITE:#
+                    close_led_green()#白色灯
+                    close_led_red()
+                    open_led_white()
+                    self.timer.stop()
+                    self.timer_state = 0
+                    self.led_total_time = 0
+                    self.led_enable = 0
+                    self.led_mode = 0
+                    self.long_light_mode = 0
+                    self.led_open_time = 0
+                    self.led_close_time = 0
+                    self.working_led_mode = 0
+                    self.long_count = 0
+        
+        def close_led_pin(self, event, msg):
+            EventMesh.debug_log("close_led_pin!!!")
+
+            self.timer.stop()
+            self.timer_state = 0
+            self.led_total_time = 0
+            self.led_enable = 0
+            self.led_mode = 0
+            self.long_light_mode = 0
+            self.led_open_time = 0
+            self.led_close_time = 0
+            self.working_led_mode = 0
+            self.long_count = 0
+            close_led_red()
+            close_led_green()
+            close_led_white()
+
+        def stop_led_timer(self, event, msg):
+            EventMesh.publish("close_all_led")#关闭所有的灯
+        
+        def close_all_led(self, event, msg):
+            self.close_all_led_do(0)
+        def close_all_led_do(self,data):   
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            usb_in = EventMesh.publish("get_usb")#
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if open_power_off != None:
+                if open_power_off != 1:
+                    if usb_in != None:
+                        if usb_in == 1 or usb_in == 3:#正在充电或者充电已满都不要被打断
+                            if self.timer_state == 1:
+                                self.timer_state = 0
+                                self.timer.stop()
+                            return
+                        else:
+                            get_hr_state = EventMesh.publish("get_hr_state")
+                            get_spo2_state = EventMesh.publish("get_spo2_state")
+                            
+                            wechat_state = EventMesh.publish("get_wechat_state")
+                            temp_state = EventMesh.publish("get_temp_state")
+                            bp_state = EventMesh.publish("get_bp_state")
+                            bg_state = EventMesh.publish("get_bg_state")
+                            # EventMesh.debug_log("get_hr_state",get_hr_state,get_spo2_state,wechat_state,self.working_led_mode)
+                            if wechat_state != None: #获取微聊状态
+                                if wechat_state == 1 or get_spo2_state == 1  or get_hr_state == 1  or temp_state == 1 or bp_state == 1 \
+                                    or bg_state == 1 :
+                                    return
+            if self.timer_state == 1:
+                self.timer.stop()
+            self.timer_state = 0
+            self.led_total_time = 0
+            self.led_enable = 0
+            self.led_mode = 0
+            self.long_light_mode = 0
+            self.led_open_time = 0
+            self.led_close_time = 0
+            self.working_led_mode = 0
+            self.long_count = 0
+            close_led_red()
+            close_led_green()
+            close_led_white()
+            # EventMesh.debug_log("close led!!!")
+
+        def led_test_fun_cb(self, data):
+            return
+    
diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/main_1.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/main_1.py
new file mode 100644 (file)
index 0000000..c14a3dc
--- /dev/null
@@ -0,0 +1,239 @@
+import sms
+
+class App(object):
+    def __init__(self):
+        self.managers = []
+
+    def append_manager(self, manager):
+        if isinstance(manager, Abstract):
+            manager.post_processor_after_instantiation()
+            self.managers.append(manager)
+        return self
+
+    def start(self):
+        for manager in self.managers:
+            manager.post_processor_before_initialization()
+            manager.initialization()
+            manager.post_processor_after_initialization()
+
+
+class watchApp(App):
+    def __init__(self):
+        super(watchApp, self).__init__()
+        self.__ui = None
+
+    def set_ui(self, ui):
+        self.__ui = ui
+
+    def start(self):
+        if self.__ui is not None:
+            self.__ui.start()
+        super().start()
+
+
+
+if __name__ == '__main__':
+    import uos
+    import ql_fs
+    import utime
+    if ql_fs.path_exists("/ext") == False:
+        ldev = uos.VfsLfs1(32, 32, 32, "ext_fs",0,3)
+        uos.mount(ldev,'/ext')
+    res = uos.statvfs("/ext")
+    res = list(res)
+    print('总ext空间:{} MB,剩余空间:{} MB'.format((((res[0] * res[2]) / 1024 / 1024)),((res[0] * res[3]) / 1024 / 1024)))
+    print("init1:{}".format(utime.localtime()))
+    import EventMesh
+    from common import Abstract
+    print("init2:{}".format(utime.localtime()))
+    from lcd import tp_cst816
+    print("init3:{}".format(utime.localtime()))
+
+    from usr.ui_main_menu import MainMenuScreen
+    # from ui_WatchFaceScreen import WatchFaceScreen
+    
+    from appFactoryMode import  FactoryModeLocationScreen,FactoryModeScreen ,FactoryModeAlipayInitScreen
+    import ui as _ui
+    # import ui as _ui
+    print("init4:{}".format(utime.localtime()))
+    ui = _ui.UI()
+    ui.post_processor_after_instantiation()
+    ui.add_screen(MainMenuScreen()) 
+    EventMesh.publish("load_screen", {"screen": "main_menu"})
+    print("init5:{}".format(utime.localtime()))
+    
+    ui.add_screen(_ui.PopupScreen()) 
+    ui.add_screen(_ui.PhoneScreen()) 
+    ui.add_screen(_ui.HeartrateScreen()) 
+    import ui_setting as _ui_setting
+    ui.add_screen(_ui_setting.SettingScreen()) 
+    ui.add_screen(_ui.ToolboxScreen()) 
+    ui.add_screen(_ui.StepScreen()) 
+    ui.add_screen(_ui.CountdownScreen()) 
+    ui.add_screen(_ui.StopwatchScreen()) 
+    ui.add_screen(_ui.WeatherScreen()) 
+    ui.add_screen(_ui.Spo2Screen()) 
+    ui.add_screen(_ui.TemperatureScreen()) 
+    ui.add_screen(_ui.ContactsScreen()) 
+    from appWechat import WechatScreen,TK_ProtoCol,MESSAGE_ProtoCol,NewWechatPopupScreen
+    ui.add_screen(WechatScreen()) 
+    from alarm import ClkListScreen,NewEditClk,CLKTimeScreen,ClkPeriod,PopupAlarmScreen
+  
+    ui.add_screen(ClkListScreen()) 
+    ui.add_screen(_ui.CountdownEndScreen()) 
+    ui.add_screen(NewEditClk()) 
+    ui.add_screen(CLKTimeScreen()) 
+    ui.add_screen(ClkPeriod()) 
+  
+    # ui.add_screen(_ui_setting.LanguageScreen()) 
+    ui.add_screen(_ui_setting.DialswitchScreen()) 
+    # ui.add_screen(_ui.ThemeswitchScreen()) 
+    ui.add_screen(_ui_setting.ImeiScreen()) 
+    ui.add_screen(_ui_setting.AppScreen()) 
+    ui.add_screen(_ui_setting.BrightnessScreen()) 
+    ui.add_screen(_ui_setting.VolumeScreen()) 
+    ui.add_screen(_ui_setting.RestoreScreen()) 
+    ui.add_screen(_ui_setting.PoweroffScreen()) 
+    ui.add_screen(_ui_setting.VersionScreen()) 
+    ui.add_screen(_ui_setting.UpdateScreen()) 
+    ui.add_screen(_ui_setting.AlarmvolumeScreen()) 
+    ui.add_screen(_ui_setting.MsgvolumeScreen()) 
+    ui.add_screen(_ui_setting.PhoneringScreen()) 
+    ui.add_screen(_ui_setting.totalvolumeScreen()) 
+    ui.add_screen(_ui_setting.PoweroffConfirmScreen()) 
+    ui.add_screen(_ui.DialingScreen()) 
+    ui.add_screen(_ui.CallLogScreen()) 
+    from appAlipay import Alipay ,AlipayOpenScreen,Alipay_1_1,Alipay_invite,Alipay_inviting,\
+    Alipay_success,Alipay_paycode,Alipay_pay_success,Alipay_collect,Alipay_parent
+    ui.add_screen(AlipayOpenScreen()) 
+    ui.add_screen(Alipay_1_1())
+    ui.add_screen(Alipay_invite())  
+    ui.add_screen(Alipay_inviting()) 
+    ui.add_screen(Alipay_success()) 
+    ui.add_screen(Alipay_paycode()) 
+    ui.add_screen(Alipay_pay_success()) 
+    ui.add_screen(Alipay_collect()) 
+    ui.add_screen(Alipay_parent()) 
+    ui.add_screen(_ui.UIFINDScreen())
+    ui.add_screen(_ui.MsgDetailScreen())
+    ui.add_screen(_ui.IncomingCallScreen())
+    ui.add_screen(_ui.OnCallScreen())
+    ui.add_screen(_ui.MessageFullScreen())
+    # ui.add_screen(_ui.PowerOnScreen())
+    ui.add_screen(FactoryModeLocationScreen())
+    ui.add_screen(FactoryModeScreen())
+    ui.add_screen(FactoryModeAlipayInitScreen())
+    ui.add_screen(PopupAlarmScreen())
+    ui.add_screen(_ui.LowPowerScreen())
+    ui.add_screen(_ui.NewMessageScreen())
+    ui.add_screen(NewWechatPopupScreen())
+    ui.add_screen(HealthScreen())
+    # ui.add_screen(_ui.Setting3Screen())  
+    print("init6:{}".format(utime.localtime()))
+    
+
+    from protocol import LK_ProtoCol,PING_ProtoCol,HEART_ProtoCol,OXYGEN_ProtoCol,OXYGEN_One_ProtoCol,HRSTART_ProtoCol,CENTER_ProtoCol,UPLOAD_ProtoCol,\
+        TEMP_ProtoCol,DLT_ProtoCol,WT_ProtoCol,UD_ProtoCol,REMIND_ProtoCol, CR_ProtoCol,KA_ProtoCol,FIND_ProtoCol,POWEROFF_ProtoCol,\
+            ProtoColResolver,PHL_ProtoCol,MONITOR_ProtoCol,bootoff_ProtoCol,WDSTART_ProtoCol,LOWBAT_ProtoCol,sosHome_dial_ProtoCol,SockManager,NetManager
+    import mgr as mgr
+    print("init7:{}".format(utime.localtime()))
+    
+    from mgr import ConfigStoreManager,getBootOffManager,getSosFlagManager,CountdownManager, LocationManager, getVolumSizeManager,gethistoryDataManager,getUpLoadDataManager, getplayAudiodStateManager,\
+    AddrBookManager,MsgdetailManager,PhoneCallingManager,getOldTimeManager,getStorageDataManager,getBrightnessManager,getHrTimeManager,getTempTimeManager,getLowBatManager
+    print("init8:{}".format(utime.localtime()))
+    
+    
+    #from ui_WatchFaceScreen import WatchFaceScreen 
+    
+    
+    # from usr.test_sms import HRSTART_ProtoCol,getHrTimeManager,HEART_ProtoCol,OXYGEN_ProtoCol,OXYGEN_One_ProtoCol,getBrightnessManager,\
+    # getStorageDataManager
+    print("init9:{}".format(utime.localtime()))
+   #from usr.ui_wechat import WechatScreen,TK_ProtoCol
+
+    print("init10:{}".format(utime.localtime()))
+    
+
+    app = watchApp()
+    app.set_ui(ui)
+    app.append_manager(mgr.AlarmVolumeLevelManager()) \
+        .append_manager(mgr.MsgVolumeLevelManager()) \
+        .append_manager(mgr.PhoneVolumeLevelManager()) \
+        .append_manager(mgr.DeviceInfoManager()) \
+        .append_manager(mgr.BatteryManager()) \
+           
+        # .append_manager(mgr.StopwatchManager()) \
+        # .append_manager(mgr.CountdownManager()) \
+
+   
+    app.append_manager(ConfigStoreManager())
+    app.append_manager(NetManager())
+    app.append_manager(LocationManager())
+    app.append_manager(AddrBookManager())
+    app.append_manager(mgr.MsgManager())
+    app.append_manager(MsgdetailManager())
+    app.append_manager(mgr.CallLogManager())
+    app.append_manager(mgr.getWeatherDataManager())
+    app.append_manager(PhoneCallingManager())
+    app.append_manager(ClockManager())
+    app.append_manager(gethistoryDataManager())
+    app.append_manager(getHrTimeManager())
+    app.append_manager(getBrightnessManager())
+    app.append_manager(getStorageDataManager())
+    app.append_manager(getUpLoadDataManager())
+    app.append_manager(getVolumSizeManager())
+    app.append_manager(getTempTimeManager())
+    app.append_manager(getplayAudiodStateManager())
+    app.append_manager(getLowBatManager())
+    app.append_manager(getBootOffManager())
+    app.append_manager(getOldTimeManager())
+    app.append_manager(getSosFlagManager())
+    app.append_manager(CountdownManager())
+
+    print("init21:{}".format(utime.localtime()))    
+    
+    print("init11:{}".format(utime.localtime()))    
+    pcr = ProtoColResolver()
+    pcr.add_support(LK_ProtoCol())
+    pcr.add_support(PING_ProtoCol())
+    pcr.add_support(KA_ProtoCol())
+    pcr.add_support(UD_ProtoCol())
+    pcr.add_support(CR_ProtoCol())
+    pcr.add_support(FIND_ProtoCol())
+    pcr.add_support(POWEROFF_ProtoCol())
+    pcr.add_support(PHL_ProtoCol())
+    pcr.add_support(TK_ProtoCol())
+    pcr.add_support(MESSAGE_ProtoCol())
+    pcr.add_support(WT_ProtoCol())
+    pcr.add_support(REMIND_ProtoCol())
+    pcr.add_support(HRSTART_ProtoCol())
+    pcr.add_support(HEART_ProtoCol())
+    pcr.add_support(OXYGEN_ProtoCol())
+    pcr.add_support(OXYGEN_One_ProtoCol())
+    pcr.add_support(TEMP_ProtoCol())
+    pcr.add_support(DLT_ProtoCol())
+    pcr.add_support(UPLOAD_ProtoCol())
+    pcr.add_support(MONITOR_ProtoCol())
+    # pcr.add_support(CENTER_ProtoCol())
+    pcr.add_support(CENTER_ProtoCol())
+    pcr.add_support(bootoff_ProtoCol())
+    pcr.add_support(WDSTART_ProtoCol())
+    pcr.add_support(LOWBAT_ProtoCol())
+    pcr.add_support(sosHome_dial_ProtoCol())
+
+    sm = SockManager()
+    sm.add_support_resolver(pcr)
+    app.append_manager(sm)
+    print("init11.0:{}".format(utime.localtime()))   
+    app.start()
+    sms_data = sms.getSaveLoc()
+    sms_lacv = sms_data[0][0]
+    if sms_lacv != 'SM':#每次开机设置一下短信的存储位置
+        sms.setSaveLoc('SM', 'SM', 'SM')
+    print("init12:{}".format(utime.localtime()))
+    import atcmd
+    resp=bytearray(50)
+    atcmd.sendSync('AT+log=52,1\r\n',resp,'',20)
+    print("AT+log=52,1:{}".format(resp))
+
+
diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/main_init.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/main_init.py
new file mode 100644 (file)
index 0000000..73c9839
--- /dev/null
@@ -0,0 +1,293 @@
+import sms
+import atcmd
+import net
+import machine
+import EventMesh
+import usys
+
+    
+resp=bytearray(50)
+# atcmd.sendSync('AT+log=52,1\r\n',resp,'',200)
+# EventMesh.debug_log("AT+log=52,1:{}".format(resp))
+from common import Abstract
+class App(object):
+    def __init__(self):
+        self.managers = []
+
+    def append_manager(self, manager):
+        if isinstance(manager, Abstract):
+            manager.post_processor_after_instantiation()
+            self.managers.append(manager)
+        return self
+
+    def start(self):
+        for manager in self.managers:
+            manager.post_processor_before_initialization()
+            manager.initialization()
+            manager.post_processor_after_initialization()
+
+
+class watchApp(App):
+    def __init__(self):
+        super(watchApp, self).__init__()
+        self.__ui = None
+
+    def set_ui(self, ui):
+        self.__ui = ui
+
+    def start(self):
+        if self.__ui is not None:
+            self.__ui.start()
+        super().start()
+
+
+#开机执行下面函数就可以配置成ipv4拨号
+import dataCall
+import net
+
+def set_ipv4_datacall():
+       # 获取第一路的APN,ipType 等信息
+       pdpCtx = dataCall.getPDPContext(1)
+       if pdpCtx != -1:
+               if pdpCtx[0] != 0:
+                       # 如果不是用户需要的ipv4,使用如下方式配置,使用如下方式配置
+                       ret = dataCall.setPDPContext(1, 0,pdpCtx[1],pdpCtx[2],pdpCtx[3],pdpCtx[4])
+                       if ret == 0:
+                               print('配置成功。')
+                               # cfun0/1后按照配置的信息进行拨号
+                               net.setModemFun(0)
+                               net.setModemFun(1)
+                       else:
+                               print('配置失败。')
+               else:
+                       print('已经配置为IPv4')
+       else:
+               print('获取PDP Context失败。')
+def main_init():
+# if __name__ == '__main__':
+    #set_ipv4_datacall()
+    import uos
+    import ql_fs
+    import utime
+    import EventMesh
+    
+    # if ql_fs.path_exists("/ext") == False:
+    #     ldev = uos.VfsLfs1(32, 32, 32, "ext_fs",0,3)
+    #     uos.mount(ldev,'/ext')
+    res = uos.statvfs("/usr")
+    res = list(res)
+    EventMesh.debug_log('总usr空间:{} MB,剩余空间:{} MB'.format((((res[0] * res[2]) / 1024 / 1024)),((res[0] * res[3]) / 1024 / 1024)))
+    EventMesh.debug_log("init1:{}".format(utime.localtime()))
+    
+    
+    EventMesh.debug_log("init2:{}".format(utime.localtime()))
+    EventMesh.debug_log("init3:{}".format(utime.localtime()))
+
+    
+    import ui as _ui
+
+    
+    # import ui as _ui
+    EventMesh.debug_log("init4:{}".format(utime.localtime()))
+    ui = _ui.UI()
+    ui.post_processor_after_instantiation()
+
+
+    
+
+    app = watchApp()
+    app.set_ui(ui)
+    # if EventMesh.model == "D15":
+    #     from motor import motorEventManager
+    #     app.append_manager(motorEventManager())
+
+    # app.append_manager(mgr.getStorageDataManager())
+    # app.append_manager(mgr.AlarmVolumeLevelManager()) \
+    #     .append_manager(mgr.MsgVolumeLevelManager()) \
+    #     .append_manager(mgr.PhoneVolumeLevelManager()) \
+    #     .append_manager(mgr.DeviceInfoManager()) \
+    #     .append_manager(mgr.BatteryManager()) \
+    #     .append_manager(intervManager())\
+    #     .append_manager(ledEventManager())\
+        # .append_manager(playImeiManager())\
+        # .append_manager(playCurStepManager())\
+        # .append_manager(usbStateManager())\
+        # .append_manager(hrandBloodOxgenManager())\
+        # .append_manager(simManager())\
+        # .append_manager(PoweronManager())\
+        # .append_manager(sosManager())\
+        # .append_manager(playCurTimeManager())
+        # .append_manager(mgr.StopwatchManager()) \
+        # .append_manager(mgr.CountdownManager()) \
+
+    
+    # app.append_manager(mgr.ConfigStoreManager())
+    # app.append_manager(protocol.NetManager())
+    # app.append_manager(mgr.LocationManager())
+    # app.append_manager(mgr.AddrBookManager())
+    # app.append_manager(mgr.MsgManager())
+    # app.append_manager(mgr.MsgdetailManager())
+    # app.append_manager(mgr.CallLogManager())
+    # app.append_manager(mgr.getWeatherDataManager())
+    # app.append_manager(mgr.PhoneCallingManager())
+    # app.append_manager(mgr.ClockManager())
+    # app.append_manager(mgr.sendDevinfoManager())
+   
+    # app.append_manager(mgr.gethistoryDataManager())
+    # app.append_manager(mgr.getHrTimeManager())
+    # app.append_manager(mgr.getBrightnessManager())
+    
+    # app.append_manager(mgr.getUpLoadDataManager())
+    # app.append_manager(mgr.getVolumSizeManager())
+    # app.append_manager(mgr.getTempTimeManager())
+    # app.append_manager(mgr.getplayAudiodStateManager())
+    # app.append_manager(mgr.getLowBatManager())
+    # app.append_manager(mgr.getBootOffManager())
+    # app.append_manager(mgr.getOldTimeManager())
+    # app.append_manager(mgr.getSosFlagManager())
+    # app.append_manager(mgr.CountdownManager())
+    # app.append_manager(mgr.sosInfoCallManager())
+    # app.append_manager(mgr.testSmsSetIPManager())
+    # app.append_manager(mgr.deleteSmsManager())
+    # app.append_manager(mgr.schoolclassManager())
+    # app.append_manager(mgr.firwDownloadManager())
+    # if EventMesh.model == "D15":
+    #     app.append_manager(mgr.vedioInforManager())
+    try:
+        try:
+            import usr.ai_VC_t as _ai
+        except Exception as e:
+            usys.print_exception(e) 
+            
+            try:
+                import usr.ai_VC as _ai
+            except Exception as e:
+                usys.print_exception(e) 
+                   
+                try:
+                    import usr.ai_VC_7PIN as _ai
+                except Exception as e:
+                    usys.print_exception(e) 
+                    try:
+                        import usr.ai_VC_G15 as _ai
+                    except Exception as e:
+                        usys.print_exception(e) 
+                        try:
+                            import ai_VC as _ai
+                        except Exception as e:
+                            usys.print_exception(e) 
+
+        #app.append_manager(intervManager())
+        try:
+            app.append_manager(_ai.getStorageDataManager())
+        except Exception as e:
+            usys.print_exception(e)
+        try:
+            app.append_manager(_ai.AI_led())
+        except Exception as e:
+            usys.print_exception(e)
+        try:
+            app.append_manager(_ai.AI_dev())
+        except Exception as e:
+            usys.print_exception(e)
+        
+        try:
+            app.append_manager(_ai.device_res_author())
+        except Exception as e:
+            usys.print_exception(e)     
+        
+        try:
+            app.append_manager(_ai.AI_VC())
+        except Exception as e:
+            usys.print_exception(e) 
+              
+    except Exception as e:
+        usys.print_exception(e)   
+        
+    EventMesh.debug_log("init21:{}".format(utime.localtime()))    
+    
+    EventMesh.debug_log("init11:{}".format(utime.localtime()))    
+    
+    #EventMesh.publish("open_power_on", 1)#
+    # pcr = protocol.ProtoColResolver()
+    # pcr.add_support(protocol.LK_ProtoCol())
+    # pcr.add_support(protocol.PING_ProtoCol())
+    # pcr.add_support(protocol.KA_ProtoCol())
+    # pcr.add_support(protocol.UD_ProtoCol())
+    # pcr.add_support(protocol.CR_ProtoCol())
+    # pcr.add_support(protocol.AL_ProtoCol())
+    # pcr.add_support(protocol.FIND_ProtoCol())
+    # pcr.add_support(protocol.POWEROFF_ProtoCol())
+    # pcr.add_support(protocol.PHL_ProtoCol())
+    # pcr.add_support(protocol.TK_ProtoCol())
+    # pcr.add_support(protocol.TKS_ProtoCol())
+    # pcr.add_support(protocol.MESSAGE_ProtoCol())
+    # pcr.add_support(protocol.WT_ProtoCol())
+    # pcr.add_support(protocol.REMIND_ProtoCol())
+    # pcr.add_support(protocol.HRSTART_ProtoCol())
+    # pcr.add_support(protocol.HEART_ProtoCol())
+    # pcr.add_support(protocol.OXYGEN_ProtoCol())
+    # pcr.add_support(protocol.OXYGEN_One_ProtoCol())
+    # pcr.add_support(protocol.TEMP_ProtoCol())
+    # pcr.add_support(protocol.DLT_ProtoCol())
+    # pcr.add_support(protocol.UPLOAD_ProtoCol())
+    # pcr.add_support(protocol.MONITOR_ProtoCol())
+    # # pcr.add_support(protocol.CENTER_ProtoCol())
+    # pcr.add_support(protocol.CENTER_ProtoCol())
+    # pcr.add_support(protocol.bootoff_ProtoCol())
+    # pcr.add_support(protocol.WDSTART_ProtoCol())
+    # pcr.add_support(protocol.LOWBAT_ProtoCol())
+    # pcr.add_support(protocol.sosHome_dial_ProtoCol())
+    # pcr.add_support(protocol.Time_ProtoCol())
+    # pcr.add_support(protocol.SILENCETIME2_ProtoCol())
+    # pcr.add_support(protocol.FALLDOWN_ProtoCol())
+    # pcr.add_support(protocol.HELP_ProtoCol())
+    # pcr.add_support(protocol.REMOVE_ProtoCol())
+    # pcr.add_support(protocol.UD_ProtoCol())
+    # pcr.add_support(protocol.bldstart_ProtoCol())
+    # pcr.add_support(protocol.blood_ProtoCol())
+    # pcr.add_support(protocol.bgstart_ProtoCol())
+    # pcr.add_support(protocol.bloodglucose_ProtoCol())
+    # pcr.add_support(protocol.REMIND_CHDRINK_ProtoCol())
+    # pcr.add_support(protocol.REMIND_CHMEDICINE2_ProtoCol())
+    # pcr.add_support(protocol.WLKEY_ProtoCol())
+    # pcr.add_support(protocol.REMIND_CH_WAKEUP_ProtoCol())
+    # pcr.add_support(protocol.REMIND_CH_SLEEP_ProtoCol())
+    # pcr.add_support(protocol.REMIND_CH_HOME_ProtoCol())
+    # pcr.add_support(protocol.REMIND_CH_REST_ProtoCol())
+    # pcr.add_support(protocol.SLEEP_DATA_ProtoCol())
+    # pcr.add_support(protocol.SLEEPTIME_ProtoCol())
+    # pcr.add_support(protocol.FACTORY_ProtoCol())
+    # pcr.add_support(protocol.RESET_ProtoCol())
+    # pcr.add_support(protocol.REMIND_CH_SIT_ProtoCol())
+    # pcr.add_support(protocol.SCREEN_SHOWProtoCol())
+
+
+
+
+
+    # sm = protocol.SockManager()
+    # sm.add_support_resolver(pcr)
+    # app.append_manager(sm)
+    EventMesh.debug_log("init11.0:{}".format(utime.localtime()))   
+    app.start()
+    
+    sms_data = sms.getSaveLoc()
+    if(sms_data != -1):
+        sms_lacv = sms_data[0][0]
+        if sms_lacv != 'SM':#每次开机设置一下短信的存储位置
+            sms.setSaveLoc('SM', 'SM', 'SM')
+    EventMesh.debug_log("init12:{}".format(utime.localtime()))
+    # timer_t = net.nitzTime()
+    # EventMesh.debug_log("timer_t:{}".format(timer_t))
+    # if(timer_t != -1):
+    #     timeSecond = int(timer_t[1])
+    #     if timeSecond != 0:
+    #         next_alarm_time = utime.localtime(timeSecond)
+    #         machine.RTC().datetime((next_alarm_time[0],next_alarm_time[1],next_alarm_time[2],next_alarm_time[6],next_alarm_time[3],next_alarm_time[4],next_alarm_time[5],0))
+    
+    
+    
+    # EventMesh.publish("load_screen", {"screen": "main_menu"})
+
+
diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/mgr.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/mgr.py
new file mode 100644 (file)
index 0000000..de38bf6
--- /dev/null
@@ -0,0 +1,5072 @@
+from common import Abstract, LogAdapter
+import EventMesh
+import usocket
+import ql_fs
+import ujson
+import _thread
+import modem
+import utime
+import sim
+import net
+import dataCall
+import checkNet
+import osTimer
+import constants
+import sms
+from common import Lock, Abstract, LogAdapter
+#from location import GPS, GPSMatch,CellLocator
+from misc import USB, Power, ADC
+from machine import ExtInt, Pin,Timer,RTC,UART
+import EventMesh
+import usys
+import audio
+from machine import I2C
+from Gsensor import SC7A20
+import pm
+import ure
+import urandom
+try :
+    from Hsensor import GH3018
+except Exception as e:
+    EventMesh.debug_log("Hsensor none GH3018:{}".format(e))   
+#
+try :
+    from Hsensor import HX3918
+except Exception as e:
+    EventMesh.debug_log("Hsensor none HX3918:{}".format(e))    
+from machine import RTC
+import quecgnss
+import wifiScan
+import math
+import voiceCall
+from misc import PWM
+from led import led_mode,open_led_green,close_led_green,open_led_red,close_led_red,close_led_white
+from queue import Queue
+if EventMesh.model == "D10":
+    heartbeat_time = 7*60 #心跳时间
+    gheartbeat_time = 5*60 #心跳时间
+
+    def get_autoblood_value():#血压值
+        data = RTC().datetime()
+        hour = int(data[4])
+        blood_Maxvalue = 0
+        blood_Minvalue = 0
+        if hour >= 6 and hour <= 10:
+            random_numMax = urandom.randint(0, 30)
+            random_numMin = urandom.randint(0, 20)
+            blood_Maxvalue = 120+random_numMax
+            blood_Minvalue = 75+random_numMin
+
+            print("get_autoblood_value 6 -10",blood_Maxvalue,blood_Minvalue)
+            # return [self.blood_Maxvalue,self.blood_Minvalue]
+        elif hour > 10 and hour <= 14:#10-14(10,14]
+            random_numMax = urandom.randint(0, 20)
+            random_numMin = urandom.randint(0, 25)
+            blood_Maxvalue = 115+random_numMax
+            blood_Minvalue = 60+random_numMin
+            print("get_autoblood_value 10 -14",blood_Maxvalue,blood_Minvalue)
+            # return [self.blood_Maxvalue,self.blood_Minvalue]
+        elif hour > 14 and hour <= 18:#14-18
+            random_numMax = urandom.randint(0, 25)
+            random_numMin = urandom.randint(0, 15)
+            blood_Maxvalue = 115+random_numMax
+            blood_Minvalue = 70+random_numMin
+
+            print("get_autoblood_value 14 -18",blood_Maxvalue,blood_Minvalue)
+            # return [self.blood_Maxvalue,self.blood_Minvalue]
+        elif hour > 2 and hour < 6:#2-6
+            random_numMax = urandom.randint(0, 30)
+            random_numMin = urandom.randint(0, 20)
+            blood_Maxvalu = 105+random_numMax
+            blood_Minvalue = 65+random_numMin
+
+            
+            print("get_autoblood_value 2 -6",blood_Maxvalue,blood_Minvalue)
+            # return [self.blood_Maxvalue,self.blood_Minvalue]
+        else:#18-2 19 20 21 22 23 1 2
+            random_numMax = urandom.randint(0, 30)
+            random_numMin = urandom.randint(0, 20)
+            blood_Maxvalue = 100+random_numMax
+            blood_Minvalue = 60+random_numMin
+            print("get_autoblood_value 18 -2",blood_Maxvalue,blood_Minvalue)
+        return [blood_Maxvalue,blood_Minvalue]
+
+    def get_blood_sugar_value():#血糖值
+        data = RTC().datetime()
+        hour = int(data[4])
+        blood_sugar = 0
+        if (hour >= 6 and hour <= 8) or (hour >= 12 and hour <= 13) or (hour >= 18 and hour <= 19):#6-8 12-13 18-19 
+            random_value = urandom.randint(39, 61)
+            blood_sugar = random_value/10
+            print("get_blood_sugar_value 6 -10",blood_sugar)
+            # return [self.blood_Maxvalue,self.blood_Minvalue]
+        elif (hour > 8 and hour <= 9) or (hour >= 14 and hour <= 15) or (hour >= 20 and hour <= 21):#8-9 14-15 20-21
+            random_value = urandom.randint(67, 90)
+            blood_sugar = random_value/10
+            print("get_blood_sugar_value 10 -14",blood_sugar)
+        else:#18-2 19 20 21 22 23 1 2 10-11 16-17 21-22
+            random_value = urandom.randint(39, 78)
+            blood_sugar = random_value/10
+            print("get_blood_sugar_value 18 -2",blood_sugar)
+        return blood_sugar
+
+
+
+
+    class PhoneVolumeLevelManager(Abstract):
+        def __init__(self):
+            self.level = 0
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("push_add_phonering_level", self.add)
+            EventMesh.subscribe("push_reduce_phonering_level", self.reduce)
+            EventMesh.subscribe("get_phonering_level", self.get)
+
+        def add(self, event, msg):
+            if self.level < 7:
+                self.level = self.level + 1
+
+        def reduce(self, event, msg):
+            if self.level > 0:
+                self.level = self.level - 1
+
+        def get(self, event=None, msg=None):
+            return self.level
+
+    class MsgVolumeLevelManager(Abstract):
+        def __init__(self):
+            self.level = 0
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("push_add_msgvolume_level", self.add)
+            EventMesh.subscribe("push_reduce_msgvolume_level", self.reduce)
+            EventMesh.subscribe("get_msgvolume_level", self.get)
+
+        def add(self, event, msg):
+            if self.level < 7:
+                self.level = self.level + 1
+
+        def reduce(self, event, msg):
+            if self.level > 0:
+                self.level = self.level - 1
+
+        def get(self, event=None, msg=None):
+            return self.level
+
+    class AlarmVolumeLevelManager(Abstract):
+        def __init__(self):
+            self.level = 0
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("push_add_alarmvolume_level", self.add)
+            EventMesh.subscribe("push_reduce_alarmvolume_level", self.reduce)
+            EventMesh.subscribe("get_alarmvolume_level", self.get)
+
+        def add(self, event, msg):
+            if self.level < 7:
+                self.level = self.level + 1
+
+        def reduce(self, event, msg):
+            if self.level > 0:
+                self.level = self.level - 1
+
+        def get(self, event=None, msg=None):
+            return self.level
+            
+    class StopwatchManager(Abstract):
+        def __init__(self):
+            self.level = 0
+            self.ms_value = 0
+            self.sec_value = 0
+            self.min_value = 0
+            self.timer = Timer(Timer.Timer1)
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("stopwatch_start", self.start)
+            EventMesh.subscribe("stopwatch_stop", self.paused)
+            EventMesh.subscribe("stopwatch_reset", self.reset)
+            EventMesh.subscribe("get_stopwatch_ms", self.get_ms)
+            EventMesh.subscribe("get_stopwatch_sec", self.get_sec)
+            EventMesh.subscribe("get_stopwatch_min", self.get_min)
+
+        def start(self, event, msg):        
+            self.timer.start(period=100, mode=self.timer.PERIODIC, callback=self.fun)
+        
+        def paused(self, event, msg):        
+            self.timer.stop()
+        
+        def reset(self, event, msg):
+            self.timer.stop()
+
+            self.sec_value = 0
+            self.min_value = 0
+            self.ms_value = 0
+
+        def fun(self):
+            self.ms_value += 1
+            if self.ms_value > 9:
+                self.ms_value = 0   
+                self.sec_value += 1
+            if self.sec_value > 60:
+                self.sec_value = 0
+                self.min_value += 1
+            if self.min_value > 60:
+                self.timer.stop()
+
+        def get_ms(self, event=None, msg=None):
+            return self.ms_value
+
+        def get_min(self, event=None, msg=None):
+            return self.min_value
+
+        def get_sec(self, event=None, msg=None):
+            return self.sec_value
+
+    class CountdownManager(Abstract):
+        def __init__(self):
+            self.sec = 0
+            self.min = 0
+            self.hour = 0
+            self.timer = osTimer()
+            self.total = 0
+            self.time_cb = 0
+            self.time_play = 0
+            self.total_sec = 0
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("add_countdown_sec", self.add_sec)
+            EventMesh.subscribe("reduce_countdown_sec", self.reduce_sec)
+            EventMesh.subscribe("add_countdown_min", self.add_min)
+            EventMesh.subscribe("reduce_countdown_min", self.reduce_min)
+            EventMesh.subscribe("add_countdown_hour", self.add_hour)
+            EventMesh.subscribe("reduce_countdown_hour", self.reduce_hour)
+            EventMesh.subscribe("get_countdown_sec", self.get_sec)
+            EventMesh.subscribe("get_countdown_min", self.get_min)
+            EventMesh.subscribe("get_countdown_hour", self.get_hour)
+
+            EventMesh.subscribe("set_countdown_off_state", self.set_countdown_off_state)
+            EventMesh.subscribe("get_countdown_off_state", self.get_countdown_off_state)
+
+
+            EventMesh.subscribe("set_countdown_all_time", self.set_countdown_all_time)
+            EventMesh.subscribe("get_countdown_all_time", self.get_countdown_all_time)
+
+            EventMesh.subscribe("countdown_end_cb", self.countdown_end_cb)
+
+            EventMesh.subscribe("reset_time_countdown",self.reset)
+
+        def set_countdown_all_time(self, event, msg):
+            self.total = msg[0]
+            self.total_sec = msg[1]
+            # EventMesh.debug_log("self.total:{} self.total_sec:{}".format(self.total,self.total_sec))
+
+
+        def get_countdown_all_time(self, event, msg):
+            return self.total
+        
+        def set_countdown_off_state(self, event, msg):
+
+            self.time_cb = msg[0]
+            self.time_play = msg[1]
+            # EventMesh.debug_log("self.time_cb:{} self.total_sec:{}".format(self.time_cb,self.time_play))
+
+
+        def get_countdown_off_state(self, event, msg):
+            return [self.time_cb,self.time_play]
+        
+        def countdown_end_cb(self, event, msg):
+            
+            if self.time_cb == 1 and self.time_play == 1:
+                date_tmp = utime.localtime()
+                time_tmp = utime.mktime(date_tmp) 
+                reduce = time_tmp- self.total_sec
+                EventMesh.debug_log("self.time_cb:{} self.time_play:{} self.total:{} self.total_sec:{}".format(self.time_cb,self.time_play, self.total,self.total_sec))
+                self.total = self.total - reduce
+                if self.total <= 0:
+                    self.total = 0
+                    self.time_cb = 0
+                    self.time_play = 0
+                    self.sec = 0
+                    self.min = 0
+                    self.hour = 0
+                    
+                    EventMesh.publish("load_screen", {"screen": "countdown_end"})
+                    return
+                self.total_sec = time_tmp
+
+
+        def add_sec(self, event, msg):
+            if self.sec < 59:
+                self.sec = self.sec + 1
+
+        def reduce_sec(self, event, msg):
+            if self.sec > 0:
+                self.sec = self.sec - 1
+
+        def add_min(self, event, msg):
+            if self.min < 59:
+                self.min = self.min + 1
+
+        def reduce_min(self, event, msg):
+            if self.min > 0:
+                self.min = self.min - 1
+
+        def add_hour(self, event, msg):
+            if self.hour < 99:
+                self.hour = self.hour + 1
+
+        def reduce_hour(self, event, msg):
+            if self.hour > 0:
+                self.hour = self.hour - 1
+
+        def get_sec(self, event=None, msg=None):
+            return self.sec
+
+        def get_min(self, event=None, msg=None):
+            return self.min
+
+        def get_hour(self, event=None, msg=None):
+            return self.hour
+        
+
+        
+        def reset(self, event=None, msg=None):
+            self.hour = 0
+            self.min = 0
+            self.sec = 0
+        
+        
+
+    BATTERY_OCV_TABLE = {
+        "nix_coy_mnzo2": {
+            55: {
+                4290: 100, 4237: 95, 4179: 90, 4123: 85, 4070: 80, 4020: 75, 3963: 70, 3919: 65, 3882: 60, 3847: 55,
+                3818: 50, 3794: 45, 3772: 40, 3752: 35, 3733: 30, 3716: 25, 3699: 20, 3677: 15, 3652: 10, 3629: 5, 3400: 0,
+            },
+            20: {
+                4290: 100, 4237: 95, 4179: 90, 4123: 85, 4070: 80, 4020: 75, 3963: 70, 3919: 65, 3882: 60, 3847: 55,
+                3818: 50, 3794: 45, 3772: 40, 3752: 35, 3733: 30, 3716: 25, 3699: 20, 3677: 15, 3652: 10, 3629: 5, 3400: 0,
+            },
+            0: {
+                4290: 100, 4237: 95, 4179: 90, 4123: 85, 4070: 80, 4020: 75, 3963: 70, 3919: 65, 3882: 60, 3847: 55,
+                3818: 50, 3794: 45, 3772: 40, 3752: 35, 3733: 30, 3716: 25, 3699: 20, 3677: 15, 3652: 10, 3629: 5, 3400: 0,
+            },
+        },
+    }
+
+
+
+    class Battery(object):
+        """This class is for battery info.
+
+        This class can get battery voltage and energy.
+        if adc_args is not None, use cbc to read battery
+
+        adc_args: (adc_num, adc_period, factor)
+
+            adc_num: ADC channel num
+            adc_period: Cyclic read ADC cycle period
+            factor: calculation coefficient
+        """
+
+        def __init__(self, adc_args=None, chrg_gpion=None, stdby_gpion=None):
+            self.__energy = 100
+            self.__temp = 55
+
+            # ADC params
+            self.__adc = None
+            if adc_args:
+                self.__adc_num, self.__adc_period, self.__factor = adc_args
+                if not isinstance(self.__adc_num, int):
+                    raise TypeError("adc_args adc_num is not int number.")
+                if not isinstance(self.__adc_period, int):
+                    raise TypeError("adc_args adc_period is not int number.")
+                if not isinstance(self.__factor, float):
+                    raise TypeError("adc_args factor is not int float.")
+                self.__adc = ADC()
+
+            # Charge params
+            self.__charge_callback = None
+            self.__charge_status = None
+            self.__chrg_gpion = chrg_gpion
+            self.__stdby_gpion = stdby_gpion
+            self.__chrg_gpio = None
+            self.__stdby_gpio = None
+            self.__chrg_exint = None
+            self.__stdby_exint = None
+            if self.__chrg_gpion is not None and self.__stdby_gpion is not None:
+                self.__init_charge()
+
+        def __chrg_callback(self, args):
+            self.__update_charge_status()
+            if self.__charge_callback is not None:
+                self.__charge_callback(self.__charge_status)
+
+        def __stdby_callback(self, args):
+            self.__update_charge_status()
+            if self.__charge_callback is not None:
+                self.__charge_callback(self.__charge_status)
+
+        def __update_charge_status(self):
+            if self.__chrg_gpio.read() == 1 and self.__stdby_gpio.read() == 1:
+                self.__charge_status = 0
+            elif self.__chrg_gpio.read() == 0 and self.__stdby_gpio.read() == 1:
+                self.__charge_status = 1
+            elif self.__chrg_gpio.read() == 1 and self.__stdby_gpio.read() == 0:
+                self.__charge_status = 2
+            else:
+                raise TypeError("CHRG and STDBY cannot be 0 at the same time!")
+
+        def __init_charge(self):
+            self.__chrg_gpio = Pin(self.__chrg_gpion, Pin.IN, Pin.PULL_DISABLE)
+            self.__stdby_gpio = Pin(self.__stdby_gpion, Pin.IN, Pin.PULL_DISABLE)
+            self.__chrg_exint = ExtInt(self.__chrg_gpion, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.__chrg_callback)
+            self.__stdby_exint = ExtInt(self.__stdby_gpion, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU,
+                                        self.__stdby_callback)
+            self.__chrg_exint.enable()
+            self.__stdby_exint.enable()
+            self.__update_charge_status()
+
+        def __get_soc_from_dict(self, key, volt_arg):
+            """Get battery energy from map"""
+            if key in BATTERY_OCV_TABLE["nix_coy_mnzo2"]:
+                volts = sorted(BATTERY_OCV_TABLE["nix_coy_mnzo2"][key].keys(), reverse=True)
+                pre_volt = 0
+                volt_not_under = 0  # Determine whether the voltage is lower than the minimum voltage value of soc.
+                for volt in volts:
+                    if volt_arg > volt:
+                        volt_not_under = 1
+                        soc1 = BATTERY_OCV_TABLE["nix_coy_mnzo2"][key].get(volt, 0)
+                        soc2 = BATTERY_OCV_TABLE["nix_coy_mnzo2"][key].get(pre_volt, 0)
+                        break
+                    else:
+                        pre_volt = volt
+                # EventMesh.debug_log("__get_soc_from_dict:{}".format(soc2 - (soc2 - soc1) * (pre_volt - volt_arg) // (pre_volt - volt)))
+                if pre_volt == 0:  # Input Voltarg > Highest Voltarg
+                    return soc1
+                elif volt_not_under == 0:
+                    return 0
+                else:
+                    return soc2 - (soc2 - soc1) * (pre_volt - volt_arg) // (pre_volt - volt)
+
+        def __get_soc(self, temp, volt_arg, bat_type="nix_coy_mnzo2"):
+            """Get battery energy by temperature and voltage"""
+            if bat_type == "nix_coy_mnzo2":
+                if temp > 30:
+                    return self.__get_soc_from_dict(55, volt_arg)
+                elif temp < 10:
+                    return self.__get_soc_from_dict(0, volt_arg)
+                else:
+                    return self.__get_soc_from_dict(20, volt_arg)
+
+        def __get_power_vbatt(self):
+            return int(sum([Power.getVbatt() for i in range(100)]) / 100)
+
+        def __get_adc_vbatt(self):
+            self.__adc.open()
+            utime.sleep_ms(self.__adc_period)
+            adc_list = list()
+            for i in range(self.__adc_period):
+                adc_list.append(self.__adc.read(self.__adc_num))
+                utime.sleep_ms(self.__adc_period)
+            adc_list.remove(min(adc_list))
+            adc_list.remove(max(adc_list))
+            adc_value = int(sum(adc_list) / len(adc_list))
+            self.__adc.close()
+            vbatt_value = adc_value * (self.__factor + 1)
+            return vbatt_value
+
+        def set_temp(self, temp):
+            """Set now temperature."""
+            if isinstance(temp, int) or isinstance(temp, float):
+                self.__temp = temp
+                return True
+            return False
+
+        def get_voltage(self):
+            """Get battery voltage"""
+            if self.__adc is None:
+                return self.__get_power_vbatt()
+            else:
+                return self.__get_adc_vbatt()
+
+        def get_energy(self,volt_arg ):
+            """Get battery energy"""
+            if( volt_arg == None) :
+                volt_arg = self.get_voltage()
+            self.__energy = self.__get_soc(self.__temp, volt_arg)
+            # EventMesh.debug_log("get_energy:volt_arg {} __energy{}".format(volt_arg,self.__energy))
+            return self.__energy
+
+        def set_charge_callback(self, charge_callback):
+            if self.__chrg_gpion is not None and self.__stdby_gpion is not None:
+                if callable(charge_callback):
+                    self.__charge_callback = charge_callback
+                    return True
+            return False
+
+        def get_charge_status(self):
+            return self.__charge_status
+
+    class BatteryManager(Abstract):
+        def __init__(self):
+            """电池管理器"""
+            self.battery = Battery()
+            self.low_battery = False
+
+        def post_processor_after_instantiation(self):
+            """订阅此类所有的事件到 EventMesh中"""
+            EventMesh.subscribe("get_battery", self.get_battery)
+
+        def get_battery(self, event=None, msg=None):
+            battery = self.battery.get_energy(msg)
+            return battery
+
+        def get_voltage(self, event=None, msg=None):
+            voltage = self.battery.get_voltage()
+            return voltage
+
+    class ConfigStoreManager(Abstract):
+        """
+        持久化落盘存储
+        """
+
+        def __init__(self):
+            self.file_name = "/usr/conf_store.json"
+            self.lock = Lock()
+            self.map = dict()
+
+        def post_processor_after_instantiation(self):
+            if ql_fs.path_exists(self.file_name):
+                self.map = ql_fs.read_json(self.file_name)
+            else:
+                self.__store()
+            EventMesh.subscribe("persistent_config_get", self.__read)
+            EventMesh.subscribe("persistent_config_store", self.__store)
+
+        def __read(self, event, msg):
+            with self.lock:
+                return self.map.get(msg)
+
+        def __store(self, event=None, msg=None):
+            if msg is None:
+                msg = dict()
+            with self.lock:
+                self.map.update(msg)
+                ql_fs.touch(self.file_name, self.map)
+            
+    class sosInfoCallManager(Abstract):
+        # 通讯录
+        def __init__(self):
+            pass
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_sos_info_call", self.set_sos_info_call)
+
+        def set_sos_info_call(self, event, msg):
+            hangup_mode = EventMesh.publish("get_hangup_mode")
+            if hangup_mode == 1:
+                EventMesh.publish("set_sos_flag",0)
+                EventMesh.publish("set_sos_num",0)
+                EventMesh.publish("set_hangup_mode",0)
+            EventMesh.debug_log('hangup_mode disconnect',hangup_mode)
+            sos_flag = EventMesh.publish("get_sos_flag")
+            EventMesh.debug_log('voicecall sos_flag',sos_flag)
+            if sos_flag == 0 :
+                EventMesh.publish("set_sos_num",0)
+            else:
+                num = EventMesh.publish("get_sos_num")
+                number = EventMesh.publish("get_dial_sos_number")
+                if number != None:
+                    if len(number) > 0:
+                        if num == None:
+                            num = 0
+                        num+=1
+                        num_len = 0
+
+                        if len(number) == 1:
+                            num_len = len(number)+1#三次
+                        elif len(number) == 2:
+                            num_len = len(number)+1+2 #1+2+1+2
+                        elif len(number) == 3:
+                            num_len = len(number)+5 #1+3+5
+                        # EventMesh.debug_log("number:{} number_len :{} num:{} num_len:{}".format(number,len(number),num,num_len))
+                        if num > num_len :
+                            if len(number) == 1:
+                                number1 = str(number[0])
+                                sms.sendPduMsg(number1, '我需要你的帮助', 'UCS2')
+                            elif len(number) == 2:
+                                number1 = str(number[0])
+                                sms.sendPduMsg(number1, '我需要你的帮助', 'UCS2')
+
+                                number2 = str(number[1])
+                                sms.sendPduMsg(number2, '我需要你的帮助', 'UCS2')
+                            elif len(number) == 3:
+                                number1 = str(number[0])
+                                sms.sendPduMsg(number1, '我需要你的帮助', 'UCS2')
+                                number2 = str(number[1])
+                                sms.sendPduMsg(number2, '我需要你的帮助', 'UCS2')
+                                number3 = str(number[2])
+                                sms.sendPduMsg(number3, '我需要你的帮助', 'UCS2')
+                            EventMesh.publish("set_sos_flag",0)
+                            EventMesh.publish("set_sos_num",0)
+                        else:
+                        # EventMesh.debug_log("number:{} number_len :{}".format(number,len(number)))
+                            EventMesh.publish("set_sos_num",num)
+                            if len(number) == 1:
+                                if len(number[0]) != 0:
+                                    EventMesh.publish("set_callnumer_cb",number[0])
+                                    EventMesh.debug_log("phone 1")
+                            elif len(number) == 2:
+                                if num == 1 or num == 3 or num == 5: #1 2 3 4 5 
+                                    if len(number[1]) != 0:
+                                        EventMesh.debug_log("phone 2")
+                                        EventMesh.publish("set_callnumer_cb",number[1])
+                                elif num == 2 or num == 4:
+                                    if len(number[0]) != 0:
+                                        EventMesh.debug_log("phone 3")
+                                        EventMesh.publish("set_callnumer_cb",number[0])
+                            elif len(number) == 3:
+                                if num == 1 or num == 4 or num == 7:
+                                    if len(number[1]) != 0:
+                                        EventMesh.publish("set_callnumer_cb",number[1])
+                                        EventMesh.debug_log("phone 4")
+                                elif num == 2 or num == 5 or num == 8:
+                                    if len(number[2]) != 0:
+                                        EventMesh.debug_log("phone 5")
+                                        EventMesh.publish("set_callnumer_cb",number[2])
+                                elif num == 3 or num == 6 :
+                                    if len(number[0]) != 0:
+                                        EventMesh.debug_log("phone 6")
+                                        EventMesh.publish("set_callnumer_cb",number[0])   
+    WL_timer = osTimer()   
+    def WL_timer_cb(*args):   
+        get_call = EventMesh.publish("get_call_state") 
+        if get_call == 2:#只有拨进来才给接听
+            EventMesh.publish("answer_call_event")#接听电话
+    def voice_callback(args):
+        EventMesh.debug_log('voicecall iinfo:{}'.format(args))
+        if args[0] == 10:
+                get_UI_high_priority = EventMesh.publish("get_UI_high_priority")#如果在拨出去或者通话中屏蔽来电
+                if get_UI_high_priority == 1:
+                    EventMesh.publish("set_interrup_incall",1)
+                    return
+                EventMesh.debug_log('voicecall incoming call, PhoneNO.: ', args[6])
+                size_len = len(str(args[6]))
+                tmp = []
+                tmp = args[6]
+                find_num = tmp[0]
+                b = tmp[0].isdigit()#判断是否不是数字开头 暂时不用 因为截取了+判断不了 判断号码是否大于11位数,如果大于11位数 并且第一个字符是数字就按照最后11位做存储
+
+                if b == True and size_len > 11:
+                    tmp = tmp[size_len-11:]
+                WLKEY = EventMesh.publish("get_storage_config","WLKEY") 
+                if WLKEY == "1" or WLKEY == "2":#开启了白名单
+                    on_list_flag = 0
+                    phonebook = EventMesh.publish("get_phonebook_list")
+                    phonebook_list = phonebook[1]
+                    EventMesh.debug_log("voice_callback:phonebook_list{}".format(phonebook_list))
+                    try:
+                        for value in phonebook_list.values():
+                            if value == args[6]:
+                                on_list_flag = 1
+                                break
+                    except Exception as e:
+                        usys.print_exception(e)
+                    EventMesh.debug_log("voice_callback:on_list_flag{}".format(on_list_flag))
+                    if on_list_flag == 1:#在白名单里
+                        if WLKEY == "2":
+                            WL_timer.stop()
+                            WL_timer.start(30000, 0, WL_timer_cb)
+                    else:
+                        EventMesh.debug_log("voice_callback:不在白名单中,挂断")
+                        voiceCall.callEnd()
+                        return 
+                fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+                if fall_down != 0:
+                    voiceCall.callEnd()
+                    return
+                EventMesh.publish("set_call_state",2) 
+                EventMesh.publish("dialin_call_event")#电话拨进响铃
+                # EventMesh.publish("load_screen", {"screen": "incoming_call","meta":str(tmp)})
+
+        elif args[0] == 11:
+                EventMesh.publish("set_UI_high_priority",0)
+                sos_flag = EventMesh.publish("get_sos_flag")
+                if sos_flag == 1:
+                    sos_flag = 0
+                    EventMesh.publish("set_sos_flag",0)
+
+                EventMesh.debug_log('voicecall connected, PhoneNO.: ', args[6])
+                size_len = len(str(args[6]))
+                tmp = []
+                tmp = args[6]
+                find_num = tmp[0]
+                b = tmp[0].isdigit()#判断是否不是数字开头 暂时不用 因为截取了+判断不了
+                if b == True and size_len > 11:
+                    tmp = tmp[size_len-11:]
+                EventMesh.publish("set_call_state",3) 
+                # EventMesh.publish("load_screen", {"screen": "on_call","meta":str(tmp)})
+
+        elif args[0] == 12:
+                set_interrup_call = EventMesh.publish("get_interrup_incall")#打断这次不需要来电的ui事件 以免通话中退出当前界面进不去了
+                if set_interrup_call == 1:
+                    EventMesh.publish("set_interrup_incall",0)
+                    return
+
+                EventMesh.publish("set_interrup_incall",0)
+                EventMesh.publish("set_UI_high_priority",0)
+                
+
+                
+                
+                EventMesh.publish("set_sos_info_call")  
+                flag = EventMesh.publish("get_call_state") 
+                if flag == 2:
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("close_timer_all")#
+                EventMesh.publish("set_call_state",0) 
+                EventMesh.debug_log('voicecall disconnect end')
+                
+
+        elif args[0] == 13:
+                EventMesh.debug_log('voicecall is waiting, PhoneNO.: ', args[6])
+        elif args[0] == 14:
+
+                EventMesh.debug_log('voicecall dialing, PhoneNO.: ', args[6])
+                EventMesh.publish("set_UI_high_priority",0)
+                EventMesh.publish("set_call_state",1) 
+                # EventMesh.publish("load_screen", {"screen": "dialing"})
+
+                
+        elif args[0] == 15:
+                EventMesh.debug_log('voicecall alerting, PhoneNO.: ', args[6])
+                EventMesh.publish("set_call_state",1) 
+                
+        elif args[0] == 16:
+                EventMesh.debug_log('voicecall holding, PhoneNO.: ', args[6])
+
+    class DeviceInfoManager(Abstract):
+        
+        """
+            设备信息管理
+        """
+
+        def __init__(self):
+
+            self.DeviceInfo_queue = Queue()
+            _thread.stack_size((9+6)*1024)
+            _thread.start_new_thread(self.DeviceInfo_queue_thread, ())
+            _thread.stack_size(8*1024)
+            self.boot_time_count = 0
+            self.factory_test_time = 0
+            EventMesh.subscribe("publish_message_event_DeviceInfo",self.publish_message_event_DeviceInfo)
+            self.key = ""
+            self.imei = ""
+            self.cid = "ETEST20221014010"
+            self.imsi = ""
+            self.password = "000000"
+            #self.__city = None
+            #self.__location = None
+            self.timer_push_schedule = osTimer()
+            self.timer_pusht_test = osTimer()
+            
+            #self.battery_push_schedule = osTimer()
+            self.check_battery_list = []
+            
+            self.step = [0,0,0,0]
+            self.timer_push=0
+            self.timer_push_tmp=60
+            self.PING = "0" #绑定状态
+            self.connect = 0 #服务器连接状态
+            self.KA_time = 0
+            self.HR_time = 0
+            self.hr_timeSecond = 0
+            self.HR_state = 0
+            self.HR_Onestate = 0
+            self.get_hr_state = 0
+            self.get_spo2_state = 0
+            self.set_hsenor_crt = 0
+            self.HR_OneTime = 0
+            self.Hr_Need_Open = 0
+            self.Spo2_Need_Open = 0
+            self.bat_time = 0
+            self.vbat_full_flag = 0
+            self.clear_step = 0
+            self.test = 0
+            self.old_time = 0
+            self.UD_time = 0
+            self.upload_time = 0
+            self.UD_timeout = 7*60
+
+            self.low_power_AL = 0
+
+            self.temp_timeSecond = 0
+            self.temp_state = 0
+            self.temp_one_state = 0
+            self.temp_warning = 0
+
+            self.bg_timeSecond = 0
+
+            self.bp_timeSecond = 0
+            self.bpauto_state = 0
+
+            self.spo2_timeSecond = 0
+            self.spo2auto_state = 0
+
+            self.vbat_count = 0
+
+            self.vbat_buf=[]
+
+            self.curr_battery_level = 4200
+            self.bat_count = 0
+
+            self.mearsure_btn = 0
+            self.mearsure_timer = 0
+
+            self.old_hr_time = 0
+            self.old_spo2_time = 0
+
+            self.no_smi_count = 0
+            self.no_smi_state = 0
+
+            self.old_bp_time = 0
+
+            self.medicine_count = 0
+            self.medicine_flag  = 0
+            self.medicine_oldtotalmin = 0
+            
+            self.wakeup_flag = 0
+            self.wakeup_count = 0
+            self.wakeup_oldtotalmin = 0
+
+            self.sleep_flag = 0
+            self.sleep_count = 0
+            self.sleep_oldtotalmin = 0
+
+            self.reset_flag = 0
+            self.reset_count = 0
+            self.reset_oldtotalmin = 0
+
+            self.home_flag = 0
+            self.home_count = 0
+            self.home_oldtotalmin = 0
+
+            self.normal_flag = 0
+            self.normal_count = 0
+            self.normal_oldtotalmin = 0
+            
+            self.charge_full_count = 0
+            self.GPS_step_t = 0#记录步数
+            self.usb = USB()
+            self.usb.setCallback(self.usb_event_cb)
+            self.log = LogAdapter(self.__class__.__name__)
+            self.rtc = RTC()
+            self.aud = audio.Audio(0)
+            EventMesh.debug_log("DeviceInfoManager:1")
+            self.gsensor = SC7A20()
+            EventMesh.debug_log("DeviceInfoManager:1.0")
+            self.gsensor.activate()
+            EventMesh.debug_log("DeviceInfoManager:1.1")
+            self.gsensor.init()
+            EventMesh.debug_log("DeviceInfoManager:2")
+            self.gsensor.set_callback(self.gsensor_cb)
+            try :
+                self.hsensor = HX3918()
+                
+            except Exception as e:
+                EventMesh.debug_log("Hsensor none HX3918:{}".format(e))   
+            try :
+                self.hsensor = GH3018()
+            except Exception as e:
+                EventMesh.debug_log("Hsensor none GH3018:{}".format(e))   
+            #
+            self.hsensor.activate()
+            self.hsensor.init()
+            self.hsensor.close()
+            try :
+                self.hsensor.set_sar(1)
+            except Exception as e:
+                EventMesh.debug_log("Hsensor none set_sar:{}".format(e)) 
+            self.old_temp_time = 0
+            # #EventMesh.debug_log("hsensor.open_heart:%d\r\n"%(self.hsensor.open_heart()))
+            EventMesh.debug_log("DeviceInfoManager:3")
+            self.i2c0 = I2C(I2C.I2C0, I2C.FAST_MODE)
+            self.stop_temp( None, None)
+            self.dev_state = 0
+            self.wear = 1
+            self.BG_state = 0
+            self.old_bg_time = 0
+
+            self.pull_time = 0
+
+            self.drink_time = 0
+
+            self.alarm_count = 0
+            self.alarm_flag = 0
+
+            self.time_count = 0
+            
+            self.auto_spo2_count = 0
+
+            self.auto_hr_count = 0
+
+            self.auto_temp_count = 0
+
+            self.test_time = 0
+
+        def post_processor_after_instantiation(self):
+            EventMesh.debug_log("post_processor_after_instantiation:1")
+            """订阅此类所有的事件到 EventMesh中"""
+            voiceCall.setCallback(voice_callback)
+            EventMesh.subscribe("screen_get_ope", self.get_device_ope)
+            EventMesh.subscribe("screen_get_sig", self.get_signal)
+            EventMesh.subscribe("screen_get_time", self.get_time)
+            EventMesh.subscribe("about_get_imei", self.get_imei)
+            EventMesh.subscribe("about_get_iccid", self.get_ic_cid)
+            EventMesh.subscribe("get_sim_Status", self.get_sim_Status)
+            EventMesh.subscribe("about_get_phonenum", self.get_phone_num)
+            EventMesh.subscribe("screen_get_battery", self.get_battery)
+            EventMesh.subscribe("set_curr_battery_level", self.set_curr_battery_level)
+            EventMesh.subscribe("get_curr_battery_level", self.get_curr_battery_level)
+            EventMesh.subscribe("get_fw_version", self.get_device_fw_version)
+            EventMesh.subscribe("get_standby_time", self.get_standby_time)
+            EventMesh.subscribe(constants.EVENT.GET_STEP, self.get_step_count)
+            EventMesh.subscribe("sim_slot_get", self.sim_slot_get)
+            EventMesh.subscribe("sim_slot_switch", self.sim_slot_switch)
+            EventMesh.subscribe(constants.EVENT.GET_KEY, self.get_key)
+            EventMesh.subscribe(constants.EVENT.SET_KEY, self.set_key)
+            EventMesh.subscribe(constants.EVENT.GET_IMEI, self.get_imei)
+            EventMesh.subscribe(constants.EVENT.GET_CID, self.get_cid)
+            EventMesh.subscribe(constants.EVENT.SET_CID, self.set_cid)
+            EventMesh.subscribe(constants.EVENT.GET_IMSI, self.get_imsi)
+            EventMesh.subscribe(constants.EVENT.GET_PASSWORD, self.get_password)
+            EventMesh.subscribe(constants.EVENT.SET_PASSWORD, self.set_password)     
+            EventMesh.subscribe(constants.EVENT.SET_PING, self.set_ping)
+            EventMesh.subscribe(constants.EVENT.GET_PING, self.get_ping)
+            EventMesh.subscribe(constants.EVENT.SET_CONNECT, self.set_connect)
+            EventMesh.subscribe(constants.EVENT.GET_CONNECT, self.get_connect)
+
+            
+            EventMesh.subscribe(constants.EVENT.START_BLOOD_OXYGEN, self.start_blood_oxygen)
+            EventMesh.subscribe(constants.EVENT.START_HEART, self.start_heart)
+            EventMesh.subscribe(constants.EVENT.STOP_BLOOD_OXYGEN, self.stop_blood_oxygen)
+            EventMesh.subscribe(constants.EVENT.STOP_HEART, self.stop_heart)
+            EventMesh.subscribe(constants.EVENT.GET_BLOOD_OXYGEN, self.get_blood_oxygen)
+            EventMesh.subscribe(constants.EVENT.GET_HEART, self.get_heart)
+            EventMesh.subscribe(constants.EVENT.GET_WEAR, self.get_wear)
+            EventMesh.subscribe("get_Hsensor", self.get_Hsensor)
+            EventMesh.subscribe("Hsensor_set_sleep", self.Hsensor_set_sleep)
+
+            EventMesh.subscribe(constants.EVENT.START_TEMP, self.start_temp)
+            EventMesh.subscribe(constants.EVENT.STOP_TEMP, self.stop_temp)
+            EventMesh.subscribe(constants.EVENT.GET_TEMP, self.get_temp)
+            EventMesh.subscribe("get_boot_time_count", self.get_boot_time_count)
+            EventMesh.subscribe("get_factory_test_time", self.get_factory_test_time)
+            EventMesh.subscribe("get_dev_state", self.get_dev_state)
+            EventMesh.subscribe("set_dev_state", self.set_dev_state)
+
+            EventMesh.subscribe("clear_health_state", self.clear_health_state)
+
+            EventMesh.subscribe("clear_home_alarm", self.clear_home_alarm)
+            EventMesh.subscribe("clear_medicine_alarm", self.clear_medicine_alarm)
+            EventMesh.subscribe("clear_wakeup_alarm", self.clear_wakeup_alarm)
+            EventMesh.subscribe("clear_sleep_alarm", self.clear_sleep_alarm)
+            EventMesh.subscribe("clear_normal_alarm", self.clear_normal_alarm)
+
+            EventMesh.subscribe("clear_manual_hr_flag", self.clear_manual_hr_flag)
+            EventMesh.subscribe("clear_manual_temp_flag", self.clear_manual_temp_flag)
+
+
+            EventMesh.subscribe("clear_usb_flag", self.clear_usb_flag)
+            
+            EventMesh.debug_log("post_processor_after_instantiation:2")
+            self.timer_push_schedule.start(10000, 1, self.publish_event_cb)
+            # self.timer_pusht_test.start(2000, 1, self.publish_test)
+            # self.battery_push_schedule.start(3000, 1, self.__check_battery)
+            self.log.debug("post_processor_after_instantiation finished")
+            #EventMesh.publish(constants.EVENT.START_HEART)
+            # 设备开机立刻更新一次参数
+            self.publish_event_cb()
+            
+            EventMesh.debug_log("post_processor_after_instantiation:3")
+
+        def clear_manual_hr_flag(self,event,msg):
+            self.auto_hr_count = 0
+        
+        def clear_manual_temp_flag(self,event,msg):
+            self.auto_temp_count = 0
+
+        def publish_message_event_DeviceInfo(self,event,msg):
+            self.DeviceInfo_queue.put(msg)
+
+        #DeviceInfo的消息队列处理,防止卡顿
+        def DeviceInfo_queue_thread(self):
+            while True:
+                data = self.DeviceInfo_queue.get()
+                #EventMesh.debug_log("DeviceInfo_queue_thread:data = {}".format(data))
+                if data != None:
+                    try:
+                        data["func"](data["data"])
+                    except Exception as e:
+                        EventMesh.debug_log("DeviceInfo_queue_thread:ERROR:{}".format(e))
+                        usys.print_exception(e)
+
+
+        def gsensor_cb(self, para):
+            EventMesh.debug_log("gsensor_cb:{}".format(para))
+            flip_sw = EventMesh.publish("get_storage_config","flip_sw")
+            fall_sw = EventMesh.publish("get_storage_config","fall_sw")
+            if para == 0: #跌倒报警
+                pass
+                if fall_sw == "1":
+                    EventMesh.publish("falldown_alarm_event")
+                    dev_state =  EventMesh.publish("get_dev_state")
+
+                    tmp = 1 << 21
+                    dev_state = dev_state|tmp #第21位=1
+                    EventMesh.publish("set_dev_state",dev_state)
+                    EventMesh.publish(constants.EVENT.START_LOCATION,[constants.PROTOCOL.AL_SEND,dev_state]) #开始AL定位
+                    pass
+                #EventMesh.publish("load_screen", {"screen": "FIND"})
+            elif para == 1: #抬腕
+                
+                if flip_sw == 1:
+                    EventMesh.publish(constants.EVENT.SYSTEM_UP)
+                
+            elif para == 2: #放手
+                pass
+                # if flip_sw == 1:
+                #     EventMesh.publish(constants.EVENT.SYSTEM_SLEEP)
+        def get_boot_time_count(self, event, msg):
+            return self.boot_time_count
+        
+        def get_factory_test_time(self, event, msg):
+            return self.factory_test_time
+        
+        def get_dev_state(self, event, msg):
+            return self.dev_state
+        def set_dev_state(self, event, msg):
+            self.dev_state = msg
+        
+        def publish_event_cb(self, *args, **kwargs):
+            
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if open_power != None:
+                if open_power == 1:
+                    if self.boot_time_count < 50000000:
+                        self.boot_time_count += 10
+                    if self.factory_test_time < 300:
+                        self.factory_test_time+=10
+                #EventMesh.debug_log("boot_time_count:{}".format(self.boot_time_count))
+            EventMesh.publish("publish_message_event_DeviceInfo",{"func":self.publish_event,"data":0})  
+        def optimize_temp(self,temp):
+            temp += 0.5
+            get_temp_time  = EventMesh.publish("get_temp_time")
+            EventMesh.debug_log("temp:{}".format(temp))
+            if temp < 36 :#or temp > 37.5:
+                temp = 36+urandom.random()
+            if temp > 37.5:
+                
+                self.temp_warning += 1
+                EventMesh.debug_log("temp_warning:{} get_temp_time{}".format(self.temp_warning,get_temp_time))
+                
+                if self.temp_warning < 5:#高温没连续超过3次,和谐成37.5度以下
+                    temp = 37+(urandom.randint(1, 4)/10)
+                else:
+                    self.temp_warning = 0
+            else:
+                if self.temp_warning>=1:
+                    self.temp_warning -= 1
+            if temp >= 40:
+                temp = 40
+            return temp
+        def clear_health_state(self,event,msg):
+            print("clear_health_state")
+            self.old_bp_time = 0#关闭心率 血压 血氧 体温清除标志
+            self.old_time = 0
+            self.HR_Onestate = 0
+            self.HR_OneTime = 0
+            self.HR_state = 0
+            self.set_hsenor_crt = 0
+            self.old_bg_time = 0
+            self.old_hr_time = 0
+            self.old_spo2_time = 0
+            self.BG_state = 0
+            self.bpauto_state = 0
+            self.spo2auto_state = 0
+            pass
+
+        def clear_temp_state(self,event,msg):
+            print("clear_temp_state")
+            self.temp_state = 0
+            self.temp_one_state = 0
+            self.old_temp_time = 0
+            pass
+
+        def publish_event(self,data):
+            """
+            定时事件处理
+            :param args:
+            :param kwargs:
+            :return:
+            """
+
+            date_tmp = utime.localtime()
+            time_tmp = utime.mktime(date_tmp)
+            # EventMesh.debug_log("date_tmp......01....{} time_tmp:{}\r\n".format(date_tmp,time_tmp))
+            
+
+            EventMesh.publish("countdown_end_cb")
+            """定时检查是否关闭gps失败"""
+            # gnss_state = quecgnss.get_state()
+            # get_location_flag = EventMesh.publish("get_location_flag")
+            # if get_location_flag != None:
+            #     # if gnss_state == 2 and get_location_flag == 0:
+            #     #     EventMesh.publish(constants.EVENT.GPSCLOSE)
+            #     if(get_location_flag == 0):
+            #         EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.UD_SEND) #开始UD定位
+
+            """7分钟一次心跳"""
+            if EventMesh.platform == "gewu":
+                if  math.fabs(time_tmp - self.KA_time) > gheartbeat_time: #7分钟一次心跳
+                    self.KA_time = time_tmp
+                    EventMesh.publish(constants.PROTOCOL.KA_SEND)
+            else:
+                if  math.fabs(time_tmp - self.KA_time) > heartbeat_time: #7分钟一次心跳
+                    self.KA_time = time_tmp
+                    EventMesh.publish(constants.PROTOCOL.KA_SEND)
+
+            """定时定位"""
+            #EventMesh.publish("set_upload_data",3*60)
+            self.upload_time = EventMesh.publish("get_upload_data")
+            #EventMesh.debug_log("self.upload_time:{} math.fabs(time_tmp - self.UD_time):{}".format(self.upload_time,math.fabs(time_tmp - self.UD_time)))
+            if self.upload_time != None :
+                if  math.fabs(time_tmp - self.UD_time) > self.upload_time: #30分钟一次定位
+                    self.UD_time = time_tmp
+                    status_tmp = self.gsensor.get_status()#获取运动次数
+                    #status_tmp = 4
+                    #EventMesh.txt_log("status_count:{}".format(status_tmp))
+                    if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1 and status_tmp > 3 :
+                        EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.UD_SEND) #开始UD定位
+                        self.gsensor.clean_status()#清除运动次数
+                    else : #关闭定位
+                        #EventMesh.txt_log("NO status")
+                        EventMesh.debug_log("NO status")
+                        EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 
+            
+            EventMesh.publish(constants.EVENT.PUSH_STEP, self.get_step_count())
+
+            """电池平均值"""
+            temp = Power.getVbatt()
+            if self.bat_count < 10:
+                self.vbat_buf.append(temp)
+                self.bat_count += 1
+            else:
+                for i in range(9):
+                    self.vbat_buf[i] = self.vbat_buf[i+1]
+                self.vbat_buf[9] = temp
+            curr_count = len(self.vbat_buf)
+            bat_total_value = 0
+            for i in range(curr_count):
+                bat_total_value += self.vbat_buf[i]
+            bat_total_value = bat_total_value//curr_count#一分钟更新一次电量 10个平均值
+            EventMesh.publish("set_curr_battery_level",bat_total_value)
+            # EventMesh.debug_log("self.vbat_buf:{} curr_count :{} bat_total_value:{} temp:{}".format(self.vbat_buf,curr_count,bat_total_value,temp))
+            bat_tmp = EventMesh.publish("screen_get_battery")
+            self.vbat_count+=10
+            if self.vbat_count >= 60:
+                self.vbat_count = 0
+                if bat_tmp != None:
+                    bat_value = bat_tmp[1]
+                    if bat_value <= 0:
+                        pass
+                        # EventMesh.publish("load_screen", {"screen": "LOW_ONE_POWER"})
+            
+            
+            """"隔天清步数"""
+
+            data = RTC().datetime()
+
+            hour = int(data[4])
+            min = int(data[5])
+
+
+
+            cur_month = int(data[1])
+            cur_day = int(data[2])
+            cur_year = int(data[0])
+
+            old_Timesec = EventMesh.publish("get_old_time_data")
+            # EventMesh.debug_log("hour:{} {} cur_month:{} {} next_alarm_time:{} old_Timesec:{}".format(hour,min,cur_month,cur_day,next_alarm_time,old_Timesec))
+            # EventMesh.debug_log("old_Timesec",old_Timesec)
+            if old_Timesec != None:
+                next_alarm_time = utime.localtime(int(old_Timesec))
+                month = int(next_alarm_time[1]) #00:00 18
+                day = int(next_alarm_time[2])
+                year = int(next_alarm_time[0])
+                if month != cur_month or day != cur_day or year != cur_year:#年 月 日只要其中一个都不一样就清零
+                    EventMesh.publish("set_old_time_data",time_tmp)
+                    self.gsensor.reset_step()
+
+                    EventMesh.publish("set_old_step_value",0)
+                    
+                    hr = EventMesh.publish("get_old_hr_data")
+                    if hr != 0:
+                        EventMesh.publish("set_old_hr_data", 0)
+                    
+                    spo2 = EventMesh.publish("get_old_spo2_data")
+                    if spo2 != 0:
+                        EventMesh.publish("set_old_spo2_data", 0)
+                    EventMesh.debug_log("clear step1111")
+                else:
+                    pass
+                    
+                    
+            if hour == 23:#清步数23:59
+                if min == 59:#58 59
+                    # if self.clear_step == 0:
+                    #     self.clear_step = 1
+                    EventMesh.publish("set_old_time_data",time_tmp)
+                    self.gsensor.reset_step()
+                    EventMesh.publish("set_old_step_value",0)
+
+                    hr = EventMesh.publish("get_old_hr_data")
+                    if hr != 0:
+                        EventMesh.publish("set_old_hr_data", 0)
+                    
+                    spo2 = EventMesh.publish("get_old_spo2_data")
+                    if spo2 != 0:
+                        EventMesh.publish("set_old_spo2_data", 0)
+                    EventMesh.debug_log("clear step2222")
+
+                else:
+                    self.clear_step = 0
+            else:
+                self.clear_step = 0
+            
+            """电量小于0% 关机"""
+            get_low_btn = EventMesh.publish("get_low_bat_btn")#
+            battery = EventMesh.publish("screen_get_battery")
+            if battery != None:
+                power = int(battery[1])
+                if battery[0] != '1':
+                    if power == 0:
+                        EventMesh.publish("open_power_on",2)#  
+                    """"低电报警"""
+                    # print("low power!!!!!!!!!!! %d",self.low_power_AL)
+                    if power <= 15 and self.low_power_AL==0:
+                        self.low_power_AL = 1
+                        dev_state =  EventMesh.publish("get_dev_state")
+
+                        tmp = 1 << 17
+                        dev_state = dev_state|tmp #第17位=1
+                        EventMesh.publish("set_dev_state",dev_state)
+                        EventMesh.publish(constants.EVENT.START_LOCATION,[constants.PROTOCOL.AL_SEND,dev_state]) #开始AL定位
+
+                if power >= 50:
+                    self.low_power_AL = 0
+
+            """未联网提示关机"""
+            ble=EventMesh.publish(constants.EVENT.GET_CONNECT)
+            # EventMesh.debug_log("ble",ble)
+            if ble == 0:#未联网提示关机
+                if battery[0] != '1':
+                    self.no_smi_count+=10
+                    # EventMesh.debug_log("self.no_smi_count",self.no_smi_count)
+                    if self.no_smi_count >= (15*60):#(15*60)
+                        self.no_smi_count = 0
+                        EventMesh.publish("open_power_on",2)#  #未检测到sim卡15分钟后关机
+                    
+            else:
+                self.no_smi_count = 0
+
+            msg_nums = sms.getMsgNums() #获取短信条数
+            # EventMesh.debug_log("msg_nums",msg_nums)
+            if(msg_nums != -1):
+                sms_data = sms.getSaveLoc()
+                sms_max = sms_data[0][2]
+                if msg_nums >= sms_max-1:
+                    EventMesh.publish("delete_sms_event")#
+
+            #佩戴检测
+            WEAR = EventMesh.publish(constants.EVENT.GET_WEAR)#佩戴数据
+            if self.wear != WEAR:
+                remove_sw = EventMesh.publish("get_storage_config","remove_sw")
+                if remove_sw == "1":#开启了佩戴检测的开关
+                    dev_state =  EventMesh.publish("get_dev_state")
+                    
+                    if WEAR != 1:
+                        tmp = 1 << 3
+                        tmp = ~tmp
+                        tmp = 1 << 20
+                        dev_state = dev_state|tmp #第20位=1
+                    # else :     
+                    #     pass              
+                        
+                    #     tmp = 1 << 20
+                    #     dev_state = dev_state|tmp #第20位=1
+                    #     tmp = 1 << 3
+                    #     dev_state = dev_state|tmp #第三位=1
+                        EventMesh.debug_log("佩戴检测:{}".format(dev_state))    
+                        EventMesh.publish("set_dev_state",dev_state)
+                        EventMesh.publish(constants.EVENT.START_LOCATION,[constants.PROTOCOL.AL_SEND,dev_state]) #开始AL定位,发送报警
+                        #EventMesh.publish(constants.PROTOCOL.HELP_SEND,65)
+            self.wear = WEAR
+            """定时测量心率,血氧,体温"""
+            self.get_hr_state = EventMesh.publish("get_hr_state")
+            self.get_spo2_state = EventMesh.publish("get_spo2_state")
+            get_temp_time  = EventMesh.publish("get_temp_time")
+            get_temp_state  = EventMesh.publish("get_temp_state")
+            get_bp_state  = EventMesh.publish("get_bp_state")
+            get_bg_state  = EventMesh.publish("get_bg_state")
+            if get_bg_state == None:
+                get_bg_state = 0
+            if get_bp_state == None:
+                get_bp_state = 0
+
+            if get_temp_state == None:
+                get_temp_state = 0
+
+            if self.get_hr_state == None:
+                self.get_hr_state = 0
+            if self.get_spo2_state == None:
+                self.get_spo2_state = 0 
+        
+            call_state = EventMesh.publish("get_call_state")
+            if call_state == None:
+                call_state = 0
+            if battery[0] != "1":
+                if get_temp_state != None and call_state != None: #突然脱腕
+
+                    if get_temp_state > 1  and (WEAR != 1 or call_state != 0):
+                        EventMesh.publish(constants.EVENT.STOP_TEMP)
+                        EventMesh.publish("set_temp_state",0)
+                        EventMesh.txt_log("auto stop_temp:22")
+
+                    if (self.get_hr_state > 1 or self.get_spo2_state > 1 or get_bp_state > 1 or get_bg_state > 1) and (WEAR != 1 or call_state != 0):
+                        # print("wear faile")
+                        if self.get_hr_state > 1 :
+                            EventMesh.txt_log("auto stop_hr:22")
+                            EventMesh.publish("set_hr_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 
+                            EventMesh.publish(constants.EVENT.STOP_HEART) 
+                            if WEAR == 1:
+                                heart_value = EventMesh.publish(constants.EVENT.GET_HEART)
+                                if heart_value >= 50 and heart_value != None:
+                                    EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据
+                            
+                        if self.get_spo2_state > 1:
+                            EventMesh.txt_log("auto stop_spo2:22")
+                            EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
+
+                            EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
+                            spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)
+                            if WEAR == 1:
+                                if spo2_value > 85 and spo2_value != None:
+                                    EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)
+                            
+                        if get_bp_state > 1:
+                            EventMesh.txt_log("auto stop_bp:22")
+                            EventMesh.publish("set_bp_state",0)#2代表后台进入测试
+                            EventMesh.publish(constants.EVENT.STOP_HEART)
+                            if WEAR == 1:
+                                blood_data = get_autoblood_value()
+                                if blood_data == None:
+                                    blood_data[0] = 0
+                                    blood_data[1] = 0
+
+                                max_value = blood_data[0]
+                                min_value = blood_data[1]
+                                if max_value != 0 and min_value != 0:
+                                    EventMesh.publish(constants.PROTOCOL.BLOOD_SEND,[max_value,min_value])
+                            
+                        if get_bg_state > 1:
+                            EventMesh.txt_log("auto stop_bg:22")
+                            EventMesh.publish("set_bg_state",0)#2代表后台进入测试
+                            EventMesh.publish(constants.EVENT.STOP_HEART)
+                            if WEAR == 1:
+                                bg_data = get_blood_sugar_value()
+                                if bg_data == None:
+                                    bg_data = 0
+                                if bg_data != 0:
+                                    # EventMesh.publish("play_sugar_value", bg_data)#播放血糖数值
+                                    EventMesh.publish(constants.PROTOCOL.BLOODGLUSOCE_SEND,bg_data)
+                            
+            if self.pull_time == 0:
+                self.pull_time = time_tmp
+            # if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#已联网 并且不在充电 佩戴正常 不在通话就给测试心率
+            if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1 and battery[0] != "1" and WEAR == 1 and call_state == 0:
+                #防止时间校时出错
+                if time_tmp < self.pull_time :
+                    self.pull_time = time_tmp
+                if time_tmp < self.temp_timeSecond:
+                    self.temp_timeSecond = time_tmp
+                if time_tmp < self.hr_timeSecond:
+                    self.hr_timeSecond = time_tmp
+                if time_tmp < self.spo2_timeSecond :
+                    self.spo2_timeSecond = time_tmp
+                if time_tmp < self.bp_timeSecond:
+                    self.bp_timeSecond = time_tmp
+                if time_tmp < self.bg_timeSecond:
+                     self.bg_timeSecond = time_tmp
+                     
+                if time_tmp - self.pull_time >= 30:
+                    # EventMesh.debug_log("shifens:")  
+
+                    get_hr_state = EventMesh.publish("get_hr_state")
+                    get_spo2_state = EventMesh.publish("get_spo2_state")
+                    get_bp_state  = EventMesh.publish("get_bp_state")
+                    get_bg_state  = EventMesh.publish("get_bg_state")
+                    get_temp_state  = EventMesh.publish("get_temp_state")
+                    if get_hr_state == None:
+                        get_hr_state = 0
+                        self.old_hr_time = 0
+
+                    if get_spo2_state == None:
+                        get_spo2_state = 0
+                        self.old_spo2_time = 0
+
+                    if get_temp_state == None:
+                        get_temp_state = 0
+                        self.temp_one_state = 0
+
+                    if get_bp_state == None:
+                        get_bp_state = 0
+                        self.old_bp_time = 0
+                    
+                    if get_bg_state == None:
+                        get_bg_state = 0
+                        self.old_bg_time = 0
+                    
+                    # print("bp get_bp_state ",get_bp_state,self.old_bp_time)
+
+                    
+                    if get_hr_state != None:
+                        if get_hr_state == 3:
+                            self.old_hr_time+=1
+                            if self.old_hr_time == 1:
+                                EventMesh.publish("set_hr_state",3)#2代表后台进入测试
+                                # EventMesh.publish("set_hr_blood_led",1)
+                                EventMesh.publish(constants.EVENT.START_HEART)
+                                EventMesh.txt_log("auto start_hr:333")
+                            elif self.old_hr_time > 6:
+                                self.old_hr_time = 0
+                                EventMesh.publish("set_hr_state",0)#2代表后台进入测试
+                                EventMesh.txt_log("auto stop_hr:333")
+                                EventMesh.publish(constants.EVENT.STOP_HEART)
+                                heart_value = EventMesh.publish(constants.EVENT.GET_HEART)
+                                EventMesh.debug_log("heart_value:{}".format(heart_value))
+                                if heart_value >= 50 and heart_value != None:
+                                    EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据
+                                EventMesh.debug_log("STOP_HEART:3")
+                        else:
+                            self.old_hr_time = 0
+                    else:
+                        self.old_hr_time = 0
+
+
+                    if get_spo2_state != None:
+                        if get_spo2_state == 3:
+                            self.old_spo2_time+=1
+                            if self.old_spo2_time == 1:
+                                EventMesh.publish("set_spo2_state",3)#2代表后台进入测试
+                                # EventMesh.publish("set_hr_blood_led",1)
+                                EventMesh.publish(constants.EVENT.START_BLOOD_OXYGEN)#K开血氧
+                                EventMesh.txt_log("auto start_spo2:333")
+                            elif self.old_spo2_time > 6:
+                                self.old_spo2_time = 0
+                                EventMesh.txt_log("auto stop_spo2:333")
+                                EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
+                                EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
+                                spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)
+                                if spo2_value > 85 and spo2_value != None:
+                                    EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)
+                                    
+                        else:
+                            self.old_spo2_time = 0
+                    else:
+                        self.old_spo2_time = 0
+
+
+                    if get_bp_state != None:
+                        if get_bp_state == 3:
+                            self.old_bp_time+=1
+                            if self.old_bp_time == 1:
+                                EventMesh.publish("set_bp_state",3)#2代表后台进入测试
+                                # EventMesh.publish("set_hr_blood_led",1)
+                                EventMesh.publish(constants.EVENT.START_HEART)
+                                EventMesh.txt_log("auto start_bp:333")
+                            elif self.old_bp_time > 6:
+                                self.old_bp_time = 0
+                                
+                                EventMesh.publish("set_bp_state",0)#2代表后台进入测试
+                                # EventMesh.publish("stop_led_timer")#设置参数
+                                blood_data = get_autoblood_value()
+                                if blood_data == None:
+                                    blood_data[0] = 0
+                                    blood_data[1] = 0
+
+                                max_value = blood_data[0]
+                                min_value = blood_data[1]
+                                if max_value != 0 and min_value != 0:
+                                    EventMesh.publish(constants.PROTOCOL.BLOOD_SEND,[max_value,min_value])
+                                EventMesh.publish(constants.EVENT.STOP_HEART)
+                                EventMesh.txt_log("auto stop_bp:333")
+                        else:
+                            self.old_bp_time = 0
+                    else:
+                        self.old_bp_time = 0
+
+                    if get_bg_state != None:
+                        if get_bg_state == 3:
+                            self.old_bg_time+=1
+                            if self.old_bg_time == 1:
+                                EventMesh.publish("set_bg_state",3)#2代表后台进入测试
+                                # EventMesh.publish("set_hr_blood_led",1)
+                                EventMesh.publish(constants.EVENT.START_HEART)
+                                EventMesh.txt_log("auto start_bg:333")
+                            elif self.old_bg_time > 6:
+                                self.old_bg_time = 0
+                                EventMesh.publish("set_bg_state",0)#2代表后台进入测试
+                                EventMesh.publish(constants.EVENT.STOP_HEART)
+                                # EventMesh.publish("stop_led_timer")#设置参数
+                                bg_data = get_blood_sugar_value()
+                                if bg_data == None:
+                                    bg_data = 0
+                                if bg_data != 0:
+                                    EventMesh.publish(constants.PROTOCOL.BLOODGLUSOCE_SEND,bg_data)
+
+                                EventMesh.txt_log("auto stop_bp:333")
+                        else:
+                            self.old_bg_time = 0
+                    else:
+                        self.old_bg_time = 0
+
+                    
+                    if get_temp_state != None:
+                        if get_temp_state == 3:#单次测量
+                            self.temp_one_state+=1
+                            if self.temp_one_state == 1:
+                                EventMesh.txt_log("auto start_temp:333")
+                                EventMesh.debug_log("AUTO one temp:2") 
+                                EventMesh.publish("set_temp_state",3)
+                                # EventMesh.publish("set_hr_blood_led",1)
+                                EventMesh.publish(constants.EVENT.START_TEMP)   
+                            elif self.temp_one_state > 3:
+                                self.temp_one_state = 0
+                                temp = EventMesh.publish(constants.EVENT.GET_TEMP) 
+                                temp = self.optimize_temp(temp)
+                                
+                                EventMesh.publish("set_temp_state",0)
+                                tmp_f_tmp = 0
+                                tmp_d_tmp = 0
+                                if str(temp).find(".") != -1:
+                                    tmp_f = str(temp).split('.')[0] 
+                                    tmp_f_tmp = int(tmp_f)
+                                    
+                                    tmp_d = str(temp).split('.')[1][:1]
+                                    tmp_d_tmp = int(tmp_d)
+                                else:
+                                    tmp_f_tmp = temp
+                                    
+                                if temp != None:
+                                    if temp != 0:
+                                        EventMesh.publish(constants.PROTOCOL.TEMP_SEND,[tmp_f_tmp,tmp_d_tmp])
+                                EventMesh.publish(constants.EVENT.STOP_TEMP)
+                                EventMesh.txt_log("auto start_temp:333")
+                        else:
+                            self.temp_one_state = 0
+
+
+        
+                    
+                    # EventMesh.debug_log("get_temp_time:{} self.temp_one_state:{}".format(get_temp_time,self.temp_one_state))
+                    if get_temp_time != None:#定时测量体温
+                        if get_temp_time > 0:
+                            if get_temp_state != None:
+                                get_temp_state  = EventMesh.publish("get_temp_state")
+                                if get_temp_state == 0 or get_temp_state == 2:
+                                    if (time_tmp-self.temp_timeSecond) >= get_temp_time:#大于一个周期的时间,重新赋值
+                                        self.temp_state = 0
+                                        self.temp_timeSecond = time_tmp
+
+                                    if (time_tmp-self.temp_timeSecond) == 0 and self.temp_state == 0:#一开始就测量 测量一分钟停止测量体温
+                                        self.temp_state = 1
+                                        EventMesh.publish("set_temp_state",2)
+                                        # EventMesh.publish("set_hr_blood_led",1)
+                                        EventMesh.debug_log("AUTO temp:") 
+                                        EventMesh.txt_log("auto START_temp:1")
+                                        EventMesh.publish(constants.EVENT.START_TEMP)
+
+                                    elif (time_tmp-self.temp_timeSecond) >= 30 and self.temp_state == 1 and get_temp_state == 2:
+                                        self.temp_state = 0
+                                        EventMesh.txt_log("auto stop_temp:1")
+                                        EventMesh.publish("set_temp_state",0)
+                                        temp = EventMesh.publish(constants.EVENT.GET_TEMP) 
+                                        temp = self.optimize_temp(temp)
+                                        
+                                        tmp_f_tmp = 0
+                                        tmp_d_tmp = 0
+                                        if str(temp).find(".") != -1:
+                                            tmp_f = str(temp).split('.')[0] 
+                                            tmp_f_tmp = int(tmp_f)
+                                            
+                                            tmp_d = str(temp).split('.')[1][:1]
+                                            tmp_d_tmp = int(tmp_d)
+                                        else:
+                                            tmp_f_tmp = temp
+                                            
+                                        if temp != None:
+                                            if temp != 0:
+                                                EventMesh.publish(constants.PROTOCOL.TEMP_SEND,[tmp_f_tmp,tmp_d_tmp])
+                                        EventMesh.publish(constants.EVENT.STOP_TEMP)
+
+                                else:
+                                    self.temp_state = 0
+                                    self.old_temp_time = 0
+                        else:
+                            temp_state  = EventMesh.publish("get_temp_state") 
+                            if temp_state == 2:
+                                EventMesh.publish("set_temp_state",0)#2代表后台进入测试
+                                # EventMesh.publish("stop_led_timer")#设置参数
+                                EventMesh.txt_log("auto wear stop_temp:2 ")
+                                EventMesh.publish(constants.EVENT.STOP_TEMP)
+                            self.temp_state = 0
+                            self.temp_timeSecond = 0
+                            self.old_temp_time = 0
+
+
+
+                    hr_time = {}
+                    hr_time = EventMesh.publish("get_time_hr")#获取时间是否大于0
+                    # print("hr_time{}".format(hr_time))
+                    if hr_time[0] !=  None:
+                        self.mearsure_btn = int(hr_time[0])
+                        self.mearsure_timer = int(hr_time[1])
+
+                        if self.mearsure_btn != None and self.mearsure_timer != None:
+                            
+                            if self.mearsure_btn >= 1 and self.mearsure_timer > 0:#开关打开并且时间大于0就可以测试血糖
+                                get_hr_state = EventMesh.publish("get_hr_state")#心率
+                                get_spo2_state = EventMesh.publish("get_spo2_state")#血氧
+                                get_bp_state  = EventMesh.publish("get_bp_state")#血压
+                                get_bg_state  = EventMesh.publish("get_bg_state")#血糖
+                                # print("state hr",get_hr_state,get_spo2_state,get_bp_state,get_bg_state)
+                                if (get_bg_state == 0 and get_spo2_state == 0 and get_bp_state == 0) and  (get_hr_state == 2 or get_hr_state == 0):#心率血压血氧不在测试就测试血糖自动测量
+                                    if (time_tmp-self.hr_timeSecond) >= self.mearsure_timer:#大于一个周期的时间,保存的时间戳时间 1678 0 1678 30 1678 
+                                        self.hr_timeSecond = time_tmp
+                                        self.HR_Onestate = 0
+                                    # print("time_tmp hr",time_tmp,self.hr_timeSecond,time_tmp-self.hr_timeSecond,self.mearsure_timer,self.HR_Onestate)
+                                    if (time_tmp - self.hr_timeSecond) == 0 and self.HR_Onestate == 0:
+                                        self.HR_Onestate = 1
+                                        EventMesh.txt_log("auto START_hr:1")
+                                        EventMesh.publish("set_hr_state",2)#2代表后台进入测试
+                                        # EventMesh.publish("set_hr_blood_led",1)
+                                        EventMesh.publish(constants.EVENT.START_HEART)
+                                        
+                                    elif (time_tmp - self.hr_timeSecond) >= 60 and self.HR_Onestate == 1 and get_hr_state == 2:
+                                        self.HR_Onestate = 0
+                                        EventMesh.publish("set_hr_state",0)#2代表后台进入测试
+                                        EventMesh.debug_log("stop debug3")
+                                        EventMesh.txt_log("auto stop_hr:1")
+                                        EventMesh.publish(constants.EVENT.STOP_HEART)
+                                        heart_value = EventMesh.publish(constants.EVENT.GET_HEART)
+                                        EventMesh.debug_log("heart_value:{}".format(heart_value))
+                                        # heart_value = 60+urandom.randint(0,10)
+                                        if heart_value >= 50 and heart_value != None:
+                                            EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据
+                                        #获取心率数据上传数据app
+                                        EventMesh.debug_log("STOP_HEART:")
+                                        
+                                else:
+                                    self.HR_Onestate = 0
+                            else:
+                                self.hr_timeSecond = 0
+                                self.HR_Onestate = 0
+                                hr_state = EventMesh.publish("get_hr_state")#心率
+                                if hr_state == 2:
+                                    EventMesh.publish("set_hr_state",0)#2代表后台进入测试
+                                    EventMesh.debug_log("33stop debug3")
+                                    # EventMesh.publish("stop_led_timer")#设置参数
+                                    EventMesh.publish(constants.EVENT.STOP_HEART)
+                                    EventMesh.txt_log("auto wear stop_hr:2 ")
+
+                    get_spo2time = EventMesh.publish("get_spo2_time")#血压自动测试
+                    # print("get_spo2time",get_spo2time)
+                    if get_spo2time != None:#血压时间不为0
+                        spo2_on = int(get_spo2time[0])
+                        spo2_time = int(get_spo2time[1])
+                        if spo2_on != 0 and spo2_time != 0:
+                            get_hr_state = EventMesh.publish("get_hr_state")
+                            get_spo2_state = EventMesh.publish("get_spo2_state")
+                            get_bp_state  = EventMesh.publish("get_bp_state")
+                            get_bg_state  = EventMesh.publish("get_bg_state")
+                            # print("state bg2",get_hr_state,get_spo2_state,get_bp_state,get_bg_state)
+                            if (get_hr_state == 0 and get_bp_state == 0 and get_bg_state == 0) and (get_spo2_state == 2 or get_spo2_state == 0):#心率血压血氧不在测试就测试血糖自动测量
+                                if (time_tmp-self.spo2_timeSecond) >= spo2_time:#大于一个周期的时间,保存的时间戳时间 1678 0 1678 30 1678 
+                                    self.spo2_timeSecond = time_tmp
+                                    self.spo2auto_state = 0
+                                # print("time_tmp spo2",time_tmp,self.spo2_timeSecond,time_tmp-self.spo2_timeSecond,self.bg_timer,self.bpauto_state)
+                                if (time_tmp - self.spo2_timeSecond) == 0 and self.spo2auto_state == 0:
+                                    self.spo2auto_state = 1
+                                    EventMesh.debug_log("START_spo2:auto")
+                                    EventMesh.txt_log("auto START_spo2:1")
+                                    EventMesh.publish("set_spo2_state",2)#2代表后台进入测试
+                                    EventMesh.publish(constants.EVENT.START_BLOOD_OXYGEN)#K开血氧
+                                    
+                                elif (time_tmp - self.spo2_timeSecond) >= 60 and self.spo2auto_state == 1 and get_spo2_state == 2:
+                                    EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
+                                    self.spo2auto_state = 0
+                                    EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
+                                    spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)
+                                    if spo2_value > 85 and spo2_value != None:
+                                        EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)
+                                    EventMesh.txt_log("auto stop_spo2:1")
+                                
+                            else:
+                                self.spo2auto_state = 0
+                        else:
+                            self.spo2_timeSecond = 0
+                            self.spo2auto_state = 0
+                            spo2_state = EventMesh.publish("get_spo2_state")#心率
+                            if spo2_state == 2:
+                                EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
+                                EventMesh.debug_log("spo2 stop debug3")
+                                EventMesh.txt_log("auto wear stop_spo2:2 ")
+                                EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
+
+
+                    get_bptime = EventMesh.publish("get_bp_time")#血压自动测试
+                    # print("get_bptime",get_bptime)
+                    if get_bptime != None:#血压时间不为0
+                        bp_on = int(get_bptime[0])
+                        bp_time = int(get_bptime[1])
+                        if bp_on != 0 and bp_time != 0:
+                            get_hr_state = EventMesh.publish("get_hr_state")
+                            get_spo2_state = EventMesh.publish("get_spo2_state")
+                            get_bp_state  = EventMesh.publish("get_bp_state")
+                            get_bg_state  = EventMesh.publish("get_bg_state")
+                            # print("state bg2",get_hr_state,get_spo2_state,get_bp_state,get_bg_state)
+                            
+                            if (get_hr_state == 0 and get_spo2_state == 0 and get_bg_state == 0) and (get_bp_state == 2 or get_bp_state == 0):#心率血压血氧不在测试就测试血糖自动测量
+                                if (time_tmp-self.bp_timeSecond) >= bp_time:#大于一个周期的时间,保存的时间戳时间 1678 0 1678 30 1678 
+                                    self.bp_timeSecond = time_tmp
+                                    self.bpauto_state = 0
+                                # print("time_tmp bp",time_tmp,self.bp_timeSecond,time_tmp-self.bp_timeSecond,self.bg_timer,self.bpauto_state)
+                                if (time_tmp - self.bp_timeSecond) == 0 and self.bpauto_state == 0:
+                                    self.bpauto_state = 1
+                                    EventMesh.debug_log("START_bp:auto")
+                                    EventMesh.txt_log("auto START_bp:1")
+                                    EventMesh.publish("set_bp_state",2)#2代表后台进入测试
+                                    # EventMesh.publish("set_hr_blood_led",1)
+                                    EventMesh.publish(constants.EVENT.START_HEART)
+                                    
+                                elif (time_tmp - self.bp_timeSecond) >= 60 and self.bpauto_state == 1 and get_bp_state == 2:
+                                    self.bpauto_state = 0
+                                    EventMesh.publish("set_bp_state",0)#2代表后台进入测试
+                                    blood_data = get_autoblood_value()
+                                    if blood_data == None:
+                                        blood_data[0] = 0
+                                        blood_data[1] = 0
+
+                                    max_value = blood_data[0]
+                                    min_value = blood_data[1]
+                                    if max_value != 0 and min_value != 0:
+                                        EventMesh.publish(constants.PROTOCOL.BLOOD_SEND,[max_value,min_value])
+                                    EventMesh.publish(constants.EVENT.STOP_HEART)
+                                    EventMesh.txt_log("auto stop_bp:1")
+                                    
+                            else:
+                                self.bpauto_state = 0
+                        else:
+                            self.bp_timeSecond = 0
+                            self.bpauto_state = 0
+                            bp_state = EventMesh.publish("get_bp_state")#心率
+                            if bp_state == 2:
+                                EventMesh.publish("set_bp_state",0)#2代表后台进入测试
+                                EventMesh.debug_log("bp stop debug3")
+                                EventMesh.txt_log("auto wear stop_bp:2 ")
+                                # EventMesh.publish("stop_led_timer")#设置参数
+                                EventMesh.publish(constants.EVENT.STOP_HEART)
+
+
+
+                    bg_time = {}
+                    bg_time = EventMesh.publish("get_bgauto_time")
+                    if bg_time[0] != None:
+                    
+                        bg_btn = int(bg_time[0])
+                        bg_timer = int(bg_time[1]) 
+                        # print("state bg2",self.bg_btn,self.bg_timer)
+                        if bg_btn >= 1 and bg_timer > 0:#开关打开并且时间大于0就可以测试血糖
+                            get_hr_state = EventMesh.publish("get_hr_state")
+                            get_spo2_state = EventMesh.publish("get_spo2_state")
+                            get_bp_state  = EventMesh.publish("get_bp_state")
+                            get_bg_state  = EventMesh.publish("get_bg_state")
+                            # print("state bg2",get_hr_state,get_spo2_state,get_bp_state,get_bg_state)
+                            
+                            if (get_hr_state == 0 and get_spo2_state == 0 and get_bp_state == 0) and (get_bg_state == 2 or get_bg_state == 0):#心率血压血氧不在测试就测试血糖自动测量
+                                if (time_tmp-self.bg_timeSecond) >= bg_timer:#大于一个周期的时间,保存的时间戳时间 1678 0 1678 30 1678 
+                                    self.bg_timeSecond = time_tmp #1780 
+                                    self.BG_state = 0
+                                # print("time_tmp bg",time_tmp,self.bg_timeSecond,time_tmp-self.bg_timeSecond,bg_timer,self.BG_state)
+                                if (time_tmp - self.bg_timeSecond) == 0 and self.BG_state == 0:
+                                    EventMesh.debug_log("START_bg:1")
+                                    EventMesh.txt_log("auto START_bg:1")
+                                    EventMesh.publish("set_bg_state",2)#2代表后台进入测试
+                                    # EventMesh.publish("set_hr_blood_led",1)
+                                    EventMesh.publish(constants.EVENT.START_HEART)
+                                    self.BG_state = 1
+                                elif (time_tmp - self.bg_timeSecond) >= 60 and self.BG_state == 1 and get_bg_state == 2:
+                                    self.BG_state = 0
+                                    EventMesh.publish("set_bg_state",0)#2代表后台进入测试
+                                    # EventMesh.publish("stop_led_timer")#设置参数
+                                    EventMesh.txt_log("auto stop_bg:1")
+                                    EventMesh.debug_log("stop bgdebug3")
+                                    EventMesh.publish(constants.EVENT.STOP_HEART)
+                                    bgdata = get_blood_sugar_value()
+                                    if bgdata == None:
+                                        bgdata = 0
+                                    if bgdata != 0:
+                                        EventMesh.debug_log("bgdata",bgdata)
+                                        EventMesh.publish(constants.PROTOCOL.BLOODGLUSOCE_SEND,bgdata)#上传心率数据
+                                    
+                            else:
+                                
+                                self.BG_state = 0
+                        else:
+                            bg_state  = EventMesh.publish("get_bg_state") 
+                            if bg_state == 2:
+                                EventMesh.publish("set_bg_state",0)#2代表后台进入测试
+                                # EventMesh.publish("stop_led_timer")#设置参数
+                                EventMesh.debug_log("bg stop bgdebug3")
+                                EventMesh.txt_log("auto wear stop_bg:2 ")
+                                EventMesh.publish(constants.EVENT.STOP_HEART)
+                            self.bg_timeSecond = 0
+                            self.BG_state = 0
+                    
+                else:
+                    self.old_temp_time = 0
+                    self.old_time = 0
+                    # self.hr_timeSecond = time_tmp
+                    self.HR_Onestate = 0
+                    self.HR_OneTime = 0
+                    self.HR_state = 0
+                    self.old_time = 0    
+                    self.old_bp_time = 0
+                    self.old_hr_time = 0
+                    self.old_spo2_time = 0
+                    self.set_hsenor_crt = 0
+                    self.old_bg_time = 0
+                    # self.bg_timeSecond = time_tmp
+                    self.BG_state = 0
+                    # self.temp_timeSecond = time_tmp
+
+                    # self.bp_timeSecond = time_tmp
+                    self.bpauto_state = 0
+
+                    # self.spo2_timeSecond = time_tmp
+                    self.spo2auto_state = 0
+
+                    self.temp_state = 0
+                    self.temp_one_state = 0
+
+            else:
+                self.old_temp_time = 0
+                self.old_time = 0
+                # self.hr_timeSecond = time_tmp
+                self.HR_Onestate = 0
+                self.HR_OneTime = 0
+                self.HR_state = 0
+                self.old_time = 0    
+                self.old_bp_time = 0
+                self.old_hr_time = 0
+                self.old_spo2_time = 0
+                self.set_hsenor_crt = 0
+                self.old_bg_time = 0
+                # self.bg_timeSecond = time_tmp
+
+                self.BG_state = 0
+                # self.temp_timeSecond = time_tmp
+
+                # self.bp_timeSecond = time_tmp
+                self.bpauto_state = 0
+
+                # self.spo2_timeSecond = time_tmp
+                self.spo2auto_state = 0
+
+                self.temp_state = 0
+                self.temp_one_state = 0
+
+                get_hr_state = EventMesh.publish("get_hr_state")
+                get_spo2_state = EventMesh.publish("get_spo2_state")
+                get_bp_state  = EventMesh.publish("get_bp_state")
+                get_bg_state  = EventMesh.publish("get_bg_state")
+                if get_hr_state != None and get_spo2_state != None and get_bp_state != None and get_bg_state != None:
+                    if get_hr_state > 1:
+                        EventMesh.txt_log("auto stop_hr:44")
+                        EventMesh.publish("set_hr_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 
+                        # if get_hr_state == 3:
+                        #     EventMesh.publish("stop_led_timer")#设置参数
+                        EventMesh.debug_log("stop debug8")
+                        if WEAR == 1:
+                            heart_value = EventMesh.publish(constants.EVENT.GET_HEART)
+                            if heart_value >= 50 and heart_value != None:
+                                EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据
+                        EventMesh.publish(constants.EVENT.STOP_HEART) 
+                    elif get_spo2_state > 1:
+                        EventMesh.txt_log("auto stop_spo2:44")
+                        EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
+                        # if get_spo2_state == 3:
+                        #     EventMesh.publish("stop_led_timer")#设置参数
+                        if WEAR == 1:
+                            spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)
+                            if spo2_value > 85 and spo2_value != None:
+                                EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)
+                        EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
+                        EventMesh.debug_log("stop debug13")
+                    elif get_bp_state > 1:
+                        EventMesh.txt_log("auto stop_bp:44")
+                        EventMesh.publish("set_bp_state",0)#2代表后台进入测试
+                        # if get_bp_state == 3:
+                        #     EventMesh.publish("stop_led_timer")#设置参数
+                        if WEAR == 1:
+                            blood_data = get_autoblood_value()
+                            if blood_data == None:
+                                blood_data[0] = 0
+                                blood_data[1] = 0
+
+                            max_value = blood_data[0]
+                            min_value = blood_data[1]
+                            if max_value != 0 and min_value != 0:
+                                EventMesh.publish(constants.PROTOCOL.BLOOD_SEND,[max_value,min_value])
+                        EventMesh.publish(constants.EVENT.STOP_HEART)
+                        EventMesh.debug_log("stop debug14")
+                    elif get_bg_state > 1:
+                        EventMesh.txt_log("auto stop_bg:44")
+                        EventMesh.publish("set_bg_state",0)#2代表后台进入测试
+                        # if get_bg_state == 3:
+                        #     EventMesh.publish("stop_led_timer")#设置参数
+                        EventMesh.publish(constants.EVENT.STOP_HEART)
+                        if WEAR == 1:
+                            bgdata = get_blood_sugar_value()
+                            if bgdata == None:
+                                bgdata = 0
+                            if bgdata != 0:
+                                EventMesh.publish(constants.PROTOCOL.BLOODGLUSOCE_SEND,bgdata)#上传心率数据
+                        EventMesh.debug_log("stop debug15")
+                get_temp_state  = EventMesh.publish("get_temp_state")
+                if get_temp_state != None:
+                    if get_temp_state > 1:
+                        self.temp_one_state = 0
+                        self.temp_state = 0
+                        temp = EventMesh.publish(constants.EVENT.GET_TEMP)       
+                        temp = self.optimize_temp(temp)
+                        EventMesh.txt_log("auto stop_temp:44")
+                        EventMesh.publish("set_temp_state",0)
+                        if WEAR == 1:
+                            tmp_f_tmp = 0
+                            tmp_d_tmp = 0
+                            if str(temp).find(".") != -1:
+                                tmp_f = str(temp).split('.')[0] 
+                                tmp_f_tmp = int(tmp_f)
+                                
+                                tmp_d = str(temp).split('.')[1][:1]
+                                tmp_d_tmp = int(tmp_d)
+                            else:
+                                tmp_f_tmp = temp
+                                
+                            if temp != None:
+                                if temp != 0:
+                                    EventMesh.publish(constants.PROTOCOL.TEMP_SEND,[tmp_f_tmp,tmp_d_tmp])
+                        EventMesh.publish(constants.EVENT.STOP_TEMP)
+
+            
+
+
+            hr_state = EventMesh.publish("get_hr_state")
+            spo2_state = EventMesh.publish("get_spo2_state")
+            temp_state  = EventMesh.publish("get_temp_state")
+            if hr_state != None or spo2_state != None or temp_state != None:#手动测试
+                auto_hr = EventMesh.publish("get_start_measure_time")#设置开始测量的时间戳时间
+                if auto_hr == None:
+                    auto_hr = 0
+                if hr_state == 1:
+                    if auto_hr != 0:
+                        self.auto_hr_count+=1
+                        if  self.auto_hr_count > 6:
+                            self.auto_hr_count = 0
+                            EventMesh.publish("set_hr_state",0)#0代表g关闭测试
+                            EventMesh.debug_log("stop debug7")
+                            EventMesh.publish(constants.EVENT.STOP_HEART)
+                            heart_value = EventMesh.publish(constants.EVENT.GET_HEART)
+                            if heart_value >= 50 and heart_value != None:
+                                EventMesh.publish("play_hr_value",heart_value)
+                                # EventMesh.publish("set_history_hr_value",heart_value)
+                                EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据
+
+                            else:
+                                EventMesh.publish("play_hr_value",0) 
+                            
+                            
+
+                        else :
+                            if WEAR != 1:
+                                EventMesh.publish("set_hr_state",0)#0代表g关闭测试
+                                EventMesh.debug_log("stop debug7")
+                                EventMesh.publish(constants.EVENT.STOP_HEART)                               
+                                EventMesh.publish("play_hr_value",0) 
+                                
+                else:
+                    self.auto_hr_count = 0
+                    
+
+                auto_spo2 = EventMesh.publish("get_start_measure_time")#设置开始测量的时间戳时间
+                if auto_spo2 == None:
+                    auto_spo2 = 0
+                if spo2_state == 1:#手动测试血氧
+                    if auto_spo2 != None:
+                        if auto_spo2 != 0:
+                            self.auto_spo2_count+=1
+                            if self.auto_spo2_count > 6:
+                                self.auto_spo2_count = 0
+                                EventMesh.publish("set_spo2_state",0)#0代表g关闭测试
+                                EventMesh.debug_log("stop spo2 debug7")
+                                EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
+                                spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)
+                                if spo2_value > 85 and spo2_value != None:
+                                    EventMesh.publish("play_spo2_value",spo2_value)
+                                    EventMesh.publish("set_old_spo2_data",spo2_value)
+                                    EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)
+                                else:
+                                    EventMesh.publish("play_spo2_value",0)
+                            
+                            else:
+                                if WEAR != 1:
+                                    EventMesh.publish("set_spo2_state",0)#0代表g关闭测试
+                                    EventMesh.debug_log("stop debug8")
+                                    EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)                               
+                                    EventMesh.publish("play_spo2_value",0) 
+                                    
+                else:
+                    self.auto_spo2_count = 0
+
+                if temp_state == 1:#手动测试体温
+                    auto_temp = EventMesh.publish("get_start_temp_measure_time")#设置开始测量的时间戳时间
+                    if auto_temp == None:
+                        auto_temp = 0
+                    if auto_temp != None:
+                        if auto_temp != 0:
+                            self.auto_temp_count += 1
+                            if self.auto_temp_count > 6:
+                                self.auto_temp_count = 0
+                                EventMesh.debug_log("体温测量结束")
+                                temp = EventMesh.publish(constants.EVENT.GET_TEMP)       
+                                temp = self.optimize_temp(temp)
+                                EventMesh.debug_log("temp",temp)
+                                EventMesh.publish("set_temp_state",0)
+                                tmp_f_tmp = 0
+                                tmp_d_tmp = 0
+                                if str(temp).find(".") != -1:
+                                    tmp_f = str(temp).split('.')[0] 
+                                    tmp_f_tmp = int(tmp_f)
+                                    
+                                    tmp_d = str(temp).split('.')[1][:1]
+                                    tmp_d_tmp = int(tmp_d)
+                                else:
+                                    tmp_f_tmp = temp
+                                    
+                                if temp != None:
+                                    if temp != 0:
+                                        # EventMesh.publish("set_history_temp_value",temp)
+                                        EventMesh.publish("play_temp_value",temp)#播放体温数值
+                                        EventMesh.publish(constants.PROTOCOL.TEMP_SEND,[tmp_f_tmp,tmp_d_tmp])
+                                    else:
+                                        # EventMesh.publish("set_history_temp_value",0)
+                                        EventMesh.publish("play_temp_value",0)#播放体温数值
+                                
+                                EventMesh.publish(constants.EVENT.STOP_TEMP)
+
+                            else :
+                                if WEAR  != 1:
+                                    EventMesh.publish("set_temp_state",0)#0代表g关闭测试
+                                    EventMesh.debug_log("stop debug9")
+                                    EventMesh.publish(constants.EVENT.STOP_TEMP)                               
+                                    EventMesh.publish("play_temp_value",0) 
+                                    
+                else:
+                    self.auto_temp_count = 0
+
+            EventMesh.publish("play_unread_wechat_infor")#每10s检测是否有未读语音数据
+
+            usb_state = EventMesh.publish("get_usb")#
+            
+
+            if battery[0] == '1':
+                # EventMesh.debug_log("battery[1]",battery[1])
+                if self.vbat_full_flag <= 120:
+                    self.vbat_full_flag+=10
+                    if self.vbat_full_flag == 60:#开机检测一次如果是充电标识为1就不再提示
+                        if usb_state != 1:
+                            EventMesh.publish("set_usb",1)#
+                else:
+                    if battery[1] >= 100:
+                        if self.charge_full_count == 0:#充电已满
+                            EventMesh.publish("set_usb",3)#
+                            EventMesh.debug_log("charge R_CHARGE_full")
+                            self.charge_full_count = 1
+                    
+            else:
+                self.charge_full_count = 0
+                low_power = battery[1]
+                if low_power <= 5:#小于5%红色灯慢闪
+                    EventMesh.publish("set_led_time_arg",[1,2,20*11,led_mode.FLASH_LIGHT_RED,20,10,led_mode.OTHER_MEASURE_MODE])#測量成功
+                    # EventMesh.publish("set_led_time_arg",[1000,400,52,led_mode.FLASH_LIGHT_RED,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#開始測量
+
+            
+            self.normal_alarm()
+            #喝水提醒
+            self.drink_alarm()
+            #该吃药了
+            self.medicine_alarm()
+            #该起床了
+            self.wakeup_alarm()
+            #该睡觉了
+            self.sleep_alarm()
+            #该回家了
+            self.home_alarm()
+            #该休息了
+            self.reset_alarm()
+
+
+            if self.alarm_flag == 0:
+                self.alarm_flag = 1
+                EventMesh.publish("set_rtc_alarm")
+
+        def clear_usb_flag(self,event,msg):
+            self.charge_full_count = 0
+        #普通闹钟
+        def normal_alarm(self):
+            data = RTC().datetime()
+            hour = data[4]
+            min = data[5]
+
+            week = int(data[3])
+
+            date1 = data[1]
+            date2 = data[2]
+            cur_total_min = int(hour)*60+int(min)
+            # EventMesh.debug_log("self.normal_oldtotalmin",self.normal_oldtotalmin,cur_total_min,self.alarm_flag)
+            if self.normal_oldtotalmin == 0:
+                self.normal_oldtotalmin = cur_total_min #549
+            if self.normal_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃
+                if self.normal_flag == 1:
+                    self.normal_flag = 0
+                    self.normal_count = 0
+            normal_alarm = []
+            normal_alarm = EventMesh.publish("get_storage_config","normal_alarm")
+            # EventMesh.debug_log("sleep info2",sleep,cur_total_min)
+            if self.normal_flag == 1:#表示闹钟响过清除标志
+                self.normal_count+=1
+                if self.normal_count > 6:
+                    self.normal_count = 0
+                    self.normal_flag = 0
+            if normal_alarm != None:
+                if len(normal_alarm) != 0 and normal_alarm != []:
+                    j = 0
+                    for i in range(len(normal_alarm)):
+                        # EventMesh.debug_log("normal_alarm normal_alarm 33",normal_alarm,j)
+                        normalalarm_hour = normal_alarm[j]["hour"]
+                        normalalarm_min = normal_alarm[j]["min"]
+                        normalalarm_day = normal_alarm[j]["day"]
+                        normalalarm_enale = normal_alarm[j]["enable"]
+                        normalalarm_totalmin = int(normalalarm_hour)*60+int(normalalarm_min)
+                        # EventMesh.debug_log("wake alarm",normalalarm_hour,sleep_min,sleep_day,sleep_enale,sleep_totalmin,week)
+                        if normalalarm_day == []:#单次闹钟只响一次
+                            if normalalarm_enale != 0:
+                                if cur_total_min > normalalarm_totalmin:
+                                    normal_alarm.pop(j)
+                                    self.normal_count = 0
+                                    self.normal_flag  = 0 
+                                    j=0
+                                    # EventMesh.debug_log("wakeup wakeup dayu",sleep,j)
+                                    EventMesh.publish("set_storage_config",["normal_alarm",normal_alarm])#删除之后重新保存
+                                    # sleep = EventMesh.publish("get_storage_config","sleep_alarm")#删除之后重新保存
+                                    continue
+                                else:
+                                    if normalalarm_totalmin == cur_total_min and self.normal_flag == 0:#14:00
+                                        self.normal_count = 0
+                                        self.normal_flag  = 0    
+                                        normal_alarm.pop(j)
+                                        # EventMesh.debug_log("wakeup wakeup1",sleep,j)
+                                        EventMesh.publish("set_storage_config",["normal_alarm",normal_alarm])#删除之后重新保存
+                                        EventMesh.publish("OPEN_ALARM_RING")                                                                                                                                            
+                                        break
+                        else:
+                            if normalalarm_enale != 0 and (week in normalalarm_day):#记录响过的时间分钟数
+                                if normalalarm_totalmin == cur_total_min and self.normal_flag == 0:#14:00
+                                    self.normal_flag  = 1
+                                    self.normal_count = 0
+                                    self.normal_oldtotalmin = normalalarm_totalmin
+                                    EventMesh.publish("OPEN_ALARM_RING")#                                                                                                                                                  
+                                    break
+                        j+=1
+
+
+        #喝水提醒
+        def drink_alarm(self):
+            date_tmp = utime.localtime()
+            time_tmp = utime.mktime(date_tmp)
+        
+            if self.drink_time == 0:
+                self.drink_time = time_tmp
+            
+            on = EventMesh.publish("get_storage_config","drink_on")
+            time = EventMesh.publish("get_storage_config","drink_time")
+            # print("drink info2",on,time)
+            if on != None and time != None:
+                if on != 0 and time != 0:
+                    if (time_tmp - self.drink_time) >= (time*60*60):#需要转换成小时3600
+                        self.drink_time = time_tmp 
+                        EventMesh.publish("drink_alarm_event")#该喝水了
+                        #该喝水了
+                else:
+                    self.drink_time = 0
+            else:
+                self.drink_time = 0
+
+        #吃药提醒
+        def medicine_alarm(self):
+            data = RTC().datetime()
+            hour = data[4]
+            min = data[5]
+
+            week = int(data[3])
+
+            date1 = data[1]
+            date2 = data[2]
+            cur_total_min = int(hour)*60+int(min)
+            # print("self.medicine_oldtotalmin",self.medicine_oldtotalmin,cur_total_min,self.alarm_flag)
+            if self.medicine_oldtotalmin == 0:
+                self.medicine_oldtotalmin = cur_total_min #549
+            if self.medicine_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃
+                if self.medicine_flag == 1:
+                    self.medicine_flag = 0
+                    self.medicine_count = 0
+            medicine = EventMesh.publish("get_storage_config","medicine")
+            # print("medicine info2",medicine,cur_total_min)
+            if self.medicine_flag == 1:#表示闹钟响过清除标志
+                self.medicine_count+=1
+                if self.medicine_count > 6:
+                    self.medicine_count = 0
+                    self.medicine_flag = 0
+            if medicine != None:
+                if len(medicine) != 0 and medicine != []:
+                    for i in range(len(medicine)):
+                        medicine_hour = medicine[i]["hour"]
+                        medicine_min = medicine[i]["min"]
+                        medicine_day = medicine[i]["day"]
+                        medicine_enale = medicine[i]["enable"]
+                        medicine_totalmin = int(medicine_hour)*60+int(medicine_min)
+                        # print("medicine alarm",medicine_hour,medicine_min,medicine_day,medicine_enale,medicine_totalmin,week)
+                        if medicine_day == []:
+                            if medicine_enale != 0:
+                                if medicine_totalmin == cur_total_min and self.medicine_flag == 0:#14:00
+                                    self.medicine_count = 0
+                                    self.medicine_flag  = 1    
+                                    self.medicine_oldtotalmin = medicine_totalmin#记录响过的时间分钟数
+                                    # print("medicine alarm1")
+                                    EventMesh.publish("medicine_alarm_event")#该吃药了                                                                                                                                              
+                                    break
+                        else:
+                            if medicine_enale != 0 and (week in medicine_day):#记录响过的时间分钟数
+                                if medicine_totalmin == cur_total_min and self.medicine_flag == 0:#14:00
+                                    self.medicine_flag  = 1
+                                    self.medicine_count = 0
+                                    self.medicine_oldtotalmin = medicine_totalmin
+                                    # print("medicine alarm2",)
+                                    EventMesh.publish("medicine_alarm_event")#该吃药了                                                                                                                                                   
+                                    break
+        #该起床了
+        def wakeup_alarm(self):
+            data = RTC().datetime()
+            hour = data[4]
+            min = data[5]
+
+            week = int(data[3])
+
+            date1 = data[1]
+            date2 = data[2]
+            cur_total_min = int(hour)*60+int(min)
+            # EventMesh.debug_log("self.wakeup_oldtotalmin",self.wakeup_oldtotalmin,cur_total_min,self.alarm_flag)
+            if self.wakeup_oldtotalmin == 0:
+                self.wakeup_oldtotalmin = cur_total_min #549
+            if self.wakeup_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃
+                if self.wakeup_flag == 1:
+                    self.wakeup_flag = 0
+                    self.wakeup_count = 0
+            wakeup = []
+            wakeup = EventMesh.publish("get_storage_config","wakeup_alarm")
+            # EventMesh.debug_log("wakeup info2",wakeup,cur_total_min)
+            if self.wakeup_flag == 1:#表示闹钟响过清除标志
+                self.wakeup_count+=1
+                if self.wakeup_count > 6:
+                    self.wakeup_count = 0
+                    self.wakeup_flag = 0
+            if wakeup != None:
+                if len(wakeup) != 0 and wakeup != []:
+                    j = 0
+                    for i in range(len(wakeup)):
+                        wakeup_hour = wakeup[j]["hour"]
+                        wakeup_min = wakeup[j]["min"]
+                        wakeup_day = wakeup[j]["day"]
+                        wakeup_enale = wakeup[j]["enable"]
+                        wakeup_totalmin = int(wakeup_hour)*60+int(wakeup_min)
+                        # EventMesh.debug_log("wake alarm",wakeup_hour,wakeup_min,wakeup_day,wakeup_enale,wakeup_totalmin,week)
+                        if wakeup_day == []:#单次闹钟只响一次
+                            if wakeup_enale != 0:
+                                if cur_total_min > wakeup_totalmin:
+                                    self.wakeup_count = 0
+                                    self.wakeup_flag  = 0    
+                                    wakeup.pop(j)
+                                    j=0#每次删除都从0开始遍历
+                                    # EventMesh.debug_log("wakeup wakeup1 dayu",wakeup,j)
+                                    EventMesh.publish("set_storage_config",["wakeup_alarm",wakeup])
+                                    continue
+                                else:
+                                    if wakeup_totalmin == cur_total_min and self.wakeup_flag == 0:#14:00
+                                        self.wakeup_count = 0
+                                        self.wakeup_flag  = 0    
+                                        wakeup.pop(j)
+                                        EventMesh.debug_log("wakeup wakeup1",wakeup,j)
+                                        EventMesh.publish("set_storage_config",["wakeup_alarm",wakeup])
+                                        EventMesh.publish("wakeup_alarm_event")#该吃药了                                                                                                                                              
+                                        break
+                        else:
+                            if wakeup_enale != 0 and (week in wakeup_day):#记录响过的时间分钟数
+                                if wakeup_totalmin == cur_total_min and self.wakeup_flag == 0:#14:00
+                                    self.wakeup_flag  = 1
+                                    self.wakeup_count = 0
+                                    self.wakeup_oldtotalmin = wakeup_totalmin
+                                    EventMesh.publish("wakeup_alarm_event")#该吃药了                                                                                                                                                   
+                                    break
+                        j+=1
+
+
+        #该睡觉了
+        def sleep_alarm(self):
+            data = RTC().datetime()
+            hour = data[4]
+            min = data[5]
+
+            week = int(data[3])
+
+            date1 = data[1]
+            date2 = data[2]
+            cur_total_min = int(hour)*60+int(min)
+            # EventMesh.debug_log("self.sleep_oldtotalmin",self.sleep_oldtotalmin,cur_total_min,self.alarm_flag)
+            if self.sleep_oldtotalmin == 0:
+                self.sleep_oldtotalmin = cur_total_min #549
+            if self.sleep_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃
+                if self.sleep_flag == 1:
+                    self.sleep_flag = 0
+                    self.sleep_count = 0
+            sleep = []
+            sleep = EventMesh.publish("get_storage_config","sleep_alarm")
+            # EventMesh.debug_log("sleep info2",sleep,cur_total_min)
+            if self.sleep_flag == 1:#表示闹钟响过清除标志
+                self.sleep_count+=1
+                if self.sleep_count > 6:
+                    self.sleep_count = 0
+                    self.sleep_flag = 0
+            if sleep != None:
+                if len(sleep) != 0 and sleep != []:
+                    j = 0
+                    count = int(len(sleep))
+                    for i in range(len(sleep)):
+                        # EventMesh.debug_log("wakeup wakeup 33",sleep,j)
+                        sleep_hour = sleep[j]["hour"]
+                        sleep_min = sleep[j]["min"]
+                        sleep_day = sleep[j]["day"]
+                        sleep_enale = sleep[j]["enable"]
+                        sleep_totalmin = int(sleep_hour)*60+int(sleep_min)
+                        # EventMesh.debug_log("wake alarm",sleep_hour,sleep_min,sleep_day,sleep_enale,sleep_totalmin,week)
+                        if sleep_day == []:#单次闹钟只响一次
+                            if sleep_enale != 0:
+                                if cur_total_min > sleep_totalmin:
+                                    sleep.pop(j)
+                                    self.sleep_count = 0
+                                    self.sleep_flag  = 0 
+                                    j=0
+                                    # EventMesh.debug_log("wakeup wakeup dayu",sleep,j)
+                                    EventMesh.publish("set_storage_config",["sleep_alarm",sleep])#删除之后重新保存
+                                    # sleep = EventMesh.publish("get_storage_config","sleep_alarm")#删除之后重新保存
+                                    continue
+                                else:
+                                    if sleep_totalmin == cur_total_min and self.sleep_flag == 0:#14:00
+                                        self.sleep_count = 0
+                                        self.sleep_flag  = 0    
+                                        sleep.pop(j)
+                                        # EventMesh.debug_log("wakeup wakeup1",sleep,j)
+                                        EventMesh.publish("set_storage_config",["sleep_alarm",sleep])#删除之后重新保存
+                                        EventMesh.publish("sleep_alarm_event")#该吃药了                                                                                                                                              
+                                        break
+                        else:
+                            if sleep_enale != 0 and (week in sleep_day):#记录响过的时间分钟数
+                                if sleep_totalmin == cur_total_min and self.sleep_flag == 0:#14:00
+                                    self.sleep_flag  = 1
+                                    self.sleep_count = 0
+                                    self.sleep_oldtotalmin = sleep_totalmin
+                                    EventMesh.publish("sleep_alarm_event")#该吃药了                                                                                                                                                   
+                                    break
+                        j+=1
+
+
+        #该回家了
+        def home_alarm(self):
+            data = RTC().datetime()
+            hour = data[4]
+            min = data[5]
+
+            week = int(data[3])
+
+            date1 = data[1]
+            date2 = data[2]
+            cur_total_min = int(hour)*60+int(min)
+            # EventMesh.debug_log("self.home_oldtotalmin",self.home_oldtotalmin,cur_total_min,self.alarm_flag)
+            if self.home_oldtotalmin == 0:
+                self.home_oldtotalmin = cur_total_min #549
+            if self.home_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃
+                if self.home_flag == 1:
+                    self.home_flag = 0
+                    self.home_count = 0
+            home = ''
+            home = EventMesh.publish("get_storage_config","home_alarm")
+            # EventMesh.debug_log("sleep info2",sleep,cur_total_min)
+            if self.home_flag == 1:#表示闹钟响过清除标志
+                self.home_count+=1
+                if self.home_count > 6:
+                    self.home_count = 0
+                    self.home_flag = 0
+            if home != None:
+                if len(str(home)) != 0 and str(home) != '':
+                    # EventMesh.debug_log("home home 33",home)
+                    home_hour = int(str(home).split(":")[0])
+                    home_min = int(str(home).split(":")[1])
+                    
+                    home_totalmin = int(home_hour)*60+int(home_min)
+                    if home_totalmin == cur_total_min and self.home_flag == 0:#14:00
+                        self.home_flag  = 1
+                        self.home_count = 0
+                        self.home_oldtotalmin = home_totalmin
+                        EventMesh.publish("home_alarm_event")#该回家了                                                                                                                                                   
+
+
+        
+        #该休息了
+        def reset_alarm(self):
+            data = RTC().datetime()
+            hour = data[4]
+            min = data[5]
+
+            week = int(data[3])
+
+            date1 = data[1]
+            date2 = data[2]
+            cur_total_min = int(hour)*60+int(min)
+            # EventMesh.debug_log("self.reset_oldtotalmin",self.reset_oldtotalmin,cur_total_min,self.alarm_flag)
+            if self.reset_oldtotalmin == 0:
+                self.reset_oldtotalmin = cur_total_min #549
+            if self.reset_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃
+                if self.reset_flag == 1:
+                    self.reset_flag = 0
+                    self.reset_count = 0
+            reset_alarm = []
+            reset_alarm = EventMesh.publish("get_storage_config","reset_alarm")
+            # EventMesh.debug_log("reset_alarm info2",len(reset_alarm),cur_total_min)
+            if self.reset_flag == 1:#表示闹钟响过清除标志
+                self.reset_count+=1
+                if self.reset_count > 6:
+                    self.reset_count = 0
+                    self.reset_flag = 0
+            if reset_alarm != None:
+                if len(str(reset_alarm)) != 0 and str(reset_alarm) != []:
+                    for i in range(len(reset_alarm)):
+                        # print("i",i)
+                        start_hour = int(reset_alarm[i]["start_hour"])
+                        start_min = int(reset_alarm[i]["start_min"])
+
+                        end_hour = int(reset_alarm[i]["end_hour"])
+                        end_min = int(reset_alarm[i]["end_min"])
+
+                        # EventMesh.debug_log("reset_alarm home 33",reset_alarm)
+                        
+                        start_totalmin = int(start_hour)*60+int(start_min)
+                        end_totalmin = int(end_hour)*60+int(end_min)
+
+                        if start_totalmin == cur_total_min and self.reset_flag == 0:#14:00
+                            self.reset_flag  = 1
+                            self.reset_count = 0
+                            self.reset_oldtotalmin = start_totalmin
+                            EventMesh.publish("reset_alarm_event")#该休息了     
+                            break
+
+                        if end_totalmin == cur_total_min and self.reset_flag == 0:
+                            self.reset_flag  = 1
+                            self.reset_count = 0
+                            self.reset_oldtotalmin = end_totalmin
+                            EventMesh.publish("reset_end_alarm_event")#休息结束了     
+                            break
+                                                                                                                                                                    
+
+        def clear_normal_alarm(self,event,msg):#普通闹钟清除标志
+            self.normal_flag = 0
+            self.normal_count = 0
+            self.normal_oldtotalmin = 0
+
+        def clear_reset_alarm(self,event,msg):#休息清除标志
+            self.reset_flag = 0
+            self.reset_count = 0
+            self.reset_oldtotalmin = 0
+
+        def clear_home_alarm(self,event,msg):#回家清除标志
+            self.home_flag = 0
+            self.home_count = 0
+            self.home_oldtotalmin = 0
+
+
+        def clear_medicine_alarm(self,event,msg):#吃药清除标志
+            self.medicine_count = 0
+            self.medicine_flag  = 0
+            self.medicine_oldtotalmin = 0
+        
+
+        def clear_wakeup_alarm(self,event,msg):#起床标识
+            self.wakeup_flag = 0
+            self.wakeup_count = 0
+            self.wakeup_oldtotalmin = 0
+
+        def clear_sleep_alarm(self,event,msg):#睡觉标识
+
+            self.sleep_flag = 0
+            self.sleep_count = 0
+            self.sleep_oldtotalmin = 0
+
+            
+
+
+        def get_sim_Status(self, event, msg):
+            return sim.getStatus()
+        def get_device_ope(self, event, msg):
+            """
+            获取设备运营商信息
+            :param event:
+            :param msg:
+            :return: 运营商
+            """
+            net_ope_map = {
+                "UNICOM": "中国联通HD",
+                "CMCC": "中国移动HD",
+                "CT": "中国电信HD"
+            }
+            """获取运营商"""
+            try:
+                short_eons = net.operatorName()[1]
+            except Exception:
+                return "无"
+            return net_ope_map.get(short_eons, None)
+
+        def get_signal(self, event=None, msg=None):
+            """
+            获取信号事件
+            :param event:
+            :param msg:
+            :return: int 类型
+            """
+            return net.csqQueryPoll()
+
+        def get_time_bucket(self, time):
+            if time < 12:
+                return '上午'
+            else:
+                return '下午'
+
+        def get_week(self, week):
+            if week == 1:
+                return '一'
+            elif week == 2:
+                return '二'
+            elif week == 3:
+                return '三'
+            elif week == 4:
+                return '四'
+            elif week == 5:
+                return '五'
+            elif week == 6:
+                return '六'
+            elif week == 7 or week == 0:
+                return '日'
+
+        def get_time(self, event=None, msg=None):
+            """
+            获取时间事件
+            :param event:
+            :param msg:
+            :return: HH:MM 格式
+            """
+            rtc_time = self.rtc.datetime()
+            
+            date = ("%d月%d日" % (rtc_time[1], rtc_time[2]))
+            year = ("%04d年" % (rtc_time[0]))
+            week = ("星期%s"%(self.get_week(rtc_time[3])))
+            week_data = rtc_time[3]
+            time = [rtc_time[4], rtc_time[5]]
+            time_quantum = ("%s" % (self.get_time_bucket(rtc_time[4])))
+            
+            result = [time, time_quantum, date , week,year,week_data]
+            #时分,上午下午,日期,星期,年 星期
+            return result
+
+        def get_step_count(self, event=None, msg=None):
+            """
+            获取步数
+            """
+            # print("11111:{}".format(EventMesh.publish("get_storage_config","clear_state3")))
+            XYZ = self.gsensor.get_x_y_z()
+            tmp = 0
+            step =[0,0,0,0]
+            tmp =  self.gsensor.get_step() 
+            # EventMesh.debug_log("x:%d,y:%d,z:%d tmp %d",XYZ[0],XYZ[1],XYZ[2],tmp)
+            step[0]= tmp 
+            step[1] = XYZ[0]
+            step[2] = XYZ[1]
+            step[3] = XYZ[2]
+            # print("1222:{}".format(EventMesh.publish("get_storage_config","clear_state3")))
+            return step
+
+        def get_ic_cid(self, event, msg):
+            """
+            获取ic cid事件
+            :param event:
+            :param msg:
+            :return: str ic cid
+            """
+            return sim.getIccid()
+
+        def get_phone_num(self, event, msg):
+            """
+            获取电话号码事件
+            :param event:
+            :param msg:
+            :return: str number
+            """
+            return sim.getPhoneNumber()
+
+        def get_battery(self, event=None, msg=None):
+            """
+            获取电池事件,暂时没支持
+            :param event:
+            :param msg:
+            :return:
+            """
+
+            charge_state = '0'
+            if self.get_usb_state() == 1:
+                charge_state = '1'
+            else:
+                charge_state = '0'
+
+            #temp = Power.getVbatt()
+            temp = EventMesh.publish("get_curr_battery_level")
+            vbat = EventMesh.publish("get_battery",temp)
+            if vbat == None:
+                vbat = 100
+            # EventMesh.debug_log("vbat",vbat)
+            # if temp != None :
+            #     if temp <= 3505:
+            #         vbat = 0 
+            #     elif temp <= 3699:
+            #         vbat = 20 #"E:/vbat_20.jpg"
+            #     elif temp <= 3772:
+            #         vbat = 40 #"E:/vbat_40.jpg"
+            #     elif temp <= 3882:
+            #         vbat = 60 #"E:/vbat_60.jpg"
+            #     elif temp <= 4070:
+            #         vbat = 80 #"E:/vbat_80.jpg"
+            #     elif temp <= 4200:
+            #         vbat = 90 #
+            #     else:
+            #         vbat = 100 #"E:/vbat_100.jpg"
+            # else:
+            #     vbat = 100
+
+            result = [charge_state, vbat]
+
+            return result
+        #Set the current average battery level
+        def set_curr_battery_level(self, event=None, msg=None):
+            self.curr_battery_level = msg
+        
+        def get_curr_battery_level(self, event=None, msg=None):
+            return self.curr_battery_level
+
+        def get_device_fw_version(self, *args):
+            '''
+            获取设备固件版本号
+            '''
+            fw_version = modem.getDevFwVersion()
+            if isinstance(fw_version, str):
+                return fw_version
+            return "--"
+
+        def get_standby_time(self, *args):
+            '''
+            获取设备单次开机待机时间
+            '''
+            time_msg = utime.time()
+            d = int(
+                time_msg / 86400)  # The int call removes the decimals.  Conveniently, it always rounds down.  int(2.9) returns 2 instead of 3, for example.
+            time_msg -= (
+                    d * 86400)  # This updates the value of x to show that the already counted seconds won't be double counted or anything.
+            h = int(time_msg / 3600)
+            time_msg -= (h * 3600)
+            m = int(time_msg / 60)
+            time_msg -= (m * 60)
+            s = time_msg
+            result = "{}天{}小时{}分".format(d, h, m)
+            return result
+
+        def set_key(self, topic, msg):
+            self.key = msg["value"]
+        def get_key(self, topic, msg):
+            return self.key
+
+        def get_imei(self, topic, msg):
+            if not self.imei:
+                self.imei = modem.getDevImei()
+            
+            # self.imei = "866610001011658" #860132060128634
+            return self.imei
+
+        def get_cid(self, topic, msg):
+            return self.cid
+
+        def set_cid(self, topic, msg):
+            self.cid = msg["value"]
+
+        def get_imsi(self, topic, msg):
+            if not self.imei:
+                self.imei = sim.getImsi()
+            return self.imsi
+
+        def get_password(self, topic, msg):
+            return self.password
+
+        def set_password(self, topic, msg):
+            self.password = msg["value"]
+
+        def set_ping(self, topic, msg):
+            self.PING = msg
+        def get_ping(self, topic, msg):
+            return self.PING
+
+        def set_connect(self, topic, msg):
+            #EventMesh.debug_log("set_connect:{}".format(msg))
+            self.connect = msg
+        def get_connect(self, topic, msg):
+            return self.connect
+
+        def start_blood_oxygen(self, topic, msg):
+            EventMesh.debug_log("start_blood_oxygen!!!")
+            self.hsensor.open_blood_oxygen()
+
+        def start_heart(self, topic, msg):
+            EventMesh.debug_log("start_heart!!!")
+            self.hsensor.open_heart()
+
+        def stop_blood_oxygen(self, topic, msg):
+            EventMesh.debug_log("stop_blood_oxygen!!!")
+            self.hsensor.close()
+
+        def stop_heart(self, topic, msg):
+            EventMesh.debug_log("stop_heart!!!")
+            self.hsensor.close()
+
+        def get_blood_oxygen(self, topic, msg):
+            data = self.hsensor.get_all_data()
+            return data[1]
+
+        def get_heart(self, topic, msg):
+            data = self.hsensor.get_all_data()
+            return data[0]
+        
+        def get_wear(self, topic, msg):
+            return self.hsensor.get_wear()
+        
+        def get_Hsensor(self, topic, msg):
+            return self.hsensor
+        
+        def Hsensor_set_sleep(self, topic, msg):
+            self.hsensor.set_sleep()
+
+        def start_temp(self, topic, msg):
+            EventMesh.debug_log("start_temp!!!!!!!")
+            WHO_AM_I = bytearray([0x01, 0])
+            I2C_SLAVE_ADDR = 0x49
+            #I2C_SLAVE_ADDR = 0x48
+            r_data = bytearray(2)
+            data = bytearray([0x61A0, 0])   # 唤醒
+            return self.i2c0.write(I2C_SLAVE_ADDR, WHO_AM_I, 1, data, 2)
+        def stop_temp(self, topic, msg):
+            EventMesh.debug_log("stop_temp!!!!!!!")
+            WHO_AM_I = bytearray([0x01, 0])
+            I2C_SLAVE_ADDR = 0x49
+            #I2C_SLAVE_ADDR = 0x48
+            r_data = bytearray(2)
+            data = bytearray([0x60A0, 0])   #休眠
+            return self.i2c0.write(I2C_SLAVE_ADDR, WHO_AM_I, 1, data, 2)
+            
+        def get_temp(self, topic, msg):
+            WHO_AM_I = bytearray([0x00, 0])
+            I2C_SLAVE_ADDR = 0x49
+            #I2C_SLAVE_ADDR = 0x48
+            r_data = bytearray(2)
+            self.i2c0.read(I2C_SLAVE_ADDR, WHO_AM_I, 1, r_data, 2, 0)
+            #EventMesh.debug_log("temp_data:{}".format(r_data))
+            temp_s = ((r_data[0]<<8) | (r_data[1]))>>4
+            #EventMesh.debug_log("temp_s:{}".format(temp_s))
+            temp_data = temp_s * 0.0625
+            EventMesh.debug_log("temp_data:{}".format(temp_data))
+            return temp_data
+    
+                
+
+        def sim_slot_get(self, topic=None, msg=None):
+            return sim.getCurSimid()
+
+        def sim_slot_switch(self, topic=None, slot=None):
+            """
+            sim 卡槽切换
+            :param topic:
+            :param slot:
+            :return: 切换sim卡卡槽  0 切换成功, 1 无需切换, -1 切换失败
+            """
+            if self.sim_slot_get() == slot:
+                return 1
+            else:
+                return sim.switchCard(slot)
+
+        def usb_event_cb(self, state):
+            status = state
+
+            if status == 1:#插入USB
+                EventMesh.debug_log("charge R_CHARGE_in")
+                EventMesh.publish("clear_usb_flag")
+                EventMesh.publish("set_usb", 1)#
+                pass
+            elif status == 0:#拨出usbs
+                EventMesh.publish("clear_usb_flag")
+                EventMesh.publish("set_usb", 2)#
+                EventMesh.debug_log("charge R_CHARGE_out")
+
+                
+                
+
+        
+
+        def get_usb_state(self):
+            state = self.usb.getStatus()
+            if state == -1:
+                state = 0
+            return state
+        
+
+    def wifiScan_cb(args):
+            EventMesh.publish(constants.EVENT.WIFIINFO, args)
+            wifiScan.control(0)
+
+    class LocationManager(Abstract):
+
+        def __init__(self):
+            self.gps = None
+            #self.match = GPSMatch()
+            self.timer_read_GPS_info = osTimer()
+            self.wifi_data = []
+            self.gps_data  = {}
+            self.cell_data = []
+            self.location_timer_count = 0
+            self.location_check_data_timer_count = 0
+            self.GGA_count = 0
+            self.RMC_A_count = 0
+            self.location_type = 0 #定位类型,0:正常定位,有gps数据或60秒关闭;1:测试模式,只有发CLOSE_LOCATION消息才关闭
+            self.location_flag = 0
+            self.start_location_flag = 0
+            self.location_thread_id  = 0
+            self.location_queue = Queue(100)
+            self.lpm_fd = None
+            self.start_agps = 0
+            read_data = EventMesh.publish("get_storage_config","isOpenGNSS")#获取是否打开GNSS
+            if read_data != None:
+                self.isOpenGNSS = read_data
+            else:#默认关闭GNSS
+                self.isOpenGNSS = "1"
+                EventMesh.publish("set_storage_config",["isOpenGNSS",self.isOpenGNSS])
+
+            self.isOpenGNSS = EventMesh.publish("get_storage_config","isOpenGNSS")
+            if self.isOpenGNSS == None:
+                self.isOpenGNSS = "1"
+            if self.isOpenGNSS == "1":
+                if quecgnss.init() == -1:
+                    self.isOpenGNSS = "0"
+                    EventMesh.publish("set_storage_config",["isOpenGNSS",self.isOpenGNSS])
+                else:
+                    quecgnss.gnssEnable(0)
+        @staticmethod
+        def get_date():
+            return "{:04d}-{:02d}-{:02d}".format(*utime.localtime()[0:3])
+
+        @staticmethod
+        def get_time():
+            return "{:02d}:{:02d}:{:02d}".format(*utime.localtime()[3:6])
+
+        def post_processor_after_instantiation(self):
+            # _gps_cfg = {
+            #     "UARTn": UART.UART1,
+            #     "buadrate": 115200,
+            #     "databits": 8,
+            #     "parity": 0,
+            #     "stopbits": 1,
+            #     "flowctl": 0,
+            #     "PowerPin": Pin.GPIO2,
+            #     "StandbyPin": Pin.GPIO3,
+            #     "BackupPin": None,
+            #     "gps_mode": 0x01,
+            # }
+            # self.gps = GPS(**_gps_cfg)
+            # self.gps.power_switch(0)#关闭GPS
+            EventMesh.subscribe(constants.EVENT.GPSOPEN, self.gps_open)
+            EventMesh.subscribe(constants.EVENT.GPSCLOSE, self.gps_close)
+            EventMesh.subscribe(constants.EVENT.START_LOCATION, self.start_location)
+            EventMesh.subscribe(constants.EVENT.START_LOCATION_TEST, self.start_location_test)
+            EventMesh.subscribe(constants.EVENT.WIFIINFO, self.WIFI_INFO)
+            EventMesh.subscribe(constants.EVENT.WIFISCANOPEN,self.WIFI_scan_open)
+            EventMesh.subscribe(constants.EVENT.CLOSE_LOCATION,self.close_location)
+            EventMesh.subscribe("get_location_flag",self.get_location_flag)
+            
+            #EventMesh.subscribe(constants.EVENT.GPSCLOSE, self.gps_close)
+        def get_location_flag(self, event, msg):
+            return self.location_flag
+        def start_location(self, event, msg):
+            self.location_queue.put(msg)#测试类型入队
+            self.gps_data = {}
+            self.wifi_data = []
+            self.cell_data = []
+            self.location_timer_count = 0
+            self.GSV_sig_ok_count = 0
+            EventMesh.debug_log("start_location:{}".format(msg))
+            if( self.location_flag == 1):
+                return
+            _thread.stack_size((9+5)*1024)
+            self.location_thread_id  = _thread.start_new_thread(self.location_thread, ())
+            _thread.stack_size(8*1024)
+            
+            self.location_flag = 1
+            self.timer_read_GPS_info.start(1000, 1, self.location_timer)
+            #self.gps_open(event, msg)
+
+
+        def start_location_test(self, event, msg):
+            EventMesh.debug_log("start_location_test")
+            
+            self.location_type = 1
+            if( self.location_flag == 1):
+                return
+            _thread.stack_size((9+4)*1024)
+            self.location_thread_id  = _thread.start_new_thread(self.location_thread, ())
+            _thread.stack_size(8*1024)
+        
+            self.location_timer_count = 0
+            self.location_flag = 1
+            #self.gps_open(event, msg)
+            self.location_type = 1
+            self.timer_read_GPS_info.start(1000, 1, self.location_timer)
+    
+
+        def close_location(self, event, msg):
+            self.location_flag = 0
+            self.location_type = 0
+            self.timer_read_GPS_info.stop()
+
+            
+
+        def WIFI_INFO(self, event, msg):
+            self.wifi_data = msg
+            # EventMesh.debug_log("WIFI_INFO:")
+            # EventMesh.debug_log([msg[0],msg])
+
+        def WIFI_scan_open(self, event, msg):
+            #EventMesh.debug_log("WIFI_scan_open")
+            
+
+            if wifiScan.getState() == False :
+                self.wifi_data = []
+                wifiScan.control(1)
+                wifiScan.setCfgParam(6, 2, 5,  0)  #设置WiFi参数,10秒上层,两轮,最多6个,6秒底层,PS优先
+                wifiScan.setCallback(wifiScan_cb) #注册回调函数
+                wifiScan.asyncStart()
+                #EventMesh.debug_log("wifiScan.asyncStart")
+            else :
+                EventMesh.debug_log("WIFI_scan_open:error1") 
+        def gps_open(self, event, msg):
+            if self.isOpenGNSS == "1":
+                #EventMesh.debug_log("publish:gps_open")
+                #quecgnss.init()
+                quecgnss.gnssEnable(2)
+                #self.gps.__gps_nmea_data_clean()
+        def gps_close(self, event, msg):
+            if self.isOpenGNSS == "1":
+                quecgnss.gnssEnable(0)
+        def location_timer(self, *args, **kwargs):
+            
+            self.location_timer_count = self.location_timer_count +1
+            self.location_check_data_timer_count = self.location_check_data_timer_count+1
+
+        def Location_send(self, msg) :
+            EventMesh.debug_log("Location_send1")
+            if self.location_queue.empty() == True:
+                return
+            EventMesh.debug_log("Location_send2")
+            while True:
+                if self.location_queue.empty() == False:
+                    TYPE = self.location_queue.get()
+                    date = "{:04d}{:02d}{:02d},{:02d}{:02d}{:02d}".format(*utime.localtime()[0:6])
+                    date = date[2:]
+                    #date = "180916,025723"
+                    GPS_type = "V"
+                    latitude = "0.000000,N"
+                    longitude = "0.000000,E"
+                    speed = "0.00"
+                    direction = "0.0"
+                    high = "100.0"
+                    number = "0"
+                    precision = "24"
+                    if msg[0] :#有GPS数据
+                        GPS_type = "A"
+                        # 纬度
+                        latitude = msg[0]["latitude"]
+                        # 经度
+                        longitude = msg[0]["longitude"]
+                        # 速度
+                        speed = msg[0]["speed"]
+                        # 方向
+                        direction = "0"
+                        if msg[0]["direction"] :
+                            direction = msg[0]["direction"]
+                        # 高度
+                        high = msg[0]["high"]
+                        high_tmp = high.split(".")
+                        if len(high_tmp) >= 2 :
+                            high = "%s"%(high_tmp[0])
+                        # 讯号质量:搜索到的卫星数目
+                        number = msg[0]["number"]
+                        precision = msg[0]["precision"]
+                        #date = msg[0]["date"]
+                    
+                    #gsm 信号强度
+                    gsm_sig =  str((100//31)*EventMesh.publish("screen_get_sig"))
+                    # 电池电量百分比 
+                    bat_tmp = EventMesh.publish("screen_get_battery")
+                    battery_caption =  str(bat_tmp[1])
+                    #步数
+                    old_step = 0
+                    step = 0
+                    step = EventMesh.publish("get_old_step_value")
+                    if step != 0:
+                        tmp_data  = EventMesh.publish("get_storage_config","old_step_new")
+                        if tmp_data != None:
+                            old_step = tmp_data
+                        if old_step !=  step:
+                            EventMesh.publish("set_storage_config",["old_step",step])
+                            EventMesh.publish("set_storage_config",["old_step_new",step])
+                            
+                    old_step = step
+                    # step = str(EventMesh.publish(constants.EVENT.GET_STEP)[0])
+                    #翻转次数
+                    turn_count = "0"
+                    #终端状态
+                    state = "%08X"%(EventMesh.publish("get_dev_state"))
+                    #EventMesh.debug_log("TYPE:{}".format(TYPE))
+                    if type(TYPE) == list:#队列里的数据有终端状态,则用队里的终端状态
+                        if len(TYPE)>= 2 :
+                            state = "%08X"%(TYPE[1])
+                    
+                    EventMesh.debug_log("state:{}".format(state))
+                    #基站数据
+                    CELL_num = len(msg[2])
+                    CELL_data = "1," #时延
+                    if msg[2] != []:
+                        for CELL in msg[2] :
+                            if CELL[0] == 0 :
+                                CELL_data += "%X,"%(int(CELL[2])) #MCC
+                                CELL_data += str(CELL[3]) +","#MNC
+                                CELL_data += str(CELL[5]) +","#tac,区域码
+                                CELL_data += str(CELL[1]) +","#基站编号 CID
+                                CELL_data += str(int(CELL[7]+140)) +","#信号强度 rssi
+                            else :
+                                CELL_data += str(CELL[5]) +","#tac,区域码
+                                CELL_data += str(CELL[1]) +","#基站编号 CID
+                                CELL_data += str(int(CELL[7]+140)) +","#信号强度 rssi
+                        CELL_data = CELL_data[:(len(CELL_data)-1)]
+                    #WIFI数据
+                    WIFI_num = 0 
+                    WIFI_data = ""
+                    if msg[1] :
+                        WIFI_num = msg[1][0]
+                        i = 0
+                        for MAC in msg[1][1] :
+                            WIFI_data += "wifi%d,%s,%d,"%(i,str(MAC[0]),MAC[1])
+                            i += 1
+                        WIFI_data = WIFI_data[:(len(WIFI_data)-1)]
+                    WIFI_data = WIFI_data.lower()
+                    #send_data = "UD ,%s ,%s     ,%s       ,%s       ,%s   ,%s       ,%s  ,%s    ,%s     ,%s             ,%s  ,%s        ,%s   ,%d     ,%s       ,%d      ,%s"\
+                    #              %(date,GPS_type,latitude,longitude,speed,direction,high,number,gsm_sig,battery_caption,step,turn_count,state,CELL_num,CELL_data,WIFI_num,WIFI_data)
+                    #定位数据
+                    send_data = "%s,%s,%s"%(date,GPS_type,latitude)
+                    send_data += ",%s,%s,%s"%(longitude,speed,direction)
+                    send_data += ",%s,%s,%s"%(high,number,gsm_sig,)
+                    send_data += ",%s,%s,%s"%(battery_caption,step,turn_count)
+                    send_data += ",%s,%d,%s"%(state,CELL_num,CELL_data)
+                    send_data += ",%d,%s"%(WIFI_num,WIFI_data)
+                    send_data+=",%s"%(precision)
+                    #EventMesh.debug_log("Location_send2:{} q_size:{}".format(send_data,self.location_queue.size()))
+            
+                
+                    #EventMesh.debug_log("Location_send3:{}:{}".format(TYPE,send_data))
+                    if type(TYPE) == list:
+                        EventMesh.publish(TYPE[0],send_data)
+                    else:
+                        EventMesh.publish(TYPE,send_data)
+                else :
+                    break
+
+        def GxGGA_latitude(self, gga_data):
+            """Parse latitude from GGA"""
+            if gga_data:
+                latitude_re = ure.search(r",[0-9]+\.[0-9]+,[NS],", gga_data)
+                if latitude_re:
+                    latitude = latitude_re.group(0)[1:-3]
+                    return str(float(latitude[:2]) + float(latitude[2:]) / 60)
+            return ""
+        def GxGGA_longitude(self, gga_data):
+            """Parse longitude from GGA"""
+            if gga_data:
+                longitude_re = ure.search(r",[0-9]+\.[0-9]+,[EW],", gga_data)
+                if longitude_re:
+                    longitude = longitude_re.group(0)[1:-3]
+                    return str(float(longitude[:3]) + float(longitude[3:]) / 60)
+            return ""
+
+        def GxGGA_altitude(self, gga_data):
+            """Parse altitude from GGA"""
+            if gga_data:
+                altitude_re = ure.search(r",-*[0-9]+\.[0-9]+,M,", gga_data)
+                if altitude_re:
+                    return altitude_re.group(0)[1:-3]
+            return ""
+        def location_thread(self):
+            
+            self.wifi_data = []
+            self.gps_data = {}
+            self.cell_data = []
+            gnss_r_data = []
+            self.GSV_sig_ok_count = 0
+            self.GSV_sig_very_ok_count = 0
+            self.GGA_count = 0
+            self.RMC_A_count = 0
+            # if self.start_agps == 1: #开启agps
+            #     self.start_agps = 0
+            #     quecgnss.configSet(2,1)
+            if self.lpm_fd == None:
+                self.lpm_fd = pm.create_wakelock("test_lock", len("test_lock"))
+            pm.wakelock_lock(self.lpm_fd)
+            EventMesh.debug_log("location_thread:1")
+            EventMesh.publish(constants.EVENT.GPSOPEN)
+            EventMesh.debug_log("location_thread:2")
+            #self.timer_read_GPS_info.start(1000, 1, self.location_timer)
+            EventMesh.debug_log("location_thread:3")
+            #utime.sleep_ms(1000)
+            self.location_timer_count = 0
+            #quecgnss.read(4096)#去掉第一次错误数据
+            #EventMesh.txt_log("START_LOCATION")
+            # pm.autosleep(0)#唤醒
+            # pm.sclkEx_set(0, 1, 5)
+            GSV_dict= {}
+            while self.location_flag == 1:
+                try :   
+                    
+                    match_gga_data = []
+                    #match_gsv_data = []
+                    gnss_r_data = []
+                    # if self.location_check_data_timer_count >= 3:
+                    #     pm.autosleep(0)#唤醒
+                    #     pm.sclkEx_set(0, 1, 5)
+                    if self.location_check_data_timer_count >= 1 :#3秒查一次基站数据和wifi数据
+                        self.location_check_data_timer_count = 0
+                        #EventMesh.debug_log(self.location_timer_count)
+                        GSV_dict= {}
+                        if self.isOpenGNSS == "1":                    
+                            #检查GNSS数据
+                            if ( self.gps_data == {} or self.location_type == 1) and quecgnss.get_state() == 2:
+
+                                pass
+                                tmp_ok_count = 0
+                                tmp_very_ok_count = 0
+                                gsv_data = quecgnss.get_gsv()
+                                rmc_data = quecgnss.get_rmc()
+                                gga_data = quecgnss.get_gga()
+                                vtg_data = quecgnss.get_vtg()
+                                # EventMesh.debug_log("gsv:{}".format(quecgnss.get_gsv()))
+                                # EventMesh.debug_log("gga:{}".format(quecgnss.get_gga()))
+                                # EventMesh.debug_log("rmc:{}".format(quecgnss.get_rmc()))
+                                # EventMesh.debug_log("vtg:{}".format(quecgnss.get_vtg())) 
+                                for i in range(len(gsv_data)) :
+                                    
+                                    if i % 2 == 0:
+                                        if i+1 >= len(gsv_data) :
+                                            # EventMesh.debug_log("gsv_data num error!!")
+                                            break
+                                        GSV_dict[gsv_data[i]] = gsv_data[i+1]
+                                        #EventMesh.debug_log("type:gsv_data{}".format(type(gsv_data[i+1])))
+                                        try:
+                                            #EventMesh.debug_log("gsv_tmp[i+3]:{}".format(gsv_tmp[i+3]))
+                                            if gsv_data[i+1] :
+                                                if (gsv_data[i+1])>=20:
+                                                    tmp_ok_count +=1   
+                                                if (gsv_data[i+1])>=30:
+                                                    tmp_very_ok_count +=1  
+                                                    
+                                        except Exception as e:
+                                            usys.print_exception(e)
+                                        
+                                if(tmp_ok_count > self.GSV_sig_ok_count ):
+                                    self.GSV_sig_ok_count = tmp_ok_count
+                                if(tmp_very_ok_count > self.GSV_sig_very_ok_count ):
+                                    self.GSV_sig_very_ok_count = tmp_very_ok_count
+                                match_rmc_data = rmc_data.split(",")
+                                if len (match_rmc_data)>3: #有rmc数据
+                                        if match_rmc_data[2] == 'A':    
+                                            match_gga_data = gga_data.split(",")
+                                            if len(match_gga_data) >4: #数据全
+                                                match_vtg_data = vtg_data.split(",")
+                                                gps_date = "%s,%s"%(match_rmc_data[9],match_rmc_data[1][:6])#日期
+                                                #gps_data_tmp = self.gps.read_coordinates(gnss_r_data[1])
+                                                latitude = "0,N" #纬度
+                                                latitude_tmp = str(self.GxGGA_latitude(gga_data)).split(".")
+                                                if len(latitude_tmp) >= 2 and len(latitude_tmp[1])>=5:
+                                                    latitude = "%s.%s"%(latitude_tmp[0],latitude_tmp[1][:6])
+                                                    latitude = "%s,%s"%(latitude,match_rmc_data[4] )
+
+                                                longitude = "0,E"#经度
+                                                longitude_tmp = str(self.GxGGA_longitude(gga_data)).split(".")
+                                                if len(longitude_tmp) >= 2 and len(longitude_tmp[1])>=5:
+                                                    longitude = "%s.%s"%(longitude_tmp[0],longitude_tmp[1][:6])
+                                                    longitude = "%s,%s"%(longitude,match_rmc_data[6] ) #match_rmc_data[6] + str(gnss_r_data[1])
+                                                
+                                                high = "0"#高度
+                                                high = str(self.GxGGA_altitude(gga_data))
+                                                number = "0"#可用卫星
+                                                precision = "5.8"#精度
+                                                if len(match_gga_data)>5 :
+                                                    if match_gga_data[7]:
+                                                        number = match_gga_data[7]
+                                                    if match_gga_data[8]:
+                                                        precision = match_gga_data[8]
+                                                direction = "249.5" #方向
+                                                speed = '0.00'    #速度    
+                                                if(len(match_vtg_data)>5 ):
+                                                    if match_vtg_data[1]:
+                                                        direction =  match_vtg_data[1]
+                                                    if match_vtg_data[7]:    
+                                                        speed =  match_vtg_data[7]
+                                                self.gps_data = {
+                                                    "latitude": latitude,
+                                                    "longitude": longitude,
+                                                    "high": high,
+                                                    "direction": direction,
+                                                    "speed": speed,
+                                                    "number": number, 
+                                                    "date":  gps_date,
+                                                    "precision":  precision
+                                                }
+    # ***********************************************************************************
+
+
+                    #检查wifi数据
+                    if self.wifi_data == [] or (self.wifi_data != [] and self.wifi_data[0] == 0):#and self.wifi_data[0] <= 0:
+                        EventMesh.publish(constants.EVENT.WIFISCANOPEN)
+                
+                    #检查基站数据
+                    if self.cell_data == []:   
+                        data_tmp = net.getCellInfo()
+                        if(len(data_tmp)>=2):
+                            for cell in data_tmp:
+                                if cell and cell[0][0] == 0 and len(cell[0]) > 1:
+                                    self.cell_data = cell
+                                    break
+
+                    if self.location_type == 1: #测试模式
+                        self.location_timer_count = 0
+                        
+                        EventMesh.publish("PUSH_LOCATION_DATA", [[self.gps_data,GSV_dict],self.wifi_data,self.cell_data]) 
+                        if self.gps_data  != {} : #发送数据 
+                            EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位
+                            self.location_queue.put(constants.PROTOCOL.UD_SEND)
+                            self.Location_send([self.gps_data,self.wifi_data,self.cell_data])
+                            
+
+                    elif self.location_type == 0: #正常模式     
+                        if self.gps_data  != {} or self.location_timer_count > 100: #or( self.wifi_data != [] and self.cell_data != []): 
+                            if self.location_queue.empty() == False:#有定位队列
+                                pass
+                                #EventMesh.txt_log("LOCATION timer:{} ok:{} very_ok:{}".format(self.location_timer_count,self.GSV_sig_ok_count))   
+                                #EventMesh.txt_log("LOCATION:timer:{} ok_count:{} ".format(self.location_timer_count,self.GSV_sig_ok_count))
+                            if self.gps_data  == {}: #定位超时,且信噪比多个大于30,下次启动agps
+                                if self.GSV_sig_very_ok_count > 3:#3个超30以上
+                                    self.start_agps = 1
+                                    #EventMesh.txt_log("open agps:{}".format(GSV_dict))
+                            #upload_time = EventMesh.publish("get_upload_data")    
+                            self.Location_send([self.gps_data,self.wifi_data,self.cell_data])
+                            #if upload_time > 200  : 
+                            EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位
+                            # else:   #定位间隔小于3分钟不关闭gps,不影响无信号判断
+                            #     self.location_timer_count = 0
+                            #     self.GSV_sig_ok_count = 0
+                                
+                            
+
+                            
+                        if (self.isOpenGNSS != "1" or (self.GSV_sig_ok_count <= 1 and self.location_timer_count > 20)) and self.wifi_data != [] and self.cell_data != [] : #超过40秒且信号大于30的不足3个
+                            EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 
+                            EventMesh.debug_log("Location_send:CLOSE_LOCATION")  
+                            #EventMesh.txt_log("GSV_sig_ok_count<3:timer:{} ok_count:{} ".format(self.location_timer_count,self.GSV_sig_ok_count))
+                            self.Location_send([self.gps_data,self.wifi_data,self.cell_data])
+
+                
+                    
+                except Exception as e:
+                    usys.print_exception(e)
+                    EventMesh.txt_log("location_thread:ERROR:".format(e))
+                    #EventMesh.debug_log("location_thread:ERROR:{}".format(usys.print_exception(e)))
+                    EventMesh.debug_log("self.gps_data{},self.wifi_data{},self.cell_data{}".format(self.gps_data,self.wifi_data,self.cell_data))
+                    #self.Location_send([self.gps_data,self.wifi_data,self.cell_data])
+                    EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 
+                utime.sleep_ms(500)
+
+            #self.timer_read_GPS_info.stop()
+            #self.gps.power_switch(0)
+            wifiScan.control(0)
+            EventMesh.publish(constants.EVENT.GPSCLOSE)
+            # if EventMesh.publish("get_lcd_state" ) == 0:#休眠的时候,恢复休眠
+            #     pm.autosleep(1)
+            #     pm.sclkEx_set(1, 1, 5)
+            if self.lpm_fd != None:
+                pm.wakelock_unlock(self.lpm_fd)
+            #pm.delete_wakelock(lpm_fd)
+            EventMesh.debug_log("CLOSE_LOCATION")
+            #EventMesh.txt_log("CLOSE_LOCATION")
+
+                    
+
+    class AddrBookManager(Abstract):
+        # 通讯录
+        def __init__(self):
+            self.read_phonebook = {}
+            self.check_json = 0
+            self.check_json = ql_fs.path_exists("/usr/static/storage_file/phonebook.json")
+
+            if self.check_json == True:
+                with open("/usr/static/storage_file/phonebook.json","r",encoding="utf-8") as fd:
+                    self.read_phonebook = ujson.load(fd)
+                    EventMesh.debug_log("读取电话本")
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("get_phonebook_list", self.get)
+            EventMesh.subscribe("set_phonebook_list", self.set)
+            EventMesh.subscribe("call_phonebook_one_call", self.call_phonebook_one_call)
+            EventMesh.subscribe("call_phonebook_two_call", self.call_phonebook_two_call)
+            EventMesh.subscribe("call_phonebook_three_call", self.call_phonebook_three_call)
+
+            EventMesh.subscribe("call_phonebook_num", self.call_phonebook_num)
+
+        def get(self, event, msg):
+            self.check_json = ql_fs.path_exists("/usr/static/storage_file/phonebook.json")
+            return [self.check_json,self.read_phonebook]
+        
+        def call_phonebook_num(self, event, msg):
+            name = ''
+            key_tmp = ''
+            phone_num = int(msg)
+            if self.read_phonebook != {}:
+                if len(self.read_phonebook) >= phone_num:
+                    phonebook_keys = sorted(self.read_phonebook.keys())
+                    name = self.read_phonebook[phonebook_keys[phone_num-1]]
+                    key_tmp = phonebook_keys[phone_num-1]
+                    if len(name) != 0:
+                        EventMesh.publish("save_phonename",str(name))
+                        EventMesh.publish("save_phonenum",str(name))
+                        EventMesh.publish("dial_out_call_center_cb",str(name))#电话拨出去
+                    else:
+                        EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+                else:
+                    EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+            else:
+                EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+            EventMesh.debug_log("call_phonebook_call name:{} msg:{}".format(len(self.read_phonebook),msg))
+
+        def call_phonebook_one_call(self, event, msg):
+            name = ''
+            key_tmp = ''
+            if self.read_phonebook != {}:
+                if len(self.read_phonebook) >= 1:
+                    phonebook_keys = sorted(self.read_phonebook.keys())
+                    name = self.read_phonebook[phonebook_keys[0]]
+                    key_tmp = phonebook_keys[0]
+                    if len(name) != 0:
+                        EventMesh.publish("save_phonename",str(name))
+                        EventMesh.publish("save_phonenum",str(name))
+                        EventMesh.publish("dial_out_call_center_cb",str(name))#电话拨出去
+                    else:
+                        EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+                else:
+                    EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+            else:
+                EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+            EventMesh.debug_log("call_phonebook_one_call name:{} key_tmp:{} len:{}".format(name,key_tmp,len(self.read_phonebook)))
+
+        def call_phonebook_two_call(self, event, msg):
+            name = ''
+            key_tmp = ''
+            if self.read_phonebook != {}:
+                if len(self.read_phonebook) >= 2:
+                    phonebook_keys = sorted(self.read_phonebook.keys())
+                    name = self.read_phonebook[phonebook_keys[1]]
+                    key_tmp = phonebook_keys[1]
+                    if len(name) != 0:
+                        #voiceCall.callStart(str(name))
+                        EventMesh.publish("save_phonename",str(name))
+                        EventMesh.publish("save_phonenum",str(name))
+                        EventMesh.publish("dial_out_call_center_cb",str(name))#电话拨出去
+                    else:
+                        EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+                    
+                else:
+                    EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+            else:
+                EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+                EventMesh.debug_log("call_phonebook_two_call name:{} key_tmp:{}".format(name,key_tmp))
+        
+        def call_phonebook_three_call(self, event, msg):
+            name = ''
+            key_tmp = ''
+            if self.read_phonebook != {}:
+                if len(self.read_phonebook) >= 3:
+                    phonebook_keys = sorted(self.read_phonebook.keys())
+                    name = self.read_phonebook[phonebook_keys[2]]
+                    key_tmp = phonebook_keys[2]
+                    if len(name) != 0:
+                        #voiceCall.callStart(str(name))
+                        EventMesh.publish("save_phonename",str(name))
+                        EventMesh.publish("save_phonenum",str(name))
+                        EventMesh.publish("dial_out_call_center_cb",str(name))#电话拨出去
+                    else:
+                        EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+                    
+                else:
+                    EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+            else:
+                EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+            EventMesh.debug_log("call_phonebook_three_call name:{} key_tmp:{}".format(name,key_tmp))
+
+        def set(self, event, msg):
+            self.check_json = msg[0]
+            self.read_phonebook = msg[1]
+
+    import sms
+    class MsgManager(Abstract):
+        # 短信
+        def __init__(self):
+            self.msg_nums = 0
+            self.msg_detail = ""
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("get_msg_nums", self.get_msg_nums)
+            # 可通过此push_addr_book_list主动推送
+            EventMesh.subscribe("get_msg_detail", self.get_msg_detail)
+
+        def get_msg_nums(self, event, msg):
+
+            self.msg_nums = sms.getMsgNums() 
+            EventMesh.debug_log("self.msg_nums {}:".format(self.msg_nums))
+            return self.msg_nums
+        
+        def get_msg_detail(self, event, msg):
+            
+            # self.msg_detail = sms.searchTextMsg(self.msg_nums)
+            # EventMesh.debug_log("self.msg_detai {}:".format(self.msg_detai))
+            return{
+                "小明":"有内鬼,停止交易",
+                "小红":"今晚十点一起吃饭"
+            }
+
+    class MsgdetailManager(Abstract):
+        def __init__(self):
+            self.level = 0
+            self.msg_name = ""
+            self.msg_content = ""
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("save_msg_name", self.save_msg_name)
+            EventMesh.subscribe("save_msg_content", self.save_msg_content)
+            EventMesh.subscribe("get_msg_name", self.get_msg_name)
+            EventMesh.subscribe("get_msg_content", self.get_msg_content)
+
+        def save_msg_name(self, event, msg): 
+            self.msg_name = str(msg)
+            EventMesh.debug_log("save_msg_name:msg".format(msg))
+        
+        def save_msg_content(self, event, msg):
+            self.msg_content = str(msg)
+            EventMesh.debug_log("save_msg_content:msg".format(msg))
+        
+        def get_msg_content(self, event, msg):
+            return self.msg_content
+
+        def get_msg_name(self, event, msg):
+            return self.msg_name
+
+    class CallLogManager(Abstract):
+        # 通话记录
+        def __init__(self):
+            self.read_call_log = {}
+            self.check_json = ql_fs.path_exists("/usr/static/storage_file/Call_log.json")
+
+            if self.check_json == True:
+                with open("/usr/static/storage_file/Call_log.json","r",encoding="utf-8") as fd:
+                    self.read_call_log = ujson.load(fd)
+                    EventMesh.debug_log("读取通话记录")
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("get_call_log_list", self.get)
+            EventMesh.subscribe("set_call_log_list", self.set)
+
+        def get(self, event, msg):
+            self.check_json = ql_fs.path_exists("/usr/static/storage_file/Call_log.json")
+            return [self.check_json,self.read_call_log]
+
+        def set(self, event, msg):
+            return
+            self.check_json = msg[0]
+            self.read_call_log = msg[1]
+            with open("/usr/static/storage_file/Call_log.json","w+",encoding="utf-8") as fd:
+                ujson.dump(self.read_call_log,fd)
+        # def call_usr(self,event,msg):
+        #     content = self.log[msg]
+        #     # 参数1 姓名  参数2  电话   参数3 1/主动呼叫  0别人呼叫
+        #     EventMesh.publish("call_in", [content[2], content[0], 1])
+
+
+
+    class PhoneCallingManager(Abstract):
+        def __init__(self):
+            self.phonenum = ""
+            self.phonename = ""
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("save_phonenum", self.save_phonenum)
+            EventMesh.subscribe("get_phonenum", self.get_phonenum)
+            EventMesh.subscribe("get_phonename", self.get_phonename)
+            EventMesh.subscribe("save_phonename", self.save_phonename)
+
+        def get_phonename(self, event, msg): 
+            return self.phonename
+
+        def save_phonename(self, event, msg): 
+            self.phonename = str(msg)
+
+        def save_phonenum(self, event, msg): 
+            self.phonenum = str(msg)
+        
+        def get_phonenum(self, event, msg):
+            return self.phonenum
+
+    #获取心率 血氧 步数历史数据
+    class gethistoryDataManager(Abstract):
+        def __init__(self):
+            self.oldHr = 0
+            self.oldspo2 = 0
+            self.oldstep = 0
+            self.old_step = 0
+            self.read_histroy_hr_data = []
+            self.read_histroy_temp_data = []
+            self.read_histroy_spo2_data = []
+
+            oldHr  = EventMesh.publish("get_storage_config","old_hr")
+            if oldHr != None:
+                self.oldHr = oldHr  
+            old_spo2  = EventMesh.publish("get_storage_config","old_spo2")
+            if old_spo2 != None:
+                self.oldspo2 = old_spo2 
+            old_step  = EventMesh.publish("get_storage_config","old_step")    
+            if old_step != None:
+                self.oldstep = old_step
+
+
+            check_hr= ql_fs.path_exists("/usr/static/storage_file/history_hr.json")
+            if check_hr == True :
+                with open("/usr/static/storage_file/history_hr.json","r") as fd:#音频文件编号
+                    self.read_histroy_hr_data = ujson.load(fd)
+            
+            check_temp= ql_fs.path_exists("/usr/static/storage_file/history_temp.json")
+            if check_temp == True :
+                with open("/usr/static/storage_file/history_temp.json","r") as fd:#音频文件编号
+                    self.read_histroy_temp_data = ujson.load(fd)
+
+            check_spo2= ql_fs.path_exists("/usr/static/storage_file/history_spo2.json")
+            if check_spo2 == True :
+                with open("/usr/static/storage_file/history_spo2.json","r") as fd:#音频文件编号
+                    self.read_histroy_spo2_data = ujson.load(fd)
+            self.temp_value = 0
+            
+            # self.read_histroy_hr_data=[{"timeSec":16789890,"value":90},{"timeSec":16789888,"value":78},{"timeSec":16789688,"value":68},{"timeSec":16789898,"value":58},\
+            #                              {"timeSec":16789897,"value":88},{"timeSec":16789867,"value":77},{"timeSec":16789895,"value":70}]
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_old_hr_data", self.save_hr_value)
+            EventMesh.subscribe("get_old_hr_data", self.get_hr_value)
+            EventMesh.subscribe("set_old_spo2_data", self.save_spo2_value)
+            EventMesh.subscribe("get_old_spo2_data", self.get_spo2_value)
+
+            EventMesh.subscribe("get_old_step_value", self.get_old_step_value)
+            EventMesh.subscribe("set_old_step_value", self.set_old_step_value)
+
+
+            EventMesh.subscribe("get_history_hr_value", self.get_history_hr_value)
+            EventMesh.subscribe("set_history_hr_value", self.set_history_hr_value)
+
+            EventMesh.subscribe("get_history_temp_value", self.get_history_temp_value)
+            EventMesh.subscribe("set_history_temp_value", self.set_history_temp_value)
+
+            EventMesh.subscribe("get_history_spo2_value", self.get_history_spo2_value)
+            EventMesh.subscribe("set_history_spo2_value", self.set_history_spo2_value)
+
+        
+
+        def get_history_spo2_value(self, event, msg): #近7次血氧历史数据统计显示
+            return self.read_histroy_spo2_data
+
+        def set_history_spo2_value(self, event, msg): 
+            pass
+
+
+
+        def get_history_temp_value(self, event, msg): #近7次体温历史数据统计显示
+            return self.read_histroy_temp_data
+
+        def set_history_temp_value(self, event, msg): 
+            self.temp_value = msg
+            if self.temp_value > 0:
+                # date_tmp = utime.localtime()
+                # time_tmp = utime.mktime(date_tmp)
+                # if len(self.read_histroy_temp_data) >= 7:
+                #     sort_new = {}
+                #     sort_new = sorted(self.read_histroy_temp_data, key = lambda i: i['timeSec'],reverse = False)#按照时间戳进行排序 去掉最旧的一次数据如果满了五十条
+                #     EventMesh.debug_log(sort_new)
+                #     for i in range(len(self.read_histroy_temp_data)-1):
+                #         sort_new[i] = sort_new[i+1]#0==1 1== 2 2== 3 3==4 4==5 5==6 6==7
+                #         self.read_histroy_temp_data[i] = sort_new[i]
+                #         pass
+                #     self.read_histroy_temp_data[6] = {"timeSec": time_tmp, "temp": self.temp_value}
+                # else:
+                #     self.read_histroy_temp_data.append({"timeSec": time_tmp, "temp": self.temp_value}) 
+
+                # with open("/usr/static/storage_file/history_temp.json","w",encoding="utf-8") as fd:
+                #     ujson.dump(self.read_histroy_temp_data,fd)
+                #EventMesh.debug_log(self.read_histroy_temp_data)
+                pass
+            else:
+                pass
+
+        def get_history_hr_value(self, event, msg): #近7次心率历史数据统计显示
+            return self.read_histroy_hr_data
+
+        def set_history_hr_value(self, event, msg): 
+            pass
+                
+            
+
+        def save_hr_value(self, event, msg): 
+            if msg >= 50:
+                EventMesh.publish("set_storage_config",["old_hr",msg])
+                self.oldHr = msg
+                
+
+                date_tmp = utime.localtime()
+                time_tmp = utime.mktime(date_tmp)
+                if len(self.read_histroy_hr_data) >= 7:
+                    sort_new = {}
+                    sort_new = sorted(self.read_histroy_hr_data, key = lambda i: i['timeSec'],reverse = False)#按照时间戳进行排序 去掉最旧的一次数据如果满了五十条
+                    EventMesh.debug_log(sort_new)
+                    for i in range(len(self.read_histroy_hr_data)-1):
+                        sort_new[i] = sort_new[i+1]#0==1 1== 2 2== 3 3==4 4==5 5==6 6==7
+                        self.read_histroy_hr_data[i] = sort_new[i]
+                        pass
+                    self.read_histroy_hr_data[6] = {"timeSec": time_tmp, "hr": self.oldHr}
+                else:
+                    self.read_histroy_hr_data.append({"timeSec": time_tmp, "hr": self.oldHr}) 
+
+
+                with open("/usr/static/storage_file/history_hr.json","w",encoding="utf-8") as fd:
+                    ujson.dump(self.read_histroy_hr_data,fd)
+                pass
+            else:
+                
+                pass
+
+
+        def get_hr_value(self, event, msg): 
+            return self.oldHr
+
+        def save_spo2_value(self, event, msg): 
+            if msg >= 85:
+                # EventMesh.publish("set_storage_config",["old_spo2",msg])
+                # self.oldspo2 = msg
+
+
+                # date_tmp = utime.localtime()
+                # time_tmp = utime.mktime(date_tmp)
+                # if len(self.read_histroy_spo2_data) >= 7:
+                #     sort_new = {}
+                #     sort_new = sorted(self.read_histroy_spo2_data, key = lambda i: i['timeSec'],reverse = False)#按照时间戳进行排序 去掉最旧的一次数据如果满了五十条
+                #     EventMesh.debug_log(sort_new)
+                #     for i in range(len(self.read_histroy_spo2_data)-1):
+                #         sort_new[i] = sort_new[i+1]#0==1 1== 2 2== 3 3==4 4==5 5==6 6==7
+                #         self.read_histroy_spo2_data[i] = sort_new[i]
+                #         pass
+                #     self.read_histroy_spo2_data[6] = {"timeSec": time_tmp, "spo2": self.oldspo2}
+                # else:
+                #     self.read_histroy_spo2_data.append({"timeSec": time_tmp, "spo2": self.oldspo2}) 
+
+                # with open("/usr/static/storage_file/history_spo2.json","w",encoding="utf-8") as fd:
+                #     ujson.dump(self.read_histroy_spo2_data,fd)
+                # #EventMesh.debug_log(self.read_histroy_spo2_data)
+                #播放语音
+                # EventMesh.publish("set_hr_blood_led",2)#测量成功
+                pass
+            else:
+                pass
+                pass
+
+        def get_spo2_value(self, event, msg): 
+            return self.oldspo2
+        
+        def set_old_step_value(self, event, msg): 
+            self.oldstep = msg
+            EventMesh.publish("set_storage_config",["old_step",msg])
+            
+            
+        def get_old_step_value(self, event, msg): 
+            step = EventMesh.publish(constants.EVENT.GET_STEP)
+            self.old_step = self.oldstep + step[0]
+            return self.old_step
+    #获取旧的时间戳
+    class getOldTimeManager(Abstract):
+        # 获取天气数据
+        def __init__(self):
+            self.time_sec = 0
+            self.time_step = 0
+            self.step_second = 0
+            tmp_data = EventMesh.publish("get_storage_config","old_time")
+            if tmp_data !=None :
+                self.time_sec = tmp_data
+            tmp_data = EventMesh.publish("get_storage_config","clear_state")
+            if tmp_data !=None :
+                self.time_step = tmp_data[0]
+                self.step_second = tmp_data[1]
+
+            
+            
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("get_old_time_data", self.get_old_time_data)
+            EventMesh.subscribe("set_old_time_data", self.set_old_time_data)
+
+            EventMesh.subscribe("get_old_step_data", self.get_old_step_data)
+            EventMesh.subscribe("set_old_step_data", self.set_old_step_data)
+
+            EventMesh.subscribe("set_test_data1", self.set_test_data1)
+
+            EventMesh.subscribe("set_test_data2", self.set_test_data2)
+
+            EventMesh.subscribe("set_test_data3", self.set_test_data3)
+
+            EventMesh.subscribe("set_test_data4", self.set_test_data4)
+
+            EventMesh.subscribe("set_test_data5", self.set_test_data5)
+
+            EventMesh.subscribe("set_test_data6", self.set_test_data6)
+
+            EventMesh.subscribe("set_test_data7", self.set_test_data7)
+
+            EventMesh.subscribe("set_test_data8", self.set_test_data8)
+        
+
+        def set_test_data1(self, event, msg):
+            EventMesh.publish("set_storage_config",["clear_state1",msg])
+
+        
+        def set_test_data2(self, event, msg):
+            
+            EventMesh.publish("set_storage_config",["clear_state2",msg])
+
+
+        def set_test_data3(self, event, msg):
+            EventMesh.publish("set_storage_config",["clear_state3",msg])
+
+        def set_test_data4(self, event, msg):
+            EventMesh.publish("set_storage_config",["clear_state4",msg])
+
+        def set_test_data5(self, event, msg):
+            EventMesh.publish("set_storage_config",["clear_state5",msg])
+
+        def set_test_data6(self, event, msg):
+            EventMesh.publish("set_storage_config",["clear_state6",msg])
+
+        def set_test_data7(self, event, msg):
+            EventMesh.publish("set_storage_config",["clear_state7",msg])
+
+        def set_test_data8(self, event, msg):
+            EventMesh.publish("set_storage_config",["clear_state8",msg])
+
+        # f = open("/usr/static/storage_file/config.json",'r',encoding="utf-8")
+        # print(f.read())
+
+        def get_old_step_data(self, event, msg):
+            return [self.time_step,self.step_second]
+
+        def get_old_time_data(self, event, msg):
+            return self.time_sec
+        
+        
+
+        def set_old_time_data(self, event, msg):
+            self.time_sec = msg
+            EventMesh.publish("set_storage_config",["old_time",msg])
+
+        def set_old_step_data(self, event, msg):
+            self.time_step = msg[0]
+            self.step_second = msg[1]
+            EventMesh.publish("set_storage_config",["clear_state",msg])
+
+        def get_old_step_data(self, event, msg):
+            return [self.time_step,self.step_second]
+
+
+            
+        
+
+    class getWeatherDataManager(Abstract):
+        # 获取天气数据
+        def __init__(self):
+            self.date = {} #日期23-04-07
+            self.time = {} #14:41:41
+            self.content = {} #天气描述 
+            self.type = None #天气类型
+            self.temp = None #当前温度
+            self.min_temp = None #最低温度
+            self.max_temp = None #最高温度
+            self.city = {} #城市
+            self.no_data = 0#0沒有数据 1有数据
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("get_weather_data", self.get)
+            EventMesh.subscribe("set_weather_data", self.set)
+
+        def get(self, event, msg):
+            return [self.date,self.time,self.content,self.type,self.temp,self.min_temp,self.max_temp,self.city,self.no_data]
+
+        def set(self, event, msg):
+            self.date = msg[0]
+            self.time = msg[1]
+            self.content = msg[2]
+            self.type = msg[3]
+            self.temp = msg[4]
+            self.min_temp = msg[5]
+            self.max_temp = msg[6]
+            self.city = msg[7]
+            self.no_data = msg[8]
+
+
+    class getHrTimeManager(Abstract):
+        def __init__(self):
+            self.set_time = 0
+            self.set_hr = 0 #0关闭 1手动 2 自动测量按照时间间隔测试心率
+            self.set_spo2 = 0
+            self.open_btn = 0
+            if EventMesh.platform == "gewu":
+                self.set_time = 10*60
+                self.open_btn = 1
+            self.set_bgautotime = 0
+            self.bgauto_btn = 0
+            read_data = EventMesh.publish("get_storage_config","measure_time")
+            if read_data != None:
+                self.set_time = read_data  
+            read_data = EventMesh.publish("get_storage_config","open_hr_btn")
+                    
+            if read_data != None:
+                self.open_btn = read_data   
+
+            read_data = EventMesh.publish("get_storage_config","bgauto_time")
+            if read_data != None:
+                self.set_bgautotime = read_data  
+            read_data = EventMesh.publish("get_storage_config","bgauto_btn")
+                    
+            if read_data != None:
+                self.bgauto_btn = read_data   
+
+
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_time_hr", self.set_time_hr)
+            EventMesh.subscribe("get_time_hr", self.get_time_hr)
+            EventMesh.subscribe("set_hr_state", self.set_hr_state)
+            EventMesh.subscribe("get_hr_state", self.get_hr_state)
+            EventMesh.subscribe("set_spo2_state", self.set_spo2_state)
+            EventMesh.subscribe("get_spo2_state", self.get_spo2_state)
+
+            EventMesh.subscribe("set_bgauto_time", self.set_bgauto_time)
+            EventMesh.subscribe("get_bgauto_time", self.get_bgauto_time)
+
+        def set_bgauto_time(self, event, msg): 
+            self.bgauto_btn = msg[0]
+            self.set_bgautotime = msg[1]
+            EventMesh.publish("set_storage_config",["bgauto_btn",self.bgauto_btn])
+            EventMesh.publish("set_storage_config",["bgauto_time",self.set_bgautotime])
+
+        def get_bgauto_time(self, event, msg): 
+            if self.bgauto_btn == None:
+                self.bgauto_btn = 0
+            if self.set_bgautotime == None:
+                self.set_bgautotime = 0
+            return [self.bgauto_btn,self.set_bgautotime]
+        
+
+        def set_time_hr(self, event, msg): 
+            self.open_btn = msg[0]
+            self.set_time = msg[1]
+            EventMesh.publish("set_storage_config",["measure_time",self.set_time])
+            EventMesh.publish("set_storage_config",["open_hr_btn",self.open_btn])
+
+        def get_time_hr(self, event, msg): 
+            return [self.open_btn,self.set_time]
+
+        def set_hr_state(self, event, msg): 
+            # if msg != 0:
+            #     EventMesh.publish("set_hr_blood_led",1)#红绿灯交替闪烁
+            self.set_hr = msg
+            if self.set_hr == 0:
+                EventMesh.publish("clear_health_state")
+            
+
+        def get_hr_state(self, event, msg): 
+            return self.set_hr
+        
+        def set_spo2_state(self, event, msg): 
+            # if msg != 0:
+            #     EventMesh.publish("set_hr_blood_led",1)##红绿灯交替闪烁
+            self.set_spo2 = msg
+            if self.set_spo2 == 0:
+                EventMesh.publish("clear_health_state")
+            
+
+        def get_spo2_state(self, event, msg): 
+            return self.set_spo2
+        
+    #体温
+    class getTempTimeManager(Abstract):
+        def __init__(self):
+            self.set_time = 0
+            self.get_temp = 0
+            read_data = EventMesh.publish("get_storage_config","temp_time")
+
+            if read_data != None:
+                self.set_time = read_data
+
+            self.get_bgstate = 0
+            self.get_bpstate = 0
+
+            self.bptime_on = 0
+            self.bptime_time = 0
+            read_data=EventMesh.publish("get_storage_config","bpauto_btn")
+            if read_data != None:
+                self.bptime_on = read_data
+
+            read_data=EventMesh.publish("get_storage_config","bpauto_time")
+            if read_data != None:
+                self.bptime_time = read_data
+
+            self.spo2time_on = 0
+            self.spo2time_time = 0
+            read_data = EventMesh.publish("get_storage_config","spo2auto_btn")
+            if read_data != None:
+                self.spo2time_on = read_data
+
+            read_data = EventMesh.publish("get_storage_config","spo2auto_time")
+            if read_data != None:
+                self.spo2time_time = read_data
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_temp_time", self.set_temp_time)
+            EventMesh.subscribe("get_temp_time", self.get_temp_time)
+
+            EventMesh.subscribe("set_temp_state", self.set_temp_state)
+            EventMesh.subscribe("get_temp_state", self.get_temp_state)
+
+            EventMesh.subscribe("set_bp_time", self.set_bp_time)
+            EventMesh.subscribe("get_bp_time", self.get_bp_time)
+
+            EventMesh.subscribe("set_bp_state", self.set_bp_state)
+            EventMesh.subscribe("get_bp_state", self.get_bp_state)
+
+
+            EventMesh.subscribe("set_bg_state", self.set_bg_state)
+            EventMesh.subscribe("get_bg_state", self.get_bg_state)
+
+            EventMesh.subscribe("set_spo2_time", self.set_spo2_time)
+            EventMesh.subscribe("get_spo2_time", self.get_spo2_time)
+
+            
+        def set_bg_state(self, event, msg): 
+            self.get_bgstate = msg
+            if self.get_bgstate == 0:
+                EventMesh.publish("clear_health_state")
+            # if msg != 0:
+            #     EventMesh.publish("set_hr_blood_led",1)#红绿灯交替闪烁
+
+        def get_bg_state(self, event, msg): 
+            if self.get_bgstate:
+                return self.get_bgstate
+            else :
+                return 0
+
+        def set_spo2_time(self, event, msg): 
+            self.spo2time_on = msg[0]
+            self.spo2time_time = msg[1]
+            EventMesh.publish("set_storage_config",["spo2auto_btn",self.spo2time_on])
+            EventMesh.publish("set_storage_config",["spo2auto_time",self.spo2time_time])
+
+
+        def get_spo2_time(self, event, msg): 
+            
+            return [self.spo2time_on,self.spo2time_time]
+
+
+        def set_bp_time(self, event, msg): 
+            self.bptime_on = msg[0]
+            self.bptime_time = msg[1]
+            EventMesh.publish("set_storage_config",["bpauto_btn",self.bptime_on])
+            EventMesh.publish("set_storage_config",["bpauto_time",self.bptime_time])
+
+        def get_bp_time(self, event, msg): 
+            if self.bptime_on == None:
+                self.bptime_on = 0
+            if self.bptime_time == None:
+                self.bptime_time = 0
+            return [self.bptime_on,self.bptime_time]
+        
+            
+        def set_bp_state(self, event, msg): 
+            self.get_bpstate = msg
+            if self.get_bpstate == 0:
+                EventMesh.publish("clear_health_state")
+            # if msg != 0:
+                # EventMesh.publish("set_hr_blood_led",1)#红绿灯交替闪烁
+
+        def get_bp_state(self, event, msg): 
+            if self.get_bpstate:
+                return self.get_bpstate
+            else :
+                return 0
+
+
+        def set_temp_time(self, event, msg): 
+            self.set_time = msg
+            EventMesh.publish("set_storage_config",["temp_time",self.set_time])
+
+        def get_temp_time(self, event, msg): 
+            return self.set_time
+        
+        def set_temp_state(self, event, msg): 
+            self.get_temp = msg
+            if self.get_temp == 0:
+                EventMesh.publish("clear_temp_state")
+            # if msg != 0:
+            #     EventMesh.publish("set_hr_blood_led",1)#红绿灯交替闪烁
+
+        def get_temp_state(self, event, msg): 
+            return self.get_temp
+            
+    class getBrightnessManager(Abstract):#获取亮度级别
+        def __init__(self):
+            self.level = 6#默认值6
+            # self.read_data = {}
+            self.time = 5
+            self.PWM_backlight  = None
+
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("get_brightness_level", self.get_brightness_level)
+            EventMesh.subscribe("push_add_brightness_level", self.add)
+            EventMesh.subscribe("push_reduce_brightness_level", self.reduce)
+            EventMesh.subscribe("set_brightness_level", self.set_brightness_level)
+
+            EventMesh.subscribe("set_brightness_time", self.set_brightness_time)
+            EventMesh.subscribe("get_brightness_time", self.get_brightness_time)
+
+        def set_brightness_level(self, event, msg): 
+            self.level = msg
+            EventMesh.publish("set_storage_config", ["brightness_level",self.level])
+
+        def get_brightness_level(self, event, msg): 
+            tmp = EventMesh.publish("get_storage_config","brightness_level")
+            if tmp != None:
+                self.level = tmp
+            return self.level
+        
+        def set_brightness_time(self, event, msg): 
+            self.time = msg
+            EventMesh.publish("set_storage_config", ["brightness_time",self.time])
+        
+        def get_brightness_time(self, event, msg): 
+            tmp = EventMesh.publish("get_storage_config","brightness_time")
+            if tmp != None:
+                self.time = tmp
+            return self.time
+        
+
+
+        def add(self, event, msg):
+            if self.level < 10:
+                self.level = self.level + 2
+            # self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS, self.level, 10)
+            # self.PWM_backlight.open()
+            EventMesh.publish("set_storage_config", ["brightness_level",self.level])
+
+
+        def reduce(self, event, msg):
+            # if self.level > 0:
+            #     self.level = self.level - 2
+            # if self.level <= 0:
+            #     self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS, 1, 10)
+            # else:
+            #     self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS,self.level, 10)
+
+            # self.PWM_backlight.open()
+            EventMesh.publish("set_storage_config", ["brightness_level",self.level])
+        
+        
+    class getStorageDataManager(Abstract):#获取内存数据
+        def __init__(self):
+            self.config_data = {}
+            check = ql_fs.path_exists("/usr/static/storage_file/config.json")
+            if check == True:
+                with open("/usr/static/storage_file/config.json","r") as fd:
+                    self.config_data = ujson.load(fd)
+            else :
+                self.config_data = {'old_time': 0, 'flip_sw': 0}
+                pass
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_storage_data", self.set_storage_data)
+            EventMesh.subscribe("set_storage_config", self.set_storage_config)
+            EventMesh.subscribe("get_storage_data", self.get_storage_data)
+            EventMesh.subscribe("get_storage_config", self.get_storage_config)
+
+        def set_storage_data(self, event, msg): 
+            # EventMesh.debug_log("set_storage_data:{}".format(msg))
+            if msg != None:
+                self.config_data = msg
+                with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:
+                    ujson.dump(self.config_data,fd)
+        
+
+        def set_storage_config(self,event,msg): 
+            # EventMesh.debug_log("set_storage_key_data1:{}".format(msg))
+            if len(msg) >= 2:
+                self.config_data[msg[0]]=msg[1]
+                # EventMesh.debug_log("set_storage_key_data2:{}".format(self.config_data[msg[0]]))
+                EventMesh.publish("publish_message_event_ui",{"func":self.set_storage_save,"data":0})
+        def set_storage_save(self, data): 
+            with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:
+                ujson.dump(self.config_data,fd)
+        def get_storage_data(self, event, msg): 
+            # EventMesh.debug_log("get_storage_data:{}".format(self.config_data))
+            return self.config_data 
+        def get_storage_config(self,event,msg):
+            # EventMesh.debug_log("get_storage_key_data1:{}".format(msg))
+            b = msg in self.config_data.keys()
+            if b == True:
+                # EventMesh.debug_log("get_storage_key_data2:{}".format(self.config_data[msg]))
+                return self.config_data[msg]
+            else :
+                return None
+            # try:
+            #     return self.config_data[msg]
+            # except:
+            #     EventMesh.debug_log("get_storage_key_data:none key:{}",msg)
+            #     return None
+    #定位频率
+    class getUpLoadDataManager(Abstract):#
+        def __init__(self):
+            self.upload_time = 2*60*60
+            if EventMesh.platform == "gewu":
+                self.upload_time = 10*60
+
+            read_data = EventMesh.publish("get_storage_config","upload_time")
+            if read_data != None:
+                self.upload_time = read_data 
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_upload_data", self.set_upload_data)
+            EventMesh.subscribe("get_upload_data", self.get_upload_data)
+
+        def set_upload_data(self, event, msg): 
+            self.upload_time = msg
+
+        def get_upload_data(self, event, msg): 
+            if self.upload_time == None:
+                if EventMesh.platform == "gewu":
+                    self.upload_time = 10*60
+                else:
+                    self.upload_time = 2*60*60
+            return self.upload_time 
+
+    class getplayAudiodStateManager(Abstract):#获取设置播放音频状态
+        def __init__(self):
+            self.play = 0
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_audio_state", self.set_audio_state)
+            EventMesh.subscribe("get_audio_state", self.get_audio_state)
+
+        def set_audio_state(self, event, msg): 
+            self.play = msg
+
+        def get_audio_state(self, event, msg): 
+            return self.play
+        
+    class getVolumSizeManager(Abstract):#设置或获取音量大小数据
+        def __init__(self):
+            self.volume_size = 8
+            read_data = EventMesh.publish("get_storage_config","volum")
+            if read_data != None:
+                self.volume_size = read_data
+        
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_volum_size", self.set_volum_size)
+            EventMesh.subscribe("get_volum_size", self.get_volum_size)
+
+        def set_volum_size(self, event, msg): 
+            self.volume_size = msg
+            EventMesh.publish("set_storage_config", ["volum",self.volume_size])
+
+        def get_volum_size(self, event, msg): 
+            return self.volume_size
+
+    class getSosFlagManager(Abstract):#设置sos
+        def __init__(self):
+            self.aud = audio.Audio(0)
+            self.sos_flag = 0
+            self.sos_num = 0
+            self.hangup_mode = 0
+            self.call_timer = osTimer()
+            self.sos_numer1 = []
+            self.callnumer =""
+            SOS_NUMBER1 = EventMesh.publish("get_storage_config","SOS_NUMBER1")
+            if SOS_NUMBER1 != None:
+                self.sos_numer1 = SOS_NUMBER1
+            SOS_NUMBER2 = EventMesh.publish("get_storage_config","SOS_NUMBER2")
+            if SOS_NUMBER2 != None:        
+                self.sos_numer1 = [SOS_NUMBER1, SOS_NUMBER2]
+
+            SOS_NUMBER3 = EventMesh.publish("get_storage_config","SOS_NUMBER3")
+            if SOS_NUMBER3 != None:        
+                self.sos_numer1 = [SOS_NUMBER1, SOS_NUMBER2,SOS_NUMBER3]
+
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_sos_flag", self.set_sos_flag)#设置sos拨打标识
+            EventMesh.subscribe("get_sos_flag", self.get_sos_flag)
+
+            EventMesh.subscribe("set_sos_num", self.set_sos_num)#设置拨打循环次数
+            EventMesh.subscribe("get_sos_num", self.get_sos_num)
+
+            EventMesh.subscribe("set_dial_sos_number", self.set_dial_sos_number)
+            EventMesh.subscribe("get_dial_sos_number", self.get_dial_sos_number)#设置家庭号码三个
+
+            EventMesh.subscribe("set_callnumer_cb", self.set_callnumer_cb)#延时回调
+
+            EventMesh.subscribe("close_call_time",self.close_call_time)
+
+            EventMesh.subscribe("set_hangup_mode", self.set_hangup_mode)
+            EventMesh.subscribe("get_hangup_mode", self.get_hangup_mode)#获取挂断方式 是对方挂断 还是手表按键主动挂断
+
+        def get_hangup_mode(self, event, msg): # 1是设备端手表主动挂断 0是手机端
+            return self.hangup_mode
+        
+        def set_hangup_mode(self, event, msg): 
+            self.hangup_mode = msg
+
+        def set_sos_flag(self, event, msg): 
+            self.sos_flag = msg
+        
+            if self.sos_flag == 1:
+                number = EventMesh.publish("get_dial_sos_number")
+            
+                if number != None:
+                    if len(number) > 0:
+                        self.call_timer.stop()
+                        EventMesh.publish("save_phonename",number[0])
+                        EventMesh.publish("save_phonenum",number[0])
+                        EventMesh.publish("set_sos_num",0)
+                        phone_num = EventMesh.publish("get_phonenum")  
+                        EventMesh.publish("sos_out_call_center_cb",phone_num)#电话拨出去
+                    else:
+                        EventMesh.publish("sos_out_call_center_cb",None)#电话拨出去
+
+        def set_callnumer_cb(self, event, msg):
+            if self.sos_flag == 1:
+                self.callnumer = msg
+                self.call_timer.start(5000, 0, self.call_timer_cb)#延迟10S 继续拨打
+
+        def call_timer_cb(self, *args, **kwargs):
+            if self.sos_flag == 1:
+                EventMesh.publish("save_phonename",str(self.callnumer))
+                EventMesh.publish("save_phonenum",str(self.callnumer))
+                phone_num = EventMesh.publish("get_phonenum")  
+                EventMesh.publish("sos_out_call_center_cb",phone_num)#电话拨出去
+        
+        def close_call_time(self, event, msg): 
+            self.call_timer.stop()
+
+        def get_sos_flag(self, event, msg): 
+            return self.sos_flag
+        
+        def set_sos_num(self, event, msg): 
+            self.sos_num = msg
+
+        def get_sos_num(self, event, msg): 
+            return self.sos_num
+        
+        def set_dial_sos_number(self, event, msg): 
+            self.sos_numer1 = msg
+            
+
+        def get_dial_sos_number(self, event, msg): 
+            return self.sos_numer1
+    class getLowBatManager(Abstract):#低电提醒
+        def __init__(self):
+
+            self.low_btn = 0
+            read_data = EventMesh.publish("get_storage_config","low_on")
+            if read_data != None:
+                self.low_btn = read_data
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_low_bat_btn", self.set_low_bat_btn)#
+            EventMesh.subscribe("get_low_bat_btn", self.get_low_bat_btn)
+
+        def set_low_bat_btn(self, event, msg): 
+            self.low_btn = msg
+            EventMesh.publish("set_storage_config",["low_on",self.low_btn])
+
+        def get_low_bat_btn(self, event, msg): 
+            return self.low_btn
+        
+
+
+    class playPowerAudioManager(Abstract):#播放开关机音频文件
+        def __init__(self):
+            self.aud = audio.Audio(0)
+
+        def post_processor_after_instantiation(self):
+            
+            EventMesh.subscribe("play_poewr_on_event", self.play_poewr_on_event)#
+            EventMesh.subscribe("play_poewr_off_event", self.play_poewr_off_event)
+
+        def play_poewr_on_event(self, event, msg): 
+            self.aud.play(1, 1, 'U:/static/R_POWER_1.mp3')  #播放播放开机铃声
+
+        def play_poewr_off_event(self, event, msg): 
+            self.aud.setVolume(11)
+            self.aud.play(1, 1, 'U:/static/R_POWER_OFF_1.mp3')  #播放关机铃声
+        
+    class getBootOffManager(Abstract):#开关机时间
+        def __init__(self):
+            self.poweroff_time = []
+            read_data = EventMesh.publish("get_storage_config","poweroff_alarm")
+            if read_data != None:
+                self.poweroff_time = read_data
+            else:
+                self.poweroff_time = [{"poweroff_on":0,"start_hour":6,"start_min":0,"end_hour":0,"end_min":0}]
+            
+
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_boot_off_time", self.set_boot_off_time)#设置关机时间
+            EventMesh.subscribe("get_boot_off_time", self.get_boot_off_time)
+
+        def set_boot_off_time(self, event, msg): 
+            EventMesh.debug_log("set_boot_off_time",msg)
+
+            EventMesh.publish("set_storage_config",["poweroff_alarm",msg])
+            self.poweroff_time = msg
+            EventMesh.publish("set_rtc_alarm")
+
+
+        def get_boot_off_time(self, event, msg):
+            return self.poweroff_time
+    class setSmsIndexManager(Abstract):#
+        def __init__(self):
+            self.index = -1
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_sms_index", self.set_sms_index)#设置关机时间
+            EventMesh.subscribe("get_sms_index", self.get_sms_index)
+
+        def set_sms_index(self, event, msg): 
+            self.index = msg
+            
+
+        def get_sms_index(self, event, msg):
+            
+            return self.index
+    import protocol 
+    class testSmsSetIPManager(Abstract):#
+        def __init__(self):
+            self.timer = osTimer()
+            #大锤
+            severdata = protocol.server_init()
+
+            self.newip = severdata[0]
+            self.newcom = severdata[1]
+            self.new_key = severdata[2]
+            self.new_pid = severdata[3]
+            
+            EventMesh.debug_log("testSmsSetIPManager:{}\n".format(severdata))
+
+            self.server_sate = 0
+
+
+
+            tmp_data = EventMesh.publish("get_storage_config","set_new_ip_addr")
+            if tmp_data != None:
+                self.newip = tmp_data
+            tmp_data = EventMesh.publish("get_storage_config","set_new_com")
+            if tmp_data != None:
+                self.newcom = tmp_data
+            tmp_data = EventMesh.publish("get_storage_config","set_new_md5")
+            if tmp_data != None:
+                self.newmd5 = tmp_data    
+
+            tmp_data = EventMesh.publish("get_storage_config","set_new_key")
+            if tmp_data != None:
+                self.new_key = tmp_data 
+
+            tmp_data = EventMesh.publish("get_storage_config","set_new_pid")
+            if tmp_data != None:
+                self.new_pid = tmp_data 
+
+            tmp_data = EventMesh.publish("get_storage_config","get_server_sate")
+            if tmp_data != None:
+                self.server_sate = tmp_data 
+            
+            
+
+
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_new_ip_com", self.set_new_ip_com)#设置关机时间
+            EventMesh.subscribe("get_new_ip_com", self.get_new_ip_com)
+
+            EventMesh.subscribe("set_ip", self.set_ip)#设置关机时间
+            EventMesh.subscribe("get_ip", self.get_ip)
+
+            EventMesh.subscribe("set_com", self.set_com)#设置关机时间
+            EventMesh.subscribe("get_com", self.get_com)
+
+            EventMesh.subscribe("get_new_key", self.get_new_key_cb)#获取key
+            EventMesh.subscribe("set_new_key", self.set_new_key_cb)#获取key
+
+            EventMesh.subscribe("set_new_pid", self.set_new_pid_cb)#获取pid
+            EventMesh.subscribe("get_new_pid", self.get_new_pid_cb)#获取pid
+
+            EventMesh.subscribe("set_server_state", self.set_server_state)#
+            EventMesh.subscribe("get_server_state", self.get_server_state)#
+
+            EventMesh.subscribe("get_new_key_pid", self.get_new_key_pid)#
+
+
+
+        def set_new_key_cb(self, event, msg): 
+            self.new_key = msg
+            # print("set_new_key_cb",msg,self.new_key)
+            EventMesh.publish("set_storage_config",["set_new_key",self.new_key])
+
+        def get_new_key_cb(self, event, msg):
+            # print("get_new_key_cb",self.new_key)
+            return self.new_key
+        
+        def set_new_pid_cb(self, event, msg): 
+            self.new_pid = msg
+            # print("set_new_pid_cb",msg,self.new_pid)
+            EventMesh.publish("set_storage_config",["set_new_pid",self.new_pid])
+
+        def get_new_pid_cb(self, event, msg):
+            # print("get_new_pid_cb",self.new_pid)
+            return self.new_pid
+
+        def set_new_ip_com(self, event, msg): 
+            self.newip = str(msg[0])
+            self.newcom = int(msg[1])
+            # self.newmd5 = str(msg[2])
+            #短信格式:SETIP:api.xcloudtech.com:9000:bZld0ALsZTt15tKEZhOlLPgbsO75BLTP 以冒号分隔 SETIP:ip地址:ip端口号:ip密钥key
+
+            # self.read_data["set_new_md5"] = self.newmd5  #通过短信设置ip的key密钥
+        
+
+            EventMesh.publish("set_storage_config",["set_new_ip_addr",self.newip])
+            EventMesh.publish("set_storage_config",["set_new_com",self.newcom])
+
+
+            number = str(msg[2])
+            sms.sendPduMsg(number, 'set ok', 'UCS2')
+            self.timer.start(10*1000,0,self.fun)
+            
+        def fun(self,*argc):
+            Power.powerRestart()
+
+        def get_new_ip_com(self, event, msg):
+            tmp_addr = EventMesh.publish("get_storage_config","set_new_ip_addr")
+            tmp_com = EventMesh.publish("get_storage_config","set_new_com")
+            if tmp_addr != None:
+                self.newip = tmp_addr
+            if tmp_com != None:
+                self.newcom = tmp_com
+            return [self.newip,self.newcom]
+        
+        def set_ip(self, event, msg): 
+            self.newip = msg
+            EventMesh.publish("set_storage_config",["set_new_ip_addr",self.newip])
+
+        def get_ip(self, event, msg):
+            # print("get_ip",self.newip)
+            return self.newip
+        
+        def set_com(self, event, msg): 
+            self.newcom = msg
+            EventMesh.publish("set_storage_config",["set_new_com",self.newcom])
+
+        def get_com(self, event, msg):
+            # print("get_com",self.newcom)
+            return self.newcom
+
+        def get_new_key_pid(self, event, msg):
+            return [self.new_key,self.new_pid]
+        
+        def set_server_state(self, event, msg):
+            EventMesh.publish("set_storage_config",["get_server_sate",msg])
+            self.server_sate = msg
+
+        def get_server_state(self, event, msg):
+            return self.server_sate
+            
+
+    # MMI Version:UIX8910_C55_DS_D12G_PRO18_FZD_V1.0_Release
+    # Build:07-07-2022 16:12:58
+    # IMEI:861218001025267
+    # IP:api.xcloudtech.com
+    # PORT:9000
+    # UPLOAD:300
+    # Battery:3948, 64
+    # Udebug: 0
+    # ConnectTime: 7
+    import protocol
+
+    class sendDevinfoManager(Abstract):#发送设备信息
+        def __init__(self):
+            self.timer = osTimer()
+            pass
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("send_devinfo_event", self.send_devinfo_event)#删除短信
+
+        def send_devinfo_event(self, event, msg): 
+            number = str(msg)
+            versions = EventMesh.softversion
+            Build = EventMesh.builTime
+            IMEI = EventMesh.publish(constants.EVENT.GET_IMEI)
+            IP = ""
+            new_ip = EventMesh.publish("get_storage_config","set_new_ip_addr")
+            new_com = EventMesh.publish("get_storage_config","set_new_com")
+            server_data = protocol.server_init()
+        
+            if new_ip != None:
+                if len(str(new_ip)) != 0:
+                    IP = new_ip
+                else:
+                    IP = server_data[0]
+            else:
+                IP = server_data[0]
+            
+            PORT = ''
+            if new_com != None:
+                if len(str(new_com)) != 0:
+                    PORT = str(new_com)
+                else:
+                    PORT = str(server_data[1])
+            else:
+                PORT = str(server_data[1])
+            
+            UPLOAD = EventMesh.publish("get_upload_data")
+
+            level = EventMesh.publish("get_curr_battery_level")
+            if level == None:
+                level = 4200
+            bat = EventMesh.publish("screen_get_battery")[1]
+            if bat == None:
+                bat = 100
+            Battery = str(level) +',' +  str(bat)
+
+            ConnectTime = 0
+            
+            if EventMesh.platform == "gewu":
+                ConnectTime = gheartbeat_time//60
+            else:
+                ConnectTime = heartbeat_time//60
+            data1 = "Version:{}\nBuild:{}".format(versions,Build)
+
+            data2 = "IMEI:{}\nIP:{}\nPORT:{}".format(IMEI,IP,PORT)
+            
+            data3 = "UPLOAD:{}\nBattery:{}\nConnectTime:{}".format(UPLOAD,Battery,ConnectTime)
+
+            send_state1 = -1
+            send_state2 = -1
+            # print("data",data1,data2,data3)
+            send_state1 = sms.sendPduMsg(number, data1, 'UCS2')
+
+            if send_state1 == 0:
+                send_state2 = sms.sendPduMsg(number, data2, 'UCS2')
+
+            if send_state2 == 0:
+                sms.sendPduMsg(number, data3, 'UCS2')
+            
+
+    class deleteSmsManager(Abstract):#删除信息
+        def __init__(self):
+            self.timer = osTimer()
+            pass
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("delete_sms_event", self.delete_sms_event)#删除短信
+            EventMesh.subscribe("remove_all_sms_cb", self.remove_all_sms_cb)#
+
+        def delete_sms_event(self, event, msg): 
+            self.timer.start(4*1000,0,self.fun)
+            
+        def fun(self, *argc): 
+            EventMesh.publish_async("remove_all_sms_cb","",1*1024)
+
+        def remove_all_sms_cb(self, event, msg):
+            sms.deleteMsg(1,4)
+
+    #闹钟信息
+    alarm_list = [{'hour': 6, 'repeart': 10, 'idx': 0, 'enabled': 1, 'days': [0,1,2,3,4,5,6], 'minute': 0},
+                {'hour': 0, 'repeart': 10, 'idx': 1, 'enabled': 1, 'days': [0,1,2,3,4,5,6], 'minute': 0}]
+    #用于显示闹钟列表不包含开关机信息
+
+    class ClockManager(Abstract):
+        def __init__(self):
+            super().__init__()
+            self.rtc = RTC()
+            self.days = 0
+            self.idx = 0
+
+            IFEXIST = ql_fs.path_exists("/usr/static/storage_file/alarm_msg.json") 
+            self.check_alarm_list = []     
+            if IFEXIST == True:
+                with open("/usr/static/storage_file/alarm_msg.json","r",encoding='utf-8') as fd:
+                    self.check_alarm_list = ujson.load(fd)
+            
+            EventMesh.subscribe("push_clock_info", self.set)
+            EventMesh.subscribe("read_alarminjson", self.read_alarminjson)
+            EventMesh.subscribe("add_alarm", self.add_alarm)
+            EventMesh.subscribe("remove_alarm", self.remove_alarm)
+            EventMesh.subscribe("set_rtc_alarm", self.set_rtc_alarm)
+            EventMesh.subscribe("get_alarm_indx", self.get_alarm_indx)
+            EventMesh.subscribe("get_check_alarm_list", self.get_check_alarm_list)
+            EventMesh.subscribe("push_update_alarm_show", self.update_show_info)
+
+        def post_processor_after_instantiation(self):
+        
+            EventMesh.publish("read_alarminjson")
+            # EventMesh.publish("set_rtc_alarm")
+        
+        def update_show_info(self,event,msg):
+            EventMesh.publish("read_alarminjson")
+            # EventMesh.publish("set_rtc_alarm")
+
+        def get_check_alarm_list(self, event, msg):
+            alarm_len = 0
+            global alarm_list
+            EventMesh.publish("read_alarminjson")
+            alarm_len = len(alarm_list)
+            return alarm_len
+
+
+        def set(self, event, msg):
+            global alarm_list
+            EventMesh.debug_log("msg = {}".format(msg))
+            idx = msg.get("idx")
+            EventMesh.debug_log("修改第{}个闹钟信息{}".format(idx,alarm_list[idx]))
+            alarm_list[idx]["hour"] = msg["hour"]
+            alarm_list[idx]["minute"] = msg["minute"]
+            alarm_list[idx]["days"] = msg["days"]
+            alarm_list[idx]["enabled"] = msg["enabled"]
+            alarm_list[idx]["repeart"] = msg["repeart"]
+            with open("/usr/static/storage_file/alarm_msg.json", 'w+',encoding='utf-8') as fd:
+                ujson.dump(alarm_list,fd)
+
+        def read_alarminjson(self, event, msg):
+            IFEXIST = ql_fs.path_exists("/usr/static/storage_file/alarm_msg.json") 
+            global alarm_list     
+            EventMesh.debug_log("IFEXIST:{}".format(IFEXIST))
+            if IFEXIST == True:
+                with open("/usr/static/storage_file/alarm_msg.json","r",encoding='utf-8') as fd:
+                    alarm_list = ujson.load(fd)
+
+            
+            # read_data = EventMesh.publish("get_storage_config","off_on")
+
+            hour1 = str(alarm_list[0]["hour"])+':'+str(alarm_list[0]["minute"])
+            # min1 = str(alarm_list[0]["minute"])
+
+            hour2 = str(alarm_list[1]["hour"])+':'+str(alarm_list[1]["minute"])
+            # min2 = str(alarm_list[1]["minute"]) 
+            # EventMesh.publish("set_boot_off_time",[1,hour1,hour2])
+
+            EventMesh.debug_log("hour1:{}-{}".format(hour1,hour2))
+
+            
+            return alarm_list
+
+        def add_alarm(self, event, msg):
+
+            global alarm_list
+            EventMesh.publish("read_alarminjson")
+            EventMesh.debug_log("msg:{}".format(msg))
+            for i in range(0,2):#开关机固定是 idx 0 1
+                off_msg1 = msg[i+1]
+                msg_tmp1 = off_msg1.split(':')
+                start_hour = int(msg_tmp1[0])
+                start_min = int(msg_tmp1[1])
+                enable = int(msg[0])
+                EventMesh.debug_log("start_hour:{} start_min:{} enable:{}",start_hour,start_min,enable)
+                # EventMesh.publish("set_boot_off_time",[msg[0],msg[1],msg[2]])
+
+                alarm_list[i]["idx"]=i
+                alarm_list[i]["hour"]=start_hour
+                alarm_list[i]["minute"]=start_min
+                alarm_list[i]["days"]=[0,1,2,3,4,5,6]
+                alarm_list[i]["enabled"]=enable
+                alarm_list[i]["repeart"]=10
+
+
+                # alarm_list.append({"idx": i, "hour": start_hour, "minute": start_min, "days":[0,1,2,3,4,5,6], "enabled": enable,"repeart":10})
+
+            
+            # EventMesh.debug_log("alarm_list----len- :{} alarm_list:{}".format(len(alarm_list),alarm_list))
+            with open("/usr/static/storage_file/alarm_msg.json", 'w+',encoding='utf-8') as fd:
+                ujson.dump(alarm_list,fd)
+            EventMesh.publish("push_update_alarm_show")
+            
+        
+                
+            
+
+
+        def remove_alarm(self, event, msg):
+            global alarm_list
+            EventMesh.debug_log("ddddddddddddddddddd:",msg)
+            idx = msg.get("idx")
+            EventMesh.debug_log("delete_here1-----{},{}:".format(idx,msg))
+
+            for i, alarm in enumerate(alarm_list):
+                EventMesh.debug_log("delete_here2-----{},{}:".format(i,alarm))
+
+                if alarm["idx"] == idx:
+                    del alarm_list[i]
+                    EventMesh.debug_log("delete_here3-----",alarm_list)
+
+                    #删除闹钟后,对idx重新排序
+                    if alarm_list:
+                        for j in range(i,len(alarm_list)):
+                            alarm_list[j]["idx"] -= 1
+                            EventMesh.debug_log("delete_here4-----",alarm_list)
+
+            with open("/usr/static/storage_file/alarm_msg.json", 'w+',encoding='utf-8') as fd:
+                ujson.dump(alarm_list,fd)
+
+
+        def get_alarm_indx(self,event,msg):
+            return self.idx
+
+        def _rtc_callback(self,args):
+            #设置下一个闹钟,定时开关机功能
+            msg_data = EventMesh.publish("get_boot_off_time")
+            if msg_data != None:
+                power_offdata = msg_data[0]
+                start_hour = int(power_offdata["start_hour"])
+                start_min = int(power_offdata["start_min"])
+                end_hour = int(power_offdata["end_hour"])
+                end_min = int(power_offdata["end_min"])
+                off_on = int(power_offdata["poweroff_on"])
+
+                rtc_now_time = self.rtc.datetime()
+                current_minute = rtc_now_time[4]*60 + rtc_now_time[5]
+                end_min_total = end_hour*60+end_min
+                next_minute = start_hour*60+start_min #10:11
+                EventMesh.debug_log("off_on:{} {} {}".format(off_on,current_minute,next_minute))
+                if off_on != None:
+                    if off_on == 1:
+                        if end_min_total == current_minute:#结束的时间分钟等于关机时间分钟数则关机
+                            ubs_state = EventMesh.publish("get_usb")#'
+                            
+                            if ubs_state == 2 or ubs_state == 0:
+
+                                if next_minute > current_minute:#开机时间大于当前时间 9:00 > = 8:00 
+                                    interval_minute = next_minute - current_minute
+                                    
+                                    EventMesh.debug_log("开机距离下一次响铃的的分钟数:", interval_minute,next_minute)
+                                else:#8:00 9:00
+                                    #7*60*24 7天一个周期 7*60*24 - 
+                                    interval_minute = next_minute + (24*60-current_minute)
+                                    EventMesh.debug_log("开机08888距离下一次响铃的的分钟数:", interval_minute,next_minute)
+
+                                #反向获取时间戳
+                                time = utime.localtime()
+                                EventMesh.debug_log("开机9获取utime的时间戳:", time)
+                                rtc_mktime = utime.mktime(time)-time[5]
+                                EventMesh.debug_log("开机10反向获取utime的mktime:", rtc_mktime)
+
+                                #加上下一次响铃需要的时间
+                                next_alarm_mktime = rtc_mktime + interval_minute*60 #转换成s单位 时间戳
+                                EventMesh.debug_log("开机11下一次响铃的mktime:", next_alarm_mktime)
+
+                                #格式化时间戳,得到下一次闹钟的时间
+                                next_alarm_time = utime.localtime(next_alarm_mktime)
+                                EventMesh.debug_log("开机12下一次响铃的准确时间:", next_alarm_time)
+                                #将时间转换为rtc的格式
+                                data_l = [2021, 7, 9, 5, 12, 30, 0, 0]
+                                #给rtc时间赋值
+                                data_l[0] = next_alarm_time[0] #year
+                                data_l[1] = next_alarm_time[1] #month                    
+                                data_l[2] = next_alarm_time[2] #day                     
+                                data_l[4] = next_alarm_time[3] #hour               
+                                data_l[5] = next_alarm_time[4] #minute   
+                                data_e=tuple(data_l)
+                                EventMesh.debug_log("开机13将该时间转换为RTC元组:", data_e)
+                                
+                                self.rtc.register_callback(self._rtc_callback)
+
+                                FLAG = self.rtc.set_alarm(data_e)
+                                if FLAG == 0:
+                                    EventMesh.debug_log("开机11成功设置rtc的到期时间:", data_e)
+                                else:
+                                    EventMesh.debug_log("开机时设置rtc的到期时间失败:", data_e)
+                                self.rtc.enable_alarm(1)
+                                
+                                EventMesh.debug_log("结束时设置rtc的到期时间失败:", data_e)
+                                EventMesh.publish("open_power_on", 5)#静音关机
+                                return
+                            else:
+                                EventMesh.publish("set_rtc_alarm")
+                                #self.rtc.datetime([2023, 12, 1, 5, 5, 59, 30, 0])
+                                return
+                
+            EventMesh.publish("set_rtc_alarm")
+
+
+        def set_rtc_alarm(self,event,msg):
+            msg_data = EventMesh.publish("get_boot_off_time")
+            if msg_data != None:
+                power_offdata = msg_data[0]
+                start_hour = int(power_offdata["start_hour"])
+                start_min = int(power_offdata["start_min"])
+                end_hour = int(power_offdata["end_hour"])
+                end_min = int(power_offdata["end_min"])
+                off_on = int(power_offdata["poweroff_on"])
+                if off_on == 1:
+                    next_minute = start_hour*60+start_min #10:11
+
+                    start_total = start_hour*60+start_min #10:11
+                    end_total = end_hour*60+end_min #10:11
+                    rtc_now_time = self.rtc.datetime()
+                    current_minute = rtc_now_time[4]*60 + rtc_now_time[5]#当前时间
+
+
+                    minute_list = []
+                    if start_total != current_minute:
+                        minute_list.append(start_total)#23*60=
+                    if end_total != current_minute:
+                        minute_list.append(end_total)
+                    minute_list.append(current_minute)#[927,927,930]
+                    minute_list = sorted(minute_list)
+                    current_index = minute_list.index(current_minute)
+                    print("minute_list",minute_list,start_total,end_total,current_index,power_offdata)
+                    
+                    
+                    next_index = current_index + 1
+                    if next_index >= len(minute_list):
+                        next_minute = minute_list[0]
+                        print("07下一个闹钟的分钟数:", next_minute)
+                    else:
+                        next_minute = minute_list[next_index]
+                        print("08下一个闹钟的分钟数:", next_minute)
+
+                    print("minute_list1",minute_list,current_index,next_minute)
+                    if next_minute > current_minute:
+                        interval_minute = next_minute - current_minute
+                        print("09距离下一次响铃的的分钟数:", interval_minute)#14 31 14 29 14 31 24*60-
+                    else:
+                        interval_minute = (24*60 - current_minute) + next_minute
+                        print("10距离下一次响铃的的分钟数:", interval_minute)
+
+
+                    #反向获取时间戳
+                    time = utime.localtime()
+                    EventMesh.debug_log("关机09获取utime的时间戳:", time)
+                    time
+                    rtc_mktime = utime.mktime(time)-time[5]
+                    EventMesh.debug_log("关机10反向获取utime的mktime:", rtc_mktime)
+
+                    #加上下一次响铃需要的时间
+                    next_alarm_mktime = rtc_mktime + interval_minute*60 #转换成s单位 时间戳
+                    EventMesh.debug_log("关机11下一次响铃的mktime:", next_alarm_mktime)
+
+                    #格式化时间戳,得到下一次闹钟的时间
+                    next_alarm_time = utime.localtime(next_alarm_mktime)
+                    EventMesh.debug_log("关机12下一次响铃的准确时间:", next_alarm_time)
+                    #将时间转换为rtc的格式
+                    data_l = [2021, 7, 9, 5, 12, 30, 0, 0]
+                    #给rtc时间赋值
+                    data_l[0] = next_alarm_time[0] #year
+                    data_l[1] = next_alarm_time[1] #month                    
+                    data_l[2] = next_alarm_time[2] #day                     
+                    data_l[4] = next_alarm_time[3] #hour               
+                    data_l[5] = next_alarm_time[4] #minute   
+                    data_e=tuple(data_l)
+                    EventMesh.debug_log("关机13将该时间转换为RTC元组:", data_e)
+                    
+                    self.rtc.register_callback(self._rtc_callback)
+
+                    FLAG = self.rtc.set_alarm(data_e)
+                    if FLAG == 0:
+                        EventMesh.debug_log("关机11成功设置rtc的到期时间:", data_e)
+                    else:
+                        EventMesh.debug_log("关机时设置rtc的到期时间失败:", data_e)
+                    self.rtc.enable_alarm(1)
+                else:
+                    self.rtc.enable_alarm(0)
+                    
+
+    class schoolclassManager(Abstract):#
+        def __init__(self):
+            # ['火星情报局', '一年级二班', '柠檬茶']
+            self.school_name = ''
+            self.class_name = ''
+            self.full_name = ''
+            tmp_data = EventMesh.publish("get_storage_config","school_name")
+            if tmp_data != None:
+                self.school_name = tmp_data
+            tmp_data = EventMesh.publish("get_storage_config","class_name")
+            if tmp_data != None:
+                self.class_name = tmp_data
+            tmp_data = EventMesh.publish("get_storage_config","full_name")
+            if tmp_data != None:
+                self.full_name = tmp_data    
+
+            
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_schoolname", self.set_school_name)#
+            EventMesh.subscribe("get_schoolname", self.get_school_name)
+
+            EventMesh.subscribe("set_classname", self.set_classname)#
+            EventMesh.subscribe("get_classname", self.get_classname)
+
+            EventMesh.subscribe("set_fullname", self.set_full_name)#
+            EventMesh.subscribe("get_fullname", self.get_full_name)
+
+        def set_school_name(self, event, msg): 
+            if msg != None:
+                if len(msg) != 0:
+                    self.school_name = str(msg)
+                    EventMesh.publish("set_storage_config",["school_name",str(msg)])
+            
+
+        def get_school_name(self, event, msg):
+            if self.school_name:
+                return self.school_name
+            else:
+                return None
+        
+        def set_classname(self, event, msg): 
+            if msg != None:
+                if len(msg) != 0:
+                    self.class_name = str(msg)
+                    EventMesh.publish("set_storage_config",["class_name",str(msg)])
+                
+            
+        def get_classname(self, event, msg):
+            if self.class_name:
+                return self.class_name
+            else:
+                return None
+        def set_full_name(self, event, msg): 
+            if msg != None:
+                if len(msg) != 0:
+                    self.full_name = str(msg)
+                    EventMesh.publish("set_storage_config",["full_name",str(msg)])
+
+        def get_full_name(self, event, msg):
+            if self.full_name:
+                return self.full_name
+            else:
+                return None
+    
+    import fota
+    class firwDownloadManager(Abstract):#
+        def __init__(self):
+            self.timer = osTimer()
+
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("firware_download", self.firware_download)#
+
+        def firware_download(self, event, msg): 
+            number = str(msg)
+            sms.sendPduMsg(number, 'set ok', 'UCS2')
+            self.timer.start(10*1000,0,self.fun)
+
+        def fun(self,*argc):
+            fota_obj = fota()
+            fota_obj.httpDownload(url1="http://u-oss.thisiot.com/test/dfota_1.bin",url2="http://u-oss.thisiot.com/test/dfota_2.bin")
\ No newline at end of file
diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/mgr_d15.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/mgr_d15.py
new file mode 100644 (file)
index 0000000..eb9ddec
--- /dev/null
@@ -0,0 +1,5450 @@
+from common import Abstract, LogAdapter
+import EventMesh
+import usocket
+import ql_fs
+import ujson
+import _thread
+import modem
+import utime
+import sim
+import net
+import dataCall
+import checkNet
+import osTimer
+import constants
+import sms
+from common import Lock, Abstract, LogAdapter
+#from location import GPS, GPSMatch,CellLocator
+from misc import USB, Power, ADC
+from machine import ExtInt, Pin,Timer,RTC,UART
+import EventMesh
+import usys
+import audio
+from machine import I2C
+
+import pm
+import ure
+import urandom
+  
+from machine import RTC
+import quecgnss
+import wifiScan
+import math
+import voiceCall
+from misc import PWM
+from queue import Queue
+if EventMesh.model == "D15":
+    from led_d15 import led_mode,open_led_green,close_led_green,open_led_red,close_led_red,close_led_white
+    heartbeat_time = 7*60 #心跳时间
+
+    def get_autoblood_value():#血压值
+        data = RTC().datetime()
+        hour = int(data[4])
+        blood_Maxvalue = 0
+        blood_Minvalue = 0
+        if hour >= 6 and hour <= 10:
+            random_numMax = urandom.randint(0, 30)
+            random_numMin = urandom.randint(0, 20)
+            blood_Maxvalue = 120+random_numMax
+            blood_Minvalue = 75+random_numMin
+
+            print("get_autoblood_value 6 -10",blood_Maxvalue,blood_Minvalue)
+            # return [self.blood_Maxvalue,self.blood_Minvalue]
+        elif hour > 10 and hour <= 14:#10-14(10,14]
+            random_numMax = urandom.randint(0, 20)
+            random_numMin = urandom.randint(0, 25)
+            blood_Maxvalue = 115+random_numMax
+            blood_Minvalue = 60+random_numMin
+            print("get_autoblood_value 10 -14",blood_Maxvalue,blood_Minvalue)
+            # return [self.blood_Maxvalue,self.blood_Minvalue]
+        elif hour > 14 and hour <= 18:#14-18
+            random_numMax = urandom.randint(0, 25)
+            random_numMin = urandom.randint(0, 15)
+            blood_Maxvalue = 115+random_numMax
+            blood_Minvalue = 70+random_numMin
+
+            print("get_autoblood_value 14 -18",blood_Maxvalue,blood_Minvalue)
+            # return [self.blood_Maxvalue,self.blood_Minvalue]
+        elif hour > 2 and hour < 6:#2-6
+            random_numMax = urandom.randint(0, 30)
+            random_numMin = urandom.randint(0, 20)
+            blood_Maxvalu = 105+random_numMax
+            blood_Minvalue = 65+random_numMin
+
+            
+            print("get_autoblood_value 2 -6",blood_Maxvalue,blood_Minvalue)
+            # return [self.blood_Maxvalue,self.blood_Minvalue]
+        else:#18-2 19 20 21 22 23 1 2
+            random_numMax = urandom.randint(0, 30)
+            random_numMin = urandom.randint(0, 20)
+            blood_Maxvalue = 100+random_numMax
+            blood_Minvalue = 60+random_numMin
+            print("get_autoblood_value 18 -2",blood_Maxvalue,blood_Minvalue)
+        return [blood_Maxvalue,blood_Minvalue]
+
+    def get_blood_sugar_value():#血糖值
+        data = RTC().datetime()
+        hour = int(data[4])
+        blood_sugar = 0
+        if (hour >= 6 and hour <= 8) or (hour >= 12 and hour <= 13) or (hour >= 18 and hour <= 19):#6-8 12-13 18-19 
+            random_value = urandom.randint(39, 61)
+            blood_sugar = random_value/10
+            print("get_blood_sugar_value 6 -10",blood_sugar)
+            # return [self.blood_Maxvalue,self.blood_Minvalue]
+        elif (hour > 8 and hour <= 9) or (hour >= 14 and hour <= 15) or (hour >= 20 and hour <= 21):#8-9 14-15 20-21
+            random_value = urandom.randint(67, 90)
+            blood_sugar = random_value/10
+            print("get_blood_sugar_value 10 -14",blood_sugar)
+        else:#18-2 19 20 21 22 23 1 2 10-11 16-17 21-22
+            random_value = urandom.randint(39, 78)
+            blood_sugar = random_value/10
+            print("get_blood_sugar_value 18 -2",blood_sugar)
+        return blood_sugar
+
+
+
+
+    class PhoneVolumeLevelManager(Abstract):
+        def __init__(self):
+            self.level = 0
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("push_add_phonering_level", self.add)
+            EventMesh.subscribe("push_reduce_phonering_level", self.reduce)
+            EventMesh.subscribe("get_phonering_level", self.get)
+
+        def add(self, event, msg):
+            if self.level < 7:
+                self.level = self.level + 1
+
+        def reduce(self, event, msg):
+            if self.level > 0:
+                self.level = self.level - 1
+
+        def get(self, event=None, msg=None):
+            return self.level
+
+    class MsgVolumeLevelManager(Abstract):
+        def __init__(self):
+            self.level = 0
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("push_add_msgvolume_level", self.add)
+            EventMesh.subscribe("push_reduce_msgvolume_level", self.reduce)
+            EventMesh.subscribe("get_msgvolume_level", self.get)
+
+        def add(self, event, msg):
+            if self.level < 7:
+                self.level = self.level + 1
+
+        def reduce(self, event, msg):
+            if self.level > 0:
+                self.level = self.level - 1
+
+        def get(self, event=None, msg=None):
+            return self.level
+
+    class AlarmVolumeLevelManager(Abstract):
+        def __init__(self):
+            self.level = 0
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("push_add_alarmvolume_level", self.add)
+            EventMesh.subscribe("push_reduce_alarmvolume_level", self.reduce)
+            EventMesh.subscribe("get_alarmvolume_level", self.get)
+
+        def add(self, event, msg):
+            if self.level < 7:
+                self.level = self.level + 1
+
+        def reduce(self, event, msg):
+            if self.level > 0:
+                self.level = self.level - 1
+
+        def get(self, event=None, msg=None):
+            return self.level
+            
+    class StopwatchManager(Abstract):
+        def __init__(self):
+            self.level = 0
+            self.ms_value = 0
+            self.sec_value = 0
+            self.min_value = 0
+            self.timer = Timer(Timer.Timer1)
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("stopwatch_start", self.start)
+            EventMesh.subscribe("stopwatch_stop", self.paused)
+            EventMesh.subscribe("stopwatch_reset", self.reset)
+            EventMesh.subscribe("get_stopwatch_ms", self.get_ms)
+            EventMesh.subscribe("get_stopwatch_sec", self.get_sec)
+            EventMesh.subscribe("get_stopwatch_min", self.get_min)
+
+        def start(self, event, msg):        
+            self.timer.start(period=100, mode=self.timer.PERIODIC, callback=self.fun)
+        
+        def paused(self, event, msg):        
+            self.timer.stop()
+        
+        def reset(self, event, msg):
+            self.timer.stop()
+
+            self.sec_value = 0
+            self.min_value = 0
+            self.ms_value = 0
+
+        def fun(self):
+            self.ms_value += 1
+            if self.ms_value > 9:
+                self.ms_value = 0   
+                self.sec_value += 1
+            if self.sec_value > 60:
+                self.sec_value = 0
+                self.min_value += 1
+            if self.min_value > 60:
+                self.timer.stop()
+
+        def get_ms(self, event=None, msg=None):
+            return self.ms_value
+
+        def get_min(self, event=None, msg=None):
+            return self.min_value
+
+        def get_sec(self, event=None, msg=None):
+            return self.sec_value
+
+    class CountdownManager(Abstract):
+        def __init__(self):
+            self.sec = 0
+            self.min = 0
+            self.hour = 0
+            self.timer = osTimer()
+            self.total = 0
+            self.time_cb = 0
+            self.time_play = 0
+            self.total_sec = 0
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("add_countdown_sec", self.add_sec)
+            EventMesh.subscribe("reduce_countdown_sec", self.reduce_sec)
+            EventMesh.subscribe("add_countdown_min", self.add_min)
+            EventMesh.subscribe("reduce_countdown_min", self.reduce_min)
+            EventMesh.subscribe("add_countdown_hour", self.add_hour)
+            EventMesh.subscribe("reduce_countdown_hour", self.reduce_hour)
+            EventMesh.subscribe("get_countdown_sec", self.get_sec)
+            EventMesh.subscribe("get_countdown_min", self.get_min)
+            EventMesh.subscribe("get_countdown_hour", self.get_hour)
+
+            EventMesh.subscribe("set_countdown_off_state", self.set_countdown_off_state)
+            EventMesh.subscribe("get_countdown_off_state", self.get_countdown_off_state)
+
+
+            EventMesh.subscribe("set_countdown_all_time", self.set_countdown_all_time)
+            EventMesh.subscribe("get_countdown_all_time", self.get_countdown_all_time)
+
+            EventMesh.subscribe("countdown_end_cb", self.countdown_end_cb)
+
+            EventMesh.subscribe("reset_time_countdown",self.reset)
+
+        def set_countdown_all_time(self, event, msg):
+            self.total = msg[0]
+            self.total_sec = msg[1]
+            # EventMesh.debug_log("self.total:{} self.total_sec:{}".format(self.total,self.total_sec))
+
+
+        def get_countdown_all_time(self, event, msg):
+            return self.total
+        
+        def set_countdown_off_state(self, event, msg):
+
+            self.time_cb = msg[0]
+            self.time_play = msg[1]
+            # EventMesh.debug_log("self.time_cb:{} self.total_sec:{}".format(self.time_cb,self.time_play))
+
+
+        def get_countdown_off_state(self, event, msg):
+            return [self.time_cb,self.time_play]
+        
+        def countdown_end_cb(self, event, msg):
+            
+            if self.time_cb == 1 and self.time_play == 1:
+                date_tmp = utime.localtime()
+                time_tmp = utime.mktime(date_tmp) 
+                reduce = time_tmp- self.total_sec
+                EventMesh.debug_log("self.time_cb:{} self.time_play:{} self.total:{} self.total_sec:{}".format(self.time_cb,self.time_play, self.total,self.total_sec))
+                self.total = self.total - reduce
+                if self.total <= 0:
+                    self.total = 0
+                    self.time_cb = 0
+                    self.time_play = 0
+                    self.sec = 0
+                    self.min = 0
+                    self.hour = 0
+                    
+                    EventMesh.publish("load_screen", {"screen": "countdown_end"})
+                    return
+                self.total_sec = time_tmp
+
+
+        def add_sec(self, event, msg):
+            if self.sec < 59:
+                self.sec = self.sec + 1
+
+        def reduce_sec(self, event, msg):
+            if self.sec > 0:
+                self.sec = self.sec - 1
+
+        def add_min(self, event, msg):
+            if self.min < 59:
+                self.min = self.min + 1
+
+        def reduce_min(self, event, msg):
+            if self.min > 0:
+                self.min = self.min - 1
+
+        def add_hour(self, event, msg):
+            if self.hour < 99:
+                self.hour = self.hour + 1
+
+        def reduce_hour(self, event, msg):
+            if self.hour > 0:
+                self.hour = self.hour - 1
+
+        def get_sec(self, event=None, msg=None):
+            return self.sec
+
+        def get_min(self, event=None, msg=None):
+            return self.min
+
+        def get_hour(self, event=None, msg=None):
+            return self.hour
+        
+
+        
+        def reset(self, event=None, msg=None):
+            self.hour = 0
+            self.min = 0
+            self.sec = 0
+        
+        
+
+    BATTERY_OCV_TABLE = {
+        "nix_coy_mnzo2": {
+            55: {
+                4290: 100, 4237: 95, 4179: 90, 4123: 85, 4070: 80, 4020: 75, 3963: 70, 3919: 65, 3882: 60, 3847: 55,
+                3818: 50, 3794: 45, 3772: 40, 3752: 35, 3733: 30, 3716: 25, 3699: 20, 3677: 15, 3652: 10, 3629: 5, 3400: 0,
+            },
+            20: {
+                4290: 100, 4237: 95, 4179: 90, 4123: 85, 4070: 80, 4020: 75, 3963: 70, 3919: 65, 3882: 60, 3847: 55,
+                3818: 50, 3794: 45, 3772: 40, 3752: 35, 3733: 30, 3716: 25, 3699: 20, 3677: 15, 3652: 10, 3629: 5, 3400: 0,
+            },
+            0: {
+                4290: 100, 4237: 95, 4179: 90, 4123: 85, 4070: 80, 4020: 75, 3963: 70, 3919: 65, 3882: 60, 3847: 55,
+                3818: 50, 3794: 45, 3772: 40, 3752: 35, 3733: 30, 3716: 25, 3699: 20, 3677: 15, 3652: 10, 3629: 5, 3400: 0,
+            },
+        },
+    }
+
+
+
+    class Battery(object):
+        """This class is for battery info.
+
+        This class can get battery voltage and energy.
+        if adc_args is not None, use cbc to read battery
+
+        adc_args: (adc_num, adc_period, factor)
+
+            adc_num: ADC channel num
+            adc_period: Cyclic read ADC cycle period
+            factor: calculation coefficient
+        """
+
+        def __init__(self, adc_args=None, chrg_gpion=None, stdby_gpion=None):
+            self.__energy = 100
+            self.__temp = 55
+
+            # ADC params
+            self.__adc = None
+            if adc_args:
+                self.__adc_num, self.__adc_period, self.__factor = adc_args
+                if not isinstance(self.__adc_num, int):
+                    raise TypeError("adc_args adc_num is not int number.")
+                if not isinstance(self.__adc_period, int):
+                    raise TypeError("adc_args adc_period is not int number.")
+                if not isinstance(self.__factor, float):
+                    raise TypeError("adc_args factor is not int float.")
+                self.__adc = ADC()
+
+            # Charge params
+            self.__charge_callback = None
+            self.__charge_status = None
+            self.__chrg_gpion = chrg_gpion
+            self.__stdby_gpion = stdby_gpion
+            self.__chrg_gpio = None
+            self.__stdby_gpio = None
+            self.__chrg_exint = None
+            self.__stdby_exint = None
+            if self.__chrg_gpion is not None and self.__stdby_gpion is not None:
+                self.__init_charge()
+
+        def __chrg_callback(self, args):
+            self.__update_charge_status()
+            if self.__charge_callback is not None:
+                self.__charge_callback(self.__charge_status)
+
+        def __stdby_callback(self, args):
+            self.__update_charge_status()
+            if self.__charge_callback is not None:
+                self.__charge_callback(self.__charge_status)
+
+        def __update_charge_status(self):
+            if self.__chrg_gpio.read() == 1 and self.__stdby_gpio.read() == 1:
+                self.__charge_status = 0
+            elif self.__chrg_gpio.read() == 0 and self.__stdby_gpio.read() == 1:
+                self.__charge_status = 1
+            elif self.__chrg_gpio.read() == 1 and self.__stdby_gpio.read() == 0:
+                self.__charge_status = 2
+            else:
+                raise TypeError("CHRG and STDBY cannot be 0 at the same time!")
+
+        def __init_charge(self):
+            self.__chrg_gpio = Pin(self.__chrg_gpion, Pin.IN, Pin.PULL_DISABLE)
+            self.__stdby_gpio = Pin(self.__stdby_gpion, Pin.IN, Pin.PULL_DISABLE)
+            self.__chrg_exint = ExtInt(self.__chrg_gpion, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.__chrg_callback)
+            self.__stdby_exint = ExtInt(self.__stdby_gpion, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU,
+                                        self.__stdby_callback)
+            self.__chrg_exint.enable()
+            self.__stdby_exint.enable()
+            self.__update_charge_status()
+
+        def __get_soc_from_dict(self, key, volt_arg):
+            """Get battery energy from map"""
+            if key in BATTERY_OCV_TABLE["nix_coy_mnzo2"]:
+                volts = sorted(BATTERY_OCV_TABLE["nix_coy_mnzo2"][key].keys(), reverse=True)
+                pre_volt = 0
+                volt_not_under = 0  # Determine whether the voltage is lower than the minimum voltage value of soc.
+                for volt in volts:
+                    if volt_arg > volt:
+                        volt_not_under = 1
+                        soc1 = BATTERY_OCV_TABLE["nix_coy_mnzo2"][key].get(volt, 0)
+                        soc2 = BATTERY_OCV_TABLE["nix_coy_mnzo2"][key].get(pre_volt, 0)
+                        break
+                    else:
+                        pre_volt = volt
+                # EventMesh.debug_log("__get_soc_from_dict:{}".format(soc2 - (soc2 - soc1) * (pre_volt - volt_arg) // (pre_volt - volt)))
+                if pre_volt == 0:  # Input Voltarg > Highest Voltarg
+                    return soc1
+                elif volt_not_under == 0:
+                    return 0
+                else:
+                    return soc2 - (soc2 - soc1) * (pre_volt - volt_arg) // (pre_volt - volt)
+
+        def __get_soc(self, temp, volt_arg, bat_type="nix_coy_mnzo2"):
+            """Get battery energy by temperature and voltage"""
+            if bat_type == "nix_coy_mnzo2":
+                if temp > 30:
+                    return self.__get_soc_from_dict(55, volt_arg)
+                elif temp < 10:
+                    return self.__get_soc_from_dict(0, volt_arg)
+                else:
+                    return self.__get_soc_from_dict(20, volt_arg)
+
+        def __get_power_vbatt(self):
+            return int(sum([Power.getVbatt() for i in range(100)]) / 100)
+
+        def __get_adc_vbatt(self):
+            self.__adc.open()
+            utime.sleep_ms(self.__adc_period)
+            adc_list = list()
+            for i in range(self.__adc_period):
+                adc_list.append(self.__adc.read(self.__adc_num))
+                utime.sleep_ms(self.__adc_period)
+            adc_list.remove(min(adc_list))
+            adc_list.remove(max(adc_list))
+            adc_value = int(sum(adc_list) / len(adc_list))
+            self.__adc.close()
+            vbatt_value = adc_value * (self.__factor + 1)
+            return vbatt_value
+
+        def set_temp(self, temp):
+            """Set now temperature."""
+            if isinstance(temp, int) or isinstance(temp, float):
+                self.__temp = temp
+                return True
+            return False
+
+        def get_voltage(self):
+            """Get battery voltage"""
+            if self.__adc is None:
+                return self.__get_power_vbatt()
+            else:
+                return self.__get_adc_vbatt()
+
+        def get_energy(self,volt_arg ):
+            """Get battery energy"""
+            if( volt_arg == None) :
+                volt_arg = self.get_voltage()
+            self.__energy = self.__get_soc(self.__temp, volt_arg)
+            # EventMesh.debug_log("get_energy:volt_arg {} __energy{}".format(volt_arg,self.__energy))
+            return self.__energy
+
+        def set_charge_callback(self, charge_callback):
+            if self.__chrg_gpion is not None and self.__stdby_gpion is not None:
+                if callable(charge_callback):
+                    self.__charge_callback = charge_callback
+                    return True
+            return False
+
+        def get_charge_status(self):
+            return self.__charge_status
+
+    class BatteryManager(Abstract):
+        def __init__(self):
+            """电池管理器"""
+            self.battery = Battery()
+            self.low_battery = False
+
+        def post_processor_after_instantiation(self):
+            """订阅此类所有的事件到 EventMesh中"""
+            EventMesh.subscribe("get_battery", self.get_battery)
+
+        def get_battery(self, event=None, msg=None):
+            battery = self.battery.get_energy(msg)
+            return battery
+
+        def get_voltage(self, event=None, msg=None):
+            voltage = self.battery.get_voltage()
+            return voltage
+
+    class ConfigStoreManager(Abstract):
+        """
+        持久化落盘存储
+        """
+
+        def __init__(self):
+            self.file_name = "/usr/conf_store.json"
+            self.lock = Lock()
+            self.map = dict()
+
+        def post_processor_after_instantiation(self):
+            if ql_fs.path_exists(self.file_name):
+                self.map = ql_fs.read_json(self.file_name)
+            else:
+                self.__store()
+            EventMesh.subscribe("persistent_config_get", self.__read)
+            EventMesh.subscribe("persistent_config_store", self.__store)
+
+        def __read(self, event, msg):
+            with self.lock:
+                return self.map.get(msg)
+
+        def __store(self, event=None, msg=None):
+            if msg is None:
+                msg = dict()
+            with self.lock:
+                self.map.update(msg)
+                ql_fs.touch(self.file_name, self.map)
+            
+    class sosInfoCallManager(Abstract):
+        # 通讯录
+        def __init__(self):
+            pass
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_sos_info_call", self.set_sos_info_call)
+
+        def set_sos_info_call(self, event, msg):
+            hangup_mode = EventMesh.publish("get_hangup_mode")
+            if hangup_mode == 1:
+                EventMesh.publish("set_sos_flag",0)
+                EventMesh.publish("set_sos_num",0)
+                EventMesh.publish("set_hangup_mode",0)
+            EventMesh.debug_log('hangup_mode disconnect',hangup_mode)
+            sos_flag = EventMesh.publish("get_sos_flag")
+            EventMesh.debug_log('voicecall sos_flag',sos_flag)
+            if sos_flag == 0 :
+                EventMesh.publish("set_sos_num",0)
+            else:
+                num = EventMesh.publish("get_sos_num")
+                number = EventMesh.publish("get_dial_sos_number")
+                if number != None:
+                    if len(number) > 0:
+                        if num == None:
+                            num = 0
+                        num+=1
+                        num_len = 0
+
+                        if len(number) == 1:
+                            num_len = len(number)+1#三次
+                        elif len(number) == 2:
+                            num_len = len(number)+1+2 #1+2+1+2
+                        elif len(number) == 3:
+                            num_len = len(number)+5 #1+3+5
+                        # EventMesh.debug_log("number:{} number_len :{} num:{} num_len:{}".format(number,len(number),num,num_len))
+                        if num > num_len :
+                            if len(number) == 1:
+                                number1 = str(number[0])
+                                sms.sendPduMsg(number1, '我需要你的帮助', 'UCS2')
+                            elif len(number) == 2:
+                                number1 = str(number[0])
+                                sms.sendPduMsg(number1, '我需要你的帮助', 'UCS2')
+
+                                number2 = str(number[1])
+                                sms.sendPduMsg(number2, '我需要你的帮助', 'UCS2')
+                            elif len(number) == 3:
+                                number1 = str(number[0])
+                                sms.sendPduMsg(number1, '我需要你的帮助', 'UCS2')
+                                number2 = str(number[1])
+                                sms.sendPduMsg(number2, '我需要你的帮助', 'UCS2')
+                                number3 = str(number[2])
+                                sms.sendPduMsg(number3, '我需要你的帮助', 'UCS2')
+                            EventMesh.publish("set_sos_flag",0)
+                            EventMesh.publish("set_sos_num",0)
+                        else:
+                        # EventMesh.debug_log("number:{} number_len :{}".format(number,len(number)))
+                            EventMesh.publish("set_sos_num",num)
+                            if len(number) == 1:
+                                if len(number[0]) != 0:
+                                    EventMesh.publish("set_callnumer_cb",number[0])
+                                    EventMesh.debug_log("phone 1")
+                            elif len(number) == 2:
+                                if num == 1 or num == 3 or num == 5: #1 2 3 4 5 
+                                    if len(number[1]) != 0:
+                                        EventMesh.debug_log("phone 2")
+                                        EventMesh.publish("set_callnumer_cb",number[1])
+                                elif num == 2 or num == 4:
+                                    if len(number[0]) != 0:
+                                        EventMesh.debug_log("phone 3")
+                                        EventMesh.publish("set_callnumer_cb",number[0])
+                            elif len(number) == 3:
+                                if num == 1 or num == 4 or num == 7:
+                                    if len(number[1]) != 0:
+                                        EventMesh.publish("set_callnumer_cb",number[1])
+                                        EventMesh.debug_log("phone 4")
+                                elif num == 2 or num == 5 or num == 8:
+                                    if len(number[2]) != 0:
+                                        EventMesh.debug_log("phone 5")
+                                        EventMesh.publish("set_callnumer_cb",number[2])
+                                elif num == 3 or num == 6 :
+                                    if len(number[0]) != 0:
+                                        EventMesh.debug_log("phone 6")
+                                        EventMesh.publish("set_callnumer_cb",number[0])   
+    
+    WL_timer = osTimer()   
+    def WL_timer_cb(*args):   
+        get_call = EventMesh.publish("get_call_state") 
+        if get_call == 2:#只有拨进来才给接听
+            EventMesh.publish("answer_call_event")#接听电话
+    def voice_callback(args):
+        EventMesh.debug_log('voicecall iinfo:{}'.format(args))
+        if args[0] == 10:
+                get_UI_high_priority = EventMesh.publish("get_UI_high_priority")#如果在拨出去或者通话中屏蔽来电
+                if get_UI_high_priority == 1:
+                    EventMesh.publish("set_interrup_incall",1)
+                    return
+                EventMesh.debug_log('voicecall incoming call, PhoneNO.: ', args[6])
+                size_len = len(str(args[6]))
+                tmp = []
+                tmp = args[6]
+                find_num = tmp[0]
+                b = tmp[0].isdigit()#判断是否不是数字开头 暂时不用 因为截取了+判断不了 判断号码是否大于11位数,如果大于11位数 并且第一个字符是数字就按照最后11位做存储
+
+                if b == True and size_len > 11:
+                    tmp = tmp[size_len-11:]
+                WLKEY = EventMesh.publish("get_storage_config","WLKEY") 
+                if WLKEY == "1" or WLKEY == "2":#开启了白名单
+                    on_list_flag = 0
+                    phonebook = EventMesh.publish("get_phonebook_list")
+                    phonebook_list = phonebook[1]
+                    EventMesh.debug_log("voice_callback:phonebook_list{}".format(phonebook_list))
+                    try:
+                        for value in phonebook_list.values():
+                            if value == args[6]:
+                                on_list_flag = 1
+                                break
+                    except Exception as e:
+                        usys.print_exception(e)
+                    EventMesh.debug_log("voice_callback:on_list_flag{}".format(on_list_flag))
+                    if on_list_flag == 1:#在白名单里
+                        if WLKEY == "2":
+                            WL_timer.start(30000, 0, WL_timer_cb)
+                    else:
+                        EventMesh.debug_log("voice_callback:不在白名单中,挂断")
+                        voiceCall.callEnd()
+                        return 
+                viode_state = EventMesh.publish("get_video_state")
+                fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+                if viode_state != 0 or fall_down != 0:
+                    voiceCall.callEnd()
+                    return
+
+                EventMesh.publish("set_call_state",2) 
+                EventMesh.publish("dialin_call_event")#电话拨进响铃
+                # EventMesh.publish("load_screen", {"screen": "incoming_call","meta":str(tmp)})
+
+        elif args[0] == 11:
+                EventMesh.publish("set_UI_high_priority",0)
+                sos_flag = EventMesh.publish("get_sos_flag")
+                if sos_flag == 1:
+                    sos_flag = 0
+
+                    EventMesh.publish("set_sos_flag",0)
+
+                EventMesh.debug_log('voicecall connected, PhoneNO.: ', args[6])
+                size_len = len(str(args[6]))
+                tmp = []
+                tmp = args[6]
+                find_num = tmp[0]
+                b = tmp[0].isdigit()#判断是否不是数字开头 暂时不用 因为截取了+判断不了
+                if b == True and size_len > 11:
+                    tmp = tmp[size_len-11:]
+                EventMesh.publish("set_call_state",3) 
+                # if EventMesh.publish("get_call_state") == 2:#打通了才可设置状态 防止挂断太及时,又拨出去了
+                #     EventMesh.publish("set_call_state",3) 
+                # else:
+                #     EventMesh.publish("set_call_state",0) 
+                # EventMesh.publish("load_screen", {"screen": "on_call","meta":str(tmp)})
+
+        elif args[0] == 12:
+                set_interrup_call = EventMesh.publish("get_interrup_incall")#打断这次不需要来电的ui事件 以免通话中退出当前界面进不去了
+                if set_interrup_call == 1:
+                    EventMesh.publish("set_interrup_incall",0)
+                    return
+
+                EventMesh.publish("set_interrup_incall",0)
+                EventMesh.publish("set_UI_high_priority",0)
+                
+
+                
+                
+                EventMesh.publish("set_sos_info_call")  
+                flag = EventMesh.publish("get_call_state") 
+                if flag == 2:
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("close_timer_all")#
+                    EventMesh.publish("close_motor_infor")#关闭马达和定时器
+                    
+                EventMesh.publish("set_sos_state_out")
+                EventMesh.publish("set_call_state",0) 
+                EventMesh.debug_log('voicecall disconnect end')
+                
+
+        elif args[0] == 13:
+                EventMesh.debug_log('voicecall is waiting, PhoneNO.: ', args[6])
+        elif args[0] == 14:
+
+                EventMesh.debug_log('voicecall dialing, PhoneNO.: ', args[6])
+                EventMesh.publish("set_UI_high_priority",0)
+                EventMesh.publish("set_call_state",1) 
+                # EventMesh.publish("load_screen", {"screen": "dialing"})
+
+                
+        elif args[0] == 15:
+                EventMesh.debug_log('voicecall alerting, PhoneNO.: ', args[6])
+                EventMesh.publish("set_call_state",1) 
+                
+        elif args[0] == 16:
+                EventMesh.debug_log('voicecall holding, PhoneNO.: ', args[6])
+
+    class DeviceInfoManager(Abstract):
+        
+        """
+            设备信息管理
+        """
+
+        def __init__(self):
+
+            self.DeviceInfo_queue = Queue()
+            _thread.stack_size((9+6)*1024)
+            _thread.start_new_thread(self.DeviceInfo_queue_thread, ())
+            _thread.stack_size(8*1024)
+            self.boot_time_count = 0
+            self.factory_test_time = 0
+            EventMesh.subscribe("publish_message_event_DeviceInfo",self.publish_message_event_DeviceInfo)
+            self.key = ""
+            self.imei = ""
+            self.cid = "ETEST20221014010"
+            self.imsi = ""
+            self.password = "000000"
+            #self.__city = None
+            #self.__location = None
+            self.timer_push_schedule = osTimer()
+            self.timer_pusht_test = osTimer()
+            
+            #self.battery_push_schedule = osTimer()
+            self.check_battery_list = []
+            
+            self.step = [0,0,0,0]
+            self.timer_push=0
+            self.timer_push_tmp=60
+            self.PING = "0" #绑定状态
+            self.connect = 0 #服务器连接状态
+            self.KA_time = 0
+            self.HR_time = 0
+            self.hr_timeSecond = 0
+            self.HR_state = 0
+            self.HR_Onestate = 0
+            self.get_hr_state = 0
+            self.get_spo2_state = 0
+            self.set_hsenor_crt = 0
+            self.HR_OneTime = 0
+            self.Hr_Need_Open = 0
+            self.Spo2_Need_Open = 0
+            self.bat_time = 0
+            self.vbat_full_flag = 0
+            self.clear_step = 0
+            self.test = 0
+            self.old_time = 0
+            self.UD_time = 0
+            self.upload_time = 0
+            self.UD_timeout = 7*60
+
+            self.temp_timeSecond = 0
+            self.temp_state = 0
+            self.temp_one_state = 0
+            self.temp_warning = 0
+
+            self.bg_timeSecond = 0
+
+            self.bp_timeSecond = 0
+            self.bpauto_state = 0
+
+            self.spo2_timeSecond = 0
+            self.spo2auto_state = 0
+
+            self.vbat_count = 0
+
+            self.vbat_buf=[]
+
+            self.curr_battery_level = 4200
+            self.bat_count = 0
+
+            self.mearsure_btn = 0
+            self.mearsure_timer = 0
+
+            self.old_hr_time = 0
+            self.old_spo2_time = 0
+
+            self.no_smi_count = 0
+            self.no_smi_state = 0
+
+            self.old_bp_time = 0
+
+            self.medicine_count = 0
+            self.medicine_flag  = 0
+            self.medicine_oldtotalmin = 0
+            
+            self.wakeup_flag = 0
+            self.wakeup_count = 0
+            self.wakeup_oldtotalmin = 0
+
+            self.sleep_flag = 0
+            self.sleep_count = 0
+            self.sleep_oldtotalmin = 0
+
+            self.reset_flag = 0
+            self.reset_count = 0
+            self.reset_oldtotalmin = 0
+
+            self.home_flag = 0
+            self.home_count = 0
+            self.home_oldtotalmin = 0
+
+            self.normal_flag = 0
+            self.normal_count = 0
+            self.normal_oldtotalmin = 0
+            
+            self.charge_full_count = 0
+            self.GPS_step_t = 0#记录步数
+            self.usb = USB()
+            self.usb.setCallback(self.usb_event_cb)
+            self.log = LogAdapter(self.__class__.__name__)
+            self.rtc = RTC()
+            self.aud = audio.Audio(0)
+            EventMesh.debug_log("DeviceInfoManager:1")
+
+            self.old_temp_time = 0
+
+            EventMesh.debug_log("DeviceInfoManager:3")
+            self.i2c0 = I2C(I2C.I2C0, I2C.FAST_MODE)
+            self.stop_temp( None, None)
+            self.dev_state = 0
+            self.wear = 1
+            self.BG_state = 0
+            self.old_bg_time = 0
+
+            self.pull_time = 0
+
+            self.drink_time = 0
+
+            self.alarm_count = 0
+            self.alarm_flag = 0
+
+            self.time_count = 0
+            
+            self.auto_spo2_count = 0
+
+            self.auto_hr_count = 0
+
+            self.auto_temp_count = 0
+
+            self.low_power_AL = 0
+
+        def post_processor_after_instantiation(self):
+            EventMesh.debug_log("post_processor_after_instantiation:1")
+            """订阅此类所有的事件到 EventMesh中"""
+            voiceCall.setCallback(voice_callback)
+            EventMesh.subscribe("screen_get_ope", self.get_device_ope)
+            EventMesh.subscribe("screen_get_sig", self.get_signal)
+            EventMesh.subscribe("screen_get_time", self.get_time)
+            EventMesh.subscribe("about_get_imei", self.get_imei)
+            EventMesh.subscribe("about_get_iccid", self.get_ic_cid)
+            EventMesh.subscribe("get_sim_Status", self.get_sim_Status)
+            EventMesh.subscribe("about_get_phonenum", self.get_phone_num)
+            EventMesh.subscribe("screen_get_battery", self.get_battery)
+            EventMesh.subscribe("set_curr_battery_level", self.set_curr_battery_level)
+            EventMesh.subscribe("get_curr_battery_level", self.get_curr_battery_level)
+            EventMesh.subscribe("get_fw_version", self.get_device_fw_version)
+            EventMesh.subscribe("get_standby_time", self.get_standby_time)
+            EventMesh.subscribe(constants.EVENT.GET_STEP, self.get_step_count)
+            EventMesh.subscribe("sim_slot_get", self.sim_slot_get)
+            EventMesh.subscribe("sim_slot_switch", self.sim_slot_switch)
+            EventMesh.subscribe(constants.EVENT.GET_KEY, self.get_key)
+            EventMesh.subscribe(constants.EVENT.SET_KEY, self.set_key)
+            EventMesh.subscribe(constants.EVENT.GET_IMEI, self.get_imei)
+            EventMesh.subscribe(constants.EVENT.GET_CID, self.get_cid)
+            EventMesh.subscribe(constants.EVENT.SET_CID, self.set_cid)
+            EventMesh.subscribe(constants.EVENT.GET_IMSI, self.get_imsi)
+            EventMesh.subscribe(constants.EVENT.GET_PASSWORD, self.get_password)
+            EventMesh.subscribe(constants.EVENT.SET_PASSWORD, self.set_password)     
+            EventMesh.subscribe(constants.EVENT.SET_PING, self.set_ping)
+            EventMesh.subscribe(constants.EVENT.GET_PING, self.get_ping)
+            EventMesh.subscribe(constants.EVENT.SET_CONNECT, self.set_connect)
+            EventMesh.subscribe(constants.EVENT.GET_CONNECT, self.get_connect)
+
+            
+            EventMesh.subscribe(constants.EVENT.START_BLOOD_OXYGEN, self.start_blood_oxygen)
+            EventMesh.subscribe(constants.EVENT.START_HEART, self.start_heart)
+            EventMesh.subscribe(constants.EVENT.STOP_BLOOD_OXYGEN, self.stop_blood_oxygen)
+            EventMesh.subscribe(constants.EVENT.STOP_HEART, self.stop_heart)
+            EventMesh.subscribe(constants.EVENT.GET_BLOOD_OXYGEN, self.get_blood_oxygen)
+            EventMesh.subscribe(constants.EVENT.GET_HEART, self.get_heart)
+            EventMesh.subscribe(constants.EVENT.GET_WEAR, self.get_wear)
+            EventMesh.subscribe("get_Hsensor", self.get_Hsensor)
+            EventMesh.subscribe("Hsensor_set_sleep", self.Hsensor_set_sleep)
+
+            EventMesh.subscribe(constants.EVENT.START_TEMP, self.start_temp)
+            EventMesh.subscribe(constants.EVENT.STOP_TEMP, self.stop_temp)
+            EventMesh.subscribe(constants.EVENT.GET_TEMP, self.get_temp)
+            EventMesh.subscribe("get_boot_time_count", self.get_boot_time_count)
+            EventMesh.subscribe("get_factory_test_time", self.get_factory_test_time)
+            EventMesh.subscribe("get_dev_state", self.get_dev_state)
+            EventMesh.subscribe("set_dev_state", self.set_dev_state)
+
+            EventMesh.subscribe("clear_health_state", self.clear_health_state)
+
+            EventMesh.subscribe("clear_home_alarm", self.clear_home_alarm)
+            EventMesh.subscribe("clear_medicine_alarm", self.clear_medicine_alarm)
+            EventMesh.subscribe("clear_wakeup_alarm", self.clear_wakeup_alarm)
+            EventMesh.subscribe("clear_sleep_alarm", self.clear_sleep_alarm)
+            EventMesh.subscribe("clear_normal_alarm", self.clear_normal_alarm)
+
+            EventMesh.subscribe("clear_manual_hr_flag", self.clear_manual_hr_flag)
+            EventMesh.subscribe("clear_manual_temp_flag", self.clear_manual_temp_flag)
+
+
+            EventMesh.subscribe("clear_usb_flag", self.clear_usb_flag)
+            
+            EventMesh.debug_log("post_processor_after_instantiation:2")
+            self.timer_push_schedule.start(10000, 1, self.publish_event_cb)
+            # self.timer_pusht_test.start(2000, 1, self.publish_test)
+            # self.battery_push_schedule.start(3000, 1, self.__check_battery)
+            self.log.debug("post_processor_after_instantiation finished")
+            #EventMesh.publish(constants.EVENT.START_HEART)
+            # 设备开机立刻更新一次参数
+            self.publish_event_cb()
+            
+            EventMesh.debug_log("post_processor_after_instantiation:3")
+
+        def clear_manual_hr_flag(self,event,msg):
+            self.auto_hr_count = 0
+        
+        def clear_manual_temp_flag(self,event,msg):
+            self.auto_temp_count = 0
+
+        def publish_message_event_DeviceInfo(self,event,msg):
+            self.DeviceInfo_queue.put(msg)
+
+        #DeviceInfo的消息队列处理,防止卡顿
+        def DeviceInfo_queue_thread(self):
+            while True:
+                data = self.DeviceInfo_queue.get()
+                #EventMesh.debug_log("DeviceInfo_queue_thread:data = {}".format(data))
+                if data != None:
+                    try:
+                        data["func"](data["data"])
+                    except Exception as e:
+                        EventMesh.debug_log("DeviceInfo_queue_thread:ERROR:{}".format(e))
+                        usys.print_exception(e)
+
+
+        def gsensor_cb(self, para):
+            EventMesh.debug_log("gsensor_cb:{}".format(para))
+            flip_sw = EventMesh.publish("get_storage_config","flip_sw")
+            fall_sw = EventMesh.publish("get_storage_config","fall_sw")
+            if para == 0: #跌倒报警
+                pass
+                if fall_sw == "1":
+                    EventMesh.publish("falldown_alarm_event")
+                    dev_state =  EventMesh.publish("get_dev_state")
+
+                    tmp = 1 << 21
+                    dev_state = dev_state|tmp #第21位=1
+                    EventMesh.publish("set_dev_state",dev_state)
+                    EventMesh.publish(constants.EVENT.START_LOCATION,[constants.PROTOCOL.AL_SEND,dev_state]) #开始AL定位
+                    pass
+                #EventMesh.publish("load_screen", {"screen": "FIND"})
+            elif para == 1: #抬腕
+                
+                if flip_sw == 1:
+                    EventMesh.publish(constants.EVENT.SYSTEM_UP)
+                
+            elif para == 2: #放手
+                pass
+                # if flip_sw == 1:
+                #     EventMesh.publish(constants.EVENT.SYSTEM_SLEEP)
+        def get_boot_time_count(self, event, msg):
+            return self.boot_time_count
+        
+        def get_factory_test_time(self, event, msg):
+            return self.factory_test_time
+        
+        def get_dev_state(self, event, msg):
+            return self.dev_state
+        def set_dev_state(self, event, msg):
+            self.dev_state = msg
+        
+        def publish_event_cb(self, *args, **kwargs):
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if open_power != None:
+                if open_power == 1:
+                    if self.boot_time_count < 50000000:
+                        self.boot_time_count += 10
+                    
+                    if self.factory_test_time < 300:
+                        self.factory_test_time+=10
+                #EventMesh.debug_log("boot_time_count:{}".format(self.boot_time_count))
+            EventMesh.publish("publish_message_event_DeviceInfo",{"func":self.publish_event,"data":0})  
+        def optimize_temp(self,temp):
+            temp += 0.5
+            get_temp_time  = EventMesh.publish("get_temp_time")
+            EventMesh.debug_log("temp:{}".format(temp))
+            if temp < 36 :#or temp > 37.5:
+                temp = 36+urandom.random()
+            if temp > 37.5:
+                
+                self.temp_warning += 1
+                EventMesh.debug_log("temp_warning:{} get_temp_time{}".format(self.temp_warning,get_temp_time))
+                
+                if self.temp_warning < 5:#高温没连续超过3次,和谐成37.5度以下
+                    temp = 37+(urandom.randint(1, 4)/10)
+                else:
+                    self.temp_warning = 0
+            else:
+                if self.temp_warning>=1:
+                    self.temp_warning -= 1
+            if temp >= 40:
+                temp = 40
+            return temp
+        def clear_health_state(self,event,msg):
+            print("clear_health_state")
+            self.old_bp_time = 0#关闭心率 血压 血氧 体温清除标志
+            self.old_time = 0
+            self.HR_Onestate = 0
+            self.HR_OneTime = 0
+            self.HR_state = 0
+            self.set_hsenor_crt = 0
+            self.old_bg_time = 0
+            self.old_hr_time = 0
+            self.old_spo2_time = 0
+            self.BG_state = 0
+            self.bpauto_state = 0
+            self.spo2auto_state = 0
+            pass
+
+        def clear_temp_state(self,event,msg):
+            print("clear_temp_state")
+            self.temp_state = 0
+            self.temp_one_state = 0
+            self.old_temp_time = 0
+            pass
+
+        def publish_event(self,data):
+            """
+            定时事件处理
+            :param args:
+            :param kwargs:
+            :return:
+            """
+
+            date_tmp = utime.localtime()
+            time_tmp = utime.mktime(date_tmp)
+            # EventMesh.debug_log("date_tmp......01....{} time_tmp:{}\r\n".format(date_tmp,time_tmp))
+            
+
+            EventMesh.publish("countdown_end_cb")
+            """定时检查是否关闭gps失败"""
+            # gnss_state = quecgnss.get_state()
+            # get_location_flag = EventMesh.publish("get_location_flag")
+            # if get_location_flag != None:
+            #     # if gnss_state == 2 and get_location_flag == 0:
+            #     #     EventMesh.publish(constants.EVENT.GPSCLOSE)
+            #     if(get_location_flag == 0):
+            #         EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.UD_SEND) #开始UD定位
+
+            """7分钟一次心跳"""
+            if  math.fabs(time_tmp - self.KA_time) > heartbeat_time: #7分钟一次心跳
+                self.KA_time = time_tmp
+                EventMesh.publish(constants.PROTOCOL.KA_SEND)
+
+            """定时定位"""
+            #EventMesh.publish("set_upload_data",3*60)
+            self.upload_time = EventMesh.publish("get_upload_data")
+            #EventMesh.debug_log("self.upload_time:{} math.fabs(time_tmp - self.UD_time):{}".format(self.upload_time,math.fabs(time_tmp - self.UD_time)))
+            if self.upload_time != None :
+                if  math.fabs(time_tmp - self.UD_time) > self.upload_time: #30分钟一次定位
+                    self.UD_time = time_tmp
+
+                    status_tmp = 4
+                    #EventMesh.txt_log("status_count:{}".format(status_tmp))
+                    if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1 and status_tmp > 3 :
+                        EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.UD_SEND) #开始UD定位
+
+                    else : #关闭定位
+                        #EventMesh.txt_log("NO status")
+                        EventMesh.debug_log("NO status")
+                        EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 
+            
+            EventMesh.publish(constants.EVENT.PUSH_STEP, self.get_step_count())
+
+            """电池平均值"""
+            temp = Power.getVbatt()
+            if self.bat_count < 10:
+                self.vbat_buf.append(temp)
+                self.bat_count += 1
+            else:
+                for i in range(9):
+                    self.vbat_buf[i] = self.vbat_buf[i+1]
+                self.vbat_buf[9] = temp
+            curr_count = len(self.vbat_buf)
+            bat_total_value = 0
+            for i in range(curr_count):
+                bat_total_value += self.vbat_buf[i]
+            bat_total_value = bat_total_value//curr_count#一分钟更新一次电量 10个平均值
+            EventMesh.publish("set_curr_battery_level",bat_total_value)
+            # EventMesh.debug_log("self.vbat_buf:{} curr_count :{} bat_total_value:{} temp:{}".format(self.vbat_buf,curr_count,bat_total_value,temp))
+            bat_tmp = EventMesh.publish("screen_get_battery")
+            self.vbat_count+=10
+            if self.vbat_count >= 60:
+                self.vbat_count = 0
+                if bat_tmp != None:
+                    bat_value = bat_tmp[1]
+                    if bat_value <= 0:
+                        pass
+                        # EventMesh.publish("load_screen", {"screen": "LOW_ONE_POWER"})
+            
+            
+            """"隔天清步数"""
+
+            data = RTC().datetime()
+
+            hour = int(data[4])
+            min = int(data[5])
+
+
+
+            cur_month = int(data[1])
+            cur_day = int(data[2])
+            cur_year = int(data[0])
+
+            old_Timesec = EventMesh.publish("get_old_time_data")
+            # EventMesh.debug_log("hour:{} {} cur_month:{} {} next_alarm_time:{} old_Timesec:{}".format(hour,min,cur_month,cur_day,next_alarm_time,old_Timesec))
+            # EventMesh.debug_log("old_Timesec",old_Timesec)
+            if old_Timesec != None:
+                next_alarm_time = utime.localtime(int(old_Timesec))
+                month = int(next_alarm_time[1]) #00:00 18
+                day = int(next_alarm_time[2])
+                year = int(next_alarm_time[0])
+                if month != cur_month or day != cur_day or year != cur_year:#年 月 日只要其中一个都不一样就清零
+                    EventMesh.publish("set_old_time_data",time_tmp)
+
+
+                    EventMesh.publish("set_old_step_value",0)
+                    
+                    hr = EventMesh.publish("get_old_hr_data")
+                    if hr != 0:
+                        EventMesh.publish("set_old_hr_data", 0)
+                    
+                    spo2 = EventMesh.publish("get_old_spo2_data")
+                    if spo2 != 0:
+                        EventMesh.publish("set_old_spo2_data", 0)
+                    EventMesh.debug_log("clear step1111")
+                else:
+                    pass
+                    
+                    
+            if hour == 23:#清步数23:59
+                if min == 59:#58 59
+                    # if self.clear_step == 0:
+                    #     self.clear_step = 1
+                    EventMesh.publish("set_old_time_data",time_tmp)
+
+                    EventMesh.publish("set_old_step_value",0)
+
+                    hr = EventMesh.publish("get_old_hr_data")
+                    if hr != 0:
+                        EventMesh.publish("set_old_hr_data", 0)
+                    
+                    spo2 = EventMesh.publish("get_old_spo2_data")
+                    if spo2 != 0:
+                        EventMesh.publish("set_old_spo2_data", 0)
+                    EventMesh.debug_log("clear step2222")
+
+                else:
+                    self.clear_step = 0
+            else:
+                self.clear_step = 0
+            
+            """电量小于0% 关机"""
+            get_low_btn = EventMesh.publish("get_low_bat_btn")#
+            battery = EventMesh.publish("screen_get_battery")
+
+            if battery != None:
+                power = int(battery[1])
+                if battery[0] != '1':
+                    if power == 0:
+                        EventMesh.publish("open_power_on",2)#  
+                    """"低电报警"""
+                    # print("low power!!!!!!!!!!! %d",self.low_power_AL)
+                    if power <= 15 and self.low_power_AL==0:
+                        self.low_power_AL = 1
+                        dev_state =  EventMesh.publish("get_dev_state")
+
+                        tmp = 1 << 17
+                        dev_state = dev_state|tmp #第17位=1
+                        EventMesh.publish("set_dev_state",dev_state)
+                        EventMesh.publish(constants.EVENT.START_LOCATION,[constants.PROTOCOL.AL_SEND,dev_state]) #开始AL定位
+
+                if power >= 50:
+                    self.low_power_AL = 0
+            
+            """未联网提示关机"""
+            ble=EventMesh.publish(constants.EVENT.GET_CONNECT)
+            # EventMesh.debug_log("ble",ble)
+            if ble == 0:#未联网提示关机
+                if battery[0] != '1':
+                    self.no_smi_count+=10
+                    # EventMesh.debug_log("self.no_smi_count",self.no_smi_count)
+                    if self.no_smi_count >= (15*60):#(15*60)
+                        self.no_smi_count = 0
+                        EventMesh.publish("open_power_on",2)#  #未检测到sim卡15分钟后关机
+                    
+            else:
+                self.no_smi_count = 0
+
+            msg_nums = sms.getMsgNums() #获取短信条数
+            # EventMesh.debug_log("msg_nums",msg_nums)
+            if(msg_nums != -1):
+                sms_data = sms.getSaveLoc()
+                sms_max = sms_data[0][2]
+                if msg_nums >= sms_max-1:
+                    EventMesh.publish("delete_sms_event")#
+
+            #佩戴检测
+            WEAR = EventMesh.publish(constants.EVENT.GET_WEAR)#佩戴数据
+            if self.wear != WEAR:
+                remove_sw = EventMesh.publish("get_storage_config","remove_sw")
+                if remove_sw == "1":#开启了佩戴检测的开关
+                    dev_state =  EventMesh.publish("get_dev_state")
+                    
+                    if WEAR != 1:
+                        tmp = 1 << 3
+                        tmp = ~tmp
+                        tmp = 1 << 20
+                        dev_state = dev_state|tmp #第20位=1
+                    # else :     
+                    #     pass              
+                        
+                    #     tmp = 1 << 20
+                    #     dev_state = dev_state|tmp #第20位=1
+                    #     tmp = 1 << 3
+                    #     dev_state = dev_state|tmp #第三位=1
+                        EventMesh.debug_log("佩戴检测:{}".format(dev_state))    
+                        EventMesh.publish("set_dev_state",dev_state)
+                        EventMesh.publish(constants.EVENT.START_LOCATION,[constants.PROTOCOL.AL_SEND,dev_state]) #开始AL定位,发送报警
+                        #EventMesh.publish(constants.PROTOCOL.HELP_SEND,65)
+            self.wear = WEAR
+            """定时测量心率,血氧,体温"""
+            self.get_hr_state = EventMesh.publish("get_hr_state")
+            self.get_spo2_state = EventMesh.publish("get_spo2_state")
+            get_temp_time  = EventMesh.publish("get_temp_time")
+            get_temp_state  = EventMesh.publish("get_temp_state")
+            get_bp_state  = EventMesh.publish("get_bp_state")
+            get_bg_state  = EventMesh.publish("get_bg_state")
+            if get_bg_state == None:
+                get_bg_state = 0
+            if get_bp_state == None:
+                get_bp_state = 0
+
+            if get_temp_state == None:
+                get_temp_state = 0
+
+            if self.get_hr_state == None:
+                self.get_hr_state = 0
+            if self.get_spo2_state == None:
+                self.get_spo2_state = 0 
+
+            video_state = EventMesh.publish("get_video_state")#获取
+            if video_state == None:
+                video_state = 0
+                
+            call_state = EventMesh.publish("get_call_state")
+            if call_state == None:
+                call_state = 0
+
+
+            video_state = EventMesh.publish("get_video_state")
+            if video_state != None:
+                if battery[0] != "1":
+                    if get_temp_state != None and call_state != None and video_state != None: #突然脱腕
+
+                        if get_temp_state > 1  and (WEAR != 1 or call_state != 0 or video_state != 0):
+                            EventMesh.publish(constants.EVENT.STOP_TEMP)
+                            EventMesh.publish("set_temp_state",0)       
+                            EventMesh.txt_log("auto stop_temp:22")
+
+                        if (self.get_hr_state > 1 or self.get_spo2_state > 1 or get_bp_state > 1 or get_bg_state > 1) and (WEAR != 1 or call_state != 0 or video_state != 0):
+                            # print("wear faile")
+                            if self.get_hr_state > 1 :
+                                EventMesh.txt_log("auto stop_hr:22")
+                                EventMesh.publish("set_hr_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 
+                                EventMesh.publish(constants.EVENT.STOP_HEART) 
+                                if WEAR == 1:
+                                    heart_value = EventMesh.publish(constants.EVENT.GET_HEART)
+                                    if heart_value >= 50 and heart_value != None:
+                                        EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据
+                                
+                            if self.get_spo2_state > 1:
+                                EventMesh.txt_log("auto stop_spo2:22")
+                                EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
+
+                                EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
+                                spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)
+                                if WEAR == 1:
+                                    if spo2_value > 85 and spo2_value != None:
+                                        EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)
+                                
+                            if get_bp_state > 1:
+
+                                EventMesh.txt_log("auto stop_bp:22")
+                                EventMesh.publish("set_bp_state",0)#2代表后台进入测试
+                                EventMesh.publish(constants.EVENT.STOP_HEART)
+                                if WEAR == 1:
+                                    blood_data = get_autoblood_value()
+                                    if blood_data == None:
+                                        blood_data[0] = 0
+                                        blood_data[1] = 0
+
+                                    max_value = blood_data[0]
+                                    min_value = blood_data[1]
+                                    if max_value != 0 and min_value != 0:
+                                        EventMesh.publish(constants.PROTOCOL.BLOOD_SEND,[max_value,min_value])
+                                
+                            if get_bg_state > 1:
+                                EventMesh.txt_log("auto stop_bg:22")
+                                
+                                EventMesh.publish("set_bg_state",0)#2代表后台进入测试
+                                EventMesh.publish(constants.EVENT.STOP_HEART)
+                                if WEAR == 1:
+                                    bg_data = get_blood_sugar_value()
+                                    if bg_data == None:
+                                        bg_data = 0
+                                    if bg_data != 0:
+                                        # EventMesh.publish("play_sugar_value", bg_data)#播放血糖数值
+                                        EventMesh.publish(constants.PROTOCOL.BLOODGLUSOCE_SEND,bg_data)   
+        
+            if self.pull_time == 0:
+                self.pull_time = time_tmp
+            # if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#已联网 并且不在充电 佩戴正常 不在通话就给测试心率
+            if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1 and battery[0] != "1" and WEAR == 1 and call_state == 0 and video_state == 0:
+                #防止时间校时出错
+                if time_tmp < self.pull_time :
+                    self.pull_time = time_tmp
+                if time_tmp < self.temp_timeSecond:
+                    self.temp_timeSecond = time_tmp
+                if time_tmp < self.hr_timeSecond:
+                    self.hr_timeSecond = time_tmp
+                if time_tmp < self.spo2_timeSecond :
+                    self.spo2_timeSecond = time_tmp
+                if time_tmp < self.bp_timeSecond:
+                    self.bp_timeSecond = time_tmp
+                if time_tmp < self.bg_timeSecond:
+                     self.bg_timeSecond = time_tmp
+
+                if time_tmp - self.pull_time >= 30:
+                    # EventMesh.debug_log("shifens:")  
+
+                    get_hr_state = EventMesh.publish("get_hr_state")
+                    get_spo2_state = EventMesh.publish("get_spo2_state")
+                    get_bp_state  = EventMesh.publish("get_bp_state")
+                    get_bg_state  = EventMesh.publish("get_bg_state")
+                    get_temp_state  = EventMesh.publish("get_temp_state")
+                    if get_hr_state == None:
+                        get_hr_state = 0
+                        self.old_hr_time = 0
+
+                    if get_spo2_state == None:
+                        get_spo2_state = 0
+                        self.old_spo2_time = 0
+
+                    if get_temp_state == None:
+                        get_temp_state = 0
+                        self.temp_one_state = 0
+
+                    if get_bp_state == None:
+                        get_bp_state = 0
+                        self.old_bp_time = 0
+                    
+                    if get_bg_state == None:
+                        get_bg_state = 0
+                        self.old_bg_time = 0
+                    
+                    # print("bp get_bp_state ",get_bp_state,self.old_bp_time)
+
+                    
+                    if get_hr_state != None:
+                        if get_hr_state == 3:
+                            self.old_hr_time+=1
+                            if self.old_hr_time == 1:
+                                EventMesh.publish("set_hr_state",3)#2代表后台进入测试
+                                # EventMesh.publish("set_hr_blood_led",1)
+                                EventMesh.publish(constants.EVENT.START_HEART)
+                                EventMesh.txt_log("auto start_hr:333")
+                            elif self.old_hr_time > 6:
+                                self.old_hr_time = 0
+                                EventMesh.publish("set_hr_state",0)#2代表后台进入测试
+                                EventMesh.txt_log("auto stop_hr:333")
+                                EventMesh.publish(constants.EVENT.STOP_HEART)
+                                heart_value = EventMesh.publish(constants.EVENT.GET_HEART)
+                                EventMesh.debug_log("heart_value:{}".format(heart_value))
+                                if heart_value >= 50 and heart_value != None:
+                                    EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据
+                                EventMesh.debug_log("STOP_HEART:3")
+                        else:
+                            self.old_hr_time = 0
+                    else:
+                        self.old_hr_time = 0
+
+
+                    if get_spo2_state != None:
+                        if get_spo2_state == 3:
+                            self.old_spo2_time+=1
+                            if self.old_spo2_time == 1:
+                                EventMesh.publish("set_spo2_state",3)#2代表后台进入测试
+                                # EventMesh.publish("set_hr_blood_led",1)
+                                EventMesh.publish(constants.EVENT.START_BLOOD_OXYGEN)#K开血氧
+                                EventMesh.txt_log("auto start_spo2:333")
+                            elif self.old_spo2_time > 6:
+                                self.old_spo2_time = 0
+                                EventMesh.txt_log("auto stop_spo2:333")
+                                EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
+                                EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
+                                spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)
+                                if spo2_value > 85 and spo2_value != None:
+                                    EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)
+                                    
+                        else:
+                            self.old_spo2_time = 0
+                    else:
+                        self.old_spo2_time = 0
+
+
+                    if get_bp_state != None:
+                        if get_bp_state == 3:
+                            self.old_bp_time+=1
+                            if self.old_bp_time == 1:
+                                EventMesh.publish("set_bp_state",3)#2代表后台进入测试
+                                # EventMesh.publish("set_hr_blood_led",1)
+                                EventMesh.publish(constants.EVENT.START_HEART)
+                                EventMesh.txt_log("auto start_bp:333")
+                            elif self.old_bp_time > 6:
+                                self.old_bp_time = 0
+                                
+                                EventMesh.publish("set_bp_state",0)#2代表后台进入测试
+                                # EventMesh.publish("stop_led_timer")#设置参数
+                                blood_data = get_autoblood_value()
+                                if blood_data == None:
+                                    blood_data[0] = 0
+                                    blood_data[1] = 0
+
+                                max_value = blood_data[0]
+                                min_value = blood_data[1]
+                                if max_value != 0 and min_value != 0:
+                                    EventMesh.publish(constants.PROTOCOL.BLOOD_SEND,[max_value,min_value])
+                                EventMesh.publish(constants.EVENT.STOP_HEART)
+                                EventMesh.txt_log("auto stop_bp:333")
+                        else:
+                            self.old_bp_time = 0
+                    else:
+                        self.old_bp_time = 0
+
+                    if get_bg_state != None:
+                        if get_bg_state == 3:
+                            self.old_bg_time+=1
+                            if self.old_bg_time == 1:
+                                EventMesh.publish("set_bg_state",3)#2代表后台进入测试
+                                # EventMesh.publish("set_hr_blood_led",1)
+                                EventMesh.publish(constants.EVENT.START_HEART)
+                                EventMesh.txt_log("auto start_bg:333")
+                            elif self.old_bg_time > 6:
+                                self.old_bg_time = 0
+                                EventMesh.publish("set_bg_state",0)#2代表后台进入测试
+                                EventMesh.publish(constants.EVENT.STOP_HEART)
+                                # EventMesh.publish("stop_led_timer")#设置参数
+                                bg_data = get_blood_sugar_value()
+                                if bg_data == None:
+                                    bg_data = 0
+                                if bg_data != 0:
+                                    EventMesh.publish(constants.PROTOCOL.BLOODGLUSOCE_SEND,bg_data)
+
+                                EventMesh.txt_log("auto stop_bp:333")
+                        else:
+                            self.old_bg_time = 0
+                    else:
+                        self.old_bg_time = 0
+
+                    
+                    if get_temp_state != None:
+                        if get_temp_state == 3:#单次测量
+                            self.temp_one_state+=1
+                            if self.temp_one_state == 1:
+                                EventMesh.txt_log("auto start_temp:333")
+                                EventMesh.debug_log("AUTO one temp:2") 
+                                EventMesh.publish("set_temp_state",3)
+                                # EventMesh.publish("set_hr_blood_led",1)
+                                EventMesh.publish(constants.EVENT.START_TEMP)   
+                            elif self.temp_one_state > 3:
+                                self.temp_one_state = 0
+                                temp = EventMesh.publish(constants.EVENT.GET_TEMP) 
+                                temp = self.optimize_temp(temp)
+                                
+                                EventMesh.publish("set_temp_state",0)
+                                tmp_f_tmp = 0
+                                tmp_d_tmp = 0
+                                if str(temp).find(".") != -1:
+                                    tmp_f = str(temp).split('.')[0] 
+                                    tmp_f_tmp = int(tmp_f)
+                                    
+                                    tmp_d = str(temp).split('.')[1][:1]
+                                    tmp_d_tmp = int(tmp_d)
+                                else:
+                                    tmp_f_tmp = temp
+                                    
+                                if temp != None:
+                                    if temp != 0:
+                                        EventMesh.publish(constants.PROTOCOL.TEMP_SEND,[tmp_f_tmp,tmp_d_tmp])
+                                EventMesh.publish(constants.EVENT.STOP_TEMP)
+                                EventMesh.txt_log("auto start_temp:333")
+
+
+        
+                    
+                    # EventMesh.debug_log("get_temp_time:{} self.temp_one_state:{}".format(get_temp_time,self.temp_one_state))
+                    if get_temp_time != None:#定时测量体温
+                        if get_temp_time > 0:
+                            if get_temp_state != None:
+                                get_temp_state  = EventMesh.publish("get_temp_state")
+                                if get_temp_state == 0 or get_temp_state == 2:
+                                    if (time_tmp-self.temp_timeSecond) >= get_temp_time:#大于一个周期的时间,重新赋值
+                                        self.temp_state = 0
+                                        self.temp_timeSecond = time_tmp
+
+                                    if (time_tmp-self.temp_timeSecond) == 0 and self.temp_state == 0:#一开始就测量 测量一分钟停止测量体温
+                                        self.temp_state = 1
+                                        EventMesh.publish("set_temp_state",2)
+                                        # EventMesh.publish("set_hr_blood_led",1)
+                                        EventMesh.debug_log("AUTO temp:") 
+                                        EventMesh.txt_log("auto START_temp:1")
+                                        EventMesh.publish(constants.EVENT.START_TEMP)
+
+                                    elif (time_tmp-self.temp_timeSecond) >= 30 and self.temp_state == 1 and get_temp_state == 2:
+                                        self.temp_state = 0
+                                        EventMesh.txt_log("auto stop_temp:1")
+                                        EventMesh.publish("set_temp_state",0)
+                                        temp = EventMesh.publish(constants.EVENT.GET_TEMP) 
+                                        temp = self.optimize_temp(temp)
+                                        
+                                        tmp_f_tmp = 0
+                                        tmp_d_tmp = 0
+                                        if str(temp).find(".") != -1:
+                                            tmp_f = str(temp).split('.')[0] 
+                                            tmp_f_tmp = int(tmp_f)
+                                            
+                                            tmp_d = str(temp).split('.')[1][:1]
+                                            tmp_d_tmp = int(tmp_d)
+                                        else:
+                                            tmp_f_tmp = temp
+                                            
+                                        if temp != None:
+                                            if temp != 0:
+                                                EventMesh.publish(constants.PROTOCOL.TEMP_SEND,[tmp_f_tmp,tmp_d_tmp])
+                                        EventMesh.publish(constants.EVENT.STOP_TEMP)
+
+                                else:
+                                    self.temp_state = 0
+                                    self.old_temp_time = 0
+                        else:
+                            temp_state  = EventMesh.publish("get_temp_state") 
+                            if temp_state == 2:
+                                EventMesh.publish("set_temp_state",0)#2代表后台进入测试
+                                # EventMesh.publish("stop_led_timer")#设置参数
+                                EventMesh.txt_log("auto wear stop_temp:2 ")
+                                EventMesh.publish(constants.EVENT.STOP_TEMP)
+                            self.temp_state = 0
+                            self.temp_timeSecond = 0
+                            self.old_temp_time = 0
+
+
+
+                    hr_time = EventMesh.publish("get_time_hr")#获取时间是否大于0
+                    if hr_time !=  None:
+                        self.mearsure_btn = int(hr_time[0])
+                        self.mearsure_timer = int(hr_time[1])
+
+                        if self.mearsure_btn != None and self.mearsure_timer != None:
+                            
+                            if self.mearsure_btn >= 1 and self.mearsure_timer > 0:#开关打开并且时间大于0就可以测试血糖
+                                get_hr_state = EventMesh.publish("get_hr_state")#心率
+                                get_spo2_state = EventMesh.publish("get_spo2_state")#血氧
+                                get_bp_state  = EventMesh.publish("get_bp_state")#血压
+                                get_bg_state  = EventMesh.publish("get_bg_state")#血糖
+                                # print("state hr",get_hr_state,get_spo2_state,get_bp_state,get_bg_state)
+                                if (get_bg_state == 0 and get_spo2_state == 0 and get_bp_state == 0) and  (get_hr_state == 2 or get_hr_state == 0):#心率血压血氧不在测试就测试血糖自动测量
+                                    if (time_tmp-self.hr_timeSecond) >= self.mearsure_timer:#大于一个周期的时间,保存的时间戳时间 1678 0 1678 30 1678 
+                                        self.hr_timeSecond = time_tmp
+                                        self.HR_Onestate = 0
+                                    # print("time_tmp hr",time_tmp,self.hr_timeSecond,time_tmp-self.hr_timeSecond,self.mearsure_timer,self.HR_Onestate)
+                                    if (time_tmp - self.hr_timeSecond) == 0 and self.HR_Onestate == 0:
+                                        self.HR_Onestate = 1
+                                        EventMesh.txt_log("auto START_hr:1")
+                                        EventMesh.publish("set_hr_state",2)#2代表后台进入测试
+                                        # EventMesh.publish("set_hr_blood_led",1)
+                                        EventMesh.publish(constants.EVENT.START_HEART)
+                                        
+                                    elif (time_tmp - self.hr_timeSecond) >= 60 and self.HR_Onestate == 1 and get_hr_state == 2:
+                                        self.HR_Onestate = 0
+                                        EventMesh.publish("set_hr_state",0)#2代表后台进入测试
+                                        EventMesh.debug_log("stop debug3")
+                                        EventMesh.txt_log("auto stop_hr:1")
+                                        EventMesh.publish(constants.EVENT.STOP_HEART)
+                                        heart_value = EventMesh.publish(constants.EVENT.GET_HEART)
+                                        EventMesh.debug_log("heart_value:{}".format(heart_value))
+                                        # heart_value = 60+urandom.randint(0,10)
+                                        if heart_value >= 50 and heart_value != None:
+                                            EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据
+                                        #获取心率数据上传数据app
+                                        EventMesh.debug_log("STOP_HEART:")
+                                        
+                                else:
+                                    self.HR_Onestate = 0
+                            else:
+                                self.hr_timeSecond = 0
+                                self.HR_Onestate = 0
+                                hr_state = EventMesh.publish("get_hr_state")#心率
+                                if hr_state == 2:
+                                    EventMesh.publish("set_hr_state",0)#2代表后台进入测试
+                                    EventMesh.debug_log("33stop debug3")
+                                    # EventMesh.publish("stop_led_timer")#设置参数
+                                    EventMesh.publish(constants.EVENT.STOP_HEART)
+                                    EventMesh.txt_log("auto wear stop_hr:2 ")
+
+                    get_spo2time = EventMesh.publish("get_spo2_time")#血压自动测试
+                    # print("get_spo2time",get_spo2time)
+                    if get_spo2time != None:#血压时间不为0
+                        spo2_on = int(get_spo2time[0])
+                        spo2_time = int(get_spo2time[1])
+                        if spo2_on != 0 and spo2_time != 0:
+                            get_hr_state = EventMesh.publish("get_hr_state")
+                            get_spo2_state = EventMesh.publish("get_spo2_state")
+                            get_bp_state  = EventMesh.publish("get_bp_state")
+                            get_bg_state  = EventMesh.publish("get_bg_state")
+                            # print("state bg2",get_hr_state,get_spo2_state,get_bp_state,get_bg_state)
+                            if (get_hr_state == 0 and get_bp_state == 0 and get_bg_state == 0) and (get_spo2_state == 2 or get_spo2_state == 0):#心率血压血氧不在测试就测试血糖自动测量
+                                if (time_tmp-self.spo2_timeSecond) >= spo2_time:#大于一个周期的时间,保存的时间戳时间 1678 0 1678 30 1678 
+                                    self.spo2_timeSecond = time_tmp
+                                    self.spo2auto_state = 0
+                                # print("time_tmp spo2",time_tmp,self.spo2_timeSecond,time_tmp-self.spo2_timeSecond,self.bg_timer,self.bpauto_state)
+                                if (time_tmp - self.spo2_timeSecond) == 0 and self.spo2auto_state == 0:
+                                    self.spo2auto_state = 1
+                                    EventMesh.debug_log("START_spo2:auto")
+                                    EventMesh.txt_log("auto START_spo2:1")
+                                    EventMesh.publish("set_spo2_state",2)#2代表后台进入测试
+                                    EventMesh.publish(constants.EVENT.START_BLOOD_OXYGEN)#K开血氧
+                                    
+                                elif (time_tmp - self.spo2_timeSecond) >= 60 and self.spo2auto_state == 1 and get_spo2_state == 2:
+                                    EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
+                                    self.spo2auto_state = 0
+                                    EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
+                                    spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)
+                                    if spo2_value > 85 and spo2_value != None:
+                                        EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)
+                                    EventMesh.txt_log("auto stop_spo2:1")
+                                
+                            else:
+                                self.spo2auto_state = 0
+                        else:
+                            self.spo2_timeSecond = 0
+                            self.spo2auto_state = 0
+                            spo2_state = EventMesh.publish("get_spo2_state")#心率
+                            if spo2_state == 2:
+                                EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
+                                EventMesh.debug_log("spo2 stop debug3")
+                                EventMesh.txt_log("auto wear stop_spo2:2 ")
+                                EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
+
+
+                    get_bptime = EventMesh.publish("get_bp_time")#血压自动测试
+                    # print("get_bptime",get_bptime)
+                    if get_bptime != None:#血压时间不为0
+                        bp_on = int(get_bptime[0])
+                        bp_time = int(get_bptime[1])
+                        if bp_on != 0 and bp_time != 0:
+                            get_hr_state = EventMesh.publish("get_hr_state")
+                            get_spo2_state = EventMesh.publish("get_spo2_state")
+                            get_bp_state  = EventMesh.publish("get_bp_state")
+                            get_bg_state  = EventMesh.publish("get_bg_state")
+                            # print("state bg2",get_hr_state,get_spo2_state,get_bp_state,get_bg_state)
+                            
+                            if (get_hr_state == 0 and get_spo2_state == 0 and get_bg_state == 0) and (get_bp_state == 2 or get_bp_state == 0):#心率血压血氧不在测试就测试血糖自动测量
+                                if (time_tmp-self.bp_timeSecond) >= bp_time:#大于一个周期的时间,保存的时间戳时间 1678 0 1678 30 1678 
+                                    self.bp_timeSecond = time_tmp
+                                    self.bpauto_state = 0
+                                # print("time_tmp bp",time_tmp,self.bp_timeSecond,time_tmp-self.bp_timeSecond,self.bg_timer,self.bpauto_state)
+                                if (time_tmp - self.bp_timeSecond) == 0 and self.bpauto_state == 0:
+                                    self.bpauto_state = 1
+                                    EventMesh.debug_log("START_bp:auto")
+                                    EventMesh.txt_log("auto START_bp:1")
+                                    EventMesh.publish("set_bp_state",2)#2代表后台进入测试
+                                    # EventMesh.publish("set_hr_blood_led",1)
+                                    EventMesh.publish(constants.EVENT.START_HEART)
+                                    
+                                elif (time_tmp - self.bp_timeSecond) >= 60 and self.bpauto_state == 1 and get_bp_state == 2:
+                                    self.bpauto_state = 0
+                                    EventMesh.publish("set_bp_state",0)#2代表后台进入测试
+                                    blood_data = get_autoblood_value()
+                                    if blood_data == None:
+                                        blood_data[0] = 0
+                                        blood_data[1] = 0
+
+                                    max_value = blood_data[0]
+                                    min_value = blood_data[1]
+                                    if max_value != 0 and min_value != 0:
+                                        EventMesh.publish(constants.PROTOCOL.BLOOD_SEND,[max_value,min_value])
+                                    EventMesh.publish(constants.EVENT.STOP_HEART)
+                                    EventMesh.txt_log("auto stop_bp:1")
+                                    
+                            else:
+                                self.bpauto_state = 0
+                        else:
+                            self.bp_timeSecond = 0
+                            self.bpauto_state = 0
+                            bp_state = EventMesh.publish("get_bp_state")#心率
+                            if bp_state == 2:
+                                EventMesh.publish("set_bp_state",0)#2代表后台进入测试
+                                EventMesh.debug_log("bp stop debug3")
+                                EventMesh.txt_log("auto wear stop_bp:2 ")
+                                # EventMesh.publish("stop_led_timer")#设置参数
+                                EventMesh.publish(constants.EVENT.STOP_HEART)
+
+
+
+                    bg_time = EventMesh.publish("get_bgauto_time")
+                    if bg_time != None:
+                    
+                        bg_btn = int(bg_time[0])
+                        bg_timer = int(bg_time[1]) 
+                        # print("state bg2",self.bg_btn,self.bg_timer)
+                        if bg_btn >= 1 and bg_timer > 0:#开关打开并且时间大于0就可以测试血糖
+                            get_hr_state = EventMesh.publish("get_hr_state")
+                            get_spo2_state = EventMesh.publish("get_spo2_state")
+                            get_bp_state  = EventMesh.publish("get_bp_state")
+                            get_bg_state  = EventMesh.publish("get_bg_state")
+                            # print("state bg2",get_hr_state,get_spo2_state,get_bp_state,get_bg_state)
+                            
+                            if (get_hr_state == 0 and get_spo2_state == 0 and get_bp_state == 0) and (get_bg_state == 2 or get_bg_state == 0):#心率血压血氧不在测试就测试血糖自动测量
+                                if (time_tmp-self.bg_timeSecond) >= bg_timer:#大于一个周期的时间,保存的时间戳时间 1678 0 1678 30 1678 
+                                    self.bg_timeSecond = time_tmp #1780 
+                                    self.BG_state = 0
+                                # print("time_tmp bg",time_tmp,self.bg_timeSecond,time_tmp-self.bg_timeSecond,bg_timer,self.BG_state)
+                                if (time_tmp - self.bg_timeSecond) == 0 and self.BG_state == 0:
+                                    EventMesh.debug_log("START_bg:1")
+                                    EventMesh.txt_log("auto START_bg:1")
+                                    EventMesh.publish("set_bg_state",2)#2代表后台进入测试
+                                    # EventMesh.publish("set_hr_blood_led",1)
+                                    EventMesh.publish(constants.EVENT.START_HEART)
+                                    self.BG_state = 1
+                                elif (time_tmp - self.bg_timeSecond) >= 60 and self.BG_state == 1 and get_bg_state == 2:
+                                    self.BG_state = 0
+                                    EventMesh.publish("set_bg_state",0)#2代表后台进入测试
+                                    # EventMesh.publish("stop_led_timer")#设置参数
+                                    EventMesh.txt_log("auto stop_bg:1")
+                                    EventMesh.debug_log("stop bgdebug3")
+                                    EventMesh.publish(constants.EVENT.STOP_HEART)
+                                    bgdata = get_blood_sugar_value()
+                                    if bgdata == None:
+                                        bgdata = 0
+                                    if bgdata != 0:
+                                        EventMesh.debug_log("bgdata",bgdata)
+                                        EventMesh.publish(constants.PROTOCOL.BLOODGLUSOCE_SEND,bgdata)#上传心率数据
+                                    
+                            else:
+                                
+                                self.BG_state = 0
+                        else:
+                            bg_state  = EventMesh.publish("get_bg_state") 
+                            if bg_state == 2:
+                                EventMesh.publish("set_bg_state",0)#2代表后台进入测试
+                                # EventMesh.publish("stop_led_timer")#设置参数
+                                EventMesh.debug_log("bg stop bgdebug3")
+                                EventMesh.txt_log("auto wear stop_bg:2 ")
+                                EventMesh.publish(constants.EVENT.STOP_HEART)
+                            self.bg_timeSecond = 0
+                            self.BG_state = 0
+
+
+
+
+
+                else:
+                    self.old_temp_time = 0
+                    self.old_time = 0
+                    # self.hr_timeSecond = time_tmp
+                    self.HR_Onestate = 0
+                    self.HR_OneTime = 0
+                    self.HR_state = 0
+                    self.old_time = 0    
+                    self.old_bp_time = 0
+                    self.old_hr_time = 0
+                    self.old_spo2_time = 0
+                    self.set_hsenor_crt = 0
+                    self.old_bg_time = 0
+                    # self.bg_timeSecond = time_tmp
+                    self.BG_state = 0
+                    # self.temp_timeSecond = time_tmp
+
+                    # self.bp_timeSecond = time_tmp
+                    self.bpauto_state = 0
+
+                    # self.spo2_timeSecond = time_tmp
+                    self.spo2auto_state = 0
+
+                    self.temp_state = 0
+                    self.temp_one_state = 0
+
+
+            else:
+                self.old_temp_time = 0
+                self.old_time = 0
+                # self.hr_timeSecond = time_tmp
+                self.HR_Onestate = 0
+                self.HR_OneTime = 0
+                self.HR_state = 0
+                self.old_time = 0    
+                self.old_bp_time = 0
+                self.old_hr_time = 0
+                self.old_spo2_time = 0
+                self.set_hsenor_crt = 0
+                self.old_bg_time = 0
+                # self.bg_timeSecond = time_tmp
+
+                self.BG_state = 0
+                # self.temp_timeSecond = time_tmp
+
+                # self.bp_timeSecond = time_tmp
+                self.bpauto_state = 0
+
+                # self.spo2_timeSecond = time_tmp
+                self.spo2auto_state = 0
+
+                self.temp_state = 0
+                self.temp_one_state = 0
+
+                get_hr_state = EventMesh.publish("get_hr_state")
+                get_spo2_state = EventMesh.publish("get_spo2_state")
+                get_bp_state  = EventMesh.publish("get_bp_state")
+                get_bg_state  = EventMesh.publish("get_bg_state")
+                if get_hr_state != None and get_spo2_state != None and get_bp_state != None and get_bg_state != None:
+                    if get_hr_state > 1:
+                        EventMesh.txt_log("auto stop_hr:44")
+                        EventMesh.publish("set_hr_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 
+                        # if get_hr_state == 3:
+                        #     EventMesh.publish("stop_led_timer")#设置参数
+                        EventMesh.debug_log("stop debug8")
+                        if WEAR == 1:
+                            heart_value = EventMesh.publish(constants.EVENT.GET_HEART)
+                            if heart_value >= 50 and heart_value != None:
+                                EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据
+                        EventMesh.publish(constants.EVENT.STOP_HEART) 
+                    elif get_spo2_state > 1:
+                        EventMesh.txt_log("auto stop_spo2:44")
+                        EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
+                        # if get_spo2_state == 3:
+                        #     EventMesh.publish("stop_led_timer")#设置参数
+                        if WEAR == 1:
+                            spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)
+                            if spo2_value > 85 and spo2_value != None:
+                                EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)
+                        EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
+                        EventMesh.debug_log("stop debug13")
+                    elif get_bp_state > 1:
+                        EventMesh.txt_log("auto stop_bp:44")
+                        EventMesh.publish("set_bp_state",0)#2代表后台进入测试
+                        # if get_bp_state == 3:
+                        #     EventMesh.publish("stop_led_timer")#设置参数
+                        if WEAR == 1:
+                            blood_data = get_autoblood_value()
+                            if blood_data == None:
+                                blood_data[0] = 0
+                                blood_data[1] = 0
+
+                            max_value = blood_data[0]
+                            min_value = blood_data[1]
+                            if max_value != 0 and min_value != 0:
+                                EventMesh.publish(constants.PROTOCOL.BLOOD_SEND,[max_value,min_value])
+                        EventMesh.publish(constants.EVENT.STOP_HEART)
+                        EventMesh.debug_log("stop debug14")
+                    elif get_bg_state > 1:
+                        EventMesh.txt_log("auto stop_bg:44")
+                        EventMesh.publish("set_bg_state",0)#2代表后台进入测试
+                        # if get_bg_state == 3:
+                        #     EventMesh.publish("stop_led_timer")#设置参数
+                        EventMesh.publish(constants.EVENT.STOP_HEART)
+                        if WEAR == 1:
+                            bgdata = get_blood_sugar_value()
+                            if bgdata == None:
+                                bgdata = 0
+                            if bgdata != 0:
+                                EventMesh.publish(constants.PROTOCOL.BLOODGLUSOCE_SEND,bgdata)#上传心率数据
+                        EventMesh.debug_log("stop debug15")
+                get_temp_state  = EventMesh.publish("get_temp_state")
+                if get_temp_state != None:
+                    if get_temp_state > 1:
+                        self.temp_one_state = 0
+                        self.temp_state = 0
+                        temp = EventMesh.publish(constants.EVENT.GET_TEMP)       
+                        temp = self.optimize_temp(temp)
+                        EventMesh.txt_log("auto stop_temp:44")
+                        EventMesh.publish("set_temp_state",0)
+                        if WEAR == 1:
+                            tmp_f_tmp = 0
+                            tmp_d_tmp = 0
+                            if str(temp).find(".") != -1:
+                                tmp_f = str(temp).split('.')[0] 
+                                tmp_f_tmp = int(tmp_f)
+                                
+                                tmp_d = str(temp).split('.')[1][:1]
+                                tmp_d_tmp = int(tmp_d)
+                            else:
+                                tmp_f_tmp = temp
+                                
+                            if temp != None:
+                                if temp != 0:
+                                    EventMesh.publish(constants.PROTOCOL.TEMP_SEND,[tmp_f_tmp,tmp_d_tmp])
+                        EventMesh.publish(constants.EVENT.STOP_TEMP)
+
+
+            hr_state = EventMesh.publish("get_hr_state")
+            spo2_state = EventMesh.publish("get_spo2_state")
+            temp_state  = EventMesh.publish("get_temp_state")
+            if hr_state != None or spo2_state != None or temp_state != None:#手动测试
+                auto_hr = EventMesh.publish("get_start_measure_time")#设置开始测量的时间戳时间
+                if auto_hr == None:
+                    auto_hr = 0
+                if hr_state == 1:
+                    if auto_hr != 0:
+                        self.auto_hr_count+=1
+                        if  self.auto_hr_count > 6:
+                            self.auto_hr_count = 0
+                            EventMesh.publish("set_hr_state",0)#0代表g关闭测试
+                            EventMesh.debug_log("stop debug7")
+                            EventMesh.publish(constants.EVENT.STOP_HEART)
+                            heart_value = EventMesh.publish(constants.EVENT.GET_HEART)
+                            if heart_value >= 50 and heart_value != None:
+                                EventMesh.publish("play_hr_value",heart_value)
+                                # EventMesh.publish("set_history_hr_value",heart_value)
+                                EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据
+
+                                blood_data = get_autoblood_value()
+                                if blood_data == None:
+                                    blood_data[0] = 0
+                                    blood_data[1] = 0
+
+                                max_value = blood_data[0]
+                                min_value = blood_data[1]
+                                if max_value != 0 and min_value != 0:
+                                    EventMesh.publish(constants.PROTOCOL.BLOOD_SEND,[max_value,min_value])
+
+                            else:
+                                EventMesh.publish("play_hr_value",0) 
+                        else :
+                            if WEAR != 1:
+                                EventMesh.publish("set_hr_state",0)#0代表g关闭测试
+                                EventMesh.debug_log("stop debug7")
+                                EventMesh.publish(constants.EVENT.STOP_HEART)                               
+                                EventMesh.publish("play_hr_value",0) 
+                                
+                else:
+                    self.auto_hr_count = 0
+                    
+
+                auto_spo2 = EventMesh.publish("get_start_measure_time")#设置开始测量的时间戳时间
+                if auto_spo2 == None:
+                    auto_spo2 = 0
+                if spo2_state == 1:#手动测试血氧
+                    if auto_spo2 != None:
+                        if auto_spo2 != 0:
+                            self.auto_spo2_count+=1
+                            if self.auto_spo2_count > 6:
+                                self.auto_spo2_count = 0
+                                EventMesh.publish("set_spo2_state",0)#0代表g关闭测试
+                                EventMesh.debug_log("stop spo2 debug7")
+                                EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
+                                spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)
+                                if spo2_value > 85 and spo2_value != None:
+                                    EventMesh.publish("play_spo2_value",spo2_value)
+                                    EventMesh.publish("set_old_spo2_data",spo2_value)
+                                    EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)
+                                else:
+                                    EventMesh.publish("play_spo2_value",0)
+                            
+                            else:
+                                if WEAR != 1:
+                                    EventMesh.publish("set_spo2_state",0)#0代表g关闭测试
+                                    EventMesh.debug_log("stop debug8")
+                                    EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)                               
+                                    EventMesh.publish("play_spo2_value",0) 
+                                    
+                else:
+                    self.auto_spo2_count = 0
+
+                if temp_state == 1:#手动测试体温
+                    auto_temp = EventMesh.publish("get_start_temp_measure_time")#设置开始测量的时间戳时间
+                    if auto_temp == None:
+                        auto_temp = 0
+                    if auto_temp != None:
+                        if auto_temp != 0:
+                            self.auto_temp_count += 1
+                            if self.auto_temp_count > 6:
+                                self.auto_temp_count = 0
+                                EventMesh.debug_log("体温测量结束")
+                                temp = EventMesh.publish(constants.EVENT.GET_TEMP)       
+                                temp = self.optimize_temp(temp)
+                                EventMesh.debug_log("temp",temp)
+                                EventMesh.publish("set_temp_state",0)
+                                tmp_f_tmp = 0
+                                tmp_d_tmp = 0
+                                if str(temp).find(".") != -1:
+                                    tmp_f = str(temp).split('.')[0] 
+                                    tmp_f_tmp = int(tmp_f)
+                                    
+                                    tmp_d = str(temp).split('.')[1][:1]
+                                    tmp_d_tmp = int(tmp_d)
+                                else:
+                                    tmp_f_tmp = temp
+                                    
+                                if temp != None:
+                                    if temp != 0:
+                                        # EventMesh.publish("set_history_temp_value",temp)
+                                        EventMesh.publish("play_temp_value",temp)#播放体温数值
+                                        EventMesh.publish(constants.PROTOCOL.TEMP_SEND,[tmp_f_tmp,tmp_d_tmp])
+                                    else:
+                                        # EventMesh.publish("set_history_temp_value",0)
+                                        EventMesh.publish("play_temp_value",0)#播放体温数值
+                                
+                                EventMesh.publish(constants.EVENT.STOP_TEMP)
+
+                            else :
+                                if WEAR  != 1:
+                                    EventMesh.publish("set_temp_state",0)#0代表g关闭测试
+                                    EventMesh.debug_log("stop debug9")
+                                    EventMesh.publish(constants.EVENT.STOP_TEMP)                               
+                                    EventMesh.publish("play_temp_value",0) 
+                                    
+                else:
+                    self.auto_temp_count = 0
+
+            EventMesh.publish("play_unread_wechat_infor")#每10s检测是否有未读语音数据
+
+            usb_state = EventMesh.publish("get_usb")#
+            
+            # EventMesh.publish("set_led_time_arg",[1,2,20*11,led_mode.FLASH_LIGHT_RED,20,10,led_mode.OTHER_MEASURE_MODE])#測量成功
+            if battery[0] == '1':
+                # EventMesh.debug_log("battery[1]",battery[1])
+                if self.vbat_full_flag <= 120:
+                    self.vbat_full_flag+=10
+                    if self.vbat_full_flag == 60:#开机检测一次如果是充电标识为1就不再提示
+                        if usb_state != 1:
+                            EventMesh.publish("set_usb",1)#
+                else:
+                    if battery[1] >= 100:
+                        if self.charge_full_count == 0:#充电已满
+                            EventMesh.publish("set_usb",3)#
+                            EventMesh.debug_log("charge R_CHARGE_full")
+                            self.charge_full_count = 1
+                    
+            else:
+                self.charge_full_count = 0
+                low_power = battery[1]
+                if low_power <= 5:#小于5%红色灯慢闪
+                    EventMesh.publish("set_led_time_arg",[1,2,20*11,led_mode.FLASH_LIGHT_RED,20,10,led_mode.OTHER_MEASURE_MODE])#測量成功
+                    # EventMesh.publish("set_led_time_arg",[1000,400,52,led_mode.FLASH_LIGHT_RED,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#開始測量
+
+            
+            self.normal_alarm()
+            #喝水提醒
+            self.drink_alarm()
+            #该吃药了
+            self.medicine_alarm()
+            #该起床了
+            self.wakeup_alarm()
+            #该睡觉了
+            self.sleep_alarm()
+            #该回家了
+            self.home_alarm()
+            #该休息了
+            self.reset_alarm()
+
+
+            if self.alarm_flag == 0:
+                self.alarm_flag = 1
+                EventMesh.publish("set_rtc_alarm")
+
+            EventMesh.publish("video_no_network")
+
+        def clear_usb_flag(self,event,msg):
+            self.charge_full_count = 0
+        #普通闹钟
+        def normal_alarm(self):
+            data = RTC().datetime()
+            hour = data[4]
+            min = data[5]
+
+            week = int(data[3])
+
+            date1 = data[1]
+            date2 = data[2]
+            cur_total_min = int(hour)*60+int(min)
+            # EventMesh.debug_log("self.normal_oldtotalmin",self.normal_oldtotalmin,cur_total_min,self.alarm_flag)
+            if self.normal_oldtotalmin == 0:
+                self.normal_oldtotalmin = cur_total_min #549
+            if self.normal_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃
+                if self.normal_flag == 1:
+                    self.normal_flag = 0
+                    self.normal_count = 0
+            normal_alarm = []
+            normal_alarm = EventMesh.publish("get_storage_config","normal_alarm")
+            # EventMesh.debug_log("sleep info2",sleep,cur_total_min)
+            if self.normal_flag == 1:#表示闹钟响过清除标志
+                self.normal_count+=1
+                if self.normal_count > 6:
+                    self.normal_count = 0
+                    self.normal_flag = 0
+            if normal_alarm != None:
+                if len(normal_alarm) != 0 and normal_alarm != []:
+                    j = 0
+                    for i in range(len(normal_alarm)):
+                        # EventMesh.debug_log("normal_alarm normal_alarm 33",normal_alarm,j)
+                        normalalarm_hour = normal_alarm[j]["hour"]
+                        normalalarm_min = normal_alarm[j]["min"]
+                        normalalarm_day = normal_alarm[j]["day"]
+                        normalalarm_enale = normal_alarm[j]["enable"]
+                        normalalarm_totalmin = int(normalalarm_hour)*60+int(normalalarm_min)
+                        # EventMesh.debug_log("wake alarm",normalalarm_hour,sleep_min,sleep_day,sleep_enale,sleep_totalmin,week)
+                        if normalalarm_day == []:#单次闹钟只响一次
+                            if normalalarm_enale != 0:
+                                if cur_total_min > normalalarm_totalmin:
+                                    normal_alarm.pop(j)
+                                    self.normal_count = 0
+                                    self.normal_flag  = 0 
+                                    j=0
+                                    # EventMesh.debug_log("wakeup wakeup dayu",sleep,j)
+                                    EventMesh.publish("set_storage_config",["normal_alarm",normal_alarm])#删除之后重新保存
+                                    # sleep = EventMesh.publish("get_storage_config","sleep_alarm")#删除之后重新保存
+                                    continue
+                                else:
+                                    if normalalarm_totalmin == cur_total_min and self.normal_flag == 0:#14:00
+                                        self.normal_count = 0
+                                        self.normal_flag  = 0    
+                                        normal_alarm.pop(j)
+                                        # EventMesh.debug_log("wakeup wakeup1",sleep,j)
+                                        EventMesh.publish("set_storage_config",["normal_alarm",normal_alarm])#删除之后重新保存
+                                        EventMesh.publish("OPEN_ALARM_RING")                                                                                                                                            
+                                        break
+                        else:
+                            if normalalarm_enale != 0 and (week in normalalarm_day):#记录响过的时间分钟数
+                                if normalalarm_totalmin == cur_total_min and self.normal_flag == 0:#14:00
+                                    self.normal_flag  = 1
+                                    self.normal_count = 0
+                                    self.normal_oldtotalmin = normalalarm_totalmin
+                                    EventMesh.publish("OPEN_ALARM_RING")#                                                                                                                                                  
+                                    break
+                        j+=1
+
+
+        #喝水提醒
+        def drink_alarm(self):
+            date_tmp = utime.localtime()
+            time_tmp = utime.mktime(date_tmp)
+        
+            if self.drink_time == 0:
+                self.drink_time = time_tmp
+            
+            on = EventMesh.publish("get_storage_config","drink_on")
+            time = EventMesh.publish("get_storage_config","drink_time")
+            # print("drink info2",on,time)
+            if on != None and time != None:
+                if on != 0 and time != 0:
+                    if (time_tmp - self.drink_time) >= (time*60*60):#需要转换成小时3600
+                        self.drink_time = time_tmp 
+                        EventMesh.publish("drink_alarm_event")#该喝水了
+                        #该喝水了
+                else:
+                    self.drink_time = 0
+            else:
+                self.drink_time = 0
+
+        #吃药提醒
+        def medicine_alarm(self):
+            data = RTC().datetime()
+            hour = data[4]
+            min = data[5]
+
+            week = int(data[3])
+
+            date1 = data[1]
+            date2 = data[2]
+            cur_total_min = int(hour)*60+int(min)
+            # print("self.medicine_oldtotalmin",self.medicine_oldtotalmin,cur_total_min,self.alarm_flag)
+            if self.medicine_oldtotalmin == 0:
+                self.medicine_oldtotalmin = cur_total_min #549
+            if self.medicine_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃
+                if self.medicine_flag == 1:
+                    self.medicine_flag = 0
+                    self.medicine_count = 0
+            medicine = EventMesh.publish("get_storage_config","medicine")
+            # print("medicine info2",medicine,cur_total_min)
+            if self.medicine_flag == 1:#表示闹钟响过清除标志
+                self.medicine_count+=1
+                if self.medicine_count > 6:
+                    self.medicine_count = 0
+                    self.medicine_flag = 0
+            if medicine != None:
+                if len(medicine) != 0 and medicine != []:
+                    for i in range(len(medicine)):
+                        medicine_hour = medicine[i]["hour"]
+                        medicine_min = medicine[i]["min"]
+                        medicine_day = medicine[i]["day"]
+                        medicine_enale = medicine[i]["enable"]
+                        medicine_totalmin = int(medicine_hour)*60+int(medicine_min)
+                        # print("medicine alarm",medicine_hour,medicine_min,medicine_day,medicine_enale,medicine_totalmin,week)
+                        if medicine_day == []:
+                            if medicine_enale != 0:
+                                if medicine_totalmin == cur_total_min and self.medicine_flag == 0:#14:00
+                                    self.medicine_count = 0
+                                    self.medicine_flag  = 1    
+                                    self.medicine_oldtotalmin = medicine_totalmin#记录响过的时间分钟数
+                                    # print("medicine alarm1")
+                                    EventMesh.publish("medicine_alarm_event")#该吃药了                                                                                                                                              
+                                    break
+                        else:
+                            if medicine_enale != 0 and (week in medicine_day):#记录响过的时间分钟数
+                                if medicine_totalmin == cur_total_min and self.medicine_flag == 0:#14:00
+                                    self.medicine_flag  = 1
+                                    self.medicine_count = 0
+                                    self.medicine_oldtotalmin = medicine_totalmin
+                                    # print("medicine alarm2",)
+                                    EventMesh.publish("medicine_alarm_event")#该吃药了                                                                                                                                                   
+                                    break
+        #该起床了
+        def wakeup_alarm(self):
+            data = RTC().datetime()
+            hour = data[4]
+            min = data[5]
+
+            week = int(data[3])
+
+            date1 = data[1]
+            date2 = data[2]
+            cur_total_min = int(hour)*60+int(min)
+            # EventMesh.debug_log("self.wakeup_oldtotalmin",self.wakeup_oldtotalmin,cur_total_min,self.alarm_flag)
+            if self.wakeup_oldtotalmin == 0:
+                self.wakeup_oldtotalmin = cur_total_min #549
+            if self.wakeup_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃
+                if self.wakeup_flag == 1:
+                    self.wakeup_flag = 0
+                    self.wakeup_count = 0
+            wakeup = []
+            wakeup = EventMesh.publish("get_storage_config","wakeup_alarm")
+            # EventMesh.debug_log("wakeup info2",wakeup,cur_total_min)
+            if self.wakeup_flag == 1:#表示闹钟响过清除标志
+                self.wakeup_count+=1
+                if self.wakeup_count > 6:
+                    self.wakeup_count = 0
+                    self.wakeup_flag = 0
+            if wakeup != None:
+                if len(wakeup) != 0 and wakeup != []:
+                    j = 0
+                    for i in range(len(wakeup)):
+                        wakeup_hour = wakeup[j]["hour"]
+                        wakeup_min = wakeup[j]["min"]
+                        wakeup_day = wakeup[j]["day"]
+                        wakeup_enale = wakeup[j]["enable"]
+                        wakeup_totalmin = int(wakeup_hour)*60+int(wakeup_min)
+                        # EventMesh.debug_log("wake alarm",wakeup_hour,wakeup_min,wakeup_day,wakeup_enale,wakeup_totalmin,week)
+                        if wakeup_day == []:#单次闹钟只响一次
+                            if wakeup_enale != 0:
+                                if cur_total_min > wakeup_totalmin:
+                                    self.wakeup_count = 0
+                                    self.wakeup_flag  = 0    
+                                    wakeup.pop(j)
+                                    j=0#每次删除都从0开始遍历
+                                    # EventMesh.debug_log("wakeup wakeup1 dayu",wakeup,j)
+                                    EventMesh.publish("set_storage_config",["wakeup_alarm",wakeup])
+                                    continue
+                                else:
+                                    if wakeup_totalmin == cur_total_min and self.wakeup_flag == 0:#14:00
+                                        self.wakeup_count = 0
+                                        self.wakeup_flag  = 0    
+                                        wakeup.pop(j)
+                                        EventMesh.debug_log("wakeup wakeup1",wakeup,j)
+                                        EventMesh.publish("set_storage_config",["wakeup_alarm",wakeup])
+                                        EventMesh.publish("wakeup_alarm_event")#该吃药了                                                                                                                                              
+                                        break
+                        else:
+                            if wakeup_enale != 0 and (week in wakeup_day):#记录响过的时间分钟数
+                                if wakeup_totalmin == cur_total_min and self.wakeup_flag == 0:#14:00
+                                    self.wakeup_flag  = 1
+                                    self.wakeup_count = 0
+                                    self.wakeup_oldtotalmin = wakeup_totalmin
+                                    EventMesh.publish("wakeup_alarm_event")#该吃药了                                                                                                                                                   
+                                    break
+                        j+=1
+
+
+        #该睡觉了
+        def sleep_alarm(self):
+            data = RTC().datetime()
+            hour = data[4]
+            min = data[5]
+
+            week = int(data[3])
+
+            date1 = data[1]
+            date2 = data[2]
+            cur_total_min = int(hour)*60+int(min)
+            # EventMesh.debug_log("self.sleep_oldtotalmin",self.sleep_oldtotalmin,cur_total_min,self.alarm_flag)
+            if self.sleep_oldtotalmin == 0:
+                self.sleep_oldtotalmin = cur_total_min #549
+            if self.sleep_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃
+                if self.sleep_flag == 1:
+                    self.sleep_flag = 0
+                    self.sleep_count = 0
+            sleep = []
+            sleep = EventMesh.publish("get_storage_config","sleep_alarm")
+            # EventMesh.debug_log("sleep info2",sleep,cur_total_min)
+            if self.sleep_flag == 1:#表示闹钟响过清除标志
+                self.sleep_count+=1
+                if self.sleep_count > 6:
+                    self.sleep_count = 0
+                    self.sleep_flag = 0
+            if sleep != None:
+                if len(sleep) != 0 and sleep != []:
+                    j = 0
+                    count = int(len(sleep))
+                    for i in range(len(sleep)):
+                        # EventMesh.debug_log("wakeup wakeup 33",sleep,j)
+                        sleep_hour = sleep[j]["hour"]
+                        sleep_min = sleep[j]["min"]
+                        sleep_day = sleep[j]["day"]
+                        sleep_enale = sleep[j]["enable"]
+                        sleep_totalmin = int(sleep_hour)*60+int(sleep_min)
+                        # EventMesh.debug_log("wake alarm",sleep_hour,sleep_min,sleep_day,sleep_enale,sleep_totalmin,week)
+                        if sleep_day == []:#单次闹钟只响一次
+                            if sleep_enale != 0:
+                                if cur_total_min > sleep_totalmin:
+                                    sleep.pop(j)
+                                    self.sleep_count = 0
+                                    self.sleep_flag  = 0 
+                                    j=0
+                                    # EventMesh.debug_log("wakeup wakeup dayu",sleep,j)
+                                    EventMesh.publish("set_storage_config",["sleep_alarm",sleep])#删除之后重新保存
+                                    # sleep = EventMesh.publish("get_storage_config","sleep_alarm")#删除之后重新保存
+                                    continue
+                                else:
+                                    if sleep_totalmin == cur_total_min and self.sleep_flag == 0:#14:00
+                                        self.sleep_count = 0
+                                        self.sleep_flag  = 0    
+                                        sleep.pop(j)
+                                        # EventMesh.debug_log("wakeup wakeup1",sleep,j)
+                                        EventMesh.publish("set_storage_config",["sleep_alarm",sleep])#删除之后重新保存
+                                        EventMesh.publish("sleep_alarm_event")#该吃药了                                                                                                                                              
+                                        break
+                        else:
+                            if sleep_enale != 0 and (week in sleep_day):#记录响过的时间分钟数
+                                if sleep_totalmin == cur_total_min and self.sleep_flag == 0:#14:00
+                                    self.sleep_flag  = 1
+                                    self.sleep_count = 0
+                                    self.sleep_oldtotalmin = sleep_totalmin
+                                    EventMesh.publish("sleep_alarm_event")#该吃药了                                                                                                                                                   
+                                    break
+                        j+=1
+
+
+        #该回家了
+        def home_alarm(self):
+            data = RTC().datetime()
+            hour = data[4]
+            min = data[5]
+
+            week = int(data[3])
+
+            date1 = data[1]
+            date2 = data[2]
+            cur_total_min = int(hour)*60+int(min)
+            # EventMesh.debug_log("self.home_oldtotalmin",self.home_oldtotalmin,cur_total_min,self.alarm_flag)
+            if self.home_oldtotalmin == 0:
+                self.home_oldtotalmin = cur_total_min #549
+            if self.home_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃
+                if self.home_flag == 1:
+                    self.home_flag = 0
+                    self.home_count = 0
+            home = ''
+            home = EventMesh.publish("get_storage_config","home_alarm")
+            # EventMesh.debug_log("sleep info2",sleep,cur_total_min)
+            if self.home_flag == 1:#表示闹钟响过清除标志
+                self.home_count+=1
+                if self.home_count > 6:
+                    self.home_count = 0
+                    self.home_flag = 0
+            if home != None:
+                if len(str(home)) != 0 and str(home) != '':
+                    # EventMesh.debug_log("home home 33",home)
+                    home_hour = int(str(home).split(":")[0])
+                    home_min = int(str(home).split(":")[1])
+                    
+                    home_totalmin = int(home_hour)*60+int(home_min)
+                    if home_totalmin == cur_total_min and self.home_flag == 0:#14:00
+                        self.home_flag  = 1
+                        self.home_count = 0
+                        self.home_oldtotalmin = home_totalmin
+                        EventMesh.publish("home_alarm_event")#该回家了                                                                                                                                                   
+
+
+        
+        #该休息了
+        def reset_alarm(self):
+            data = RTC().datetime()
+            hour = data[4]
+            min = data[5]
+
+            week = int(data[3])
+
+            date1 = data[1]
+            date2 = data[2]
+            cur_total_min = int(hour)*60+int(min)
+            # EventMesh.debug_log("self.reset_oldtotalmin",self.reset_oldtotalmin,cur_total_min,self.alarm_flag)
+            if self.reset_oldtotalmin == 0:
+                self.reset_oldtotalmin = cur_total_min #549
+            if self.reset_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃
+                if self.reset_flag == 1:
+                    self.reset_flag = 0
+                    self.reset_count = 0
+            reset_alarm = []
+            reset_alarm = EventMesh.publish("get_storage_config","reset_alarm")
+            # EventMesh.debug_log("reset_alarm info2",len(reset_alarm),cur_total_min)
+            if self.reset_flag == 1:#表示闹钟响过清除标志
+                self.reset_count+=1
+                if self.reset_count > 6:
+                    self.reset_count = 0
+                    self.reset_flag = 0
+            if reset_alarm != None:
+                if len(str(reset_alarm)) != 0 and str(reset_alarm) != []:
+                    for i in range(len(reset_alarm)):
+                        # print("i",i)
+                        start_hour = int(reset_alarm[i]["start_hour"])
+                        start_min = int(reset_alarm[i]["start_min"])
+
+                        end_hour = int(reset_alarm[i]["end_hour"])
+                        end_min = int(reset_alarm[i]["end_min"])
+
+                        # EventMesh.debug_log("reset_alarm home 33",reset_alarm)
+                        
+                        start_totalmin = int(start_hour)*60+int(start_min)
+                        end_totalmin = int(end_hour)*60+int(end_min)
+
+                        if start_totalmin == cur_total_min and self.reset_flag == 0:#14:00
+                            self.reset_flag  = 1
+                            self.reset_count = 0
+                            self.reset_oldtotalmin = start_totalmin
+                            EventMesh.publish("reset_alarm_event")#该休息了     
+                            break
+
+                        if end_totalmin == cur_total_min and self.reset_flag == 0:
+                            self.reset_flag  = 1
+                            self.reset_count = 0
+                            self.reset_oldtotalmin = end_totalmin
+                            EventMesh.publish("reset_end_alarm_event")#休息结束了     
+                            break
+                                                                                                                                                                    
+
+        def clear_normal_alarm(self,event,msg):#普通闹钟清除标志
+            self.normal_flag = 0
+            self.normal_count = 0
+            self.normal_oldtotalmin = 0
+
+        def clear_reset_alarm(self,event,msg):#休息清除标志
+            self.reset_flag = 0
+            self.reset_count = 0
+            self.reset_oldtotalmin = 0
+
+        def clear_home_alarm(self,event,msg):#回家清除标志
+            self.home_flag = 0
+            self.home_count = 0
+            self.home_oldtotalmin = 0
+
+
+        def clear_medicine_alarm(self,event,msg):#吃药清除标志
+            self.medicine_count = 0
+            self.medicine_flag  = 0
+            self.medicine_oldtotalmin = 0
+        
+
+        def clear_wakeup_alarm(self,event,msg):#起床标识
+            self.wakeup_flag = 0
+            self.wakeup_count = 0
+            self.wakeup_oldtotalmin = 0
+
+        def clear_sleep_alarm(self,event,msg):#睡觉标识
+
+            self.sleep_flag = 0
+            self.sleep_count = 0
+            self.sleep_oldtotalmin = 0
+
+            
+
+
+        def get_sim_Status(self, event, msg):
+            return sim.getStatus()
+        def get_device_ope(self, event, msg):
+            """
+            获取设备运营商信息
+            :param event:
+            :param msg:
+            :return: 运营商
+            """
+            net_ope_map = {
+                "UNICOM": "中国联通HD",
+                "CMCC": "中国移动HD",
+                "CT": "中国电信HD"
+            }
+            """获取运营商"""
+            try:
+                short_eons = net.operatorName()[1]
+            except Exception:
+                return "无"
+            return net_ope_map.get(short_eons, None)
+
+        def get_signal(self, event=None, msg=None):
+            """
+            获取信号事件
+            :param event:
+            :param msg:
+            :return: int 类型
+            """
+            return net.csqQueryPoll()
+
+        def get_time_bucket(self, time):
+            if time < 12:
+                return '上午'
+            else:
+                return '下午'
+
+        def get_week(self, week):
+            if week == 1:
+                return '一'
+            elif week == 2:
+                return '二'
+            elif week == 3:
+                return '三'
+            elif week == 4:
+                return '四'
+            elif week == 5:
+                return '五'
+            elif week == 6:
+                return '六'
+            elif week == 7 or week == 0:
+                return '日'
+
+        def get_time(self, event=None, msg=None):
+            """
+            获取时间事件
+            :param event:
+            :param msg:
+            :return: HH:MM 格式
+            """
+            rtc_time = self.rtc.datetime()
+            
+            date = ("%d月%d日" % (rtc_time[1], rtc_time[2]))
+            year = ("%04d年" % (rtc_time[0]))
+            week = ("星期%s"%(self.get_week(rtc_time[3])))
+            week_data = rtc_time[3]
+            time = [rtc_time[4], rtc_time[5]]
+            time_quantum = ("%s" % (self.get_time_bucket(rtc_time[4])))
+            
+            result = [time, time_quantum, date , week,year,week_data]
+            #时分,上午下午,日期,星期,年 星期
+            return result
+
+        def get_step_count(self, event=None, msg=None):
+            """
+            获取步数
+            """
+            # print("11111:{}".format(EventMesh.publish("get_storage_config","clear_state3")))
+
+            tmp = 0
+            step =[0,0,0,0]
+
+            # EventMesh.debug_log("x:%d,y:%d,z:%d tmp %d",XYZ[0],XYZ[1],XYZ[2],tmp)
+            step[0]= tmp 
+            step[1] = 0
+            step[2] = 1
+            step[3] = 2
+            # print("1222:{}".format(EventMesh.publish("get_storage_config","clear_state3")))
+            return step
+
+        def get_ic_cid(self, event, msg):
+            """
+            获取ic cid事件
+            :param event:
+            :param msg:
+            :return: str ic cid
+            """
+            return sim.getIccid()
+
+        def get_phone_num(self, event, msg):
+            """
+            获取电话号码事件
+            :param event:
+            :param msg:
+            :return: str number
+            """
+            return sim.getPhoneNumber()
+
+        def get_battery(self, event=None, msg=None):
+            """
+            获取电池事件,暂时没支持
+            :param event:
+            :param msg:
+            :return:
+            """
+
+            charge_state = '0'
+            if self.get_usb_state() == 1:
+                charge_state = '1'
+            else:
+                charge_state = '0'
+
+            #temp = Power.getVbatt()
+            temp = EventMesh.publish("get_curr_battery_level")
+            vbat = EventMesh.publish("get_battery",temp)
+            if vbat == None:
+                vbat = 100
+            # EventMesh.debug_log("vbat",vbat)
+            # if temp != None :
+            #     if temp <= 3505:
+            #         vbat = 0 
+            #     elif temp <= 3699:
+            #         vbat = 20 #"E:/vbat_20.jpg"
+            #     elif temp <= 3772:
+            #         vbat = 40 #"E:/vbat_40.jpg"
+            #     elif temp <= 3882:
+            #         vbat = 60 #"E:/vbat_60.jpg"
+            #     elif temp <= 4070:
+            #         vbat = 80 #"E:/vbat_80.jpg"
+            #     elif temp <= 4200:
+            #         vbat = 90 #
+            #     else:
+            #         vbat = 100 #"E:/vbat_100.jpg"
+            # else:
+            #     vbat = 100
+
+            result = [charge_state, vbat]
+
+            return result
+        #Set the current average battery level
+        def set_curr_battery_level(self, event=None, msg=None):
+            self.curr_battery_level = msg
+        
+        def get_curr_battery_level(self, event=None, msg=None):
+            return self.curr_battery_level
+
+        def get_device_fw_version(self, *args):
+            '''
+            获取设备固件版本号
+            '''
+            fw_version = modem.getDevFwVersion()
+            if isinstance(fw_version, str):
+                return fw_version
+            return "--"
+
+        def get_standby_time(self, *args):
+            '''
+            获取设备单次开机待机时间
+            '''
+            time_msg = utime.time()
+            d = int(
+                time_msg / 86400)  # The int call removes the decimals.  Conveniently, it always rounds down.  int(2.9) returns 2 instead of 3, for example.
+            time_msg -= (
+                    d * 86400)  # This updates the value of x to show that the already counted seconds won't be double counted or anything.
+            h = int(time_msg / 3600)
+            time_msg -= (h * 3600)
+            m = int(time_msg / 60)
+            time_msg -= (m * 60)
+            s = time_msg
+            result = "{}天{}小时{}分".format(d, h, m)
+            return result
+
+        def set_key(self, topic, msg):
+            self.key = msg["value"]
+        def get_key(self, topic, msg):
+            return self.key
+
+        def get_imei(self, topic, msg):
+            if not self.imei:
+                self.imei = modem.getDevImei()
+            # self.imei = "876226002021444"#视频通话测试账号
+            # self.imei = "826226524724963"#视频通话测试账号
+            # self.imei = "860132060128634" #860132060128634
+            return self.imei
+
+        def get_cid(self, topic, msg):
+            return self.cid
+
+        def set_cid(self, topic, msg):
+            self.cid = msg["value"]
+
+        def get_imsi(self, topic, msg):
+            if not self.imei:
+                self.imei = sim.getImsi()
+            return self.imsi
+
+        def get_password(self, topic, msg):
+            return self.password
+
+        def set_password(self, topic, msg):
+            self.password = msg["value"]
+
+        def set_ping(self, topic, msg):
+            self.PING = msg
+        def get_ping(self, topic, msg):
+            return self.PING
+
+        def set_connect(self, topic, msg):
+            #EventMesh.debug_log("set_connect:{}".format(msg))
+            self.connect = msg
+        def get_connect(self, topic, msg):
+            return self.connect
+
+        def start_blood_oxygen(self, topic, msg):
+            EventMesh.debug_log("start_blood_oxygen!!!")
+
+
+        def start_heart(self, topic, msg):
+            EventMesh.debug_log("start_heart!!!")
+
+
+        def stop_blood_oxygen(self, topic, msg):
+            EventMesh.debug_log("stop_blood_oxygen!!!")
+
+
+        def stop_heart(self, topic, msg):
+            EventMesh.debug_log("stop_heart!!!")
+
+
+        def get_blood_oxygen(self, topic, msg):
+
+            return 0
+
+        def get_heart(self, topic, msg):
+
+            return 0
+        
+        def get_wear(self, topic, msg):
+            return 0
+        
+        def get_Hsensor(self, topic, msg):
+            return 0
+        
+        def Hsensor_set_sleep(self, topic, msg):
+            pass
+
+        def start_temp(self, topic, msg):
+            EventMesh.debug_log("start_temp!!!!!!!")
+            WHO_AM_I = bytearray([0x01, 0])
+            I2C_SLAVE_ADDR = 0x49
+            #I2C_SLAVE_ADDR = 0x48
+            r_data = bytearray(2)
+            data = bytearray([0x61A0, 0])   # 唤醒
+            return self.i2c0.write(I2C_SLAVE_ADDR, WHO_AM_I, 1, data, 2)
+        def stop_temp(self, topic, msg):
+            EventMesh.debug_log("stop_temp!!!!!!!")
+            WHO_AM_I = bytearray([0x01, 0])
+            I2C_SLAVE_ADDR = 0x49
+            #I2C_SLAVE_ADDR = 0x48
+            r_data = bytearray(2)
+            data = bytearray([0x60A0, 0])   #休眠
+            return self.i2c0.write(I2C_SLAVE_ADDR, WHO_AM_I, 1, data, 2)
+            
+        def get_temp(self, topic, msg):
+            WHO_AM_I = bytearray([0x00, 0])
+            I2C_SLAVE_ADDR = 0x49
+            #I2C_SLAVE_ADDR = 0x48
+            r_data = bytearray(2)
+            self.i2c0.read(I2C_SLAVE_ADDR, WHO_AM_I, 1, r_data, 2, 0)
+            #EventMesh.debug_log("temp_data:{}".format(r_data))
+            temp_s = ((r_data[0]<<8) | (r_data[1]))>>4
+            #EventMesh.debug_log("temp_s:{}".format(temp_s))
+            temp_data = temp_s * 0.0625
+            EventMesh.debug_log("temp_data:{}".format(temp_data))
+            return temp_data
+    
+                
+
+        def sim_slot_get(self, topic=None, msg=None):
+            return sim.getCurSimid()
+
+        def sim_slot_switch(self, topic=None, slot=None):
+            """
+            sim 卡槽切换
+            :param topic:
+            :param slot:
+            :return: 切换sim卡卡槽  0 切换成功, 1 无需切换, -1 切换失败
+            """
+            if self.sim_slot_get() == slot:
+                return 1
+            else:
+                return sim.switchCard(slot)
+
+        def usb_event_cb(self, state):
+            status = state
+
+            if status == 1:#插入USB
+                EventMesh.debug_log("charge R_CHARGE_in")
+                EventMesh.publish("clear_usb_flag")
+                EventMesh.publish("set_usb", 1)#
+                pass
+            elif status == 0:#拨出usbs
+                EventMesh.publish("clear_usb_flag")
+                EventMesh.publish("set_usb", 2)#
+                EventMesh.debug_log("charge R_CHARGE_out")
+
+                
+                
+
+        
+
+        def get_usb_state(self):
+            state = self.usb.getStatus()
+            if state == -1:
+                state = 0
+            return state
+        
+
+    def wifiScan_cb(args):
+            EventMesh.publish(constants.EVENT.WIFIINFO, args)
+            wifiScan.control(0)
+
+    class LocationManager(Abstract):
+
+        def __init__(self):
+            self.gps = None
+            #self.match = GPSMatch()
+            self.timer_read_GPS_info = osTimer()
+            self.wifi_data = []
+            self.gps_data  = {}
+            self.cell_data = []
+            self.location_timer_count = 0
+            self.location_check_data_timer_count = 0
+            self.GGA_count = 0
+            self.RMC_A_count = 0
+            self.location_type = 0 #定位类型,0:正常定位,有gps数据或60秒关闭;1:测试模式,只有发CLOSE_LOCATION消息才关闭
+            self.location_flag = 0
+            self.start_location_flag = 0
+            self.location_thread_id  = 0
+            self.location_queue = Queue(100)
+            self.lpm_fd = None
+            self.start_agps = 0
+            read_data = EventMesh.publish("get_storage_config","isOpenGNSS")#获取是否打开GNSS
+            if read_data != None:
+                self.isOpenGNSS = read_data
+            else:#默认关闭GNSS
+                self.isOpenGNSS = "1"
+                EventMesh.publish("set_storage_config",["isOpenGNSS",self.isOpenGNSS])
+
+            self.isOpenGNSS = EventMesh.publish("get_storage_config","isOpenGNSS")
+            if self.isOpenGNSS == None:
+                self.isOpenGNSS = "1"
+            if self.isOpenGNSS == "1":
+                if quecgnss.init() == -1:
+                    self.isOpenGNSS = "0"
+                    EventMesh.publish("set_storage_config",["isOpenGNSS",self.isOpenGNSS])
+                else:
+                    quecgnss.gnssEnable(0)
+        @staticmethod
+        def get_date():
+            return "{:04d}-{:02d}-{:02d}".format(*utime.localtime()[0:3])
+
+        @staticmethod
+        def get_time():
+            return "{:02d}:{:02d}:{:02d}".format(*utime.localtime()[3:6])
+
+        def post_processor_after_instantiation(self):
+            # _gps_cfg = {
+            #     "UARTn": UART.UART1,
+            #     "buadrate": 115200,
+            #     "databits": 8,
+            #     "parity": 0,
+            #     "stopbits": 1,
+            #     "flowctl": 0,
+            #     "PowerPin": Pin.GPIO2,
+            #     "StandbyPin": Pin.GPIO3,
+            #     "BackupPin": None,
+            #     "gps_mode": 0x01,
+            # }
+            # self.gps = GPS(**_gps_cfg)
+            # self.gps.power_switch(0)#关闭GPS
+            EventMesh.subscribe(constants.EVENT.GPSOPEN, self.gps_open)
+            EventMesh.subscribe(constants.EVENT.GPSCLOSE, self.gps_close)
+            EventMesh.subscribe(constants.EVENT.START_LOCATION, self.start_location)
+            EventMesh.subscribe(constants.EVENT.START_LOCATION_TEST, self.start_location_test)
+            EventMesh.subscribe(constants.EVENT.WIFIINFO, self.WIFI_INFO)
+            EventMesh.subscribe(constants.EVENT.WIFISCANOPEN,self.WIFI_scan_open)
+            EventMesh.subscribe(constants.EVENT.CLOSE_LOCATION,self.close_location)
+            EventMesh.subscribe("get_location_flag",self.get_location_flag)
+            
+            #EventMesh.subscribe(constants.EVENT.GPSCLOSE, self.gps_close)
+        def get_location_flag(self, event, msg):
+            return self.location_flag
+        def start_location(self, event, msg):
+            self.location_queue.put(msg)#测试类型入队
+            self.gps_data = {}
+            self.wifi_data = []
+            self.cell_data = []
+            self.location_timer_count = 0
+            self.GSV_sig_ok_count = 0
+            EventMesh.debug_log("start_location:{}".format(msg))
+            if( self.location_flag == 1):
+                return
+            _thread.stack_size((9+5)*1024)
+            self.location_thread_id  = _thread.start_new_thread(self.location_thread, ())
+            _thread.stack_size(8*1024)
+            
+            self.location_flag = 1
+            self.timer_read_GPS_info.start(1000, 1, self.location_timer)
+            #self.gps_open(event, msg)
+
+
+        def start_location_test(self, event, msg):
+            EventMesh.debug_log("start_location_test")
+            
+            self.location_type = 1
+            if( self.location_flag == 1):
+                return
+            _thread.stack_size((9+4)*1024)
+            self.location_thread_id  = _thread.start_new_thread(self.location_thread, ())
+            _thread.stack_size(8*1024)
+        
+            self.location_timer_count = 0
+            self.location_flag = 1
+            #self.gps_open(event, msg)
+            self.location_type = 1
+            self.timer_read_GPS_info.start(1000, 1, self.location_timer)
+    
+
+        def close_location(self, event, msg):
+            self.location_flag = 0
+            self.location_type = 0
+            self.timer_read_GPS_info.stop()
+
+            
+
+        def WIFI_INFO(self, event, msg):
+            self.wifi_data = msg
+            # EventMesh.debug_log("WIFI_INFO:")
+            # EventMesh.debug_log([msg[0],msg])
+
+        def WIFI_scan_open(self, event, msg):
+            #EventMesh.debug_log("WIFI_scan_open")
+            
+
+            if wifiScan.getState() == False :
+                self.wifi_data = []
+                wifiScan.control(1)
+                wifiScan.setCfgParam(6, 2, 5,  0)  #设置WiFi参数,10秒上层,两轮,最多6个,6秒底层,PS优先
+                wifiScan.setCallback(wifiScan_cb) #注册回调函数
+                wifiScan.asyncStart()
+                #EventMesh.debug_log("wifiScan.asyncStart")
+            else :
+                EventMesh.debug_log("WIFI_scan_open:error1") 
+        def gps_open(self, event, msg):
+            if self.isOpenGNSS == "1":
+                #EventMesh.debug_log("publish:gps_open")
+                #quecgnss.init()
+                quecgnss.gnssEnable(2)
+                #self.gps.__gps_nmea_data_clean()
+        def gps_close(self, event, msg):
+            if self.isOpenGNSS == "1":
+                quecgnss.gnssEnable(0)
+        def location_timer(self, *args, **kwargs):
+            
+            self.location_timer_count = self.location_timer_count +1
+            self.location_check_data_timer_count = self.location_check_data_timer_count+1
+
+        def Location_send(self, msg) :
+            EventMesh.debug_log("Location_send1")
+            if self.location_queue.empty() == True:
+                return
+            EventMesh.debug_log("Location_send2")
+            while True:
+                if self.location_queue.empty() == False:
+                    TYPE = self.location_queue.get()
+                    date = "{:04d}{:02d}{:02d},{:02d}{:02d}{:02d}".format(*utime.localtime()[0:6])
+                    date = date[2:]
+                    #date = "180916,025723"
+                    GPS_type = "V"
+                    latitude = "0.000000,N"
+                    longitude = "0.000000,E"
+                    speed = "0.00"
+                    direction = "0.0"
+                    high = "100.0"
+                    number = "0"
+                    precision = "24"
+                    if msg[0] :#有GPS数据
+                        GPS_type = "A"
+                        # 纬度
+                        latitude = msg[0]["latitude"]
+                        # 经度
+                        longitude = msg[0]["longitude"]
+                        # 速度
+                        speed = msg[0]["speed"]
+                        # 方向
+                        direction = "0"
+                        if msg[0]["direction"] :
+                            direction = msg[0]["direction"]
+                        # 高度
+                        high = msg[0]["high"]
+                        high_tmp = high.split(".")
+                        if len(high_tmp) >= 2 :
+                            high = "%s"%(high_tmp[0])
+                        # 讯号质量:搜索到的卫星数目
+                        number = msg[0]["number"]
+                        precision = msg[0]["precision"]
+                        #date = msg[0]["date"]
+                    
+                    #gsm 信号强度
+                    gsm_sig =  str((100//31)*EventMesh.publish("screen_get_sig"))
+                    # 电池电量百分比 
+                    bat_tmp = EventMesh.publish("screen_get_battery")
+                    battery_caption =  str(bat_tmp[1])
+                    #步数
+                    old_step = 0
+                    step = 0
+                    step = EventMesh.publish("get_old_step_value")
+                    if step != 0:
+                        tmp_data  = EventMesh.publish("get_storage_config","old_step_new")
+                        if tmp_data != None:
+                            old_step = tmp_data
+                        if old_step !=  step:
+                            EventMesh.publish("set_storage_config",["old_step",step])
+                            EventMesh.publish("set_storage_config",["old_step_new",step])
+                            
+                    old_step = step
+                    # step = str(EventMesh.publish(constants.EVENT.GET_STEP)[0])
+                    #翻转次数
+                    turn_count = "0"
+                    #终端状态
+                    state = "%08X"%(EventMesh.publish("get_dev_state"))
+                    #EventMesh.debug_log("TYPE:{}".format(TYPE))
+                    if type(TYPE) == list:#队列里的数据有终端状态,则用队里的终端状态
+                        if len(TYPE)>= 2 :
+                            state = "%08X"%(TYPE[1])
+                    
+                    EventMesh.debug_log("state:{}".format(state))
+                    #基站数据
+                    CELL_num = len(msg[2])
+                    CELL_data = "1," #时延
+                    if msg[2] != []:
+                        for CELL in msg[2] :
+                            if CELL[0] == 0 :
+                                CELL_data += "%X,"%(int(CELL[2])) #MCC
+                                CELL_data += str(CELL[3]) +","#MNC
+                                CELL_data += str(CELL[5]) +","#tac,区域码
+                                CELL_data += str(CELL[1]) +","#基站编号 CID
+                                CELL_data += str(int(CELL[7]+140)) +","#信号强度 rssi
+                            else :
+                                CELL_data += str(CELL[5]) +","#tac,区域码
+                                CELL_data += str(CELL[1]) +","#基站编号 CID
+                                CELL_data += str(int(CELL[7]+140)) +","#信号强度 rssi
+                        CELL_data = CELL_data[:(len(CELL_data)-1)]
+                    #WIFI数据
+                    WIFI_num = 0 
+                    WIFI_data = ""
+                    if msg[1] :
+                        WIFI_num = msg[1][0]
+                        i = 0
+                        for MAC in msg[1][1] :
+                            WIFI_data += "wifi%d,%s,%d,"%(i,str(MAC[0]),MAC[1])
+                            i += 1
+                        WIFI_data = WIFI_data[:(len(WIFI_data)-1)]
+                    WIFI_data = WIFI_data.lower()
+                    #send_data = "UD ,%s ,%s     ,%s       ,%s       ,%s   ,%s       ,%s  ,%s    ,%s     ,%s             ,%s  ,%s        ,%s   ,%d     ,%s       ,%d      ,%s"\
+                    #              %(date,GPS_type,latitude,longitude,speed,direction,high,number,gsm_sig,battery_caption,step,turn_count,state,CELL_num,CELL_data,WIFI_num,WIFI_data)
+                    #定位数据
+                    send_data = "%s,%s,%s"%(date,GPS_type,latitude)
+                    send_data += ",%s,%s,%s"%(longitude,speed,direction)
+                    send_data += ",%s,%s,%s"%(high,number,gsm_sig,)
+                    send_data += ",%s,%s,%s"%(battery_caption,step,turn_count)
+                    send_data += ",%s,%d,%s"%(state,CELL_num,CELL_data)
+                    send_data += ",%d,%s"%(WIFI_num,WIFI_data)
+                    send_data+=",%s"%(precision)
+                    #EventMesh.debug_log("Location_send2:{} q_size:{}".format(send_data,self.location_queue.size()))
+            
+                
+                    EventMesh.debug_log("Location_send3:{}:{}".format(TYPE,send_data))
+                    if type(TYPE) == list:
+                        EventMesh.publish(TYPE[0],send_data)
+                    else:
+                        EventMesh.publish(TYPE,send_data)
+                else :
+                    break
+
+        def GxGGA_latitude(self, gga_data):
+            """Parse latitude from GGA"""
+            if gga_data:
+                latitude_re = ure.search(r",[0-9]+\.[0-9]+,[NS],", gga_data)
+                if latitude_re:
+                    latitude = latitude_re.group(0)[1:-3]
+                    return str(float(latitude[:2]) + float(latitude[2:]) / 60)
+            return ""
+        def GxGGA_longitude(self, gga_data):
+            """Parse longitude from GGA"""
+            if gga_data:
+                longitude_re = ure.search(r",[0-9]+\.[0-9]+,[EW],", gga_data)
+                if longitude_re:
+                    longitude = longitude_re.group(0)[1:-3]
+                    return str(float(longitude[:3]) + float(longitude[3:]) / 60)
+            return ""
+
+        def GxGGA_altitude(self, gga_data):
+            """Parse altitude from GGA"""
+            if gga_data:
+                altitude_re = ure.search(r",-*[0-9]+\.[0-9]+,M,", gga_data)
+                if altitude_re:
+                    return altitude_re.group(0)[1:-3]
+            return ""
+        def location_thread(self):
+            
+            self.wifi_data = []
+            self.gps_data = {}
+            self.cell_data = []
+            gnss_r_data = []
+            self.GSV_sig_ok_count = 0
+            self.GSV_sig_very_ok_count = 0
+            self.GGA_count = 0
+            self.RMC_A_count = 0
+            # if self.start_agps == 1: #开启agps
+            #     self.start_agps = 0
+            #     quecgnss.configSet(2,1)
+            if self.lpm_fd == None:
+                self.lpm_fd = pm.create_wakelock("test_lock", len("test_lock"))
+            pm.wakelock_lock(self.lpm_fd)
+            EventMesh.debug_log("location_thread:1")
+            EventMesh.publish(constants.EVENT.GPSOPEN)
+            EventMesh.debug_log("location_thread:2")
+            #self.timer_read_GPS_info.start(1000, 1, self.location_timer)
+            EventMesh.debug_log("location_thread:3")
+            #utime.sleep_ms(1000)
+            self.location_timer_count = 0
+            #quecgnss.read(4096)#去掉第一次错误数据
+            #EventMesh.txt_log("START_LOCATION")
+            # pm.autosleep(0)#唤醒
+            # pm.sclkEx_set(0, 1, 5)
+            GSV_dict= {}
+            while self.location_flag == 1:
+                try :   
+                    
+                    match_gga_data = []
+                    #match_gsv_data = []
+                    gnss_r_data = []
+                    # if self.location_check_data_timer_count >= 3:
+                    #     pm.autosleep(0)#唤醒
+                    #     pm.sclkEx_set(0, 1, 5)
+                    if self.location_check_data_timer_count >= 1 :#3秒查一次基站数据和wifi数据
+                        self.location_check_data_timer_count = 0
+                        #EventMesh.debug_log(self.location_timer_count)
+                        GSV_dict= {}
+                        if self.isOpenGNSS == "1":                    
+                            #检查GNSS数据
+                            if ( self.gps_data == {} or self.location_type == 1) and quecgnss.get_state() == 2:
+
+                                pass
+                                tmp_ok_count = 0
+                                tmp_very_ok_count = 0
+                                gsv_data = quecgnss.get_gsv()
+                                rmc_data = quecgnss.get_rmc()
+                                gga_data = quecgnss.get_gga()
+                                vtg_data = quecgnss.get_vtg()
+                                # EventMesh.debug_log("gsv:{}".format(quecgnss.get_gsv()))
+                                # EventMesh.debug_log("gga:{}".format(quecgnss.get_gga()))
+                                # EventMesh.debug_log("rmc:{}".format(quecgnss.get_rmc()))
+                                # EventMesh.debug_log("vtg:{}".format(quecgnss.get_vtg())) 
+                                for i in range(len(gsv_data)) :
+                                    
+                                    if i % 2 == 0:
+                                        if i+1 >= len(gsv_data) :
+                                            # EventMesh.debug_log("gsv_data num error!!")
+                                            break
+                                        GSV_dict[gsv_data[i]] = gsv_data[i+1]
+                                        #EventMesh.debug_log("type:gsv_data{}".format(type(gsv_data[i+1])))
+                                        try:
+                                            #EventMesh.debug_log("gsv_tmp[i+3]:{}".format(gsv_tmp[i+3]))
+                                            if gsv_data[i+1] :
+                                                if (gsv_data[i+1])>=20:
+                                                    tmp_ok_count +=1   
+                                                if (gsv_data[i+1])>=30:
+                                                    tmp_very_ok_count +=1  
+                                                    
+                                        except Exception as e:
+                                            usys.print_exception(e)
+                                        
+                                if(tmp_ok_count > self.GSV_sig_ok_count ):
+                                    self.GSV_sig_ok_count = tmp_ok_count
+                                if(tmp_very_ok_count > self.GSV_sig_very_ok_count ):
+                                    self.GSV_sig_very_ok_count = tmp_very_ok_count
+                                match_rmc_data = rmc_data.split(",")
+                                if len (match_rmc_data)>3: #有rmc数据
+                                        if match_rmc_data[2] == 'A':    
+                                            match_gga_data = gga_data.split(",")
+                                            if len(match_gga_data) >4: #数据全
+                                                match_vtg_data = vtg_data.split(",")
+                                                gps_date = "%s,%s"%(match_rmc_data[9],match_rmc_data[1][:6])#日期
+                                                #gps_data_tmp = self.gps.read_coordinates(gnss_r_data[1])
+                                                latitude = "0,N" #纬度
+                                                latitude_tmp = str(self.GxGGA_latitude(gga_data)).split(".")
+                                                if len(latitude_tmp) >= 2 and len(latitude_tmp[1])>=5:
+                                                    latitude = "%s.%s"%(latitude_tmp[0],latitude_tmp[1][:6])
+                                                    latitude = "%s,%s"%(latitude,match_rmc_data[4] )
+
+                                                longitude = "0,E"#经度
+                                                longitude_tmp = str(self.GxGGA_longitude(gga_data)).split(".")
+                                                if len(longitude_tmp) >= 2 and len(longitude_tmp[1])>=5:
+                                                    longitude = "%s.%s"%(longitude_tmp[0],longitude_tmp[1][:6])
+                                                    longitude = "%s,%s"%(longitude,match_rmc_data[6] ) #match_rmc_data[6] + str(gnss_r_data[1])
+                                                
+                                                high = "0"#高度
+                                                high = str(self.GxGGA_altitude(gga_data))
+                                                number = "0"#可用卫星
+                                                precision = "5.8"#精度
+                                                if len(match_gga_data)>5 :
+                                                    if match_gga_data[7]:
+                                                        number = match_gga_data[7]
+                                                    if match_gga_data[8]:
+                                                        precision = match_gga_data[8]
+                                                direction = "249.5" #方向
+                                                speed = '0.00'    #速度    
+                                                if(len(match_vtg_data)>5 ):
+                                                    if match_vtg_data[1]:
+                                                        direction =  match_vtg_data[1]
+                                                    if match_vtg_data[7]:    
+                                                        speed =  match_vtg_data[7]
+                                                self.gps_data = {
+                                                    "latitude": latitude,
+                                                    "longitude": longitude,
+                                                    "high": high,
+                                                    "direction": direction,
+                                                    "speed": speed,
+                                                    "number": number, 
+                                                    "date":  gps_date,
+                                                    "precision":  precision
+                                                }
+    # ***********************************************************************************
+
+
+                    #检查wifi数据
+                    if self.wifi_data == [] or (self.wifi_data != [] and self.wifi_data[0] == 0):#and self.wifi_data[0] <= 0:
+                        EventMesh.publish(constants.EVENT.WIFISCANOPEN)
+                
+                    #检查基站数据
+                    if self.cell_data == []:   
+                        data_tmp = net.getCellInfo()
+                        if(len(data_tmp)>=2):
+                            for cell in data_tmp:
+                                if cell and cell[0][0] == 0 and len(cell[0]) > 1:
+                                    self.cell_data = cell
+                                    break
+
+                    if self.location_type == 1: #测试模式
+                        self.location_timer_count = 0
+                        
+                        EventMesh.publish("PUSH_LOCATION_DATA", [[self.gps_data,GSV_dict],self.wifi_data,self.cell_data]) 
+                        if self.gps_data  != {} : #发送数据 
+                            EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位
+                            self.location_queue.put(constants.PROTOCOL.UD_SEND)
+                            self.Location_send([self.gps_data,self.wifi_data,self.cell_data])
+                            
+
+                    elif self.location_type == 0: #正常模式     
+                        if self.gps_data  != {} or self.location_timer_count > 100: #or( self.wifi_data != [] and self.cell_data != []): 
+                            if self.location_queue.empty() == False:#有定位队列
+                                pass
+                                #EventMesh.txt_log("LOCATION timer:{} ok:{} very_ok:{}".format(self.location_timer_count,self.GSV_sig_ok_count))   
+                                #EventMesh.txt_log("LOCATION:timer:{} ok_count:{} ".format(self.location_timer_count,self.GSV_sig_ok_count))
+                            if self.gps_data  == {}: #定位超时,且信噪比多个大于30,下次启动agps
+                                if self.GSV_sig_very_ok_count > 3:#3个超30以上
+                                    self.start_agps = 1
+                                    #EventMesh.txt_log("open agps:{}".format(GSV_dict))
+                            #upload_time = EventMesh.publish("get_upload_data")    
+                            self.Location_send([self.gps_data,self.wifi_data,self.cell_data])
+                            #if upload_time > 200  : 
+                            EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位
+                            # else:   #定位间隔小于3分钟不关闭gps,不影响无信号判断
+                            #     self.location_timer_count = 0
+                            #     self.GSV_sig_ok_count = 0
+                                
+                            
+
+                            
+                        if (self.isOpenGNSS != "1" or (self.GSV_sig_ok_count <= 1 and self.location_timer_count > 20)) and self.wifi_data != [] and self.cell_data != [] : #超过40秒且信号大于30的不足3个
+                            EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 
+                            EventMesh.debug_log("Location_send:CLOSE_LOCATION")  
+                            #EventMesh.txt_log("GSV_sig_ok_count<3:timer:{} ok_count:{} ".format(self.location_timer_count,self.GSV_sig_ok_count))
+                            self.Location_send([self.gps_data,self.wifi_data,self.cell_data])
+
+                
+                    
+                except Exception as e:
+                    usys.print_exception(e)
+                    EventMesh.txt_log("location_thread:ERROR:".format(e))
+                    #EventMesh.debug_log("location_thread:ERROR:{}".format(usys.print_exception(e)))
+                    EventMesh.debug_log("self.gps_data{},self.wifi_data{},self.cell_data{}".format(self.gps_data,self.wifi_data,self.cell_data))
+                    #self.Location_send([self.gps_data,self.wifi_data,self.cell_data])
+                    EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 
+                utime.sleep_ms(500)
+
+            #self.timer_read_GPS_info.stop()
+            #self.gps.power_switch(0)
+            wifiScan.control(0)
+            EventMesh.publish(constants.EVENT.GPSCLOSE)
+            # if EventMesh.publish("get_lcd_state" ) == 0:#休眠的时候,恢复休眠
+            #     pm.autosleep(1)
+            #     pm.sclkEx_set(1, 1, 5)
+            if self.lpm_fd != None:
+                pm.wakelock_unlock(self.lpm_fd)
+            #pm.delete_wakelock(lpm_fd)
+            EventMesh.debug_log("CLOSE_LOCATION")
+            #EventMesh.txt_log("CLOSE_LOCATION")
+
+                    
+
+    class AddrBookManager(Abstract):
+        # 通讯录
+        def __init__(self):
+            self.read_phonebook = {}
+            self.check_json = 0
+            self.check_json = ql_fs.path_exists("/usr/static/storage_file/phonebook.json")
+
+            if self.check_json == True:
+                with open("/usr/static/storage_file/phonebook.json","r",encoding="utf-8") as fd:
+                    self.read_phonebook = ujson.load(fd)
+                    EventMesh.debug_log("读取电话本")
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("get_phonebook_list", self.get)
+            EventMesh.subscribe("set_phonebook_list", self.set)
+            EventMesh.subscribe("call_phonebook_one_call", self.call_phonebook_one_call)
+            EventMesh.subscribe("call_phonebook_two_call", self.call_phonebook_two_call)
+            EventMesh.subscribe("call_phonebook_three_call", self.call_phonebook_three_call)
+
+            EventMesh.subscribe("call_phonebook_num", self.call_phonebook_num)
+
+        def get(self, event, msg):
+            self.check_json = ql_fs.path_exists("/usr/static/storage_file/phonebook.json")
+            return [self.check_json,self.read_phonebook]
+        
+        def call_phonebook_num(self, event, msg):
+            name = ''
+            key_tmp = ''
+            phone_num = int(msg)
+            if self.read_phonebook != {}:
+                if len(self.read_phonebook) >= phone_num:
+                    phonebook_keys = sorted(self.read_phonebook.keys())
+                    name = self.read_phonebook[phonebook_keys[phone_num-1]]
+                    key_tmp = phonebook_keys[phone_num-1]
+                    if len(name) != 0:
+                        EventMesh.publish("save_phonename",str(name))
+                        EventMesh.publish("save_phonenum",str(name))
+                        EventMesh.publish("dial_out_call_center_cb",str(name))#电话拨出去
+                    else:
+                        EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+                else:
+                    EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+            else:
+                EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+            EventMesh.debug_log("call_phonebook_call name:{} msg:{}".format(len(self.read_phonebook),msg))
+
+        def call_phonebook_one_call(self, event, msg):
+            name = ''
+            key_tmp = ''
+            if self.read_phonebook != {}:
+                if len(self.read_phonebook) >= 1:
+                    phonebook_keys = sorted(self.read_phonebook.keys())
+                    name = self.read_phonebook[phonebook_keys[0]]
+                    key_tmp = phonebook_keys[0]
+                    if len(name) != 0:
+                        EventMesh.publish("save_phonename",str(name))
+                        EventMesh.publish("save_phonenum",str(name))
+                        EventMesh.publish("dial_out_call_center_cb",str(name))#电话拨出去
+                    else:
+                        EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+                else:
+                    EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+            else:
+                EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+            EventMesh.debug_log("call_phonebook_one_call name:{} key_tmp:{} len:{}".format(name,key_tmp,len(self.read_phonebook)))
+
+        def call_phonebook_two_call(self, event, msg):
+            name = ''
+            key_tmp = ''
+            if self.read_phonebook != {}:
+                if len(self.read_phonebook) >= 2:
+                    phonebook_keys = sorted(self.read_phonebook.keys())
+                    name = self.read_phonebook[phonebook_keys[1]]
+                    key_tmp = phonebook_keys[1]
+                    if len(name) != 0:
+                        #voiceCall.callStart(str(name))
+                        EventMesh.publish("save_phonename",str(name))
+                        EventMesh.publish("save_phonenum",str(name))
+                        EventMesh.publish("dial_out_call_center_cb",str(name))#电话拨出去
+                    else:
+                        EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+                    
+                else:
+                    EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+            else:
+                EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+                EventMesh.debug_log("call_phonebook_two_call name:{} key_tmp:{}".format(name,key_tmp))
+        
+        def call_phonebook_three_call(self, event, msg):
+            name = ''
+            key_tmp = ''
+            if self.read_phonebook != {}:
+                if len(self.read_phonebook) >= 3:
+                    phonebook_keys = sorted(self.read_phonebook.keys())
+                    name = self.read_phonebook[phonebook_keys[2]]
+                    key_tmp = phonebook_keys[2]
+                    if len(name) != 0:
+                        #voiceCall.callStart(str(name))
+                        EventMesh.publish("save_phonename",str(name))
+                        EventMesh.publish("save_phonenum",str(name))
+                        EventMesh.publish("dial_out_call_center_cb",str(name))#电话拨出去
+                    else:
+                        EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+                    
+                else:
+                    EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+            else:
+                EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+            EventMesh.debug_log("call_phonebook_three_call name:{} key_tmp:{}".format(name,key_tmp))
+
+        def set(self, event, msg):
+            self.check_json = msg[0]
+            self.read_phonebook = msg[1]
+
+    import sms
+    class MsgManager(Abstract):
+        # 短信
+        def __init__(self):
+            self.msg_nums = 0
+            self.msg_detail = ""
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("get_msg_nums", self.get_msg_nums)
+            # 可通过此push_addr_book_list主动推送
+            EventMesh.subscribe("get_msg_detail", self.get_msg_detail)
+
+        def get_msg_nums(self, event, msg):
+
+            self.msg_nums = sms.getMsgNums() 
+            EventMesh.debug_log("self.msg_nums {}:".format(self.msg_nums))
+            return self.msg_nums
+        
+        def get_msg_detail(self, event, msg):
+            
+            # self.msg_detail = sms.searchTextMsg(self.msg_nums)
+            # EventMesh.debug_log("self.msg_detai {}:".format(self.msg_detai))
+            return{
+                "小明":"有内鬼,停止交易",
+                "小红":"今晚十点一起吃饭"
+            }
+
+    class MsgdetailManager(Abstract):
+        def __init__(self):
+            self.level = 0
+            self.msg_name = ""
+            self.msg_content = ""
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("save_msg_name", self.save_msg_name)
+            EventMesh.subscribe("save_msg_content", self.save_msg_content)
+            EventMesh.subscribe("get_msg_name", self.get_msg_name)
+            EventMesh.subscribe("get_msg_content", self.get_msg_content)
+
+        def save_msg_name(self, event, msg): 
+            self.msg_name = str(msg)
+            EventMesh.debug_log("save_msg_name:msg".format(msg))
+        
+        def save_msg_content(self, event, msg):
+            self.msg_content = str(msg)
+            EventMesh.debug_log("save_msg_content:msg".format(msg))
+        
+        def get_msg_content(self, event, msg):
+            return self.msg_content
+
+        def get_msg_name(self, event, msg):
+            return self.msg_name
+
+    class CallLogManager(Abstract):
+        # 通话记录
+        def __init__(self):
+            self.read_call_log = {}
+            self.check_json = ql_fs.path_exists("/usr/static/storage_file/Call_log.json")
+
+            if self.check_json == True:
+                with open("/usr/static/storage_file/Call_log.json","r",encoding="utf-8") as fd:
+                    self.read_call_log = ujson.load(fd)
+                    EventMesh.debug_log("读取通话记录")
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("get_call_log_list", self.get)
+            EventMesh.subscribe("set_call_log_list", self.set)
+
+        def get(self, event, msg):
+            self.check_json = ql_fs.path_exists("/usr/static/storage_file/Call_log.json")
+            return [self.check_json,self.read_call_log]
+
+        def set(self, event, msg):
+            return
+            self.check_json = msg[0]
+            self.read_call_log = msg[1]
+            with open("/usr/static/storage_file/Call_log.json","w+",encoding="utf-8") as fd:
+                ujson.dump(self.read_call_log,fd)
+        # def call_usr(self,event,msg):
+        #     content = self.log[msg]
+        #     # 参数1 姓名  参数2  电话   参数3 1/主动呼叫  0别人呼叫
+        #     EventMesh.publish("call_in", [content[2], content[0], 1])
+
+
+
+    class PhoneCallingManager(Abstract):
+        def __init__(self):
+            self.phonenum = ""
+            self.phonename = ""
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("save_phonenum", self.save_phonenum)
+            EventMesh.subscribe("get_phonenum", self.get_phonenum)
+            EventMesh.subscribe("get_phonename", self.get_phonename)
+            EventMesh.subscribe("save_phonename", self.save_phonename)
+
+        def get_phonename(self, event, msg): 
+            return self.phonename
+
+        def save_phonename(self, event, msg): 
+            self.phonename = str(msg)
+
+        def save_phonenum(self, event, msg): 
+            self.phonenum = str(msg)
+        
+        def get_phonenum(self, event, msg):
+            return self.phonenum
+
+    #获取心率 血氧 步数历史数据
+    class gethistoryDataManager(Abstract):
+        def __init__(self):
+            self.oldHr = 0
+            self.oldspo2 = 0
+            self.oldstep = 0
+            self.old_step = 0
+            self.read_histroy_hr_data = []
+            self.read_histroy_temp_data = []
+            self.read_histroy_spo2_data = []
+
+            oldHr  = EventMesh.publish("get_storage_config","old_hr")
+            if oldHr != None:
+                self.oldHr = oldHr  
+            old_spo2  = EventMesh.publish("get_storage_config","old_spo2")
+            if old_spo2 != None:
+                self.oldspo2 = old_spo2 
+            old_step  = EventMesh.publish("get_storage_config","old_step")    
+            if old_step != None:
+                self.oldstep = old_step
+
+
+            check_hr= ql_fs.path_exists("/usr/static/storage_file/history_hr.json")
+            if check_hr == True :
+                with open("/usr/static/storage_file/history_hr.json","r") as fd:#音频文件编号
+                    self.read_histroy_hr_data = ujson.load(fd)
+            
+            check_temp= ql_fs.path_exists("/usr/static/storage_file/history_temp.json")
+            if check_temp == True :
+                with open("/usr/static/storage_file/history_temp.json","r") as fd:#音频文件编号
+                    self.read_histroy_temp_data = ujson.load(fd)
+
+            check_spo2= ql_fs.path_exists("/usr/static/storage_file/history_spo2.json")
+            if check_spo2 == True :
+                with open("/usr/static/storage_file/history_spo2.json","r") as fd:#音频文件编号
+                    self.read_histroy_spo2_data = ujson.load(fd)
+            self.temp_value = 0
+            
+            # self.read_histroy_hr_data=[{"timeSec":16789890,"value":90},{"timeSec":16789888,"value":78},{"timeSec":16789688,"value":68},{"timeSec":16789898,"value":58},\
+            #                              {"timeSec":16789897,"value":88},{"timeSec":16789867,"value":77},{"timeSec":16789895,"value":70}]
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_old_hr_data", self.save_hr_value)
+            EventMesh.subscribe("get_old_hr_data", self.get_hr_value)
+            EventMesh.subscribe("set_old_spo2_data", self.save_spo2_value)
+            EventMesh.subscribe("get_old_spo2_data", self.get_spo2_value)
+
+            EventMesh.subscribe("get_old_step_value", self.get_old_step_value)
+            EventMesh.subscribe("set_old_step_value", self.set_old_step_value)
+
+
+            EventMesh.subscribe("get_history_hr_value", self.get_history_hr_value)
+            EventMesh.subscribe("set_history_hr_value", self.set_history_hr_value)
+
+            EventMesh.subscribe("get_history_temp_value", self.get_history_temp_value)
+            EventMesh.subscribe("set_history_temp_value", self.set_history_temp_value)
+
+            EventMesh.subscribe("get_history_spo2_value", self.get_history_spo2_value)
+            EventMesh.subscribe("set_history_spo2_value", self.set_history_spo2_value)
+
+        
+
+        def get_history_spo2_value(self, event, msg): #近7次血氧历史数据统计显示
+            return self.read_histroy_spo2_data
+
+        def set_history_spo2_value(self, event, msg): 
+            pass
+
+
+
+        def get_history_temp_value(self, event, msg): #近7次体温历史数据统计显示
+            return self.read_histroy_temp_data
+
+        def set_history_temp_value(self, event, msg): 
+            self.temp_value = msg
+            if self.temp_value > 0:
+                # date_tmp = utime.localtime()
+                # time_tmp = utime.mktime(date_tmp)
+                # if len(self.read_histroy_temp_data) >= 7:
+                #     sort_new = {}
+                #     sort_new = sorted(self.read_histroy_temp_data, key = lambda i: i['timeSec'],reverse = False)#按照时间戳进行排序 去掉最旧的一次数据如果满了五十条
+                #     EventMesh.debug_log(sort_new)
+                #     for i in range(len(self.read_histroy_temp_data)-1):
+                #         sort_new[i] = sort_new[i+1]#0==1 1== 2 2== 3 3==4 4==5 5==6 6==7
+                #         self.read_histroy_temp_data[i] = sort_new[i]
+                #         pass
+                #     self.read_histroy_temp_data[6] = {"timeSec": time_tmp, "temp": self.temp_value}
+                # else:
+                #     self.read_histroy_temp_data.append({"timeSec": time_tmp, "temp": self.temp_value}) 
+
+                # with open("/usr/static/storage_file/history_temp.json","w",encoding="utf-8") as fd:
+                #     ujson.dump(self.read_histroy_temp_data,fd)
+                #EventMesh.debug_log(self.read_histroy_temp_data)
+                pass
+            else:
+                pass
+
+        def get_history_hr_value(self, event, msg): #近7次心率历史数据统计显示
+            return self.read_histroy_hr_data
+
+        def set_history_hr_value(self, event, msg): 
+            pass
+                
+            
+
+        def save_hr_value(self, event, msg): 
+            if msg >= 50:
+                EventMesh.publish("set_storage_config",["old_hr",msg])
+                self.oldHr = msg
+                
+
+                date_tmp = utime.localtime()
+                time_tmp = utime.mktime(date_tmp)
+                if len(self.read_histroy_hr_data) >= 7:
+                    sort_new = {}
+                    sort_new = sorted(self.read_histroy_hr_data, key = lambda i: i['timeSec'],reverse = False)#按照时间戳进行排序 去掉最旧的一次数据如果满了五十条
+                    EventMesh.debug_log(sort_new)
+                    for i in range(len(self.read_histroy_hr_data)-1):
+                        sort_new[i] = sort_new[i+1]#0==1 1== 2 2== 3 3==4 4==5 5==6 6==7
+                        self.read_histroy_hr_data[i] = sort_new[i]
+                        pass
+                    self.read_histroy_hr_data[6] = {"timeSec": time_tmp, "hr": self.oldHr}
+                else:
+                    self.read_histroy_hr_data.append({"timeSec": time_tmp, "hr": self.oldHr}) 
+
+
+                with open("/usr/static/storage_file/history_hr.json","w",encoding="utf-8") as fd:
+                    ujson.dump(self.read_histroy_hr_data,fd)
+                pass
+            else:
+                EventMesh.publish("set_storage_config",["old_hr",msg])
+                pass
+
+
+        def get_hr_value(self, event, msg): 
+            return self.oldHr
+
+        def save_spo2_value(self, event, msg): 
+            if msg >= 85:
+                # EventMesh.publish("set_storage_config",["old_spo2",msg])
+                # self.oldspo2 = msg
+
+
+                # date_tmp = utime.localtime()
+                # time_tmp = utime.mktime(date_tmp)
+                # if len(self.read_histroy_spo2_data) >= 7:
+                #     sort_new = {}
+                #     sort_new = sorted(self.read_histroy_spo2_data, key = lambda i: i['timeSec'],reverse = False)#按照时间戳进行排序 去掉最旧的一次数据如果满了五十条
+                #     EventMesh.debug_log(sort_new)
+                #     for i in range(len(self.read_histroy_spo2_data)-1):
+                #         sort_new[i] = sort_new[i+1]#0==1 1== 2 2== 3 3==4 4==5 5==6 6==7
+                #         self.read_histroy_spo2_data[i] = sort_new[i]
+                #         pass
+                #     self.read_histroy_spo2_data[6] = {"timeSec": time_tmp, "spo2": self.oldspo2}
+                # else:
+                #     self.read_histroy_spo2_data.append({"timeSec": time_tmp, "spo2": self.oldspo2}) 
+
+                # with open("/usr/static/storage_file/history_spo2.json","w",encoding="utf-8") as fd:
+                #     ujson.dump(self.read_histroy_spo2_data,fd)
+                # #EventMesh.debug_log(self.read_histroy_spo2_data)
+                #播放语音
+                # EventMesh.publish("set_hr_blood_led",2)#测量成功
+                pass
+            else:
+                pass
+                pass
+
+        def get_spo2_value(self, event, msg): 
+            return self.oldspo2
+        
+        def set_old_step_value(self, event, msg): 
+            self.oldstep = msg
+            EventMesh.publish("set_storage_config",["old_step",msg])
+            
+            
+        def get_old_step_value(self, event, msg): 
+            step = EventMesh.publish(constants.EVENT.GET_STEP)
+            self.old_step = self.oldstep + step[0]
+            return self.old_step
+    #获取旧的时间戳
+    class getOldTimeManager(Abstract):
+        # 获取天气数据
+        def __init__(self):
+            self.time_sec = 0
+            self.time_step = 0
+            self.step_second = 0
+            tmp_data = EventMesh.publish("get_storage_config","old_time")
+            if tmp_data !=None :
+                self.time_sec = tmp_data
+            tmp_data = EventMesh.publish("get_storage_config","clear_state")
+            if tmp_data !=None :
+                self.time_step = tmp_data[0]
+                self.step_second = tmp_data[1]
+
+            
+            
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("get_old_time_data", self.get_old_time_data)
+            EventMesh.subscribe("set_old_time_data", self.set_old_time_data)
+
+            EventMesh.subscribe("get_old_step_data", self.get_old_step_data)
+            EventMesh.subscribe("set_old_step_data", self.set_old_step_data)
+
+            EventMesh.subscribe("set_test_data1", self.set_test_data1)
+
+            EventMesh.subscribe("set_test_data2", self.set_test_data2)
+
+            EventMesh.subscribe("set_test_data3", self.set_test_data3)
+
+            EventMesh.subscribe("set_test_data4", self.set_test_data4)
+
+            EventMesh.subscribe("set_test_data5", self.set_test_data5)
+
+            EventMesh.subscribe("set_test_data6", self.set_test_data6)
+
+            EventMesh.subscribe("set_test_data7", self.set_test_data7)
+
+            EventMesh.subscribe("set_test_data8", self.set_test_data8)
+        
+
+        def set_test_data1(self, event, msg):
+            EventMesh.publish("set_storage_config",["clear_state1",msg])
+
+        
+        def set_test_data2(self, event, msg):
+            
+            EventMesh.publish("set_storage_config",["clear_state2",msg])
+
+
+        def set_test_data3(self, event, msg):
+            EventMesh.publish("set_storage_config",["clear_state3",msg])
+
+        def set_test_data4(self, event, msg):
+            EventMesh.publish("set_storage_config",["clear_state4",msg])
+
+        def set_test_data5(self, event, msg):
+            EventMesh.publish("set_storage_config",["clear_state5",msg])
+
+        def set_test_data6(self, event, msg):
+            EventMesh.publish("set_storage_config",["clear_state6",msg])
+
+        def set_test_data7(self, event, msg):
+            EventMesh.publish("set_storage_config",["clear_state7",msg])
+
+        def set_test_data8(self, event, msg):
+            EventMesh.publish("set_storage_config",["clear_state8",msg])
+
+        # f = open("/usr/static/storage_file/config.json",'r',encoding="utf-8")
+        # print(f.read())
+
+        def get_old_step_data(self, event, msg):
+            return [self.time_step,self.step_second]
+
+        def get_old_time_data(self, event, msg):
+            return self.time_sec
+        
+        
+
+        def set_old_time_data(self, event, msg):
+            self.time_sec = msg
+            EventMesh.publish("set_storage_config",["old_time",msg])
+
+        def set_old_step_data(self, event, msg):
+            self.time_step = msg[0]
+            self.step_second = msg[1]
+            EventMesh.publish("set_storage_config",["clear_state",msg])
+
+        def get_old_step_data(self, event, msg):
+            return [self.time_step,self.step_second]
+
+
+            
+        
+
+    class getWeatherDataManager(Abstract):
+        # 获取天气数据
+        def __init__(self):
+            self.date = {} #日期23-04-07
+            self.time = {} #14:41:41
+            self.content = {} #天气描述 
+            self.type = None #天气类型
+            self.temp = None #当前温度
+            self.min_temp = None #最低温度
+            self.max_temp = None #最高温度
+            self.city = {} #城市
+            self.no_data = 0#0沒有数据 1有数据
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("get_weather_data", self.get)
+            EventMesh.subscribe("set_weather_data", self.set)
+
+        def get(self, event, msg):
+            return [self.date,self.time,self.content,self.type,self.temp,self.min_temp,self.max_temp,self.city,self.no_data]
+
+        def set(self, event, msg):
+            self.date = msg[0]
+            self.time = msg[1]
+            self.content = msg[2]
+            self.type = msg[3]
+            self.temp = msg[4]
+            self.min_temp = msg[5]
+            self.max_temp = msg[6]
+            self.city = msg[7]
+            self.no_data = msg[8]
+
+
+    class getHrTimeManager(Abstract):
+        def __init__(self):
+            self.set_time = 0
+            self.set_hr = 0 #0关闭 1手动 2 自动测量按照时间间隔测试心率
+            self.set_spo2 = 0
+            self.open_btn = 0
+            self.set_bgautotime = 0
+            self.bgauto_btn = 0
+            read_data = EventMesh.publish("get_storage_config","measure_time")
+            if read_data != None:
+                self.set_time = read_data  
+            read_data = EventMesh.publish("get_storage_config","open_hr_btn")
+                    
+            if read_data != None:
+                self.open_btn = read_data   
+
+            read_data = EventMesh.publish("get_storage_config","bgauto_time")
+            if read_data != None:
+                self.set_bgautotime = read_data  
+            read_data = EventMesh.publish("get_storage_config","bgauto_btn")
+                    
+            if read_data != None:
+                self.bgauto_btn = read_data   
+
+
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_time_hr", self.set_time_hr)
+            EventMesh.subscribe("get_time_hr", self.get_time_hr)
+            EventMesh.subscribe("set_hr_state", self.set_hr_state)
+            EventMesh.subscribe("get_hr_state", self.get_hr_state)
+            EventMesh.subscribe("set_spo2_state", self.set_spo2_state)
+            EventMesh.subscribe("get_spo2_state", self.get_spo2_state)
+
+            EventMesh.subscribe("set_bgauto_time", self.set_bgauto_time)
+            EventMesh.subscribe("get_bgauto_time", self.get_bgauto_time)
+
+        def set_bgauto_time(self, event, msg): 
+            self.bgauto_btn = msg[0]
+            self.set_bgautotime = msg[1]
+            EventMesh.publish("set_storage_config",["bgauto_btn",self.bgauto_btn])
+            EventMesh.publish("set_storage_config",["bgauto_time",self.set_bgautotime])
+
+        def get_bgauto_time(self, event, msg): 
+            if self.bgauto_btn == None:
+                self.bgauto_btn = 0
+            if self.set_bgautotime == None:
+                self.set_bgautotime = 0
+            return [self.bgauto_btn,self.set_bgautotime]
+        
+
+        def set_time_hr(self, event, msg): 
+            self.open_btn = msg[0]
+            self.set_time = msg[1]
+            EventMesh.publish("set_storage_config",["measure_time",self.set_time])
+            EventMesh.publish("set_storage_config",["open_hr_btn",self.open_btn])
+
+        def get_time_hr(self, event, msg): 
+            return [self.open_btn,self.set_time]
+
+        def set_hr_state(self, event, msg): 
+            # if msg != 0:
+            #     EventMesh.publish("set_hr_blood_led",1)#红绿灯交替闪烁
+            self.set_hr = msg
+            if self.set_hr == 0:
+                EventMesh.publish("clear_health_state")
+            
+
+        def get_hr_state(self, event, msg): 
+            return self.set_hr
+        
+        def set_spo2_state(self, event, msg): 
+            # if msg != 0:
+            #     EventMesh.publish("set_hr_blood_led",1)##红绿灯交替闪烁
+            self.set_spo2 = msg
+            if self.set_spo2 == 0:
+                EventMesh.publish("clear_health_state")
+            
+
+        def get_spo2_state(self, event, msg): 
+            return self.set_spo2
+        
+    #体温
+    class getTempTimeManager(Abstract):
+        def __init__(self):
+            self.set_time = 0
+            self.get_temp = 0
+            read_data = EventMesh.publish("get_storage_config","temp_time")
+
+            if read_data != None:
+                self.set_time = read_data
+
+            self.get_bgstate = 0
+            self.get_bpstate = 0
+
+            self.bptime_on = 0
+            self.bptime_time = 0
+            read_data=EventMesh.publish("get_storage_config","bpauto_btn")
+            if read_data != None:
+                self.bptime_on = read_data
+
+            read_data=EventMesh.publish("get_storage_config","bpauto_time")
+            if read_data != None:
+                self.bptime_time = read_data
+
+            self.spo2time_on = 0
+            self.spo2time_time = 0
+            read_data = EventMesh.publish("get_storage_config","spo2auto_btn")
+            if read_data != None:
+                self.spo2time_on = read_data
+
+            read_data = EventMesh.publish("get_storage_config","spo2auto_time")
+            if read_data != None:
+                self.spo2time_time = read_data
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_temp_time", self.set_temp_time)
+            EventMesh.subscribe("get_temp_time", self.get_temp_time)
+
+            EventMesh.subscribe("set_temp_state", self.set_temp_state)
+            EventMesh.subscribe("get_temp_state", self.get_temp_state)
+
+            EventMesh.subscribe("set_bp_time", self.set_bp_time)
+            EventMesh.subscribe("get_bp_time", self.get_bp_time)
+
+            EventMesh.subscribe("set_bp_state", self.set_bp_state)
+            EventMesh.subscribe("get_bp_state", self.get_bp_state)
+
+
+            EventMesh.subscribe("set_bg_state", self.set_bg_state)
+            EventMesh.subscribe("get_bg_state", self.get_bg_state)
+
+            EventMesh.subscribe("set_spo2_time", self.set_spo2_time)
+            EventMesh.subscribe("get_spo2_time", self.get_spo2_time)
+
+            
+        def set_bg_state(self, event, msg): 
+            self.get_bgstate = msg
+            if self.get_bgstate == 0:
+                EventMesh.publish("clear_health_state")
+            # if msg != 0:
+            #     EventMesh.publish("set_hr_blood_led",1)#红绿灯交替闪烁
+
+        def get_bg_state(self, event, msg): 
+            if self.get_bgstate:
+                return self.get_bgstate
+            else :
+                return 0
+
+        def set_spo2_time(self, event, msg): 
+            self.spo2time_on = msg[0]
+            self.spo2time_time = msg[1]
+            EventMesh.publish("set_storage_config",["spo2auto_btn",self.spo2time_on])
+            EventMesh.publish("set_storage_config",["spo2auto_time",self.spo2time_time])
+
+
+        def get_spo2_time(self, event, msg): 
+            
+            return [self.spo2time_on,self.spo2time_time]
+
+
+        def set_bp_time(self, event, msg): 
+            self.bptime_on = msg[0]
+            self.bptime_time = msg[1]
+            EventMesh.publish("set_storage_config",["bpauto_btn",self.bptime_on])
+            EventMesh.publish("set_storage_config",["bpauto_time",self.bptime_time])
+
+        def get_bp_time(self, event, msg): 
+            if self.bptime_on == None:
+                self.bptime_on = 0
+            if self.bptime_time == None:
+                self.bptime_time = 0
+            return [self.bptime_on,self.bptime_time]
+        
+            
+        def set_bp_state(self, event, msg): 
+            self.get_bpstate = msg
+            if self.get_bpstate == 0:
+                EventMesh.publish("clear_health_state")
+            # if msg != 0:
+                # EventMesh.publish("set_hr_blood_led",1)#红绿灯交替闪烁
+
+        def get_bp_state(self, event, msg): 
+            if self.get_bpstate:
+                return self.get_bpstate
+            else :
+                return 0
+
+
+        def set_temp_time(self, event, msg): 
+            self.set_time = msg
+            EventMesh.publish("set_storage_config",["temp_time",self.set_time])
+
+        def get_temp_time(self, event, msg): 
+            return self.set_time
+        
+        def set_temp_state(self, event, msg): 
+            self.get_temp = msg
+            if self.get_temp == 0:
+                EventMesh.publish("clear_temp_state")
+            # if msg != 0:
+            #     EventMesh.publish("set_hr_blood_led",1)#红绿灯交替闪烁
+
+        def get_temp_state(self, event, msg): 
+            return self.get_temp
+            
+    class getBrightnessManager(Abstract):#获取亮度级别
+        def __init__(self):
+            self.level = 6#默认值6
+            # self.read_data = {}
+            self.time = 5
+            self.PWM_backlight  = None
+
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("get_brightness_level", self.get_brightness_level)
+            EventMesh.subscribe("push_add_brightness_level", self.add)
+            EventMesh.subscribe("push_reduce_brightness_level", self.reduce)
+            EventMesh.subscribe("set_brightness_level", self.set_brightness_level)
+
+            EventMesh.subscribe("set_brightness_time", self.set_brightness_time)
+            EventMesh.subscribe("get_brightness_time", self.get_brightness_time)
+
+        def set_brightness_level(self, event, msg): 
+            self.level = msg
+            EventMesh.publish("set_storage_config", ["brightness_level",self.level])
+
+        def get_brightness_level(self, event, msg): 
+            tmp = EventMesh.publish("get_storage_config","brightness_level")
+            if tmp != None:
+                self.level = tmp
+            return self.level
+        
+        def set_brightness_time(self, event, msg): 
+            self.time = msg
+            EventMesh.publish("set_storage_config", ["brightness_time",self.time])
+        
+        def get_brightness_time(self, event, msg): 
+            tmp = EventMesh.publish("get_storage_config","brightness_time")
+            if tmp != None:
+                self.time = tmp
+            return self.time
+        
+
+
+        def add(self, event, msg):
+            if self.level < 10:
+                self.level = self.level + 2
+            # self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS, self.level, 10)
+            # self.PWM_backlight.open()
+            EventMesh.publish("set_storage_config", ["brightness_level",self.level])
+
+
+        def reduce(self, event, msg):
+            # if self.level > 0:
+            #     self.level = self.level - 2
+            # if self.level <= 0:
+            #     self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS, 1, 10)
+            # else:
+            #     self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS,self.level, 10)
+
+            # self.PWM_backlight.open()
+            EventMesh.publish("set_storage_config", ["brightness_level",self.level])
+        
+        
+    class getStorageDataManager(Abstract):#获取内存数据
+        def __init__(self):
+            self.config_data = {}
+            check = ql_fs.path_exists("/usr/static/storage_file/config.json")
+            if check == True:
+                with open("/usr/static/storage_file/config.json","r") as fd:
+                    self.config_data = ujson.load(fd)
+            else :
+                self.config_data = {'old_time': 0, 'flip_sw': 0}
+                pass
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_storage_data", self.set_storage_data)
+            EventMesh.subscribe("set_storage_config", self.set_storage_config)
+            EventMesh.subscribe("get_storage_data", self.get_storage_data)
+            EventMesh.subscribe("get_storage_config", self.get_storage_config)
+
+        def set_storage_data(self, event, msg): 
+            # EventMesh.debug_log("set_storage_data:{}".format(msg))
+            if msg != None:
+                self.config_data = msg
+                with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:
+                    ujson.dump(self.config_data,fd)
+        
+
+        def set_storage_config(self,event,msg): 
+            # EventMesh.debug_log("set_storage_key_data1:{}".format(msg))
+            if len(msg) >= 2:
+                self.config_data[msg[0]]=msg[1]
+                # EventMesh.debug_log("set_storage_key_data2:{}".format(self.config_data[msg[0]]))
+                EventMesh.publish("publish_message_event_ui",{"func":self.set_storage_save,"data":0})
+        def set_storage_save(self, data): 
+            with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:
+                ujson.dump(self.config_data,fd)
+        def get_storage_data(self, event, msg): 
+            # EventMesh.debug_log("get_storage_data:{}".format(self.config_data))
+            return self.config_data 
+        def get_storage_config(self,event,msg):
+            # EventMesh.debug_log("get_storage_key_data1:{}".format(msg))
+            b = msg in self.config_data.keys()
+            if b == True:
+                # EventMesh.debug_log("get_storage_key_data2:{}".format(self.config_data[msg]))
+                return self.config_data[msg]
+            else :
+                return None
+            # try:
+            #     return self.config_data[msg]
+            # except:
+            #     EventMesh.debug_log("get_storage_key_data:none key:{}",msg)
+            #     return None
+    #定位频率
+    class getUpLoadDataManager(Abstract):#
+        def __init__(self):
+            self.upload_time = 2*60*60
+            read_data = EventMesh.publish("get_storage_config","upload_time")
+            if read_data != None:
+                self.upload_time = read_data 
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_upload_data", self.set_upload_data)
+            EventMesh.subscribe("get_upload_data", self.get_upload_data)
+
+        def set_upload_data(self, event, msg): 
+            self.upload_time = msg
+
+        def get_upload_data(self, event, msg): 
+            if self.upload_time == None:
+                self.upload_time = 2*60*60
+            return self.upload_time 
+
+    class getplayAudiodStateManager(Abstract):#获取设置播放音频状态
+        def __init__(self):
+            self.play = 0
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_audio_state", self.set_audio_state)
+            EventMesh.subscribe("get_audio_state", self.get_audio_state)
+
+        def set_audio_state(self, event, msg): 
+            self.play = msg
+
+        def get_audio_state(self, event, msg): 
+            return self.play
+        
+    class getVolumSizeManager(Abstract):#设置或获取音量大小数据
+        def __init__(self):
+            self.volume_size = 8
+            read_data = EventMesh.publish("get_storage_config","volum")
+            if read_data != None:
+                self.volume_size = read_data
+        
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_volum_size", self.set_volum_size)
+            EventMesh.subscribe("get_volum_size", self.get_volum_size)
+
+        def set_volum_size(self, event, msg): 
+            self.volume_size = msg
+            EventMesh.publish("set_storage_config", ["volum",self.volume_size])
+
+        def get_volum_size(self, event, msg): 
+            return self.volume_size
+
+    class getSosFlagManager(Abstract):#设置sos
+        def __init__(self):
+            self.aud = audio.Audio(0)
+            self.sos_flag = 0
+            self.sos_num = 0
+            self.hangup_mode = 0
+            self.call_timer = osTimer()
+            self.sos_numer1 = []
+            self.callnumer =""
+            SOS_NUMBER1 = EventMesh.publish("get_storage_config","SOS_NUMBER1")
+            if SOS_NUMBER1 != None:
+                self.sos_numer1 = SOS_NUMBER1
+            SOS_NUMBER2 = EventMesh.publish("get_storage_config","SOS_NUMBER2")
+            if SOS_NUMBER2 != None:        
+                self.sos_numer1 = [SOS_NUMBER1, SOS_NUMBER2]
+
+            SOS_NUMBER3 = EventMesh.publish("get_storage_config","SOS_NUMBER3")
+            if SOS_NUMBER3 != None:        
+                self.sos_numer1 = [SOS_NUMBER1, SOS_NUMBER2,SOS_NUMBER3]
+
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_sos_flag", self.set_sos_flag)#设置sos拨打标识
+            EventMesh.subscribe("get_sos_flag", self.get_sos_flag)
+
+            EventMesh.subscribe("set_sos_num", self.set_sos_num)#设置拨打循环次数
+            EventMesh.subscribe("get_sos_num", self.get_sos_num)
+
+            EventMesh.subscribe("set_dial_sos_number", self.set_dial_sos_number)
+            EventMesh.subscribe("get_dial_sos_number", self.get_dial_sos_number)#设置家庭号码三个
+
+            EventMesh.subscribe("set_callnumer_cb", self.set_callnumer_cb)#延时回调
+
+            EventMesh.subscribe("close_call_time",self.close_call_time)
+
+            EventMesh.subscribe("set_hangup_mode", self.set_hangup_mode)
+            EventMesh.subscribe("get_hangup_mode", self.get_hangup_mode)#获取挂断方式 是对方挂断 还是手表按键主动挂断
+
+        def get_hangup_mode(self, event, msg): # 1是设备端手表主动挂断 0是手机端
+            return self.hangup_mode
+        
+        def set_hangup_mode(self, event, msg): 
+            self.hangup_mode = msg
+
+        def set_sos_flag(self, event, msg): 
+            self.sos_flag = msg
+            EventMesh.publish("set_sos_state_out")
+            if self.sos_flag == 1:
+                number = EventMesh.publish("get_dial_sos_number")
+            
+                if number != None:
+                    if len(number) > 0:
+                        self.call_timer.stop()
+                        EventMesh.publish("save_phonename",number[0])
+                        EventMesh.publish("save_phonenum",number[0])
+                        EventMesh.publish("set_sos_num",0)
+                        phone_num = EventMesh.publish("get_phonenum")  
+                        EventMesh.publish("sos_out_call_center_cb",phone_num)#电话拨出去
+                    else:
+                        EventMesh.publish("sos_out_call_center_cb",None)#电话拨出去
+
+        def set_callnumer_cb(self, event, msg):
+            if self.sos_flag == 1:
+                EventMesh.publish("set_sos_state_out")
+                self.callnumer = msg
+                self.call_timer.start(5000, 0, self.call_timer_cb)#延迟10S 继续拨打
+
+        def call_timer_cb(self, *args, **kwargs):
+            EventMesh.publish("set_sos_state_out")
+            flag = EventMesh.publish("get_call_state") 
+            fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+            video_state = EventMesh.publish("get_video_state")
+            if flag != 0 or fall_down != 0 or video_state != 0:#防止不会被中断不会继续拨打sos号码正在通话或者打电话中,跌倒报警 视频通话中不允许拨打sos
+                if self.sos_flag == 1:
+                    self.call_timer.start(5000, 0, self.call_timer_cb)#延迟10S 继续拨打
+                    return
+                else:
+                    self.call_timer.stop()
+                    return
+
+            if self.sos_flag == 1:
+                self.call_timer.stop()
+                EventMesh.publish("save_phonename",str(self.callnumer))
+                EventMesh.publish("save_phonenum",str(self.callnumer))
+                phone_num = EventMesh.publish("get_phonenum")  
+                EventMesh.publish("sos_out_call_center_cb",phone_num)#电话拨出去
+            else:
+                self.call_timer.stop()
+        
+        def close_call_time(self, event, msg): 
+            self.call_timer.stop()
+
+        def get_sos_flag(self, event, msg): 
+            return self.sos_flag
+        
+        def set_sos_num(self, event, msg): 
+            self.sos_num = msg
+
+        def get_sos_num(self, event, msg): 
+            return self.sos_num
+        
+        def set_dial_sos_number(self, event, msg): 
+            self.sos_numer1 = msg
+            
+
+        def get_dial_sos_number(self, event, msg): 
+            return self.sos_numer1
+    class getLowBatManager(Abstract):#低电提醒
+        def __init__(self):
+
+            self.low_btn = 0
+            read_data = EventMesh.publish("get_storage_config","low_on")
+            if read_data != None:
+                self.low_btn = read_data
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_low_bat_btn", self.set_low_bat_btn)#
+            EventMesh.subscribe("get_low_bat_btn", self.get_low_bat_btn)
+
+        def set_low_bat_btn(self, event, msg): 
+            self.low_btn = msg
+            EventMesh.publish("set_storage_config",["low_on",self.low_btn])
+
+        def get_low_bat_btn(self, event, msg): 
+            return self.low_btn
+        
+
+
+    class playPowerAudioManager(Abstract):#播放开关机音频文件
+        def __init__(self):
+            self.aud = audio.Audio(0)
+
+        def post_processor_after_instantiation(self):
+            
+            EventMesh.subscribe("play_poewr_on_event", self.play_poewr_on_event)#
+            EventMesh.subscribe("play_poewr_off_event", self.play_poewr_off_event)
+
+        def play_poewr_on_event(self, event, msg): 
+            self.aud.play(1, 1, 'U:/static/R_POWER_1.mp3')  #播放播放开机铃声
+
+        def play_poewr_off_event(self, event, msg): 
+            self.aud.setVolume(11)
+            self.aud.play(1, 1, 'U:/static/R_POWER_OFF_1.mp3')  #播放关机铃声
+        
+    class getBootOffManager(Abstract):#开关机时间
+        def __init__(self):
+            self.poweroff_time = []
+            read_data = EventMesh.publish("get_storage_config","poweroff_alarm")
+            if read_data != None:
+                self.poweroff_time = read_data
+            else:
+                self.poweroff_time = [{"poweroff_on":0,"start_hour":6,"start_min":0,"end_hour":0,"end_min":0}]
+            
+
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_boot_off_time", self.set_boot_off_time)#设置关机时间
+            EventMesh.subscribe("get_boot_off_time", self.get_boot_off_time)
+
+        def set_boot_off_time(self, event, msg): 
+            EventMesh.debug_log("set_boot_off_time",msg)
+
+            EventMesh.publish("set_storage_config",["poweroff_alarm",msg])
+            self.poweroff_time = msg
+            EventMesh.publish("set_rtc_alarm")
+
+
+        def get_boot_off_time(self, event, msg):
+            return self.poweroff_time
+    class setSmsIndexManager(Abstract):#
+        def __init__(self):
+            self.index = -1
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_sms_index", self.set_sms_index)#设置关机时间
+            EventMesh.subscribe("get_sms_index", self.get_sms_index)
+
+        def set_sms_index(self, event, msg): 
+            self.index = msg
+            
+
+        def get_sms_index(self, event, msg):
+            
+            return self.index
+    import protocol 
+    class testSmsSetIPManager(Abstract):#
+        def __init__(self):
+            self.timer = osTimer()
+            #大锤
+            severdata = protocol.server_init()
+
+            self.newip = severdata[0]
+            self.newcom = severdata[1]
+            self.new_key = severdata[2]
+            self.new_pid = severdata[3]
+            
+            EventMesh.debug_log("testSmsSetIPManager:{}\n".format(severdata))
+
+            self.server_sate = 0
+
+
+
+            tmp_data = EventMesh.publish("get_storage_config","set_new_ip_addr")
+            if tmp_data != None:
+                self.newip = tmp_data
+            tmp_data = EventMesh.publish("get_storage_config","set_new_com")
+            if tmp_data != None:
+                self.newcom = tmp_data
+            tmp_data = EventMesh.publish("get_storage_config","set_new_md5")
+            if tmp_data != None:
+                self.newmd5 = tmp_data    
+
+            tmp_data = EventMesh.publish("get_storage_config","set_new_key")
+            if tmp_data != None:
+                self.new_key = tmp_data 
+
+            tmp_data = EventMesh.publish("get_storage_config","set_new_pid")
+            if tmp_data != None:
+                self.new_pid = tmp_data 
+
+            tmp_data = EventMesh.publish("get_storage_config","get_server_sate")
+            if tmp_data != None:
+                self.server_sate = tmp_data 
+            
+            
+
+
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_new_ip_com", self.set_new_ip_com)#设置关机时间
+            EventMesh.subscribe("get_new_ip_com", self.get_new_ip_com)
+
+            EventMesh.subscribe("set_ip", self.set_ip)#设置关机时间
+            EventMesh.subscribe("get_ip", self.get_ip)
+
+            EventMesh.subscribe("set_com", self.set_com)#设置关机时间
+            EventMesh.subscribe("get_com", self.get_com)
+
+            EventMesh.subscribe("get_new_key", self.get_new_key_cb)#获取key
+            EventMesh.subscribe("set_new_key", self.set_new_key_cb)#获取key
+
+            EventMesh.subscribe("set_new_pid", self.set_new_pid_cb)#获取pid
+            EventMesh.subscribe("get_new_pid", self.get_new_pid_cb)#获取pid
+
+            EventMesh.subscribe("set_server_state", self.set_server_state)#
+            EventMesh.subscribe("get_server_state", self.get_server_state)#
+
+            EventMesh.subscribe("get_new_key_pid", self.get_new_key_pid)#
+
+
+
+        def set_new_key_cb(self, event, msg): 
+            self.new_key = msg
+            # print("set_new_key_cb",msg,self.new_key)
+            EventMesh.publish("set_storage_config",["set_new_key",self.new_key])
+
+        def get_new_key_cb(self, event, msg):
+            # print("get_new_key_cb",self.new_key)
+            return self.new_key
+        
+        def set_new_pid_cb(self, event, msg): 
+            self.new_pid = msg
+            # print("set_new_pid_cb",msg,self.new_pid)
+            EventMesh.publish("set_storage_config",["set_new_pid",self.new_pid])
+
+        def get_new_pid_cb(self, event, msg):
+            # print("get_new_pid_cb",self.new_pid)
+            return self.new_pid
+
+        def set_new_ip_com(self, event, msg): 
+            self.newip = str(msg[0])
+            self.newcom = int(msg[1])
+            # self.newmd5 = str(msg[2])
+            #短信格式:SETIP:api.xcloudtech.com:9000:bZld0ALsZTt15tKEZhOlLPgbsO75BLTP 以冒号分隔 SETIP:ip地址:ip端口号:ip密钥key
+
+            # self.read_data["set_new_md5"] = self.newmd5  #通过短信设置ip的key密钥
+        
+
+            EventMesh.publish("set_storage_config",["set_new_ip_addr",self.newip])
+            EventMesh.publish("set_storage_config",["set_new_com",self.newcom])
+
+
+            number = str(msg[2])
+            sms.sendPduMsg(number, 'set ok', 'UCS2')
+            self.timer.start(10*1000,0,self.fun)
+            
+        def fun(self,*argc):
+            Power.powerRestart()
+
+        def get_new_ip_com(self, event, msg):
+            tmp_addr = EventMesh.publish("get_storage_config","set_new_ip_addr")
+            tmp_com = EventMesh.publish("get_storage_config","set_new_com")
+            if tmp_addr != None:
+                self.newip = tmp_addr
+            if tmp_com != None:
+                self.newcom = tmp_com
+            return [self.newip,self.newcom]
+        
+        def set_ip(self, event, msg): 
+            self.newip = msg
+            EventMesh.publish("set_storage_config",["set_new_ip_addr",self.newip])
+
+        def get_ip(self, event, msg):
+            # print("get_ip",self.newip)
+            return self.newip
+        
+        def set_com(self, event, msg): 
+            self.newcom = msg
+            EventMesh.publish("set_storage_config",["set_new_com",self.newcom])
+
+        def get_com(self, event, msg):
+            # print("get_com",self.newcom)
+            return self.newcom
+
+        def get_new_key_pid(self, event, msg):
+            return [self.new_key,self.new_pid]
+        
+        def set_server_state(self, event, msg):
+            EventMesh.publish("set_storage_config",["get_server_sate",msg])
+            self.server_sate = msg
+
+        def get_server_state(self, event, msg):
+            return self.server_sate
+            
+
+    # MMI Version:UIX8910_C55_DS_D12G_PRO18_FZD_V1.0_Release
+    # Build:07-07-2022 16:12:58
+    # IMEI:861218001025267
+    # IP:api.xcloudtech.com
+    # PORT:9000
+    # UPLOAD:300
+    # Battery:3948, 64
+    # Udebug: 0
+    # ConnectTime: 7
+    import protocol
+
+    class sendDevinfoManager(Abstract):#发送设备信息
+        def __init__(self):
+            self.timer = osTimer()
+            pass
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("send_devinfo_event", self.send_devinfo_event)#删除短信
+
+        def send_devinfo_event(self, event, msg): 
+            number = str(msg)
+            versions = EventMesh.softversion
+            Build = EventMesh.builTime
+            IMEI = EventMesh.publish(constants.EVENT.GET_IMEI)
+            IP = ""
+            new_ip = EventMesh.publish("get_storage_config","set_new_ip_addr")
+            new_com = EventMesh.publish("get_storage_config","set_new_com")
+            server_data = protocol.server_init()
+        
+            if new_ip != None:
+                if len(new_ip) != 0:
+                    IP = new_ip
+                else:
+                    IP = server_data[0]
+            else:
+                IP = server_data[0]
+            
+            PORT = ""
+            if new_com != None:
+                if len(str(new_com)) != 0:
+                    PORT = str(new_com)
+                else:
+                    PORT = str(server_data[1])
+            else:
+                PORT = str(server_data[1])
+            
+            UPLOAD = EventMesh.publish("get_upload_data")
+
+            level = EventMesh.publish("get_curr_battery_level")
+            if level == None:
+                level = 4200
+            bat = EventMesh.publish("screen_get_battery")[1]
+            if bat == None:
+                bat = 100
+            Battery = str(level) +',' +  str(bat)
+
+            ConnectTime = heartbeat_time//60
+            data1 = "Version:{}\nBuild:{}".format(versions,Build)
+
+            data2 = "IMEI:{}\nIP:{}\nPORT:{}".format(IMEI,IP,PORT)
+            
+            data3 = "UPLOAD:{}\nBattery:{}\nConnectTime:{}".format(UPLOAD,Battery,ConnectTime)
+
+            send_state1 = -1
+            send_state2 = -1
+            # print("data",data1,data2,data3)
+            send_state1 = sms.sendPduMsg(number, data1, 'UCS2')
+
+            if send_state1 == 0:
+                send_state2 = sms.sendPduMsg(number, data2, 'UCS2')
+
+            if send_state2 == 0:
+                sms.sendPduMsg(number, data3, 'UCS2')
+            
+
+    class deleteSmsManager(Abstract):#删除信息
+        def __init__(self):
+            self.timer = osTimer()
+            pass
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("delete_sms_event", self.delete_sms_event)#删除短信
+            EventMesh.subscribe("remove_all_sms_cb", self.remove_all_sms_cb)#
+
+        def delete_sms_event(self, event, msg): 
+            self.timer.start(4*1000,0,self.fun)
+            
+        def fun(self, *argc): 
+            EventMesh.publish_async("remove_all_sms_cb","",1*1024)
+
+        def remove_all_sms_cb(self, event, msg):
+            sms.deleteMsg(1,4)
+
+    #闹钟信息
+    alarm_list = [{'hour': 6, 'repeart': 10, 'idx': 0, 'enabled': 1, 'days': [0,1,2,3,4,5,6], 'minute': 0},
+                {'hour': 0, 'repeart': 10, 'idx': 1, 'enabled': 1, 'days': [0,1,2,3,4,5,6], 'minute': 0}]
+    #用于显示闹钟列表不包含开关机信息
+
+    class ClockManager(Abstract):
+        def __init__(self):
+            super().__init__()
+            self.rtc = RTC()
+            self.days = 0
+            self.idx = 0
+
+            IFEXIST = ql_fs.path_exists("/usr/static/storage_file/alarm_msg.json") 
+            self.check_alarm_list = []     
+            if IFEXIST == True:
+                with open("/usr/static/storage_file/alarm_msg.json","r",encoding='utf-8') as fd:
+                    self.check_alarm_list = ujson.load(fd)
+            
+            EventMesh.subscribe("push_clock_info", self.set)
+            EventMesh.subscribe("read_alarminjson", self.read_alarminjson)
+            EventMesh.subscribe("add_alarm", self.add_alarm)
+            EventMesh.subscribe("remove_alarm", self.remove_alarm)
+            EventMesh.subscribe("set_rtc_alarm", self.set_rtc_alarm)
+            EventMesh.subscribe("get_alarm_indx", self.get_alarm_indx)
+            EventMesh.subscribe("get_check_alarm_list", self.get_check_alarm_list)
+            EventMesh.subscribe("push_update_alarm_show", self.update_show_info)
+
+        def post_processor_after_instantiation(self):
+        
+            EventMesh.publish("read_alarminjson")
+            # EventMesh.publish("set_rtc_alarm")
+        
+        def update_show_info(self,event,msg):
+            EventMesh.publish("read_alarminjson")
+            # EventMesh.publish("set_rtc_alarm")
+
+        def get_check_alarm_list(self, event, msg):
+            alarm_len = 0
+            global alarm_list
+            EventMesh.publish("read_alarminjson")
+            alarm_len = len(alarm_list)
+            return alarm_len
+
+
+        def set(self, event, msg):
+            global alarm_list
+            EventMesh.debug_log("msg = {}".format(msg))
+            idx = msg.get("idx")
+            EventMesh.debug_log("修改第{}个闹钟信息{}".format(idx,alarm_list[idx]))
+            alarm_list[idx]["hour"] = msg["hour"]
+            alarm_list[idx]["minute"] = msg["minute"]
+            alarm_list[idx]["days"] = msg["days"]
+            alarm_list[idx]["enabled"] = msg["enabled"]
+            alarm_list[idx]["repeart"] = msg["repeart"]
+            with open("/usr/static/storage_file/alarm_msg.json", 'w+',encoding='utf-8') as fd:
+                ujson.dump(alarm_list,fd)
+
+        def read_alarminjson(self, event, msg):
+            IFEXIST = ql_fs.path_exists("/usr/static/storage_file/alarm_msg.json") 
+            global alarm_list     
+            EventMesh.debug_log("IFEXIST:{}".format(IFEXIST))
+            if IFEXIST == True:
+                with open("/usr/static/storage_file/alarm_msg.json","r",encoding='utf-8') as fd:
+                    alarm_list = ujson.load(fd)
+
+            
+            # read_data = EventMesh.publish("get_storage_config","off_on")
+
+            hour1 = str(alarm_list[0]["hour"])+':'+str(alarm_list[0]["minute"])
+            # min1 = str(alarm_list[0]["minute"])
+
+            hour2 = str(alarm_list[1]["hour"])+':'+str(alarm_list[1]["minute"])
+            # min2 = str(alarm_list[1]["minute"]) 
+            # EventMesh.publish("set_boot_off_time",[1,hour1,hour2])
+
+            EventMesh.debug_log("hour1:{}-{}".format(hour1,hour2))
+
+            
+            return alarm_list
+
+        def add_alarm(self, event, msg):
+
+            global alarm_list
+            EventMesh.publish("read_alarminjson")
+            EventMesh.debug_log("msg:{}".format(msg))
+            for i in range(0,2):#开关机固定是 idx 0 1
+                off_msg1 = msg[i+1]
+                msg_tmp1 = off_msg1.split(':')
+                start_hour = int(msg_tmp1[0])
+                start_min = int(msg_tmp1[1])
+                enable = int(msg[0])
+                EventMesh.debug_log("start_hour:{} start_min:{} enable:{}",start_hour,start_min,enable)
+                # EventMesh.publish("set_boot_off_time",[msg[0],msg[1],msg[2]])
+
+                alarm_list[i]["idx"]=i
+                alarm_list[i]["hour"]=start_hour
+                alarm_list[i]["minute"]=start_min
+                alarm_list[i]["days"]=[0,1,2,3,4,5,6]
+                alarm_list[i]["enabled"]=enable
+                alarm_list[i]["repeart"]=10
+
+
+                # alarm_list.append({"idx": i, "hour": start_hour, "minute": start_min, "days":[0,1,2,3,4,5,6], "enabled": enable,"repeart":10})
+
+            
+            # EventMesh.debug_log("alarm_list----len- :{} alarm_list:{}".format(len(alarm_list),alarm_list))
+            with open("/usr/static/storage_file/alarm_msg.json", 'w+',encoding='utf-8') as fd:
+                ujson.dump(alarm_list,fd)
+            EventMesh.publish("push_update_alarm_show")
+            
+        
+                
+            
+
+
+        def remove_alarm(self, event, msg):
+            global alarm_list
+            EventMesh.debug_log("ddddddddddddddddddd:",msg)
+            idx = msg.get("idx")
+            EventMesh.debug_log("delete_here1-----{},{}:".format(idx,msg))
+
+            for i, alarm in enumerate(alarm_list):
+                EventMesh.debug_log("delete_here2-----{},{}:".format(i,alarm))
+
+                if alarm["idx"] == idx:
+                    del alarm_list[i]
+                    EventMesh.debug_log("delete_here3-----",alarm_list)
+
+                    #删除闹钟后,对idx重新排序
+                    if alarm_list:
+                        for j in range(i,len(alarm_list)):
+                            alarm_list[j]["idx"] -= 1
+                            EventMesh.debug_log("delete_here4-----",alarm_list)
+
+            with open("/usr/static/storage_file/alarm_msg.json", 'w+',encoding='utf-8') as fd:
+                ujson.dump(alarm_list,fd)
+
+
+        def get_alarm_indx(self,event,msg):
+            return self.idx
+
+        def _rtc_callback(self,args):
+            #设置下一个闹钟,定时开关机功能
+            msg_data = EventMesh.publish("get_boot_off_time")
+            if msg_data != None:
+                power_offdata = msg_data[0]
+                start_hour = int(power_offdata["start_hour"])
+                start_min = int(power_offdata["start_min"])
+                end_hour = int(power_offdata["end_hour"])
+                end_min = int(power_offdata["end_min"])
+                off_on = int(power_offdata["poweroff_on"])
+
+                rtc_now_time = self.rtc.datetime()
+                current_minute = rtc_now_time[4]*60 + rtc_now_time[5]
+                end_min_total = end_hour*60+end_min
+                next_minute = start_hour*60+start_min #10:11
+                EventMesh.debug_log("off_on:{} {} {}".format(off_on,current_minute,next_minute))
+                if off_on != None:
+                    if off_on == 1:
+                        if end_min_total == current_minute:#结束的时间分钟等于关机时间分钟数则关机
+                            ubs_state = EventMesh.publish("get_usb")#'
+                            
+                            if ubs_state == 2 or ubs_state == 0:
+
+                                if next_minute > current_minute:#开机时间大于当前时间 9:00 > = 8:00 
+                                    interval_minute = next_minute - current_minute
+                                    
+                                    EventMesh.debug_log("开机距离下一次响铃的的分钟数:", interval_minute,next_minute)
+                                else:#8:00 9:00
+                                    #7*60*24 7天一个周期 7*60*24 - 
+                                    interval_minute = next_minute + (24*60-current_minute)
+                                    EventMesh.debug_log("开机08888距离下一次响铃的的分钟数:", interval_minute,next_minute)
+
+                                #反向获取时间戳
+                                time = utime.localtime()
+                                EventMesh.debug_log("开机9获取utime的时间戳:", time)
+                                rtc_mktime = utime.mktime(time)-time[5]
+                                EventMesh.debug_log("开机10反向获取utime的mktime:", rtc_mktime)
+
+                                #加上下一次响铃需要的时间
+                                next_alarm_mktime = rtc_mktime + interval_minute*60 #转换成s单位 时间戳
+                                EventMesh.debug_log("开机11下一次响铃的mktime:", next_alarm_mktime)
+
+                                #格式化时间戳,得到下一次闹钟的时间
+                                next_alarm_time = utime.localtime(next_alarm_mktime)
+                                EventMesh.debug_log("开机12下一次响铃的准确时间:", next_alarm_time)
+                                #将时间转换为rtc的格式
+                                data_l = [2021, 7, 9, 5, 12, 30, 0, 0]
+                                #给rtc时间赋值
+                                data_l[0] = next_alarm_time[0] #year
+                                data_l[1] = next_alarm_time[1] #month                    
+                                data_l[2] = next_alarm_time[2] #day                     
+                                data_l[4] = next_alarm_time[3] #hour               
+                                data_l[5] = next_alarm_time[4] #minute   
+                                data_e=tuple(data_l)
+                                EventMesh.debug_log("开机13将该时间转换为RTC元组:", data_e)
+                                
+                                self.rtc.register_callback(self._rtc_callback)
+
+                                FLAG = self.rtc.set_alarm(data_e)
+                                if FLAG == 0:
+                                    EventMesh.debug_log("开机11成功设置rtc的到期时间:", data_e)
+                                else:
+                                    EventMesh.debug_log("开机时设置rtc的到期时间失败:", data_e)
+                                self.rtc.enable_alarm(1)
+                                
+                                EventMesh.debug_log("结束时设置rtc的到期时间失败:", data_e)
+                                EventMesh.publish("open_power_on", 5)#静音关机
+                                return
+                            else:
+                                EventMesh.publish("set_rtc_alarm")
+                                #self.rtc.datetime([2023, 12, 1, 5, 5, 59, 30, 0])
+                                return
+                
+            EventMesh.publish("set_rtc_alarm")
+
+
+        def set_rtc_alarm(self,event,msg):
+            msg_data = EventMesh.publish("get_boot_off_time")
+            if msg_data != None:
+                power_offdata = msg_data[0]
+                start_hour = int(power_offdata["start_hour"])
+                start_min = int(power_offdata["start_min"])
+                end_hour = int(power_offdata["end_hour"])
+                end_min = int(power_offdata["end_min"])
+                off_on = int(power_offdata["poweroff_on"])
+                if off_on == 1:
+                    next_minute = start_hour*60+start_min #10:11
+
+                    start_total = start_hour*60+start_min #10:11
+                    end_total = end_hour*60+end_min #10:11
+                    rtc_now_time = self.rtc.datetime()
+                    current_minute = rtc_now_time[4]*60 + rtc_now_time[5]#当前时间
+
+
+                    minute_list = []
+                    if start_total != current_minute:
+                        minute_list.append(start_total)#23*60=
+                    if end_total != current_minute:
+                        minute_list.append(end_total)
+                    minute_list.append(current_minute)#[927,927,930]
+                    minute_list = sorted(minute_list)
+                    current_index = minute_list.index(current_minute)
+                    print("minute_list",minute_list,start_total,end_total,current_index,power_offdata)
+                    
+                    
+                    next_index = current_index + 1
+                    if next_index >= len(minute_list):
+                        next_minute = minute_list[0]
+                        print("07下一个闹钟的分钟数:", next_minute)
+                    else:
+                        next_minute = minute_list[next_index]
+                        print("08下一个闹钟的分钟数:", next_minute)
+
+                    print("minute_list1",minute_list,current_index,next_minute)
+                    if next_minute > current_minute:
+                        interval_minute = next_minute - current_minute
+                        print("09距离下一次响铃的的分钟数:", interval_minute)#14 31 14 29 14 31 24*60-
+                    else:
+                        interval_minute = (24*60 - current_minute) + next_minute
+                        print("10距离下一次响铃的的分钟数:", interval_minute)
+
+
+                    #反向获取时间戳
+                    time = utime.localtime()
+                    EventMesh.debug_log("关机09获取utime的时间戳:", time)
+                    time
+                    rtc_mktime = utime.mktime(time)-time[5]
+                    EventMesh.debug_log("关机10反向获取utime的mktime:", rtc_mktime)
+
+                    #加上下一次响铃需要的时间
+                    next_alarm_mktime = rtc_mktime + interval_minute*60 #转换成s单位 时间戳
+                    EventMesh.debug_log("关机11下一次响铃的mktime:", next_alarm_mktime)
+
+                    #格式化时间戳,得到下一次闹钟的时间
+                    next_alarm_time = utime.localtime(next_alarm_mktime)
+                    EventMesh.debug_log("关机12下一次响铃的准确时间:", next_alarm_time)
+                    #将时间转换为rtc的格式
+                    data_l = [2021, 7, 9, 5, 12, 30, 0, 0]
+                    #给rtc时间赋值
+                    data_l[0] = next_alarm_time[0] #year
+                    data_l[1] = next_alarm_time[1] #month                    
+                    data_l[2] = next_alarm_time[2] #day                     
+                    data_l[4] = next_alarm_time[3] #hour               
+                    data_l[5] = next_alarm_time[4] #minute   
+                    data_e=tuple(data_l)
+                    EventMesh.debug_log("关机13将该时间转换为RTC元组:", data_e)
+                    
+                    self.rtc.register_callback(self._rtc_callback)
+
+                    FLAG = self.rtc.set_alarm(data_e)
+                    if FLAG == 0:
+                        EventMesh.debug_log("关机11成功设置rtc的到期时间:", data_e)
+                    else:
+                        EventMesh.debug_log("关机时设置rtc的到期时间失败:", data_e)
+                    self.rtc.enable_alarm(1)
+                else:
+                    self.rtc.enable_alarm(0)
+                    
+
+    class schoolclassManager(Abstract):#
+        def __init__(self):
+            # ['火星情报局', '一年级二班', '柠檬茶']
+            self.school_name = ''
+            self.class_name = ''
+            self.full_name = ''
+            tmp_data = EventMesh.publish("get_storage_config","school_name")
+            if tmp_data != None:
+                self.school_name = tmp_data
+            tmp_data = EventMesh.publish("get_storage_config","class_name")
+            if tmp_data != None:
+                self.class_name = tmp_data
+            tmp_data = EventMesh.publish("get_storage_config","full_name")
+            if tmp_data != None:
+                self.full_name = tmp_data    
+
+            
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_schoolname", self.set_school_name)#
+            EventMesh.subscribe("get_schoolname", self.get_school_name)
+
+            EventMesh.subscribe("set_classname", self.set_classname)#
+            EventMesh.subscribe("get_classname", self.get_classname)
+
+            EventMesh.subscribe("set_fullname", self.set_full_name)#
+            EventMesh.subscribe("get_fullname", self.get_full_name)
+
+        def set_school_name(self, event, msg): 
+            if msg != None:
+                if len(msg) != 0:
+                    self.school_name = str(msg)
+                    EventMesh.publish("set_storage_config",["school_name",str(msg)])
+            
+
+        def get_school_name(self, event, msg):
+            if self.school_name:
+                return self.school_name
+            else:
+                return None
+        
+        def set_classname(self, event, msg): 
+            if msg != None:
+                if len(msg) != 0:
+                    self.class_name = str(msg)
+                    EventMesh.publish("set_storage_config",["class_name",str(msg)])
+                
+            
+        def get_classname(self, event, msg):
+            if self.class_name:
+                return self.class_name
+            else:
+                return None
+        def set_full_name(self, event, msg): 
+            if msg != None:
+                if len(msg) != 0:
+                    self.full_name = str(msg)
+                    EventMesh.publish("set_storage_config",["full_name",str(msg)])
+
+        def get_full_name(self, event, msg):
+            if self.full_name:
+                return self.full_name
+            else:
+                return None
+            
+    
+    class vedioInforManager(Abstract):#
+        def __init__(self):
+            self.call_id = ""
+            self.meet_id = ""#会议id
+            self.call_type = 0 #会议id
+            self.tokens_data= ""#tokens
+            self.timer = osTimer()
+            self.videobook = {}
+            self.check_json = 0
+            self.check_json = ql_fs.path_exists("/usr/static/storage_file/videobook.json")
+
+            if self.check_json == True:
+                with open("/usr/static/storage_file/videobook.json","r",encoding="utf-8") as fd:
+                    self.videobook = ujson.load(fd)
+                    print("读取视频通话账号列表")
+            
+            self.video_state = 0
+            self.video_count = 0
+            self.video_state_time = 0
+
+            self.video_dev_mode = 0
+
+            self.video_led_state = 0
+            self.video_answer = 0
+
+            self.video_timer = 0
+
+            self.video_init = 0
+            self.video_network_end = 0 #网络不好或者信号较差菊风底层挂断当前视频通话
+            self.videoInfo_queue = Queue()
+            _thread.stack_size(10*1024)
+            _thread.start_new_thread(self.videoInfo_queue_thread, ())
+            _thread.stack_size(8*1024)
+            EventMesh.subscribe("publish_message_event_videoInfo",self.publish_message_event_videoInfo)
+            pass
+
+        def videoInfo_queue_thread(self):
+            while True:
+                data = self.videoInfo_queue.get()
+                #EventMesh.debug_log("ledInfo_queue:data = {}".format(data))
+                if data != None:
+                    try:
+                        data["func"](data["data"])
+                    except Exception as e:
+                        EventMesh.debug_log("ledInfo_queue:ERROR:{}".format(e))
+                        usys.print_exception(e)
+        def publish_message_event_videoInfo(self,event,msg):
+            self.videoInfo_queue.put(msg)
+
+        def publish_led_event_cb(self, *args, **kwargs):
+            EventMesh.publish("publish_message_event_videoInfo",{"func":self.video_time_cb,"data":0})
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_vedio_call_id", self.set_vedio_call_id)#
+            EventMesh.subscribe("set_vedio_meet_id", self.set_vedio_meet_id)#
+            EventMesh.subscribe("set_vedio_call_type", self.set_vedio_call_type)#
+            EventMesh.subscribe("set_vedio_tokens_data", self.set_vedio_tokens_data)#
+
+            EventMesh.subscribe("get_vedio_call_id", self.get_vedio_call_id)#
+            EventMesh.subscribe("get_vedio_meet_id", self.get_vedio_meet_id)#
+            EventMesh.subscribe("get_vedio_call_type", self.get_vedio_call_type)#
+            EventMesh.subscribe("get_vedio_tokens_data", self.get_vedio_tokens_data)#
+
+
+            EventMesh.subscribe("open_vedio_infor",self.open_vedio_infor)
+            EventMesh.subscribe("close_jrtc_event",self.close_jrtc_event)
+
+            EventMesh.subscribe("get_videobook_list", self.get_videobook_list)
+            EventMesh.subscribe("set_videobook_list", self.set_videobook_list)
+
+            EventMesh.subscribe("set_video_state", self.set_video_state)
+            EventMesh.subscribe("get_video_state", self.get_video_state)
+
+            EventMesh.subscribe("set_dev_app_mode", self.set_dev_app_mode)
+            EventMesh.subscribe("get_dev_app_mode", self.get_dev_app_mode)
+
+            EventMesh.subscribe("close_video_timer",self.close_video_timer)
+
+            EventMesh.subscribe("call_viode_book_num",self.call_viode_book_num)
+
+            EventMesh.subscribe("app_rtalk_cb",self.app_rtalk_cb)#app拒绝视频通话
+
+            EventMesh.subscribe("video_answer_cb",self.video_answer_cb)#接听视频通话
+
+            EventMesh.subscribe("video_newwork_reject_cb",self.video_newwork_reject_cb)#端挂断视频通话
+            EventMesh.subscribe("video_dev_reject_cb",self.video_dev_reject_cb)#手表端挂断视频或者语音通话
+
+            EventMesh.subscribe("video_no_network",self.video_no_network)#打着突然掉网或者未绑定设备 每10s检测一次
+
+            EventMesh.subscribe("clear_video_timer_state",self.clear_video_timer_state)
+
+            EventMesh.subscribe("set_vedio_init",self.set_vedio_init)
+            
+
+            EventMesh.subscribe("set_app_dev_end_state",self.set_app_dev_end_state)#设置是app 设备 还是主动信号不好的挂断当前的视频通话
+            EventMesh.subscribe("get_app_dev_end_state",self.get_app_dev_end_state)#设置是app 设备 还是主动信号不好的挂断当前的视频通话
+
+        def set_video_state(self, event, msg):#视频通话 1是刚播进去 2 是手机拨进去 3是正在加入中 5是已接通出现画面
+            self.video_state = msg
+
+        def get_video_state(self, event, msg):
+            return self.video_state
+        
+        def set_dev_app_mode(self, event, msg):#设置是手表拨 还是手机app拨视频通话 0未拨打 1是手表设备端  2 手机app拨打视频通话
+            self.video_dev_mode = msg
+
+        def get_dev_app_mode(self, event, msg):
+            return self.video_dev_mode
+        
+        def get_videobook_list(self, event, msg):
+            self.check_json = ql_fs.path_exists("/usr/static/storage_file/videobook.json")
+            return [self.check_json,self.videobook]
+        
+        def set_videobook_list(self, event, msg):
+            print("videolist",msg)
+            self.check_json = msg[0]
+            self.videobook = msg[1]
+
+        def call_viode_book_num(self, event, msg):#默认拨打视频通话列表第一个
+            self.video_led_state = 0
+            self.video_network_end = 0
+            EventMesh.publish("clear_video_timer_state")
+            if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网提示关机
+                if len(self.videobook) != 0:#已联网未添加账号
+                    phonebook_keys = sorted(self.videobook.keys())
+                    name = self.videobook[phonebook_keys[0]]
+                    key_tmp = phonebook_keys[0][4:]
+                    print("key_tmp list",key_tmp)
+                    print("calling",key_tmp)
+                    EventMesh.publish("set_vedio_call_id", key_tmp)#
+                    EventMesh.publish("set_vedio_call_type", 1)#
+                    EventMesh.publish("set_video_state", 1)#
+                    EventMesh.publish("set_dev_app_mode", 1)#
+                    EventMesh.publish("close_hr_sop2")##在测试心率血氧 血压体温是关闭测试
+                    EventMesh.publish("video_call_out_cb",1)#视频通话拨进中
+                    EventMesh.publish(constants.PROTOCOL.AGTALK_SEND,[1,key_tmp])
+                else:
+                    EventMesh.publish("video_call_out_cb",None)#视频通话拨进中
+                    print("no video list")
+                    pass
+            else:
+                EventMesh.publish("set_sim_mode")#
+                pass
+        
+
+            
+        def set_vedio_call_id(self, event, msg): 
+            self.call_id = msg
+
+        def set_vedio_meet_id(self, event, msg): 
+            self.meet_id = msg
+
+        def set_vedio_call_type(self, event, msg): 
+            self.call_type = msg
+
+        def set_vedio_tokens_data(self, event, msg): 
+            self.tokens_data= msg
+            
+
+        def get_vedio_call_id(self, event, msg): 
+            return self.call_id
+        
+        def get_vedio_meet_id(self, event, msg): 
+            return self.meet_id
+        
+        def get_vedio_call_type(self, event, msg): 
+            return self.call_type
+        
+        def get_vedio_tokens_data(self, event, msg): 
+            return self.tokens_data
+
+        def set_vedio_init(self, event, msg): 
+            self.video_init = 0
+
+        def open_vedio_infor(self,event,msg):
+            if self.video_init == 0:
+                self.video_init = 1
+                EventMesh.publish(constants.EVENT.SYSTEM_UP)#唤醒休眠
+                call_id = EventMesh.publish("get_vedio_call_id")#对方的账号
+                meet_id = EventMesh.publish("get_vedio_meet_id")#共有的会议id
+                call_type = EventMesh.publish("get_vedio_call_type")#呼叫类型
+                tokens_data = EventMesh.publish("get_vedio_tokens_data")#tookens数据#云米平台不需要tokens
+            
+
+
+                
+                uid = str(call_id)
+                ticket = str(meet_id)
+
+                # data = ['6951832', '876226002021444', '1', '01lqlyqzQ4Gozdz8OJv1Mij2Y3PBq2y3+rtIA26Ge+m2QHTc/Vk=gufkGNMBiYhPjbq1tLCwtLKysLKws7a2tg==']
+
+                tokens = str(tokens_data)
+                appkey = "efe9f8800a39d96244234097"#
+                uid_key = "25v9C652123QL3N8"
+
+                # appkey = "249e7d505516af0a7ed44097"
+                # uid_key = "qQI4gkB9FxH8J2cb"
+                imei = EventMesh.publish(constants.EVENT.GET_IMEI)
+                oneself_id = str(imei)#自己的账号默认是imei号
+
+            
+                
+                print("uid ",uid,ticket,oneself_id)
+
+                
+                self.video_count = 0
+                self.video_state_time = 0
+                self.video_led_state = 0
+                self.video_answer = 0
+                self.video_timer = 0
+                self.timer.start(1*1000,1,self.publish_led_event_cb)
+            
+
+        def video_time_cb(self,data):#1s定时器 实时监测视频通话的状态 3是拨进未接通 5是接通出画面了
+            EventMesh.publish("system_sleep_rest")#防止黑屏 
+            call_state = 1
+            video_state = EventMesh.publish("get_video_state")#这个函数获取为了防止不进回调不置0
+            get_video_state = EventMesh.publish("get_video_in_out_state")
+            dev_mode = EventMesh.publish("get_dev_app_mode")
+            if self.video_led_state == 1 or self.video_timer == 1:#手表挂断不在进入
+                self.timer.stop()
+                return
+
+            if video_state != 0 or call_state != 0:
+                if get_video_state == 0 and call_state != 0:#双方接通如果是信号不好就开始计算30 30s过后还没有出画面就挂断当前视频通话
+                    self.video_count+=1
+                    if self.video_count > 30:
+                        if call_state != 5:
+                            self.video_state = 0
+                            self.video_state_time = 0
+                            self.timer.stop()
+                            EventMesh.publish("video_newwork_reject_cb",5)#挂断视频通话
+                            return
+
+                if call_state == 5:#已经接通出画面了
+                    self.video_count = 0
+                    self.video_answer = 4
+                    EventMesh.publish("set_video_in_out_state",0)
+                    if self.video_state_time == 0:
+                        self.video_state_time = 1
+                        EventMesh.publish("stop_led_timer")#设置参数
+                        EventMesh.publish("close_timer_all")#
+                        EventMesh.publish("video_answer_mode_timer_cb",2)#
+
+                    EventMesh.publish("set_video_state", 5)
+                else:
+                    self.video_state_time = 0 
+                    if call_state != 0:#信号不好的时候正在接听
+                        EventMesh.publish("set_video_state", call_state)
+
+                        if call_state == 4:
+                            EventMesh.publish("stop_led_timer")#设置参数
+                            EventMesh.publish("close_timer_all")#
+
+                        if dev_mode != 0:
+                            if get_video_state == 0 and call_state != 4 and self.video_answer == 0:
+                                EventMesh.publish("video_answer_mode_timer_cb",3)#
+                        
+                    if call_state == 0:
+                        self.timer.stop()
+                        EventMesh.publish("video_newwork_reject_cb",1)
+            else:
+                self.video_state_time = 0
+                self.video_count = 0
+                self.timer.stop()
+                EventMesh.publish("set_video_state", 0)
+                EventMesh.publish("video_newwork_reject_cb",1)
+
+        def video_waite_event_time_cb(self,*argc):#正在接听中,请稍候
+            EventMesh.publish("video_answer_mode_timer_cb",1)
+            pass
+
+        def video_answer_event_time_cb(self,*argc):#对方已接听可以正常视频通话了
+            EventMesh.publish("video_answer_mode_timer_cb",2)
+            pass
+        def video_no_network(self,event,msg):#视频通话无网络
+            if EventMesh.publish(constants.EVENT.GET_CONNECT) == 0:#
+                if EventMesh.publish("get_video_state") != 0:
+                    EventMesh.publish("video_newwork_reject_cb",None)
+                pass
+
+
+        def close_video_timer(self,event,msg):
+            self.timer.stop()
+            pass
+        def close_jrtc_event(self,event,msg):
+            
+            pass
+
+
+        def video_answer_cb(self,event,msg):#手表端拒绝视频通话
+            EventMesh.publish("stop_led_timer")#关闭亮灯模式
+            EventMesh.publish("close_timer_all")##关闭统一的计时器
+            EventMesh.publish("set_video_in_out_state",0)
+            EventMesh.publish("open_vedio_infor")#启动视频通话的SDK相关配置
+
+        
+        def clear_video_timer_state(self,event,msg):#清除标识
+            self.video_timer = 0
+            self.video_network_end = 0
+        
+        def video_newwork_reject_cb(self,event,msg):#信号不好底层SDK挂断
+            if self.video_led_state != 2:#2表示app挂断
+                if self.video_network_end == 1:
+                    return
+                self.video_network_end = 1
+                self.video_timer = 1
+                self.video_init = 0
+                EventMesh.publish("stop_led_timer")#设置参数
+                EventMesh.publish("close_timer_all")#
+                EventMesh.publish("close_video_timer")
+                EventMesh.publish("set_video_state", 0)
+                EventMesh.publish("set_dev_app_mode", 0)
+                EventMesh.publish("set_video_in_out_state",0)
+                call_id = str(EventMesh.publish("get_vedio_call_id"))#
+                meet_id = str(EventMesh.publish("get_vedio_meet_id"))#
+                call_type = int(EventMesh.publish("get_vedio_call_type"))#
+
+                
+                if self.video_led_state == 0:
+                    EventMesh.publish("video_answer_mode_timer_cb",4)#提示对方已挂断
+                    EventMesh.publish(constants.PROTOCOL.RCALLING_SEND,[call_id,meet_id,call_type])
+
+
+        def video_dev_reject_cb(self,event,msg):#手表主动挂断
+            if self.video_timer == 0:
+                self.video_init = 0
+                EventMesh.publish("stop_led_timer")#设置参数
+                EventMesh.publish("close_timer_all")#
+                EventMesh.publish("close_video_timer")
+                EventMesh.publish("set_video_state", 0)
+                EventMesh.publish("set_dev_app_mode", 0)
+                EventMesh.publish("set_video_in_out_state",0)
+                call_id = str(EventMesh.publish("get_vedio_call_id"))#
+                meet_id = str(EventMesh.publish("get_vedio_meet_id"))#
+                call_type = int(EventMesh.publish("get_vedio_call_type"))#
+
+                self.video_led_state = 1
+                self.video_timer = 1
+                EventMesh.publish(constants.PROTOCOL.RCALLING_SEND,[call_id,meet_id,call_type])
+
+
+            
+        def set_app_dev_end_state(self,event,msg):#app拒绝视频通话
+            self.video_led_state = 0 #手表挂断不在进入
+
+        def get_app_dev_end_state(self,event,msg):#app拒绝视频通话
+            return self.video_led_state #手表挂断不在进入
+
+        def app_rtalk_cb(self,event,msg):#app拒绝视频通话
+            dev_mode = EventMesh.publish("get_dev_app_mode")#如果是app主动挂断需要提示音频文件
+            video_state = EventMesh.publish("get_video_state")#清除视频通话状态
+            if self.video_led_state != 0 or self.video_timer != 0:#手表挂断不在进入
+                return
+            
+            self.video_init = 0
+            self.video_timer = 1
+            self.video_led_state = 2
+            EventMesh.publish(constants.EVENT.SYSTEM_UP)#
+
+            EventMesh.publish("stop_led_timer")#设置参数
+            EventMesh.publish("close_timer_all")#
+            EventMesh.publish("close_video_timer")
+            EventMesh.publish("set_dev_app_mode", 0)
+            EventMesh.publish("set_video_state",0)#清除视频通话状态
+            EventMesh.publish("set_video_in_out_state",0)#清除视频通话拨进还是拨出的状态
+            EventMesh.publish("video_answer_mode_timer_cb",4)##提示对方已挂断
+
+
+    def jrtc_cb(close_sta):#注册回调
+        print("jrtc callback:", close_sta)
+        if close_sta == 0 or close_sta == 1:
+            EventMesh.publish("set_video_state", 0)
+            EventMesh.publish("set_video_in_out_state",0)
+            EventMesh.publish("set_vedio_init")
+
+
+
+    import fota
+    class firwDownloadManager(Abstract):#
+        def __init__(self):
+            self.timer = osTimer()
+
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("firware_download", self.firware_download)#
+
+        def firware_download(self, event, msg): 
+            number = str(msg)
+            sms.sendPduMsg(number, 'set ok', 'UCS2')
+            self.timer.start(10*1000,0,self.fun)
+
+        def fun(self,*argc):
+            fota_obj = fota()
+            fota_obj.httpDownload(url1="http://u-oss.thisiot.com/test/dfota_1.bin",url2="http://u-oss.thisiot.com/test/dfota_2.bin")
+
+
+
+
+
+
+
diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/motor.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/motor.py
new file mode 100644 (file)
index 0000000..cd31639
--- /dev/null
@@ -0,0 +1,112 @@
+from common import Abstract
+import osTimer
+import EventMesh
+from machine import Pin
+import utime
+
+from queue import Queue
+import _thread
+import usys
+
+
+motor_pin = Pin(Pin.GPIO20, Pin.OUT, Pin.PULL_PD, 0)
+def open_motor():#开马达
+    motor_pin.write(1)
+
+def close_motor():#关闭马达
+    motor_pin.write(0)
+
+
+
+MOTOR_TIME = 100
+class motorEventManager(Abstract):#马达事件
+    def __init__(self):
+        self.motor_timer = osTimer()
+        self.motorInfo_queue = Queue()
+        self.motor_enable = 0#马达使能
+        self.motor_total_time = 0#总的时间
+        self.motor_open_time = 0 #开马达事件
+        self.motor_close_time = 0#关马达事件100ms
+        self.motor_count = 0
+        self.motor_mode = 0#模式
+        _thread.start_new_thread(self.motorInfo_queue_thread, ())
+        EventMesh.subscribe("publish_message_event_motorInfo",self.publish_message_event_motorInfo)
+        pass
+
+    def motorInfo_queue_thread(self):
+        while True:
+            data = self.motorInfo_queue.get()
+            #print("ledInfo_queue:data = {}".format(data))
+            if data != None:
+                try:
+                    data["func"](data["data"])
+                except Exception as e:
+                    print("ledInfo_queue:ERROR:{}".format(e))
+                    usys.print_exception(e)
+    def publish_message_event_motorInfo(self,event,msg):
+        self.motorInfo_queue.put(msg)
+
+    def publish_motor_event_cb(self, *args, **kwargs):
+        EventMesh.publish("publish_message_event_motorInfo",{"func":self.motor_fun_cb,"data":0})  
+        
+    def post_processor_after_instantiation(self):
+        EventMesh.subscribe("set_motor_time", self.set_motor_time)#设置参数
+        EventMesh.subscribe("close_motor_infor", self.close_motor_infor)#关闭马达和定时器
+
+    # msg 0马达使能 1 马达振动时间100ms单位 2 震动次数 3 间隔时间振动 4 是否需要长振 5 长振时间  6间隔时间长振 7长振次数1一次 要为200ms的倍数
+    def set_motor_time(self,event,msg):
+        open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+        if open_power != None:
+            if open_power == 0:
+                return
+        if msg != None:
+            self.motor_enable = msg[0]
+            if self.motor_enable == 1: #马达使能
+                self.motor_mode = msg [1]
+                self.motor_total_time = msg[2]#总的时间
+                self.motor_open_time = msg[3] #开马达事件
+                self.motor_close_time = msg[4]#关马达事件100ms
+                self.motor_count = 0
+                self.motor_timer.stop()
+                # print("motor msg",msg)
+                close_motor()
+                self.motor_timer.start(MOTOR_TIME,1,self.publish_motor_event_cb)
+
+    def motor_fun_cb(self, data):
+        if self.motor_mode == 0 or self.motor_enable == 0:
+            close_motor()
+            EventMesh.publish("close_motor_infor")#关闭马达和定时器
+            return
+        if self.motor_mode == 1:#
+            if self.motor_total_time > 0:
+                self.motor_total_time-=1
+                if self.motor_total_time > 0:
+                    open_motor()
+                else:
+                    close_motor()
+                    EventMesh.publish("close_motor_infor")#关闭马达和定时器
+                    return
+        elif self.motor_mode == 2:#
+            # print("self.motor_count",self.motor_count,self.motor_open_time,self.motor_close_time,self.motor_total_time)
+            if self.motor_count % (self.motor_open_time) < self.motor_close_time: # 4 4 2 1%4 = 1 2%4 = 2 3%4 = 3
+                open_motor()
+            else:
+                close_motor()
+            if self.motor_count >= self.motor_total_time-1:
+                EventMesh.publish("close_motor_infor")#关闭马达和定时器
+                return
+            self.motor_count+=1
+
+    def close_motor_infor(self,event,msg):
+        print("close_motor_infor!!!")
+        close_motor()
+        self.motor_enable = 0#马达使能
+        self.motor_total_time = 0#总的时间
+        self.motor_open_time = 0 #开马达事件
+        self.motor_close_time = 0#关马达事件100ms
+        self.motor_count = 0
+        self.motor_mode = 0#模式
+        self.motor_timer.stop()
+
+
+
diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/pcm_stream_play_test.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/pcm_stream_play_test.py
new file mode 100644 (file)
index 0000000..edbbd1b
--- /dev/null
@@ -0,0 +1,35 @@
+# -*- coding: UTF-8 -*-
+import audio
+from machine import Pin
+import utime
+import uos
+
+def audio_cb(event):
+    if event == 0:
+        print('audio-play start.')
+    elif event == 7:
+        print('audio-play finish.')
+
+aud = audio.Audio(0)
+aud.setCallback(audio_cb)
+
+# 音频流播放
+size = 4*1024 # 保证一次填充的音频数据足够大以便底层连续播放
+format = 3 # 1:PCM RAW;2 :WAVPCM 3mp3
+
+def play_from_fs():
+    file_size = uos.stat("/usr/tesr.mp3")[6]  # 获取文件总字节数
+    print(file_size)
+    with open("/usr/tesr.mp3", "rb")as f:   
+        while 1:
+            b = f.read(size)   # read
+            if not b:
+                break
+            aud.playStream(format, b)
+
+
+play_from_fs()
+# 等待播放完成
+utime.sleep_ms(5000) 
+# 停止本次播放以便不影响下次播放
+aud.stopPlayStream() 
diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/protocol.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/protocol.py
new file mode 100644 (file)
index 0000000..2ab81a5
--- /dev/null
@@ -0,0 +1,3760 @@
+import ujson
+import utime
+import EventMesh
+import constants
+from common import Abstract
+import uhashlib
+import ubinascii
+from misc import Power
+import audio
+from machine import Pin
+import ujson
+import ql_fs
+import dataCall
+import checkNet
+import net
+import usocket
+import osTimer
+
+import machine
+import urandom
+import _thread
+import usys
+import request
+import umqtt 
+import modem
+SHA256 = uhashlib.sha256
+import SecureData
+def server_init(server_type = None):
+    #服务器选择1,防走丢,2大锤,3三基同创,4童信,5云米,6荣为 8:ds未知 dey.hinwatch. com:9968  9:183.62.239.121:31869 10:183.62.239.121:33461
+    if server_type == None:
+        server_type = 2
+    #EventMesh.debug_log("server_init:server_type:{}".format(server_type))
+   
+    d_server_addr = "api.xcloudtech.com"
+    d_server_port = 9000
+    d_md5_key = "bZld0ALsZTt15tKEZhOlLPgbsO75BLTP"
+    d_PID = "SZKW"
+    if server_type == 1:
+        pass
+        
+    elif server_type == 2:
+        # test.iot.socket.thisiot.com:9999
+        # iot.socket .thisiot.com:9999
+        # d_server_addr = "test.iot.socket.thisiot.com"
+        # d_server_port = 9999
+        # d_md5_key = "3JyCjsw4ryXKzjzudayY"
+        # d_PID = "qAELPTKmFanR4RHe"
+
+        d_server_addr = "iot.socket.thisiot.com"
+        d_server_port = 9999
+        d_md5_key = "SZYhyGhroQ3xFKFWZq1g"
+        d_PID = "oxLwDqcwJCtiPSRu"
+
+    elif server_type == 3:
+        d_server_addr = "tcp.zhihuixuexiao.com"
+        d_server_port = 2346
+        d_md5_key = ""
+        d_PID = "3G"
+    elif  server_type == 4:
+         d_server_addr = "tcp.tx.kidxin.com"
+         d_server_port = 20500
+    elif server_type == 5:
+        d_server_addr = "device.miwitracker.com"
+        d_server_port = 8505
+        d_md5_key = ""
+        d_PID = "3G"
+    elif server_type == 6:
+        d_server_addr = "120.26.104.21"
+        d_server_port = 9968
+        d_md5_key = "bZld0ALsZTt15tKEZhOlLPgbsO75BLTP"
+        d_PID = "SZKW"
+    elif server_type == 7:
+        d_server_addr = "8.134.68.15"
+        d_server_port = 30346
+        d_PID="KnHnj1Cd5VxcO3Ft"
+        d_md5_key = "evxThVhMBmRNiQ1Twigw"
+    elif server_type == 99:
+        d_server_addr = "lab.xcloudtech.com"
+        d_server_port = 9000
+    elif server_type == 8:
+        d_server_addr = "dev.hxinwatch.com"
+        d_server_port = 9968
+    elif server_type == 9:
+        d_server_addr = "183.62.239.121"
+        d_server_port = 31869
+    elif server_type == 10:
+        d_server_addr = "183.62.239.121"
+        d_server_port = 33461
+
+    return [d_server_addr,d_server_port,d_md5_key,d_PID]
+from queue import Queue
+def unicode_to_utf8(src):
+    ref = 0xe08080
+    result = ref
+    
+    #取最后六位
+    a = src & 0x3f
+    
+    #将最后六位放在ref最后六位的空位置
+    result = result | a
+    src = src >> 6
+    
+    #取接下来的六位
+    a = src & 0x3f
+    
+    #放在ref对应的六个位置
+    result = result | (a << 8)
+
+    #保留最后四位
+    src = src >> 6
+
+    #放在ref对应的四个位置    
+    result = result | (src << 16)
+    return result
+
+def UnicodeHexStr_To_Utf8Str(str):
+    odata = 0
+
+    result = bytes() 
+    su =str.upper()
+
+    i = 0
+    for c in su:
+        tmp=ord(c)
+        if tmp <= ord('9') :
+            odata = odata << 4
+            odata += tmp - ord('0')
+
+        elif ord('A') <= tmp <= ord('F'):
+            odata = odata << 4
+            odata += tmp - ord('A') + 10
+        if(i%4==3): #每2字节获取一个int,拿到转换后的unicode int
+            #print(odata.to_bytes(2, 'big'))
+            #result.append(odata)
+            if odata > 255:
+                tmp = unicode_to_utf8(odata)#拿到转换后的utf8 int
+                tmp2 = tmp.to_bytes(3, 'big') #转bytes
+            else :
+                tmp2 = odata.to_bytes(1, 'big') 
+            #print("tmp2:{}".format(tmp2))
+            result = result + tmp2
+            odata = 0 
+        i+=1
+    return result.decode('utf-8') #返回utf8的str
+
+def gewu_init():
+    productKey = "cu1shld45y4hjr1L"
+    return productKey
+mqtt_state = 0
+def mqttsub_cb(topic, msg):
+    global mqtt_state
+    print("Subscribe Recv: Topic={},Msg={}".format(topic.decode(), msg.decode()))
+    jsload_data =  ujson.loads(msg.decode())
+    print("jsload_data-{} type:{}".format(jsload_data,type(msg.decode())))
+    # jsload_data = {'data':'111','protocolType':'', 'host':'device.miwitracker.com', 'secretKey': 'bZld0ALsZTt15tKEZhOlLPgbsO75BLTP', 'port':8505, 'bid': '3G', 'extJsonStr': ''}
+    # ujson.loads(c)
+    # $sys/cu1shld45y4hjr1L/866610001011658/ext/regist
+    #data = {"messageId":"25","params":{"deviceSecret":"C1D75A63C0338978438E9197372FC698""}}
+    if "params" in jsload_data:
+        params_str = jsload_data["params"]
+        if "deviceSecret" in params_str:
+            str_tmp = params_str["deviceSecret"]
+            print(str_tmp)
+            EventMesh.publish("set_deviceSecret",str_tmp)
+    mqtt_state = 1
+def mqtterr_cb(error):
+    '''
+    接收umqtt线程内异常的回调函数
+    '''
+    print("error!!!!!!!!!!!".format(error))
+
+def HMAC(k, m):
+    SHA1_BLOCK_SIZE = 64
+    KEY_BLOCK = k + (b'\0' * (SHA1_BLOCK_SIZE - len(k)))
+    KEY_INNER = bytes((x ^ 0x36) for x in KEY_BLOCK)
+    KEY_OUTER = bytes((x ^ 0x5C) for x in KEY_BLOCK)
+    inner_message = KEY_INNER + m
+    outer_message = KEY_OUTER + SHA256(inner_message).digest()
+    return SHA256(outer_message)
+
+
+def get_hmac_sha256(k, m):
+    data = HMAC(k, m).digest()
+    # print("HMAC(k, m).digest():", data)
+    # print("HMAC(k, m).digest():", ubinascii.hexlify(data))
+    hex_data = ubinascii.hexlify(data)
+    hex_data = hex_data.decode('ascii')
+    return hex_data
+
+def mqtt_client_pro_init():#一型一密
+    client = 0
+    
+    # 创建一个mqtt实例
+#     
+    # {"productKey":"cu1r1rjjrjdhz0lx","deviceKey":"DD86000000001","deviceSecret":"93FEEC6D16D30E2B90FE0DBC2FFCDB14"} 设备基本信息
+    # hmac_sha256(deviceIddeviceKeyproductKey,deviceSecret) mqttclientId
+    deviceId = ""#"bOOSGN5FlXEjt15"
+    deviceKey = ''#"bOOSGN5FlXEjt15"
+    imei = EventMesh.publish(constants.EVENT.GET_IMEI)
+    deviceId = str(imei)
+    deviceKey = str(imei)
+    productKey = gewu_init()
+    
+    EventMesh.publish("set_product_key",productKey)
+    data = "{}{}{}".format(deviceId,deviceKey,productKey)#需要用户定义产品是提供数据
+    # data = b"The data to encrypt"
+    # 密钥
+    productSecret = b"765fc66242616852209d1c57e51b0744" #765fc66242616852209d1c57e51b0744 ,productSecret
+
+    # {"productKey":"cu1shld45y4hjr1L","deviceKey":"bOOSGN5FlXEjt15","deviceSecret":"9234577490038E0949B800C243BF4321"}
+    checkpassword = get_hmac_sha256(productSecret,data)
+    # print(checkpassword)
+    # {deviceId}|{productKey}|{signMethod}|{authType}|{operator};连接id格式
+    
+    Client_id = "{}|{}|0|1|0".format(deviceId,productKey) #
+    # print(Client_id)
+    server = "dmp-mqtts.cuiot.cn"#"dmp-mqtt.cuiot.cn"
+    port = 8883
+    # {deviceKey}|{productKey} mqttUsername
+    userName = "{}|{}".format(deviceKey,productKey)
+    userpassword = checkpassword
+    # print(userName)
+    # print(userpassword)
+    # client = umqtt.MQTTClient("866610001011658|cu1shld45y4hjr1L|0|1|0","dmp-mqtt.cuiot.cn", 1883, "866610001011658|cu1shld45y4hjr1L","675f6fbfb15a729bbc280273632ce3a96f8b38d4736fbaf888fe8a48fd7aee09")
+    # client = umqtt.MQTTClient("lxRXQayZ4poQz8G|cujg06l29iav591b|0|0|0","dmp-mqtt.cuiot.cn", 1883, "lxRXQayZ4poQz8G|cujg06l29iav591b","1f8c69d29afca0505d967066b39d84a5eb1e54302b87e337b405f99d029a9242")
+    client = umqtt.MQTTClient(Client_id,server, port, userName,"{}".format(userpassword),reconn=False,ssl=True)
+    # client = MqttClient(Client_id, server, port, userName,"{}".format(userpassword))
+    # 设置消息回调
+    client.set_callback(mqttsub_cb)
+    # 设置异常回调
+    client.error_register_cb(mqtterr_cb)
+    return client
+
+def mqtt_client_dev_init():#一机一密
+    client = 0
+    
+    # 创建一个mqtt实例
+#     
+    # {"productKey":"cu1r1rjjrjdhz0lx","deviceKey":"DD86000000001","deviceSecret":"93FEEC6D16D30E2B90FE0DBC2FFCDB14"} 设备基本信息
+    # hmac_sha256(deviceIddeviceKeyproductKey,deviceSecret) mqttclientId
+    deviceId = '' #"bOOSGN5FlXEjt15"
+    deviceKey = ''#"bOOSGN5FlXEjt15"
+    imei = EventMesh.publish(constants.EVENT.GET_IMEI)
+    deviceId = str(imei)
+    deviceKey = str(imei)
+    productKey = gewu_init()
+    data = "{}{}{}".format(deviceId,deviceKey,productKey)#需要用户定义产品是提供数据
+    # data = b"The data to encrypt"
+    # 密钥
+    deviceSecret_tmp = EventMesh.publish("get_deviceSecret")
+    subscribe_msg = deviceSecret_tmp.encode('ascii')
+    deviceSecret = subscribe_msg #765fc66242616852209d1c57e51b0744 ,productSecret
+    print(deviceSecret)
+
+    checkpassword = get_hmac_sha256(deviceSecret,data)
+    print(checkpassword)
+    # {deviceId}|{productKey}|{signMethod}|{authType}|{operator};连接id格式
+    Client_id = "{}|{}|0|0|0".format(deviceId,productKey) # 860132060346475|cu1shld45y4hjr1L|0|0|0
+    server = "dmp-mqtts.cuiot.cn"#"dmp-mqtt.cuiot.cn"
+    port = 8883
+    # {deviceKey}|{productKey} mqttUsername
+    userName = "{}|{}".format(deviceKey,productKey)
+    userpassword = checkpassword
+
+    client = umqtt.MQTTClient(Client_id,server, port, userName,"{}".format(userpassword),reconn=False,ssl=True)
+    # client = MqttClient(Client_id, server, port, userName,"{}".format(userpassword))
+    # 设置消息回调
+    client.set_callback(mqttsub_cb)
+    # 设置异常回调
+    client.error_register_cb(mqtterr_cb)
+    return client
+
+
+
+class SockManager(Abstract):
+    def __init__(self):
+        self.sock = None
+        self.resolver = None
+        self.run_flag = False
+        self.lost_conn_check_time = 5 * 60 * 30
+        self.monitor_timer = osTimer()
+        self.publish_timer = osTimer()
+        self.reconnect_timer = osTimer()
+        self.mqtt_recv_timer = osTimer()
+        self.reconnect_time = 1000
+        self.reconnect_flag = 0
+        self.connect_tmp = 0
+        server_data = server_init()
+        # EventMesh.debug_log("SockManager:server_data:{}".format(server_data))
+        # self.server_addr = server_data[0]
+        # self.server_port = server_data[1]
+        self.server_addr = ""
+        self.server_port = ""
+        self.device_id = ""
+        self.device_key = ""
+        self.product_key = gewu_init()
+        self.deviceSecret = ""
+        self.client = 0
+        self.client_dev = 0
+        self.client_state = 0
+        self.mqtt_client_count = 0
+        ip_infor = {}
+        ip_infor = EventMesh.publish("get_new_ip_com")
+        EventMesh.debug_log("ip_infor1:{} \n\n\n".format(ip_infor))
+        
+        if ip_infor != None: #已经改过服务器
+            self.server_addr = ip_infor[0]
+            self.server_port = ip_infor[1]
+        else:
+            self.server_addr = server_data[0]
+            self.server_port = server_data[1]
+
+        EventMesh.debug_log("server_addr:{} server_port:{}".format(self.server_addr,self.server_port))
+        _thread.stack_size((9+3)*1024)
+        _thread.start_new_thread(self.connect, ())
+        _thread.stack_size(8*1024)
+        
+        
+        self.socket_send_queue = Queue()
+        _thread.stack_size((9+2)*1024)
+        _thread.start_new_thread(self.socket_send_queue_thread, ())
+        _thread.stack_size(8*1024)
+        EventMesh.subscribe("set_device_id",self.set_device_id)
+        EventMesh.subscribe("set_device_key",self.set_device_key)
+        EventMesh.subscribe("set_product_key",self.set_product_key)
+
+        EventMesh.subscribe("get_device_id",self.get_device_id)
+        EventMesh.subscribe("get_device_key",self.get_device_key)
+        EventMesh.subscribe("get_product_key",self.get_product_key)
+
+        EventMesh.subscribe("set_deviceSecret",self.set_deviceSecret)
+
+        EventMesh.subscribe("get_deviceSecret",self.get_deviceSecret)
+        if EventMesh.platform == "gewu":
+            str = "deviceSecret:"
+            buf = bytearray(32+len(str))
+            length = SecureData.Read(2, buf, 32+len(str))
+            deviceSecret = buf.decode()
+            print(type(deviceSecret))
+            if deviceSecret != "":
+                if "deviceSecret" in deviceSecret:
+                    self.deviceSecret = deviceSecret.split(":")[1]
+            else:
+                self.deviceSecret = " "
+        if EventMesh.platform == "gewu":
+            self.client = mqtt_client_pro_init()
+
+    def post_processor_after_instantiation(self):
+        EventMesh.subscribe("get_mqtt_pro_connect_state",self.get_mqtt_pro_connect_state)
+        EventMesh.subscribe("get_mqtt_dev_connect_state",self.get_mqtt_dev_connect_state)
+        EventMesh.subscribe(constants.EVENT.CHANNEL_SOCKET_SEND, self.send)
+        self.monitor_timer.start(7 * 60 * 1000, 1, self.check)
+
+    def add_support_resolver(self, resolver):
+        self.resolver = resolver
+
+    def initialization(self, *args, **kwargs):
+        _thread.stack_size(16*1024)
+        _thread.start_new_thread(self.recv, ())
+        _thread.stack_size(8*1024)
+    
+    def set_device_id(self,event,msg):
+        self.device_id = str(msg)
+        
+    def get_device_id(self,event,msg):
+
+        return self.device_id
+    def set_device_key(self,event,msg):
+        self.device_key = str(msg)
+        return
+    def get_device_key(self,event,msg):
+
+        return self.device_key
+    
+    def set_product_key(self,event,msg):
+        self.product_key = str(msg)
+        
+    def get_product_key(self,event,msg):
+
+        return self.product_key
+    
+    def set_deviceSecret(self,event,msg):
+        if EventMesh.platform == "gewu":
+            self.deviceSecret = str(msg)
+            deviceSecret_tmp = "deviceSecret:{}".format(msg)
+            SecureData.Store(2, deviceSecret_tmp, len(deviceSecret_tmp))
+        
+    def get_deviceSecret(self,event,msg):
+        return self.deviceSecret
+    
+    def connect(self):
+        EventMesh.debug_log("connect1{}:{}".format(self.server_addr, self.server_port))
+        if EventMesh.publish("get_sim_Status") != 1: #没sim
+            return
+        try:
+            if(self.sock != None) :
+                self.sock.close()
+            self.sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM)
+            #self.sock.setblocking(False) &self.sock.settimeout(0)不阻塞
+            self.sock.connect((self.server_addr, self.server_port))
+            
+            self.publish_timer.start(2000, 1, self.publish_timer_cb)
+            if EventMesh.platform == "gewu":
+                self.mqtt_client_count = 0
+                self.mqtt_recv_timer.start(5000, 1, self.mqtt_recv_timer_cb)
+            
+            utime.sleep_ms(500)
+            EventMesh.publish(constants.PROTOCOL.LK_SEND)
+            #  发送数据
+            
+            
+        except Exception as e:
+            usys.print_exception(e)
+            self.run_flag = False
+        else:
+            self.run_flag = True
+        EventMesh.debug_log("connect2{}:{}".format(self.server_addr, self.server_port))
+        self.reconnect_flag = 0
+    def publish_timer_cb(self, *args):
+        self.authen_set()
+
+    def authen_set(self):
+        sever_state = EventMesh.publish("get_server_state")#获取修改服务器状态
+        # print("sever_state{}".format(sever_state))
+        if sever_state != None:
+            if sever_state == 0:
+                imei = EventMesh.publish(constants.EVENT.GET_IMEI)
+                server_data = EventMesh.publish("get_new_key_pid")#获取pid和key
+                key_data = ""
+                pid_data = ""
+                if server_data != None:
+                    key_data = server_data[0]
+                    pid_data = server_data[1]
+                else:
+                    server_data = server_init()
+                    key_data = server_data[2]
+                    pid_data = server_data[3]
+
+                # server_data = server_init()
+                # key_data = server_data[2]
+                # pid_data = server_data[3]
+               
+                sonce_data = str(urandom.getrandbits(32))#随机生成32位的随机数
+                md5_data = "{}*{}*{}*{}".format(imei,pid_data,sonce_data,key_data)#md5签名
+                sign_data = ""
+                hash_obj = uhashlib.md5(md5_data)
+                res = hash_obj.digest()
+
+                # 转成十六进制表示
+                sign_data = ubinascii.hexlify(res)
+                sign_data = sign_data.decode('ascii')
+                # print("sign_data:{} sonce_data:{}".format(md5_data,sign_data))
+                # sign_data = MD5_head
+                # http://8.134.110.49:31379/dev/device/check?imei=&bid=sonce=sign=
+                # ip_addr = "test.iot.api.thisiot.com"
+                # ip_addr = "app.api.thisiot.com"
+                # http://app.api.thisiot.com/
+                url = "http://app.api.thisiot.com/dev/device/check?imei={}&bid={}&sonce={}&sign={}".format(imei,pid_data,sonce_data,sign_data)
+                
+                # print("url:{}".format(url))
+                response = request.get(url)
+                data_tmp ={}
+                # d_server_addr = "device.miwitracker.com"
+                # d_server_port = 8505
+                # d_md5_key = ""
+                # d_PID = "3G"
+                # response.content = {'protocolType': '', 'host': 'device.miwitracker.com', 'secretKey': '', 'port': 8505, 'bid': '3G', 'extJsonStr': ''}
+                # response.status_code=200
+                print("test-{}".format(response.status_code))
+                if response.status_code == 200:
+                    content = response.content
+                    c = next(content)
+                    # "api.xcloudtech.com"
+                    # d_server_port = 9000
+                    jsload_data =  ujson.loads(c)
+                    print("jsload_data-{}".format(jsload_data))
+                    # jsload_data = {'data':'111','protocolType':'', 'host':'device.miwitracker.com', 'secretKey': 'bZld0ALsZTt15tKEZhOlLPgbsO75BLTP', 'port':8505, 'bid': '3G', 'extJsonStr': ''}
+                    # ujson.loads(c)
+                    
+                    if "success" in jsload_data:
+                        success = jsload_data["success"]
+                        if success == True:#合法设备
+                            if "data" in jsload_data:
+                                data_tmp = jsload_data["data"]#返回的数据 
+                                print("data_tmp:{}".format(data_tmp))
+                                code = jsload_data["code"]
+                                if code == 20000:#合法的设备
+                                    protocloType = data_tmp["protocolType"]#协议类型
+                                    host = data_tmp["host"]#服务骑地址
+                                    secretKey = data_tmp["secretKey"]#
+                                    pid = data_tmp["bid"]#产品型号
+                                    port = data_tmp["port"]#端口号
+
+                                   
+
+                                    if host != '' and (port != '' and port != -1):
+                                        if host != '':
+                                            self.server_addr = host
+                                            EventMesh.publish("set_ip",str(self.server_addr))
+                                        
+                                        if port != '' and port != -1:
+                                            self.server_port = port
+                                            EventMesh.publish("set_com",self.server_port)
+                                        EventMesh.publish("set_new_key", str(secretKey))#获取pid和key
+                                        EventMesh.publish("set_new_pid",str(pid))#获取pid和key
+                                        # self.reconnect_timer_cb()#重连设备
+                                        print("self.reconnect_flag",self.reconnect_flag)
+                                        self.reconnect_flag = 0
+                                        self.reconnect()#重连设备
+                    self.publish_timer.stop()
+                    EventMesh.publish("set_server_state",1)#获取修改服务器状态
+            else:
+                self.publish_timer.stop()
+            
+    
+
+    def mqtt_recv_timer_cb(self, *args):
+        self.mqtt_clien_cb()
+        
+
+
+    def mqtt_clien_cb(self):
+        if EventMesh.platform != "gewu":
+            return
+       # 需要加密的数据
+        get_deviceSecret = EventMesh.publish("get_deviceSecret")
+        if get_deviceSecret != None:
+            if self.mqtt_client_count == 0:
+                self.mqtt_client_count = 1
+                self.mqtt_recv_timer.stop()
+                get_deviceSecret = EventMesh.publish("get_deviceSecret")#获取设备的秘钥 只获取一次
+                print("get_deviceSecret{}".format(get_deviceSecret))
+                if get_deviceSecret == '':#如果为空就获取一次
+                    # print("self.client:{}".format(self.client))
+                    mqtt_connect = -1
+                    try:
+                        mqtt_connect = self.client.connect()
+                    except Exception as e:
+                        print(e)
+                        mqtt_connect = -1
+                    print("mqtt_connect:{}".format(mqtt_connect))
+                    if mqtt_connect == 0 :
+                        # 订阅主题
+                        get_device_id = EventMesh.publish(constants.EVENT.GET_IMEI)
+                        get_deviceKey = EventMesh.publish(constants.EVENT.GET_IMEI)
+                        get_productKey = gewu_init()
+                        #$sys/{productKey}/{deviceKey}/ext/regist
+                        client_msg = "$sys/{}/{}/ext/regist".format(get_productKey,get_deviceKey)
+                        # client_msg = "$sys/cu1shld45y4hjr1L/866610001011658/ext/regist"
+                        subscribe_msg = client_msg.encode('ascii')
+                        print(subscribe_msg)
+
+                        self.client.subscribe(subscribe_msg,0)#订阅消息主题
+
+                        
+                        self.client.wait_msg()  # 阻塞函数,监听消息
+                        utime.sleep(5)
+                        get_deviceSecret = EventMesh.publish("get_deviceSecret")
+                        if get_deviceSecret != '':
+                            self.client.disconnect()
+                            self.client_dev = mqtt_client_dev_init()
+                            print(self.client_dev)
+                            # mqtt_connect = self.client_dev.connect()
+                            try:
+                                mqtt_connect = self.client_dev.connect()
+                            except Exception as e:
+                                print(e)
+                                mqtt_connect = -1
+                            if mqtt_connect == 0:
+                                # $sys/cu1shld45y4hjr1L/bOOSGN5FlXEjt15/property/batch_reply
+                                msg_reply = "$sys/{}/{}/property/batch_reply".format(get_productKey,get_deviceKey)
+                                sub_msg = msg_reply.encode('ascii')
+                                self.client_dev.subscribe(sub_msg,0)#订阅消息主题
+                                print("Connected to dmp-mqtt.cuiot.cn, subscribed to /public/TEST/quecpython topic")
+                                # 发布消息
+                                # UnicodeHexStr_To_Utf8Str(str_data)
+                                date_tmp = utime.localtime()
+                                time_tmp = utime.mktime(date_tmp)#需要转换成毫秒级别
+                                updataTime = "{}".format(time_tmp*1000)
+                                # imei_tmp= modem.getDevImei()
+                                imei_tmp = EventMesh.publish(constants.EVENT.GET_IMEI)
+                                bat_tmp = EventMesh.publish("screen_get_battery")
+                                imei = "{}".format(imei_tmp)
+                                power = 0
+                                power = int(bat_tmp[1])
+                                hr = 0
+                                hr = EventMesh.publish("get_old_hr_data")
+                                if hr == None:
+                                    hr = 0
+                                deviceTime = "{}".format(time_tmp)
+                                manufactury = "fengda"
+                                DeviceState = "online"
+
+                                data_info = {
+                                    "messageId":"0",
+                                    "params": {
+                                        "data": [
+                                            {
+                                                "key":"deviceOffOn",
+                                                "value": {
+                                                    "deviceStatus":"Poweron",
+                                                    "updateTime":updataTime,
+                                                    "Imei":imei
+                                                }
+                                                
+                                            },
+                                            {
+                                                "key":"HeartRate",
+                                                "value":{
+                                                    "heartRate":hr,
+                                                    "updateTme":updataTime,
+                                                    "Imei":imei
+                                                }
+                                            },
+                                            {
+                                                "key":"powerSavingMode",
+                                                "value":0
+                                            },
+                                            {
+                                                "key":"IMEI",
+                                                "value":imei
+                                            },
+                                            {
+                                                "key":"DEVICE_TIME",
+                                                "value":deviceTime
+                                            },
+                                            {
+                                                "key":"MANUFACTURER",
+                                                "value":manufactury
+                                            },
+                                            {
+                                                "key":"REMAINING_POWER",
+                                                "value":power
+                                            },
+                                            {
+                                                "key":"DeviceState",
+                                                "value":DeviceState
+                                            }
+                                        ]
+                                    }
+                                }
+                                
+                                data_json = ujson.dumps(data_info) 
+                                # print("data_json:{}",data_json)
+                                # $sys/cu1shld45y4hjr1L/{deviceKey}/property/batch
+                                msg_pub = "$sys/{}/{}/property/batch".format(get_productKey,get_deviceKey)
+                                pub_msg = msg_pub.encode('ascii')
+                                self.client_dev.publish(pub_msg,data_json,0)#publis主题内容
+
+                                print("Publish topic: /public/TEST/quecpython758, msg: my name is Quecpython")
+                            pass
+
+                else:
+                    mqtt_dev_connect = -1
+                    mqtt_ret_connect = -1
+                    mqtt_pro_connect = -1
+                    if self.client_dev == 0:
+                        self.client_dev = mqtt_client_dev_init()
+                    try:
+                        mqtt_dev_connect = self.client_dev.connect()
+                    except Exception as e:
+                        print("erro!{}".format(e))
+                        mqtt_dev_connect = -2
+                        # Server Actively FIN Disconnected.Need Check Connection parameters
+                        err_dis = "FIN Disconnected" in str(e)
+                        err_parm1 = "107" in str(e)
+                        err_parm2 = "4" in str(e)
+                        # print("err_parm1!{} {} {} {}".format(err_parm1,err_parm2,err_info,err_dis))
+                        # Connect Error='4' MQTT Connect error=
+                        if err_dis == True or err_parm1 == True or err_parm2 == True:
+                            mqtt_dev_connect = -1
+                        
+
+                    if mqtt_dev_connect != 0:#连接参数错误可能是deviceScrete出错重新获取
+                    
+                        try:
+                            mqtt_ret_connect = self.client.connect()#重新获取deviceScrete
+                        except Exception as e:
+                            print(e)
+                            mqtt_ret_connect = -1
+                        # mqtt_connect = self.client.connect()
+                        print("mqtt_ret_connect:{}".format(mqtt_ret_connect))
+                        if mqtt_ret_connect == 0:
+                            # 订阅主题
+                            get_device_id = EventMesh.publish(constants.EVENT.GET_IMEI)
+                            get_deviceKey = EventMesh.publish(constants.EVENT.GET_IMEI)
+                            get_productKey = gewu_init()
+                            #$sys/{productKey}/{deviceKey}/ext/regist
+                            client_msg = "$sys/{}/{}/ext/regist".format(get_productKey,get_deviceKey)
+                            # client_msg = "$sys/cu1shld45y4hjr1L/866610001011658/ext/regist"
+                            subscribe_msg = client_msg.encode('ascii')
+                            print(subscribe_msg)
+
+                            self.client.subscribe(subscribe_msg,0)#订阅消息主题
+
+                            self.client.wait_msg()  # 阻塞函数,监听消息
+                            utime.sleep(5)
+
+                            self.client.disconnect()
+                            self.client_dev = mqtt_client_dev_init()
+                            # print(self.client_dev)
+                            try:
+                                mqtt_pro_connect = self.client_dev.connect()
+                            except Exception as e:
+                                print(e)
+                                mqtt_pro_connect = -1
+                    # print("no deviceScret!!!!!!!{}".format(self.client_dev))
+                    # 设备秘钥不为空 重连获取设备失败不连接 第一次连接失败不连接不发送数据
+                    if EventMesh.publish("get_deviceSecret") != "" and (mqtt_pro_connect == 0 or mqtt_dev_connect == 0):
+                        get_device_id = EventMesh.publish(constants.EVENT.GET_IMEI)
+                        get_deviceKey = EventMesh.publish(constants.EVENT.GET_IMEI)
+                        get_productKey = gewu_init()
+                        # $sys/cu1shld45y4hjr1L/bOOSGN5FlXEjt15/property/batch_reply
+                        msg_reply = "$sys/{}/{}/property/batch_reply".format(get_productKey,get_deviceKey)
+                        sub_msg = msg_reply.encode('ascii')
+                        # print(" deviceScret!!!!!!!{} msg_reply:{} sub_msg:{}".format(self.client_dev,msg_reply,sub_msg))
+                        self.client_dev.subscribe(sub_msg,0)#订阅消息主题
+                        print("Connected to dmp-mqtt.cuiot.cn, subscribed to /public/TEST/quecpython topic")
+                        # 发布消息
+                        # UnicodeHexStr_To_Utf8Str(str_data)
+                        date_tmp = utime.localtime()
+                        time_tmp = utime.mktime(date_tmp)#需要转换成毫秒级别
+                        updataTime = "{}".format(time_tmp*1000)
+                        imei_tmp = EventMesh.publish(constants.EVENT.GET_IMEI)
+                        imei = "{}".format(imei_tmp)
+                        bat_tmp = EventMesh.publish("screen_get_battery")
+                        power = 0
+                        power = int(bat_tmp[1])
+                        hr = 0
+                        hr = EventMesh.publish("get_old_hr_data")
+                        if hr == None:
+                            hr = 0
+                        deviceTime = "{}".format(time_tmp)
+                        manufactury = "fengda"
+                        DeviceState = "online"
+
+                        data_info = {
+                            "messageId":"0",
+                            "params": {
+                                "data": [
+                                    {
+                                        "key":"deviceOffOn",
+                                        "value": {
+                                            "deviceStatus":"Poweron",
+                                            "updateTime":updataTime,
+                                            "Imei":imei
+                                        }
+                                        
+                                    },
+                                    {
+                                        "key":"HeartRate",
+                                        "value":{
+                                            "heartRate":hr,
+                                            "updateTme":updataTime,
+                                            "Imei":imei
+                                        }
+                                    },
+                                    {
+                                        "key":"powerSavingMode",
+                                        "value":0
+                                    },
+                                    {
+                                        "key":"IMEI",
+                                        "value":imei
+                                    },
+                                    {
+                                        "key":"DEVICE_TIME",
+                                        "value":deviceTime
+                                    },
+                                    {
+                                        "key":"MANUFACTURER",
+                                        "value":manufactury
+                                    },
+                                    {
+                                        "key":"REMAINING_POWER",
+                                        "value":power
+                                    },
+                                    {
+                                        "key":"DeviceState",
+                                        "value":DeviceState
+                                    }
+                                ]
+                            }
+                        }
+                        
+                        data_json = ujson.dumps(data_info) 
+                        # print("data_json:{}",data_json)
+                        # $sys/cu1shld45y4hjr1L/{deviceKey}/property/batch
+                        msg_pub = "$sys/{}/{}/property/batch".format(get_productKey,get_deviceKey)
+                        pub_msg = msg_pub.encode('ascii')
+                        self.client_dev.publish(pub_msg,data_json,0)#publis主题内容
+
+                        print("Publish topic: /public/TEST/quecpython758, msg: my name is Quecpython")
+
+    def get_mqtt_pro_connect_state(self,event,msg):
+        return self.client
+    def get_mqtt_dev_connect_state(self,event,msg):
+        return self.client_dev
+    
+    def check(self, *args):
+        if (not self.run_flag) or (self.connect_tmp == 0) : #7分钟无数据读取,则认为是掉线了
+            EventMesh.debug_log("tcp reconnect!!!!!!!!!!!!!!!!!!")
+            EventMesh.publish(constants.EVENT.SET_CONNECT,0) #标记断网
+            self.reconnect()
+        self.connect_tmp = 0
+    def reconnect(self):
+        if(self.reconnect_flag == 1):
+            return
+        self.reconnect_flag = 1
+        self.reconnect_timer.start(self.reconnect_time, 0, self.reconnect_timer_cb)
+        if self.reconnect_time < 600*1000:
+            self.reconnect_time += 30*1000
+
+    def reconnect_timer_cb(self, *args): 
+        _thread.stack_size((9+1)*1024)
+        _thread.start_new_thread(self.connect, ())   
+        _thread.stack_size(8*1024)
+        
+    def socket_send_queue_thread(self):
+        while True:
+            data = self.socket_send_queue.get()
+            EventMesh.debug_log("TCP:send data1 len:{}".format(len(data)))
+
+            #EventMesh.debug_log("ui_queue_thread:data = {}".format(data))
+            socketsta = self.sock.getsocketsta() 
+            if(socketsta == -1): #给释放了或者出错了
+                continue
+            if(socketsta == 4):#正常连击
+                if data != None:
+                    try:
+                        self.sock.send(data)
+                        EventMesh.debug_log("TCP:send data2 len:{}".format(len(data)))    
+                    except Exception as e:
+                        self.reconnect()
+                        self.socket_send_queue.put(data)#重新把数据加回队列
+                        #EventMesh.debug_log("socket_send_queue_thread1:ERROR:")
+                        #usys.print_exception(e)
+            elif socketsta < 4:#正在连接,等待连接成功重新发送
+                count = 0
+                while True:
+                    if count > 15 :
+                        break
+                    utime.sleep(1)
+                    if(self.sock.getsocketsta() == 4):#
+                        try:
+                            self.sock.send(data)
+                            EventMesh.debug_log("TCP:send data3 len:{}".format(len(data)))    
+                        except Exception as e:
+                            self.reconnect()
+                            self.socket_send_queue.put(data)#重新把数据加回队列
+                            #EventMesh.debug_log("socket_send_queue_thread2:ERROR:")
+                            #usys.print_exception(e)
+                        break
+            else :#连接错误
+                EventMesh.debug_log("socket_send_queue_thread:ERROR:reconnect")
+                self.reconnect()
+            utime.sleep(1)
+
+    def send(self, topic, msg):
+        # EventMesh.debug_log("TCP:send data:{}".format(msg))
+        if EventMesh.publish("get_sim_Status") != 1: #没sim,则不发送
+            EventMesh.publish(constants.EVENT.SET_CONNECT, 0)#标记断网
+            EventMesh.debug_log("dataCall not connect")
+            return
+        else :
+            try:
+                self.socket_send_queue.put(msg)
+            except Exception as e:   
+                EventMesh.debug_log("self.socket_send_queue.put:ERROR:")
+                usys.print_exception(e) 
+                # self.run_flag = False
+
+    def recv(self):
+        data = b''
+        while True:
+            try:
+                r =  b''
+                r = self.sock.recv(1024*5)
+
+                if not r:
+                    self.run_flag = False
+                    self.reconnect()
+   
+                data = data + r
+                EventMesh.debug_log("TCP recv: data:len:{}".format(len(data)))
+                # EventMesh.debug_log("TCP recv: data:{}".format(data))
+                if data[-1] != 0x5d and len(data)<20*1024: #']':
+                    continue
+                self.connect_tmp = 1 #有数据,就认为是连接状态
+                self.reconnect_time = 1000
+                EventMesh.publish(constants.EVENT.SET_CONNECT, 1)
+                data_str = data.decode('ascii')
+                data_str = data_str.split(']')
+                if len(data_str) < 3 :
+                    self.resolver.handler(data)
+                else :
+                    for i in range(len(data_str)-1):
+                        self.resolver.handler(data_str[i])
+                
+                data = b''
+            except Exception as e:
+                #EventMesh.debug_log("TCP:ERROR:recv:")
+                #usys.print_exception(e)
+                self.run_flag = False
+                self.reconnect()
+                
+                data = b''
+                utime.sleep(2)
+
+
+
+class NetManager(Abstract):
+    THRESHOLD = 10
+
+    def __init__(self):
+        self.__data_call = dataCall
+        self.__net = net
+        self.check_net = checkNet.CheckNetwork("QuecPython_Helios_Framework", "this latest version")
+        EventMesh.subscribe("get_network_state", self.get_network_state)
+        self.network_state = 0
+
+    def post_processor_after_instantiation(self, *args, **kwargs):
+        count = 0
+        while True:
+            count += 1
+            if count > 5 :
+                return
+            data = dataCall.getInfo(1, 0)
+            EventMesh.debug_log("data call INFO {}".format(data))
+            if data[2][0]:
+                self.network_state = 1
+                break
+            utime.sleep(1)
+        self.__data_call.start(2, 0, "", "", "", 0)
+        self.__data_call.setCallback(self.__datacall_cb)
+
+    def __datacall_cb(self, args):
+        pdp = args[0]
+        nw_sta = args[1]
+        if nw_sta == 1:
+            self.network_state = 1
+            EventMesh.debug_log("*** network %d connected! ***" % pdp)
+
+        else:
+            self.network_state = 0
+            EventMesh.debug_log("*** network %d not connected! ***" % pdp)
+           
+    def get_network_state(self, topic, msg):
+        return self.network_state 
+
+
+class ProtoCol(Abstract):
+    TYPE = ""
+    HEADER = "#@{}@#;"
+    SEPARATOR = ";"
+    END = ";" + chr(0x01)
+    #PID = "SZKW"
+    #PID = "qAELPTKmFanR4RHe"
+    md5_key = ''
+    PID = ''
+
+    def __init__(self):
+        self.content = None
+        self.check_sum = None
+        self.password = EventMesh.publish(constants.EVENT.GET_PASSWORD)
+        self.imei = EventMesh.publish(constants.EVENT.GET_IMEI)
+        self.cid = EventMesh.publish(constants.EVENT.GET_CID)
+        self.imsi = EventMesh.publish(constants.EVENT.GET_IMSI)
+        self.key = EventMesh.publish(constants.EVENT.GET_KEY)
+        self.HEADER = self.HEADER.format(self.TYPE)
+
+        self.md5_key = ''
+        self.PID = ''
+        server_data = EventMesh.publish("get_new_key_pid")#获取pid和key
+        if server_data == None:
+            server_data = server_init()#如果获取的数据是None,就用默认的大锤key和pid
+            self.md5_key = server_data[2]
+            self.PID = server_data[3]
+        else:
+            self.md5_key = server_data[0]
+            self.PID = server_data[1]
+        
+        # EventMesh.debug_log("md5_key:--",self.md5_key,self.PID)
+        # ip_infor = {}
+        # ip_infor = EventMesh.publish("get_new_ip_com")
+        # if ip_infor != None:
+        #     self.md5_key = ip_infor[2]
+        # EventMesh.debug_log("md5_key",self.md5_key)
+
+    def initialization(self, *args, **kwargs):
+        EventMesh.subscribe(self.TYPE + "_SEND", self.handler)
+        EventMesh.subscribe(self.TYPE + "_RECV", self.handler)
+        #EventMesh.debug_log("ProtoCol:{}".format(self.TYPE + "_SEND"))
+
+    def handler(self, event, msg):
+        #EventMesh.debug_log("ProtoCol:handler:{}".format(event))
+        self.password = EventMesh.publish(constants.EVENT.GET_PASSWORD)
+        self.imei = EventMesh.publish(constants.EVENT.GET_IMEI)#"867387060319166"#EventMesh.publish(constants.EVENT.GET_IMEI)#"867387060319166" #EventMesh.publish(constants.EVENT.GET_IMEI)#"867387060319166"#EventMesh.publish(constants.EVENT.GET_IMEI) #"867387060319166"#EventMesh.publish(constants.EVENT.GET_IMEI) #"867387060319166"#"867387060319188"#"867387060319177"#"867387060319166"#"860132060004322"#"867387060319166"#"860132060004322"#EventMesh.publish(constants.EVENT.GET_IMEI)
+        self.cid = EventMesh.publish(constants.EVENT.GET_CID)
+        self.imsi = EventMesh.publish(constants.EVENT.GET_IMSI)
+        self.key = EventMesh.publish(constants.EVENT.GET_KEY)
+        if event.endswith("_SEND"):
+            self.send(event, msg)
+        else:
+            self.recv(event, msg)
+
+    def send(self, event, msg):
+        pass
+
+    def recv(self, event, msg):
+        pass
+
+    @staticmethod
+    def get_date():
+        return "{:04d}-{:02d}-{:02d}".format(*utime.localtime()[0:3])
+
+    @staticmethod
+    def get_time():
+        return "{:02d}:{:02d}:{:02d}".format(*utime.localtime()[3:6])
+
+    def calc_crc(self):
+        data = self.content
+        if not isinstance(data, bytes):
+            data = data.encode()
+        count = 0
+        for x in data:
+            count += x
+        self.check_sum = 100 - count % 100
+
+    def pack(self):
+        self.calc_crc()
+        return self.HEADER.encode() + self.content.encode() + self.SEPARATOR.encode() + int(self.check_sum).to_bytes(1,'little') + self.END.encode()
+    
+    def pack_MD5_head(self,data):                                                                                                                 
+        #key = "bZld0ALsZTt15tKEZhOlLPgbsO75BLTP"
+        self.md5_key=EventMesh.publish("get_new_key")
+        if self.md5_key == None:
+            self.md5_key = server_init[2]
+
+        if(self.md5_key == ""):
+            return ""
+        MD5_head = ""
+        hash_obj = uhashlib.md5(data+self.md5_key)
+        res = hash_obj.digest()
+
+        # 转成十六进制表示
+        MD5_head = ubinascii.hexlify(res)
+        MD5_head = MD5_head.decode('ascii')
+        #EventMesh.debug_log("data+self.md5_key:{}".format(data+self.md5_key))
+        #EventMesh.debug_log(res)
+        #EventMesh.debug_log(MD5_head)
+        return MD5_head
+
+class LK_ProtoCol(ProtoCol):
+    """链路保持"""
+    TYPE = "LK"
+
+    def send(self, event, msg):
+        #[SZKW*334588000000156*0002*LK]
+        #EventMesh.debug_log('self.imei:%s'%(self.imei))
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0002*LK"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        # EventMesh.debug_log("LK_ProtoCol:send:%s"%(data))
+
+        
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        """
+
+        @param event: LK成功
+        @param msg: 接收到的下行数据
+        """
+        EventMesh.debug_log("LK_ProtoCol:recv:%s"%(msg))
+        EventMesh.publish(constants.PROTOCOL.PING_SEND)
+        EventMesh.publish(constants.PROTOCOL.KA_SEND)
+        EventMesh.publish(constants.PROTOCOL.TIME_SEND)
+
+        EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.UD_SEND) #开始UD定位
+        EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.WT_SEND) #开始WT定位
+        if EventMesh.model == 'D15':
+            EventMesh.publish(constants.PROTOCOL.MEMBERS_SEND)
+
+class PING_ProtoCol(ProtoCol):
+    """获取绑定状态"""
+    TYPE = "PING"
+
+    def send(self, event, msg):
+        #[SZKWT*YYYYYYYYYYYYYYY*LEN*PING]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0004*PING"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #EventMesh.debug_log("PING_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        """
+
+        @param event: PING
+        @param msg: 接收到的下行数据
+        """
+        #EventMesh.debug_log("PING_ProtoCol:recv:%s"%(msg))   
+        data_tmp =  msg.decode('ascii')   
+        data_tmp = data_tmp.split(']')[0] #去掉]   
+        EventMesh.publish(constants.EVENT.SET_PING, data_tmp.split(',')[1])
+        if EventMesh.model == 'D15':
+            EventMesh.publish(constants.PROTOCOL.JPREG_SEND) 
+            EventMesh.publish(constants.PROTOCOL.MEMBERS_SEND)
+
+class KA_ProtoCol(ProtoCol):
+    """心跳"""
+    TYPE = "KA"
+    count = 0
+    roll_count = 0
+    def send(self, event, msg):
+        #"{:04d}-{:02d}-{:02d}".format(*utime.localtime()[0:3])
+        #[XT*YYYYYYYYYYYYYYY*LEN*KA,日期,步数,翻滚次数,电量百分数,车载里程数(km)] 实例:[XT*334588000000156*0014*KA,120414,50,100,100,100.12]
+        date = "{:04d}{:02d}{:02d}".format(*utime.localtime()[0:3])
+        date = date[2:]
+        #EventMesh.debug_log("date:",date)
+        #步数
+        old_step = 0
+        step = 0
+        step = EventMesh.publish("get_old_step_value")
+        if step != None:
+            if step != 0:
+                read_data = EventMesh.publish("get_storage_config","old_step_new")
+                if read_data != None:
+                    old_step = read_data
+                
+                if old_step !=  step:
+                    # EventMesh.debug_log("old_step:send:%d %d"%(old_step,step))
+                    EventMesh.publish("set_storage_config",["old_step_new",step+10])
+                    EventMesh.publish("set_storage_config",["old_step_new",step])
+
+        old_step = step
+        # step = EventMesh.publish(constants.EVENT.GET_STEP)[0]
+        # 电池电量百分比 
+        
+        bat_tmp = EventMesh.publish("screen_get_battery")
+        sleep_time = EventMesh.publish("get_storage_config","sleep_time")
+        if sleep_time != None:
+            if len(sleep_time) != 0:
+                hour = utime.localtime()[3]
+                min = utime.localtime()[4]
+                cur_time = hour*60+min
+                start_hour = int(sleep_time["start_hour"])
+                start_min = int(sleep_time["start_min"])
+                start_total = start_hour*60+start_min
+
+                end_hour = int(sleep_time["end_hour"])
+                end_min = int(sleep_time["end_min"])
+                end_total = end_hour*60+end_min
+                # EventMesh.debug_log("ka roll_:",hour,min,cur_time,start_total,end_total)
+                if cur_time >= start_total and cur_time <= end_total:
+                    self.roll_count = int(hour)
+                    if self.roll_count == 0:
+                        self.roll_count+=1
+                else:
+                    self.roll_count = 0
+            else:
+                self.roll_count = 0
+        else:
+            self.roll_count = 0
+        hour = utime.localtime()[3]
+        min = utime.localtime()[4]
+        EventMesh.txt_log("ka step:{} hour:{} min:{}".format(step,hour,min))
+        
+        battery_caption =  bat_tmp[1]
+        send_data = "KA,%s,%d,%d,%d"%(date,step,self.roll_count,battery_caption)
+        send_len = len(send_data)
+
+        send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,send_len,send_data)
+        MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,send_len,"KA")
+
+        MD5_SIGN = self.pack_MD5_head(MD5_head_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #EventMesh.debug_log("KA_ProtoCol:send:%s"%(data))
+
+        
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        """
+
+        @param event: PING
+        @param msg: 接收到的下行数据
+        """
+        #EventMesh.debug_log("KA_ProtoCol:recv:%s"%(msg))   
+        
+class UD_ProtoCol(ProtoCol):
+    """位置信息"""
+    TYPE = "UD"
+    UD_count = 0#每6次定位获取一次天气数据
+    def send(self, event, msg):
+        #EventMesh.debug_log("UD:send:%s"%(msg))  
+        #"{:04d}-{:02d}-{:02d}".format(*utime.localtime()[0:3])
+        #[6f62cfc40fc50173f9a7b21e87be3424IS*861217001020120*00f6*UD,220726,211210,A,22.649529,N,114.119165,E,0.28,137.4,100.0,8,24,63,119,0,00000000,2,1,460,11,30472,125667122,24,30472,218944048,19,4,
+        # wifi0,34:93:44:01:28:b9,-74,wifi1,34:20:03:96:35:ad,-78,wifi2,ea:b5:7b:e8:56:54,-80,wifi3,c4:49:bb:d4:d9:78,-88]
+        
+        
+        self.UD_count+=1
+        #每6次定位获取一次天气数据
+        if self.UD_count>=6:
+            self.UD_count = 0
+            EventMesh.publish(constants.PROTOCOL.WT_SEND,msg)
+
+        send_data ="UD,"+msg
+        send_len = len(send_data)
+        #wt_data = "%s"%(send_data)
+        send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,send_len,send_data)
+        MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,send_len,"UD")
+        
+        MD5_SIGN = self.pack_MD5_head(MD5_head_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        # EventMesh.debug_log("{}".format(data))
+        # wt_data = EventMesh.publish("get_weather_data")
+        # # #如果没有天气数据,则获取天气数据
+        # if wt_data != None or wt_data[0] == None :
+        #     
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+        if EventMesh.platform == "gewu":
+            if(msg != ""):
+                client = EventMesh.publish("get_mqtt_dev_connect_state")
+                if client != 0:
+                    mqtt_connect = -1
+                    try:
+                        mqtt_connect = client.connect()
+                    except Exception as e:
+                        print(e)
+                        mqtt_connect = -1
+                    print("mqtt_connect:{}".format(mqtt_connect))
+                    if mqtt_connect == 0:
+                        # 订阅主题
+                        get_device_id = EventMesh.publish(constants.EVENT.GET_IMEI)
+                        get_deviceKey = EventMesh.publish(constants.EVENT.GET_IMEI)
+                        get_productKey = gewu_init()
+                        #$sys/{productKey}/{deviceKey}/ext/regist
+                        event_msg = "$sys/{}/{}/event/pub_reply".format(get_productKey,get_deviceKey)
+                        # client_msg = "$sys/cu1shld45y4hjr1L/866610001011658/ext/regist"
+                        subscribe_msg = event_msg.encode('ascii')
+
+                        client.subscribe(subscribe_msg,0)#订阅事件消息消息主题
+                        print("Connected to dmp-mqtt.cuiot.cn, subscribed to /public/TEST/quecpython topic")
+                        msg_tmp = msg.decode('ascii')
+                        msg_tmp = msg_tmp.split(',')
+                        longitude = float(msg_tmp[3])
+                        latitude = float(msg_tmp[5])
+                        date_tmp = utime.localtime()
+                        time_tmp = utime.mktime(date_tmp)#需要转换成毫秒级别
+                        updataTime = "{}".format(time_tmp*1000)
+                        data_info = {
+                            "messageId":"0",
+                            "params": {
+                                "key":"location",
+                                "info": [
+                                    {
+                                        "key":"longitude",
+                                        "value":longitude
+                                    },
+                                    {
+                                        "key":"latitude",
+                                        "value":latitude
+                                    },
+                                    {
+                                        "key":"UpdateTime",
+                                        "value":updataTime
+                                    }
+                            ]
+                            }
+                        }
+                        data_json = ujson.dumps(data_info) 
+                        event_pub_msg = "$sys/{}/{}/event/pub".format(get_productKey,get_deviceKey)
+                        pub_msg = event_pub_msg.encode('ascii')
+                        client.publish(pub_msg,data_json,0)#publis主题内容
+
+                        print("Publish topic: /public/TEST/quecpython758, msg: my name is Quecpython")
+
+            
+
+    def recv(self, event, msg):
+        pass
+        # EventMesh.debug_log("UD_ProtoCol:recv:%s"%(msg))  
+
+class CR_ProtoCol(ProtoCol):
+    """立即定位"""
+    TYPE = "CR"
+
+    def send(self, event, msg):
+        #[SZKWT*YYYYYYYYYYYYYYY*LEN*PING]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0002*CR"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #EventMesh.debug_log("CR_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        """
+
+        @param event: PING
+        @param msg: 接收到的下行数据
+        """
+        EventMesh.publish(constants.PROTOCOL.CR_SEND)
+        EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.UD_SEND) #开始ud定位
+        #EventMesh.debug_log("CR_ProtoCol:recv:%s"%(msg))   
+
+class AL_ProtoCol(ProtoCol):
+    """报警数据上报"""
+    TYPE = "AL"
+    timer_repetition_send = None
+    repetition_queue = None
+
+    def send(self, event, msg):
+        if EventMesh.platform != "gewu": 
+            if self.timer_repetition_send == None:
+                self.timer_repetition_send = osTimer()
+            if self.repetition_queue == None:
+                self.repetition_queue = Queue(100)
+            
+
+        send_data ="AL,"+msg
+        send_len = len(send_data)
+        #wt_data = "%s"%(send_data)
+        send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,send_len,send_data)
+        MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,send_len,"AL")
+        
+        MD5_SIGN = self.pack_MD5_head(MD5_head_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        # EventMesh.debug_log("AL_ProtoCol:send:{}".format(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+        if EventMesh.platform != "gewu":
+            self.repetition_queue.put(data)#发送入队
+            self.timer_repetition_send.start(10000, 1, self.repetition_timer_cb)
+        EventMesh.publish("set_dev_state",0)
+    def recv(self, event, msg):
+        """
+
+        @param event: PING
+        @param msg: 接收到的下行数据
+        """
+        #EventMesh.publish(constants.PROTOCOL.CR_SEND)
+        #EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.UD_SEND) #开始ud定位
+        # print("报警数据上报:recv:%s"%(msg))  
+        EventMesh.debug_log("报警数据上报:recv:{}".format(msg)) 
+        #       
+        if EventMesh.platform != "gewu": 
+            if self.repetition_queue.empty() == False:
+                self.repetition_queue.get()#出队
+            else:
+                self.timer_repetition_send.stop()
+
+    def repetition_timer_cb(self, *args, **kwargs):#每隔10秒发送一次
+        if self.repetition_queue.empty() == False:
+            data = self.repetition_queue.get()#出队
+            self.repetition_queue.put(data)#发送入队
+            EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+        else:
+            self.timer_repetition_send.stop()
+
+class FIND_ProtoCol(ProtoCol):
+    """查找设备"""
+    TYPE = "FIND"
+
+    def send(self, event, msg):
+        #[SZKWT*YYYYYYYYYYYYYYY*LEN*PING]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0004*FIND"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #EventMesh.debug_log("FIND_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        """
+
+        @param event: FIND,播放铃声
+        @param msg: 接收到的下行数据
+        """
+        EventMesh.publish(constants.PROTOCOL.FIND_SEND)
+        # a = audio.Audio(0)
+        # a.set_pa(Pin.GPIO29)
+        # a.setVolume(10)
+        # a.play(1, 1, 'E:/audio_find_haixiu.mp3')  #文件名前面要加上路径
+        
+        # EventMesh.publish("load_screen", {"screen": "FIND"})
+        EventMesh.publish("OPEN_FIND_WATCH")#
+        #EventMesh.debug_log("FIND_ProtoCol:recv:%s"%(msg)) 
+
+class POWEROFF_ProtoCol(ProtoCol):
+    """关机"""
+    TYPE = "POWEROFF"
+
+    def send(self, event, msg):
+        # [SZKW*867387060319491*0008*POWEROFF]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0008*POWEROFF"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #EventMesh.debug_log("POWEROFF_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        """
+
+        @param event: POWEROFF关机
+        @param msg: 接收到的下行数据
+        """
+        EventMesh.publish(constants.PROTOCOL.POWEROFF_SEND)
+        #EventMesh.debug_log("POWEROFF_ProtoCol:recv:%s"%(msg))
+        battery = EventMesh.publish("screen_get_battery")
+        if battery != None:
+            if battery[0] != "1":
+                EventMesh.publish("open_power_on", 2)#  #远程关机
+         
+class PHL_ProtoCol(ProtoCol):
+    """电话本同步"""
+    TYPE = "PHL"
+
+
+    def send(self, event, msg):
+        # [SZKW*867387060319491*0008*PHL]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0003*PHL"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #EventMesh.debug_log("POWEROFF_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        """
+
+        @param event: 电话本同步
+        @param msg: 接收到的下行数据
+        """
+        msg = msg[1:-1]
+        # EventMesh.debug_log("phonebook:msg:%s\r\n"%msg)
+        msg_tmp = msg.decode('ascii')
+        msg_tmp = msg_tmp.split(',')
+        # EventMesh.debug_log("phonebook:len:{}\r\n data:{}".format(len(msg_tmp),msg_tmp))
+
+        phonebook = {}
+        msg_tmp = msg_tmp[1:]
+    
+        j = 0
+        i = 0
+        phonebook_oldtmp = {}
+        # 0 1 2 3
+        for phonebook_tmp in msg_tmp: 
+            j+=1
+            # EventMesh.debug_log("phonebook_tmp:{} len:{}".format(phonebook_tmp,len(phonebook_tmp)))
+
+            if (j%2) == 0:
+                i+=1
+                if len(phonebook_tmp) != 0:
+                    phonebook_name = UnicodeHexStr_To_Utf8Str(phonebook_tmp)
+                    phonebook_name = "{}:{}".format("%03d"%i,phonebook_name)                                      
+                    phonebook[phonebook_name] = phonebook_oldtmp
+                
+            phonebook_oldtmp = phonebook_tmp
+                # EventMesh.debug_log("phonebook_oldtmp!!!:{}".format(str(phonebook_oldtmp)))
+        # EventMesh.debug_log("phonebook!!!:{}".format(str(phonebook)))
+        with open("/usr/static/storage_file/phonebook.json","w",encoding="utf-8") as fd:
+            ujson.dump(phonebook,fd)
+            EventMesh.debug_log("创建电话簿")
+        
+        EventMesh.publish(constants.PROTOCOL.PHL_SEND)
+        EventMesh.publish("set_phonebook_list",[1,phonebook])
+        EventMesh.publish("contact_updata_list_show")
+
+         
+class WT_ProtoCol(ProtoCol):
+    """天气数据"""
+    TYPE = "WT"
+    WT_T = 0
+
+    def send(self, event, msg):
+        # [SZKW*867387060319491*0008*WT]
+        # if self.WT_T != 0:
+        #     tmp_WT = 
+        if(msg != ""):
+            msg_tmp = "WT," + msg
+            data_len = len(msg_tmp)
+            MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*WT"%(self.imei,data_len)
+            MD5_SIGN = self.pack_MD5_head(MD5_head_data)
+            send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,data_len,msg_tmp)
+            data = "[%s%s]"%(str(MD5_SIGN),send_data)
+            EventMesh.debug_log("WT_ProtoCol:send:%s"%(data))
+            # 通过socket发送到服务器端
+            EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+        
+    def recv(self, event, msg):
+        """
+
+        @param event: T天气温度数据下发
+        @param msg: 接收到的下行数据
+        """
+        # b'SZKW*860132060004322*0035*WT,23-04-06,14:41:06,b6e0d4c6,1,27,-1,40,6DF157335E02'
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp = msg_tmp.split('WT,')
+        # EventMesh.debug_log("phonebook:len:{}\r\n data:{}".format(len(msg_tmp),msg_tmp))
+        msg_tmp = str(msg_tmp[1])
+
+        # EventMesh.debug_log("msg_tmp :%s"%(msg_tmp))
+
+        msg_date = msg_tmp.split(',')[0]
+
+        msg_time = msg_tmp.split(',')[1]
+        msg_weather_content = msg_tmp.split(',')[2]
+        msg_type = msg_tmp.split(',')[3]
+        msg_temp = msg_tmp.split(',')[4]
+        msg_min_temp = msg_tmp.split(',')[5]
+        msg_max_temp = msg_tmp.split(',')[6]
+        msg_city = msg_tmp.split(',')[7]
+
+        msg_city = UnicodeHexStr_To_Utf8Str(msg_city)
+        msg_weather_content = UnicodeHexStr_To_Utf8Str(msg_weather_content)
+        # EventMesh.debug_log("msg_date:{} msg_time:{} msg_weather_content:{} msg_type:{} msg_temp:{} msg_min_temp:{} msg_max_temp:{} msg_city:{}".format(msg_date,msg_time,\
+        #     msg_weather_content,msg_type,msg_temp,msg_min_temp,msg_max_temp,msg_city))
+        EventMesh.debug_log("WT_ProtoCol RECV msg:%s"%(msg))
+
+        EventMesh.publish("set_weather_data",[msg_date,msg_time,msg_weather_content,msg_type,msg_temp,msg_min_temp,msg_max_temp,msg_city,1])
+        EventMesh.publish("updata_weather_show")
+class REMIND_ProtoCol(ProtoCol):#普通闹钟
+    """
+    
+    平台发送:
+    [XT*YYYYYYYYYYYYYYY*LEN*REMIND,,时间1-开关,时间2-开关,周几]
+    实例:[XT*334588000000156*0008*REMIND,,时间1-开关,时间2-开关,周几]
+    终端回复:
+    [XT*YYYYYYYYYYYYYYY*LEN*REMIND]
+    """
+    TYPE = "REMIND"
+    
+    def send(self, event, msg):
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0006*REMIND"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        # SZKW*860132060346475*0013*REMIND_CH_MEDICINE2,4-1
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp_new = str(msg_tmp.split('REMIND,')[1])
+        msg_tmp_data = str(msg_tmp.split('REMIND')[1])
+        count = 0
+        for i in str(msg_tmp_data):
+            # print("i",i)
+            if i == ",":
+                count+=1
+        
+        normal_alarm_save = []
+        # # ("handler -> b'[SZKW*860132060346475*001C*REMIND,08:00-1-1,,]'",)
+        # b'[SZKW*860132060346475*001B*REMIND,08:00-1-1,,]'",)
+        # medicine_alarmday = str(msg_data[4])
+        # alarmday=[]
+        alarm_day = []
+        alarm_switch = 0
+
+        print("count",count,msg_tmp_new)
+        if count >= 3:
+            count = 3
+        for i in range(0,count):#默认是三个时间多了也不保存
+            alarm_day = []
+            alarm_data = str(msg_tmp_new.split(',')[i])
+            # print("i",i,sleep_data)
+            if len(alarm_data) != 0:
+                b = alarm_data.find('-')
+                if b != -1:
+                    alarm_time = alarm_data.split('-')[0]#-作为分隔符
+                    alarm_switch = int(alarm_data.split('-')[1])#开关
+                    alarm_repeat = int(alarm_data.split('-')[2])#是单次还是每天 还是自定义
+
+                    alarm_hour = int(alarm_time.split(":")[0])#时间
+                    alarm_min = int(alarm_time.split(":")[1])#冒号分隔时间 时 分
+                    
+                    
+                    if alarm_repeat == 2:#每一天
+                        alarm_day = [0,1,2,3,4,5,6]
+                    elif alarm_repeat == 3:#自定义
+                        alarm_day_tmp = alarm_data.split('-')[3]#-作为分隔符
+                        if len(str(alarm_day_tmp)) != 0:
+                            for i in range(0,7):
+                                if alarm_day_tmp[i] != '0':
+                                    alarm_day.append(i)
+                    else:#单次 1
+                       alarm_day=[] 
+                    if alarm_switch != 0:
+                        normal_alarm_save.append({"hour":alarm_hour,"min":alarm_min,"day":alarm_day,"enable":alarm_switch})
+        
+        EventMesh.publish("set_storage_config",["normal_alarm",normal_alarm_save])
+        # normal_alarm = EventMesh.publish("get_storage_config","normal_alarm")
+
+        # EventMesh.debug_log("recv REMIND_SEND:{} normal_alarm ;{}".format(msg,normal_alarm))
+       
+        EventMesh.publish(constants.PROTOCOL.REMIND_SEND)   
+        EventMesh.publish("clear_normal_alarm")
+
+
+
+
+
+
+
+class HRSTART_ProtoCol(ProtoCol):
+    """心率频率数据"""
+    TYPE = "hrtstart"
+
+
+    def send(self, event, msg):
+        # [SZKW*867387060319491*0008*hrtstart]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0008*hrtstart"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        # EventMesh.debug_log("HRSTART_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event: 心率数据下发
+        @param msg: 接收到的下行数据
+        """
+        # b'SZKW*860132060004322*0035*REMIND,23-04-06,14:41:06,b6e0d4c6,1,27,-1,40,6DF157335E02'
+        # EventMesh.debug_log("REMIND_ProtoCol RECV msg:%s"%(msg))
+        # HRSTART_ProtoCol RECV msg:b'SZKW*860132060004322*000D*hrtstart,7200' msg_:7200
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp = msg_tmp.split(',')
+        msg_tmp = msg_tmp[1]
+        EventMesh.debug_log("HRSTART_ProtoCol RECV msg:{} msg_:{}".format(msg,msg_tmp))
+        hrTotal = int(msg_tmp)
+        if hrTotal == 1:#单次测量
+            EventMesh.debug_log("HRSTART_ 2".format(hrTotal))
+            get_hr_state = EventMesh.publish("get_hr_state")
+            get_spo2_state = EventMesh.publish("get_spo2_state")
+            get_bp_state = EventMesh.publish("get_bp_state")
+            get_bg_state = EventMesh.publish("get_bg_state")
+            # if (get_hr_state == 3 ) or (get_spo2_state == 0 and get_hr_state == 0):#只要两个不在测量 单次优先级最低
+            if (get_spo2_state == 0 and get_hr_state == 0 and get_bg_state == 0 and get_bp_state == 0):
+                battery = EventMesh.publish("screen_get_battery")
+                if battery != None:
+                    if battery[0] != "1":
+                        EventMesh.publish("set_hr_state",3)#3代表单次测量
+            pass
+        else:
+            if hrTotal > 0 and hrTotal <= 300:
+                hrTotal = 300
+            elif hrTotal >= 65536:
+                hrTotal = 65536
+            EventMesh.debug_log("HRSTART_ 3".format(hrTotal))
+            on = 0
+            if hrTotal != 0:
+                on = 1
+            EventMesh.publish("set_time_hr",[on,hrTotal])
+
+
+        EventMesh.publish(constants.PROTOCOL.HRTSTART_SEND)
+
+class HEART_ProtoCol(ProtoCol):
+    """心率数据"""
+    TYPE = "heart"
+
+
+    def send(self, event, msg):
+        # [SZKW*334588000000156*len*heart,x]
+        # EventMesh.debug_log("HEART:send:{}".format(msg))
+        len_size = len(str(msg))+len("heart,")
+        send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*heart"%(self.imei,len_size)
+        MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,len_size,"heart")
+        MD5_SIGN = self.pack_MD5_head(MD5_head_data)
+        data = "[%s%s,%d]"%(str(MD5_SIGN),send_data,msg)
+        # EventMesh.debug_log("HEART_ProtoCol:data:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event: 心率数据下发
+        @param msg: 接收到的下行数据
+        """
+        # EventMesh.debug_log("HRSTART_ProtoCol RECV msg:")
+        #EventMesh.publish(constants.PROTOCOL.HEART_SEND)
+class OXYGEN_ProtoCol(ProtoCol):
+    """上传血氧测试数据"""
+    TYPE = "oxygen"
+    def send(self, event, msg):
+        # [SZKW*334588000000156*len*heart,x]
+        # EventMesh.debug_log("oxstart:send:{}".format(msg))
+        len_size = len(str(msg))+len("oxygen,")
+        send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*oxygen"%(self.imei,len_size)
+        MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,len_size,"oxygen")
+        MD5_SIGN = self.pack_MD5_head(MD5_head_data)
+        data = "[%s%s,%d]"%(str(MD5_SIGN),send_data,msg)
+        # EventMesh.debug_log("HEART_ProtoCol:data:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event: 心率数据下发
+        @param msg: 接收到的下行数据
+        """
+        # EventMesh.debug_log("HRSTART_ProtoCol RECV msg:")
+        #EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND)
+
+class OXYGEN_One_ProtoCol(ProtoCol):#单次测量
+    """上传单次测量测试数据"""
+    TYPE = "oxstart"
+
+# 终端发送[XT*YYYYYYYYYYYYYYY*LEN*oxygen,x]
+# x 表示血氧饱和度
+# 示例[XT*334588000000156*0009*oxygen,15]
+# 平台回复:handler -> b'[SZKW*860132060004322*0009*oxstart,1]'
+# [XT*334588000000156*0006*oxygen]
+    def send(self, event, msg):
+        # [SZKW*334588000000156*len*heart,x]
+        EventMesh.debug_log("oxstart:")
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0007*oxstart"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        # EventMesh.debug_log("HEART_ProtoCol:data:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event: 血氧单次测量下发
+        @param msg: 接收到的下行数据
+        """
+        EventMesh.debug_log("oxstart:{}".format(msg))
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp = msg_tmp.split(',')
+        msg_tmp = msg_tmp[1]
+
+        oxstartTotal = int(msg_tmp)
+        # oxstartTotal = 300
+        print("oxstartTotal:{}".format(oxstartTotal))
+        if oxstartTotal == 1:#单次测量
+            get_bp_state = EventMesh.publish("get_bp_state")
+            get_hr_state = EventMesh.publish("get_hr_state")
+            get_spo2_state = EventMesh.publish("get_spo2_state")
+            get_bg_state = EventMesh.publish("get_bp_state")
+            print("get_bp_state:{}".format(get_bp_state))
+            if get_bp_state == 0 and get_hr_state == 0 and get_spo2_state == 0 and get_bg_state == 0:#只要两个不在测量 单次优先级最低
+                battery = EventMesh.publish("screen_get_battery")
+                if battery != None:
+                    if battery[0] != "1":
+                        EventMesh.publish("set_spo2_state",3)#3代表单次测量
+        else:
+            if oxstartTotal > 0 and oxstartTotal <= 300:
+                oxstartTotal = 300
+            elif oxstartTotal >= 65536:
+                oxstartTotal = 65536
+
+            # if oxstartTotal == 0:#关闭自动测量
+            #     EventMesh.debug_log("bpSTART_ 1")
+            #     EventMesh.publish("set_spo2_time",[0,0])
+            # else:
+            on = 0
+            if oxstartTotal != 0:
+                on = 1
+            EventMesh.publish("set_spo2_time",[on,oxstartTotal])
+
+        EventMesh.publish(constants.PROTOCOL.OXSTART_SEND)
+
+class TEMP_ProtoCol(ProtoCol):
+    """上传体温测试数据"""
+    TYPE = "temp"
+    def send(self, event, msg):
+        # [SZKW*334588000000156*len*heart,x]
+        # EventMesh.debug_log("temp:send:{}".format(msg))
+        len_size = len(str(msg[0]))+len("temp,")+1+len(str(msg[1]))
+        EventMesh.debug_log("temp:send:{} len:{}".format(msg,len_size))
+        #  实例:[XT*334588000000156*0009*temp,36.2]
+        # 代表终端的温度为:36.2
+        # 平台回复:
+        # [XT*334588000000156*0004*temp]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*temp"%(self.imei,len_size)
+        MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,len_size,"temp")
+        MD5_SIGN = self.pack_MD5_head(MD5_head_data)
+        data = "[%s%s,%d.%d]"%(str(MD5_SIGN),send_data,msg[0],msg[1])
+        # EventMesh.debug_log("temp:data:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event: 
+        @param msg: 接收到的下行数据
+        """
+        # EventMesh.debug_log("HRSTART_ProtoCol RECV msg:")
+        #EventMesh.publish(constants.PROTOCOL.TEMP_SEND)
+
+class WDSTART_ProtoCol(ProtoCol):
+    """上传体温频率"""
+    TYPE = "wdstart"
+    def send(self, event, msg):
+        #[XT*334588000000156*len*wdstart,300]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0007*wdstart"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        # EventMesh.debug_log("temp:data:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event: 体温下发频率数据
+        @param msg: 接收到的下行数据
+        """
+        # EventMesh.debug_log("WDSTART_ProtoCol RECV msg:")
+        EventMesh.debug_log("wdstart:{}".format(msg))
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp = msg_tmp.split(',')
+        msg_tmp = msg_tmp[1]
+
+        tempTotal = int(msg_tmp)
+        EventMesh.debug_log("tempTotal:{}".format(tempTotal))
+        if tempTotal == 1:#单次测量
+            get_temp_state = EventMesh.publish("get_temp_state")
+            EventMesh.debug_log("get_temp_state:{}".format(get_temp_state))
+            if get_temp_state == 0:#只要两个不在测量 单次优先级最低
+                battery = EventMesh.publish("screen_get_battery")
+                if battery != None:
+                    if battery[0] != "1":
+                        EventMesh.publish("set_temp_state",3)#3代表单次测量
+        else:
+            if tempTotal > 0 and tempTotal <= 300:
+                tempTotal = 300
+            elif tempTotal >= 65536:
+                tempTotal = 65536
+            
+            EventMesh.publish("set_temp_time",tempTotal)
+
+            
+        
+        EventMesh.publish(constants.PROTOCOL.WDSTART_SEND)
+#解绑
+# 设置血压上传频率
+# 平台发送[XT*YYYYYYYYYYYYYYY*LEN*bldstart,x]
+# x为上传间隔时间,单位秒,连续上传时最小时间不小于300秒,最大不超过65535.
+# 示例[XT*334588000000156*0008*bldstart,300]
+# 终端回复:
+# [XT*334588000000156*0005*bldstart]
+# x为1则代表终端单次上传。
+# x为0则代表终端上传关闭。
+class bldstart_ProtoCol(ProtoCol):
+    """app下发血压测试频率"""
+    TYPE = "bldstart"
+    def send(self, event, msg):
+        #[XT*334588000000156*len*wdstart,300]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0008*bldstart"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        # print("temp:data:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event: 体温下发频率数据
+        @param msg: 接收到的下行数据
+        """
+        # print("WDSTART_ProtoCol RECV msg:")
+        print("bldstart:{}".format(msg))
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp = msg_tmp.split(',')
+        msg_tmp = msg_tmp[1]
+
+        bldstartTotal = int(msg_tmp)
+        # bldstartTotal = 300
+        print("bldstartTotal:{}".format(bldstartTotal))
+        if bldstartTotal == 1:#单次测量
+            get_bp_state = EventMesh.publish("get_bp_state")
+            get_hr_state = EventMesh.publish("get_hr_state")
+            get_spo2_state = EventMesh.publish("get_spo2_state")
+            get_bg_state = EventMesh.publish("get_bg_state")
+            print("get_bp_state:{}".format(get_bp_state))
+            if get_bp_state == 0 and get_hr_state == 0 and get_spo2_state == 0 and get_bg_state == 0:#只要两个不在测量 单次优先级最低
+                battery = EventMesh.publish("screen_get_battery")
+                if battery != None:
+                    if battery[0] != "1":
+                        EventMesh.publish("set_bp_state",3)#3代表单次测量
+        else:
+            if bldstartTotal > 0 and bldstartTotal <= 300:
+                bldstartTotal = 300
+            elif bldstartTotal >= 65536:
+                bldstartTotal = 65536
+
+            on = 0
+            if bldstartTotal != 0:#关闭自动测量
+                on = 1
+            print("on:{} bldstartTotal:{} ".format(on,bldstartTotal))
+            EventMesh.publish("set_bp_time",[on,bldstartTotal])
+           
+        EventMesh.publish(constants.PROTOCOL.BLDSTART_SEND)
+
+
+# 注:回复完后开始测量血压并上传(一般测一次90秒,app端会提醒用户两分钟后刷新页面查看)
+# 上传血压数据
+# 终端发送[XT*YYYYYYYYYYYYYYY*LEN*blood,x,y]
+# x 是收缩压(高压)
+# y 是舒张压(低压)
+# 示例[XT*334588000000156*000C*blood,150,70]
+# 平台回复:
+# [XT*334588000000156*0005*blood]
+class blood_ProtoCol(ProtoCol):
+    """上传血压测试数据"""
+    TYPE = "blood"
+    def send(self, event, msg):
+        len_size = len(str(msg[0]))+len("blood,")+1+len(str(msg[1]))
+        print("blood:send:{} len:{}".format(msg,len_size))
+        #  实例:[XT*334588000000156*0009*blood,36,2]
+        # 代表终端的
+        # 平台回复:
+        # [XT*334588000000156*0004*blood]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*blood"%(self.imei,len_size)
+        MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,len_size,"blood")
+        MD5_SIGN = self.pack_MD5_head(MD5_head_data)
+        data = "[%s%s,%d,%d]"%(str(MD5_SIGN),send_data,msg[0],msg[1])
+        print("blood:data:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+        
+    def recv(self, event, msg):
+        """
+        @param event: 
+        @param msg: 接收到的下行数据
+        """
+        # print("HRSTART_ProtoCol RECV msg:")
+        #EventMesh.publish(constants.PROTOCOL.TEMP_SEND)
+
+
+
+
+# 设置血糖上传频率
+# 平台发送:
+# [XT*334588000000156*len*bgstart,x]
+# x为上传间隔时间,单位秒,连续上传时最小时间不小于300秒,最大不超过65535.
+# 实例:[XT*334588000000156*len*bgstart,300]
+# 终端会每隔300秒检测一次
+
+# x为1则代表终端单次上传。
+# x为0则代表终端上传关闭。
+class bgstart_ProtoCol(ProtoCol):
+    """app下发血糖测试频率"""
+    TYPE = "bgstart"
+    def send(self, event, msg):
+        #[XT*334588000000156*len*wdstart,300]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0007*bgstart"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        # print("temp:data:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event: 体温下发频率数据
+        @param msg: 接收到的下行数据
+        """
+        # print("WDSTART_ProtoCol RECV msg:")
+        print("bgstart:{}".format(msg))
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp = msg_tmp.split(',')
+        msg_tmp = msg_tmp[1]
+
+        bgstartTotal = int(msg_tmp)
+        print("bgstartTotal:{}".format(bgstartTotal))
+        if bgstartTotal == 1:#单次测量
+            get_bp_state = EventMesh.publish("get_bp_state")
+            get_hr_state = EventMesh.publish("get_hr_state")
+            get_spo2_state = EventMesh.publish("get_spo2_state")
+            get_bg_state = EventMesh.publish("get_bg_state")
+            print("get_bg_state:{}".format(get_bg_state))
+            if get_bp_state == 0 and get_hr_state == 0 and get_spo2_state == 0 and get_bg_state == 0:#只要两个不在测量 单次优先级最低
+                battery = EventMesh.publish("screen_get_battery")
+                if battery != None:
+                    if battery[0] != "1":
+                        EventMesh.publish("set_bg_state",3)#3代表单次测量
+        else:
+            if bgstartTotal > 0 and bgstartTotal <= 300:
+                bgstartTotal = 300
+            elif bgstartTotal >= 65536:
+                bgstartTotal = 65536
+           
+            # if bgstartTotal == 0:#关闭自动测量
+            #     EventMesh.debug_log("bgSTART_ 1")
+            #     EventMesh.publish("set_bgauto_time",[0,0])
+            # else:
+            on = 0
+            if bgstartTotal != 0:
+                on = 1
+            EventMesh.publish("set_bgauto_time",[on,bgstartTotal])
+           
+        EventMesh.publish(constants.PROTOCOL.BGSTART_SEND)
+
+# 上传血糖数据
+# 终端发送[XT*YYYYYYYYYYYYYYY*LEN*bloodglucose,x]
+# x 表示血糖,单位mmol/L
+# 示例[XT*334588000000156*0010*bloodglucose,6.1]
+# 平台回复:
+# [XT*334588000000156*000B*bloodglucose]
+class bloodglucose_ProtoCol(ProtoCol):
+    """上传血糖测试数据"""
+    TYPE = "bloodglucose"
+    def send(self, event, msg):
+        len_size = len("bloodglucose,")+1+len(str(msg))
+        print("bloodglucose:send:{} len:{}".format(msg,len_size))
+        #  实例:[XT*334588000000156*0009*blood,36,2]
+        # 代表终端的
+        # 平台回复:
+        # [XT*334588000000156*0004*blood]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*bloodglucose"%(self.imei,len_size)
+        MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,len_size,"bloodglucose")
+        MD5_SIGN = self.pack_MD5_head(MD5_head_data)
+        data = "[%s%s,%s]"%(str(MD5_SIGN),send_data,msg)
+        print("bloodglucose:data:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+        
+    def recv(self, event, msg):
+        """
+        @param event: 
+        @param msg: 接收到的下行数据
+        """
+        # print("HRSTART_ProtoCol RECV msg:")
+        #EventMesh.publish(constants.PROTOCOL.TEMP_SEND)
+
+# [XT*334588000000156*0003*DLT]
+def reset_factory(msg):
+    if msg == 1:
+        Power.powerRestart()
+class DLT_ProtoCol(ProtoCol):
+    """解绑数据"""
+    TYPE = "DLT"
+    def send(self, event, msg):
+        # [XT*334588000000156*0004*temp]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0003*DLT"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        EventMesh.debug_log("temp:data:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event:
+        @param msg: 接收到的下行数据
+        """
+        # EventMesh.debug_log("DLT_ProtoCol RECV msg:")
+        
+
+#定位频率
+class UPLOAD_ProtoCol(ProtoCol):
+    """定位频率数据"""
+    TYPE = "UPLOAD"
+    def send(self, event, msg):
+        # [XT*334588000000156*0004*temp]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0006*UPLOAD"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event:
+        @param msg: 接收到的下行数据
+        """
+        # b'[SZKW*867387060319166*000A*UPLOAD,600]'
+        # EventMesh.debug_log("DLT_ProtoCol RECV msg:".format(msg))
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp = msg_tmp.split(',')
+        msg_tmp = msg_tmp[1]
+        upload_time = int(msg_tmp)
+        EventMesh.publish("set_storage_config",["upload_time",upload_time])
+
+        EventMesh.publish("set_upload_data", upload_time)
+        EventMesh.publish(constants.PROTOCOL.UPLOAD_SEND)
+
+#设置快捷号码
+class CENTER_ProtoCol(ProtoCol):
+    """设置快捷号码"""
+    TYPE = "CENTER"
+    def send(self, event, msg):
+        # [XT*334588000000156*0004*temp]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0006*CENTER"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        EventMesh.debug_log("UPLOAD:data:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event:
+        @param msg: 接收到的下行数据
+        """
+        # b'[SZKW*867387060319166*000A*UPLOAD,600]'
+        # EventMesh.debug_log("DLT_ProtoCol RECV msg:".format(msg))
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp = msg_tmp.split(',')
+        msg_tmp = msg_tmp[1]
+        EventMesh.debug_log("CENTER_ProtoCol RECV msg:{} msg_:{}".format(msg,msg_tmp))
+        center_dial = str(msg_tmp)
+        EventMesh.publish("set_storage_config",["center_dial",center_dial])
+        EventMesh.publish(constants.PROTOCOL.CENTER_SEND)  
+
+#呼叫快捷电话号码
+import voiceCall
+class MONITOR_ProtoCol(ProtoCol):
+    """呼叫快捷号码"""
+    TYPE = "MONITOR"
+    def send(self, event, msg):
+        # [XT*334588000000156*0004*MONITOR]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0007*MONITOR"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        EventMesh.debug_log("MONITOR:data:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event:
+        @param msg: 接收到的下行数据
+        """
+        # b'[SZKW*867387060319166*000A*MONITOR]'
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp = msg_tmp.split('MONITOR')
+        msg_tmp = msg_tmp[1]
+        EventMesh.debug_log("MONITOR_ProtoCol RECV msg:{} msg_:{}".format(msg,len(msg_tmp)))
+        if len(msg_tmp) != 0:
+            EventMesh.publish("save_phonename", contact)
+            EventMesh.publish("save_phonenum", contact)
+            EventMesh.publish("dial_out_call_center_cb",contact)#电话拨出去
+        else:
+            read_data = EventMesh.publish("get_storage_config","center_dial")
+            EventMesh.debug_log("MONITOR:data:%s"%(read_data))
+            if read_data != None: 
+                contact = read_data
+                if len(contact) > 0:
+                    EventMesh.debug_log("MONITOR RECV msg:{} {}".format(contact,type(contact)))
+                    EventMesh.publish("save_phonename", contact)
+                    EventMesh.publish("save_phonenum", contact)
+                    EventMesh.publish("dial_out_call_center_cb",contact)#电话拨出去
+        EventMesh.publish(constants.PROTOCOL.MONITOR_SEND)  
+
+#定时开关机
+class bootoff_ProtoCol(ProtoCol):
+    """定时开关机"""
+    TYPE = "BOOTOFF"
+    def send(self, event, msg):
+        # [XT*334588000000156*0004*MONITOR]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0007*BOOTOFF"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        EventMesh.debug_log("BOOTOFF:data:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+    def recv(self, event, msg):
+        """
+        @param event:
+        @param msg: 接收到的下行数据
+        """
+        # b'[SZKW*867387060319166*000A*SOS_SEND]'
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp = msg_tmp.split(',')
+        on_bt = int(msg_tmp[1])
+        start_hour = int(str(msg_tmp[2]).split(":")[0])
+        start_min = int(str(msg_tmp[2]).split(":")[1])
+
+        end_hour = int(str(msg_tmp[3]).split(":")[0])
+        end_min = int(str(msg_tmp[3]).split(":")[1])
+
+        EventMesh.debug_log("BOOTOFF:send data:",on_bt,start_hour,start_min,end_hour,end_min)
+        poweroff = []
+        poweroff.append({"poweroff_on":on_bt,"start_hour":start_hour,"start_min":start_min,"end_hour":end_hour,"end_min":end_min})
+        #b'[SZKW*860132060006970*0015*BOOTOFF,1,06:00,23:59]'
+        EventMesh.publish("set_boot_off_time",poweroff)#设置关机时间
+
+        EventMesh.publish(constants.PROTOCOL.BOOTOFF_SEND)  
+
+
+#sos家庭号码
+class sosHome_dial_ProtoCol(ProtoCol):
+    """sos家庭号码"""
+    TYPE = "SOS"
+    def send(self, event, msg):
+        # [XT*334588000000156*0004*MONITOR]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0003*SOS"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        print("sosHome_dial_ProtoCol:data:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event:
+        @param msg: 接收到的下行数据
+        """
+
+        # b'[SZKW*867387060319166*000A*SOS_SEND]'
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp = msg_tmp.split(',')
+
+        # print("sosHome_dial_ProtoCol:send data :{} {}".format(len(msg_tmp),msg_tmp))
+        #b'[SZKW*860132060006970*0015*sosHome_dial_ProtoCol,15521469561,10086,15521469561]'
+        i = 0
+        num = 0
+        count = 0
+        print("sos msg_tmp",msg_tmp)
+        if len(msg_tmp) > 4:
+            num = 3
+        else:
+            num = len(msg_tmp)-1
+        data = []
+        for i in range(num):
+            # print("sos:send data :{}".format(msg_tmp[i+1]))
+            if len(msg_tmp[i+1]) != 0:
+                EventMesh.publish("set_storage_config",["SOS_NUMBER{}".format(i+1),msg_tmp[i+1]])
+                data.append(str(msg_tmp[i+1]))
+                count+=1
+        print("data:{}".format(data))
+        EventMesh.publish("set_dial_sos_number",data)
+             
+        EventMesh.publish(constants.PROTOCOL.SOS_SEND)  
+
+  
+# 低电提醒
+#[XT*334588000000156*0008*LOWBAT,1]
+class LOWBAT_ProtoCol(ProtoCol):
+    """低电提醒"""
+    TYPE = "LOWBAT"
+    def send(self, event, msg):
+        # [XT*334588000000156*0006*LOWBAT]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0006*LOWBAT"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        EventMesh.debug_log("LOWBAT:data:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event:
+        @param msg: 接收到的下行数据
+        """
+        # b'[SZKW*867387060319166*000A*LOWBAT]'
+
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp = msg_tmp.split(',')
+        on_bt = msg_tmp[1]
+        EventMesh.debug_log("LOWBAT:send data:{}".format(on_bt))
+        #b'[SZKW*860132060006970*0015*LOWBAT,1,06:00,23:59]'
+        EventMesh.publish("set_low_bat_btn",on_bt)
+        EventMesh.publish(constants.PROTOCOL.LOWBAT_SEND)  
+
+# 设置系统时间
+#
+class Time_ProtoCol(ProtoCol):
+    """设置系统时间"""
+    TYPE = "Time"
+    def send(self, event, msg):
+        # 
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0004*Time"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        EventMesh.debug_log("Time:data:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event:
+        @param msg: 接收到的下行数据
+        """
+        # rtc = RTC()
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_data = msg_tmp.split(',')
+        
+        timeSecond = int(msg_data[1])
+        #EventMesh.debug_log("type {} timeSecond {}".format((msg_data[1]),timeSecond))
+        # timeSecond = 1703001360
+        next_alarm_time = utime.localtime(timeSecond)
+        #EventMesh.debug_log("next_alarm_time",next_alarm_time)
+        #EventMesh.debug_log("local time",msg)
+       # machine.RTC().datetime((tm[0], tm[1], tm[2], tm[6], tm[3], tm[4], tm[5], 0))
+
+        machine.RTC().datetime((next_alarm_time[0],next_alarm_time[1],next_alarm_time[2],next_alarm_time[6],next_alarm_time[3],next_alarm_time[4],next_alarm_time[5],0))
+        #next_alarm_time = utime.localtime(old_Timesec)#年月日时分秒星期365中的第几天
+        EventMesh.publish("set_rtc_alarm")
+        #EventMesh.publish(constants.PROTOCOL.TIME_SEND)  
+
+
+
+
+#免打扰
+class SILENCETIME2_ProtoCol(ProtoCol):
+    """免打扰"""
+    TYPE = "SILENCETIME2"
+    def send(self, event, msg):
+        # [XT*334588000000156*0006*SILENCETIME2]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*000C*SILENCETIME2"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        # EventMesh.debug_log("KEYBRD:data:%s"%(data))
+        # EventMesh.debug_log("SILENCETIME2!!!!!!!!!!!!!",msg)
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event:
+        @param msg: 接收到的下行数据
+        """
+        # b'[SZKW*867387060319166*000A*KEYBRD]'
+        # EventMesh.debug_log("SILENCETIME2!!!!!!!!!!!!!",msg)
+        EventMesh.publish(constants.PROTOCOL.SILENCETIME2_SEND)  
+
+#键盘开关
+class KEYBRD_ProtoCol(ProtoCol):
+    """免打扰"""
+    TYPE = "KEYBRD"
+    def send(self, event, msg):
+        # [XT*334588000000156*0006*SILENCETIME2]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0006*KEYBRD"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        # EventMesh.debug_log("KEYBRD:data:%s"%(data))
+        # EventMesh.debug_log("KEYBRD!!!!!!!!!!!!!",msg)
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event:
+        @param msg: 接收到的下行数据
+        """
+        # b'[SZKW*867387060319166*000A*KEYBRD]'
+        # EventMesh.debug_log("KEYBRD!!!!!!!!!!!!!",msg)
+        EventMesh.publish(constants.PROTOCOL.KEYBRD_SEND)  
+
+class TK_ProtoCol(ProtoCol):
+    """微聊"""
+    TYPE = "TK"
+    
+
+    def send(self, event, msg):
+        EventMesh.debug_log("TK send:")
+        if len(str(msg)) == 1:
+
+            len_size = len(str(msg))+len("TK,")
+            #  实例:[XT*334588000000156*0009*TK,1]
+            send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*TK"%(self.imei,len_size)
+            MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,len_size,"TK")
+            MD5_SIGN = self.pack_MD5_head(MD5_head_data)
+            data = "[%s%s,%d]"%(str(MD5_SIGN),send_data,msg)
+            EventMesh.debug_log("TK:data:%s"%(data))
+            # 通过socket发送到服务器端
+            EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+        else:
+            # [SZKW*YYYYYYYYYYYYYYY*LEN*TK,AMR 格式音频数据]
+            #[XT*YYYYYYYYYYYYYYY*LEN*TKS,秒数(十进制),AMR 格式音频数据]
+            arm_data = msg
+            # arm_sec = msg[0]
+            # EventMesh.debug_log("TK_ProtoCol:msgtype:{} arm_sec:{}".format(len(msg[1]),arm_sec))
+
+            arm = bytearray()
+            for i in range(len(arm_data)):
+                if arm_data[i] == 0x7d:
+                    arm.extend(b'\x7d\x01')
+                elif arm_data[i] == 0x5b :
+                    arm.extend(b'\x7d\x02')
+                elif arm_data[i] == 0x5d :
+                    arm.extend(b'\x7d\x03')
+                elif arm_data[i] == 0x2c :
+                    arm.extend(b'\x7d\x04')
+                elif arm_data[i] == 0x2a :
+                    arm.extend(b'\x7d\x05')
+                else :
+                    arm.append(arm_data[i])
+                
+            datalen = len(arm) + len("TK,")+1
+            #Wechat_log("len(str(arm_sec)):{}".format(len(str(arm_sec))+1))
+            send_data = bytearray(EventMesh.publish("get_new_pid")+"*%s*%04X*TK,"%(self.imei,datalen))
+            send_data.extend(arm)
+            MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,datalen,"TK")
+            MD5_SIGN = self.pack_MD5_head(MD5_head_data)
+            data = bytearray('[')
+            data.extend(MD5_SIGN)
+            data.extend(send_data)
+            data.extend(']')
+            # EventMesh.debug_log("TK:send data:%s MD5_head_data:%s"%(data,MD5_head_data))
+            EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+
+    def recv(self, event, msg):
+        """
+
+        ("TK_ProtoCol:datalen:{} {} {}".format(wechat_num,MXA_MSG,wechat_recode_list))
+        @param event: 微聊
+        @param msg: 接收到的下行数据
+        [SZKW*860132060004322*20BD*TK,#!AMR...]
+        """
+        #Wechat_log("K_ProtoCol:recv:data:{}".format(msg))
+        
+        msg_tmp = msg.decode('ascii')
+        str = msg_tmp.split('TK,')
+        # Wechat_log("TK_ProtoCol:recv:len:{} {} {}".format(len(msg),len(str),msg_tmp.find("#!AMR")))
+
+        read_AMR_flag = msg_tmp.find("#!AMR")
+        #EventMesh.debug_log("TK recv:read_AMR_flag:{} ,{}".format(read_AMR_flag,EventMesh.publish("get_wechat_record_flag")))
+        # if  EventMesh.publish("get_wechat_record_flag") != 1 and  read_AMR_flag != -1: #是否是服务器下发音频数据
+        if  read_AMR_flag != -1: #是否是服务器下发音频数据
+            # Wechat_log("TK_ProtoCol:recv:datalen{}".format(len(msg)))
+            arm_data = bytearray(str[1])#获取amr输出
+            get_wechat_data = EventMesh.publish("get_wechat_data")
+            MXA_MSG = get_wechat_data[0]
+            wechat_recode_list = get_wechat_data[1]
+            wechat_num = int(wechat_recode_list["num"])
+            # Wechat_log("TK_ProtoCol:datalen:{} {} {}".format(wechat_num,MXA_MSG,wechat_recode_list))
+            
+            if wechat_num >= MXA_MSG:
+                wechat_num = 0 
+            if wechat_num == 0:
+                wechat_num += 1 
+            elif wechat_num > 0:
+                wechat_num += 1 
+
+
+            EventMesh.debug_log("num_total:datalen:{} {}".format(MXA_MSG,wechat_recode_list))
+            wechat_recode_list["%02d"%(wechat_num)] = "read:1"
+            wechat_recode_list['num'] = wechat_num
+            EventMesh.publish("set_wechat_data",[MXA_MSG,wechat_recode_list])
+            #写语音文件数据
+
+            # path = "/usr/static/storage_file/wechat.amr"
+            path = "/usr/static/storage_file/{}.amr".format(wechat_num)
+            with open(path,"w") as fd:
+                arm = bytearray()
+                j = 0
+                for i in range(len(arm_data)):
+                    if arm_data[j] == 0x7d and arm_data[j+1] == 0x01:
+                        arm.extend(b'\x7d')
+                        j+=1
+                    elif arm_data[j] == 0x7d and arm_data[j+1] == 0x02:
+                        arm.extend(b'\x5b')
+                        j+=1
+                    elif arm_data[j] == 0x7d and arm_data[j+1] == 0x03:
+                        arm.extend(b'\x5d')
+                        j+=1
+                    elif arm_data[j] == 0x7d and arm_data[j+1] == 0x04:
+                        arm.extend(b'\x2c')
+                        j+=1
+                    elif arm_data[j] == 0x7d and arm_data[j+1] == 0x05:
+                        arm.extend(b'\x2a')
+                        j+=1
+                    else :
+                        arm.append(arm_data[j])
+                    j+=1
+                    if j >= len(arm_data):
+                        break
+                fd.write(arm)
+            EventMesh.publish("recv_wechat_audio")#
+            EventMesh.publish(constants.PROTOCOL.TK_SEND,1)
+            EventMesh.debug_log("constants.PROTOCOL.TK_SEND1!!!")
+        else :
+            if read_AMR_flag != -1:
+                EventMesh.publish(constants.PROTOCOL.TK_SEND,0)
+        
+class TKS_ProtoCol(ProtoCol):
+    """微聊"""
+    TYPE = "TKS"
+    
+
+    def send(self, event, msg):
+        EventMesh.debug_log("TKS send:")
+        if len(str(msg)) == 1:
+            len_size = len(str(msg))+len("TKS,")
+            #  实例:[XT*334588000000156*0009*TK,1]
+            send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*TKS"%(self.imei,len_size)
+            MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,len_size,"TKS")
+            MD5_SIGN = self.pack_MD5_head(MD5_head_data)
+            data = "[%s%s,%d]"%(str(MD5_SIGN),send_data,msg)
+            EventMesh.debug_log("TKS:data:%s"%(data))
+            # 通过socket发送到服务器端
+            EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+        else:
+            # [SZKW*YYYYYYYYYYYYYYY*LEN*TK,AMR 格式音频数据]
+            #[XT*YYYYYYYYYYYYYYY*LEN*TKS,秒数(十进制),AMR 格式音频数据]
+            arm_data = msg[1]
+            arm_sec = msg[0]
+            EventMesh.debug_log("TK_ProtoCol:msgtype:{} arm_sec:{}".format(len(msg[1]),arm_sec))
+
+            arm = bytearray()
+            for i in range(len(arm_data)):
+                if arm_data[i] == 0x7d:
+                    arm.extend(b'\x7d\x01')
+                elif arm_data[i] == 0x5b :
+                    arm.extend(b'\x7d\x02')
+                elif arm_data[i] == 0x5d :
+                    arm.extend(b'\x7d\x03')
+                elif arm_data[i] == 0x2c :
+                    arm.extend(b'\x7d\x04')
+                elif arm_data[i] == 0x2a :
+                    arm.extend(b'\x7d\x05')
+                else :
+                    arm.append(arm_data[i])
+                
+            datalen = len(arm) + len("TKS,")+len(str(arm_sec))+1
+            #Wechat_log("len(str(arm_sec)):{}".format(len(str(arm_sec))+1))
+            send_data = bytearray(EventMesh.publish("get_new_pid")+"*%s*%04X*TKS,%d,"%(self.imei,datalen,arm_sec))
+            send_data.extend(arm)
+            MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,datalen,"TKS")
+            MD5_SIGN = self.pack_MD5_head(MD5_head_data)
+            data = bytearray('[')
+            data.extend(MD5_SIGN)
+            data.extend(send_data)
+            data.extend(']')
+            # EventMesh.debug_log("TK:send data:%s MD5_head_data:%s"%(data,MD5_head_data))
+            EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+
+    def recv(self, event, msg):
+        """
+
+        ("TK_ProtoCol:datalen:{} {} {}".format(wechat_num,MXA_MSG,wechat_recode_list))
+        @param event: 微聊
+        @param msg: 接收到的下行数据
+        [SZKW*860132060004322*20BD*TK,#!AMR...]
+        """
+        #Wechat_log("K_ProtoCol:recv:data:{}".format(msg))
+        # EventMesh.debug_log("TK recv:{}".format(msg))
+        msg_tmp = msg.decode('ascii')
+        str = msg_tmp.split('TKS,')
+        # Wechat_log("TK_ProtoCol:recv:len:{} {} {}".format(len(msg),len(str),msg_tmp.find("#!AMR")))
+        read_AMR_flag = msg_tmp.find("#!AMR")
+        # if  EventMesh.publish("get_wechat_record_flag") != 1 and  read_AMR_flag != -1: #是否是服务器下发音频数据
+        if  read_AMR_flag != -1: #是否是服务器下发音频数据
+            # Wechat_log("TK_ProtoCol:recv:datalen{}".format(len(msg)))
+            arm_data = bytearray(str[1])#获取amr输出
+            get_wechat_data = EventMesh.publish("get_wechat_data")
+            MXA_MSG = get_wechat_data[0]
+            wechat_recode_list = get_wechat_data[1]
+            wechat_num = int(wechat_recode_list["num"])
+            # Wechat_log("TK_ProtoCol:datalen:{} {} {}".format(wechat_num,MXA_MSG,wechat_recode_list))
+            
+            if wechat_num >= MXA_MSG:
+                wechat_num = 0 
+            if wechat_num == 0:
+                wechat_num += 1 
+            elif wechat_num > 0:
+                wechat_num += 1 
+
+
+            EventMesh.debug_log("num_total:datalen:{} {}".format(MXA_MSG,wechat_recode_list))
+            wechat_recode_list["%02d"%(wechat_num)] = "read:1"
+            wechat_recode_list['num'] = wechat_num
+            EventMesh.publish("set_wechat_data",[MXA_MSG,wechat_recode_list])
+            #写语音文件数据
+
+            # path = "/usr/static/storage_file/wechat.amr"
+            path = "/usr/static/storage_file/{}.amr".format(wechat_num)
+            with open(path,"w") as fd:
+                arm = bytearray()
+                j = 0
+                for i in range(len(arm_data)):
+                    if arm_data[j] == 0x7d and arm_data[j+1] == 0x01:
+                        arm.extend(b'\x7d')
+                        j+=1
+                    elif arm_data[j] == 0x7d and arm_data[j+1] == 0x02:
+                        arm.extend(b'\x5b')
+                        j+=1
+                    elif arm_data[j] == 0x7d and arm_data[j+1] == 0x03:
+                        arm.extend(b'\x5d')
+                        j+=1
+                    elif arm_data[j] == 0x7d and arm_data[j+1] == 0x04:
+                        arm.extend(b'\x2c')
+                        j+=1
+                    elif arm_data[j] == 0x7d and arm_data[j+1] == 0x05:
+                        arm.extend(b'\x2a')
+                        j+=1
+                    else :
+                        arm.append(arm_data[j])
+                    j+=1
+                    if j >= len(arm_data):
+                        break
+                fd.write(arm)
+            EventMesh.publish("recv_wechat_audio")#
+            EventMesh.publish(constants.PROTOCOL.TKS_SEND,1)#返回接收成功
+        else :
+            if read_AMR_flag != -1 :
+                EventMesh.publish(constants.PROTOCOL.TKS_SEND,0)#返回接收失败
+        
+
+            
+            
+            
+            
+
+class MESSAGE_ProtoCol(ProtoCol):
+    """微聊"""
+    TYPE = "MESSAGE"
+    
+
+    def send(self, event, msg):
+        #[XT*334588000000156*0007*MESSAGE]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0007*MESSAGE"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        """
+
+        @param event: 微聊文字
+        @param msg: 接收到的下行数据
+        """
+        # msg = msg[1:-1]
+
+        # msg_s = msg.decode('ascii')
+        # msg_s = msg_s.split(',')
+        # msg_s = msg_s[1]
+        # # Wechat_log("msg_tmp:len:{}\r\n data:{}".format(len(msg_s),msg_s))
+        
+
+        # get_wechat_data = EventMesh.publish("get_wechat_data")
+        
+        # MXA_MSG = get_wechat_data[0]
+        # wechat_recode_list = get_wechat_data[1]
+        # wechat_num = wechat_recode_list["num"]
+        # # Wechat_log("TK_ProtoCol:datalen:{} {} {}".format(wechat_num,MXA_MSG,wechat_recode_list))
+        
+        # if wechat_num >= MXA_MSG:
+        #     wechat_num = 0 
+        # if wechat_num == 0:
+        #     wechat_num += 1 
+        # elif wechat_num > 0:
+        #     wechat_num += 1 
+        # msg_txt = {}
+        # # 0 1 2 3
+        # Wechat_log("wechat_num:init {}".format(wechat_num))
+        # msg_txt = UnicodeHexStr_To_Utf8Str(msg_s)
+        # # Wechat_log("msg_txt:{}".format(msg_txt))
+        # wechat_recode_list["%02d"%(wechat_num)] = "T:{}".format(msg_txt)
+        # wechat_recode_list['num'] = wechat_num
+        # EventMesh.publish("set_wechat_data",[MXA_MSG,wechat_recode_list])
+        # # Wechat_log("wechat_recode_list:len data:{}".format(wechat_recode_list))
+        
+        # screen_NAME = EventMesh.publish("get_screen_NAME")
+        # get_lcd_state = EventMesh.publish("get_lcd_state")
+        # if screen_NAME != "wechat" or get_lcd_state == 0:
+        #     EventMesh.publish("load_screen", {"screen": "wechat_popup"})
+        # else:
+        #     EventMesh.publish("wechat_updata_list_show")
+        EventMesh.publish(constants.PROTOCOL.MESSAGE_SEND)
+        # EventMesh.publish("recv_wechat_audio")#
+
+class FALLDOWN_ProtoCol(ProtoCol):
+    """
+    跌倒提醒开关
+    服务器下发跌倒报警设置命令
+    [XT*334588000000156*LEN*FALLDOWN,ONOFF]
+    ONOFF: 1:开启,0:关闭。
+    终端回复
+    [XT*334588000000156*LEN*FALLDOWN]
+    """
+    TYPE = "FALLDOWN"
+    
+    def send(self, event, msg):
+       
+        #[XT*334588000000156*LEN*FALLDOWN]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0008*FALLDOWN"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        """
+        [SZKW*860132060341484*000A*FALLDOWN,1]
+        """
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_data = msg_tmp.split(',')
+        
+        Falldowm = msg_data[1]
+        EventMesh.debug_log("FALLDOWN:{}".format(Falldowm))
+        EventMesh.publish("set_storage_config",["fall_sw",Falldowm])
+
+        EventMesh.publish(constants.PROTOCOL.FALLDOWN_SEND)
+
+class REMOVE_ProtoCol(ProtoCol):
+    """
+    取下手环报警开关
+    平台发送:
+    [XT*YYYYYYYYYYYYYYY*LEN*REMOVE,0或者1]
+    实例:[XT*334588000000156*0008*REMOVE,1]
+    终端回复:
+    [XT*YYYYYYYYYYYYYYY*LEN*REMOVE]
+    """
+    TYPE = "REMOVE"
+    
+    def send(self, event, msg):
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0006*REMOVE"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_data = msg_tmp.split(',')
+        Falldowm = msg_data[1]
+        EventMesh.debug_log("REMOVE:{}".format(Falldowm))
+        EventMesh.publish("set_storage_config",["remove_sw",Falldowm])
+        EventMesh.publish(constants.PROTOCOL.REMOVE_SEND)   
+
+class HELP_ProtoCol(ProtoCol):
+    """
+一键报警
+    [XT*YYYYYYYYYYYYYYY*LEN*HELP,状态]
+    状态值为整数:60或不带默认是普通报警,61光电式感烟火灾报警,62检测环境温度(高温报警,温度变化报警),
+    63人体活动检测报警,64电池欠压提醒功能,65设备脱落提醒功能,66离线报警,67测试报警,123气感报警,
+    124烟感报警,125水浸报警
+    实例:
+    [XT*334588000000156*0004*HELP,60]
+    """
+    TYPE = "HELP"
+    
+    def send(self, event, msg):
+        #[XT*334588000000156*LEN*FALLDOWN]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0008*HELP,%d"%(self.imei,msg)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        """
+        [XT*334588000000156*0004*HELP,60]
+        """
+
+        pass   
+
+
+#喝水闹钟提示
+# 喝水闹钟设置指令
+# 平台发送:
+# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_DRINK,时间间隔(小时),开关(0为关,1为开)]
+# 实例:
+# [XT*334588000000156*0026*REMIND_CH_DRINK,4,0]
+# 终端回复:
+# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_DRINK]
+# 实例:[XT*334588000000156*000E*REMIND_CH_DRINK]
+class REMIND_CHDRINK_ProtoCol(ProtoCol):
+    """
+    
+    平台发送:
+    [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_DRINK,时间间隔(小时),开关(0为关,1为开)]
+    实例:[XT*334588000000156*0008*REMIND_CH_DRINK,时间间隔(小时),开关(0为关,1为开)]
+    终端回复:
+    [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_DRINK]
+    """
+    TYPE = "REMIND_CH_DRINK"
+    
+    def send(self, event, msg):
+        send_data = EventMesh.publish("get_new_pid")+"*%s*000F*REMIND_CH_DRINK"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        # SZKW*860132060346475*0013*REMIND_CH_DRINK,4-1
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_data = msg_tmp.split(',')
+        data = str(msg_data[1])
+        hour = int(data.split('-')[0])
+        btn_on = int(data.split('-')[1])
+
+        EventMesh.debug_log("recv REMIND_CH_DRINK:{}-{}-{}".format(hour,btn_on,msg))
+        EventMesh.publish("set_storage_config",["drink_on",btn_on])
+        EventMesh.publish("set_storage_config",["drink_time",hour])
+        EventMesh.publish(constants.PROTOCOL.REMIND_CH_DRINK_SEND)  
+
+# 自定义服药闹钟设置指令
+# 平台发送:
+# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_MEDICINE2,时间1-开关,时间2-开关,周几]
+# 实例:
+# [XT*334588000000156*0026*REMIND_CH_MEDICINE2,08:10-0,09:10-0,1000001]
+# 终端回复:
+# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_MEDICINE2]
+# 实例:[XT*334588000000156*000E*REMIND_CH_MEDICINE2]
+# 说明:闹铃格式为:时间-开关(0/1),周几(周六到周日)
+
+#REMIND_CH_MEDICINE2,09:00-1,14:00-0,18:00-0,1111111]'",)
+class REMIND_CHMEDICINE2_ProtoCol(ProtoCol):#吃药提醒
+    """
+    
+    平台发送:
+    [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_MEDICINE2,,时间1-开关,时间2-开关,周几]
+    实例:[XT*334588000000156*0008*REMIND_CH_MEDICINE2,,时间1-开关,时间2-开关,周几]
+    终端回复:
+    [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_MEDICINE2]
+    """
+    TYPE = "REMIND_CH_MEDICINE2"
+    
+    def send(self, event, msg):
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0013*REMIND_CH_MEDICINE2"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        # SZKW*860132060346475*0013*REMIND_CH_MEDICINE2,4-1
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+
+        msg_data = str(msg_tmp.split('REMIND_CH_MEDICINE2,')[1])
+        msg_data_tmp = str(msg_tmp.split('REMIND_CH_MEDICINE2')[1])
+
+        medicin_data = []
+        alarmday=[]
+        count = 0
+        for i in str(msg_data_tmp):
+            # print("i",i)
+            if i == ",":
+                count+=1
+
+        if count >= 3:
+            count = 3
+        medicine_alarmday = []
+        for i in range(0,count):#默认是三个时间多了也不保存
+            medicine_alarmday = str(msg_data.split(",")[count])
+            # print("i",i)
+            medicine_alarm = str(msg_data.split(",")[i])
+            if str(medicine_alarm).find("-") != -1:
+                on = int(medicine_alarm.split('-')[1])
+                if on != 0:
+                    alarmday = []
+                    data = str(medicine_alarm.split('-')[0])
+                    hour = int(data.split(":")[0])
+                    min = int(data.split(":")[1])
+                    for i in range(0,7):
+                        # print("medicine_alarmday",medicine_alarmday,medicine_alarmday[i])
+                        if medicine_alarmday[i] != '0':
+                            alarmday.append(i)
+                    enable = 1
+                    medicin_data.append({"hour":hour,"min":min,"day":alarmday,"enable":enable})
+        
+        EventMesh.publish("set_storage_config",["medicine",medicin_data])
+        EventMesh.debug_log("recv REMIND_CH_MEDICINE2:{} medicin_data ;{}".format(msg,medicin_data))
+       
+        EventMesh.publish(constants.PROTOCOL.REMIND_CH_MEDICINE2_SEND) 
+        EventMesh.publish("clear_medicine_alarm")
+
+# 回家闹钟设置指令
+# 可设置闹钟的提醒文字
+# 平台发送:
+# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_HOME,闹钟1,闹钟2,闹钟3]
+# 实例:
+# [XT*334588000000156*0018*REMIND_CH_HOME,08:10,12:10]
+# 终端回复:
+# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_HOME]
+# 实例:[XT*334588000000156*0006*REMIND_CH_HOME]
+# 说明:闹钟为时间点;
+class REMIND_CH_HOME_ProtoCol(ProtoCol):#回家提醒
+    """
+    
+    平台发送:
+    [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_HOME,,时间1-开关,时间2-开关,周几]
+    实例:[XT*334588000000156*0008*REMIND_CH_HOME,,时间1-开关,时间2-开关,周几]
+    终端回复:
+    [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_HOME]
+    """
+    TYPE = "REMIND_CH_HOME"
+    
+    def send(self, event, msg):
+        send_data = EventMesh.publish("get_new_pid")+"*%s*000E*REMIND_CH_HOME"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        # SZKW*860132060346475*0013*REMIND_CH_MEDICINE2,4-1
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_data = msg_tmp.split(',')
+
+        # [SZKW*860132060346475*0014*REMIND_CH_HOME,00:00',)
+        home_data = str(msg_data[1])
+  
+        EventMesh.debug_log("recv REMIND_CH_HOME:{} medicin_data ;{}".format(msg,home_data))
+        if len(home_data) != 0:
+            EventMesh.publish("set_storage_config",["home_alarm",home_data])
+        EventMesh.publish("clear_home_alarm")
+        EventMesh.publish(constants.PROTOCOL.REMIND_CH_HOME_SEND)   
+# 起床闹钟设置指令
+# 平台发送:
+# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_WAKEUP,闹钟1,闹钟2]
+# 实例:
+# [XT*334588000000156*0026*REMIND_CH_WAKEUP,08:10-0-3-1000001,09:10-0-3-1000001]
+# 闹钟格式为:时间-开关-频率(1:一次;2:每天;3:自定义)
+# 08:10-1-1:闹钟时间8:10,打开,响铃一次
+# 08:10-1-2:闹钟时间8:10,打开,每天响铃
+# 08:10-1-3-0111110:闹钟时间8:10,打开,自定义周一至周五打开
+# 最左边是周日,最右边是周六,即0111110的顺序是:周日,周一,周二,周三,周四,周五,周六(1为打开,0为关闭),其中周一至周五打开闹钟
+# 终端回复:
+# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_WAKEUP]
+# 实例:[XT*334588000000156*000E*REMIND_CH_WAKEUP]
+# 说明:闹铃格式为:时间-开关-周几(周六到周日)
+class REMIND_CH_WAKEUP_ProtoCol(ProtoCol):#该起床了
+    """
+    
+    平台发送:
+    [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_WAKEUP,,时间1-开关,时间2-开关,周几]
+    实例:[XT*334588000000156*0008*REMIND_CH_WAKEUP,,时间1-开关,时间2-开关,周几]
+    终端回复:
+    [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_WAKEUP]
+    """
+    TYPE = "REMIND_CH_WAKEUP"
+    
+    def send(self, event, msg):
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0011*REMIND_CH_WAKEUP"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        # SZKW*860132060346475*0013*REMIND_CH_MEDICINE2,4-1
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp_new = str(msg_tmp.split('REMIND_CH_WAKEUP,')[1])
+        msg_tmp_data = str(msg_tmp.split('REMIND_CH_WAKEUP')[1])
+        count = 0
+        for i in str(msg_tmp_data):
+            # print("i",i)
+            if i == ",":
+                count+=1
+        wakeup_data_save = []
+        # # ("handler -> b'[SZKW*860132060346475*001C*REMIND_CH_WAKEUP,08:00-1-1,,]'",)
+        # medicine_alarmday = str(msg_data[4])
+        # alarmday=[]
+        wakeup_day = []
+        wakeup_switch = 0
+
+        print("count",count)
+        if count >= 3:
+            count = 3
+        for i in range(0,count):#默认是三个时间多了也不保存
+            wakeup_day = []
+            wakeup_data = str(msg_tmp_new.split(',')[i])
+            # print("i",i,wakeup_data)
+            if len(wakeup_data) != 0:
+                b = wakeup_data.find('-')
+                if b != -1:
+                    wakeup_time = wakeup_data.split('-')[0]#-作为分隔符
+                    wakeup_switch = int(wakeup_data.split('-')[1])#开关
+                    wakeup_repeat = int(wakeup_data.split('-')[2])#是单次还是每天 还是自定义
+
+                    wakeup_hour = int(wakeup_time.split(":")[0])#时间
+                    wakeup_min = int(wakeup_time.split(":")[1])#冒号分隔时间 时 分
+                    
+                    
+                    if wakeup_repeat == 2:#每一天
+                        wakeup_day = [0,1,2,3,4,5,6]
+                    elif wakeup_repeat == 3:#自定义
+                        wakeup_day_tmp = wakeup_data.split('-')[3]#-作为分隔符
+                        for i in range(0,7):
+                            if wakeup_day_tmp[i] != '0':
+                                wakeup_day.append(i)
+                    else:#单次 1
+                       wakeup_day=[] 
+                    if wakeup_switch != 0:
+                        wakeup_data_save.append({"hour":wakeup_hour,"min":wakeup_min,"day":wakeup_day,"enable":wakeup_switch})
+        
+        EventMesh.publish("set_storage_config",["wakeup_alarm",wakeup_data_save])
+        wakeup = EventMesh.publish("get_storage_config","wakeup_alarm")
+
+        EventMesh.debug_log("recv REMIND_CH_WAKEUP:{} wakeup ;{}".format(msg,wakeup))
+       
+        EventMesh.publish(constants.PROTOCOL.REMIND_CH_WAKEUP_SEND)  
+       
+        EventMesh.publish("clear_wakeup_alarm") 
+
+
+
+# 睡觉闹钟设置指令
+# 平台发送:
+# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_SLEEP,闹钟1,闹钟2]
+# 实例:
+# [XT*334588000000156*0026*REMIND_CH_SLEEP,08:10-0-3-1000001,09:10-0-3-1000001]
+# 闹钟格式为:时间-开关-频率(1:一次;2:每天;3:自定义)
+# 08:10-1-1:闹钟时间8:10,打开,响铃一次
+# 08:10-1-2:闹钟时间8:10,打开,每天响铃
+# 08:10-1-3-0111110:闹钟时间8:10,打开,自定义周一至周五打开
+# 最左边是周日,最右边是周六,即0111110的顺序是:周日,周一,周二,周三,周四,周五,周六(1为打开,0为关闭),其中周一至周五打开闹钟
+# 终端回复:
+# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_SLEEP]
+# 实例:[XT*334588000000156*000E*REMIND_CH_SLEEP]
+# 说明:闹铃格式为:时间-开关-周几(周六到周日)
+class REMIND_CH_SLEEP_ProtoCol(ProtoCol):#该睡觉了
+    """
+    
+    平台发送:
+    [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_SLEEP,,时间1-开关,时间2-开关,周几]
+    实例:[XT*334588000000156*0008*REMIND_CH_SLEEP,,时间1-开关,时间2-开关,周几]
+    终端回复:
+    [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_SLEEP]
+    """
+    TYPE = "REMIND_CH_SLEEP"
+    
+    def send(self, event, msg):
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0011*REMIND_CH_SLEEP"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        # SZKW*860132060346475*0013*REMIND_CH_MEDICINE2,4-1
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp_new = str(msg_tmp.split('REMIND_CH_SLEEP,')[1])
+        msg_tmp_data = str(msg_tmp.split('REMIND_CH_SLEEP')[1])
+        count = 0
+        for i in str(msg_tmp_data):
+            # print("i",i)
+            if i == ",":
+                count+=1
+
+        sleep_data_save = []
+        # # ("handler -> b'[SZKW*860132060346475*001C*REMIND_CH_SLEEP,08:00-1-1,,]'",)
+        # b'[SZKW*860132060346475*001B*REMIND_CH_SLEEP,08:00-1-1,,]'",)
+        # medicine_alarmday = str(msg_data[4])
+        # alarmday=[]
+        sleep_day = []
+        sleep_switch = 0
+
+        print("count",count)
+        if count >= 3:
+            count = 3
+        for i in range(0,count):#默认是三个时间多了也不保存
+            sleep_day = []
+            sleep_data = str(msg_tmp_new.split(',')[i])
+            # print("i",i,sleep_data)
+            if len(sleep_data) != 0:
+                b = sleep_data.find('-')
+                if b != -1:
+                    sleep_time = sleep_data.split('-')[0]#-作为分隔符
+                    sleep_switch = int(sleep_data.split('-')[1])#开关
+                    sleep_repeat = int(sleep_data.split('-')[2])#是单次还是每天 还是自定义
+
+                    sleep_hour = int(sleep_time.split(":")[0])#时间
+                    sleep_min = int(sleep_time.split(":")[1])#冒号分隔时间 时 分
+                    
+                    
+                    if sleep_repeat == 2:#每一天
+                        sleep_day = [0,1,2,3,4,5,6]
+                    elif sleep_repeat == 3:#自定义
+                        sleep_day_tmp = sleep_data.split('-')[3]#-作为分隔符
+                        for i in range(0,7):
+                            if sleep_day_tmp[i] != '0':
+                                sleep_day.append(i)
+                    else:#单次 1
+                       sleep_day=[] 
+                    if sleep_switch != 0:
+                        sleep_data_save.append({"hour":sleep_hour,"min":sleep_min,"day":sleep_day,"enable":sleep_switch})
+        
+        EventMesh.publish("set_storage_config",["sleep_alarm",sleep_data_save])
+        # sleep = EventMesh.publish("get_storage_config","sleep_alarm")
+
+        # EventMesh.debug_log("recv REMIND_CH_SLEEP_SEND:{} sleep ;{}".format(msg,sleep))
+       
+        EventMesh.publish(constants.PROTOCOL.REMIND_CH_SLEEP_SEND)   
+        EventMesh.publish("clear_sleep_alarm")
+
+
+# 可设置闹钟的提醒文字
+# 平台发送:
+# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_REST,时间间隔1,时间间隔2,时间间隔3]
+# 实例:
+# [XT*334588000000156*0026*REMIND_CH_REST,08:10-10:00,12:10-15:00]
+# 终端回复:
+# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_REST]
+# 实例:[XT*334588000000156*000E*REMIND_CH_REST]
+# 说明:时间间隔 【起始-结束】,起始为开始休息,结束为休息结束
+
+class REMIND_CH_REST_ProtoCol(ProtoCol):#该休息了
+    """
+    
+    平台发送:
+    [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_REST,,时间1-开关,时间2-开关,周几]
+    实例:[XT*334588000000156*0008*REMIND_CH_REST,,时间1-开关,时间2-开关,周几]
+    终端回复:
+    [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_REST]
+    """
+    TYPE = "REMIND_CH_REST"
+    
+    def send(self, event, msg):
+        send_data = EventMesh.publish("get_new_pid")+"*%s*000E*REMIND_CH_REST"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        # SZKW*860132060346475*0013*REMIND_CH_REST,4-1
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_data = str(msg_tmp.split('REMIND_CH_REST,')[1])
+        msg_data_new = str(msg_tmp.split('REMIND_CH_REST')[1])
+        print("REMIND_CH_REST",len(msg_data),msg_data)
+
+        reset_data_save = []
+        count = 0
+        for i in str(msg_data_new):
+            # print("i",i)
+            if i == ",":
+                count+=1
+        
+        if count >= 2:
+            count = 2
+
+        for i in range(0,count):#默认是三个时间多了也不保存
+            reset_data = str(msg_data.split(',')[i])
+            print("i",i,reset_data)
+            if len(reset_data) != 0:
+                b = reset_data.find('-')
+                if b != -1:
+                    start_time = reset_data.split('-')[0]#-作为分隔符
+                    end_time = reset_data.split('-')[1]#-作为分隔符
+                    
+                    start_hour = int(start_time.split(":")[0])
+                    start_min = int(start_time.split(":")[1])
+
+                    end_hour = int(end_time.split(":")[0])
+                    end_min = int(end_time.split(":")[1])
+                    
+                    reset_data_save.append({"start_hour":start_hour,"start_min":start_min,"end_hour":end_hour,"end_min":end_min})
+        
+        EventMesh.publish("set_storage_config",["reset_alarm",reset_data_save])
+        # reset = EventMesh.publish("get_storage_config","reset_alarm")
+
+        # EventMesh.debug_log("recv REMIND_CH_REST:{} reset ;{}".format(msg,reset))
+       
+        EventMesh.publish(constants.PROTOCOL.REMIND_CH_REST_SEND)   
+        EventMesh.publish("clear_reset_alarm")
+
+
+
+class WLKEY_ProtoCol(ProtoCol):#白名单开关
+    """
+    白名单开关
+    [XT*YYYYYYYYYYYYYYY*LEN*WLKEY,ONOFF]  ONOFF: 1:开启,0:关闭,2:30秒后自动接听。
+    实例:[XT*334588000000156*0008*WLKEY,1]
+    终端回复
+    [XT*YYYYYYYYYYYYYYY*LEN*WLKEY]
+    实例:[XT*334588000000156*0006*WLKEY]
+    """
+    TYPE = "WLKEY"
+    
+    def send(self, event, msg):
+        send_data = EventMesh.publish("get_new_pid")+"*%s*00006*WLKEY"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_data = msg_tmp.split(',')
+        EventMesh.debug_log("WLKEY_ProtoCol".format(msg_data[1]))
+        EventMesh.publish("set_storage_config",["WLKEY",msg_data[1]])
+        
+
+        EventMesh.publish(constants.PROTOCOL.WLKEY_SEND) 
+# 终端发送:
+# [XT*YYYYYYYYYYYYYYY*LEN*SLEEP_DATA,清醒时间(分钟),浅睡时间(分钟),深睡时间(分钟),日期(年月日)]
+# 实例: [XT*334588000000156*0004*SLEEP_DATA,120,240,360,20221008]
+# 实例表示:上传睡眠数据
+#[XT*334588000000156*0010*SleepReport,2022-02-09,80,2,532,164,164,25,25,25,25,21:45-0-164-155-3,22:00-1-162-155-0,22:15-2-162-155-0]
+class SLEEP_DATA_ProtoCol(ProtoCol):#睡眠时间
+    """
+    白名单开关
+    [XT*YYYYYYYYYYYYYYY*LEN*WLKEY,ONOFF]  ONOFF: 1:开启,0:关闭,2:30秒后自动接听。
+    实例:[XT*334588000000156*0008*WLKEY,1]
+    终端回复
+    [XT*YYYYYYYYYYYYYYY*LEN*WLKEY]
+    实例:[XT*334588000000156*0006*WLKEY]
+    """
+    TYPE = "SleepReport"
+    
+    def send(self, event, msg):
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0000b*SleepReport"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s,%s]"%(str(MD5_SIGN),send_data,msg)
+        EventMesh.debug_log("SLEEP_DATA:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+
+        EventMesh.debug_log("SLEEP_DATA!!!!!!!!!")
+        # msg = msg[1:-1]
+        # msg_tmp = msg.decode('ascii')
+        # msg_data = msg_tmp.split(',')
+        # EventMesh.debug_log("WLKEY_ProtoCol".format(msg_data[1]))
+        # EventMesh.publish("set_storage_config",["WLKEY",msg_data[1]])
+        
+
+        # EventMesh.publish(constants.PROTOCOL.WLKEY_SEND) 
+
+class SLEEPTIME_ProtoCol(ProtoCol):#睡眠时间
+    """
+    """
+    TYPE = "SLEEPTIME"
+    
+    def send(self, event, msg):
+        send_data = EventMesh.publish("get_new_pid")+"*%s*00009*SLEEPTIME"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        EventMesh.debug_log("SLEEPTIME:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        # 实例:[XT*5678901234*0014*SLEEPTIME,23:30-7:30]
+        EventMesh.debug_log("SLEEPTIME!!!!!!!!!")
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_data = str(msg_tmp.split(',')[1])
+        data = {}
+        if len(msg_data) == 0:
+            EventMesh.publish("set_storage_config",["sleep_time",data])
+            pass
+        else:
+            sleep_start = msg_data.split("-")[0]
+            sleep_end = msg_data.split("-")[1]
+            start_hour = int(sleep_start.split(":")[0])
+            start_min = int(sleep_start.split(":")[1])
+
+            end_hour = int(sleep_end.split(":")[0])
+            end_min = int(sleep_end.split(":")[1])
+
+            data = {"start_hour":start_hour,"start_min":start_min,"end_hour":end_hour,"end_min":end_min}
+            # EventMesh.debug_log("SLEEPTIME".format(data))
+            EventMesh.publish("set_storage_config",["sleep_time",data])
+            # sleep_time = EventMesh.publish("get_storage_config","sleep_time")
+            # EventMesh.debug_log("sleep_time:{}".format(sleep_time))
+
+        EventMesh.publish(constants.PROTOCOL.SLEEPTIME_SEND) 
+
+# 平台发送:
+# [XT*YYYYYYYYYYYYYYY*LEN*FACTORY]
+# 实例:[XT*334588000000156*0007*FACTORY]
+# 终端回复:
+# [XT*YYYYYYYYYYYYYYY*LEN*FACTORY]
+# 实例:[XT*334588000000156*0007*FACTORY]
+# 说明:终端恢复出厂设置,里面设置的号码都将清空
+class FACTORY_ProtoCol(ProtoCol):#睡眠时间
+    """
+    实例:[XT*334588000000156*0008*FACTORY]
+    终端回复
+    [XT*YYYYYYYYYYYYYYY*LEN*WLKEY]
+    实例:[XT*334588000000156*0006*FACTORY]
+    """
+    TYPE = "FACTORY"
+    
+    def send(self, event, msg):
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0007*FACTORY"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        EventMesh.debug_log("FACTORY:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+
+        EventMesh.debug_log("FACTORY!!!!!!!!!")
+        # msg = msg[1:-1]
+        # msg_tmp = msg.decode('ascii')
+        # msg_data = msg_tmp.split(',')
+        # EventMesh.debug_log("WLKEY_ProtoCol".format(msg_data[1]))
+        # EventMesh.publish("set_storage_config",["WLKEY",msg_data[1]])
+
+        EventMesh.publish(constants.PROTOCOL.FACTORY_SEND) 
+        EventMesh.publish("app_factory",None)#app恢复出厂
+
+# 平台发送:
+# [3G*YYYYYYYYYY*LEN*RESET]
+# 实例:[3g*5678901234*0005*RESET]
+# 终端回复:
+# [3G*YYYYYYYYYY*LEN*RESET]
+class RESET_ProtoCol(ProtoCol):#重启
+    """
+    实例:[XT*334588000000156*0008*RESET]
+    终端回复
+    [XT*YYYYYYYYYYYYYYY*LEN*RESET]
+    实例:[XT*334588000000156*0006*RESET]
+    """
+    TYPE = "RESET"
+    
+    def send(self, event, msg):
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0005*RESET"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        EventMesh.debug_log("RESET:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+
+        EventMesh.debug_log("RESET!!!!!!!!!")
+        # msg = msg[1:-1]
+        # msg_tmp = msg.decode('ascii')
+        # msg_data = msg_tmp.split(',')
+        # EventMesh.debug_log("WLKEY_ProtoCol".format(msg_data[1]))
+        # EventMesh.publish("set_storage_config",["WLKEY",msg_data[1]])
+
+        EventMesh.publish(constants.PROTOCOL.RESET_SEND) 
+        Power.powerRestart()
+
+# 平台发送:
+# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_SIT,时间间隔(分钟),总开关(0为关,1为开),午间休息时段,晚间休息时段]
+# 午间/晚间休息时段格式为:开始时间(hh:mm)-结束时间(hh:mm)-开关(0为关,1为开),例如 12:00-15:00-1。
+# 久坐默认值为20分钟。
+# 午间和晚间默认值,午间12:00-14:00,晚上20:00-07:00。
+# 实例:
+# [XT*334588000000156*0026*REMIND_CH_SIT,20,0,12:00-15:00-1,20:00-07:00-1]
+# 终端回复:
+# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_SIT]
+# 实例:[XT*334588000000156*000E*REMIND_CH_SIT]
+class REMIND_CH_SIT_ProtoCol(ProtoCol):#久坐提醒
+    """
+    实例:[XT*334588000000156*0008*REMIND_CH_SIT]
+    终端回复
+    [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_SIT]
+    实例:[XT*334588000000156*0006*REMIND_CH_SIT]
+    """
+    TYPE = "REMIND_CH_SIT"
+    
+    def send(self, event, msg):
+        send_data = EventMesh.publish("get_new_pid")+"*%s*000d*REMIND_CH_SIT"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        EventMesh.debug_log("REMIND_CH_SIT:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+
+        EventMesh.debug_log("REMIND_CH_SIT!!!!!!!!!")
+        # msg = msg[1:-1]
+        # msg_tmp = msg.decode('ascii')
+        # msg_data = msg_tmp.split(',')
+        # EventMesh.debug_log("WLKEY_ProtoCol".format(msg_data[1]))
+        # EventMesh.publish("set_storage_config",["WLKEY",msg_data[1]])
+
+        EventMesh.publish(constants.PROTOCOL.REMIND_CH_SIT_SEND) 
+        
+# 平台发送:
+# [XT*YYYYYYYYYYYYYYY*LEN*SCREEN_SHOW,参数内容]
+# 实例:[XT*334588000000156*0016*SCREEN_SHOW,00000000000]
+# 参数内容用 unicode 编码呈现,设备收到后需解码。
+# 解码后的参数内容可能有多个参数,不同参数用逗号分隔,设备自己决定如何在屏幕中显示这些参数。比如 "SCREEN_SHOW,深圳第一中学,三年1班、张三"
+# 终端回复:
+# [XT*YYYYYYYYYYYYYYY*LEN*SCREEN_SHOW]
+# 实例:[XT*334588000000156*000B*SCREEN_SHOW]
+
+class SCREEN_SHOWProtoCol(ProtoCol):
+    """开屏显示"""
+    TYPE = "SCREEN_SHOW"
+    def send(self, event, msg):
+        # [XT*334588000000156*0006*SILENCETIME2]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*000B*SCREEN_SHOW"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        # print("KEYBRD:data:%s"%(data))
+        # print("KEYBRD!!!!!!!!!!!!!",msg)
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event:
+        @param msg: 接收到的下行数据
+        """
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp = msg_tmp.split(',')
+        msg_tmp = msg_tmp[1:]
+        msg_tmp = msg_tmp[0]
+        print("screen_school_data msg",msg)
+
+        j = 0
+        i = 0
+        videobook_old = {}
+        videobook_name_tmp = UnicodeHexStr_To_Utf8Str(msg_tmp)
+        lst = videobook_name_tmp.split(",")
+        print("lst data",lst)
+
+         # 0 1 2 3
+        screen_school_data = ""#学校
+        screen_class_data = ""#班级
+        screen_fullname_data = ""#姓名
+        if len(lst) != 0: 
+            count = len(lst)
+            if count > 3:
+                count = 3
+            for i in range(count):
+                if i == 0:
+                    screen_school_data = lst[0]
+                    EventMesh.publish("set_schoolname", screen_school_data)#
+                elif i == 1:
+                    screen_class_data = lst[1]
+                    EventMesh.publish("set_classname", screen_class_data)#
+                else:
+                    screen_fullname_data= lst[2]
+                    EventMesh.publish("set_fullname", screen_fullname_data)#
+                
+                # EventMesh.publish("update_screen_show")#更新开屏显示
+
+        print("screen_school_data!!!:",screen_school_data,screen_class_data,screen_fullname_data)
+
+        EventMesh.publish(constants.PROTOCOL.SCREEN_SHOW_SEND)  
+
+# #小见平台视频通话
+# # [XT*YYYYYYYYYYYYYYY*LEN*JPREG]
+# # 实例:
+# # [XT*334588000000156*0004*JPREG]
+# # 平台回复:
+# # [XT*设备ID*LEN*JPREG,账号(整型)]
+# # 实例:[XT*334588000000156*0010*JPREG,1087654321]
+class JPREG_ProtoCol(ProtoCol):#登入注册
+    """"""
+    TYPE = "JPREG"
+    def send(self, event, msg):
+        
+        # [XT*334588000000156*0005*WLKEY]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0005*JPREG"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        # print("WLKEY:data:%s"%(data))
+        # print("WLKEY!!!!!!!!!!!!!")
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event:
+        @param msg: 接收到的下行数据
+        """
+        # b'[SZKW*867387060319166*000A*KEYBRD]'
+        print("JPREG!!!!!!!!!!!!!",msg,EventMesh.publish("get_new_pid"))
+        # EventMesh.publish(constants.PROTOCOL.JPREG_SEND)  
+
+# # (声网,佰锐的账号是整型)
+# # [XT*YYYYYYYYYYYYYYY*LEN*MEMBERS]
+# # 实例:[XT*334588000000156*0007*MEMBERS]
+# # 平台回复:[XT*设备ID*LEN*MEMBERS,账号1,昵称1,电话1,账号2,昵称2,电话2.....]
+# # 实例:
+# # [XT*334588000000156*003F*MEMBERS,d3e2f759f9d5af3858f3530,爸爸,13662313580,妈妈,555]
+# # 以上数据部分使用Unicode编码,最终上面示例传到服务端将是:
+
+class MEMBERS_ProtoCol(ProtoCol):#获取账号列表
+    """"""
+    TYPE = "MEMBERS"
+    def send(self, event, msg):
+        
+        # [XT*334588000000156*0005*WLKEY]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0007*MEMBERS"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        print("MEMBERS SEND:data:%s"%(data))
+        # print("WLKEY!!!!!!!!!!!!!")
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event:
+        @param msg: 接收到的下行数据
+        """
+        # b'[SZKW*876226002021444*0048*MEMBERS,0036003900350031003800330032002C563F563FD83CDF410020D83CDF42002C]'
+        print("MEMBERS!!!!!!!!!!!!!",msg,EventMesh.publish("get_new_pid"))
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp = msg_tmp.split(',')
+
+        videobook = {}
+        msg_tmp = msg_tmp[1:]
+        msg_tmp = msg_tmp[0]
+
+        j = 0
+        i = 0
+        videobook_old = {}
+        videobook_name_tmp = UnicodeHexStr_To_Utf8Str(msg_tmp)
+        lst = videobook_name_tmp.split(",")
+        
+        print("msg_tmp:{} phonebook_oldtmp:{} type:{}".format(msg_tmp,videobook_name_tmp,lst))
+        # 0 1 2 3
+        for vediobook_tmp in lst: 
+            
+            if (j % 3) == 0:#账号
+                videobook_old = vediobook_tmp
+            elif (j % 3) == 1:#名称
+                i+=1
+                videobook_name_cont= "{}:{}".format("%03d"%(i),videobook_old)                                      
+                videobook[videobook_name_cont] = vediobook_tmp
+            j+=1
+        print("videobook!!!:{}".format(str(videobook)))
+        # print("phonebook!!!:{}".format(str(phonebook)))
+        with open("/usr/static/storage_file/videobook.json","w",encoding="utf-8") as fd:
+            ujson.dump(videobook,fd)
+            print("创建视频通话账号")
+        
+        EventMesh.publish("set_videobook_list",[1,videobook])
+        # EventMesh.publish("video_updata_list_show")
+        # EventMesh.publish(constants.PROTOCOL.MEMBERS_SEND)  
+
+# # [X*Y*LEN*CALLING,呼叫者id,会议id,通话类型,Token]
+
+# # 设备回复
+# # [X*Y*LEN*CALLING,音视频状态]
+# # 音视频状态:为0表示正常可通讯状态,否则填上用音视频返回的状态码,比如200,如果未获取到返回状态码,则填1
+class CALLING_ProtoCol(ProtoCol):#app发起视频通话
+    """"""
+    TYPE = "CALLING"
+    def send(self, event, msg):
+        
+        # [XT*334588000000156*0005*WLKEY]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0007*CALLING"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s,%d]"%(str(MD5_SIGN),send_data,msg)
+        # print("CALLING:send data:%s"%(data))
+        # print("WLKEY!!!!!!!!!!!!!")
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event:
+        @param msg: 接收到的下行数据
+        """
+        # b'[SZKW*867387060319166*000A*CALLING]'
+        print("CALLING!!!!!!!!!!!!!",msg)
+        if EventMesh.model == "D10":#D10没有视频通话
+            EventMesh.publish(constants.PROTOCOL.CALLING_SEND,1)
+            return
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp_d = msg_tmp.split(',')
+        call_id = msg_tmp_d[1]#id
+        meet_id = msg_tmp_d[2]#会议id
+        call_type = int(msg_tmp_d[3])#会议id# 0音频 1视频
+        tokens_data = msg_tmp_d[4]#tokens
+        EventMesh.publish("set_vedio_call_id", call_id)#
+        EventMesh.publish("set_vedio_meet_id", meet_id)#
+        EventMesh.publish("set_vedio_call_type", call_type)#
+        EventMesh.publish("set_vedio_tokens_data", tokens_data)#
+
+        flag = EventMesh.publish("get_call_state") 
+        fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+        usb_state = EventMesh.publish("get_usb")#
+        video_state = EventMesh.publish("get_video_state")
+        sos_dialing = EventMesh.publish("get_sos_state_out")#正在拨打sos电话
+        if flag != 0 or fall_down != 0 or video_state != 0 or sos_dialing != 0: #电话在打入或者 在充电不允许视频通话
+            EventMesh.publish(constants.PROTOCOL.CALLING_SEND,1)
+        else:
+            EventMesh.publish(constants.PROTOCOL.CALLING_SEND,0)
+            EventMesh.publish("set_video_state", 6)
+            EventMesh.publish("set_dev_app_mode", 2)#
+            EventMesh.publish("close_hr_sop2")#
+            EventMesh.publish("video_call_in_event",call_type)
+
+# # [XT*YYYYYYYYYYYYYYY*LEN*RCALLING,呼叫者id,会议id/声网频道名(没有则留空,但位置保留),音频还是视频(0为音频,1为视频)]
+# # 实例:
+# # [XT*334588000000156*0007*RCALLING,d3e2f759f9d5af3858f3530b,,0]
+# # 终端回复:
+# # [XT*设备ID*LEN*RCALLING]
+# # 实例:[XT*334588000000156*0009*RCALLING]  
+# #   
+class RCALLING_ProtoCol(ProtoCol):#设备拒接接听
+    """"""
+    TYPE = "RCALLING"
+    def send(self, event, msg):
+        
+        # [XT*334588000000156*0005*WLKEY]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0008*RCALLING"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s,%s,%s,%d]"%(str(MD5_SIGN),send_data,msg[0],msg[1],msg[2])
+        # print("RCALLING:send data:%s"%(data))
+        # print("WLKEY!!!!!!!!!!!!!")
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+        # print("RCALLING:send data end:%s"%(data))
+
+    def recv(self, event, msg):
+        """
+        @param event:
+        @param msg: 接收到的下行数据
+        """
+        # b'[SZKW*867387060319166*000A*RCALLING]'
+        print("RCALLING!!!!!!!!!!!!!")
+
+class AGTALK_ProtoCol(ProtoCol):#设备发起视频通话与app接听视频通话
+    """"""
+    TYPE = "AGTALK"
+    def send(self, event, msg):
+        
+        # [XT*334588000000156*0005*WLKEY]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0006*AGTALK"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s,%d,%s]"%(str(MD5_SIGN),send_data,msg[0],msg[1])
+        print("AGTALK:send data:%s"%(data))
+        # print("WLKEY!!!!!!!!!!!!!")
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event:
+        @param msg: 接收到的下行数据
+        """
+        # b'[SZKW*876226002021444*007B*AGTALK,0,01lqlyqzzQHpfwv5g7jFVC2H6Ha2tHFpMlfSm5sd2uo7o55JEcc=OVxewje6MjP0NgEODwsLDwkJCwkLCA0NDQ==,8762260020214441701226895]'
+        # print("AGTALK!!!!!!!!!!!!!")
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp_d = msg_tmp.split(',')
+        call_state = int(msg_tmp_d[1])#返回是否可以视频通话
+        if call_state == 0:#可正常通话
+            if EventMesh.publish("get_video_state") != 0: 
+                # print("AGTALK!!!!!!!!!!!!!answer")
+                tokens_data = msg_tmp_d[2]#会议id
+                meet_id = msg_tmp_d[3]#会议id
+                EventMesh.publish("set_vedio_meet_id", meet_id)#
+                EventMesh.publish("set_vedio_tokens_data", tokens_data)#
+                EventMesh.publish("open_vedio_infor")
+
+        else:
+            #不能视频通话
+            tokens_data = msg_tmp_d[2]#token数据
+            meet_id = msg_tmp_d[3]#会议id
+            EventMesh.publish("set_vedio_meet_id", meet_id)#
+            EventMesh.publish("set_vedio_tokens_data", tokens_data)#
+            EventMesh.publish("video_newwork_reject_cb",None)#挂断视频通话
+            # print("AGTALK no!!!!!!!!!!!!!")
+
+        print("AGTALK!!!!!!!!!!!!!")
+
+
+class RTALK_ProtoCol(ProtoCol):#app拒接视频通话
+    """"""
+    TYPE = "RTALK"
+    def send(self, event, msg):
+        
+        # [XT*334588000000156*0005*WLKEY]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0005*RTALK"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s,%d,%s]"%(str(MD5_SIGN),send_data,msg[0],msg[1])
+        # print("AGTALK:send data:%s"%(data))
+        # print("WLKEY!!!!!!!!!!!!!")
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event:
+        @param msg: 接收到的下行数据
+        """
+        # b'[SZKW*867387060319166*000A*RTALK]'
+        print("RTALK!!!!!!!!!!!!!")  
+        # [SZKW*876226002021444*003A*RTALK,3ef20e64f3abb84b27f7d764,8762260020214441701226522,1]'
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp_d = msg_tmp.split(',')
+        EventMesh.publish("app_rtalk_cb",1)
+
+        
+
+
+class ProtoColResolver(object):
+    def __init__(self):
+        self.protocol_list = []
+
+    def add_support(self, prot):
+        self.protocol_list.append(prot)
+        prot.initialization()
+
+    def handler(self, data):
+        # 这里接收数据
+        
+        EventMesh.debug_log("handler -> {}".format(data))
+        # if data.startswith('Init;'):
+        #     data = data[5:]
+        #     EventMesh.publish(constants.EVENT.SET_KEY, {"value": ujson.loads(data)['KEY']})
+            
+        # elif data.startswith("Update;"):
+        #     data = data[7:]
+        #     EventMesh.publish(constants.PROTOCOL.H04_RECV, data)
+        try:
+            if len(data) > 0: 
+                #EventMesh.debug_log("handler:{}".format(len(data)))
+                data_tmp = data.decode('ascii')
+                data_tmp = data_tmp.split(']')[0] #去掉]
+                ProtoCol_type = data_tmp.split('*')[3] #拿到协议标识
+                ProtoCol_type = ProtoCol_type.split(',')[0]
+                ProtoCol_type = "%s_RECV"%(ProtoCol_type)
+                # EventMesh.debug_log("ProtoColResolver:ProtoCol_type:%s\r\ndata:%s"%(ProtoCol_type,data))
+                EventMesh.publish(ProtoCol_type, data) #返回协议read
+        except Exception as e:
+            EventMesh.debug_log("handler:ERROR:")
+            usys.print_exception(e)
+            EventMesh.debug_log("handler:error data:{}".format(len(data)))
diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/sleep_test.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/sleep_test.py
new file mode 100644 (file)
index 0000000..8f4750c
--- /dev/null
@@ -0,0 +1,215 @@
+
+import utime
+import audio
+from machine import Pin
+import osTimer
+import _thread
+from queue import Queue
+import uwebsocket
+import usys
+import EventMesh
+import constants
+import ujson
+
+
+import gc
+AI_audio_queue = Queue(100)
+aud = audio.Audio(0)
+aud.set_pa(Pin.GPIO29)
+aud.setVolume(11)
+AI_TTS_str = ""
+AI_client_tts = None
+AI_client_tts_1 = None
+_4S_timer = None
+def AI_client_tts_recv(cli,fd):
+    global AI_TTS_str,AI_client_tts,_4S_timer,AI_client_tts_1
+    while True:
+        try:
+            # 死循环接收数据
+            
+            recv_data = cli.recv()
+            if not recv_data:
+                # 服务器关闭连接或客户端关闭连接
+                print("AI_client_tts_recv close!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")
+                print("AI_client_tts_recv close!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")
+                break
+            try:
+                # print("AI_client_tts_recv :{}".format(len(recv_data)))
+                #结束标志{"header":{"event":"EndSynthesis","msg":"success","status":20000000,"task_id":"ffd727e620000803280c5a6498d0e321"}}
+                if isinstance(recv_data, str):
+                    #print("AI_client_tts_recv:str recv_data:{}".format(recv_data))
+                    if recv_data.find('\"state\":\"Listening\"') != -1:
+                        AI_client_VC_RequestToRespond()
+                    if recv_data.find('\"event\":\"RespondingEnded\"') != -1:
+                    
+                        print("EndSynthesis!!!!!!!!!!!!!!!!!\r\n")
+                        print("EndSynthesis!!!!!!!!!!!!!!!!!!\r\n")
+                        #cli.close()
+                        fd.close()
+                        _4S_timer.stop()
+                        # AI_client_tts.close()
+                        # try:
+                        #     AI_client_tts_1._close()
+                        # except Exception as e:
+                        #     usys.print_exception(e)
+                        break
+                else:
+                    fd.write(recv_data)
+                    AI_audio_queue.put([recv_data,""])
+                #utime.sleep_ms(1000)
+            except Exception as e:
+                usys.print_exception(e)
+                
+        except Exception as e:
+                usys.print_exception(e)
+                break
+def _4S_timer_cb(self,*argc):
+    print("_4S_timer_cb!!!!!!!!!!!!!!!!!!!!!")
+    global AI_TTS_str,AI_client_tts,_4S_timer,AI_client_tts_1
+    try:
+        AI_client_VC_ping()
+    except Exception as e:
+        usys.print_exception(e)
+        _4S_timer.stop()
+def websocket_connect_tts(fd_neme,tts_str):
+    global AI_TTS_str,AI_client_tts,_4S_timer,AI_client_tts_1
+    _4S_timer = osTimer()
+    _4S_timer.start(4000,1,_4S_timer_cb)
+    
+    print("websocket_connect_tts {},{}!!!!!!!!!".format(fd_neme,tts_str))
+    fd=open(fd_neme,'w')
+    req_str = ""
+    AI_TTS_str = tts_str
+    lang = "&lang=zh-cn"#普通话测试环境
+      
+    platform = "&platform=huoshan&is_bot=1"
+
+    req_str = "is_auth=0{}{}".format(platform,lang)
+    try:
+       
+        AI_client_tts = uwebsocket.Client.connect('ws://118.145.158.207:22082/voice-chat/ws?{}'.format(req_str), debug=False)
+        AI_client_tts_1 = uwebsocket.Client.connect('ws://118.145.158.207:22082/voice-chat/ws?{}'.format(req_str), debug=False)
+    except Exception as e: #网络连接异常
+        usys.print_exception(e)
+        print("websocket_connect_tts ERROR:{}\r\n".format(e))
+        
+    print("websocket_connect_tts:AI_client_tts {}\r\n".format(AI_client_tts))
+    # 线程接收数据
+
+    #_thread.stack_size(20*1024)
+    AI_client_tts_recv_id = _thread.start_new_thread(AI_client_tts_recv, (AI_client_tts,fd))
+    AI_audio_queue_thread_id = _thread.start_new_thread(AI_audio_queue_thread, ())
+    #_thread.stack_size(8*1024)
+    #开始会话
+    json_data = \
+    {
+        "header": {
+            "trace_id": "0a75ac012af172eb808782150509ee67",
+            "event": "Start"
+            }, 
+        "payload": {
+            "simple_response": True, 
+            "out_format": "mp3", 
+            "custom_variables": {
+                "bot_name": "柒妹妹"
+                }, 
+            "in_format": "pcm", 
+            "space_time": 0, 
+            "dialog_id": "", 
+            "in_sample_rate": 16000, 
+            "device_id": "860132060359338", 
+            "volume": "100", 
+            "sample_rate": 16000, 
+            "user_agent": "python", 
+            "voice": "ICL_zh_female_huoponvhai_tob", 
+            "voice_detection": "enabled"
+            }
+    }
+    AI_client_tts.send(ujson.dumps(json_data))
+    AI_client_tts_1.send(ujson.dumps(json_data))
+   # print("AI_client_tts.send:{}".format(ujson.dumps(json_data)))
+def AI_client_VC_ping():
+    global AI_TTS_str,AI_client_tts,_4S_timer    
+    #AI_client_tts.send("ping")
+    AI_client_tts.send("aaa")
+    print("AI_client_VC_ping")
+
+def AI_client_VC_RequestToRespond():
+        global AI_TTS_str,AI_client_tts
+        json_data = \
+        {
+            "header":{
+                "trace_id":"123456",
+                "event":"RequestToRespond"
+                },
+            "payload":{
+                "dialog_id":"123456",
+                "type":"transcript",#prompt是跳过asr,transcript是跳过asr和大模型
+                "text":""
+                }
+        }
+
+        print("AI_client_VC_RequestToRespond!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        # if VC_state == VC_State_RequestToRespond:
+        #     print("AI_client_VC_RequestToRespond 重复 tts_str:{}\nasr_str:{}".format(AI_TTS_str,AI_ASR_str))
+
+        if AI_TTS_str != "":
+            json_data["payload"]["text"] = AI_TTS_str
+            json_data["payload"]["type"] = "transcript"
+            AI_TTS_str = ""
+        AI_client_tts.send(ujson.dumps(json_data))
+            #AI_ASR_str = ""
+        # utime.sleep_ms(1)
+# 音频队列        
+def AI_audio_queue_thread():
+    while True:
+        try:
+            if AI_audio_queue.empty() :
+                # if count_t%200 == 0:
+                #     print("AI_send_data_queue.empty")
+                utime.sleep_ms(5)
+            else:
+                #print("AI_audio_queue_thread")
+
+                data = AI_audio_queue.get()
+                
+                #AI_client_tts_data_len=len(data)
+                print("audio_queue:len:{} \r\n".format(len(data[0]),data[1]))
+                if len(data[0]) > 1:
+                    try:
+
+                        tmp= aud.playStream(3, data[0])#播放音频流
+
+                        print("出:{}!!!".format(len(data[0])))
+                        mem = gc.mem_free()
+                        print('1剩余内存RAM:{} KB'.format(mem / 1024))
+                    except Exception as e:
+                        print("AI_audio_queue_thread:ERROR:")
+                        usys.print_exception(e)
+
+                    utime.sleep_ms(2)
+        except Exception as e:
+            print("AI_audio_queue_thread:ERROR:")
+            usys.print_exception(e)
+
+websocket_connect_tts("/usr/didianguanji.mp3","当前使用人数较多,请稍候重试。")
+# for i in range(10):
+#     websocket_connect_tts("/usr/R_READ_TIME_{}.mp3".format(i),"{}。".format(i))
+#     utime.sleep_ms(4000)
+
+# data = "OPQRSTUVWXYZ"
+# #data = "AB"
+# for i in data:
+#     websocket_connect_tts("/usr/R_READ_TIME_{}.mp3".format(i),"-{}。".format(i))
+#     utime.sleep_ms(4000)
+
+# try:
+#     att = None
+#     att.connect()
+# except Exception as e:
+#             str_tmp = str(e)
+#             print("str_tmp:{}".format(str_tmp))
+#             if str_tmp.find("connect") != -1:
+#                 print("find connect!!!!")
+#             print("AI_audio_queue_thread:ERROR:{}".format(e))
+#             usys.print_exception(e)
\ No newline at end of file
diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/tesr.mp3 b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/tesr.mp3
new file mode 100644 (file)
index 0000000..9aad4b0
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/tesr.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/tiktok_rtc_demo.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/tiktok_rtc_demo.py
new file mode 100644 (file)
index 0000000..4d97ab3
--- /dev/null
@@ -0,0 +1,69 @@
+import dataCall
+import utime as time
+import TiktokRTC
+import atcmd
+import _thread
+
+from machine import Pin
+
+PA = Pin.GPIO29
+
+def show_freemem():
+    while True:
+        print("Remaining memory: ",_thread.get_heap_size())
+        print("\n")
+        time.sleep(50)
+
+
+def enable_pid2():
+    resp = bytearray(50)
+    atcmd.sendSync('AT+qicsgp=2,1,3gnet,"","",0\r\n',resp,'',20)
+    atcmd.sendSync('at+cgact=1,2\r\n',resp,'',20)
+
+def ai_callback(args):
+    global GPIO39
+    event = args[0]
+    msg = args[1]
+    if event == 1:
+        print('TIKTOK_RTC_EVENT_START')
+        GPIO39.write(1)
+    elif event == 2:
+        print('TIKTOK_RTC_EVENT_STOP')
+        GPIO39.write(0)
+    elif event == 3:
+        print('TIKTOK_RTC_EVENT_TTS_TEXT {}'.format(msg))
+        #call.stopAudioService()
+    elif event == 4:
+        print('TIKTOK_RTC_EVENT_ASR_TEXT {}'.format(msg))
+        #call.stopAudioService()
+    elif event == 5:
+        print('TIKTOK_RTC_EVENT_ERROR {}'.format(msg))
+    else:
+        print('TIKTOK_RTC_EVENT UNKNOWN {}'.format(event))
+
+while True:
+    lte = dataCall.getInfo(1, 0)
+    if lte[2][0] == 1:
+        print('lte network normal')
+        break
+    print('wait lte network normal...')
+    time.sleep(3)
+
+_thread.start_new_thread(show_freemem, ())
+
+enable_pid2()
+
+tiktok = TiktokRTC(3000000, ai_callback)
+
+GPIO39 = Pin(PA, Pin.OUT, Pin.PULL_DISABLE, 0)
+time.sleep(2)
+tiktok.config(volume=11)
+print('volume: {}'.format(tiktok.config('volume')))
+tiktok.active(True)
+# time.sleep(40)
+# print("tiktok.active(False)")
+# tiktok.active(False)
+# time.sleep(2)
+# print("tiktok.active(True1)")
+# tiktok.active(True)
+# print("tiktok.active(True2)")
\ No newline at end of file
diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/tts_tesr.mp3 b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/tts_tesr.mp3
new file mode 100644 (file)
index 0000000..0be5a24
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/tts_tesr.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/tts_tesr_01.wav b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/tts_tesr_01.wav
new file mode 100644 (file)
index 0000000..3213143
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/tts_tesr_01.wav differ
diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/ui.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/ui.py
new file mode 100644 (file)
index 0000000..1ed017e
--- /dev/null
@@ -0,0 +1,351 @@
+import utime
+import osTimer
+import EventMesh
+from machine import Timer
+import voiceCall
+import osTimer
+import constants
+from misc import Power
+import pm
+import ujson
+import audio
+import ql_fs
+import audio
+import sms
+from machine import Pin
+from misc import PWM
+import uos
+import gc
+import _thread
+from queue import Queue
+from machine import RTC
+import usys
+def audio_cb(event):
+    if event == 0:
+        EventMesh.publish("set_audio_state", 1)
+        EventMesh.debug_log('audio-play start.') 
+    elif event == 7:
+        EventMesh.publish("set_audio_state", 0)
+        EventMesh.debug_log('audio-play finish.')
+CALL_LOG_MAX = 50
+aud = audio.Audio(0)
+aud.setCallback(audio_cb)
+
+def msg_cb(args):
+    index = args[1]
+    storage = args[2]
+    # EventMesh.debug_log("index:{}".format(index))
+    sms_data = sms.getSaveLoc()
+    sms_max = sms_data[0][2]
+    if index != -1:
+        tmp = sms.searchTextMsg(index)
+        detail = tmp[1]#内容
+        # EventMesh.debug_log("msg_cb:detail {}".format,detail)
+
+        if  detail.find("SETIP:") != -1:#寻找是否有这个字符串
+            tmp_test = detail.split("SETIP:")[1]
+            if  tmp_test.find(":") != -1:
+                new_ip = tmp_test.split(':')[0]
+                # EventMesh.debug_log("tmp_test:{} new_ip:{}".format(tmp_test,new_ip))
+                new_com = tmp_test.split(':')[1]
+                # new_md5 = detail.split(':')[3]
+                if len(new_ip) > 0 and len(new_com) > 0:
+                    EventMesh.publish("set_new_ip_com", [new_ip,new_com,tmp[0]])#
+                    # EventMesh.publish("set_new_ip_com", [new_ip,new_com,new_md5])#设置关机时间
+        if detail.find("ts#") != -1:
+            EventMesh.publish("send_devinfo_event", tmp[0])#删除短信
+            pass
+        if detail.find("SETWHITEPHB:1") != -1:
+            EventMesh.publish("set_storage_config",["WLKEY","2"])#打开自动接听
+            sms.sendPduMsg(tmp[0], 'set ok', 'UCS2')
+            pass
+        if detail.find("SETWHITEPHB:0") != -1:
+            EventMesh.publish("set_storage_config",["WLKEY","0"])#关闭自动接听
+            sms.sendPduMsg(tmp[0], 'set ok', 'UCS2')
+            pass
+        if detail.find("factory#") != -1:#恢复出厂设置
+            EventMesh.publish("app_factory",tmp[0])#app恢复出厂
+        
+        if detail.find("reset#") != -1:#重启
+            EventMesh.publish("app_restart",tmp[0])#
+
+        if detail.find("fota:http://u-oss.thisiot.com/test/") != -1:#固件升级
+            EventMesh.publish("firware_download",tmp[0])#
+        
+    if index >= sms_max-1:#删除短信
+        EventMesh.publish("delete_sms_event")#删除短信
+sms.setCallback(msg_cb)
+
+import audio
+from machine import Pin
+
+
+
+#from usr.ui_WatchFaceScreen import WatchFaceScreen
+class UI(object):
+    def __init__(self):
+        #self.screen = WatchFaceScreen()
+        #self.screen_old = self.screen
+        self.ui_queue = Queue()
+        _thread.stack_size(13*1024)
+        _thread.start_new_thread(self.ui_queue_thread, ())
+        _thread.stack_size(8*1024)
+        self.screen = None
+        self.screen_old = None
+        self.screen_prev = None
+        self.screen_list = []
+        #self.lv = lv
+        self.system_sleep_timer = osTimer()
+        self.system_sleep_timer_count = 0
+        self.sleep_flag = 1
+        self.level = 6
+        self.read_data = {}
+        self.aud = audio.Audio(0)
+        self.aud.set_pa(Pin.GPIO29)
+        self.aud.setVolume(11)
+        # self.level = EventMesh.publish("get_brightness_level")
+        self.read_data = EventMesh.publish("get_storage_data")
+        self.main_flag = 0
+        self.main_id = 0
+        self.set_interrup_flag = 0
+        self.UI_high_priority_flag = 0 #如果=1,则当前ui不被打断
+        # EventMesh.debug_log("self.read_data:{} self.level:{}".format(self.read_data,self.level))
+        # check = ql_fs.path_exists("/usr/static/storage_file/config.json")
+        # if check == True:
+        #     with open("/usr/static/storage_file/config.json","r") as fd:
+        #         self.read_data = ujson.load(fd)
+        #         if self.read_data != {}:
+        #             b = str("brightness_level") in self.read_data.keys()
+        #             if b == True:
+        #                 self.level = self.read_data["brightness_level"]
+        #             else:
+        #                 self.level = 6
+        #                 self.read_data["brightness_level"] = self.level
+        #                 EventMesh.publish("set_storage_data", self.read_data)
+        #                 with open("/usr/static/storage_file/config.json","w",encoding="utf-8") as fd:
+        #                     ujson.dump(self.read_data,fd)
+        # else:
+        #     self.level = 6 #默认是6级别
+        
+        # if self.level == None:
+        #     self.level = 6
+        # self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS, self.level, 10)
+        # self.PWM_backlight.open()
+        self.sleep_lock = 0
+
+    def post_processor_after_instantiation(self):
+        # EventMesh.subscribe("load_screen", self.load_screen_cb)
+
+        # EventMesh.subscribe("btn1_press", self.btn_press)
+        # EventMesh.subscribe("btn8_press", self.btn_press)
+        # EventMesh.subscribe("btn8_long_press", self.btn_press)
+
+        # EventMesh.subscribe("btn1_release", self.btn_release)
+        # EventMesh.subscribe("btn8_release", self.btn_release)
+
+        # EventMesh.subscribe("done_left_to_right", self.ui_press)
+        # EventMesh.subscribe("done_right_to_left", self.ui_press)
+        # EventMesh.subscribe("done_bottom_to_top", self.ui_press)
+        # EventMesh.subscribe("done_top_to_bottom", self.ui_press)
+        # EventMesh.subscribe("done_return", self.ui_press)
+        # EventMesh.subscribe("done_click", self.ui_press)
+        # EventMesh.subscribe("done_error", self.ui_press)
+        # EventMesh.subscribe("done_press", self.ui_press)
+        # EventMesh.subscribe("call_in", self.publish_call_in)
+
+        # EventMesh.subscribe("get_lcd_state", self.get_lcd_state)
+        # EventMesh.subscribe("set_lcd_state", self.set_lcd_state)
+        
+        #EventMesh.subscribe("call_in", self.publish_call_in)
+        #EventMesh.subscribe("set_bg_img", self.set_bg_img)
+
+        EventMesh.subscribe(constants.EVENT.SYSTEM_SLEEP, self.system_sleep)
+        EventMesh.subscribe(constants.EVENT.SYSTEM_UP, self.system_up)
+        EventMesh.subscribe("system_sleep_rest", self.system_sleep_rest)
+        # EventMesh.subscribe("set_UI_high_priority", self.set_UI_high_priority)
+        # EventMesh.subscribe("get_UI_high_priority", self.get_UI_high_priority)
+
+        # EventMesh.subscribe("set_interrup_incall", self.set_interrup_incall)
+        # EventMesh.subscribe("get_interrup_incall", self.get_interrup_incall)
+        # EventMesh.subscribe("get_screen_NAME",self.get_screen_NAME)
+        EventMesh.subscribe("publish_message_event_ui",self.publish_message_event_ui)
+        # EventMesh.subscribe("return_prev_screen",self.return_prev_screen)
+
+        self.system_sleep_timer.start(500, 1, self.system_sleep_timer_cb)
+
+    def publish_message_event_ui(self,event,msg):
+        self.ui_queue.put(msg)
+
+    #ui的消息队列处理,防止内存越界 格式:{函数名,数据}
+    def ui_queue_thread(self):
+        while True:
+            data = self.ui_queue.get()
+            #EventMesh.debug_log("ui_queue_thread:data = {}".format(data))
+            if data != None:
+                try:
+                    data["func"](data["data"])
+                except Exception as e:
+                    usys.print_exception(e)
+                    EventMesh.debug_log("ui_queue_thread:ERROR:{}".format(e))
+            # for scr in self.screen_list:
+            #     if scr.handle_message_event(data) == 1 :
+            #         break
+    def return_prev_screen(self, event, msg):
+        if self.screen_prev != None:
+            EventMesh.publish("load_screen", {"screen": self.screen_prev.NAME})
+
+    def set_interrup_incall(self, event, msg):
+        self.set_interrup_flag = msg
+        
+    def get_interrup_incall(self, event, msg):
+        return self.set_interrup_flag
+    
+    def set_UI_high_priority(self, event, msg):
+        self.UI_high_priority_flag = msg
+
+    def get_UI_high_priority(self, event, msg):
+        return self.UI_high_priority_flag
+
+    def get_lcd_state(self, event, key):
+        return self.sleep_flag
+    
+    def set_lcd_state(self, event, key):
+        EventMesh.debug_log("key_:{}".format(key))
+        self.sleep_flag = key
+    
+    def system_sleep_rest(self, event, key):
+        #EventMesh.debug_log("system_sleep_rest!!!!!")
+        self.system_sleep_timeout_rest()
+
+    
+
+    def __lcd_on(self):
+        self.system_sleep_timeout_rest()
+        if self.sleep_flag == 0 :
+            EventMesh.debug_log("__lcd_on")
+            if self.sleep_lock == 1:
+                EventMesh.debug_log("__lcd_on:sleep_lock:error!")
+            self.sleep_lock = 1
+            self.sleep_flag = 1
+            
+            
+            #lcd_ctrl.write(1)
+            #utime.sleep(10)
+            
+            self.system_sleep_timer.start(500, 1, self.system_sleep_timer_cb)
+            EventMesh.publish("set_lcd_state",self.sleep_flag)
+           
+            #lv.autoSleep(0)
+            pm.autosleep(0)
+            pm.sclkEx_set(0, 1, 5)
+            
+            
+           
+            self.sleep_lock = 0
+            
+
+    def __lcd_off(self):
+        
+        if self.sleep_flag == 1 :
+            EventMesh.debug_log("__lcd_off")
+            if self.sleep_lock == 1:
+                EventMesh.debug_log("__lcd_on:sleep_lock:error!")
+            self.sleep_lock = 1
+            self.sleep_flag = 0
+           
+            #lcd_ctrl.write(0)
+            #
+            #lv.autoSleep(1)
+            pm.autosleep(1)
+            pm.sclkEx_set(1, 1, 5)
+            #utime.sleep_ms(2)
+           
+            #utime.sleep_ms(80)
+            #EventMesh.publish("set_lcd_state",self.sleep_flag)
+            self.sleep_lock = 0
+           
+            self.system_sleep_timer.stop()
+            EventMesh.publish("Hsensor_set_sleep") #让系统更快休眠
+
+    def system_sleep(self, event, msg) :
+        self.__lcd_off()
+
+    def system_up(self, event, msg):
+        self.__lcd_on()
+
+    def system_sleep_timer_cb(self, *args):
+        #EventMesh.debug_log("system_sleep_timer_count:{}".format(self.system_sleep_timer_count))
+        time = EventMesh.publish("get_brightness_time")
+        if time == None:
+            time = 20
+        self.system_sleep_timer_count += 1
+        if self.system_sleep_timer_count >= time :
+            self.system_sleep_timer_count = 0
+            self.__lcd_off()
+
+    def system_sleep_timeout_rest(self) :
+        #EventMesh.debug_log("system_sleep_timeout_rest")
+        self.system_sleep_timer_count = 0
+
+    def start(self):
+        #self.post_processor_after_instantiation()
+        pass
+
+    def add_screen(self, screen):
+        self.screen_list.append(screen)
+        return self
+    
+    def get_screen_NAME(self, event, msg):
+        return 0
+    
+    def load_screen_cb(self, topic, msg):
+        EventMesh.publish("publish_message_event_ui",{"func":self.load_screen,"data":msg})  
+
+    def load_screen(self, msg):
+        EventMesh.debug_log("msg1={}".format(msg))
+        if self.UI_high_priority_flag == 1:#电话界面屏蔽其他界面
+            return
+        if self.screen :
+            if self.screen.NAME == msg["screen"]:
+                return
+        for scr in self.screen_list:
+            if scr.NAME == msg["screen"]:
+                # 每次屏幕切换开始息屏倒计时
+                
+                if scr.NAME == 'main_menu':
+                    self.main_flag = 1
+                else :
+                    self.main_flag = 0
+                mem = gc.mem_free()
+                EventMesh.debug_log('1剩余内存RAM:{} KB'.format(mem / 1024))
+    
+                self.screen = scr
+                
+
+                if self.screen_old != None :
+                    self.screen_old.Close() #先关闭上一次界面
+                    # self.lv.img.cache_invalidate_src(None) #清img cache
+                    # self.lv.img.cache_set_size(16) #开img cache
+                    if self.screen_old.meta_type != "popup": #不是弹窗,保存上一个界面,用来返回
+                        self.screen_prev = self.screen_old #
+                self.screen_old = self.screen
+                if msg.get("meta"):
+                    self.screen.meta_info = msg.get("meta")
+                EventMesh.debug_log("load_screen:post_processor_before_initialization")
+                self.screen.post_processor_before_initialization()
+                EventMesh.debug_log("load_screen:initialization")
+                # self.screen.initialization()
+                
+                EventMesh.debug_log("load_screen.load()")
+                # self.screen.load()
+                # self.lv.scr_load(self.screen.get_meta())
+                
+                self.screen.post_processor_after_initialization()
+                # self.__lcd_on()
+                mem = gc.mem_free()
+                EventMesh.debug_log('2剩余内存RAM:{} KB'.format(mem / 1024))
+
+                
+
+
+
diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/usr/R_READ_TIME_AB.mp3 b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/usr/R_READ_TIME_AB.mp3
new file mode 100644 (file)
index 0000000..a82319c
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/usr/R_READ_TIME_AB.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/usr/ai_VC.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/usr/ai_VC.py
new file mode 100644 (file)
index 0000000..4534877
--- /dev/null
@@ -0,0 +1,2175 @@
+from common import Abstract, LogAdapter
+import EventMesh
+import uwebsocket
+import usys
+import gc
+import urandom
+import uhashlib
+import ubinascii
+import ujson
+import osTimer
+import _thread
+from queue import Queue
+import utime
+import audio
+import uos
+from machine import Pin
+from machine import ExtInt
+from machine import WDT
+import modem
+import sim
+import net
+import base64
+import ucryptolib
+import urandom as random
+import request
+import ql_fs
+from misc import Power,USB,PowerKey
+import ntptime
+import machine
+class AI_led(Abstract):
+    def __init__(self):
+        self.led_red = Pin(Pin.GPIO36, Pin.OUT, Pin.PULL_PD, 0)
+        self.led_green = Pin(Pin.GPIO21, Pin.OUT, Pin.PULL_PD, 1)
+        self.led_white = Pin(Pin.GPIO19, Pin.OUT, Pin.PULL_PD, 1)
+        EventMesh.subscribe("open_led_red",self.open_led_red)
+        EventMesh.subscribe("open_led_white",self.open_led_white)
+        EventMesh.subscribe("open_led_green",self.open_led_green)
+        EventMesh.subscribe("open_led_all",self.open_led_all)
+        EventMesh.subscribe("close_led",self.close_led)
+        EventMesh.publish("open_led_red")
+    def open_led_red(self,event,msg):
+        print("open_led_red")
+        #self.led_red.write(0)
+        self.led_white.write(0)
+        self.led_green.write(0)
+        self.led_red.write(1)
+
+    def open_led_white(self,event,msg):
+        print("open_led_white")
+        self.led_red.write(0)
+        #self.led_white.write(0)
+        self.led_green.write(0)
+        self.led_white.write(1)
+
+    def open_led_green(self,event,msg):
+        print("open_led_green")
+        self.led_red.write(0)
+        self.led_white.write(0)
+        #self.led_green.write(0)
+        self.led_green.write(1)
+
+    def open_led_all(self,event,msg):
+        print("open_led_all")
+        #self.led_red.write(0)
+        self.led_white.write(1)
+        self.led_green.write(1)
+        self.led_red.write(1)
+
+    def close_led(self,event,msg):
+        print("close_led")
+        self.led_red.write(0)
+        self.led_white.write(0)
+        self.led_green.write(0)
+audio_buf = ['dianliangshengyu10', 'dianliangshengyu100', 'dianliangshengyu20', 'dianliangshengyu40', 'dianliangshengyu60', 'dianliangshengyu80', 'dianliangshengyu90', 'IMEIhao', 'jianquancuowu', 'key_prompt', 'liuliangtishi', 'Low_power_warning', 'peizhichenggong', 'qiehuanchenggong', 'R_CHARGE_FULL', 'R_CHARGE_IN', 'R_CHARGE_OUT', 'R_POWER_OFF_1', 'R_READ_TIME_0', 'R_READ_TIME_1', 'R_READ_TIME_2', 'R_READ_TIME_3', 'R_READ_TIME_4', 'R_READ_TIME_5', 'R_READ_TIME_6', 'R_READ_TIME_7', 'R_READ_TIME_8', 'R_READ_TIME_9', 'R_SIM_FAILE', 'xianyikaiji', 'xinhaoruo1', 'xinhaoruo2', 'yinliangyizuida', 'yinliangyizuixiao', 'zhengzaiguanji']
+
+class AI_dev(Abstract):
+    # AI
+    def __init__(self):
+        self.VBATT_tab = {"charge_full":4300,100 :4250 ,  90:3994 , 80:3883, 60: 3707, 40:3604, 20:3537,  10:3486,}
+        self.KeyAI_status = 0
+        self.KeyAI_timer_count = 0
+        self.KeyAI_long_press = 0
+        self.KeyAI_press = 0
+        self.KeyAI_timer = osTimer()
+        #self.extint_AI = ExtInt(ExtInt.GPIO19,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)
+        self.extint_AI = ExtInt(ExtInt.GPIO22,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)
+        self.extint_AI.enable()
+        self.pwk_key_status = 0
+        self.pwk_key_timer_count = 0
+        self.pwk_key_long_press = 0
+        self.pwk_key_press = 0
+        self.pwk_key_timer = osTimer()
+        #self.pwk_key = ExtInt(ExtInt.GPIO26, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_DISABLE, self.pwk_extint_cb)
+        self.pwk_key = ExtInt(ExtInt.GPIO41, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.pwk_extint_cb)
+        self.pwk_key.enable() 
+        self.btnInfo_queue = Queue()
+        _thread.stack_size(10*1024)
+        _thread.start_new_thread(self.btnInfo_queue_thread, ())
+        _thread.stack_size(8*1024)
+        EventMesh.subscribe("publish_AI_btnInfo",self.publish_AI_btnInfo)
+        EventMesh.subscribe("get_battery",self.get_battery)
+        EventMesh.subscribe("audio_montage_play",self.audio_montage_play)
+        EventMesh.subscribe("paly_iccid_imei",self.paly_iccid_imei)
+        EventMesh.subscribe("paly_device_res_error",self.paly_device_res_error)
+        
+        self.wdt = WDT(30) #开启看门狗
+        # self.wdt_timer = osTimer()
+        # self.wdt_timer.start(10000, 1, self.wdt_timer_cb)
+        self.pk = PowerKey()
+        self.pk.powerKeyEventRegister(self.powerKey_callback)
+        self.usb = USB()
+        self.usb.setCallback(self.usb_event_cb)
+        self.usb_status = self.usb.getStatus()
+        self.usb_charge_flag = 0 
+        self.AI_dev_timer = osTimer()
+        self.AI_dev_timer.start(10000, 1, self.AI_dev_timer_cb)
+        self.aud = audio.Audio(0)
+        self.VC_TTS_volume =  EventMesh.publish("get_storage_config","VC_TTS_volume")#音量配置
+        if self.VC_TTS_volume == None:
+            self.VC_TTS_volume = 100
+        self.aud.setVolume(self.VC_TTS_volume //10)
+        #self.aud.play(1,0,'U:/static/xianyikaiji.mp3')#开机音频
+        #EventMesh.publish("audio_montage_play",["xianyikaiji.mp3"])
+        #EventMesh.publish("publish_AI_btnInfo",{"func":self.ntptime_cb})
+    def ntptime_cb(self):
+        #ntptime.settime(8)
+        print("timer:{}!!!!!!!!\r\n".format(utime.localtime()))
+    def usb_event_cb(self, state):
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.usb_event,"data":state})
+    def usb_event(self, state):    
+        status = state
+        self.usb_charge_flag = 0
+        if status == 1:#插入USB
+            print("charge R_CHARGE_in")
+            self.usb_status = 1
+            self.aud.stop()
+            #self.aud.play(1,1,'U:/static/R_CHARGE_IN.mp3')
+            EventMesh.publish("audio_montage_play",["R_CHARGE_IN.mp3"])
+            pass
+        elif status == 0:#拨出usbs
+            self.usb_status = 0
+            self.aud.stop()
+            EventMesh.publish("audio_montage_play",["R_CHARGE_OUT.mp3"])
+            #self.aud.play(1,1,'U:/static/R_CHARGE_OUT.mp3')
+    def btnInfo_queue_thread(self):
+        while True:
+            data = self.btnInfo_queue.get()
+            #EventMesh.debug_log("Info_queue:data = {}".format(data))
+            if data != None:
+                try:
+                    if "data" in data :
+                        data["func"](data["data"])
+                    else :
+                        data["func"]()
+                except Exception as e:
+                    #EventMesh.debug_log("btnInfo_queue:ERROR:{}".format(e))
+                    usys.print_exception(e)
+    def publish_AI_btnInfo(self,event,msg):
+        self.btnInfo_queue.put(msg)
+    def powerKey_callback(self, status):
+        print("powerKey_callback:{}".format(status))
+
+    def pwk_extint_cb(self,args):#pwk
+        try:
+            self.pwk_key_status = int(args[1])
+            if self.pwk_key_status == 0:
+                self.pwk_key_status = 1
+            else:
+                self.pwk_key_status = 0
+                pass
+            if self.pwk_key_status == 0:#按下
+                if self.pwk_key_press == 0 :
+                    self.pwk_key.disable()
+                    self.pwk_key_press = 1
+                    self.pwk_key_long_press = 0
+                    self.pwk_key_timer.start(100, 1, self.pwk_key_timer_cb)
+                    self.pwk_key_timer_count = 0
+                    #EventMesh.publish("AI_key_press")
+                    
+        except Exception as e: 
+            usys.print_exception(e)
+    def pwk_key_timer_cb(self, *args, **kwargs):
+        try:
+            self.pwk_key_status = self.pwk_key.read_level()
+            self.pwk_key_timer_count +=1
+            if self.pwk_key_timer_count >= 10*3: #长按3s 
+                #print("pwk_key_long_press {}".format(self.pwk_key_long_press))
+                if self.pwk_key_long_press == 0:
+                        self.pwk_key_long_press = 1
+                        #EventMesh.publish("AI_key_long_press")
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_Long_Press})  
+            if self.pwk_key_status == 1:#松开
+                #print("pwk_key_timer_cb:{}".format(self.pwk_key_timer_count))
+                if self.pwk_key_timer_count >= 5: #防抖200ms
+                    #EventMesh.publish("AI_key_release")
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_release})
+                    self.pwk_key.enable()
+                    self.pwk_key_timer.stop()
+                    self.pwk_key_timer_count = 0
+                    self.pwk_key_press = 0
+            
+        except Exception as e: 
+            usys.print_exception(e) 
+            
+    def keyAI_extint_cb(self,args):#call 2
+        try:
+            #print("AI_btn:keyAI_extint_cb{}".format(args[1]))
+            self.KeyAI_status = int(args[1])
+            if self.KeyAI_status == 0:
+                self.KeyAI_status = 1
+            else:
+                self.KeyAI_status = 0
+            
+            if self.KeyAI_status == 0:#按下
+                if self.KeyAI_press == 0 :
+                    self.extint_AI.disable()
+                    self.KeyAI_press = 1
+                    self.KeyAI_long_press = 0
+                    self.KeyAI_timer.start(100, 1, self.KeyAI_timer_cb)
+                    self.KeyAI_timer_count = 0
+                    #EventMesh.publish("AI_key_press")
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_press})  
+        except Exception as e: 
+            usys.print_exception(e)
+    def KeyAI_timer_cb(self, *args, **kwargs):
+        try:
+            self.KeyAI_status = self.extint_AI.read_level()
+            self.KeyAI_timer_count +=1
+            if self.KeyAI_timer_count >= 10*1: #长按3s 
+                if self.KeyAI_long_press == 0:
+                        self.KeyAI_long_press = 1
+                        #EventMesh.publish("AI_key_long_press")
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_long_press})  
+            if self.KeyAI_status == 1:#松开
+                #print("KeyAI_timer_cb:{}".format(self.KeyAI_timer_count))
+                if self.KeyAI_timer_count >= 5: #防抖200ms
+                    #EventMesh.publish("AI_key_release")
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_release})  
+                    self.extint_AI.enable()
+                    self.KeyAI_timer.stop()
+                    self.KeyAI_timer_count = 0
+                    self.KeyAI_press = 0
+            
+        except Exception as e: 
+            usys.print_exception(e) 
+       
+    def AI_key_press(self):
+        #print("AI_key_press")
+        EventMesh.publish("AI_key_press")
+    def AI_key_long_press(self):
+        #print("AI_key_long_press")
+        EventMesh.publish("AI_key_long_press")
+        
+    def AI_key_release(self):
+        #print("AI_key_release")
+        EventMesh.publish("AI_key_release")
+    def pwk_key_Long_Press(self):
+        print("pwk_key_long_press!!!!!!!")
+        print("pwk_key_long_press!!!!!!!")
+        
+        # EventMesh.publish("paly_iccid_imei")
+        # return
+        EventMesh.publish("audio_montage_play",["zhengzaiguanji.mp3"])
+        #self.aud.play(1,0,'U:/static/zhengzaiguanji.mp3')#关机音频
+        EventMesh.publish("open_led_red")
+        utime.sleep_ms(3000)
+        Power.powerDown()
+        #print("AI_key_release")
+        EventMesh.publish("pwk_key_long_press")
+        
+    def pwk_key_release(self):
+        #print("pwk_key_release")
+        EventMesh.publish("pwk_key_release")
+
+    def AI_dev_timer_cb(self, *args, **kwargs):
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_dev_timer_event})  
+    def AI_dev_timer_event(self):
+        self.wdt.feed()
+        Vbatt = Power.getVbatt()
+        if self.usb_charge_flag == 0 and self.usb_status == 1 and Vbatt>=self.VBATT_tab["charge_full"]:#充电充满
+            EventMesh.publish("audio_montage_play",["R_CHARGE_FULL.mp3"])
+            #self.aud.play(1,0,'U:/static/R_CHARGE_FULL.mp3')#充电已满
+            self.usb_charge_flag = 1
+        if self.usb_charge_flag == 0 and self.usb_status == 0 and Vbatt<self.VBATT_tab[10]:#低电报警
+            #self.aud.play(1,0,'Low_power_warning.mp3')
+            EventMesh.publish("audio_montage_play",["Low_power_warning.mp3"])
+            self.usb_charge_flag = 1
+        pass
+    def get_battery(self, event=None, msg=None):
+        Vbatt = Power.getVbatt()
+        if Vbatt>self.VBATT_tab[90]:
+            return 100
+        if Vbatt>self.VBATT_tab[80]:
+            return 90
+        if Vbatt>self.VBATT_tab[60]:
+            return 80
+        if Vbatt>self.VBATT_tab[40]:
+            return 60
+        if Vbatt>self.VBATT_tab[20]:
+            return 40
+        if Vbatt>self.VBATT_tab[10]:
+            return 20
+        if Vbatt<=self.VBATT_tab[10]:
+            return 10
+    def audio_montage_play(self,event,msg):
+        self.aud.stopPlayStream()
+        str_data='mp3files='
+        for i in msg:
+            try:
+                str_tmp = i.replace(".mp3","")
+                str_data+="{}.mp3+".format(audio_buf.index(str_tmp))
+            except Exception as e:
+                    usys.print_exception(e)    
+        str_data = str_data[:-1]
+        print("audio_montage_play:{}".format(str_data))
+        self.aud.montage_play('U:/static/audio.bin',1,1,str_data)
+    def paly_iccid_imei(self,event,msg):
+        str_data = 'mp3files={}.mp3+'.format(audio_buf.index("liuliangtishi"))#流量提示
+        imei  = modem.getDevImei()
+        iccid = sim.getIccid()
+        if iccid != -1 and len(iccid) > 5:
+            str_data += '{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+'.format(audio_buf.index("R_READ_TIME_{}".format(iccid[0]))\
+                ,audio_buf.index("R_READ_TIME_{}".format(iccid[1])),audio_buf.index("R_READ_TIME_{}".format(iccid[2])),audio_buf.index("R_READ_TIME_{}".format(iccid[3])),\
+                audio_buf.index("R_READ_TIME_{}".format(iccid[4])),audio_buf.index("R_READ_TIME_{}".format(iccid[5])),audio_buf.index("R_READ_TIME_{}".format(iccid[6])),audio_buf.index("R_READ_TIME_{}".format(iccid[7])),\
+                audio_buf.index("R_READ_TIME_{}".format(iccid[8])),audio_buf.index("R_READ_TIME_{}".format(iccid[9])),audio_buf.index("R_READ_TIME_{}".format(iccid[10])),audio_buf.index("R_READ_TIME_{}".format(iccid[11])),\
+                audio_buf.index("R_READ_TIME_{}".format(iccid[12])),audio_buf.index("R_READ_TIME_{}".format(iccid[13])),audio_buf.index("R_READ_TIME_{}".format(iccid[14])))
+        str_data += '{}.mp3+'.format(audio_buf.index("IMEIhao"))#IMEI号为:
+        str_data += '{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(imei[0]))\
+                ,audio_buf.index("R_READ_TIME_{}".format(imei[1])),audio_buf.index("R_READ_TIME_{}".format(imei[2])),audio_buf.index("R_READ_TIME_{}".format(imei[3])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[4])),audio_buf.index("R_READ_TIME_{}".format(imei[5])),audio_buf.index("R_READ_TIME_{}".format(imei[6])),audio_buf.index("R_READ_TIME_{}".format(imei[7])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[8])),audio_buf.index("R_READ_TIME_{}".format(imei[9])),audio_buf.index("R_READ_TIME_{}".format(imei[10])),audio_buf.index("R_READ_TIME_{}".format(imei[11])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[12])),audio_buf.index("R_READ_TIME_{}".format(imei[13])),audio_buf.index("R_READ_TIME_{}".format(imei[14])))
+        #print("str_data:{}".format(str_data))
+        self.aud.montage_play('U:/static/audio.bin',1,1,str_data)
+    #鉴权出错,播放imei号
+    def paly_device_res_error(self,event,msg):
+        str_data = 'mp3files={}.mp3+'.format(audio_buf.index("jianquancuowu"))#AI功能异常,请联系客户查询,设备号为:
+        imei  = modem.getDevImei()
+        str_data += '{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(imei[0]))\
+                ,audio_buf.index("R_READ_TIME_{}".format(imei[1])),audio_buf.index("R_READ_TIME_{}".format(imei[2])),audio_buf.index("R_READ_TIME_{}".format(imei[3])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[4])),audio_buf.index("R_READ_TIME_{}".format(imei[5])),audio_buf.index("R_READ_TIME_{}".format(imei[6])),audio_buf.index("R_READ_TIME_{}".format(imei[7])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[8])),audio_buf.index("R_READ_TIME_{}".format(imei[9])),audio_buf.index("R_READ_TIME_{}".format(imei[10])),audio_buf.index("R_READ_TIME_{}".format(imei[11])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[12])),audio_buf.index("R_READ_TIME_{}".format(imei[13])),audio_buf.index("R_READ_TIME_{}".format(imei[14])))
+        #print("str_data:{}".format(str_data))
+        self.aud.montage_play('U:/static/audio.bin',1,1,str_data)
+#存储信息
+class getStorageDataManager(Abstract):#获取内存数据
+        def __init__(self):
+            self.config_data = {}
+            check = ql_fs.path_exists("/usr/static/storage_file/config.json")
+            if check == True:
+                with open("/usr/static/storage_file/config.json","r") as fd:
+                    self.config_data = ujson.load(fd)
+            else :
+                self.config_data = {'old_time': 0, 'flip_sw': 0}
+                pass
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_storage_data", self.set_storage_data)
+            EventMesh.subscribe("set_storage_config", self.set_storage_config)
+            EventMesh.subscribe("get_storage_data", self.get_storage_data)
+            EventMesh.subscribe("get_storage_config", self.get_storage_config)
+
+        def set_storage_data(self, event, msg): 
+            # EventMesh.debug_log("set_storage_data:{}".format(msg))
+            if msg != None:
+                self.config_data = msg
+                with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:
+                    ujson.dump(self.config_data,fd)
+        
+
+        def set_storage_config(self,event,msg): 
+            # EventMesh.debug_log("set_storage_key_data1:{}".format(msg))
+            if len(msg) >= 2:
+                self.config_data[msg[0]]=msg[1]
+                # EventMesh.debug_log("set_storage_key_data2:{}".format(self.config_data[msg[0]]))
+                EventMesh.publish("publish_message_event_ui",{"func":self.set_storage_save,"data":0})
+        def set_storage_save(self, data): 
+            with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:
+                ujson.dump(self.config_data,fd)
+        def get_storage_data(self, event, msg): 
+            # EventMesh.debug_log("get_storage_data:{}".format(self.config_data))
+            return self.config_data 
+        def get_storage_config(self,event,msg):
+            # EventMesh.debug_log("get_storage_key_data1:{}".format(msg))
+            b = msg in self.config_data.keys()
+            if b == True:
+                # EventMesh.debug_log("get_storage_key_data2:{}".format(self.config_data[msg]))
+                return self.config_data[msg]
+            else :
+                return None
+            # try:
+            #     return self.config_data[msg]
+            # except:
+            #     EventMesh.debug_log("get_storage_key_data:none key:{}",msg)
+            #     return None
+#设备资源授权平台
+class device_res_author(Abstract):
+   
+    def __init__(self) :
+        self.deviceId = modem.getDevImei()#"876226002022574"
+        self.SHA1_BLOCK_SIZE = 64
+        self.PAD_BLOCK_SIZE = 16
+        self.SHA256 = uhashlib.sha256
+        self.pad = lambda s: s + chr(self.PAD_BLOCK_SIZE - len(s) % self.PAD_BLOCK_SIZE) * (self.PAD_BLOCK_SIZE - len(s) % self.PAD_BLOCK_SIZE)
+        # 除去补16字节的多余字符
+        self.unpad = lambda s: s[:-s[-1]]
+        #K01
+        # self.key = b"MWrMZjdtcPhj41jWuoqFAhTmqyFluqj1" 
+        # self.pid = "qAtdDOGXgXYjT2HGFr3a"
+        #G15
+        # self.key = b"3LWfBicxfRZ3ZAqmZCFuvMdGUXdAFWkb" 
+        # self.pid = "qLx4Pu4mSUQxyfVKGLXG"
+        #7pin
+        self.key = b"uKLrChwrxA1LklgBc3VwawYjUkbT3BgX" 
+        self.pid = "cqxJZi5CNgzjS3mX21Zw"
+        
+        self.dev_res_timer = osTimer()
+        self.dev_res_timer.start(10000, 1, self.dev_timer_cb)
+        self.dev_res_timerCount = 0
+        self.ud_token_timer = osTimer()
+        self.ud_token_timer.start(30000, 1, self.ud_token_timer_cb)
+        self.ud_token_timer_Count = 0
+        self.dev_token = None
+        self.res_error_count = 0
+        EventMesh.subscribe("get_dev_token", self.get_dev_token)
+        EventMesh.subscribe("update_dev_token", self.update_dev_token)
+        self.dev_active() #设备激活
+        self.dev_sign_in() #设备登入
+        self.ntptime_flag = 0
+
+    def get_dev_token(self, event, msg): 
+        return self.dev_token
+    #网络校时
+    def dev_NTP(self):
+        url = "http://dmp.raisound.com/bz-api/dev/time"
+        response = request.get(url)
+        data = response.json()
+        print("dev_NTP:{}".format(data))
+        if data:
+            try:
+                timeSecond = data["data"]["timestamp"]//1000
+                
+                next_alarm_time = utime.localtime(timeSecond)
+                print("timeSecond {} next_alarm_time {}".format(timeSecond,next_alarm_time))
+                machine.RTC().datetime((next_alarm_time[0],next_alarm_time[1],next_alarm_time[2],next_alarm_time[6],next_alarm_time[3],next_alarm_time[4],next_alarm_time[5],0))
+            except Exception as e:
+                    usys.print_exception(e)
+    def dev_timer_cb(self, *args): #设备资源管理鉴权平台定时器
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.dev_timer_cb_}) 
+
+    def dev_timer_cb_(self):    
+        #if EventMesh.DEV_RES_MANAGE_AUTHEN_PLATFORM == 1:
+        if self.dev_token == None:
+            if self.ntptime_flag == 0:
+                self.ntptime_flag  = 1
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.dev_NTP})
+            print("timer:{}!!!!!!!!\r\n".format(utime.localtime()))
+            self.dev_active() #设备激活
+            self.dev_sign_in() #设备登入
+            self.dev_res_timerCount+=1
+            if self.dev_res_timerCount > 6: #开机一分钟内没有获取到密码和token 等下一次更新令牌在走登入 激活流程
+                self.dev_res_timerCount=0
+                self.dev_res_timer.stop()
+    def ud_token_timer_cb(self, *args): 
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.ud_token_timer_cb_}) 
+
+    def ud_token_timer_cb_(self):   
+        #print("ud_token_timer_!!!!")
+        self.ud_token_timer_Count+=1
+        if self.ud_token_timer_Count >= 20: #定时30*200s时更新token
+            self.ud_token_timer_Count = 0
+            EventMesh.publish("update_dev_token")
+            
+    def get_sim_Status(self):
+        return sim.getStatus() 
+    def HMAC(self,k, m):
+    
+        KEY_BLOCK = k + (b'\0' * (self.SHA1_BLOCK_SIZE - len(k)))
+        KEY_INNER = bytes((x ^ 0x36) for x in KEY_BLOCK)
+        KEY_OUTER = bytes((x ^ 0x5C) for x in KEY_BLOCK)
+        inner_message = KEY_INNER + m
+        outer_message = KEY_OUTER + self.SHA256(inner_message).digest()
+        return self.SHA256(outer_message)
+    def get_hmac_sha256(self,k, m):
+        data = self.HMAC(k, m).digest()
+        # print("HMAC(k, m).digest():", data)
+        # print("HMAC(k, m).digest():", ubinascii.hexlify(data))
+        hex_data = ubinascii.hexlify(data)
+        hex_data = hex_data.decode('ascii')
+        return hex_data
+    # 加密函数
+    def aes_CBC_Encrypt(self,data, key, iv):  # CBC模式的加密函数,data为明文,key为16字节密钥,iv为16字节的偏移量
+        key = key.encode('utf-8')
+        iv = iv.encode('utf-8')  # CBC 模式下的偏移量
+        data = self.pad(data)  # 补位
+        data = data.encode('utf-8')
+        aes = ucryptolib.aes(key,ucryptolib.MODE_CBC,iv)
+        result = base64.b64encode(aes.encrypt(data))
+        return str(result, 'utf-8')  # 以字符串的形式返回
+
+    # 解密函数
+    def aes_CBC_Decrypt(self,data, key, iv):  # CBC模式的解密函数,data为密文,key为16字节密钥
+        key = key.encode('utf-8')
+        iv = iv.encode('utf-8')
+        
+        aes = ucryptolib.aes(key,ucryptolib.MODE_CBC,iv) #CBC模式
+
+        # decrypt AES解密  B64decode为base64 转码
+        result = aes.decrypt(base64.b64decode(data))
+        result = self.unpad(result)  # 除去补16字节的多余字符
+        return str(result, 'utf-8')  # 以字符串的形式返回
+    #激活接口 没有密码走激活
+    def dev_active(self):
+        signal = net.csqQueryPoll()
+        if signal == -1 or self.get_sim_Status() != 1:#网络不正常
+            print("dev_active 无 SIM卡!!!!!!!!\r\n")
+            return
+        # 签名内容: = deviceId+pid+timeStamp
+        dev_pass = ""
+        dev_pass = EventMesh.publish("get_storage_config","dev_pass")
+        print("dev_pass:{}\r\n".format(dev_pass))
+        if dev_pass == None:
+            dev_pass = ""
+        if dev_pass == "" or dev_pass == None:
+            date_tmp = utime.localtime() #获取当前时间
+            print("date_tmp:{}\r\n".format(date_tmp)) #转换时间戳s
+            timeStamp = (utime.mktime(date_tmp))*1000#获取时间戳ms
+            deviceId = self.deviceId #"876226002022574" #以imei号
+            pid = self.pid
+            key = self.key
+            sign_data = "{}{}{}".format(deviceId,pid,timeStamp)  #签名内容
+            print("sign_data:{}\r\n".format(sign_data))
+            sha256_hex = self.get_hmac_sha256(key,sign_data)
+            print("sha256_hex:{}\r\n".format(sha256_hex))
+
+            data = {
+                "deviceId":"{}".format(deviceId), #设备名
+                "pid":pid, #产品PID
+                "sign":"{}".format(sha256_hex), #HMACSHA256签名后的数据
+                "timeStamp":timeStamp, #要以ms的形式
+                "signMethod":"HMACSHA256" #签名方式 HMACSHA256
+            }
+            print(ujson.dumps(data))
+            headers_T ={"Content-Type":"application/json"}
+            url = "http://dmp.raisound.com/bz-api/dev/auth/active"
+            data =ujson.dumps(data)
+            response = 0
+            response_result = 0
+            try:
+                response = request.put(url,data=data,headers = headers_T)
+                response_result = 1
+            except Exception as e:
+                print("put error!!!!!\r\n")
+                response_result = 0
+            
+            IV = "" #偏移量
+            PASSWORD= "" #服务器返回后的加密内容 密码
+            if response_result == 1: #访问成功ip
+                if response.status_code == 200:
+                    print("headers:{}".format(response.headers))
+                    content = response.content
+                    c = next(content)
+                    # "api.xcloudtech.com"
+                    # d_server_port = 9000
+                    data =  ujson.loads(c)
+                    # data = response.json()
+                    print("data-{}".format(data))
+                    if data != None:
+                        if "success" in data:
+                            if data['success'] == True:
+                                if "data" in data:
+                                    data_tmp = data["data"]
+                                    if "nonce" in data_tmp: #偏移量
+                                        IV = data_tmp["nonce"]
+                                    if "password" in data_tmp:
+                                        PASSWORD = data_tmp["password"]
+                                        # EventMesh.publish("set_storage_config",["dev_pass",PASS])
+                            if data["code"] == 20001:#鉴权成功
+                                pass
+                            elif data["code"] > 50000:#时间错误
+                                self.res_error_count+=1
+                                if self.res_error_count>=3:
+                                    self.res_error_count = 0
+                                    EventMesh.publish("paly_device_res_error")
+                                if data["code"] == 50003:#时间错误
+                                    self.ntptime_flag  = 0
+                    if PASSWORD != None and IV != None:
+                        if len(PASSWORD) != 0 and len(IV) != 0:
+                            password = PASSWORD
+                            iv = IV
+                            #解密 之后保存本地下一次登入做使用
+                            decrypt_data = self.aes_CBC_Decrypt(password, self.key, iv) #对服务器下发的密码进行解密
+                            print("decrypt_data {}".format(decrypt_data))
+                            EventMesh.publish("set_storage_config",["dev_pass",decrypt_data])
+                    
+                        
+                print("IV:{}\r\n PASS:{}".format(IV,PASSWORD)) 
+            return [response_result,PASSWORD,IV]
+    #随机生成16个字节的字符串作为加密的IV 偏移量
+    def generate_random_string(self,length=16): 
+        random_str = ""
+        chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
+        for i in range(length):
+            random_str+=chars[random.randint(0,length)]
+        return random_str
+
+    #设备登入 没有Token 走登入获取token
+    def dev_sign_in(self):
+        signal = net.csqQueryPoll()
+        if signal == -1 or self.get_sim_Status() != 1:#网络不正常
+            print("dev_sign_in 无 SIM卡!!!!!!!!\r\n")
+            return
+        token = ""
+        token = self.dev_token
+        dev_pass = EventMesh.publish("get_storage_config","dev_pass") 
+        #print("token:{}\r\n".format(token))
+        if token == None:
+            token = ""
+        if dev_pass == None:
+            dev_pass = ""
+        if len(dev_pass) == 0:#没有密码
+            return
+        if token == None or token == "":
+            if 1: #返回结果成功
+                #获取本地保存的密码
+                decrypt_data=EventMesh.publish("get_storage_config","dev_pass")
+                # decrypt_data = self.aes_CBC_Decrypt(password, self.key, iv) #对服务器下发的密码进行解密
+                print("decrypt_data {}".format(decrypt_data))
+                #随机生成16个字符串 设备生成做加密使用
+                random_string = self.generate_random_string(16) #随机的16个字符串
+                enc_iv = random_string #加密的IV偏移量
+                #设备端进行密码加密
+                encrypt_data = self.aes_CBC_Encrypt(decrypt_data, self.key, enc_iv)
+                print("encrypt_data {}".format(encrypt_data))
+
+                #登入数据
+                deviceId = self.deviceId
+                sign_in_data = {
+                    "deviceId":"{}".format(deviceId), #设备ID
+                    "password":"{}".format(encrypt_data), #加密的数据
+                    "nonce":"{}".format(random_string) #随机的16个字符串
+                }
+                print(ujson.dumps(sign_in_data))
+                sign_url = "http://dmp.raisound.com/bz-api/dev/auth/sign_in" #登入地址
+                headers_T ={"Content-Type":"application/json"}
+                response_result = 0
+                response = 0
+                try:
+                    response = request.post(sign_url,data=ujson.dumps(sign_in_data),headers = headers_T)
+                    response_result = 1
+                except Exception as e:
+                    print("post error!!!!!\r\n")
+                    response_result = 0
+                # {'msg': '', 'code': 20001, 'success': True, 
+                # 'data': {'deviceId': '876226002022574', 
+                # 'token': '95436a9e09fd0ff89feb8825257dca982f'}
+                # }
+                token = ""
+                if response_result == 1:
+                    if response.status_code == 200:
+                        content = response.content
+                        c = next(content)
+                        data =  ujson.loads(c)
+                        print("data-{}".format(data))
+                        if data != None:
+                            if "success" in data:
+                                if data['success'] == True: #登入成功
+                                    if "data" in data:
+                                        data_tmp = data["data"]
+                                        if "token" in data_tmp: #token
+                                            self.dev_token = data_tmp["token"]
+                                if data["code"] == 50003:#时间错误
+                                    self.ntptime_flag  = 0
+                print("token:{}\r\n".format(token))
+                pass
+    #获取新的令牌 更新token
+    def update_dev_token(self, event, msg):
+        print("update_dev_token")
+        dev_pass = ""
+        dev_pass = EventMesh.publish("get_storage_config","dev_pass")
+        
+        if dev_pass == None:
+            dev_pass = ""
+        if len(dev_pass) == 0: #没有密码走激活
+            print("no dev_pass:{}\r\n".format(dev_pass))
+            self.dev_active()
+        token = self.dev_token
+        if token == None:
+            token = ""
+        if len(token) == 0: #没有token走登入
+            print("no dev_token:{}\r\n".format(token))
+            self.dev_sign_in()
+
+        dev_tokenip = "http://dmp.raisound.com/bz-api/dev/auth/token" #设备新令牌更新地址
+        token = self.dev_token
+        if token == None:
+            token = ""
+        if len(token) != 0:
+            response_result=0
+            response = 0
+            headers_T = {"bz-dt":"{}".format(token)}
+            try:
+                response = request.get(dev_tokenip,headers = headers_T)
+                response_result = 1
+            except Exception as e:
+                print("get error!!!!!\r\n")
+                response_result = 0
+            if response_result == 1:
+                if response.status_code == 200:
+                    try:
+                        headers_data = response.headers
+                        # print("headers_data!!!!! headers_data:{}\r\n".format(headers_data))
+                        if "bz-dt" in headers_data: #bz-dt字段是否在头部数据里面 如果有就需要更新
+                            bz_dt = headers_data["bz-dt"] 
+                            self.dev_token = bz_dt.replace(" ", "") #去掉所有的空格符
+                            print("update_dev_token:{}".format(self.dev_token))
+                    except Exception as e:
+                        print("headers_data!!!!! error\r\n")
+        
+        pass
+
+
+
+
+#阿里voice_chat状态枚举
+VC_State_None=0
+VC_State_Listening=1#听
+VC_State_SpeechStart=2#说开始
+VC_State_SpeechEnd=3#说结束
+VC_State_Thinking=4#想(chat)
+VC_State_Responding=5#音频播放
+VC_State_TTSStart=6
+VC_State_TTSData=7
+VC_State_TTSFinish=8
+VC_State_TTSEnd=9
+VC_State_TTSError=10
+VC_State_DialogError=11
+VC_State_End=12
+
+VC_record_TYPE_PCM = 0
+VC_record_TYPE_AMR = 1
+VC_play_TYPE_PCM = 0
+VC_play_TYPE_MP3 = 1
+
+#websocket发送数据编号
+# AI_client_asr_num = 0
+# AI_client_chat_num = 1
+# AI_client_tts_num = 2
+AI_client_voice_chat_num = 3
+AI_client_asr_num = 4
+class AI_VC(Abstract):
+    # AI
+    
+    def __init__(self):
+        self.record_data_save_flag = 0 #是否保存录音文件
+        self.record_fd = None
+        #self.VC_mode = 0 #0:短按连续问答模式 1:长按录音模式
+        self.VC_mode = EventMesh.publish("get_storage_config","VC_mode")#音色配置
+        if self.VC_mode == None :
+            self.VC_mode = 0
+
+        self.VC_server = 2 #0正式服务器,1:测试服务器1,2:测试服务器2
+        self.VC_record_TYPE = VC_record_TYPE_PCM #0:PCM 1:AMR
+        self.VC_play_TYPE = VC_play_TYPE_PCM #0:PCM 1:mp3 
+        self.VC_record_samplerate = 16000
+        self.VC_play_samplerate = 16000
+        #女,男,童,粤,川
+        self.VC_TTS_voice_type = {0:"huoshan::zh_female_xinlingjitang_moon_bigtts",1:"huoshan::zh_male_wennuanahu_moon_bigtts",2:"huoshan::ICL_zh_female_huoponvhai_tob",
+                                  3:"aliyun::longjiaxin",4:"huoshan::zh_female_daimengchuanmei_moon_bigtts"}
+        #self.VC_TTS_voice_type = ["aliyun::longxiaoxia","aliyun::longnan","aliyun::longling"]
+        self.VC_TTS_voice_num = EventMesh.publish("get_storage_config","VC_TTS_voice_num")#音色配置
+        if self.VC_TTS_voice_num == None or self.VC_TTS_voice_num>=len(self.VC_TTS_voice_type):
+            self.VC_TTS_voice_num = 0
+         
+        self.VC_TTS_volume =  EventMesh.publish("get_storage_config","VC_TTS_volume")#音量配置
+        if self.VC_TTS_volume == None:
+            self.VC_TTS_volume = 100
+        self.AI_audio_queue_thread_id = 0
+        self.AI_send_data_queue_thread_id = 0
+
+        self.AI_record_tmp_queue = Queue(100)
+        self.AI_send_data_queue = Queue(100)
+        self.AI_audio_queue = Queue(100)
+        self.AI_TTS_str = ""
+        self.AI_ASR_str = ""
+        self.AI_ASR_flag = 0
+        self.AI_ASR_str_tmp = ""
+        # #开始线程
+        # if self.AI_audio_queue_thread_id ==0:
+        #     self.AI_audio_queue_thread_id = _thread.start_new_thread(self.AI_audio_queue_thread, ())
+        # else:
+        #     print("AI_VC_start :AI_audio_queue_thread_id != 0 ")
+        # if self.AI_send_data_queue_thread_id == 0:    
+        #     self.AI_send_data_queue_thread_id = _thread.start_new_thread(self.AI_send_data_queue_thread, ())
+            
+        self.voice_chat_state = VC_State_None #阿里ai voice_chat状态
+        self.VC_dialog_id = ""
+        self.VC_message_id=None
+        self.VC_task_id =None
+        self.AI_client_voice_chat = None
+        self.AI_client_voice_chat_recv_id = 0
+        self.AI_client_voice_chat_isconnect =0
+
+        self.asr_state = VC_State_None #阿里VC_ASR voice_chat状态
+        self.VC_asr_dialog_id = ""
+        self.VC_asr_message_id=None
+        self.VC_asr_task_id =None
+        self.AI_client_asr = None
+        self.AI_client_asr_recv_id = 0
+        self.AI_client_asr_isconnect =0
+
+        self.asr_satrt_flag = 0
+
+        self.record_pcm = None
+        self.play_pcm = None
+        self.VC_record_thread_id = 0
+        self.pingping_timerout = 0
+        
+        self.factory_timer = osTimer()
+        self._1S_timer = osTimer()
+        self.Audio_buf_size = 16*1024
+        self.record = audio.Record()
+        #self.record.end_callback(self.record_callback)
+        self.record.gain_set(4,10)
+        self.aud = audio.Audio(0)
+        self.aud.setCallback(self.audio_cb)
+        #self.aud.setVolume(self.VC_TTS_volume //10)
+        self.audio_play_state = 1 #音频播放完状态
+        self.close_timerout = 0
+        self.LocalRespondingEnded_timerout = 0
+        
+        self.play_flag = 0
+        self.VC_record_state_flag = 0
+        self.AI_key_long_press_flag = 0
+        self.websocket_error_count = 0
+
+        self.tts_in_data_len = 0
+        self.tts_out_data_len = 0
+        EventMesh.subscribe("AI_key_press", self.AI_key_press)
+        EventMesh.subscribe("AI_key_release", self.AI_key_release)
+        EventMesh.subscribe("AI_key_long_press", self.AI_key_long_press)
+        EventMesh.subscribe("pwk_key_release", self.pwk_key_release)
+        EventMesh.subscribe("get_AI_audio_queue", self.get_AI_audio_queue)
+        
+        EventMesh.publish("close_led")
+        #开机提示语,如果联网失败,直接提示信号弱
+        #女,男,童,粤,川
+        self.bot_name = "柒先生"
+        if self.VC_TTS_voice_num == 0 or self.VC_TTS_voice_num == 3 or self.VC_TTS_voice_num == 4:
+            self.bot_name = "柒妹妹"
+        elif self.VC_TTS_voice_num == 1:
+            self.bot_name = "柒先生"
+        elif self.VC_TTS_voice_num == 2:
+            self.bot_name = "柒思思"
+        self.AI_TTS_str = "您好!我是柒牌 AI 智能男装生活好帮手-{}, 很高兴为您服务,我可以帮您解答日常生活、工作,旅游信息、健康咨询、教育与学习、情感交流、全球资讯等问题!请问您有什么需要我帮忙的吗?".format(self.bot_name )
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+
+    def post_processor_after_instantiation(self):
+        pass
+    def get_AI_audio_queue(self, event, msg):
+        return self.AI_audio_queue
+    def audio_cb(self,event):
+        if event == 0:
+            self.audio_play_state =1
+            #EventMesh.publish("set_audio_state", 1)
+            print('audio-play start.')
+        elif event == 7:
+            self.audio_play_state = 0
+            #EventMesh.publish("set_audio_state", 0)   
+            print('audio-play finish.!!!!!!')
+
+    def AI_key_press(self, event, msg):#按键按下
+        print("AI_key_press")
+        self.aud.aud_tone_play(16,200)#播放按键音
+        self.asr_satrt_flag = 1#
+        self.AI_TTS_str = ""#"你好,有什么吩咐"
+        self.AI_ASR_str = ""
+        self.AI_ASR_str_tmp = ""
+        # if self.voice_chat_state != VC_State_None:
+        #     EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+        #     EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(10)})
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+        # self.Close()
+        # self.AI_VC_start()
+        self.AI_key_long_press_flag = 0
+
+    def AI_key_release(self, event, msg):#按键弹起
+        print("AI_key_release123")
+        if self.AI_key_long_press_flag == 1 :#有长按
+            self.AI_client_voice_chat_end_speech()
+        else :
+            if self.VC_mode == 1 :#长按单次问答模式
+                EventMesh.publish("audio_montage_play",["key_prompt.mp3"])
+                #self.aud.play(1,1,'U:/static/key_prompt.mp3')#提示请您按住中间的按钮开始讲话,讲完松开即可
+                self.AI_send_data_queue.clear()
+                try:
+                    self.websocket_deconnect_voice_chat()
+                except Exception as e:
+                    usys.print_exception(e)
+                self.VC_Speech_End()
+    def AI_key_long_press(self, event, msg):#按键长按
+        print("AI_key_long_press")
+        self.AI_key_long_press_flag = 1
+
+    def pwk_key_release(self, event, msg):#电源键短按,关闭
+        print("pwk_key_release")
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+
+    
+#****************************************ASR连接**********************************************************************
+    def websocket_connect_asr(self):
+        print("websocket_connect_asr:{} {}!!!!!!!!!!!!!!!!!!!!!".format(self.AI_client_asr_isconnect,_thread.threadIsRunning(self.AI_client_asr_recv_id)))
+        if self.AI_client_asr_isconnect == 1:
+            return
+        # 创建VC客户端
+        try:
+            signal = net.csqQueryPoll()
+            if signal == -1 or sim.getStatus() != 1:#网络正常
+                self.websocket_error()
+                return
+            # Headers = {'X-NLS-Token':'0c8b8f05a46f423096be64a9c4c46310'}
+            # self.AI_client_asr = uwebsocket.Client.connect('wss://nls-gateway-cn-beijing.aliyuncs.com/ws/v1',headers=Headers, debug=False)
+            if self.VC_server == 1:# 
+                self.AI_client_asr = uwebsocket.Client.connect('ws://118.145.158.207:22080/asr/ws', debug=False)#测试环境
+            elif self.VC_server == 2:# 
+                if self.VC_TTS_voice_num <= 2:
+                    self.AI_client_asr = uwebsocket.Client.connect('ws://118.145.158.207:22080/asr/ws?platform=aliyun&lang=zh-cn', debug=False)#普通话测试环境
+                elif self.VC_TTS_voice_num == 3:
+                    self.AI_client_asr = uwebsocket.Client.connect('ws://118.145.158.207:22080/asr/ws?platform=aliyun&lang=zh-hk', debug=False)#粤语测试环境
+                elif self.VC_TTS_voice_num == 4:
+                    self.AI_client_asr = uwebsocket.Client.connect('ws://118.145.158.207:22080/asr/ws?platform=aliyun&lang=zh-cn-sc', debug=False)#四川话测试环境
+                else :
+                    self.AI_client_asr = uwebsocket.Client.connect('ws://118.145.158.207:22080/asr/ws?platform=aliyun&lang=zh-cn', debug=False)#普通话测试环境
+            else:
+                token = EventMesh.publish("get_dev_token")
+                print("token:{}".format(token))
+                if token != None:
+                    self.AI_client_asr = uwebsocket.Client.connect('ws://amp.raisound.com/asr/ws?dt={}'.format(token), debug=False)
+                else:
+                    pass
+                    return
+        except Exception as e: #网络连接异常
+            usys.print_exception(e)
+            print("websocket_connect_voice_chat error!!!\r\n")
+            #self.connect_timerout_popup(2)  
+            self.websocket_error()
+            return
+        if self.AI_client_asr == None:
+            EventMesh.publish("update_dev_token")#获取token
+            return 
+        # 线程接收数据
+        if self.AI_client_asr_recv_id != 0:
+            try:
+                _thread.stop_thread(self.AI_client_asr_recv_id)
+            except Exception as e:
+                    usys.print_exception(e)
+            self.AI_client_asr_recv_id = 0
+        _thread.stack_size(self.Audio_buf_size+8*1024)
+        self.AI_client_asr_recv_id = _thread.start_new_thread(self.AI_client_asr_recv, (self.AI_client_asr,))
+        _thread.stack_size(8*1024)
+        self.AI_client_asr_isconnect = 1
+        # 
+
+    def websocket_deconnect_asr(self):
+        print("websocket_deconnect_asr {}!!!!!!!".format(self.AI_client_asr_isconnect))
+        print("websocket_deconnect_asr!!!!!!!")
+        if self.AI_client_asr_recv_id != 0:#关闭线程
+            try:
+                _thread.stop_thread(self.AI_client_asr_recv_id)
+            except Exception as e:
+                usys.print_exception(e)
+        self.AI_client_asr_recv_id = 0
+        if self.AI_client_asr_isconnect == 1:
+            self.AI_client_asr_isconnect = 0
+            self.AI_client_asr.close()
+        print("websocket_deconnect_asr {}!!!!!!!".format(self.AI_client_asr_isconnect))
+
+    #websocket发送数据    
+    def AI_client_asr_send(self,data_str):
+        if isinstance(data_str, str):#是字符串
+            print("ASR ASR AI_client_asr_send:{}".format(data_str))
+            pass
+        else:
+            pass
+            #print("ASR ASR AI_client_asr_send:len:{}".format(len(data_str)))
+        self.AI_send_data_queue.put([AI_client_asr_num,data_str]) 
+    #Ai VC websocket返回数据       
+    def AI_client_asr_recv(self,cli):
+        while True:
+            try:
+                # 死循环接收数据
+                utime.sleep_ms(1)
+                recv_data = cli.recv()
+                self.close_timerout = 0#服务器有返回清零退出时间
+                if not recv_data:
+                    # 服务器关闭连接或客户端关闭连接
+                    print("AI_client_asr_recv close!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+                    #self.AI_client_voice_chat_isconnect = 0
+                    #self.websocket_deconnect_voice_chat()
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_asr}) 
+                    #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(1500)})
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_connect_asr}) 
+                    break
+                try:
+                    if isinstance(recv_data, str):
+                        jsload_data =  ujson.loads(recv_data)
+                        print("ASR ASR recv_data: {}".format(jsload_data))
+                        if jsload_data["event"] != None:
+                            if jsload_data["event"] == "TranscriptionStarted": #开始录音
+                                pass
+                        if recv_data.find('\"result\"') == -1:
+                        #if jsload_data["result"] == None:
+                            #print("continue recv_data:{}".format(recv_data))
+                            continue 
+                        if jsload_data["result"] == None:
+                            #print("continue recv_data:{}".format(recv_data))
+                            continue 
+                        if jsload_data["result"]["result"]:
+                            #self.AI_listen_text = str(jsload_data["result"]["result"])
+                            text= str(jsload_data["result"]["result"])
+                            
+
+                            print("ASR recv self.voice_chat_state :{}".format(self.voice_chat_state))
+                            if self.voice_chat_state >= VC_State_TTSStart:#开始播音后不响应asr结果
+                                print("asr continue")
+                                continue
+                            EventMesh.publish("open_led_red")
+                            if jsload_data["result"]["is_end"] == True:  #asr结束
+                                # if text.find('你好') != -1:
+                                #     self.asr_satrt_flag = 0
+                                #     self.AI_TTS_str = ""#"你好,有什么吩咐"
+                                #     self.AI_ASR_str = ""
+                                #     self.asr_satrt_flag = 1
+                                #     self.aud.aud_tone_play(16,200)#播放按键音
+                                #     # self.AI_client_asr_StopTranscription_requset()#终止前面合成
+                                #     # self.AI_client_asr_start_requset()#开始新的合成
+                                #     EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_voice_chat}) 
+                                #     EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                                #     EventMesh.publish("open_led_red")
+                                #     continue
+                                #     #self.VC_Play_End()#关闭音频播放
+                                ret= self.check_text(text)
+                                if ret == 0:#配置指令
+                                    #print("check_text ok:{} self.VC_TTS_voice_num:{},{}".format(text,self.VC_TTS_voice_num,self.VC_TTS_voice_type[self.VC_TTS_voice_num]))
+                                    self.AI_send_data_queue.clear()
+                                    EventMesh.publish("open_led_all")
+                                    try:
+                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_voice_chat}) 
+                                        #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(1500)})
+                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                                    except Exception as e:
+                                        usys.print_exception(e)
+                                    continue
+                                elif ret == 1:#不处理
+                                    pass
+                                else:#正常asr
+                                    if self.AI_ASR_flag == 0:#d第一次识别,没有打断
+                                        self.AI_ASR_str = text#
+                                        self.AI_ASR_str_tmp = self.AI_ASR_str
+                                        self.AI_ASR_flag  = 1
+                                    else:#第二次识别,打断了
+                                        self.AI_ASR_str = self.AI_ASR_str_tmp+text
+                                        print("ASR ASR 打断 续集 AI_ASR_str {}".format(self.AI_ASR_str))
+                                        self.AI_ASR_str_tmp = self.AI_ASR_str
+                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init2})#关闭vc连接
+                                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+
+
+                                    # if self.AI_ASR_str != "":#识别过一次asr,打断当前思考或者tts播放
+                                    #     self.AI_ASR_str_tmp = self.AI_ASR_str
+                                    #     print("ASR ASR 打断1 AI_ASR_str_tmp {}".format(self.AI_ASR_str_tmp))
+                                    #     self.AI_ASR_str = ""
+                                    # if self.AI_ASR_str_tmp != "":
+                                    #     self.AI_ASR_str = self.AI_ASR_str_tmp +text#加上之前的数据
+                                    #     print("ASR ASR 打断 续集 AI_ASR_str {}".format(self.AI_ASR_str))
+                                    # else:
+                                    #     self.AI_ASR_str = text#
+                                    # EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                                    # self.AI_ASR_str_tmp = ""
+                                        
+                                    
+                            elif jsload_data["result"]["is_end"] == False:
+                                if self.AI_ASR_flag ==1 :#如果已经识别过一次asr
+                                    self.AI_ASR_flag = 2
+                                    print("asr 打断,关闭VC连接")
+                                    EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init2})#关闭vc连接
+                                    EventMesh.publish("publish_AI_btnInfo",{"func":EventMesh.publish,"data":"open_led_red"})#关闭vc连接
+                                pass
+                except Exception as e:
+                    usys.print_exception(e)
+                
+            except Exception as e:
+                    usys.print_exception(e)
+                    #self.websocket_error()
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error})#
+                    break
+        self.AI_client_asr_isconnect = 0
+        self.AI_client_asr_recv_id = 0 
+        print("AI_client_asr_recv END!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+    #ASR开始会话
+    def AI_client_asr_start_requset(self):
+        
+        json_data = \
+        { 
+            "header":{
+                "event":"StartTranscription",
+                "trace_id":self.get_trace_id()
+                },
+            "payload":{
+                "format":"pcm",
+                "sample_rate":self.VC_record_samplerate,
+                }
+            
+        }
+        if self.VC_record_TYPE == VC_record_TYPE_AMR :
+            json_data["payload"]["format"]='amr'
+            pass
+        # if self.VC_mode == 1:
+        #     json_data["payload"]["voice_detection"]='disable'
+
+        self.AI_client_asr_send(ujson.dumps(json_data))
+    #ASR终止
+    def AI_client_asr_StopTranscription_requset(self):   
+        json_data = \
+        {
+            "header":{
+                "event":"StopTranscription",
+                "trace_id":self.get_trace_id()
+                }
+        }
+
+        self.AI_client_asr_send(ujson.dumps(json_data))
+    
+     #开始录音
+    def VC_Speech_Start(self):
+        #self.voice_chat_state =  VC_State_SpeechStart
+        print("VC_Speech_Start VC_record_state_flag:{} self.AI_ASR_flag:{}!!!!!!!!".format(self.VC_record_state_flag,self.AI_ASR_flag))  
+        if self.AI_ASR_flag  != 0:
+            return
+        if self.VC_record_state_flag  == 0:
+            self.AI_client_asr_start_requset()#开始请求
+            if self.VC_record_thread_id != 0:
+                try:
+                    _thread.stop_thread(self.VC_record_thread_id)
+                except Exception as e:
+                        usys.print_exception(e)
+                self.VC_record_thread_id = 0
+            _thread.stack_size(self.Audio_buf_size+8*1024)
+            self.VC_record_thread_id = _thread.start_new_thread(self.VC_record_thread,())
+            _thread.stack_size(8*1024)
+            print("self.VC_record_thread_id:{}".format(self.VC_record_thread_id))
+            if self.VC_record_TYPE == VC_record_TYPE_AMR :
+                try :
+                    self.record.stream_start(audio.Record.AMRNB, self.VC_record_samplerate, 0)
+                except Exception as e:
+                        usys.print_exception(e)
+            elif self.VC_record_TYPE == VC_record_TYPE_PCM:
+                print("record_pcm.stream_read_start()!!!!!!!!!!!!")
+                self.record.stream_start(audio.Record.WAV, self.VC_record_samplerate, 0)
+                # if self.record_pcm != None:
+                #     try:
+                #         self.record_pcm.stream_stop()
+                #         self.record_pcm.close()
+                #         self.record_pcm = None
+                #     except Exception as e:
+                #         usys.print_exception(e)
+                # if self.record_pcm == None:        
+                #     ret = self.record_pcm = audio.Audio.PCM(0,1,16000,0,1,2)
+                #     print("audio.Audio.PCM:ret:{}".format(ret))
+                #     ret = self.record_pcm.stream_read_start()
+                #     print("self.record_pcm.stream_read_start:ret:{}".format(ret))
+            self.VC_record_state_flag = 1
+    #停止录音
+    def VC_Speech_End(self):
+        try:
+            self.AI_ASR_flag = 0
+            self.AI_client_asr_StopTranscription_requset()#请求停止
+            if self.VC_record_TYPE == VC_record_TYPE_AMR:
+                self.record.stream_stop()
+                self.record.stop()#关闭录音
+                Record_read_buf = bytearray(self.Audio_buf_size)
+                for i in range(10):
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)
+                    print("Record_len:!!!!!!{}".format(Record_len))
+                    if Record_len <= 0:
+                        break
+            elif self.VC_record_TYPE == VC_record_TYPE_PCM:
+                self.record.stream_stop()
+                self.record.stop()#关闭录音
+                Record_read_buf = bytearray(self.Audio_buf_size)
+                for i in range(10):
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)
+                    print("Record_len:!!!!!!{}".format(Record_len))
+                    if Record_len <= 0:
+                        break
+                # if self.record_pcm != None:
+                #     try:
+                #         self.record_pcm.stream_stop()
+                #         self.record_pcm.close()
+                #         self.record_pcm = None
+                #     except Exception as e:
+                #         usys.print_exception(e)
+        except Exception as e:
+            usys.print_exception(e)
+        if self.VC_record_thread_id != 0:
+            try:
+                _thread.stop_thread(self.VC_record_thread_id)
+            except Exception as e:
+                    usys.print_exception(e)
+            self.VC_record_thread_id = 0
+        
+        self.VC_record_state_flag = 0
+        print("VC_Speech_End VC_record_state_flag:{}!!!!!!!!".format(self.VC_record_state_flag))   
+    #获取录音数据
+    def VC_record_thread(self):
+        ##return
+        print("VC_record_thread start!!!!!!!!!!!!!!!!!!!!\r\n")
+        count = 0
+        # try:
+        #     uos.remove('/usr/test.pcm')
+        # except Exception as e:
+        #     usys.print_exception(e)
+        #record_data_queue = Queue(100)
+        #fd = open('/usr/test.pcm','w')
+        # if self.VC_record_TYPE == 1:
+        #     h_data= [0x23,0x21 ,0x41 ,0x4D ,0x52 ,0x0A ]
+        #     h_data_b = bytes(h_data)
+        #     self.AI_client_voice_chat_send(h_data_b)
+        
+        count = 0
+        while True:
+            try:
+                
+                # 死循环接收数据
+                #if self.voice_chat_state ==  VC_State_SpeechStart:
+                Record_read_buf = bytearray(self.Audio_buf_size)
+                
+                Record_len = 0
+                if self.VC_record_TYPE == VC_record_TYPE_PCM:#pcm
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)
+                    utime.sleep_ms(20)
+                    
+                else :
+                    
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)
+                    utime.sleep_ms(600)
+
+                #Record_len = 1024*2
+                #print("VC_record_thread:{}".format(Record_len))
+                if Record_len > 0:
+                    read_buf = bytes(Record_read_buf[:Record_len])
+                    if self.record_fd != None:
+                        self.record_fd.write(read_buf)
+                    self.AI_client_asr_send(read_buf)
+                    
+                    # if self.voice_chat_state !=  VC_State_SpeechStart:#没发送前先存起来
+                    #     self.AI_record_tmp_queue.put(read_buf)
+                    # else:
+                    #     while True:
+                    #         if self.AI_record_tmp_queue.empty() == True:
+                    #             break
+                    #         else:
+                    #             self.AI_client_voice_chat_send(self.AI_record_tmp_queue.get())  #发送之前存的数据
+                    #     self.AI_client_voice_chat_send(read_buf)   
+                    #print("VC_record_thread:{}".format(len(read_buf)))
+                    count+=len(read_buf)
+                # if count>=500*1024:#结束
+                #     self.AI_client_voice_chat_end_speech()
+                #     break
+                utime.sleep_ms(40)
+                # if self.voice_chat_state >=  VC_State_SpeechEnd:
+                #     break
+                count+=1
+                if count %10 == 0:
+                    print("VC_record_thread on line {} asr recv :{} send:{}".format(Record_len,_thread.threadIsRunning(self.AI_client_asr_recv_id),_thread.threadIsRunning(self.AI_send_data_queue_thread_id)))
+            except Exception as e:
+                    usys.print_exception(e)
+                    #break
+
+        #fd.close()
+        print("VC_record_thread:exit")
+        self.VC_record_thread_id = 0#线程退出
+###################################################### VC ###################################################################################
+    def websocket_connect_voice_chat(self):
+        print("websocket_connect_voice_chat:{}!!!!!!!!!!!!!!!!!!!!!".format(self.AI_client_voice_chat_isconnect))
+        if self.AI_client_voice_chat_isconnect == 1:
+            return
+        # 创建VC客户端
+        try:
+            signal = net.csqQueryPoll()
+            if signal == -1 or sim.getStatus() != 1:#网络正常
+                self.websocket_error()
+                return
+            # Headers = {'X-NLS-Token':'0c8b8f05a46f423096be64a9c4c46310'}
+            # self.AI_client_voice_chat = uwebsocket.Client.connect('wss://nls-gateway-cn-beijing.aliyuncs.com/ws/v1',headers=Headers, debug=False)
+            if self.VC_server == 1:# 
+                self.AI_client_voice_chat = uwebsocket.Client.connect('ws://118.145.158.207:22080/voice-chat/ws', debug=False)#测试环境
+            elif self.VC_server == 2:# 
+                if self.VC_TTS_voice_num <= 2:
+                    self.AI_client_voice_chat = uwebsocket.Client.connect('ws://118.145.158.207:22080/voice-chat/ws?is_auth=0&platform=raisound&lang=zh-cn', debug=False)#普通话测试环境
+                elif self.VC_TTS_voice_num == 3:
+                    self.AI_client_voice_chat = uwebsocket.Client.connect('ws://118.145.158.207:22080/voice-chat/ws?is_auth=0&platform=raisound&lang=zh-hk', debug=False)#粤语测试环境
+                elif self.VC_TTS_voice_num == 4:
+                    self.AI_client_voice_chat = uwebsocket.Client.connect('ws://118.145.158.207:22080/voice-chat/ws?is_auth=0&platform=raisound&lang=zh-cn-sc', debug=False)#四川话测试环境
+                else :
+                    self.AI_client_voice_chat = uwebsocket.Client.connect('ws://118.145.158.207:22080/voice-chat/ws?is_auth=0&platform=raisound&lang=zh-cn', debug=False)#普通话测试环境
+            else:
+                token = EventMesh.publish("get_dev_token")
+                print("token:{}".format(token))
+                if token != None:
+                    self.AI_client_voice_chat = uwebsocket.Client.connect('ws://amp.raisound.com/voice-chat/ws?dt={}'.format(token), debug=False)
+                else:
+                    self.websocket_error()
+                    return
+        except Exception as e: #网络连接异常
+            usys.print_exception(e)
+            print("websocket_connect_voice_chat error!!!\r\n")
+            #self.connect_timerout_popup(2)
+            self.websocket_error()
+            return
+        print("AI_client_voice_chat:{}".format(self.AI_client_voice_chat))
+        if self.AI_client_voice_chat == None:
+            EventMesh.publish("update_dev_token")#获取token
+            self.websocket_error()
+            return
+        utime.sleep_ms(20)
+        # 线程接收数据
+        if self.AI_client_voice_chat_recv_id != 0:
+            try:
+                _thread.stop_thread(self.AI_client_voice_chat_recv_id)
+            except Exception as e:
+                    usys.print_exception(e)
+            self.AI_client_voice_chat_recv_id = 0
+        _thread.stack_size(self.Audio_buf_size+8*1024)
+        self.AI_client_voice_chat_recv_id = _thread.start_new_thread(self.AI_client_voice_chat_recv, (self.AI_client_voice_chat,))
+        _thread.stack_size(8*1024)
+        self.AI_client_voice_chat_isconnect = 1
+    def websocket_error(self):
+        print("websocket_error!!!!")
+        print("websocket_error!!!!")
+        print("websocket_error!!!!")
+        print("websocket_error!!!!")
+        self.websocket_error_count+=1
+        if self.websocket_error_count <=3:
+            EventMesh.publish("audio_montage_play",["xinhaoruo1.mp3"])
+        elif self.websocket_error_count <10 :
+            EventMesh.publish("audio_montage_play",["xinhaoruo2.mp3"])
+        elif self.websocket_error_count >=10:
+            EventMesh.publish("paly_iccid_imei")    
+        else:
+            EventMesh.publish("audio_montage_play",["R_SIM_FAILE.mp3"])
+        #self.aud.play(1,1,'U:/static/R_SIM_FAILE.mp3')
+        self.AI_send_data_queue.clear()
+        self.AI_audio_queue.clear()
+        #self.VC_Speech_End()
+        EventMesh.publish("close_led")
+        try:
+            self.websocket_deconnect_voice_chat()
+        except Exception as e:
+                usys.print_exception(e)
+        try:
+            self.websocket_deconnect_asr()
+        except Exception as e:
+                usys.print_exception(e)
+
+    def websocket_deconnect_voice_chat(self):
+        print("websocket_deconnect_voice_chat {}!!!!!!!".format(self.AI_client_voice_chat_isconnect))
+        print("websocket_deconnect_voice_chat!!!!!!!")
+        if self.AI_client_voice_chat_recv_id != 0:#关闭线程
+            try:
+                _thread.stop_thread(self.AI_client_voice_chat_recv_id)
+            except Exception as e:
+                usys.print_exception(e)
+        self.AI_client_voice_chat_recv_id = 0
+        if self.AI_client_voice_chat_isconnect == 1:
+            self.AI_client_voice_chat_isconnect = 0
+            self.AI_client_voice_chat.close()
+        print("websocket_deconnect_voice_chat {}!!!!!!!".format(self.AI_client_voice_chat_isconnect))
+    #websocket发送ping
+    def AI_client_voice_chat_ping(self):
+        pass
+        if self.AI_client_voice_chat_isconnect == 1:
+            #self.AI_client_voice_chat.write_frame(0x09,b'ping ping')
+            self.AI_client_voice_chat_send("ping")
+            #print("websocket ping ping")
+
+    #websocket发送数据    
+    def AI_client_voice_chat_send(self,data_str):
+        if isinstance(data_str, str):#是字符串
+            print("AI_client_voice_chat_send:{}".format(data_str))
+            pass
+        # else:
+        #     print("AI_client_voice_chat_send:len{}".format(len(data_str)))
+        self.AI_send_data_queue.put([AI_client_voice_chat_num,data_str]) 
+    
+    #Ai VC websocket返回数据       
+    def AI_client_voice_chat_recv(self,cli):
+        count = 0
+        while True:
+            try:
+                # 死循环接收数据
+                count+=1
+                if self.tts_in_data_len - self.tts_out_data_len > 64*1024 or count>4:
+                    count = 0
+                    utime.sleep_ms(1)
+                recv_data = cli.recv()
+                self.close_timerout = 0#服务器有返回清零退出时间
+                if not recv_data:
+                    # 服务器关闭连接或客户端关闭连接
+                    print("服务器主动关闭连接!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+                    #self.AI_client_voice_chat_isconnect = 0
+                    #self.websocket_error()
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error}) 
+                    #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(1500)})
+                    
+                    break
+                try:
+                    self.websocket_error_count = 0
+                    if isinstance(recv_data, str):#返回的是字符串
+                        print("VC VC:recv_data:{}".format(recv_data))
+                        jsload_data =  ujson.loads(recv_data)
+                        #print("AI_client_voice_chat_recv jsload_data = {}".format(jsload_data))
+                        if jsload_data["status"] != 20000000:#返回错误
+                            self.websocket_error()
+                            break
+                        if jsload_data["event"] == "Started" :#会话开始
+                            payload = jsload_data["payload"]
+                            self.VC_dialog_id = payload["dialog_id"] 
+                            self.VC_task_id = jsload_data["task_id"] 
+                            print("VC:Started!!!!!!!!\r\n")
+                        elif jsload_data["event"]  == "SpeechContent" :#asr转译
+                            print("VC:SpeechContent!!!!!!!!\r\n")
+                            payload = jsload_data["payload"]
+                            
+                            
+                            if(payload['finished'] == True):#asr结束
+                                self.voice_chat_state =  VC_State_SpeechEnd
+                                #self.VC_Speech_End()#停止录音
+                                text = payload["text"]
+                                if self.check_text(text) == 0:
+                                    #print("check_text ok:{} self.VC_TTS_voice_num:{},{}".format(text,self.VC_TTS_voice_num,self.VC_TTS_voice_type[self.VC_TTS_voice_num]))
+                                    self.AI_send_data_queue.clear()
+                                    EventMesh.publish("open_led_all")
+                                    try:
+                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_voice_chat}) 
+                                        #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(1500)})
+                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                                    except Exception as e:
+                                        usys.print_exception(e)
+                                
+                                pass
+                            else:
+                                self.AI_listen_end = 0
+
+                        elif jsload_data["event"]  == "SpeechEnded" :#服务器下发ASR说话结束
+                            self.voice_chat_state =  VC_State_SpeechEnd
+                        elif jsload_data["event"]  == "RespondingContent" :#chat回答      
+                            pass
+                            # payload = jsload_data["payload"]
+
+                            # if(payload['finished'] == True):#chat回答 结束,开始tts
+                            #     self.AI_client_chat_end_flag = 1
+                            #     pass
+                            # else:
+                                
+                            #     self.AI_client_chat_end_flag = 0
+                            #     self.AI_client_tts_data_len = 0
+                            #utime.sleep_ms(5)
+                            
+                        elif jsload_data["event"]  == "RespondingStarted" :#音频开始下发
+                            self.play_flag = 0
+                            self.voice_chat_state = VC_State_TTSStart
+                            self.VC_Speech_End()#停止录音
+                            self.VC_Play_Start()
+                            #self.tts_fd = open('/usr/tts_tesr.pcm','w')
+                            pass
+                        elif jsload_data["event"]  == "RespondingEnded" :#音频下发结束
+                            #if self.voice_chat_state == VC_State_TTSStart:
+                                print("RespondingEnded!!!!!!" )
+                                self.voice_chat_state = VC_State_TTSEnd
+                                if self.asr_satrt_flag == 0 :
+                                    self.asr_satrt_flag =1
+                            #self.tts_fd.close()
+                            #pass
+                        elif jsload_data["event"]  == "DialogStateChanged" :#状态切换事件
+                            payload = jsload_data["payload"]
+                            if payload["state"] == "Listening":
+                                self.voice_chat_state = VC_State_Listening
+                                if self.AI_TTS_str != "" or self.AI_ASR_str != "":#有tts数据,则请求TTS数据,没有就请求开始上传语音
+                                    self.AI_client_voice_chat_RequestToRespond()
+                                else:
+                                    self.VC_Speech_Start()#开启线程获取录音数据
+                                    #self.AI_client_voice_chat_send_speech()#开始上传语音
+                                #self.AI_client_voice_chat_RequestToRespond()#chat请求或者tts请求
+                                EventMesh.publish("open_led_red")
+                            if payload["state"] == "Thinking":#准备开始TTS
+                                self.voice_chat_state = VC_State_Thinking
+                                
+                                self.AI_client_tts_data_total_len = 0
+                                EventMesh.publish("open_led_all")
+                            if payload["state"] == "Responding":
+                                self.voice_chat_state = VC_State_Responding
+                                EventMesh.publish("open_led_green")
+                        elif jsload_data["event"]  == "RequestAccepted" :#请求上传语音被允许
+                            #self.voice_chat_state =  VC_State_Responding
+                            #self.AI_client_voice_chat_send_speech()#开始上传语音
+                            pass
+                    else:#下发音频数据
+                        #填充头
+                        #self.tts_fd.write(recv_data)
+                        #recv_data_len = len(recv_data)
+                        # data_len_b = recv_data_len.to_bytes(4,'little')#数据长度转16进制数组
+                        # h_data = [ 0x52 ,0x49 ,0x46 ,0x46 #,0x24 ,0x00 ,0x00 ,0x00 #文件标识、文件大小
+                        #         ,0x57 ,0x41 ,0x56 ,0x45 ,0x66 ,0x6D ,0x74 ,0x20  #文件格式、格式块标识符
+                        #         ,0x10 ,0x00 ,0x00 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x80 ,0x3E ,0x00 ,0x00  #格式块大小4、音频格式2、声道数2、采样率4
+                        #         ,0x80 ,0x3E ,0x00 ,0x00 ,0x02 ,0x00 ,0x10 ,0x00 ,0x64 ,0x61 ,0x74 ,0x61]#每秒字节数4、数据块对齐2、位深度2、data4
+                        # h_data_b = bytes(h_data)
+                        # file_len = recv_data_len+len(h_data_b)+4+4
+                        # file_len_b = file_len.to_bytes(4,'little')#文件长度转16进制数组
+                        # h_data_b = h_data_b[:4]+file_len_b+h_data_b[4:]+data_len_b
+
+                        #print("下发音频数据1:{}".format(len(recv_data)))
+                        # # self.AI_client_tts_data_total_len += len(recv_data)
+                        # # self.AI_client_tts_data_len += len(recv_data)
+                        # #if self.AI_client_tts_data_total_len >10*1024:
+                        # ret=self.AI_audio_queue.put([recv_data,""])
+                        # print("下发音频数据2:{}".format(len(recv_data)))
+                        if self.voice_chat_state >= VC_State_TTSStart:
+                            self.put_record_data([recv_data,""])
+                        #EventMesh.publish("publish_AI_btnInfo",{"func":self.put_record_data,"data":[recv_data,""]}) 
+                except Exception as e:
+                    usys.print_exception(e)
+                
+            except Exception as e:
+                    usys.print_exception(e)
+                    #self.websocket_error()
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error})#
+                    break
+        self.AI_client_voice_chat_isconnect = 0
+        self.AI_client_voice_chat_recv_id = 0 
+        print("AI_client_voice_chat_recv END!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+    def put_record_data(self,data):
+        #print("下发音频数据1:{}".format(len(data[0])))
+        # self.AI_client_tts_data_total_len += len(recv_data)
+        # self.AI_client_tts_data_len += len(recv_data)
+        #if self.AI_client_tts_data_total_len >10*1024:
+        ret=self.AI_audio_queue.put(data)
+        self.tts_in_data_len += len(data[0])
+        print("下发音频数据2:{},{}".format(len(data[0]),self.tts_in_data_len))
+    def check_text(self,text):
+        if len(text)>60:
+            return -1
+        try:
+            if isinstance(text, str): 
+                if text.find("更改声音") != -1:
+                    self.VC_TTS_voice_num += 1
+                    if self.VC_TTS_voice_num >= len(self.VC_TTS_voice_type):
+                        self.VC_TTS_voice_num = 0
+                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_TTS_voice_num])
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                    self.AI_TTS_str = "更改成功"    
+                    return 0
+                if text.find("声音改为") != -1 and (text.find("男声") != -1 or text.find("男生") != -1 ):
+                    self.VC_TTS_voice_num = 1
+                    
+                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_TTS_voice_num])
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                    self.AI_TTS_str = "更改成功" 
+                    return 0
+                if text.find("声音改为") != -1 and  (text.find("女声") != -1 or text.find("女生") != -1 ):
+                    self.VC_TTS_voice_num = 0
+                    
+                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_TTS_voice_num])
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                    self.AI_TTS_str = "更改成功" 
+                    return 0
+                if text.find("声音改为") != -1 and  (text.find("同声") != -1 or text.find("童声") != -1 ):
+                    self.VC_TTS_voice_num = 2
+                    
+                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_TTS_voice_num])
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                    self.AI_TTS_str = "更改成功" 
+                    return 0
+                if text.find("声音改为") != -1 and  (text.find("粤语") != -1 or text.find("越野") != -1 ):
+                    self.VC_TTS_voice_num = 3
+                    
+                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_TTS_voice_num])
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                    self.AI_TTS_str = "更改成功" 
+                    return 0
+                if text.find("声音改为") != -1 and text.find("四川话") != -1 :
+                    self.VC_TTS_voice_num = 4
+                    
+                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_TTS_voice_num])
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                    self.AI_TTS_str = "更改成功" 
+                    return 0
+                if text.find("切换对话模式") != -1:
+                    if self.VC_mode == 0:
+                       self.VC_mode = 1
+                       self.AI_TTS_str = "已切换到单对话模式" 
+                    else:
+                        self.VC_mode = 0 
+                        self.AI_TTS_str = "已切换到长对话模式" 
+                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_mode])
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+
+                    return 0
+                if text.find("音量") != -1 and text.find("加") != -1 :
+                    self.VC_TTS_volume += 10
+                    if self.VC_TTS_volume > 100:
+                        #EventMesh.publish("audio_montage_play",["yinliangyizuida.mp3"])
+                        #self.aud.play(1,0,'U:/static/yinliangyizuida.mp3')#音量已最大
+                        self.AI_TTS_str = "音量已最大" 
+                        self.VC_TTS_volume = 100
+                    else:
+                        self.aud.setVolume(self.VC_TTS_volume //10)
+                        EventMesh.publish("set_storage_config",["VC_TTS_volume",self.VC_TTS_volume])
+                        #EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                        #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#配置成功
+                        self.AI_TTS_str = "配置成功,当前音量 {}".format(self.VC_TTS_volume)
+                        
+                    return 0
+                if text.find("音量") != -1 and text.find("减") != -1:
+                    self.VC_TTS_volume -= 10
+                    if self.VC_TTS_volume < 0:
+                        self.VC_TTS_volume = 0
+                        #EventMesh.publish("audio_montage_play",["yinliangyizuixiao.mp3"])
+                        #self.aud.play(1,0,'U:/static/yinliangyizuixiao.mp3')#音量已最小
+                        self.AI_TTS_str = "音量已最小"
+                    else:
+                        self.aud.setVolume(self.VC_TTS_volume //10)
+                        EventMesh.publish("set_storage_config",["VC_TTS_volume",self.VC_TTS_volume])
+                        #EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                        #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#配置成功
+                        self.AI_TTS_str = "配置成功,当前音量 {}".format(self.VC_TTS_volume)
+                    return 0
+                if text.find("电量") != -1 and text.find("查询") != -1:
+                    battery = EventMesh.publish("get_battery")
+                    #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)])
+                    #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余
+                    self.AI_TTS_str = "电量剩余百分之{}".format(battery)
+                    return 0
+                if text.find("电压") != -1 and text.find("查询") != -1:
+                    Vbatt = Power.getVbatt()
+                    #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)])
+                    #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余
+                    self.AI_TTS_str = "当前电池电压{}".format(Vbatt)
+                    return 0
+                if text.find("进入工厂模式") != -1 :
+                    self.factory_mode()
+                    return 1
+                if text.find("信号") != -1 and text.find("查询") != -1:
+                    signal = net.csqQueryPoll()
+                    
+                    self.AI_TTS_str = "当前信号{}".format(signal)
+                    return 0
+                
+                if text.find("再见") != -1 or text.find("拜拜") != -1:
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+                    return 1
+        except Exception as e:
+                usys.print_exception(e)
+        return -1
+    #获取trace_id
+    def get_trace_id(self):
+        t = utime.mktime(utime.localtime())
+        t = t*1000+urandom.randint(0, 1000)
+        md5_data = "{}".format(t)#md5签名
+        sign_data = ""
+        hash_obj = uhashlib.md5(md5_data)
+        res = hash_obj.digest()
+
+        # 转成十六进制表示
+        sign_data = ubinascii.hexlify(res)
+        sign_data = sign_data.decode('ascii')
+        return sign_data
+    def get_new_message_id(self):
+        message_id = self.get_trace_id()+"aaa"+self.get_trace_id()
+        self.VC_message_id=message_id[:32]
+        return self.VC_message_id 
+    def get_new_task_id(self):
+        task_id = self.get_trace_id()+"aaa"+self.get_trace_id()
+        self.VC_task_id=task_id[:32]
+        return self.VC_task_id
+    #开始播放声音
+    def VC_Play_Start(self):
+        self.tts_in_data_len = 0
+        self.tts_out_data_len = 0
+        if self.VC_play_TYPE == VC_play_TYPE_PCM:
+            if self.VC_play_samplerate == 8000:
+                pass
+            elif self.VC_play_samplerate == 16000:
+                if self.play_pcm == None:        
+                    self.play_pcm = audio.Audio.PCM(0,1,16000,1,1,2)
+                    #self.play_pcm.setVolume(11)
+                    ret = self.play_pcm.stream_write_start()
+                    print("self.record_pcm.stream_write_start:ret:{}".format(ret))
+        elif self.VC_play_TYPE == VC_play_TYPE_MP3:
+            pass
+    #停止播放声音
+    def VC_Play_End(self):
+        if self.VC_play_TYPE == VC_play_TYPE_PCM:
+            if self.VC_play_samplerate == 8000:
+                self.aud.stopPlayStream()
+                self.aud.stopAll()
+            elif self.VC_play_samplerate == 16000:
+                if self.play_pcm != None:
+                    print("Close:play_pcm.close()!!!!!!!!!!!!!!!!!!")
+                    try:
+                        self.play_pcm.stream_stop()
+                        self.play_pcm.close()
+                    except Exception as e:
+                        usys.print_exception(e)
+                    self.play_pcm=None
+                self.aud.stopPlayStream()
+                self.aud.stopAll()
+        elif self.VC_play_TYPE == VC_play_TYPE_MP3:
+            self.aud.stopPlayStream()
+            self.aud.stopAll()
+   
+    def _1S_timer_cb(self,*argc):
+        EventMesh.publish("system_sleep_rest")#防止黑屏
+        self.close_timerout += 1
+        if self.close_timerout > 30:#20秒没数据就close
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+        # print("get_audio_state !!!!!{} {} {}\r\n".format(self.play_end,EventMesh.publish("get_audio_state"),self.play_flag))
+        #self.LocalRespondingEnded_timerout+=1
+        if self.voice_chat_state == VC_State_TTSEnd and self.AI_audio_queue.empty()  :#self.AI_audio_queue为空且tts下发结束
+            self.LocalRespondingEnded_timerout += 1
+        if self.LocalRespondingEnded_timerout >= 3:
+            self.LocalRespondingEnded_timerout = 0
+            if self.VC_mode == 1 :#长按单次问答模式
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+            else:
+                #通知服务器播放结束
+                self.AI_client_voice_chat_LocalRespondingEnded()
+        self.pingping_timerout+=1
+        if self.pingping_timerout>5:
+            self.pingping_timerout=0
+            self.AI_client_voice_chat_ping()
+        
+    #VC开始
+    def AI_VC_start(self):
+        
+        self.VC_Play_End()#关闭音频播放
+        
+        #self.aud.aud_tone_play(16,200)#播放按键音
+        self.LocalRespondingEnded_timerout = 0
+        self.close_timerout = 0
+        self.websocket_connect_asr()
+        if self.AI_client_asr_isconnect == 0:
+            return
+        if self.record_data_save_flag == 1:
+            try:
+                uos.remove('/usr/record_data.pcm')
+            except Exception as e:
+                usys.print_exception(e)
+            self.record_fd = open('/usr/record_data.pcm','w')
+        #utime.sleep_ms(50)
+        if self.AI_client_voice_chat_isconnect == 0:#没连接的时候请求开始
+            self.websocket_connect_voice_chat()#连接服务器
+            self.AI_client_voice_chat_start_requset()
+        else:
+            print("self.voice_chat_state :{}".format(self.voice_chat_state ))
+            if self.voice_chat_state > VC_State_SpeechStart:
+                #客户端打断对话
+                print("打断对话")
+                self.AI_client_voice_chat_RequestToSpeak()
+            elif self.voice_chat_state == VC_State_Listening:
+                #直接chat
+                print("直接chat")
+                self.AI_client_voice_chat_RequestToRespond()
+        if self.AI_client_voice_chat_isconnect == 0:
+            return
+        self.voice_chat_state = VC_State_None
+        if self.AI_TTS_str == "":#没有tts要播放的时候才开始录音
+            #开始asr录音
+            self.VC_Speech_Start()
+            pass
+        #开始线程
+        if self.AI_audio_queue_thread_id ==0:
+            _thread.stack_size(24*1024)
+            self.AI_audio_queue_thread_id = _thread.start_new_thread(self.AI_audio_queue_thread, ())
+            _thread.stack_size(8*1024)
+            print("AI_VC_start :AI_audio_queue_thread_id :{} ".format(self.AI_audio_queue_thread_id))
+        else:
+            print("AI_VC_start :AI_audio_queue_thread_id != 0 ")
+        if self.AI_send_data_queue_thread_id == 0:    
+            _thread.stack_size(self.Audio_buf_size+8*1024)
+            self.AI_send_data_queue_thread_id = _thread.start_new_thread(self.AI_send_data_queue_thread, ())
+            _thread.stack_size(8*1024)
+            print("AI_VC_start :AI_send_data_queue_thread_id :{} ".format(self.AI_send_data_queue_thread_id))
+        self._1S_timer.start(1000,1,self._1S_timer_cb)
+        self.pingping_timerout = 0
+        
+        
+    #开始会话
+    def AI_client_voice_chat_start_requset(self):
+        
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"Start"
+                },
+            "payload":{
+                "dialog_id":self.VC_dialog_id,
+                "device_id":modem.getDevImei(),
+                "user_agent":"python",
+                "in_format":"pcm",
+                "out_format":"mp3",
+                "in_sample_rate":self.VC_record_samplerate,
+                "sample_rate":self.VC_play_samplerate,
+                "space_time": 150,
+                "volume": str(self.VC_TTS_volume),
+                "voice":self.VC_TTS_voice_type[self.VC_TTS_voice_num],
+                "voice_detection":"enabled",
+                "simple_response":True,
+                "custom_variables":{
+                    "bot_name":"{}".format(self.bot_name)
+                }
+                },
+            
+        }
+        if self.VC_play_TYPE == VC_play_TYPE_PCM:
+            json_data["payload"]["out_format"]='pcm'
+        if self.VC_record_TYPE == VC_record_TYPE_AMR :
+            json_data["payload"]["in_format"]='amr'
+            pass
+        if self.VC_mode == 1:
+            json_data["payload"]["voice_detection"]='disable'
+        self.voice_chat_state = VC_State_None
+        self.AI_client_voice_chat_send(ujson.dumps(json_data))
+ 
+    #开始上传语音
+    def AI_client_voice_chat_send_speech(self):
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"SendSpeech"
+                },
+            "payload":
+            {
+                "dialog_id":self.VC_dialog_id
+            }
+        }
+        self.AI_client_voice_chat_send(ujson.dumps(json_data))
+        self.VC_Speech_Start()#开启线程获取录音数据
+        self.voice_chat_state =  VC_State_SpeechStart
+    #结束上传语音
+    def AI_client_voice_chat_end_speech(self):
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"StopSpeech"
+                },
+            "payload":{
+                "dialog_id":self.VC_dialog_id
+                }
+        }
+        self.AI_client_voice_chat_send(ujson.dumps(json_data))
+        self.VC_Speech_End()#停止线程录音
+
+    #通知服务器开始播放
+    def AI_client_voice_chat_LocalRespondingStarted(self):
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"LocalRespondingStarted"
+                },
+            "payload":{
+                "dialog_id":self.VC_dialog_id
+                }
+        }
+        self.AI_client_voice_chat_send(ujson.dumps(json_data))
+    #通知服务器播放结束
+    def AI_client_voice_chat_LocalRespondingEnded(self):
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"LocalRespondingEnded"
+                },
+            "payload":{
+                "dialog_id":self.VC_dialog_id
+                }
+        }
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) 
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_voice_chat_send,"data":ujson.dumps(json_data)}) 
+        # utime.sleep_ms(1)
+        # self.AI_client_voice_chat_send(ujson.dumps(json_data))
+        self.voice_chat_state = VC_State_End
+    #客户端打断对话
+    def AI_client_voice_chat_RequestToSpeak(self):
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"RequestToSpeak"
+                },
+            "payload":{
+                "dialog_id":self.VC_dialog_id
+                }
+        }
+        print("AI_client_voice_chat_RequestToSpeak!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) 
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_voice_chat_send,"data":ujson.dumps(json_data)}) 
+        # utime.sleep_ms(1)
+    #请求TTS或者chat事件
+    def AI_client_voice_chat_RequestToRespond(self):
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"RequestToRespond"
+                },
+            "payload":{
+                "dialog_id":self.VC_dialog_id,
+                "type":"transcript",#prompt是跳过asr,transcript是跳过asr和大模型
+                "text":""
+                }
+        }
+
+        print("AI_client_voice_chat_RequestToRespond!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        if self.AI_TTS_str != "":
+            json_data["payload"]["text"] = self.AI_TTS_str
+            json_data["payload"]["type"] = "transcript"
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) 
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_voice_chat_send,"data":ujson.dumps(json_data)}) 
+            self.AI_TTS_str = ""
+        elif self.AI_ASR_str != "":
+            json_data["payload"]["text"] = self.AI_ASR_str
+            json_data["payload"]["type"] = "prompt"
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) 
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_voice_chat_send,"data":ujson.dumps(json_data)})
+            self.AI_ASR_str = ""
+        # utime.sleep_ms(1)
+    #发送数据队列
+    def AI_send_data_queue_thread(self):
+        print("AI_send_data_queue_thread:start")
+        count_t = 0
+        while True:
+            if self.AI_send_data_queue.empty() :#不能去掉,去掉会卡死
+                count_t+=1
+                # if count_t%200 == 0:
+                #     print("self.AI_send_data_queue.empty")
+                utime.sleep_ms(1)
+            else:
+                #data[0]是websocket连接对象编号,data[1]是数据
+                #print("AI_send_data_queue_thread:get")
+                data = self.AI_send_data_queue.get()
+                #print("AI_send_data_queue_thread:num{} len{}".format(data[0],len(data[1])))
+                if data != None:
+                    try:
+                        #data["func"](data["data"])
+                        # 发送数据
+                        #bytes_data = bytes(data[1])
+                        #data[0].send(data[1])
+                        #print("AI_send_data_queue_thread:len:{}".format(len(data[1])))
+                        #print("AI_send_data_queue_thread on line asr recv :{} vc recv:{}".format(_thread.threadIsRunning(self.AI_client_asr_recv_id),_thread.threadIsRunning(self.AI_client_voice_chat_recv_id)))
+                        if data[0] == AI_client_voice_chat_num:
+                            # if self.AI_client_voice_chat_isconnect == 0:
+                            #     try:
+                            #         self.websocket_connect_voice_chat() 
+                            #     except Exception as e: #网络连接异常
+                            #         usys.print_exception(e)
+                            self.pingping_timerout = 0
+                            #print("VC: send_data len:{}".format(len(data[1])))
+                            if self.AI_client_voice_chat != None and self.AI_client_voice_chat_isconnect == 1:
+                                self.AI_client_voice_chat.send(data[1])
+                            #print("VC: send_data end")
+
+                        if data[0] == AI_client_asr_num:
+                            #self.pingping_timerout = 0
+                            #print("VC: send_data len:{}".format(len(data[1])))
+                            if self.AI_client_asr != None and self.AI_client_asr_isconnect == 1:
+                                self.AI_client_asr.send(data[1])
+                        #print("VC: send_data end")
+                    except Exception as e:
+                        print("DeviceInfo_queue_thread:ERROR:{}".format(e))
+                        usys.print_exception(e)
+                        if data[0] == AI_client_voice_chat_num:
+                            #self.websocket_error()
+                            pass
+                            #self.websocket_deconnect_voice_chat()
+                            self.AI_client_voice_chat_isconnect = 0
+                            try:
+                                self.websocket_error()
+                                #self.websocket_deconnect_voice_chat()
+                            except Exception as e: #网络连接异常
+                                usys.print_exception(e)
+                        if data[0] == AI_client_asr_num: 
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_connect_asr}) #重连
+                         
+    ############################################
+    # 音频队列        
+    def AI_audio_queue_thread(self):
+        print("AI_audio_queue_thread start")
+        count = 0
+        while True:
+            try:
+                # if self.AI_send_data_queue_thread_id == 0:
+                #     break
+                # print("AI_audio_queue_thread")
+                if self.AI_audio_queue.empty() :
+                    utime.sleep_ms(1)
+                    count+=1
+                    if count%5000 == 1:
+                        print("AI_audio_queue_thread on")
+                else:
+                    data = self.AI_audio_queue.get()
+                    self.close_timerout = 0
+                    if self.play_flag == 0:
+                        self.play_flag =1
+                        print("AI_client_voice_chat_LocalRespondingStarted!!!")
+                        self.AI_client_voice_chat_LocalRespondingStarted()#通知服务器开始播放
+                    #self.AI_client_tts_data_len=len(data)
+                    print("\r\naudio_queue:len:{},data{}".format(len(data[0]),len(data[1])))
+                    if len(data[0]) > 10:
+                        try:
+                            if self.VC_play_TYPE == VC_play_TYPE_PCM:
+                                if self.VC_play_samplerate == 8000:
+                                    tmp= self.aud.playStream(1,data[0] )
+                                elif self.VC_play_samplerate == 16000:
+                                
+                                
+                                    
+                                    write_buf = bytearray(data[0])
+                                    #print("play_pcm.stream_write1!!")
+                                    if self.play_pcm != None:
+                                        ret = self.play_pcm.stream_write(write_buf,len(write_buf))
+                                        #ret= self.aud.playStream(1, data[0])#播放音频流
+                                        self.tts_out_data_len += ret
+                                        print("play_pcm.stream_write:{}".format(self.tts_out_data_len))
+                            elif self.VC_play_TYPE == VC_play_TYPE_MP3:
+                                tmp= self.aud.playStream(3, data[0])#播放音频流
+                                
+                                if tmp != 0:
+                                    print("2playStream:error tmp:{} data len:{}!!!!!!!!!!!!".format(tmp,len(data[0])))
+                                    # # #播放失败的时候填充WAV头
+                                    # data_len = len(data[0])
+                                    # data_len_b = data_len.to_bytes(4,'little')#数据长度转16进制数组
+                                    # h_data = [ 0x52 ,0x49 ,0x46 ,0x46 #,0x24 ,0x00 ,0x00 ,0x00 #文件标识、文件大小
+                                    #         ,0x57 ,0x41 ,0x56 ,0x45 ,0x66 ,0x6D ,0x74 ,0x20  #文件格式、格式块标识符
+                                    #         ,0x10 ,0x00 ,0x00 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x80 ,0x3E ,0x00 ,0x00  #格式块大小4、音频格式2、声道数2、采样率4
+                                    #         ,0x80 ,0x3E ,0x00 ,0x00 ,0x02 ,0x00 ,0x10 ,0x00 ,0x64 ,0x61 ,0x74 ,0x61]#每秒字节数4、数据块对齐2、位深度2、data4
+                                    # h_data_b = bytes(h_data)
+                                    # file_len = data_len+len(h_data_b)+4+4
+                                    # file_len_b = file_len.to_bytes(4,'little')#文件长度转16进制数组
+                                    # h_data_b = h_data_b[:4]+file_len_b+h_data_b[4:]+data_len_b
+                                    # #self.aud.playStream(2, h_data_b)#播放音频流
+                                    # tmp= self.aud.playStream(2, h_data_b+data[0])#播放音频流
+                                    # print("3playStream:tmp:{} !!!!!!!!!!!!".format(tmp))
+                            
+                            #print("出:{},{}!!!".format(len(data[0]),self.AI_client_tts_data_len))
+                            mem = gc.mem_free()
+                            #print('1剩余内存RAM:{} KB'.format(mem / 1024))
+                        except Exception as e:
+                            print("AI_audio_queue_thread:ERROR:")
+                            usys.print_exception(e)
+                    
+                    # if self.voice_chat_state == VC_State_TTSEnd and self.AI_audio_queue.empty() :#self.AI_audio_queue为空且tts下发结束
+                    #     #通知服务器播放结束
+                    #     self.AI_client_voice_chat_LocalRespondingEnded()
+            except Exception as e:
+                print("AI_audio_queue_thread:ERROR:")
+                usys.print_exception(e)
+        #print("AI_audio_queue_thread:exit")
+    def factory_mode(self):
+        print("factory_mode")
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.factory_start}) 
+    def factory_start(self):
+        self.factory_timer.start(1000, 1, self.factory_timer_cb)
+    def factory_timer_cb(self, *args, **kwargs):
+        print("factory_timer_cb play......")
+        self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+
+    def Close(self):
+        print("ai_VC Close1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        self.tts_in_data_len = 0
+        self.tts_out_data_len = 0
+        
+        print("ai_VC Close1.1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        self.VC_init()
+        self.VC_Speech_End()
+        print("ai_VC Close1.2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        if self.AI_send_data_queue.empty()!=True:
+            self.AI_send_data_queue.clear()
+        self.AI_TTS_str = ""
+        self.AI_ASR_str = ""
+        self.AI_ASR_str_tmp = ""
+        self.AI_ASR_flag  = 0
+        print("ai_VC Close1.3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        try:
+        #销毁线程
+            if self.AI_audio_queue_thread_id != 0:
+                try:
+                    _thread.stop_thread(self.AI_audio_queue_thread_id)
+                except Exception as e:
+                    usys.print_exception(e)
+                self.AI_audio_queue_thread_id = 0
+            if self.AI_send_data_queue_thread_id != 0:
+                try:
+                    _thread.stop_thread(self.AI_send_data_queue_thread_id)
+                except Exception as e:
+                    usys.print_exception(e)
+            self.AI_send_data_queue_thread_id = 0
+            
+
+        except Exception as e:
+            usys.print_exception(e)
+        print("ai_VC Close2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        try:
+            self.websocket_deconnect_voice_chat()
+        except Exception as e:
+            usys.print_exception(e)
+        print("ai_VC Close3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")
+        try:
+            self.websocket_deconnect_asr()
+        except Exception as e:
+            usys.print_exception(e)
+        self._1S_timer.stop()
+        self.factory_timer.stop()
+        
+        if self.record_data_save_flag == 1:
+            if self.record_fd :
+                self.record_fd.close()
+            self.record_fd = None
+    def VC_init2(self):
+        self.VC_init()
+        if self.AI_send_data_queue.empty()!=True:
+            self.AI_send_data_queue.clear()
+        print("ai_VC VC_init2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        try:
+            self.websocket_deconnect_voice_chat()
+        except Exception as e:
+            usys.print_exception(e)
+        print("ai_VC Close3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")
+        self._1S_timer.stop()
+
+
+    def VC_init(self):
+        
+        print("VC_init:AI_send_data_queue:size:{}".format(self.AI_send_data_queue.size()))
+        if self.AI_audio_queue.empty()!=True:
+            self.AI_audio_queue.clear()
+        
+        print("VC_init2")
+        #self.VC_Speech_End()
+        print("VC_init3")
+        self.VC_Play_End()
+        print("VC_init4")
+        
+        EventMesh.publish("close_led")
+        # num = EventMesh.publish("get_volum_size")
+        # if num == None:
+        #     num = 8
+        # self.aud.setVolume(num)#恢复原始音量
+        
\ No newline at end of file
diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/usr/ai_test.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/usr/ai_test.py
new file mode 100644 (file)
index 0000000..13417ef
--- /dev/null
@@ -0,0 +1,65 @@
+import uwebsocket
+import _thread
+import utime
+import usys
+import ujson
+# json_data = \
+#         {
+#             "id": "123456895461254",
+#             "event_type": "transcriptions.update",
+#             "data": {
+#                 "input_audio": {         #输入音频格式
+#                     "format": "pcm",       #输入音频格式,支持 pcm/wav/ogg。默认 wav
+#                     "codec": "pcm",         #输入音频编码。 pcm/opus。默认 pcm
+#                     "samplate_rate": 24000,  #采样率
+#                     "channel": 1, #通道数
+#                     "bit_depth": 16 #位深
+#                 },
+#             }
+#         }
+json_data =\
+{
+       "header": {
+               "trace_id": "x70g1n8gfdg",
+               "event": "Start"
+       },
+       "payload": {
+               "device_id": "test_device_id",
+               "user_agent": "python",
+               "dialog_id": "",
+               "in_format": "pcm",
+               "out_format": "pcm",
+               "in_sample_rate": 16000,
+               "volume": "10",
+               "sample_rate": 16000,
+               "voice": "zh_female_shuangkuaisisi_moon_bigtts",
+               "voice_detection": "disable"
+       }
+}
+url="wss://ws.coze.cn/v1/chat"
+url="wss://ws.coze.cn/v1/chat?bot_id=7462617881076351002"
+url = "ws://118.145.158.207:22080/voice-chat/v2/ws?is_auth=0"
+#url="wss://ws.coze.cn/v1/audio/speech"
+print("url:{}".format(url))
+Headers = {"Authorization":"Bearer pat_SSaiOzccrRLaQEaB4sdshvHZQzqjeWD5jq2GWPVoWRx4N8XcdraHWYqdDjK5zpR1"}
+s_client = uwebsocket.Client.connect(url, headers=Headers, debug=True)
+def AI_client_asr_recv(cli):
+        while True:
+            try:
+                # 死循环接收数据
+                
+                utime.sleep_ms(1)
+                recv_data = cli.recv()
+                print("AI_client_asr_recv:recv_data={}".format(recv_data))
+                if not recv_data:
+                    # 服务器关闭连接或客户端关闭连接
+                    print("cli close")
+                    cli.close()
+                    break
+            except Exception as e:
+                    
+                    usys.print_exception(e)
+                    break
+AI_client_asr_recv_id = _thread.start_new_thread(AI_client_asr_recv, (s_client,))
+s_client.send(ujson.dumps(json_data))
+print("send:{}".format(ujson.dumps(json_data)))
diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/usr/test.mp3 b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/usr/test.mp3
new file mode 100644 (file)
index 0000000..52644cc
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/usr/test.mp3 differ
diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/usr/test1.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/usr/test1.py
new file mode 100644 (file)
index 0000000..6b0a159
--- /dev/null
@@ -0,0 +1,3854 @@
+from common import Abstract, LogAdapter
+import EventMesh
+import uwebsocket
+import usys
+import gc
+import urandom
+import uhashlib
+import ubinascii
+import ujson
+import osTimer
+import _thread
+from queue import Queue
+import utime
+import audio
+import uos
+from machine import Pin
+from machine import ExtInt
+from machine import WDT
+import modem
+import sim
+import net
+import base64
+import ucryptolib
+import urandom as random
+import request
+import ql_fs
+from misc import Power,USB,PowerKey
+import ntptime
+import machine
+import dataCall
+import constants
+import versions
+import VAD
+#dev_type = "G10"
+#dev_type = "7PIN_BK"#小瑞
+dev_type = "7PIN"#柒牌
+#dev_type = 'momo'#食梦貘
+#dev_type = 'sjgq'#四季甘泉
+#dev_type = 'szbst'#深圳百事通
+
+class AI_led(Abstract):
+    def __init__(self):
+        if dev_type == "G10":
+            self.led_red = Pin(Pin.GPIO36, Pin.OUT, Pin.PULL_PD, 0)
+            self.led_green = Pin(Pin.GPIO44, Pin.OUT, Pin.PULL_PD, 1)
+            self.led_blue = Pin(Pin.GPIO21, Pin.OUT, Pin.PULL_PD, 1)
+        else:
+            self.led_red = Pin(Pin.GPIO36, Pin.OUT, Pin.PULL_PD, 0)
+            self.led_green = Pin(Pin.GPIO21, Pin.OUT, Pin.PULL_PD, 1)
+            self.led_blue = Pin(Pin.GPIO19, Pin.OUT, Pin.PULL_PD, 1)
+
+        #=1 红灯闪,=2白灯闪,=3绿灯闪,=4全部灯闪
+        self.led_flicker_flag = 0
+        self.led_flicker_on_off_flag = 0
+        self.led_flicker_timer = osTimer()
+        
+        EventMesh.subscribe("open_led_red",self.open_led_red)
+        EventMesh.subscribe("open_led_blue",self.open_led_blue)
+        EventMesh.subscribe("open_led_green",self.open_led_green)
+        EventMesh.subscribe("open_led_all",self.open_led_all)
+        EventMesh.subscribe("open_led_red_blue",self.open_led_red_blue)
+        EventMesh.subscribe("open_led_red_green",self.open_led_red_green)
+        EventMesh.subscribe("flicker_led_red",self.flicker_led_red)
+        EventMesh.subscribe("flicker_led_blue",self.flicker_led_blue)
+        EventMesh.subscribe("flicker_led_green",self.flicker_led_green)
+        EventMesh.subscribe("flicker_led_all",self.flicker_led_all)
+        EventMesh.subscribe("close_led",self.close_led)
+        EventMesh.publish("open_led_red")
+
+    def flicker_led_red(self,event,msg):
+        self.led_flicker_flag = 1
+        self.led_flicker_timer.start(1500, 1, self.led_flicker_timer_cb)
+
+    def flicker_led_blue(self,event,msg):
+        self.led_flicker_flag = 2
+        self.led_flicker_timer.start(1500, 1, self.led_flicker_timer_cb)
+
+    def flicker_led_green(self,event,msg):
+        self.led_flicker_flag = 3
+        self.led_flicker_timer.start(1500, 1, self.led_flicker_timer_cb)
+
+    def flicker_led_all(self,event,msg):
+        self.led_flicker_flag = 4
+        self.led_flicker_timer.start(1500, 1, self.led_flicker_timer_cb)
+
+    def led_flicker_timer_cb(self, *args, **kwargs):
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.led_flicker_timer_cb_})  
+    def led_flicker_timer_cb_(self):
+        if self.led_flicker_flag == 0:
+            self.led_flicker_timer.stop()
+            return
+        if self.led_flicker_on_off_flag == 0:
+            self.led_red.write(0)
+            self.led_blue.write(0)
+            self.led_green.write(0)
+            self.led_flicker_on_off_flag = 1
+        else:
+            self.led_flicker_on_off_flag = 0
+            if self.led_flicker_flag == 1:
+                self.led_blue.write(0)
+                self.led_green.write(0)
+                self.led_red.write(1)
+            elif self.led_flicker_flag == 2:
+                self.led_red.write(0)
+                self.led_green.write(0)
+                self.led_blue.write(1)
+            elif self.led_flicker_flag == 3:
+                self.led_red.write(0)
+                self.led_blue.write(0)
+                self.led_green.write(1)
+            elif self.led_flicker_flag == 4:
+                self.led_blue.write(1)
+                self.led_green.write(1)
+                self.led_red.write(1)
+
+    def open_led_red(self,event,msg):
+        #print("open_led_red")
+        self.led_flicker_flag = 0
+        #self.led_red.write(0)
+        self.led_blue.write(0)
+        self.led_green.write(0)
+        self.led_red.write(1)
+
+    def open_led_blue(self,event,msg):
+        #print("open_led_blue")
+        self.led_flicker_flag = 0
+        self.led_red.write(0)
+        #self.led_blue.write(0)
+        self.led_green.write(0)
+        self.led_blue.write(1)
+
+    def open_led_green(self,event,msg):
+        #print("open_led_green")
+        self.led_flicker_flag = 0
+        self.led_red.write(0)
+        self.led_blue.write(0)
+        #self.led_green.write(0)
+        self.led_green.write(1)
+
+    def open_led_red_blue(self,event,msg):
+        #print("open_led_blue")
+        self.led_flicker_flag = 0
+        self.led_red.write(1)
+        #self.led_blue.write(0)
+        self.led_green.write(0)
+        self.led_blue.write(1)
+
+    def open_led_red_green(self,event,msg):
+        #print("open_led_blue")
+        self.led_flicker_flag = 0
+        self.led_red.write(1)
+        #self.led_blue.write(0)
+        self.led_green.write(1)
+        self.led_blue.write(0)
+
+    def open_led_all(self,event,msg):
+        #print("open_led_all")
+        self.led_flicker_flag = 0
+        #self.led_red.write(0)
+        self.led_blue.write(1)
+        self.led_green.write(1)
+        self.led_red.write(1)
+
+    def close_led(self,event,msg):
+        #print("close_led")
+        self.led_flicker_flag = 0
+        self.led_red.write(0)
+        self.led_blue.write(0)
+        self.led_green.write(0)
+
+audio_buf = ['chenggong', 'didianguanji', 'IMEIhao', 'jianquancuowu', 'key_prompt', 'liuliangtishi', 'Low_power_warning', 'R_CHARGE_FULL', 'R_CHARGE_IN', 'R_CHARGE_OUT', 'R_READ_TIME_0', 'R_READ_TIME_1', 'R_READ_TIME_2', 'R_READ_TIME_3', 'R_READ_TIME_4', 'R_READ_TIME_5', 'R_READ_TIME_6', 'R_READ_TIME_7', 'R_READ_TIME_8', 'R_READ_TIME_9', 'R_READ_TIME_A', 'R_READ_TIME_B', 'R_READ_TIME_C', 'R_READ_TIME_D', 'R_READ_TIME_E', 'R_READ_TIME_F', 'R_READ_TIME_G', 'R_READ_TIME_H', 'R_READ_TIME_I', 'R_READ_TIME_J', 'R_READ_TIME_K', 'R_READ_TIME_L', 'R_READ_TIME_M', 'R_READ_TIME_N', 'R_READ_TIME_O', 'R_READ_TIME_P', 'R_READ_TIME_Q', 'R_READ_TIME_R', 'R_READ_TIME_S', 'R_READ_TIME_T', 'R_READ_TIME_U', 'R_READ_TIME_V', 'R_READ_TIME_W', 'R_READ_TIME_X', 'R_READ_TIME_Y', 'R_READ_TIME_Z', 'send_tone', 'shouhou', 'xinhaoruo1', 'zhengzaiguanji']
+class AI_dev(Abstract):
+    # AI
+    def __init__(self):
+        self.is_wdt = 0 #是否开启看门狗
+
+        self.VBATT_tab = {"charge_full":4300,"100" :4250 ,  "90":4179 , "80":4070, "60": 3883, "40":3770, "20":3699,  "10":3652,"5":3600,}
+        self.KeyAI_status = 0
+        self.KeyAI_timer_count = 0
+        self.KeyAI_long_press = 0
+        self.KeyAI_press = 0
+        if self.is_wdt == 1:
+            self.wdt = WDT(30) #开启看门狗
+        # self.wdt_timer = osTimer()
+        # self.wdt_timer.start(5000, 1, self.wdt_timer_cb)
+        count = 0
+        while True:
+            count += 1
+            if count > 20 :
+                break
+            data = dataCall.getInfo(1, 0)
+            print("data call INFO {}".format(data))
+            if data[2][0]:
+                self.network_state = 1
+                break
+            print("等待网络 {}...".format(count))
+            utime.sleep_ms(500)
+        self.KeyAI_timer = osTimer()
+        if dev_type == "G10":
+            self.extint_AI = ExtInt(ExtInt.GPIO19,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)
+            self.pwk_key = ExtInt(ExtInt.GPIO26, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.pwk_extint_cb)
+        else:
+            self.pwk_key = ExtInt(ExtInt.GPIO41, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.pwk_extint_cb)
+            #self.extint_AI = ExtInt(ExtInt.GPIO19,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)
+            self.extint_AI = ExtInt(ExtInt.GPIO22,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)
+        self.extint_AI.enable()
+        self.pwk_key_status = 0
+        self.pwk_key_timer_count = 0
+        self.pwk_key_long_press = 0
+        self.pwk_key_press = 0
+        self.pwk_key_timer = osTimer()
+        #self.pwk_key = ExtInt(ExtInt.GPIO26, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_DISABLE, self.pwk_extint_cb)
+        
+        self.pwk_key.enable() 
+        print("AI_dev:1")
+        self.btnInfo_queue = Queue(100)
+        self.btnInfo_queue_count = 0
+        _thread.stack_size(16*1024)
+        self.btnInfo_queue_thread_id = _thread.start_new_thread(self.btnInfo_queue_thread, ())
+        _thread.stack_size(8*1024)
+        EventMesh.subscribe("publish_AI_btnInfo",self.publish_AI_btnInfo)
+        EventMesh.subscribe("get_battery",self.get_battery)
+        EventMesh.subscribe("audio_montage_play",self.audio_montage_play)
+        EventMesh.subscribe("paly_iccid_imei",self.paly_iccid_imei)
+        EventMesh.subscribe("paly_device_res_error",self.paly_device_res_error)
+        EventMesh.subscribe("Power_off",self.pwk_key_Long_Press)
+        
+        print("AI_dev:2")
+        self.pk = PowerKey()
+        self.pk.powerKeyEventRegister(self.powerKey_callback)
+        self.usb = USB()
+        self.usb.setCallback(self.usb_event_cb)
+        self.usb_status = self.usb.getStatus()
+        self.usb_charge_flag = 0 
+        self.Low_power_warning_timer = 0
+        self.AI_dev_timer = osTimer()
+        self.AI_dev_timer.start(10000, 1, self.AI_dev_timer_cb)
+        print("AI_dev:AI_dev_timer")
+        self.aud = audio.Audio(0)
+        self.Low_power_warning_flag = 0
+        self.VC_TTS_volume =  EventMesh.publish("get_storage_config","VC_TTS_volume")#音量配置
+        if self.VC_TTS_volume == None:
+            self.VC_TTS_volume = 100
+        self.aud.setVolume(self.VC_TTS_volume //10)
+        #self.aud.play(1,0,'U:/static/xianyikaiji.mp3')#开机音频
+        #EventMesh.publish("audio_montage_play",["xianyikaiji.mp3"])
+        #EventMesh.publish("publish_AI_btnInfo",{"func":self.ntptime_cb})
+        self.check_rest_timer_count = 0
+        print("AI_dev:end")
+    def ntptime_cb(self):
+        #ntptime.settime(8)
+        print("timer:{}!!!!!!!!\r\n".format(utime.localtime()))
+    def usb_event_cb(self, state):
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.usb_event,"data":state})
+
+    def usb_event(self, state):    
+        status = state
+        self.usb_charge_flag = 0
+        if status == 1:#插入USB
+            print("charge R_CHARGE_in")
+            self.usb_status = 1
+            VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")#获取vc是否在运行
+            if VC_satrt_flag == None:
+                VC_satrt_flag = 0
+            if VC_satrt_flag == 0:
+                self.aud.stop()
+                #EventMesh.publish("flicker_led_red")#充电闪灯
+                #self.aud.play(1,1,'U:/static/R_CHARGE_IN.mp3')
+                EventMesh.publish("open_led_red")#充电红灯常亮
+                EventMesh.publish("audio_montage_play",["R_CHARGE_IN.mp3"])
+            self.Low_power_warning_flag  = 0
+            pass
+        elif status == 0:#拨出usbs
+            self.usb_status = 0
+            VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")#获取vc是否在运行
+            if VC_satrt_flag == None:
+                VC_satrt_flag = 0
+            if VC_satrt_flag == 0:
+                self.aud.stop()
+                EventMesh.publish("close_led")
+                EventMesh.publish("audio_montage_play",["R_CHARGE_OUT.mp3"])
+                #self.aud.play(1,1,'U:/static/R_CHARGE_OUT.mp3')
+    def btnInfo_queue_thread(self):
+        while True:
+            data = self.btnInfo_queue.get()
+            self.btnInfo_queue_count-=1
+            #EventMesh.debug_log("Info_queue:data = {}".format(data))
+            if data != None:
+                try:
+                    if "data" in data :
+                        data["func"](data["data"])
+                    else :
+                        data["func"]()
+                except Exception as e:
+                    #EventMesh.debug_log("btnInfo_queue:ERROR:{}".format(e))
+                    usys.print_exception(e)
+    def publish_AI_btnInfo(self,event,msg):
+        #print("publish_AI_btnInfo 1")
+        self.btnInfo_queue.put(msg)
+        self.btnInfo_queue_count+=1
+        if self.btnInfo_queue_count > 80:
+            self.btnInfo_queue_count =0
+            print("事件处理线程队列出问题,重启!!!!!!!!!!!!!!")
+            print("线程:{} 队列:{}".format(_thread.threadIsRunning(self.btnInfo_queue_thread_id),self.btnInfo_queue.size()))
+            # if _thread.threadIsRunning(self.btnInfo_queue_thread_id):
+            #     _thread.stop_thread(self.btnInfo_queue_thread_id)
+            # _thread.stack_size(10*1024)
+            # self.btnInfo_queue_thread_id = _thread.start_new_thread(self.btnInfo_queue_thread, ())
+            # _thread.stack_size(8*1024)
+            # self.btnInfo_queue.clear()
+            # self.btnInfo_queue = Queue(100)
+            EventMesh.publish("VC_error") #播放报错
+            utime.sleep_ms(1000)
+            self.aud.stopPlayStream()
+            self.aud.stopAll()
+            Power.powerRestart()
+            EventMesh.publish("set_storage_config",["powerRestart",1])
+        #print("publish_AI_btnInfo 2")
+    def powerKey_callback(self, status):
+        print("powerKey_callback:{}".format(status))
+
+    def pwk_extint_cb(self,args):#pwk
+        try:
+            self.pwk_key_status = int(args[1])
+            if self.pwk_key_status == 0:
+                self.pwk_key_status = 1
+            else:
+                self.pwk_key_status = 0
+                pass
+            if self.pwk_key_status == 0:#按下
+                
+                if self.pwk_key_press == 0 :
+                    self.pwk_key.disable()
+                    self.pwk_key_press = 1
+                    self.pwk_key_long_press = 0
+                    self.pwk_key_timer.start(100, 1, self.pwk_key_timer_cb)
+                    self.pwk_key_timer_count = 0
+                    #EventMesh.publish("AI_key_press")
+        except Exception as e: 
+            usys.print_exception(e)
+    def pwk_key_timer_cb(self, *args, **kwargs):
+    #     EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_timer_cb_})
+    # def pwk_key_timer_cb_(self) :
+        try:
+            self.pwk_key_status = self.pwk_key.read_level()
+            self.pwk_key_timer_count +=1
+            if self.pwk_key_timer_count >= 10*3: #长按3s 
+                #print("pwk_key_long_press {}".format(self.pwk_key_long_press))
+                if self.pwk_key_long_press == 0:
+                        self.pwk_key_long_press = 1
+                        #EventMesh.publish("AI_key_long_press")
+                        EventMesh.publish("audio_montage_play",["zhengzaiguanji.mp3"])
+                        #self.aud.play(1,0,'U:/static/zhengzaiguanji.mp3')#关机音频
+                        EventMesh.publish("open_led_red")
+                        utime.sleep_ms(2000)
+                        self.aud.stopPlayStream()
+                        self.aud.stopAll()
+                        Power.powerDown()
+                        #print("AI_key_release")
+                        #EventMesh.publish("pwk_key_long_press")
+                        #EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_Long_Press})  
+            if self.pwk_key_status == 1:#松开
+                #print("pwk_key_timer_cb:{}".format(self.pwk_key_timer_count))
+                key_count = 5
+                if dev_type == "7PIN_BK":
+                    key_count = 3
+                if self.pwk_key_timer_count >= key_count: #防抖200ms
+                    #EventMesh.publish("AI_key_release")
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_release})
+                    self.pwk_key.enable()
+                    self.pwk_key_timer.stop()
+                    self.pwk_key_timer_count = 0
+                    self.pwk_key_press = 0
+            
+        except Exception as e: 
+            usys.print_exception(e) 
+            
+    def keyAI_extint_cb(self,args):#call 2
+        try:
+            #print("AI_btn:keyAI_extint_cb{}".format(args[1]))
+            self.KeyAI_status = int(args[1])
+            if self.KeyAI_status == 0:
+                self.KeyAI_status = 1
+            else:
+                self.KeyAI_status = 0
+            
+            if self.KeyAI_status == 0:#按下
+                if self.KeyAI_press == 0 :
+                    EventMesh.publish(constants.EVENT.SYSTEM_UP)#唤醒休眠
+                    self.extint_AI.disable()
+                    self.KeyAI_press = 1
+                    self.KeyAI_long_press = 0
+                    self.KeyAI_timer.start(100, 1, self.KeyAI_timer_cb)
+                    self.KeyAI_timer_count = 0
+                    #EventMesh.publish("AI_key_press")
+                    if dev_type == "7PIN" :
+                        self.aud.aud_tone_play(10,200)#播放按键音
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_press})  
+        except Exception as e: 
+            usys.print_exception(e)
+    def KeyAI_timer_cb(self, *args, **kwargs):
+    #     EventMesh.publish("publish_AI_btnInfo",{"func":self.KeyAI_timer_cb_})
+    # def KeyAI_timer_cb_(self):
+        try:
+            self.KeyAI_status = self.extint_AI.read_level()
+            self.KeyAI_timer_count +=1
+            if self.KeyAI_timer_count >= 10*1: #长按3s 
+                if self.KeyAI_long_press == 0:
+                        self.KeyAI_long_press = 1
+                        #EventMesh.publish("AI_key_long_press")
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_long_press})  
+            if self.KeyAI_status == 1:#松开
+                #print("KeyAI_timer_cb:{}".format(self.KeyAI_timer_count))
+                key_count = 5
+                if dev_type == "7PIN_BK":
+                    key_count = 3
+                if self.KeyAI_timer_count >= key_count: #防抖200ms
+                    #EventMesh.publish("AI_key_release")
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_release})  
+                    self.extint_AI.enable()
+                    self.KeyAI_timer.stop()
+                    self.KeyAI_timer_count = 0
+                    self.KeyAI_press = 0
+            
+        except Exception as e: 
+            usys.print_exception(e) 
+       
+    def AI_key_press(self):
+        self.check_rest_timer_count = 0
+        print("AI_key_press")
+        EventMesh.publish("AI_key_press")
+
+    def AI_key_long_press(self):
+        self.check_rest_timer_count = 0
+        print("AI_key_long_press")
+        EventMesh.publish("AI_key_long_press")
+        
+    def AI_key_release(self):
+        print("AI_key_release")
+        EventMesh.publish("AI_key_release")
+        
+    def pwk_key_Long_Press(self,event=None,msg=None):
+        self.check_rest_timer_count = 0
+        print("pwk_key_long_press!!!!!!!")
+        print("pwk_key_long_press!!!!!!!")
+        
+        # EventMesh.publish("paly_iccid_imei")
+        # return
+        EventMesh.publish("audio_montage_play",["zhengzaiguanji.mp3"])
+        #self.aud.play(1,0,'U:/static/zhengzaiguanji.mp3')#关机音频
+        EventMesh.publish("open_led_red")
+        utime.sleep_ms(3000)
+        self.aud.stopPlayStream()
+        self.aud.stopAll()
+        Power.powerDown()
+        #print("AI_key_release")
+        #EventMesh.publish("pwk_key_long_press")
+        
+    def pwk_key_release(self):
+        self.check_rest_timer_count = 0
+        #print("pwk_key_release")
+        EventMesh.publish("pwk_key_release")
+
+    
+    def wdt_timer_cb(self, *args, **kwargs):
+        if self.is_wdt == 1:
+            self.wdt.feed()
+
+    def AI_dev_timer_cb(self, *args, **kwargs):
+        #print("AI_dev_timer_cb")
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_dev_timer_event})  
+    def AI_dev_timer_event(self):
+        if self.is_wdt == 1:
+            self.wdt.feed()
+        VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")#获取vc是否在运行
+        if VC_satrt_flag == None:
+            VC_satrt_flag = 0
+        Vbatt = Power.getVbatt()
+        if self.usb_status == 1 and VC_satrt_flag == 0:
+            EventMesh.publish("open_led_red")#充电红灯常亮
+        if  self.usb_status == 1 and Vbatt>=self.VBATT_tab["charge_full"]and VC_satrt_flag == 0:#充电充满
+            EventMesh.publish("open_led_green")
+            if self.usb_charge_flag == 0 :
+                EventMesh.publish("audio_montage_play",["R_CHARGE_FULL.mp3"])
+                #self.aud.play(1,0,'U:/static/R_CHARGE_FULL.mp3')#充电已满
+                self.usb_charge_flag = 1
+        if  self.usb_status == 0 and Vbatt<self.VBATT_tab["20"]and VC_satrt_flag == 0 and self.Low_power_warning_flag ==0:#低电报警
+            self.Low_power_warning_flag  = 1
+            EventMesh.publish("flicker_led_red")
+            #self.aud.play(1,0,'Low_power_warning.mp3')
+            # self.Low_power_warning_timer+=1
+            # if self.Low_power_warning_timer >= 2:
+            #     self.Low_power_warning_timer = 0
+            EventMesh.publish("audio_montage_play",["Low_power_warning.mp3"])
+
+        if  self.usb_status == 0 and Vbatt<self.VBATT_tab["5"]:    
+            EventMesh.publish("audio_montage_play",["didianguanji.mp3"])
+            utime.sleep_ms(4500)
+            self.aud.stopPlayStream()
+            self.aud.stopAll()
+            Power.powerDown()
+
+        self.check_rest_timer_count += 1
+        if self.check_rest_timer_count >= 8640:#24小时没按键,则关机
+            self.pwk_key_Long_Press()
+        
+    def get_battery(self, event=None, msg=None):
+        Vbatt = Power.getVbatt()
+        if Vbatt>self.VBATT_tab["90"]:
+            return 100
+        if Vbatt>self.VBATT_tab["80"]:
+            return 90
+        if Vbatt>self.VBATT_tab["60"]:
+            return 80
+        if Vbatt>self.VBATT_tab["40"]:
+            return 60
+        if Vbatt>self.VBATT_tab["20"]:
+            return 40
+        if Vbatt>self.VBATT_tab["10"]:
+            return 20
+        if Vbatt<=self.VBATT_tab["10"]:
+            return 10
+    def audio_montage_play(self,event,msg):
+        self.aud.stopPlayStream()
+        self.aud.stopAll()
+        str_data='mp3files='
+        for i in msg:
+            try:
+                str_tmp = i.replace(".mp3","")
+                str_data+="{}.mp3+".format(audio_buf.index(str_tmp))
+            except Exception as e:
+                    usys.print_exception(e)    
+        str_data = str_data[:-1]
+        print("audio_montage_play:{}".format(str_data))
+        self.aud.montage_play('U:/static/audio.bin',1,1,str_data)
+        
+    def paly_iccid_imei(self,event,msg):
+        str_data = 'mp3files={}.mp3+'.format(audio_buf.index("liuliangtishi"))#流量提示
+        imei  = modem.getDevImei()
+        iccid = sim.getIccid()
+        print("paly_iccid_imei:ICCID:{}".format(iccid))
+        if iccid != -1 and len(iccid) > 5:
+            iccid = iccid.upper()
+            if len(iccid) <20:
+                for i in range(20-len(iccid)):
+                    iccid = "0"+iccid
+            str_data += '{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+'.format(audio_buf.index("R_READ_TIME_{}".format(iccid[0]))\
+                ,audio_buf.index("R_READ_TIME_{}".format(iccid[1])),audio_buf.index("R_READ_TIME_{}".format(iccid[2])),audio_buf.index("R_READ_TIME_{}".format(iccid[3])),\
+                audio_buf.index("R_READ_TIME_{}".format(iccid[4])),audio_buf.index("R_READ_TIME_{}".format(iccid[5])),audio_buf.index("R_READ_TIME_{}".format(iccid[6])),audio_buf.index("R_READ_TIME_{}".format(iccid[7])),\
+                audio_buf.index("R_READ_TIME_{}".format(iccid[8])),audio_buf.index("R_READ_TIME_{}".format(iccid[9])),audio_buf.index("R_READ_TIME_{}".format(iccid[10])),audio_buf.index("R_READ_TIME_{}".format(iccid[11])),\
+                audio_buf.index("R_READ_TIME_{}".format(iccid[12])),audio_buf.index("R_READ_TIME_{}".format(iccid[13])),audio_buf.index("R_READ_TIME_{}".format(iccid[14])),audio_buf.index("R_READ_TIME_{}".format(iccid[15])),\
+                audio_buf.index("R_READ_TIME_{}".format(iccid[16])),audio_buf.index("R_READ_TIME_{}".format(iccid[17])),audio_buf.index("R_READ_TIME_{}".format(iccid[18])),audio_buf.index("R_READ_TIME_{}".format(iccid[19])))
+        str_data += '{}.mp3+'.format(audio_buf.index("shouhou"))#可联系售后解决,联系方式见售后客服电话是400-886-8777或到微信公众号柒牌SEVENBRAND自行充值:
+        self.aud.montage_play('U:/static/audio.bin',1,1,str_data)
+    #鉴权出错,播放imei号
+    def paly_device_res_error(self,event,msg):
+        str_data = 'mp3files={}.mp3+'.format(audio_buf.index("jianquancuowu"))#AI功能异常,请联系客户查询,设备号为:
+        imei  = modem.getDevImei()
+        imei = imei.upper()
+        str_data += '{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(imei[0]))\
+                ,audio_buf.index("R_READ_TIME_{}".format(imei[1])),audio_buf.index("R_READ_TIME_{}".format(imei[2])),audio_buf.index("R_READ_TIME_{}".format(imei[3])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[4])),audio_buf.index("R_READ_TIME_{}".format(imei[5])),audio_buf.index("R_READ_TIME_{}".format(imei[6])),audio_buf.index("R_READ_TIME_{}".format(imei[7])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[8])),audio_buf.index("R_READ_TIME_{}".format(imei[9])),audio_buf.index("R_READ_TIME_{}".format(imei[10])),audio_buf.index("R_READ_TIME_{}".format(imei[11])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[12])),audio_buf.index("R_READ_TIME_{}".format(imei[13])),audio_buf.index("R_READ_TIME_{}".format(imei[14])))
+        #print("str_data:{}".format(str_data))
+        self.aud.montage_play('U:/static/audio.bin',1,1,str_data)
+
+#存储信息
+class getStorageDataManager(Abstract):#获取内存数据
+        def __init__(self):
+            self.config_data = {}
+            check = ql_fs.path_exists("/usr/static/storage_file/config.json")
+            if check == True:
+                with open("/usr/static/storage_file/config.json","r") as fd:
+                    self.config_data = ujson.load(fd)
+            else :
+                self.config_data = {'old_time': 0, 'flip_sw': 0}
+                pass
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_storage_data", self.set_storage_data)
+            EventMesh.subscribe("set_storage_config", self.set_storage_config)
+            EventMesh.subscribe("get_storage_data", self.get_storage_data)
+            EventMesh.subscribe("get_storage_config", self.get_storage_config)
+
+        def set_storage_data(self, event, msg): 
+            # EventMesh.debug_log("set_storage_data:{}".format(msg))
+            if msg != None:
+                self.config_data = msg
+                with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:
+                    ujson.dump(self.config_data,fd)
+        
+
+        def set_storage_config(self,event,msg): 
+            # EventMesh.debug_log("set_storage_key_data1:{}".format(msg))
+            if len(msg) >= 2:
+                self.config_data[msg[0]]=msg[1]
+                # EventMesh.debug_log("set_storage_key_data2:{}".format(self.config_data[msg[0]]))
+                EventMesh.publish("publish_message_event_ui",{"func":self.set_storage_save,"data":0})
+        def set_storage_save(self, data): 
+            with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:
+                ujson.dump(self.config_data,fd)
+        def get_storage_data(self, event, msg): 
+            # EventMesh.debug_log("get_storage_data:{}".format(self.config_data))
+            return self.config_data 
+        def get_storage_config(self,event,msg):
+            # EventMesh.debug_log("get_storage_key_data1:{}".format(msg))
+            b = msg in self.config_data.keys()
+            if b == True:
+                # EventMesh.debug_log("get_storage_key_data2:{}".format(self.config_data[msg]))
+                return self.config_data[msg]
+            else :
+                return None
+            # try:
+            #     return self.config_data[msg]
+            # except:
+            #     EventMesh.debug_log("get_storage_key_data:none key:{}",msg)
+            #     return None
+#设备资源授权平台
+class device_res_author(Abstract):
+   
+    def __init__(self) :
+        print("device_res_author __init__ start !!!!!!!!!!!!!!!!!")
+        self.deviceId = modem.getDevImei()#"876226002022574"
+        self.SHA1_BLOCK_SIZE = 64
+        self.PAD_BLOCK_SIZE = 16
+        self.SHA256 = uhashlib.sha256
+        self.pad = lambda s: s + chr(self.PAD_BLOCK_SIZE - len(s) % self.PAD_BLOCK_SIZE) * (self.PAD_BLOCK_SIZE - len(s) % self.PAD_BLOCK_SIZE)
+        # 除去补16字节的多余字符
+        self.unpad = lambda s: s[:-s[-1]]
+        #K01
+        # self.key = b"MWrMZjdtcPhj41jWuoqFAhTmqyFluqj1" 
+        # self.pid = "qAtdDOGXgXYjT2HGFr3a"
+        #G15
+        # self.key = b"3LWfBicxfRZ3ZAqmZCFuvMdGUXdAFWkb" 
+        # self.pid = "qLx4Pu4mSUQxyfVKGLXG"
+        #7pin
+        self.key = b"uKLrChwrxA1LklgBc3VwawYjUkbT3BgX" 
+        self.pid = "cqxJZi5CNgzjS3mX21Zw"
+        
+        self.dev_res_timer = osTimer()
+        self.dev_res_timer.start(20000, 1, self.dev_timer_cb)
+        self.dev_res_timerCount = 0
+        self.ud_token_timer = osTimer()
+        self.ud_token_timer.start(10000, 1, self.ud_token_timer_cb)
+        self.ud_token_timer_Count = 0
+        self.dev_token = None
+        self.res_error_count = 0
+        self.ntptime_flag = 0
+        EventMesh.subscribe("get_dev_token", self.get_dev_token)
+        EventMesh.subscribe("update_dev_token", self.update_dev_token)
+        EventMesh.subscribe("dev_active", self.dev_active)
+        EventMesh.subscribe("dev_sign_in", self.dev_sign_in)
+        EventMesh.subscribe("dev_NTP", self.dev_NTP)
+        #EventMesh.publish_async("dev_NTP",thread_size = 8192)
+
+        # count = 0
+        # while True:
+        #     if self.ntptime_flag == 1:
+        #         break
+        #     utime.sleep_ms(1)
+        #     count+=1
+        #     if count>600:
+        #         break
+        # EventMesh.publish_async("dev_active",thread_size = 8192)
+        # EventMesh.publish_async("dev_sign_in",thread_size = 8192)
+
+        self.dev_NTP()#获取时间
+        self.dev_active() #设备激活
+        self.dev_sign_in() #设备登入
+        print("device_res_author __init__ end !!!!!!!!!!!!!!!!!")
+
+    def get_dev_token(self, event, msg): 
+        return self.dev_token
+    #网络校时
+    def dev_NTP(self, event=None, msg=None):
+        response = None
+        try:
+            print("dev_NTP1")
+            url = "http://dmp.raisound.com/bz-api/dev/time"
+            response = request.get(url,timeout=5)
+            data = response.json()
+            print("dev_NTP:{}".format(data))
+            if data:
+                try:
+                    timeSecond = data["data"]["timestamp"]//1000
+                    
+                    next_alarm_time = utime.localtime(timeSecond)
+                    print("timeSecond {} next_alarm_time {}".format(timeSecond,next_alarm_time))
+                    machine.RTC().datetime((next_alarm_time[0],next_alarm_time[1],next_alarm_time[2],next_alarm_time[6],next_alarm_time[3],next_alarm_time[4],next_alarm_time[5],0))
+                    self.ntptime_flag  = 1
+                except Exception as e:
+                        usys.print_exception(e)
+        except Exception as e:
+            usys.print_exception(e)
+        if response != None:
+            response.close() 
+        print("dev_NTP end")
+    def dev_timer_cb(self, *args): #设备资源管理鉴权平台定时器
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.dev_timer_cb_}) 
+
+    def dev_timer_cb_(self):    
+        #if EventMesh.DEV_RES_MANAGE_AUTHEN_PLATFORM == 1:
+        try:
+            if self.dev_token == None:
+                if self.ntptime_flag == 0:
+                    self.ntptime_flag  = 1
+                    EventMesh.publish_async("dev_NTP",thread_size = 8192)
+                    #EventMesh.publish("publish_AI_btnInfo",{"func":self.dev_NTP})
+                print("timer:{}!!!!!!!!\r\n".format(utime.localtime()))
+                EventMesh.publish_async("dev_active",thread_size = 8192)
+                EventMesh.publish_async("dev_sign_in",thread_size = 8192)
+                # self.dev_active() #设备激活
+                # self.dev_sign_in() #设备登入
+                self.dev_res_timerCount+=1
+                if self.dev_res_timerCount > 3: #开机一分钟内没有获取到密码和token 等下一次更新令牌在走登入 激活流程
+                    self.dev_res_timerCount=0
+                    self.dev_res_timer.stop()
+        except Exception as e:
+            usys.print_exception(e)
+    def ud_token_timer_cb(self, *args): 
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.ud_token_timer_cb_}) 
+
+    def ud_token_timer_cb_(self):   
+        try:
+            #print("ud_token_timer_!!!!")
+            self.ud_token_timer_Count+=1
+            if self.ud_token_timer_Count >= 720: #定时10*3000s时更新token
+                self.ud_token_timer_Count = 0
+                EventMesh.publish_async("dev_sign_in",thread_size = 8192)
+        except Exception as e:
+            usys.print_exception(e)    
+    def get_sim_Status(self):
+        return sim.getStatus() 
+    def HMAC(self,k, m):
+    
+        KEY_BLOCK = k + (b'\0' * (self.SHA1_BLOCK_SIZE - len(k)))
+        KEY_INNER = bytes((x ^ 0x36) for x in KEY_BLOCK)
+        KEY_OUTER = bytes((x ^ 0x5C) for x in KEY_BLOCK)
+        inner_message = KEY_INNER + m
+        outer_message = KEY_OUTER + self.SHA256(inner_message).digest()
+        return self.SHA256(outer_message)
+    def get_hmac_sha256(self,k, m):
+        data = self.HMAC(k, m).digest()
+        # print("HMAC(k, m).digest():", data)
+        # print("HMAC(k, m).digest():", ubinascii.hexlify(data))
+        hex_data = ubinascii.hexlify(data)
+        hex_data = hex_data.decode('ascii')
+        return hex_data
+    # 加密函数
+    def aes_CBC_Encrypt(self,data, key, iv):  # CBC模式的加密函数,data为明文,key为16字节密钥,iv为16字节的偏移量
+        key = key.encode('utf-8')
+        iv = iv.encode('utf-8')  # CBC 模式下的偏移量
+        data = self.pad(data)  # 补位
+        data = data.encode('utf-8')
+        aes = ucryptolib.aes(key,ucryptolib.MODE_CBC,iv)
+        result = base64.b64encode(aes.encrypt(data))
+        return str(result, 'utf-8')  # 以字符串的形式返回
+
+    # 解密函数
+    def aes_CBC_Decrypt(self,data, key, iv):  # CBC模式的解密函数,data为密文,key为16字节密钥
+        key = key.encode('utf-8')
+        iv = iv.encode('utf-8')
+        
+        aes = ucryptolib.aes(key,ucryptolib.MODE_CBC,iv) #CBC模式
+
+        # decrypt AES解密  B64decode为base64 转码
+        result = aes.decrypt(base64.b64decode(data))
+        result = self.unpad(result)  # 除去补16字节的多余字符
+        return str(result, 'utf-8')  # 以字符串的形式返回
+    #激活接口 没有密码走激活
+    def dev_active(self, event=None, msg=None):
+        signal = net.csqQueryPoll()
+        if signal == -1 or self.get_sim_Status() != 1:#网络不正常
+            print("dev_active 无 SIM卡!!!!!!!!\r\n")
+            return
+        print("dev_active 1\r\n")
+        # 签名内容: = deviceId+pid+timeStamp
+        dev_pass = ""
+        dev_pass = EventMesh.publish("get_storage_config","dev_pass")
+        print("dev_pass:{}\r\n".format(dev_pass))
+        if dev_pass == None:
+            dev_pass = ""
+        if dev_pass == "" or dev_pass == None:
+            try:
+                date_tmp = utime.localtime() #获取当前时间
+                print("date_tmp:{}\r\n".format(date_tmp)) #转换时间戳s
+                timeStamp = (utime.mktime(date_tmp))*1000#获取时间戳ms
+                deviceId = self.deviceId #"876226002022574" #以imei号
+                pid = self.pid
+                key = self.key
+                sign_data = "{}{}{}".format(deviceId,pid,timeStamp)  #签名内容
+                print("sign_data:{}\r\n".format(sign_data))
+                sha256_hex = self.get_hmac_sha256(key,sign_data)
+                print("sha256_hex:{}\r\n".format(sha256_hex))
+
+                data = {
+                    "deviceId":"{}".format(deviceId), #设备名
+                    "pid":pid, #产品PID
+                    "sign":"{}".format(sha256_hex), #HMACSHA256签名后的数据
+                    "timeStamp":timeStamp, #要以ms的形式
+                    "signMethod":"HMACSHA256" #签名方式 HMACSHA256
+                }
+                print(ujson.dumps(data))
+                headers_T ={"Content-Type":"application/json"}
+                url = "http://dmp.raisound.com/bz-api/dev/auth/active"
+                data =ujson.dumps(data)
+                response = None
+                response_result = 0
+                try:
+                    response = request.put(url,data=data,headers = headers_T,timeout=5)
+                    response_result = 1
+                except Exception as e:
+                    usys.print_exception(e)   
+                    print("put error!!!!!\r\n")
+                    response_result = 0
+                
+                IV = "" #偏移量
+                PASSWORD= "" #服务器返回后的加密内容 密码
+                if response_result == 1: #访问成功ip
+                    if response.status_code == 200:
+                        print("headers:{}".format(response.headers))
+                        content = response.content
+                        c = next(content)
+                        # "api.xcloudtech.com"
+                        # d_server_port = 9000
+                        data =  ujson.loads(c)
+                        # data = response.json()
+                        print("data-{}".format(data))
+                        if data != None:
+                            if "success" in data:
+                                if data['success'] == True:
+                                    if "data" in data:
+                                        data_tmp = data["data"]
+                                        if "nonce" in data_tmp: #偏移量
+                                            IV = data_tmp["nonce"]
+                                        if "password" in data_tmp:
+                                            PASSWORD = data_tmp["password"]
+                                            # EventMesh.publish("set_storage_config",["dev_pass",PASS])
+                                if data["code"] == 20001:#鉴权成功
+                                    pass
+                                elif data["code"] > 50000:#时间错误
+                                    self.res_error_count+=1
+                                    if self.res_error_count>=3:
+                                        self.res_error_count = 0
+                                        #EventMesh.publish("paly_device_res_error")
+                                    if data["code"] == 50003:#时间错误
+                                        self.ntptime_flag  = 0
+                        if PASSWORD != None and IV != None:
+                            if len(PASSWORD) != 0 and len(IV) != 0:
+                                password = PASSWORD
+                                iv = IV
+                                #解密 之后保存本地下一次登入做使用
+                                decrypt_data = self.aes_CBC_Decrypt(password, self.key, iv) #对服务器下发的密码进行解密
+                                print("decrypt_data {}".format(decrypt_data))
+                                EventMesh.publish("set_storage_config",["dev_pass",decrypt_data])    
+                    print("IV:{}\r\n PASS:{}".format(IV,PASSWORD))
+                if response != None:
+                    response.close()  
+            except Exception as e:
+                usys.print_exception(e)   
+            print("dev_active end\r\n")
+            return [response_result,PASSWORD,IV]
+    #随机生成16个字节的字符串作为加密的IV 偏移量
+    def generate_random_string(self,length=16): 
+        random_str = ""
+        chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
+        for i in range(length):
+            random_str+=chars[random.randint(0,length)]
+        return random_str
+
+    #设备登入 没有Token 走登入获取token
+    def dev_sign_in(self, event=None, msg=None):
+        signal = net.csqQueryPoll()
+        if signal == -1 or self.get_sim_Status() != 1:#网络不正常
+            print("dev_sign_in 无 SIM卡!!!!!!!!\r\n")
+            return
+        print("dev_sign_in 1")
+        token = ""
+        try:
+            token = self.dev_token
+            dev_pass = EventMesh.publish("get_storage_config","dev_pass") 
+            #print("token:{}\r\n".format(token))
+            if token == None:
+                token = ""
+            if dev_pass == None:
+                dev_pass = ""
+            if len(dev_pass) == 0:#没有密码
+                return
+            #if token == None or token == "":
+            if 1: #返回结果成功
+                #获取本地保存的密码
+                decrypt_data=EventMesh.publish("get_storage_config","dev_pass")
+                # decrypt_data = self.aes_CBC_Decrypt(password, self.key, iv) #对服务器下发的密码进行解密
+                print("decrypt_data {}".format(decrypt_data))
+                #随机生成16个字符串 设备生成做加密使用
+                random_string = self.generate_random_string(16) #随机的16个字符串
+                enc_iv = random_string #加密的IV偏移量
+                #设备端进行密码加密
+                encrypt_data = self.aes_CBC_Encrypt(decrypt_data, self.key, enc_iv)
+                print("encrypt_data {}".format(encrypt_data))
+
+                #登入数据
+                deviceId = self.deviceId
+                sign_in_data = {
+                    "deviceId":"{}".format(deviceId), #设备ID
+                    "password":"{}".format(encrypt_data), #加密的数据
+                    "nonce":"{}".format(random_string) #随机的16个字符串
+                }
+                print(ujson.dumps(sign_in_data))
+                sign_url = "http://dmp.raisound.com/bz-api/dev/auth/sign_in" #登入地址
+                headers_T ={"Content-Type":"application/json"}
+                response_result = 0
+                response = 0
+                try:
+                    response = request.post(sign_url,data=ujson.dumps(sign_in_data),headers = headers_T,timeout=5)
+                    response_result = 1
+                except Exception as e:
+                    usys.print_exception(e)   
+                    print("post error!!!!!\r\n")
+                    response_result = 0
+                # {'msg': '', 'code': 20001, 'success': True, 
+                # 'data': {'deviceId': '876226002022574', 
+                # 'token': '95436a9e09fd0ff89feb8825257dca982f'}
+                # }
+                
+                #self.dev_token = ""
+                if response_result == 1:
+                    if response.status_code == 200:
+                        content = response.content
+                        c = next(content)
+                        data =  ujson.loads(c)
+                        print("data-{}".format(data))
+                        if data != None:
+                            if "success" in data:
+                                if data['success'] == True: #登入成功
+                                    if "data" in data:
+                                        data_tmp = data["data"]
+                                        if "token" in data_tmp: #token
+                                            self.dev_token = data_tmp["token"]
+                                if data["code"] == 50003:#时间错误
+                                    self.ntptime_flag  = 0
+                print("token:{}\r\n".format(self.dev_token))
+                if response != None:
+                    response.close()
+                pass
+        except Exception as e:
+                    print("post error!!!!!\r\n")
+                    response_result = 0
+        print("dev_sign_in end")
+    #获取新的令牌 更新token
+    def update_dev_token(self, event=None, msg=None):
+        print("update_dev_token")
+        try:
+            dev_pass = ""
+            dev_pass = EventMesh.publish("get_storage_config","dev_pass")
+            
+            if dev_pass == None:
+                dev_pass = ""
+            if len(dev_pass) == 0: #没有密码走激活
+                print("no dev_pass:{}\r\n".format(dev_pass))
+                EventMesh.publish("dev_active")
+            token = self.dev_token
+            if token == None:
+                token = ""
+            if len(token) == 0: #没有token走登入
+                print("no dev_token:{}\r\n".format(token))
+                #self.dev_sign_in()
+                EventMesh.publish("dev_sign_in")
+            dev_tokenip = "http://dmp.raisound.com/bz-api/dev/auth/token" #设备新令牌更新地址
+            token = self.dev_token
+            if token == None:
+                token = ""
+            if len(token) != 0:
+                response_result=0
+                response = None
+                headers_T = {"bz-dt":"{}".format(token)}
+                try:
+                    response = request.get(dev_tokenip,headers = headers_T,timeout=5)
+                    response_result = 1
+                except Exception as e:
+                    print("get error!!!!!\r\n")
+                    response_result = 0
+                if response_result == 1:
+                    if response.status_code == 200:
+                        try:
+                            headers_data = response.headers
+                            # print("headers_data!!!!! headers_data:{}\r\n".format(headers_data))
+                            if "bz-dt" in headers_data: #bz-dt字段是否在头部数据里面 如果有就需要更新
+                                bz_dt = headers_data["bz-dt"] 
+                                self.dev_token = bz_dt.replace(" ", "") #去掉所有的空格符
+                                print("update_dev_token:{}".format(self.dev_token))
+                        except Exception as e:
+                            print("headers_data!!!!! error\r\n")
+                if response != None:
+                    response.close()
+        except Exception as e:
+            usys.print_exception(e)   
+        print("update_dev_token end")
+        
+#OTA升级
+class OTA():
+    def __init__(self):
+        #EventMesh.subscribe("min_sys_ota",self.min_sys_ota)
+        self.downloadFileVoURL1= ""
+        self.downloadFileVoURL2= ""
+    #小系统升级,返回0,没有升级;返回,1有升级,正在执行升级;返回2,电压不够
+    def min_sys_ota(self,event=None,msg=None):
+        print("min_sys_ota")
+        signal = net.csqQueryPoll()
+        if signal == -1 or sim.getStatus()  != 1:#网络不正常
+            print("min_sys_ota 无 SIM卡!!!!!!!!\r\n")
+            return 0
+        # return 0
+        response = None
+        ret_str =0
+        self.downloadFileVoURL1= ""
+        self.downloadFileVoURL2= ""
+        try:
+            sourceVersion = versions.Build_Time
+            sourceVersion = "7PIN-"+sourceVersion[:10]+"-"+sourceVersion[11:-3]
+            print("sourceVersion:{}".format(sourceVersion))
+            sourceVersion = sourceVersion.replace(" ", "0")
+            print("sourceVersion2:{}".format(sourceVersion))
+            #url = "http://iot.api.thisiot.com/ota/task?deviceId=860132060348836&sourceVersion=2024-12-20-15:35-1"
+            url = "http://dmp.raisound.com/bz-api/ota/task?deviceId={}&sourceVersion={}".format(modem.getDevImei(),sourceVersion)
+            print(url)
+            response = request.get(url,timeout=5)
+            if response.status_code == 200:
+                data = response.json()
+                print("min_sys_ota1:{}".format(data))
+                
+                if data:
+                    try:
+                        if data["code"] == 20007:#有新版本
+                            if "fileList"in data["data"]:
+                                if len(data["data"]["fileList"]) == 2:
+                                    for fileList in data["data"]["fileList"]:
+                                        if fileList["fileName"] == "dfota_2.bin":
+                                            self.downloadFileVoURL2 = fileList["url"]
+                                        elif fileList["fileName"] == "dfota_1.bin":
+                                            self.downloadFileVoURL1 = fileList["url"]
+                            
+                        if data["code"] == 20006:#已是最新版本
+                            ret_str = 0
+                                    
+                    except Exception as e:
+                            usys.print_exception(e)
+            else:
+                print("min_sys_ota get error")
+            response.close()
+        except Exception as e:
+            usys.print_exception(e)
+            if response != None:
+                response.close()
+        
+        print("min_sys_ota:downloadFileVoURL1:{},\ndownloadFileVoURL2:{}".format(self.downloadFileVoURL1,self.downloadFileVoURL2))
+        print("min_sys_ota end") 
+        if self.downloadFileVoURL2!="" and self.downloadFileVoURL1!="":
+            battery = EventMesh.publish("get_battery")
+            if battery>=40:
+                self.ota_timer = osTimer()
+                self.ota_timer.start(15000, 0, self.ota_timer_cb)
+                ret_str =  1  
+            else:
+                ret_str =  2
+        return ret_str
+    
+    def ota_timer_cb(self, *args, **kwargs):
+        import fota
+        fota_obj = fota() 
+        fota_obj.httpDownload(url1=self.downloadFileVoURL1,url2=self.downloadFileVoURL2)
+    #ota升级结果返回,开机时调用一次即可
+    def ota_result(self,event=None,msg=None):
+        response = None
+        try:
+            currentVersion = versions.Build_Time
+            currentVersion = "7PIN-"+currentVersion[:10]+"-"+currentVersion[11:-3]
+            print("currentVersion1:{}".format(currentVersion))
+            currentVersion = currentVersion.replace(" ", "0")
+            print("currentVersion2:{}".format(currentVersion))
+            url = "http://dmp.raisound.com/bz-api/ota/result?deviceId={}&currentVersion={}".format(modem.getDevImei(),currentVersion)
+            print(url)
+            response = request.post(url,timeout=5)
+            if response.status_code == 200:
+                data = response.json()
+                print("ota_result:{}".format(data))
+            else:
+                print("ota_result  error!!!!")
+                for i in response.text:
+                    print(i)
+            response.close()
+        except Exception as e:
+            usys.print_exception(e)
+            if response != None:
+                response.close()
+    #ICCID上传
+    def pots_ICCID(self,event=None,msg=None):
+        response = None
+        try:
+            iccid = sim.getIccid()
+            if iccid != -1 and len(iccid) > 5:
+                print("pots_ICCID:{}".format(iccid))
+                #Headers = {'Transfer-Encodong':'chunked'}
+                #http://dmp.raisound.com/bz-api/dev/iccid?deviceId=866610001099679&iccid=89860002192307889057
+                url = "http://dmp.raisound.com/bz-api/dev/iccid?deviceId={}&iccid={}".format(modem.getDevImei(),iccid)
+                print(url)
+                response = request.post(url,timeout=5)
+                if response.status_code == 200:
+                    data = response.json()
+                    print("pots_ICCID:{}".format(data))
+                else:
+                    print("pots_ICCID  error!!!!")
+                    for i in response.text:
+                        print(i)
+                response.close()
+        except Exception as e:
+            usys.print_exception(e)
+            if response != None:
+                response.close()
+#阿里VC状态枚举
+VC_State_None=0
+VC_State_Listening=1#听
+VC_State_SpeechStart=2#说开始
+VC_State_SpeechIng=3#正在说
+VC_State_SpeechEnd=4#说结束
+VC_State_RequestToRespond=5 #TTS请求或者chat请求
+VC_State_Thinking=6#想(chat)
+VC_State_Responding=7#音频播放
+VC_State_TTSStart=8
+VC_State_TTSData=9
+VC_State_TTSFinish=10
+VC_State_TTSEnd=11
+VC_State_TTSError=12
+VC_State_DialogError=13
+VC_State_End=14
+
+VC_record_TYPE_PCM = 0
+VC_record_TYPE_AMR = 1
+VC_play_TYPE_PCM = 0
+VC_play_TYPE_MP3 = 1
+
+#websocket发送数据编号
+# AI_client_asr_num = 0
+# AI_client_chat_num = 1
+# AI_client_tts_num = 2
+AI_client_VC_num = 3
+AI_client_asr_num = 4
+
+
+class AI_VC(Abstract):
+    # AI
+    
+    def __init__(self):
+        try:
+            self.http_get_config()#获取/更新配置参数
+        except Exception as e:
+            usys.print_exception(e)
+        self.VC_30S_timer = osTimer()
+        self.VC_30S_timer.start(30000, 1, self.VC_30S_timer_cb)
+        self.get_config_timer_count = 0
+        self.record_data_save_flag = 0 #是否保存录音文件
+        self.play_data_save_flag = 0#是否保存tts数据到文件
+        self.record_fd = None
+        self.play_fd = None
+        self.is_VC_ACK = 0 #是否开启ack应答模式
+        self.is_long_record = 0 #是否开启长录音模式(语音打断模式)
+        self.ai_OTA = OTA()
+        self.is_auth = 0 #是否开启dmp鉴权
+        #self.VC_mode = 1 #0:短按连续问答模式 1:长按录音模式
+        self.VC_mode = EventMesh.publish("get_storage_config","VC_mode")#
+        if self.VC_mode == None :
+            self.VC_mode = 0
+        self.is_up_error= 0 #是否上传错误id
+        self.Close_flag =0 #=1时,连续对话播放完音频就退出
+        
+        self.error_data = []
+        self.asr_taskid  = ""
+        self.VC_taskid  = ""
+        self.VC_server = 86 #0柒牌正式服务器,1:测试服务器1,2:测试服务器2
+        
+        self.server_ip = EventMesh.publish("get_storage_config","server_ip")#
+        if self.server_ip == None:
+            if self.VC_server == 1:# 
+                self.server_ip="118.145.158.207:22083"
+            elif self.VC_server == 2:# 
+                self.server_ip="118.145.158.207:22082"
+            elif self.VC_server == 4:# 
+                self.server_ip="118.145.158.207:22084"
+            elif self.VC_server == 5:# 
+                self.server_ip="amp-wss.raisound.com"
+            elif self.VC_server == 6:# 
+                self.server_ip="118.145.158.207:22080"
+            elif self.VC_server == 7:# 
+                self.server_ip="118.145.158.207:22080"
+            elif self.VC_server == 8:# 
+                self.server_ip="115.190.94.208:22080"
+            elif self.VC_server == 86:# 
+                self.server_ip="118.145.158.207:22086"    
+            else:
+                #self.server_ip="sevenpin.qipai.com.cn"
+                self.server_ip="118.145.158.207:22082"
+            if dev_type == 'momo':# 
+                self.server_ip="118.145.158.207:22080"
+            # elif dev_type == "7PIN":
+            #     self.server_ip="sevenpin.qipai.com.cn"
+
+            elif dev_type == "sjgq":
+                self.server_ip="118.145.158.207:22084"
+
+        #开机提示音
+        self.power_on_tone = EventMesh.publish("get_storage_config","power_on_tone")#
+        if dev_type != "7PIN":
+            self.power_on_tone = None
+        if self.power_on_tone == None:
+            if dev_type == "G10":
+                self.power_on_tone = "已开机,您好!我是北科瑞讯智能 AI bot_name"
+            elif dev_type == "7PIN_BK":
+                self.power_on_tone = "小瑞来了!我们一起来愉快地聊天吧!" 
+            elif dev_type == "momo":
+                self.power_on_tone = "DuloDulo,我是上古神兽食梦貘,主人可以叫我momo,我来自《山海经》,是一只以梦为食的神秘灵兽,每当颜色朦胧、人们入睡时,我就会悄悄飞到人们的床头,用我长长的鼻子把噩梦统统吞噬掉,只留下甜甜的美梦。从今往后,就由我守护在主人身边,一起度过每一个星河璀璨的夜晚。"
+            elif dev_type == "sjgq":
+                self.power_on_tone = "您好!我是巴马四季甘泉的智能助手。我可以为你解答各种各样的问题,像是有关巴马四季甘泉知识库、中基长寿科学产品、卫斯曼院士国际先进医疗中心的问题,还有日常生活与工作、旅游信息、健康咨询、教育与学习、情感交流、全球资讯、世界文化等方面的问题哦。你有没有这方面的问题想要问我呀?"
+            elif dev_type == "szbst":
+                self.power_on_tone = "深圳百事通来了!请问您有什么需要我帮忙的吗?" 
+            else:
+                self.power_on_tone = "您好!我是世界首创柒牌男装AI生活好帮手-bot_name, 很高兴为您服务,我可以帮您解答柒牌公司知识库、日常生活与工作、旅游信息、健康与运动咨询、教育与学习、情感交流、全球资讯、世界文化等问题!请问您有什么需要我帮忙的吗?" 
+                
+
+        self.VC_record_TYPE = VC_record_TYPE_PCM #0:PCM 1:AMR
+        self.VC_play_TYPE = VC_play_TYPE_PCM #0:PCM 1:mp3 
+        self.VC_record_samplerate = 16000
+        self.VC_play_samplerate = 16000
+        self.VAD_data_len = 640 #10ms数据
+        self.is_VAD = 0#=1打开vad打断
+        # ARG_sample_rate,             // 采样率
+        # ARG_channel,                // 通道数
+        # ARG_frame_size,              // 每帧字节数
+        # ARG_energy_threshold,        // 能量阈值
+        # ARG_voice_time,              // 语音持续时间阈值(ms)
+        # ARG_silence_time,            // 静音持续时间阈值(ms)
+        # ARG_silence_start_threshold, // 静音开始阈值(ms)
+        self.vad = None
+        if self.is_VAD == 1:
+            self.vad = VAD.VAD(self.VC_record_samplerate ,1,self.VAD_data_len,600,100,300,100)
+        self.speech_rate = EventMesh.publish("get_storage_config","speech_rate")#语速配置
+        if self.speech_rate == None:
+            self.speech_rate = 0
+        self.VC_TTS_voice_type = EventMesh.publish("get_storage_config","VC_TTS_voice_type")#音色配置
+        if self.VC_TTS_voice_type == None or ("男" in self.VC_TTS_voice_type) == False:
+            if dev_type == "G10" or  dev_type == "7PIN_BK"or dev_type == "szbst":
+                self.VC_TTS_voice_type = {   
+                                            "女":{
+                                            "bot_name":"小瑞",
+                                            "voice":"zh_female_wanwanxiaohe_moon_bigtts" ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "男":{
+                                            "bot_name":"小瑞",
+                                            "voice":"zh_male_wennuanahu_moon_bigtts"  ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "童":{
+                                            "bot_name":"小瑞",
+                                            "voice":"ICL_zh_female_huoponvhai_tob"  ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "粤":{
+                                            "bot_name":"小瑞",
+                                            "voice":"zh_female_wanqudashu_moon_bigtts" ,
+                                            "lang":"zh-hk" 
+                                            },
+                                            "四川":{
+                                            "bot_name":"小瑞",
+                                            "voice":"zh_female_daimengchuanmei_moon_bigtts",
+                                            "lang":"&lang=zh-cn-sc"  
+                                            },
+                                            "个性":{
+                                            "bot_name":"小瑞",
+                                            "voice":"zh_male_sunwukong_mars_bigtts" ,
+                                            "lang":"zh-cn" 
+                                            }
+                                           
+                                        }
+            elif dev_type == 'momo':
+                self.VC_TTS_voice_type = {   
+                                            "女":{
+                                            "bot_name":"食梦貘",
+                                            "voice":"zh_female_shaoergushi_mars_bigtts" ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "男":{
+                                            "bot_name":"食梦貘",
+                                            "voice":"zh_male_yangguangqingnian_mars_bigtts"  ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "童":{
+                                            "bot_name":"食梦貘",
+                                            "voice":"ICL_zh_female_huoponvhai_tob"  ,
+                                            "lang":"zh-cn"
+                                            },
+                }
+            elif dev_type == 'sjgq':
+                self.VC_TTS_voice_type = {   
+                                            "女":{
+                                            "bot_name":"小巴",
+                                            "voice":"zh_female_wanwanxiaohe_moon_bigtts" ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "男":{
+                                            "bot_name":"小巴",
+                                            "voice":"zh_male_wennuanahu_moon_bigtts"  ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "童":{
+                                            "bot_name":"小巴",
+                                            "voice":"ICL_zh_female_huoponvhai_tob"  ,
+                                            "lang":"zh-cn"
+                                            },
+                }
+            else:
+                #女,男,童,粤,川,个性声
+                self.VC_TTS_voice_type = {   
+                                            "女":{
+                                            "bot_name":"柒妹妹",
+                                            "voice":"zh_female_wanwanxiaohe_moon_bigtts" ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "男":{
+                                            "bot_name":"柒先生",
+                                            "voice":"zh_male_wennuanahu_moon_bigtts"  ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "童":{
+                                            "bot_name":"柒乐乐",
+                                            "voice":"ICL_zh_female_huoponvhai_tob"  ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "粤":{
+                                            "bot_name":"柒先生",
+                                            "voice":"zh_female_wanqudashu_moon_bigtts" ,
+                                            "lang":"zh-hk" 
+                                            },
+                                            "四川":{
+                                            "bot_name":"柒妹妹",
+                                            "voice":"zh_female_daimengchuanmei_moon_bigtts",
+                                            "lang":"&lang=zh-cn-sc"  
+                                            },
+                                            "个性":{
+                                            "bot_name":"柒先生",
+                                            "voice":"zh_male_sunwukong_mars_bigtts" ,
+                                            "lang":"zh-cn" 
+                                            },
+                                            "英语":{
+                                            "bot_name":"柒先生",
+                                            "voice":"en_male_smith_mars_bigtts" ,
+                                            "lang":"zh-cn" 
+                                            }
+                                            
+                                           
+                                        }
+            
+            # self.VC_TTS_voice_type = {0:"zh_female_xinlingjitang_moon_bigtts",1:"zh_male_wennuanahu_moon_bigtts",2:"ICL_zh_female_huoponvhai_tob",
+            #                           3:"aliyun::longjiaxin",4:"zh_female_daimengchuanmei_moon_bigtts"}
+            #self.VC_TTS_voice_type = ["aliyun::longxiaoxia","aliyun::longnan","aliyun::longling"]
+            
+            #EventMesh.publish("set_storage_config",["VC_TTS_voice_type",self.VC_TTS_voice_type])
+
+        try:
+            self.VC_TTS_voice_key = EventMesh.publish("get_storage_config","VC_TTS_voice_key")#音色配置
+            if self.VC_TTS_voice_key == None :
+                if dev_type == "7PIN_BK":
+                    self.VC_TTS_voice_key = "童"
+                    #self.VC_TTS_voice_key = "男"
+                elif dev_type == "momo":
+                    self.VC_TTS_voice_key = "男"
+                else:
+                    self.VC_TTS_voice_key = "男"
+            if self.VC_TTS_voice_key in self.VC_TTS_voice_type:
+                pass
+            else:
+                self.VC_TTS_voice_key = list(self.VC_TTS_voice_type.keys())[0]
+            print("音色配置:{}:{}\r\n\r\n".format(self.VC_TTS_voice_key,self.VC_TTS_voice_type[self.VC_TTS_voice_key]))
+            self.VC_TTS_volume =  EventMesh.publish("get_storage_config","VC_TTS_volume")#音量配置
+        except Exception as e:
+            usys.print_exception(e)
+        #配置词
+        self.commands_mode = 2#=1用大模型判断命令,=0用服务器本地插件判断命令 =2用设备本地判断方式
+        if dev_type == "7PIN_BK":
+            self.commands_mode = 1
+        self.commands =  [
+            {
+                "command": "切换音色",#命令
+                "patterns": [ #多种问法,说法
+                    "声音改成", "声音改为", "改成", "改为", "换成", "切换成", "变成", "声音"
+                    "使用", "设置声音为", "把声音改成", "声音切换到", "用","声音切换的"
+                ],
+                "exact_matches": ["声音改成", "声音改为", "改成", "改为"],#精确匹配的完整短语
+                "has_param": True,# 是否包含参数
+                "param_regexp": r"(?P<cmd_parameter>(男|难|女|童|同|粤|广东话|粤语|四川话|川普|四川口音))",#参数提取正则表达式
+                "require_full_match": False,#是否要求完全匹配
+                "negative_patterns": [],#否定模式(避免误触发)
+                "keyword_threshold": 0.6#关键词匹配阈值
+            },
+            {
+                "command": "音量加大",
+                "patterns": [
+                    "音量加大","音量大", "声音大" ,"声音加大","听不清楚","声音太小","太小声了"
+                ],
+                "exact_matches": [],
+                "has_param": False,
+                "param_regexp": "",
+                "require_full_match": False,
+                "negative_patterns": ["声音太大"],
+                "keyword_threshold": 1
+            },
+            {
+                "command": "音量减小",
+                "patterns": [
+                    "音量减小","音量小", "声音小","你太吵了","声音太大","太大声了"
+                ],
+                "exact_matches": [],
+                "has_param": False,
+                "param_regexp": "",
+                "require_full_match": False,
+                "negative_patterns": ["声音太小"],
+                "keyword_threshold": 0.8
+            },
+            {
+                "command": "关机",
+                "patterns": [
+                    "关机", "关闭电源"
+                ],
+                "exact_matches": ["关机", "关闭电源"],
+                "has_param": False,
+                "param_regexp": "",
+                "require_full_match": True,
+                "negative_patterns": [],
+                "keyword_threshold": 0.8
+            },
+            {
+                "command": "进入工厂模式",
+                "patterns": [
+                    "进入工厂模式"
+                ],
+                "exact_matches": ["进入工厂模式"],
+                "has_param": False,
+                "param_regexp": "",
+                "require_full_match": True,
+                "negative_patterns": [],
+                "keyword_threshold": 0.8
+            },
+            {
+            
+                "command": "再见",
+                "patterns": [
+                    "再见","拜拜","我要走了"
+                ],
+                "exact_matches": [],
+                "has_param": False,
+                "param_regexp": "",
+                "require_full_match": False,
+                "negative_patterns": [],
+                "keyword_threshold": 0.8
+            },
+            {
+            
+                "command": "查询信号",
+                "patterns": [
+                    "查询信号","信号怎样","信号是多少","信号怎么样"
+                ],
+                "exact_matches": [],
+                "has_param": False,
+                "param_regexp": "",
+                "require_full_match": False,
+                "negative_patterns": ["查询"],
+                "keyword_threshold": 0.8
+            },   
+            {
+            
+                "command": "查询卡号",
+                "patterns": [
+                    "查询卡号","卡号","iccid号","ICCID号"
+                ],
+                "exact_matches": [],
+                "has_param": False,
+                "param_regexp": "",
+                "require_full_match": False,
+                "negative_patterns": ["查询"],
+                "keyword_threshold": 0.8
+            },  
+            {
+            
+                "command": "查询设备号",
+                "patterns": [
+                    "设备号","查询设备号","查询IMEI号"
+                ],
+                "exact_matches": [],
+                "has_param": False,
+                "param_regexp": "",
+                "require_full_match": False,
+                "negative_patterns": ["查询"],
+                "keyword_threshold": 0.8
+            },
+            {
+                "command": "OTA升级",
+                "patterns": [
+                    "OTA升级"
+                ],
+                "exact_matches": ["OTA升级"],
+                "has_param": False,
+                "param_regexp": "",
+                "require_full_match": True,
+                "negative_patterns": [],
+                "keyword_threshold": 1
+            },    
+            {
+                "command": "查询服务器地址",
+                "patterns": [
+                    "查询服务器地址"
+                ],
+                "exact_matches": [],
+                "has_param": False,
+                "param_regexp": "",
+                "require_full_match": False,
+                "negative_patterns": ["查询"],
+                "keyword_threshold": 0.9
+            }   
+            ,    
+            {
+                "command": "切换对话模式",
+                "patterns": [
+                    "切换对话模式","切换兑换模式"
+                ],
+                "exact_matches": [],
+                "has_param": False,
+                "param_regexp": "",
+                "require_full_match": False,
+                "negative_patterns": [],
+                "keyword_threshold": 0.8
+            },  
+            {
+                "command": "查询版本",
+                "patterns": [
+                    "查询版本号","软件版本"
+                ],
+                "exact_matches": [],
+                "has_param": False,
+                "param_regexp": "",
+                "require_full_match": False,
+                "negative_patterns": ["查询"],
+                "keyword_threshold": 0.6
+            }, 
+        ]
+        if self.VC_TTS_volume == None:
+            self.VC_TTS_volume = 100
+        self.AI_audio_queue_thread_id = 0
+        self.AI_audio_queue_thread_lock = 0
+        self.AI_VC_send_data_queue_thread_id = 0
+        self.AI_VC_send_data_queue_thread_lock = 0
+        self.AI_ASR_send_data_queue_thread_id = 0
+        self.AI_ASR_send_data_queue_thread_lock = 0
+        self.AI_record_tmp_queue = Queue(100)
+        self.AI_ASR_send_data_queue = Queue(200)
+        self.AI_VC_send_data_queue = Queue(100)
+        self.AI_audio_queue = Queue(100)
+        #self.AI_WS_connect_Queue = Queue(100) #释放用
+        self.AI_TTS_str = ""
+        self.AI_ASR_str = ""
+        self.AI_ASR_flag = 0
+        self.AI_ASR_str_tmp = ""
+        self.AI_ASR_send_buf_len = 0
+        self.AI_ASR_text_tmp = ""
+        self.AI_ASR_text_repet_count = 0
+        # #开始线程
+        # if self.AI_audio_queue_thread_id ==0:
+        #     self.AI_audio_queue_thread_id = _thread.start_new_thread(self.AI_audio_queue_thread, ())
+        # else:
+        #     print("AI_VC_start :AI_audio_queue_thread_id != 0 ")
+        # if self.AI_VC_send_data_queue_thread_id == 0:    
+        #     self.AI_VC_send_data_queue_thread_id = _thread.start_new_thread(self.AI_VC_send_data_queue_thread, ())
+            
+        self.VC_state = VC_State_None #阿里ai VC状态
+        self.VC_dialog_id = ""#
+        self.VC_message_id=None
+        self.VC_task_id =None
+        self.AI_client_VC = None
+        self.AI_client_VC_recv_id = 0
+        self.AI_client_VC_recv_lock = 0
+        self.AI_client_VC_isconnect =0
+        self.AI_client_VC_debug =0
+
+        self.asr_state = VC_State_None #阿里VC_ASR VC状态
+        self.key_state = 0
+
+        self.AI_client_asr = None
+        self.AI_client_asr_recv_id = 0
+        self.AI_client_asr_recv_lock = 0
+        self.AI_client_asr_isconnect =0
+        self.AI_ASR_timer =  osTimer()
+        self.AI_ASR_timer_count = 0
+        self.AI_client_asr_debug =0
+        self.AI_ASR_check_timeout = 0
+        self.AI_ASR_error_timeout = 0
+        self.VC_Thinking_timerout = 0
+
+        self.record_pcm = None
+        self.play_pcm = None
+        self.VC_record_thread_id = 0
+        self.VC_record_thread_lock = 0
+        self.VC_pingping_timerout = 0
+        self.asr_pingping_timerout = 0
+        self.factory_timer = osTimer()
+        self._1S_timer = osTimer()
+        self.Audio_buf_size = 16*1024
+        self.record = audio.Record()
+        #self.record.end_callback(self.record_callback)
+        self.record.gain_set(4,10)
+        #self.record.gain_set(4,12)
+        self.aud = audio.Audio(0)
+        self.aud.setCallback(self.audio_cb)
+        #self.aud.setVolume(self.VC_TTS_volume //10)
+        self.audio_play_state = 1 #音频播放完状态
+        self.close_timerout = 0
+        self.LocalRespondingEnded_timerout = 0
+
+        self.VC_Play_flag = 0
+        self.play_flag = 0
+        self.VC_record_state_flag = 0
+        self.AI_key_long_press_flag = 0
+        self.websocket_error_count = 0
+
+        self.tts_in_data_len = 0
+        self.tts_out_data_len = 0
+        self.VC_satrt_flag = 0
+        self.session_id = ""
+        EventMesh.subscribe("AI_key_press", self.AI_key_press)
+        EventMesh.subscribe("AI_key_release", self.AI_key_release)
+        EventMesh.subscribe("AI_key_long_press", self.AI_key_long_press)
+        EventMesh.subscribe("pwk_key_release", self.pwk_key_release)
+        EventMesh.subscribe("get_AI_audio_queue", self.get_AI_audio_queue)
+        EventMesh.subscribe("get_VC_satrt_flag", self.get_VC_satrt_flag)
+        EventMesh.subscribe("VC_error", self.VC_error)
+        
+        EventMesh.publish("close_led")
+
+        self.bot_name = "柒先生"
+        try:
+            if "bot_name" in self.VC_TTS_voice_type[self.VC_TTS_voice_key]:
+                self.bot_name = self.VC_TTS_voice_type[self.VC_TTS_voice_key]["bot_name"]
+            else:
+                print("not bot_name!!!!!!!!!!!!!!!!!!!!!!")
+        except Exception as e:
+            usys.print_exception(e)
+        try:
+            if self.ai_OTA.min_sys_ota()==1:
+            #if 0:    
+                self.AI_TTS_str = "检测到有新版本需要升级啦!升级时可千万别断电或乱按哦,升级完成后设备会自动重启,重启就代表升级成功"
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+            # if self.ai_OTA.min_sys_ota()==2:
+            #     self.AI_TTS_str = "检测到有新版本需要升级啦!电量低于40%,无法保证升级正常执行,请充满电后重启设备再次升级!"
+            #     EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+            else:
+                try:
+                    self.ai_OTA.ota_result()
+                    self.ai_OTA.pots_ICCID()
+                except Exception as e:
+                    usys.print_exception(e)
+                #开机提示语,如果联网失败,直接提示信号弱
+                
+                
+                #EventMesh.publish("get_storage_config",["powerRestart",1])
+                powerRestart =  EventMesh.publish("get_storage_config","powerRestart")#=1非正常重启
+                if powerRestart == None:
+                    powerRestart = 0
+                if powerRestart == 1:
+                    EventMesh.publish("set_storage_config",["powerRestart",0])
+                    
+                else:
+                    pass
+                    self.AI_TTS_str = self.power_on_tone.replace("bot_name", self.bot_name)
+                    print("开机提示:{}".format(self.AI_TTS_str))
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                
+                
+
+        except Exception as e:
+            usys.print_exception(e)
+
+        
+    def post_processor_after_instantiation(self):
+        pass
+    def get_AI_audio_queue(self, event, msg):
+        return self.AI_audio_queue
+    def get_VC_satrt_flag(self, event, msg):
+        return self.VC_satrt_flag
+
+
+    def VC_30S_timer_cb(self, *args): #
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_30S_timer_cb_}) 
+
+    def VC_30S_timer_cb_(self):    
+        self.get_config_timer_count += 1
+        if self.get_config_timer_count >= 2*60*2:#2小时更新配置参数
+            self.get_config_timer_count = 0
+            try:
+                self.http_get_config()#获取/更新配置参数
+            except Exception as e:
+                usys.print_exception(e)
+    #提交错误id           
+    def ud_error(self,error_data):
+        response = None
+        if self.is_up_error == 1:
+            try:
+                # currentVersion = versions.Build_Time
+                # currentVersion = "7PIN-"+currentVersion[:10]+"-"+currentVersion[11:-3]
+                url = "http://{}/health?task_id={}".format(self.server_ip,error_data[0]+error_data[1])
+                print(url)
+                response = request.get(url,timeout=5)
+                if response.status_code == 200:
+
+                    print("ud_error:ok")
+                else:
+                    print("ud_error  error!!!!")
+                    for i in response.text:
+                        print(i)
+                response.close()
+            except Exception as e:
+                usys.print_exception(e)
+                if response != None:
+                    response.close()
+    #获取配置参数
+    def http_get_config(self, event=None, msg=None):
+        print("http_get_config")
+
+        response = None
+        #http://180.184.206.142/bz-api/dev/config?deviceId=xxx
+        try:
+            url = "http://dmp.raisound.com/bz-api/dev/config/{}".format(modem.getDevImei())
+            print(url)
+            response = request.get(url,timeout=5)
+            if response.status_code == 200:
+                data = response.json()
+                print("http_get_config:{}".format(data))
+                
+                if data:
+                    try:
+                        if data["code"] == 20000:#有配置
+                            if data["data"] :
+                                if "version" in data["data"]:
+                                    config_version = EventMesh.publish("get_storage_config","config_version")#音量配置
+                                    if config_version != data["data"]["version"]:
+                                        config_version = data["data"]["version"]
+                                        EventMesh.publish("set_storage_config",["config_version",config_version])
+                                        if "VC_TTS_voice_type" in data["data"]:
+                                            self.VC_TTS_voice_type = data["data"]["VC_TTS_voice_type"]
+                                            EventMesh.publish("set_storage_config",["VC_TTS_voice_type",self.VC_TTS_voice_type])
+                                            print("配置VC_TTS_voice_type成功")
+                                        if "server_ip" in data["data"]:
+                                            self.server_ip = data["data"]["server_ip"]
+                                            EventMesh.publish("set_storage_config",["server_ip",self.server_ip])
+                                            print("配置server_ip成功")
+                                        if "power_on_tone" in data["data"]:
+                                            self.power_on_tone = data["data"]["power_on_tone"]
+                                            EventMesh.publish("set_storage_config",["power_on_tone",self.power_on_tone])
+                                            print("配置power_on_tone成功")
+
+                    except Exception as e:
+                            usys.print_exception(e)
+            else:
+                print("status_code:{}".format(response.status_code))
+                print("http_get_config:error!!!!!!!!!!")
+            response.close()
+        except Exception as e:
+            usys.print_exception(e)
+            if response != None:
+                response.close()
+
+    def audio_cb(self,event):
+        if event == 0:
+            self.audio_play_state =1
+            #EventMesh.publish("set_audio_state", 1)
+            print('audio-play start.')
+        elif event == 7:
+            self.audio_play_state = 0
+            #EventMesh.publish("set_audio_state", 0)   
+            print('audio-play finish.!!!!!!')
+
+    def AI_key_press(self, event, msg):#按键按下
+        print("AI_key_press")
+        self.get_config_timer_count = 0
+        self.key_state = 1
+        self.Close()
+        # if dev_type == "7PIN" :
+        #     self.aud.aud_tone_play(10,200)#播放按键音
+        #self.aud.aud_tone_play(10,200)#播放按键音
+        self.AI_TTS_str = ""#"你好,有什么吩咐"
+        self.AI_ASR_str = ""
+        self.AI_ASR_str_tmp = ""
+        self.VC_state = VC_State_None
+        # if self.VC_state != VC_State_None:
+        #     EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+        #     EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(10)})
+        #if self.VC_record_state_flag >1:#如果在录音,就先停止录音
+        self.VC_Speech_End()
+
+        self.VC_Speech_Start()    
+        self.AI_VC_start() 
+        #self.chenggong_tone()
+        # self.Close()
+        # self.AI_VC_start()
+        self.AI_key_long_press_flag = 0
+        
+
+    def AI_key_release(self, event, msg):#按键弹起
+        print("AI_key_release123")
+        self.key_state = 0
+        if self.AI_key_long_press_flag == 1 :#有长按
+            #self.AI_client_VC_end_speech()
+            #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(1000)})
+            #EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_asr_StopTranscription_requset})
+            #self.AI_client_asr_StopTranscription_requset()#请求停止
+            if self.VC_mode == 1 :#长按单次问答模式
+                # if self.AI_ASR_str_tmp != "":
+                print("AI_key_release:asr_str:{}".format(self.AI_ASR_str))  
+                #     EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start})
+                self.AI_client_VC_end_speech()
+                pass
+            
+        else :
+            if self.VC_mode == 1 :#长按单次问答模式
+                try:
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+                except Exception as e:
+                    usys.print_exception(e)
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.key_prompt})  #提示请您按住中间的按钮开始讲话,讲完松开即可   
+                #self.AI_TTS_str = "请您按住中间的按钮开始讲话,讲完松开即可 "
+                #EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start})
+                pass
+                
+                #self.VC_Speech_End()
+    def AI_key_long_press(self, event, msg):#按键长按
+        print("AI_key_long_press")
+        self.AI_key_long_press_flag = 1
+
+    def pwk_key_release(self, event, msg):#电源键短按,关闭
+        print("pwk_key_release")
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+
+    def key_prompt(self):
+        EventMesh.publish("audio_montage_play",["key_prompt.mp3"])
+        #self.aud.play(1,1,'U:/static/key_prompt.mp3')#提示请您按住中间的按钮开始讲话,讲完松开即可
+    def VC_error(self, event, msg):#错误播报
+        self.websocket_error()
+        #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error}) 
+    def set_VC_record_state_flag(self,data):
+        
+        self.VC_record_state_flag = data
+        print("set_VC_record_state_flag:{}".format(self.VC_record_state_flag))
+    #开始录音,不缓存,直接发
+    def VC_Speech_Start_now(self):
+        self.VC_Speech_Start()
+        if self.VC_record_state_flag  == 1:
+            self.VC_record_state_flag =2
+        print("VC_Speech_Start_now:{}".format(self.VC_record_state_flag))
+    #开始录音,先缓存到buf,等服务器响应再发
+    def VC_Speech_Start(self):
+        try:
+            
+            #self.VC_state =  VC_State_SpeechStart
+            print("VC_Speech_Start VC_record_state_flag:{} self.AI_ASR_flag:{}!!!!!!!!".format(self.VC_record_state_flag,self.AI_ASR_flag))  
+            if self.AI_ASR_flag  != 0:
+                return
+            
+            if self.VC_record_state_flag  == 0:
+                
+                self.VC_record_thread_close()#关闭录音线程
+                _thread.stack_size(self.Audio_buf_size+8*1024)
+                self.VC_record_thread_id = _thread.start_new_thread(self.VC_record_thread,())
+                _thread.stack_size(8*1024)
+                print("self.VC_record_thread_id:{}".format(self.VC_record_thread_id))
+                try:
+                    
+                    if self.VC_record_TYPE == VC_record_TYPE_AMR :
+                        try :
+                            self.record.stream_start(audio.Record.AMRNB, self.VC_record_samplerate, 0)
+                        except Exception as e:
+                                usys.print_exception(e)
+                    elif self.VC_record_TYPE == VC_record_TYPE_PCM:
+                        print("record_pcm.stream_read_start()!!!!!!!!!!!!")
+                        self.record.stream_start(audio.Record.WAV, self.VC_record_samplerate, 0)
+                        # if self.record_pcm != None:
+                        #     try:
+                        #         self.record_pcm.stream_stop()
+                        #         self.record_pcm.close()
+                        #         self.record_pcm = None
+                        #     except Exception as e:
+                        #         usys.print_exception(e)
+                        # if self.record_pcm == None:        
+                        #     ret = self.record_pcm = audio.Audio.PCM(0,1,16000,0,1,2)
+                        #     print("audio.Audio.PCM:ret:{}".format(ret))
+                        #     ret = self.record_pcm.stream_read_start()
+                        #     print("self.record_pcm.stream_read_start:ret:{}".format(ret))
+                except Exception as e:
+                    usys.print_exception(e) 
+                
+                self.VC_record_state_flag = 1
+                
+        except Exception as e:
+            self.websocket_error()
+            self.VC_record_state_flag = 1
+            self.VC_Speech_End()#关闭录音
+            usys.print_exception(e)   
+    #停止录音
+    def VC_Speech_End(self):
+        try:
+            self.AI_ASR_flag = 0
+            self.AI_ASR_str_tmp = ""
+            self.AI_ASR_str = ""
+            #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_asr})
+              
+            if self.VC_record_state_flag == 0:
+                return
+            #self.AI_client_asr_StopTranscription_requset()#请求停止
+            if self.VC_record_TYPE == VC_record_TYPE_AMR:
+                self.record.stream_stop()
+                self.record.stop()#关闭录音
+                Record_read_buf = bytearray(self.Audio_buf_size)
+                for i in range(10):
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)
+                    print("Record_len:!!!!!!{}".format(Record_len))
+                    if Record_len <= 0:
+                        break
+            elif self.VC_record_TYPE == VC_record_TYPE_PCM:
+                self.record.stream_stop()
+                self.record.stop()#关闭录音
+                Record_read_buf = bytearray(self.Audio_buf_size)
+                for i in range(10):
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)
+                    print("Record_len:!!!!!!{}".format(Record_len))
+                    if Record_len <= 0:
+                        break
+                # if self.record_pcm != None:
+                #     try:
+                #         self.record_pcm.stream_stop()
+                #         self.record_pcm.close()
+                #         self.record_pcm = None
+                #     except Exception as e:
+                #         usys.print_exception(e)
+        except Exception as e:
+            usys.print_exception(e)
+        self.VC_record_thread_close()#关闭录音线程
+        if self.AI_record_tmp_queue.empty() != True:
+            self.AI_record_tmp_queue.clear()
+        
+        self.VC_record_state_flag = 0
+        print("VC_Speech_End VC_record_state_flag:{}!!!!!!!!".format(self.VC_record_state_flag))   
+    #关闭录音线程   
+    def VC_record_thread_close(self): 
+        if self.VC_record_thread_id != 0:
+            count =50
+            while True:
+                count -= 1
+                if self.VC_record_thread_lock == 1:
+                    self.VC_record_thread_lock = 2
+                if self.VC_record_thread_lock == 0 or count <=0:
+                    break
+                else:
+                    print("VC_record_thread_thread going:{}...".format(count))
+                    utime.sleep_ms(1)
+            self.VC_record_thread_lock = 0
+            print("VC_record_thread_thread_close")
+            try:
+                _thread.stop_thread(self.VC_record_thread_id)
+            except Exception as e:
+                usys.print_exception(e)
+        self.VC_record_thread_id = 0
+    #获取录音数据
+    def VC_record_thread(self):
+        ##return
+        print("VC_record_thread start!!!!!!!!!!!!!!!!!!!!\r\n")
+        count = 0
+        RequestToSpeak_flag = 0
+        # try:
+        #     uos.remove('/usr/test.pcm')
+        # except Exception as e:
+        #     usys.print_exception(e)
+        #record_data_queue = Queue(100)
+        #fd = open('/usr/test.pcm','w')
+        # if self.VC_record_TYPE == 1:
+        #     h_data= [0x23,0x21 ,0x41 ,0x4D ,0x52 ,0x0A ]
+        #     h_data_b = bytes(h_data)
+        #     self.AI_client_VC_send(h_data_b)
+        AI_record_tmp_queue_len = 0
+        vad_buf = bytearray()
+        VAD_data_count = 0
+        vad_state = 0
+        self.VAD_count = 0
+        while True:
+            try:
+                if self.VC_record_thread_lock == 2:
+                    break
+                self.VC_record_thread_lock = 1
+                # 死循环接收数据
+                #if self.VC_state ==  VC_State_SpeechStart:
+                Record_read_buf = bytearray(self.Audio_buf_size)
+                
+                Record_len = 0
+                if self.VC_record_TYPE == VC_record_TYPE_PCM:#pcm
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)
+                    #utime.sleep_ms(60)
+                    
+                else :
+                    
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)
+                    utime.sleep_ms(600)
+
+                #Record_len = 1024*2
+                #print("VC_record_thread:{}".format(Record_len))
+                if Record_len > 0:
+                    read_buf = bytes(Record_read_buf[:Record_len])
+                    print("Record_len:{}".format(Record_len))
+                    #VAD检测
+                    if self.is_VAD == 1:
+                        vad_state = 0
+                        tmp_c = 1000
+                        while True:
+                            tmp_c -=1
+                            if tmp_c <=0:
+                                break
+                            #vad_buf_len = len(vad_buf)
+                            if VAD_data_count == 0:#没数据的时候
+                                vad_buf = Record_read_buf[:self.VAD_data_len]
+                                VAD_data_count = self.VAD_data_len
+                                self.vad.custom_vad_reset()#重置vad
+                            else:#有数据的时候
+                                if Record_len - VAD_data_count < self.VAD_data_len :#剩余长度不够一次填充,先保留,但不填算法
+                                    vad_buf = Record_read_buf[VAD_data_count:Record_len]
+                                    VAD_data_count = 0
+                                    break
+                                else:#剩余长度够填一次数据
+                                    vad_buf = Record_read_buf[VAD_data_count:VAD_data_count+self.VAD_data_len]
+                                    VAD_data_count += len(vad_buf)
+                            #print("vad_buf_len:{},{}".format(len(vad_buf),VAD_data_count))
+                            
+                            if len(vad_buf) >= self.VAD_data_len:
+                                vad_state = self.vad.custom_vad_process(vad_buf,len(vad_buf))#给vad数据
+                                #print("vad_state:{}".format(vad_state))
+                                
+                            if VAD_data_count >= Record_len:
+                                VAD_data_count = 0
+                                break
+                            if vad_state == 1:
+                                print("检测到VAD=1!!!!!!!!!!!!!")
+                                print("检测到VAD=1!!!!!!!!!!!!!")
+                                print("检测到VAD=1!!!!!!!!!!!!!")
+                                
+                                EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Play_Pause,"data":1})#停止音频
+                                # EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_RequestToSpeak})#打断
+                                # RequestToSpeak_flag = 1
+                                
+                                self.VAD_count+=1
+                                if self.VAD_count >= 20: 
+                                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_RequestToSpeak})#打断
+                                        
+                            else:
+                                if self.VAD_count != 0:
+                                    EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Play_Pause,"data":0})#恢复音频播放
+                                self.VAD_count  = 0
+                    if self.VC_state >= VC_State_TTSStart:
+                        pass
+                        if vad_state == 1:
+                            self.AI_record_tmp_queue.put(read_buf)#入缓存队列
+                            AI_record_tmp_queue_len += len(read_buf)
+                            
+                       
+                    else:
+                        VAD_data_count = 0
+                        if self.VC_record_state_flag <=1 :#没发送前先存起来
+                            self.AI_record_tmp_queue.put(read_buf)
+                            AI_record_tmp_queue_len += len(read_buf)
+                        else:
+                            AI_record_tmp_queue_len = 0
+                            while True:
+                                if self.AI_record_tmp_queue.empty() == True:
+                                    break
+                                else:
+                                    pass
+                                    self.AI_client_VC_send(self.AI_record_tmp_queue.get())  #发送之前存的数据
+                            self.AI_client_VC_send(read_buf)   
+                    
+                    if self.record_data_save_flag == 1:
+                        if self.record_fd == None:
+                            try:
+                                uos.remove('/usr/record_data.pcm')
+                            except Exception as e:
+                                usys.print_exception(e)
+                            self.record_fd = open('/usr/record_data.pcm','w')
+                        if self.record_fd != None:
+                            self.record_fd.write(read_buf)
+                            print("write record:{}".format(len(read_buf)))
+                            # count+=Record_len
+                            # if count >150*1024:
+                            #     self.record_fd.close()
+                                #self.record_fd = None
+
+                    
+                    
+
+                    #print("VC_record_thread:{}".format(len(read_buf)))
+                    #count+=len(read_buf)
+                # if count>=500*1024:#结束
+                #     self.AI_client_VC_end_speech()
+                #     break
+                # count+=1
+                # if count %10 == 0:
+                #     print("VC_record_thread on line {} asr recv :{} send:{}".format(self.VC_record_state_flag,_thread.threadIsRunning(self.AI_client_asr_recv_id),_thread.threadIsRunning(self.AI_VC_send_data_queue_thread_id)))
+                
+                # if self.VC_state >=  VC_State_SpeechEnd:
+                #     break
+                
+            except Exception as e:
+                    usys.print_exception(e)
+                    #break
+            self.VC_record_thread_lock = 0
+            utime.sleep_ms(100)
+        #fd.close()
+        print("VC_record_thread:exit")
+        self.VC_record_thread_id = 0#线程退出
+        self.VC_record_thread_lock = 0
+###################################################### VC ###################################################################################
+    def websocket_connect_VC(self):
+        print("websocket_connect_VC:{} e:{}!!!!!!!!!!!!!!!!!!!!!".format(self.AI_client_VC_isconnect,self.AI_client_VC_debug))
+        if self.AI_client_VC_isconnect == 1:
+            return
+        # 创建VC客户端
+        try:
+            signal = net.csqQueryPoll()
+            if signal == -1 or sim.getStatus() != 1:#网络正常
+                self.websocket_error()
+                return
+            
+            req_str = ""
+            ack = ""
+            if self.is_VC_ACK == 1:
+                ack = "ack=1"
+            lang = "lang=zh-cn"#普通话测试环境
+            try:
+                if "loang" in self.VC_TTS_voice_type[self.VC_TTS_voice_key]:
+                    lang = self.VC_TTS_voice_type[self.VC_TTS_voice_key]["lang"]
+                else:
+                    print("not lang!!!!!!!!!!!!!!!!!!!!!!")
+            except Exception as e:
+                usys.print_exception(e)
+            if dev_type == "G10":
+                platform = "platform=huoshan&is_boot=1"
+                #platform = "platform=raisound"
+                #platform = "platform=aliyun"
+            elif dev_type == "7PIN_BK":
+                platform = "platform=huoshan"
+                #platform = "platform=raisound&bot_type=dify"   
+                platform = "platform=raisound&bot_type=fourseason_water"
+                pass
+            elif dev_type == 'momo':# 
+                #22080/voice-chat/v2.1/ws?platform=raisound&bot_type=deepseek
+                platform = "platform=raisound&bot_type=shimeng_mo"
+            elif dev_type == "sjgq":
+                platform = "platform=raisound"
+            else:
+                platform = "platform=huoshan"
+                #platform = "platform=huoshan&is_boot=1"
+            #女,男,童,粤,川
+            self.bot_name = "柒先生"
+            try:
+                if "bot_name" in self.VC_TTS_voice_type[self.VC_TTS_voice_key]:
+                    self.bot_name = self.VC_TTS_voice_type[self.VC_TTS_voice_key]["bot_name"]
+                else:
+                    print("not bot_name!!!!!!!!!!!!!!!!!!!!!!")
+            except Exception as e:
+                usys.print_exception(e)
+            
+            # Headers = {'X-NLS-Token':'0c8b8f05a46f423096be64a9c4c46310'}
+            # self.AI_client_VC = uwebsocket.Client.connect('wss://nls-gateway-cn-beijing.aliyuncs.com/ws/v1',headers=Headers, debug=False)
+            token = EventMesh.publish("get_dev_token")
+            print("token:{}".format(token))
+            if dev_type == 'momo' :# 
+                req_str = "voice-chat/v2.1/ws?is_auth={}&{}&{}".format(self.is_auth,platform,lang)
+            elif dev_type == '7PIN_BK':
+                #req_str = "voice-chat/v2.1/ws?is_auth={}&{}&{}".format(self.is_auth,platform,lang)
+                req_str = "voice-chat/ws?is_auth={}&{}&{}".format(self.is_auth,platform,lang)
+            elif dev_type == "sjgq":
+                req_str = "22085/voice-chat/ws?is_auth={}&{}&{}".format(self.is_auth,platform,lang)
+            elif dev_type == "G10":
+                req_str = "vc/chat?is_auth={}".format(self.is_auth)
+            else:
+                req_str = "voice-chat/ws?is_auth={}&{}&{}".format(self.is_auth,platform,lang)
+            req_str = "vc/chat?is_auth={}".format(self.is_auth)
+            url = 'ws://{}/{}&dt={}'.format(self.server_ip,req_str,token)
+            #url = 'ws://115.190.94.208:22080/vc/coze?dt={}'.format(token)
+            
+            print("VC VC:url{}".format(url))
+            self.AI_client_VC = uwebsocket.Client.connect(url, debug=True)
+            #self.AI_WS_connect_Queue.put(self.AI_client_VC)
+
+       
+            print("websocket_connect_VC:OK!!!!!!!!!!!!!!!!!!!!!")
+        except Exception as e: #网络连接异常
+            usys.print_exception(e)
+            print("websocket_connect_VC error!!!\r\n")
+            str_error = str(e)
+            if str_error.find("[Errno 22] EINVAL")!= -1: 
+                print("websocket_connect_VC:str_error:{}".format(str_error))
+                print("[Errno 22] EINVAL!!!\r\n")
+                print("[Errno 22] EINVAL!!!\r\n")
+                print("[Errno 22] EINVAL!!!\r\n")
+                print("[Errno 22] EINVAL!!!\r\n")
+                self.websocket_error()
+                EventMesh.publish("set_storage_config",["powerRestart",1])#调试临时关闭
+                utime.sleep_ms(1000)
+                self.aud.stopPlayStream()
+                self.aud.stopAll()
+                Power.powerRestart()
+                
+            self.websocket_error()
+            return
+        #print("AI_client_VC:{}".format(self.AI_client_VC))
+        if self.AI_client_VC == None:
+            EventMesh.publish("update_dev_token")#获取token
+            self.websocket_error()
+            return
+        self.AI_client_VC_debug+=1
+        utime.sleep_ms(10)
+        self.AI_client_VC.settimeout(5)
+        #self.AI_VC_send_data_queue_thread_close()#关闭发送线程
+        if self.AI_VC_send_data_queue_thread_id == 0:    
+            _thread.stack_size(self.Audio_buf_size+8*1024)
+            self.AI_VC_send_data_queue_thread_id = _thread.start_new_thread(self.AI_VC_send_data_queue_thread, ())
+            _thread.stack_size(8*1024)
+            print("AI_VC_start :AI_VC_send_data_queue_thread_id :{} ".format(self.AI_VC_send_data_queue_thread_id))
+        self.AI_client_VC_recv_thread_close()#关闭读线程
+        # 线程接收数据
+        _thread.stack_size(self.Audio_buf_size+8*1024)
+        self.AI_client_VC_recv_id = _thread.start_new_thread(self.AI_client_VC_recv, (self.AI_client_VC,))
+        _thread.stack_size(8*1024)
+        self.AI_client_VC_isconnect = 1
+        print("websocket_connect_VC end")
+
+    def websocket_error(self,TTS_str=None):
+        print("websocket_error1!!!!")
+        self.Close()
+        print("websocket_error1.1!!!!")
+        print("websocket_error!!!!")
+        print("websocket_error!!!!")
+        self.VC_Thinking_timerout = 0
+        self.VC_satrt_flag = 0
+        self.AI_TTS_str = ""
+        self.AI_ASR_str = ""
+        self.AI_ASR_str_tmp = ""
+        self.AI_ASR_flag  = 0
+        self.VC_Speech_End()
+        EventMesh.publish("close_led")
+        if TTS_str == None:
+            self.websocket_error_count+=1
+            # if self.websocket_error_count <=3:
+            #     EventMesh.publish("audio_montage_play",["xinhaoruo1.mp3"])
+            if self.websocket_error_count <10 :
+                EventMesh.publish("audio_montage_play",["xinhaoruo1.mp3"])
+            elif self.websocket_error_count >=10:
+                EventMesh.publish("paly_iccid_imei")    
+            # else:
+            #     EventMesh.publish("audio_montage_play",["R_SIM_FAILE.mp3"])
+            #self.aud.play(1,1,'U:/static/R_SIM_FAILE.mp3')
+            if self.websocket_error_count <3 :
+                utime.sleep_ms(3000)
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start})
+        else:
+            print("websocket_error:tts:{}".format(TTS_str))
+            self.AI_TTS_str = TTS_str
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start})
+        print("websocket_error2")
+       
+        
+        print("websocket_error4")
+        
+
+    def websocket_deconnect_VC(self):
+        #print("websocket_deconnect_VC {}!!!!!!!".format(self.AI_client_VC_isconnect))
+        print("websocket_deconnect_VC!!!!!!!")
+        self.AI_client_VC_recv_thread_close()#关闭读线程
+        self.AI_client_VC_recv_id = 0
+        if self.AI_client_VC_isconnect == 1 or self.AI_client_VC!=None:
+            try:
+                self.AI_client_VC_isconnect = 0
+                count = 500
+                while True:#等待发完数据
+                    count-=1
+                    if count <=0 or self.AI_VC_send_data_queue_thread_lock == 0:
+                        break
+                    utime.sleep_ms(1)
+                
+                try:
+                    self.AI_client_VC.close()
+                    self.AI_client_VC_debug -=1
+                    #self.AI_client_VC=None
+                except Exception as e:
+                    usys.print_exception(e)
+                    try :
+                        self.AI_client_VC.close()
+                        self.AI_client_VC_debug -=1
+                        #self.AI_client_VC=None
+                    except Exception as e:
+                        usys.print_exception(e)
+                try :
+                    self.AI_client_VC._close()
+                except Exception as e:
+                    usys.print_exception(e)
+                self.AI_client_VC = None
+            except Exception as e:
+                usys.print_exception(e)
+        print("websocket_deconnect_VC {}!!!!!!!".format(self.AI_client_VC_isconnect))
+    #websocket发送ping
+    def AI_client_VC_ping(self):
+        pass
+        if self.AI_client_VC_isconnect == 1:
+            #self.AI_client_VC.write_frame(0x09,b'ping ping')
+            self.AI_client_VC_send("ping")
+            print("VC: ping ping")
+
+    #websocket发送数据    
+    def AI_client_VC_send(self,data_str):
+        # if isinstance(data_str, str):#是字符串
+        #     print("AI_client_VC_send:{}".format(data_str))
+        #     pass
+        # else:
+        #     print("AI_client_VC_send:len{}".format(len(data_str)))
+        self.AI_VC_send_data_queue.put([AI_client_VC_num,data_str]) 
+     #关闭数据发送线程
+    def AI_VC_send_data_queue_thread_close(self):
+        if self.AI_VC_send_data_queue_thread_id != 0:
+            count =500
+            while True:
+                count -= 1
+                if self.AI_VC_send_data_queue_thread_lock == 0 or count <=0:
+                    break
+                else:
+                    self.AI_VC_send_data_queue_thread_lock = 2
+                    print("AI_VC_send_data_queue_thread going:{}...".format(count))
+                    utime.sleep_ms(1)
+                    if self.AI_VC_send_data_queue.empty()!=True:
+                        self.AI_VC_send_data_queue.clear()
+            self.AI_VC_send_data_queue_thread_lock = 0
+            print("AI_VC_send_data_queue_thread_close")
+            try:
+                _thread.stop_thread(self.AI_VC_send_data_queue_thread_id)
+            except Exception as e:
+                usys.print_exception(e)
+        self.AI_VC_send_data_queue_thread_id = 0
+    #发送数据队列
+    def AI_VC_send_data_queue_thread(self):
+        print("AI_VC_send_data_queue_thread:start")
+        count_t = 0
+        while True:
+            if self.AI_VC_send_data_queue_thread_lock == 2:
+                print("AI_VC_send_data_queue_thread,该退出了")
+                break  
+            if self.AI_VC_send_data_queue.empty() :#不能去掉,去掉会卡死
+                self.AI_VC_send_data_queue_thread_lock = 0  
+                count_t+=1
+                # if count_t%200 == 0:
+                #     print("self.AI_VC_send_data_queue.empty")
+                utime.sleep_ms(1)
+            else:
+                #data[0]是websocket连接对象编号,data[1]是数据
+                #print("AI_VC_send_data_queue_thread:get")
+                
+                self.AI_VC_send_data_queue_thread_lock = 1
+                data = self.AI_VC_send_data_queue.get()
+                
+                
+                #print("AI_VC_send_data_queue_thread:num{} len{}".format(data[0],len(data[1])))
+                if data != None:
+                    try:
+                        #data["func"](data["data"])
+                        # 发送数据
+                        #bytes_data = bytes(data[1])
+                        #data[0].send(data[1])
+                        #print("AI_VC_send_data_queue_thread:len:{}".format(len(data[1])))
+                        #print("AI_VC_send_data_queue_thread on line asr recv :{} vc recv:{}".format(_thread.threadIsRunning(self.AI_client_asr_recv_id),_thread.threadIsRunning(self.AI_client_VC_recv_id)))
+                        if data[0] == AI_client_VC_num:
+                            
+                            if isinstance(data[1], str):#是字符串
+                                self.VC_pingping_timerout = 0
+                                print("VC VC: send_data:{}".format(data[1]))
+                            else:
+                                print("VC: send_data len:{}".format(len(data[1])))
+                            if self.AI_client_VC != None and self.AI_client_VC_isconnect == 1:
+                                self.AI_client_VC.send(data[1])
+                            else:
+                                print("VC VC: send_data:ERROR:{}".format(len(data[1])))
+                            #print("VC: send_data end")
+    
+                        #print("VC: send_data end")
+                    except Exception as e:
+                        print("DeviceInfo_queue_thread:ERROR:{}".format(e))
+                        usys.print_exception(e)
+                        if data[0] == AI_client_VC_num:
+                            #self.websocket_error()
+                            pass
+
+                            
+                            try:
+                                if self.AI_client_VC_isconnect != 0:
+                                    print("VC发送数据错误,退出")
+                                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"VC发送出错了,请重试"}) 
+                                    self.ud_error(["VC",self.VC_taskid])
+                            except Exception as e: #网络连接异常
+                                usys.print_exception(e)
+
+                    utime.sleep_ms(1)
+        self.AI_VC_send_data_queue_thread_lock = 0              
+    #VC关闭读线程
+    def AI_client_VC_recv_thread_close(self):
+        if self.AI_client_VC_recv_id != 0:
+            count =500
+            while True:
+                count -= 1
+                if self.AI_client_VC_recv_lock == 1:
+                    self.AI_client_VC_recv_lock = 2
+                if self.AI_client_VC_recv_lock == 0 or count <=0:
+                    break
+                else:
+                    print("AI_client_VC_recv_thread going:{}...".format(count))
+                    utime.sleep_ms(1)
+            self.AI_client_VC_recv_lock = 0
+            print("AI_client_VC_recv_thread_close")
+            try:
+                _thread.stop_thread(self.AI_client_VC_recv_id)
+            except Exception as e:
+                usys.print_exception(e)
+        self.AI_client_VC_recv_id = 0
+    #Ai VC websocket返回数据       
+    def AI_client_VC_recv(self,cli):
+        count = 0
+        asr_led_flag = 0
+        tts_led_flag = 0
+        while True:
+            try:
+                # 死循环接收数据
+                self.AI_client_VC_recv_lock = 0
+
+                count+=1
+                if self.VC_state >= VC_State_TTSStart and (self.tts_in_data_len - self.tts_out_data_len > 64*1024 or count>5):
+                    count = 0
+                    utime.sleep_ms(1)
+                if self.VC_state < VC_State_TTSStart:
+                    utime.sleep_ms(1)
+                recv_data = cli.recv()
+                if self.AI_client_VC_recv_lock == 2:
+                    print("AI_client_VC_recv 该退出了")
+                    break
+                self.AI_client_VC_recv_lock = 1
+                self.close_timerout = 0#服务器有返回清零退出时间
+                if recv_data == "websocket close":
+                    # 服务器关闭连接
+                    print("VC 服务器关闭连接!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+                    #self.AI_client_VC_isconnect = 0
+                    #self.websocket_deconnect_VC()
+                    #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_asr}) 
+                    # #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(1500)})
+                    #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_connect_asr}) 
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"VC连接断开了,请重试"}) 
+                    self.ud_error(["VC",self.VC_taskid])
+                    break
+                elif recv_data == "":#客户端关闭连接
+                    print("VC VC :客户端关闭连接")
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"VC连接断开了,请重试"}) 
+                    self.ud_error(["VC",self.VC_taskid])
+                    break
+                try:
+                    self.websocket_error_count = 0
+                    if isinstance(recv_data, str):#返回的是字符串
+                        print("VC VC:recv_data:{}".format(recv_data))
+                        jsload_data =  ujson.loads(recv_data)
+                        #print("AI_client_VC_recv jsload_data = {}".format(jsload_data))
+                        
+                        if jsload_data["event"] == "started" :#会话开始
+                            #payload = jsload_data["payload"]
+                            # self.VC_dialog_id = payload["dialog_id"] 
+                            # self.VC_task_id = jsload_data["task_id"] 
+                            EventMesh.publish("open_led_blue")
+                            print("VC:Started!!!!!!!!\r\n")
+                            if self.AI_TTS_str == "":
+                                #开始上传语音
+                                
+                                if self.VC_mode == 0    :
+                                    self.VC_record_state_flag  =2
+                                else:
+                                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_send_speech})
+                                    
+                                
+                            else:
+                                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_synthesis})
+                            self.VC_state =  VC_State_None   
+                        elif jsload_data["event"] == "asr.started" :#asr开始 
+                            self.VC_state =  VC_State_SpeechStart
+                            if self.VC_mode == 1    :
+                                self.VC_record_state_flag = 2
+                            EventMesh.publish("open_led_blue")
+                        elif jsload_data["event"] == "asr.result" :#asr结果
+                            self.AI_ASR_str = jsload_data["payload"]["content"]
+                            if self.commands_mode ==2:
+                                ret= self.check_text(self.AI_ASR_str)
+                                if ret == 0:#配置指令
+                                            
+                                    if self.AI_VC_send_data_queue.empty()!=True:
+                                        self.AI_VC_send_data_queue.clear()
+                                    if self.AI_ASR_send_data_queue.empty()!=True:
+                                        self.AI_ASR_send_data_queue.clear()
+                                    self.AI_ASR_send_buf_len = 0
+                                    EventMesh.publish("open_led_all")
+                                    try:
+                                        
+                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})
+                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_VC}) 
+                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                                    except Exception as e:
+                                        usys.print_exception(e)
+                                    continue
+                                elif ret == 1:#不处理
+                                    pass
+                            EventMesh.publish("open_led_blue")
+                        elif jsload_data["event"] == "asr.completed" :#asr 终止的标识     
+                            #self.VC_Speech_End()
+                            #EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})
+                            if self.record_data_save_flag == 1:
+                                if self.record_fd :
+                                    self.record_fd.close()
+                                self.record_fd = None
+                            # if dev_type != "7PIN" :
+                            #EventMesh.publish("publish_AI_btnInfo",{"func":self.send_tone}) 
+                        elif jsload_data["event"] == "vad.silence" :#VAD 终止的标识 
+                            pass
+                            #EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})
+                        elif jsload_data["event"] == "llm.created" :#会话开始
+                            EventMesh.publish("open_led_red_green")#
+                            self.VC_state = VC_State_Thinking
+                            # EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Play_Start})
+                            pass
+                        elif jsload_data["event"] == "llm.delta" :#llm返回数据
+                            if self.is_VAD == 0:
+                                if self.VC_record_state_flag == 1:#llm返回数据还没停止,就先停止
+                                    EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})
+                        elif jsload_data["event"] == "tts.started" :#tts开始
+                            self.VC_state = VC_State_TTSStart
+                            if self.is_VAD == 0:
+                                EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Play_Start})
+                            
+                            #self.VC_Play_Start()
+                            EventMesh.publish("open_led_green")#绿色
+                        elif jsload_data["event"] == "tts.completed" :#tts结束
+                            EventMesh.publish("open_led_green")#绿色
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Play_Start})
+                            self.LocalRespondingEnded_timerout = 8
+                            self.VC_state = VC_State_TTSEnd
+                            pass
+
+                        elif jsload_data["event"] == "canceled" :#打断
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_Start_now})#开始录音
+                            self.VC_state = VC_State_None
+                        elif jsload_data["event"] == "completed" :#会话结束
+                            #EventMesh.publish("open_led_green")#绿色
+                            
+                            self.LocalRespondingEnded_timerout = 8
+                            self.VC_state = VC_State_End
+                            pass
+                        elif jsload_data["event"] == "command" :#命令匹配
+                            ret = -1
+                            try:
+                                if self.commands_mode ==1:
+                                    if len(jsload_data["payload"]["functions"])>0:
+                                        
+                                        cmd = jsload_data["payload"]["functions"][0]["function"]["arguments"]
+                                        print("llm:cmd:{}".format(cmd))
+                                        cmd = ujson.loads(cmd)
+                                        ret = self.check_text_llm(cmd)
+                                elif self.commands_mode ==0:
+
+                                    cmd = jsload_data["payload"]
+                                    print("server:cmd:{}".format(cmd))
+                                    ret = self.check_text_server(cmd)
+                            except Exception as e:
+                                usys.print_exception(e)       
+                            if ret == -1:
+                                if self.AI_TTS_str  =="":
+                                    self.AI_TTS_str = "抱歉,没找到对应操作,可以换个说法试试" 
+                            #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(10)})
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_VC}) 
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                    else:#下发音频数据
+                        #self.AI_ASR_str = ""#下发音频后清掉asr结果
+                        
+                        
+                        EventMesh.publish("open_led_green")#绿色
+                        
+                        print("下发音频数据1:{}".format(len(recv_data)))
+                        
+                        if self.play_data_save_flag == 1:
+                            if self.play_fd ==None:
+                                try:
+                                    uos.remove('/usr/play_data.pcm')
+                                except Exception as e:
+                                    usys.print_exception(e)
+                                self.play_fd = open('/usr/play_data.pcm','w')
+                            if self.play_fd !=None:
+                                self.play_fd.write(recv_data)
+                        # print("下发音频数据2:{}".format(len(recv_data)))
+                        #if self.VC_state >= VC_State_TTSStart:
+                            #self.put_record_data([recv_data,""])
+                        if self.VC_play_TYPE == VC_play_TYPE_PCM:
+                            if self.play_pcm != None:
+                                try:
+                                    #print("play_pcm.stream_write !!!")
+                                    buf_len = self.play_pcm.stream_get_buf_len()
+                                    count_tmp = 1000
+                                    while buf_len < len(recv_data):
+                                        utime.sleep_ms(1)
+                                        count_tmp-=1
+                                        if count_tmp<=0:
+                                            break
+                                        buf_len = self.play_pcm.stream_get_buf_len()
+                                    #print("buf已满,等待释放:buf_len:{},count_tmp:{}".format(buf_len,count_tmp))
+                                except Exception as e:
+                                    usys.print_exception(e)
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.put_record_data,"data":[recv_data,""]}) 
+                        utime.sleep_ms(1)
+                except Exception as e:
+                    usys.print_exception(e)
+                
+            except Exception as e:
+                    error_str = str(e)
+                    #print("VC VC:e:{}".format(error_str))
+                    if error_str.find("[Errno 110] ETIMEDOUT")!= -1:
+                        #print("VC VC:recv TIMEDOUT 正常")
+                        pass
+                    else:
+                        usys.print_exception(e)
+                        #self.websocket_error()
+                        print("VC VC :读数据报错,退出")
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"VC出错了,请重试"}) 
+                        self.ud_error(["VC",self.VC_taskid])
+                        break
+        self.AI_client_VC_isconnect = 0
+        self.AI_client_VC_recv_id = 0 
+        self.AI_client_VC_recv_lock = 0
+        print("AI_client_VC_recv END!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+    def put_record_data(self,data):
+        #print("下发音频数据1:{}".format(len(data[0])))
+        ret=self.AI_audio_queue.put(data)
+        self.tts_in_data_len += len(data[0])
+        #print("下发音频数据2:{},{}".format(len(data[0]),self.tts_in_data_len))
+    def check_text_server(self,cmd):
+        # if len(text)>60:
+        #     return -1
+        try:
+                text = cmd["command"]
+                if text.find("切换音色") != -1 :
+                    try:
+                        text = cmd["params"]["cmd_parameter"]
+                        for key in self.VC_TTS_voice_type:
+                            if  text.find(key) != -1 :
+                                self.VC_TTS_voice_key = key
+                                EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                                self.AI_TTS_str = "更改成功" 
+                                return 0
+                    except Exception as e:
+                        usys.print_exception(e)    
+                    if  text.find("男") != -1 :
+                        if "男" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "男"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                            self.AI_TTS_str = "更改成功" 
+                            return 0
+                    if text.find("女") != -1 :
+                        if "女" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "女"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                            self.AI_TTS_str = "更改成功" 
+                            return 0
+                    if text.find("同声") != -1 or text.find("童") != -1 :
+                        if "童" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "童"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                            self.AI_TTS_str = "更改成功" 
+                            return 0
+                    if text.find("粤") != -1 or text.find("越野") != -1 or text.find("广东话") != -1:
+                        if "粤" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "粤"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                            self.AI_TTS_str = "更改成功" 
+                            return 0
+                    if text.find("四川") != -1 :
+                        if "四川" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "四川"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                            self.AI_TTS_str = "更改成功" 
+                            return 0
+                    if text.find("个性") != -1 :
+                        if "个性" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "个性"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                            self.AI_TTS_str = "更改成功" 
+                            return 0
+                    if text.find("英语") != -1 :
+                        if "英语" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "英语"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                            self.AI_TTS_str = "更改成功" 
+                            return 0
+                    self.AI_TTS_str = "更改失败,没找到对应声音" 
+                    return 0
+                if text.find("切换对话模式") != -1:
+                    if self.VC_mode == 0:
+                       self.VC_mode = 1
+                       self.AI_TTS_str = "已切换到单对话模式" 
+                    else:
+                        self.VC_mode = 0 
+                        self.AI_TTS_str = "已切换到长对话模式" 
+                    EventMesh.publish("set_storage_config",["VC_mode",self.VC_mode])
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+
+                    return 0
+                if text.find("音量") != -1:
+                    if  text.find("加") != -1 :
+                        self.VC_TTS_volume += 10
+                        if self.VC_TTS_volume > 100:
+                            #EventMesh.publish("audio_montage_play",["yinliangyizuida.mp3"])
+                            #self.aud.play(1,0,'U:/static/yinliangyizuida.mp3')#音量已最大
+                            self.AI_TTS_str = "音量已最大" 
+                            self.VC_TTS_volume = 100
+                        else:
+                            self.aud.setVolume(self.VC_TTS_volume //10)
+                            EventMesh.publish("set_storage_config",["VC_TTS_volume",self.VC_TTS_volume])
+                            #EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#配置成功
+                            self.AI_TTS_str = "配置成功,当前音量 {}".format(self.VC_TTS_volume)
+                            
+                        return 0
+                    if text.find("减") != -1:
+                        self.VC_TTS_volume -= 10
+                        if self.VC_TTS_volume < 0:
+                            self.VC_TTS_volume = 0
+                            #EventMesh.publish("audio_montage_play",["yinliangyizuixiao.mp3"])
+                            #self.aud.play(1,0,'U:/static/yinliangyizuixiao.mp3')#音量已最小
+                            self.AI_TTS_str = "音量已最小"
+                        else:
+                            self.aud.setVolume(self.VC_TTS_volume //10)
+                            EventMesh.publish("set_storage_config",["VC_TTS_volume",self.VC_TTS_volume])
+                            #EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#配置成功
+                            self.AI_TTS_str = "配置成功,当前音量 {}".format(self.VC_TTS_volume)
+                        return 0
+                
+                if text.find("进入工厂模式") != -1 :
+                    self.factory_mode()
+                    return 1
+                if text.find("查询") != -1:
+
+                    if text.find("信号") != -1 :
+                        signal = net.csqQueryPoll()
+                        
+                        self.AI_TTS_str = "当前信号{}".format(signal)
+                        return 0
+                    if text.find("电量") != -1 :
+                        battery = EventMesh.publish("get_battery")
+                        print("电量查询:{}".format(battery))
+                        #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)])
+                        #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余
+                        self.AI_TTS_str = "电量剩余百分之{}".format(battery)
+                        return 0
+                    if text.find("电压") != -1 :
+                        Vbatt = Power.getVbatt()
+                        #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)])
+                        #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余
+                        self.AI_TTS_str = "当前电池电压{}".format(Vbatt)
+                        return 0
+
+                    if text.find("卡号") != -1 :
+                        iccid = sim.getIccid()
+                        if iccid != -1 and len(iccid) > 5:
+                            print("iccid{}".format(iccid))
+                            self.AI_TTS_str = "当前卡号为:{}".format(iccid)
+                        else:
+                            self.AI_TTS_str = "卡号查询失败"
+                        return 0
+                    if text.find("设备号") != -1 :
+                        imei = modem.getDevImei()
+                        if imei != -1 and len(imei) > 5:
+                            print("IMEI:{}".format(imei))
+                            self.AI_TTS_str = "当前设备号为:{}".format(imei)
+                        else:
+                            self.AI_TTS_str = "设备号查询失败"
+                        return 0
+                    if text.find("版本") != -1 :
+                        sourceVersion = versions.Build_Time
+                        self.AI_TTS_str ="Mr-Seven-"+sourceVersion
+                        return 0
+                    if text.find("服务器地址") != -1 :
+                        self.AI_TTS_str ="服务器地址"+self.server_ip
+                        return 0
+                if text.find("升级") != -1 and (text.find("OTA") != -1 or text.find("ota") != -1):
+                    if self.ai_OTA.min_sys_ota()==1:
+                        self.AI_TTS_str = "有新版本,准备开始升级,升级过程会多次重启设备,请保证流量充足及电量充足"
+                    else:
+                        self.AI_TTS_str = "当前已是最新版本"
+                    return 0
+                
+                if len(text)<20 and (text.find("再见") != -1 or text.find("拜拜") != -1 or text.find("关闭对话") != -1):
+                    #EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+                    self.AI_TTS_str = "好嘞,再见,我们下次再聊"
+                    self.Close_flag = 1
+                    return 0
+                if len(text)<12 and (text.find("关机") != -1 ):
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+                    EventMesh.publish("Power_off")
+                    return 1
+        except Exception as e:
+                usys.print_exception(e)
+        return -1
+    def check_text_llm(self,cmd):
+        try:
+                text = cmd["command"]["chinese_description"]
+                if text.find("切换音色") != -1:
+                    text = cmd["command"]["params_json"]
+                    try:
+                        for key in self.VC_TTS_voice_type:
+                            if  text.find(key) != -1 :
+                                self.VC_TTS_voice_key = key
+                                EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                                self.AI_TTS_str = "了解,声音已切换" 
+                                return 0
+                    except Exception as e:
+                        usys.print_exception(e)    
+                    if  text.find("男") != -1 :
+                        if "男" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "男"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+
+                            self.AI_TTS_str = "了解,声音已切换" 
+                            return 0
+                    if text.find("女") != -1 :
+                        if "女" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "女"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+       
+                            self.AI_TTS_str = "了解,声音已切换" 
+                            return 0
+                    if text.find("同声") != -1 or text.find("童") != -1 :
+                        if "童" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "童"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+
+                            self.AI_TTS_str = "了解,声音已切换" 
+                            return 0
+                    if text.find("粤") != -1 or text.find("越野") != -1 or text.find("广东话") != -1:
+                        if "粤" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "粤"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+
+                            self.AI_TTS_str = "了解,声音已切换" 
+                            return 0
+                    if text.find("四川") != -1 :
+                        if "四川" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "四川"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+
+                            self.AI_TTS_str = "了解,声音已切换" 
+                            return 0
+                    if text.find("个性") != -1 :
+                        if "个性" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "个性"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+
+                            self.AI_TTS_str = "了解,声音已切换" 
+                            return 0
+                    if text.find("英语") != -1 :
+                        if "英语" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "英语"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+
+                            self.AI_TTS_str = "了解,声音已切换" 
+                            return 0
+                    self.AI_TTS_str = "很抱歉,没找到对应声音" 
+                    return 0
+                if text.find("切换对话模式") != -1:
+                    if self.VC_mode == 0:
+                       self.VC_mode = 1
+                       self.AI_TTS_str = "了解,已切换到单对话模式" 
+                    else:
+                        self.VC_mode = 0 
+                        self.AI_TTS_str = "了解,已切换到长对话模式" 
+                    EventMesh.publish("set_storage_config",["VC_mode",self.VC_mode])
+
+
+                    return 0
+                if text.find("音量调整") != -1:
+                        text = cmd["command"]["params_json"]
+                        text = ujson.loads(text)
+                        volume = text["n"]
+                        if volume >100 or volume<0:
+                            self.AI_TTS_str = "音量调整超出范围了,只能0-100哦" 
+                        else:
+                            self.VC_TTS_volume = volume
+                            self.aud.setVolume(self.VC_TTS_volume //10)
+                            EventMesh.publish("set_storage_config",["VC_TTS_volume",self.VC_TTS_volume])
+                            self.AI_TTS_str = "了解,音量已经调整,当前音量是{}".format(self.VC_TTS_volume)
+                        return 0
+                if text.find("音量增大") != -1:
+                        self.VC_TTS_volume += 10
+                        if self.VC_TTS_volume > 100:
+
+                            self.AI_TTS_str = "音量已经是最大啦" 
+                            self.VC_TTS_volume = 100
+                        else:
+                            self.aud.setVolume(self.VC_TTS_volume //10)
+                            EventMesh.publish("set_storage_config",["VC_TTS_volume",self.VC_TTS_volume])
+  
+                            self.AI_TTS_str = "了解,音量已经调大了,当前音量是{}".format(self.VC_TTS_volume)
+                            
+                        return 0
+                if text.find("音量减小") != -1:
+                    self.VC_TTS_volume -= 10
+                    if self.VC_TTS_volume < 0:
+                        self.VC_TTS_volume = 0
+                        #EventMesh.publish("audio_montage_play",["yinliangyizuixiao.mp3"])
+                        #self.aud.play(1,0,'U:/static/yinliangyizuixiao.mp3')#音量已最小
+                        self.AI_TTS_str = "音量已经是最小啦"
+                    else:
+                        self.aud.setVolume(self.VC_TTS_volume //10)
+                        EventMesh.publish("set_storage_config",["VC_TTS_volume",self.VC_TTS_volume])
+
+                        self.AI_TTS_str = "好嘞,音量已经调小了,当前音量是{}".format(self.VC_TTS_volume)
+                    return 0
+                
+                if text.find("语速增大") != -1:
+                        self.speech_rate += 10
+                        if self.speech_rate > 50:
+
+                            self.AI_TTS_str = "语速已经是最快啦" 
+                            self.speech_rate = 50
+                        else:
+                            
+                            EventMesh.publish("set_storage_config",["speech_rate",self.speech_rate])
+  
+                            self.AI_TTS_str = "明白,语速已经调快了,当前语速是{}".format(self.speech_rate)
+                            
+                        return 0
+                if text.find("语速减小") != -1:
+                    self.speech_rate -= 10
+                    if self.speech_rate < -50:
+                        self.speech_rate = -50
+                        #EventMesh.publish("audio_montage_play",["yinliangyizuixiao.mp3"])
+                        #self.aud.play(1,0,'U:/static/yinliangyizuixiao.mp3')#音量已最小
+                        self.AI_TTS_str = "语速已经是最慢啦"
+                    else:
+                        EventMesh.publish("set_storage_config",["speech_rate",self.speech_rate])
+
+                        self.AI_TTS_str = "明白,语速已经调慢了,当前语速是{}".format(self.speech_rate)
+                    return 0
+                
+                if text.find("进入工厂模式") != -1 :
+                    self.factory_mode()
+                    return 1
+                if text.find("查询") != -1:
+                    if text.find("信号") != -1 :
+                        signal = net.csqQueryPoll()
+                        
+                        self.AI_TTS_str = "当前信号{}".format(signal)
+                        return 0
+                    if text.find("电量") != -1 :
+                        battery = EventMesh.publish("get_battery")
+                        print("电量查询:{}".format(battery))
+                        #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)])
+                        #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余
+                        self.AI_TTS_str = "电量剩余百分之{}".format(battery)
+                        return 0
+                    if text.find("电压") != -1 :
+                        Vbatt = Power.getVbatt()
+                        #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)])
+                        #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余
+                        self.AI_TTS_str = "当前电池电压{}".format(Vbatt)
+                        return 0
+
+                    if text.find("卡号") != -1 :
+                        iccid = sim.getIccid()
+                        if iccid != -1 and len(iccid) > 5:
+                            print("iccid{}".format(iccid))
+                            self.AI_TTS_str = "当前卡号为:{}".format(iccid)
+                        else:
+                            self.AI_TTS_str = "卡号查询失败"
+                        return 0
+                    if text.find("设备号") != -1 :
+                        imei = modem.getDevImei()
+                        if imei != -1 and len(imei) > 5:
+                            print("IMEI:{}".format(imei))
+                            self.AI_TTS_str = "当前设备号为:{}".format(imei)
+                        else:
+                            self.AI_TTS_str = "设备号查询失败"
+                        return 0
+                    if text.find("版本") != -1 :
+                        sourceVersion = versions.Build_Time
+                        self.AI_TTS_str ="Mr-Seven-"+sourceVersion
+                        return 0
+                    if text.find("服务器地址") != -1 :
+                        self.AI_TTS_str ="服务器地址"+self.server_ip
+                        return 0
+                if text.find("升级") != -1 and (text.find("OTA") != -1 or text.find("ota") != -1):
+                    if self.ai_OTA.min_sys_ota()==1:
+                        self.AI_TTS_str = "有新版本,准备开始升级,升级过程会多次重启设备,请保证流量充足及电量充足"
+                    else:
+                        self.AI_TTS_str = "当前已是最新版本"
+                    return 0
+                
+                if len(text)<20 and (text.find("再见") != -1 or text.find("拜拜") != -1 or text.find("关闭对话") != -1):
+                    #EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+                    self.AI_TTS_str = "好嘞,再见,我们下次再聊"
+                    self.Close_flag = 1
+                    return 0
+                if len(text)<12 and (text.find("关机") != -1 ):
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+                    EventMesh.publish("Power_off")
+                    return 1
+        except Exception as e:
+                usys.print_exception(e)
+        self.AI_TTS_str  = cmd["command"]["fail_prompt"]
+        return -1
+    def check_text(self,text):
+        if len(text)>60:
+            return -1
+        try:
+            if isinstance(text, str): 
+                if text.find("声音") != -1 and text.find("改") != -1:
+                    try:
+                        for key in self.VC_TTS_voice_type:
+                            if  text.find(key) != -1 :
+                                self.VC_TTS_voice_key = key
+                                EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                                self.AI_TTS_str = "更改成功" 
+                                return 0
+                    except Exception as e:
+                        usys.print_exception(e)    
+                    if  text.find("男") != -1 :
+                        if "男" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "男"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                            self.AI_TTS_str = "更改成功" 
+                            return 0
+                    if text.find("女") != -1 :
+                        if "女" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "女"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                            self.AI_TTS_str = "更改成功" 
+                            return 0
+                    if text.find("同声") != -1 or text.find("童") != -1 :
+                        if "童" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "童"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                            self.AI_TTS_str = "更改成功" 
+                            return 0
+                    if text.find("粤") != -1 or text.find("越野") != -1 or text.find("广东话") != -1:
+                        if "粤" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "粤"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                            self.AI_TTS_str = "更改成功" 
+                            return 0
+                    if text.find("四川") != -1 :
+                        if "四川" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "四川"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                            self.AI_TTS_str = "更改成功" 
+                            return 0
+                    if text.find("个性") != -1 :
+                        if "个性" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "个性"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                            self.AI_TTS_str = "更改成功" 
+                            return 0
+                    if text.find("英语") != -1 :
+                        if "英语" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "英语"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                            self.AI_TTS_str = "更改成功" 
+                            return 0
+                    self.AI_TTS_str = "更改失败,没找到对应声音" 
+                    return 0
+                if text.find("切换对话模式") != -1:
+                    if self.VC_mode == 0:
+                       self.VC_mode = 1
+                       self.AI_TTS_str = "已切换到单对话模式" 
+                    else:
+                        self.VC_mode = 0 
+                        self.AI_TTS_str = "已切换到长对话模式" 
+                    EventMesh.publish("set_storage_config",["VC_mode",self.VC_mode])
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+
+                    return 0
+                if text.find("音量") != -1:
+                    if  text.find("加") != -1 :
+                        self.VC_TTS_volume += 10
+                        if self.VC_TTS_volume > 100:
+                            #EventMesh.publish("audio_montage_play",["yinliangyizuida.mp3"])
+                            #self.aud.play(1,0,'U:/static/yinliangyizuida.mp3')#音量已最大
+                            self.AI_TTS_str = "音量已最大" 
+                            self.VC_TTS_volume = 100
+                        else:
+                            self.aud.setVolume(self.VC_TTS_volume //10)
+                            EventMesh.publish("set_storage_config",["VC_TTS_volume",self.VC_TTS_volume])
+                            #EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#配置成功
+                            self.AI_TTS_str = "配置成功,当前音量 {}".format(self.VC_TTS_volume)
+                            
+                        return 0
+                    if text.find("减") != -1:
+                        self.VC_TTS_volume -= 10
+                        if self.VC_TTS_volume < 0:
+                            self.VC_TTS_volume = 0
+                            #EventMesh.publish("audio_montage_play",["yinliangyizuixiao.mp3"])
+                            #self.aud.play(1,0,'U:/static/yinliangyizuixiao.mp3')#音量已最小
+                            self.AI_TTS_str = "音量已最小"
+                        else:
+                            self.aud.setVolume(self.VC_TTS_volume //10)
+                            EventMesh.publish("set_storage_config",["VC_TTS_volume",self.VC_TTS_volume])
+                            #EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#配置成功
+                            self.AI_TTS_str = "配置成功,当前音量 {}".format(self.VC_TTS_volume)
+                        return 0
+                
+                if text.find("进入工厂模式") != -1 :
+                    self.factory_mode()
+                    return 1
+                if text.find("查询") != -1:
+
+                    if text.find("信号") != -1 :
+                        signal = net.csqQueryPoll()
+                        
+                        self.AI_TTS_str = "当前信号{}".format(signal)
+                        return 0
+                    if text.find("电量") != -1 :
+                        battery = EventMesh.publish("get_battery")
+                        print("电量查询:{}".format(battery))
+                        #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)])
+                        #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余
+                        self.AI_TTS_str = "电量剩余百分之{}".format(battery)
+                        return 0
+                    if text.find("电压") != -1 :
+                        Vbatt = Power.getVbatt()
+                        #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)])
+                        #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余
+                        self.AI_TTS_str = "当前电池电压{}".format(Vbatt)
+                        return 0
+
+                    if text.find("卡号") != -1 :
+                        iccid = sim.getIccid()
+                        if iccid != -1 and len(iccid) > 5:
+                            print("iccid{}".format(iccid))
+                            self.AI_TTS_str = "当前卡号为:{}".format(iccid)
+                        else:
+                            self.AI_TTS_str = "卡号查询失败"
+                        return 0
+                    if text.find("设备号") != -1 :
+                        imei = modem.getDevImei()
+                        if imei != -1 and len(imei) > 5:
+                            print("IMEI:{}".format(imei))
+                            self.AI_TTS_str = "当前设备号为:{}".format(imei)
+                        else:
+                            self.AI_TTS_str = "设备号查询失败"
+                        return 0
+                    if text.find("版本") != -1 :
+                        sourceVersion = versions.Build_Time
+                        self.AI_TTS_str ="Mr-Seven-"+sourceVersion
+                        return 0
+                    if text.find("服务器地址") != -1 :
+                        self.AI_TTS_str ="服务器地址"+self.server_ip
+                        return 0
+                if text.find("升级") != -1 and (text.find("OTA") != -1 or text.find("ota") != -1):
+                    if self.ai_OTA.min_sys_ota()==1:
+                        self.AI_TTS_str = "有新版本,准备开始升级,升级过程会多次重启设备,请保证流量充足及电量充足"
+                    else:
+                        self.AI_TTS_str = "当前已是最新版本"
+                    return 0
+                
+                if len(text)<16 and (text.find("再见") != -1 or text.find("拜拜") != -1 or text.find("关闭对话") != -1):
+                    #EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+                    if dev_type != "7PIN":#柒牌
+                        self.AI_TTS_str = "好嘞,再见,我们下次再聊"
+                        self.Close_flag = 1
+                        return 0
+                    else:
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+                        return 1
+                if len(text)<12 and (text.find("关机") != -1 ):
+                    if dev_type == "7PIN":#柒牌
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+                        return 1
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+                    EventMesh.publish("Power_off")
+                    return 1
+        except Exception as e:
+                usys.print_exception(e)
+        return -1
+    #获取trace_id
+    def get_trace_id(self):
+        t = utime.mktime(utime.localtime())
+        t = t*1000+urandom.randint(0, 1000)
+        md5_data = "{}".format(t)#md5签名
+        sign_data = ""
+        hash_obj = uhashlib.md5(md5_data)
+        res = hash_obj.digest()
+
+        # 转成十六进制表示
+        sign_data = ubinascii.hexlify(res)
+        sign_data = sign_data.decode('ascii')
+        return sign_data
+    
+    def get_session_id(self,data = "session_id"):
+        t = utime.mktime(utime.localtime())
+        t = t*1000+urandom.randint(0, 1000)
+        md5_data = "{}{}".format(data,t)#md5签名
+        sign_data = ""
+        hash_obj = uhashlib.md5(md5_data)
+        res = hash_obj.digest()
+
+        # 转成十六进制表示
+        sign_data = ubinascii.hexlify(res)
+        sign_data = sign_data.decode('ascii')
+        return sign_data
+    
+    def get_new_message_id(self):
+        message_id = self.get_trace_id()+"aaa"+self.get_trace_id()
+        self.VC_message_id=message_id[:32]
+        return self.VC_message_id 
+    def get_new_task_id(self):
+        task_id = self.get_trace_id()+"aaa"+self.get_trace_id()
+        self.VC_task_id=task_id[:32]
+        return self.VC_task_id
+    #开始播放声音
+    def VC_Play_Start(self):
+        self.tts_in_data_len = 0
+        self.tts_out_data_len = 0
+        if self.VC_Play_flag == 0:
+            try:
+                if self.VC_play_TYPE == VC_play_TYPE_PCM:
+                    if self.play_pcm == None:        
+                        self.play_pcm = audio.Audio.PCM(0,1,self.VC_play_samplerate,1,1,2)
+                        #self.play_pcm.setVolume(11)
+                        ret = self.play_pcm.stream_write_start()
+                        print("self.record_pcm.stream_write_start:ret:{}".format(ret))
+                elif self.VC_play_TYPE == VC_play_TYPE_MP3:
+                    pass
+                self.VC_Play_flag = 1
+            except Exception as e:
+                self.VC_Play_End()
+                usys.print_exception(e)
+    #暂停/继续声音播放   Pause_flag = 1暂停
+    def VC_Play_Pause(self,Pause_flag):
+        try:
+            if self.VC_play_TYPE == VC_play_TYPE_PCM:
+                if self.play_pcm != None:    
+                    self.play_pcm.stream_pause(Pause_flag)
+        except Exception as e:
+            self.VC_Play_End()
+            usys.print_exception(e)
+    #停止播放声音
+    def VC_Play_End(self):
+        self.VC_Play_flag = 0
+        if self.VC_play_TYPE == VC_play_TYPE_PCM:
+            if self.VC_play_samplerate == 8000:
+                self.aud.stopPlayStream()
+                self.aud.stopAll()
+            elif self.VC_play_samplerate == 16000:
+                if self.play_pcm != None:
+                    print("Close:play_pcm.close()!!!!!!!!!!!!!!!!!!")
+                    try:
+                        self.play_pcm.stream_stop()
+                        self.play_pcm.close()
+                    except Exception as e:
+                        usys.print_exception(e)
+                    self.play_pcm=None
+                self.aud.stopPlayStream()
+                self.aud.stopAll()
+        elif self.VC_play_TYPE == VC_play_TYPE_MP3:
+            self.aud.stopPlayStream()
+            self.aud.stopAll()
+        if self.AI_audio_queue.empty()!=True:
+            self.AI_audio_queue.clear()
+        
+
+    def _1S_timer_cb(self,*argc):
+        EventMesh.publish("publish_AI_btnInfo",{"func":self._1S_timer_cb_}) 
+
+    def _1S_timer_cb_(self):    
+    
+        EventMesh.publish("system_sleep_rest")#防止黑屏
+        self.close_timerout += 1
+        if self.close_timerout > 60:#20秒没数据就close
+            
+            if self.VC_state >= VC_State_SpeechIng:
+                print("接口无响应,超时退出")
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"接口超时了。请重试"}) 
+                self.ud_error(["VC",self.VC_taskid])
+            else:
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+        # print("get_audio_state !!!!!{} {} {}\r\n".format(self.play_end,EventMesh.publish("get_audio_state"),self.play_flag))
+        if self.LocalRespondingEnded_timerout>0  :#
+            self.LocalRespondingEnded_timerout -= 1
+            print("LocalRespondingEnded_timerout:{}".format(self.LocalRespondingEnded_timerout))
+            if self.LocalRespondingEnded_timerout <= 0 or (self.play_pcm != None and self.play_pcm.stream_is_empty() == 1) :#超时或者音频播放完,
+                self.LocalRespondingEnded_timerout = 0
+                if self.VC_mode == 1 :#长按单次问答模式
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+                else:
+                    EventMesh.publish("open_led_blue")
+                    if self.Close_flag == 1:
+                        self.Close_flag = 0
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+                    else:
+                        #utime.sleep_ms(1000)
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Play_End})
+                        #EventMesh.publish("publish_AI_btnInfo",{"func":self.chenggong_tone})
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_Start_now})#开始录音
+                        self.VC_state = VC_State_None
+                    #通知服务器播放结束
+                    #self.AI_client_VC_LocalRespondingEnded()
+
+        self.VC_pingping_timerout+=1
+        if self.VC_pingping_timerout>3:
+            self.VC_pingping_timerout=0
+            self.AI_client_VC_ping()
+        # self.asr_pingping_timerout += 1
+        # if self.asr_pingping_timerout>3:
+        #     self.asr_pingping_timerout=0
+        #     self.AI_client_asr_ping()    
+        if self.VC_Thinking_timerout > 0 and self.VC_Thinking_timerout < 100:#VC Thinking超时后重新开始
+            print("VC_Thinking_timerout:{}!!!!!!!!!!!!!!!!!!!!!".format(self.VC_Thinking_timerout))
+            self.VC_Thinking_timerout -=1
+            if self.VC_Thinking_timerout == 0:
+                self.VC_Thinking_timerout = 100
+                print("Thinking重试,重试!!!!!!!!!!!!!!!!!!!!!")
+                self.VC_state = VC_State_None
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                pass
+        
+    #VC开始
+    def AI_VC_start(self):
+        print("AI_VC_start1")
+        self.VC_satrt_flag = 1
+        if self.VC_Thinking_timerout < 100:
+            self.VC_Thinking_timerout = 0
+        EventMesh.publish("open_led_all")
+        self.VC_Play_End()#关闭音频播放
+        print("AI_VC_start2")
+        #self.aud.aud_tone_play(16,200)#播放按键音
+        self.LocalRespondingEnded_timerout = 0
+        self.close_timerout = 0
+
+        
+        #
+        if self.AI_client_VC_isconnect == 0:#没连接的时候请求开始
+            self.websocket_connect_VC()#连接服务器
+            
+            #utime.sleep_ms(50)
+        else:
+            print("self.VC_state :{}".format(self.VC_state ))
+            
+        if self.AI_client_VC_isconnect == 0:
+            return
+        self.AI_client_VC_start_requset()
+        print("AI_VC_start3")
+         
+        self.VC_state = VC_State_None
+        if self.AI_TTS_str == "":#没有tts要播放的时候才开始录音
+            #开始asr录音
+            self.VC_Speech_Start()#开启线程获取录音数据
+           
+                
+        #     pass
+        print("AI_VC_start4")
+        #self.VC_Play_Start()
+        #EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Play_Start})
+        #开始线程
+        
+        # if self.AI_VC_send_data_queue_thread_id == 0:    
+        #     _thread.stack_size(self.Audio_buf_size+8*1024)
+        #     self.AI_VC_send_data_queue_thread_id = _thread.start_new_thread(self.AI_VC_send_data_queue_thread, ())
+        #     _thread.stack_size(8*1024)
+        #     print("AI_VC_start :AI_VC_send_data_queue_thread_id :{} ".format(self.AI_VC_send_data_queue_thread_id))
+        
+        if self.AI_audio_queue_thread_id ==0:
+            _thread.stack_size(24*1024)
+            self.AI_audio_queue_thread_id = _thread.start_new_thread(self.AI_audio_queue_thread, ())
+            _thread.stack_size(8*1024)
+            print("AI_VC_start :AI_audio_queue_thread_id :{} ".format(self.AI_audio_queue_thread_id))
+        else:
+            print("AI_VC_start :AI_audio_queue_thread_id != 0 ")
+        self._1S_timer.start(1000,1,self._1S_timer_cb)
+        # self.VC_pingping_timerout = 0
+        # self.asr_pingping_timerout = 0
+        print("AI_VC_start5")
+    #开始会话
+    def AI_client_VC_start_requset(self):
+        voice="zh_male_wennuanahu_moon_bigtts"
+        try:
+            voice = self.VC_TTS_voice_type[self.VC_TTS_voice_key]["voice"]
+        except Exception as e:
+            usys.print_exception(e)    
+        #voice="zh_female_dongmanxiaoyang_moon_bigtts"
+ 
+        json_data = \
+        {
+            "header": {
+                "event": "Start",
+                "trace_id": self.get_trace_id(),
+            },
+            "payload": {
+                "device_id": modem.getDevImei(),
+                "user_agent": "AudioClient/1.0",
+                "dialog_attributes": {
+                    #"provider": "doubao",
+                    "provider": "coze",
+
+                    "cfg": {
+                        "disable_empty_prompt" : True,#拦截空字符请求大模型
+                        "custom_variables": {
+                            "name": self.bot_name,
+                            },
+                        # "greeting":{
+                        #     "enabled":True,
+                        #     "content":"小瑞来陪你聊天了!"
+                        # }
+                        "bot_option": {
+                            "use_workflow": True,
+                            
+                            "bot_id":"7462617881076351002",#语言助手
+                            "workflow_id":"7462621757327196187",
+                           
+                        }
+                    }
+                },
+                "outbound_attributes": {
+                    "provider": "volcengine",
+                    "cfg": {
+                        "format": "pcm",
+                        "sample_rate": self.VC_play_samplerate,
+                        "bit_rate": 16,
+                        "channel": 1,
+                        "volume": self.VC_TTS_volume,
+                        #"voice": "7426720361732980745",
+                        "voice": voice,#音色
+                        "speech_rate": self.speech_rate,#语速
+                        "chunk_interval_ms": 100,  # 配置每段音频入队间隔时间 100ms
+                    }
+                },
+                "inbound_attributes": {
+                    "provider": "xun-fei",#
+                    #"provider": "volcengine",
+                    "disable_vad":True,
+                    "vad_silence":300,
+                    "interrupt_options":{
+                        "concatenate_results":True,
+                        "thinking_time_only": True,
+                    },
+                    "cfg": {
+                        "format": "pcm",
+                        "sample_rate": self.VC_record_samplerate,
+                        "bit_rate": 16,
+                        "channel": 1,
+                        "enable_punctuation": True,
+                        "enable_itn":True
+                    }
+                },
+                "commands":self.commands,
+            }
+        }
+        # "bot_id":"7481164663863459850",#鸭子
+        # "workflow_id":"7480485093845991443",
+        # "bot_id":"7462617881076351002",#语言助手
+        # "workflow_id":"7462621757327196187",
+        # "bot_id":"7469964258592931852",#深圳百事通
+        # "workflow_id":"7469968083063603241",
+        # "bot_id":"7411071327182438412",#柒牌
+        # "workflow_id":"7469049680291610636",
+        if dev_type == "7PIN_BK":#小瑞
+            # json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]="7462617881076351002"#语言助手
+            # json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]="7462621757327196187"
+            json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]="7486697248416989193"#极简
+            json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]="7486698347416649778"
+            #json_data["payload"]["dialog_attributes"]["provider"]="doubao"#豆包
+            json_data["payload"]["inbound_attributes"]["provider"]="volcengine"#火山
+            json_data["payload"]["inbound_attributes"]["vad_silence"] = 200
+        elif dev_type == "7PIN":#柒牌
+            json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]="7411071327182438412"#
+            json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]="7469049680291610636"
+            json_data["payload"]["inbound_attributes"]["vad_silence"] = 1000
+        #
+        elif dev_type == 'momo':#食梦貘
+            pass
+        elif dev_type == 'sjgq':#四季甘泉
+            json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]="7472201279826690111"
+            json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]="472203898494500914"
+            pass
+        elif dev_type == 'szbst':#深圳百事通
+            json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["bot_id"]="7469964258592931852"
+            json_data["payload"]["dialog_attributes"]["cfg"]["bot_option"]["workflow_id"]="7469968083063603241"
+        if self.commands_mode !=0:
+            json_data["payload"]["commands"] = []
+        if self.VC_mode == 0:#长对话模式打开vad
+            json_data["payload"]["inbound_attributes"]["disable_vad"] = False
+        self.VC_state = VC_State_None
+        self.AI_client_VC_send(ujson.dumps(json_data))
+ 
+    #开始上传语音
+    def AI_client_VC_send_speech(self):
+        json_data = \
+        {
+            "header": {
+                "event": "audio.create",
+                
+            },
+        }
+        
+        if self.VC_mode == 1:#单对话模式
+            self.AI_client_VC_send(ujson.dumps(json_data))
+        
+
+            
+            
+        
+        
+        self.VC_state =  VC_State_SpeechStart
+    #结束上传语音
+    def AI_client_VC_end_speech(self):
+        json_data = \
+        {
+            "header": {
+                "event": "audio.completed",
+                
+            },
+        }
+        self.AI_client_VC_send(ujson.dumps(json_data))
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})
+
+  
+    #客户端打断对话
+    def AI_client_VC_RequestToSpeak(self):
+        json_data = \
+        {
+            "event": "cancel",
+            "payload": {}
+        }
+        print("AI_client_VC_RequestToSpeak!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        # EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) 
+        # EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_send,"data":ujson.dumps(json_data)}) 
+        # utime.sleep_ms(1)
+        self.websocket_deconnect_VC()
+        self.AI_audio_queue_thread_close()
+        self.VC_state = VC_State_None
+        #self.Close()
+        self.AI_VC_start() 
+    #TTS播放
+    def AI_client_VC_synthesis(self):
+        json_data = \
+        {
+            "event": "synthesis",
+            "payload": {
+                "text": self.AI_TTS_str
+            }
+        }
+        self.AI_TTS_str = ""
+        print("AI_client_VC_synthesis!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        # if self.VC_state == VC_State_RequestToRespond:
+        #     print("AI_client_VC_RequestToRespond 重复 tts_str:{}\nasr_str:{}".format(self.AI_TTS_str,self.AI_ASR_str))
+        self.AI_client_VC_send(ujson.dumps(json_data))
+    
+    def chenggong_tone(self):
+        EventMesh.publish("audio_montage_play",["chenggong.mp3"])    
+    def send_tone(self):
+        EventMesh.publish("audio_montage_play",["send_tone.mp3"])
+    #给服务器回应ack
+
+      
+    ############################################
+    #关闭音频播放线程
+    def AI_audio_queue_thread_close(self):
+        print("AI_audio_queue_thread_close1!!!!!!!!!!!!!!!!!!!!!!")
+        if self.AI_audio_queue_thread_id != 0:
+            count =500
+            while True:
+                count -= 1
+                if self.AI_audio_queue_thread_lock == 0 or count <=0:
+                    break
+                else:
+                    self.AI_audio_queue_thread_lock = 2
+                    print("AI_audio_queue_thread going:{}...".format(count))
+                    utime.sleep_ms(1)
+            self.AI_audio_queue_thread_lock = 0
+            print("AI_audio_queue_thread_close2!!!!!!!!!!!!!!!!!")
+            try:
+                _thread.stop_thread(self.AI_audio_queue_thread_id)
+            except Exception as e:
+                usys.print_exception(e)
+        self.AI_audio_queue_thread_id = 0
+    # 音频队列        
+    def AI_audio_queue_thread(self):
+        print("AI_audio_queue_thread start")
+        count = 0
+        if self.AI_audio_queue.empty()!=True:
+            self.AI_audio_queue.clear()
+            print("音频数据还有剩余!!!!!!!!!!!!")
+        while True:
+            try:
+                if self.AI_audio_queue_thread_lock == 2:
+                        print("AI_audio_queue_thread 该退出了")
+                        break
+                #
+                count+=1
+                if count%500 == 1:
+                    print("AI_audio_queue_thread on")
+                utime.sleep_ms(1)
+                #print("AI_audio_queue_thread")
+                if self.AI_audio_queue.empty() :
+                    self.AI_audio_queue_thread_lock = 0
+                    
+                    
+                else:
+                    self.AI_audio_queue_thread_lock = 1
+                    data = self.AI_audio_queue.get()
+                    self.close_timerout = 0
+                    if self.play_flag == 0:
+                        self.play_flag =1
+                    #self.AI_client_tts_data_len=len(data)
+                    #print("audio_queue:len:{}".format(len(data[0])))
+                    
+                    if len(data[0]) > 10:
+                        for i in range(5): 
+                            if self.VC_Play_flag == 0:
+                                self.VC_Play_Start()
+                                utime.sleep_ms(2)
+                            else:
+                                break
+                        try:
+                            if self.VC_play_TYPE == VC_play_TYPE_PCM:
+                                # if self.VC_play_samplerate == 8000:
+                                #     tmp= self.aud.playStream(1,data[0] )
+                                # else:
+                                    write_buf = bytearray(data[0])
+                                    #print("play_pcm.stream_write1 len:{}".format(len(write_buf)))
+                                    if self.play_pcm != None:
+                                        #print("play_pcm.stream_write !!!")
+                                        ret = self.play_pcm.stream_write(write_buf,len(write_buf))
+                                        #ret= self.aud.playStream(1, data[0])#播放音频流
+                                        self.tts_out_data_len += ret
+                                        #print("play_pcm.stream_write2:{}".format(self.tts_out_data_len))
+                            elif self.VC_play_TYPE == VC_play_TYPE_MP3:
+                                tmp= self.aud.playStream(3, data[0])#播放音频流
+                                
+                                if tmp != 0:
+                                    print("2playStream:error tmp:{} data len:{}!!!!!!!!!!!!".format(tmp,len(data[0])))
+                                    # # #播放失败的时候填充WAV头
+                                    # data_len = len(data[0])
+                                    # data_len_b = data_len.to_bytes(4,'little')#数据长度转16进制数组
+                                    # h_data = [ 0x52 ,0x49 ,0x46 ,0x46 #,0x24 ,0x00 ,0x00 ,0x00 #文件标识、文件大小
+                                    #         ,0x57 ,0x41 ,0x56 ,0x45 ,0x66 ,0x6D ,0x74 ,0x20  #文件格式、格式块标识符
+                                    #         ,0x10 ,0x00 ,0x00 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x80 ,0x3E ,0x00 ,0x00  #格式块大小4、音频格式2、声道数2、采样率4
+                                    #         ,0x80 ,0x3E ,0x00 ,0x00 ,0x02 ,0x00 ,0x10 ,0x00 ,0x64 ,0x61 ,0x74 ,0x61]#每秒字节数4、数据块对齐2、位深度2、data4
+                                    # h_data_b = bytes(h_data)
+                                    # file_len = data_len+len(h_data_b)+4+4
+                                    # file_len_b = file_len.to_bytes(4,'little')#文件长度转16进制数组
+                                    # h_data_b = h_data_b[:4]+file_len_b+h_data_b[4:]+data_len_b
+                                    # #self.aud.playStream(2, h_data_b)#播放音频流
+                                    # tmp= self.aud.playStream(2, h_data_b+data[0])#播放音频流
+                                    # print("3playStream:tmp:{} !!!!!!!!!!!!".format(tmp))
+                            
+                            
+                            mem = gc.mem_free()
+                            #print('1剩余内存RAM:{} KB'.format(mem / 1024))
+                        except Exception as e:
+                            print("AI_audio_queue_thread:ERROR:")
+                            usys.print_exception(e)
+                    
+                    # if self.VC_state == VC_State_TTSEnd and self.AI_audio_queue.empty() :#self.AI_audio_queue为空且tts下发结束
+                    #     #通知服务器播放结束
+                    #     self.AI_client_VC_LocalRespondingEnded()
+            except Exception as e:
+                print("AI_audio_queue_thread:ERROR:")
+                usys.print_exception(e)
+        self.AI_audio_queue_thread_lock = 0
+        #print("AI_audio_queue_thread:exit")
+    def factory_mode(self):
+        print("factory_mode")
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.factory_start}) 
+    def factory_start(self):
+        self.factory_timer.start(3000, 1, self.factory_timer_cb)
+    def factory_timer_cb(self, *args, **kwargs):
+        print("factory_timer_cb play......")
+        #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+        EventMesh.publish("audio_montage_play",["xinhaoruo1.mp3"])
+
+    def Close(self):
+        self.VC_Thinking_timerout = 0
+        self.VC_satrt_flag = 0
+        self.AI_TTS_str = ""
+        self.AI_ASR_str = ""
+        self.AI_ASR_str_tmp = ""
+        self.AI_ASR_flag  = 0
+        self.AI_ASR_check_timeout = 0
+        self.AI_ASR_error_timeout = 0
+        print("ai_VC Close1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        EventMesh.publish("close_led")
+        self.tts_in_data_len = 0
+        self.tts_out_data_len = 0
+        #必须先销毁线程,不然线程会容易报错
+        
+        try:
+            self.AI_audio_queue_thread_close()#销毁音频线程
+        except Exception as e:
+            usys.print_exception(e)
+        try:
+            self.AI_VC_send_data_queue_thread_close()#销毁数据发送线程
+        except Exception as e: 
+            usys.print_exception(e)
+        
+        self.VC_Speech_End()
+        
+        print("ai_VC Close1.1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        self.VC_init()
+        print("ai_VC Close1.2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        
+        try:
+            self.websocket_deconnect_VC()
+        except Exception as e:
+            usys.print_exception(e)
+        
+
+        
+
+
+        print("ai_VC Close1.3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        
+        print("ai_VC Close2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        
+        
+        self.AI_ASR_timer.stop()
+        self._1S_timer.stop()
+        self.factory_timer.stop()
+        
+        if self.record_data_save_flag == 1:
+            if self.record_fd :
+                self.record_fd.close()
+            self.record_fd = None
+        if self.play_data_save_flag == 1:
+            if self.play_fd !=None:
+                self.play_fd.close()
+                self.play_fd = None
+        print("ai_VC Close3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")
+        
+        if self.AI_VC_send_data_queue.empty()!=True:
+            self.AI_VC_send_data_queue.clear()
+
+        self.AI_ASR_send_buf_len = 0
+        #self.AI_WS_connect_Queue.put(self.AI_client_VC)
+
+        # try:
+        #     while True:
+        #         if self.AI_WS_connect_Queue.empty()!=True:
+        #             AI_WS_connect = self.AI_WS_connect_Queue.get()
+        #             if AI_WS_connect :
+        #                 try:
+        #                     AI_WS_connect._close()
+        #                     AI_WS_connect = None
+        #                 except Exception as e:
+        #                     usys.print_exception(e)
+        #             else:
+        #                 print("websocket链接已为空")
+        #         else:
+        #             break
+        # except Exception as e:
+        #     usys.print_exception(e)
+
+    def VC_init2(self):
+        self.VC_init()
+        
+        print("ai_VC VC_init2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        try:
+            self.websocket_deconnect_VC()
+        except Exception as e:
+            usys.print_exception(e)
+        print("ai_VC Close3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")
+        self._1S_timer.stop()
+        if self.AI_VC_send_data_queue.empty()!=True:
+            self.AI_VC_send_data_queue.clear()
+
+        self.AI_ASR_send_buf_len = 0
+        if self.AI_audio_queue.empty()!=True:
+            self.AI_audio_queue.clear()
+    def VC_init(self):
+        
+        print("VC_init:AI_VC_send_data_queue:size:{}".format(self.AI_VC_send_data_queue.size()))
+        
+        
+        print("VC_init2")
+        #self.VC_Speech_End()
+        print("VC_init3")
+        self.VC_Play_End()
+        print("VC_init4")
+        
+        if self.AI_audio_queue.empty()!=True:
+            self.AI_audio_queue.clear()
+        # num = EventMesh.publish("get_volum_size")
+        # if num == None:
+        #     num = 8
+        # self.aud.setVolume(num)#恢复原始音量
+        
\ No newline at end of file
diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/versions.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/versions.py
new file mode 100644 (file)
index 0000000..023b98e
--- /dev/null
@@ -0,0 +1,2 @@
+Version="V1.0" 
+Build_Time="2025-07-04 16:48:41" 
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/EG810MCN_GA_VOLTE.mk b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/EG810MCN_GA_VOLTE.mk
new file mode 100644 (file)
index 0000000..3987aba
--- /dev/null
@@ -0,0 +1,23 @@
+# Copyright (c) Quectel Wireless Solution, Co., Ltd.All Rights Reserved.
+#  
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#  
+#     http://www.apache.org/licenses/LICENSE-2.0
+#  
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+NAME := EG810MCN_GA_VOLTE
+
+GLOBAL_INCS = include
+
+$(NAME)_ARCHIVES = \
+       libraries/libHeliosAPI.lib \
+       libraries/ql_common_api.lib \
+
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/autoconf.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/autoconf.h
new file mode 100644 (file)
index 0000000..c48d290
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ *
+ * Automatically generated file; DO NOT EDIT.
+ * Helios SDK Configuration
+ *
+ */
+
+
+#define PROJECT_NAME_G3_7PIN  1  //项目宏定义
+
+
+// #define CONFIG_LVGL_SPAN 1
+// #define CONFIG_LVGL_FS_HELIOS 1
+// #define CONFIG_LVGL_GIF_DECODE 1
+// #define CONFIG_LVGL_SPINNER 1
+//#define CONFIG_LCD 1
+// #define CONFIG_LVGL_ANIMIMG 1
+// #define CONFIG_LVGL_KEYBOARD 1
+// #define CONFIG_LVGL_CALENDAR 1
+// #define CONFIG_LVGL_LED 1
+#define CONFIG_VIOCE_CALL 1
+// #define CONFIG_LVGL_FS_EXTFLASH_HELIOS 1
+// #define CONFIG_LVGL_TABVIEW 1
+//#define CONFIG_LVGL_LINE 1
+//#define CONFIG_LVGL 1
+// #define CONFIG_LVGL_CHART 1
+// #define CONFIG_LVGL_LIST 1
+// #define CONFIG_LVGL_MSGBOX 1
+// #define CONFIG_LVGL_ARC 1
+// #define CONFIG_LVGL_METER 1
+//#define CONFIG_LVGL_JPG_DECODE 1
+// #define CONFIG_LVGL_PNG_DECODE 1
+// #define CONFIG_LVGL_IMGBTN 1
+//#define CONFIG_GH301x 1
+//#define CONFIG_HX3918 1
+#define CONFIG_MBEDTLS 1
+//#define CONFIG_SC7A20 1
+// #define CONFIG_LVGL_WIN 1
+// #define CONFIG_LVGL_COLORWHEEL 1
+// #define CONFIG_LVGL_CANVAS 1
+// #define CONFIG_LVGL_SPINBOX 1
+// #define CONFIG_LVGL_QRCODE 1
+// #define CONFIG_LVGL_TILEVIEW 1
+// #define CONFIG_LVGL_HANDLER_TASK_PRIORITY 80
+//#define CONFIG_CAMERA 1
+//#define CONFIG_JPEG 1
+#define CONFIG_CAMERA_SAVEPHOTOS 1
+#define CONFIG_VAD 1
+//菊风视频通话
+//#define CONFIG_juphoon 1
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/config.in b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/config.in
new file mode 100644 (file)
index 0000000..343bad7
--- /dev/null
@@ -0,0 +1,15 @@
+
+mainmenu "Helios SDK Configuration"
+
+menu "System Configuration"
+source "../system/config.in"
+endmenu
+
+menu "EG810MCN_GA_VOLTE"
+source "../services/microPython/config/config.in"
+source "../components/poc/poc_option.in"
+source "../components/GH301x/GH301x_option.in"
+source "../components/SC7A20/SC7A20_option.in"
+source "../components/juphoon/juphoon_option.in"
+endmenu
+
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/config.mk b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/config.mk
new file mode 100644 (file)
index 0000000..a1d5967
--- /dev/null
@@ -0,0 +1,66 @@
+#
+# Automatically generated file; DO NOT EDIT.
+# Helios SDK Configuration
+#
+PROJECT_NAME_G3_7PIN=y
+#
+# System Configuration
+#
+CONFIG_MBEDTLS=y
+
+#
+# EG810MCN_GA_VOLTE
+#
+# CONFIG_LVGL=y
+
+#
+# lvgl option
+#
+# CONFIG_LVGL_PNG_DECODE=y
+# CONFIG_LVGL_GIF_DECODE is not set
+# CONFIG_LVGL_JPG_DECODE=y
+#CONFIG_LVGL_FS_HELIOS=y
+# CONFIG_LVGL_FS_SD_HELIOS is not set
+# CONFIG_LVGL_FS_EXTFLASH_HELIOS=y
+# CONFIG_LVGL_CUSTOMER_FONT_SUPPORT is not set
+# CONFIG_LVGL_QRCODE=y
+# CONFIG_LVGL_FONT is not set
+# CONFIG_LVGL_ARC is not set
+#CONFIG_LVGL_IMGBTN=y
+#CONFIG_LVGL_LINE=y
+#CONFIG_LVGL_LIST=y
+# CONFIG_LVGL_CHART is not set
+# CONFIG_LVGL_LED is not set
+# CONFIG_LVGL_CANVAS=y
+# CONFIG_LVGL_WIN=y
+# CONFIG_LVGL_TABVIEW is not set
+# CONFIG_LVGL_TILEVIEW=y
+# CONFIG_LVGL_MSGBOX=y
+# CONFIG_LVGL_METER is not set
+# CONFIG_LVGL_CALENDAR is not set
+# CONFIG_LVGL_SPINNER is not set
+# CONFIG_LVGL_SPINBOX is not set
+# CONFIG_LVGL_ANIMIMG is not set
+# CONFIG_LVGL_COLORWHEEL is not set
+# CONFIG_LVGL_KEYBOARD=y
+# CONFIG_LVGL_SPAN=y
+# CONFIG_LVGL_HANDLER_TASK_PRIORITY=80
+# CONFIG_QRCODE is not set
+#CONFIG_CAMERA=y
+# CONFIG_CAMERA_DECODE is not set
+CONFIG_CAMERA_SAVEPHOTOS=y
+# CONFIG_QUECTHING is not set
+# CONFIG_SPINAND is not set
+# CONFIG_RTMP is not set
+#CONFIG_JPEG=y
+# CONFIG_SPI_SDCARD is not set
+CONFIG_VIOCE_CALL=y
+# CONFIG_TTS is not set
+#CONFIG_LCD=y
+# CONFIG_UART_SLIP is not set
+# CONFIG_POC is not set
+#CONFIG_GH301x=y
+#CONFIG_HX3918=y
+#CONFIG_SC7A20=y
+CONFIG_VAD=y
+#CONFIG_juphoon=y
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lcd.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lcd.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/animimg.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/animimg.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/arc.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/arc.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/calendar.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/calendar.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/canvas.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/canvas.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/chart.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/chart.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/colorwheel.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/colorwheel.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/fs/helios.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/fs/helios.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/handler/task/priority.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/handler/task/priority.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/imgbtn.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/imgbtn.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/jpg/decode.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/jpg/decode.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/keyboard.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/keyboard.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/led.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/led.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/line.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/line.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/list.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/list.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/meter.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/meter.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/msgbox.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/msgbox.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/png/decode.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/png/decode.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/qrcode.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/qrcode.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/span.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/span.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/spinbox.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/spinbox.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/spinner.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/spinner.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/tabview.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/tabview.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/tileview.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/tileview.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/win.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/win.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/mbedtls.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/mbedtls.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/vioce/call.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/vioce/call.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/mpconfigboard.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/mpconfigboard.h
new file mode 100644 (file)
index 0000000..ea734f6
--- /dev/null
@@ -0,0 +1,215 @@
+/*
+ * Copyright (c) Quectel Wireless Solution, Co., Ltd.All Rights Reserved.
+ *  
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *  
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+#ifndef __MPCONFIGBOARD_H__
+#define __MPCONFIGBOARD_H__
+
+#define MICROPY_QPY_MODULE_ATCMD            (1)
+#define MICROPY_QPY_MODULE_UOS              (1)
+#define MICROPY_QPY_MODULE_MACHINE          (1)
+#define MICROPY_QPY_MODULE_USOCKET          (1)
+#define MICROPY_QPY_MODULE_MISC             (1)
+#define MICROPY_QPY_MODULE_OSTIMER          (1)
+#define MICROPY_QPY_MODULE_EXAMPLE          (1)
+#define MICROPY_QPY_MODULE_DATACALL         (1)
+#define MICROPY_QPY_MODULE_MODEM            (1)
+#define MICROPY_QPY_MODULE_UTIME            (1)
+#define MICROPY_QPY_MODULE_UTILS            (1)
+#define MICROPY_QPY_MODULE_HMACSHA1         (1)
+#define MICROPY_QPY_MODULE_SMS              (1)
+#define MICROPY_QPY_MODULE_SIM              (1)
+#define MICROPY_QPY_MODULE_DUALSIM          (1)
+#define MICROPY_QPY_MODULE_LPM              (1)
+#define MICROPY_QPY_MODULE_NET              (1)
+#define MICROPY_QPY_MODULE_CELLLOCATOR      (0)
+#define MICROPY_QPY_MODULE_CELLLOCATOR_QPY  (1)
+#define MICROPY_QPY_MODULE_AUDIO            (1)
+#define MICROPY_QPY_MODULE_FOTA             (1)
+#define MICROPY_QPY_MODULE_WIFISCAN         (1)
+#define MICROPY_QPY_MODULE_QUECGNSS         (1)
+#define MICROPY_QPY_MODULE_WIFILOCATOR      (1)
+#define MICROPY_QPY_MODULE_ETHERNET         (0)
+#define MICROPY_QPY_MODULE_SENSOR           (1)
+#define MICROPY_QPY_MODULE_SECUREDATA       (1)
+#define MICROPY_QPY_MODULE_SLIP             (0)
+#define MICROPY_QPY_MODULE_TP               (1)
+#define MICROPY_QPY_MODULE_AUDIOCODEC       (0)
+#define MICROPY_QPY_MODULE_CSD              (0)
+#define MICROPY_QPY_MODULE_LWM2M            (0)
+#define MICROPY_QPY_MODULE_NB               (0)
+#define MICROPY_QPY_MODULE_UHASHLIB         (1)
+#define MICROPY_QPY_MODULE_UCRYPTOLIB       (1)
+#define MICROPY_QPY_MODULE_ALIPAY           (0)
+#define MICROPY_QPY_MODULE_VFS_THREADSAFE   (1)
+#define MICROPY_QPY_CAMERA_LVGL_PREVIEW     (1)
+#if CONFIG_MBEDTLS
+    #define MICROPY_QPY_MODULE_USSL         (1)
+    #define MICROPY_QPY_SSL_MBEDTLS         (1)
+#endif
+
+#if CONFIG_QUECTHING
+    #define MICROPY_QPY_MODULE_QUECIOT          (1)
+#else
+    #define MICROPY_QPY_MODULE_QUECIOT          (0)
+#endif
+
+#if CONFIG_LVGL
+    #define MICROPY_QPY_MODULE_LVGL             (1)
+#else
+    #define MICROPY_QPY_MODULE_LVGL             (0)
+#endif
+
+#if CONFIG_CAMERA
+    #define MICROPY_QPY_MODULE_CAMERA           (1)
+#else
+    #define MICROPY_QPY_MODULE_CAMERA           (0)
+#endif
+
+#if CONFIG_RTMP
+    #define MICROPY_QPY_MODULE_RTMP             (1)
+#else
+    #define MICROPY_QPY_MODULE_RTMP             (0)
+#endif
+#if CONFIG_VIOCE_CALL
+    #define MICROPY_QPY_MODULE_VIOCE_CALL       (1)
+#else
+    #define MICROPY_QPY_MODULE_VIOCE_CALL       (0)
+#endif
+
+#if CONFIG_POC
+    #define MICROPY_QPY_MODULE_POC              (1)
+#else
+    #define MICROPY_QPY_MODULE_POC              (0)
+#endif
+#if CONFIG_QRCODE
+    #define MICROPY_QPY_MODULE_QRCODE           (1)
+#else
+    #define MICROPY_QPY_MODULE_QRCODE           (0)
+#endif
+
+#ifdef CONFIG_QUEC_PROJECT_FEATURE_BLE_GATT
+    #define MICROPY_QPY_MODULE_BLE              (1)
+#else
+    #define MICROPY_QPY_MODULE_BLE              (0)
+#endif
+
+#ifdef CONFIG_QUEC_PROJECT_FEATURE_CLASSIC_BT
+    #define MICROPY_QPY_MODULE_BT               (1)
+#else
+    #define MICROPY_QPY_MODULE_BT               (0)
+#endif
+
+
+//modmachine
+#if MICROPY_QPY_MODULE_MACHINE
+    #define MICROPY_QPY_MACHINE_TIMER           (1)
+    #define MICROPY_QPY_MACHINE_RTC             (1)
+    #define MICROPY_QPY_MACHINE_WDT             (1)
+    #define MICROPY_QPY_MACHINE_PIN             (1)
+    #define MICROPY_QPY_MACHINE_EXTINT          (1)
+    #define MICROPY_QPY_MACHINE_UART            (1)
+    #define MICROPY_QPY_MACHINE_SPI             (1)
+    #define MICROPY_QPY_MACHINE_I2C             (1)
+    #define MICROPY_QPY_MACHINE_I2C_SOFT        (1)
+    #ifdef CONFIG_LCD
+        #define MICROPY_QPY_MACHINE_LCD             (1)
+#else
+        #define MICROPY_QPY_MACHINE_LCD             (0)
+#endif
+    #define MICROPY_QPY_MACHINE_KEYPAD          (1)
+    #ifdef CONFIG_SPINAND
+        #define MICROPY_QPY_MACHINE_NANDFLASH       (1)
+    #else
+        #define MICROPY_QPY_MACHINE_NANDFLASH       (0)
+    #endif
+
+#if MICROPY_QPY_MACHINE_UART
+       #define MICROPY_QPY_UART4 (1)
+#endif
+
+#endif
+
+#if MICROPY_QPY_MODULE_MISC
+    #define MICROPY_QPY_MISC_POWER              (1)
+    #define MICROPY_QPY_MISC_ADC                (1)
+    #define MICROPY_QPY_MISC_POWERKEY           (1)
+    #define MICROPY_QPY_MISC_TEMPERATURE        (0)
+    #define MICROPY_QPY_MISC_PWM                (1)
+    #define MICROPY_QPY_MISC_USB                (1)
+    #define MICROPY_QPY_MISC_USBNET             (1)
+#endif
+
+#if MICROPY_QPY_MODULE_AUDIO
+    #define MICROPY_QPY_AUDIO_AUDIO             (1)
+    #if CONFIG_TTS
+        #define MICROPY_QPY_AUDIO_TTS               (1)
+    #else
+        #define MICROPY_QPY_AUDIO_TTS               (0)
+    #endif
+    #define MICROPY_QPY_AUDIO_RECORD            (1)
+#endif
+
+#if MICROPY_QPY_MODULE_ETHERNET
+    #define MICROPY_QPY_ETHERNET_DM9051         (0)
+    #define MICROPY_QPY_ETHERNET_W5500          (0)
+#endif
+
+#if MICROPY_QPY_MODULE_TP
+    #define MICROPY_QPY_TP_XPT2046              (0)
+    #define MICROPY_QPY_TP_GT9XX                (0)
+    #define MICROPY_QPY_TP_CST816               (1)
+#endif
+
+#if MICROPY_QPY_MODULE_AUDIOCODEC
+    #define MICROPY_QPY_AUDIOCODEC_RT5616       (0)
+#endif
+
+#if MICROPY_QPY_MODULE_SENSOR
+    #define MICROPY_QPY_SENSOR_SN95500          (0)
+       #define MICROPY_QPY_SENSOR_ICC_KEY                      (0)
+       #define MICROPY_QPY_SENSOR_GNSS                         (1)
+#endif
+
+#if MICROPY_QPY_MODULE_CAMERA
+    #define MICROPY_QPY_CAMERA_CAMPREVIEW       (1)
+    #if CONFIG_CAMERA_SAVEPHOTOS
+        #define MICROPY_QPY_CAMERA_CAMCAPTURE       (1)
+    #else
+        #define MICROPY_QPY_CAMERA_CAMCAPTURE       (0)
+    #endif
+    #ifdef CONFIG_CAMERA_DECODE
+        #define MICROPY_QPY_CAMERA_CAMSCANDECODE    (1)
+    #else
+        #define MICROPY_QPY_CAMERA_CAMSCANDECODE    (0)
+    #endif
+#endif
+
+#define MICROPY_QPY_DEVICE_REPORT           (1)
+
+/***********************micropython opts*******************************/
+#define MICROPY_QPY_DEBUG_PRINTERS                     (0)  //flash 4160 Byte
+#define MICROPY_QPY_PY_MATH                            (1)  //flash 14880 Byte
+#define MICROPY_QPY_PY_CMATH                           (0)  //flash 3136 Byte
+#define MICROPY_QPY_PY_USELECT                         (0)  //flash 1792 Byte
+#define MICROPY_QPY_PY_UCTYPES                         (0)  //flash 2816 Byte
+#define MICROPY_QPY_PY_UZLIB                           (0)  //flash 3072 Byte
+#define MICROPY_QPY_PY_UASYNCIO                        (0)  //flash 2048 Byte
+#define MICROPY_QPY_PY_ENABLE_WEBSERVER                        (0)  //flash 3424 Byte
+#define MICROPY_QPY_PERSISTENT_CODE_LOAD        (1)  //flash 2048 Byte
+#define MICROPY_QPY_EMIT_XTENSAWIN              (0)  //flash 19776 Byte
+#define MICROPY_QPY_MODULE_VFS_THREADSAFE       (1)
+#define MICROPY_QPY_GC_HEAP_SIZE       (1000 * 1024)
+#endif
\ No newline at end of file
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/DBG.7z b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/DBG.7z
new file mode 100644 (file)
index 0000000..a3aef00
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/DBG.7z differ
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base.json b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base.json
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base_release_pack.zip b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base_release_pack.zip
new file mode 100644 (file)
index 0000000..0d7491a
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base_release_pack.zip differ
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/rf.bin b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/rf.bin
new file mode 100644 (file)
index 0000000..29a150e
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/rf.bin differ
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/include/app_link_start_addr.h b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/include/app_link_start_addr.h
new file mode 100644 (file)
index 0000000..33e3ed4
--- /dev/null
@@ -0,0 +1,11 @@
+
+#ifndef __APP_LINK_START_ADDR_H__
+#define __APP_LINK_START_ADDR_H__
+
+#define APP_LINK_START_ADDR  0x80521000
+#define APP_FLASH_MAX_SIZE 0x120000
+
+#define APP_RAM_START 0x7E3E0000
+#define APP_RAM_MAX_SIZE 0x180000
+
+#endif
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/ByteRTCLite.lib b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/ByteRTCLite.lib
new file mode 100644 (file)
index 0000000..5e3ddcc
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/ByteRTCLite.lib differ
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/libHeliosAPI.lib b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/libHeliosAPI.lib
new file mode 100644 (file)
index 0000000..bf46984
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/libHeliosAPI.lib differ
diff --git a/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/ql_common_api.lib b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/ql_common_api.lib
new file mode 100644 (file)
index 0000000..149f6cb
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/ql_common_api.lib differ
diff --git a/2.sdk/project/7PIN_1_5/usr/audio_gain.nvm b/2.sdk/project/7PIN_1_5/usr/audio_gain.nvm
new file mode 100644 (file)
index 0000000..97148da
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/usr/audio_gain.nvm differ
diff --git a/2.sdk/project/7PIN_1_5/usr/audio_ve.nvm b/2.sdk/project/7PIN_1_5/usr/audio_ve.nvm
new file mode 100644 (file)
index 0000000..a33dd45
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/usr/audio_ve.nvm differ
diff --git a/2.sdk/project/7PIN_1_5/usr/main.py b/2.sdk/project/7PIN_1_5/usr/main.py
new file mode 100644 (file)
index 0000000..68ba3ff
--- /dev/null
@@ -0,0 +1,2 @@
+import main_init 
+main_init.main_init()
\ No newline at end of file
diff --git a/2.sdk/project/7PIN_1_5/usr/static/audio.bin b/2.sdk/project/7PIN_1_5/usr/static/audio.bin
new file mode 100644 (file)
index 0000000..6c106cc
Binary files /dev/null and b/2.sdk/project/7PIN_1_5/usr/static/audio.bin differ
diff --git a/2.sdk/project/7PIN_1_5/usr/static/storage_file/wechat_record.json b/2.sdk/project/7PIN_1_5/usr/static/storage_file/wechat_record.json
new file mode 100644 (file)
index 0000000..acd6563
--- /dev/null
@@ -0,0 +1 @@
+{ "num": "0" }
\ No newline at end of file