completed sign api.
authorTrillGates <williamtrillgates@gmail.com>
Thu, 5 Aug 2021 06:23:25 +0000 (14:23 +0800)
committerTrillGates <williamtrillgates@gmail.com>
Thu, 5 Aug 2021 06:23:25 +0000 (14:23 +0800)
app/src/main/java/com/enqualcomm/support/CoreService.java
app/src/main/java/com/enqualcomm/support/NMEAListener.java
app/src/main/java/com/enqualcomm/support/bean/ICLocation.java
app/src/main/java/com/enqualcomm/support/bean/Runtime.java
app/src/main/java/com/enqualcomm/support/service/SignFlagObserver.java [new file with mode: 0644]
app/src/main/java/com/ic/protocols/protocolAPIHelper.java
app/src/main/java/com/ic/protocols/protocol_s123.java

index 5b52de0..ba21d9f 100644 (file)
@@ -48,6 +48,7 @@ import com.enqualcomm.support.service.KeepAlive;
 import com.enqualcomm.support.service.PhoneCallListener;
 import com.enqualcomm.support.service.SendChatMessage;
 import com.enqualcomm.support.service.ShutdownFlagObserver;
+import com.enqualcomm.support.service.SignFlagObserver;
 import com.enqualcomm.support.service.SilentManager;
 import com.enqualcomm.support.service.WeTalkMsgObserver;
 import com.enqualcomm.support.service.base.AbstractConnectionService;
@@ -1013,6 +1014,11 @@ public class CoreService extends Service {
                 true,
                 airplaneModeObserver);
 
+        SignFlagObserver signFlagObserver = new SignFlagObserver(mHandler, resolver);
+        resolver.registerContentObserver(Uri.parse(SETTINGS + ".sign_action_flag"),
+                true,
+                signFlagObserver);
+
         //启动结束设置标志位,让心率和体温检测可以正常执行。
         server_starting = false;
 
index c242bbe..b80fe11 100644 (file)
@@ -10,7 +10,6 @@ import android.os.Handler;
 import android.os.HandlerThread;
 import android.provider.Settings;
 
-import com.enqualcomm.support.bean.EventLooperHandlerThread;
 import com.enqualcomm.support.bean.ICLocation;
 import com.enqualcomm.support.bean.ICLocation.GPS_locationStatus;
 import com.enqualcomm.support.bean.Runtime;
