Browse Source

添加了订阅和发布,一直循环发布消息,保持连接;连接断开的时候,重新连接马上上报数据

DESKTOP-SADJPBG\47462 5 years ago
parent
commit
37dc75d509

+ 11 - 1
app/src/main/AndroidManifest.xml

xqd xqd xqd
@@ -38,16 +38,24 @@
     <uses-permission android:name="android.permission.WAKE_LOCK" />
 
 
+    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"> </uses-permission>
+
+    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"> </uses-permission>
+
+    <uses-permission android:name="android.permission.WAKE_LOCK"> </uses-permission>
+
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
     <uses-permission android:name="android.permission.RECORD_AUDIO" />
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
+    <!--读权限-->
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permisssion.READ_LOGS"/>
 <!--    <uses-permission android:name="android.permission.INSTALL_PACKAGES"/>-->
     <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
+    <!--写权限-->
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
     <uses-feature
@@ -62,6 +70,8 @@
     <!--Android 6.0及后续版本扫描蓝牙,需要定位权限(进入GPS设置,可以看到蓝牙定位)-->
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
     <uses-permission android:name="com.android.example.USB_PERMISSION" />
+    <!--添加白名单-->
+    <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
 
     <uses-feature
         android:name="android.hardware.usb.host"
@@ -118,7 +128,7 @@
 
         <service android:name=".service.MyService"
             android:permission="android.permission.BIND_JOB_SERVICE"
-            />
+        />
 
         <receiver android:name=".receiver.BootReceiver"  android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
             <intent-filter>

+ 12 - 9
app/src/main/java/com/siwei/recyclebox/application/AppApplication.java

xqd xqd xqd xqd
@@ -116,7 +116,9 @@ public class AppApplication extends BaseApplication implements CustomActivityOnC
          */
         Map<String, ValueWrapper> propertyValues = new HashMap<>();
         //心跳包 interval 单位秒
-//        MqttConfigure.setKeepAliveInterval(60);
+        MqttConfigure.setKeepAliveInterval(150);
+//        MqttConnectOptionsc.setAutomaticReconnect(true);
+
         // 示例
         // propertyValues.put("LightSwitch", new ValueWrapper.BooleanValueWrapper(0));
         IoTMqttClientConfig clientConfig = new IoTMqttClientConfig(deviceInfo.productKey, deviceInfo.deviceName, deviceInfo.deviceSecret);
@@ -146,7 +148,7 @@ public class AppApplication extends BaseApplication implements CustomActivityOnC
                     public void run() {
                         initIoTDynamic();
                     }
