您好,欢迎访问这里是深圳市硕远科技有限公司!
戴尔服务器价格_IBM联想配置_浪潮代理-深圳市硕远科技有限公司
联系我们
戴尔服务器价格_IBM联想配置_浪潮代理-深圳市硕远科技有限公司
邮箱:2324898850@qq.com
电话:400-080-6079
地址:深圳市龙华区河背工业区108创业园A301
当前位置:主页 > 新闻动态 > 企业新闻 >

企业新闻

Android获取系统S/N序列号_实现在springboot服务端_设

发布时间:2022-08-06 20:03:06浏览次数:

android项目做好了,以后,所有pad设备,在springboot服务后端,需要实现监控,那么,这个时候就需要保活机制,这个保活机制,可以让服务端,实时监控,所有的pad设备的,工作状态.

实现思路:每个设备都有个唯一的 s/n 序列号,我们可以在android,端做个服务,或者,一个

Timer,每隔几秒,就发送保活数据,这个数据中包含sn序列号,给服务器端,让服务器端,知道该设备

是状态是可用状态,如果服务端长时间,收不到该设备的保活信息,就证明该设备可能已经关机,或者

我们的软件没有运行,或者设备故障.

1.先看如何来获取设备序列号,这个获取方式,每种设备有所不同,比如华为的平板的S/N,通过

这种方式就无法解析出来,我们用的是联想小新Pad:是可以的:

