中国电信CDMA无线上网卡短信收发

 

发送短信
  ///   <summary>
        
///  发送短信
        
///   </summary>
        
///   <param name="phone"> The phone. </param>
        
///   <param name="message"> The message. </param>
         public   static   void  SendMessageBySendPhone( string  phone,  string  message)
        {
            BaseCode.BaseTerm.phone.MessageSending 
=   true ;
            
string  text  = @" AT^HCMGS="" "   +  phone  +   @" "" " ;
            
string  text2  =  message;

            BaseTerm.term.SendString(text);
            BaseTerm.term.SendCtrl(
" CR " );
            Thread.Sleep(
300 );
            
byte [] msgbytes  =  Encoding.Unicode.GetBytes(text2);
            
byte [] msgbytesrnd  =   new   byte [msgbytes.Length];
            
for  ( int  i  =   1 ; i  <=  msgbytes.Length; i  =  i  +   2 )
            {
                msgbytesrnd[i 
-   1 =  msgbytes[i];
                msgbytesrnd[i] 
=  msgbytes[i  -   1 ];
            }

            BaseTerm.term.SendBytes(msgbytesrnd);
            BaseTerm.term.SendString(
" " );
            BaseTerm.term.SendCtrl(
" CR " );
        }
 

 

 

 

有短信进入
  // todo:有短信进入
                _reg  =   new  Regex( @" \+CMTI:[\s]*""(?<Mem>[A-Z a-z 0-9_]+)""[\s]*,[\s]*(?<Index>\d+) " );
                MatchCollection match 
=  _reg.Matches(cmd);
                
foreach  (Match m  in  match)
                {
                    Console.WriteLine(m.Groups[
" Mem " ].Value  +   " , "   +  m.Groups[ " Index " ].Value);
                    
if  (ShowInfo  !=   null )
                        ShowInfo(
this " 新短信,存储位置: "   +  m.Groups[ " Mem " ].Value  +   "  索引号: "   +  m.Groups[ " Index " ].Value);

                    
if  (MessageCNMIEvent  !=   null )
                        MessageCNMIEvent(
this , Convert.ToInt32(m.Groups[ " Index " ].Value), m.Groups[ " Mem " ].Value);

                    MessageCommands.GetMessageCMD(m.Groups[
" Index " ].Value,  1 );
                }

 

 

 

显示短信内容
   // todo:显示短信内容
                 /*
                 * 取值说明
                 * <index> 整型值,在存储器中的位置
                 * <mode> 短信状态的修改模式:
                 * 0 改变短信为已读状态
                 * 1 不改变短信的读取状态
                 * <callerID> 短消息发送方的号码
                 * <format> 表示该短消息的编码格式,取值参考^HCMGW
                 * <year, month, day, hour, minute,second>为接收到短消息时的年、月、日、小时、分钟和
                 * 秒。
                 * <Length> 接收到短消息的长度。
                 * <lang> 语言,取值参考^HCMGW
                 * <prt> 短信优先级,取值参考^HCMGW
                 * <Prv> 保密级别
                 * 0 Normal;
                 * 1 Restricted;
                 * 2 Confidential;
                 * 3 Secret
                 * <type> 短信类型
                 * 0 Normal;
                 * 1 CPT;
                 * 2 Voice Mail;
                 * 3 SMS Report
                 * <stat> 短信类型,取值参考^HCMGW
                 * <Msg> 接收到的短消息。
                 * <ctrl-Z>:标识一条短信息内容的结束,编码方式为非UNICOD方式下字符为:'0x1A',
                 * 编码方式为UNICOD方式下字符为:'0x001A'
                 
*/
                
// ^HCMGR:07713997270,2010,02,28,10,43,50,0,6,34,2,0,0,1

                _reg 
=   new  Regex(
                    
@" \r\n\^HCMGR:[\s]*(?<Caller>\d*)[\s]*,[\s]*(?<Year>\d*)[\s]*,[\s]*(?<Month>\d*)[\s]*,[\s]*(?<Day>\d*)[\s]*,[\s]*(?<Hour>\d*)[\s]*,[\s]*(?<Minute>\d*)[\s]*,[\s]*(?<Second>\d*)[\s]*,[\s]*(?<Lang>\d*)[\s]*,[\s]*(?<Format>\d*)[\s]*,[\s]*(?<Length>\d*)[\s]*,[\s]*(?<Prt>\d*)[\s]*,[\s]*(?<Prv>\d*)[\s]*,[\s]*(?<Type>\d*)[\s]*,[\s]*(?<Stat>\d*)\r\n " ,
                    RegexOptions.IgnoreCase);

                MatchCollection match 
=  _reg.Matches(cmd);
                
foreach  (Match m  in  match)
                {
                    
string  format  =  m.Groups[ " Format " ].Value;

                    
int  start  =   0 ;
                    
int  end  =   0 ;
                    
for  ( int  i  =   0 ; i  <  bytes.Length; i ++ )
                    {
                        
if  (bytes[i].ToString()  ==   " 10 "   &&  start  ==   0   &&  i  >   1 )
                        {
                            start 
=  i;
                        }
                        
if  (bytes[i].ToString()  ==   " 26 "   &&  end  ==   0 )
                        {
                            end 
=  i;
                        }
                    }
                    
int  len  =  bytes.Length  -   9   -  start;
                    
if  (len  %   2   !=   0 ) len  =  len  -   1 ;
                    var msgbytes 
=   new   byte [len];
                    
// Console.WriteLine("未截取:" + BitConverter.ToString(bytes));
                    Array.Copy(bytes, start  +   1 , msgbytes,  0 , len);
                    
// Console.WriteLine("转换前:" + BitConverter.ToString(msgbytes));
                     if  (format  ==   " 6 " )
                    {
                        
for  ( int  i  =   1 ; i  <=  msgbytes.Length; i  =  i  +   2 )
                        {
                            
byte  temp  =  msgbytes[i  -   1 ];
                            msgbytes[i 
-   1 =  msgbytes[i];
                            msgbytes[i] 
=  temp;
                        }
                    }
                    
if  (MessageHCMGREvent  !=   null )
                        MessageHCMGREvent(
this , m.Groups[ " Caller " ].Value,
                                          Convert.ToDateTime(m.Groups[
" Year " ].Value  +   " - "   +  m.Groups[ " Month " ].Value  +
                                                             
" - "   +
                                                             m.Groups[
" Day " ].Value  +   "   "   +  m.Groups[ " Hour " ].Value  +   " : "   +
                                                             m.Groups[
" Minute " ].Value  +   " : "   +  m.Groups[ " Second " ].Value),
                                          Encoding.Unicode.GetString(msgbytes));
                    
// Console.WriteLine("转换后:"+BitConverter.ToString(msgbytes));
                     if  (ShowInfo  !=   null )
                        ShowInfo(
this , m.Groups[ " Caller " ].Value  +   " 短信内容: "   +  Encoding.Unicode.GetString(msgbytes));
                    
if  (ShowInfo  !=   null )
                        ShowInfo(
this " 字节内容: "   +  BitConverter.ToString(msgbytes));
                }

 

 

 其实短信内容解码很简单,AT串口采用的是ASCII编码,短信的内容采用的是Unicode编码,并且每个字符的高低位互换了。根据规范截取出短信的内容的byte[],进行高低位互换,在进行Encoding.Unicode.GetString,发短信反之。

转载于:https://www.cnblogs.com/Tranquilty/archive/2010/08/17/1801192.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
GeoPandas是一个开源的Python库,旨在简化地理空间数据的处理和分析。它结合了Pandas和Shapely的能力,为Python用户提供了一个强大而灵活的工具来处理地理空间数据。以下是关于GeoPandas的详细介绍: 一、GeoPandas的基本概念 1. 定义 GeoPandas是建立在Pandas和Shapely之上的一个Python库,用于处理和分析地理空间数据。 它扩展了Pandas的DataFrame和Series数据结构,允许在其中存储和操作地理空间几何图形。 2. 核心数据结构 GeoDataFrame:GeoPandas的核心数据结构,是Pandas DataFrame的扩展。它包含一个或多个列,其中至少一列是几何列(geometry column),用于存储地理空间几何图形(如点、线、多边形等)。 GeoSeries:GeoPandas中的另一个重要数据结构,类似于Pandas的Series,但用于存储几何图形序列。 二、GeoPandas的功能特性 1. 读取和写入多种地理空间数据格式 GeoPandas支持读取和写入多种常见的地理空间数据格式,包括Shapefile、GeoJSON、PostGIS、KML等。这使得用户可以轻松地从各种数据源中加载地理空间数据,并将处理后的数据保存为所需的格式。 2. 地理空间几何图形的创建、编辑和分析 GeoPandas允许用户创建、编辑和分析地理空间几何图形,包括点、线、多边形等。它提供了丰富的空间操作函数,如缓冲区分析、交集、并集、差集等,使得用户可以方便地进行地理空间数据分析。 3. 数据可视化 GeoPandas内置了数据可视化功能,可以绘制地理空间数据的地图。用户可以使用matplotlib等库来进一步定制地图的样式和布局。 4. 空间连接和空间索引 GeoPandas支持空间连接操作,可以将两个GeoDataFrame按照空间关系(如相交、包含等)进行连接。此外,它还支持空间索引,可以提高地理空间数据查询的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值