@@ -23,6 +22,16 @@ import static android.location.LocationManager.GPS_PROVIDER;
 
 public class NMEAListener implements NmeaListener, LocationListener {
     private static boolean listening = false;
+    private String strLatitude;
+    private String strLongitude;
+
+    public String getStrLatitude() {
+        return strLatitude;
+    }
+
+    public String getStrLongitude() {
+        return strLongitude;
+    }
 
     public boolean isListening() {
         return listening;
@@ -189,40 +198,40 @@ public class NMEAListener implements NmeaListener, LocationListener {
         }
         if (nmeastr.startsWith("$GPGLL,") || nmeastr.startsWith("$GNGLL,")) {
             String tmplist[] = nmeastr.split(",");
-//      GPGLL编辑
-//(地理定位信息)
-//      例:$GPGLL,4250.5589,S,14718.5084,E,092204.999,A*2D
-//      字段0:$GPGLL,语句ID,表明该语句为Geographic Position(GLL)地理定位信息
-//      字段1:纬度ddmm.mmmm,度分格式(前导位数不足则补0)
-//      字段2:纬度N(北纬)或S(南纬)
-//      字段3:经度dddmm.mmmm,度分格式(前导位数不足则补0)
-//      字段4:经度E(东经)或W(西经)
-//      字段5:UTC时间,hhmmss.sss格式
-//      字段6:状态,A=定位,V=未定位
-//      字段7:校验值($与*之间的数异或后的值)
+            //      GPGLL编辑
+            //(地理定位信息)
+            //例:$GPGLL,4250.5589,S,14718.5084,E,092204.999,A*2D
+            //字段0:$GPGLL,语句ID,表明该语句为Geographic Position(GLL)地理定位信息
+            //字段1:纬度ddmm.mmmm,度分格式(前导位数不足则补0)
+            //字段2:纬度N(北纬)或S(南纬)
+            //字段3:经度dddmm.mmmm,度分格式(前导位数不足则补0)
+            //字段4:经度E(东经)或W(西经)
+            //字段5:UTC时间,hhmmss.sss格式
+            //字段6:状态,A=定位,V=未定位
+            //字段7:校验值($与*之间的数异或后的值)
             String Lat = tmplist[1];
             String lon = tmplist[3];
             String fixed = tmplist[6];
 //      ICLogger.i("GPGLL Lat="+Lat+",Lon="+lon+",fixed="+fixed);
 
         } else if (nmeastr.startsWith("$GPRMC,") || nmeastr.startsWith("$GNRMC,")) {
-//      GPRMC编辑
-//(推荐定位信息数据格式)
-//      例:$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50
-//      字段0:$GPRMC,语句ID,表明该语句为Recommended Minimum Specific GPS/TRANSIT Data(RMC)推荐最小定位信息
-//      字段1:UTC时间,hhmmss.sss格式
-//      字段2:状态,A=定位,V=未定位
-//      字段3:纬度ddmm.mmmm,度分格式(前导位数不足则补0)
-//      字段4:纬度N(北纬)或S(南纬)
-//      字段5:经度dddmm.mmmm,度分格式(前导位数不足则补0)
-//      字段6:经度E(东经)或W(西经)
-//      字段7:速度,节,Knots
-//      字段8:方位角,度
-//      字段9:UTC日期,DDMMYY格式
-//      字段10:磁偏角,(000 - 180)度(前导位数不足则补0)
-//      字段11:磁偏角方向,E=东W=西
-//      字段12:模式,A=自动,D=差分,E=估测,N=数据无效(3.0协议内容)
-//      字段13:校验值($与*之间的数异或后的值)
+            //  GPRMC编辑
+            //(推荐定位信息数据格式)
+            //例:$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50
+            //字段0:$GPRMC,语句ID,表明该语句为Recommended Minimum Specific GPS/TRANSIT Data(RMC)推荐最小定位信息
+            //字段1:UTC时间,hhmmss.sss格式
+            //字段2:状态,A=定位,V=未定位
+            //字段3:纬度ddmm.mmmm,度分格式(前导位数不足则补0)
+            //字段4:纬度N(北纬)或S(南纬)
+            //字段5:经度dddmm.mmmm,度分格式(前导位数不足则补0)
+            //字段6:经度E(东经)或W(西经)
+            //字段7:速度,节,Knots
+            //字段8:方位角,度
+            //字段9:UTC日期,DDMMYY格式
+            //字段10:磁偏角,(000 - 180)度(前导位数不足则补0)
+            //字段11:磁偏角方向,E=东W=西
+            //字段12:模式,A=自动,D=差分,E=估测,N=数据无效(3.0协议内容)
+            //字段13:校验值($与*之间的数异或后的值)
             String tmplist[] = nmeastr.split(",");
             String utctime = tmplist[1];
             String Lat = tmplist[3];
@@ -240,26 +249,26 @@ public class NMEAListener implements NmeaListener, LocationListener {
 
         } else if (nmeastr.startsWith("$GPGSV,") || nmeastr.startsWith("$GLGSV,") || nmeastr.startsWith("$GAGSV,") || nmeastr.startsWith("$GBGSV,") || nmeastr.startsWith("$BDGSV,")) {
 
-//    GPGSV编辑
-//            (可见卫星信息)
-//    例:$GPGSV,3,1,10,20,78,331,45,01,59,235,47,22,41,069,,13,32,252,45*70
-//    字段0:$GPGSV,语句ID,表明该语句为GPS Satellites in View(GSV)可见卫星信息
-//    字段1:本次GSV语句的总数目(1 - 3)
-//    字段2:本条GSV语句是本次GSV语句的第几条(1 - 3)
-//    字段3:当前可见卫星总数(00 - 12)(前导位数不足则补0)
-//    字段4:PRN 码(伪随机噪声码)(01 - 32)(前导位数不足则补0)
-//    字段5:卫星仰角(00 - 90)度(前导位数不足则补0)
-//    字段6:卫星方位角(00 - 359)度(前导位数不足则补0)
-//    字段7:信噪比(00-99)dbHz
-//    字段8:PRN 码(伪随机噪声码)(01 - 32)(前导位数不足则补0)
-//    字段9:卫星仰角(00 - 90)度(前导位数不足则补0)
-//    字段10:卫星方位角(00 - 359)度(前导位数不足则补0)
-//    字段11:信噪比(00-99)dbHz
-//    字段12:PRN 码(伪随机噪声码)(01 - 32)(前导位数不足则补0)
-//    字段13:卫星仰角(00 - 90)度(前导位数不足则补0)
-////    字段14:卫星方位角(00 - 359)度(前导位数不足则补0)
-////    字段15:信噪比(00-99)dbHz
-//    字段16:校验值($与*之间的数异或后的值)
+            //    GPGSV编辑
+            //            (可见卫星信息)
+            //    例:$GPGSV,3,1,10,20,78,331,45,01,59,235,47,22,41,069,,13,32,252,45*70
+            //    字段0:$GPGSV,语句ID,表明该语句为GPS Satellites in View(GSV)可见卫星信息
+            //    字段1:本次GSV语句的总数目(1 - 3)
+            //    字段2:本条GSV语句是本次GSV语句的第几条(1 - 3)
+            //    字段3:当前可见卫星总数(00 - 12)(前导位数不足则补0)
+            //    字段4:PRN 码(伪随机噪声码)(01 - 32)(前导位数不足则补0)
+            //    字段5:卫星仰角(00 - 90)度(前导位数不足则补0)
+            //    字段6:卫星方位角(00 - 359)度(前导位数不足则补0)
+            //    字段7:信噪比(00-99)dbHz
+            //    字段8:PRN 码(伪随机噪声码)(01 - 32)(前导位数不足则补0)
+            //    字段9:卫星仰角(00 - 90)度(前导位数不足则补0)
+            //    字段10:卫星方位角(00 - 359)度(前导位数不足则补0)
+            //    字段11:信噪比(00-99)dbHz
+            //    字段12:PRN 码(伪随机噪声码)(01 - 32)(前导位数不足则补0)
+            //    字段13:卫星仰角(00 - 90)度(前导位数不足则补0)
+            ////    字段14:卫星方位角(00 - 359)度(前导位数不足则补0)
+            ////    字段15:信噪比(00-99)dbHz
+            //    字段16:校验值($与*之间的数异或后的值)
 
             String tmplist[] = nmeastr.split(",");
             int maxPageCount = 0;
@@ -320,25 +329,25 @@ public class NMEAListener implements NmeaListener, LocationListener {
 
         } else if (nmeastr.startsWith("$GPGGA,") || nmeastr.startsWith("$GNGGA,")) {
 
-//    GPGGA编辑
-//(定位信息)
-//    例:$GPGGA,092204.999,4250.5589,S,14718.5084,E,1,04,24.4,12.2,M,19.7,M,,0000*1F
-//    字段0:$GPGGA,语句ID,表明该语句为Global Positioning System Fix Data(GGA)GPS定位信息
-//    字段1:UTC 时间,hhmmss.sss,时分秒格式
-//    字段2:纬度ddmm.mmmm,度分格式(前导位数不足则补0)
-//    字段3:纬度N(北纬)或S(南纬)
-//    字段4:经度dddmm.mmmm,度分格式(前导位数不足则补0)
-//    字段5:经度E(东经)或W(西经)
-//    字段6:GPS状态,0=不可用(FIX NOT valid),1=单点定位(GPS FIX),2=差分定位(DGPS),3=无效PPS,4=实时差分定位(RTK FIX),5=RTK FLOAT,6=正在估算
-//    字段7:正在使用的卫星数量(00 - 12)(前导位数不足则补0)
-//    字段8:HDOP水平精度因子(0.5 - 99.9)
-//    字段9:海拔高度(-9999.9 - 99999.9)
-//    字段10:单位:M(米)
-//    字段11:地球椭球面相对大地水准面的高度 WGS84水准面划分
-//    字段12:WGS84水准面划分单位:M(米)
-//    字段13:差分时间(从接收到差分信号开始的秒数,如果不是差分定位将为空)
-//    字段14:差分站ID号0000 - 1023(前导位数不足则补0,如果不是差分定位将为空)
-//    字段15:校验值($与*之间的数异或后的值)
+            //    GPGGA编辑
+            //(定位信息)
+            //    例:$GPGGA,092204.999,4250.5589,S,14718.5084,E,1,04,24.4,12.2,M,19.7,M,,0000*1F
+            //    字段0:$GPGGA,语句ID,表明该语句为Global Positioning System Fix Data(GGA)GPS定位信息
+            //    字段1:UTC 时间,hhmmss.sss,时分秒格式
+            //    字段2:纬度ddmm.mmmm,度分格式(前导位数不足则补0)
+            //    字段3:纬度N(北纬)或S(南纬)
+            //    字段4:经度dddmm.mmmm,度分格式(前导位数不足则补0)
+            //    字段5:经度E(东经)或W(西经)
+            //    字段6:GPS状态,0=不可用(FIX NOT valid),1=单点定位(GPS FIX),2=差分定位(DGPS),3=无效PPS,4=实时差分定位(RTK FIX),5=RTK FLOAT,6=正在估算
+            //    字段7:正在使用的卫星数量(00 - 12)(前导位数不足则补0)
+            //    字段8:HDOP水平精度因子(0.5 - 99.9)
+            //    字段9:海拔高度(-9999.9 - 99999.9)
+            //    字段10:单位:M(米)
+            //    字段11:地球椭球面相对大地水准面的高度 WGS84水准面划分
+            //    字段12:WGS84水准面划分单位:M(米)
+            //    字段13:差分时间(从接收到差分信号开始的秒数,如果不是差分定位将为空)
+            //    字段14:差分站ID号0000 - 1023(前导位数不足则补0,如果不是差分定位将为空)
+            //    字段15:校验值($与*之间的数异或后的值)
 
             String tmplist[] = nmeastr.split(",");
             String utctime = tmplist[1];
@@ -349,11 +358,10 @@ public class NMEAListener implements NmeaListener, LocationListener {
             String fixed = tmplist[6];
             String usedStarts = tmplist[7];
             String hdop = tmplist[8];
-
+            String altitude = tmplist[9];
+            ICLogger.d("altitude ==> " + altitude);
 
             if ((fixed.trim().equals("1")) || (fixed.trim().equals("2")) || (fixed.trim().equals("6"))) {
-
-
                 // 转换GPS坐标为度,以便在各种应用中可以方便查找。
                 try {
                     latitude = Double.valueOf(Lat);
@@ -361,7 +369,6 @@ public class NMEAListener implements NmeaListener, LocationListener {
                 } catch (Exception e) {
                 }
                 // 转换单位,从分转换到度
-
                 double intdu = (int) (longitude / 100f); //小数转换到分为单位
                 double du = (longitude - intdu * 100) / 60f;
                 double last = intdu + du;
@@ -373,12 +380,17 @@ public class NMEAListener implements NmeaListener, LocationListener {
 
                 // 经纬度 保留4位小数点
                 DecimalFormat df = new DecimalFormat("#.0000000");
-                String strLatitude = df.format(latitude);
-                String strLongitude = df.format(longitude);
+                strLatitude = df.format(latitude);
+                strLongitude = df.format(longitude);
 
                 //定位
                 StringBuilder sb = new StringBuilder();
-                sb.append("GPGGA, location time= " + TimeUtil.getLocalTime() + ", FixedCount=" + locationFixedCount + ", GPSTime=" + utctime + ", Lat(" + latname + ")=" + Lat + " (" + strLatitude + "), Lon(" + lonname + ")=" + lon + " (" + strLongitude + "), fixed=" + fixed + ", hdop=" + hdop + ", usedStarts=" + usedStarts);
+                sb.append("GPGGA, location time= " + TimeUtil.getLocalTime() +
+                        ", FixedCount=" + locationFixedCount + ", " +
+                        "GPSTime=" + utctime + ", Lat(" + latname + ")=" + Lat +
+                        " (" + strLatitude + "), Lon(" + lonname + ")=" +
+                        lon + " (" + strLongitude + "), fixed=" + fixed +
+                        ", hdop=" + hdop + ", usedStarts=" + usedStarts);
                 ICLogger.i(sb.toString());
                 if (Config.LOG_TOFILE)
                     ICLogger.logToFile("GPS", sb.toString());
@@ -387,8 +399,9 @@ public class NMEAListener implements NmeaListener, LocationListener {
                     locationFixedCount++;
                 } else {
                     ICLogger.i("HDOP is larger than " + ICLocation.MAX_HDOP + " , skip this location!");
-                    if (Config.LOG_TOFILE)
+                    if (Config.LOG_TOFILE) {
                         ICLogger.logToFile("GPS", "HDOP is larger than " + ICLocation.MAX_HDOP + " , skip this location!");
+                    }
                 }
                 if (locationFixedCount > MaxFixedTimes) {
                /*
@@ -462,7 +475,22 @@ public class NMEAListener implements NmeaListener, LocationListener {
 
     @Override
     public void onLocationChanged(Location location) {
-
+        ICLogger.d("location 变化...");
+        float bearing = location.getBearing();
+        runtime.getLocationInstance().getLocation().bearing = bearing;
+        ICLogger.d("bearing==> " + bearing);
+        double altitude = location.getAltitude();
+        runtime.getLocationInstance().getLocation().altitude = altitude;
+        ICLogger.d("altitude==> " + altitude);
+        //设置到runtime中
+        double latitude = location.getLatitude();
+        runtime.getLocationInstance().getLocation().lat = latitude;
+        double longitude = location.getLongitude();
+        runtime.getLocationInstance().getLocation().lon = longitude;
+        ICLogger.d("latitude == > " + latitude + " longitude==> " + longitude);
+        float speed = location.getSpeed();
+        runtime.getLocationInstance().getLocation().speed = speed;
+        ICLogger.d("speed==> " + speed);
     }
 
     public void onStatusChanged(String paramString, int paramInt, Bundle paramBundle) {
@@ -552,15 +580,19 @@ public class NMEAListener implements NmeaListener, LocationListener {
 
     public boolean startListen() {
 
-        if (this.listening == false) {
+        if (!listening) {
             Settings.Secure.setLocationProviderEnabled(runtime.getContextProxy().getResolver(), GPS_PROVIDER, true);
 
             runtime.getLocationInstance().setLocationStat(ICLocation.LOCATION_STAT.LOCATION_OPEN);
 
             Criteria criteria = new Criteria();
             criteria.setAccuracy(Criteria.ACCURACY_FINE);// 设置为最大精度
-            criteria.setAltitudeRequired(false);//不要求海拔信息
-            criteria.setBearingRequired(false);// 不要求方位信息
+            //by TrillGates,S123的协议需要海拔和方位信息
+            //所以修改一下这个
+            //criteria.setAltitudeRequired(false);//不要求海拔信息
+            criteria.setAltitudeRequired(true);//不要求海拔信息
+            //criteria.setBearingRequired(false);// 不要求方位信息
+            criteria.setBearingRequired(true);// 不要求方位信息
             criteria.setCostAllowed(true);//是否允许付费
             criteria.setPowerRequirement(Criteria.POWER_LOW);// 对电量的要求
 
@@ -581,7 +613,7 @@ public class NMEAListener implements NmeaListener, LocationListener {
             searchCout = 0;
             locationFixedCount = 0;
             gpsMode = GPS_CURRENT_STATUS.GPS_LISTENING;
-//      locationManager.addGpsStatusListener(statusListener);//监听搜星状态
+            //locationManager.addGpsStatusListener(statusListener);//监听搜星状态
             locationManager.addNmeaListener(this); //监听NMEA 协议数据。
 
             //做个热启动
index 45ee3d8..b77cf97 100644 (file)
@@ -58,9 +58,10 @@ public class ICLocation {
         public String lat_name;\r
         public String lon_name;\r
         public float hdop;\r
+        public float bearing;\r
+        public double altitude;\r
     }\r
 \r
-\r
     public static class GPS_locationStatus {\r
         public List<GpsSatellitePriv> numSatelliteList = new ArrayList<GpsSatellitePriv>(); // 卫星信号\r
         public int used_gps_numbs;\r
index 3913ee3..a7434c0 100644 (file)
@@ -1126,17 +1126,45 @@ public class Runtime {
     /*  AP01 定位       */
 
 
-    public double temperature_adjustValue = 0.0f;
-
     public boolean isGPSFixed() {
         return (gpsp.getLocationStat() == ICLocation.LOCATION_STAT.LOCATION_FIXED);
     }
 
-    public String getGPSData() {
+    public String getS123GpsData() {
+        StringBuilder sb = new StringBuilder();
+        ICLogger.d("isGPSFixed() ==> " + isGPSFixed());
+        if (isGPSFixed()) {
+            sb.append("A").append(",");
+            String latGPSStr = gpsp.getLocation().latGPSStr;
+            String lonGPSStr = gpsp.getLocation().lonGPSStr;
+            float hdop = gpsp.getLocation().hdop;
+            float speed = gpsp.getLocation().speed;
+            float getheading = gpsp.getLocation().heading;
+            float bearing = gpsp.getLocation().bearing;
+            float altitude = (float) gpsp.getLocation().altitude;
+            ICLogger.d("getheading ==> " + getheading);
+            ICLogger.d("hdop==> " + hdop);
+            ICLogger.d("speed==> " + hdop);
+            ICLogger.d("gpsp.getLocation().latGPSStr==> " + latGPSStr);
+            ICLogger.d("gpsp.getLocation().lonGPSStr==> " + lonGPSStr);
+            sb.append(latGPSStr);
+            sb.append(",");
+            sb.append(lonGPSStr);
+            sb.append(",").append(hdop);
+            sb.append(",").append(speed);
+            sb.append(",").append(bearing);
+            sb.append(",").append(altitude);
+        } else {
+            sb.append("V").append(",").append("0,0,0,0,0,0");
+        }
+        ICLogger.d("s123 gsp data==> " + sb.toString());
+        return sb.toString();
+    }
 
-//        2232.9806N11404.9355E000.1: 北纬22度32.9806分,东经114度04.9355分,速度为000.1 km/h,如经纬度无效,可默认全为0,如0000.0000N00000.0000E
-//        纬度格式为: ddmm.mmmm ,长度不足长度前补0
-//        经度格式为:dddmm.mmmm,长度不足前补0
+    public String getGPSData() {
+        //2232.9806N11404.9355E000.1: 北纬22度32.9806分,东经114度04.9355分,速度为000.1 km/h,如经纬度无效,可默认全为0,如0000.0000N00000.0000E
+        //纬度格式为: ddmm.mmmm ,长度不足长度前补0
+        //经度格式为:dddmm.mmmm,长度不足前补0
         StringBuilder sb = new StringBuilder();
         int lati = (int) gpsp.getLocation().lat;
         int latl = (int) ((gpsp.getLocation().lat - lati) * 10000);
@@ -1161,22 +1189,21 @@ public class Runtime {
             sb.append("V").append(gpsStr);
         }
 
-
         return sb.toString();
     }
 
     public String getMqttGPSData() {
 
-/***
- * A,22.570733,N,113.8626083,E,0.00,249.5,0.0,6
- * A,gps 定位有效
- * 22.570733,纬度 N,
- * 113.8626083,经度 E,
- * 0.00,速度
- * 249.5,方向
- * 0.0,海拔
- * 6,卫星个数
- */
+        /***
+         * A,22.570733,N,113.8626083,E,0.00,249.5,0.0,6
+         * A,gps 定位有效
+         * 22.570733,纬度 N,
+         * 113.8626083,经度 E,
+         * 0.00,速度
+         * 249.5,方向
+         * 0.0,海拔
+         * 6,卫星个数
+         */
         StringBuilder sb = new StringBuilder();
         int speedi = (int) gpsp.getLocation().speed;
         int speedl = (int) ((gpsp.getLocation().speed - speedi) * 100);
@@ -1210,16 +1237,16 @@ public class Runtime {
 
     public String getFZDGPSData() {
 
-/***
- * A,22.570733,N,113.8626083,E,0.00,249.5,0.0,6
- * A,gps 定位有效
- * 22.570733,纬度 N,
- * 113.8626083,经度 E,
- * 0.00,速度
- * 249.5,方向
- * 0.0,海拔
- * 6,卫星个数
- */
+        /***
+         * A,22.570733,N,113.8626083,E,0.00,249.5,0.0,6
+         * A,gps 定位有效
+         * 22.570733,纬度 N,
+         * 113.8626083,经度 E,
+         * 0.00,速度
+         * 249.5,方向
+         * 0.0,海拔
+         * 6,卫星个数
+         */
         StringBuilder sb = new StringBuilder();
         int speedi = (int) gpsp.getLocation().speed;
         int speedl = (int) ((gpsp.getLocation().speed - speedi) * 100);
@@ -1289,7 +1316,7 @@ public class Runtime {
 
     //AP03 用的多基站定位数据
     public String getLBSMultiStationData() {
-        //        7: 表示共有7组基站
+        // 7: 表示共有7组基站
 //        460: MCC 国家码
 //        0: MNC运营商代码
 //        9520|3671|10: LAC|CID|dbm表示一组基站信息,后面数量需和基站组数地应  10:dbm为信号强度多基站信号强度建议从高到低排列后上传,信号强度转正数:150 – abs(dbm)
@@ -1320,12 +1347,10 @@ public class Runtime {
     }
 
     public String getLBSData() {
-
 //        460,0,9520,3671 : LBS基站数据,MCC国家码,460为中国,0:MNC,0为移动,9520:LAC,十进制,3671,CID,十进制
         StringBuilder sb = new StringBuilder();
         sb.append(gpsp.getMCC()).append(",")
                 .append(gpsp.getMNC()).append(",")
-
                 .append(gpsp.getLAC()).append(",")
                 .append(gpsp.getGSMStationCID());
         return sb.toString();
diff --git a/app/src/main/java/com/enqualcomm/support/service/SignFlagObserver.java b/app/src/main/java/com/enqualcomm/support/service/SignFlagObserver.java
new file mode 100644 (file)
index 0000000..8282e65
--- /dev/null
@@ -0,0 +1,41 @@
+package com.enqualcomm.support.service;
+
+import android.content.ContentResolver;
+import android.database.ContentObserver;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Handler;
+
+import com.enqualcomm.support.provider.ICGlobalSettingsProvider;
+import com.enqualcomm.support.utils.ICLogger;
+import com.ic.protocols.protocolAPIHelper;
+
+public class SignFlagObserver extends ContentObserver {
+
+    private final Handler mHandler;
+    private final ContentResolver mResolver;
+
+    public SignFlagObserver(Handler handler, ContentResolver resolver) {
+        super(handler);
+        this.mHandler = handler;
+        this.mResolver = resolver;
+    }
+
+    @Override
+    public void onChange(boolean selfChange) {
+        ICLogger.d("SignFlagObserver on value change...");
+        mHandler.post(() -> {
+            Cursor query = mResolver.query(Uri.parse(ICGlobalSettingsProvider.SETTINGS),
+                    new String[]{"s_value"}, "s_key=?", new String[]{"sign_action_flag"}, null);
+            String value = "-1";
+            if (query != null) {
+                if (query.moveToNext()) {
+                    value = query.getString(0);
+                    //value有none的值,有-1的值,有id的值
+                }
+                query.close();
+            }
+            protocolAPIHelper.sendSignMsg(value);
+        });
+    }
+}
index 8677024..63c7316 100644 (file)
@@ -141,6 +141,28 @@ public class protocolAPIHelper {
         }
     }
 
+    public static void sendSignMsg(String value) {
+        switch (Config.protocol_no) {
+            case Config.PROTOCOL_JIAI:
+                break;
+            case Config.PROTOCOL_BEEHOME:
+                break;
+            case Config.PROTOCOL_IC:
+                break;
+            case Config.PROTOCOL_FZD:
+                break;
+            case Config.PROTOCOL_MQTT:
+                break;
+            case PROTOCOL_ANAN:
+                break;
+            case Config.PROTOCOL_S123:
+                protocols123_handler.sendSignMsg(value);
+                break;
+            case Config.PROTOCOL_GATOR:
+                break;
+        }
+    }
+
     /*
        返回true 表示 cmd 全部解析成功
        返回false表示 cmd至少有一条解析失败,失败的数据归入buffer,下一次识别接着使用
index 14d3010..7c75656 100644 (file)
@@ -6,6 +6,7 @@ import android.content.ContentResolver;
 import android.content.ContentValues;
 import android.content.Context;
 import android.content.Intent;
+import android.database.Cursor;
 import android.media.AudioManager;
 import android.net.Uri;
 import android.os.Environment;
@@ -98,6 +99,81 @@ public class protocol_s123 {
         mConnection.send(APFX(mRuntime));
     }
 
+    /**
+     * 发送签到信息
+     *
+     * @param value
+     */
+    public void sendSignMsg(String value) {
+        ICLogger.d("value ==> " + value);
+        //如果是-1,那么是空消息
+        //如果是其他数字,通过id去查询即可
+        if (!"none".equals(value)) {
+            //先查询出内容,再组装数据
+            ContentResolver resolver = mRuntime.getContextProxy().getResolver();
+            Cursor query = resolver.query(Uri.parse(ShootTextProvider.SHOOT_TEXT),
+                    new String[]{ICDatabaseHelper.shoot_value},
+                    ICDatabaseHelper.shoot_id + "=?",
+                    new String[]{value}, null);
+            String contentValue = "";
+            if (query != null) {
+                if (query.moveToNext()) {
+                    //要判断数据是否为空
+                    contentValue = query.getString(0);
+                }
+                query.close();
+            }
+            //组装数据
+            //IWAPRP,080524, 102533,128,36.6,88,120,90,90,XXXXXXXX,
+            // A,22.567898,113.1234567, 50,5,61, 120, wgs84, 99, 20, 460, 0,
+            // 9520|3671|-54&9521|3675|-53,
+            // Home|74-DE-2B-44-88-8C|97&
+            // Home1|74-DE-2B-44-88-8C|97&
+            // Home2|74-DE-2B-44-88-8C|97&
+            // Home3|74-DE-2B-44-88-8C|97
+            //IW标识符
+            //APAL:命令字
+            //080524: 2008 年05 月24
+            //102533: 10点25分33秒
+            //128: 步数
+            //36.6: 体温
+            //88: 心率
+            //120:  收缩压
+            //90: 舒张压
+            //90: 电池电量 0~100
+            mConnection.send(APRP(contentValue));
+        }
+    }
+
+    public StringMessage APRP(String msg) {
+        int step = mRuntime.getTotalStepCount();
+        double temp = mRuntime.tempInfo.currentBodyTemp;
+        int heartRate = mRuntime.getHRS().getPPG();
+        int lowPressure = mRuntime.getHRS().getBPL();
+        int highPressure = mRuntime.getHRS().getBPH();
+        int batteryLev = mRuntime.getBatterylevel();
+        //定位数据
+        // String s123GpsData = mRuntime.getS123GpsData();
+        return genStringMessage(cmdMap.get(CMD_TYPE.APRP),
+                new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APRP))
+                        .append(TimeUtil.getSystemDateYYMMDD())
+                        .append(CMDSPLIT).append(TimeUtil.getSystemTimeHHmmss())
+                        .append(CMDSPLIT).append(step)
+                        .append(CMDSPLIT).append(temp)
+                        .append(CMDSPLIT).append(heartRate)
+                        .append(CMDSPLIT).append(lowPressure)
+                        .append(CMDSPLIT).append(highPressure)
+                        .append(CMDSPLIT).append(batteryLev)
+                        .append(CMDSPLIT).append(msg)
+                        .append(CMDSPLIT).append(mRuntime.getS123GpsData())
+                        .append(CMDSPLIT).append("wgs84")//原始经纬度
+                        .append(CMDSPLIT).append(mRuntime.getSignalStrength())
+                        .append(CMDSPLIT).append(mRuntime.getBatterylevel())
+                        .append(CMDSPLIT).append(mRuntime.getLBSData())
+                        .append(CMDSPLIT).append(mRuntime.getWifiInfo())
+                        .append(CMDEND).toString());
+    }
+
     public enum CMD_TYPE {
         /*终端发起*/
         AP00,//登录包
@@ -128,6 +204,8 @@ public class protocol_s123 {
         BPCH,
         APBR,//上传蓝牙扫描结果
         BPBR,
+        APRP,//签到信息上传
+        BPRP,
         /* 服务器发起*/
         AP12,
         BP12,//SOS 号码设置
@@ -268,6 +346,8 @@ public class protocol_s123 {
         cmdMap.put(CMD_TYPE.APBR, "APBR");
         cmdMap.put(CMD_TYPE.BPBR, "BPBR");
         cmdMap.put(CMD_TYPE.APGJ, "APGJ");
+        cmdMap.put(CMD_TYPE.APRP, "APRP");
+        cmdMap.put(CMD_TYPE.BPRP, "BPRP");
         /* 服务器发起*/
         cmdMap.put(CMD_TYPE.AP12, "AP12");
         cmdMap.put(CMD_TYPE.BP12, "BP12");
@@ -517,6 +597,7 @@ public class protocol_s123 {
     /**/
     public static StringMessage genStringMessage(String cmdName, String msg) {
         //设置cmdName,在这里配置进去的msg没有实际用到
+        ICLogger.d("msg == > " + msg);
         StringMessage sm = new StringMessage(new String[]{cmdName, msg});
         //用此函数设置要发送的内容
         sm.refresh(msg);
@@ -552,7 +633,7 @@ public class protocol_s123 {
         /**
          * 如果解析出来的cmdlist不是空,且数据不是完整cmd则保留 最后一条数据到last_inCompletecmd
          */
-        if (cmdlist.length > 0 && iscmdComplete == false) {
+        if (cmdlist.length > 0 && !iscmdComplete) {
             listlen -= 1;
             last_inCompletecmd = cmdlist[listlen];
             ICLogger.d("cmd not complete , " + last_inCompletecmd);
@@ -563,7 +644,6 @@ public class protocol_s123 {
                     ICLogger.d("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key) + " ,  " + cmdlist[i]);
                     if (key == CMD_TYPE.BP28) {
                         //如果是BP28则 后面的数据是音频,需要保留
-                        byte[] amrBuf;
                         int amrLen = getBP28Amrlen(cmdlist[i]);
                         if (bytes.length > amrLen) {
                             handleCmd(key, cmdlist[i], bytes);
@@ -723,7 +803,9 @@ public class protocol_s123 {
          * 00:第一个0:是否需要回复地址信息,0:不回复,1回复.
          * HOME|74-DE-2B-44-88-8C|97&HOME1|74-DE-2B-44-88-8C|97&HOME2|74-DE-2B-44-88-8C|97&HOME3|74-DE-2B-44-88-8C|97#
          */
-        return genStringMessage(cmdMap.get(CMD_TYPE.AP10), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP10)).append(TimeUtil.getShortDate())
+        return genStringMessage(cmdMap.get(CMD_TYPE.AP10), new StringBuffer(CMDHEADER)
+                .append(cmdMap.get(CMD_TYPE.AP10))
+                .append(TimeUtil.getShortDate())
                 .append(ds.getGPSData()).append(TimeUtil.getShortTime()).append(ds.getGPSHeading())
                 .append(String.format("%03d", abs(ds.getSignalStrength())))
                 .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append("0")
@@ -3563,6 +3645,10 @@ public class protocol_s123 {
                 ICLogger.d("服务器收到飞行模式打开请求.");
                 handleBPFX();
                 break;
+            case BPRP:
+                ICLogger.d("服务器收到签到信息.");
+                handleBPRP();
+                break;
             case APTM:
                 break;
             case APCH:
@@ -3684,6 +3770,14 @@ public class protocol_s123 {
         return ret;
     }
 
+    /**
+     * 修改配置项的值为success,让UI展示Success
+     */
+    private void handleBPRP() {
+        //UI展示完要重置成none
+        updateSettingValue("sign_action_flag", "success");
+    }
+
     /**
      * 处理飞行模式打开的结果反馈,修改设置项的值
      */