oto餐饮app实时订单物流追踪系统架构设计(一)
1.引言
.1 1.1目的
不管是淘点点或者饿了么,只要是打算做外卖的app,我觉得没有实时地图展示外卖订单位置信息是说不过去的,因为我觉得外卖对于物流实时性是非常苛刻的。11:00定的外卖在12:00还没有送到用户手中,都是不可原谅的。
基于此我想设计一个地图实时显示送货员位置信息的系统。
2.1 功能需求
该系统主要功能包括:
1).配送员app登录上线后,接收订单后循环的把自己的位置信息发送给服务器管理
2).用户客户端在订单经过店家转给配送员后,即可在地图上查看实时位置信息
3)服务器收到配送员位置信息后根据配送订单信息转发给相应的用户客户端
4)其他功能。用户app提交提单给web服务器后,web服务器把这条消息推送给订单追踪服务器
3.1 业务流程设计
4.1界面设计
1)店家版
2)配送员5)各个模块详细设计和实现
5.1 用户app请求地理位置`public class MyUdpClient extends UDPClientBase {
public MyUdpClient(byte[] uuid, int appid, String serverAddr, int serverPort) throws Exception { super(uuid, appid, serverAddr, serverPort); } @Override public boolean hasNetworkConnection() { return Util.hasNetwork(OnlineService.this); } @Override public void trySystemSleep() { tryReleaseWakeLock(); } @Override public void onPushMessage(Message message) { if(message == null){ return; } else if(message.getData() == null || message.getData().length == 0){ return; } else if(message.getCmd() == 16){// 0x10 通用推送信息 } else if(message.getCmd() == 17){// 0x11 分组推送信息 } else if(message.getCmd() == 32){// 0x20 自定义推送信息 String str = null; try{ str = new String(message.getData(),5,message.getContentLength(), "UTF-8"); }catch(Exception e){ str = Util.convert(message.getData(),5,message.getContentLength()); } //转化成json串 lbs 实时物流追中, Gson gson = new Gson(); MsgType msgType = gson.fromJson(str,new TypeToken<MsgType>(){}.getType()); if(msgType.equals("wuliu")) { //配送员地址位置 } else if(msgType.equals("order")) { //订单确认 } else { notifyUser(32,"自定义推送信息",""+str,"收到自定义推送信息"); } } setPkgsInfo(); } } `
百度地图api版本v_3_1,百度定位api版本v_4.2
package com.cmyy.ui;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
import com.cmyy.R;
import com.cmyy.push.OnlineService;
import com.cmyy.push.Params;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
//实时物流页面
public class LogisticsTrackingActivity extends BaseActivity{
private static final String LTAG = LogisticsTrackingActivity.class.getSimpleName();
private MapView mMapView;
private BaiduMap mBaiduMap;
private SDKReceiver mReceiver;
// 定位相关
private LocationClient mLocClient;
public MyLocationListenner myListener = new MyLocationListenner(); //定位
boolean isFirstLoc = true;// 是否首次定位
private PushLocationReceiver mPushLocationReceice;
@Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 注册 SDK 广播监听者 IntentFilter iFilter = new IntentFilter(); iFilter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR); iFilter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR); mReceiver = new SDKReceiver(); registerReceiver(mReceiver, iFilter); setContentView(R.layout.activity_tracking); //向服务器通知需要物流地理位置了 //注册接受位置信息广播 IntentFilter ipushFilter = new IntentFilter(); ipushFilter.addAction("com.cmyy.ui.LogisticsTrackingActivity.PushLocationReceiver"); mPushLocationReceice = new PushLocationReceiver(); registerReceiver(mPushLocationReceice, ipushFilter); //启动服务去接收位置 saveAccountInfo(); Intent startSrv = new Intent(this, OnlineService.class); startSrv.putExtra("CMD", "RESET"); startService(startSrv); //展示地图 mMapView = (MapView) findViewById(R.id.bmapView); mBaiduMap = mMapView.getMap(); // 开启定位图层 mBaiduMap.setMyLocationEnabled(true); // 定位初始化 /*mLocClient = new LocationClient(this); mLocClient.registerLocationListener(myListener); LocationClientOption option = new LocationClientOption(); option.setOpenGps(true);// 打开gps option.setCoorType("bd09ll"); // 设置坐标类型 option.setScanSpan(1000); mLocClient.setLocOption(option); mLocClient.start();*/
} public class PushLocationReceiver extends BroadcastReceiver { public PushLocationReceiver() { } @Override public void onReceive(Context context, Intent intent) { //接收到配送员发送过来的位置信息 String message = intent.getStringExtra("data"); Log.i("receive",message); Gson gson = new Gson(); MyLocationData locData = gson.fromJson(message,new TypeToken<MyLocationData>(){}.getType()); JSONObject jsonObj; double latitude = 39.915; double longitude = 116.404; try { jsonObj = new JSONObject(message); latitude = jsonObj.getDouble("latitude"); longitude= jsonObj.getDouble("longitude"); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } Log.i("receive",String.valueOf(latitude)); Log.i("receive",String.valueOf(longitude)); mBaiduMap.setMyLocationData(locData); if (isFirstLoc) { isFirstLoc = false; LatLng ll = new LatLng(latitude, longitude); MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll); mBaiduMap.animateMapStatus(u); } } } /** * 定位SDK监听函数 */
public class MyLocationListenner implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { // map view 销毁后不在处理新接收的位置 if (location == null || mMapView == null) return; MyLocationData locData = new MyLocationData.Builder() .accuracy(location.getRadius()) // 此处设置开发者获取到的方向信息,顺时针0-360 .direction(100).latitude(location.getLatitude()) .longitude(location.getLongitude()).build(); mBaiduMap.setMyLocationData(locData); if (isFirstLoc) { isFirstLoc = false; LatLng ll = new LatLng(location.getLatitude(), location.getLongitude()); MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll); mBaiduMap.animateMapStatus(u); } } public void onReceivePoi(BDLocation poiLocation) { }
} /** * 构造广播监听类,监听 SDK key 验证以及网络异常广播 */
public class SDKReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { String s = intent.getAction(); Log.d(LTAG, "action: " + s); if (s.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)) { Log.e("LogisticsTrackingActivity","key 验证出错! 请在 AndroidManifest.xml 文件中检查 key 设置"); } else if (s.equals(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR)) { Log.e("LogisticsTrackingActivity","网络出错"); } }
} protected void saveAccountInfo(){ SharedPreferences account = this.getSharedPreferences(Params.DEFAULT_PRE_NAME,Context.MODE_PRIVATE); SharedPreferences.Editor editor = account.edit(); editor.putString(Params.SERVER_IP, "192.168.88.130"); editor.putString(Params.SERVER_PORT, "9966"); editor.putString(Params.PUSH_PORT, "9998"); editor.putString(Params.USER_NAME, "333"); editor.putString(Params.SENT_PKGS, "0"); editor.putString(Params.RECEIVE_PKGS, "0"); editor.commit();
} @Override
protected void onPause() { super.onPause(); // activity 暂停时同时暂停地图控件 mMapView.onPause();
} @Override
protected void onResume() { super.onResume(); // activity 恢复时同时恢复地图控件 mMapView.onResume();
} @Override
protected void onDestroy() { mLocClient.stop(); // 关闭定位图层 mBaiduMap.setMyLocationEnabled(false); super.onDestroy(); // 取消监听 SDK 广播 unregisterReceiver(mReceiver); // activity 销毁时同时销毁地图控件 mMapView.onDestroy();
}
}
配送员app发送地理位置信息给追踪服务器
//接受服务器推送信息 saveAccountInfo(); //设置服务器ip 端口 Intent startSrv = new Intent(this, OnlineService.class);
startService(startSrv); push = new Push(this); //启动地理位置监控 mBaiduMapControl = new BaiduMapControl(); mBaiduMapControl.Location(getApplicationContext(),new BDLocationListener() { @Override public void onReceiveLocation(BDLocation location) { MyLocationData locData = new MyLocationData.Builder() .accuracy(location.getRadius()) // 此处设置开发者获取到的方向信息,顺时针0-360 .direction(100).latitude(location.getLatitude()) .longitude(location.getLongitude()).build(); Gson gson = new Gson(); //地理位置信息 String strLocation = gson.toJson(locData).toString(); Log.i("BaiduLocationApiDem",strLocation); //Receive Location /*StringBuffer sb = new StringBuffer(256); sb.append("time : "); sb.append(location.getTime()); //定位时间 sb.append("\nerror code : "); sb.append(location.getLocType()); sb.append("\nlatitude : "); sb.append(location.getLatitude()); // 开发者获取到的方向信息,顺时针0-360 sb.append("\nlontitude : "); sb.append(location.getLongitude()); sb.append("\nradius : "); sb.append(location.getRadius()); if (location.getLocType() == BDLocation.TypeGpsLocation){ sb.append("\nspeed : "); sb.append(location.getSpeed()); sb.append("\nsatellite : "); sb.append(location.getSatelliteNumber()); sb.append("\ndirection : "); sb.append("\naddr : "); sb.append(location.getAddrStr()); sb.append(location.getDirection()); } else if (location.getLocType() == BDLocation.TypeNetWorkLocation){ sb.append("\naddr : "); sb.append(location.getAddrStr()); //运营商信息 sb.append("\noperationers : "); sb.append(location.getOperators()); } Log.i("BaiduLocationApiDem", sb.toString()); */ //定位成功发送给服务器 push.send0x20("333", strLocation); } });
oto餐饮app实时订单物流追踪系统架构设计(一)相关推荐
- 基于STM32设计的物流追踪系统(GPS+BC20+华为云IOT)
1. 前言 随着人们生活节奏的加快,促使物流行业突飞猛进的快速的发展,物流行业的快速发展也导致物流过程出现了一系列的问题.近年来贵重物品在物流中的比例越来越多,同时贵重物流在物流过程中的丢失也越来越多 ...
- 计算机毕业设计springboot基于大数据的疫情追踪系统的设计和实现rva1s源码+系统+程序+lw文档+部署
计算机毕业设计springboot基于大数据的疫情追踪系统的设计和实现rva1s源码+系统+程序+lw文档+部署 计算机毕业设计springboot基于大数据的疫情追踪系统的设计和实现rva1s源码+ ...
- 京东虚拟业务多维订单系统架构设计读后感
阅读文章:京东虚拟业务多维订单系统架构设计 文章网址:https://mp.weixin.qq.com/s?__biz=MzU1MzE2NzIzMg==&mid=2247486428& ...
- 基于Vue和SpringBoot的毕业生追踪系统的设计和实现
作者主页:Designer 小郑 作者简介:Java全栈软件工程师一枚,来自浙江宁波,负责开发管理公司OA项目,专注软件前后端开发(Vue.SpringBoot和微信小程序).系统定制.远程技术指导. ...
- 腾讯云低延时直播系统架构设计与弱网优化实践
"直播带货"可能是2020年最具代表性的词汇之一,那么传统电商该如何融合直播系统,直播过程如何保障用户的最佳观看体验?本文由腾讯云资深架构师何书照在LiveVideoStack线上 ...
- 基于实时深度学习的推荐系统架构设计和技术演进
简介:整理自 5 月 29 日 阿里云开发者大会,秦江杰和刘童璇的分享,内容包括实时推荐系统的原理以及什么是实时推荐系统.整体系统的架构及如何在阿里云上面实现,以及关于深度学习的细节介绍 本文整理自 ...
- vivo全球商城:库存系统架构设计与实践
作者:vivo官网商城开发团队 - Xu Yi.Yan Chao 本文是vivo商城系列文章,主要介绍vivo商城库存系统发展历程.架构设计思路以及应对业务场景的实践. 一.业务背景 库存系统是电商商 ...
- 【面试】系统架构设计(持续更新)
文章目录 服务稳定性 82原则 如何衡量系统稳定性? 事故按影响程度不同划分等级 如何提高服务稳定性? 一.系统设计规范 二.单服务稳定性 三.集群稳定性 四.稳定性专项 二.场景设计 2.1 微博热 ...
- 大型系统架构设计-阿里淘宝天猫双十一数据库核心技术介绍
目录 零.双十一是什么? 一.2013 双十一数据库指导思想 1.知己知彼,百战不殆 (1)如何做到知己 (2)如何做到知彼 2.平时多流汗,战时少流血 (1)真实环境压测之缓存穿透 (2)MetaQ ...
最新文章
- MySQL数据库如何杀死会话_如何彻底杀掉不良用户会话
- 【牛客网多校】19-7-25-H题 Magic Line
- 动态构建LINQ表达式
- 实战快速恢复Exchange 2010误删除的邮箱
- Python标准库学习笔记7:数据持久存储与交换
- perl--CGI编程之Apache服务器安装配置
- 39个seo大师级经典案例
- 遗传算法java(中国外运杯)
- 基于深度学习的图像识别技术研究综述
- 滴滴打车2015-2016
- 小米笔记本 wifi linux,被小米笔记本的WiFi坑了一道
- 作为3-5年的iOS开发者:你为什么迟迟进不去大厂呢?
- 关于UEFI启动+GPT分区 的一些经验
- 安装xmind之后,打开xmind文件报错
- python哈姆雷特词频统计_【Python】哈姆雷特字数统计
- opencv——角点检测
- Matlab eval()函数
- 清轩云DS系统源码V2.0最新UI面板分享
- 51单片机定时器0控制蜂鸣器
- 笔记 - 会计学原理