STM32 EC200N-CN MQTT链接服务器开发实录

news2024/11/22 22:25:20

开发环境

硬件:STM32F091CBT6 、EC200N-CN模块板 、USB-TTL串口助手

软件:VS CODE  、 STM32CUBEMX、IAR 8.32

1.硬件设计

连接好EC200N-CN模块和单片机主板。

EC200N-CN模块设计时注意供电和IO电平转换。

EC200N-CN是低功耗的,其主串口用的是1.8V电压域的,一般使用的STM32F0系列单片机IO口是3.3V电平的,两者连接的时候需要电平转换。

电平转换在EC200N的硬件设计手册里有电路图。

我这边设计的EC200N-CN模块预留了

PWRKEY(模块开关机引脚)

RESET_N(模块复位引脚)

主串口-RXD

主串口-TXD引脚。

基本这几个引脚就够一般的物联网应用使用了。

注意注意:

我遇到的大坑1:

上电后,PWKEY引脚一定要低电平才行,低电平才能打开模块,否则模块不开机收不到AT指令,一开始犯了这个错误,因为模块自己印出来的PWKEY通过三极管做了反向处理,理解错了开机电平,导致模块一直不开机。

我遇到的大坑2:

和单片机通讯时,单片机这边因为电平转换要加上拉电阻。

如果没有上拉电阻,两者无法通讯。

EC200N-CN和STM32F091CB 串口通讯故障排查。

即使加了上拉电阻后,任然存在一个BUG。

后面才解决掉。

2.程序编写

配置好单片机IO口的串口模块、波特率,然后就直接发送AT指令就可以了。

ATI

AT+CPIN?

AT+CSQ

AT+CGREG?

AT+CGATT?

AT+QMTCFG="recv/mode",0,0,1
AT+QMTOPEN=0,"www.sukon-cloud.com",9006链接物联网平台
AT+QMTCONN=0,"SMETTest","SMETTest","123456"登录平台
AT+QMTPUBEX=0,0,0,0,"sys/device/SMETTest/variant_data",85发布MQTT消息
{"type":"variant_data","version":"1.0","time":1638766638000,"params":{"UAV":220.9}}

在收到>后发送保文数据。

常用AT指令说明


1、AT
说明: 检测AT指令收发是否正常
模组收到指令回复:

AT
OK


2、AT+CPIN?
说明: 查询SIM卡状态(是否插入SIM卡、锁定SIM卡、解锁SIM卡),返回 READY则表示模组正常
模组收到指令回复:

AT+CPIN?
+CPIN: READY

OK


3、AT+CREG?
说明: 查询当前网络注册状态,正常则回复 +CREG: 0,1
模组收到指令回复:

AT+CREG?
+CREG: 0,1

OK


4、AT+CEREG?
说明: 查询当前EPS网络注册状态,正常则回复 +CEREG: 0,1
模组收到指令回复:

AT+CEREG?
+CEREG: 0,1

OK

5.AT+QMTCFG="recv/mode",0,0,1

模组收到指令回复:

AT+QMTCFG="recv/mode",0,0,1
OK

6.AT+QMTOPEN=0,"www.sukon-cloud.com",9006

模组收到指令回复:

00> AT+QMTOPEN=0,"www.sukon-cloud.com",9006
00> 
00> OK
00> 
00> +QMTOPEN: 0,0

7.AT+QMTCONN=0,"SMETTest","SMETTest","123456"

模组收到指令回复:

00> AT+QMTCONN=0,"SMETTest","SMETTest","123456"
00> 
00> OK
00> 
00> +QMTCONN: 0,0,0

8.AT+QMTPUBEX

AT+QMTPUBEX=0,0,0,0,"sys/device/SMETTest/variant_data",85

模组收到指令回复:

00> AT+QMTPUBEX=0,0,0,0,"sys/device/SMETTest/variant_data",85
00> 
00> >

模组收到指令回复:

9.{"type":"variant_data","version":"1.0","time":1638766638000,"params":{"UAV":220.9}}

模组收到指令回复:

00> > {"type":"variant_data","version":"1.0","time":1638766638000,"params":{"UAV":220.5}}
00> 
00> OK

测试程序:

