当前位置: 首页 > news >正文

串口AT指令控制EC20连接MQTT服务器

一、前言

在当今万物互联的时代背景下,物联网技术的快速发展极大地推动了智能化社会的构建。作为其中的关键一环,设备与云端平台之间的通信变得尤为重要。本文介绍如何在Linux操作系统环境下,利用串口通信来实现EC20模块与华为云物联网平台的有效连接。使用Linux下的/dev/ttyUSB0设备文件通过AT指令来配置EC20模块。

EC20 是Quectel 生产的 4G LTE 模块。是一个多功能的通信模块,广泛应用于各种 IoT(物联网)设备中,提供了可靠的无线通信能力。EC20 支持 LTE FDD、LTE TDD、WCDMA 和 GSM 网络,能够实现高速的数据传输和稳定的语音通信。

EC20 模块支持全球主要的频段,使其能够在多个国家和地区的网络环境中正常工作。它能够提供最高达 150 Mbps 的下行速率和 50 Mbps 的上行速率,这使得它非常适合需要高带宽的应用场景,如视频流、远程监控和数据传输。

该模块具有强大的数据通信能力,包括支持 TCP/IP 和 UDP 协议的网络连接。EC20 还支持各种 AT 命令,通过这些命令用户可以控制模块的操作,配置网络设置,发送和接收数据。其内置的网络协议栈使得模块可以直接进行 MQTT、HTTP、FTP 等网络协议的通信,为开发者提供了极大的便利。

除了数据通信功能,EC20 模块还支持语音通话和短信功能。这使得它不仅可以用于数据传输,还可以作为语音通信解决方案。通过 AT 命令,用户可以方便地进行拨打和接听电话,发送和接收短信,满足不同应用场景的需求。

在电源管理方面,EC20 模块具有低功耗模式,能够有效地延长设备的电池寿命。它支持多种电源管理功能,包括睡眠模式和省电模式,使得它在不使用的时候能够降低功耗,减少能量消耗。模块的物理接口包括多个 UART 串口、USB 接口和 GPIO 引脚,这些接口允许模块与其他硬件进行连接。通过这些接口,用户可以实现串口通信、USB 数据传输以及各种数字信号的输入输出,提供了高度的灵活性和可扩展性。

在设计和生产方面,EC20 模块遵循了工业标准,确保其在各种恶劣环境下的可靠性。它的设计小巧且坚固,适合嵌入到各种嵌入式系统和终端设备中。Quectel 提供了详细的技术文档和开发工具,帮助开发者快速集成和部署模块。

二、服务器信息

下面是我采用华为云MQTT物联网服务器创建的设备信息。

IP地址:117.78.5.125
端口号:1883
ClientId      64000697352830580e48df07_dev1_0_0_2023030206
Username      64000697352830580e48df07_dev1
Password      a695af9883c5d0e3817bc6971beeecadf8c7c595677c461b1fe75882ed2bf449
订阅主题:$oc/devices/64000697352830580e48df07_dev1/sys/messages/down
发布主题:$oc/devices/64000697352830580e48df07_dev1/sys/properties/report
发布的消息:{"services": [{"service_id": "stm32","properties":{"DHT11_T":18,"DHT11_H":80,"MQ2":1,"water":1,"flame":1,"light":0,"LED1":0,"LED2":0,"LED3":0}}]}

三、AT 指令

AT+RST: 重启模块AT+CSIM=1: 设置工作模式为数据模式(请根据实际模块手册确认是否需要此指令)AT+QMTOPEN=0,"IP地址",端口号: 连接到 MQTT 服务器AT+QMTCONN=0,"ClientId","Username","Password": 使用提供的 ID、用户名和密码连接到 MQTT 服务器AT+QMTSUB=0,0,"主题",1: 订阅指定主题AT+QMTPUB=0,0,0,0,"主题",消息内容: 发布消息到指定主题

四、Python代码

通过串口 /dev/ttyUSB0 发送 AT 指令以控制 EC20 模块连接华为云物联网平台,并完成 MQTT 通信,使用 Python 脚本实现。下面是实现代码,展示了如何用 Python 通过串口发送 AT 指令来配置 EC20 模块并连接到华为云物联网平台。

# -*- coding: utf-8 -*-import serial
import time# 串口配置
SERIAL_PORT = '/dev/ttyUSB0'
BAUDRATE = 115200
TIMEOUT = 1MQTT_SERVER_IP = '117.78.5.125'
MQTT_SERVER_PORT = '1883'
MQTT_CLIENT_ID = '64000697352830580e48df07_dev1_0_0_2023030206'
MQTT_USERNAME = '64000697352830580e48df07_dev1'
MQTT_PASSWORD = 'a695af9883c5d0e3817bc6971beeecadf8c7c595677c461b1fe75882ed2bf449'PUBLISH_MESSAGE = '{"services": [{"service_id": "stm32","properties":{"DHT11_T":18,"DHT11_H":80,"MQ2":1,"water":1,"flame":1,"light":0,"LED1":0,"LED2":0,"LED3":0}}]}'def send_at_command(serial_conn, command, response_termination='OK', delay=1):print(f"Sending command: {command}")serial_conn.write((command + '\r\n').encode())time.sleep(delay)response = serial_conn.read(serial_conn.inWaiting()).decode()print(f"Response: {response}")if response_termination and response_termination not in response:raise Exception(f"Unexpected response: {response}")return responsedef main():# 打开串口连接with serial.Serial(SERIAL_PORT, BAUDRATE, timeout=TIMEOUT) as ser:try:# 重启模块send_at_command(ser, 'AT+RST')# 设置工作模式为数据模式send_at_command(ser, 'AT+CSIM=1')# 连接到 MQTT 服务器send_at_command(ser, f'AT+QMTOPEN=0,"{MQTT_SERVER_IP}",{MQTT_SERVER_PORT}')send_at_command(ser, 'AT+QMTCONN=0,"{MQTT_CLIENT_ID}","{MQTT_USERNAME}","{MQTT_PASSWORD}"')time.sleep(5)  # 订阅主题send_at_command(ser, 'AT+QMTSUB=0,0,"$oc/devices/64000697352830580e48df07_dev1/sys/messages/down",1')# 发布消息send_at_command(ser, f'AT+QMTPUB=0,0,0,0,"$oc/devices/64000697352830580e48df07_dev1/sys/properties/report",{PUBLISH_MESSAGE}')except Exception as e:print(f"An error occurred: {e}")if __name__ == "__main__":main()

五、C代码   

                                                                                                                                                用 C 用 C 语言实现通过串口发送 AT 指令来控制 EC20 模块并完成 MQTT 通信。下面是实现代码,通过串口配置 EC20 模块并连接到 MQTT 服务器:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <errno.h>
#define SERIAL_PORT "/dev/ttyUSB0"
#define BAUDRATE B115200
int setup_serial_port(const char *port) {int fd = open(port, O_RDWR | O_NOCTTY | O_NDELAY);if (fd == -1) {perror("open");exit(EXIT_FAILURE);}struct termios options;tcgetattr(fd, &options);cfsetispeed(&options, BAUDRATE);cfsetospeed(&options, BAUDRATE);options.c_cflag |= (CLOCAL | CREAD);options.c_cflag &= ~PARENB;options.c_cflag &= ~CSTOPB;options.c_cflag &= ~CSIZE;options.c_cflag |= CS8;tcsetattr(fd, TCSANOW, &options);return fd;
}
void send_at_command(int fd, const char *command) {write(fd, command, strlen(command));write(fd, "\r\n", 2);usleep(100000);// Wait for 100ms for the module to respondchar response[256];int n = read(fd, response, sizeof(response) - 1);if (n > 0) {response[n] = '\0';printf("Response: %s\n", response);} else {printf("No response or read error.\n");}
}
int main() {int fd = setup_serial_port(SERIAL_PORT);// 1. Reset the modulesend_at_command(fd, "AT+RST");// 2. Connect to MQTT serverchar command[300];snprintf(command, sizeof(command), "AT+QMTOPEN=0,\"%s\",%d", "117.78.5.125", 1883);send_at_command(fd, command);snprintf(command, sizeof(command), "AT+QMTCONN=0,\"%s\",\"%s\",\"%s\"", "64000697352830580e48df07_dev1_0_0_2023030206", "64000697352830580e48df07_dev1", "a695af9883c5d0e3817bc6971beeecadf8c7c595677c461b1fe75882ed2bf449");send_at_command(fd, command);usleep(5000000);// Wait 5 seconds for connection to establish// 3. Subscribe to a topicsend_at_command(fd, "AT+QMTSUB=0,0,\"$oc/devices/64000697352830580e48df07_dev1/sys/messages/down\",1");// 4. Publish a messagesprintf(command,  "AT+QMTPUB=0,0,0,0,\"$oc/devices/64000697352830580e48df07_dev1/sys/properties/report\",\"{\\\"services\\\": [{\\\"service_id\\\": \\\"stm32\\\",\\\"properties\\\":{\\\"DHT11_T\\\":18,\\\"DHT11_H\\\":80,\\\"MQ2\\\":1,\\\"water\\\":1,\\\"flame\\\":1,\\\"light\\\":0,\\\"LED1\\\":0,\\\"LED2\\\":0,\\\"LED3\\\":0}}]}\"");send_at_command(fd, command);close(fd);return 0;
}

