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

📄 收发原理.txt

📁 使用Gsm手机模块发送手机短信的C#源代码、手机AT指令中文参考手册、短信解码及编码规范、收发原理、以及一个C#实现的Demo
💻 TXT
📖 第 1 页 / 共 3 页
字号:
{
 ss_port.Close();
 Application.Exit();
} 

  到这里都告一个段落了,所有的功能都完成了!不过由于这仅仅是一个演示用例,还有很多没有考虑,像串口通信中的,在实际操作不可这样操作的,应该用多线程来处理,一个专门用来读串口,一个专门用来写串口。还有程序中很多防出错代码没有添加进去,希望有心有朋友添加,并公布出来,这也是我写这篇文章希望看到的结果。请勿将本程序直接用于实际中,真诚提醒你!

  终于写完了,我也放松了许多,本来很早就应该完成了,因为一些个人原因,没有及时写完,向那些曾经问过我相关问题,没有及时回复的朋友,抱歉一声,希望你们继续支持我!

  调试环境:

  Windows 2000 Professional、Visual Studio.NET、西门子3508手机、西门子专用数据线。


你主要是实现什么功能呢?我先在有几个用自定义函数希望能对你有所帮助:
这是用PDU模式发中文短信的编码:
手机号的编码:
private string PhoneEncode(string PhoneNumber)
		{
			byte Buffer;
			ASCIIEncoding AE=new ASCIIEncoding();
            byte[]   Mobilephone=AE.GetBytes(PhoneNumber);
			for(int i=0;i<=8;i=i+2)
			{
				Buffer=Mobilephone[i];
				Mobilephone[i]=Mobilephone[i+1];
				Mobilephone[i+1]=Buffer;
		    }
			string   Charnumber=AE.GetString(Mobilephone);
			Charnumber=Charnumber.Insert(10,"F");
			Charnumber="0001000D9168"+Charnumber+"0008A7";
			return Charnumber;
		}
		
中文短信的编码:
		private string UnicodeEncoding(string Msg)
		{
			byte[] Bytes = Encoding.Unicode.GetBytes(Msg.ToCharArray());
			int mlength;
			int i;
			mlength =(Bytes.Length > 140? 140: Bytes.Length);
			Msg = "";
			for(i = 0;i<=mlength-1;i=i+2)
			{
				Msg += String.Format("{0:X2}", Bytes[i + 1]);
				Msg += String.Format("{0:X2}", Bytes[i]);
			}
			Msg=string.Format("{0:X2}",mlength)+Msg;
			return Msg;
		}
中文短信的解码:		
	 	private string UnicodeDecoding(string Msg)
		{
			byte[] Bytes=new byte[Msg.Length];
            int i,j;
			j=0;
			for(i=0;i<=Msg.Length-1;i=i+4)
			{
				Bytes[j+1]=byte.Parse(Msg.Substring(i,2),System.Globalization.NumberStyles.HexNumber);
				Bytes[j]=byte.Parse(Msg.Substring(i+2,2),System.Globalization.NumberStyles.HexNumber);
                j=j+2;
			}
			return Encoding.Unicode.GetString(Bytes);
		}


谁能把一下代码转成C#代码—— 手机短信息SMS开发—编码和解码 ? 
                     手机短信息SMS开发—编码和解码  

2002-07-04· · ··C++builder资源中心 

  
  1、 英文编码  

  缺省的GSM字符集为7位编码,ASCII码为8位编码,编码就是将8位ASCII编码转换为7位编码。  

  例如:1234 编码后得到31D98C06  

  2进制表示  

  8位编码 00110001 00110010 00110011 00110100  

  7位编码 00110001 11011001 10001100 00000110  

  通过例子可以看出,将ascii8位编码的Bit8去掉,依次将下7位编码的后几位逐次移到前面,形成新的8位编码。  

  以下是C++Builder的实现代码:  

String __stdcall EncodeEnglish(String InputStr)  

{  

int n,len,cur;  

String tempstr,returnstr;  

unsigned char mid1[2],mid2[2];  

len=InputStr.Length();  

n=0;  

for(int i=1;i<=len;i++)  

{  

if (i 
{  

strcpy(mid1,InputStr.SubString(i,1).c_str());  

strcpy(mid2,InputStr.SubString(i+1,1).c_str());  

cur=(mid1[0]>>n)|((mid2[0]<<(7-n))& 0xff);  

}  

else  

{  

strcpy(mid1,InputStr.SubString(i,1).c_str());  

cur=(mid1[0]>>n)& 0x7f;  

}  

FmtStr(tempstr,"%2.2X",ARRAYOFCONST((cur)));  

returnstr=returnstr+tempstr;  

n=(n+1)%7;  

if (n==0)  

i++;  

}  

return returnstr;  

}   
  
  2、英文解码  

  简单地说就是将7位字符编码转换为8为字符编码  

  以下是C++Builder的实现代码:  

int ReturnHex(int Value)  

{  

switch (Value)  

{  

case 0:  

Value=0x7f;  

break;  

case 1:  

Value=0x3f;  

break;  

case 2:  

Value=0x1f;  

break;  

case 3:  

Value=0x0f;  

break;  

case 4:  

Value=0x07;  

break;  

case 5:  

Value=0x03;  

break;  

case 6:  

Value=0x01;  

break;  

case 7:  

Value=0x00;  

break;  

}  

return Value;  

}  

String __stdcall DecodeEnglish (String InputStr)  

{  

unsigned char InStr[300];  

char OutStr[300];  

String str;  

int j=0,i=0;  

int Point=0;  

int temp;  

memset(InStr,0,301);  

memset(OutStr,0,301);  

for(int i=0;i 
{  

str="0x"+InputStr.SubString(i+1,2);  

InStr[i/2]=StrToInt(str);  

}  

while(j<=InputStr.Length()/2)  

{  

if(Point==0)  

OutStr[i]=InStr[j]&ReturnHex(Point);  

else  

OutStr[i]=((InStr[j]&ReturnHex(Point))<>(8-Point));  

if(Point%7==0&&Point!=0)  

Point=0;  

else  

Point=Point+1;  

i++;  

j=i-(i/8);  



}  

OutStr[12]=((InStr[12]&0x07)<<5)|(InStr[11]>>(8-5));  

return AnsiString(OutStr);  

}   


  3、中文编码  

  中文编码较为简单,就是将GB2312的中文编码转换为代码页为CP936的Unicode编码即可  

  以下是C++Builder的实现代码  

String EncodeChinese(String InputStr)  

{  

int cur;  

String tempstr,returnstr;  

WideString ws;  

wchar_t mid[2];  

ws=WideString(InputStr);  

for(int i=1;i<=ws.Length();i++)  

{  

wcscpy(mid,ws.SubString(i,1).c_bstr());  

cur=mid[0];  

FmtStr(tempstr,"%4.4X",ARRAYOFCONST((cur)));  

returnstr=returnstr+tempstr;  

}  

return returnstr;  

}   

  4、中文解码  

  将代码页为CP936的Unicode编码转换为GB2312的中文编码即可  

  以下是C++Builder的实现代码  

String DecodeChinese(String InputStr)  

{  

wchar_t Buf[300];  

for(int i=0;i 
{  

Buf[i/4]=StrToInt("0x"+InputStr.SubString(i+1,4));  

}  

Buf[InputStr.Length()/4]=0;  

return WideCharToString(Buf);  

}  

ChangNing(Redpower)


public static  string UCSUnCode(string szPdu)
{
    string tempStr="";
    for(int i=0;i<szPdu.Length-1;i=i+4)
    {   		
	string m=szPdu.Substring(i,4);				
	int n=int.Parse(m,System.Globalization.NumberStyles.AllowHexSpecifier);
	tempStr=tempStr+Convert.ToChar(n);				
    }
   return tempStr;
} 
备注:
  这是我在写手机短信息解码PDU时写的函数!里面可以把UNICODE字符转为汉字(中文)


	szPdu	"AT+CMGR=1\r\r\n+CMGR: 2,,12\r\n0891683108503505F0110000810008FF046A2A6EE8\r\n\r\nOK\r\n"	string


1) In order to make your modem responds to incoming message automatically, you need issue "AT+CNMI=2,1,0,0,0" command when you initialize your modem. When new SMS comes in, modem will automatically respond using "+CMTI" command.

2) Chinese is much more difficult to deal with compare to English. You cannot simply use a Chinsese string. PDU format must be used. So you have to parse your Chinese message according to PDU format. This will apply to both incoming and ongoing messages.Beside PDU format, you have to encdoe/decode Chinese string using Unicode format. The following code is for Chinese Unicode Encode and Decode purpose.

Note: Please refer to GSM 07.05 Version 4.5.0 for more information about PDU format and AT commands.

#Region "UCS2 (16bit) Encoding & Decoding"
    Private Function UnicodeEncoding(ByVal Msg As String) As String
        Dim Bytes() As Byte = Encoding.Unicode.GetBytes(Msg.ToCharArray())
        Dim l As Integer
        Dim i As Integer

        l = IIf(Bytes.Length > 140, 140, Bytes.Length)
        Msg = ""
        For i = 0 To l - 1 Step 2
            Msg &= String.Format("{0:X2}", Bytes(i + 1))
            Msg &= String.Format("{0:X2}", Bytes(i))
        Next i
        Return Msg
    End Function

    Private Function UnicodeDecoding(ByVal Msg As String) As String
        Dim Bytes(Msg.Length / 2 - 1) As Byte
        Dim i, j As Integer

        j = 0
        For i = 0 To Msg.Length - 1 Step 4
            Bytes(j + 1) = Int32.Parse(Msg.Substring(i, 2), NumberStyles.HexNumber)
            Bytes(j) = Int32.Parse(Msg.Substring(i + 2, 2), NumberStyles.HexNumber)
            j = j + 2
        Next i

        Return Encoding.Unicode.GetString(Bytes)
    End Function

⌨️ 快捷键说明

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