网络基础

MicroPython :mod:network 模块用于配置WiFi连接。有两个WiFi接口,STA模式即工作站模式(ESP32连接到路由器), AP模式提供接入服务(其他设备连接到ESP32)。如需了解MicroPython的网络连接方法,请查阅 :mod:network 模块。

STA模式

掌控板以基于network模块封装 :mpython.wifi()<mpython.wifi> 类简化wifi连接设置:

    from mpython import *       #导入mpython模块

    mywifi=wifi()     #实例化wifi类
    mywifi.connectWiFi("ssid","password")  # WiFi连接,设置ssid 和password

注解:

实例化wifi()后,会构建 ``sta`` 和 ``ap`` 两个对象。 ``sta`` 对象为工作站模式,通过路由器连接至网络。``ap`` 为AP模式,提供wifi接入。

连接成功后Repl串口如下打印:

    Connecting to network...
    Connecting to network...
    WiFi Connection Successful,Network Config:('192.168.0.2', '255.255.255.0', '192.168.0.1', '192.168.0.1')

断开WiFi连接:

    mywifi.disconnectWiFi()

查询wifi连接是否已建立:

    mywifi.sta.isconnected()

注解:

如已建立连接,返回 True ,否则 False

您可以通过以下方式查看网络设置::

mywifi.sta.ifconfig()

注解:

返回值4元组: (IP address, netmask, gateway, DNS)

ifconfig() 带参数时,配置静态IP。例如::

mywifi.sta.ifconfig(('192.168.0.4', '255.255.255.0', '192.168.0.1', '192.168.0.1'))

AP模式

除STA模式连接路由器wifi,掌控板还可以使用AP模式,提供wifi接入服务。

from mpython import wifi                    # 导入mpython模块的wifi类

mywifi=wifi()                               # 实例wifi
mywifi.enable_APWiFi(essid = "mpython-wifi", password = "mpython123456")    # 配置并打开AP模式

wifi.enable_APWiFi(essid,password) 用于配置并开启AP模式函数, essid 参数为wifi名称, password 参数为wifi密码设置。AP模式开启后,其他掌控板或网络设备就能连接该网络,进行网络通信。

注意:

AP模式并不是类似手机的热点功能,设备可以通过热点连接至互联网。这点需要注意。


一旦设置了WiFi,访问网络的方式就是使用套接字。 套接字表示网络设备上的端点,当两个套接字连接在一起时,可以继续进行通信。 Internet协议构建在套接字之上,例如电子邮件(SMTP),Web(HTTP),telnet,ssh等等。 为这些协议中的每一个分配一个特定的端口,它只是一个整数。给定IP地址和端口号,您可以连接到远程设备并开始与之通信。

TCP/IP简介

转载至 [廖雪峰Python教程] <https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014320037768360d53e4e935ca4a1f96eed1c896ad1217000>_

虽然大家现在对互联网很熟悉,但是计算机网络的出现比互联网要早很多。

计算机为了联网,就必须规定通信协议,早期的计算机网络,都是由各厂商自己规定一套协议,IBM、Apple和Microsoft都有各自的网络协议,互不兼容,这就好比一群人有的说英语,有的说中文,有的说德语,说同一种语言的人可以交流,不同的语言之间就不行了。

为了把全世界的所有不同类型的计算机都连接起来,就必须规定一套全球通用的协议,为了实现互联网这个目标,互联网协议簇(Internet Protocol Suite)就是通用协议标准。Internet是由inter和net两个单词组合起来的,原意就是连接“网络”的网络,有了Internet,任何私有网络,只要支持这个协议,就可以联入互联网。

因为互联网协议包含了上百种协议标准,但是最重要的两个协议是TCP和IP协议,所以,大家把互联网的协议简称TCP/IP协议。

通信的时候,双方必须知道对方的标识,好比发邮件必须知道对方的邮件地址。互联网上每个计算机的唯一标识就是IP地址,类似 123.123.123.123 。如果一台计算机同时接入到两个或更多的网络,比如路由器,它就会有两个或多个IP地址,所以,IP地址对应的实际上是计算机的网络接口,通常是网卡。

IP协议负责把数据从一台计算机通过网络发送到另一台计算机。数据被分割成一小块一小块,然后通过IP包发送出去。由于互联网链路复杂,两台计算机之间经常有多条线路,因此,路由器就负责决定如何把一个IP包转发出去。IP包的特点是按块发送,途径多个路由,但不保证能到达,也不保证顺序到达。

IP地址实际上是一个32位整数(称为IPv4),以字符串表示的IP地址如192.168.0.1实际上是把32位整数按8位分组后的数字表示,目的是便于阅读。

IPv6地址实际上是一个128位整数,它是目前使用的IPv4的升级版,以字符串表示类似于 2001:0db8:85a3:0042:1000:8a2e:0370:7334

TCP协议则是建立在IP协议之上的。TCP协议负责在两台计算机之间建立可靠连接,保证数据包按顺序到达。TCP协议会通过握手建立连接,然后,对每个IP包编号,确保对方按顺序收到,如果包丢掉了,就自动重发。

许多常用的更高级的协议都是建立在TCP协议基础上的,比如用于浏览器的HTTP协议、发送邮件的SMTP协议等。

一个TCP报文除了包含要传输的数据外,还包含源IP地址和目标IP地址,源端口和目标端口。

端口有什么作用?在两台计算机通信时,只发IP地址是不够的,因为同一台计算机上跑着多个网络程序。一个TCP报文来了之后,到底是交给浏览器还是QQ,就需要端口号来区分。每个网络程序都向操作系统申请唯一的端口号,这样,两个进程在两台计算机之间建立网络连接就需要各自的IP地址和各自的端口号。

了解了TCP/IP协议的基本概念,IP地址和端口的概念,我们就可以开始进行网络编程了。

套接字-TCP

什么是socket?

Socket 是网络编程的一个抽象概念。通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可。

TCP协议简介

TCP协议,传输控制协议(Transmission Control Protocol,缩写为 TCP)是一种面向连接的、可靠的、基于字节流的传输层通讯协议,由IETF的RFC 793定义。

TCP通信需要经过创建连接、数据传送、终止连接三个步骤。TCP通信模型中,在通信开始之前,一定要先创建相关连接,才能发送数据,类似于生活中,"打电话""。

套接字在工作时将连接的双方分为服务器端和客户端,即C/S模式,TCP通讯原理如下图:

Socket TCP通讯过程

TCP编程

本教程的这一部分将介绍如何作为客户端或服务端使用TCP套接字。有关更全面的socket模块的使用,请查阅 :mod:usocket 模块。
以下教程需要使用到TCP网络调试工具。下文使用的是IOS的 Network Test Utility ,可在APP Store搜索安装,android系统请点击下载。 :download:Network Test Utility.apk </../tools/com.jca.udpsendreceive.2.apk>

声明:这里的TCP客户端(tcpClient)是你的电脑或者手机,而TCP服务端(tcpServer)是mpython掌控板。

TCP客户端:

TCP编程的客户端一般步骤是:

  1. 创建一个socket,用函数socket()
  2. 设置socket属性,用函数setsockopt() , 可选
  3. 绑定IP地址、端口等信息到socket上,用函数bind() , 可选
  4. 设置要连接的对方的IP地址和端口等属性
  5. 连接服务器,用函数connect()
  6. 收发数据,用函数send()和recv(),或者read()和write()
  7. 关闭网络连接
TCP Client示例:
import socket
from mpython import *

host = "172.25.1.63"          # TCP服务端的IP地址
port = 5001                   # TCP服务端的端口
s=None

mywifi=wifi()                 # 创建wifi类


# 捕获异常,如果在"try" 代码块中意外中断,则停止关闭套接字
try:
    mywifi.connectWiFi("ssid","password")                   # WiFi连接,设置ssid 和password
    # mywifi.enable_APWiFi("wifi_name",13)                  # 还可以开启AP模式,自建wifi网络
    ip=mywifi.sta.ifconfig()[0]                             # 获取本机IP地址
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)   # 创建TCP的套接字,也可以不给定参数。默认为TCP通讯方式
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 设置socket属性
    s.connect((host,port))                                  # 设置要连接的服务器端的IP和端口,并连接
    s.send("hello mPython,I am TCP Client")                 # 向服务器端发送数据

    while True:
        data = s.recv(1024)                                 # 从服务器端套接字中读取1024字节数据
        if(len(data) == 0):                                 # 如果接收数据为0字节时,关闭套接字
            print("close socket")
            s.close()                                      
            break
        print(data)
        data=data.decode('utf-8')                         # 以utf-8编码解码字符串
        oled.fill(0)                                      # 清屏
        oled.DispChar(data,0,0)                           # oled显示socket接收数据
        oled.show()                                       # 显示
        s.send(data)                                      # 向服务器端发送接收到的数据

# 当捕获异常,关闭套接字、网络
except:
    if (s):
        s.close()                              
    mywifi.disconnectWiFi()

注意:

由于在网络中都是以bytes形式传输的,所以需要注意数据编码与解码。

注意:

上例,使用 ``connectWiFi()`` 连接同个路由器wifi。你也可以用 ``enable_APWiFi()`` 开启AP模式,自建wifi网络让其他设备接入进来。   

首先掌控板和手机须连接至同个局域网内。打开Network Test Utility,进入“TCP Server”界面, TCP Server IP选择手机在该网内的IP地址 ,端口号可设范围0~65535。然后,点击Listen,开始监听端口。 在程序中设置上文选择的TCP服务端IP地址 host 和端口号 port ,重启运行程序。

当连接Server成功后,TCP Server会接收到Client发送的文本 hello mPython,I am TCP Client 。此时您在TCP Server发送文本给Client,掌控板会 接收到文本并将文本显示至oled屏上。

TCP服务端

TCP编程的服务端一般步骤是:

  1. 创建一个socket,用函数socket()
  2. 设置socket属性,用函数setsockopt() , 可选
  3. 绑定IP地址、端口等信息到socket上,用函数bind()
  4. 开启监听和设置最大监听数,用函数listen()
  5. 等待客户端請求一个连接,用函数accept()
  6. 收发数据,用函数send()和recv(),或者read()和write()
  7. 关闭网络连接
TCP Server示例:
import socket
from mpython import *

port=5001                   # TCP服务端的端口,range0~65535
listenSocket=None              

mywifi=wifi()               # 创建wifi类

# 捕获异常,如果在"try" 代码块中意外中断,则停止关闭套接字
try:
    mywifi.connectWiFi("ssid","password")                                   # WiFi连接,设置ssid 和password
    # mywifi.enable_APWiFi("wifi_name",13)                                  # 还可以开启AP模式,自建wifi网络
    ip= mywifi.sta.ifconfig()[0]                                            # 获取本机IP地址
    listenSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)        # 创建socket,不给定参数默认为TCP通讯方式
    listenSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)      # 设置套接字属性参数
    listenSocket.bind((ip,port))                                            # 绑定ip和端口
    listenSocket.listen(3)                                                  # 开始监听并设置最大连接数
    print ('tcp waiting...')
    oled.DispChar("%s:%s" %(ip,port),0,0)                                   # oled屏显示本机服务端ip和端口            
    oled.DispChar('accepting.....',0,16)                                            
    oled.show()

    while True:
        print("accepting.....")
        conn,addr = listenSocket.accept()                                   # 阻塞,等待客户端的请求连接,如果有新的客户端来连接服務器,那麼会返回一个新的套接字专门为这个客户端服务
        print(addr,"connected")                                                         

        while True:
            data = conn.recv(1024)                                          # 接收对方发送过来的数据,读取字节设为1024字节
            if(len(data) == 0):
                print("close socket")
                conn.close()                                                # 如果接收数据为0字节时,关闭套接字
                break
            data_utf=data.decode()                                          # 接收到的字节流以utf8编码解码字符串
            print(data_utf)
            oled.DispChar(data_utf,0,48)                                    # 将接收到文本oled显示出来
            oled.show()
            oled.fill_rect(0,48,128,16,0)                                   # 局部清屏
            conn.send(data)                                                 # 返回数据给客户端

# 当捕获异常,关闭套接字、网络
except:
    if(listenSocket):
        listenSocket.close()
    mywifi.disconnectWiFi()

注意:

上例,使用``connectWiFi()`` 连接同个路由器wifi。你也可以用 ``enable_APWiFi()`` 开启AP模式,自建wifi网络让其他设备接入进来。   

