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<ctrl-Z>
>>> 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')