سلام من برد ارزیابی MC60 سیسوگ رو دارم. کدی که برای ردیابی باشه و از پروتکل MQTT استفاده کنه رو داخل سایت پیدا نکردم. میشه لطفا راهنمایی کنید باید چیکار کنم و اگه کدی داره ارسال کنید…
توی سایت سیسوگ کامل توضیح داده شده. توی سایت ردیاب هم ساخته شده باهاش.
سلام.
توی این آموزش از سایت سیسوگ نحوه دریافت و ارسال دیتای gps توضیح داده شده
و توی این آموزش نحوه ارسال دیتا از طریق mqtt
شما با ترکیب کد این دو قسمت آموزش میتونید به کدی که نیاز دارید برسید.
فرمت ارسالش هم مهم نیست. فقط باید جوری باشه که توی گیرنده بتونید اون دیتا رو پردازش کنید و روی مپ نشون بدید.
سلام مشکل منم همینه نمیدونم دقیقا باید چی کار کنم و ترکیبشون کنم
حتما سعی کنید موارد را بخونید و بصورت مشخص بازم سوالی بود بپرسید
کلیات توضیح داده شده
سلام من این کد رو نوشتم تا بتونم latitude,longitude رو با پیامک ارسال کنم ولی فقط پیامک اولی(MC60 is ON. GNSS Demo Starting…) رو دریافت میکنم و پیامک شامل latitude,longitude رو دریافت نمی کنم . این کد من:
#ifdef __CUSTOMER_CODE__
/*********************************************************************************************
* Example: MC60 GNSS + SMS Tracking (Timer-based read, no EVENT_UART_READ)
*
* 1) Defines custom booleans: TRUE = 1, FALSE = 0
* 2) Fixes pointer sign mismatch by casting to (char*)
* 3) Uses a timer to periodically poll UART2 for NMEA data
* 4) Parses "$GPGGA" for raw lat/long and sends SMS upon receiving "LOC?"
*********************************************************************************************/
#include "ql_type.h"
#include "ql_trace.h"
#include "ql_system.h"
#include "ql_uart.h"
#include "ql_error.h"
#include "ql_gpio.h"
#include "ql_stdlib.h"
#include "ql_timer.h"
#include "ql_memory.h"
#include "ril.h"
#include "ril_util.h"
#include "ril_telephony.h"
#include "ril_system.h"
#include "ril_sms.h"
// If needed, include older GPS headers or remove them if not available:
// #include "ql_gps.h"
// #include "ril_gps.h"
//----------------------------------------------------------------------------------
// Define booleans in case they're missing in your SDK
//----------------------------------------------------------------------------------
#ifndef bool
typedef unsigned char bool;
#endif
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
#if (defined(__OCPU_RIL_SUPPORT__) && defined(__OCPU_RIL_SMS_SUPPORT__))
//----------------------------------------------------------------------------------
// 1) Global Definitions
//----------------------------------------------------------------------------------
#define MAIN_UART_PORT UART_PORT1
#define GPS_UART_PORT UART_PORT2
#define GPS_READ_TIMER_ID (0x101)
#define GPS_READ_TIMER_PERIOD (1000) // 1 second
static char PhNum[] = "+9891*******"; // Your phone number
// Debug print macro
static char DBG_BUFFER[512];
#define APP_DEBUG(FORMAT, ...) \
{ \
Ql_memset(DBG_BUFFER, 0, sizeof(DBG_BUFFER)); \
Ql_sprintf(DBG_BUFFER, FORMAT, ##__VA_ARGS__); \
Ql_UART_Write(MAIN_UART_PORT, (u8*)DBG_BUFFER, Ql_strlen((const char*)DBG_BUFFER)); \
}
// Multi-part SMS context (if needed)
#define CON_SMS_BUF_MAX_CNT (1)
typedef struct {
u16 uMsgRef;
} ConSMSStruct;
static ConSMSStruct g_asConSMSBuf[CON_SMS_BUF_MAX_CNT];
// NMEA read buffer
static char g_nmeaBuf[512] = {0};
static s32 g_nmeaLen = 0;
// Store raw lat/lng
static char g_latestLat[20] = {0};
static char g_latestLng[20] = {0};
// We'll track fix with a bool
static bool g_gpsHasFix = FALSE;
//----------------------------------------------------------------------------------
// 2) SMS / Utility
//----------------------------------------------------------------------------------
static bool ConSMSBuf_ResetCtx(ConSMSStruct *pCSBuf, u8 uCSMaxCnt, u8 uIdx)
{
Ql_memset(&pCSBuf[uIdx], 0x00, sizeof(ConSMSStruct));
return TRUE;
}
// Send an SMS in text mode, with pointer cast to match RIL function signature
static void SMS_TextMode_Send(char *strPhNum, char *strTextMsg)
{
u32 nMsgRef = 0;
APP_DEBUG("< Send SMS to %s >: %s\r\n", (char*)strPhNum, (char*)strTextMsg);
RIL_SMS_SendSMS_Text(
(char*)strPhNum, // phone number
(u8)Ql_strlen((char*)strPhNum), // length
LIB_SMS_CHARSET_GSM, // encoding
(char*)strTextMsg, // content
(u16)Ql_strlen((char*)strTextMsg),
&nMsgRef
);
}
// Handle a new incoming SMS
static void Hdlr_RecvNewSMS(u32 nIndex, bool bAutoReply)
{
ST_RIL_SMS_TextInfo* pTextInfo = (ST_RIL_SMS_TextInfo*)Ql_MEM_Alloc(sizeof(ST_RIL_SMS_TextInfo));
Ql_memset(pTextInfo, 0, sizeof(ST_RIL_SMS_TextInfo));
RIL_SMS_ReadSMS_Text(nIndex, LIB_SMS_CHARSET_GSM, pTextInfo);
// senderNumber
char senderNumber[RIL_SMS_PHONE_NUMBER_MAX_LEN] = {0};
Ql_strcpy(senderNumber, (pTextInfo->param).deliverParam.oa);
// SMS content
u8* pContent = (pTextInfo->param).deliverParam.data;
APP_DEBUG("New SMS from %s: %s\r\n", (char*)senderNumber, (char*)pContent);
// Check if user sent "LOC?"
// Using Ql_strstr((char*)pContent,(char*)"LOC?") to fix sign mismatch
if (Ql_strstr((char*)pContent, (char*)"LOC?"))
{
extern void SendGPSLocationViaSMS(void);
SendGPSLocationViaSMS();
}
// Auto-reply
if (bAutoReply)
{
SMS_TextMode_Send((char*)senderNumber, "OK\0");
}
Ql_MEM_Free(pTextInfo);
}
// Send lat/lng via SMS
void SendGPSLocationViaSMS(void)
{
if (!g_gpsHasFix)
{
SMS_TextMode_Send((char*)PhNum, "No valid GPS fix yet.");
return;
}
// The lat/long are raw "DDMM.MMMM" / "DDDMM.MMMM"
char msgBuf[160];
Ql_memset(msgBuf, 0, sizeof(msgBuf));
Ql_sprintf(msgBuf, "Lat: %s, Lng: %s (raw ddmm.mmmm)", g_latestLat, g_latestLng);
SMS_TextMode_Send((char*)PhNum, msgBuf);
}
//----------------------------------------------------------------------------------
// 3) NMEA Parsing for GPGGA
//----------------------------------------------------------------------------------
static void ParseGPGGA(char *sentence)
{
/*
Example: $GPGGA,093040.00,3550.2661,N,05126.6998,E,1,03,4.0,1317.5,M,25.8,M,,*60
fields[0] = $GPGGA
fields[2] = latitude (DDMM.MMMM)
fields[3] = N or S
fields[4] = longitude (DDDMM.MMMM)
fields[5] = E or W
fields[6] = fixQuality (0=none,1=GPS fix, etc.)
*/
#define MAX_FIELDS 15
char *fields[MAX_FIELDS];
Ql_memset(fields, 0, sizeof(fields));
s32 fieldCount = 0;
char *p = sentence;
fields[fieldCount++] = p;
while (fieldCount < MAX_FIELDS)
{
char *commaPos = Ql_strchr(p, ',');
if (!commaPos) break;
*commaPos = '\0';
p = commaPos + 1;
fields[fieldCount++] = p;
}
// Check fixQuality in fields[6]
if (fieldCount >= 7 && (0 == Ql_strcmp(fields[0], "$GPGGA")))
{
if (fields[6] && (0 == Ql_strcmp(fields[6], "1")))
{
g_gpsHasFix = TRUE;
Ql_memset(g_latestLat, 0, sizeof(g_latestLat));
Ql_strncpy(g_latestLat, fields[2], sizeof(g_latestLat)-1);
Ql_memset(g_latestLng, 0, sizeof(g_latestLng));
Ql_strncpy(g_latestLng, fields[4], sizeof(g_latestLng)-1);
APP_DEBUG("Got valid fix: Lat=%s %s, Lng=%s %s\r\n",
fields[2], fields[3], fields[4], fields[5]);
}
else
{
g_gpsHasFix = FALSE;
}
}
}
static void CheckOneNmeaSentence(char *nmeaLine)
{
// If it starts with $GPGGA, parse it
if (Ql_strstr((char*)nmeaLine, (char*)"$GPGGA"))
{
ParseGPGGA(nmeaLine);
}
// Additional parsing for GPRMC, etc., can be added here
}
//----------------------------------------------------------------------------------
// 4) Timer Callback to read from GNSS UART
//----------------------------------------------------------------------------------
static void callback_GPS_ReadTimer(u32 timerId, void* param)
{
if (timerId != GPS_READ_TIMER_ID) return;
// Keep reading until no data remains
while (1)
{
char tempBuf[128];
s32 rdLen = Ql_UART_Read(GPS_UART_PORT, (u8*)tempBuf, sizeof(tempBuf)-1);
if (rdLen <= 0) break; // no more data
// Append to g_nmeaBuf
if (g_nmeaLen + rdLen < (s32)sizeof(g_nmeaBuf)-1)
{
Ql_memcpy(g_nmeaBuf + g_nmeaLen, tempBuf, rdLen);
g_nmeaLen += rdLen;
g_nmeaBuf[g_nmeaLen] = '\0';
}
else
{
// Overflow, reset
g_nmeaLen = 0;
g_nmeaBuf[0] = '\0';
}
}
// Now look for lines ending "\r\n"
while (1)
{
char *pEnd = Ql_strstr((char*)g_nmeaBuf, (char*)"\r\n");
if (!pEnd) break;
*pEnd = '\0';
*(pEnd+1) = '\0';
// parse one line
CheckOneNmeaSentence(g_nmeaBuf);
// move leftover
{
char *pNext = pEnd + 2;
s32 leftoverLen = g_nmeaLen - (pNext - g_nmeaBuf);
if (leftoverLen > 0)
{
Ql_memmove(g_nmeaBuf, pNext, leftoverLen);
g_nmeaLen = leftoverLen;
g_nmeaBuf[g_nmeaLen] = '\0';
}
else
{
g_nmeaLen = 0;
g_nmeaBuf[0] = '\0';
}
}
}
}
//----------------------------------------------------------------------------------
// 5) Main Task
//----------------------------------------------------------------------------------
static void Callback_MainUart(Enum_SerialPort port, Enum_UARTEventType event, bool level, void *param)
{
// No action for debug port in this example
}
void proc_main_task(s32 taskId)
{
ST_MSG taskMsg;
s32 i = 0;
// 1) Initialize debug UART
Ql_UART_Register(MAIN_UART_PORT, Callback_MainUart, NULL);
Ql_UART_Open(MAIN_UART_PORT, 115200, FC_NONE);
APP_DEBUG("=== MC60 GNSS + SMS Demo (Timer-based read, using TRUE/FALSE) ===\r\n");
// 2) Open GNSS UART
Ql_UART_Register(GPS_UART_PORT, NULL, NULL);
Ql_UART_Open(GPS_UART_PORT, 115200, FC_NONE);
// If your SDK requires enabling GPS:
// s32 ret = Ql_GPS_Open(GPS_UART_PORT);
// if (ret == QL_RET_OK) { APP_DEBUG("GPS Open OK\r\n"); }
// 3) Setup a timer to poll GNSS data
Ql_Timer_Register(GPS_READ_TIMER_ID, callback_GPS_ReadTimer, NULL);
Ql_Timer_Start(GPS_READ_TIMER_ID, GPS_READ_TIMER_PERIOD, TRUE);
// 4) Main message loop
while (TRUE)
{
Ql_memset(&taskMsg, 0, sizeof(ST_MSG));
Ql_OS_GetMessage(&taskMsg);
switch (taskMsg.message)
{
case MSG_ID_RIL_READY:
APP_DEBUG("<-- RIL is ready -->\r\n");
Ql_RIL_Initialize();
for (i = 0; i < CON_SMS_BUF_MAX_CNT; i++)
{
ConSMSBuf_ResetCtx(g_asConSMSBuf, CON_SMS_BUF_MAX_CNT, i);
}
break;
case MSG_ID_URC_INDICATION:
switch (taskMsg.param1)
{
case URC_SYS_INIT_STATE_IND:
if (SYS_STATE_SMSOK == taskMsg.param2)
{
RIL_SMS_DeleteSMS(0, RIL_SMS_DEL_ALL_MSG);
SMS_TextMode_Send((char*)PhNum, "MC60 is ON. GNSS Demo Starting...");
APP_DEBUG("<-- Module Ready for SMS + GNSS -->\r\n");
}
break;
case URC_SIM_CARD_STATE_IND:
APP_DEBUG("<-- SIM Card State: %d -->\r\n", taskMsg.param2);
break;
case URC_GSM_NW_STATE_IND:
APP_DEBUG("<-- GSM Network State: %d -->\r\n", taskMsg.param2);
break;
case URC_NEW_SMS_IND:
APP_DEBUG("<-- New SMS Arrives: index=%d -->\r\n", taskMsg.param2);
Hdlr_RecvNewSMS(taskMsg.param2, TRUE);
break;
default:
break;
}
break;
default:
break;
}
}
}
#endif // __OCPU_RIL_SUPPORT__ && __OCPU_RIL_SMS_SUPPORT__
#endif // __CUSTOMER_CODE__
این هم لاگ دیباگ م هست:
<-- GSM Network State: 1 -->
< Send SMS to +98912******* >: MC60 is ON. GNSS Demo Starting...
<-- Module Ready for SMS + GNSS -->
سلام. ساختار کدی که قرار دادید به این صورت هست:
بعد از روشن شدن ماژول یک SMS با متن MC60 is ON. GNSS Demo Starting… به گیرنده ارسال میشه.
حالا اگر از به ماژول پیامکی ارسال بشه توی تابع Hdlr_RecvNewSMS میره و اگر متن دریافتی برابر LOC? بود، وارد تابع SendGPSLocationViaSMS میشه و اگر مقدار متغیر g_gpsHasFix برابر 1 بود، یک پیامک حاوی لوکیشن به گیرنده ارسال میشه.
حالا سوال اینه که شما خودتون این مراحل رو کامل در جریان هستید؟! یا از کد شخص دیگه ای استفاده میکنید؟!
در هر صورت بهتره که بعد از اجرای هر کدوم از این مراحل یا شرط ها با کمک تابع APP_DEBUG یک لاگ بگیرید که بدونید کدتون تا کدوم مرحله اجرا میشه.