上個月做的是電壓源的項目,再往上個月是GJX監控設備項目,簡單記錄下該項目的實現,使用的新塘某款單片機+GSM模塊+幾個傳感器,整體很簡單,就是定時采集數據然后,上報到服務器,接收服務器控制指令,控制開發。唯一復雜的是使用了MQTT協議,在網上找了一份嵌入式MQTT包,然后重寫發送和接收部分,原來使用的是socket,現在沒有socket了,就是串口連GSM模塊發AT指令,然后配置成透傳,基本上就OK了,因為GSM模塊就用了透傳,單片機直接往串口里丟數據,GSM自動發到服務器是,MQTT協議花了一段時間大概了解了下,我的理解就是一個應用層的協議,所以GSM整個工作流程也就基本確定下來了,首先在服務器上建立一個MQTT server,然后單片機通過向串口下發AT指令建立一個TCP連接,用MQTT協議組包,直接發送到串口,然后串口監聽回包就OK了。花了一段時間去調試溫度濕度,斜率震動,RTC這些東西,貼個主流程代碼
int main(void)
{
int ret = -1;
uint32_t pubtick = 0;
uint32_t ctltick = 0;
uint8_t AlarmFlag = 0;
CheckFlag = 0;
TimerFlag = 0;
/* Init System, IP clock and multi-function I/O */
SYS_Init();
GpioInit();
UART0_Init();
UART1_Init();
UART_ENABLE_INT(UART1, (UART_INTEN_RDAIEN_Msk| UART_INTEN_RXTOIEN_Msk)); /*config uart1 interrupt*/
NVIC_EnableIRQ(UART1_IRQn);
UART_ENABLE_INT(UART0, (UART_INTEN_RDAIEN_Msk| UART_INTEN_RXTOIEN_Msk)); /*config uart1 interrupt*/
NVIC_EnableIRQ(UART0_IRQn);
TMR0_Init();
TMR1_Init();
RestGps();
RestGsm();
I2C0_Init();
I2C1_Init();
Getuid();
// SetSlope();
Pver = 20;
// memset(&CONFIG,0,sizeof(CONFIG));
CheckWakeFlag();
SetAccData();
SetAlarm(0);//rtc 15min
//GetConfig();
GetFsuId(FsuId);
ret = GsmInit();
if(ret)
{
printf("gsminit timeout\n");
goto error;
}
ConnectFlag = 0;
Connect:
ret = MQTT_Connect(ConnectFlag);
if(ret != 0)
goto error;
ret = MQTT_SubAndPub();
if(ret != 0)
goto error;
pubtick = gTick1msCnt;
while(1)
{
if(MQTTMsgReceved_proc() == LOGIN_ACK)
break;
if((YA_GetSysTimeInterval(pubtick) >= 15000))//15 s
goto error;
}
ret = UpdateFsuId();
if(ret)
goto Connect;
SerializePubMsg(ONLINE);
mqtt_publish(PubTopic);
pubtick = gTick1msCnt;
while(1)
{
// FeedDog();
if(SendFlag)
{
SendFlag = 0;
// printf("send all data\n");
GetAllData();
SerializePubMsg(SEND_CONFIG_DATA);
mqtt_publish(PubTopic);
AlarmFlag=GetLockState();
}
switch(WakeUpFlag)
{
case 0:
PowerDownFlag = 1;
break;
case 1:
#if 0
SerializePubMsg(SEND_ALARM);
mqtt_publish(PubTopic);
#endif
PowerDownFlag = 1;
break;
case 2:
if(TimerFlag)
{
ctltick = gTick1msCnt;
TimerFlag = 0;
CheckFlag = 1;
}
if(CheckFlag)
{
if((YA_GetSysTimeInterval(ctltick) >= 10000))
{
SendFlag = 1;
CheckFlag = 0;
CheckHaltFlag = 1;
break;
}
}
if(CheckHaltFlag)
{
AlarmFlag=GetLockState();
if(!AlarmFlag)
PowerDownFlag = 1;
}
break;
default:
break;
}
MQTTMsgReceved_proc();
// SetWakeAndHalt(AlarmFlag);
if(PowerDownFlag||(YA_GetSysTimeInterval(pubtick) >= HaltTime))
{
if(WakeUpFlag != 1)
SetAccWakeup();
SetAlarm(AlarmFlag);
PowerDown();
}
}
error:
SetAccWakeup();
SetAlarm(1);
PowerDown();
return 0;
}
