5287| 1
|
[高级教程] 原始构建物联网系列之使用掌控板读取网页信息 |
掌控板使用了ESP32芯片,这让它具有了联网的能力!通过掌控板读取网页信息进行数据分析,提取相应指令后一样是可以控制家中的电器开关。 准备工作: 使用tomcat或其他一些Web服务器,设置其首页内容为: <script language="javascript"> location.href="/login/userlogin.jsp"; </script> 程序代码段01(参考网址:https://mpython.readthedocs.io/z ... network/socket.html,其功能为读取指定网页信息并保存至指定文件中): import network import socket import os wlan=None s=None f = open('httpClientGetHtmV01'+str(time.ticks_us())+'.txt', 'w') #以写入方式建立指定文件 try: wlan=network.WLAN(network.STA_IF) #掌控板连接路由器起始 wlan.active(True) wlan.connect("your wifi name","wifi password") print('connecting to network...') while(wlan.ifconfig()[0]=='0.0.0.0'): time.sleep_ms(500) print('.',end="") print('WiFi Connection Successful,Network Config:%s' %str(wlan.ifconfig())) #掌控板连接路由器结束 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('192.168.1.112',7513)) #要连接的IP与端口 s.send("GET / HTTP/1.1\r\n") s.send("Host:192.168.1.112\r\n") #奇怪,这里不加,得到错误网页信息 s.send("\r\n") while True: data=s.readline() #读取服务端返回信息 if(len(data)>0): print(data) #屏幕输出信息 f.write(data) #输出信息写入文件 else: print("close socket") s.close() f.close() break except: if(s): s.close() wlan.disconnect() 程序代码段01执行结果得到相关信息截图 若是不执行“s.send("Host:192.168.1.112\r\n") ”则是如下结果 若是要访问搜狐首页,则可以将代码中的“192.168.1.112”换成“www.sohu.com”,代码中的“7513”换成“80”。 程序代码段02提高版(此段程序解决分析服务器返回信息,提取Html头部信息存入字典requestContextDict之中,根据反馈信息Content-Length准确得到所需要的网页信息),以下有变化的内容加粗显示。 import network import socket import os wlan=None s=None f = open('httpClientGetHtmV01'+str(time.ticks_us())+'.txt', 'w') print('httpClientGetHtmV01'+str(time.ticks_us())+'.txt') requestContextDict={} #存储Html头部信息 requestHtmlContentLength=0 #Html网页实际内容长度 isContent=False #是否开始读取网页内容 try: wlan=network.WLAN(network.STA_IF) #掌控板连接路由器起始 wlan.active(True) wlan.connect("jsz","jsz123123") print('connecting to network...') while(wlan.ifconfig()[0]=='0.0.0.0'): time.sleep_ms(500) print('.',end="") print('WiFi Connection Successful,Network Config:%s' %str(wlan.ifconfig())) #掌控板连接路由器结束 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('192.168.1.112',7513)) #要连接的IP与端口 s.send("GET / HTTP/1.1\r\n") s.send("Host:192.168.1.112\r\n") s.send("\r\n") while True: data=s.readline() #把接收的数据定义为变量 readlengthper=len(data) if(readlengthper>0): if(isContent): requestHtmlContentLength=requestHtmlContentLength-readlengthper print(requestHtmlContentLength) f.write(data) if(requestHtmlContentLength==0): print(requestContextDict) print("htmlcontent end.") s.close() f.close() break else: datas=bytes.decode(data) if(datas=='\r\n'): isContent=True elif(datas.find(":")>0): headkey=datas[0:datas.find(":")] headvalue=datas[datas.find(":")+2:len(datas)] requestContextDict[headkey]=headvalue if(headkey=='Content-Length'): requestHtmlContentLength=int(headvalue) elif(datas.find("HTTP/1.1 200 OK")>=0): print("read ok") else: print(data) print("other error") else: print("close socket") s.close() f.close() break except: if(s): s.close() wlan.disconnect() 使用掌控板读取网页信息涉及Http1.1协议,协议标准可使用如下网址查询。 https://www.ietf.org/rfc/rfc2616.txt HTTP1.1协议-RFC2616-中文版:https://blog.csdn.net/runner_diego/article/details/51379116 若能够自行读取互联网上的网页信息并进行分析,那就可以通过修改网页信息实现控制家里的电器开关了。举个例子,互联网上的博客非常多,注册一个博客,发布一个博文,修改该博文内容,使用掌控板读取该博文内容就可以…… 有需要的同仁可以添加公众号linkallStudio获取详细资料。 亦可扫描: 关注公众号。 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed