Air724UG 4G LTE 模块AT指令连接服务器


前言

物联网技术日渐热门,万物互联的时代已经到来,我们有必要学习并使用物联网的开发模组,来适应科学技术日新月异的今天,也为日后的工作提供便利


提示:以下是本篇文章正文内容,下面案例可供参考

一、Air724UG是什么?

Air724UG是支持4G通讯的LGA封装芯片,可进行4G LTE通讯。相当于路由器中的芯片,我们把它焊接到pcb上,提供电源和SIM卡,就可以通过指令与网络通讯。

二、AT是什么?

AT指令是应用于终端设备与PC应用之间的连接与通信的指令。AT 即Attention。每个AT命令行中只能包含一条AT指令;对于AT指令的发送,除AT两个字符外,最多可以接收1056个字符的长度(包括最后的空字符)。
每个AT命令行中只能包含一条AT指令;对于由终端设备主动向PC端报告的URC指示或者response响应,也要求一行最多有一个,不允许上报的一行中有多条指示或者响应。AT指令以回车作为结尾,响应或上报以回车换行为结尾。 AT指令在通讯中的作用与意类似Windowns中的DOS,Windows基于DOS建立UI实现可视化操作,我们只看到Windows中的操作,却看不到每一个动作之后隐藏的无数条指令。
AT是用于通讯的指令,常用于通讯模块与控制端之间的通讯,例如多年前的无线网卡。随着通讯技术的发展与通讯协议的迭代,AT在PC与手机上的应用日渐减少。目前的 AT 指令着重应用在4G模块、WiFi 模块、BLE 模块中,目的是为了简化嵌入式设备联网的复杂度。 本模块AT指令参照:https://www.openluat.com/Product/file/asr1802/Luat%204G%E6%A8%A1%E5%9D%97AT%E5%91%BD%E4%BB%A4%E6%89%8B%E5%86%8CV4.1.6.pdf 进行编写

三、服务器是什么?

服务器的具体定义过于晦涩,在本教程中,服务器是指能供远程访问与控制,数据操作与处理的计算机。一般拥有固定的公网IP地址,现多使用云服务器代替自建服务器,例如“阿里云,腾讯云,华为云”等,本教程中使用的是华为云搭建的服务器=来进行演示

四、我们要做什么?

  • 要让Air724UG能通过人工操作建立与服务器的通信
  • 要让服务器能收集存储AIr724UG发送的信息
  • 要让Air724UG能在程序引导下,自动向服务器发送数据
  • 要让Air724UG能在集成了信息收集系统的开发板的引导下,自动向服务器发送收集到的数据**

五、我们该怎么做?

0.准备工作

1、Air724UG开发板+MicroUSB线、SIM卡(老式安卓线)
**Air724UG**
请添加图片描述
2、51单片机(51为例,也可以用STM32或其他开发板)
请添加图片描述

3、QCOM串口通讯助手

下载地址:https://yzui.xyz/yiban/QCOM_V1.6.exe
用于与开发板进行AT通讯
在这里插入图片描述
4、Keil C51单片机编程软件

用于编写单片机程序
在这里插入图片描述
5、Pycharm(服务器用)

Python编译器(本TCP端口使用Python写成,Java与C#都能实现TCP监听,请大家自行尝试)
在这里插入图片描述
6、MobaXterm(服务器用)

连接服务器使用
在这里插入图片描述
7、云服务器(服务器用)

以华为云为例,用于建立TCP通讯及收集数据
在这里插入图片描述

1·连接模块

1、下载并安装驱动
合宙官方资源也地址:https://www.openluat.com/Product/4g/S724.html
驱动地址:https://www.openluat.com/Product/file/uis8910dm/sw_file_20200303181718_8910_module_usb_driver_signed%20_20200303_hezhou.7z
LuaTools地址:http://www.openluat.com/Product/file/luatoolsV2-redirect.html
在这里插入图片描述
下载后得到7z压缩包
在这里插入图片描述
找到并解压该文件
在这里插入图片描述
根据不同的系统版本,安装不同的驱动程序
在这里插入图片描述
进入文件夹后根据电脑CPU位数选择安装程序(新电脑一般为64位)
右击选择“以管理员身份运行”
在这里插入图片描述
在这里插入图片描述
一直点击下一页直到出现下图
点击完成
在这里插入图片描述
至此驱动安装成功

2、下载Luatools工具
LuaTools地址:http://www.openluat.com/Product/file/luatoolsV2-redirect.html
下载时如弹出下图窗口,点击右侧三点后点击保留
在这里插入图片描述
Luatools是单文件软件,但运行会产生Log,建议将其从下载文件夹复制到单独的文件夹中使用

在这里插入图片描述
如出现提示,点击红圈。如遇更新,则根据个人喜好更新,更新会产生其他的文件夹,建议在单独目录下操作。
在这里插入图片描述
成功打开之后的LuaTools
在这里插入图片描述
至此LuaTools安装成功
3、连接4G模块
不插卡的Air724UG(不插卡是为了防止由于使用的模块本来就有故障,而导致机卡绑定的SIM卡失效)用线连接好,与电脑的USB口连接,检查第二列红色LED灯是否常亮,其他LED是否熄灭(如有灯闪烁或常量请检查接线与SIM卡,如无问题请排查硬件问题)
在这里插入图片描述
检查无误后,打开LuaTools,主要这三项内容
在这里插入图片描述

  • COM口的下拉菜单中是否有3项内容(AT,AP,Modem)如是请进行下一项
  • 勾选4G模块(USB打印)前的对勾,并点击重启模块,看是否有信息输出
  • 如不是,则右击“开始”(左下方四个小方块的图标)选择设备管理器
  • 在这里插入图片描述
    打开设备管理器,如有COM口,且为包括AP,AT,Modem,则重启电脑或重装LuaTools。如仍不能解决问题,多是硬件故障,及时更换开发板。
    在这里插入图片描述
    如有输出,则正常(如下图所示)
    在这里插入图片描述
    输出正常后,进入下一步

2.检查固件

注意查看固件版本的结尾字符是否为“AT”,如是,请进行第三步,如不是,请按下边的步骤操作
在这里插入图片描述
固件相关——4G Cat.1)—— XXXX切换为AT版本
在这里插入图片描述
点击后出现下图,点击“下载”(如无问题,固件下载过程是全自动的,如出现问题,建议考虑硬件故障)

在这里插入图片描述
完成后重复步骤一、二,无误后进入步骤三

3.联网测试

1、QCOM串口调试助手
地址:https://yzui.xyz/yiban/QCOM_V1.6.exe(其他途径下载的也行)

在这里插入图片描述
与LuaTools一样,都是单文件程序,建议放到独立文件夹中。界面如下

在这里插入图片描述
左上是连接端口的区域,在配置正确的情况下,能全自动识别,直接点击Open Port即可完成与模块的连接

在这里插入图片描述
左下是命令发送区,在框中输入指令后,调节上方设置,发送指令给模块
在这里插入图片描述
右侧是指令队列设置,上边的框是指令,下边是指令序列的相关设置

在这里插入图片描述
当一切就绪后,右击“开始”(左下方四个小方块的图标)选择设备管理器
在这里插入图片描述
确定COM口后回到QCOM
在左上的COM选择框口中选择AT所对应的COM口,第二个框波特率设置为115200,其他设置不动

在这里插入图片描述
点击OpenPort,观察左下的信息框中的状态,成功则提示Success

在这里插入图片描述
此时已与模块建立了AT的通讯,在左下的框中,如上图示输入“AT”(不带引号),勾选上方的Send with Enter“(发送并执行)后,单击输入框右侧的Send Command,结果如下图示。返回”OK“
在这里插入图片描述
如能返回”OK“则证明已与模块建立了正确的AT通讯,可进入下一步。
如返回值不是OK,或不返回,重新连接并重新测试,一般是端口错误。
2、SIM卡联网测试
将SIM卡放进模组中,在指令发送框中依次发送以下命令
也可以通过导入ini文件的方法一次性执行这些指令
单击右下的Load Test Script选择ini文件打开即可
本测试ini下载地址:https://yzui.xyz/yiban/NETTEST.ini
下载后在Load Test Script中选择并打开即可载入该测试
在这里插入图片描述
测试需调整右下参数
在这里插入图片描述
Run Times是运行次数,一般为1
下边的是每次循环的时间间隔
当连接好模块后,点击Run就可以自动运行了
运行结果如下,右侧框内全是OK则证明已连接上移动网络,如有错误建议重新运行QCOM,或断开连接线后一段时间再试。反复测试有问题的,优先考虑SIM卡问题。
在这里插入图片描述

AT
指令:AT
功能:测试AT指令功能是否正常``

AT

OK

