您的位置:首页 > 理论基础 > 计算机网络

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

2017-10-08 02:09 369 查看

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 = 0
TcpClient = 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)
end
end,0)

printip = 0 --以下同上一篇TCP服务器一样,不再解释
wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T)
printip = 0
end)

wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(T)
if printip==0 then
print("IP: "..T.IP)
end
printip = 1
end)




分享出现的几个问题

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() --重启生效
return
end


然后wifi.lua中加入

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


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

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

当悬空的时候,数据是飘忽的,正常。。。



当接到3V3上面的时候,传回来的数据是1024



接到GND的时候的数据



竟然是14,竟然不是0

什么情况?这个能解释原因不?。。。。。

好像不是这个。。

戳这里



那暂且TCP的就到这里了吧~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: