2025-04-10 17:31:33 +08:00

935 lines
39 KiB
C

/****************************************************************************
*
* Copy right: 2019-, Copyrigths of EigenComm Ltd.
* File name: plat_config.c
* Description: platform configuration source file
* History: Rev1.0 2019-01-18
*
****************************************************************************/
#include <stdio.h>
#include <stdarg.h>
#include "commonTypedef.h"
#include "lfs_port.h"
#include "dm_task.h"
#include "cucc_dm.h"
#include "osasys.h"
#include "ostask.h"
#include DEBUG_LOG_HEADER_FILE
#include "networkmgr.h"
#include "slpman.h"
#include "ps_lib_api.h"
#include "at_util.h"
#include "MQTTClient.h"
#include "ps_event_callback.h"
#include "ps_lib_api.h"
#include "mw_nvm_config.h"
#include "cucc_mqtt.h"
#include "osasys.h"
#include "ps_mm_if.h"
#include "appmgr.h"
QueueHandle_t dmMsgHandle = NULL;
UINT8 cuccDmSlpHandler = 0xff;
osThreadId_t cuccAutoRegisterTaskHandle = NULL;
osThreadId_t cuccDmAutoRegisterTaskHandle = NULL;
MQTTClient cuccMqttClient;
Network cuccMqttNetwork;
char *cuccMqttSendbuf = NULL;
char *cuccMqttReadbuf = NULL;
char *cuccIMEI = NULL;
char *cuccIMSI = NULL;
char *cuccCCID = NULL;
char *cuccSendPayload = NULL;
UINT32 cuccDmMsgI = 81192;
osTimerId_t cuccDmTimer = NULL;
extern time_t OsaSystemTimeReadSecs(void);
void cuccAutoRegTimerCallback(void)
{
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_cuccAutoRegTimerCallback, P_SIG, "cuccAutoRegTimerCallback....");
}
void cuccAutoRegCheckIfNeedExit(UINT32 needFlag)
{
UINT8 cfun = 0xff;
appGetCFUN(&cfun);
if((cfun == 0)||(needFlag == 1))
{
if(cuccIMEI != NULL)
{
freeEc(cuccIMEI);
cuccIMEI = NULL;
}
if(cuccIMSI != NULL)
{
freeEc(cuccIMSI);
cuccIMSI = NULL;
}
if(cuccCCID != NULL)
{
freeEc(cuccCCID);
cuccCCID = NULL;
}
if(cuccMqttSendbuf != NULL)
{
freeEc(cuccMqttSendbuf);
cuccMqttSendbuf = NULL;
}
if(cuccMqttReadbuf != NULL)
{
freeEc(cuccMqttReadbuf);
cuccMqttReadbuf = NULL;
}
if(cuccSendPayload != NULL)
{
freeEc(cuccSendPayload);
cuccSendPayload = NULL;
}
slpManPlatVoteEnableSleep(cuccDmSlpHandler,SLP_SLP2_STATE); //open the sleep2 gate, it can go to sleep2 and hib state
slpManGivebackPlatVoteHandle(cuccDmSlpHandler);
osThreadExit();
}
}
#define CUCC_DM_AUTOREG_TASK_START
void cuccAutoRegisterTask(void *argument)
{
INT32 ret = 0xff;
INT32 retryCount = 0xff;
INT32 len = 0;
MWNvmCfgDmCuccParam dmCuccParam = {0};
MQTTPacket_connectData connectData = MQTTPacket_connectData_initializer;
char cuccClientID[CUCC_DM_MQTT_CLIENTID_LEN] = {0};
char cuccUsername[CUCC_DM_MQTT_USERNAME_LEN] = {0};
char cuccPassword[CUCC_DM_MQTT_PASSWORD_LEN] = {0};
char dmTopic[CUCC_DM_TOPIC_LEN] = {0};
MQTTString topicName;
char recvPayload[CUCC_DM_MQTT_RECV_DEVICE_SECRET_LEN] = {0};
char *data_start_ptr = NULL;
char *data_end_ptr = NULL;
MQTTMessage message;
float rsrq = -10.2;
int rsrqTemp = 0;
int csq = 30;
int rsrp = -100;
int cellId = 8119;
int snr = 10;
//UINT32 epoch_time = 30;
int primSize;
dmMessage dmMsg;
int autoRegPeriod = 0;
int autoRegPeriodFlag = 0;
UeExtStatusInfo statusInfo;
UINT8 apn[CUCC_DM_APN_LEN] = {0};
utc_timer_value_t *utcTimePtr = NULL;
UINT8 utcTimeBuf[CUCC_DM_UTC_TIME_LEN] = {0};
UINT8 msgId[CUCC_DM_MSG_ID_LEN] = {0};
INT32 timeSyncFlag = 0xff;
INT32 timeSyncRetry = 0;
INT32 i=0;
memset(&dmMsg, 0, sizeof(dmMsg));
memset(&message, 0, sizeof(MQTTMessage));
memset(&dmCuccParam, 0, sizeof(dmCuccParam));
slpManPlatVoteDisableSleep(cuccDmSlpHandler,SLP_SLP2_STATE); //close sleep2 gate now, it can go to active or sleep1
mwNvmCfgGetDmCuccParam(&dmCuccParam);
if(dmCuccParam.mProductKey[0] == 0)
{
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_err1, P_SIG, "mProductKey is null");
slpManPlatVoteEnableSleep(cuccDmSlpHandler,SLP_SLP2_STATE); //open the sleep2 gate, it can go to sleep2 and hib state
slpManGivebackPlatVoteHandle(cuccDmSlpHandler);
osThreadExit();
}
/* step1: init mqtt client */
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_1, P_SIG, "step1: init mqtt client....");
NetworkInit(&cuccMqttNetwork);
cuccMqttSendbuf = mallocEc(CUCC_MQTT_SEND_BUFF_LEN);
cuccMqttReadbuf = mallocEc(CUCC_MQTT_RECV_BUFF_LEN);
memset(cuccMqttSendbuf, 0, CUCC_MQTT_SEND_BUFF_LEN);
memset(cuccMqttReadbuf, 0, CUCC_MQTT_RECV_BUFF_LEN);
MQTTClientInit(&cuccMqttClient, &cuccMqttNetwork, 5000, (unsigned char *)cuccMqttSendbuf, CUCC_MQTT_SEND_BUFF_LEN, (unsigned char *)cuccMqttReadbuf, CUCC_MQTT_RECV_BUFF_LEN);
cuccAutoRegCheckIfNeedExit(0);
/* step2: connect cucc mqtt server with product key/product secret/device key */
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_2, P_SIG, "step2: connect cucc mqtt server....");
if(dmCuccParam.mCuccToken[0] == 0)
{
if(dmCuccParam.mProductSecret[0] == 0)
{
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_err2, P_SIG, "mProductSecret is null");
freeEc(cuccMqttSendbuf);
cuccMqttSendbuf = NULL;
freeEc(cuccMqttReadbuf);
cuccMqttReadbuf = NULL;
slpManPlatVoteEnableSleep(cuccDmSlpHandler,SLP_SLP2_STATE); //open the sleep2 gate, it can go to sleep2 and hib state
slpManGivebackPlatVoteHandle(cuccDmSlpHandler);
osThreadExit();
}
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_2_1, P_SIG, "step2: connect cucc mqtt server with product key/product secret....");
mqttCuccDynNoPreRegIdentity((const char *)dmCuccParam.mProductKey, (const char *)cuccCCID, (const char *)cuccIMEI, (const char *)dmCuccParam.mProductSecret, (char *)&cuccClientID, (char *)&cuccUsername, (char *)&cuccPassword);
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_cuccClientID, P_SIG, "cuccClientID=%s",cuccClientID);
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_cuccUsername, P_SIG, "cuccUsername=%s",cuccUsername);
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_cuccPassword, P_SIG, "cuccPassword=%s",cuccPassword);
ret = MQTTCuccCreate(&cuccMqttClient, &cuccMqttNetwork, cuccClientID, cuccUsername, cuccPassword, CUCC_MQTT_SERVER_URL, CUCC_MQTT_SERVER_PORT, &connectData);
cuccAutoRegCheckIfNeedExit(0);
if(ret != 0)
{
for(retryCount=0; retryCount<3; retryCount++)
{
cuccAutoRegCheckIfNeedExit(0);
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_MQTTCuccCreate, P_SIG, "MQTTCuccCreate...retryCount=%d....", retryCount);
ret = MQTTCuccCreate(&cuccMqttClient, &cuccMqttNetwork, cuccClientID, cuccUsername, cuccPassword, CUCC_MQTT_SERVER_URL, CUCC_MQTT_SERVER_PORT, &connectData);
if(ret == 0)
{
break;
}
}
}
if(ret != 0)
{
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_exit, P_SIG, "MQTTCuccCreate....fail..exit..task........");
freeEc(cuccMqttSendbuf);
cuccMqttSendbuf = NULL;
freeEc(cuccMqttReadbuf);
cuccMqttReadbuf = NULL;
slpManPlatVoteEnableSleep(cuccDmSlpHandler,SLP_SLP2_STATE); //open the sleep2 gate, it can go to sleep2 and hib state
slpManGivebackPlatVoteHandle(cuccDmSlpHandler);
osThreadExit();
}
/* step3: sub mqtt client topic, preRegist is $/sys/productKey/deviceKey/ext/regist, no preRegist is $/sys/productKey/deviceKey/ext/autoregist */
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_3, P_SIG, "step3: sub mqtt client topic, $/sys/productKey/deviceKey/ext/autoregist....");
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_MQTTCuccSubscribe, P_SIG, "MQTTCuccSubscribe....$sys/productKey/deviceKey/ext/autoregist........");
memset(dmTopic, 0, CUCC_DM_TOPIC_LEN);
snprintf(dmTopic, CUCC_DM_TOPIC_LEN, "$sys/%s/%s/ext/autoregist", dmCuccParam.mProductKey, (const char *)cuccIMEI);
ret = MQTTCuccSubscribe(&cuccMqttClient, (const char* )dmTopic, QOS0, NULL);
cuccAutoRegCheckIfNeedExit(0);
if(ret != 0)
{
for(retryCount=0; retryCount<3; retryCount++)
{
cuccAutoRegCheckIfNeedExit(0);
ret = MQTTCuccSubscribe(&cuccMqttClient, (const char* )dmTopic, QOS0, NULL);
if(ret == 0)
{
break;
}
}
}
/* step4: wait for cucc mqtt server send token */
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_4, P_SIG, "step4: wait for cucc mqtt server sending token....");
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_MQTTCuccWaitForRecv, P_SIG, "MQTTCuccWaitForRecv....$sys/productKey/deviceKey/ext/autoregist........");
ret = MQTTCuccWaitForRecv(&cuccMqttClient, PUBLISH, 100000, &topicName, recvPayload);
cuccAutoRegCheckIfNeedExit(0);
if(ret == 0)
{
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_recvPayload, P_SIG, "recvPayload=%s",recvPayload);
data_start_ptr = strstr(recvPayload, "token");/*for no pre autoregist, server publish "token", for auroreist, server publish "deviceSecret"*/
if(data_start_ptr == NULL)
{
cuccAutoRegCheckIfNeedExit(0);
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_4_2, P_SIG, "step4: get token fail and exit task....");
freeEc(cuccMqttSendbuf);
cuccMqttSendbuf = NULL;
freeEc(cuccMqttReadbuf);
cuccMqttReadbuf = NULL;
slpManPlatVoteEnableSleep(cuccDmSlpHandler,SLP_SLP2_STATE); //open the sleep2 gate, it can go to sleep2 and hib state
slpManGivebackPlatVoteHandle(cuccDmSlpHandler);
osThreadExit();
}
else
{
data_start_ptr = data_start_ptr+8;
data_end_ptr = strstr(data_start_ptr, "\"");
len = data_end_ptr-data_start_ptr;
memset(cuccPassword, 0, CUCC_DM_MQTT_PASSWORD_LEN);
memcpy(cuccPassword, data_start_ptr, len); /*for no pre autoregist, the token is password and deviceSecret*/
memset(dmCuccParam.mCuccToken, 0, sizeof(dmCuccParam.mCuccToken));
memcpy(dmCuccParam.mCuccToken, cuccPassword, len);
mwNvmCfgSetAndSaveDmCuccParam(&dmCuccParam);
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_4_1, P_SIG, "step4: get token ok and save token....");
}
}
/* step5: disconnect mqtt client */
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_5, P_SIG, "step5: disconnect mqtt client....");
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_MQTTCuccDisconnect, P_SIG, "MQTTCuccDisconnect............");
MQTTCuccDisconnect(&cuccMqttClient);
}
/* step6: connect cucc mqtt server with product key/token */
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_6, P_SIG, "step6: connect cucc mqtt server with product key/token....");
memset(cuccClientID, 0, CUCC_DM_MQTT_CLIENTID_LEN);
memset(cuccUsername, 0, CUCC_DM_MQTT_USERNAME_LEN);
mqttCuccNoPreIdentity((const char *)dmCuccParam.mProductKey, (const char *)cuccCCID, (const char *)cuccIMEI, (char *)cuccClientID, (char *)cuccUsername);
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_ClientID, P_SIG, "cuccClientID=%s",cuccClientID);
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_Username, P_SIG, "cuccUsername=%s",cuccUsername);
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_Password, P_SIG, "cuccPassword=%s",dmCuccParam.mCuccToken);
NetworkInit(&cuccMqttNetwork);
MQTTClientInit(&cuccMqttClient, &cuccMqttNetwork, 20000, (unsigned char *)cuccMqttSendbuf, CUCC_MQTT_SEND_BUFF_LEN, (unsigned char *)cuccMqttReadbuf, CUCC_MQTT_RECV_BUFF_LEN);
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_MQTTCuccConnect, P_SIG, "MQTTCuccConnect............");
ret = MQTTCuccCreate(&cuccMqttClient, &cuccMqttNetwork, cuccClientID, cuccUsername, (char *)dmCuccParam.mCuccToken, CUCC_MQTT_SERVER_URL, CUCC_MQTT_SERVER_PORT, &connectData);
//ret = MQTTCuccConnect(&cuccMqttClient, cuccClientID, cuccUsername, dmCuccParam.mCuccToken, &connectData);
cuccAutoRegCheckIfNeedExit(0);
if(ret != 0)
{
for(retryCount=0; retryCount<3; retryCount++)
{
cuccAutoRegCheckIfNeedExit(0);
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_ReMQTTCuccConnect, P_SIG, "MQTTCuccConnect...retryCount=%d....", retryCount);
ret = MQTTCuccCreate(&cuccMqttClient, &cuccMqttNetwork, cuccClientID, cuccUsername, (char *)dmCuccParam.mCuccToken, CUCC_MQTT_SERVER_URL, CUCC_MQTT_SERVER_PORT, &connectData);
if(ret == 0)
{
break;
}
}
}
if(ret != 0)
{
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_6_1, P_SIG, "MQTTCuccCreate....fail..exit..task........");
freeEc(cuccMqttSendbuf);
cuccMqttSendbuf = NULL;
freeEc(cuccMqttReadbuf);
cuccMqttReadbuf = NULL;
slpManPlatVoteEnableSleep(cuccDmSlpHandler,SLP_SLP2_STATE); //open the sleep2 gate, it can go to sleep2 and hib state
slpManGivebackPlatVoteHandle(cuccDmSlpHandler);
osThreadExit();
}
/* step7: subscribe cucc server topic property/batch_reply and deviceShadow/command */
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_7, P_SIG, "step7: subscribe cucc server topic property/batch_reply and deviceShadow/command....");
memset(dmTopic, 0, CUCC_DM_TOPIC_LEN);
snprintf(dmTopic, CUCC_DM_TOPIC_LEN, "$sys/%s/%s/property/batch_reply", dmCuccParam.mProductKey, (const char *)cuccIMEI);
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_batch_reply, P_SIG, "MQTTCuccSubscribe......$sys/productKey/deviceKey/property/batch_reply......");
ret = MQTTCuccSubscribe(&cuccMqttClient, (const char* )dmTopic, QOS0, NULL);
memset(dmTopic, 0, CUCC_DM_TOPIC_LEN);
snprintf(dmTopic, CUCC_DM_TOPIC_LEN, "$sys/%s/%s/deviceShadow/command", dmCuccParam.mProductKey, (const char *)cuccIMEI);
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_deviceShadow, P_SIG, "MQTTCuccSubscribe......$sys/productKey/deviceKey/deviceShadow/command......");
ret = MQTTCuccSubscribe(&cuccMqttClient, (const char* )dmTopic, QOS0, NULL);
/* step8: send register param info to cucc server */
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_8, P_SIG, "step7: send register param info to cucc server....");
cuccSendPayload = mallocEc(CUCC_MQTT_SEND_PAYLOAD_LEN);
memset(cuccSendPayload, 0, CUCC_MQTT_SEND_PAYLOAD_LEN);
memset(dmTopic, 0, CUCC_DM_TOPIC_LEN);
snprintf(dmTopic, CUCC_DM_TOPIC_LEN, "$sys/%s/%s/property/batch", dmCuccParam.mProductKey, (const char *)cuccIMEI);
ret = appGetUeExtStatusInfoSync(UE_EXT_STATUS_PHY, &statusInfo);
if(ret == 0){
cellId = statusInfo.rrcStatus.cellId;
rsrp = statusInfo.phyStatus.sRsrp/100;
rsrq = ((float)statusInfo.phyStatus.sRsrq)/100;
snr = statusInfo.phyStatus.snr;
csq = mmGetCsqRssiFromCesq(rsrp, rsrq, statusInfo.phyStatus.rssiAllBW);
appGetAPNSettingSync(cellId, apn);
if(apn[0]==0)
{
memcpy(apn, "3gnet", strlen("3gnet"));
}
}
timeSyncFlag = appCheckSystemTimeSync();
if(timeSyncFlag != 0)
{
for(timeSyncRetry=0; timeSyncRetry<4; timeSyncRetry++)
{
AppMgrSntpStart("cn.ntp.org.cn", 0, BROADCAST_IND_HANDLER, 1, LWIP_PS_INVALID_CID);
for(i=0; i<10; i++)
{
timeSyncFlag = appCheckSystemTimeSync();
if(timeSyncFlag == 0)
{
break;
}
else
{
osDelay(300);
}
}
AppMgrSntpStop();
if(timeSyncFlag == 0)
{
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_Sntp2, P_SIG, "Sntp is ready....");
break;
}
}
}
utcTimePtr = OsaSystemTimeReadUtc();
int year =0;
int month =0;
int day =0;
int hour =0;
year = utcTimePtr->UTCtimer1>>16&0xffff;
month = (utcTimePtr->UTCtimer1>>8)&0xff;
day = utcTimePtr->UTCtimer1&0xff;
hour = (utcTimePtr->UTCtimer2>>24)&0xff;
if((hour+8) >= 24)
{
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
day = day+1;
if(day >31)
{
month = month+1;
day = 1;
hour = (hour+8) -24;
}
break;
case 4:
case 6:
case 9:
case 11:
day = day+1;
if(day >30)
{
month = month+1;
day = 1;
hour = (hour+8) -24;
}
break;
case 2:
day = day+1;
if(((day >29)&&((year%4) == 0))||((day >28)&&((year%4) != 0)))
{
month = month+1;
day = 1;
hour = (hour+8) -24;
}
break;
case 12:
day = day+1;
if(day >31)
{
month = month+1;
if(month > 12)
{
month = 1;
year = year+1;
}
day = 1;
hour = (hour+8) -24;
}
break;
}
}
else
{
hour = hour+8;
}
sprintf((char *)utcTimeBuf, "%04d/%02d/%02d %02d:%02d:%02d.%03d", year, month, day, hour, (utcTimePtr->UTCtimer2>>16)&0xff, (utcTimePtr->UTCtimer2>>8)&0xff, (utcTimePtr->UTCms));
atDataToDecString(msgId, CUCC_DM_MSG_ID_LEN, cuccDmMsgI);
cuccDmMsgI++;
if(rsrq <0.01)
{
rsrq = 0-rsrq;
rsrqTemp = (int)(rsrq*100);
sprintf( cuccSendPayload,
"{\"messageId\":\"%s\",\"params\":{\"data\":[{\"key\":\"manufacturer\",\"value\":\"%s\",\"ts\":\"\"},{\"key\":\"moduleType\",\"value\":\"%s\",\"ts\":\"\"},{\"key\":\"moduleIMEI\",\"value\":\"%s\",\"ts\":\"\"},{\"key\":\"chipManufacturer\",\"value\":\"%s\",\"ts\":\"\"},{\"key\":\"chipType\",\"value\":\"%s\",\"ts\":\"\"},{\"key\":\"moduleSoftwareVersion\",\"value\":\"%s\",\"ts\":\"\"},{\"key\":\"moduleHardwareVersion\",\"value\":\"%s\",\"ts\":\"\"},{\"key\":\"connectionMode\",\"value\":\"%s\",\"ts\":\"\"},{\"key\":\"moduleIMSI\",\"value\":\"%s\",\"ts\":\"\"},{\"key\":\"moduleICCID\",\"value\":\"%s\",\"ts\":\"\"},{\"key\":""\"csq\",\"value\":%d,\"ts\":\"\"},{\"key\":\"rsrp\",\"value\":%d,\"ts\":\"\"},{\"key\":\"rsrq\",\"value\":-%d.%d,\"ts\":\"\"},{\"key\":\"signalECL\",\"value\":%d,\"ts\":\"\"},{\"key\":\"sinr\",\"value\":%d,\"ts\":\"\"},{\"key\":\"cellID\",\"value\":\"%lu\",\"ts\":\"\"},{\"key\":\"APN\",\"value\":\"%s\",\"ts\":\"\"},{\"key\":\"longitude\",\"value\":%d,\"ts\":\"\"},{\"key\":\"latitude\",\"value\":%d,\"ts\":\"\"},{\"key\":\"altitude\",\"value\":%d,\"ts\":\"\"},{\"key\":\"moduleTime\",\"value\":\"%s\",\"ts\":\"\"},{\"key\":\"internetTime\",\"value\":\"%s\",\"ts\":\"\"},{\"key\":\"autoRegperiod\",\"value\":%d,\"ts\":\"\"},{\"key\":\"powerSavingMode\",\"value\":%d,\"ts\":\"\"}]}}",
msgId,dmCuccParam.manufacture, dmCuccParam.moduleType, cuccIMEI, dmCuccParam.chipManufacturer, dmCuccParam.chipType, dmCuccParam.moduleSWVer, dmCuccParam.moduleHWVer, "CAT1", cuccIMSI, cuccIMEI, csq, rsrp, rsrqTemp/100, (rsrqTemp%100)/10, 0, snr, cellId, apn, 120, 30, 108, utcTimeBuf, utcTimeBuf, dmCuccParam.autoRegPeriod, 0);
}
else
{
sprintf( cuccSendPayload,
"{\"messageId\":\"%s\",\"params\":{\"data\":[{\"key\":\"manufacturer\",\"value\":\"%s\",\"ts\":\"\"},{\"key\":\"moduleType\",\"value\":\"%s\",\"ts\":\"\"},{\"key\":\"moduleIMEI\",\"value\":\"%s\",\"ts\":\"\"},{\"key\":\"chipManufacturer\",\"value\":\"%s\",\"ts\":\"\"},{\"key\":\"chipType\",\"value\":\"%s\",\"ts\":\"\"},{\"key\":\"moduleSoftwareVersion\",\"value\":\"%s\",\"ts\":\"\"},{\"key\":\"moduleHardwareVersion\",\"value\":\"%s\",\"ts\":\"\"},{\"key\":\"connectionMode\",\"value\":\"%s\",\"ts\":\"\"},{\"key\":\"moduleIMSI\",\"value\":\"%s\",\"ts\":\"\"},{\"key\":\"moduleICCID\",\"value\":\"%s\",\"ts\":\"\"},{\"key\":""\"csq\",\"value\":%d,\"ts\":\"\"},{\"key\":\"rsrp\",\"value\":%d,\"ts\":\"\"},{\"key\":\"rsrq\",\"value\":%d.%d,\"ts\":\"\"},{\"key\":\"signalECL\",\"value\":%d,\"ts\":\"\"},{\"key\":\"sinr\",\"value\":%d,\"ts\":\"\"},{\"key\":\"cellID\",\"value\":\"%lu\",\"ts\":\"\"},{\"key\":\"APN\",\"value\":\"%s\",\"ts\":\"\"},{\"key\":\"longitude\",\"value\":%d,\"ts\":\"\"},{\"key\":\"latitude\",\"value\":%d,\"ts\":\"\"},{\"key\":\"altitude\",\"value\":%d,\"ts\":\"\"},{\"key\":\"moduleTime\",\"value\":\"%s\",\"ts\":\"\"},{\"key\":\"internetTime\",\"value\":\"%s\",\"ts\":\"\"},{\"key\":\"autoRegperiod\",\"value\":%d,\"ts\":\"\"},{\"key\":\"powerSavingMode\",\"value\":%d,\"ts\":\"\"}]}}",
msgId,dmCuccParam.manufacture, dmCuccParam.moduleType, cuccIMEI, dmCuccParam.chipManufacturer, dmCuccParam.chipType, dmCuccParam.moduleSWVer, dmCuccParam.moduleHWVer, "CAT1", cuccIMSI, cuccIMEI, csq, rsrp ,rsrqTemp/100, (rsrqTemp%100)/10, 0, snr, cellId, apn, 120, 30, 108, utcTimeBuf, utcTimeBuf, dmCuccParam.autoRegPeriod, 0);
}
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_MQTTCuccPublish, P_SIG, "MQTTCuccPublish......$sys/productKey/deviceKey/property/batch......");
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_cuccSendPayload, P_SIG, "cuccSendPayload:%s.",cuccSendPayload);
message.payload = cuccSendPayload;
message.payloadlen = strlen((char *)cuccSendPayload);
ret = MQTTCuccPublish(&cuccMqttClient, (const char* )dmTopic, &message);
cuccAutoRegCheckIfNeedExit(0);
/* step9: wait to recv publish ack */
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_9, P_SIG, "step9: recv for publish ack....");
ret = MQTTCuccWaitForRecv(&cuccMqttClient, PUBLISH, 100000, &topicName, recvPayload);
cuccAutoRegCheckIfNeedExit(0);
if(ret == 0)
{
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_recv_Success, P_SIG, "recvPayload=%s",recvPayload);
data_start_ptr = strstr(recvPayload, "Success");/*for no pre autoregist, server publish "token", for auroreist, server publish "deviceSecret"*/
if(data_start_ptr == NULL)
{
cuccAutoRegCheckIfNeedExit(0);
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_9_2, P_SIG, "step9: recv publish ack....");
}
else
{
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_9_1, P_SIG, "step9: recv publish ack Success ok....");
}
data_start_ptr = strstr(recvPayload, "autoRegperiod");/*for no pre autoregist, server publish "token", for auroreist, server publish "deviceSecret"*/
if(data_start_ptr == NULL)
{
cuccAutoRegCheckIfNeedExit(0);
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_9_3, P_SIG, "step9: turn to recv autoRegperiod....");
}
else
{
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_9_4, P_SIG, "step9: recv autoRegperiod ok....");
data_start_ptr = data_start_ptr+15;
data_end_ptr = strstr(data_start_ptr, "}");
len = data_end_ptr-data_start_ptr;
cmsDecStrToInt((INT32 *)&autoRegPeriod, (UINT8 *)data_start_ptr, len);
dmCuccParam.autoRegPeriod = autoRegPeriod;
mwNvmCfgSetAndSaveDmCuccParam(&dmCuccParam);
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_9_5, P_SIG, "step9: recv autoRegperiod=%d....",autoRegPeriod);
autoRegPeriodFlag = 1;
}
}
/* step10: wait to recv autoRegperiod */
if(autoRegPeriodFlag != 1)
{
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_10, P_SIG, "step10: wait to recv autoRegperiod....");
ret = MQTTCuccWaitForRecv(&cuccMqttClient, PUBLISH, 100000, &topicName, recvPayload);
cuccAutoRegCheckIfNeedExit(0);
if(ret == 0)
{
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_recv_autoRegperiod, P_SIG, "recvPayload=%s",recvPayload);
data_start_ptr = strstr(recvPayload, "autoRegperiod");/*for no pre autoregist, server publish "token", for auroreist, server publish "deviceSecret"*/
if(data_start_ptr == NULL)
{
cuccAutoRegCheckIfNeedExit(0);
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_10_3, P_SIG, "step10: do not recv autoRegperiod....");
}
else
{
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_10_1, P_SIG, "step10: recv autoRegperiod ok....");
data_start_ptr = data_start_ptr+15;
data_end_ptr = strstr(data_start_ptr, "}");
len = data_end_ptr-data_start_ptr;
cmsDecStrToInt((INT32 *)&autoRegPeriod, (UINT8 *)data_start_ptr, len);
dmCuccParam.autoRegPeriod = autoRegPeriod;
mwNvmCfgSetAndSaveDmCuccParam(&dmCuccParam);
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_10_2, P_SIG, "step10: recv autoRegperiod=%d....",autoRegPeriod);
}
}
}
else
{
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_10_0, P_SIG, "step10: have recv autoRegperiod already....");
}
/* step11: publish autoRegperiod to server */
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_11, P_SIG, "step11: publish autoRegperiod to server....");
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_Publish, P_SIG, "MQTTCuccPublish......$sys/productKey/deviceKey/deviceShadow/pub......");
memset(dmTopic, 0, CUCC_DM_TOPIC_LEN);
snprintf(dmTopic, CUCC_DM_TOPIC_LEN, "$sys/%s/%s/deviceShadow/pub", dmCuccParam.mProductKey, (const char *)cuccIMEI);
memset(msgId, 0, CUCC_DM_MSG_ID_LEN);
atDataToDecString(msgId, CUCC_DM_MSG_ID_LEN, cuccDmMsgI);
cuccDmMsgI++;
memset(cuccSendPayload, 0, CUCC_MQTT_SEND_PAYLOAD_LEN);
sprintf( cuccSendPayload, "{\"messageId\":\"%s\",\"params\":{\"state\":{\"reported\":{\"autoRegperiod\":\"%d\"}}}}", msgId, dmCuccParam.autoRegPeriod);
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_11_1, P_SIG, "cuccSendPayload=%s....",cuccSendPayload);
message.payload = cuccSendPayload;
message.payloadlen = strlen((char *)cuccSendPayload);
ret = MQTTCuccPublish(&cuccMqttClient, (const char* )dmTopic, &message);
/* step12: disconnect mqtt client */
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_12, P_SIG, "step12: disconnect mqtt client....");
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_Disconnect, P_SIG, "MQTTDisconnect..............");
MQTTDisconnect(&cuccMqttClient);
/* step13: store cucc dm info to mw */
if(cuccIMEI != NULL)
{
freeEc(cuccIMEI);
cuccIMEI = NULL;
}
if(cuccIMSI != NULL)
{
freeEc(cuccIMSI);
cuccIMSI = NULL;
}
if(cuccCCID != NULL)
{
freeEc(cuccCCID);
cuccCCID = NULL;
}
if(cuccMqttSendbuf != NULL)
{
freeEc(cuccMqttSendbuf);
cuccMqttSendbuf = NULL;
}
if(cuccMqttReadbuf != NULL)
{
freeEc(cuccMqttReadbuf);
cuccMqttReadbuf = NULL;
}
if(cuccSendPayload != NULL)
{
freeEc(cuccSendPayload);
cuccSendPayload = NULL;
}
dmCuccParam.hasReg = CUCC_HAS_REGISTER;
dmMsg.ret = REG_OK;
primSize = sizeof(dmMsg);
applSendCmsInd(BROADCAST_IND_HANDLER, APPL_DM, APPL_DM_CUCC_OPEN_IND, primSize, (void *)&dmMsg);
mwNvmCfgSetAndSaveDmCuccParam(&dmCuccParam);
if(dmCuccParam.autoRegPeriod > 0)
{
//start a timer
if(cuccDmTimer != NULL)
{
if(osTimerIsRunning(cuccDmTimer) == 0)
{
osTimerDelete(cuccDmTimer);
cuccDmTimer = osTimerNew(cuccAutoRegisterInit, osTimerOnce, NULL, NULL);
osTimerStart(cuccDmTimer, (dmCuccParam.autoRegPeriod*2000));
}
else
{
osTimerStop(cuccDmTimer);
osTimerDelete(cuccDmTimer);
cuccDmTimer = osTimerNew(cuccAutoRegisterInit, osTimerOnce, NULL, NULL);
osTimerStart(cuccDmTimer, (dmCuccParam.autoRegPeriod*2000));
}
}
else
{
cuccDmTimer = osTimerNew(cuccAutoRegisterInit, osTimerOnce, NULL, NULL);
osTimerStart(cuccDmTimer, (dmCuccParam.autoRegPeriod*2000));
}
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_TimerStart, P_SIG, "autoReg cuccDmTimer start, tick=%d", (dmCuccParam.autoRegPeriod*2000));
}
else
{
slpManPlatVoteEnableSleep(cuccDmSlpHandler,SLP_SLP2_STATE); //open the sleep2 gate, it can go to sleep2 and hib state
slpManGivebackPlatVoteHandle(cuccDmSlpHandler);
}
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_exitAll, P_SIG, "autoReg will exit");
osThreadExit();
}
#define CUCC_DM_AUTOREG_TASK_END
void cuccDmAutoRegInitTask(void)
{
osThreadAttr_t task_attr;
memset(&task_attr, 0, sizeof(task_attr));
task_attr.name = "cuDmTask";
task_attr.stack_size = CUCC_AUTO_REG_TASK_STACK_SIZE;
task_attr.priority = osPriorityBelowNormal5;
#ifdef TYPE_EC718M
task_attr.reserved = osThreadDynamicStackAlloc;
#endif
ECPLAT_PRINTF(UNILOG_DM, cuccDmAutoRegInitTask0, P_SIG, "autoReg..starting task ");
cuccDmAutoRegisterTaskHandle= osThreadNew(cuccAutoRegisterTask, NULL,&task_attr);
if(cuccDmAutoRegisterTaskHandle == NULL)
{
if(slpManGivebackPlatVoteHandle(cuccDmSlpHandler) != RET_TRUE)
{
ECPLAT_PRINTF(UNILOG_DM, cuccDmAutoRegInitTask1, P_ERROR, "CUCC_DM vote handle give back failed");
}
else
{
ECPLAT_PRINTF(UNILOG_DM, cuccDmAutoRegInitTask2, P_VALUE, "CUCC_DM vote handle give back success");
}
}
}
INT32 cuccDmNetWorkStatusCallback(PsEventID eventID, void *param, UINT32 paramLen)
{
NmAtiNetInfoInd *netif = NULL;
dmInterMsg dmMsg;
CmiSimImsiStr *imsi = NULL;
memset(&dmMsg, 0, sizeof(dmInterMsg));
switch(eventID)
{
case PS_URC_ID_PS_NETINFO:
{
netif = (NmAtiNetInfoInd *)param;
if (netif->netifInfo.netStatus == NM_NETIF_ACTIVATED)
//if ((netif->netStatus == NM_NETIF_OOS)||(netif->netStatus == NM_NETIF_ACTIVATED))
{
dmMsg.cmdType = DM_MSG_NETWORK_READY;
if(dmMsgHandle != NULL)
{
xQueueSend(dmMsgHandle, &dmMsg, DM_MSG_TIMEOUT);
ECPLAT_PRINTF(UNILOG_DM, cuccDmNetWorkStatusCallback_1, P_INFO, "dm network is ready");
}
else
{
ECPLAT_PRINTF(UNILOG_DM, cuccDmNetWorkStatusCallback_2, P_ERROR, "dm network dmMsgHandle is NULL");
}
}
break;
}
case PS_URC_ID_SIM_READY:
{
imsi = (CmiSimImsiStr *)param;
memcpy(dmMsg.imsi, imsi->contents, imsi->length);
dmMsg.cmdType = DM_MSG_SIM_READY;
if(dmMsgHandle != NULL)
{
xQueueSend(dmMsgHandle, &dmMsg, DM_MSG_TIMEOUT);
ECPLAT_PRINTF(UNILOG_DM, cuccDmNetWorkStatusCallback_3, P_INFO, "dm sim is ready");
}
else
{
ECPLAT_PRINTF(UNILOG_DM, cuccDmNetWorkStatusCallback_4, P_ERROR, "dm sim dmMsgHandle is NULL");
}
break;
}
default:
break;
}
return 0;
}
void cuccAutoRegPreInitTask(void *argument)
{
UINT8 imsiReadyFlag = 0;
UINT8 networkReadyFlag = 0;
UINT8 cfun = 0xff;
INT32 msgWaitCount = 60;
UINT8 imei[IMEI_LEN+1] = {0};
UINT8 imsi[IMSI_LEN+1] = {0};
UINT8 flashCCID[CCID_LEN+1] = {0};
UINT8 simCCID[CCID_LEN+1] = {0};
dmInterMsg dmMsg;
MWNvmCfgDmCuccParam dmCuccParam;
INT32 len = 0;
INT32 timeSyncFlag = 0xff;
INT32 timeSyncRetry = 0;
INT32 i=0;
NmAtiNetifInfo netInfo;
memset(&dmCuccParam, 0, sizeof(dmCuccParam));
mwNvmCfgGetDmCuccParam(&dmCuccParam);
if(dmCuccParam.autoRegPeriod == CUCC_AUTO_REG_PERIOD_DISABLE)
{
osThreadExit();
}
if((dmCuccParam.autoRegPeriod == CUCC_AUTO_REG_PERIOD_TYPE1)&&(dmCuccParam.hasReg == CUCC_HAS_REGISTER))
{
osThreadExit();
}
memset(&dmMsg, 0, sizeof(dmInterMsg));
dmMsgHandle = xQueueCreate(DM_MSG_MAX_NUMB, sizeof(dmInterMsg));
registerPSEventCallback(PS_GROUP_ALL_MASK, cuccDmNetWorkStatusCallback);
NetMgrGetNetInfo(LWIP_PS_INVALID_CID,&netInfo);
if(netInfo.netStatus == NM_NETIF_ACTIVATED)
{
//turn to next
appGetImsiNumSync((CHAR *)imsi);
appGetIccidNumSync((CHAR *)simCCID);
appGetImeiNumSync((CHAR *)imei);
}
else
{
while(msgWaitCount)
{
xQueueReceive(dmMsgHandle, &dmMsg, DM_MSG_RECV_TIMEOUT);
switch(dmMsg.cmdType)
{
case DM_MSG_NETWORK_READY:
networkReadyFlag = 1;
appGetCFUN(&cfun);
ECPLAT_PRINTF(UNILOG_DM, cuccAutoRegisterTask0, P_INFO, "dm network is ready %d %d", networkReadyFlag, cfun);
break;
case DM_MSG_SIM_READY:
imsiReadyFlag = 1;
memcpy(imsi, dmMsg.imsi, strlen((const char*)dmMsg.imsi));
appGetCFUN(&cfun); //for CTCC CUCC DM, it need wait for nerwork ready
ECPLAT_PRINTF(UNILOG_DM, cuccAutoRegisterTask1, P_INFO, "dm sim is ready %d %d", imsiReadyFlag, cfun);
break;
default:
break;
}
msgWaitCount--;
if((networkReadyFlag == 1)&&(imsiReadyFlag == 1))
{
break;
}
if((networkReadyFlag != 1)||(imsiReadyFlag != 1))
{
appGetCFUN(&cfun);
if(cfun == 0) //at+cfun = 0
{
break;
}
}
}
appGetCFUN(&cfun);
if((networkReadyFlag != 1)||(imsiReadyFlag != 1)||(cfun == 0))
{
ECPLAT_PRINTF(UNILOG_DM, cuccAutoRegisterTask2, P_INFO, "dm network or sim is not ready %d %d", networkReadyFlag, cfun);
if(dmMsgHandle != NULL)
{
deregisterPSEventCallback(cuccDmNetWorkStatusCallback);
vQueueDelete(dmMsgHandle);
dmMsgHandle = NULL;
}
osThreadExit();
}
}
//AppMgrResult AppMgrSntpStart(CHAR *server, UINT16 port, UINT16 reqHandler, BOOL autoSync, UINT8 cid)
for(timeSyncRetry=0; timeSyncRetry<4; timeSyncRetry++)
{
AppMgrSntpStart("cn.ntp.org.cn", 0, BROADCAST_IND_HANDLER, 1, LWIP_PS_INVALID_CID);
for(i=0; i<10; i++)
{
timeSyncFlag = appCheckSystemTimeSync();
if(timeSyncFlag == 0)
{
break;
}
else
{
osDelay(300);
}
}
AppMgrSntpStop();
if(timeSyncFlag == 0)
{
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_Sntp, P_SIG, "Sntp is ready....");
break;
}
}
//if((imsi[0] == '4')&&(imsi[1] == '6')&&(imsi[2] == '0'))
if(1)
{
//if(((imsi[3] == '0')&&(imsi[4] == '1')) || ((imsi[3] == '0')&&(imsi[4] == '6')))
if(1)
{
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_prechk0, P_SIG, "autoReg this is CUCC SIM card");
/* if imei is not set, use default imei, but the api will return false */
OsaGetImeiNumSync((CHAR *)imei);
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_prechk1, P_SIG, "autoReg get imei ok, imei is %s", (UINT8 *)imei);
appGetIccidNumSync((CHAR *)simCCID);
//mwGetSimCcidValue(flashCCID, CCID_LEN);
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_prechk2, P_SIG, "autoReg get imsi is %s", (UINT8 *)imsi);
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_prechk3, P_SIG, "autoReg get current iccid is %s", (UINT8 *)simCCID);
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_prechk4, P_SIG, "autoReg get previous iccid is %s", (UINT8 *)flashCCID);
/* check ccid, and start auto register */
if((strcmp((CHAR *)dmCuccParam.ccid, (CHAR *)simCCID) != 0)
||(strcmp((CHAR *)dmCuccParam.imsi, (CHAR *)imsi) != 0)
||(strcmp((CHAR *)dmCuccParam.imei, (CHAR *)imei) != 0))
{
cuccIMEI = mallocEc(IMEI_LEN);
memset(cuccIMEI, 0, IMEI_LEN);
cuccIMSI = mallocEc(IMSI_LEN);
memset(cuccIMSI, 0, IMSI_LEN);
cuccCCID = mallocEc(CCID_LEN);
memset(cuccCCID, 0, CCID_LEN);
len = strlen((const char *)imei);
memcpy(cuccIMEI, imei, len);
len = strlen((const char *)imsi);
memcpy(cuccIMSI, imsi, len);
len = strlen((const char *)simCCID);
memcpy(cuccCCID, simCCID, len);
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_prechk5, P_SIG, "autoReg find new sim iccid, start auto register");
cuccDmAutoRegInitTask();
}
else
{
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_prechk6, P_SIG, "autoReg find same sim iccid");
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_prechk7, P_SIG, "autoReg is enable, start register");
cuccDmAutoRegInitTask();
}
}
else
{
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_prechk8, P_SIG, "autoReg this MNC is not supported SIM card");
}
}
else
{
ECPLAT_PRINTF(UNILOG_DM, cuccAutoReg_prechk9, P_SIG, "autoReg the SIM card is %s, it is not '460' SIM card, exit now", (UINT8 *)imsi);
}
if(dmMsgHandle != NULL)
{
deregisterPSEventCallback(cuccDmNetWorkStatusCallback);
vQueueDelete(dmMsgHandle);
dmMsgHandle = NULL;
}
osThreadExit();
}
void cuccAutoRegisterInit(void *argument)
{
osThreadAttr_t task_attr;
memset(&task_attr, 0, sizeof(task_attr));
slpManApplyPlatVoteHandle("cuccDm",&cuccDmSlpHandler);
task_attr.name = "cuccAutoReg";
task_attr.stack_size = CUCC_AUTO_REG_TASK_STACK_SIZE;
task_attr.priority = osPriorityBelowNormal5;
#ifdef TYPE_EC718M
task_attr.reserved = osThreadDynamicStackAlloc;
#endif
ECPLAT_PRINTF(UNILOG_DM, cuccAutoRegisterInit0, P_SIG, "autoReg..starting task ");
cuccAutoRegisterTaskHandle= osThreadNew(cuccAutoRegPreInitTask, NULL,&task_attr);
if(cuccAutoRegisterTaskHandle == NULL)
{
if(slpManGivebackPlatVoteHandle(cuccDmSlpHandler) != RET_TRUE)
{
ECPLAT_PRINTF(UNILOG_DM, cuccAutoRegisterInit1, P_ERROR, "CUCC_DM vote handle give back failed");
}
else
{
ECPLAT_PRINTF(UNILOG_DM, cuccAutoRegisterInit2, P_VALUE, "CUCC_DM vote handle give back success");
}
}
}