linkdfrobot 发表于 2018-12-23 16:34:43

原始构建物联网系列之使用掌控板读取网页信息

    掌控板使用了ESP32芯片,这让它具有了联网的能力!通过掌控板读取网页信息进行数据分析,提取相应指令后一样是可以控制家中的电器开关。
准备工作:
使用tomcat或其他一些Web服务器,设置其首页内容为:
<script language="javascript">
location.href="/login/userlogin.jsp";
</script>
程序代码段01(参考网址:https://mpython.readthedocs.io/zh/latest/tutorials/basics/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'):
    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'):
    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
          headvalue=datas
          requestContextDict=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获取详细资料。
  亦可扫描: https://mc.dfrobot.com.cn/data/attachment/forum/201811/05/215729edaiifefjidvsf7x.jpg 关注公众号。

rzyzzxw 发表于 2018-12-23 18:46:08

高手啊。{:5_148:}
页: [1]
查看完整版本: 原始构建物联网系列之使用掌控板读取网页信息