-                },300000);
+                },60000);
             }
             @Override
             public void onInitDone(Object data) {
@@ -171,11 +173,11 @@ public class AppApplication extends BaseApplication implements CustomActivityOnC
          *   调用动态注册接口去获取deviceSecret
          */
         DeviceInfo myDeviceInfo = new DeviceInfo();
-        myDeviceInfo.productKey = "a1EtqHmfpNk";//正式服
-//        myDeviceInfo.productKey = "a13H8L6bDyf";//测试服
+//        myDeviceInfo.productKey = "a1EtqHmfpNk";//正式服
+        myDeviceInfo.productKey = "a13H8L6bDyf";//测试服
 //
-        myDeviceInfo.productSecret = "x6wHbrbXUMFYtvLl";//正式服
-//        myDeviceInfo.productSecret = "Nc4Y4KsjofejCy27";//测试服
+//        myDeviceInfo.productSecret = "x6wHbrbXUMFYtvLl";//正式服
+        myDeviceInfo.productSecret = "Nc4Y4KsjofejCy27";//测试服
 
         System.out.println(MainViewModel.getDeviceId(this)+"----------------------------+");
         myDeviceInfo.deviceName = MainViewModel.getDeviceId(this);
@@ -183,9 +185,10 @@ public class AppApplication extends BaseApplication implements CustomActivityOnC
         SPUtils.getInstance().put("IMEI",MainViewModel.getDeviceId(this));
 //        myDeviceInfo.deviceName="123456";
 
-//        SPUtils.getInstance().put("deviceSecret2","4pJyg1tm8VMOXZGwASAaaVgzRzZVMbbs");//存
-        String secret = SPUtils.getInstance().getString("deviceSecret2");//读
-//        String secret ="";
+//        SPUtils.getInstance().put("deviceSecret2","WMClVkIJipSunIY4fOSd2Be3xo42TfVs");//存
+//        SPUtils.getInstance().put("deviceSecret2","WMClVkIJipSunIY4fOSd2Be3xo42TfVs");//测试服
+//        String secret = SPUtils.getInstance().getString("deviceSecret2");//读
+        String secret ="WMClVkIJipSunIY4fOSd2Be3xo42TfVs";
         Log.i(TAG,"secret=="+secret);
 
         if(secret != null &&  !secret.equals("")){

+ 56 - 10
app/src/main/java/com/siwei/recyclebox/deviceUtils/OtherDevice.java

xqd xqd xqd xqd
@@ -209,6 +209,20 @@ public class OtherDevice extends BaseDeviceEntity {
     * */
     public void setPower(){
         try {
+//            byte[] setPower = new byte[]{(byte) 0xAA, (byte) 0xBB, 0x0A, 0x01, 0x66, 0x0A, 0x02, 0x60, (byte) 0xFF, (byte) 0xFF, (byte) 0xCC, (byte) 0xDD};
+            byte[] setPower = new byte[]{(byte) 0xAA, (byte) 0xBB, 0x0A, 0x01, 0x66, 0x0A, 0x02, 0x44, (byte) 0xFF, (byte) 0xFF, (byte) 0xCC, (byte) 0xDD};
+
+            port.write(setPower, 500);
+            byte[] response = new byte[12];
+            port.read(response,500);
+            Log.i(TAG,ByteUtil.bytesToString(response)+"设置电流");
+        }catch(Exception e){
+            e.printStackTrace();
+        }
+    }
+
+    public void setPowerBigger(){
+        try {
 //            byte[] setPower = new byte[]{(byte) 0xAA, (byte) 0xBB, 0x0A, 0x01, 0x66, 0x0A, 0x02, 0x60, (byte) 0xFF, (byte) 0xFF, (byte) 0xCC, (byte) 0xDD};
             byte[] setPower = new byte[]{(byte) 0xAA, (byte) 0xBB, 0x0A, 0x01, 0x66, 0x0A, 0x03, 0x60, (byte) 0xFF, (byte) 0xFF, (byte) 0xCC, (byte) 0xDD};
 
@@ -220,6 +234,18 @@ public class OtherDevice extends BaseDeviceEntity {
             e.printStackTrace();
         }
     }
+    public void selectPower(){
+
+        try{
+            byte[] readPushOrderBytes=new byte[]{(byte)0xAA, (byte) 0xBB,0x0A, 0x01, 0x55 ,0x01 , (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xCC, (byte) 0xDD};
+            port.write(readPushOrderBytes, 100);
+            byte[] responseRead = new byte[ 12];
+            port.read(responseRead,200);
+            System.out.println("Read response:"+ByteUtil.bytesToString(responseRead));
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
 
 
     /**
@@ -244,12 +270,22 @@ public class OtherDevice extends BaseDeviceEntity {
                     getRodOpenNumber();
                     byte[] response = new byte[ 12];
                     port.read(response,200);
-                    byte[] readPushOrderBytes=new byte[]{(byte)0xAA, (byte) 0xBB,0x0A, 0x01, 0x55 ,0x01 , (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xCC, (byte) 0xDD};
-                    port.write(readPushOrderBytes, 100);
-                    byte[] responseRead = new byte[ 12];
-                    port.read(responseRead,200);
+                    mHandler.postDelayed(new Runnable() {
+                        @Override
+                        public void run() {
+                            byte[] readPushOrderBytes=new byte[]{(byte)0xAA, (byte) 0xBB,0x0A, 0x01, 0x55 ,0x01 , (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xCC, (byte) 0xDD};
+                            try {
+                                port.write(readPushOrderBytes, 100);
+                                byte[] responseRead = new byte[ 12];
+                                port.read(responseRead,200);
+                                System.out.println("pushRead response:"+ByteUtil.bytesToString(responseRead));
+                            } catch (IOException e) {
+                                e.printStackTrace();
+                            }
+                        }
+                    },1000);
+
                     System.out.println("push response:"+ByteUtil.bytesToString(response));
-                    System.out.println("pushRead response:"+ByteUtil.bytesToString(responseRead));
 
 //                    SPUtils.getInstance().getInt("infraredNum1",0);
                     long curr=System.currentTimeMillis();
@@ -317,12 +353,22 @@ public class OtherDevice extends BaseDeviceEntity {
                     System.out.println("pullRod "+writeLen);
                     byte[] response = new byte[12];
                     port.read(response,200);
+                    mHandler.postDelayed(new Runnable() {
+                        @Override
+                        public void run() {
+                            byte[] readPullOrderBytes=new byte[]{(byte)0xAA, (byte) 0xBB,0x0A, 0x01, 0x55 ,0x01 , (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xCC, (byte) 0xDD};
+                            try {
+                                port.write(readPullOrderBytes, 100);
+                                byte[] responseRead = new byte[ 12];
+                                port.read(responseRead,200);
+                                System.out.println("pullRead response:"+ByteUtil.bytesToString(responseRead));
+                            } catch (IOException e) {
+                                e.printStackTrace();
+                            }
+
+                        }
+                    },1000);
 
-                    byte[] readPullOrderBytes=new byte[]{(byte)0xAA, (byte) 0xBB,0x0A, 0x01, 0x55 ,0x01 , (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xCC, (byte) 0xDD};
-                    port.write(readPullOrderBytes, 100);
-                    byte[] responseRead = new byte[ 12];
-                    port.read(responseRead,200);
-                    System.out.println("pullRead response:"+ByteUtil.bytesToString(responseRead));
                     System.out.println("response:"+ByteUtil.bytesToString(response));
                 }catch ( Exception e ){
                     e.printStackTrace();

+ 17 - 4
app/src/main/java/com/siwei/recyclebox/receiver/BootReceiver.java

xqd xqd
@@ -3,6 +3,7 @@ package com.siwei.recyclebox.receiver;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
+import android.os.Handler;
 import android.util.Log;
 
 import com.siwei.recyclebox.ui.main.MainActivity;
@@ -10,11 +11,23 @@ import com.siwei.recyclebox.ui.main.MainActivity;
 public class BootReceiver extends BroadcastReceiver {
     private static final String TAG = "BootReceiver";
 
+    /*
+    * 广播监听开机,开机就启动app;开机时网络可能要等会儿才能识别到,所以延迟启动
+    * */
     @Override
     public void onReceive(Context context, Intent intent) {
-        Log.e(TAG,"onReceive//////////////////:"+intent);
-        Intent i = new Intent(context,MainActivity.class);
-        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
-        context.startActivity(i);
+        mHandler.postDelayed(new Runnable() {
+            @Override
+            public void run() {
+                Log.e(TAG,"onReceive//////////////////:"+intent);
+                Intent i = new Intent(context,MainActivity.class);
+                i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
+                context.startActivity(i);
+            }
+        },60000);
+
     }
+    public android.os.Handler mHandler = new Handler(msg -> {
+        return true;
+    });
 }

+ 131 - 5
app/src/main/java/com/siwei/recyclebox/service/MyService.java

xqd
@@ -1,45 +1,171 @@
 package com.siwei.recyclebox.service;
 
+import android.app.Activity;
+import android.app.ActivityManager;
 import android.app.AlarmManager;
+import android.app.Application;
+import android.app.Notification;
 import android.app.PendingIntent;
 import android.app.Service;
 import android.content.Context;
 import android.content.Intent;
+import android.os.Binder;
+import android.os.Bundle;
+import android.os.Handler;
 import android.os.IBinder;
 import android.util.Log;
+import android.widget.RemoteViews;
 import android.widget.Toast;
 
+import com.siwei.recyclebox.R;
 import com.siwei.recyclebox.ui.main.MainActivity;
 
-public class MyService extends Service {
+import java.util.List;
+import java.util.Timer;
+import java.util.TimerTask;
 
+public class MyService extends Service {
+    public  final IBinder mBinder=new LocalBinder();
     @Override
     public IBinder onBind(Intent arg0) {
         return null;
     }
-
+    private final Timer timer=new Timer();
+    private TimerTask task1;
     @Override
     public int onStartCommand(Intent intent, int flags, int startId) {
         // Let it continue running until it is stopped.
 //        Toast.makeText(this, "服务已经启动", Toast.LENGTH_LONG).show();
-        Log.i("server","服务已经启动");
+       Log.i("server","服务已经启动");
+        task1=new TimerTask() {
+            @Override
+            public void run() {
+                isBackground(getApplicationContext());
+            }
+        };
+        timer.schedule(task1,10000,60000);
         return START_STICKY;
     }
+    public class LocalBinder extends Binder {
+        // 在Binder中定义一个自定义的接口用于数据交互
+              // 这里直接把当前的服务传回给宿主
+              public MyService getService(){
+                      return MyService.this;
+                  }
+     }
+    @Override
+    public boolean onUnbind(Intent intent) {
+        Log.i("onUnbind","1111111111");
+        Intent mStartActivity = new Intent(getApplicationContext(), MainActivity.class);
+        int mPendingIntentId = 123456;
+        PendingIntent mPendingIntent = PendingIntent.getActivity(this, mPendingIntentId,    mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT);
+        AlarmManager mgr = (AlarmManager)this.getSystemService(Context.ALARM_SERVICE);
+        mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent);
+        System.exit(0);
+        return super.onUnbind(intent);
+    }
 
     @Override
     public void onDestroy() {
 
 //            Intent intent=new Intent(this,MyService.class);
 //            this.startService(intent);
-
-        Intent mStartActivity = new Intent(this, MainActivity.class);
+        Log.i("onDestroy","1111111111");
+        Intent mStartActivity = new Intent(getApplicationContext(), MainActivity.class);
         int mPendingIntentId = 123456;
         PendingIntent mPendingIntent = PendingIntent.getActivity(this, mPendingIntentId,    mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT);
         AlarmManager mgr = (AlarmManager)this.getSystemService(Context.ALARM_SERVICE);
         mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent);
         System.exit(0);
+
         super.onDestroy();
 //        Toast.makeText(this, "服务已经停止", Toast.LENGTH_LONG).show();
 //        Log.i("","服务已经停止");
     }
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+    }
+/*    class ActivityLifecycleListener implements Application.ActivityLifecycleCallbacks {
+
+        private int refCount = 0;
+
+        @Override
+        public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
+
+        }
+
+        @Override
+        public void onActivityStarted(Activity activity) {
+            refCount++;
+        }
+
+        @Override
+        public void onActivityResumed(Activity activity) {
+
+        }
+
+        @Override
+        public void onActivityPaused(Activity activity) {
+
+        }
+
+        @Override
+        public void onActivityStopped(Activity activity) {
+            refCount--;
+            if(refCount == 0){
+                Intent mStartActivity = new Intent(getApplicationContext(), MainActivity.class);
+                int mPendingIntentId = 123456;
+                PendingIntent mPendingIntent = PendingIntent.getActivity(getApplicationContext(), mPendingIntentId,    mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT);
+                AlarmManager mgr = (AlarmManager)this.getSystemService(Context.ALARM_SERVICE);
+                mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent);
+                System.exit(0);
+            }
+        }
+
+        @Override
+        public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
+
+        }
+
+        @Override
+        public void onActivityDestroyed(Activity activity) {
+        }
+    }*/
+    public boolean isBackground(Context context) {
+        ActivityManager activityManager = (ActivityManager) context
+                .getSystemService(Context.ACTIVITY_SERVICE);
+        List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager
+                .getRunningAppProcesses();
+        for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
+            if (appProcess.processName.equals(context.getPackageName())) {
+                /*
+                BACKGROUND=400 EMPTY=500 FOREGROUND=100
+                GONE=1000 PERCEPTIBLE=130 SERVICE=300 ISIBLE=200
+                 */
+                Log.i(context.getPackageName(), "此appimportace ="
+                        + appProcess.importance
+                        + ",context.getClass().getName()="
+                        + context.getClass().getName());
+                if (appProcess.importance != ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
+                    Log.i(context.getPackageName(), "处于后台"
+                            + appProcess.processName);
+                    Intent mStartActivity = new Intent(getApplicationContext(), MainActivity.class);
+                    int mPendingIntentId = 123456;
+                    PendingIntent mPendingIntent = PendingIntent.getActivity(getApplicationContext(), mPendingIntentId,    mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT);
+                    AlarmManager mgr = (AlarmManager)this.getSystemService(Context.ALARM_SERVICE);
+                    mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent);
+                    System.exit(0);
+                    return true;
+                } else {
+                    Log.i(context.getPackageName(), "处于前台"
+                            + appProcess.processName);
+                    return false;
+                }
+            }
+        }
+        return false;
+    }
+
 }

+ 106 - 10
app/src/main/java/com/siwei/recyclebox/ui/main/MainActivity.java

xqd xqd xqd xqd
@@ -2,11 +2,22 @@ package com.siwei.recyclebox.ui.main;
 
 import android.app.AlarmManager;
 import android.app.PendingIntent;
+import android.app.Service;
 import android.bluetooth.BluetoothAdapter;
+import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
+import android.content.ServiceConnection;
 import android.databinding.ViewDataBinding;
+import android.net.Uri;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+import android.os.Build;
 import android.os.Bundle;
+import android.os.IBinder;
+import android.os.PowerManager;
+import android.provider.Settings;
+import android.support.annotation.RequiresApi;
 import android.util.Log;
 
 import com.siwei.recyclebox.BR;
@@ -27,9 +38,50 @@ public class MainActivity extends BaseActivity<ViewDataBinding,MainViewModel> {
         super.initParam();
         Intent service = new Intent(getApplication(), MyService.class);
         getApplication().startService(service);
+        getApplication().bindService(new Intent(MainActivity.this,MyService.class),mConnection, Service.BIND_AUTO_CREATE);
+        Log.i("uuid","="+getMacAddress());
+
+    }
+
+
+    public String getMacAddress() {
+        //获取 uuid
+        String macAddress = null;
+        WifiManager wifiManager =
+                (WifiManager)getApplication().getApplicationContext().getSystemService(Context.WIFI_SERVICE);
+        WifiInfo info = (null == wifiManager ? null : wifiManager.getConnectionInfo());
+        if (!wifiManager.isWifiEnabled()){
+            //必须先打开,才能获取到MAC地址
+            wifiManager.setWifiEnabled(true);
+            wifiManager.setWifiEnabled(false);
+        }
+        if (null != info) {
+            macAddress = info.getMacAddress();
+        }
+        return macAddress;
     }
 
+    MyService mService=null;
+    private ServiceConnection mConnection = new ServiceConnection() {
+
+
+        @Override
+        public void onServiceDisconnected(ComponentName name) {
+            mService = null;
+        }
+
+        @Override
+         public void onServiceConnected(ComponentName name, IBinder service) {
+                         // 获取服务上的IBinder对象,调用IBinder对象中定义的自定义方法,获取Service对象
+            MyService.LocalBinder binder=(MyService.LocalBinder)service;
+                       mService=binder.getService();
+                    }
+    };
+
+
+
     //页面数据初始化方法。
+    @RequiresApi(api = Build.VERSION_CODES.M)
     @Override
     public void initData() {
 //        viewModel.btnClick.onClick();
@@ -40,10 +92,35 @@ public class MainActivity extends BaseActivity<ViewDataBinding,MainViewModel> {
 //        viewModel.repeatTask();
         Log.i("repeatTask","*****************************************");
         viewModel.startBLEServer();
+        if(!isIgnoringBatteryOptimizations()){
+            requestIgnoreBatteryOptimizations();
+        }
 //        viewModel.netWorkInfo();
 //        viewModel.openWeight();
 //        System.out.println("serialPortUtil.readControllerStatus:"+ SerialPortUtil.getInstance().readRelayControllerStatus());
     }
+    @RequiresApi(api = Build.VERSION_CODES.M)
+    private boolean isIgnoringBatteryOptimizations() {
+        boolean isIgnoring = false;
+        PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
+        if (powerManager != null) {
+            isIgnoring = powerManager.isIgnoringBatteryOptimizations(getPackageName());
+            Log.i("白名单","已经添加白名单");
+        }
+        return isIgnoring;
+    }
+    @RequiresApi(api = Build.VERSION_CODES.M)
+    public void requestIgnoreBatteryOptimizations() {
+        try {
+            Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
+            intent.setData(Uri.parse("package:" + getPackageName()));
+            startActivity(intent);
+            Log.i("白名单","申请添加白名单");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
 
     public void openBlueTooth(){
 //      打开蓝牙(提示对话框)
@@ -90,21 +167,40 @@ public class MainActivity extends BaseActivity<ViewDataBinding,MainViewModel> {
 
     @Override
     protected void onDestroy() {
-
-//        viewModel.closePort();
+        super.onDestroy();
         viewModel.stopBleServer();
         viewModel.unRegisterIoTListener();
-        Log.e("MainActivity.","unregisterIoTListener!!!");
-        Intent mStartActivity = new Intent(getApplication(),MainActivity.class);
-        int mPendingIntentId = 123456;
-        PendingIntent mPendingIntent = PendingIntent.getActivity(getApplication(), mPendingIntentId,    mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT);
-        AlarmManager mgr = (AlarmManager)this.getSystemService(Context.ALARM_SERVICE);
-        mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent);
-        System.exit(0);
-        super.onDestroy();
+        getApplication().unbindService(mConnection);
+        mService=null;
+//        viewModel.closePort();
+
+//        Log.e("MainActivity.","unregisterIoTListener!!!");
+//        Intent mStartActivity = new Intent(getApplication(),MainActivity.class);
+//        int mPendingIntentId = 123456;
+//        PendingIntent mPendingIntent = PendingIntent.getActivity(getApplication(), mPendingIntentId,    mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT);
+//        AlarmManager mgr = (AlarmManager)this.getSystemService(Context.ALARM_SERVICE);
+//        mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent);
+//        System.exit(0);
 
     }
 
+    @Override
+    protected void onStop() {
+        super.onStop();
+
+        getApplication().unbindService(mConnection);
+        mService=null;
+//        viewModel.stopBleServer();
+//        viewModel.unRegisterIoTListener();
+//        Log.e("MainActivity.","unregisterIoTListener!!!");
+//        Intent mStartActivity = new Intent(getApplication(),MainActivity.class);
+//        int mPendingIntentId = 123456;
+//        PendingIntent mPendingIntent = PendingIntent.getActivity(getApplication(), mPendingIntentId,    mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT);
+//        AlarmManager mgr = (AlarmManager)this.getSystemService(Context.ALARM_SERVICE);
+//        mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent);
+//        System.exit(0);
+    }
+
     @Override
     public int initContentView(Bundle savedInstanceState) {
         return R.layout.activity_main;

+ 129 - 120
app/src/main/java/com/siwei/recyclebox/ui/main/MainViewModel.java

xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd
@@ -209,6 +209,14 @@ public class MainViewModel extends BaseViewModel implements SerialPortHelper.OnS
             SerialPortUtil.getInstance().getOtherDevice().clearCurrent();
         }
     };
+    public View.OnClickListener btnClickSelectPower = new View.OnClickListener() {
+        //清除电流过大查询值
+        @Override
+        public void onClick(View view) {
+            System.out.println("read response");
+            SerialPortUtil.getInstance().getOtherDevice().selectPower();
+        }
+    };
     public View.OnClickListener btnClickSpeech=new View.OnClickListener() {
         //播放音频
         @Override
@@ -313,6 +321,14 @@ public class MainViewModel extends BaseViewModel implements SerialPortHelper.OnS
             a++;
         }
     };
+    public View.OnClickListener btnClickSetPowerBigger = new View.OnClickListener() {
+        //设置更大的电流值
+        @Override
+        public void onClick(View view) {
+            SerialPortUtil.getInstance().getOtherDevice().setPowerBigger();
+        }
+    };
+
     public View.OnClickListener btnClickSendMsg = new View.OnClickListener() {
         //发送短信 事件测试
         @Override
@@ -605,38 +621,46 @@ public class MainViewModel extends BaseViewModel implements SerialPortHelper.OnS
     };
     private void pullRodMethod(){
         SerialPortUtil.getInstance().getOtherDevice().pullRod();
-        try {
-            AssetFileDescriptor fd = getApplication().getAssets().openFd("nonetPullRod.mp3");
-            mMediaPlay =new MediaPlayer();
-            mMediaPlay.reset();
-            mMediaPlay.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());
-            mMediaPlay.prepare();
-            Log.i(TAG,"播放音频");
-            mMediaPlay.start();
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
+        mHandler.postDelayed(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    AssetFileDescriptor fd = getApplication().getAssets().openFd("nonetPullRod.mp3");
+                    mMediaPlay = new MediaPlayer();
+                    mMediaPlay.reset();
+                    mMediaPlay.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());
+                    mMediaPlay.prepare();
+                    Log.i(TAG, "播放音频");
+                    mMediaPlay.start();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }},100);
     }
     private void pullonNetRodMethod(){
         //有网开门
         SerialPortUtil.getInstance().getOtherDevice().pullRod();
-        try {
-            AssetFileDescriptor fd = getApplication().getAssets().openFd("netPullRod.mp3");
-            mMediaPlay =new MediaPlayer();
-            mMediaPlay.reset();
-            mMediaPlay.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());
-            mMediaPlay.prepare();
-            Log.i(TAG,"播放音频");
-            mMediaPlay.start();
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
+        mHandler.postDelayed(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    AssetFileDescriptor fd = getApplication().getAssets().openFd("netPullRod.mp3");
+                    mMediaPlay = new MediaPlayer();
+                    mMediaPlay.reset();
+                    mMediaPlay.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());
+                    mMediaPlay.prepare();
+                    Log.i(TAG, "播放音频");
+                    mMediaPlay.start();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }},100);
     }
     private void pushRodMethod(){
         //有网下关门
         SerialPortUtil.getInstance().getOtherDevice().pushRod();//关门
         reportProperty();
-
+        reportDeviceEvent("commoneEvent","close",3);
         mHandler.postDelayed(new Runnable() {
             @Override
             public void run() {
@@ -692,7 +716,7 @@ public class MainViewModel extends BaseViewModel implements SerialPortHelper.OnS
             @Override
             public void run() {
                 reportProperty();
-                reportDeviceEvent("commoneEvent","close",3);
+//                reportDeviceEvent("commoneEvent","close",3);
             }
         },4000);
     }
@@ -816,7 +840,6 @@ public class MainViewModel extends BaseViewModel implements SerialPortHelper.OnS
 
             System.out.println("收到云端下行的数据:connectId:"+connectId+"  topic :"+topic+"  aMessage data:"+ aMessage.getData().getClass().getSimpleName());
             byte[] dataBytes = (byte[])aMessage.getData();
-
             System.out.println(new String(dataBytes));
 //            if (topic.endsWith("thing/event/property/post_reply")){ //推送设备属性的回包。
 //            }
@@ -835,15 +858,14 @@ public class MainViewModel extends BaseViewModel implements SerialPortHelper.OnS
 //                SerialPortUtil.getInstance().getOtherDevice().clearWeight();//去皮清零
                     SPUtils.getInstance().put("clearWight",2);
                 }
