#include "sim800c.h"
#include "gtimer.h"
#include "gkbaseusart.h"
void post_data_stream_to_onenet(void);
char Sim_Init(void);
static GK_USARTBASE_TYPE *puart=NULL;
//++++++++++++使用串口框架+++++++++++//
typedef struct
{
volatile uint8_t start;
volatile uint32_t count;
volatile uint8_t idle;
}timeflagtype;
timeflagtype tflg;
#define RECEIVE_MAX 2048
typedef struct
{
uint16_t len;
char rxBuff[RECEIVE_MAX];
}lbDataType;
lbDataType udata;
//++++++++++++使用串口框架+++++++++++//
//一共3个脚
#define SIMRST_GPIO_Port GPIOB
#define SIMRST_Pin GPIO_PIN_2
#define SIMRST1 HAL_GPIO_WritePin(SIMRST_GPIO_Port, SIMRST_Pin, GPIO_PIN_SET);
#define SIMRST0 HAL_GPIO_WritePin(SIMRST_GPIO_Port, SIMRST_Pin, GPIO_PIN_RESET);
void usart_timer_isr(void)
{
if( tflg.start)
{
if( tflg.count++ > 3 )
{
memset(&tflg,0,sizeof(timeflagtype));
tflg.idle =1;
}
}
}
void modesimRXbyte(uint8_t ch)
{
tflg.start=1;
tflg.count=0;
udata.rxBuff[udata.len++%RECEIVE_MAX]=ch;
}
uint8_t rxbuf[200];
void puart_init(void)
{
if( (puart = GK_usart_read_obj(2))==NULL)SHOWME;
GK_usart_init(puart,2,rxbuf,modesimRXbyte);
}
void modesim_resert( void )
{
SIMRST1;
HAL_Delay(300);
SIMRST0;
HAL_Delay(400);
SHOWME
//这兄弟是低电平开机!和ESP8266不同!
}
void modesim_init(void)
{
static time_type T;
puart_init();
memset(&tflg,0,sizeof(timeflagtype));
timer.creat(&T, 10,1 , usart_timer_isr);
modesim_resert();
}
void modesim_send(uint8_t *TX , uint16_t TXlen )
{
puf->tx(puart, TX, TXlen);
}
void modesim_clear(void)
{
memset(&udata,0,sizeof(lbDataType));
memset(&tflg,0,sizeof(timeflagtype));
}
uint8_t modesim_TXRX_L1(uint8_t *TX , uint16_t TXlen , uint8_t *RX,uint16_t *RXlen )
{
uint8_t Cnt = 100,ack=0;
memset(&udata,0,sizeof(lbDataType));
memset(&tflg,0,sizeof(timeflagtype));
modesim_send(TX,TXlen);
while(Cnt--)
{
HAL_Delay(50);
if(tflg.idle)
{
*RXlen=udata.len;
memcpy(RX,udata.rxBuff,udata.len);
ack=1;
break;
}
HAL_Delay(10);
//printf("Cnt=%d\r\n",Cnt);
}
memset(&udata,0,sizeof(lbDataType));
memset(&tflg,0,sizeof(timeflagtype));
if(ack==0)
return 0;
printf("TX[%s]\r\n",TX);
printf("RX[%s]RXLEN=%d \r\n",RX,*RXlen);
return 1;
}
//TXRX 携带返回比较
uint8_t modesim_TXRX_L2(void *tx , uint16_t length , uint8_t repert , void *checkData)
{
uint8_t *TX = (uint8_t *)tx;
char *CHK = (char *)checkData;
char RX[200]={0};
uint16_t RXLEN=0;
while (1)
{
if(CHK==NULL)
{
printf("ONLY TX [%s]\r\n",TX);
modesim_send(TX,length);
return 1;
}
memset(RX,0,sizeof(RX));
memset(rxbuf,0,sizeof(rxbuf));
if( modesim_TXRX_L1(TX , length ,(uint8_t*)RX , &RXLEN) )
{
if( strstr (RX , CHK) != NULL)
{
return 1;
}
}
if(repert != 0xFF)
{
if( --repert == 0 )return 0;
//printf("repert=%d\r\n",repert);
}
}
}
uint8_t modesim_power_on( void )
{
printf("\r\n%s\r\n",__FUNCTION__);
char *TX="AT\r\n";
uint16_t TXlen=strlen(TX);
char *checkData ="\r\nOK\r\n";
if(modesim_TXRX_L2(TX,TXlen,20,checkData))
{
printf("GSM开机成功\n");
return 1;
}
printf("GSM开机失败\n");
return 0;
}
#include "sim_init_touch.h"
void gsmtest(void)
{
modesim_init();
Sim_Init();
post_data_stream_to_onenet();
}
//++++++++++GKOSON风格++++++++++++++//
typedef struct _AtType_
{
char * At;
char * Chk;
}_AtType;
const _AtType AtBank []={
{"AT\r\n", "\r\nOK\r\n"},
{"ATE0\r\n", "\r\nOK\r\n"},
{"AT+IPR=115200\r\n", "\r\nOK\r\n"},
{"AT+CPIN?\r\n", "\r\n+CPIN: READY\r\n"},
{"AT+CSQ\r\n", "\r\nOK\r\n"},
{"AT+CREG=0\r\n", "\r\nOK\r\n"},
{"AT+CREG?\r\n", "\r\n+CREG: 0,1\r\n"},//回答很多次CREG: 0,2最后终于回答CREG: 0,1
{"AT+CGATT=1\r\n", "\r\nOK\r\n"},//回答很多次ERROR最后终于回答OK
{"AT+CGATT?\r\n", "\r\n+CGATT: 1\r\n"},
{"AT+CIPQSEND=0\r\n", "\r\nOK\r\n"},
{"AT+CIPMUX=1\r\n", "\r\nOK\r\n"},//一次OK =0是单链接 =1是多连接
{"AT+CIPMUX?\r\n", "+CIPMUX: 1"},//一次OK
{"AT+CIPSHUT\r\n", "\r\nSHUT OK\r\n"},
{"AT+CSTT=\"cmiotqipeng.js\"\r\n" "\r\nOK\r\n"},
{"AT+CIICR\r\n", "\r\nOK\r\n"},
{"AT+CIFSR\r\n", "."},//10.4.242.173
{"AT+CIPCLOSE=?\r\n", "\r\nOK\r\n"},
{"AT+CIPSTART=0,\"TCP\",\"183.230.40.33\",80\r\n", "0, ALREADY CONNECT"},//ONENET
};
/*连接ONENET不容易一次成功
一般如下:TX以后不会立刻回答连接状态 而是马上回OK 过来很久很久才回答0, CONNECT OK
而我是急性子 我TX以后只拿到OK 我就再次TX 所以我拿到ALREADY CONNECT
TX[AT+CIPSTART=0,"TCP","183.230.40.33",80
]
RX[
OK
]RXLEN=6
TX[AT+CIPSTART=0,"TCP","183.230.40.33",80
]
RX[
ERROR
0, ALREADY CONNECT
*/
#define fun_chk( fun,id) \
do{\
if( (fun) )\
{ \
printf("Function i=%d OK\r\n\r\n\r\n\r\n",id);\
id++;\
}\
else {\
printf("Function i=%d Failed \r\n",id);\
{\
errcount++ ;\
}\
}\
}while(0)
char Sim_Init(void)
{
uint16_t TXlen=0,i=0;
char *TX = NULL;
char *RXCHK = NULL;
uint8_t rst=0,errcount=0;
for(i=0;i<sizeof(AtBank)/sizeof(*AtBank);)
{
TX = AtBank[i].At;
TXlen = strlen(TX);
RXCHK = AtBank[i].Chk;
errcount=0;
rst = modesim_TXRX_L2(TX , TXlen ,10, RXCHK);
fun_chk(rst,i);
if(errcount==20)
{printf("errcount==20 retry\r\n");modesim_resert();i=0;}
}
printf("\r\n\r\n\r\n###########GO TO NEW WORLD########\r\n\r\n\r\n");
return 0;
}
#define DEVICE_ID "534329033"
#define API_KEY "xdMnSkJ6sTk9OUI5A1vjE7f41SI="
#define DATA_STREAM "SIM800C"
char g_post_data_src[512];
float gvalue = 12;
void post_data_process(char *dev_id, char *api_key)
{
float post_value_point = 0.0;
char post_content[256];
char post_content_len[4];
memset(post_content, 0, sizeof(post_content));
memset(g_post_data_src, 0, sizeof(g_post_data_src));
post_value_point = gvalue++;
#if 1
sprintf(post_content,"{\"datastreams\":[{\"id\":\"%s\",\"datapoints\":[{\"value\":%0.1f}]}]}", (char*)DATA_STREAM, post_value_point);
#else
strcat(post_content, "{\"datastreams\":[{\"id\":\"");
strcat(post_content, g_post_data_stream_name);
strcat(post_content, "\",\"datapoints\":[{\"value\":");
strcat(post_content, g_post_value_point);
strcat(post_content, "}]}]}");
#endif
sprintf(post_content_len, "%d", strlen(post_content));
strcat(g_post_data_src, "POST /devices/");
strcat(g_post_data_src, dev_id);
strcat(g_post_data_src, "/datapoints HTTP/1.1\r\n");
strcat(g_post_data_src, "api-key:");
strcat(g_post_data_src, api_key);
strcat(g_post_data_src, "\r\n");
strcat(g_post_data_src, "Host:api.heclouds.com\r\n");
strcat(g_post_data_src, "Content-Length:");
strcat(g_post_data_src, post_content_len);
strcat(g_post_data_src, "\r\n\r\n");
strcat(g_post_data_src, post_content);
strcat(g_post_data_src, "\r\n\r\n");
printf("\r\n[%s]\r\n", g_post_data_src);
}
void SIM_TX(uint8_t ID,char *msg,uint8_t len)
{
#if 0
uint8_t comm[64] , cmdLength =0 ;
uint8_t id=ID;
memset(comm ,0x00 , sizeof(comm));
cmdLength = sprintf((char *)comm , "AT+CIPSEND=%d,%d\r\n" , id ,len);
modesim_send(comm , cmdLength);
HAL_Delay(200);
modesim_clear();
modesim_send((uint8_t *)msg ,len );
HAL_Delay(200);
#endif
char tx[64] ,rx[64], atlen =0 ;
uint8_t id=ID;
memset(tx ,0x00 , sizeof(tx));
memset(rx ,0x00 , sizeof(rx));
atlen = sprintf(tx , "AT+CIPSEND=%d,%d\r\n" , id ,len);
//sprintf(rx , "\r\nDATA ACCEPT:%d,%d\r\n" , id ,len);
sprintf(rx , "\r\n>" );
_AtType At={tx,rx};
while(modesim_TXRX_L2(At.At , atlen ,50, At.Chk)==0)
{
printf("AT SEND WITHOUT BACK > NOW TRY ANGIN\r\n");
HAL_Delay(50);
}
printf("AT SEND OK NOW SEND MSG\r\n");
modesim_send((uint8_t *)msg ,len );
}
void post_data_stream_to_onenet(void)
{
post_data_process(DEVICE_ID, API_KEY);
SIM_TX(0, g_post_data_src, strlen(g_post_data_src));
}