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调试工具:
>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)
服务器端记录:
指令 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')