char Sendbuf[EC20_SEND_BUFF_SIZE];
ErrorStatus F_TestEC200N(uint8_t *cmd)
{
    // scanf("%s",buf);

    uint8_t lu8_cmd =0;
    lu8_cmd = (uint8_t)(*cmd);
    memset(&Sendbuf[0],0x00,EC20_SEND_BUFF_SIZE);
    // sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CPIN?");  
    
    switch (lu8_cmd)
    {
    case 0:
        return 1;
        break;
    case 1:
        /* code */
        sprintf((char*)&Sendbuf[0],"%s\r\n","AT");  
        break;
    case 2:
        /* code */
        sprintf((char*)&Sendbuf[0],"%s\r\n","ATI");  
        break;       
    case 3://查询SIM卡
        /* code */
        sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CPIN?");  
        break;      
    case 4://查询信号,31最大,小于10证明信号超级不好
        /* code */
        sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CSQ");  
        break;      
    case 5://查询PS注册情况,注册则返回1,证明获取IP,可以进行网络使用啦
        /* code */
        sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CGREG?");  
        break;         
    case 6://附着网络是否成功
        /* code */
        sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CGATT?");  
        break;    
    case 7://设置数据格式
        /* code */
        sprintf((char*)&Sendbuf[0],"%s\r\n","AT+QMTCFG=\"recv/mode\",0,0,1");  
        break;   

    case 8://打开工业物联网云端口
        /* code */
        sprintf((char*)&Sendbuf[0],"%s\r\n","AT+QMTOPEN=0,\"www.sukon-cloud.com\",9006");  
        break;   

    case 9://这步执行成功后,设备应该在线了。
        /* code */
        sprintf((char*)&Sendbuf[0],"%s\r\n","AT+QMTCONN=0,\"SMETTest\",\"SMETTest\",\"123456\"");  
        break;          
    case 10://发送数据命令
        /* code */
        sprintf((char*)&Sendbuf[0],"%s\r\n","AT+QMTPUBEX=0,0,0,0,\"sys/device/SMETTest/variant_data\",85");  
        gu16_len = strlen(Sendbuf);
        MX_FEED_IWDG();   
        HAL_UART_Transmit(&huart4, (uint8_t *)&Sendbuf,61, 0xffff);//huart1需要根据你的配置修改
        MX_FEED_IWDG();   
        MX_FEED_IWDG(); 
        HAL_Delay(800);  
        
        memset(&Sendbuf[0],0x00,EC20_SEND_BUFF_SIZE);
        sprintf((char*)&Sendbuf[0],"%s\r\n","{\"type\":\"variant_data\",\"version\":\"1.0\",\"time\":1638766638000,\"params\":{\"UAV\":220.5}}");   
        gu16_len = strlen(Sendbuf);        
        HAL_UART_Transmit(&huart4, (uint8_t *)&Sendbuf,87, 0xffff);//huart1需要根据你的配置修改
        (*cmd) = 0;           
        return 1;
        break;    
    case 11://Paload数据
        /* code */
        sprintf((char*)&Sendbuf[0],"%s\r\n","{\"type\":\"variant_data\",\"version\":\"1.0\",\"time\":1638766638000,\"params\":{\"UAV\":220.5}}");  
        break;      

    case 20://清除链接
        /* code */
        sprintf((char*)&Sendbuf[0],"%s\r\n"," AT+QMTDISC=0");  
        break;    
        
    case 21://清除链接
        /* code */
        sprintf((char*)&Sendbuf[0],"%s\r\n"," AT+QMTDISC=1");  
        break;   

    case 22://清除链接
        /* code */
        sprintf((char*)&Sendbuf[0],"%s\r\n"," AT+QMTDISC=2");  
        break;   

    case 23://清除链接
        /* code */
        sprintf((char*)&Sendbuf[0],"%s\r\n"," AT+QMTDISC=3");  
        break;           
        
    case 24://清除链接
        /* code */
        sprintf((char*)&Sendbuf[0],"%s\r\n"," AT+QMTDISC=4");  
        break;    

    case 25://清除链接
        /* code */
        sprintf((char*)&Sendbuf[0],"%s\r\n"," AT+QMTDISC=5");  
        break;           
        
    default:
        break;
    }       
    MX_FEED_IWDG();   
    HAL_UART_Transmit(&huart4, (uint8_t *)&Sendbuf,86, 0xffff);//huart1需要根据你的配置修改
    (*cmd) = 0;        
}

在编程的时候,遇到一个问题,我使用sprintf函数转存要发送的字符串,sprintf输出双引号的时候,要加“\”如下

    case 8://打开工业物联网云端口
        /* code */
        sprintf((char*)&Sendbuf[0],"%s\r\n","AT+QMTOPEN=0,\"www.sukon-cloud.com\",9006");  
        break;   

