`
java2000.net
  • 浏览: 651173 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

用手机查询北京实时路况

阅读更多

我想读这篇文章的朋友应该是被标题所吸引的, 毕竟手机已经成为我们日常生活中不可缺少的一部分, 除了很小的孩子和老人外, 基本上是每个人必备的装备^_^。 我们每天与自己的手机形影不离, 如果能通过手机来了解出行信息, 那将极大的方便我们的生活。 没错, 通过手机是可以得到实时的路况信息的。 下面我来详细说明一下。


上周我无意间发现北京公安交通管理局的网站提供了实时的路况信息。

http://210.73.74.215/realroad/

而且实时更新, 所以马上就产生了一个灵感, 能不能把这个通过手机来访问呢。 (其实这个网站是完全可以通过手机内置的浏览器访问的), 于是我准备通过手机上的JAVA程序来实现这个功能。


思路很简单, 这个网站的所有路况信息都是以图片的形式展现的。 我首先的出发点是不通过任何的代理服务器来处理, 也就是说直接用手机来访问URL实现。 不过我发现网站默认的图片格式都是JPG的, 好在现在的大部分手机还是支持这个格式的。 好, 我们现在创建一个工程。

项目名就叫trafficinfo吧, 包含两个类和一个接口。

Main: 继承自MIDlet, 程序的入口点与界面实现。
Network: 负责网络连接
NetworkListener:  一个联网过程的反馈接口。 我稍后解释它。

  1. import javax.microedition.lcdui.Command;
  2. import javax.microedition.lcdui.CommandListener;
  3. import javax.microedition.lcdui.Display;
  4. import javax.microedition.lcdui.Displayable;
  5. import javax.microedition.lcdui.Form;
  6. import javax.microedition.lcdui.Gauge;
  7. import javax.microedition.lcdui.Image;
  8. import javax.microedition.lcdui.List;
  9. import javax.microedition.midlet.MIDlet;
  10. import javax.microedition.midlet.MIDletStateChangeException;
  11. public class Main extends MIDlet implements CommandListener, NetworkListener {
  12.     
  13.     private String[] locations = 
  14.             {"西直门""雍和宫""东直门"
  15.             "朝阳门""建国门""左安门"
  16.             "永定门""广安门""菜户营",             
  17.             "六里桥""莲花桥""蓟门桥"
  18.             "马甸桥""洋桥""航天桥"
  19.             "紫竹桥""长虹桥""三元桥"
  20.             "玉泉营桥""分钟寺桥""双井桥",
  21.             "定慧桥""五棵松""学院桥"};   
  22.     
  23.     
  24.     public static final String imgSuffix = ".jpg";
  25.     
  26.     private List list;
  27.     
  28.     private Form form;
  29.     
  30.     private Gauge process;
  31.     
  32.     private Command view = new Command("查看", Command.OK, 1);
  33.     
  34.     private Command exit = new Command("退出", Command.EXIT, 1);
  35.     
  36.     public Command back = new Command("菜单", Command.OK, 1);
  37.     
  38.     public Command backForm = new Command("地图", Command.OK, 1);
  39.     
  40.     private Command log = new Command("信息", Command.OK, 1);
  41.     
  42.     private static Main mainInstance;   
  43.     
  44.     
  45.     public Main() {
  46.         list = new List("选择区域", List.IMPLICIT, locations, null);
  47.         list.addCommand(view);
  48.         list.addCommand(exit);
  49.         list.addCommand(log);
  50.         list.setCommandListener(this);  
  51.         
  52.         form = new Form("");
  53.         form.addCommand(back);
  54.         form.addCommand(log);
  55.         form.setCommandListener(this);
  56.         
  57.         process = new Gauge("下载中..."false1001);
  58.         
  59.         
  60.         
  61.         mainInstance = this;
  62.         
  63.         Display.getDisplay(this).setCurrent(list);
  64.         
  65.     }
  66.     
  67.     static Main getInstance() {
  68.         return mainInstance;
  69.     }
  70.     protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
  71.         // TODO Auto-generated method stub
  72.     }
  73.     protected void pauseApp() {
  74.         // TODO Auto-generated method stub
  75.     }
  76.     
  77.     private void exitApp() {
  78.         try {
  79.             destroyApp(false);
  80.             notifyDestroyed();
  81.         } catch (Exception e) {e.printStackTrace();}
  82.     }
  83.     protected void startApp() throws MIDletStateChangeException {
  84.         // TODO Auto-generated method stub
  85.         
  86.     }
  87.     public void commandAction(Command cmd, Displayable d) {
  88.         // TODO Auto-generated method stub
  89.         
  90.         if (cmd == view) {
  91.             int index = list.getSelectedIndex();
  92.             
  93.             Network net = new Network(index + 1, mainInstance);
  94.             net.start();
  95.                         
  96.             form.setTitle(locations[index]);
  97.             form.deleteAll();
  98.             process.setValue(1);
  99.             form.append(process);           
  100.             Display.getDisplay(mainInstance).setCurrent(form);
  101.         }
  102.         
  103.         if (cmd == exit) {
  104.             exitApp();
  105.         }
  106.         
  107.         if (cmd == back) {
  108.             Display.getDisplay(mainInstance).setCurrent(list);
  109.         }
  110.         
  111.         if (cmd == log) {
  112.             Display.getDisplay(mainInstance).setCurrent(Logger.getInstance().getForm());
  113.         }
  114.         
  115.         if (cmd == backForm) {          
  116.             Display.getDisplay(mainInstance).setCurrent(form);
  117.         }
  118.         
  119.     }
  120.     public void connectProcess(int i, boolean b) {
  121.         // TODO Auto-generated method stub
  122.         if (b) {
  123.             Display.getDisplay(mainInstance).setCurrent(form);
  124.         } else {
  125.             process.setValue(i);            
  126.         }
  127.     }
  128.     public void inputImage(Image img) {
  129.         // TODO Auto-generated method stub
  130.         if (img != null) {
  131.             form.deleteAll();
  132.             form.append(img);           
  133.         } else {
  134.             System.out.println(" get img is null");
  135.         }
  136.     }
  137.     public void errorInfo(String str) {
  138.         // TODO Auto-generated method stub
  139.         
  140.     }
  141. }

Main.java

  1. import java.io.InputStream;
  2. import javax.microedition.io.Connector;
  3. import javax.microedition.io.HttpConnection;
  4. import javax.microedition.lcdui.Image;
  5. public class Network/* implements Runnable*/ {
  6.     private int imgIndex;   
  7.     
  8.     private NetworkListener listener;
  9.     
  10.     private boolean done;   
  11.     
  12.     private HttpConnection hc;
  13.     
  14.     private HttpConnection urlConn;
  15.     
  16.     private HttpConnection mobileConn;
  17.     
  18.     private String urlKey;      
  19.     
  20.     private boolean getKeywordDone;
  21.     
  22.     private boolean getMobileInfoDone;
  23.     
  24.     private static final String mainurl = "http://210.73.74.215/realroad/submap.jsp";
  25.     
  26.     private String parsedURL;
  27.     
  28.     private static final String commiturl = "http://210.73.74.215/realroad/getimages.jsp?fileName=";
  29.     
  30.     Logger logger = Logger.getInstance();
  31.     
  32.     public Network(int index, NetworkListener nk) {
  33.         imgIndex = index;
  34.         listener = nk;  
  35.         
  36.     }
  37.     
  38.     
  39.     
  40.     public void start() {
  41.         
  42.         
  43.         
  44.         Thread getUrl = new Thread(new Runnable(){
  45.             
  46.             public void run() {
  47.                 while (!getMobileInfoDone) {
  48.                     
  49.                 }
  50.                 logger.put("Thread 1 continue");
  51.                 try {
  52.                     if (parsedURL == null) {
  53.                         
  54.                         
  55.                         urlConn = (HttpConnection) Connector.open(mainurl, Connector.READ_WRITE);
  56.                     } else {
  57.                         
  58.                         
  59.                         urlConn = (HttpConnection) Connector.open(parsedURL, Connector.READ_WRITE);
  60.                     }
  61.                     
  62.                     if (urlConn.getResponseCode() == 200) {
  63.                         logger.put("200 ok");
  64.                         InputStream is = urlConn.openInputStream();                         
  65.                         if (is != null) {
  66.                             
  67.                             StringBuffer sb = new StringBuffer();
  68.                             String temp = null;
  69.                             int ch = 0;
  70.                             int times = 0;
  71.                             while ((ch = is.read()) != -1) {
  72.                                 times++;
  73.                                 sb.append((char)ch);
  74.                                 
  75.                                  temp = sb.toString();
  76.                                 if (temp.endsWith(".jpg")) {
  77.                                     logger.put("find key");
  78.                                     String keyStr = temp.substring(temp.length() - 50, temp.length() - 4);
  79.                                     int qa = keyStr.lastIndexOf('=');
  80.                                     urlKey = keyStr.substring(qa + 1, keyStr.length() - 1);
  81.                                     break;
  82.                                 }
  83.                             }
  84.                             
  85.                             
  86.                         }
  87.                     }
  88.                         
  89.                 } catch (Exception e) {
  90.                     logger.put("Thread 1 #! " + e.getMessage());
  91.                     e.printStackTrace();                    
  92.                     
  93.                 } finally {                 
  94.                     try {
  95.                         logger.put("to close thread 1");
  96.                       urlConn.close();                  
  97.                       getKeywordDone = true;
  98.                       
  99.                       if (urlKey != null) {
  100.                           logger.put("URL Connection colosed! " + urlKey);
  101.                       } else {
  102.                           logger.put("urlKey is null");
  103.                       }
  104.                     } catch (Exception e) {
  105.                         logger.put("Thread 1 ##! " + e.getMessage());
  106.                         
  107.                         e.printStackTrace(); }
  108.                 }
  109.                 
  110.             }
  111.         });
  112.         
  113.         
  114.         
  115.         Thread getImage = new Thread(new Runnable(){
  116.             public void run() {
  117.                 // TODO Auto-generated method stub
  118.                 
  119.                 while (!getKeywordDone) {
  120.                     
  121.                 }
  122.                 logger.put("Thread 2 continue");
  123.                 try {
  124.                     logger.put("URL :: " + commiturl + urlKey + imgIndex + Main.imgSuffix);
  125.                     hc = (HttpConnection)Connector.open(commiturl + urlKey + imgIndex + Main.imgSuffix,  Connector.READ_WRITE);
  126.                     int rs = hc.getResponseCode();
  127.                     if (rs == 200) {
  128.                         logger.put("Thread 2 200 ok");
  129.                         Thread download = new Thread(new Runnable(){
  130.                             public void run() {
  131.                                 try {
  132.                                     InputStream is = hc.openInputStream();  
  133.                                     
  134.                                     if (is != null) {
  135.                                         logger.put("Thread 2 inputstream not null");
  136.                                         Image img = Image.createImage(is);                              
  137.                                         listener.inputImage(img);
  138.                                         done = true;
  139.                                         logger.put("Thread 2 image done");
  140.                                     }
  141.                                 
  142.                                 } catch (Exception e) { 
  143.                                 logger.put("Thread 2 :" + e.getMessage());
  144.                                 e.printStackTrace();
  145.                                 }
  146.                             }
  147.                             
  148.                         });
  149.                         download.start();
  150.                         int p = 1;
  151.                         while (!done) {
  152.                             
  153.                             try {
  154.                                 Thread.sleep(500L);
  155.                                 listener.connectProcess(p, false);
  156.                             } catch (Exception e) { e.printStackTrace(); };
  157.                             
  158.                             p++;
  159.                         }
  160.                         
  161.                         if (done) {
  162.                             listener.connectProcess(p, true);
  163.                             
  164.                         }
  165.                         
  166.                     } else {
  167.                         logger.put("response code " + rs);
  168.                     }
  169.                 } catch (Exception e) {
  170.                     logger.put("Thread 2 # :" + e.getMessage());
  171.                     e.printStackTrace();
  172.                     
  173.                 } finally {
  174.                     try {
  175.                         hc.close();
  176.                         logger.put("Thread 2 closed");
  177.                     } catch (Exception e) { e.printStackTrace(); }
  178.                 }
  179.             }
  180.             
  181.             
  182.         });
  183.         
  184.         getUrl.start();
  185.         getImage.start();
  186.     }
  187.     
  188.     
  189. }

Network.java

 

  1. import javax.microedition.lcdui.Image;
  2. public interface NetworkListener {
  3.     void connectProcess(int i, boolean b);
  4.     void inputImage(Image img);
  5.     void errorInfo(String str);
  6.     
  7. }

NetworkListener.java

 

 

以上是每个类的具体代码, 其实我还写了一个Log类, 负责在真机查看调试信息。 在真机上联网时,还是比较有帮助的。

核心的思路就是, 从List上选择一个地名后, 会传入相应的URL, 交给Network去联网。 然后建立连接后, 返回一张图片的数据, 通过OpenInputStream 来创建一副图片。 当连接建立后, NetworkListener接口就该发挥作用了, Network类可以通过这个就接口来传递联网的进度和状态。 也就会反应在界面上了。 等图片被创建后, 这样就可以看到跟网站上的图片一样的效果了。

这里有一点需要解释一下, 大家可以仔细看一下那个网站, 当每2分钟刷新一次的时候, 每幅图片的URL就变化了, 也就是说图片名字是自动生成的。 这个问题我是如何处理的呢?  我打开那个网页的源代码,仔细的研究了一下, 没发现什么好办法。 后来我想了一条比较笨的方法, 也就是当每次查询前, 我首先请求一下那个页面, 它会返回一个标准的HTML格式页面, 里面包含所有的图片的URL, 其实每张图片名字只有最后一位不同。 这样我就想了一个折中的办法, 我把返回的这个HTML页面的字符遍历一遍, 当第一次遇到.jpg结尾的字符后, 我就跳出来, 然后把签名的数字名称解析出来, 留做备用, 这样我通过从界面上传来的List的index, 就可以知道程序想要请求哪幅图, 只要把这串数字后加上这个index, 再加上.jpg的后缀, 前面加上完整的服务器请求地址,就是实际的图片路径了。

 

以下是在模拟器上的截图:

 

List

(主界面)

 

Downloading

(下载界面)

 

map

 

(区域地图)

 

 

我记得以前郑钧的BLOG上有关于手机查看路况信息的文章, 是视频的。 所以这个相比于流媒体来说没有什么技术含量了。 呵呵。 路况图片上不同颜色表示不同的道路状况, 绿色表示畅通,黄色表示缓慢,红色表示拥堵,灰色则表示暂时无数据。

下面是打包的程序包的下载地址:

 

http://121.198.86.108/ebooks/trafficinfo.jar
http://121.198.86.108/ebooks/trafficinfo.jad

 

本程序在Nokia 6120上测试通过, 目前仅支持240 x 320 屏幕的真机。 仅仅是个测试版本, 如果真的想通过这条途径来查看路况, 我觉得还是需要一个代理服务器去中转的, 毕竟不是所有的手机都支持JPG格式的图片。

分享到:
评论

相关推荐

    北京上海等地实时交通路况查询

    可以用在JAVA手机上的实时路况查询JAR文件

    北京推“行人导航”手机应用 可查公交到站时间.docx

    5. **实时路况提醒**:提供实时道路拥堵情况,帮助用户避开拥堵路段,节省出行时间。 6. **地铁站点信息查询**:不仅提供地铁进出站口信息,还包括站内卫生间等实用信息,方便乘客出行。 7. **未来功能展望**:...

    百度地图苹果手机

    跨城市实时路况,城际高速公路增加实时路况信息,春节自驾回家游刃有余;2. 升级打车服务,北京的朋友出门打车不再是难题;【数据升级和更新】1. 新增上海、成都、北京(景点)、南京、杭州、西安、昆明、哈尔滨、...

    中国车牌查询

    这些应用通常还会提供实时路况、违章查询等增值服务,为车主提供了全方位的信息支持。 车牌查询对于日常生活有诸多用途,例如识别陌生车辆的来源地、核实车辆信息的真实性,甚至在处理交通事故时确认车辆归属。了解...

    北京市道路交通流实时动态信息系统的研究.pdf

    3. **交通实时动态信息发布子系统**:将处理后的信息通过各种渠道(如电子显示屏、手机APP、车载信息系统等)及时发布给公众,帮助驾驶员规划路线,减少交通拥堵。 4. **数据库和系统接口**:构建大型数据库存储...

    智慧北京android项目代码

    5. **交通信息**:提供公交、地铁线路查询,实时路况更新。 6. **生活服务**:如水电煤气缴费、医院预约、公共服务查询等。 为了实现这些功能,开发者需要熟练掌握Android的网络编程,如使用OkHttp或Retrofit库发送...

    百度地图 for iPhone v7.7.0 官方越狱版.zip

    5、支持实时路况更新、实时路况预测功能 6、支持路况事件信息,含交通管制、道路施工、事故信息 7、提供语音搜索功能 8、提供屏幕常亮,收藏夹等贴心小功能 百度地图 for iPhone更新日志: 百度地图 for iPhone...

    北京智慧城市建设情况报告.docx

    在交通领域,北京利用物联网和大数据技术优化交通管理,如智能交通信号系统能根据实时路况自动调整信号灯时序,减少拥堵;共享单车与公共交通的无缝对接,提升了市民出行的便利性;同时,自动驾驶车辆的测试与推广,...

    北京智能交通系统(its)概述.doc

    3. 实时信息发布系统:通过大型情报信息板、手机WAP网站和媒体直播间,交管部门能实时发布路况信息,引导驾驶者避开拥堵,提高出行效率。同时,气象检测系统提供天气信息,有助于驾驶安全。 4. 应急响应系统:交管...

    北京交通信息发布平台app.7z

    2. **交通信息集成**:北京交通信息发布平台app整合了多种交通信息来源,包括但不限于实时路况、公交线路、地铁时刻表、出租车叫车服务、共享单车分布等。这需要开发者与多个数据提供商建立接口,通过API(应用程序...

    安卓应用-气象交通-i游北京客户端 v4.1.2.zip

    2. **气象交通应用**:这类应用通常提供实时天气预报、空气质量报告、交通路况信息,帮助用户规划出行,避免恶劣天气或交通拥堵。 3. **版本管理**:软件的版本号管理(如v4.1.2)是软件开发过程中的重要环节,每个...

    智慧旅游——面向游客的应用.ppt

    首先,导航功能基于GPS定位,能够提供实时的交通信息,包括路况、交通管制、事故提醒等,帮助游客规划最优路径,避免拥堵。其次,导游功能则是在确定位置后,显示周边的旅游信息,如景点、住宿、餐饮等,便于游客...

    基于droid平台的智能掌上公交系统开题报告.docx

    苏州也在推行类似的智能公交系统,允许市民通过多种渠道实时查询车辆到站信息。 尽管如此,现有的公交查询应用仍存在许多不足之处,限制了它们的广泛应用。 ##### 1.3 研究内容 本课题的主要研究内容包括: 1. *...

    互联网时代信息通信技术对通勤行为的影响研究.pdf

    频繁上网的群体表现出对导航类应用程序(APP)的更高使用频率,这使得他们能根据实时路况灵活调整出行计划,从而优化通勤效率。智能手机的普及极大地改变了人们对通勤时间的接受度,数据显示,拥有智能手机的人群...

    物联网发展状况及应用模式2.pptx

    1. 医疗保健:物联网在医疗领域的应用日益广泛,例如北京大学地空学院的案例中,物联网技术可以用于远程监测患者健康状况,通过穿戴式设备收集生理数据,如心率、血压、血糖等,并实时传输到医疗系统,使医生能及时...

    基于LBS的嵌入式GIS研究

    LBS则利用GIS技术,实现了与用户的实时交互,提供包括导航、位置查询、周边信息服务等多种应用。 【嵌入式GIS与移动GIS】 嵌入式GIS是将GIS功能集成到特定设备(如车载系统、手持设备)中,使得GIS服务可以...

    海口培训资料-城市交通导航及信息服务技术.pdf

    RTIC通常通过车载导航系统或手机应用等方式,提供个性化的路线建议和实时路况更新;TMC则通过广播、电视等媒体,向大众发布公共交通信息。 为了规范这些服务,中国的城市交通导航及信息服务也在逐步标准化,确保...

    智能化生活全景表达 腾讯桌面产品布局更多精彩.docx

    1. **实时路况查询功能**:腾讯地图在国内首推的这一功能,可以帮助用户规避交通拥堵,计算最佳出行路线,提高出行效率。尤其对于大城市,如北京,用户可以规划未来一周内任意时间的驾驶路线,实现智能交通引导。 2...

    智能交通系统在中国的发展趋势与前景.rar

    4. 信息服务:通过手机APP、电子显示屏等方式向公众提供实时路况、出行建议等。 5. 远程监控与调度:对公共交通、道路状况进行远程监控,及时调度资源。 二、智能交通系统在中国的应用 1. 城市交通管理:北京、...

    浅谈高精三维GIS地图在交通管理中的运用 (2).pdf

    6. **公众信息服务**:通过手机应用程序提供实时导航、路况信息,帮助驾驶者规划最佳路线,降低交通拥堵。 总之,高精三维GIS地图在交通管理中的应用不仅提高了交通系统的效率,减少了拥堵,还提升了公众的出行体验...

Global site tag (gtag.js) - Google Analytics