📄 m32.lst
字号:
771 4
772 4
773 4 }//if((ptr=strstr(task,"A")) != NULL)
774 3 }//if(gsmSearchPhone("M"))
775 2 else
776 2 {
777 3
778 3 sprintf(TP_UD,"You are not master!");
779 3 return 0;
780 3
781 3
782 3 }
783 2
784 2
785 2 }//if(task[0] == 'A')
786 1
C51 COMPILER V7.50 M32 04/04/2007 15:01:44 PAGE 14
787 1 if(task[0] == 'B') //设置第二个受权号码
788 1 {
789 2 //if(gsmPhoneBookTask(GSM_SEARCH_PHONE,NULL,"A",0))
790 2 if(gsmSearchPhone("A")) //是否有第一个受权号码?
791 2 {
792 3 if((ptr=strstr(task,"B")) != NULL)
793 3 {
794 4 //增加授权:
795 4
796 4 ptr++;
797 4 putstring1("Phone Number to Save:\r\n");
798 4 putstring1(ptr);
799 4 putstring1("\r\n");
800 4 PhoneNumber=3;
801 4 //if(gsmPhoneBookTask(GSM_SAVE_PHONE,ptr,"M",PhoneNumber))
802 4 if(gsmSavePhone(ptr,"B")==TRUE) //第2个授权,起名为:B
803 4 {
804 5
805 5 putstring1("Save Phone Ok,Number is:\r\n");
806 5 sprintf(TPA,"++");
807 5 strcat(TPA, ptr);
808 5 putstring1(TPA);
809 5 putstring1("\r\n");
810 5
811 5 sprintf(TP_UD,"OK");
812 5
813 5 return 1; //gsmSendMessage("OK");
814 5
815 5 }
816 4 else
817 4 {
818 5 putstring1("Save Phone Fail!");
819 5 sprintf(TP_UD,"Fail"); //gsmSendMessage("Fail");
820 5 return 0;
821 5
822 5 }
823 4
824 4
825 4
826 4 }//if((ptr=strstr(task,"B")) != NULL)
827 3 }//if(gsmSearchPhone("A"))
828 2 }//if(task[0] == 'B')
829 1
830 1
831 1 return 0;
832 1 }
833
834
835 // PDU编码,用于编制、发送短消息
836 // pSrc: 源PDU参数指针
837 // pDst: 目标PDU串指针
838 // 返回: 目标PDU串长度
839 int gsmEncodePdu(char xdata* pDst) //pDst=pdu;
840 {
841 1 int nLength; // 内部用的串长度
842 1 int nDstLength; // 目标PDU串长度
843 1
844 1 // SMSC地址信息段
845 1 nLength = strlen(SCA); // SMSC地址字符串的长度
846 1
847 1 if((nLength & 0x01)==0)
848 1 nDstLength= nLength/2+1;
C51 COMPILER V7.50 M32 04/04/2007 15:01:44 PAGE 15
849 1 else
850 1 nDstLength= (nLength+1)/2 + 1;
851 1
852 1 ans[0] = (char)nDstLength; // SMSC地址信息长度
853 1 ans[1] = 0x91; // 固定: 用国际格式号码
854 1 nDstLength = gsmBytes2String(ans, pDst, 2); // 转换2个字节到目标PDU串
855 1
856 1 nDstLength += gsmInvertNumbers(SCA, &pDst[nDstLength], nLength); // 转换SMSC到目标PDU串
857 1 // TPDU段基本参数、目标地址等
858 1 nLength = strlen(TPA); // TP-DA地址字符串的长度
859 1 ans[0] = 0x11; // 是发送短信(TP-MTI=01),TP-VP用相对格式(TP-VPF=10)
860 1 ans[1] = 0; // TP-MR=0
861 1 ans[2] = (char)nLength; // 目标地址数字个数(TP-DA地址字符串真实长度)
862 1 ans[3] = 0x91; // 固定: 用国际格式号码
863 1 nDstLength += gsmBytes2String(ans, &pDst[nDstLength], 4); // 转换4个字节到目标PDU串
864 1 nDstLength += gsmInvertNumbers(TPA, &pDst[nDstLength], nLength); // 转换TP-DA到目标PDU串
865 1
866 1 // TPDU段协议标识、编码方式、用户信息等
867 1 nLength = strlen(TP_UD); // 用户信息字符串的长度
868 1 ans[0] = TP_PID; // 协议标识(TP-PID)
869 1 ans[1] = TP_DCS; // 用户信息编码方式(TP-DCS)
870 1 ans[2] = 0; // 有效期(TP-VP)为5分钟
871 1
872 1
873 1 if(TP_DCS == GSM_7BIT)
874 1 {
875 2 // 7-bit编码方式
876 2 ans[3] = nLength; // 编码前长度
877 2 nLength = gsmEncode7bit(TP_UD, &ans[4], nLength+1) + 4; // 转换TP-DA到目标PDU串
878 2 }
879 1 else
880 1 if(TP_DCS == GSM_UCS2)
881 1 {
882 2 #if 0
// UCS2编码方式
ans[3] = gsmEncodeUcs2(pSrc->TP_UD, &ans[4], nLength); // 转换TP-DA到目标PDU串
nLength = ans[3] + 4; // nLength等于该段数据长度
#endif
887 2 }
888 1 else
889 1 {
890 2 // 8-bit编码方式
891 2 //ans[3] = gsmEncode8bit(TP_UD, &ans[4], nLength); // 转换TP-DA到目标PDU串
892 2 nLength = ans[3] + 4; // nLength等于该段数据长度
893 2 }
894 1
895 1 nDstLength += gsmBytes2String(ans, &pDst[nDstLength], nLength); // 转换该段数据到目标PDU串
896 1 // 返回目标字符串长度
897 1 return nDstLength;
898 1
899 1 }
900
901
902
903
904 /*****************************************************************************************************
905 * int gsmDecode7bit(const unsigned char* pSrc, char* pDst, int nSrcLength)
906 *
907 * 7-bit解码
908 * pSrc: 源编码串指针
909 * pDst: 目标字符串指针
910 * nSrcLength: 源编码串长度
C51 COMPILER V7.50 M32 04/04/2007 15:01:44 PAGE 16
911 * 返回: 目标字符串长度
912 *******************************************************************************************************/
913 //int gsmDecode7bit(const unsigned char* pSrc, char* pDst, int nSrcLength)
914 int gsmDecode7bit(uchar* pSrc, char * pDst, int nSrcLength)
915 {
916 1 int nSrc; // 源字符串的计数值
917 1 int nDst; // 目标解码串的计数值
918 1 int nByte; // 当前正在处理的组内字节的序号,范围是0-6
919 1 unsigned char nLeft; // 上一字节残余的数据
920 1
921 1 // 计数值初始化
922 1 nSrc = 0;
923 1 nDst = 0;
924 1 // 组内字节序号和残余数据初始化
925 1 nByte = 0;
926 1 nLeft = 0;
927 1 // 将源数据每7个字节分为一组,解压缩成8个字节
928 1 // 循环该处理过程,直至源数据被处理完
929 1 // 如果分组不到7字节,也能正确处理
930 1 while(nSrc<nSrcLength)
931 1 {
932 2 // 将源字节右边部分与残余数据相加,去掉最高位,得到一个目标解码字节
933 2 *pDst = ((*pSrc << nByte) | nLeft) & 0x7f;
934 2 // 将该字节剩下的左边部分,作为残余数据保存起来
935 2 nLeft = *pSrc >> (7-nByte);
936 2 // 修改目标串的指针和计数值
937 2 pDst++;
938 2 nDst++;
939 2 // 修改字节计数值
940 2 nByte++;
941 2 // 到了一组的最后一个字节
942 2 if(nByte == 7)
943 2 {
944 3 // 额外得到一个目标解码字节
945 3 *pDst = nLeft;
946 3 // 修改目标串的指针和计数值
947 3 pDst++;
948 3 nDst++;
949 3 // 组内字节序号和残余数据初始化
950 3 nByte = 0;
951 3 nLeft = 0;
952 3 }
953 2 // 修改源串的指针和计数值
954 2 pSrc++;
955 2 nSrc++;
956 2 }
957 1 *pDst = 0;
958 1 // 返回目标串长度
959 1 return nDst;
960 1 }
961
962
963
964
965 // PDU解码,用于接收、阅读短消息
966 // pSrc: 源PDU串指针
967 // pDst: 目标PDU参数指针
968 // 返回: 用户信息串长度
969 int gsmDecodePdu(char * pSrc)
970 {
971 1 int nDstLength; // 目标PDU串长度
972 1 unsigned char tmp; // 内部用的临时字节变量
C51 COMPILER V7.50 M32 04/04/2007 15:01:44 PAGE 17
973 1
974 1 // SMSC地址信息段
975 1 gsmString2Bytes(pSrc, &tmp, 2); // 取长度
976 1 tmp = (tmp - 1) * 2; // SMSC号码串长度
977 1 pSrc += 4; //指针后移
978 1 gsmSerializeNumbers(pSrc, SCA, tmp);
979 1
980 1 #if 0
putstring1("SCA=\r\n");
putstring1(SCA);
putstring1("\r\n");
#endif
985 1
986 1
987 1 // 转换SMSC号码到目标PDU串
988 1 pSrc += tmp;
989 1 #if 0
putstring1("pSrc=\r\n");
putstring1(pSrc);
putstring1("\r\n"); //040D9168
#endif
994 1 // 指针后移
995 1 // TPDU段基本参数、回复地址等
996 1 gsmString2Bytes(pSrc, &tmp, 2);
997 1 //tmp=04 No return back addr
998 1 //tmp=84 have return back addr
999 1 // 取基本参数
1000 1 pSrc += 2;
1001 1 // 指针后移
1002 1 #if 0
putstring1("pSrc=\r\n");
putstring1(pSrc);
putstring1("\r\n"); //0D9168
#endif
1007 1
1008 1
1009 1 //if(tmp & 0x80)
1010 1 {
1011 2 // 包含回复地址,取回复地址信息
1012 2 gsmString2Bytes(pSrc, &tmp, 2); // 取长度
1013 2 if(tmp==13)putstring1("13\r\n");
1014 2
1015 2 if(tmp & 1) tmp += 1; // 调整奇偶性
1016 2 if(tmp==14)putstring1("14\r\n");
1017 2
1018 2
1019 2 pSrc += 4;
1020 2 // 指针后移
1021 2 gsmSerializeNumbers(pSrc, TPA, tmp);
1022 2 // 取TP-RA号码
1023 2 #if 0
putstring1("TPA=\r\n");
putstring1(TPA);
putstring1("\r\n");
#endif
1028 2 pSrc += tmp;
1029 2 // 指针后移
1030 2 }
1031 1
1032 1
1033 1 // TPDU段协议标识、编码方式、用户信息等
1034 1 gsmString2Bytes(pSrc, (unsigned char*)&TP_PID, 2); // 取协议标识(TP-PID)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -