基於python的cat1模塊的AT指令串口通信解析

一 前記
使用cat1模塊做產品的過程中,遇到了不少問題。其中很重要的一個就是怎麼測試單個模塊的好壞。這裏筆者專門寫了一個工具,來測試cat1模塊的是否好用,這裏做一個分享吧。
 
二 源碼解析
這個是一個完全可以工作的程序,只需要改成你的模塊的即可;
# -*- coding: utf-8 -*-
import time
import hashlib
import threading
from serial import Serial
import serial.tools.list_ports
import time

#查找端口函數
def findPort():
    ports = serial.tools.list_ports.comports()
    for each in ports:
        if 'Android' in each:
            com_android = each.split(' - ')[0]
            return com_android

#發送AT指令函數
def at_send_cimi(serial):
    try:
        at_bsn = 'AT+CIMI'  # 具體命令就不給出了。
        serial.write(at_bsn.encode('utf-8') + b'\r')  # 向端口發送指令必須二進制格式;末尾添加\r\n表示發送。
        print('AT+CIMI SEND SUCCESS!')
    except Exception as e:
        print(e)


def at_send_cmiot(serial):
    try:
        #at_bsn = 'AT+QICSGP=1,1,"CTNET","","",1'  # 具體命令就不給出了。
        #中國移動
        at_bsn = 'AT+QICSGP=1,1,"CMIOT","","",1'  # 具體命令就不給出了。
        serial.write(at_bsn.encode('utf-8') + b'\r')  # 向端口發送指令必須二進制格式;末尾添加\r\n表示發送。
        print('AT+QICSGP SEND SUCCESS!')
    except Exception as e:
        print(e)

def at_send_qiact(serial):
    try:
        at_bsn = 'AT+QIACT=1'  # 具體命令就不給出了。
        serial.write(at_bsn.encode('utf-8') + b'\r')  # 向端口發送指令必須二進制格式;末尾添加\r\n表示發送。
        print('AT+QIACT SEND SUCCESS!')
    except Exception as e:
        print(e)

def at_send_tcprequest(serial):
    try:
        at_bsn = 'AT+QIOPEN=1,0,"TCP","47.103.67.239",8080,0,2'  # 具體命令就不給出了。
        serial.write(at_bsn.encode('utf-8') + b'\r')  # 向端口發送指令必須二進制格式;末尾添加\r\n表示發送。
        print('AT+tcp request SEND SUCCESS!')
    except Exception as e:
        print(e)

def socket_send_data(serial):
    try:
        at_bsn = 'hello world test success'  # 具體命令就不給出了。
        serial.write(at_bsn.encode('utf-8') + b'\r')  # 向端口發送指令必須二進制格式;末尾添加\r\n表示發送。
        print('socket SEND data SUCCESS!')
    except Exception as e:
        print(e)


def recv_msg(serial):          # 接收消息(任務線程)
    global g_tcp_state
    while True:
        data = serial.read(128)
        if len(data) > 6:
            print("data2:",data[2])
            if data[2] == 0x52 and data[3] == 0x44:
                print("ready cmd in")
                at_send_cimi(serial)
                time.sleep(0.1)
                #at_send_cmiot(serial)
                #osdelay(1000)
                #time.sleep(0.1)
                #at_send_qiact(serial)

        if len(data) > 30:
            if data[29] == 0x4f and data[30] == 0x4b:
                print("recv sim card success and send cmiot register")
                at_send_cmiot(serial)
                #at_send_qiact(serial)
                #time.sleep(0.1)
                #at_send_tcprequest(serial)
        if len(data) > 35:
            if data[32] == 0x4f and data[33] == 0x4b:
                print("recv cmiot register success and send qiat cmd")
                at_send_qiact(serial)
        if len(data) == 17:
            print("data13:",data[13])
            if data[13] == 0x4f and data[14] == 0x4b:
                print("recv qiact ack success and send tcp connect")
                at_send_tcprequest(serial)

        if len(data) == 66:
            print("data61:",data[61])
            print("data62:",data[62])
            if data[61] == 0x73 and data[62] == 0x73:
                g_tcp_state = True
                print("tcp socket connected success")
        if g_tcp_state == True:
            socket_send_data(serial)
            time.sleep(0.1)
#主程序
if __name__ == '__main__':

    g_tcp_state = False

    serial = serial.Serial('/dev/ttyUSB0', 115200, timeout=0.5)  #/dev/ttyUSB0
    if serial.isOpen() :
        print("open success")
    else :
        print("open failed")

    threading.Thread(target=recv_msg, args=(serial,)).start()
三 總結
at指令在c代碼中和python中是不同的,c代碼中要針對逗號要添加隔離符,python中是不需要的。
還要就是回撤和換行,每個產品都不同,這個添加的時候要具體情況具體分析了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章