ESP8266 SDK开发: 网络篇-综合-8266TCP服务器(espconn) (NONOS 2.2.0)与Android TCP客户端实现无线网络通信控制
<p> </p><p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/Learn8266ForSDK" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
<p> </p>
<p> </p>
<p> </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"> </span></p>
<p><span style="font-size: 18pt">1.控制继电器吸合</span></p>
<p> </p>
<p> </p>
<p><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322172450224-1745308993.png" alt=""></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322172521176-2065886166.png" alt=""></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </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> </p>
<p> </p>
<p> </p>
<p> </p>
<p><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322172606604-481823075.png" alt=""></p>
<p> </p>
<p> </p>
<p> </p>
<p> </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 Android TCP客户端</span></p>
<p><span style="font-size: 18pt">https://www.cnblogs.com/yangfengwu/p/12543847.html 8266 TCP服务器</span></p>
<p><span style="font-size: 18pt"> </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"> </span></p>
<p><span style="font-size: 18pt"> </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 0x55 0x01 0x01</span></p>
<p><span style="font-size: 18pt">ESP8266执行以后回复给C#TCP客户端:</span></p>
<p><span style="font-size: 18pt">0x55 0xaa 0x01 0x01</span></p>
<p><span style="font-size: 18pt"> </span></p>
<p><span style="font-size: 18pt"> </span></p>
<p><span style="font-size: 18pt">Android TCP客户端发送给ESP8266TCP服务器控制继电器断开指令:</span></p>
<p><span style="font-size: 18pt">0xaa 0x55 0x01 0x00</span></p>
<p><span style="font-size: 18pt">ESP8266执行以后回复给C#TCP客户端:</span></p>
<p><span style="font-size: 18pt">0x55 0xaa 0x01 0x00</span></p>
<p> </p>
<p> </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> </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> </p>
<p> </p>
<p> </p>
<p> </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> </p>
<p> </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> </p>
<p> </p>
<p> </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> </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> </p>
<p> </p>
<p> </p>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 0, 255, 1)">if</span>(length>= <span style="color: rgba(128, 0, 128, 1)">4</span> && pusrdata[<span style="color: rgba(128, 0, 128, 1)">0</span>] == <span style="color: rgba(128, 0, 128, 1)">0xaa</span> && 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> </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> </p>
<p> </p>
<p><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322170433142-926285551.png" alt=""></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322170413191-816842250.png" alt=""></p>
<p> </p>
<p> </p>
<p><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322170443623-1559500427.png" alt=""></p>
<p> </p>
<p> </p>
<p> </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"> </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> </p>
<p> </p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322170938072-42936792.png" alt=""></span></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </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> </p>
<p> </p>
<p> </p>
<p> </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> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </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> </p>
<p> </p>
<p> </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> </p>
<p> </p>
<p> </p>
<p> </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 &0xFF以后便自动转为int型</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> ( msg.arg1>=<span style="color: rgba(128, 0, 128, 1)">4</span> && Buffer[<span style="color: rgba(128, 0, 128, 1)">0</span>] == <span style="color: rgba(128, 0, 128, 1)">0x55</span> && (Buffer[<span style="color: rgba(128, 0, 128, 1)">1</span>]&<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> </p>
<p> </p>
<p><span style="font-size: 18pt"> </span></p>
<p> </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 端口号: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> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p><span style="font-size: 18pt">1.控制继电器吸合</span></p>
<p> </p>
<p> </p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322172450224-1745308993.png" alt=""></span></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322172521176-2065886166.png" alt=""></span></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </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> </p>
<p> </p>
<p> </p>
<p> </p>
<p><span style="font-size: 18pt"><img src="https://img2020.cnblogs.com/blog/819239/202003/819239-20200322172606604-481823075.png" alt=""></span></p>
<p> </p><br><br>
来源:https://www.cnblogs.com/yangfengwu/p/12547009.html
頁:
[1]