+                pullonNetRodMethod();//开门
                 mHandler.postDelayed(new Runnable() {
                     @Override
                     public void run() {
-                        reportProperty();
-                        pullonNetRodMethod();
+                        reportProperty();//上报数据
                         reportDeviceEvent("commoneEvent","open",3);
                     }
                 },500);
-
                 Log.i(TAG,"欢迎使用智能回收箱");
                 Log.i(TAG,"收到开门=============");
                 Thread thread=new Thread(new Runnable() {
@@ -855,12 +877,15 @@ public class MainViewModel extends BaseViewModel implements SerialPortHelper.OnS
                             try {
                                 sleep(1000);
                                 numInt++;
+                                Log.i("开门","开门"+numInt);
                                 if(SPUtils.getInstance().getString("RodSwitch").equals("0")){
-                                    break;
+                                    break;//关门了就退出
+                                }
+                                if(numInt==41){
+                                    reportProperty();
                                 }
                                 if(numInt==82){
-                                    pushRodMethod();
-                                    reportDeviceEvent("commoneEvent","close",3);
+                                    pushRodMethod();//82秒后关门
                                     break;
                                 }
                             } catch (InterruptedException e) {
@@ -871,14 +896,6 @@ public class MainViewModel extends BaseViewModel implements SerialPortHelper.OnS
                     }
                 });
                 thread.start();
