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調試工具:


數據收發:
服務器給客戶端發送數據'nihao',在REPL中通過u4.read()讀取。
客戶端給服務器發送數據的AT指令如下:
AT+CIPSEND

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






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章