Quellcode durchsuchen

硅基动感科研版 1.0

Kot vor 1 Jahr
Ursprung
Commit
4eb21cd41f
3 geänderte Dateien mit 206 neuen und 1 gelöschten Zeilen
  1. 2 1
      README.md
  2. 133 0
      docs/aps/cgms/sisensing/AESUtils3.java
  3. 71 0
      docs/aps/cgms/sisensing/硅基动感科研版.md

+ 2 - 1
README.md

@@ -1,3 +1,4 @@
 # 对接文档
 
-- [儿童手表数据对接-硅基动感](./docs/wear/sgtc/%E5%84%BF%E7%AB%A5%E6%89%8B%E8%A1%A8%E8%A1%A8%E7%9B%98%E6%95%B0%E6%8D%AE%E5%AF%B9%E6%8E%A5.md)
+- [儿童手表数据对接-硅基动感](./docs/wear/sgtc/%E5%84%BF%E7%AB%A5%E6%89%8B%E8%A1%A8%E8%A1%A8%E7%9B%98%E6%95%B0%E6%8D%AE%E5%AF%B9%E6%8E%A5.md)
+- [AAPS 接入 硅基动感科研版](./docs/aps/cgms/sisensing/%E7%A1%85%E5%9F%BA%E5%8A%A8%E6%84%9F%E7%A7%91%E7%A0%94%E7%89%88.md)

+ 133 - 0
docs/aps/cgms/sisensing/AESUtils3.java

@@ -0,0 +1,133 @@
+package com.sibionics.sisensingcgm.utils.utils;
+
+/**
+ * Created on 2022/06/2022/6/23 14:35.
+ * packageName:com.sibionics.sisensingcgm.utils.utils
+ * description:
+ *
+ * @author: caitiangui
+ */
+import java.io.UnsupportedEncodingException;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.SecretKeySpec;
+
+public class AESUtils3 {
+    /*   算法/模式/填充 */
+    private static final String CipherMode = "AES/ECB/PKCS5Padding";
+
+    /*  创建密钥  */
+    private static SecretKeySpec createKey(String password) {
+        byte[] data = null;
+        if (password == null) {
+            password = "";
+        }
+        StringBuffer sb = new StringBuffer(32);
+        sb.append(password);
+        while (sb.length() < 32) {
+            sb.append("0");
+        }
+        if (sb.length() > 32) {
+            sb.setLength(32);
+        }
+
+        try {
+            data = sb.toString().getBytes("UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        return new SecretKeySpec(data, "AES");
+    }
+
+    /* 加密字节数据  */
+    public static byte[] encrypt(byte[] content, String password) {
+        try {
+            SecretKeySpec key = createKey(password);
+            System.out.println(key);
+            Cipher cipher = Cipher.getInstance(CipherMode);
+            cipher.init(Cipher.ENCRYPT_MODE, key);
+            byte[] result = cipher.doFinal(content);
+            return result;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /*加密(结果为16进制字符串)  */
+    public static String encrypt(String content, String password) {
+        byte[] data = null;
+        try {
+            data = content.getBytes("UTF-8");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        data = encrypt(data, password);
+        String result = byte2hex(data);
+        return result;
+    }
+
+    /*解密字节数组*/
+    public static byte[] decrypt(byte[] content, String password) {
+        try {
+            SecretKeySpec key = createKey(password);
+            Cipher cipher = Cipher.getInstance(CipherMode);
+            cipher.init(Cipher.DECRYPT_MODE, key);
+            byte[] result = cipher.doFinal(content);
+            return result;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /*解密16进制的字符串为字符串  */
+    public static String decrypt(String content, String password) {
+        byte[] data = null;
+        try {
+            data = hex2byte(content);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        data = decrypt(data, password);
+        if (data == null) return null;
+        String result = null;
+        try {
+            result = new String(data, "UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        return result;
+    }
+
+    /*字节数组转成16进制字符串  */
+    public static String byte2hex(byte[] b) { // 一个字节的数,
+        StringBuffer sb = new StringBuffer(b.length * 2);
+        String tmp = "";
+        for (int n = 0; n < b.length; n++) {
+            // 整数转成十六进制表示
+            tmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
+            if (tmp.length() == 1) {
+                sb.append("0");
+            }
+            sb.append(tmp);
+        }
+        return sb.toString().toUpperCase(); // 转成大写
+    }
+
+    /*将hex字符串转换成字节数组 */
+    private static byte[] hex2byte(String inputString) {
+        if (inputString == null || inputString.length() < 2) {
+            return new byte[0];
+        }
+        inputString = inputString.toLowerCase();
+        int l = inputString.length() / 2;
+        byte[] result = new byte[l];
+        for (int i = 0; i < l; ++i) {
+            String tmp = inputString.substring(2 * i, 2 * i + 2);
+            result[i] = (byte) (Integer.parseInt(tmp, 16) & 0xFF);
+        }
+        return result;
+    }
+}
+

+ 71 - 0
docs/aps/cgms/sisensing/硅基动感科研版.md

@@ -0,0 +1,71 @@
+# AAPS -> 硅基动感科研版
+*v1.0*
+
+### 示例:
+
+```java
+Intent intent = new Intent();
+intent.setAction(Action);
+intent.setClassName(PackageName,ClassName)
+intent.putExtra("data",data);
+Context.sendBroadcast(intent);
+```
+
+#### 参数 :
+
+- ACTION
+    - 类型:String 常量
+    - 区分大小写
+    - 值:com.sisensing.cgm.EXTRA_BG
+
+- PackageName
+    - 类型:String 常量
+    - 区分大小写
+    - 值:info.nightscout.androidaps
+
+ - ClassName
+    - 类型:String 常量
+    - 区分大小写
+    - 值:info.nightscout.androidaps.receivers.DataReceiver
+
+ - data
+    - 类型:String  
+    - 区分大小写
+    - 值:AES 加密的 Json
+
+### 解密数据包:
+```java
+String aeskey ="password";
+String data = AESUtils3.encrypt(json, aeskey); //加密
+String json = AESUtils3.decrypt(data, aeskey); //解密
+```
+- 测试密钥:5zsSIo3VvNMVaSxQXUmpedvs6EnHmEeqhJJdzFKBpJ8=
+- [AESUtils3](./AESUtils3.java)
+
+### JSON结构:
+
+```json
+    {
+        "time":12131231,
+        "bg":5.6,
+        "trend":-2
+    }
+```
+
+#### 字段解析:
+- time
+    - 类型:时间戳
+    - 描述:血糖的时间戳,单位毫秒。
+
+- bg
+    - 类型:浮点
+    - 描述:血糖值,单位mmol/L
+
+- trend
+    - 类型:整型
+    - 描述:血糖当前趋势(枚举值)
+         - 2:较快上升,箭头向上
+         - 1:缓慢上升,箭头斜向上
+         - 0:平稳,箭头平指
+         - -1:缓慢下降,箭头斜向下
+         - -2:较快下降,箭头向下