-//                mHandler.postDelayed(new Runnable() {
-//                    @Override
-//                    public void run() {
-//                        if(SPUtils.getInstance().getString("RodSwitch").equals("1")) {
-//                            pushRodMethod();
-//                        }
-//                    }
-//                },82000);//82s没关门就自动关门
             }
             if(topic.endsWith("thing/service/RemoteClose")){
                 Log.i(TAG,"收到关门========================");
@@ -1090,6 +1107,8 @@ public class MainViewModel extends BaseViewModel implements SerialPortHelper.OnS
             }
             if(topic.endsWith("thing/service/currentWeight")){
                 Log.d(TAG , "读取当前读数");
+                reportProperty();
+                //以下没啥用
                 int weight = SerialPortUtil.getInstance().getWeightDevice().readWeight();
 //                int weight = SerialPortUtil.getInstance().getOtherDevice().readWeight();
                 String pushDSata = weight+"";
@@ -1130,6 +1149,7 @@ public class MainViewModel extends BaseViewModel implements SerialPortHelper.OnS
         }
         @Override
         public void onConnectStateChange(String connectId, ConnectState connectState) {
+
             System.out.println("onConnectStateChange  connectId:"+connectId+"  connectState:"+connectState);
             if(connectState == ConnectState.CONNECTED){
 //                reportProperty(1);
@@ -1138,6 +1158,7 @@ public class MainViewModel extends BaseViewModel implements SerialPortHelper.OnS
                     //未授权写权限。
                     requestFilePermissions.call();
                 }
+                reportProperty();//重新连接后上报数据
                 reportVersion();
                 otaListener();
             }
