最近经历了一场偏 Android / IoT 方向的技术面试。
整个过程下来,最大的感受其实不是:
"完全不会"
而是:
"很多东西做过,但没有形成标准化表达体系"。
尤其:
- MQTT
- QoS
- TLS
- 401 / 403
- JWT
- 生命周期
- 地图实时点位
这些问题。
其实本质上已经开始进入:
"系统工程能力 + 企业级架构思维"
这一层了。
所以这篇文章,我想不只是简单记录面试问题。
而是:
用"标准答案 + 工程理解 + 延伸知识链"
的方式,把这次面试真正串成一个体系。
一、MQTT 与 MQTTS
标准答案
MQTT
MQTT 是轻量级发布订阅协议,
适用于 IoT、实时通信、长连接场景。
MQTTS 本质是:
MQTT + TLS/SSL
类似:
HTTP → HTTPS
MQTT → MQTTS
工程理解
协议栈结构
MQTT:
TCP
↓
MQTT
MQTTS:
TCP
↓
TLS
↓
MQTT
TLS 解决的问题
1. 数据加密
2. 防抓包
3. 防中间人攻击
4. 防数据篡改
为什么 IoT 必须加密
比如:
- 智能门锁
- 割草机器人
- 工业控制
- 远程设备控制
如果 MQTT 明文:
{
"cmd":"unlock"
}
抓包即可看到。
公网环境非常危险。
延伸知识链
TCP
→ TLS
→ HTTPS / MQTTS / WSS
→ 企业安全通信
二、MQTT QoS
标准答案
QoS 是 MQTT 消息可靠性等级。
QoS0:
最多一次,可能丢失。
QoS1:
至少一次,不丢但可能重复。
QoS2:
只有一次,不丢不重复。
工程理解
实际项目场景
QoS0
适合:
- 状态同步
- 高频位置
- 电量
因为:
允许偶尔丢包
但性能最高。
QoS1
适合:
- 控制命令
- OTA
- 开关机
因为:
控制命令不能丢
企业最常用。
QoS2
一般较少使用。
因为:
可靠性最高
但性能最差
延伸知识链
MQTT
→ QoS
→ ACK
→ 消息重试
→ 幂等
→ 网络可靠性
三、TLS 是什么
标准答案
Transport Layer Security
TLS 是传输层安全协议,
用于对网络通信进行加密。
核心:
数据加密
身份认证
防篡改
工程理解
TLS 本质
给 TCP 通信增加了一层安全保护壳。
结构:
应用层协议
(HTTP / MQTT / WebSocket)
↓
TLS
↓
TCP
TLS 握手过程
客户端:
我要安全通信
服务端:
这是我的证书
客户端:
验证证书是否合法
然后:
交换密钥
建立加密通道
后续数据:
全部加密
延伸知识链
TLS
→ HTTPS
→ MQTTS
→ WSS
→ CA证书
→ 非对称加密
→ 对称加密
四、401 与 403
标准答案
401:
未认证(没登录、Token失效)
403:
已认证,但无权限
经典理解:
401:
"你是谁?"
403:
"我知道你是谁,但你不配"
工程理解
JWT 请求流程
请求来了
↓
有没有 Token?
↓
没有 → 401
Token 合法吗?
↓
不合法 → 401
身份解析成功
↓
有没有权限?
↓
没有 → 403
有权限
↓
200
Android / 前端处理
401
跳转登录页
因为:
登录失效
403
提示权限不足
因为:
账号有效
但无权限
延伸知识链
JWT
→ 拦截器
→ ThreadLocal
→ Spring Security
→ RBAC
→ OAuth2
五、HTTP 状态码体系
标准答案
2XX:成功
200 OK
请求成功
201 Created
创建成功
204 No Content
成功但无返回体
4XX:客户端错误
400 Bad Request
请求参数错误
401 Unauthorized
未认证
403 Forbidden
无权限
404 Not Found
资源不存在
405 Method Not Allowed
请求方式错误
核心:
客户端请求有问题
5XX:服务端错误
500 Internal Server Error
服务器异常
502 Bad Gateway
网关异常
503 Service Unavailable
服务不可用
504 Gateway Timeout
网关超时
核心:
服务端处理失败
工程理解
为什么要区分 4XX / 5XX
4XX:
客户端问题
5XX:
服务端问题
前后端联调时非常重要。
延伸知识链
HTTP
→ RESTful
→ Gateway
→ 微服务
→ Spring Cloud
六、长登录 / Token 刷新
标准答案
企业里通常采用双 Token 机制:
AccessToken:
接口访问,
有效期较短。
RefreshToken:
用于刷新 AccessToken,
有效期较长。
流程
AccessToken 过期
→ 401
→ Interceptor
→ RefreshToken
→ 获取新 AccessToken
→ 重试请求
工程理解
为什么不用永久 Token
Token 泄露风险太高
所以:
AccessToken 短期
RefreshToken 长期
更安全。
延伸知识链
JWT
→ RefreshToken
→ Redis
→ 单点登录
→ Token黑名单
七、Activity 生命周期与屏幕旋转
标准答案
Android
屏幕旋转本质是:
Configuration Change
会导致:
Activity 重建
生命周期
onPause
onStop
onDestroy
onCreate
onStart
onResume
工程理解
常见解决方案
ViewModel
Android Jetpack ViewModel
保存业务状态。
onSaveInstanceState
保存 UI 临时状态。
rememberSaveable
Jetpack Compose
Compose 状态恢复。
延伸知识链
生命周期
→ Configuration Change
→ ViewModel
→ SavedStateHandle
→ Compose状态管理
八、多态与继承
标准答案
多态本质是:
同一接口,
不同对象表现出不同实现。
Java 中:
- 继承
- 接口实现
- 方法重写
实现运行时多态。
工程理解
底层本质
C++
vtable / vptr
动态绑定
Java
JVM 虚方法派发
为什么框架大量使用多态
比如:
- Spring
- Android 回调
- AOP
- MQTT Callback
本质都依赖:
接口多态
延伸知识链
OOP
→ 动态绑定
→ AOP
→ 动态代理
→ Spring
九、地图边界绘制
标准答案
地图边界本质是一组经纬度点。
通常通过:
Polyline
Polygon
进行绘制。
工程理解
边界丢失原因
1. 点顺序错误
2. Polygon 未闭合
3. MultiPolygon 未处理
4. 坐标系问题
5. 点过多
延伸知识链
GIS
→ GeoJSON
→ Polygon
→ MultiPolygon
→ GCJ02 / WGS84
十、地图绘制优化
标准答案
地图绘制优化常见方案:
1. 点位抽稀
2. Marker 聚合
3. LOD
4. 视野内渲染
5. Bitmap 缓存
6. 分段绘制
工程理解
为什么要优化
因为:
地图点位过多
会导致:
CPU/GPU 压力过高
出现:
- 卡顿
- 掉帧
- OOM
延伸知识链
GIS
→ GPU渲染
→ LOD
→ 轨迹优化
→ 实时地图
十一、实时点位乱序 / 跳点
标准答案
实时点位场景下,
网络延迟可能导致旧数据后到。
通常会增加:
timestamp
或 sequenceId。
客户端只接受更新的数据,
旧数据直接丢弃。
工程理解
Marker 不要瞬移
应该:
插值动画
实现:
平滑移动
异常点过滤
根据:
- 速度
- 距离
过滤 GPS 漂移点。
延伸知识链
实时轨迹
→ GPS漂移
→ 插值算法
→ 实时数据流
十二、本次面试暴露的问题
核心问题
不是缺项目经验,
而是缺标准化面试表达。
典型问题
1. 缺标准定义
容易直接讲本质。
2. 缺术语
比如:
TLS
QoS0/1/2
RefreshToken
Configuration Change
3. 输出不够结构化
容易:
想到哪说到哪
十三、后续学习建议
第一阶段(最高优先级)
JWT 与权限认证体系
重点:
JWT
→ AccessToken
→ RefreshToken
→ Spring Security
→ RBAC
→ OAuth2
第二阶段
MQTT 与实时通信体系
重点:
MQTT
→ QoS
→ TLS
→ 长连接
→ Netty
→ Reactor
第三阶段
Android 状态管理
重点:
Configuration Change
→ ViewModel
→ SavedStateHandle
→ rememberSaveable
第四阶段
地图 / GIS 体系
重点:
Polyline
→ Polygon
→ MultiPolygon
→ GeoJSON
→ Marker聚合
→ LOD
十四、最终总结
这次面试:
并不是:
完全不会
而更像:
"项目经验已经有了,但面试术语体系与结构化输出不足"。
当前真正缺的:
不是:
做项目能力
而是:
"把已有经验翻译成企业标准面试语言"。
以后回答问题:
尽量采用:
三段式结构
1. 标准答案
2. 工程理解
3. 延伸知识链
这样:
既能命中八股关键词,
又能体现工程深度。