首先掌控板和手机须连接至同个局域网内。掌控板重启运行程序,TCP Server端等待Client端连接请求。打开Network Test Utility,进入“TCP Client”界面,填写Remote host和port,即 socket.blind(ip,port) 的IP地址和端口。Connect连接成功后,发送文本,掌控板接收到文本显示至oled屏并将返回至TCP Client端。您可在手机接收界面看到文本从Client->Server,Server->Client的过程。

套接字-UDP

UDP协议简介

UDP(User Datagram Protocol,用户数据报协议)是一种无连接、不可靠、基于数据报的传输层通信协议。

UDP的通信过程与TCP相比较更为简单,不需要复制的三次握手与四次挥手,体现了无连接。 所以UDP传输速度比TCP快,但容易丟包、数据到达顺序无保证、缺乏拥塞控制、秉承尽最大努力交付的原则,体现了不可靠。

下图讲解服务器与客户端UDP通信連接的交互过程:

Socket UDP通讯过程

UDP编程

通常我们在说到的网络编程时默认是指TCP編程,即我们上章节说的TCP方式来通信。 socket函数创建socket对象时,不给定参数,默认为SOCK_STREAM 即socket(socket.AF_INET, socket.SOCK_STREAM),表示为创建创建一个socket用于流式网络通信。

SOCK_STREAM 是面向连接的,即每次收发数据之前必须通过 connect 创建连接,也是双向的,即任何一方都可以收发数据,协议本身提供了一些保障机制保证它是可靠的、有序的,即每个包按照发送的顺序到达接收方。

SOCK_DGRAM 是User Datagram Protocol协议的网络通信,它是无连接的,不可靠的,因为通讯双方发送数据后不知道对方是否已经收到数据,是否正常收到数据。
任何一方socket以后就可以用 sendto 发送数据,也可以用 recvfrom 接收数据。根本不关心对方是否存在,是否发送了数据。它的特点是通讯速度比较快。大家都知道TCP是要经过三次握手的,而UDP沒有。

UDP客户端

UDP编程的客户端一般步骤是:

  1. 创建一个UDP的socket,用函数socket(socket.AF_INET, socket.SOCK_DGRAM)
  2. 设置socket属性,用函数 setsockopt() 可选
  3. 绑定IP地址、端口等信息到socket上,用函数 bind() 可选
  4. 设置对方的IP地址和端口等属性
  5. 发送数据,用函数 sendto()
  6. 关闭网络连接
UDP客户端的示例
from mpython import *
import socket 

mywifi=wifi()                                           # 创建wifi对象
mywifi.connectWiFi("ssid","password")                   # 连接网络
dst = ("192.168.0.3", 6000)                             # 目的ip地址和端口号

# 捕获异常,如果在"try" 代码块中意外中断,则停止关闭套接字
try:
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)               # 创建UDP的套接字
    s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)              # 设置套接字属性

    while True:
        s.sendto(b'hello message from mPython\r\n',dst)                # 发送数据发送至目的ip
        sleep(2)

# 当捕获异常,关闭套接字、网络
except:
    if (s):
        s.close()
    mywifi.disconnectWiFi()

UDP服务端

UDP編程的服务器端一般步骤是:

  1. 创建一个UDP的socket,用函数socket(socket.AF_INET, socket.SOCK_DGRAM)
  2. 设置socket属性,用函数 setsockopt() 可选
  3. 绑定IP地址、端口等信息到socket上,用函数 bind()
  4. 循环接收数据,用函数 recvfrom()
  5. 关闭连接
UDP服务端的示例
from mpython import *
import socket 

mywifi=wifi()                                           # 创建wifi对象
mywifi.connectWiFi("ssid","password")                   # 连接网络

# 捕获异常,如果在"try" 代码块中意外中断,则停止关闭套接字
try:
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)               # 创建UDP的套接字
    s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)              # 设置套接字属性
    ip=mywifi.sta.ifconfig()[0]                                        # 获取本机ip地址
    s.bind((ip,6000))                                                  # 绑定ip和端口号
    print('waiting...')
    oled.DispChar("%s:6000" %ip,0,0)
    oled.show()
    while True:
        data,addr=s.recvfrom(1024)                           # 接收对方发送过来的数据,读取字节设为1024字节,返回(data,addr)二元组
        print('received:',data,'from',addr)                  # 打印接收到数据                      
        oled.fill(0)                                         # 清屏
        oled.DispChar("%s" %data.decode(),0,15)              # oled显示接收内容
        oled.DispChar("from%s" %addr[0],0,31)
        oled.show()                 

