本帖最后由 shuxulala 于 2015-6-10 09:17 编辑
本实例在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连接,其他过程两者完全一致。