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

[复制链接]
zhanghuichun 发表于 2015-3-2 16:01 | 显示全部楼层 |阅读模式
由于要讲详细点,所以要分开来讲,不便之处敬请原谅!
既然SIM908自带GSM功能,电话功能实现了,为何不加上短信功能呢,也许到时操作发短信有点复杂。

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


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

  1. while (1)
  2.         {
  3.                 GUI_Delay (20);
  4.                 if(FlagNewMessage)
  5.                 {
  6. //                        USART_printf(USART6,"%d\r\n",Messagenum);
  7.                         FlagNewMessage=0;
  8.                         if(SIM_ERR_NONE == Sim908_ReadMessage(Messagenum,1))
  9.                         {
  10.                                 USART_printf(USART6,"read cmd\r\n");
  11.                                 Messagebuff[Messagenum] = MESSAGE_CMD;
  12.                                
  13.                                 //I2C_EE_BufferWrite(Messagebuff, MESSAGE_FLASH_ADDR, sizeof(Messagebuff));
  14.                         }
  15.                         else
  16.                         {
  17.                                 USART_printf(USART6,"read notcmd\r\n");
  18.                                 Messagebuff[Messagenum] = MESSAGE_NOTCMD;
  19.                         }
  20.                         ee_WriteBytes(Messagebuff, 1,sizeof(Messagebuff));//保存短信属性
  21.                 }
  22. }
