在去年年初,就已经推出V1.0.0的GPRS库,不过在这个版本上只是实现了西文短信收发和字符串方式的GPRS数据通信,功能还相对不完善(参见我以前的博文《GPRS通信实现》)。最近升级的版本,对以上功能进行了大幅度的升级改进,比如支持PDU方式收发短信(支持中文)、彩信发送、二进制方式 GPRS数据收发、短信按类型提取、短信删除和短信事件通知等等功能。
考虑到功能比较多,我们分三篇文章来介绍最新的GPRS库的功能,这一篇我们先介绍和短信收发相关的内容。
库函数中和短信收发相关的方法如下:
(1)设置短消息中心地址
声明:int SetCenterNum (sring CenterNum)
参数:CenterNum– 短消息中心地址
返回:操作返回值
0 – 发送成功
-1 - 设置失败
说明:短消息中心地址。联通和移动不同地区,号码都不同,一般情况下,不需要专门设置
(2)发送短信(PDU方式)
声明:int SendMessage (sring phone,string msg)
参数:phone – 电话号码
msg – 要发送的字符串
返回:操作返回值
0 –发送成功
-1 –字符长度为0或大于70个字节
-2 –设置短消息格式失败
- 3 –发送短信失败
说明:发送短信。支持中文字符发送。
(3)读取短信
声明:int ReceiveMessage(out GsmMessage[] msgs,MessageType msgType)
参数:
msgs – 信息集合,每一项都包括,短信发送的电话,发送时间和内容
msgType – 消息类型:未读消息,已读消息,未发消息,已发消息,全部消息
返回:返回指定类型的短信字符串集合。
说明:接收短信。目前支持中英文短信接收。
(4)删除短信
声明:int DeleteMessage ()
参数:无
返回:操作返回值
0 – 删除0个消息
-1 – 设置PDU模式失败
>0 – 删除的短消息个数
说明:删除全部的短消息。
除了方法外,还有一个短信收到事件,具体声明如下:
(1)短信收到通知
声明:SMSMessageReceivedEventHandler MessageReceived
参数:object sender – GPRS类的实例
说明:短信接收通知
为了便于说明库的使用,我们设定一个场景,来进行相关代码的功能演示。
场景是这样设定的:
(1)、程序不断采集温湿度数据,一旦超出预先设置好的范围,就会短信通知报警。
(2)、手机发送短信,控制继电器,可以远程打开和关闭加湿器。
具体代码如下(其中温湿度采集部分,详情请参见:通过AD采集获取温湿度):
(1)、GPRS模块初始化相关代码
int ret = 0;
gprs = new GPRS("COM3", 115200, GPRS.GprsType.SIM300_V6_x);
//打开GPRS模块
if ((ret = gprs.Open()) != 0)
{
Debug.Print("Open Failed:" + ret.ToString());
gprs.Close();
screen.DrawText("打开GPRS模块失败", font, Colors.Red, 20, 60);
screen.Flush();
return;
}
Debug.Print("Open OK");
screen.DrawText("打开GPRS模块成功", font, Colors.Green, 20, 60);
screen.Flush();
//判断是否在线,超时时间10s
if ((ret = gprs.IsOnline(10000)) != 0)
{
Debug.Print("AT Failed:" + ret.ToString());
gprs.Close();
screen.DrawText("GPRS模块不在线", font, Colors.Red, 20, 100);
screen.Flush();
return;
}
Debug.Print("AT OK");
screen.DrawText("GPRS模块在线", font, Colors.Green, 20, 100);
screen.Flush();
//GPRS模块初始化
if ((ret = gprs.Initialize()) != 0)
{
Debug.Print("Initialize Failed:" + ret.ToString());
gprs.Close();
return;
}
Debug.Print("Initialize OK");
screen.DrawText("GPRS初始化成功", font, Colors.Green, 20, 140);
screen.Flush();
//显示信号强度
//Debug.Print("Signal:" + gprs.Signal.ToString());
gprs.MessageReceived += new SMSMessageReceivedEventHandler(gprs_MessageReceived);
(2)、GPRS模块短信接收并控制部分
static void gprs_MessageReceived(object sender)
{
int ret = 0;
GsmMessage[] msgs = null;
//读未读的短消息
if ((ret = gprs.ReceiveMessage(out msgs, GPRS.MessageType.REC_UnRead)) < 0)
{
Debug.Print("ReceiveMessage Failed:" + ret.ToString());
}
else
{
if (ret > 0)
{
foreach (GsmMessage msg in msgs)
{
Debug.Print(msg.ToString());
}
//gprs.SendMessage(msgs[0].phone, msgs[0].ToString());
switch (msgs[0].message)
{
case "开":
opSwitch.Write(true);
State = true;
break;
case "关":
opSwitch.Write(false);
State = false;
break;
}
}
}
//删除短消息
//gprs.DeleteMessage();
}
(3)湿度报警相关代码
//湿度报警
if (H > 60 && !AlarmFlag)
{
//发送报警短信(实际应用时,请填入实际的电话号)
gprs.SendMessage("158XXXXXXX", "当前湿度:" + H.ToString("F2"));
AlarmFlag = true;
}
if (AlarmFlag && H < 50)
{
AlarmFlag = false;
}
实际运行效果图:
说明:硬件平台采用最新的紫藤207系统;GPRS模块采用Sim300 V6.02版本的模块;继电器模块采用5V驱动,可控制220V 10A的电器,一般家用小功率电器可以直接使用;温湿度模块采用了相对低价的AD接口的模块。
下一篇博文,将介绍GPRS模块是如何发送彩信的,敬请期待。
本文源码:http://www.sky-walker.com.cn/MFRelease/Sample/YF_GPSR01.rar
类库下载:http://www.sky-walker.com.cn/MFRelease/library/v42/YFSoft.Hardware.GPRS.rar