一个很不错的GPRS的PDU编码程序

#include "stdafx.h"
#include "Sms.h"
#include "Comm.h"
 
// 可打印字符串转换为字节数据
// 如:"C8329BFD0E01" --> {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01}
// 输入: pSrc - 源字符串指针
//       nSrcLength - 源字符串长度
// 输出: pDst - 目标数据指针
// 返回: 目标数据长度
int gsmString2Bytes(const char* pSrc, unsigned char* pDst, int nSrcLength)
{
for (int 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 - 源数据指针
//       nSrcLength - 源数据长度
// 输出: pDst - 目标字符串指针
// 返回: 目标字符串长度
int gsmBytes2String(const unsigned char* pSrc, char* pDst, int nSrcLength)
{
const char tab[]="0123456789ABCDEF";// 0x0-0xf的字符查找表
 
for (int i = 0; i < nSrcLength; i++)
{
*pDst++ = tab[*pSrc >> 4];// 输出高4位
*pDst++ = tab[*pSrc & 0x0f];// 输出低4位
pSrc++;
}
 
// 输出字符串加个结束符
*pDst = '\0';
 
// 返回目标字符串长度
return (nSrcLength * 2);
}
 
// 7bit编码
// 输入: pSrc - 源字符串指针
//       nSrcLength - 源字符串长度
// 输出: pDst - 目标编码串指针
// 返回: 目标编码串长度
int gsmEncode7bit(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 - 源编码串指针
//       nSrcLength - 源编码串长度
// 输出: pDst - 目标字符串指针
// 返回: 目标字符串长度
int gsmDecode7bit(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;
}
 
// 8bit编码
// 输入: pSrc - 源字符串指针
//       nSrcLength - 源字符串长度
// 输出: pDst - 目标编码串指针
// 返回: 目标编码串长度
int gsmEncode8bit(const char* pSrc, unsigned char* pDst, int nSrcLength)
{
// 简单复制
memcpy(pDst, pSrc, nSrcLength);
 
return nSrcLength;
}
 
// 8bit解码
// 输入: pSrc - 源编码串指针
//       nSrcLength -  源编码串长度
// 输出: pDst -  目标字符串指针
// 返回: 目标字符串长度
int gsmDecode8bit(const unsigned char* pSrc, char* pDst, int nSrcLength)
{
// 简单复制
memcpy(pDst, pSrc, nSrcLength);
 
// 输出字符串加个结束符
*pDst = '\0';
 
return nSrcLength;
}
 
// UCS2编码
// 输入: pSrc - 源字符串指针
//       nSrcLength - 源字符串长度
// 输出: pDst - 目标编码串指针
// 返回: 目标编码串长度
int gsmEncodeUcs2(const char* pSrc, unsigned char* pDst, int nSrcLength)
{
int nDstLength;// UNICODE宽字符数目
WCHAR wchar[128];// UNICODE串缓冲区
 
// 字符串-->UNICODE串
nDstLength = strGB2Unicode(pSrc, wchar, nSrcLength);
 
// 高低字节对调,输出
for(int i=0; i<nDstLength; i++)
{
*pDst++ = wchar[i] >> 8;// 先输出高位字节
*pDst++ = wchar[i] & 0xff;// 后输出低位字节
}
 
// 返回目标编码串长度
return nDstLength * 2;
}
 
// UCS2解码
// 输入: pSrc - 源编码串指针
//       nSrcLength -  源编码串长度
// 输出: pDst -  目标字符串指针
// 返回: 目标字符串长度
int gsmDecodeUcs2(const unsigned char* pSrc, char* pDst, int nSrcLength)
{
int nDstLength;// UNICODE宽字符数目
WCHAR wchar[128];// UNICODE串缓冲区
 
// 高低字节对调,拼成UNICODE
for(int i=0; i<nSrcLength/2; i++)
{
wchar[i] = *pSrc++ << 8;// 先高位字节
wchar[i] |= *pSrc++;// 后低位字节
}
 
// UNICODE串-->字符串
nDstLength = WideCharToMultiByte(CP_ACP, 0, wchar, nSrcLength/2, pDst, 160, NULL, NULL);
 
// 输出字符串加个结束符
pDst[nDstLength] = '\0';
 
// 返回目标字符串长度
return nDstLength;
}
 
// 正常顺序的字符串转换为两两颠倒的字符串,若长度为奇数,补'F'凑成偶数
// 如:"8613851872468" --> "683158812764F8"
// 输入: pSrc - 源字符串指针
//       nSrcLength - 源字符串长度
// 输出: pDst - 目标字符串指针
// 返回: 目标字符串长度
int gsmInvertNumbers(const char* pSrc, char* pDst, int nSrcLength)
{
int nDstLength;// 目标字符串长度
char ch;// 用于保存一个字符
 
// 复制串长度
nDstLength = nSrcLength;
 
// 两两颠倒
for(int 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 - 源字符串指针
//       nSrcLength - 源字符串长度
// 输出: pDst - 目标字符串指针
// 返回: 目标字符串长度
int gsmSerializeNumbers(const char* pSrc, char* pDst, int nSrcLength)
{
int nDstLength;// 目标字符串长度
char ch;// 用于保存一个字符
 
// 复制串长度
nDstLength = nSrcLength;
 
// 两两颠倒
for(int i=0; i<nSrcLength;i+=2)
{
ch = *pSrc++;// 保存先出现的字符
*pDst++ = *pSrc++;// 复制后出现的字符
*pDst++ = ch;// 复制先出现的字符
}
 
// 最后的字符是'F'吗?
if(*(pDst-1) == 'F')
{
pDst--;
nDstLength--;// 目标字符串长度减1
}
 
// 输出字符串加个结束符
*pDst = '\0';
 
// 返回目标字符串长度
return nDstLength;
}
 
// PDU编码,用于编制、发送短消息
// 输入: pSrc - 源PDU参数指针
// 输出: pDst - 目标PDU串指针
// 返回: 目标PDU串长度
int gsmEncodePdu(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 = gsmBytes2String(buf, pDst, 2);// 转换2个字节到目标PDU串
nDstLength += gsmInvertNumbers(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 += gsmBytes2String(buf, &pDst[nDstLength], 4);// 转换4个字节到目标PDU串
nDstLength += gsmInvertNumbers(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分钟
if(pSrc->TP_DCS == GSM_7BIT)
{
// 7-bit编码方式
buf[3] = nLength;// 编码前长度
nLength = gsmEncode7bit(pSrc->TP_UD, &buf[4], nLength+1) + 4;// 转换TP-DA到目标PDU串
}
else if(pSrc->TP_DCS == GSM_UCS2)
{
// UCS2编码方式
buf[3] = gsmEncodeUcs2(pSrc->TP_UD, &buf[4], nLength);// 转换TP-DA到目标PDU串
nLength = buf[3] + 4;// nLength等于该段数据长度
}
else
{
// 8-bit编码方式
buf[3] = gsmEncode8bit(pSrc->TP_UD, &buf[4], nLength);// 转换TP-DA到目标PDU串
nLength = buf[3] + 4;// nLength等于该段数据长度
}
nDstLength += gsmBytes2String(buf, &pDst[nDstLength], nLength);// 转换该段数据到目标PDU串
 
// 返回目标字符串长度
return nDstLength;
}
 
// PDU解码,用于接收、阅读短消息
// 输入: pSrc - 源PDU串指针
// 输出: pDst - 目标PDU参数指针
// 返回: 用户信息串长度
int gsmDecodePdu(const char* pSrc, SM_PARAM* pDst)
{
int nDstLength;// 目标PDU串长度
unsigned char tmp;// 内部用的临时字节变量
unsigned char buf[256];// 内部用的缓冲区
 
// SMSC地址信息段
gsmString2Bytes(pSrc, &tmp, 2);// 取长度
tmp = (tmp - 1) * 2;// SMSC号码串长度
pSrc += 4;// 指针后移,忽略了SMSC地址格式
gsmSerializeNumbers(pSrc, pDst->SCA, tmp);// 转换SMSC号码到目标PDU串
pSrc += tmp;// 指针后移
 
// TPDU段基本参数
gsmString2Bytes(pSrc, &tmp, 2);// 取基本参数
pSrc += 2;// 指针后移
 
// 取回复号码
gsmString2Bytes(pSrc, &tmp, 2);// 取长度
if(tmp & 1) tmp += 1;// 调整奇偶性
pSrc += 4;// 指针后移,忽略了回复地址(TP-RA)格式
gsmSerializeNumbers(pSrc, pDst->TPA, tmp);// 取TP-RA号码
pSrc += tmp;// 指针后移
 
// TPDU段协议标识、编码方式、用户信息等
gsmString2Bytes(pSrc, (unsigned char*)&pDst->TP_PID, 2);// 取协议标识(TP-PID)
pSrc += 2;// 指针后移
gsmString2Bytes(pSrc, (unsigned char*)&pDst->TP_DCS, 2);// 取编码方式(TP-DCS)
pSrc += 2;// 指针后移
gsmSerializeNumbers(pSrc, pDst->TP_SCTS, 14);// 服务时间戳字符串(TP_SCTS) 
pSrc += 14;// 指针后移
gsmString2Bytes(pSrc, &tmp, 2);// 用户信息长度(TP-UDL)
pSrc += 2;// 指针后移
if(pDst->TP_DCS == GSM_7BIT)
{
// 7-bit解码
nDstLength = gsmString2Bytes(pSrc, buf, tmp & 7 ? (int)tmp * 7 / 4 + 2 : (int)tmp * 7 / 4);// 格式转换
gsmDecode7bit(buf, pDst->TP_UD, nDstLength);// 转换到TP-DU
nDstLength = tmp;
}
else if(pDst->TP_DCS == GSM_UCS2)
{
// UCS2解码
nDstLength = gsmString2Bytes(pSrc, buf, tmp * 2);// 格式转换
nDstLength = gsmDecodeUcs2(buf, pDst->TP_UD, nDstLength);// 转换到TP-DU
}
else
{
// 8-bit解码
nDstLength = gsmString2Bytes(pSrc, buf, tmp * 2);// 格式转换
nDstLength = gsmDecode8bit(buf, pDst->TP_UD, nDstLength);// 转换到TP-DU
}
 
// 返回目标字符串长度
return nDstLength;
}
 
// 初始化GSM状态
BOOL gsmInit()
{
char ans[128];// 应答串
 
// 测试GSM-MODEM的存在性
WriteComm("AT\r", 3);
ReadComm(ans, 128);
if (strstr(ans, "OK") == NULL)  return FALSE;
 
// ECHO OFF
WriteComm("ATE0\r", 5);
ReadComm(ans, 128);
 
/*WriteComm("AT+CPMS="ME","ME","ME"\r",20);
ReadComm(ans, 128);*/
// PDU模式
/*WriteComm("AT+CMGF=0\r", 10);
ReadComm(ans, 128);*/
 
return TRUE;
}
 
// 发送短消息,仅发送命令,不读取应答
// 输入: pSrc - 源PDU参数指针
int gsmSendMessage(SM_PARAM* pSrc)
{
int nPduLength;// PDU串长度
unsigned char nSmscLength;// SMSC串长度
int nLength;// 串口收到的数据长度
char cmd[16];// 命令串
char pdu[512];// PDU串
char ans[128];// 应答串
 
nPduLength = gsmEncodePdu(pSrc, pdu);// 根据PDU参数,编码PDU串
strcat(pdu, "\x01a");// 以Ctrl-Z结束
 
gsmString2Bytes(pdu, &nSmscLength, 2);// 取PDU串中的SMSC信息长度
nSmscLength++;// 加上长度字节本身
 
// 命令中的长度,不包括SMSC信息长度,以数据字节计
sprintf(cmd, "AT+CMGS=%d\r", nPduLength / 2 - nSmscLength);// 生成命令
 
//TRACE("%s", cmd);
//TRACE("%s\n", pdu);
 
WriteComm(cmd, strlen(cmd));// 先输出命令串
 
nLength = ReadComm(ans, 128);// 读应答数据
 
// 根据能否找到"\r\n> "决定成功与否
if(nLength == 4 && strncmp(ans, "\r\n> ", 4) == 0)
{
return WriteComm(pdu, strlen(pdu));// 得到肯定回答,继续输出PDU串
}
 
return 0;
}
 
// 读取短消息,仅发送命令,不读取应答
// 用+CMGL代替+CMGR,可一次性读出全部短消息
int gsmReadMessageList()
{
return WriteComm("AT+CMGL=1\r", 11);
}
 
// 删除短消息,仅发送命令,不读取应答
// 输入: index - 短消息序号,1-255
int gsmDeleteMessage(int index)
{
char cmd[16];// 命令串
 
sprintf(cmd, "AT+CMGD=%d\r", index);// 生成命令
 
// 输出命令串
return WriteComm(cmd, strlen(cmd));
}
 
// 读取GSM MODEM的应答,可能是一部分
// 输出: pBuff - 接收应答缓冲区
// 返回: GSM MODEM的应答状态, GSM_WAIT/GSM_OK/GSM_ERR
// 备注: 可能需要多次调用才能完成读取一次应答,首次调用时应将pBuff初始化
int gsmReadMessage(SM_PARAM *pMsg)
{
int nLength;//串口收到的数据长度
int nMsg;//短消息读数值
char* ptr;//内部用的数据指针
char cmd[16];//命令串
char ans[1024];//应答串
 
nMsg = 0;
ptr = ans;
sprintf(cmd, "AT+CMGL=1\r"); //生成命令
WriteComm(cmd,strlen(cmd));//输出命令串
Sleep(1000);
nLength = ReadComm(ans,1024);//读应答数据
 
//根据能否找到“+CMS ERROR”决定成功与否
if (nLength>0 && strncmp (ans,"CMS ERROR",10) !=0)
{
//循环读取每一条短消息,以“+CMGL:”开头
while ((ptr = strstr(ptr,"+CMGL:")) !=NULL)
{
ptr +=6; //跳过“+CMGL:”
sscanf(ptr,"%d",&pMsg->index); //找下一行
ptr = strstr(ptr, "\r\n");// 找下一行
ptr += 2; //跳过"\r\n"
gsmDecodePdu(ptr,pMsg); //PDU串解码
pMsg++; //准备读下一条短消息
nMsg++; //短消息计数加1
}
}
return nMsg;
 
}
int gsmGetResponse(SM_BUFF* pBuff)
{
int nLength;// 串口收到的数据长度
int nState;
 
// 从串口读数据,追加到缓冲区尾部
nLength = ReadComm(&pBuff->data[pBuff->len], 128);
pBuff->len += nLength;
 
// 确定GSM MODEM的应答状态
nState = GSM_WAIT;
if ((nLength > 0) && (pBuff->len >= 4))
{
if (strncmp(&pBuff->data[pBuff->len - 4], "OK\r\n", 4) == 0)  nState = GSM_OK;
else if (strstr(pBuff->data, "+CMS ERROR") != NULL) nState = GSM_ERR;
}
 
return nState;
}
 
// 从列表中解析出全部短消息
// 输入: pBuff - 短消息列表缓冲区
// 输出: pMsg - 短消息缓冲区
// 返回: 短消息条数
int gsmParseMessageList(SM_PARAM* pMsg, SM_BUFF* pBuff)
{
int nMsg;// 短消息计数值
char* ptr;// 内部用的数据指针
 
nMsg = 0;
ptr = pBuff->data;
 
// 循环读取每一条短消息, 以"+CMGL:"开头
while((ptr = strstr(ptr, "+CMGL:")) != NULL)
{
ptr += 6;// 跳过"+CMGL:", 定位到序号
sscanf(ptr, "%d", &pMsg->index);// 读取序号
//TRACE("  index=%d\n",pMsg->index);
 
ptr = strstr(ptr, "\r\n");// 找下一行
if (ptr != NULL)
{
ptr += 2;// 跳过"\r\n", 定位到PDU
 
gsmDecodePdu(ptr, pMsg);// PDU串解码
 
pMsg++;// 准备读下一条短消息
nMsg++;// 短消息计数加1
}
}
 
return nMsg;
}
PDU 编解码工具 好用的 PDU 工具,支持 PDU 编解码,非常方便短信 SMS 开发,特分享给大家 立即下载

相关推荐

pdu解码C语言实例

C语言实现pdu解码 。测试通过 PDU模式短信解码 内含短信pdu解码代码,基于C语言的短信pdu解码的源码

GSM PDU串编解码

// 可打印字符串转换为字节数据// 如:"C8329BFD0E01" --> {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01}// 输入: pSrc - 源字符串指针//       nSrcLength - 源字符串长度// 输出: pDst - 目标

格物致知 1112

短信编码PDU生产解析工具

初学者开发GSM模块、4G模块的时候,需要将国标字符转换成unicode码发送到模块中,才能实现中文短信的收发。该软件可以下显示转码后PDU包的格式,也可以进行PDU包的解码,很适合调试过程中的朋友。

安信可-A7模块——C语言编程实现GPS功能

上一篇博文整理学习了有关串口通信、串口编程的一些基本知识。本篇将通过编程来获取、解析、转换GPS接收机接收的信息。 我们将在fl2440开发板上实现该功能。一、A7与开发板连线我使用的是USB转TTL串口转接线,这里要保证Linux支持了所用的转接芯片。我使用的是cp210的USB转串口芯片,因此要在内核选项中支持它:make menuconfig Device Drivers->

C_Aya的博客 4569

PDU编码工具用于短信编码

PDU编码工具用于短信编码

PDU解码器.rar_PDU编码_SMS PDU Library VB6_pdudecoder vb.net_vb.net pd

手机短信PDU编码解码函数,采用VB.NET编写。

短信PDU解码 (转)

0891683108200505F0040D91683119930093F6000880015141652123044F60597D第一段——短信中心码段0891683108200505F01、短信息中心地址长度段【SMSC-Length--短信中心号码长度】首先看前两位“ 08”08* 2=16,即表示“08”后面的16位字符串为短信中心号码信息;2、短信息中心号码类型【Type-of-SMSC

dragoo1的专栏 2448

【Docker】Docker安装Hadoop分布式集群

hadoop目录安装在:/usr/local/hadoop-2.7.0/etc/hadoop。访问Hadoop102:9870,查看是否能够看到hdfs界面。访问hadoop103:8088,查看能够看到yarn界面。在yarn上可以看到执行情况。

weixin_46429290的博客 3461

GSM/GPRS之三-短信格式及编码

短信格式及编码

让你爱上电路设计 6460

震坤行:企业 MRO 物料标准化革新之路

那产生这些问题的原因是什么呢?要想解决此问题,企业高层必须下定决心对历史数据进行梳理,并善于利用信息技术,融合企业管理的流程机制,建立起一套适合企业发展的物料标准化管理体系,循序渐进,逐步规避由物料不规范带来的管理问题,最终使得这套标准化体系能够满足企业多元化业务发展需要。国内某电子制造头部企业原先内部物料无对应分类,仅有物料编码,给企业对采购、领料的过程中造成极大的不变,基于震坤行的目录结构,预测物料对应的分类,预测准确率达到80%以上,再辅以人工校正,最终搭建起一套标准的目录体系,如图2.2所示。

carson99的博客 421

扩视机器视觉—Halcon机器视觉48个实战项目六(检测定位角度)

此项目halcon检测检测定位角度问题,并显示。

qq_21516871的博客 1096

SIM7600CE模块(GSM/GPRS)调试

本文介绍SIM7600CE-A模块的短信开发流程,涵盖AT+CNMI指令、硬件与软件问题排查、USB接口、SIM卡热拔插及常见故障处理,并附有开发流程与封装资源。

让你爱上电路设计 9613

APP抓包-代理转发绕过反代理+Xposed绕过证书校验

而这里的牛牛不止设置了反代理还设置了证书校验,一闪而过的三个数据包就是在校验证书。而proxifier工具的转发机制获取的是网络接口出口数据,相当于是在网络接口设代理。这个时候就可以在夜神打开牛牛开始抓包了,打开牛牛可以看到proxifier有夜神流量通过。关闭代理之后牛牛就正常了,可恶的牛牛啊,这样我没办法抓包啊,怎么办啊。模拟器开启代理,burp开启监听。打开牛牛app,牛牛不在报错。牛牛app检测的是系统代理,也就是在模拟器或手机上设置的代理。再在浏览器下载两个模块,在夜神安装,用来屏蔽证书校验。

xiaoheizi的博客 7532

GSM模块SMS相关AT命令使用说明

凡是利用GSM模块二次开发的,不管是用来做公话,还是GPRS通信,其中短消息基本都要使用的。本文大致介绍一下短消息相关的AT命令使用方法。 详细的AT指令说明,可以参考 07.05,或者西门子MC35I的AT手册,西门子手册感觉还是很不错的。     由于本文表达的错误给您带来的物资损失和精神损伤,本人概不负责。 1、    短消息的格式 我所见到的模块短消息基本都提供2种格式,

heyustudent的专栏 2109

VisualStudio2022配置CGAL

vs2022和vs2017安装配置boost没什么区别,只需要注意boost的msvc得是14.3的,这玩意跟visualstudio版本挂钩的。压缩包解压,得到下面这两文件,然后把auxiliary这个文件挪到CGAL-5.6里面就行了。我用cgal读取一个stl模型,并输出相关信息(想可视化的话需要安装Qt,不想装Qt也可以装VTK)然后下载下面这两个压缩包。照着下面的截图填就完事了。

weixin_43850909的博客 1171

【ARM Trace32(劳特巴赫) 高级篇 20 -- SNOOPer 使用介绍】

在 Lauterbach TRACE32 调试系统中,Snooper是一种特殊的监视工具,它能够在不中断处理器执行的情况下监视和记录特定内存地址的数据变化。这对于系统级调试、性能分析、数据流监视以及实时系统的问题追踪特别有用,尤其是在无法使用中断的情况下。当你设置了一个或多个Snooper时,TRACE32 硬件将不断地监视指定的内存地址,一旦发生了读写操作,就会将相关信息记录下来。这样你就可以看到某个地址的数据是什么时候以及如何被修改的,而不会影响目标系统的运行。

CodingCos的博客 2766

text格式短信

注:来自网络     凡是利用GSM模块二次开发的,不管是用来做公话,还是GPRS通信,其中短消息基本都要使用的。本文大致介绍一下短消息相关的AT命令使用方法。 详细的AT指令说明,可以参考 07.05,或者西门子MC35I的AT手册,西门子手册感觉还是很不错的。 由于本文表达的错误给您带来的物资损失和精神损伤,本人概不负责。 1、 短消息的格式 我所见到的模块短消息基本都提

齐子龙的专栏 911

OpenStack 2018 年终盘点

目录 文章目录目录前言OpenStack 一年来的成长NovaCinderNeutronIronicCyborgOctaviaKollaMagnumZunKuryr从 OpenStack 到 OpenInfra 前言 这是最好的时代,也是最坏的时代 — — 查尔斯·约翰·赫芬姆·狄更斯《双城记》 年关将至,闲暇之余,回顾我与 OpenStack 的 2018。 NOTE:仅作为个人见解,与公...

烟云的计算 3596
上一篇: 7bit 编码
下一篇: 谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词
junmail
博客等级 码龄22年 159粉丝 452原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值