【.Net MF网络开发板研究-03】获取雅虎天气(HttpClient示例)

简介: 在网络开发板上实现Http Client,获取雅虎网站的天气信息,并把这些信息在LCD上显示出来。

在上篇文章介绍了Http Server,通过PC上的IE浏览器(相当于Http client)来访问开发板上的Http服务。这次我们在网络开发板上实现Http Client,获取雅虎网站的天气信息,并把这些信息在LCD上显示出来。

包含两部分的代码,一是通过Http协议获取数据,二是对获取的网页,进行XML解析,以期获取天气信息。

主程序很简单,就是web服务请求和画面显示。

       public static void Main()

        {

            try

            {

                weather = new yahooWeatherRequest();

                weather.webRequest();

            }

            catch

            {

                Debug.Print("Error!");

            }

            WindowsDrawing win = new WindowsDrawing();

            win.Width = SystemMetrics.ScreenWidth;

            win.Height = SystemMetrics.ScreenHeight;

            new Program().Run(win);

        }

创建Http请求,并获取数据,相关代码如下:

      private byte[] getHttpData(string url)

        {

            HttpWebRequest request = HttpWebRequest.Create(url) as HttpWebRequest;

            request.HttpsAuthentCerts = null;

            request.KeepAlive = true;

            WebResponse resp = null;

            Stream respStream = null;

            byte[] bytData = null;

            try

            {

                resp = request.GetResponse();

            }

            catch (Exception e)

            {

                Debug.Print("Exception in HttpWebRequest.GetResponse(): " + e.Message.ToString());

                return null;

            }

 

            if (resp != null)

            {

                respStream = resp.GetResponseStream();

                int bytesRead = 0;

                int totalBytes = 0;

                respStream.ReadTimeout = 5000;

                Debug.Print("resp length= " + resp.ContentLength.ToString());

                if (resp.ContentLength!=-1)

                {

                    bytData = new byte[resp.ContentLength];

                    while (totalBytes < bytData.Length)

                    {

                         bytesRead = respStream.Read(bytData, totalBytes, bytData.Length - totalBytes);

                         if (bytesRead == 0)

                         {

                             Debug.Print("Error: Received " + totalBytes.ToString() + " Out of " + bytData.Length.ToString());

                             bytData = null;

                             break;

                         }

                         totalBytes += bytesRead;

                         Debug.Print("Bytes Read Now 0: " + bytesRead + " Total: " + totalBytes);

                    }

                    return bytData;

                }

              

            }

            if (respStream != null) respStream.Close();

            if (resp != null) resp.Close();

            request = null;

            return bytData;

        }

数据获取后,进行必要的XML解析,以提取天气数据。

       private void parseRssPage(byte[] rssPage)

        {

            MemoryStream mStream = new MemoryStream(rssPage);

            XmlReader xReader = XmlReader.Create(mStream);

            forcastArray = new ArrayList();

            while (xReader.Read())

            {

                if (xReader.NodeType == XmlNodeType.Element)

                {

                    switch (xReader.Name)

                    {

                        case "title":

                            xReader.Read();

                            break;

                        case "pubDate":

                            xReader.Read();

                            break;

                        case "yweather:location":

                            myCity = new cityInfo(xReader.GetAttribute("city"), xReader.GetAttribute("region"), xReader.GetAttribute("country"));

                            break;

                        case "yweather:condition":

                            today = new todayCondition(xReader.GetAttribute("text"), xReader.GetAttribute("temp"), xReader.GetAttribute("date"));

                             break;

                        case "yweather:forecast":

                            forcastArray.Add(new forcastCondition(xReader.GetAttribute("day"), xReader.GetAttribute("date"), xReader.GetAttribute("low"),

                                xReader.GetAttribute("high"), xReader.GetAttribute("text")));

                             break;

                    }

                }

                else if (xReader.NodeType == XmlNodeType.CDATA)

                    parseCDATA(xReader.Value);

            }

        }

数据解析完毕后,就进行屏幕显示了。

            public override void OnRender(DrawingContext dc)

            {

                dc.DrawRectangle(new SolidColorBrush(Colors.White), new Pen(Colors.White), 0, 0, Width, Height);

                dc.DrawLine(new Pen(Colors.Gray), 10, 46, 310, 46);               dc.DrawImage(Resources.GetBitmap(Resources.BitmapResources.yahoo_news_wea), 10, 10);

                if (Program.weather != null)

                {

                    int Y = 60;

                    if (weather.MyCity != null) dc.DrawText(weather.MyCity.ToString(), Resources.GetFont(Resources.FontResources.small), Colors.Black, 10, Y);

                    if (weather.Today != null)

                    {

                        dc.DrawText(weather.Today.date, Resources.GetFont(Resources.FontResources.small), Colors.Black, 10, Y + 20);

                        dc.DrawText(weather.Today.weahterDesc + "   temperature: " + weather.Today.curTemp + "c", Resources.GetFont(Resources.FontResources.small), Colors.Black, 10, Y + 40);

                    }

                    dc.DrawText("Forcast -- this week:", Resources.GetFont(Resources.FontResources.small), Colors.Black, 10, Y + 80);

                    Y += 80;

                    if (weather.ForcastArray != null)

                    {

                        foreach (yahooWeatherRequest.forcastCondition forcast in weather.ForcastArray)

                        {

                            string info = forcast.date + " , " + forcast.day + " , " + forcast.weahterDesc + " , " + forcast.lowTemp + "c ~ " + forcast.highTemp + "c ";

                            Y += 20;

                            dc.DrawText(info, Resources.GetFont(Resources.FontResources.small), Colors.Black, 10, Y);

                        }

                    }

                }

保证开发板正确的接入互联网,注意设置好DNS服务器(这个事例也可以不用设置,不过如果测试官方的HttpClient事例,是一定要设置的,因为目前MF的LWIP协议栈不支持默认的DNS),运行程序,则在超级终端中,我们可以看到我们从互联网上请求的数据(如下图):
image.png

       
开发板运行后的画面如下:
image.png

        
开发板最新的固件版本:V0.9.06  下载地址:http://www.sky-walker.com.cn/MFRelease/firmware/mfv41_firmware_hy_redbull.rar

 -----------------------------------------------------------------------------------------------------------------------------------------

源码/文档:http://www.sky-walker.com.cn/MFRelease/Sample/YFHttpClient.rar

MF快速入门:http://blog.csdn.net/yefanqiu/article/details/5340560

MF论坛:http://space.cnblogs.com/group/MFSoft/

MF开发板:http://item.taobao.com/item.htm?id=7117999726

网络开发板:http://item.taobao.com/item.htm?id=10919470266

相关文章
|
7月前
|
传感器 机器学习/深度学习 算法
【UASNs、AUV】无人机自主水下传感网络中遗传算法的路径规划问题研究(Matlab代码实现)
【UASNs、AUV】无人机自主水下传感网络中遗传算法的路径规划问题研究(Matlab代码实现)
195 0
|
7月前
|
机器学习/深度学习 并行计算 算法
【CPOBP-NSWOA】基于豪冠猪优化BP神经网络模型的多目标鲸鱼寻优算法研究(Matlab代码实现)
【CPOBP-NSWOA】基于豪冠猪优化BP神经网络模型的多目标鲸鱼寻优算法研究(Matlab代码实现)
180 8
|
6月前
|
机器学习/深度学习 人工智能 算法
【基于TTNRBO优化DBN回归预测】基于瞬态三角牛顿-拉夫逊优化算法(TTNRBO)优化深度信念网络(DBN)数据回归预测研究(Matlab代码实现)
【基于TTNRBO优化DBN回归预测】基于瞬态三角牛顿-拉夫逊优化算法(TTNRBO)优化深度信念网络(DBN)数据回归预测研究(Matlab代码实现)
277 0
|
7月前
|
算法 数据挖掘 区块链
基于遗传算法的多式联运车辆路径网络优优化研究(Matlab代码实现)
基于遗传算法的多式联运车辆路径网络优优化研究(Matlab代码实现)
210 2
|
6月前
|
传感器 机器学习/深度学习 数据采集
【航空发动机寿命预测】基于SE-ResNet网络的发动机寿命预测,C-MAPSS航空发动机寿命预测研究(Matlab代码实现)
【航空发动机寿命预测】基于SE-ResNet网络的发动机寿命预测,C-MAPSS航空发动机寿命预测研究(Matlab代码实现)
456 0
|
SQL 监控 安全
网络安全与信息安全:漏洞、加密与安全意识
随着互联网的迅猛发展,网络安全和信息安全问题日益受到关注。本文深入探讨了网络安全漏洞、加密技术以及提高个人和组织的安全意识的重要性。通过分析常见的网络攻击手段如缓冲区溢出、SQL注入等,揭示了计算机系统中存在的缺陷及其潜在威胁。同时,详细介绍了对称加密和非对称加密算法的原理及应用场景,强调了数字签名和数字证书在验证信息完整性中的关键作用。此外,还讨论了培养良好上网习惯、定期备份数据等提升安全意识的方法,旨在帮助读者更好地理解和应对复杂的网络安全挑战。
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
406 17
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
321 10
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
在数字化时代,网络安全和信息安全已成为我们生活中不可或缺的一部分。本文将介绍网络安全漏洞、加密技术和安全意识等方面的内容,并提供一些实用的代码示例。通过阅读本文,您将了解到如何保护自己的网络安全,以及如何提高自己的信息安全意识。
320 10

热门文章

最新文章