⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmsdata.c

📁 GPS驱动集合
💻 C
字号:
#include <string.h>
#include "cmsdata.h"


int gprs_analyze_msg(char *message)
{
  if (strstr(message, "OK") != 0)
  {
    if (strstr(message, "+CMGS:") != 0)
    {
      // threadData.m_rmReceMsg.m_strMessage1 = message;
      // ::PostMessage(threadData.m_hWnd, WM_SMS_SEND_RESPONSE, 0, 0);
    }
    else if (strstr(message, "+CMGR:") != 0)
    {
      return AT_RECV_MSG_CMGR;
    }
    else if (strstr(message, "+CSQ:") != 0)
    {
      // threadData.m_rmReceMsg.m_strMessage1 = message;
      // ::PostMessage(threadData.m_hWnd, WM_SIGNAL_STRENGTH, 0, 0);
    }
    else if (strstr(message, "+CBC:") != 0)
    {
      // threadData.m_rmReceMsg.m_strMessage1 = message;
      // ::PostMessage(threadData.m_hWnd, WM_BATTERY_LEVEL, 0, 0);
    }
    else if (strstr(message, "+CRSL:") != 0)
    {
      // threadData.m_rmReceMsg.m_strMessage1 = message;
      // ::PostMessage(threadData.m_hWnd, WM_RINGER_LEVEL, 0, 0);
    }
    else if (strstr(message, "+CREG:") != 0)
    {
      // threadData.m_rmReceMsg.m_strMessage1 = message;
      // ::PostMessage(threadData.m_hWnd, WM_NETWORK_REGISTRATION, 0, 0);
    }
    else if (strstr(message, "+CGMI") != 0)
    {
      // threadData.m_rmReceMsg.m_strMessage1 = message;
      // ::PostMessage(threadData.m_hWnd, WM_MANUFACTURER_ID, 0, 0);
    }
    else if (strstr(message, "+CGMM") != 0)
    {
      // threadData.m_rmReceMsg.m_strMessage1 = message;
      // ::PostMessage(threadData.m_hWnd, WM_MODEL_ID, 0, 0);
    }
    else if (strstr(message, "+CGMR") != 0)
    {
      // threadData.m_rmReceMsg.m_strMessage1 = message;
      // ::PostMessage(threadData.m_hWnd, WM_REVISION_ID, 0, 0);
    }
    else if (strstr(message, "+CNUM") != 0)
    {
      // threadData.m_rmReceMsg.m_strMessage1 = message;
      // ::PostMessage(threadData.m_hWnd, WM_SUBSCRIBER_NUMBER, 0, 0);
    }
    else if (strstr(message, "+CSCS") != 0)
    {
      // threadData.m_rmReceMsg.m_strMessage1 = message;
      // ::PostMessage(threadData.m_hWnd, WM_TE_CHARACTER_SET, 0, 0);
    }
    else if (strstr(message, "+CCLK") != 0)
    {
      // threadData.m_rmReceMsg.m_strMessage1 = message;
      // ::PostMessage(threadData.m_hWnd, WM_TIME, 0, 0);
    }
    else if (strstr(message, "+CRC") != 0)
    {
      // threadData.m_rmReceMsg.m_strMessage1 = message;
      // ::PostMessage(threadData.m_hWnd, WM_CELLULAR_RESULT_CODE, 0, 0);
    }
    else if (strstr(message, "+CR") != 0)
    {
      // threadData.m_rmReceMsg.m_strMessage1 = message;
      // ::PostMessage(threadData.m_hWnd, WM_REPORTING_CONTROL, 0, 0);
    }
    else if (strstr(message, "S0") != 0)
    {
      // threadData.m_rmReceMsg.m_strMessage1 = message;
      // ::PostMessage(threadData.m_hWnd, WM_S0, 0, 0);
    }
    else if (strstr(message, "S7") != 0)
    {
      // threadData.m_rmReceMsg.m_strMessage1 = message;
      // ::PostMessage(threadData.m_hWnd, WM_S7, 0, 0);
    }
    else if (strstr(message, "S8") != 0)
    {
      // threadData.m_rmReceMsg.m_strMessage1 = message;
      // ::PostMessage(threadData.m_hWnd, WM_S8, 0, 0);
    }
    else if (strstr(message, "S10") != 0)
    {
      // threadData.m_rmReceMsg.m_strMessage1 = message;
      // ::PostMessage(threadData.m_hWnd, WM_S10, 0, 0);
    }
    else
    {
      return AT_RECV_MSG_OK;
    }
  }
  else if (strstr(message, "+CMGR:") != 0)
  {
    return AT_RECV_MSG_CMGR;
  }
  else if (strstr(message, "RING") != 0)
  {
    // 振铃
    return AT_RECV_MSG_RING;
  }
  else if (strstr(message, "NO CARRIER") != 0)
  {
    // 无载波
    return AT_RECV_MSG_NO_CARRIER;
  }
  else if (strstr(message, "ERROR") != 0)
  {
    // 错误
    return AT_RECV_MSG_ERROR;
  }
  else if (strstr(message, "CMTI") != 0)
  {
    // NEW SMS
    return AT_RECV_MSG_CMTI;
  }
  else if (strstr(message, ">") != 0)
  {
    return AT_RECV_GET_MSG;
  }

  return AT_RECV_MSG_NULL;
}

// 7bit编码
// pSrc: 源字符串指针
// pDst: 目标编码串指针
// nSrcLength: 源字符串长度
// 返回: 目标编码串长度
int gprsEncode7bit(const char *pSrc, unsigned char *pDst, int nSrcLength)
{
  int nSrc; // 源字符串的计数值
  int nDst; // 目标编码串的计数值
  int nChar; // 当前正在处理的组内字符字节的序号,范围是0-7
  unsigned char nLeft; // 上一字节残余的数据

  // 计数值初始化
  nSrc = 0;
  nDst = 0;

  // 将源串每8个字节分为一组,压缩成7个字节
  // 循环该处理过程,直至源串被处理完
  // 如果分组不到8字节,也能正确处理
  while (nSrc < nSrcLength)
  {
    // 取源字符串的计数值的最低3位
    nChar = nSrc &7;

    // 处理源串的每个字节
    if (nChar == 0)
    {
      // 组内第一个字节,只是保存起来,待处理下一个字节时使用
      nLeft =  *pSrc;
    }
    else
    {
      // 组内其它字节,将其右边部分与残余数据相加,得到一个目标编码字节
      *pDst = (*pSrc << (8-nChar)) | nLeft;

      // 将该字节剩下的左边部分,作为残余数据保存起来
      nLeft =  *pSrc >> nChar;

      // 修改目标串的指针和计数值
      pDst++;
      nDst++;
    }

    // 修改源串的指针和计数值
    pSrc++;
    nSrc++;
  }

  // 返回目标串长度
  return nDst;
}

// 7bit解码
// pSrc: 源编码串指针
// pDst: 目标字符串指针
// nSrcLength: 源编码串长度
// 返回: 目标字符串长度
int gprsDecode7bit(const unsigned char *pSrc, char *pDst, int nSrcLength)
{
  int nSrc; // 源字符串的计数值
  int nDst; // 目标解码串的计数值
  int nByte; // 当前正在处理的组内字节的序号,范围是0-6
  unsigned char nLeft; // 上一字节残余的数据

  // 计数值初始化
  nSrc = 0;
  nDst = 0;

  // 组内字节序号和残余数据初始化
  nByte = 0;
  nLeft = 0;

  // 将源数据每7个字节分为一组,解压缩成8个字节
  // 循环该处理过程,直至源数据被处理完
  // 如果分组不到7字节,也能正确处理
  while (nSrc < nSrcLength)
  {
    // 将源字节右边部分与残余数据相加,去掉最高位,得到一个目标解码字节
    *pDst = ((*pSrc << nByte) | nLeft) &0x7f;

    // 将该字节剩下的左边部分,作为残余数据保存起来
    nLeft =  *pSrc >> (7-nByte);

    // 修改目标串的指针和计数值
    pDst++;
    nDst++;

    // 修改字节计数值
    nByte++;

    // 到了一组的最后一个字节
    if (nByte == 7)
    {
      // 额外得到一个目标解码字节
      *pDst = nLeft;

      // 修改目标串的指针和计数值
      pDst++;
      nDst++;

      // 组内字节序号和残余数据初始化
      nByte = 0;
      nLeft = 0;
    }

    // 修改源串的指针和计数值
    pSrc++;
    nSrc++;
  }

  // 输出字符串加个结束符
  *pDst = '\0';

  // 返回目标串长度
  return nDst;
}

// 可打印字符串转换为字节数据
// 如:"C8329BFD0E01" --> {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01}
// pSrc: 源字符串指针
// pDst: 目标数据指针
// nSrcLength: 源字符串长度
// 返回: 目标数据长度
int gprsString2Bytes(const char *pSrc, unsigned char *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++;
  }

  // 返回目标数据长度
  return nSrcLength / 2;
}

// 字节数据转换为可打印字符串
// 如:{0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01} --> "C8329BFD0E01" 
// pSrc: 源数据指针
// pDst: 目标字符串指针
// nSrcLength: 源数据长度
// 返回: 目标字符串长度
int gprsBytes2String(const unsigned char *pSrc, char *pDst, int nSrcLength)
{
  const char tab[] = "0123456789ABCDEF"; // 0x0-0xf的字符查找表
  int i;

  for (i = 0; i < nSrcLength; i++)
  {
    *pDst++ = tab[ *pSrc >> 4]; // 输出低4位
    *pDst++ = tab[ *pSrc &0x0f]; // 输出高4位
    pSrc++;
  }

  // 输出字符串加个结束符
  *pDst = '\0';

  // 返回目标字符串长度
  return nSrcLength *2;
}