@@ -1482,26 +1503,27 @@ public class MainViewModel extends BaseViewModel implements SerialPortHelper.OnS
         // 注册下行监听,包括长连接的状态和云端下行的数据
         LinkKit.getInstance().registerOnPushListener(notifyListener);
 //        MqttRrpcRegisterRequest rrpcRegisterRequest = new MqttRrpcRegisterRequest();
-////        rrpcRegisterRequest.topic = "/a1EtqHmfpNk/9pD3trz6OaDV8GF7yRsb/thing/service/currentWeight";
-////        rrpcRegisterRequest.topic = "/a13H8L6bDyf/9pD3trz6OaDV8GF7yRsb/thing/service/currentWeight";
-//
-//        MqttSubscribeRequest subscribeRequest = new MqttSubscribeRequest();
-////        subscribeRequest.topic = "/a1EtqHmfpNk/9pD3trz6OaDV8GF7yRsb/user/checkOnlineStatus";
-//        subscribeRequest.topic = "/a13H8L6bDyf/"+IMEI+"/user/checkOnlineStatus";
-//
-//        subscribeRequest.isSubscribe = true;
-//        subscribeRequest.qos = 0;
-//        LinkKit.getInstance().subscribe(subscribeRequest, new IConnectSubscribeListener() {
-//            @Override
-//            public void onSuccess() {
-//                System.out.println("checkOnlineStatus subscribe success");
-//            }
-//            @Override
-//            public void onFailure(AError aError) {
-//                System.out.println("checkOnlineStatus subscribe Fail");
-//            }
-//        });
-//        publish();
+////        rrpcRegisterRequest.topic = "/a1EtqHmfpNk/"+IMEI+"/thing/service/currentWeight";//正式服
+//        rrpcRegisterRequest.topic = "/a13H8L6bDyf/"+IMEI+"/thing/service/currentWeight";//测试服
+
+        MqttSubscribeRequest subscribeRequest = new MqttSubscribeRequest();
+//        subscribeRequest.topic = "/a1EtqHmfpNk/"+IMEI+"/user/checkOnlineStatus";//正式服
+        subscribeRequest.topic = "/a13H8L6bDyf/"+IMEI+"/user/checkOnlineStatus";//测试服
+
+        subscribeRequest.isSubscribe = true;
+        subscribeRequest.qos = 0;
+        LinkKit.getInstance().subscribe(subscribeRequest, new IConnectSubscribeListener() {
+            @Override
+            public void onSuccess() {
+                System.out.println("checkOnlineStatus subscribe success");
+            }
+            @Override
+            public void onFailure(AError aError) {
+                System.out.println("checkOnlineStatus subscribe Fail");
+            }
+        });
+
+        publish();
     }
     private void reportVersion(){
         //上报版本
@@ -1582,52 +1604,42 @@ public class MainViewModel extends BaseViewModel implements SerialPortHelper.OnS
     }
     private int disconnectTimes = 0;
 
-//    private void publish(){
-//        //一个循环方法,用来更新数据
-//        System.out.println("checkOnlineStatus");
-//        MqttPublishRequest publishRequest = new MqttPublishRequest();
-//        publishRequest.qos = 0;
-////        publishRequest.topic = "/a1EtqHmfpNk/"+IMEI+"/user/checkOnlineStatus";//a1EtqHmfpNk
-//        publishRequest.topic = "/a13H8L6bDyf/"+IMEI+"/user/checkOnlineStatus";//a1EtqHmfpNk
-//
-//        publishRequest.payloadObj = "{\"id\":"+ publishRequest.msgId+", \"version\":\"1.0\",\"time\":" + System.currentTimeMillis() + "}";
-////        Integer networkInt=netWorkInfo();
-////        Log.i(TAG,"network网络"+networkInt);
-////        if(networkInt!=0){
-//            LinkKit.getInstance().publish(publishRequest, new IConnectSendListener() {
-//                @Override
-//                public void onResponse(ARequest aRequest, AResponse aResponse) {
-//                    disconnectTimes = 0;
-//                    mHandler.postDelayed(new Runnable() {
-//                        @Override
-//                        public void run() {
-//                            reportProperty();
-//                        }
-//                    },5000);
-//
-//                    System.out.println("publish on Response :" + aResponse.getData());
-//                }
-//                @Override
-//                public void onFailure(ARequest aRequest, AError aError) {
-//                    System.out.println("publish onFailure  error:" + aError.getMsg());
-//                    disconnectTimes++;
-//                    if (disconnectTimes > 5) {
-//                    registerAliIoTListener(); //重新连接。
-//                        disconnectTimes = 0;
-//                        return;
-//                    }
-//                    mHandler.postDelayed(new Runnable() {
-//                        @Override
-//                        public void run() {
-//                            publish();
-//                        }
-//                    },1000000);
-//
-//                }
-//            });
-////        }
-//
-//    }
+    private void publish(){
+        //一个循环方法,用来更新数据
+        System.out.println("checkOnlineStatus");
+        MqttPublishRequest publishRequest = new MqttPublishRequest();
+        publishRequest.isRPC = false;
+
+//        publishRequest.topic = "/a1EtqHmfpNk/"+IMEI+"/user/checkOnlineStatus";//正式服
+        publishRequest.topic = "/a13H8L6bDyf/"+IMEI+"/user/checkOnlineStatus";//测试服
+        publishRequest.qos = 0;
+        publishRequest.payloadObj = "{\"id\":"+ publishRequest.msgId+", \"version\":\"8.0\",\"time\":" + System.currentTimeMillis() + "}";
+        publishRequest.payloadObj = "{\"id\":\"1}";
+
+        int networkNum=SPUtils.getInstance().getInt("netWork",1);
+        if(networkNum!=0){
+            LinkKit.getInstance().publish(publishRequest, new IConnectSendListener() {
+                @Override
+                public void onResponse(ARequest aRequest, AResponse aResponse) {
+                    Log.i(TAG,"发布成功");
+                    disconnectTimes = 0;
+                    System.out.println("publish on Response :" + aResponse.getData());
+                }
+                @Override
+                public void onFailure(ARequest aRequest, AError aError) {
+                    Log.i(TAG,"发布失败");
+                    System.out.println("publish onFailure  error:" + aError.getMsg());
+                    disconnectTimes++;
+                    if (disconnectTimes > 5) {
+                    registerAliIoTListener(); //重新连接。
+                        disconnectTimes = 0;
+                        return;
+                    }
+                }
+            });
+        }
+
+    }
 
 
     public void unRegisterIoTListener(){
@@ -1709,6 +1721,7 @@ public class MainViewModel extends BaseViewModel implements SerialPortHelper.OnS
                     Log.i(TAG,"offset="+offset);
                     if(SPUtils.getInstance().getInt("phoneType")==2){
                         mBluetoothGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS,responseBytes.length,responseBytes );// 响应客户端
+                        Log.d(TAG,"客户端读取Characteristic[" + characteristic.getUuid() + "]:\n" + response);
                     }else {
                         if(responseBytes.length>offset){
                             int restLen = responseBytes.length-offset;
@@ -1771,16 +1784,15 @@ public class MainViewModel extends BaseViewModel implements SerialPortHelper.OnS
                                     public void run() {
                                         int numInt=0;
                                         long curr=System.currentTimeMillis();
-                                        while(System.currentTimeMillis()-curr<finalTimeInt){
+                                        while(System.currentTimeMillis()-curr<finalTimeInt+5000){
                                             try {
                                                 sleep(1000);
                                                 numInt++;
-
-                                                Log.i("倒计时时间",numInt+"---"+SPUtils.getInstance().getString("RodSwitch"));
+                                                Log.i("倒计时时间",numInt+"---"+SPUtils.getInstance().getString("RodSwitch")+"---"+finalTimeInt);
                                                 if(SPUtils.getInstance().getString("RodSwitch").equals("0")){
                                                     break;
                                                 }
-                                                if(numInt== finalTimeInt){
+                                                if(numInt*1000== finalTimeInt){
                                                     pushRodMethodNonet();
                                                     SPUtils.getInstance().put("type","close");
                                                     String response=reportDataMethodEncrypt();
@@ -2161,10 +2173,12 @@ public class MainViewModel extends BaseViewModel implements SerialPortHelper.OnS
         task3 =new TimerTask(){
             public void run(){
                 publishRepeat();
+                reportProperty();
+
                 Log.i("Task","300秒循环");
             }
         };
-        timer.schedule(task3,60000,600000);
+        timer.schedule(task3,10000,600000);
         Calendar calendar = Calendar.getInstance();
         calendar.setTimeInMillis(System.currentTimeMillis());
         calendar.set(Calendar.HOUR_OF_DAY, 11);
@@ -2172,8 +2186,9 @@ public class MainViewModel extends BaseViewModel implements SerialPortHelper.OnS
         task2=new TimerTask() {
             @Override
             public void run() {
+                openLight();
                 if(readTime()==3){
-                    restartApp();
+//                    restartApp();
                     restartAndroid();
                 }
                 Integer networkInt=netWorkInfo();
@@ -2189,12 +2204,10 @@ public class MainViewModel extends BaseViewModel implements SerialPortHelper.OnS
         task1=new TimerTask() {
             @Override
             public void run() {
-//                publish();
-                openLight();
-                reportProperty();
+                publish();
             }
         };
-        timer.schedule(task1,10000,3600000);
+        timer.schedule(task1,1000,60000);
 
     }
     private void publishRepeat(){
@@ -2206,7 +2219,7 @@ public class MainViewModel extends BaseViewModel implements SerialPortHelper.OnS
             SPUtils.getInstance().put("ClampHandNum",num+1);//记录被夹次数
             SerialPortUtil.getInstance().getOtherDevice().clearCurrent();
         }
-        if(currentTemperature>60){
+        if(currentTemperature>70){
             SPUtils.getInstance().put("RunningState",2);//温度过高
             Log.i(TAG,"温度过高");
 //            Integer networkInt=netWorkInfo();
@@ -2252,10 +2265,6 @@ public class MainViewModel extends BaseViewModel implements SerialPortHelper.OnS
             SerialPortUtil.getInstance().getOtherDevice().closeLight2();
             SerialPortUtil.getInstance().getOtherDevice().closeLight3();
             SerialPortUtil.getInstance().getOtherDevice().closeLight4();
-            if(readTime()==3){
-                restartApp();
-//                restartAndroid();
-            }
         }
     }
 

+ 20 - 0
app/src/main/res/layout/activity_main.xml

xqd
@@ -343,6 +343,26 @@
                 android:layout_height="130dp"
                 android:padding="16dp">
 
+                <Button
+                    android:layout_width="150dp"
+                    android:layout_height="100dp"
+                    android:onClick="@{viewModal.btnClickSetPowerBigger}"
+                    android:text="设置更大的电流阈值"
+                    android:textSize="24sp"
+                    />
+                <Button
+                    android:layout_width="150dp"
+                    android:layout_height="100dp"
+                    android:onClick="@{viewModal.btnClickSelectPower}"
+                    android:text="查询电流值"
+                    android:textSize="24sp"
+                    />
+            </LinearLayout>
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="130dp"
+                android:padding="16dp">
+
                 <Button
                     android:layout_width="150dp"
                     android:layout_height="100dp"

+ 2 - 2
config.gradle

xqd
@@ -7,8 +7,8 @@ ext {
             minSdkVersion    : 21,
             targetSdkVersion : 25,
 
-            versionCode      : 5,
-            versionName      : "1.5",
+            versionCode      : 8,
+            versionName      : "1.8",
     ]
     //version配置
     versions = [