六、创建虚拟串口测试                                                                                                                                                                                                                                               

在与硬件通信之前,可以先建立一个虚拟串口测试一下。

创建一个虚拟的串口设备 /dev/ttyUSB0 主要有两种方式:使用 socat 工具创建虚拟串口对(虚拟串口设备),或者使用 tty0tty 驱动来创建虚拟串口对。

方法 1: 使用 socat 创建虚拟串口

socat 是一个强大的网络工具,可以创建虚拟串口设备。下面是如何使用 socat 创建两个虚拟串口对:

1、安装 socat:在大多数 Linux 发行版上,可以使用包管理工具安装 socat。例如,在 Debian 或 Ubuntu 上运行:

sudo apt-get install socat
2、创建虚拟串口对:运行以下命令来创建两个虚拟串口设备 /dev/ttyV0和 /dev/ttyV1:
socat -d -d PTY,link=/dev/ttyV0,raw,echo=0 PTY,link=/dev/ttyV1,raw,echo=0

这将创建两个虚拟串口设备 /dev/ttyV0 和 /dev/ttyV1,它们会像物理串口一样工作,可以在程序中使用它们进行测试。

3、使用虚拟串口设备:

  • 可以将一个设备用于发送数据,另一个设备用于接收数据进行测试。例如,可以将一个串口设备配置为连接到模拟的设备,另一个设备配置为模拟的串口设备的接收端。

方法 2: 使用 tty0tty 驱动

tty0tty 是一个内核模块,用于创建虚拟串口对。

以下是如何安装和使用 tty0tty

1、安装 tty0tty:需要从源代码编译和安装 tty0tty。按照以下步骤进行:

sudo apt-get install build-essential linux-headers-$(uname -r)
git clone https://github.com/ntop/tty0tty.git
cd tty0tty
make
sudo make install
sudo depmod -a

2、加载内核模块:运行以下命令加载 tty0tty 内核模块

sudo modprobe tty0tty

这将创建虚拟串口设备 /dev/ttyt0 和 /dev/ttyt1

3、使用虚拟串口设备:

  • /dev/ttyt0 和 /dev/ttyt1 现在可以作为虚拟串口设备使用。可以在程序中将它们作为串口设备来进行测试。

http://www.dtcms.com/a/506994.html

相关文章:

  • 如何实现企业网站推广的系统性网站建设腾讯课堂
  • 全网营销型的网站wordpress 开源吗
  • 常见Linux环境变量深度解析
  • Jetson上安装TensorRT
  • 开发避坑指南(62):解决URLDecoder:Illegal hex characters in escape (%) pattern 异常
  • DAX分列年月日
  • 【开题答辩实录分享】以《自然灾害隐患点管理信息系统》为例进行答辩实录分享
  • dpdk如何与内核进行交互——vdev的用法
  • 丝杆模组如何满足高精度加工设备的高要求?
  • 咋做网站泉州网络推广专员
  • 【STL——vector容器】
  • 如何做网站流量统计网站建设公司中企动力
  • 练习python题目小记(三)
  • 技术视角下的财务自动化:如何用最优TCO评估RPA机器人的性价比?
  • C++ 模板再升级:非类型参数、特化技巧(含全特化与偏特化)、分离编译破解
  • 京东客网站怎么做网站开发公司创业策划
  • 线性表实战:顺序表与链表的奥秘
  • 模块的波动对整个系统的影响
  • Linux服务器编程实践58-getnameinfo函数:通过socket地址获取主机名与服务名
  • Kubernetes(三) Pod 详解与 YAML 配置实战指南
  • 做网上购物网站网络培训seo
  • 电梯门禁系统及机器人乘梯功能的安装调试需要电梯公司技术人员全程配合,这主要由电梯设备的特殊性、安全规范要求及系统集成的复杂性决定。以下是具体原因及配合内容:
  • Windows安全基线、账户密码安全、账户锁定策略、审核策略
  • 介绍一下 辜朝明 的大衰退 理论
  • STM32G474单片机开发入门(二十)单片机IAP(在应用编程)详解及Ymodem实战
  • Flink中自定义序列化器
  • Linux 线程控制与同步互斥
  • 餐饮网站开发性能需求分析电商办属于哪个单位
  • 【Devops-Jenkins自动将Java Maven工程编译成jar、并打成Docker镜像,并上传Harbor】
  • 本地window10同步ubuntu上conda指定环境,并在C#项目中通过Python.NET调用自定义python接口