当前位置:网站首页>Design of charging pile mqtt transplantation based on 4G EC20 module
Design of charging pile mqtt transplantation based on 4G EC20 module
2022-07-03 09:57:00 【Wukong is so timid】
mqtt 4g transplant
/*******************************************************************************
* Copyright (c) 2014 IBM Corp.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Eclipse Distribution License v1.0 which accompany this distribution.
*
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Ian Craggs - initial API and implementation and/or initial documentation
* Sergio R. Caprile - "commonalization" from prior samples and/or documentation extension
*******************************************************************************/
/**
This simple low-level implementation assumes a single connection for a single thread. Thus, a static
variable is used for that connection.
On other scenarios, the user must solve this by taking into account that the current implementation of
MQTTPacket_read() has a function pointer for a function call to get the data to a buffer, but no provisions
to know the caller or other indicator (the socket id): int (*getfn)(unsigned char*, int)
*/
#include "stm32f10x.h"
#include "st_printf.h"
#include "stm32f10x_it.h"
#include "app4g.h"
#include "project_config.h"
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include "transport.h"
#define INVALID_SOCKET 0xffffffff
static int mysock = INVALID_SOCKET;
int get_mqtt_transport_sock(void)
{
return mysock;
}
#define STATE_CHECK 0
int transport_sendPacketBuffer(int sock, unsigned char* buf, int buflen)
{
// int rc = 0;
//rc = write(sock, buf, buflen);
uint8_t *cmd = at_tx_buffer;
uint8_t *result = at_rx_buffer;
char str_ref[20] = {0};
int ret = -1;
uint8_t result_len = 0;
int i = 0;
if(get_mqtt_transport_sock() < 0)
{
printf("socket have closed,mysock=%d..\r\n",mysock);
return -1;
}
printf("\r\n transport_sendPacketBuffer =%d:\r\n",buflen);
#if 0
for(i=0; i<buflen; i++)
{
if((i)%8 == 0)
printf("%03d: ",i);
printf("0x%02x,",buf[i]);
if((i+1)%8 == 0)
printf("\r\n");
}
printf("\r\n");
#endif
#if(STATE_CHECK ==1)
result_len = 0;
memset(at_tx_buffer,0,UART2_TX_BUFFER_LEN);
memset(at_rx_buffer,0,UART2_RX_BUFFER_LEN);
snprintf(( char*)at_tx_buffer,UART2_TX_BUFFER_LEN, AT_QIACT);
//snprintf(( char*)at_tx_buffer,UART2_TX_BUFFER_LEN, AT_QISTATE);
ret = at_cmd_ack(cmd, strlen((const char*)cmd), result, &result_len,"OK", 2000);
if (ret || !strlen((const char*)result) || !strstr((const char*)result, "OK"))
{
printf("%s fail,ret=%d\r\n",cmd,ret);
return -1;
}
#endif
//QISEND
result_len = 0;
memset(at_tx_buffer,0,UART2_TX_BUFFER_LEN);
memset(at_rx_buffer,0,UART2_RX_BUFFER_LEN);
//snprintf(( char*)at_tx_buffer,UART2_TX_BUFFER_LEN, AT_QISTATE);
//send data with changeable length
sprintf((char*)at_tx_buffer,"AT+QISEND=%d,%d\r\n",sock,buflen);
//sprintf((char*)at_tx_buffer,"AT+QISEND=%d\r\n",sock);
ret =at_cmd_ack(cmd, strlen((const char*)cmd),result,&result_len,">", 2000);
//+QIOPEN: 0,0
if (ret ==0 )
{
printf("ready send data...\r\n");
}
else
{
printf("%s fail,ret=%d\r\n",cmd,ret);
return -1;
}
result_len = 0;
memset(at_tx_buffer,0,UART2_TX_BUFFER_LEN);
memset(at_rx_buffer,0,UART2_RX_BUFFER_LEN);
if(buflen>UART2_TX_BUFFER_LEN)
{
printf("uart tx buffer not engouth\r\n");
return -1;
}
else
{
memcpy(at_tx_buffer,buf,buflen);//note******************
}
ret =at_cmd_ack(cmd, buflen,result,&result_len,"SEND OK", 2000);
/*
if (ret ==0 )
{
printf("send data ok...\r\n");
}
else
{
printf("%s fail,ret=%d\r\n",cmd,ret);
return -2;
}
*/
printf("send data end,ret=%d,sock=%d\r\n",ret,sock);
if(ret == 1)//"+QIURC: \"recv\",0,"
{
memset(str_ref,0,sizeof(str_ref));
sprintf(str_ref,"+QIURC: \"recv\",%d,",sock);
//if(strstr((const char*)result,"+QIURC: \"recv\",0,") != NULL)
printf("QIURC recv check...str_ref=%s\r\n",str_ref);
if(strstr((const char*)result,str_ref) != NULL)
{
result_len = 0;
memset(at_tx_buffer,0,UART2_TX_BUFFER_LEN);
memset(at_rx_buffer,0,UART2_RX_BUFFER_LEN);
sprintf(( char*)at_tx_buffer,"AT+QIRD=%d\r\n",sock);
ret =at_cmd_ack(cmd, strlen((const char *)cmd),result,&result_len,"+QIRD:", 2000);
printf("at_cmd_ack ret=%d,result_len %d is:\r\n",ret,result_len);
//is SEND OK???s
}
}
memset(str_ref,0,sizeof(str_ref));
sprintf(str_ref,"+QIURC: \"closed\",%d",sock);
//if(strstr((const char*)result,"+QIURC: \"recv\",0,") != NULL)
printf("QIURC closed check...str_ref=%s\r\n",str_ref);
// if(strstr((const char*)result,"+QIURC: \"closed\",0") != NULL)
if(strstr((const char*)result,str_ref) != NULL)
{
//printf("socket closed ,ret=%d rec_times=%d\r\n",ret,rec_times);
//QISTATE
mysock = INVALID_SOCKET;
printf("check socket closed,mysock=%d..\r\n",mysock);
result_len = 0;
memset(at_tx_buffer,0,UART2_TX_BUFFER_LEN);
memset(at_rx_buffer,0,UART2_RX_BUFFER_LEN);
snprintf(( char*)at_tx_buffer,UART2_TX_BUFFER_LEN, AT_QIACT);
//snprintf(( char*)at_tx_buffer,UART2_TX_BUFFER_LEN, AT_QISTATE);
ret = at_cmd_ack(cmd, strlen((const char*)cmd), result, &result_len,"OK",2000);
if (ret || !strlen((const char*)result) || !strstr((const char*)result, "OK"))
{
// snprintf(datacap, datacap_len, "4G");
return -3;
}
return -4;
}
#if(STATE_CHECK ==1)
result_len = 0;
memset(at_tx_buffer,0,UART2_TX_BUFFER_LEN);
memset(at_rx_buffer,0,UART2_RX_BUFFER_LEN);
//snprintf(( char*)at_tx_buffer,UART2_TX_BUFFER_LEN, AT_QISTATE);
//sprintf(( char*)at_tx_buffer,"AT+QISEND=0,0\r\n");
sprintf((char*)at_tx_buffer,"AT+QISEND=%d,0\r\n",sock);
ret =at_cmd_ack(cmd, strlen((const char *)cmd),result,&result_len,"OK", 2000);
if (ret == 0 )
{
printf("check send data ok...\r\n");
}
else
{
printf("%s fail,ret=%d\r\n",cmd,ret);
return -5;
}
#endif
return 0;
}
int transport_getdata(unsigned char* buf, int count)
{
#if 1
return transport_getdatanb((void *)&mysock,buf, count);
#else
int rc = 0;
//rc = write(sock, buf, buflen);
uint8_t *cmd = at_tx_buffer;
uint8_t *result = at_rx_buffer;
int ret = -1;
uint8_t result_len = 0;
//QISTATE
memset(at_tx_buffer,0,UART2_TX_BUFFER_LEN);
memset(at_rx_buffer,0,UART2_RX_BUFFER_LEN);
// snprintf(( char*)at_tx_buffer,UART2_TX_BUFFER_LEN, AT_QISTATE);
sprintf(( char*)at_tx_buffer,"AT+QIRD=0,%d",count);
ret =at_cmd_ack(cmd, strlen((const char *)cmd),result,&result_len,"+QIRD:", 2000);
if (ret ==0 )
{
}
else
return -1;
//printf("received %d bytes count %d\n", rc, (int)count);
return rc;
#endif
}
int transport_getdatanb(void *sck, unsigned char* buf, int count)
{
int sock = *((int *)sck); /* sck: pointer to whatever the system may use to identify the transport */
/* this call will return after the timeout set on initialization if no bytes;
in your system you will use whatever you use to get whichever outstanding
bytes your socket equivalent has ready to be extracted right now, if any,
or return immediately */
//int rc = 0;
//rc = write(sock, buf, buflen);
uint8_t *cmd = at_tx_buffer;
uint8_t *result = at_rx_buffer;
int ret = -1;
int data_len = -1;
int bit_num;
uint8_t result_len = 0;
uint8_t rec_times = 0;
int i = 0;
uint8_t*p =NULL;
uint8_t context_id = 0;//context_id 1----16
//[10-10-12:09:20]+QIRD: 0
//[10-10-12:09:20]
//[10-10-12:09:20]OK
char str_ref[20] = {0x0d,0x0a,0x2b,0x51,0x49,0x52,0x44,0x3a,
0x20,0x30,0x0d,0x0a,0x0d,0x0a,0x4f,0x4b,
0x0d,0x0a,};
//QISTATE
printf("\r\n transport_getdatanb:count=%d\r\n",count);
memset(at_tx_buffer,0,UART2_TX_BUFFER_LEN);
memset(at_rx_buffer,0,UART2_RX_BUFFER_LEN);
sprintf(( char*)at_tx_buffer,"AT+QIRD=%d,%d\r\n",sock,count);
//+QIURC: "recv",0
rec:
rec_times++;
printf("\r\n try cmd(%s),rec_times=%d\r\n",cmd,rec_times);
ret =at_cmd_ack(cmd, strlen((const char *)cmd),result,&result_len,"+QIRD:", 5000);
printf("at_cmd_ack ret=%d,result_len %d is:\r\n",ret,result_len);
/*
set uart2 rx complete:21=AT+QIRD=0,1
ERROR
at_cmd_ack ret=-3,result_len 21 is:
0x41,0x54,0x2b,0x51,0x49,0x52,0x44,0x3d,
0x30,0x2c,0x31,0x0d,0x0d,0x0a,0x45,0x52,
0x52,0x4f,0x52,0x0d,0x0a,
*/
#if 0
for(i=0; i<result_len; i++)
{
printf("0x%02x,",result[i]);
if((i+1)%8 == 0)
printf("\r\n");
}
printf("\r\n");
#endif
//if(rec_times > 30)
if(rec_times > 5)
{
printf("no rec data\r\n");
return -1;
}
#if 0
[09-10-20:09:19]+QIURC: "recv"
,0
[09-10-20:09:19]
[09-10-20:09:19]+QIRD: 1
[09-10-20:09:19]
[09-10-20:09:19]
[09-10-20:09:19]OK
[09-11-16:35:58]+QIRD: 0
[09-11-16:35:58]
[09-11-16:35:58]OK
[09-11-16:35:58]
[09-11-16:35:59]+QIURC: "recv"
,0
#endif
#if 0
if(result_len ==18)
{
for(i=0; i<result_len; i++)
{
printf("0x%02x,",result[i]);
str_ref[i] = result[i];
if((i+1)%8 == 0)
printf("\r\n");
}
}
#endif
if(result_len ==18)
{
//+QIRD: 0 OK
if(strncmp((const char*)result,str_ref,18) == 0)
{
printf("there is no data \r\n");
return -1;
}
}
printf("check 1\r\n");
//[09-24-14:16:25]+QIURC: "pdpdeact",1
#if 0
[09-24-14:16:26]set uart2 rx complete:36=
[09-24-14:16:26]+QIURC: "pdpdeact",1
[09-24-14:16:26]AT+QIRD=0,1
[09-24-14:16:26]ERROR
#endif
if(strstr((const char*)result,"+QIURC: \"pdpdeact\",") != NULL)
{
printf("must execute AT+QIDEACT to deactivate the context and reset all connections\r\n");
p = (uint8_t*)strstr((const char*)result,",");
p += strlen(",");
context_id = 0;
bit_num = 0;
while(*p != 0x0d)
{
context_id *= 10;
context_id += *p - '0';
p++;
bit_num++;
}
printf("deactivate contextid is=%d(1-16)\r\n",context_id);
}
else
{
memset(str_ref,0,sizeof(str_ref));
sprintf(str_ref,"+QIURC: \"closed\",%d,",sock);
//if(strstr((const char*)result,"+QIURC: \"recv\",0,") != NULL)
printf("getdata...str_ref=%s\r\n",str_ref);
if(strstr((const char*)result,str_ref) != NULL)
// else if(strstr((const char*)result,"+QIURC: \"closed\",0") != NULL)
{
printf("socket closed ,ret=%d rec_times=%d\r\n",ret,rec_times);
//QISTATE
result_len = 0;
memset(at_tx_buffer,0,UART2_TX_BUFFER_LEN);
memset(at_rx_buffer,0,UART2_RX_BUFFER_LEN);
snprintf(( char*)at_tx_buffer,UART2_TX_BUFFER_LEN,"AT+QICLOSE=%d\r\n",sock);
// snprintf(( char*)at_tx_buffer,UART2_TX_BUFFER_LEN, AT_QICLOSE);
//snprintf(( char*)at_tx_buffer,UART2_TX_BUFFER_LEN, AT_QISTATE);
//ret = AT_cmd(cmd, strlen((const char*)cmd), result, &result_len);
ret =at_cmd_ack(cmd, strlen((const char *)cmd),result,&result_len,"OK", 5000);
printf("at_cmd_ack ret=%d,result_len %d is:\r\n",ret,result_len);
if (ret || !strlen((const char*)result) || !strstr((const char*)result, "OK"))
{
// snprintf(datacap, datacap_len, "4G");
printf("AT+QICLOSE=%d fail\r\n",sock);
return -2;
}
else
{
mysock = INVALID_SOCKET;
sock = transport_open("\"mqtt.jindoo.jopool.net\"",MQTT_PORT);
printf("mqtt_tcp_socket re-transport_open %d\r\n",sock);
if(sock < 0)
{
return -4;
}
}
return -3;
}
}
printf("check 2\r\n");
if(strstr((const char*)result,"+QIRD: 0") != NULL)
{
memset(str_ref,0,sizeof(str_ref));
sprintf(str_ref,"+QIURC: \"recv\",%d,",sock);
//if(strstr((const char*)result,"+QIURC: \"recv\",0,") != NULL)
printf("getdata2...str_ref=%s\r\n",str_ref);
//p = (uint8_t*)strstr((const char*)result,"+QIURC: \"recv\",0,");
p = (uint8_t*)strstr((const char*)result,str_ref);
if(p != NULL)
{
printf("data have rec and get\r\n");
for(i=0; i<result_len; i++)
{
printf("0x%02x,",result[i]);
if((i+1)%8 == 0)
printf("\r\n");
}
printf("\r\n QIURC: recv\r\n");
goto out;
}
else
{
#if 0
+QIRD: 0
OK
+QIURC: "recv"
,1
rx 1 ok
at_cmd_ack ret=0,result_len 38 is:
0x0d,0x0a,0x2b,0x51,0x49,0x52,0x44,0x3a,
0x20,0x30,0x0d,0x0a,0x0d,0x0a,0x4f,0x4b,
0x0d,0x0a,0x0d,0x0a,0x2b,0x51,0x49,0x55,
0x52,0x43,0x3a,0x20,0x22,0x72,0x65,0x63,
0x76,0x22,0x2c,0x31,0x0d,0x0a,
#endif
//p = (uint8_t*)strstr((const char*)result,"+QIURC: \"recv\",0");
//p = (uint8_t*)strstr((const char*)result,str_ref);
//if(p != NULL)
// printf("data have rec ,but need re-get\r\n");
//else
printf("data have not rec,send read check\r\n");
printf("goto rec1=%d**\r\n",rec_times);
goto rec;
}
}
else
{
printf("$$$$$$$$$$$$$\r\n");
}
{
printf("check 3\r\n");
p = (uint8_t*)strstr((const char*)result,"+QIRD: ");
if(p ==NULL)
{
printf("goto rec2=%d,result=%s**\r\n",rec_times,result);
p = (uint8_t*)strstr((const char*)result,"ERROR");
if(p )
{
p = (uint8_t*)strstr((const char*)result,"ERROR");
printf("If the connection does not exist\r\n");
goto out;
}
goto rec;
}
data_len = 0;
//p += 7;
p += strlen("+QIRD: ");
//printf("*p=%c,*p=0x%02x,ret=%d\r\n",*p,*p,ret);
//printf("*p=%c,*p=0x%02x,ret=%d\r\n",*(p+1),*(p+1),ret);
//printf("*p=%c,*p=0x%02x,ret=%d\r\n",*(p+2),*(p+2),ret);
//printf("*p=%c,*p=0x%02x,ret=%d\r\n",*(p+3),*(p+3),ret);
data_len= 0;
bit_num = 0;
while(*p != 0x0d)
{
printf("*p=%c *p=0x%02x,ret=%d\r\n",*p,*p,ret);
data_len *= 10;
data_len += *p - '0';
bit_num++;
p++;
}
printf("autual data len2 is :data_len=%d bit_num=%d\r\n",data_len,bit_num);
p+= 2;
for(i = 0; i < data_len; i++)
{
buf[i] = *p++;
//printf("buf[%d]=0x%02x \r\n",i,buf[i]);
}
if(count == data_len)
{
printf("rec end\r\n");
goto out;
}
}
printf("check 4\r\n");
memset(str_ref,0,sizeof(str_ref));
sprintf(str_ref,"+QIURC: \"recv\",%d,",sock);
//if(strstr((const char*)result,"+QIURC: \"recv\",0,") != NULL)
printf("getdata4...str_ref=%s\r\n",str_ref);
//if(strstr((const char*)result,"+QIURC: \"recv\",0") != NULL)
if(strstr((const char*)result,str_ref) != NULL)
{
// p = (uint8_t*)strstr((const char*)result,"+QIURC: \"recv\",0,");
p = (uint8_t*)strstr((const char*)result,str_ref);
if(p == NULL)
{
printf("need re-send read data\r\n");
}
else
{
printf("data have rec\r\n");
for(i=0; i<result_len; i++)
{
printf("0x%02x,",result[i]);
if((i+1)%8 == 0)
printf("\r\n");
}
printf("\r\n QIURC: recv\r\n");
}
goto rec;
}
//+QIURC: "closed",0
#if 0
p = (uint8_t*)strstr((const char*)result,"+QIRD: ");
if(p ==NULL)
{
return -1;
}
//printf("autual data len is :p=%s\r\n",p);
ret = 0;
p += 7;
while(*p != 0x0d)
{
printf("*p=%c *p=0x%02x,ret=%d\r\n",*p,*p,ret);
ret *= 10;
ret += *p - '0';
p++;
}
printf("autual data len is :ret=%d\r\n",ret);
p+= 2;
for(i = 0; i < ret; i++)
buf[i] = *p++;
//ret =at_cmd_ack(cmd, strlen(cmd),result,&result_len,"+QIURC:", 2000);
ret = 0;
if (ret ==0 )
{
result_len = 0;
//memset(at_tx_buffer,0,UART2_TX_BUFFER_LEN);
//memset(at_rx_buffer,0,UART2_RX_BUFFER_LEN);
//sprintf(( char*)at_tx_buffer,"AT+QIRD=%d,%d\r\n",sock,count);
ret =at_cmd_ack(cmd, strlen(cmd),result,&result_len,"+QIRD:", 5000);
if (ret ==0 )
{
printf("result QIRD:%d\r\n",result_len);
memcpy(buf,result,result_len);
}
else
return -1;
}
else
{
return -2;
}
#endif
out:
//printf("received %d bytes count %d\n", rc, (int)count);
for(i=0; i<data_len; i++)
{
printf("0x%02x,",buf[i]);
if((i+1)%8 == 0)
printf("\r\n");
}
printf("\r\n transport_getdatanb %d:%d end\r\n",count,data_len);
return data_len;
}
/**
return >=0 for a socket descriptor, <0 for an error code
@todo Basically moved from the sample without changes, should accomodate same usage for 'sock' for clarity,
removing indirections
*/
int transport_open(char* addr, int port)
{
uint8_t *cmd = at_tx_buffer;
uint8_t *result = at_rx_buffer;
char str_ref[15] = {0};
int ret = -1;
uint8_t result_len = 0;
int contextid= 1;
int connectid= 0;
int error= 0;
int bit_num= 0;
//QISTATE
#if(STATE_CHECK ==1)
result_len = 0;
memset(at_tx_buffer,0,UART2_TX_BUFFER_LEN);
memset(at_rx_buffer,0,UART2_RX_BUFFER_LEN);
snprintf(( char*)at_tx_buffer,UART2_TX_BUFFER_LEN, AT_QISTATE);
//ret = AT_cmd(cmd, strlen((const char*)cmd), result, &result_len);
ret =at_cmd_ack(cmd, strlen((const char*)cmd),result,&result_len,"OK", 3000);
if (ret || !strlen((const char*)result) || !strstr((const char*)result, "OK"))
{
// snprintf(datacap, datacap_len, "4G");
return -1;
}
#endif
printf("AT_QIOPEN start\r\n");
//transport_sendPacketBuffer("\"182.92.12.11\",123",buf,nbytes);
#if 1
//AT+QIOPEN=1,2,"UDP SERVICE","127.0.0.1",0,3030,0
open:
result_len = 0;
memset(at_tx_buffer,0,UART2_TX_BUFFER_LEN);
memset(at_rx_buffer,0,UART2_RX_BUFFER_LEN);
//snprintf(( char*)at_tx_buffer,UART2_TX_BUFFER_LEN, AT_QISTATE);
if(port == NTP_PORT)
{
//snprintf(( char*)at_tx_buffer,UART2_TX_BUFFER_LEN,"AT+QIOPEN=1,0,\"UDP\",%s,%d,0,0\r\n",addr, port);
//connectid =1;
contextid = NTP_UDP_CONTEXT_ID;
connectid = NTP_UDP_CONNECT_ID;
snprintf(( char*)at_tx_buffer,UART2_TX_BUFFER_LEN,"AT+QIOPEN=%d,%d,\"UDP\",%s,%d,0,0\r\n",contextid,connectid,addr, port);
}
else if(port == MQTT_PORT)
{
//snprintf(( char*)at_tx_buffer,UART2_TX_BUFFER_LEN, AT_QIOPEN);
contextid = MQTT_TCP_CONTEXT_ID;
connectid = MQTT_TCP_CONNECT_ID;
snprintf(( char*)at_tx_buffer,UART2_TX_BUFFER_LEN,"AT+QIOPEN=%d,%d,\"TCP\",%s,%d,0,0\r\n",contextid,connectid,addr, port);
}
else
{
printf("invalid port=%d\r\n",port);
return -1;
}
printf("cmd=%s\r\n",cmd);
#else
char connect_server_ip_port_cmd[56];
memset(connect_server_ip_port_cmd,'\0',56);
strcpy(connect_server_ip_port_cmd,"AT+QIOPEN=1,0,\"UDP\",");
//strcpy(connect_server_ip_port_cmd,"AT+QIOPEN=1,0,\"TCP\",");
//strcat(connect_server_ip_port_cmd,server_ip_and_port);
strcat(connect_server_ip_port_cmd,addr, port);
strcat(connect_server_ip_port_cmd,",0,0\r\n");
#endif
ret =at_cmd_ack(cmd, strlen((const char*)cmd),result,&result_len,"+QIOPEN:", 7000);
//+QIOPEN: 0,0
if (ret ==0 )
{
char i = 0;
//+QIOPEN: 0,561 result_len=24 strlen(pstr)=9
//get connectid
printf("result=%s result_len=%d\r\n",result,result_len);
char* pstr= strstr((const char*)result, ":");
printf("pstr=%s strlen(pstr)=%d\r\n",pstr,strlen(pstr));
for(i=0; i<strlen(pstr); i++)
printf("(*%d:%c=0x%02x*), ",i,*(pstr+i),*(pstr+i));
printf("\r\n");
connectid= *(pstr+2)-'0';
//get error
//pstr= strstr((const char*)result, ",");
//connectid=0 error=178004728
// pstr= strstr((const char*)result, "+QIOPEN: 0,");
sprintf(str_ref,"+QIOPEN: %d,",connectid);
pstr= strstr((const char*)result, str_ref);
printf("str_ref=%s pstr=%s strlen(pstr)=%d\r\n",str_ref,pstr,strlen(pstr));
for(i=0; i<strlen(pstr); i++)
printf("(*%d:%c=0x%02x*), ",i,*(pstr+i),*(pstr+i));
printf("\r\n");
#if 1
//pstr += strlen("+QIOPEN: 0,");
pstr += strlen(str_ref);
error = 0;
bit_num = 0;
while(*pstr != 0x0d)
{
error *= 10;
error += *pstr - '0';
pstr++;
bit_num++;
}
#else
if(strlen(pstr) ==6)
{
error= *(pstr+1)-'0';
error *= 10;
error += *(pstr+2)-'0';
error *= 10;
error += *(pstr+3)-'0';
}
else
error= *(pstr+1)-'0';
#endif
//error= *(pstr+4)-'0';
printf("connectid=%d error=%d bit_num=%d\r\n",connectid,error,bit_num);
if(error == 561)
{
//connectid ++;
//Open PDP context failed
//goto open;
return -2;
}
if(error == 563)
{
connectid ++;
//563 Socket identity has been used
goto open;
}
else if(error != 0)
return -2;
if(connectid != MQTT_TCP_CONNECT_ID )
printf("####MQTT_TCP_CONNECT_ID != connectid= %d\r\n",connectid);
mysock = connectid;
}
else
{
printf("QIOPEN FAIL %d\r\n",ret);
return -3;
}
#if(STATE_CHECK ==1)
printf("QISTATE start\r\n");
//QISTATE
result_len = 0;
memset(at_tx_buffer,0,UART2_TX_BUFFER_LEN);
memset(at_rx_buffer,0,UART2_RX_BUFFER_LEN);
snprintf(( char*)at_tx_buffer,UART2_TX_BUFFER_LEN, AT_QISTATE);
//snprintf(( char*)at_tx_buffer,UART2_TX_BUFFER_LEN, AT_QISTATE);
ret = AT_cmd(cmd, strlen((const char*)cmd), result, &result_len);
if (ret || !strlen((const char*)result) || !strstr((const char*)result, "OK"))
{
// snprintf(datacap, datacap_len, "4G");
return -4;
}
#endif
return mysock;
}
int transport_close(int sock)
{
uint8_t *cmd = at_tx_buffer;
uint8_t *result = at_rx_buffer;
int ret = -1;
uint8_t result_len = 0;
int connectid= sock;
result_len = 0;
//AT_QICLOSE
memset(at_tx_buffer,0,UART2_TX_BUFFER_LEN);
memset(at_rx_buffer,0,UART2_RX_BUFFER_LEN);
snprintf(( char*)at_tx_buffer,UART2_TX_BUFFER_LEN, "AT+QICLOSE=%d\r\n",connectid);
printf("at_tx_buffer=%s\r\n",at_tx_buffer);
ret = AT_cmd(cmd, strlen((const char*)cmd), result, &result_len);
if (ret || !strlen((const char*)result) || !strstr((const char*)result, "OK"))
{
// snprintf(datacap, datacap_len, "4G");
return -1;
}
result_len = 0;
//QISTATE
memset(at_tx_buffer,0,UART2_TX_BUFFER_LEN);
memset(at_rx_buffer,0,UART2_RX_BUFFER_LEN);
snprintf(( char*)at_tx_buffer,UART2_TX_BUFFER_LEN, AT_QISTATE);
ret = AT_cmd(cmd, strlen((const char*)cmd), result, &result_len);
if (ret || !strlen((const char*)result) || !strstr((const char*)result, "OK"))
{
// snprintf(datacap, datacap_len, "4G");
return -1;
}
return 0;
}
// ¶ÌÕûÐÍ´óС¶Ë»¥»»
#define BigLittleSwap16(A) ((((uint16_t)(A) & 0xff00) >> 8) | (((uint16_t)(A) & 0x00ff) << 8))
// ³¤ÕûÐÍ´óС¶Ë»¥»»
#define BigLittleSwap32(A) ( (((uint32_t)(A)&0xff000000) >> 24) | (((uint32_t)(A)&0x00ff0000) >> 8) |(((uint32_t)(A)&0x0000ff00) << 8)|(((uint32_t)(A)&0x000000ff) << 24))
// ±¾»ú´ó¶Ë·µ»Ø1£¬Ð¡¶Ë·µ»Ø0
int checkCPUendian()
{
union {
unsigned long int i;
unsigned char s[4];
} c;
c.i = 0x12345678;
//--1--BIG , 0 LITTLE
return (0x12 == c.s[0]);
}
// Ä£Äâhtonlº¯Êý£¬±¾»ú×Ö½ÚÐòתÍøÂç×Ö½ÚÐò
unsigned long int htonl(unsigned long int h)
{
// Èô±¾»úΪ´ó¶Ë£¬ÓëÍøÂç×Ö½ÚÐòͬ£¬Ö±½Ó·µ»Ø
// Èô±¾»úΪС¶Ë£¬×ª»»³É´ó¶ËÔÙ·µ»Ø
return checkCPUendian() ? h : BigLittleSwap32(h);
}
// Ä£Äântohlº¯Êý£¬ÍøÂç×Ö½ÚÐòת±¾»ú×Ö½ÚÐò
unsigned long int ntohl(unsigned long int n)
{
// Èô±¾»úΪ´ó¶Ë£¬ÓëÍøÂç×Ö½ÚÐòͬ£¬Ö±½Ó·µ»Ø
// Èô±¾»úΪС¶Ë£¬ÍøÂçÊý¾Ýת»»³ÉС¶ËÔÙ·µ»Ø
return checkCPUendian() ? n : BigLittleSwap32(n);
}
// Ä£Äâhtonsº¯Êý£¬±¾»ú×Ö½ÚÐòתÍøÂç×Ö½ÚÐò
unsigned short int htons(unsigned short int h)
{
// Èô±¾»úΪ´ó¶Ë£¬ÓëÍøÂç×Ö½ÚÐòͬ£¬Ö±½Ó·µ»Ø
// Èô±¾»úΪС¶Ë£¬×ª»»³É´ó¶ËÔÙ·µ»Ø
return checkCPUendian() ? h : BigLittleSwap16(h);
}
// Ä£Äântohsº¯Êý£¬ÍøÂç×Ö½ÚÐòת±¾»ú×Ö½ÚÐò
unsigned short int ntohs(unsigned short int n)
{
// Èô±¾»úΪ´ó¶Ë£¬ÓëÍøÂç×Ö½ÚÐòͬ£¬Ö±½Ó·µ»Ø
// Èô±¾»úΪС¶Ë£¬ÍøÂçÊý¾Ýת»»³ÉС¶ËÔÙ·µ»Ø
return checkCPUendian() ? n : BigLittleSwap16(n);
}
#define VERSION_3 3
#define VERSION_4 4
#define MODE_CLIENT 3
#define MODE_SERVER 4
#define NTP_LI 0
#define NTP_VN VERSION_3
#define NTP_MODE MODE_CLIENT
#define NTP_STRATUM 0
#define NTP_POLL 4
#define NTP_PRECISION -6
#define NTP_HLEN 48
#define NTP_PORT 123
#define NTP_SERVER "182.92.12.11"
#define TIMEOUT 10
#define BUFSIZE 100// 1500
#define JAN_1970 0x83aa7e80
#define NTP_CONV_FRAC32(x) (uint64_t) ((x) * ((uint64_t)1<<32))
#define NTP_REVE_FRAC32(x) ((double) ((double) (x) / ((uint64_t)1<<32)))
#define NTP_CONV_FRAC16(x) (uint32_t) ((x) * ((uint32_t)1<<16))
#define NTP_REVE_FRAC16(x) ((double)((double) (x) / ((uint32_t)1<<16)))
#define USEC2FRAC(x) ((uint32_t) NTP_CONV_FRAC32( (x) / 1000000.0 ))
#define FRAC2USEC(x) ((uint32_t) NTP_REVE_FRAC32( (x) * 1000000.0 ))
#define NTP_LFIXED2DOUBLE(x) ((double) ( ntohl(((struct l_fixedpt *) (x))->intpart) - JAN_1970 + FRAC2USEC(ntohl(((struct l_fixedpt *) (x))->fracpart)) / 1000000.0 ))
struct s_fixedpt {
uint16_t intpart;
uint16_t fracpart;
};
struct l_fixedpt {
uint32_t intpart;
uint32_t fracpart;
};
struct ntphdr {
#if 0//__BYTE_ORDER == __BID_ENDIAN
unsigned int ntp_li:2;
unsigned int ntp_vn:3;
unsigned int ntp_mode:3;
#endif
//#if __BYTE_ORDER == __LITTLE_ENDIAN
unsigned int ntp_mode:3;
unsigned int ntp_vn:3;
unsigned int ntp_li:2;
//#endif
uint8_t ntp_stratum;
uint8_t ntp_poll;
int8_t ntp_precision;
struct s_fixedpt ntp_rtdelay;
struct s_fixedpt ntp_rtdispersion;
uint32_t ntp_refid;
struct l_fixedpt ntp_refts;
struct l_fixedpt ntp_orits;
struct l_fixedpt ntp_recvts;
struct l_fixedpt ntp_transts;
};
struct timeval {
time_t tv_sec; // seconds
long tv_usec; // microseconds
};
int get_ntp_packet(void *buf, size_t *size)
{
struct ntphdr *ntp;
struct timeval tv= {0};
if (!size || *size<NTP_HLEN)
return -1;
memset(buf, 0, *size);
ntp = (struct ntphdr *) buf;
ntp->ntp_li = NTP_LI;
ntp->ntp_vn = NTP_VN;
ntp->ntp_mode = NTP_MODE;
ntp->ntp_stratum = NTP_STRATUM;
ntp->ntp_poll = NTP_POLL;
ntp->ntp_precision = NTP_PRECISION;
//gettimeofday(&tv, NULL);
printf("tv.tv_sec:%d\r\n",tv.tv_sec);
printf("tv.tv_usec:%d\r\n",tv.tv_usec);
ntp->ntp_transts.intpart = htonl(tv.tv_sec + JAN_1970);
ntp->ntp_transts.fracpart = htonl(USEC2FRAC(tv.tv_usec));
*size = NTP_HLEN;
return 0;
}
void print_ntp(struct ntphdr *ntp)
{
time_t time;
printf("LI:\t%d \r\n", ntp->ntp_li);
printf("VN:\t%d \r\n", ntp->ntp_vn);
printf("Mode:\t%d \r\n", ntp->ntp_mode);
printf("Stratum:\t%d \r\n", ntp->ntp_stratum);
printf("Poll:\t%d \r\n", ntp->ntp_poll);
printf("precision:\t%d \r\n", ntp->ntp_precision);
printf("Route delay:\t %lf \r\n",
ntohs(ntp->ntp_rtdelay.intpart) + NTP_REVE_FRAC16(ntohs(ntp->ntp_rtdelay.fracpart)));
printf("Route Dispersion:\t%lf \r\n",
ntohs(ntp->ntp_rtdispersion.intpart) + NTP_REVE_FRAC16(ntohs(ntp->ntp_rtdispersion.fracpart)));
printf("Referencd ID:\t %d \r\n", ntohl(ntp->ntp_refid));
time = ntohl(ntp->ntp_refts.intpart) - JAN_1970;
printf("Reference:\t%d %ld %s \r\n",
ntohl(ntp->ntp_refts.intpart) - JAN_1970,
FRAC2USEC(ntohl(ntp->ntp_refts.fracpart)),
ctime(&time));
time = ntohl(ntp->ntp_orits.intpart) - JAN_1970;
printf("Originate:\t%d %d frac=%ld (%s) \r\n",
ntohl(ntp->ntp_orits.intpart) - JAN_1970,
FRAC2USEC(ntohl(ntp->ntp_orits.fracpart)),
ntohl(ntp->ntp_orits.fracpart),
ctime(&time) );
time = ntohl(ntp->ntp_recvts.intpart) - JAN_1970;
printf("Receive:\t%d %d (%s) \r\n",
ntohl(ntp->ntp_recvts.intpart) - JAN_1970,
FRAC2USEC(ntohl(ntp->ntp_recvts.fracpart)),
ctime(&time) );
time = ntohl(ntp->ntp_transts.intpart) - JAN_1970;
printf("Transmit:\t%d %d (%s) \r\n",
ntohl(ntp->ntp_transts.intpart) - JAN_1970,
FRAC2USEC(ntohl(ntp->ntp_transts.fracpart)),
ctime(&time) );
}
#if 1
double get_rrt(const struct ntphdr *ntp, const struct timeval *recvtv)
{
double t1, t2, t3, t4;
t1 = NTP_LFIXED2DOUBLE(&ntp->ntp_orits);
t2 = NTP_LFIXED2DOUBLE(&ntp->ntp_recvts);
t3 = NTP_LFIXED2DOUBLE(&ntp->ntp_transts);
t4 = recvtv->tv_sec + recvtv->tv_usec / 1000000.0;
return (t4 - t1) - (t3 - t2);
}
double get_offset(const struct ntphdr *ntp, const struct timeval *recvtv)
{
double t1, t2, t3, t4;
t1 = NTP_LFIXED2DOUBLE(&ntp->ntp_orits);
t2 = NTP_LFIXED2DOUBLE(&ntp->ntp_recvts);
t3 = NTP_LFIXED2DOUBLE(&ntp->ntp_transts);
t4 = recvtv->tv_sec + recvtv->tv_usec / 1000000.0;
return ((t2 - t1) + (t3 - t4)) / 2;
}
#endif
int at_udp_ntp_test(void)
{
int sock = 0;
size_t nbytes;
unsigned char buf[BUFSIZE]= {0};
char i =0;
int ret = -1;
sock = transport_open("\"182.92.12.11\"",NTP_PORT);
nbytes = BUFSIZE;
if (get_ntp_packet(buf, &nbytes) != 0)
{
printf("construct ntp request error \r\n");
}
printf("get_ntp_packet:%d\r\n",nbytes);
for(i=0; i<nbytes; i++)
printf("buf[%d]=0x%x,",i,buf[i]);
printf("get_ntp_packet:\r\n");
ret = transport_sendPacketBuffer(sock,buf,nbytes);
printf("transport_sendPacketBuffer ret=%d\r\n",ret);
memset(buf,0,sizeof(buf));
ret = transport_getdatanb(&sock,buf,BUFSIZE);
printf("transport_getdatanb:%d\r\n",ret);
if(ret >0)
{
for(i=0; i<ret; i++)
{
printf("buf[%02d]=0x%02x,",i,buf[i]);
if((i+1)%8 == 0)
printf("\r\n");
}
printf("\r\ntransport_getdatanb:\r\n");
}
print_ntp((struct ntphdr *)buf);
//struct timeval recvtv;
// double offset;
// offset = get_offset((struct ntphdr *)buf, &recvtv);
//»ñÈ¡NTP·þÎñÆ÷·µ»ØµÄʱ¼ä
//#define USEC(x) (((x) >> 12) - 759 * ((((x) >> 10) + 32768) >> 16))
struct ntphdr *pbuf=(struct ntphdr *)buf;
// recvtv.tv_sec = pbuf->ntp_transts.intpart - JAN_1970;
// recvtv.tv_usec = USEC(pbuf->ntp_transts.fracpart);
time_t time;
time = ntohl(pbuf->ntp_transts.intpart) - JAN_1970;
printf("»ñÈ¡NTP·þÎñÆ÷·µ»ØµÄʱ¼ä %s\r\n",ctime(&time) );
struct tm *tm_now;
tm_now = localtime(&time);
printf("cur tm_now =%d-%d-%d %d:%d:%d \r\n", \
tm_now->tm_year+1900, tm_now->tm_mon, tm_now->tm_mday, \
tm_now->tm_hour, tm_now->tm_min, tm_now->tm_sec);
transport_close(sock );
return 0;
}
int at_tcp_mqtt_test(void)
{
int sock = 0;
size_t nbytes;
// unsigned char buf[BUFSIZE]= {0};
char i =0;
int ret = -1;
sock = transport_open("\"mqtt.fluux.io\"",1883);
//nbytes = BUFSIZE;
#if 0
[09-10-18:34:24]0x10,0x26,0x00,0x04,0x4d,0x51,0x54,0x54,
[09-10-18:34:24]0x04,0xc2,0x00,0x14,0x00,0x02,0x6d,0x65,
[09-10-18:34:24]0x00,0x08,0x74,0x65,0x73,0x74,0x75,0x73,
[09-10-18:34:24]0x65,0x72,0x00,0x0c,0x74,0x65,0x73,0x74,
[09-10-18:34:24]0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
[09-10-18:47:27]0x10,0x26,0x00,0x04,0x4d,0x51,0x54,0x54,
[09-10-18:47:27]0x04,0xc2,0x00,0x14,0x00,0x02,0x6d,0x65,
[09-10-18:47:27]0x00,0x08,0x74,0x65,0x73,0x74,0x75,0x73,
[09-10-18:47:27]0x65,0x72,0x00,0x0c,0x74,0x65,0x73,0x74,
[09-10-18:47:27]0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,
#endif
unsigned char buf[]= {0x10,0x26,0x00,0x04,0x4d,0x51,0x54,0x54,
0x04,0xc2,0x00,0x14,0x00,0x02,0x6d,0x65,
0x00,0x08,0x74,0x65,0x73,0x74,0x75,0x73,
0x65,0x72,0x00,0x0c,0x74,0x65,0x73,0x74,
0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64
};
nbytes = sizeof( buf);
ret = transport_sendPacketBuffer(sock,buf,nbytes);
printf("transport_sendPacketBuffer ret=%d\r\n",ret);
memset(buf,0,sizeof(buf));
//connack
ret = transport_getdatanb(&sock,buf,4);
printf("transport_getdatanb:%d\r\n",ret);
if(ret >0)
{
for(i=0; i<ret; i++)
{
printf("buf[%02d]=0x%02x,",i,buf[i]);
if((i+1)%8 == 0)
printf("\r\n");
}
printf("\r\ntransport_getdatanb:\r\n");
}
transport_close(sock );
return 0;
}
边栏推荐
- UCI and data multiplexing are transmitted on Pusch - Part I
- Successful graduation [3]- blog system update...
- 单片机职业发展:能做下去的都成牛人了,熬不动就辞职或者改行了
- Project scope management__ Scope management plan and scope specification
- STM32 serial communication principle
- Stm32-hal library learning, using cubemx to generate program framework
- CEF下载,编译工程
- 对于新入行的同学,如果你完全没有接触单片机,建议51单片机入门
- You need to use MySQL in the opening experiment. How can you forget the basic select statement? Remedy is coming~
- MySQL 数据库基础知识(系统化一篇入门)
猜你喜欢
[CSDN] C1 training problem analysis_ Part IV_ Advanced web
Assignment to '*' form incompatible pointer type 'linkstack' {aka '*'} problem solving
Development of fire evacuation system
Which language should I choose to program for single chip microcomputer
Intelligent home design and development
STM32 serial communication principle
Working mode of 80C51 Serial Port
Development of electrical fire system
Matlab reads hexadecimal numbers and converts them into signed short
51 MCU tmod and timer configuration
随机推荐
Notes on C language learning of migrant workers majoring in electronic information engineering
[graduation successful] [1] - tour [Student Management Information System]
学习开发没有捷径,也几乎不存在带路会学的快一些的情况
Idea remote breakpoint debugging jar package project
Project cost management__ Cost management technology__ Article 7 completion performance index (tcpi)
STM32 interrupt priority management
byte alignment
STM32 general timer 1s delay to realize LED flashing
el-table X轴方向(横向)滚动条默认滑到右边
Embedded systems are inherently flawed. Compared with the Internet, there are so many holes that it is simply difficult to walk away from
2.Elment Ui 日期选择器 格式化问题
【男保姆式】教你打开第一个微信小程序
Fundamentals of Electronic Technology (III)__ Logic gate symbols in Chapter 5
要選擇那種語言為單片機編寫程序呢
新系列单片机还延续了STM32产品家族的低电压和节能两大优势
JS foundation - prototype prototype chain and macro task / micro task / event mechanism
UCI and data multiplexing are transmitted on Pusch (Part VI) -- LDPC coding
2020-08-23
对于新入行的同学,如果你完全没有接触单片机,建议51单片机入门
Oracle数据库 SQL语句执行计划、语句跟踪与优化实例