AT+CPIN?
指令:AT+CPIN?
功能:查询SIM卡是否正常,返回ready则表示SIM卡正常
示例,如果SIM卡插入成功,则返回结果为:

AT+CPIN?

+CPIN: READY

OK

如果未插入SIM卡,则返回结果为:

AT+CPIN?

+CME ERROR: 10

AT+CSQ
指令:AT+CSQ
功能:查询模组的信号强度,第一个值为0-31则正常,99为不正常,第二个参数是信道误码率 bit error rate, 只有通话建立后, 才能获知该值。

示例:

AT+CSQ

+CSQ: 19,99

OK

AT+CREG?
指令:AT+CREG?
功能:查询模组是否注册上GSM网络,+CREG:0,1 表示已注册上本地网,+CREG:0,5表示注册上漫游网。

示例:

AT+CREG?

+CREG: 0,1

OK

AT+CGATT?
指令:AT+CGATT?

功能:返回:+CGATT:1,表示网络已激活;若返回:+CGATT:0,则表示网络未激活,请尝试重启模组激活网络。

示例:

AT+CGATT?

+CGATT:1

OK

AT+CEREG=1
指令:AT+CEREG=1

功能:该命令用于查询终端EPS网络注册状态。当使能提示时,终端的网络注册状态信息有变化,会主动上报给用户终端。通过不同的设置可以上报EPS注册状态、位置区码、小区ID、服务小区的接入技术等信息,通常情况下只需要设置为自动上报EPS注册状态。

示例:

AT+CEREG=1

OK

AT+CIPMUX=0
指令:AT+CIPMUX=0
功能:设置为单路连接

示例:

AT+CIPMUX=0

OK

AT+CIPMODE=0
指令:AT+CIPMUX=0
功能:设置为非透传模式

示例:

AT+CIPMUX=0

OK

AT+CIPMODE=1
指令:AT+CIPHEAD=1

功能:设置接收到消息时显示IP头,格式为:"+IPD,data length:"

示例:

AT+CIPHEAD=1

OK

4.服务器配置·建立TCP服务器

首先要拥有一台能通过公网IP远程连接的服务器
可选择云服务器作为平台(学生可通过阿里云考试及认证后,免费领取一台云服务器,但续约需要做题,且如不续约则不能再领取。其他平台有云服务器学生机的优惠,比较便宜,可以考虑)
这里以华为云的鲲鹏学生机服务器为例,演示TCP服务器的配置过程
另外注意,华为云的鲲鹏系列处理器是ARM架构处理器,并不完全支持X86指令集,因此,部分Linux上的操作可能会报错,拿来准备做开发平台的需要格外注意。(特别注意,华为自家OpenHarmony的运行环境无法搭建在该架构服务器上!!!)
华为云:https://www.huaweicloud.com/?locale=zh-cn
1、购买并初始化服务器
自行购买服务器,初始化时注意一点更要安装CentOS7.X或Ubuntu18的系统,便于后续安装宝塔面板(华为云部分服务器没有CentOS,其他平台有CentOS的,首选CentOS)
2、初始化后,在华为云主页右上角的“控制台——弹性云服务器ECS”中可以找到已购买并完成配置的云服务器
在这里插入图片描述
进入并选择远程登陆

在这里插入图片描述
选择CloudShell登录
在这里插入图片描述
输入预留并配置好的账号密码,点击连接进入
在这里插入图片描述
进入后的界面,到此时,已与云服务器完成连接在这里插入图片描述
3、安装宝塔面板和进行一些服务器相关配置
宝塔的安装与配置请参照:https://www.bt.cn/bbs/thread-19376-1-1.html
本文不再赘述
安装完宝塔后,进入宝塔主控页面
主控页面地址一般是:(服务器公网IP地址) X.X.X.X:8888 的格式
服务器公网IP可在控制台的服务器详情页查询到
下图是宝塔的主控页面(因时间问题,没有将服务器重装,故现在显示的是配置完成后的图,具体配置过程,参考上述教程)
在这里插入图片描述
在宝塔的配置过程中,基本上都已安装了各种常用应用,但部分应用仍需用户手动添加
以本教程所用的Python监听接口的执行应用“Python项目管理器”为例
安装流程如下
点开左侧的“软件商店”
在这里插入图片描述
在上方搜索框中输入"Python"
安装第一个Python项目管理器(本图是已安装好的,未安装的会有安装选项)
等待其安装完成后,打开“首页显示”
在这里插入图片描述
完成后回到首页,在首页左下方打开Python项目管理器(未配置项目的打开不会有内容)
在这里插入图片描述
点击左侧的“版本管理”下拉Python版本,选择安装3.6.4版本,点击右侧的安装版本(初次配置为绿色的安装版本,现在显示的是已经安装好的)
注意!!!该应用安装Python版本时间极长,但万不可轻易取消,可以等他安装的同时,再打开一个首页,进行下面的配置
4、端口监听的实现
在Pychram中新建项目,将下面的内容复制进去,并保存为.py文件,如没有Pychram,新建TXT文本文档复制以下内容保存后,将后缀名改为.py也可行)文件名最好用英文或数字

import socket
import threading

class WSGIServer(object):
    def __init__(self, port):
        """初始化对象"""
        # 创建套接字
        self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 解决程序端口占用问题
        self.tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        # 绑定本地ip地址
        self.tcp_server_socket.bind(("", port))
        # 将套接字变为监听套接字,最大连接数量为100
        self.tcp_server_socket.listen(100)

    def run_forever(self):
        """设备连接"""
        while True:
            # 1.等待设备连接(通过ip地址和端口建立tcp连接)
            #   如果有设备连接,则会生成用于设备和服务器通讯的套接字:new_socket
            #   会获取到设备的ip地址和端口
            new_socket, client_addr = self.tcp_server_socket.accept()
            print("设备{0}已连接".format(client_addr))

            # 2.创建线程处理设备的需求
            t1 = threading.Thread(target=self.service_machine, args=(new_socket, client_addr))
            t1.start()

    def service_machine(self, new_socket, client_addr):
        """业务处理"""
        while True:
            # 3.接收设备发送的数据,单次最大1024字节,按‘gbk’格式解码
            receive_data = new_socket.recv(1024).decode("gbk")
            # 4.如果设备发送的数据不为空
            if receive_data:
                # 4.1 打印接收的数据,这里可以将设备发送的数据写入到文件中
                # 获取设备的ID信息
                print(receive_data)
                if receive_data[0:6] == "report":
                    response = "SET OK:" + receive_data
                else:
                    receive_data = receive_data[6:].split(",")[0]
                    # 拼接响应数据
                    response = "alarm=" + receive_data + ",Switch:clear"
                print(response)
                # 4.2 返回原数据作为应答,按‘utf-8’格式编码
                new_socket.send(response.encode("utf-8"))
            # 5.当设备断开连接时,会收到空的字节数据,判断设备已断开连接
            else:
                print('设备{0}断开连接...'.format(client_addr))
                break

        # 关闭套接字
        new_socket.close()


def main(port):
    """创建一个WEB服务器"""
    wsgi_server = WSGIServer(port)
    print("服务器已开启")
    wsgi_server.run_forever()



if __name__ == '__main__':
    port = 1902     # 指定端口
    main(1902)
    import socket
import threading

class WSGIServer(object):
    def __init__(self, port):
        """初始化对象"""
        # 创建套接字
        self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 解决程序端口占用问题
        self.tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        # 绑定本地ip地址
        self.tcp_server_socket.bind(("", port))
        # 将套接字变为监听套接字,最大连接数量为100
        self.tcp_server_socket.listen(100)

    def run_forever(self):
        """设备连接"""
        while True:
            # 1.等待设备连接(通过ip地址和端口建立tcp连接)
            #   如果有设备连接,则会生成用于设备和服务器通讯的套接字:new_socket
            #   会获取到设备的ip地址和端口
            new_socket, client_addr = self.tcp_server_socket.accept()
            print("设备{0}已连接".format(client_addr))

            # 2.创建线程处理设备的需求
            t1 = threading.Thread(target=self.service_machine, args=(new_socket, client_addr))
            t1.start()

    def service_machine(self, new_socket, client_addr):
        """业务处理"""
        while True:
            # 3.接收设备发送的数据,单次最大1024字节,按‘gbk’格式解码
            receive_data = new_socket.recv(1024).decode("gbk")
            # 4.如果设备发送的数据不为空
            if receive_data:
                # 4.1 打印接收的数据,这里可以将设备发送的数据写入到文件中
                # 获取设备的ID信息
                print(receive_data)
                if receive_data[0:6] == "report":
                    response = "SET OK:" + receive_data
                else:
                    receive_data = receive_data[6:].split(",")[0]
                    # 拼接响应数据
                    response = "alarm=" + receive_data + ",Switch:clear"
                print(response)
                # 4.2 返回原数据作为应答,按‘utf-8’格式编码
                new_socket.send(response.encode("utf-8"))
            # 5.当设备断开连接时,会收到空的字节数据,判断设备已断开连接
            else:
                print('设备{0}断开连接...'.format(client_addr))
                break

        # 关闭套接字
        new_socket.close()


