Micropython加速物联网开发8 - 2G网络TCP通信

M6220是一款基于eSIM技术的2G模组,支持GSM/GPRS,其2G工作频段有GSM850、GSM900、DCS1800和PCS1900。接下来就体验一下M6220与后台服务器的TCP通信。

首先在REPL中一步步敲命令熟悉一下整个流程,M6220模组和TPYBoard的UART4相连。

设置串口:

>>> from pyb import UART
>>> u4=UART(4,115200)
>>> u4.init(115200, bits=8, parity=None, stop=1) 
串口发送指令AT+CGATT=1,配置M6220模组附着GPRS网络,设置成功返回OK

>>> u4.write('AT+CGATT=1\r\n')
12
>>> u4.read()
b'AT+CGATT=1\r\n\r\n+CGATT:1\r\n\r\nOK\r\n'

指令AT+CGDCONT=1,"IP","cmnet"设置PDP上下文。1为id,IP为网络类型,cmnet代表移动网络

>>> u4.write('AT+CGDCONT=1,"IP","cmnet"\r\n')
27
>>> u4.read()
b'AT+CGDCONT=1,"IP","cmnet"\r\n\r\nOK\r\n'
指令AT+CIPSTATUS查询模组TCP/IP状态,INITIAL状态表示可启动网络连接

>>> u4.write('AT+CIPSTATUS\r\n')
14
>>> u4.read()
b'AT+CIPSTATUS\r\n\r\n+IPSTATUS: IP INITIAL\r\n\r\nOK\r\n'
通过指令AT+CIPSTART="protocol","ip address",port向服务器发起连接请求。protocol为协议类型,有TCP和UDP两种;ip address为服务器IP地址;port为服务器程序监听的端口号。服务器返回CONNECT OK表示连接成功。

>>> u4.write('AT+CIPSTART="TCP","x.x.x.x",1104\r\n')
42
>>> u4.read()
b'AT+CIPSTART="TCP","x.x.x.x",1104\r\n\r\nCONNECT OK\r\n\r\nOK\r\n\r\n+CGREG: 1\r\n'
服务器使用TCP/UDP Socket调试工具:

Micropython加速物联网开发8 - 2G网络TCP通信_第1张图片

数据收发:
服务器给客户端发送数据'nihao',在REPL中通过u4.read()读取。
客户端给服务器发送数据的AT指令如下:
AT+CIPSEND

>data

>>> u4.read()
b'\r\n+RECEIVE,7:nihao\r\n\r\n\r\nOK\r\n\r\n+CGREG: 1\r\n'
>>> u4.write('AT+CIPSEND\r\n')
12
>>> u4.read()
b'AT+CIPSEND\r\n\r\n> '
>>> u4.write('hello server, this is client')
28
>>> u4.writechar(0x1a)

服务器端记录:

Micropython加速物联网开发8 - 2G网络TCP通信_第2张图片

指令 AT+CIPCLOSE断开连接,此时查询状态将返回IP CLOSE:

>>> u4.write('AT+CIPCLOSE\r\n')
13
>>> u4.write('AT+CIPSTATUS\r\n')
14
>>> u4.read()
b'AT+CIPSTATUS\r\n\r\n+IPSTATUS: IP CLOSE\r\n\r\nOK\r\n'
通过以上步骤,在REPL中输入指令一步步实现了串口配置、模组配置、建立连接、收发数据、断开连接,接下来编写服务器和客户端的程序来实现一个简单的网络通信功能。

程序功能为:TPYBoard启动之后自动配置UART4,和服务器建立连接,然后发送'USR'指令到服务器,服务器返回'LedOn'指令给TPYBoard,开发板判断指令后点亮4号LED灯。

服务器程序:

#!/usr/bin/python
#server.py
if __name__ == '__main__':
    import socket
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind(('x.x.x.x', 1104))
    sock.listen(5)
    while True:
        connection,address = sock.accept()
        try:
            print "Connect from:", address
            connection.settimeout(5)
            buf = connection.recv(1024)
            if buf == 'USR':
                connection.send('LedOn')
            else:
                connection.send('Error')
        except socket.timeout:
            print 'time out'
        connection.close()

客户端程序:

#main.py
import pyb

if __name__=='__main__':
	u4 = pyb.UART(4, 115200)
	u4.init(115200, bits=8, parity=None, stop=1)	
	u4.write('AT+CGATT=1\r\n') 
	u4.write('AT+CGDCONT=1,"IP","cmnet"\r\n')
	u4.write('AT+CIPSTART="TCP","x.x.x.x",1104\r\n') 
	pyb.delay(2000)
	u4.read()	
	u4.write('AT+CIPSEND\r\n')
	u4.write('USR')
	u4.writechar(0x1a)
	pyb.delay(2000)	
	if 'LedOn' in u4.read():
		print('receive command[LedOn] from server')
		pyb.LED(4).on()
	else:
		print('Error')






你可能感兴趣的:(MicroPython)