打印
[STM32F4]

【Nucleo设计分享】基于stm32f411re的智能手表(短信功能)

[复制链接]
1747|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
由于要讲详细点,所以要分开来讲,不便之处敬请原谅!
既然SIM908自带GSM功能,电话功能实现了,为何不加上短信功能呢,也许到时操作发短信有点复杂。

短信这部分有点复杂,因为采用管理员管理模式,要在AT24C02中保存短信的数量,还要保存短信的性质,接着还要判断短信内容是命令还是非命令,发短信的界面也复杂,T9键盘的建立,字符的索引。。。。。。。一堆代码


接收到短信后,使能短信读取标志位,然后进入主函数

 while (1)
        {
                GUI_Delay (20);
                if(FlagNewMessage)
                {
//                        USART_printf(USART6,"%d\r\n",Messagenum);
                        FlagNewMessage=0;
                        if(SIM_ERR_NONE == Sim908_ReadMessage(Messagenum,1))
                        {
                                USART_printf(USART6,"read cmd\r\n");
                                Messagebuff[Messagenum] = MESSAGE_CMD;
                               
                                //I2C_EE_BufferWrite(Messagebuff, MESSAGE_FLASH_ADDR, sizeof(Messagebuff));
                        }
                        else
                        {
                                USART_printf(USART6,"read notcmd\r\n");
                                Messagebuff[Messagenum] = MESSAGE_NOTCMD;
                        }
                        ee_WriteBytes(Messagebuff, 1,sizeof(Messagebuff));//保存短信属性
                }
}
进入主函数后就开始进入Sim908_ReadMessage函数读取短信内容了

u8 Sim908_ReadMessage(u8 addr, u8 mode)
{
        u8 res = SIM_ERR_OTHER;
        u8 messageaddr[20];
        u8 address[3];
        u8 *p1 = NULL;
        u8 *p2 = NULL;
//        USART_printf(USART6,"addr=%d\r\n",addr);
//        USART_printf(USART6,"mode=%d\r\n",mode);
        if(addr > 50 || addr < 1)
        {
                return 0;
        }
       
        if(addr < 10)
        {
                address[0] = addr + '0';
                address[1] = '\0';
        }
        else
        {
                address[0] = addr/10 + '0';
                address[1] = addr%10 + '0';
                address[2] = '\0';
        }
//        USART_printf(USART6,"address=%s\r\n",address);

                Sim908_SendCmd("AT+CMGF=1", "OK", 50);
                Sim908_SendCmd("AT+CSCS=\"GSM\"", "OK", 50);               
               
                sprintf((char *)messageaddr, "AT+CMGR=%s", address);
               
               
                if(SIM_ERR_NONE == Sim908_SendCmd(messageaddr, "+CMGR:", 100))
                {
//                        USART_printf(USART6, "\r\n %s \r\n",GSM_RX_BUFF);
                        p1 = (u8 *)strstr((char *)GSM_RX_BUFF, ",");
                        p2 = (u8 *)strstr((char *)(p1+2), "\"");
                        p2[0] = '\0';        //添加结束符
                       
                        strcpy((char *)MES_STR.Phonenum, (char *)(p1+2));        //保存电话号码
//                        USART_printf(USART6, "\r\n %s\r\n",MES_STR.Phonenum);
                        p1 = (u8 *)strstr((char *)(p2+1), ":");
                        p2 = (u8 *)strstr((char *)(p1), "+");
                        p2[0] = '\0';
                       
                        strcpy((char *)MES_STR.Time, (char *)(p1-11));        //保存接收时间
//                        USART_printf(USART6, "\r\n %s\r\n",MES_STR.Time);
                        p1 = (u8 *)strstr((char *)(p2+1), "\r");
                        p2 = (u8 *)strstr((char *)(p1+1), "\r");
                        p2[0] = '\0';
                       
                        strcpy((char *)MES_STR.Message, (char *)(p1+2));
                        USART_printf(USART6, "\r\n %s\r\n",MES_STR.Message);
                        USART_printf(USART6, "\r\n judge message \r\n");
                        if(SIM_ERR_NONE == Sim908_JudgeMessage( &MES_STR ))
                        {                               
                                res = SIM_ERR_NONE;
                        }
                       
                }               
       

        return res;
}
保存了短信的发送电话、时间。就对短信内容进行判断了。

/*
        函数名:Sim908_JudgeMessage
        描述:        判断短信内容
        输入:        u8 *message        保存短信内容的数组指针
        输出:        无
*/
u8 Sim908_JudgeMessage(Messagestr *mes_str)
{
        u8 res = SIM_ERR_OTHER;
       
        if(NULL != strstr((char *)mes_str->Message, "DW"))
        {       
                USART_printf(USART6, "\r\n DW \r\n");
                Sim908_GPSSet(1);
                GPS_IT_FLAG =1;
                DW_FLAG=1;
                Sim908_SendMessage(ADMINISTRATORPHONE, "Please waitting....",1);
/*                if(SIM_ERR_NONE == Sim908_GetGPSInformation(&GPS_STR, NULL))
                {
                        Sim908_GPSConvert(GPS_STR.Latitude, GPS_STR.Longtude, LOCATION);
                        Sim908_SendMessage(ADMINISTRATORPHONE, (char *)LOCATION, 1);
                }
                else
                {
                        Sim908_SendMessage(ADMINISTRATORPHONE, "try again",1);
                }   */
                res = SIM_ERR_NONE;
        }
        else if(NULL != strstr((char *)mes_str->Message, "GMM"))
        {
                u8 *p1 = NULL;
                USART_printf(USART6, "\r\n GMM \r\n");
                p1 = strstr((char *)mes_str->Phonenum, ADMINISTRATORPHONE);
                if(NULL == p1)
                {
                        res = SIM_ERR_MESCMD;
                        //USART_printf(USART1, "\r\n phonenum is %s \r\n", mes_str->Phonenum);
                        //USART_printf(USART1, "\r\n ADMINISTRATORPHONE is %s \r\n", ADMINISTRATORPHONE);
                        Sim908_SendMessage((char *)(mes_str->Phonenum), "you are not the administrator", 1);
                }
                else
                {
                        char mm[30];
                        u8 *p1 = NULL;
                        u8 *p2 = NULL;
                        p1 = strstr((char *)mes_str->Message, "\"");
                        p2 = strstr((char *)(p1+1), "\"");
                        p2[0] = 0;
                       
                        strcpy(PASSWORD, (char *)(p1+1));
                        //USART_printf(USART1, "\r\n new PASSWORD is $%s$ \r\n", PASSWORD);
                        //I2C_EE_BufferWrite(PASSWORD, PASSWORD_FLASH_ADDR, sizeof(PASSWORD));
                //        Flash_Write(PASSWORD_FLASH_ADDR, (u16 *)PASSWORD, sizeof(PASSWORD));
                        sprintf(mm, "new password is %s", PASSWORD);
                        Sim908_SendMessage((char *)ADMINISTRATORPHONE, mm, 1);
                        res = SIM_ERR_NONE;
                }
               
        }
        else if(NULL != strstr((char *)mes_str->Message, "MM"))
        {
                u8 *p1 = NULL;
                u8 *p2 = NULL;
               
                p1 = strstr((char *)mes_str->Message, "\"");
                p2 = strstr((char *)(p1+1), "\"");
                p2[0] = 0;
               
                //USART_printf(USART1, "\r\n GLY \r\n");
                if(NULL != strstr(PASSWORD, p1+1))
                {                       
                        //USART_printf(USART1, "\r\n password is right \r\n");
                        strcpy(ADMINISTRATORPHONE, (char *)mes_str->Phonenum);
                        //USART_printf(USART1, "\r\n copy phonenum \r\n");
                        //I2C_EE_BufferWrite(ADMINISTRATORPHONE, PHONE_FLASH_ADDR, sizeof(ADMINISTRATORPHONE));
                //        Flash_Write(PHONE_FLASH_ADDR, (u16 *)ADMINISTRATORPHONE, sizeof(ADMINISTRATORPHONE));
                        //USART_printf(USART1, "\r\n i2c write \r\n");
                        Sim908_SendMessage(ADMINISTRATORPHONE, "new administrator has builded", 1);
                       
                        res = SIM_ERR_NONE;
                }
                else
                {
//                        USART_printf(USART1, "\r\n password is error \r\n");
                        Sim908_SendMessage((char *)(mes_str->Phonenum), "password ERROR", 1);
                        res = SIM_ERR_MESCMD;
                }               
        }
        else if(NULL != strstr((char *)mes_str->Message, "GPRS"))
        {
               
                u8 *p1 = NULL;
                u8 *p2 = NULL;
                USART_printf(USART6, "\r\n GPRS \r\n");
                GPRSFLAG=1;
                GPS_IT_FLAG =1;
                Sim908_GPSSet(1);
                p1 = (u8 *)strstr((char *)mes_str->Message, "IP");
                if(NULL == p1)
                {
//                        USART_printf(USART1, "\r\n IP eeror \r\n");
                        res = SIM_ERR_MESCMD;
                }
                p2 = (u8 *)strstr((char *)mes_str->Message, "COM");
                if(NULL == p2)
                {
//                        USART_printf(USART1, "\r\n COM eeror \r\n");
                        res = SIM_ERR_MESCMD;
                }
                p1 = (u8 *)strstr((char *)mes_str->Message, "\"");
                p2 = (u8 *)strstr((char *)(p1+1), "\"");
                Sim908_CopyStr((u8 *)IPADDR, p1+1, p2);
               
                p1 = (u8 *)strstr((char *)(p2+1), "\"");
                p2 = (u8 *)strstr((char *)(p1+1), "\"");
                Sim908_CopyStr((u8 *)COM, p1+1, p2);
               
                Sim908_TCPClose();
                Sim908_TCPConnect((u8 *)IPADDR, (u8 *)COM);
               
                res = SIM_ERR_NONE;
        }
        else if(NULL != strstr((char *)mes_str->Message, "CLOSE"))
        {
                        GPS_IT_FLAG=0;
                        GPRSFLAG=0;
                        Sim908_GPSSet(0);
                        Sim908_TCPClose();
               
        }
        return res;
}
判断短信内容是否包含以上字符串 DW 、GMM 、MM 、GPRS 、CLOSE   

DW为定位的指令、GMM为改密码、MM为新建管理员、GPRS为建立TCP连接,CLOSE为关闭(以上指令均为管理员号码发送的,其他号码发送无效)


短信界面为短信查看界面,点击屏幕下方的上下键即可对短信的切换,屏幕中央显示短信的信息(命令短信不显示,作为后台应用),点击左上方的按键即可新建短信。


此为发送短信主界面,数字键与字母键切换,字母大小写切换,信息发送成功后会弹出提示框,提示发送成功,否则提示发送失败。

-------------------------------------------------------------------------------温柔华丽的分割线----------------------------------------------------------



沙发
as564335sa| | 2015-3-2 16:23 | 只看该作者
NICE啊,有加入超长短信收发吗

使用特权

评论回复
板凳
zhanghuichun|  楼主 | 2015-3-2 20:02 | 只看该作者
as564335sa 发表于 2015-3-2 16:23
NICE啊,有加入超长短信收发吗

你是说一条短信太长自动发成多条短信?

使用特权

评论回复
地板
dirtwillfly| | 2015-3-2 20:24 | 只看该作者
不错,赞

使用特权

评论回复
5
as564335sa| | 2015-3-2 21:16 | 只看该作者
zhanghuichun 发表于 2015-3-2 20:02
你是说一条短信太长自动发成多条短信?

YES

使用特权

评论回复
6
zhanghuichun|  楼主 | 2015-3-2 21:45 | 只看该作者

还么测试到这点,不过一条短信是限制大小,如果模块有自动变成多条,那程序上就不用进行处理,如果模块没有这个功能,我们也可以在程序上对短信进行处理将全部内容发送出去

使用特权

评论回复
7
as564335sa| | 2015-3-2 22:55 | 只看该作者
zhanghuichun 发表于 2015-3-2 21:45
还么测试到这点,不过一条短信是限制大小,如果模块有自动变成多条,那程序上就不用进行处理,如果模块没 ...

G网的短信是有规约的,长短信分条发对方终端可合并显示

使用特权

评论回复
8
wt.liu| | 2015-3-2 23:00 | 只看该作者
不错,可以操控GSM了。

使用特权

评论回复
9
小浣熊| | 2015-3-2 23:02 | 只看该作者
这个很厉害啊,一定有好的发展啊

使用特权

评论回复
10
dong_abc| | 2015-3-3 09:23 | 只看该作者
我同事 和 一朋友都做了这个。

使用特权

评论回复
11
zhanghuichun|  楼主 | 2015-3-3 10:58 | 只看该作者
as564335sa 发表于 2015-3-2 22:55
G网的短信是有规约的,长短信分条发对方终端可合并显示

恩恩  ,谢谢大神提醒,我在继续完善这个东西的时候我会测试这方面的:lol

使用特权

评论回复
12
as564335sa| | 2015-3-3 14:55 | 只看该作者
zhanghuichun 发表于 2015-3-3 10:58
恩恩  ,谢谢大神提醒,我在继续完善这个东西的时候我会测试这方面的 ...

:D我是小菜,只是最近刚好做了个短信透传的DTU的项目,不按规约加入超长短信的话,分条发送对方不能合并是小事,对方发来的长短信按照短信息解析是会乱码的,提示一下

使用特权

评论回复
13
LEDS| | 2015-3-23 11:31 | 只看该作者
太高级了,看不懂。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

100

帖子

9

粉丝