进入主函数后就开始进入Sim908_ReadMessage函数读取短信内容了

  1. u8 Sim908_ReadMessage(u8 addr, u8 mode)
  2. {
  3.         u8 res = SIM_ERR_OTHER;
  4.         u8 messageaddr[20];
  5.         u8 address[3];
  6.         u8 *p1 = NULL;
  7.         u8 *p2 = NULL;
  8. //        USART_printf(USART6,"addr=%d\r\n",addr);
  9. //        USART_printf(USART6,"mode=%d\r\n",mode);
  10.         if(addr > 50 || addr < 1)
  11.         {
  12.                 return 0;
  13.         }
  14.        
  15.         if(addr < 10)
  16.         {
  17.                 address[0] = addr + '0';
  18.                 address[1] = '\0';
  19.         }
  20.         else
  21.         {
  22.                 address[0] = addr/10 + '0';
  23.                 address[1] = addr%10 + '0';
  24.                 address[2] = '\0';
  25.         }
  26. //        USART_printf(USART6,"address=%s\r\n",address);

  27.                 Sim908_SendCmd("AT+CMGF=1", "OK", 50);
  28.                 Sim908_SendCmd("AT+CSCS="GSM"", "OK", 50);               
  29.                
  30.                 sprintf((char *)messageaddr, "AT+CMGR=%s", address);
  31.                
  32.                
  33.                 if(SIM_ERR_NONE == Sim908_SendCmd(messageaddr, "+CMGR:", 100))
  34.                 {
  35. //                        USART_printf(USART6, "\r\n %s \r\n",GSM_RX_BUFF);
  36.                         p1 = (u8 *)strstr((char *)GSM_RX_BUFF, ",");
  37.                         p2 = (u8 *)strstr((char *)(p1+2), """);
  38.                         p2[0] = '\0';        //添加结束符
  39.                        
  40.                         strcpy((char *)MES_STR.Phonenum, (char *)(p1+2));        //保存电话号码
  41. //                        USART_printf(USART6, "\r\n %s\r\n",MES_STR.Phonenum);
  42.                         p1 = (u8 *)strstr((char *)(p2+1), ":");
  43.                         p2 = (u8 *)strstr((char *)(p1), "+");
  44.                         p2[0] = '\0';
  45.                        
  46.                         strcpy((char *)MES_STR.Time, (char *)(p1-11));        //保存接收时间
  47. //                        USART_printf(USART6, "\r\n %s\r\n",MES_STR.Time);
  48.                         p1 = (u8 *)strstr((char *)(p2+1), "\r");
  49.                         p2 = (u8 *)strstr((char *)(p1+1), "\r");
  50.                         p2[0] = '\0';
  51.                        
  52.                         strcpy((char *)MES_STR.Message, (char *)(p1+2));
  53.                         USART_printf(USART6, "\r\n %s\r\n",MES_STR.Message);
  54.                         USART_printf(USART6, "\r\n judge message \r\n");
  55.                         if(SIM_ERR_NONE == Sim908_JudgeMessage( &MES_STR ))
  56.                         {                               
  57.                                 res = SIM_ERR_NONE;
  58.                         }
  59.                        
  60.                 }               
  61.        

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

  1. /*
  2.         函数名:Sim908_JudgeMessage
  3.         描述:        判断短信内容
  4.         输入:        u8 *message        保存短信内容的数组指针
  5.         输出:        无
  6. */
  7. u8 Sim908_JudgeMessage(Messagestr *mes_str)
  8. {
  9.         u8 res = SIM_ERR_OTHER;
  10.        
  11.         if(NULL != strstr((char *)mes_str->Message, "DW"))
  12.         {       
  13.                 USART_printf(USART6, "\r\n DW \r\n");
  14.                 Sim908_GPSSet(1);
  15.                 GPS_IT_FLAG =1;
  16.                 DW_FLAG=1;
  17.                 Sim908_SendMessage(ADMINISTRATORPHONE, "Please waitting....",1);
  18. /*                if(SIM_ERR_NONE == Sim908_GetGPSInformation(&GPS_STR, NULL))
  19.                 {
  20.                         Sim908_GPSConvert(GPS_STR.Latitude, GPS_STR.Longtude, LOCATION);
  21.                         Sim908_SendMessage(ADMINISTRATORPHONE, (char *)LOCATION, 1);
  22.                 }
  23.                 else
  24.                 {
  25.                         Sim908_SendMessage(ADMINISTRATORPHONE, "try again",1);
  26.                 }   */
  27.                 res = SIM_ERR_NONE;
  28.         }
  29.         else if(NULL != strstr((char *)mes_str->Message, "GMM"))
  30.         {
  31.                 u8 *p1 = NULL;
  32.                 USART_printf(USART6, "\r\n GMM \r\n");
  33.                 p1 = strstr((char *)mes_str->Phonenum, ADMINISTRATORPHONE);
  34.                 if(NULL == p1)
  35.                 {
  36.                         res = SIM_ERR_MESCMD;
  37.                         //USART_printf(USART1, "\r\n phonenum is %s \r\n", mes_str->Phonenum);
  38.                         //USART_printf(USART1, "\r\n ADMINISTRATORPHONE is %s \r\n", ADMINISTRATORPHONE);
  39.                         Sim908_SendMessage((char *)(mes_str->Phonenum), "you are not the administrator", 1);
  40.                 }
  41.                 else
  42.                 {
  43.                         char mm[30];
  44.                         u8 *p1 = NULL;
  45.                         u8 *p2 = NULL;
  46.                         p1 = strstr((char *)mes_str->Message, """);
  47.                         p2 = strstr((char *)(p1+1), """);
  48.                         p2[0] = 0;
  49.                        
  50.                         strcpy(PASSWORD, (char *)(p1+1));
  51.                         //USART_printf(USART1, "\r\n new PASSWORD is $%s$ \r\n", PASSWORD);
  52.                         //I2C_EE_BufferWrite(PASSWORD, PASSWORD_FLASH_ADDR, sizeof(PASSWORD));
  53.                 //        Flash_Write(PASSWORD_FLASH_ADDR, (u16 *)PASSWORD, sizeof(PASSWORD));
  54.                         sprintf(mm, "new password is %s", PASSWORD);
  55.                         Sim908_SendMessage((char *)ADMINISTRATORPHONE, mm, 1);
  56.                         res = SIM_ERR_NONE;
  57.                 }
  58.                
  59.         }
  60.         else if(NULL != strstr((char *)mes_str->Message, "MM"))
  61.         {
  62.                 u8 *p1 = NULL;
  63.                 u8 *p2 = NULL;
  64.                
  65.                 p1 = strstr((char *)mes_str->Message, """);
  66.                 p2 = strstr((char *)(p1+1), """);
  67.                 p2[0] = 0;
  68.                
  69.                 //USART_printf(USART1, "\r\n GLY \r\n");
  70.                 if(NULL != strstr(PASSWORD, p1+1))
  71.                 {                       
  72.                         //USART_printf(USART1, "\r\n password is right \r\n");
  73.                         strcpy(ADMINISTRATORPHONE, (char *)mes_str->Phonenum);
  74.                         //USART_printf(USART1, "\r\n copy phonenum \r\n");
  75.                         //I2C_EE_BufferWrite(ADMINISTRATORPHONE, PHONE_FLASH_ADDR, sizeof(ADMINISTRATORPHONE));
  76.                 //        Flash_Write(PHONE_FLASH_ADDR, (u16 *)ADMINISTRATORPHONE, sizeof(ADMINISTRATORPHONE));
  77.                         //USART_printf(USART1, "\r\n i2c write \r\n");
  78.                         Sim908_SendMessage(ADMINISTRATORPHONE, "new administrator has builded", 1);
  79.                        
  80.                         res = SIM_ERR_NONE;
  81.                 }
  82.                 else
  83.                 {
  84. //                        USART_printf(USART1, "\r\n password is error \r\n");
  85.                         Sim908_SendMessage((char *)(mes_str->Phonenum), "password ERROR", 1);
  86.                         res = SIM_ERR_MESCMD;
  87.                 }               
  88.         }
  89.         else if(NULL != strstr((char *)mes_str->Message, "GPRS"))
  90.         {
  91.                
  92.                 u8 *p1 = NULL;
  93.                 u8 *p2 = NULL;
  94.                 USART_printf(USART6, "\r\n GPRS \r\n");
  95.                 GPRSFLAG=1;
  96.                 GPS_IT_FLAG =1;
  97.                 Sim908_GPSSet(1);
  98.                 p1 = (u8 *)strstr((char *)mes_str->Message, "IP");
  99.                 if(NULL == p1)
  100.                 {
  101. //                        USART_printf(USART1, "\r\n IP eeror \r\n");
  102.                         res = SIM_ERR_MESCMD;
  103.                 }
  104.                 p2 = (u8 *)strstr((char *)mes_str->Message, "COM");
  105.                 if(NULL == p2)
  106.                 {
  107. //                        USART_printf(USART1, "\r\n COM eeror \r\n");
  108.                         res = SIM_ERR_MESCMD;
  109.                 }
  110.                 p1 = (u8 *)strstr((char *)mes_str->Message, """);
  111.                 p2 = (u8 *)strstr((char *)(p1+1), """);
  112.                 Sim908_CopyStr((u8 *)IPADDR, p1+1, p2);
  113.                
  114.                 p1 = (u8 *)strstr((char *)(p2+1), """);
  115.                 p2 = (u8 *)strstr((char *)(p1+1), """);
  116.                 Sim908_CopyStr((u8 *)COM, p1+1, p2);
  117.                
  118.                 Sim908_TCPClose();
  119.                 Sim908_TCPConnect((u8 *)IPADDR, (u8 *)COM);
  120.                
  121.                 res = SIM_ERR_NONE;
  122.         }
  123.         else if(NULL != strstr((char *)mes_str->Message, "CLOSE"))
  124.         {
  125.                         GPS_IT_FLAG=0;
  126.                         GPRSFLAG=0;
  127.                         Sim908_GPSSet(0);
  128.                         Sim908_TCPClose();
  129.                
  130.         }
  131.         return res;
  132. }
判断短信内容是否包含以上字符串 DW 、GMM 、MM 、GPRS 、CLOSE   

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

P50302-135205.jpg

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

P50302-135219.jpg

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

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



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 | 显示全部楼层
不错,赞
as564335sa 发表于 2015-3-2 21:16 | 显示全部楼层
zhanghuichun 发表于 2015-3-2 20:02
你是说一条短信太长自动发成多条短信?

YES
 楼主| zhanghuichun 发表于 2015-3-2 21:45 | 显示全部楼层

还么测试到这点,不过一条短信是限制大小,如果模块有自动变成多条,那程序上就不用进行处理,如果模块没有这个功能,我们也可以在程序上对短信进行处理将全部内容发送出去
as564335sa 发表于 2015-3-2 22:55 | 显示全部楼层
zhanghuichun 发表于 2015-3-2 21:45
还么测试到这点,不过一条短信是限制大小,如果模块有自动变成多条,那程序上就不用进行处理,如果模块没 ...

G网的短信是有规约的,长短信分条发对方终端可合并显示
wt.liu 发表于 2015-3-2 23:00 | 显示全部楼层
不错,可以操控GSM了。
小浣熊 发表于 2015-3-2 23:02 | 显示全部楼层
这个很厉害啊,一定有好的发展啊
dong_abc 发表于 2015-3-3 09:23 | 显示全部楼层
我同事 和 一朋友都做了这个。
 楼主| zhanghuichun 发表于 2015-3-3 10:58 | 显示全部楼层
as564335sa 发表于 2015-3-2 22:55
G网的短信是有规约的,长短信分条发对方终端可合并显示

恩恩  ,谢谢大神提醒,我在继续完善这个东西的时候我会测试这方面的:lol
as564335sa 发表于 2015-3-3 14:55 | 显示全部楼层
zhanghuichun 发表于 2015-3-3 10:58
恩恩  ,谢谢大神提醒,我在继续完善这个东西的时候我会测试这方面的 ...

:D我是小菜,只是最近刚好做了个短信透传的DTU的项目,不按规约加入超长短信的话,分条发送对方不能合并是小事,对方发来的长短信按照短信息解析是会乱码的,提示一下
LEDS 发表于 2015-3-23 11:31 | 显示全部楼层
太高级了,看不懂。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

101

帖子

9

粉丝
快速回复 在线客服 返回列表 返回顶部