中国电信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

1. 用户与权限管理模块 角色管理: 学生:查看实验室信息、预约设备、提交耗材申请、参与安全考核 教师:管理课题组预约、审批学生耗材申请、查看本课题组使用记录 管理员:设备全生命周期管理、审核预约、耗材采购与分发、安全检查 用户操作: 登录认证:统一身份认证(对接学号 / 工号系统,模拟实现),支持密码重置 信息管理:学生 / 教师维护个人信息(联系方式、所属院系),管理员管理所有用户 权限控制:不同角色仅可见对应功能(如学生不可删除设备信息) 2. 实验室与设备管理模块 实验室信息管理: 基础信息:实验室编号、名称、位置、容纳人数、开放时间、负责人 功能分类:按学科(计算机实验室 / 电子实验室 / 化学实验室)标记,关联可开展实验类型 状态展示:实时显示当前使用人数、设备运行状态(正常 / 故障) 设备管理: 设备档案:名称、型号、规格、购置日期、单价、生产厂家、存放位置、责任人 全生命周期管理: 入库登记:管理员录入新设备信息,生成唯一资产编号 维护记录:记录维修、校准、保养信息(时间、内容、执行人) 报废处理:登记报废原因、时间,更新设备状态为 "已报废" 设备查询:支持按名称、型号、状态多条件检索,显示设备当前可用情况 3. 预约与使用模块 预约管理: 预约规则:学生可预约未来 7 天内的设备 / 实验室,单次最长 4 小时(可设置) 预约流程:选择实验室→选择设备→选择时间段→提交申请(需填写实验目的) 审核机制:普通实验自动通过,高危实验(如化学实验)需教师审核 使用记录: 签到 / 签退:到达实验室后扫码签到,离开时签退,系统自动记录实际使用时长 使用登记:填写实验内容、设备运行情况(正常 / 异常),异常情况需详细描述 违规管理:迟到 15 分钟自动取消预约,多次违规限制预约权限 4. 耗材与安全管理模块 耗材管理: 耗材档案:名称、规格、数量、存放位置、
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值