四、ESP8266之 TCP客户端 (基于LUA开发)

来源:互联网 发布:csgo国服mac 编辑:程序博客网 时间:2024/06/05 03:09

8266做客户端,PC或手机做服务器

wifi.lua

wifi.setmode(wifi.STATIONAP)cfg = {}cfg.ssid = "Hello8266"cfg.pwd = "11223344"wifi.ap.config(cfg)stacfg = {}stacfg.ssid = "6103"stacfg.pwd = "6a1a0a3a"wifi.sta.config(stacfg)wifi.sta.autoconnect(1)ClientConnectFlag = 0TcpClient = nil --以上同上一篇TCP服务器一样,不再解释tmr.alarm(2, 1000, 1, function() --定时器的妙用,当没连接上就一直打印Error,连接上就OK    if ClientConnectFlag == 0 then         Client = net.createConnection(net.TCP, 0) --创建一个TCP Client        Client:connect(8000, "192.168.0.117") --连接服务器的IP以及端口(下面会介绍怎么看IP)        Client:on("receive", function(sck, data) --Client接收到数据,打印到串口            print(data)          --uart.write(0, data) 两者都可以        end)        Client:on("connection", function(sck, c) --当连接上的时候            ClientConnectFlag = 1 --标志位            TcpClient = sck --记录当前的socket,以供串口向网络发送数据。            print("Link OK")            tmr.stop(2) --连上就停止定时器            --特别注意connection和disconnection的嵌套关系,不然会有意外情况            Client:on("disconnection", function(sck, c) --没有连上                ClientConnectFlag = 0 --清0标志位                TcpClient = nil                 tmr.start(2) --重启定时器            end)        end)        if ClientConnectFlag == 0 then            print("Link Error")          end    end  end)uart.on("data", 0, function(data) --串口要发送数据到网口    if TcpClient~=nil then        TcpClient:send(data)    endend,0)printip = 0 --以下同上一篇TCP服务器一样,不再解释wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T)    printip = 0end)wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(T)    if printip==0 then        print("IP: "..T.IP)    end    printip = 1end)    

这里写图片描述

分享出现的几个问题

1.服务器IP的获取,端口倒是无所谓,一个不行换另一个。

如果您使用的是SocketTool这个软件的话,它是不会自动捕获PC作为服务器时候的IP的,需要自行查看此时PC的IP,如何看呢?
这里写图片描述

当然除了这款软件您也可以使用
这里写图片描述
自动捕获IP

2、其实PC做服务器,8266连,有一点比较坑的是,防火墙有时候阻止它不让它们两个进行通信,,,可参考当时玩AT时的这篇文章

怎么办呢?
①、您要不直接关闭防火墙,但是那又太危险了,毕竟是联网状态。

②、emmmm,其实也可以这样,8266目前是处于AP模式的,会自己建立wifi,PC连8266的wifi,然后借助8266的IP地址(在串口进行回显的那个IP就行,直接就能连上了),但是这种状态又是处于断网的局域网状态,很让人恶心。。有没有更好的办法呢?

③、把相关的调试助手加入到防火墙的白名单
这里写图片描述

这里写图片描述

这里写图片描述

emmm,就完美搞定了,哈哈哈哈。。。

2、然后就是程序中问题了

①、注意别像我一样,定义的变量要前后一致,,,找了半天错误。。
话说LUA处处定义全局变量是方便,但是又不利于错误的排查。。。

②、这里写图片描述

这个问题有有点弱智,就是为了提醒自己不要再犯了。。。。

③、这里写图片描述

这里用sck或者Client进行赋值都行,反正都是socket,不影响下面串口的广播。

3、再来看一下connection以及disconnection不产生嵌套的结果

PC
这里写图片描述

app
这里写图片描述

一连四个,直到第四个才成功。。。为啥???

应该涉及到SDK的东西,暂时还不是太懂,欢迎指点。。。

ADC

emmmmmm,,,接下来实战一下吧。。。
8266ADC测电压

在这里ADC
这里写图片描述

对应板子的位置引脚
这里写图片描述
命令以及回复这样规定
这里写图片描述

API文档说明

这里写图片描述
我们使用的是引脚输入,然后readadc(0) 就行…
需要在init.lua里面加入

if  adc.force_init_mode(adc.INIT_ADC) then--注意和API参数不同,我们要测引脚输入的    node.restart() --重启生效    returnend

然后wifi.lua中加入

function ReadAD(data)     if data=="++MD9" then        if TcpClient~=nil then            ad = adc.read(0)            TcpClient:send(ad)        end    endend

并在receive事件监听中进行函数的调用~

对了测试的电压是0-1V 然后分辨率是 1024

当悬空的时候,数据是飘忽的,正常。。。
这里写图片描述

当接到3V3上面的时候,传回来的数据是1024
这里写图片描述

接到GND的时候的数据
这里写图片描述

竟然是14,竟然不是0
什么情况?这个能解释原因不?。。。。。
好像不是这个。。

戳这里
这里写图片描述
那暂且TCP的就到这里了吧~~~

原创粉丝点击