如何利用UUID技术打造Android儿童手机远程监控应用?
- 内容介绍
- 文章标签
- 相关推荐
先说说咱们为啥要玩UUID
给孩子装个手机,爸妈心里总是七上八下。
想想啊,要是把所有设备的ID都写成“12345”,那谁还能分清哪个是自家娃的,推倒重来。?
太治愈了。 这时候,UUID就像那颗不怕碰撞的子弹——全局唯一,几乎不可能重复。
而且,它不是硬件码,不会被系统权限卡住。
说白了 就是给每台装了App的手机颁发一张“身份证”,以后所有数据、消息、定位全靠它。
UUID到底怎么生成的?
public class DeviceIdHelper {
private static final String PREF_不结盟E = "uuid_store";
private static final String KEY_UUID = "device_uuid";
public static String getUuid {
SharedPreferences sp = ctx.getSharedPreferences;
String uuid = sp.getString;
if {
uuid = UUID.randomUUID.toString;
sp.edit.putString.apply;
}
return uuid;
}
}
代码很短,却稳得一批。第一次跑App的时候生成一个,后面每次启动都直接从本地读出来,嗯,就这么回事儿。。
要是用户卸载再装,那只能重新来一次——这正好符合“重新登记”的业务需求,差不多得了...。
把UUID塞进MQTT的ClientID里
MQQT是轻量级的发布/订阅协议,特别适合移动网络。
但它有个硬核规则:每个连接必须有唯一的ClientID,好吧...。
于是我们把上面那串UUID拼进去:
String broker = "tcp://broker.myserver.com:1883";
String clientId = "dubao_" + DeviceIdHelper.getUuid;
MqttAndroidClient client = new MqttAndroidClient;
MqttConnectOptions options = new MqttConnectOptions;
options.setCleanSession;
options.setAutomaticReconnect;
options.setWill.getBytes, 1, false);
client.connect;
这句setWill就是所谓“遗嘱消息”。要是掉线了服务器会自动帮我们发条“我挂了”。爸妈一收到,就知道孩子手机可能失联了,乱弹琴。。
别忘了前台服务, 让App不被系统杀
Android 8+对后台限制严苛,光写在Activity里根本活不长。
所以我们起个前台Service, 配合通知渠道:
public class GuardService extends Service {
@Override
public void onCreate {
super.onCreate;
if {
NotificationChannel ch = new NotificationChannel(
"dubao_channel",
"嘟宝守护",
NotificationManager.IMPORTANCE_LOW);
getSystemService.createNotificationChannel;
}
Notification notif = new NotificationCompat.Builder
.setContentTitle
.setContentText
.setSmallIcon
.build;
startForeground;
initMqtt; // 上面的连接代码放这里
}
@Override
public IBinder onBind { return null; }
}
这样即使系统想干掉我们的进程,也只能把它当成前台通知处理——基本保底。
远程定位:从GPS到云端的一条线
这事儿我可太有发言权了。 定位这块儿其实挺简单:用Google/FusedLocationProvider获取经纬度, 然后发MQTT消息:
private void sendLocation{
JSONObject payload = new JSONObject;
payload.put);
payload.put;
payload.put;
payload.put);
try{
client.publish("dubao/location",
payload.toString.getBytes,
1,
false);
}catch{ e.printStackTrace;}
}
父母端只要订阅/dubao/location这个主题,就能实时看到孩子的位置点。配合地图SDK,一键展示轨迹,超实用,不错。!
网络抖动怎么办?自动重连小技巧
孩子跑到电梯里、地下室,信号肯定会瞬间掉线。
我们在MqttCallbackExtended里监 你猜怎么着? 听connectionLost 一旦触发就立马重连:
client.setCallback {
@Override
public void connectComplete {
Log.d);
// 重连成功后可以重新发送一次位置信息做校验
}
@Override
public void connectionLost {
Log.w;
// 自动重连已经打开,这里可以记录日志或提示用户
}
@Override public void messageArrived{}
@Override public void deliveryComplete{}
});
平安层面的小锦囊
- TLS 加密:MQQT over SSL让数据在传输过程中不可窃听。
- AES 本地存储:把敏感信息用对称加密写进SharedPreferences。
- ID 权限最小化:只请求必要的定位权限, 不去抓IMEI之类的硬件码,省得被系统拦住。
权限请求随手搞定
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION)!=PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,
new String{Manifest.permission.ACCESS_FINE_LOCATION},
REQUEST_LOC);
}
PUSH 通知:别让爸妈错过关键提醒
MQQT适合实时数据流, 但有时候也需要走系统推送, 往白了说... 让父母即使没打开App也能收到报警。
思路很直接:后台Service监听到异常事件,调用Firebase Cloud Messaging或者本地通知弹窗提醒。这里不展开细节,只说一句:“记得在Manifest里声明接收器”。哈哈,这点儿事儿咱们都懂啦!
实战小结——从零到完整框架走一遍
- 初始化DeviceIdHelper获取唯一标识 - 启动GuardService做前台守护 - 在Service里创建MQQT客户端并设置遗嘱、自动重连 - 定时或事件 好家伙... 驱动调用LocationProvider获取坐标 - 把坐标封装成JSON通过publish发送到主题 - 父母端订阅同一主题并渲染地图 - 出现异常时触发本地或云推送报警
再说说叨叨几句感想
说实话,这玩意儿看起来技术堆砌很多,但核心其实只有两点:,牛逼。
- a)每台设备都有一个永不重复的身份证。
- b)这个身份证必须挂在可靠的通信通道上,并且保持在线。
Ehh,你懂的,只要做到这两点,远程监控基本就稳住了。剩下的UI美化、用户体验,就看各位大佬怎么玩花样啦!祝大家写代码顺风顺水,娃娃平安无忧~哈哈,原来小丑是我。!
先说说咱们为啥要玩UUID
给孩子装个手机,爸妈心里总是七上八下。
想想啊,要是把所有设备的ID都写成“12345”,那谁还能分清哪个是自家娃的,推倒重来。?
太治愈了。 这时候,UUID就像那颗不怕碰撞的子弹——全局唯一,几乎不可能重复。
而且,它不是硬件码,不会被系统权限卡住。
说白了 就是给每台装了App的手机颁发一张“身份证”,以后所有数据、消息、定位全靠它。
UUID到底怎么生成的?
public class DeviceIdHelper {
private static final String PREF_不结盟E = "uuid_store";
private static final String KEY_UUID = "device_uuid";
public static String getUuid {
SharedPreferences sp = ctx.getSharedPreferences;
String uuid = sp.getString;
if {
uuid = UUID.randomUUID.toString;
sp.edit.putString.apply;
}
return uuid;
}
}
代码很短,却稳得一批。第一次跑App的时候生成一个,后面每次启动都直接从本地读出来,嗯,就这么回事儿。。
要是用户卸载再装,那只能重新来一次——这正好符合“重新登记”的业务需求,差不多得了...。
把UUID塞进MQTT的ClientID里
MQQT是轻量级的发布/订阅协议,特别适合移动网络。
但它有个硬核规则:每个连接必须有唯一的ClientID,好吧...。
于是我们把上面那串UUID拼进去:
String broker = "tcp://broker.myserver.com:1883";
String clientId = "dubao_" + DeviceIdHelper.getUuid;
MqttAndroidClient client = new MqttAndroidClient;
MqttConnectOptions options = new MqttConnectOptions;
options.setCleanSession;
options.setAutomaticReconnect;
options.setWill.getBytes, 1, false);
client.connect;
这句setWill就是所谓“遗嘱消息”。要是掉线了服务器会自动帮我们发条“我挂了”。爸妈一收到,就知道孩子手机可能失联了,乱弹琴。。
别忘了前台服务, 让App不被系统杀
Android 8+对后台限制严苛,光写在Activity里根本活不长。
所以我们起个前台Service, 配合通知渠道:
public class GuardService extends Service {
@Override
public void onCreate {
super.onCreate;
if {
NotificationChannel ch = new NotificationChannel(
"dubao_channel",
"嘟宝守护",
NotificationManager.IMPORTANCE_LOW);
getSystemService.createNotificationChannel;
}
Notification notif = new NotificationCompat.Builder
.setContentTitle
.setContentText
.setSmallIcon
.build;
startForeground;
initMqtt; // 上面的连接代码放这里
}
@Override
public IBinder onBind { return null; }
}
这样即使系统想干掉我们的进程,也只能把它当成前台通知处理——基本保底。
远程定位:从GPS到云端的一条线
这事儿我可太有发言权了。 定位这块儿其实挺简单:用Google/FusedLocationProvider获取经纬度, 然后发MQTT消息:
private void sendLocation{
JSONObject payload = new JSONObject;
payload.put);
payload.put;
payload.put;
payload.put);
try{
client.publish("dubao/location",
payload.toString.getBytes,
1,
false);
}catch{ e.printStackTrace;}
}
父母端只要订阅/dubao/location这个主题,就能实时看到孩子的位置点。配合地图SDK,一键展示轨迹,超实用,不错。!
网络抖动怎么办?自动重连小技巧
孩子跑到电梯里、地下室,信号肯定会瞬间掉线。
我们在MqttCallbackExtended里监 你猜怎么着? 听connectionLost 一旦触发就立马重连:
client.setCallback {
@Override
public void connectComplete {
Log.d);
// 重连成功后可以重新发送一次位置信息做校验
}
@Override
public void connectionLost {
Log.w;
// 自动重连已经打开,这里可以记录日志或提示用户
}
@Override public void messageArrived{}
@Override public void deliveryComplete{}
});
平安层面的小锦囊
- TLS 加密:MQQT over SSL让数据在传输过程中不可窃听。
- AES 本地存储:把敏感信息用对称加密写进SharedPreferences。
- ID 权限最小化:只请求必要的定位权限, 不去抓IMEI之类的硬件码,省得被系统拦住。
权限请求随手搞定
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION)!=PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,
new String{Manifest.permission.ACCESS_FINE_LOCATION},
REQUEST_LOC);
}
PUSH 通知:别让爸妈错过关键提醒
MQQT适合实时数据流, 但有时候也需要走系统推送, 往白了说... 让父母即使没打开App也能收到报警。
思路很直接:后台Service监听到异常事件,调用Firebase Cloud Messaging或者本地通知弹窗提醒。这里不展开细节,只说一句:“记得在Manifest里声明接收器”。哈哈,这点儿事儿咱们都懂啦!
实战小结——从零到完整框架走一遍
- 初始化DeviceIdHelper获取唯一标识 - 启动GuardService做前台守护 - 在Service里创建MQQT客户端并设置遗嘱、自动重连 - 定时或事件 好家伙... 驱动调用LocationProvider获取坐标 - 把坐标封装成JSON通过publish发送到主题 - 父母端订阅同一主题并渲染地图 - 出现异常时触发本地或云推送报警
再说说叨叨几句感想
说实话,这玩意儿看起来技术堆砌很多,但核心其实只有两点:,牛逼。
- a)每台设备都有一个永不重复的身份证。
- b)这个身份证必须挂在可靠的通信通道上,并且保持在线。
Ehh,你懂的,只要做到这两点,远程监控基本就稳住了。剩下的UI美化、用户体验,就看各位大佬怎么玩花样啦!祝大家写代码顺风顺水,娃娃平安无忧~哈哈,原来小丑是我。!