遇到一个BUG

我选用了速控云的物联网平台,往平台上上传数据。

平台的教程后面再说,看我心情和时间想不想写。

发送如下指令后,

AT+QMTPUBEX=0,0,0,0,"sys/device/SMETTest/variant_data",85

 再次发送

{"type":"variant_data","version":"1.0","time":1638766638000,"params":{"UAV":220.9}}

 服务器收到的总是HEX数据   一堆00000003241234124  然后一堆数字

经过排查发现,我发送的时候,为了方便,没有计算当前AT指令的长度。每次发送都是发送  固定长度字节的数据(长于当前AT指令的总长度) 

HAL_UART_Transmit(&huart4, (uint8_t *)&Sendbuf,EC20_SEND_BUFF_SIZE, 0xffff);
//EC20_SEND_BUFF_SIZE 为 150

而AT+QMTPUBEX= 指令之后模块会回复  >  然后用户输入要发送的数据,因为我多发了很多 00  导致服务器收到了很多0000  然后整条报文都被识别为hex报文。

AT+QMTPUBEX=0,0,0,0,"sys/device/SMETTest/variant_data",85

修改:  按实际发送大小发送,确保 AT+QMTPUBEX= 指令之后不能发一些无关的字符。

修改后,可以顺利上传平台了。

        sprintf((char*)&Sendbuf[0],"%s\r\n","AT+QMTPUBEX=0,0,0,0,\"sys/device/SMETTest/variant_data\",85");  
        gu16_len = strlen(Sendbuf);
        MX_FEED_IWDG();   
        HAL_UART_Transmit(&huart4, (uint8_t *)&Sendbuf,61, 0xffff);//huart1需要根据你的配置修改

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/624034.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

宝藏达人 | 10年运营支招,一文看懂运营全套技能!

本期介绍的ProcessOn宝藏达人是爱吃小麦馒头,他在互联网领域担任运营官十年以上,有着丰富的业务实操经验和运营方法论。职场风雨历练中他接触过一些“会省钱”的老板,发现有的企业对运营这一职业并未足够重视,随便调个HR做运营经理…

linux中系统性能监测命令sar,查看cpu、内存、磁盘、网络等使用情况

显示系统CPU利用率的统计信息: sar -u 1 5 -u: 这是sar命令的选项之一,表示要显示CPU利用率相关的统计数据。1: 这是指定采样间隔的参数,表示每秒采样一次数据。5: 这是指定采样次数的参数,表示总共采样5次数据。 %user&#xf…

18.5:给定一个栈,请逆序这个栈,不能申请额外的数据结构,只能使用递归函数

给定一个栈,请逆序这个栈,不能申请额外的数据结构,只能使用递归函数 package algorithmbasic.class18;import java.util.Stack;//给定一个栈,请逆序这个栈,不能申请额外的数据结构,只能使用递归函数 publi…

网络安全为什么缺人? 缺什么样的人?

1.网络安全为什么缺人? 缺人的原因是有了新的需求。 以前的时候,所有企业是以产品为核心的,管你有啥漏洞,管你用户信息泄露不泄露,我只要做出来的产品火爆就行。 这一切随着《网络安全法》、《数据安全法》、《网络安全审查办法…

gaussdb的日期函数加减操作

日期加一天,四种写法,减一天换成减法- SELECT now() integer 1 SELECT date 2023-06-08 integer 1 SELECT timestamp 2023-06-08 integer 1 select 2023-06-08 ::date interval 1 day 日期加减一周, select 2023-06-08 ::date …

influxDB 1.8 笔记(更新中)

1、InfluxDB基本数据结构 数据结构含义database数据库measurement数据库中的表retention policy保存策略:让InfluxDB能够知道可以丢弃哪些数据,设置数据自动清除时间,从而更高效的处理数据points表里面的一行数据 points的数据结构 数据结…

Android实例——2048游戏

2048游戏 项目简介ConfigConstantsGameActivityGameItemGameViewMainActivityScreenUtils布局activity_game.xmlactivity_main.xml 项目简介 选择难度,生成随机数字,通关上下左右滑动,合并相同的数字,直到达到目标数字即可通关游…

MAC环境编译Android环境下的FFmpeg6.0版本