# 当捕获异常,关闭套接字、网络
except:
    if (s):
        s.close()
    mywifi.disconnectWiFi()

注解:

``recvfrom()`` 函数的返回值是二元組 (bytes, address),其中 bytes 是接收到的字节数据,address 是发送方的IP地址于端口号,
用二元組 (host, port) 表示。注意,recv() 函數的返回值只有bytes数据。UDP,在每次发送 ``sendto()`` 和接收数据 ``recvfrom`` 时均需要指定地址信息于TCP编程不同,不需要调用 ``listen()`` 和 ``accept()`` 。

注意:

上例,使用connectWiFi() 连接同个路由器wifi。你也可以用 enable_APWiFi() 开启AP模式,自建wifi网络让其他设备接入进来。这样就无需依赖其他路由器wifi网络。

HTTP

HTTP是基于客户端/服务端(C/S)的架构模型,通过一个可靠的链接来交换信息,是一个无状态的请求/响应协议。

一个HTTP"客户端"是一个应用程序(Web浏览器或其他任何客户端),通过连接到服务器达到向服务器发送一个或多个HTTP的请求的目的。

HTTP GET request

以下示例显示了如何下载网页。HTTP使用端口80,您首先需要发送“GET”请求才能下载任何内容。作为请求的一部分,您需要指定要检索的页面。

socket实现HTTP get方法
import socket

# 定义http get函数
def http_get(url):
    # 解析url
    _, _, host, path = url.split('/', 3)
    # 将网站的域名解析成IP地址
    addr = socket.getaddrinfo(host, 80)[0][-1]
    # 构建socket
    s = socket.socket()
    # 连接IP地址
    s.connect(addr)
    # 以http get 请求格式发送
    s.send(bytes('GET /%s HTTP/1.0\r\nHost: %s\r\n\r\n' % (path, host), 'utf8'))
    while True:
        # socket接收
        data = s.recv(100)
        if data:
            print(str(data, 'utf8'), end='')
        else:
            break
    s.close()

# 访问 http://micropython.org/ks/test.html
http_get('http://micropython.org/ks/test.html')

提示:

在使用socket模块时,请先连接wifi,并且确保可以访问互联网。有关如何wifi连接,请查看上章节 :ref:`配置wifi<network_base>` 。

http_get('http://micropython.org/ks/test.html') ,掌控板客户端向 micropython.org 服务端发送范围test路径资源的get请求。服务端收到请求后将返回数据给客户端。

urequest 模块

上面是使用socket来实现http的get请求。我们可以使用 :mod:urequests 模块,里面已封装HTTP协议一些常用的请求方式,使用更为简便。

使用urequest模块,访问网页
import urequests
from mpython import *

my_wifi = wifi()
my_wifi.connectWiFi('ssid','psw')

# http get方法
r = urequests.get('http://micropython.org/ks/test.html')
# 响应的内容
r.content

HTTP Server

以下示例,掌控板作为HTTP服务端,使用浏览器可以访问板载光线传感器:
import socket
import network,time
from mpython import *

# 实例化wifi类
mywifi=wifi() 
# WiFi连接,设置ssid 和password                                  
mywifi.connectWiFi("ssid","psw")   


def main():
    s = socket.socket()
    ai = socket.getaddrinfo(mywifi.sta.ifconfig()[0], 80)
    print("Bind address info:", ai)
    addr = ai[0][-1]
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.bind(addr)
    s.listen(5)
    print("Listening, connect your browser to http://%s:80/" %addr[0])
    # oled显示掌控板ip地址
    oled.DispChar('Connect your browser',0,0,)                           
    oled.DispChar('http://%s' %addr[0],0,16)
    oled.show()

    while True:
        res = s.accept()
        client_s = res[0]
        client_addr = res[1]
        print("Client address:", client_addr)
        print("Client socket:", client_s)
        req = client_s.recv(4096)
        print("Request:")
        print(req)
        # 状态行
        client_s.send(b'HTTP/1.0 200 OK\r\n')    
        # 响应类型                        
        client_s.send(b'Content-Type: text/html; charset=utf-8\r\n')
        # CRLF 回车换行
        client_s.send(b'\r\n')
        # 响应内容
        content = '欢迎使用掌控板mPython!你的光线传感器值是:%d' % light.read()
        client_s.send(content)
        # 关闭socket
        client_s.close()

