bl_iot_sdk/docs/html/Examples/demo_protocols_http/http.html
2020-11-08 13:32:47 -06:00

382 lines
23 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html class="writer-html5" lang="zh" >
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>6. Http client &mdash; BL602 IoT SDK release_bl_iot_sdk_1.6.11-1-g66bb28da 文档</title>
<link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../../_static/style.css" type="text/css" />
<link rel="stylesheet" href="../../_static/css/custom.css" type="text/css" />
<!--[if lt IE 9]>
<script src="../../_static/js/html5shiv.min.js"></script>
<![endif]-->
<script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script src="../../_static/jquery.js"></script>
<script src="../../_static/underscore.js"></script>
<script src="../../_static/doctools.js"></script>
<script src="../../_static/language_data.js"></script>
<script type="text/javascript" src="../../_static/js/theme.js"></script>
<link rel="index" title="索引" href="../../genindex.html" />
<link rel="search" title="搜索" href="../../search.html" />
<link rel="next" title="7. Httpc client" href="../demo_protocols_httpc/httpc.html" />
<link rel="prev" title="5. UART_ioctl" href="../demo_peripherals_uart_ioctl/uart_ioctl.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../../index.html" class="icon icon-home" alt="Documentation Home"> BL602 IoT SDK
</a>
<div class="version">
release_bl_iot_sdk_1.6.11-1-g66bb28da
</div>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="在文档中搜索" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p class="caption"><span class="caption-text">Developer_Environment</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../Developer_Environment/Developer_Environment.html">1. Developer Environment</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../Developer_Environment/BLFlashEnv/BLFlashEnv.html">2. BLFlashEnv</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../Developer_Environment/freedom_studio/freedom_studio.html">3. Freedom Studio</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../Developer_Environment/eclipse/eclipse.html">4. Eclipse</a></li>
</ul>
<p class="caption"><span class="caption-text">Examples</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../helloworld/helloworld.html">1. Helloword</a></li>
<li class="toctree-l1"><a class="reference internal" href="../demo_aws/aws.html">2. aws</a></li>
<li class="toctree-l1"><a class="reference internal" href="../demo_peripherals_gpio/GPIO.html">3. GPIO</a></li>
<li class="toctree-l1"><a class="reference internal" href="../demo_peripherals_uart_echo/uart_echo.html">4. UART_echo</a></li>
<li class="toctree-l1"><a class="reference internal" href="../demo_peripherals_uart_ioctl/uart_ioctl.html">5. UART_ioctl</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">6. Http client</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#id1">6.1. 总览</a></li>
<li class="toctree-l2"><a class="reference internal" href="#id2">6.2. 准备和使用步骤</a></li>
<li class="toctree-l2"><a class="reference internal" href="#id3">6.3. 应用实例</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../demo_protocols_httpc/httpc.html">7. Httpc client</a></li>
<li class="toctree-l1"><a class="reference internal" href="../demo_storage_psm/psm.html">8. PSM</a></li>
<li class="toctree-l1"><a class="reference internal" href="../demo_storage_romfs/romfs.html">9. Romfs</a></li>
<li class="toctree-l1"><a class="reference internal" href="../demo_system_cli/cli.html">10. cli</a></li>
<li class="toctree-l1"><a class="reference internal" href="../demo_system_fdt/fdt.html">11. FDT</a></li>
<li class="toctree-l1"><a class="reference internal" href="../demo_wifi/wifi.html">12. WiFi</a></li>
<li class="toctree-l1"><a class="reference internal" href="../demo_ble/ble.html">13. BLE</a></li>
<li class="toctree-l1"><a class="reference internal" href="../demo_mesh/mesh.html">14. Mesh</a></li>
<li class="toctree-l1"><a class="reference internal" href="../demo_blsync_ble/blsync_ble.html">15. BLSYNC-BLE</a></li>
<li class="toctree-l1"><a class="reference internal" href="../sdk_app_easyflash_boottimes/easyflash_boottimes.html">16. Easyflash4 boot times</a></li>
</ul>
<p class="caption"><span class="caption-text">Components</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../Components/arch.html">1. arch</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../Components/Command_line/helper.html">2. helper</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../Components/Command_line/aos_cli.html">3. cli</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../Components/Hal_drv/gpio.html">4. GPIO</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../Components/Middleware/bloop/bloop.html">5. BLOOP</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../Components/Middleware/blsync/blsync.html">6. BLSYNC</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../Components/Middleware/dts/devicetree.html">7. device tree</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../Components/Middleware/log/blog.html">8. blog</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../Components/Middleware/security/security.html">9. Security</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../Components/Middleware/vfs/vfs.html">10. AOS VFS</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../Components/Middleware/yloop/yloop.html">11. yloop</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../Components/Network/httpc/httpc.html">12. HTTPC</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../Components/Network/https/https.html">13. HTTPS</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../Components/Network/tls/tls.html">14. TLS</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../Components/BLE/provision_WiFi/provision_WiFi.html">15. Provision_WiFi</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../Components/BLE/mesh/mesh.html">16. Mesh</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../Components/BLE/ble_stack/ble_stack.html">17. BLE</a></li>
</ul>
<p class="caption"><span class="caption-text">API</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../API/sys/cronalarms.html">1. cronalarms</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../API/wifi/wifi_mgmr.html">2. Wi-Fi Manager</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../index.html">BL602 IoT SDK</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../index.html" class="icon icon-home"></a> &raquo;</li>
<li><span class="section-number">6. </span>Http client</li>
<li class="wy-breadcrumbs-aside">
<a href="../../_sources/Examples/demo_protocols_http/http.rst.txt" rel="nofollow"> 查看页面源码</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<div class="section" id="http-client">
<span id="http-index"></span><h1><span class="section-number">6. </span>Http client<a class="headerlink" href="#http-client" title="永久链接至标题"></a></h1>
<div class="section" id="id1">
<h2><span class="section-number">6.1. </span>总览<a class="headerlink" href="#id1" title="永久链接至标题"></a></h2>
<p>本示例主要介绍如何创建一个socket并连接到指定的Http服务器获取数据的过程。</p>
</div>
<div class="section" id="id2">
<h2><span class="section-number">6.2. </span>准备和使用步骤<a class="headerlink" href="#id2" title="永久链接至标题"></a></h2>
<ul>
<li><p>使用之前需要准备可用的URL以及网络。</p></li>
<li><p>使用步骤:</p>
<ul>
<li><p>编译 <code class="docutils literal notranslate"><span class="pre">customer_app/sdk_app_http_client_socket</span></code> 工程并下载工程;</p></li>
<li><p>在终端输入开启wifi的命令 <code class="docutils literal notranslate"><span class="pre">stack_wifi</span></code> 输入连接wifi的命令 <code class="docutils literal notranslate"><span class="pre">wifi_sta_connect</span> <span class="pre">&lt;name&gt;</span> <span class="pre">&lt;key&gt;</span></code> 并确认wifi连接成功如输入wifi_sta_connect bl_test_005 12345678</p>
<div class="figure align-default">
<img alt="" src="../../_images/image116.png" />
</div>
<div class="figure align-default">
<img alt="" src="../../_images/image214.png" />
</div>
</li>
<li><p>使用 <code class="docutils literal notranslate"><span class="pre">http</span></code> 命令通过socket的方式进行下载。</p>
<div class="figure align-default">
<img alt="" src="../../_images/image313.png" />
</div>
</li>
</ul>
</li>
</ul>
</div>
<div class="section" id="id3">
<h2><span class="section-number">6.3. </span>应用实例<a class="headerlink" href="#id3" title="永久链接至标题"></a></h2>
<ul class="simple">
<li><p>通过 <code class="docutils literal notranslate"><span class="pre">hostname</span></code> 获取 <code class="docutils literal notranslate"><span class="pre">hostinfo</span></code></p></li>
</ul>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>struct hostent *hostinfo = gethostbyname(hostname);
if (!hostinfo) {
printf(&quot;gethostbyname Failed\r\n&quot;);
return -1;
}
</pre></div>
</div>
<ul class="simple">
<li><p>创建一个 <code class="docutils literal notranslate"><span class="pre">socket</span></code> 连接并发送http请求。</p></li>
</ul>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">if</span> <span class="p">((</span><span class="n">sockfd</span> <span class="o">=</span> <span class="n">socket</span><span class="p">(</span><span class="n">AF_INET</span><span class="p">,</span> <span class="n">SOCK_STREAM</span><span class="p">,</span> <span class="mi">0</span><span class="p">))</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
<span class="n">printf</span><span class="p">(</span><span class="s2">&quot;Error in socket</span><span class="se">\r\n</span><span class="s2">&quot;</span><span class="p">);</span>
<span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>
<span class="o">/*---</span><span class="n">Initialize</span> <span class="n">server</span> <span class="n">address</span><span class="o">/</span><span class="n">port</span> <span class="n">struct</span><span class="o">---*/</span>
<span class="n">memset</span><span class="p">(</span><span class="o">&amp;</span><span class="n">dest</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">sizeof</span><span class="p">(</span><span class="n">dest</span><span class="p">));</span>
<span class="n">dest</span><span class="o">.</span><span class="n">sin_family</span> <span class="o">=</span> <span class="n">AF_INET</span><span class="p">;</span>
<span class="n">dest</span><span class="o">.</span><span class="n">sin_port</span> <span class="o">=</span> <span class="n">htons</span><span class="p">(</span><span class="n">PORT</span><span class="p">);</span>
<span class="n">dest</span><span class="o">.</span><span class="n">sin_addr</span> <span class="o">=</span> <span class="o">*</span><span class="p">((</span><span class="n">struct</span> <span class="n">in_addr</span> <span class="o">*</span><span class="p">)</span> <span class="n">hostinfo</span><span class="o">-&gt;</span><span class="n">h_addr</span><span class="p">);</span>
<span class="o">//</span><span class="n">char</span> <span class="n">ip</span><span class="p">[</span><span class="mi">16</span><span class="p">];</span>
<span class="n">uint32_t</span> <span class="n">address</span> <span class="o">=</span> <span class="n">dest</span><span class="o">.</span><span class="n">sin_addr</span><span class="o">.</span><span class="n">s_addr</span><span class="p">;</span>
<span class="n">char</span> <span class="o">*</span><span class="n">ip</span> <span class="o">=</span> <span class="n">inet_ntoa</span><span class="p">(</span><span class="n">address</span><span class="p">);</span>
<span class="n">printf</span><span class="p">(</span><span class="s2">&quot;Server ip Address : </span><span class="si">%s</span><span class="se">\r\n</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">ip</span><span class="p">);</span>
<span class="o">/*---</span><span class="n">Connect</span> <span class="n">to</span> <span class="n">server</span><span class="o">---*/</span>
<span class="k">if</span> <span class="p">(</span><span class="n">connect</span><span class="p">(</span><span class="n">sockfd</span><span class="p">,</span>
<span class="p">(</span><span class="n">struct</span> <span class="n">sockaddr</span> <span class="o">*</span><span class="p">)</span><span class="o">&amp;</span><span class="n">dest</span><span class="p">,</span>
<span class="n">sizeof</span><span class="p">(</span><span class="n">dest</span><span class="p">))</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
<span class="n">printf</span><span class="p">(</span><span class="s2">&quot;Error in connect</span><span class="se">\r\n</span><span class="s2">&quot;</span><span class="p">);</span>
<span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>
<span class="o">/*---</span><span class="n">Get</span> <span class="s2">&quot;Hello?&quot;</span><span class="o">---*/</span>
<span class="n">memset</span><span class="p">(</span><span class="n">buffer</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">MAXBUF</span><span class="p">);</span>
<span class="n">char</span> <span class="n">wbuf</span><span class="p">[]</span>
<span class="o">=</span> <span class="s2">&quot;GET /ddm/ContentResource/music/204.mp3 HTTP/1.1</span><span class="se">\r\n</span><span class="s2">Host: nf.cr.dandanman.com</span><span class="se">\r\n</span><span class="s2">User-Agent: wmsdk</span><span class="se">\r\n</span><span class="s2">Accept: */*</span><span class="se">\r\n\r\n</span><span class="s2">&quot;</span><span class="p">;</span>
<span class="n">write</span><span class="p">(</span><span class="n">sockfd</span><span class="p">,</span> <span class="n">wbuf</span><span class="p">,</span> <span class="n">sizeof</span><span class="p">(</span><span class="n">wbuf</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span>
</pre></div>
</div>
<ul class="simple">
<li><p>获取http响应的数据完成时打印获取数据花费的时间和传输的速度。</p></li>
</ul>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">while</span> <span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
<span class="n">ret</span> <span class="o">=</span> <span class="n">read</span><span class="p">(</span><span class="n">sockfd</span><span class="p">,</span> <span class="n">recv_buffer</span><span class="p">,</span> <span class="n">BUFFER_SIZE</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">ret</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
<span class="n">printf</span><span class="p">(</span><span class="s2">&quot;eof</span><span class="se">\n\r</span><span class="s2">&quot;</span><span class="p">);</span>
<span class="k">break</span><span class="p">;</span>
<span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">ret</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
<span class="n">printf</span><span class="p">(</span><span class="s2">&quot;ret = </span><span class="si">%d</span><span class="s2">, err = </span><span class="si">%d</span><span class="se">\n\r</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">ret</span><span class="p">,</span> <span class="n">errno</span><span class="p">);</span>
<span class="k">break</span><span class="p">;</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="n">total</span> <span class="o">+=</span> <span class="n">ret</span><span class="p">;</span>
<span class="o">/*</span><span class="n">use</span> <span class="n">less</span> <span class="n">debug</span><span class="o">*/</span>
<span class="k">if</span> <span class="p">(</span><span class="mi">0</span> <span class="o">==</span> <span class="p">((</span><span class="n">debug_counter</span><span class="o">++</span><span class="p">)</span> <span class="o">&amp;</span> <span class="mh">0xFF</span><span class="p">))</span> <span class="p">{</span>
<span class="n">printf</span><span class="p">(</span><span class="s2">&quot;total = </span><span class="si">%d</span><span class="s2">, ret = </span><span class="si">%d</span><span class="se">\n\r</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">total</span><span class="p">,</span> <span class="n">ret</span><span class="p">);</span>
<span class="p">}</span>
<span class="o">//</span><span class="n">vTaskDelay</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">total</span> <span class="o">&gt;</span> <span class="mi">82050000</span><span class="p">)</span> <span class="p">{</span>
<span class="n">ticks_end</span> <span class="o">=</span> <span class="n">xTaskGetTickCount</span><span class="p">();</span>
<span class="n">time_consumed</span> <span class="o">=</span> <span class="p">((</span><span class="n">uint32_t</span><span class="p">)(((</span><span class="n">int32_t</span><span class="p">)</span><span class="n">ticks_end</span><span class="p">)</span> <span class="o">-</span> <span class="p">((</span><span class="n">int32_t</span><span class="p">)</span><span class="n">ticks_start</span><span class="p">)))</span> <span class="o">/</span> <span class="mi">1000</span><span class="p">;</span>
<span class="n">printf</span><span class="p">(</span><span class="s2">&quot;Download comlete, total time </span><span class="si">%u</span><span class="s2"> s, speed </span><span class="si">%u</span><span class="s2"> Kbps</span><span class="se">\r\n</span><span class="s2">&quot;</span><span class="p">,</span>
<span class="p">(</span><span class="n">unsigned</span> <span class="nb">int</span><span class="p">)</span><span class="n">time_consumed</span><span class="p">,</span>
<span class="p">(</span><span class="n">unsigned</span> <span class="nb">int</span><span class="p">)(</span><span class="n">total</span> <span class="o">/</span> <span class="n">time_consumed</span> <span class="o">*</span> <span class="mi">8</span> <span class="o">/</span> <span class="mi">1000</span><span class="p">)</span>
<span class="p">);</span>
<span class="k">break</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
<ul class="simple">
<li><p>关闭 <code class="docutils literal notranslate"><span class="pre">socket</span></code></p></li>
</ul>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">close</span><span class="p">(</span><span class="n">sockfd</span><span class="p">);</span>
</pre></div>
</div>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">customer_app/sdk_app_http_client_socket/sdk_app_http_client_socket/demo.c</span></code><code class="docutils literal notranslate"><span class="pre">static</span> <span class="pre">void</span> <span class="pre">_cli_init()</span></code> 的函数里调用 <code class="docutils literal notranslate"><span class="pre">http_client_cli_init()</span></code> 初始化http命令</p></li>
</ul>
</div>
</div>
</div>
</div>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="../demo_protocols_httpc/httpc.html" class="btn btn-neutral float-right" title="7. Httpc client" accesskey="n" rel="next">下一页 <span class="fa fa-arrow-circle-right"></span></a>
<a href="../demo_peripherals_uart_ioctl/uart_ioctl.html" class="btn btn-neutral float-left" title="5. UART_ioctl" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> 上一页</a>
</div>
<hr/>
<div role="contentinfo">
<p>
&copy; 版权所有 2020, Bouffalo Lab
</p>
</div>
利用 <a href="http://sphinx-doc.org/">Sphinx</a> 构建,使用了
<a href="https://github.com/rtfd/sphinx_rtd_theme">主题</a>
<a href="https://readthedocs.org">Read the Docs</a>开发.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>