记录用户行为的意义?
很多互联网产品都会有数据分析的后台,比如,本公众号的一些数据分析:
通过后台的一些数据分析,我可以知道本公众号读者的一些年龄分布、地域分布、对哪些文章比较感兴趣等信息。
这些数据一定程度上对我之后生产内容有一定的启发。这些数据就是微信公众号把我们的一些用户信息、阅读公众号的一些行为给记录下来,并形成图表等形式展现出来。
特别是To C的消费类电子产品,用户数量较大,用户对设备的使用习惯对产品经理们之后的决策、工程师之后的优化方向很有帮助。
线上的嵌入式设备能记录用户的行为,能够帮助我们深入了解用户的行为模式,进而实现个性化推荐、故障预测、用户体验优化等目标。
比如:
- 通过分析大量的用户使用功能A的频次最多,那么功能A的bug能修复就尽量修复好,哪怕是一些比较偏门的路径,因为这个功能好用与否可能关乎到用户对于这个产品地评价。
- 通过监控用户在执行哪些操作时,触发了一些异常,这对于之后地优化起到了指导的方向。
- 用户可能在夜间的时候没有使用设备的习惯,那对于夜间的一些有声音的预约操作是不是可以通过各种策略提前预防到这种情况,防止打扰用户休息。
具体到各个行业:
- 智能家居行业。通过智能门锁、智能照明等设备的埋点数据,分析用户的日常行为习惯,以优化家居环境的智能化管理。
- 工业自动化。通过埋点数据收集生产过程中的关键参数,进行质量控制和数据分析,确保产品质量的稳定性。
- 医疗健康。通过分析用户的日常健康数据(如步数、心率、睡眠质量等),提供个性化的健康管理建议。
- 智能交通。在智能交通信号灯中嵌入埋点,根据实时交通流量调整信号灯配时,提高道路通行效率。
- 物联网。通过对物联网设备收集的海量数据进行分析,预测设备的运行趋势和潜在故障,提前采取措施进行预防和维护。
记录用户的行为,有个专业一点的词,叫做埋点。
嵌入式埋点就是在嵌入式设备中预设一些数据采集点(即“埋点”),当特定事件发生时(如用户点击某个按钮、观看某个节目),这些埋点会自动记录并上传相关数据到服务器进行分析。
如何进行数据埋点?
整个数据分析的步骤大致如下:
- 事件定义与管理:首先,在嵌入式设备中定义和管理数据采集点,即“埋点”。这些埋点可以配置为在用户点击、交互等事件发生时触发数据采集。
- 数据采集与传输:当事件发生时,嵌入式设备将相关数据存储起来并通过网络传输到数据采集服务器。这里,可以使用HTTP请求、WebSocket、MQTT等协议实现数据的实时传输。
- 数据处理与分析:在服务器端,使用大数据处理工具对收集到的数据进行实时处理和分析。通过分析用户的点击行为、观看习惯等,可以建立用户行为模型,实现个性化推荐和安全监控等应用。
这里我们着重分享事件定义与管理的例子:
我们基于Linux C,使用POSIX线程(pthread)来创建单独的线程,并使用POSIX消息队列来接收来自其他线程的开机次数及按键埋点事件。同时,我们将使用cJSON
库来处理JSON数据,以及标准文件操作来记录数据到tracking.log文件中。
本例子源码可以在本公众号回复关键词:埋点例子,进行获取。
本例子源码可以在本公众号回复关键词:埋点例子,进行获取。
本例子源码可以在本公众号回复关键词:埋点例子,进行获取。
1、相关头文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <mqueue.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <time.h>
#include "cJSON.h"
2、埋点事件数据结构
// 埋点类型
enum track_event_type
{
TRACK_EVENT_TYPE_BOOT,
TRACK_EVENT_TYPE_BUTTON,
TRACK_EVENT_TYPE_MAX,
};
// 公共埋点信息
struct track_event_common_info
{
char dev_name[32]; // 设备名称
char serial_num[32]; // 设备序列号
char timestamp[64]; // 时间戳
};
// 启动事件信息
struct track_event_info_boot
{
unsigned int cnt; // 开机次数
};
// 按键事件信息
struct track_event_info_button
{
unsigned char button_num; // 按键号
unsigned char button_type; // 按键类型,长按 or 短按
};
// 当前的埋点事件信息
union track_event_info
{
struct track_event_info_boot track_boot;
struct track_event_info_button track_button;
}