野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 7454|回复: 1

【转】STM32下用AT指令和OneNet保持长连接[EDP]的简单示例

[复制链接]
发表于 2017-7-6 11:04:25 | 显示全部楼层 |阅读模式
本实例在STM32下用AT指令和服务器保持长连接[EDP],硬件平台为STM32f4xxx的单片机,可以用RS232接口和GPRS或者WIFI实现通信,控制GPRS和WIFI模块与服务器建立TCP连接,用EDP协议传输数据,连接建立过程简单快捷,硬件连线图如下:



源代码如下:
  • #include "main.h"
  • #include
  • #define INQERYSIGNAL   "AT+COPS?\r"
  • #define SETLOCALPORT   "AT+CLPORT=\"TCP\",\"2000\"\r"
  • #define MAKETCPCONNECT  "AT+CIPSTART=\"TCP\",\"183.230.40.39\",\"876\"\r"
  • #define CIPMODE  "AT+CIPMODE=1\r"
  • #define TRYCNT 3

复制代码
#define SERVER_ADDR "jjfaedp.hedevice.com"    //OneNet EDP 服务器地址 #define SERVER_PORT 876                       //OneNet EDP 服务器端口 #define DEV_ID "device_id"                         //改成你的设备ID #define API_KEY "api-key" //改成你的API-Key void sendCmd(char* cmd, char* result) {    int i = 0;    while(1)    {        RS232_DMA_Send(cmd, strlen(cmd));        Delay(1000);        i++;        if((NULL != strstr(RS232_buff, result))|| (i >=TRYCNT))        {            GPIO_ToggleBits(LED4);            break;        }    } } int main(void) {    EdpPacket* send_pkg;    char str[] = "{\"datastreams\":[{\"id\":\"sys_time\",\"datapoints\":[{\"value\":110}]}]}";    cJSON *save_json, *desc_json;    USART_232_Configuration();//初始化232串口     RS232_DMA_Init();//初始化串口的DMA传输方式     NVIC_Configuration();//初始化中断     LED_Configuration();//初始化LED指示灯     SysTick_Configuration();//时钟设置     /***************如果用GPRS(SIM900A)和服务器建立TCP连接,用如下代码****************/     sendCmd(INQERYSIGNAL, "CHINA MOBILE");//查询GPRS是否注册到网络     Delay(1000);    sendCmd(SETLOCALPORT, "OK");//设置本地端口     Delay(1000);    sendCmd(CIPMODE, "OK");//设置数据透传模式     Delay(1000);    sendCmd(MAKETCPCONNECT, "CONNECT");//建立TCP连接     Delay(1000);    /*****************************GPRS SET END*************************************/    /***************如果用WIFI(ESP2866)和服务器建立TCP连接,用如下代码****************     sendCmd("AT+CWMODE=3\r", "OK");//选择WIFI应用模式     Delay(500);    sendCmd("AT+RST\r", "OK");//重置模块     Delay(500);    sendCmd(“AT+CWJAP=\"**SSID**\",\"**PASSWORD\"**\r, "OK");//加入AP    Delay(500);    sendCmd("AT+CIPSTART=\"TCP\",\"183.230.40.39\",876\r",  "CONNECT OK");//建立TCP连接     Delay(500);    sendCmd("AT+CIPMODE=1\r",  "OK")//开启透传模;     Delay(500);    sendCmd("AT+CIPSEND\r", ">");//开始发送数据     *****************************WIFI SET END**************************************/    send_pkg = PacketConnect1(DEV_ID, API_KEY);//创建连接请求包     RS232_DMA_Send(send_pkg->_data, send_pkg->_write_pos);//发送设备连接请求     Delay(2000);//等待数据发送完成,此处需加延时     DeleteBuffer(&send_pkg);//释放请求包     Delay(2000);    while(1)    {        save_json=cJSON_Parse(str);//解析JSON数据,str内容可以调用库产生,为了便于说明,此处直接产生         send_pkg = PacketSavedataJson(DEV_ID, save_json);//产生JSON数据包         if(NULL == send_pkg)        {            cJSON_Delete(save_json);            return -1;        }        cJSON_Delete(save_json);//释放内存         RS232_DMA_Send(send_pkg->_data, send_pkg->_write_pos);//发送JSON数据包         Delay(3000);        GPIO_ToggleBits(LED4);//指示灯指示         DeleteBuffer(&send_pkg);//释放数据包内存     } }
因为代码较多,只贴出了主要流程代码,说明AT指令实现EDP连接的过程,因为是STM32平台,对于一些系统设置代码,比如RS232串口设置、中断设置等,都是比较通用的。可以参考STM32相关代码示例,本实例的RS232串口采用DMA的方式和GPRS模块进行通信。如果要用WIFI模块替代GPRS模块,只需将发送的AT指令稍作修改(代码中已有注明修改后的代码段),先和服务器建立TCP连接,其他过程两者完全一致。

回复

使用道具 举报

发表于 2017-7-6 11:56:26 | 显示全部楼层
代码直接打包吧,发上来乱了
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-22 19:12 , Processed in 0.030699 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表