文章目录 一. 下载FFmpeg源码二、对FFmpeg进行安装编译三、进行JNI接口编写代码四、在Android 项目中调用.so库五、FFmpeg的代码学习技巧1、整体学习步骤2、FFmpeg的代码学习步骤 六、参考链接: 一. 下载FFmpeg源码 该项目是基于FFmpeg6.0环境编写。文中涉及代码在不同版本可能…

配置MySQL保存Hive元数据

Hive默认使用自带(内嵌)的Derby进行元数据存储,这个就意味着无法实现多个hive shell并发连接Hive。如果需要支持多用户登录Hive,必须配置一个独立的数据库。上一节我们已经将MySQL数据库安装到Linux上,本节我们将讲解一…

微服务架构基础--第1章认识微服务架构

第1章认识微服务架构 一.预习笔记 1.为什么需要微服务架构 传统的单体应用架构都是模块化的设计逻辑,易于开发和调试,也易于部署。但是随着用户量的增加,就无法满足系统的负载,虽然也可以进行单体架构的拓展,但是随着…

设备指纹系列--基础篇

基础概念 618还没开始,但是又好像已经结束了…在这种电商大促的大节日前,电商行业客户一般会提前找到合适的设备指纹产品,去防止被“薅秃”。因为,黑灰产拥有专业的设备牧场,通过使用模拟器、刷机改机等手段&#xff…

算法与数据结构-数组

文章目录 什么是数组线性表连续的内存空间和相同类型的数据 为什么数组的插入和删除是低效的插入删除 容器与数组的区别 什么是数组 数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。 这个定义里有几…

Pytest自动化测试框架生成allure的报告

一、前言 最近通过群友了解到了allure这个报告,开始还不以为然,但还是逃不过真香定律。 经过试用之后,发现这个报告真的很好,很适合自动化测试结果的展示。下面说说我的探索历程吧。 选用的项目为Selenium自动化测试Pytest框架实…

IntelliJ IDEA彻底删除

我们在用idea的时候,idea的环境出现了莫名其妙的问题,怎么也找不到问题原因的时候可以试着把idea卸载重新安装。但是如果你卸载的时候没有删除干净注册表里的信息。就算再次安装回来也还是解决不了问题。 如何删除干净IDEA 将所有jetbrains软件关闭退出…

嵌入式软件工程师招聘

当您招聘嵌入式软件工程师时,以下是一些建议和关键要点,可以帮助您吸引和筛选合适的候选人: 职位描述:清晰地定义嵌入式软件工程师的职责和要求。包括对硬件和软件开发经验的要求、熟练掌握的编程语言(如C、C、Python等…

一文学会MoveIt Setup Assistant搭建moveit2机械臂模型

文章目录 前言一、MoveIt Setup Assistant 是什么?二、搭建步骤拉取相关repo创建项目文档编辑moveit_description文件夹编辑moveit_config文件夹 MoveIt Setup Assistant 配置Launch moveit_setup_assistant配置干涉关系配置planning groups配置ros2 controller配置…

一个 TCP 连接可以发送多少个 HTTP 请求

第一个问题 第二个问题 第三个问题 第四个问题 第五个问题 曾经有这么一道面试题:从 URL 在浏览器被被输入到页面展现的过程中发生了什么? 相信大多数准备过的同学都能回答出来,但是如果继续问:收到的 HTML 如果包含几十个图…

优质高效!阿里内部超高质量的k8s+Jenkins笔记,技术与实战齐飞

什么是k8s? Kubernetes是一个用于容器集群的自动化部署、扩容以及运维的开源平台。 k8s孕育的初衷是培育出一个组件及工具的生态,帮助大家减轻在公有云及私有云上运行应用的负担,换言之,使得大型分布式应用的构建和运维变得更加简单&#…

⛳前端进阶:SEO 全方位解决方案

🌻 前言 SEO 代表搜寻引擎最佳化/搜寻引擎优化(英文全名Search Engine Optimization,简称SEO),是指通过了解搜寻引擎的自然排名的算法逻辑,以提高目标网站在有关搜寻引擎内排名的方式。 网站的 SEO 至关重要,它可以让…

基于springboot的大学外卖系统源码数据库

源码资源在这里 https://download.csdn.net/download/2301_76965813/87881744 1 系统分析 1.1 需求分析 该系统的开发,主要是用在了各个订餐网站的系统,用户可以通过网站进行外卖订餐的信息挂了,并能够对客户进行外卖菜品的订单提交等。该…