wbspool 1 éve
szülő
commit
4d6733e1e1

+ 3 - 3
BusinessCommon/src/main/java/com/develop/common/data_repo/db/DataFactory.kt

@@ -162,14 +162,14 @@ object DataFactory {
 //            R.drawable.ic_setting_folder,
             R.drawable.ic_setting_reset,
             R.drawable.ic_setting_about,
-
+            R.drawable.ic_setting_tuya,
             )
         val nameList = mutableListOf(
             resource.getString(R.string.language), resource.getString(R.string.wifi),
 //            resource.getString(R.string.sound),
             resource.getString(R.string.brightness), resource.getString(R.string.user_account),
 //            resource.getString(R.string.storage),
-            resource.getString(R.string.reset), resource.getString(R.string.about)
+            resource.getString(R.string.reset), resource.getString(R.string.about),resource.getString(R.string.tuya)
 
         )
         val settingTypeList = mutableListOf(
@@ -177,7 +177,7 @@ object DataFactory {
 //            SettingType.SOUND,
             SettingType.BRIGHTNESS, SettingType.USER_ACCOUNT,
 //            SettingType.STORAGE,
-            SettingType.RESTORE_FACTORY_SETTINGS, SettingType.ABOUT
+            SettingType.RESTORE_FACTORY_SETTINGS, SettingType.ABOUT,SettingType.TUYA
         )
         for (i in resIdList.indices) {
             result.add(SettingModel(resIdList[i], nameList[i], settingTypeList[i]))

+ 2 - 1
BusinessCommon/src/main/java/com/develop/common/data_repo/db/ModelKit.kt

@@ -70,7 +70,8 @@ enum class SettingType {
     USER_ACCOUNT,
     STORAGE,
     ABOUT,
-    RESTORE_FACTORY_SETTINGS
+    RESTORE_FACTORY_SETTINGS,
+    TUYA,
 }
 
 enum class CategoryType {

+ 1 - 0
BusinessCommon/src/main/java/com/develop/common/router/Screens.kt

@@ -23,6 +23,7 @@ object Screens {
         const val ABOUT = "$SCHEMA/about"
         const val RESTORE = "$SCHEMA/restore"
         const val HELP = "$SCHEMA/help"
+        const val TUYA = "$SCHEMA/tuya"
     }
 
     object Main {

+ 45 - 0
BusinessCommon/src/main/java/com/develop/common/utils/TuyaDps.java

@@ -0,0 +1,45 @@
+package com.develop.common.utils;
+
+public class TuyaDps {
+
+    public static final int SWITCH = 1;
+
+    public static final int START = 2;
+
+    public static final int MODE = 3;
+
+    public static final int COOK_TEMPERATURE = 6;
+
+    public static final int TEMP_CURRENT = 7;
+
+    public static final int COOK_TIME = 10;
+
+    public static final int REMAIN_TIME = 112;
+
+    public static final int FAULT = 113;
+
+    public static final int WORK_MODE = 114;
+
+    public static final int WORK_STATE = 101;
+
+    public static final int STOP = 102;
+
+    public static final int ROTATE_SPEED = 103;
+
+    public static final int SET_CW_CCW = 104;
+
+    public static final int SPRAY_WATER = 105;
+
+    public static final int TEMER_UNIT = 106;
+
+    public static final int PRESSURE_COOKER = 107;
+
+    public static final int WIND_SPEED = 108;
+
+    public static final int COOK_TEMP_F = 109;
+
+    public static final int CORRENT_TEMP_F = 110;
+
+    public static final int CUP_SW = 111;
+
+}

+ 205 - 0
BusinessCommon/src/main/java/com/develop/common/utils/TuyaUtils.java

@@ -0,0 +1,205 @@
+package com.develop.common.utils;
+
+import static android.content.Context.MODE_PRIVATE;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.text.TextUtils;
+import android.view.View;
+
+import com.develop.base.util.MMkvUtils;
+import com.google.gson.Gson;
+import com.kuyuntech.cofarcooking.device.sdk.constant.core.DevStatus;
+import com.kuyuntech.cofarcooking.device.sdk.constant.core.MotorDirections;
+import com.kuyuntech.cofarcooking.device.sdk.eventbus.core.DevInfo;
+import com.kuyuntech.cofarcooking.device.sdk.util.core.CofarSDK;
+import com.tuya.smartai.iot_sdk.DPEvent;
+import com.tuya.smartai.iot_sdk.IoTSDKManager;
+import com.tuya.smartai.iot_sdk.Log;
+import com.tuya.smartai.iot_sdk.UpgradeEventCallback;
+
+import org.json.JSONObject;
+
+import java.util.Arrays;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+public class TuyaUtils {
+
+    public static final String TAG = "TUYA";
+    public static final String mPid = "dquk8axtyy72c1ap";
+    public static final String mUid = "uuid50e9e0c707553116";
+    public static final String mAk = "MJhcxmQ6LeZDj1tNu6F5kqK5aQJfpdOb";
+    public static  String qrcodeUrl =  MMkvUtils.INSTANCE.getString("tuya_url");
+    public static IoTSDKManager ioTSDKManager = null;
+    
+    public static boolean init = false;
+
+    public static void output(String text) {
+        Log.d(TAG, text);
+    }
+
+
+    public static void  uploadData(){
+        if(ioTSDKManager == null || !init){
+            return;
+        }
+
+        DevInfo info = CofarSDK.devInfo();
+
+        DPEvent[] dpEvents = new DPEvent[]{
+          new DPEvent(TuyaDps.SWITCH,(byte) DPEvent.Type.PROP_BOOL,true,0),
+          new DPEvent(TuyaDps.START,(byte) DPEvent.Type.PROP_BOOL, info.getStatus() == DevStatus.RUNNING,0),
+          new DPEvent(TuyaDps.MODE,(byte) DPEvent.Type.PROP_ENUM,1,0),
+          new DPEvent(TuyaDps.COOK_TEMPERATURE,(byte) DPEvent.Type.PROP_VALUE,(int)info.getTargetTemp(),0),
+          new DPEvent(TuyaDps.TEMP_CURRENT,(byte) DPEvent.Type.PROP_VALUE,(int)info.getTemp(),0),
+          new DPEvent(TuyaDps.COOK_TIME,(byte) DPEvent.Type.PROP_VALUE,(int)info.getTargetTime(),0),
+          new DPEvent(TuyaDps.REMAIN_TIME,(byte) DPEvent.Type.PROP_VALUE,(int)info.getRemainTime(),0),
+          new DPEvent(TuyaDps.FAULT,(byte) DPEvent.Type.PROP_VALUE,(int)info.getErrCode(),0),
+          new DPEvent(TuyaDps.WORK_STATE,(byte) DPEvent.Type.PROP_VALUE,(int)info.getStatus(),0),
+          new DPEvent(TuyaDps.STOP,(byte) DPEvent.Type.PROP_VALUE, (int)info.getStatus(),0),
+          new DPEvent(TuyaDps.ROTATE_SPEED,(byte) DPEvent.Type.PROP_VALUE,(int)info.getMotorGear(),0),
+          new DPEvent(TuyaDps.SET_CW_CCW,(byte) DPEvent.Type.PROP_VALUE,(int)info.getMotorDirection() ,0),
+          new DPEvent(TuyaDps.SPRAY_WATER,(byte) DPEvent.Type.PROP_VALUE,(int)info.getWaterSprayGear(),0),
+          new DPEvent(TuyaDps.TEMER_UNIT,(byte) DPEvent.Type.PROP_VALUE,0,0),
+          new DPEvent(TuyaDps.WIND_SPEED,(byte) DPEvent.Type.PROP_VALUE,0,0),
+          new DPEvent(TuyaDps.COOK_TEMP_F,(byte) DPEvent.Type.PROP_VALUE,(int)info.getTargetTemp(),0),
+          new DPEvent(TuyaDps.CORRENT_TEMP_F,(byte) DPEvent.Type.PROP_VALUE,(int)info.getTemp(),0),
+          new DPEvent(TuyaDps.CUP_SW,(byte) DPEvent.Type.PROP_VALUE,(int)info.getPotCloverStatus(),0),
+          new DPEvent(TuyaDps.WORK_MODE,(byte) DPEvent.Type.PROP_STR,info.getDevMode(),0)
+        };
+
+
+
+        ioTSDKManager.sendDP(dpEvents);
+    }
+
+    public static void initSDK(Context ctx,String version) {
+
+        Log.init(ctx, "/sdcard/tuya_log/iot_demo/", 3);
+
+        ioTSDKManager = new IoTSDKManager(ctx) {
+            @Override
+            protected boolean isOffline() {
+                //实现自定义网络监测
+                Log.d(TAG, "isOffline: " + super.isOffline());
+                return super.isOffline();
+            }
+        };
+
+        output("固件版本:" + version);
+
+        output("init sdk:" + mPid + "/" + mUid + "/" + mAk);
+
+        //注意:这里的pid等配置读取自local.properties文件,不能直接使用。请填写你自己的配置!
+        ioTSDKManager.initSDK("/sdcard/tuya_iot/", mPid
+                , mUid, mAk, version, new IoTSDKManager.IoTCallback() {
+
+                    @Override
+                    public void onDpEvent(DPEvent event) {
+                        if (event != null) {
+                            output("收到 dp: " + event);
+
+                        }
+                    }
+
+                    @Override
+                    public void onReset() {
+
+                        ctx.getSharedPreferences("event_cache", MODE_PRIVATE).edit().clear().commit();
+
+                    }
+
+                    @Override
+                    public void onShorturl(String urlJson) {
+                        output("shorturl: " + urlJson);
+                        Gson gson = new Gson();
+                        Map d = gson.fromJson(urlJson, Map.class);
+                        String url = (String) d.get("shortUrl");
+                        qrcodeUrl = url;
+                        MMkvUtils.INSTANCE.save("tuya_url",url);
+
+                    }
+
+                    @Override
+                    public void onActive() {
+                        output("onActive: devId-> " + ioTSDKManager.getDeviceId());
+                        init = true;
+                    }
+
+                    @Override
+                    public void onFirstActive() {
+                        output("onFirstActive");
+                    }
+
+                    @Override
+                    public void onMQTTStatusChanged(int status) {
+                        output("onMQTTStatusChanged: " + status);
+
+                        switch (status) {
+                            case IoTSDKManager.STATUS_OFFLINE:
+                                // 设备网络离线
+                                break;
+                            case IoTSDKManager.STATUS_MQTT_OFFLINE:
+                                // 网络在线MQTT离线
+                                break;
+                            case IoTSDKManager.STATUS_MQTT_ONLINE:
+                                // 网络在线MQTT在线
+
+                                SharedPreferences sp = ctx.getSharedPreferences("event_cache", MODE_PRIVATE);
+
+                                DPEvent[] events = ioTSDKManager.getEvents();
+
+                                if (events != null) {
+                                    for (DPEvent event : events) {
+                                        if (event != null) {
+                                            output(event.toString());
+                                        }
+                                    }
+                                }
+                                break;
+                        }
+                    }
+
+//                    @Override
+//                    public void onMqttMsg(int protocol, org.json.JSONObject msgObj) {
+//
+//                    }
+                });
+
+        ioTSDKManager.setUpgradeCallback(new UpgradeEventCallback() {
+            @Override
+            public void onUpgradeInfo(String s) {
+                Log.w(TAG, "onUpgradeInfo: " + s);
+
+                output("收到升级信息: " + s);
+
+//                runOnUiThread(() -> upgradeDialog.show());
+
+                ioTSDKManager.startUpgradeDownload();
+            }
+
+            @Override
+            public void onUpgradeDownloadStart() {
+                Log.w(TAG, "onUpgradeDownloadStart");
+
+                output("开始升级下载");
+            }
+
+            @Override
+            public void onUpgradeDownloadUpdate(int i) {
+                Log.w(TAG, "onUpgradeDownloadUpdate: " + i);
+            }
+
+            @Override
+            public void upgradeFileDownloadFinished(int result, String file) {
+                Log.w(TAG, "upgradeFileDownloadFinished: " + result);
+
+                output("下载完成:" + result + " / " + file);
+            }
+        });
+    }
+
+
+}

BIN
BusinessCommon/src/main/res/drawable-xxxhdpi/ic_setting_tuya.png


+ 1 - 0
BusinessCommon/src/main/res/values/strings.xml

@@ -56,6 +56,7 @@ Nanfang plus client is an online information platform developed and operated by
     <string name="storage">STORAGE</string>
     <string name="reset">RESTORE FACTORY SETTINGS</string>
     <string name="about">ABOUT</string>
+    <string name="tuya">TUYA</string>
     <string name="weight">WEIGHT</string>
     <string name="local_recipes">Local recipes</string>
     <string name="download">Download</string>

+ 6 - 2
BusinessSetting/src/main/AndroidManifest.xml

@@ -9,6 +9,9 @@
         tools:ignore="ProtectedPermissions" />
 
     <application>
+        <activity
+            android:name=".ui.TuyaActivity"
+            android:exported="false" android:screenOrientation="landscape" />
         <activity
             android:name=".ui.PowerAnimationActivity"
             android:screenOrientation="landscape" />
@@ -47,9 +50,10 @@
             android:name=".ui.AboutActivity"
             android:launchMode="singleTask"
             android:screenOrientation="landscape" />
-        <activity android:name=".ui.HelpDocsActivity"
+        <activity
+            android:name=".ui.HelpDocsActivity"
             android:launchMode="singleTask"
-            android:screenOrientation="landscape"/>
+            android:screenOrientation="landscape" />
     </application>
 
 </manifest>

+ 3 - 0
BusinessSetting/src/main/java/com/develop/setting/ui/SettingMainActivity.kt

@@ -100,6 +100,9 @@ class SettingMainActivity : CommonBindingActivity<ActivitySettingMainBinding>()
                         SettingType.STORAGE -> {
                            openFileManager()
                         }
+                        SettingType.TUYA -> {
+                            navigateTo(Screens.Setting.TUYA)
+                        }
                     }
                 }
 

+ 72 - 0
BusinessSetting/src/main/java/com/develop/setting/ui/TuyaActivity.kt

@@ -0,0 +1,72 @@
+package com.develop.setting.ui
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import com.alibaba.android.arouter.facade.annotation.Route
+import com.develop.base.ext.updateText
+import com.develop.base.util.ThreadUtils
+import com.develop.common.router.Screens
+import com.develop.common.ui.CommonBindingActivity
+import com.develop.common.utils.QRCodeUtils
+import com.develop.common.utils.TuyaUtils
+import com.develop.setting.databinding.ActivityTuyaBinding
+import com.google.gson.Gson
+import com.tuya.smartai.iot_sdk.*
+import com.tuya.smartai.iot_sdk.IoTSDKManager.IoTCallback
+import kotlinx.serialization.json.Json
+import kotlinx.serialization.json.JsonElement
+import kotlinx.serialization.json.jsonObject
+import org.json.JSONObject
+import java.util.Objects
+import java.util.Observable
+
+
+@Route(path = Screens.Setting.TUYA)
+class TuyaActivity : CommonBindingActivity<ActivityTuyaBinding>() {
+
+    private val TAG = "TUYA"
+
+    var mPid: String? = "dquk8axtyy72c1ap"
+    var mUid: String? = "uuid50e9e0c707553116"
+    var mAk: String? = "MJhcxmQ6LeZDj1tNu6F5kqK5aQJfpdOb"
+
+    var ioTSDKManager: IoTSDKManager? = null
+
+
+    override fun createViewBinding(inflater: LayoutInflater):ActivityTuyaBinding {
+        return ActivityTuyaBinding.inflate(layoutInflater)
+    }
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+
+
+
+
+        super.onCreate(savedInstanceState)
+        binding.ivClose.setOnClickListener {
+
+            finish()
+        }
+        binding.tvTitle.updateText(getString(com.develop.common.R.string.tuya))
+        binding.tuyaQrcode.setOnClickListener {
+            println("hello")
+            (ioTSDKManager as IoTSDKManager).destroy()
+        }
+
+        if(TuyaUtils.qrcodeUrl != ""){
+            ThreadUtils.runOnMainThread {
+                val bitmap = QRCodeUtils.createQRCodeBitmap(TuyaUtils.qrcodeUrl, 500, 500)
+                binding.tuyaQrcode.setImageBitmap(bitmap)
+                binding.tuyaQrcode.visibility = View.VISIBLE
+            }
+        }
+
+
+
+    }
+
+
+
+
+}

+ 44 - 0
BusinessSetting/src/main/res/layout/activity_tuya.xml

@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:background="@color/bg_color"
+    android:layout_height="match_parent">
+
+    <ImageView
+        android:id="@+id/iv_close"
+        android:layout_width="@dimen/convert_53px"
+        android:layout_height="@dimen/convert_53px"
+        android:layout_marginStart="@dimen/convert_21px"
+        android:layout_marginTop="@dimen/convert_10px"
+        android:padding="@dimen/convert_15px"
+        android:src="@drawable/ic_close" />
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerHorizontal="true"
+        android:layout_marginTop="@dimen/convert_28px"
+        android:textColor="@color/common_title"
+        android:textSize="@dimen/convert_36px" />
+
+
+
+    <RelativeLayout
+        android:gravity="center"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+            <ImageView
+                android:visibility="gone"
+                android:background="@color/white"
+                android:id="@+id/tuya_qrcode"
+                android:layout_width="@dimen/convert_300px"
+                android:layout_height="@dimen/convert_300px"></ImageView>
+    </RelativeLayout>
+
+
+
+
+
+</RelativeLayout>

+ 11 - 0
app/build.gradle

@@ -40,7 +40,14 @@ android {
                 arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
             }
         }
+        ndk {
+            abiFilters 'armeabi-v7a'
+        }
+
+        packagingOptions {
+            pickFirst 'lib/armeabi-v7a/libc++_shared.so'
 
+        }
 
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
         kapt {
@@ -99,6 +106,10 @@ android {
             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
         }
     }
+
+
+
+
     compileOptions {
         sourceCompatibility JavaVersion.VERSION_1_8
         targetCompatibility JavaVersion.VERSION_1_8

+ 3 - 1
app/proguard-rules.pro

@@ -18,4 +18,6 @@
 
 # If you keep the line number information, uncomment this to
 # hide the original source file name.
-#-renamesourcefileattribute SourceFile
+#-renamesourcefileattribute SourceFile
+-keep class com.tuya.smartai.iot_sdk.** {*;}
+-keep class com.tencent.mars.** {*;}

+ 7 - 0
app/src/main/java/com/develop/foodcooking/FoodCookingApp.kt

@@ -23,6 +23,7 @@ import com.develop.common.data_repo.net.converter.SerializationConverter
 import com.develop.common.data_repo.net.interceptor.FoodRequestInterceptor
 import com.develop.common.food_sdk.GlobalDevEvent
 import com.develop.common.food_sdk.SerialPortUtils
+import com.develop.common.utils.TuyaUtils
 import com.develop.common.utils.compat.RecyclerViewCompat
 import com.develop.common.utils.compat.ShapeableImageViewCompat
 import com.develop.common.utils.compat.SmartRefreshLayoutCompat
@@ -49,6 +50,9 @@ import java.util.concurrent.TimeUnit
 
 
 class FoodCookingApp : BaseApp() {
+
+
+
     companion object {
         init {
             Config.getInstance().skinMode = Config.SkinMode.REPLACE_ALL
@@ -114,6 +118,8 @@ class FoodCookingApp : BaseApp() {
                     .build()
             )
         }.start()
+
+
     }
 
 
@@ -188,6 +194,7 @@ class FoodCookingApp : BaseApp() {
     @Subscribe
     @Synchronized
     fun globalCoverEvent(event: DevStatusEvent) {
+        TuyaUtils.uploadData()
         heartBeatInterval?.cancel()
         val devInfo = event.devInfo;
         val pm = getSystemService(POWER_SERVICE) as PowerManager

+ 17 - 0
app/src/main/java/com/develop/foodcooking/MainActivity.kt

@@ -13,10 +13,20 @@ import com.develop.base.util.MMkvUtils
 import com.develop.common.router.Screens
 import com.develop.common.tag.FIRST_IN
 import com.develop.common.ui.CommonBindingActivity
+import com.develop.common.utils.TuyaUtils
 import com.develop.foodcooking.databinding.ActivityMainBinding
+import com.tuya.smartai.iot_sdk.BuildConfig
+import com.tuya.smartai.iot_sdk.DPEvent
+import com.tuya.smartai.iot_sdk.IoTSDKManager
+import com.tuya.smartai.iot_sdk.Log
+import com.tuya.smartai.iot_sdk.UpgradeEventCallback
 import org.alee.component.skin.service.ThemeSkinService
 
 class MainActivity : CommonBindingActivity<ActivityMainBinding>() {
+
+
+
+
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         if (MMkvUtils.getBool(FIRST_IN)) {
@@ -24,11 +34,18 @@ class MainActivity : CommonBindingActivity<ActivityMainBinding>() {
         } else {
             navigateTo(Screens.Setting.ANIMATION)
         }
+//        this.initSDK()
+        //初始化涂鸦
+        TuyaUtils.initSDK(this,"1.0.0")
         finish()
     }
 
     override fun createViewBinding(inflater: LayoutInflater): ActivityMainBinding {
         return ActivityMainBinding.inflate(inflater)
+
     }
 
+
+
+
 }

+ 10 - 0
libThirdPart/build.gradle

@@ -16,6 +16,12 @@ android{
         abortOnError false
         ignoreWarnings true
     }
+
+    packagingOptions {
+        pickFirst 'lib/armeabi-v7a/libc++_shared.so'
+
+    }
+
 }
 
 dependencies {
@@ -94,6 +100,10 @@ dependencies {
     compile 'com.github.a-voyager:AutoInstaller:v1.0'
     api 'net.lingala.zip4j:zip4j:2.11.5'
 
+    api 'com.tuya.smart:tuyasmart-iot_sdk:1.0.8-rc.1'
+    api 'com.tencent.mars:mars-xlog:1.2.3'
+//    api 'cn.yipianfengye.android:zxing-library:2.2'
+
 
 
 }

+ 3 - 1
libThirdPart/proguard-rules.pro

@@ -18,4 +18,6 @@
 
 # If you keep the line number information, uncomment this to
 # hide the original source file name.
-#-renamesourcefileattribute SourceFile
+#-renamesourcefileattribute SourceFile
+-keep class com.tuya.smartai.iot_sdk.** {*;}
+-keep class com.tencent.mars.** {*;}

+ 5 - 0
settings.gradle

@@ -3,6 +3,8 @@ pluginManagement {
         maven { url 'https://jitpack.io' }
         maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
         maven { url 'https://maven.aliyun.com/repository/public' }
+        maven { url 'https://maven-other.tuya.com/repository/maven-releases/'}
+        maven { url 'https://maven-other.tuya.com/repository/maven-snapshots/'}
         gradlePluginPortal()
         google()
         mavenCentral()
@@ -14,6 +16,9 @@ dependencyResolutionManagement {
         maven { url 'https://jitpack.io' }
         maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
         maven { url 'https://maven.aliyun.com/repository/public' }
+        maven { url 'https://maven-other.tuya.com/repository/maven-releases/'}
+        maven { url 'https://maven-other.tuya.com/repository/maven-snapshots/'}
+        maven { url 'https://dl.bintray.com/tuyasmartai/sdk' }
         google()
         mavenCentral()
     }