在REPL中运行main:

    >>> main()

手机或笔记本电脑连接相同wifi,使其在同个局域网内。按打印提示或oled屏幕显示ip,使用浏览器访问掌控板主机IP地址。

解析JSON解析JSON

JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。采用完全独立于编程语言的文本格式来存储和表示数据,易于人阅读和编写,同时也易于机器解析和生成,所以在互联网应用非常广泛。

在python中,json和dict非常类似,都是key-value的形式,而且json、dict也可以非常方便的通过 :mod:json 模块互转。

网络获取解析JSON网络获取解析JSON

http协议采用的是请求/响应模型,浏览器或客户端发出请求,服务器给与响应。

例如,想从 http://ip-api.com/json/ 这个开放的接口中获取IP地址等信息,我们将地址直接在浏览器输入,可以看到:

这是一个json数组,包含有IP地址等信息。我们通过访问这个url,获取到这些信息然后返回字符串text,通过ujson.loads(str)把字符串给生成dict字典类型,就可以直接读关键字(key)获取对应的值(value)。

将网站中的部分信息显示在OLED显示屏上
from mpython import*
import json
import urequests           # urequests模块是一个用于网络访问的模块

mywifi=wifi()
mywifi.connectWiFi('yourESSID', 'yourpassword')    #连接 WiFi 网络

url_ip ="http://ip-api.com/json/"                  #添加请求地址

rsp=urequests.get(url_ip)                          #发送get请求

ipJson=rsp.text

ipDict=json.loads(ipJson)

oled.DispChar('国家:%s' % ipDict['country'],0,5)     #将国家信息显示到OLED显示屏上
oled.show()

oled.DispChar('城市:%s' % ipDict['city'],0,25)       #将城市信息显示到OLED显示屏上
oled.show()

oled.DispChar('IP:%s' % ipDict['query'],0,45)        #将IP地址信息显示到OLED显示屏上
oled.show()

我们在REPL交互式的编程环境下逐步解析,能更加直观地查看结果。

使用前,导入mpython、json、urequests模块:

    >>> from mpython import*
    >>> import json
    >>> import urequests

连接您的 WiFi 网络,需要设置您的WiFi名称和密码:

    >>> mywifi=wifi()
    >>> mywifi.connectWiFi('yourESSID', 'yourpassword')
    Connecting to network...
    Connecting to network...
    Connecting to network...
    WiFi Connection Successful,Network Config:('','','','')

添加请求地址,发送get请求,获取网页第三方接口返回的数据:

    >>> url_ip ="http://ip-api.com/json/"
    >>> rsp=urequests.get(url_ip)

获取的数据返回为json数据文本格式,打印输出,我们可以看到返回的数据:

    >>> ipJson=rsp.text
    >>> print(jpJson)
    {"as":"AS56040 China Mobile Communications Corporation","city":"Guangzhou","country":"China","countryCode":"CN","isp":"China Mobile communications corporation","lat":23.1292,"lon":113.264,"org":"China Mobile","query":"120.234.223.173","region":"GD","regionName":"Guangdong","status":"success","timezone":"Asia/Shanghai","zip":""}

注意

rsp.text 返回为json数据文本格式。   

将获取的数据转换为dict字典类型,打印输出,我们可以看到返回的数据:

    >>> ipDict=json.loads(ipJson)
    >>> print(ipDict)
    {'countryCode': 'CN', 'lon': 113.264, 'regionName': 'Guangdong', 'query': '120.234.223.173', 'city': 'Guangzhou', 'status': 'success', 'org': 'China Mobile', 'timezone': 'Asia/Shanghai', 'region': 'GD', 'lat': 23.1292, 'isp': 'China Mobile communications corporation', 'as': 'AS56040 China Mobile Communications Corporation', 'zip': '', 'country': 'China'}

注意

json.loads(str) 解析 JSON 字符串并返回对象。   

我们可以在dict字典中键入关键字(key),获取对应的信息值(value),比如城市、IP地址:

    >>> ipDict['city']
    'Guangzhou'
    >>> ipDict['query']
    '120.234.223.173'