小叮咚 發表於 2020-3-22 17:07:00

ESP8266 SDK开发: 网络篇-综合-8266TCP服务器(espconn) (NONOS 2.2.0)与Android TCP客户端实现无线网络通信控制

<p>&nbsp;</p>
<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/Learn8266ForSDK" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3><span style="font-size: 18pt">实现的功能</span></h3>
<p><span style="font-size: 18pt">Android TCP客户端连接8266的TCP服务器,网络控制开发板继电器</span></p>
<p><span style="font-size: 18pt">&nbsp;</span></p>
<p><span style="font-size: 18pt">1.控制继电器吸合</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322172450224-1745308993.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322172521176-2065886166.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt">2.控制继电器断开</span></p>
<p><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322172554977-1083909816.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322172606604-481823075.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3><span style="font-size: 18pt">前言</span></h3>
<p><span style="font-size: 18pt">1.用户在看这一节之前请先学习</span></p>
<p><span style="font-size: 18pt">https://www.cnblogs.com/yangfengwu/p/12543923.html&nbsp; &nbsp;Android TCP客户端</span></p>
<p><span style="font-size: 18pt">https://www.cnblogs.com/yangfengwu/p/12543847.html&nbsp; &nbsp;8266 TCP服务器</span></p>
<p><span style="font-size: 18pt">&nbsp;</span></p>
<p><span style="font-size: 18pt">2.控制继电器引脚</span></p>
<p><span style="font-size: 18pt"><img src="https://img2018.cnblogs.com/i-beta/819239/202002/819239-20200229230229812-1392698145.png" alt=""></span></p>
<p><span style="font-size: 18pt">&nbsp;</span></p>
<p><span style="font-size: 18pt">&nbsp;</span></p>
<h3><span style="font-size: 18pt">协议规定</span></h3>
<p><span style="font-size: 18pt">Android TCP客户端发送给ESP8266TCP服务器控制继电器吸合指令:</span></p>
<p><span style="font-size: 18pt">0xaa &nbsp;0x55 &nbsp;0x01 0x01</span></p>
<p><span style="font-size: 18pt">ESP8266执行以后回复给C#TCP客户端:</span></p>
<p><span style="font-size: 18pt">0x55 &nbsp;0xaa &nbsp;0x01 0x01</span></p>
<p><span style="font-size: 18pt">&nbsp;</span></p>
<p><span style="font-size: 18pt">&nbsp;</span></p>
<p><span style="font-size: 18pt">Android TCP客户端发送给ESP8266TCP服务器控制继电器断开指令:</span></p>
<p><span style="font-size: 18pt">0xaa &nbsp;0x55 &nbsp;0x01 0x00</span></p>
<p><span style="font-size: 18pt">ESP8266执行以后回复给C#TCP客户端:</span></p>
<p><span style="font-size: 18pt">0x55 &nbsp;0xaa &nbsp;0x01 0x00</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3><span style="font-size: 18pt">ESP8266程序编写</span></h3>
<p><span style="font-size: 18pt">1.处理程序在这节的基础上修改添加</span></p>
<p><span style="font-size: 18pt">https://www.cnblogs.com/yangfengwu/p/12543847.html</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt">2.配置GPIO5为普通引脚</span></p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322165733143-887170355.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">设置GPIO5为普通引脚</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
    PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U , FUNC_GPIO5);</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt">3.定义用于返回继电器状态的数组</span></p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322165811254-865207171.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">用于返回继电器的状态</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
u8 RelayOn[</span><span style="color: rgba(128, 0, 128, 1)">4</span>]={<span style="color: rgba(128, 0, 128, 1)">0x55</span>,<span style="color: rgba(128, 0, 128, 1)">0xaa</span>,<span style="color: rgba(128, 0, 128, 1)">0x01</span>,<span style="color: rgba(128, 0, 128, 1)">0x01</span>};<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">继电器吸合</span>
u8 RelayOff[<span style="color: rgba(128, 0, 128, 1)">4</span>]={<span style="color: rgba(128, 0, 128, 1)">0x55</span>,<span style="color: rgba(128, 0, 128, 1)">0xaa</span>,<span style="color: rgba(128, 0, 128, 1)">0x01</span>,<span style="color: rgba(128, 0, 128, 1)">0x00</span>};<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">继电器断开</span></pre>
</div>
<p>&nbsp;</p>
<p><span style="font-size: 18pt">4.编写TCP接收处理程序</span></p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322165910970-1660904362.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre>    <span style="color: rgba(0, 0, 255, 1)">if</span>(length&gt;= <span style="color: rgba(128, 0, 128, 1)">4</span> &amp;&amp; pusrdata[<span style="color: rgba(128, 0, 128, 1)">0</span>] == <span style="color: rgba(128, 0, 128, 1)">0xaa</span> &amp;&amp; pusrdata[<span style="color: rgba(128, 0, 128, 1)">1</span>] == <span style="color: rgba(128, 0, 128, 1)">0x55</span><span style="color: rgba(0, 0, 0, 1)">){
      </span><span style="color: rgba(0, 0, 255, 1)">if</span>(pusrdata[<span style="color: rgba(128, 0, 128, 1)">2</span>] == <span style="color: rgba(128, 0, 128, 1)">0x01</span><span style="color: rgba(0, 0, 0, 1)">){
            </span><span style="color: rgba(0, 0, 255, 1)">if</span>(pusrdata[<span style="color: rgba(128, 0, 128, 1)">3</span>] == <span style="color: rgba(128, 0, 128, 1)">0x01</span><span style="color: rgba(0, 0, 0, 1)">){
                GPIO_OUTPUT_SET(</span><span style="color: rgba(128, 0, 128, 1)">5</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置GPIO5输出高电平</span>
                espconn_send(TCPSendDate,RelayOn,<span style="color: rgba(128, 0, 128, 1)">4</span><span style="color: rgba(0, 0, 0, 1)">);
            }
            </span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span>(pusrdata[<span style="color: rgba(128, 0, 128, 1)">3</span>] == <span style="color: rgba(128, 0, 128, 1)">0x00</span><span style="color: rgba(0, 0, 0, 1)">){
                GPIO_OUTPUT_SET(</span><span style="color: rgba(128, 0, 128, 1)">5</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置GPIO5输出低电平</span>
                espconn_send(TCPSendDate,RelayOff,<span style="color: rgba(128, 0, 128, 1)">4</span><span style="color: rgba(0, 0, 0, 1)">);
            }
      }
    }</span></pre>
</div>
<p>&nbsp;</p>
<p><span style="font-size: 18pt">5.先用 TCP调试助手测试(</span><span style="font-size: 18pt">手机连接Wi-Fi模块的无线)</span></p>
<p><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322170309302-2120737597.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322170433142-926285551.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322170413191-816842250.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322170443623-1559500427.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3><span style="font-size: 18pt">Android APP程序编写</span></h3>
<p><span style="font-size: 18pt">1.处理程序在这节的基础上修改添加</span></p>
<p><span style="font-size: 18pt">https://www.cnblogs.com/yangfengwu/p/12543923.html</span></p>
<p><span style="font-size: 18pt">&nbsp;</span></p>
<p><span style="font-size: 18pt">2.页面修改如下:</span></p>
<p><span style="font-size: 18pt">页面用了一个ImageButton</span></p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322170721339-1496742559.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322170938072-42936792.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">ImageButton imageButtonControl;


imageButtonControl </span>=<span style="color: rgba(0, 0, 0, 1)"> findViewById(R.id.imageButtonControl);
      imageButtonControl.setTag(</span><span style="color: rgba(0, 0, 255, 1)">false</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">默认是关闭</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt">3.点击按钮发送相应的数据,同时切换图片</span></p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322171016794-1933349231.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre>      imageButtonControl.setOnClickListener(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> View.OnClickListener() {
            @Override
            </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> onClick(View v) {
                final </span><span style="color: rgba(0, 0, 255, 1)">byte</span>[] bytes = <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">byte</span>[<span style="color: rgba(128, 0, 128, 1)">4</span><span style="color: rgba(0, 0, 0, 1)">];
                bytes[</span><span style="color: rgba(128, 0, 128, 1)">0</span>] = (<span style="color: rgba(0, 0, 255, 1)">byte</span>) <span style="color: rgba(128, 0, 128, 1)">0xaa</span><span style="color: rgba(0, 0, 0, 1)">;
                bytes[</span><span style="color: rgba(128, 0, 128, 1)">1</span>] = (<span style="color: rgba(0, 0, 255, 1)">byte</span>) <span style="color: rgba(128, 0, 128, 1)">0x55</span><span style="color: rgba(0, 0, 0, 1)">;
                bytes[</span><span style="color: rgba(128, 0, 128, 1)">2</span>] = (<span style="color: rgba(0, 0, 255, 1)">byte</span>) <span style="color: rgba(128, 0, 128, 1)">0x01</span><span style="color: rgba(0, 0, 0, 1)">;
                </span><span style="color: rgba(0, 0, 255, 1)">if</span> ((boolean) (imageButtonControl.getTag()) == <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">) {
                  imageButtonControl.setImageResource(R.mipmap.switch_button_on);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">吸合图片</span>
                  imageButtonControl.setTag(<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
                  bytes[</span><span style="color: rgba(128, 0, 128, 1)">3</span>] = <span style="color: rgba(128, 0, 128, 1)">0x01</span><span style="color: rgba(0, 0, 0, 1)">;
                } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
                  imageButtonControl.setImageResource(R.mipmap.switch_button_off);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">断开图片</span>
                  imageButtonControl.setTag(<span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">);
                  bytes[</span><span style="color: rgba(128, 0, 128, 1)">3</span>] = <span style="color: rgba(128, 0, 128, 1)">0x00</span><span style="color: rgba(0, 0, 0, 1)">;
                }
                </span><span style="color: rgba(0, 0, 255, 1)">new</span> Thread(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Runnable() {
                  @Override
                  </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> run() {
                        </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">{
                            outputStream.write(bytes,</span><span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">4</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">发送数据</span>
                        }<span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e){}
                  }
                }).start();
            }
      });</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt">4.处理8266返回的数据</span></p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322172146082-238881087.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre>                  <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">提示byte范围是-127 -- 127   &amp;0xFF以后便自动转为int型</span>
                  <span style="color: rgba(0, 0, 255, 1)">if</span> ( msg.arg1&gt;=<span style="color: rgba(128, 0, 128, 1)">4</span> &amp;&amp; Buffer[<span style="color: rgba(128, 0, 128, 1)">0</span>] == <span style="color: rgba(128, 0, 128, 1)">0x55</span> &amp;&amp; (Buffer[<span style="color: rgba(128, 0, 128, 1)">1</span>]&amp;<span style="color: rgba(128, 0, 128, 1)">0xff</span>) == <span style="color: rgba(128, 0, 128, 1)">0xaa</span><span style="color: rgba(0, 0, 0, 1)"> ) {
                        </span><span style="color: rgba(0, 0, 255, 1)">if</span> (Buffer[<span style="color: rgba(128, 0, 128, 1)">2</span>] == <span style="color: rgba(128, 0, 128, 1)">0x01</span><span style="color: rgba(0, 0, 0, 1)">) {
                            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (Buffer[<span style="color: rgba(128, 0, 128, 1)">3</span>] == <span style="color: rgba(128, 0, 128, 1)">0x01</span>)<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">继电器吸合</span>
<span style="color: rgba(0, 0, 0, 1)">                            {
                              textViewState.setText(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">吸合</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
                              imageButtonControl.setImageResource(R.mipmap.switch_button_on);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">吸合图片</span>
                              imageButtonControl.setTag(<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
                            }
                            </span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (Buffer[<span style="color: rgba(128, 0, 128, 1)">3</span>] == <span style="color: rgba(128, 0, 128, 1)">0x00</span>)<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">继电器断开</span>
<span style="color: rgba(0, 0, 0, 1)">                            {
                              textViewState.setText(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">断开</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
                              imageButtonControl.setImageResource(R.mipmap.switch_button_off);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">断开图片</span>
                              imageButtonControl.setTag(<span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">);
                            }
                        }
                  }</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt">&nbsp;</span></p>
<p>&nbsp;</p>
<h3><span style="font-size: 18pt">测试</span></h3>
<p><span style="font-size: 18pt">请使用手机APP连接Wi-Fi模块</span></p>
<p><span style="font-size: 18pt">IP地址:192.168.4.1&nbsp; 端口号:8080</span></p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322172420685-512184263.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt">1.控制继电器吸合</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322172450224-1745308993.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322172521176-2065886166.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt">2.控制继电器断开</span></p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322172554977-1083909816.png" alt=""></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322172606604-481823075.png" alt=""></span></p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/yangfengwu/p/12547009.html
頁: [1]
查看完整版本: ESP8266 SDK开发: 网络篇-综合-8266TCP服务器(espconn) (NONOS 2.2.0)与Android TCP客户端实现无线网络通信控制