zoukankan      html  css  js  c++  java
  • 项目01-手机端模块

    项目01-手机端模块

    1、项目描述

    2、术语说明

    • App
      手机应用程序

    • App开发商
      开发App的企业和个人

    • 用户

      安装了App的人员。

    • 数据服务商

      提供数据服务的企业。

    • 数据服务平台

      数据服务商的产品。

    • 租户

      租用了数据服务商的App开发商

    • 云版

      数据服务商部署自己的数据服务平台到云中。

    • 企业版

      数据服务商出售数据服务平台系统给第三方,第三方部署该平台到自己的集群上,其中SDK(数据收集模块)收集日志的地址是自己的服务地址。

    • 上报日志策略

      • 启动上报

        用户使用app的行为,存在本地端,通常是json格式。启动app时,上报数据

      • 退出上报

        app退出时上报

      • 周期上报

        每个多长时间上报一次。

    3、日志类型

    日志类型供分为5中类型,分别是:

    • 公共日志信息

      公共日志信息时每种日志都会涉及的信息,比如appid、版本、渠道、平台等信息。

      //日志基础类
      public class AppBaseLog {
        private Long createdAtMs;           //日志创建时间
        private String appId;               //应用唯一标识
        private String tenantId;            //租户唯一标识,企业用户
        private String deviceId;            //设备唯一标识
        private String appVersion;          //版本
        private String appChannel;          //渠道,安装时就在清单中制定了,appStore等。
        private String appPlatform;         //平台
        private String osType;              //操作系统
        private String deviceStyle;         //机型
        //getter/setter
      }
      
    • 启动日志

      public class AppStartupLog extends AppBaseLog{
        private String country;			//国家,终端不用上报,服务器自动填充该属性
        private String province;          //省份,终端不用上报,服务器自动填充该属性
        private String ipAddress;         //ip地址
      
        private String network;           //网络
        private String carrier;           //运营商
      
        private String brand;             //品牌
        private String screenSize;        //分辨率
      }
      

    • 事件日志

      public class AppEventLog extends AppBaseLog {
        private String eventId;            				//事件唯一标识
        private Long eventDurationSecs;    				//事件持续时长
        private Map<String, String> paramKeyValueMap;   	//参数名/值对
        //getter/setter
      }
      

    • 页面日志

      public class AppPageLog extends AppBaseLog {
        private int pageViewCntInSession = 0;
        private String pageId;      				//页面id
        private int visitIndex = 0;    			//访问顺序号,0为第一个页面
        private String nextPage;    				//下一个访问页面,空表示为退出应用的页面
        private Long stayDurationSecs = (long) 0; //当前页面停留时长
        //getter/setter
      }
      

    • 错误日志

      public class AppErrorLog extends AppBaseLog {
        private String errorBrief;        //错误摘要
        private String errorDetail;       //错误详情
        //getter/setter
      }
      

    • 使用日志

      public class AppUsageLog extends AppBaseLog {
        private Long singleUseDurationSecs;       //单次使用时长
        private Long singleUploadTraffic;       	//单次使用过程中的上传流量
        private Long singleDownloadTraffic;       //单次使用过程中的下载流量
        //getter/setter
      }
      
    • 日志聚合体

      收集上报日志时,是将手机端自上报完成后累积的日志组成日志聚合体,上传到服务器上。日志聚合体类设计如下:

      package com.oldboy.umeng.common.domain;
      
      import java.util.ArrayList;
      import java.util.List;
      
      /**
       * 日志聚合体
       */
      public class AppLogAggEntity {
        private String appId;               //应用唯一标识
        private String tenantId;            //租户唯一标识,企业用户
        private String deviceId;            //设备唯一标识
        private String appVersion;          //版本
        private String appChannel;          //渠道,安装时就在清单中制定了,appStore等。
        private String appPlatform;         //平台
        private String osType;              //操作系统
        private String deviceStyle;         //机型
      
        //5中类型的日志集合
        private List<AppStartupLog> startupLogs = new ArrayList<AppStartupLog>();
        private List<AppErrorLog> errorLogs = new ArrayList<AppErrorLog>();
        private List<AppEventLog> eventLogs = new ArrayList<AppEventLog>();
        private List<AppUsageLog> usageLogs = new ArrayList<AppUsageLog>();
        private List<AppPageLog> pageLogs = new ArrayList<AppPageLog>();
        //getter/setter
      }
      
      

    4、日志字典数据

    [appid]
    sohuvideo
    faobengplay
    tianya
    gaodemap
    
    [tenantid]
    tnt009
    tnt023
    tnt501
    
    [appversion]
    1.0.0
    1.1.0
    1.2.0
    2.0.0
    
    [appchannel]
    umeng
    appstore
    anroid bus
    
    [appplatform]
    ios
    android
    winphone
    blackberry
    
    [country]
    china
    america
    
    [province]
    henan
    hebei
    guangdong
    guangxi
    shandong
    shanxi
    jiazhou
    
    [network]
    wifi
    cell
    3g
    4g
    
    [carrier]
    中国移动
    中国联通
    中国电信
    中国铁通
    
    [devicestyle]
    iphone 6
    iphone 6 plus
    iphone 7
    iphone 7 plus
    红米
    oppo 1
    vivo 3
    
    [screensize]
    1136 * 640
    960 * 640
    480 * 320
    
    [ostype]
    ios11
    android 4.0
    mi 5.5
    
    [brand]
    三星
    华为
    Apple
    魅族
    小米
    联想
    
    [eventid]
    popmenu
    autoImport
    bookstore
    
    [eventdurationse22]
    34
    35
    36
    38
    
    [errorbrief]
    at com.oldboy.web.AbstractBaseController.validInbound(AbstractBaseController.java:72)
    at com.oldboy.appIn.control.CommandUtil.getInfo(CommandUtil.java:67)
    
    [errordetail]
    java.lang.NullPointerException at com.oldboy.appIn.web.AbstractBaseController.validInbound(AbstractBaseController.java:72) at com.oldboy.dfdf.web.AbstractBaseController.validInbound
    at com.oldboy.dfdfdf.control.CommandUtil.getInfo(CommandUtil.java:67) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606)
    
    [pageid]
    list.html
    main.html
    test.html
    
    [visitindex]
    0
    1
    2
    3
    4
    
    [nextpage]
    list.html
    main.html
    test.html
    
    [staydurationsec]
    45
    2
    78
    123
    456
    234
    

    5、编写上传程序代码

    package com.oldboy.umeng.phone;
    
    import com.alibaba.fastjson.JSON;
    import com.oldboy.umeng.common.domain.AppLogAggEntity;
    import com.oldboy.umeng.common.util.LogUtil;
    
    import java.io.OutputStream;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.ProtocolException;
    import java.net.URL;
    import java.util.Date;
    
    /**
     * 手机端程序类,收集本地日志,聚合成json,上报给web服务器
     */
    public class ClientApp {
      /**
    	 * 上传消息给服务期
    	 */
      public static void main(String[] args) throws Exception {
        String url = "http://192.168.13.9:80/" ;
        URL u = null ;
        HttpURLConnection conn = null ;
        //设置提交方式
        try {
          u = new URL(url);
          conn = (HttpURLConnection) u.openConnection();
          conn.setRequestMethod("POST");
          //设置请求的格式
          conn.setRequestProperty("content-type", "application/json");
    
          //设置客户端时间,为了时间对齐
          conn.setRequestProperty("client_time" , new Date().getTime() + "");
    
          //设置允许输出
          conn.setDoOutput(true);
          OutputStream out = conn.getOutputStream();
          String json = "{"id":100}" ;
          out.write(json.getBytes());
          out.flush();
          out.close();
          int code = conn.getResponseCode();
          //ok
          if (code == 200) {
            System.out.println("发送成功 : " + json);
          } else {
            System.out.println("发送失败 : " + code);
          }
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    }
    
  • 相关阅读:
    Day4-装饰器
    Day3-递归函数、高阶函数、匿名函数
    Day3-函数及作用域
    Day2-字符编码转换
    Day2-文件操作
    Day2-列表、字符串、字典、集合
    Day1-模块初识
    JavaScript 笔试题
    从JavaScript 数组去重谈性能优化
    prototype
  • 原文地址:https://www.cnblogs.com/xupccc/p/9544643.html
Copyright © 2011-2022 走看看