配网-简单场景

简单场景#

主要介绍如何在各种网卡状态下进行网络通信。以下场景数据通信将使用 socket tcp 通信为例进行说明。

使用默认蜂窝无线网卡传输数据#

对于单独蜂窝无线网卡情况下,可以不绑定网卡进行通信。

示例代码如下:

# 导入usocket模块
import usocket

if __name__ == '__main__':
    # 创建一个socket实例
    sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM)
    sock.settimeout(5)
    # 解析域名
    sockaddr=usocket.getaddrinfo('python.quectel.com', 80)[0][-1]
    print('start connect')
    # 建立连接
    sock.connect(sockaddr)
    # 向服务端发送消息
    ret=sock.send('GET /NEWS HTTP/1.1\r\nHost: python.quectel.com\r\nAccept-Encoding: deflate\r\nConnection: keep-alive\r\n\r\n')
    print('send %d bytes' % ret)
    #接收服务端消息
    data=sock.recv(1024)
    print('recv %s bytes:' % len(data))
    print(data.decode())

    # 关闭连接
    sock.close()

使用多张蜂窝网卡并指定网卡传输数据#

对于支持多 sim 卡或者多路拨号的情况下,具体使用哪一路或者哪一个sim卡进行通信,需要指定从哪一路进行传输。
socket API 标准接口提供了数据通信绑定网卡操作,调用*socket.bind()*绑定 ip 及端口号,可以解决多路网卡数据传输指向问题。

如上图所示,使用NIC1网卡通信展示代码如下:

# 导入usocket模块
import usocket

if __name__ == '__main__':
    # 创建一个socket实例
    sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM, usocket.TCP_CUSTOMIZE_PORT)
    sock.settimeout(5)
    sock.bind(("10.11.129.251", 0))
    # 解析域名
    sockaddr=usocket.getaddrinfo('python.quectel.com', 80)[0][-1]
    print('start connect')
    # 建立连接
    sock.connect(sockaddr)
    # 向服务端发送消息
    ret=sock.send('GET /NEWS HTTP/1.1\r\nHost: python.quectel.com\r\nAccept-Encoding: deflate\r\nConnection: keep-alive\r\n\r\n')
    print('send %d bytes' % ret)
    #接收服务端消息
    data=sock.recv(1024)
    print('recv %s bytes:' % len(data))
    print(data.decode())

    # 关闭连接
    sock.close()

如上图所示,使用NIC2网卡通信展示代码如下:

# 导入usocket模块
import usocket

if __name__ == '__main__':
    # 创建一个socket实例
    sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM, usocket.TCP_CUSTOMIZE_PORT)
    sock.settimeout(5)
    sock.bind(("10.11.129.252", 0))
    # 解析域名
    sockaddr=usocket.getaddrinfo('python.quectel.com', 80)[0][-1]
    print('start connect')
    # 建立连接
    sock.connect(sockaddr)
    # 向服务端发送消息
    ret=sock.send('GET /NEWS HTTP/1.1\r\nHost: python.quectel.com\r\nAccept-Encoding: deflate\r\nConnection: keep-alive\r\n\r\n')
    print('send %d bytes' % ret)
    #接收服务端消息
    data=sock.recv(1024)
    print('recv %s bytes:' % len(data))
    print(data.decode())

    # 关闭连接
    sock.close()

使用以太网卡传输数据#

以太网在不同的工作方式下,数传有一定差异。我们分别以网关模式(LAN)及终端模式(WAN)工作状态下进行介绍。

网关模式(LAN)
以太网 LAN 工作状态下,使用 4G 网络为 LAN 局域网下设备提供网络服务,此时 4G 作为默认网卡。如果模块需要通过以太网进行通信,则必须通过调用*socket.bind()*来指定使用哪个网卡进行网络通信。

示例代码展示如下:

# 导入usocket模块
import usocket

if __name__ == '__main__':
    # 创建一个socket实例
    sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM, usocket.TCP_CUSTOMIZE_PORT)
    sock.settimeout(5)
    sock.bind(("192.168.1.1", 0))
    # 解析域名
    sockaddr=usocket.getaddrinfo('python.quectel.com', 80)[0][-1]
    print('start connect')
    # 建立连接
    sock.connect(sockaddr)
    # 向服务端发送消息
    ret=sock.send('GET /NEWS HTTP/1.1\r\nHost: python.quectel.com\r\nAccept-Encoding: deflate\r\nConnection: keep-alive\r\n\r\n')
    print('send %d bytes' % ret)
    #接收服务端消息
    data=sock.recv(1024)
    print('recv %s bytes:' % len(data))
    print(data.decode())

    # 关闭连接
    sock.close()

终端模式(WAN)
WAN工作状态下,以太网口被配置为专门与外界通信的,默认以太网卡作为默认网卡。我们可以在不绑定的情况下直接通信即可。

示例代码展示如下:

# 导入usocket模块
import usocket

if __name__ == '__main__':
    # 创建一个socket实例
    sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM)
    sock.settimeout(5)
    # 解析域名
    sockaddr=usocket.getaddrinfo('python.quectel.com', 80)[0][-1]
    print('start connect')
    # 建立连接
    sock.connect(sockaddr)
    # 向服务端发送消息
    ret=sock.send('GET /NEWS HTTP/1.1\r\nHost: python.quectel.com\r\nAccept-Encoding: deflate\r\nConnection: keep-alive\r\n\r\n')
    print('send %d bytes' % ret)
    #接收服务端消息
    data=sock.recv(1024)
    print('recv %s bytes:' % len(data))
    print(data.decode())

    # 关闭连接
    sock.close()

使用 Wi-Fi 网卡传输数据#

Wi-Fi 网卡在不同的工作方式下,数传有一定差异。我们分别以 Station 模式及 AP 模式工作状态下进行介绍。

Station 模式
Station 模式工作状态下,Wi-Fi 网口被配置为专门与外界通信的,默认 Wi-Fi 网卡作为默认网卡。我们可以在不绑定的情况下直接通信即可。

示例代码展示如下:

# 导入usocket模块
import usocket

if __name__ == '__main__':
    # 创建一个socket实例
    sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM)
    sock.settimeout(5)
    # 解析域名
    sockaddr=usocket.getaddrinfo('python.quectel.com', 80)[0][-1]
    print('start connect')
    # 建立连接
    sock.connect(sockaddr)
    # 向服务端发送消息
    ret=sock.send('GET /NEWS HTTP/1.1\r\nHost: python.quectel.com\r\nAccept-Encoding: deflate\r\nConnection: keep-alive\r\n\r\n')
    print('send %d bytes' % ret)
    #接收服务端消息
    data=sock.recv(1024)
    print('recv %s bytes:' % len(data))
    print(data.decode())

    # 关闭连接
    sock.close()

AP 模式
Wi-Fi 网卡在 AP 工作状态下,使用 4G 网络为 AP 局域网下设备提供网络服务,此时 4G 作为默认网卡。如果模块需要通过 Wi-Fi 网卡 进行通信,则必须通过调用*socket.bind()*来指定使用哪个网卡进行网络通信。

对于单网卡设备可以直接通信,无需绑定操作。

示例代码展示如下:

# 导入usocket模块
import usocket

if __name__ == '__main__':
    # 创建一个socket实例
    sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM, usocket.TCP_CUSTOMIZE_PORT)
    sock.settimeout(5)
    sock.bind(("192.168.1.1", 0))
    # 解析域名
    sockaddr=usocket.getaddrinfo('python.quectel.com', 80)[0][-1]
    print('start connect')
    # 建立连接
    sock.connect(sockaddr)
    # 向服务端发送消息
    ret=sock.send('GET /NEWS HTTP/1.1\r\nHost: python.quectel.com\r\nAccept-Encoding: deflate\r\nConnection: keep-alive\r\n\r\n')
    print('send %d bytes' % ret)
    #接收服务端消息
    data=sock.recv(1024)
    print('recv %s bytes:' % len(data))
    print(data.decode())

    # 关闭连接
    sock.close()