try {
                final String serialnoStr = "[ro.odm.lenovo.gsn]";
                Process p = Runtime.getRuntime().exec("getprop");
                p.waitFor();
                BufferedReader stdInput = new BufferedReader(new InputStreamReader(
                        p.getInputStream()));
                String temp = "";
                while ((temp = stdInput.readLine()) != null) {
                    if (temp.contains(serialnoStr)) {
                        temp.replaceAll(" ", "");
                        int index = temp.indexOf(serialnoStr);
                        temp = temp.substring(index + 20);
                        temp = temp.substring(1, temp.length() - 1);
                        Log.d("getSerialnoNumbers", temp);
                        temp = temp.replaceAll("\\[","");

                        //1.首先获取了联想小新pad的,序列号.
                        
                        //2.然后把序列号保存到,配置文件中:unique_sn
                        saveConfigValue("unique_sn", String.valueOf(temp));

                        //3.然后,我们去配置文件获取序列号,看有没有,如果有,弹出显示获取到的
                        //序列号
                        String sn = GetConfigValue.getConfigProperties("unique_sn");
                        if(StringUtils.isNotEmpty(sn)){
                            Toast.makeText(this,"当前设备序列号为:"+sn,Toast.LENGTH_LONG).show();
                            //ToastUtils.toast(CommonSettingActivity.this, "当前设备序列号为:"+sn);
                        }else{
                            //4.如果没有序列号,就弹出找到序列号,然后把序列号保存到配置文件中
                            //5.然后再弹出显示找到的序列号
                            //SnowFlakeIdWorker idWorker = new SnowFlakeIdWorker(1, 0);
                            //long snum = idWorker.nextId();
                            saveConfigValue("unique_sn", String.valueOf(temp));
                            Toast.makeText(this,"当前设备序列号为:"+String.valueOf(temp),Toast.LENGTH_LONG).show();
                            //ToastUtils.toast(CommonSettingActivity.this, "当前设备序列号为:"+String.valueOf(snum));
                        }


// Message msg = new Message();
// msg.obj = temp;
// mHandler.sendMessage(msg);
                        break;
                    }else{
                        Log.d("getSerialnoNumbers1:", temp);
                    }
                }

2.如果通过上面的方式没有找到序列号,说明就不是联想小新的pad,那么这时候,我们可以,自己利用

雪花算法,获取一个设备编码: 这样保证所有的设备都有自己的设备编码,因为这里,我们项目要求

统一使用,联想小新的pad,所以不存在,找不到序列号的情况,这里做个保守逻辑.

    if(StringUtils.isEmpty(temp)){
                    //1.去配置文件获取序列号,
                    String sn = GetConfigValue.getConfigProperties("unique_sn");
                    if(StringUtils.isNotEmpty(sn)){ //2.如果获取到序列号就显示
                        Toast.makeText(this,"当前设备序列号为:"+sn,Toast.LENGTH_LONG).show();
                        //ToastUtils.toast(CommonSettingActivity.this, "当前设备序列号为:"+sn);
                    }else{//3.如果没有获取到序列号就生成一个,然后保存,然后再显示.
                        SnowFlakeIdWorker idWorker = new SnowFlakeIdWorker(1, 0);
                        long snum = idWorker.nextId();
                        saveConfigValue("unique_sn", String.valueOf(snum));
                        Toast.makeText(this,"当前设备序列号为:"+String.valueOf(snum),Toast.LENGTH_LONG).show();
                        //ToastUtils.toast(CommonSettingActivity.this, "当前设备序列号为:"+String.valueOf(snum));
                    }
                }

3.上面用到的,保存到配置文件中的工具方法这里再贴一遍,之前有贴过,关于配置文件使用的文章

从配置文件中获取值:

package com.baidu.idl.main.facesdk.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Properties;

public class GetConfigValue {
    public static boolean isFileExists = false;
    public static Properties props = new Properties();

    public static String getConfigProperties(String key) {
       String result = "";
       try {
           String configPath = "/data/data/com.baidu.idl.face.demo/audiofile/config.properties";
           File file = new File(configPath);

           if(file.exists()){
               isFileExists =true;
           }else{
               isFileExists =false;
               result = "noFile";
               return  result;
           }

           //初始化配置文件
           String configValue = "";
           InputStream inputStream = new FileInputStream(configPath);
           props.load(inputStream);
           configValue=props.getProperty(key);
           return configValue;

       } catch (Exception e1) {
           e1.printStackTrace();
           return "exception";
       } finally {

       }
    }
}

4.然后保存文件:

 //修改properties文件
    private String saveConfigValue(String key, String value) {
        try {
            copyDbFile(CommonSettingActivity.this, "config.properties");
            String configPath = "/data/data/" + CommonSettingActivity.this.getPackageName() + "/audiofile/config.properties";
            InputStream inputStream = new FileInputStream(configPath);
            //初始化配置文件
            Properties props = new Properties();
            props.load(inputStream);

           
            props.setProperty(key, value);
           
            File file = new File(configPath);
            OutputStream fos = new FileOutputStream(file);
            props.store(fos, "Update '" + key + "' value");
            fos.flush();
            return value;
        } catch (Exception e1) {
            ToastUtils.toast(CommonSettingActivity.this, "配置信息保存失败");
            return "-1";
        } finally {

        }
    }

5.上面的代码可以根据自己需要稍加修改,下面是上面代码中需要的方法

  private void copyDbFile(Context context, String fileName) {
        InputStream in = null;
        FileOutputStream out = null;
        String path = "/data/data/" + context.getPackageName() + "/audiofile/";
        File file = new File(path + fileName);

        //创建文件夹
        File filePath = new File(path);
        if (!filePath.exists())
            filePath.mkdirs();

        if (file.exists())
            return;
        try {
            in = context.getAssets().open(fileName); // 从assets目录下复制
            out = new FileOutputStream(file);
            int length = -1;
            byte[] buf = new byte[1024];
            while ((length = in.read(buf)) != -1) {
                out.write(buf, 0, length);
            }
            out.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (in != null) in.close();
                if (out != null) out.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }

6.然后上面部分,获取到序列号以后,保活的时候,再把序列号发给springboot服务器端,去验证就可以了,这里可以用okhttpclient去发送请求,也可以用安卓原生HttpURLConnection 也可以.

可以开启一个服务,每隔几秒钟发送保活信息,也可以用timer,发送保活信息.

400-080-6079