// 正常顺序的字符串转换为两两颠倒的字符串,若长度为奇数,补'F'凑成偶数
// 如:"8613851872468" --> "683158812764F8"
// pSrc: 源字符串指针
// pDst: 目标字符串指针
// nSrcLength: 源字符串长度
// 返回: 目标字符串长度
int gprsInvertNumbers(const char *pSrc, char *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 gprsSerializeNumbers(const char *pSrc, char *pDst, int nSrcLength)
{
  int nDstLength; // 目标字符串长度
  char ch; // 用于保存一个字符
  int i;

  // 复制串长度
  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;
}

int gprsEncodePdu(const SM_PARAM *pSrc, char *pDst)
{
  int nLength; // 内部用的串长度
  int nDstLength; // 目标PDU串长度
  unsigned char buf[256]; // 内部用的缓冲区

  // SMSC地址信息段
  nLength = strlen(pSrc->SCA); // SMSC地址字符串的长度 
  buf[0] = (char)((nLength &1) == 0 ? nLength : nLength + 1) / 2+1; 
    // SMSC地址信息长度
  buf[1] = 0x91; // 固定: 用国际格式号码
  nDstLength = gprsBytes2String(buf, pDst, 2); // 转换2个字节到目标PDU串
  nDstLength += gprsInvertNumbers(pSrc->SCA, &pDst[nDstLength], nLength); 
    // 转换SMSC号码到目标PDU串

  // TPDU段基本参数、目标地址等
  nLength = strlen(pSrc->TPA); // TP-DA地址字符串的长度
  buf[0] = 0x11; // 是发送短信(TP-MTI=01),TP-VP用相对格式(TP-VPF=10)
  buf[1] = 0; // TP-MR=0
  buf[2] = (char)nLength; // 目标地址数字个数(TP-DA地址字符串真实长度)
  buf[3] = 0x91; // 固定: 用国际格式号码
  nDstLength += gprsBytes2String(buf, &pDst[nDstLength], 4); 
    // 转换4个字节到目标PDU串
  nDstLength += gprsInvertNumbers(pSrc->TPA, &pDst[nDstLength], nLength); 
    // 转换TP-DA到目标PDU串

  // TPDU段协议标识、编码方式、用户信息等
  nLength = strlen(pSrc->TP_UD); // 用户信息字符串的长度
  buf[0] = pSrc->TP_PID; // 协议标识(TP-PID)
  buf[1] = pSrc->TP_DCS; // 用户信息编码方式(TP-DCS)
  buf[2] = 0; // 有效期(TP-VP)为5分钟

  // 7-bit编码方式
  buf[3] = nLength; // 编码前长度
  nLength = gprsEncode7bit(pSrc->TP_UD, &buf[4], nLength + 1) + 4; 
    // 转换TP-DA到目标PDU串


  nDstLength += gprsBytes2String(buf, &pDst[nDstLength], nLength); 
    // 转换该段数据到目标PDU串

  // 返回目标字符串长度
  return nDstLength;
}

// PDU解码,用于接收、阅读短消息
// pSrc: 源PDU串指针
// pDst: 目标PDU参数指针
// 返回: 用户信息串长度
int gprsDecodePdu(const char *pSrc, SM_PARAM *pDst)
{
  int nDstLength; // 目标PDU串长度
  unsigned char tmp; // 内部用的临时字节变量
  unsigned char buf[256]; // 内部用的缓冲区

  // SMSC地址信息段
  gprsString2Bytes(pSrc, &tmp, 2); // 取长度
  tmp = (tmp - 1) *2; // SMSC号码串长度
  pSrc += 4; // 指针后移,忽略了SMSC地址格式
  gprsSerializeNumbers(pSrc, pDst->SCA, tmp); // 转换SMSC号码到目标PDU串
  pSrc += tmp; // 指针后移

  // TPDU段基本参数、回复地址等
  gprsString2Bytes(pSrc, &tmp, 2); // 取基本参数
  pSrc += 2; // 指针后移
  // if(tmp & 0x80)
  {
    // 包含回复地址,取回复地址信息
    gprsString2Bytes(pSrc, &tmp, 2); // 取长度
    if (tmp &1)
      tmp += 1;
    // 调整奇偶性
    pSrc += 4; // 指针后移,忽略了回复地址(TP-RA)格式
    gprsSerializeNumbers(pSrc, pDst->TPA, tmp); // 取TP-RA号码
    pSrc += tmp; // 指针后移
  }

  // TPDU段协议标识、编码方式、用户信息等
  gprsString2Bytes(pSrc, (unsigned char*) &pDst->TP_PID, 2); 
    // 取协议标识(TP-PID)
  pSrc += 2; // 指针后移
  gprsString2Bytes(pSrc, (unsigned char*) &pDst->TP_DCS, 2); 
    // 取编码方式(TP-DCS)
  pSrc += 2; // 指针后移
  gprsSerializeNumbers(pSrc, pDst->TP_SCTS, 14); // 服务时间戳字符串(TP_SCTS) 
  pSrc += 14; // 指针后移
  gprsString2Bytes(pSrc, &tmp, 2); // 用户信息长度(TP-UDL)
  pSrc += 2; // 指针后移

  // 7-bit解码
  nDstLength = gprsString2Bytes(pSrc, buf, tmp &7 ? (int)tmp *7 / 4+2: (int)tmp
    *7 / 4); // 格式转换
  gprsDecode7bit(buf, pDst->TP_UD, nDstLength); // 转换到TP-DU
  nDstLength = tmp;


  // 返回目标字符串长度
  return nDstLength;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -