📄 m32.c
字号:
{
code char tab[]="0123456789ABCDEF";
int i;
// 0x0-0xf的字符查找表
for(i=0; i<nSrcLength; i++)
{
// 输出低4位
*pDst++ = tab[*pSrc >> 4];
// 输出高4位
*pDst++ = tab[*pSrc & 0x0f];
pSrc++;
}
// 输出字符串加个结束符
*pDst = '\0';
// 返回目标字符串长度
return nSrcLength * 2;
}
// 可打印字符串转换为字节数据 // 如:"C8329BFD0E01" --> {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01}
// pSrc: 源字符串指针
// pDst: 目标数据指针
// nSrcLength: 源字符串长度
// 返回: 目标数据长度
//int gsmString2Bytes(const char* pSrc, unsigned char* pDst, int nSrcLength)
int gsmString2Bytes(uchar* pSrc, uchar* pDst, int nSrcLength)
{
int i;
for(i=0; i<nSrcLength; i+=2)
{
// 输出高4位
if((*pSrc>='0') && (*pSrc<='9'))
{
*pDst = (*pSrc - '0') << 4;
}
else
{
*pDst = (*pSrc - 'A' + 10) << 4;
}
pSrc++;
// 输出低4位
if(*pSrc>='0' && *pSrc<='9')
{
*pDst |= (*pSrc - '0');
}
else
{
*pDst |= (*pSrc - 'A' + 10);
}
pSrc++;
pDst++;
}
#if 0
for(i=0; i<nSrcLength; i+=2)
{
// 输出高4位
if((*pSrc>='0') && (*pSrc<='9'))
{
*pDst = (*pSrc - '0') << 4;
}
else
{
*pDst = (*pSrc - 'A' + 10) << 4;
}
pSrc++;
// 输出低4位
if(*pSrc>='0' && *pSrc<='9')
{
*pDst = *pSrc - '0';
}
else
{
*pDst = *pSrc - 'A' + 10;
}
pSrc++;
pDst++;
}
#endif
// 返回目标数据长度
return nSrcLength / 2;
}
/**************************************************************************************************
//PDU串中的号码和时间,都是两两颠倒的字符串。利用下面两个函数可进行正反变换:
// 正常顺序的字符串转换为两两颠倒的字符串,若长度为奇数,补''F''凑成偶数 // 如:"8613851872468" --> "683158812764F8"
// pSrc: 源字符串指针
// pDst: 目标字符串指针
// nSrcLength: 源字符串长度
// 返回: 目标字符串长度
****************************************************************************************************/
//int gsmInvertNumbers(const char* pSrc, char* pDst, int nSrcLength)
int gsmInvertNumbers(char xdata* pSrc, char xdata* pDst, int nSrcLength)
{
int nDstLength; // 目标字符串长度
char ch; // 用于保存一个字符
int i;
// 复制串长度
nDstLength = nSrcLength;
// 两两颠倒
for(i=0; i<nSrcLength;i+=2)
{
ch = *pSrc++; // 保存先出现的字符
*pDst++ = *pSrc++; // 复制后出现的字符
*pDst++ = ch; // 复制先出现的字符
}
// 源串长度是奇数吗?
if(nSrcLength & 1)
{
*(pDst-2) = 'F'; // 补''F''
nDstLength++; // 目标串长度加1
}
// 输出字符串加个结束符
*pDst = '\0';
// 返回目标字符串长度
return nDstLength;
}
// 两两颠倒的字符串转换为正常顺序的字符串
// 如:"683158812764F8" --> "8613851872468"
// pSrc: 源字符串指针
// pDst: 目标字符串指针
// nSrcLength: 源字符串长度
// 返回: 目标字符串长度
int gsmSerializeNumbers(char* pSrc, char* pDst, int nSrcLength)
{
int i,nDstLength; // 目标字符串长度
char ch; // 用于保存一个字符
// 复制串长度
nDstLength = nSrcLength;
// 两两颠倒
for(i=0; i<nSrcLength;i+=2)
{
ch = *pSrc++; // 保存先出现的字符
*pDst++ = *pSrc++; // 复制后出现的字符
*pDst++ = ch; // 复制先出现的字符
}
// 最后的字符是'F'吗?
if(*(pDst-1) == 'F')
{
pDst--;
nDstLength--; // 目标字符串长度减1
}
// 输出字符串加个结束符
*pDst = '\0';
// 返回目标字符串长度
return nDstLength;
}
uchar gsmDoUserTask(uchar* task)
{
uchar xdata* ptr;
if(task[0]!='M' && task[0] != 'A' && task[0] != 'B' && task[0] != 'C' && task[0]!='D'&& task[0]!='T')
{ //如果你编辑了错误短信:check ok
sprintf(TP_UD,"Fail"); //gsmSendMessage("Fail");
return 0;
}
if(strncmp(task,"TM30S",5)==0)
{//定时跟踪:设置追踪器每隔30 S回复一条地理位置信息
if(gsmCheckRightNumber("M",0)==NULL && gsmCheckRightNumber("A",0)==NULL \
&& gsmCheckRightNumber("B",0)==NULL && gsmCheckRightNumber("C",0)==NULL \
&& gsmCheckRightNumber("D",0)==NULL)
{
//如果不是已授权号码,追踪器不会回应
return 2;
}
GPSTimerReq=1;
GPSTimer30=0;
sprintf(TP_UD,"Timer 30 s!");
return 1;
}
else
if(strncmp(task,"TM",2)==0)
{//取消自动回复功能方法:发送一条短信"TM"到追踪器,就可以完成删除。
if(gsmCheckRightNumber("M",0)==NULL && gsmCheckRightNumber("A",0)==NULL \
&& gsmCheckRightNumber("B",0)==NULL && gsmCheckRightNumber("C",0)==NULL \
&& gsmCheckRightNumber("D",0)==NULL)
{
//如果不是已授权号码,追踪器不会回应
return 2;
}
GPSTimerReq=0;
GPSTimer30=0;
sprintf(TP_UD,"Cancel Timer 30 s!");
return 1;
}
putstring1("Del Right Number:");
if(task[1] == '\0')
{
//delete:
if(gsmSearchPhone(task)==0)
{ //非授权号码,不能删除
sprintf(TP_UD,"You are not master!");
return 0;
}
if(gsmDeletePhone(gsmSearchPhone(task)))
{
sprintf(TP_UD,"OK");
return 1;
}
else
{
sprintf(TP_UD,"Fail"); //gsmSendMessage("Fail");
return 0;
}
}
putstring1("Set Right Number:");
if((ptr=strstr(task,"M")) != NULL) //设置主授权号码
{ //设置授权:Master
ptr++;
putstring1("Phone Number to Save:\r\n");
putstring1(ptr);
putstring1("\r\n");
if(gsmSavePhone(ptr,"M")==TRUE) //起名为:M
//if(gsmPhoneBookTask(GSM_SAVE_PHONE,ptr,"M",PhoneNumber))
{
putstring1("Save Phone Ok,Number is:\r\n");
sprintf(TPA,"++");
strcat(TPA, ptr);
putstring1(TPA);
putstring1("\r\n");
sprintf(TP_UD,"OK");
return 1; //gsmSendMessage("OK");
}
else
{
putstring1("Save Phone Fail!");
sprintf(TP_UD,"Fail"); //gsmSendMessage("Fail");
return 0;
}
}
if(task[0] == 'A') //设置第一个受权号码
{
//if(gsmPhoneBookTask(GSM_SEARCH_PHONE,NULL,"M",0))
if(gsmSearchPhone("M")) //是否有主授权号码?
{
if((ptr=strstr(task,"A")) != NULL)
{
//增加授权:
ptr++;
putstring1("Phone Number to Save:\r\n");
putstring1(ptr);
putstring1("\r\n");
PhoneNumber=2;
//if(gsmPhoneBookTask(GSM_SAVE_PHONE,ptr,"A",PhoneNumber))
if(gsmSavePhone(ptr,"A")==TRUE) //第一个授权,起名为:A
{
putstring1("Save Phone Ok,Number is:\r\n");
sprintf(TPA,"++");
strcat(TPA, ptr);
putstring1(TPA);
putstring1("\r\n");
sprintf(TP_UD,"OK");
return 1; //gsmSendMessage("OK");
}
else
{
putstring1("Save Phone Fail!");
sprintf(TP_UD,"Fail"); //gsmSendMessage("Fail");
return 0;
}
}//if((ptr=strstr(task,"A")) != NULL)
}//if(gsmSearchPhone("M"))
else
{
sprintf(TP_UD,"You are not master!");
return 0;
}
}//if(task[0] == 'A')
if(task[0] == 'B') //设置第二个受权号码
{
//if(gsmPhoneBookTask(GSM_SEARCH_PHONE,NULL,"A",0))
if(gsmSearchPhone("A")) //是否有第一个受权号码?
{
if((ptr=strstr(task,"B")) != NULL)
{
//增加授权:
ptr++;
putstring1("Phone Number to Save:\r\n");
putstring1(ptr);
putstring1("\r\n");
PhoneNumber=3;
//if(gsmPhoneBookTask(GSM_SAVE_PHONE,ptr,"M",PhoneNumber))
if(gsmSavePhone(ptr,"B")==TRUE) //第2个授权,起名为:B
{
putstring1("Save Phone Ok,Number is:\r\n");
sprintf(TPA,"++");
strcat(TPA, ptr);
putstring1(TPA);
putstring1("\r\n");
sprintf(TP_UD,"OK");
return 1; //gsmSendMessage("OK");
}
else
{
putstring1("Save Phone Fail!");
sprintf(TP_UD,"Fail"); //gsmSendMessage("Fail");
return 0;
}
}//if((ptr=strstr(task,"B")) != NULL)
}//if(gsmSearchPhone("A"))
}//if(task[0] == 'B')
return 0;
}
// PDU编码,用于编制、发送短消息
// pSrc: 源PDU参数指针
// pDst: 目标PDU串指针
// 返回: 目标PDU串长度
int gsmEncodePdu(char xdata* pDst) //pDst=pdu;
{
int nLength; // 内部用的串长度
int nDstLength; // 目标PDU串长度
// SMSC地址信息段
nLength = strlen(SCA); // SMSC地址字符串的长度
if((nLength & 0x01)==0)
nDstLength= nLength/2+1;
else
nDstLength= (nLength+1)/2 + 1;
ans[0] = (char)nDstLength; // SMSC地址信息长度
ans[1] = 0x91; // 固定: 用国际格式号码
nDstLength = gsmBytes2String(ans, pDst, 2); // 转换2个字节到目标PDU串
nDstLength += gsmInvertNumbers(SCA, &pDst[nDstLength], nLength); // 转换SMSC到目标PDU串
// TPDU段基本参数、目标地址等
nLength = strlen(TPA); // TP-DA地址字符串的长度
ans[0] = 0x11; // 是发送短信(TP-MTI=01),TP-VP用相对格式(TP-VPF=10)
ans[1] = 0; // TP-MR=0
ans[2] = (char)nLength; // 目标地址数字个数(TP-DA地址字符串真实长度)
ans[3] = 0x91; // 固定: 用国际格式号码
nDstLength += gsmBytes2String(ans, &pDst[nDstLength], 4); // 转换4个字节到目标PDU串
nDstLength += gsmInvertNumbers(TPA, &pDst[nDstLength], nLength); // 转换TP-DA到目标PDU串
// TPDU段协议标识、编码方式、用户信息等
nLength = strlen(TP_UD); // 用户信息字符串的长度
ans[0] = TP_PID; // 协议标识(TP-PID)
ans[1] = TP_DCS; // 用户信息编码方式(TP-DCS)
ans[2] = 0; // 有效期(TP-VP)为5分钟
if(TP_DCS == GSM_7BIT)
{
// 7-bit编码方式
ans[3] = nLength; // 编码前长度
nLength = gsmEncode7bit(TP_UD, &ans[4], nLength+1) + 4; // 转换TP-DA到目标PDU串
}
else
if(TP_DCS == GSM_UCS2)
{
#if 0
// UCS2编码方式
ans[3] = gsmEncodeUcs2(pSrc->TP_UD, &ans[4], nLength); // 转换TP-DA到目标PDU串
nLength = ans[3] + 4; // nLength等于该段数据长度
#endif
}
else
{
// 8-bit编码方式
//ans[3] = gsmEncode8bit(TP_UD, &ans[4], nLength); // 转换TP-DA到目标PDU串
nLength = ans[3] + 4; // nLength等于该段数据长度
}
nDstLength += gsmBytes2String(ans, &pDst[nDstLength], nLength); // 转换该段数据到目标PDU串
// 返回目标字符串长度
return nDstLength;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -