3. GSM短信数据格式分析

3.1 发送短信PDU字符串

由于短信模式选择的是PDU格式,因此对PDU的编码和转码就变得很重要。中文短信息的实现需要将GB2312的中文编码转换为代码页为CP936的Unicode编码,PDU发送字符串数据格式中主要由短信中心地址、文件头字节、信息类型、目的地址、协议标识、数据编码方案、有效期、用户数据长度和用户数据组成。例如:设置PDU格式的编码为08 91 68 31 08 20 01 05 F0 11 00 0D 91 68 31 21 43 65 87 F9 00 08 00 04 4F 60 59 7DH,这组代码的含义如下所示:

08H:短信服务中心地址信息的长度,共8个八位字节(包括91) ;

91H:短信服务中心地址格式,用国际格式号码,在前面加‘+’ ;

68 31 08 20 01 05 F0H:短信服务中心地址,8613800210500,补‘F’凑成偶数个;

11H:基本参数,协议数据单元类型,表示发送,TP-VP用相对格式;

00H :信息参考,00H表示参考本身号码;

0DH :对方手机号数字个数,共13个十进制数 ;

91H :对方手机号,用国际格式号码,在前面加‘+’ ;

68 31 21 43 65 87 F9H:对方手机号(TP-DA),8613123456789,补‘F’凑成偶数个;

00H:协议标识(TP-PID), 是普通GSM类型,点到点方式;

08H:用户信息编码方式(TP-DCS),主要用其1个字节的第2和第3位表示编码方式,08H表示为UCS-2编码,最多发140个字符;04H为8-bit编码,最多发140个字符;00H为7-bit编码,最多发160个字符;

00H:有效期(TP-VP),5分钟;

04H:短信长度(TP-UDL),实际长度4个字节;

4F 60 59 7DH:用户信息(TP-UD),“你好”的Unicode编码 。

3.2 短信接收PDU字符串

接收方PDU字符串的含义和发送方不同,同样以“你好”为例,接收方的PDU字符串为:08 91 68 31 08 20 01 05 F0 24 0D 91 68 31 67 24 47 63 F0 00 08 70 50 91 31 21 25 23 04 4F 60 59 7DH,其含义如下:

08 91 68 31 08 20 01 05 F0H:短信服务中心,分析同发送相同;

24H:协议数据单元类型基本参数(TP-MTI/VFP) ,发送,TP-VP用相对格式;

0DH:对方手机号数字个数;

91H:对方手机号(TON/NPI),用国际格式号码(在前面加‘+’);

68 31 67 24 47 63 F0H :对方手机号(TP-DA),8613764274360,补‘F’凑成偶数个;

00H:协议标识(TP-PID) ,是普通GSM类型,点到点方式;

08H:用户信息编码方式(TP-DCS) ,分析同发送方;

70 50 91 31 21 25H:短信息发送时间(SCTS),07年05月19日13时12分52秒;

23H:发送时间对应的时区;

04H:短信长度(TP-UDL),实际长度4个字节;

4F 60 59 7DH:用户信息(TP-UD) ,“你好”的Unicode编码。

4. 系统组成

4.1 硬件组成

系统由嵌入式Linux系统和西门子MC35模块通过串行接口三线制连接而构成, MC35模块通过串口1与嵌入式系统相连,嵌入式系统配置包括50MHz 主频的MPC860 32位处理器,16M SDRAM内存,2个RS232,操作系统采用嵌入式Linux for PowerPC。MC35模块由GSM基带处理器、电源专用集成电路、射频电路和闪速存储器等部分组成,负责处理GSM蜂窝设备中的音频、数据信号,内嵌的软件部分执行应用接口和所有GSM协议栈的功能。MC35模块支持中文短信,支持GPRS功能,便于将来功能的扩展。

4.2 libcssl函数库

为了实现短信收发,需要在嵌入式Linux下通过串口发送一系列的AT指令。串行通信是计算机与其它设备通信的常用方法,在本系统中采用一个基于Linux的串行通信函数库libcssl,可实现串行接口的异步事件驱动并发。采用该方法,用户只要在服务器和数据源之间建立异步连接,编写数据处理函数,而对数据源事件的监测、数据读取、多事件的处理等操作是由操作系统内部完成的,因而,很大程度上简化了编程者的工作,同时保证了较高的资源利用率。

libcssl函数库提供给用户多种基于事件驱动方式的串行接口函数。其主要的函数有4类,分别进行串口初始化、收发数据、错误信息和结束串口操作。在使用某个串口之前,应调用初始化函数,为其设定相应的参数,使得收发双方遵循相同的通信协议和数据格式,同时通过初始化操作,为串口数据源和采集服务器之间建立异步连接,分配采集句柄。当数据源通过串口向嵌入式系统发送数据时,该数据会被送入数据缓冲区,并通过该数据源的采集句柄访问该串口的事件回调函数,在该函数中完成数据的处理。这样,当用户使用多个串口时,不需要用多个线程,只需为每个串口设置独立的回调函数,各回调函数之间可方便地实现数据交换共享。程序中可通过获取错误信息得知系统出现的错误状态,而采集程序结束,应关闭串口,释放系统资源。相关的函数如表2所示。

4.3 软件设计

使用了异步事件驱动函数库,程序设计简单而容易实现,程序主要由2部分组成,即主程序设计和回调函数程序设计,主程序只需做初始化和发送短信,其余功能都放在回调函数中完成。

在主程序中,各变量赋初值,调用cssl_open函数打开串口,设定的参数为采用串口1,即嵌入式Linux的ttyS0设备,波特率9600bps,8位数据位,1位停止位,无奇偶校验,无数据流控制,定义串口接收数据缓冲区有数据输入时,回调函数为callback函数,该函数对数据缓冲区中的数据进行分析处理。通过发送AT+CMGF=0指令定义短信模式为PDU模式,并判断是否有短信需要发送。对待发送的短信按照PDU发送字符串格式进行编码。

回调函数中首先读取输入缓冲区内容,根据对标志和缓冲区内容的判断,可以得知回调事件是由哪个事件引起,分别加以处理,由于每次向GSM模块发送AT指令后,模块会发送OK或ERROR等响应表示操作成功或失败,所以在回调函数中一个很重要的功能就是判断AT指令是否发送成功,为了区分不同AT指令的响应,程序中采用状态标志,表征系统发送AT指令的类型。在收到新短信后,需要提取短信发送方电话号码、短信发送时间和短信内容等相关信息,并加以存储,提取的依据就是短信接收PDU字符串的编码格式。为了避免由于短信满而无法接收新短信,需要将处理过的短信删除。相关的流程图如图2和图3所示。

图2 主程序流程图

图3 回调函数程序流程图

5. 结论

本文的创新之处在于提供了嵌入式Linux下GSM模块的短信收发系统设计方法,程序设计中利用串行接口驱动函数库libcssl,以串口I/O事件驱动设备的数据采集。短信收发采用PDU模式,能够处理中文、英文和中英文短信。异步事件驱动的架构可以提高系统并发处理性能,程序能够执行多个异步操作而不调用阻塞线程,降低系统开销。嵌入式系统加GSM模块的系统组成体积小巧,非常适合于偏远地区或移动的数据采集系统。根据系统的需要,还可以充分利用MC35模块的GPRS功能,实现高速的数据采集。

linux系统发送短信,Linux系统的短信收发怎么实现?相关推荐

  1. linux环境发送中文失败,linux - 无法从linux命令发送邮件 - SO中文参考 - www.soinside.com...

    我想从linux命令发送电子邮件.我安装在ubuntu ssmtp中,然后在/etc/ssmtp/ssmtp.conf中配置它:root=mymail@gmail.com mailhub=smtp.g ...

  2. Linux先发送条件变量,linux 条件变量 浅谈Linux条件变量的使用

    想了解浅谈Linux条件变量的使用的相关内容吗,在本文为您仔细讲解linux 条件变量的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:linux,条件变量,下面大家一起来学习吧. Linu ...

  3. linux 蓝牙发送文件夹,linux下通过蓝牙发送文件到手机上

    已经把bluez和openobex移植到开发板上,用以下命令能成功把文件发送到手机: [root@Real /]# usb 1-2.1: new full speed USB device using ...

  4. linux 命令发送udp包,linux – 如何创建UDP数据包?

    当我执行以下Netcat命令并使用Wireshark查看数据包时,它表示UDP数据包格式错误. $echo "this is a test" | nc -u 127.0.0.1 5 ...

  5. linux 内核 发送数据,使用Linux内核模块发送的UDP数据包不使用套...

    您不需要套接字就可以在内核中发送UDP数据包,只需分配一个skb,自己构造IP报头和UDP报头,最后通过dev_queue_xmit()将其发送出去. skb = alloc_skb(len, GFP ...

  6. linux串口发送数据程序,linux串口驱动分析——发送数据

    一.应用程序中write函数到底层驱动历程 和前文提到的一样,首先先注册串口,使用uart_register_driver函数,依次分别为tty_register_driver,cdev_init函数 ...

  7. linux系统发送短信,使用Linux发送短信

    使用Linux发送短信 发布时间:2007-06-14 22:16:03来源:红联作者:Assurance Linux发展到今天,很多功能已经可以在可视化的界面中来完成.不过在很多情况下,命令还是非常 ...

  8. arm linux sms,基于arm处理器的手机短消息加密系统 encryption system for sms based on arm.pdf...

    基于arm处理器的手机短消息加密系统 encryption system for sms based on arm 第 22卷 第 期 电子测量与仪器学报 Vol.22 No.2 2 4 - - 20 ...

  9. Linux Shell脚本专栏_Linux系统发送告警邮件脚本_02

    文章目录 一.Linux系统发送告警邮件脚本 1. 安装mailx工具 2. 编辑mailx配置文件 3. 追加以下内容 4. 发送邮件测试 二.异常汇总 2.1. 异常信息 2.2. 开启授权码 一 ...

  10. Android调用系统发送短信界面

    很多软件都有分享的功能,不少是支持短信分享的,其实就是调用系统发送短信的Activity.代码实现非常简单: /*** 发送短信* @param smsBody*/private void sendS ...

最新文章

  1. 高可用架构设计之无状态服务
  2. qt获取console输出_怎么在Centos 7 安装 Qt-4.8.6-MySQL 驱动?
  3. Perl学习笔记(十)--通过DBI访问数据库
  4. eclipse在网页进入时显示重定向过多_使用eclipse快速开发jsp以及编码问题、jsp页面元素、request对象学习的粗略记录...
  5. 关于分布式锁原理的一些学习与思考:redis分布式锁,zookeeper分布式锁
  6. Asp.net系列计划
  7. linux安装挂载samba,【Linux系列】Centos7安装Samba并将工作区挂载到win(八)
  8. WF4读书笔记(一):创建一个简单的工作流
  9. ssd网络详解之detection output layer
  10. php pcre回溯攻击,PHP利用PCRE回溯次数限制绕过某些安全限制
  11. 计算机犯罪率增长,我国的计算机年犯罪率的增长是()
  12. 【泰国留学】为什么“内卷”是必然,这就是原因
  13. 想设计亿万级高并发架构,你要先知道高并发是什么?(转载)
  14. 实验一:数据结构之顺序表例程 简易电话薄
  15. WCF医院管理系统技术解析(十)体检报告结果打印(水晶报表)
  16. SpringBoot中重试框架——Spring-retry与Guava-Retry
  17. 【图像分割】萤火虫算法图像聚类分割【含Matlab源码 2106期】
  18. [激光原理与应用-65]:激光器-器件 - 多模光纤(宽频光纤)、单模光纤的原理与区别
  19. 嵌入式工程师的日常是啥样的?就业现状如何?
  20. 董明珠用 3.1 亿的带货成绩,刷新了许多人对直播电商的认知

热门文章

  1. 免费剪辑音乐的软件都有哪些?音频剪辑方法分享?
  2. 音频剪辑软件分享,教你快速剪辑音频
  3. 技巧分享篇---如何从GitHub上下载某个项目中单个文件的方法
  4. 指针的类型(即指针本身的类型)和指针所指向的类型是两个概念
  5. 下载chromium for Android
  6. word添加多个目录
  7. AMD CPU 超频
  8. 揭秘大家都在用的报表——帆软报表,专为数据分析而生!
  9. python 获取项目根目录
  10. 工作,到底意味着什么