def main(port):
    """创建一个WEB服务器"""
    wsgi_server = WSGIServer(port)
    print("服务器已开启")
    wsgi_server.run_forever()


if __name__ == '__main__':
    port = 1902     # 指定端口
    main(1902)**

接下来要将写好的.py文件上传到服务器中
进入服务器的文件选项中,进入wwwroot文件夹
在这里插入图片描述
在wwwroot中新建一个文件夹,自主命名,进入文件夹中
在这里插入图片描述

在这里插入图片描述
单击开始上传

在这里插入图片描述

5.与服务器通讯测试(一)

6.服务器配置·建立通讯数据存储池

7.与服务器通讯测试(二)

8.单片机配置·通讯板控制程序

9.单片机与通讯板连接

10.单片机配置·数据采集程序

11.服务器配置·数据池处理

11.服务器配置·数据展示

该处使用的url网络请求的数据。


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了AT的使用,而开发板提供了大量能使我们快速便捷地处理数据的函数和方法。接下来将会讲到

  • 16
    点赞
  • 159
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
好的,以下是一个简单的示例代码,使用STM32的固件库和合宙air724ug 4G模块通过AT指令获取天气预报信息: ```c #include "stm32f10x.h" #include <string.h> #define BUFFER_SIZE 1024 char response[BUFFER_SIZE]; int response_size = 0; void USART1_IRQHandler(void) { if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { uint16_t data = USART_ReceiveData(USART1); if (response_size < BUFFER_SIZE - 1) { response[response_size++] = (char)data; } } } void send_at_command(char* command) { response_size = 0; USART_SendString(USART1, command); while (response_size == 0) { // wait for response } } int main(void) { // Enable clocks for GPIOA and USART1 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE); // Configure GPIOA9 and GPIOA10 as alternate function push-pull GPIO_InitTypeDef gpio; gpio.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; gpio.GPIO_Mode = GPIO_Mode_AF_PP; gpio.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &gpio); // Configure USART1 USART_InitTypeDef usart; usart.USART_BaudRate = 115200; usart.USART_WordLength = USART_WordLength_8b; usart.USART_StopBits = USART_StopBits_1; usart.USART_Parity = USART_Parity_No; usart.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; usart.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_Init(USART1, &usart); // Enable RX interrupt USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); NVIC_EnableIRQ(USART1_IRQn); // Enable USART1 USART_Cmd(USART1, ENABLE); // Send AT command to initialize air724ug send_at_command("AT\r\n"); // Send AT command to set up PDP context send_at_command("AT+CGDCONT=1,\"IP\",\"internet\"\r\n"); // Send AT command to activate PDP context send_at_command("AT+CGACT=1,1\r\n"); // Send AT command to get weather information from openweathermap.org send_at_command("AT+HTTPPARA=\"URL\",\"http://api.openweathermap.org/data/2.5/weather?q=Shenzhen,cn&appid=<your_api_key>\"\r\n"); // Send AT command to start HTTP GET request send_at_command("AT+HTTPACTION=0\r\n"); // Wait for HTTP GET response while (strstr(response, "+HTTPACTION:0,200") == NULL) { // wait for response } // Print weather information printf("%s", response); while(1) { // loop forever } return 0; } ``` 注意,这个示例代码中的 `<your_api_key>` 部分需要替换为您在 openweathermap.org 注册的 API key。此外,您还需要根据您的 STM32 开发板和合宙air724ug 4G模块的具体连接方式,进行适当的配置。 这个示例代码做了以下几件事情: 1. 配置STM32的GPIO和USART,使其能够与合宙air724ug 4G模块进行通信。 2. 发送AT指令初始化air724ug。 3. 发送AT指令设置PDP上下文。 4. 发送AT指令激活PDP上下文。 5. 发送AT指令获取天气预报信息的URL。 6. 发送AT指令发起HTTP GET请求获取天气预报信息。 7. 等待HTTP GET响应,然后打印响应内容。 希望这个示例代码能够帮助您编写自己的STM32和合宙air724ug 4G模块的AT指令代码。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值