4631|8

2144

帖子

3

TA的资源

五彩晶圆(中级)

楼主
 

【TI首届低功耗设计大赛】小结一下,今天比较闲 [复制链接]

恩,大赛基本都快要结束了,参赛帖子没法几篇,趁着要结束了发一篇小结的帖子,针对这个小东西,东拉西扯一下咯。


1)首先说说这个小东西吧,主要是负责测量空气PM2.5、测量温度/湿度,三个量所以后面就叫这个设备为空气质量检测吧,加了一个led模拟实际空气净化开关。

2)测量是主要功能,下面说说通信和人机交互吧,通信采用wifi连接到互联网并接入微信公众平台,最终通过手机等终端的微信来控制和查询设备的状态信息。

3)说说微信公众平台控制原理,首先公众微信平台的接口可以指定为一个80端口的公网服务器地址,微信仅仅支持80端口的接入吧,我这么理解的,微信之所以能火,也是因为他能直接融入web这是他的优势,web嘛当然是80端口了,如果这个web是个后台的服务的话也是没问题的,他会执行这个服务的一系列处理。

4)那么问题来了,我们需要一个服务器来搭建一个服务,并把这个服务器地址给我们申请的公众微信平台的接入口就好了,服务器嘛,免费的很多,比如redhat的openshift这个比较给力,推荐大家折腾,就是个虚拟的linux主机哦,想干啥都可以,太自由了。不过对于我这种没怎么搞过互联网的来说自己重新来还是有点困难的。所以我采用新浪的SAE平台,这玩意还是比较傻瓜的,只要稍微懂一点点,搭建一个应用太容易了。

5)所以我把我的代码部署在SAE平台上面,基本上就是设备需要接入这个服务器(创建了应用就会有个服务器地址)的地址进行交互了,定期的发送我设备采集的数据到这个服务器上面,高些数据库把数据存起来就好了。然后我们的代码呢,需要解析微信发送过来的字符串来匹配等逻辑处理,然后通过微信提供的api回发给微信就好了。

6)关于微信与设备的交互,这个过程也类似,比如控制空气净化开关(采用LED模拟),过程是这样的微信发送开关命令给服务器,服务器存储下来这个值,设备会定期的发送get命令获取这个值,然后更新自己的开关状态。

7)关于get命令的调试,建议采用工具先调试,服务器的公网ip地址可以通过ping SAE应用的域名来获取,看一下是否有返回,下面就是接收到的返回数据,需要提取状态值,这些设备端进行一些简单的string操作即可了。


8)关于CCS基于eclipse的东西,挺好的,基本上eclipse的某些功能都支持的,比如git的代码版本控制


9)在远程端的代码


10)关于一些相关的东西
a、自行实现的一套AT指令,用于查询/控制设备的信息
b、应用了FRAM的频繁写操作特性,实现数据/操作的本地日志模式
c、一键切换wifi配置/设备工作模式,支持设备在新的环境中快速配置wifi接入互联网操作

11)一些主要代码

调试过程

  1. GET报文

  2. GET /index.php?token=weixin&TEMPdata=30&HUMIdata=45&PM25data=234 HTTP/1.1
  3. Host: chipsensor1.sinaapp.com
  4. User-Agent: MSP430FR5969-LaunchPad
  5. Connection: close



  6. RECV报文

  7. HTTP/1.1 200 OK
  8. Server: nginx/1.4.4
  9. Date: Tue, 21 Oct 2014 08:48:23 GMT
  10. Content-Type: text/html
  11. Transfer-Encoding: chunked
  12. Connection: close
  13. X-Powered-By: PHP/5.3.27
  14. Via: 10.67.15.48
  15. Set-Cookie: saeut=101.69.240.98.1413881303666005; path=/; max-age=311040000

  16. 2
  17. 30
复制代码


AT指令核心代码

  1. /**
  2. * @brief  get_line
  3. * @note   读取命令行
  4. * @param  none
  5. * @retval none
  6. */
  7. char *
  8. get_line (char *line)
  9. {
  10.     int  pos;
  11.     char ch;
  12.    
  13.     pos = 0;
  14.     ch = (char)in_char();
  15.     while ( (ch != 0x0D ) && (ch != 0x0A ) && (pos < UIF_MAX_LINE))
  16.     {
  17.         switch (ch)
  18.         {
  19.             case 0x08:              /* Backspace */
  20.             case 0x7F:              /* Delete */
  21.             if (pos > 0)
  22.             {
  23.                 pos -= 1;
  24.                 out_char(0x08);     /* backspace */
  25.                 out_char(' ');
  26.                 out_char(0x08);     /* backspace */
  27.             }
  28.             break;
  29.             
  30.             default:
  31.             if ((pos+1) < UIF_MAX_LINE)
  32.             {
  33.                 if ((ch > 0x1f) && (ch < 0x80))
  34.                 {
  35.                     line[pos++] = (char)ch;
  36.                     out_char((char)ch);
  37.                 }
  38.             }
  39.             break;
  40.         }
  41.         ch = (char)in_char();
  42.     }
  43.     line[pos] = '\0';
  44.     out_char(0x0D);    /* CR */
  45.     out_char(0x0A);    /* LF */
  46.    
  47.     return line;
  48. }

  49. /**
  50. * @brief  make_argv
  51. * @note   ARGV执行
  52. * @param  none
  53. * @retval none
  54. */
  55. int
  56. make_argv (char *cmdline, char *argv[])
  57. {
  58.         char argvTAB;
  59.     int argc, i, in_text;
  60.    
  61.     /*
  62.      * Break cmdline into strings and argv
  63.      * It is permissible for argv to be NULL, in which case
  64.      * the purpose of this routine becomes to count args
  65.      */
  66.     i                 = 0;
  67.     argc         = 0;
  68.     in_text = FALSE;
  69.    
  70.     /* getline() must place 0x00 on end */
  71.     while (cmdline[i] != '\0') {
  72.             if (argc == 1) {
  73.                     argvTAB = '=';
  74.             } else {
  75.                     argvTAB = ',';
  76.             }
  77.         if ( (cmdline[i] == argvTAB) || (cmdline[i] == '\t') ) {
  78.             if (in_text) {
  79.                 /* end of command line argument */
  80.                 cmdline[i] = '\0';
  81.                 in_text = FALSE;
  82.             } else {
  83.                 /* still looking for next argument */
  84.                
  85.             }
  86.         } else {
  87.             /* got non-whitespace character */
  88.             if (in_text){

  89.             } else {
  90.                 /* start of an argument */
  91.                 in_text = TRUE;
  92.                 if (argc < UIF_MAX_ARGS) {
  93.                     if (argv != NULL) {
  94.                         argv[argc] = &cmdline[i];
  95.                     }
  96.                     argc++;
  97.                 } else {
  98.                     /*return argc;*/
  99.                     break;
  100.                 }
  101.             }
  102.             
  103.         }
  104.         /* proceed to next character */
  105.         i++;   
  106.     }
  107.     if (argv != NULL) {
  108.         argv[argc] = NULL;
  109.     }
  110.     return argc;
  111. }



  112. /**
  113. * @brief  run_cmd
  114. * @note   运行命令
  115. * @param  none
  116. * @retval none
  117. */
  118. void
  119. run_cmd (void)
  120. {
  121.     /*
  122.      * Global array of pointers to emulate C argc,argv interface
  123.      */
  124.     int argc;
  125.    
  126.     /* one extra for null terminator */
  127.     char *argv[UIF_MAX_ARGS + 1];  
  128.    

  129.     get_line(cmdline1);
  130.        
  131.     argc = make_argv(cmdline1,argv);
  132.    
  133.     if (!(argc))
  134.     {
  135.         /* no command entered, just a blank line */
  136.         strcpy(cmdline1, cmdline2);
  137.         argc = make_argv(cmdline1,argv);
  138.     }
  139.     cmdline2[0] = '\0';

  140.    
  141.     if (argc)
  142.     {
  143.         int i;
  144.         for (i = 0; i < UIF_NUM_CMD; i++)
  145.         {
  146.             if (strcasecmp(UIF_CMDTAB[i].cmd, argv[0]) == 0)
  147.             {
  148.                 if (((argc-1) >= UIF_CMDTAB[i].min_args) &&
  149.                     ((argc-1) <= UIF_CMDTAB[i].max_args))
  150.                 {
  151.                     if (UIF_CMDTAB[i].flags & UIF_CMD_FLAG_REPEAT)
  152.                     {
  153.                         strcpy(cmdline2, argv[0]);
  154.                     }
  155.                     UIF_CMDTAB[i].func(argc, argv);
  156.                     return;
  157.                 }
  158.                 else
  159.                 {
  160.                     printf(SYNTAX, argv[0]);
  161.                     return;
  162.                 }
  163.             }
  164.         }
  165.         printf(INVCMD, argv[0]);
  166.         printf(HELPMSG);
  167.         printf("\r\n");
  168.     }
  169. }





  170. /**
  171. * @brief  uif_cmd_help
  172. * @note   HELP命令
  173. * @param  none
  174. * @retval none
  175. */
  176. void
  177. uif_cmd_help (int argc, char **argv)
  178. {
  179.     int index;
  180.    
  181.     if (argc == 1)
  182.     {
  183.             printf("+ok\r\n\r\n");
  184.             for (index = 0; index < UIF_NUM_CMD; index++)
  185.             {
  186.                     printf(HELPFORMAT,
  187.                                     UIF_CMDTAB[index].cmd,
  188.                                     UIF_CMDTAB[index].description,
  189.                                     UIF_CMDTAB[index].cmd,
  190.                                     UIF_CMDTAB[index].syntax);
  191.             }
  192.             printf("\r\n");
  193.             return;
  194.     }

  195.     printf(INVOPT,argv[1]);
  196. }
复制代码


相关AT指令实现代码
  1. /**
  2. * @brief  uif_cmd_mode
  3. * @note   MODE命令
  4. * @param  none
  5. * @retval none
  6. */
  7. void
  8. uif_cmd_mode (int argc, char **argv)
  9. {
  10.     char runMode[10];
  11.     char runFreq[10];
  12.    
  13.     if (argc == 1) {
  14.             if (ledMode == 1){
  15.                     strcpy(runMode,"off");
  16.             } else if (ledMode == 2){
  17.                     strcpy(runMode,"on");
  18.             } else if (ledMode == 3){
  19.                     strcpy(runMode,"toggle");
  20.             } else {
  21.                     return;
  22.             }
  23.             _itoa(ledFreq, runFreq, 10);

  24.             printf("+ok=%s,%s\r\n\r\n", runMode, runFreq);
  25.         return;
  26.     }
  27.    
  28.     if (argc != 3) {
  29.         printf("Error: Invalid argument list\r\n");
  30.         printf("\r\n");
  31.         return;
  32.     }

  33.     if ( ((argc-1-1) >= UIF_CMDTAB[1].min_args) && ((argc-1-1) <= UIF_CMDTAB[1].max_args) ) {
  34.             if (argv[1] != NULL) {
  35.                      if (strcasecmp("off", argv[1]) == 0){
  36.                              ledMode = 1;
  37.                      } else if(strcasecmp("on", argv[1]) == 0){
  38.                              ledMode = 2;
  39.                      } else if(strcasecmp("toggle", argv[1]) == 0){
  40.                              ledMode = 3;
  41.                      } else {
  42.                              printf(INVOPT, argv[1]);
  43.                              printf("\r\n");
  44.                              return;
  45.                      }
  46.             }

  47.             if(argv[2] != NULL){
  48.                     ledFreq = _atoi((char*)argv[2], 10);
  49.                     if (ledFreq > 50) {
  50.                             ledFreq = 50;
  51.                             printf(INVOPT, argv[2]);
  52.                             printf("\r\n");
  53.                             return;
  54.                     }
  55.             }
  56.             printf("+ok\r\n\r\n");
  57.             return;
  58.     } else {
  59.             printf(INVARG, argv[0]);
  60.             printf("\r\n");
  61.             return;
  62.     }
  63. }


  64. /**
  65. * @brief  uif_cmd_mode
  66. * @note   MODE命令
  67. * @param  none
  68. * @retval none
  69. */
  70. void
  71. uif_cmd_rtcs (int argc, char **argv)
  72. {

  73.     if (argc == 1) {
  74.             getRTC();
  75.         return;
  76.     }

  77.     if (argc != 3) {
  78.         printf("Error: Invalid argument list\r\n");
  79.         printf("\r\n");
  80.         return;
  81.     }

  82.     if ( ((argc-1-1) >= UIF_CMDTAB[1].min_args) && ((argc-1-1) <= UIF_CMDTAB[1].max_args) ) {
  83.             if (argv[1] != NULL && argv[2] != NULL) {
  84.                     setRTC(argv[1], argv[2]);
  85.                     printf("Set rtc successful\r\n");
  86.             }

  87.             printf("+ok\r\n\r\n");
  88.             return;
  89.     } else {
  90.             printf(INVARG, argv[0]);
  91.             printf("\r\n");
  92.             return;
  93.     }
  94. }


  95. /**
  96. * @brief  uif_cmd_sens
  97. * @note   SENS命令
  98. * @param  none
  99. * @retval none
  100. */
  101. void
  102. uif_cmd_sens (int argc, char **argv)
  103. {
  104.         char temp[16],humi[16],pmtf[16];
  105.         memset(temp, 0x00, 16);
  106.         memset(humi, 0x00, 16);
  107.         memset(pmtf, 0x00, 16);

  108.     if (argc != 2) {
  109.         printf("Error: Invalid argument list\r\n");
  110.         printf("\r\n");
  111.         return;
  112.     }

  113.     if ( ((argc-1) >= UIF_CMDTAB[1].min_args) && ((argc-1) <= UIF_CMDTAB[1].max_args) ) {
  114.             if (argv[1] != NULL) {

  115.                     _itoa(dht11_humi(), humi, 10);
  116.                     _itoa(dht11_temp(), temp, 10);
  117.                     _itoa(dsm501a_pm2p5(), pmtf, 10);

  118.                     if (strcasecmp("temp", argv[1]) == 0){
  119.                             printf("temperature %s℃\r\n", temp);
  120.                     } else if(strcasecmp("humi", argv[1]) == 0){
  121.                             printf("humidity %s%\r\n", humi);
  122.                     } else if(strcasecmp("pm2.5", argv[1]) == 0){
  123.                             printf("dsm501ap %sPcs\r\n", pmtf);
  124.                     } else {
  125.                             printf(INVOPT, argv[1]);
  126.                             printf("\r\n");
  127.                             return;
  128.                     }
  129.             }

  130.             printf("+ok\r\n\r\n");
  131.             return;
  132.     } else {
  133.             printf(INVARG, argv[0]);
  134.             printf("\r\n");
  135.             return;
  136.     }
  137. }


  138. /**
  139. * @brief  uif_cmd_fram
  140. * @note   FRAM命令
  141. * @param  none
  142. * @retval none
  143. */
  144. void
  145. uif_cmd_fram (int argc, char **argv)
  146. {
  147.     if (argc != 2) {
  148.         printf("Error: Invalid argument list\r\n");
  149.         printf("\r\n");
  150.         return;
  151.     }

  152.     if ( ((argc-1) >= UIF_CMDTAB[1].min_args) && ((argc-1) <= UIF_CMDTAB[1].max_args) ) {
  153.             if (argv[1] != NULL) {

  154.                     if (strcasecmp("pm2.5", argv[1]) == 0){
  155.                             transmitFRAMData();
  156.                     }else if (strcasecmp("cls", argv[1]) == 0){
  157.                             clearFRAMData();
  158.                     } else {
  159.                             printf(INVOPT, argv[1]);
  160.                             printf("\r\n");
  161.                             return;
  162.                     }
  163.             }

  164.             printf("+ok\r\n\r\n");
  165.             return;
  166.     } else {
  167.             printf(INVARG, argv[0]);
  168.             printf("\r\n");
  169.             return;
  170.     }
  171. }
复制代码


传感器驱动部分代码,PM2.5的细节参考之前的帖子,有详细分析
  1. /**
  2. * @brief  Timer0_A0_ISR
  3. * @note   Timer0_A0中断
  4. * @param  none
  5. * @retval none
  6. */
  7. #pragma vector = TIMER0_A0_VECTOR
  8. __interrupt void Timer0_A0_ISR(void)
  9. {
  10.         uint32_t mode,freq;

  11.         mode = led_run_mode();
  12.         freq = led_run_freq();

  13.         if (mode == 1) {
  14.                 P1OUT &= ~BIT0;
  15.                 P1OUT |=  BIT5;
  16.         } else if (mode == 2) {
  17.                 P1OUT |=  BIT0;
  18.                 P1OUT &= ~BIT5;
  19.         } else if (mode == 3) {
  20.                 P1OUT ^= BIT0;
  21.                 P1OUT ^= BIT5;
  22.         }
  23.         TA0CCR0 = 32768/freq;
  24. }



  25. /**
  26. * @brief  Timer0_A0_ISR
  27. * @note   Timer0_A0中断
  28. * @param  none
  29. * @retval none
  30. */
  31. #pragma vector = TIMER0_A1_VECTOR
  32. __interrupt void Timer0_A1_ISR(void)
  33. {
  34.         switch(__even_in_range(TA0IV, TA0IV_TAIFG))
  35.         {
  36.         case TA0IV_NONE:
  37.                 break;                       // No interrupt

  38.         case TA0IV_TACCR1:
  39.         {
  40.                 WE_CHAT_SYNC_Cycle++;
  41.                 DSM501A_Measu_Cycle++;

  42.                 /* 一次DSM501测量结束,转换为百分比 ,
  43.                  * 低脉冲率:RT=LT/UTx100%
  44.                  */
  45.                 if (DSM501A_Measu_Cycle >= 30) {
  46.                         DSM501A_Measu_Cycle    = 0;
  47.                         DSM501A_PM2P5_VALUE    = DSM501A_LOW_PULSE_TIME/300.0;
  48.                         DSM501A_LOW_PULSE_TIME = 0;
  49.                         DSM501A_PM2P5_SENS     = (DSM501A_PM2P5_VALUE/2.0)*1000;

  50.                         /*
  51.                          * 存储PM25数据到FRAM-LOG区域
  52.                          * 注意超过FRAM-LOG规定地址区域的处理
  53.                          */
  54.                         FRAM_PM25_log_ptr  = (unsigned int*)(FRAM_PM25_LOG_START + *FRAM_index_ptr);
  55.                         *FRAM_PM25_log_ptr = (unsigned int)DSM501A_PM2P5_SENS;

  56.                 #if ENABLE_LOG_TIME_STAMP
  57.                         uint16_t ym,dh,ms;
  58.                         Calendar calendar;
  59.                         calendar = RTC_B_getCalendarTime(RTC_B_BASE);

  60.                         ym = ((uint16_t)((calendar.Year%100)&0x00FF)<<8) | calendar.Month;
  61.                         dh = ((uint16_t)(calendar.DayOfMonth&0x00FF)<<8) | calendar.Hours;
  62.                         ms = ((uint16_t)(calendar.Minutes&0x00FF)<<8) | calendar.Seconds;

  63.                         FRAM_PM25_stamp_ptr  = (unsigned int*)(FRAM_PM25_STAMP_START + (*FRAM_index_ptr)*6 + 0);
  64.                         *FRAM_PM25_stamp_ptr = (unsigned int)ym;

  65.                         FRAM_PM25_stamp_ptr  = (unsigned int*)(FRAM_PM25_STAMP_START + (*FRAM_index_ptr)*6 + 2);
  66.                         *FRAM_PM25_stamp_ptr = (unsigned int)dh;

  67.                         FRAM_PM25_stamp_ptr  = (unsigned int*)(FRAM_PM25_STAMP_START + (*FRAM_index_ptr)*6 + 4);
  68.                         *FRAM_PM25_stamp_ptr = (unsigned int)ms;
  69.                 #endif
  70.                         *FRAM_index_ptr += 2;
  71.                         if ( (*FRAM_index_ptr)/2 > FRAM_PM25_LOG_TOTAL/2 ) {
  72.                                 *FRAM_index_ptr = 0;
  73.                                 *FRAM_fulld_ptr = 0xF11F;
  74.                         }

  75.                         DHT_Read(DHT11_Measu_Data);
  76.                 }

  77.                 if (WE_CHAT_SYNC_Cycle >= 5) {
  78.                         WE_CHAT_SYNC_Cycle = 0;
  79.                         if(ENABLE_WIFI_CFG()==0){
  80.                                 sendSAE_GET_Head(dht11_temp(), dht11_humi(), led_run_mode(), dsm501a_pm2p5());
  81.                         }
  82.                 }

  83.         }break;

  84.         case TA0IV_TACCR2:
  85.                 DHT11_Measu_Cycle++;
  86.                 if (DHT11_Measu_Cycle >= 10) {
  87.                         DHT11_Measu_Cycle = 0;
  88.                         DHT_Read(DHT11_Measu_Data);
  89.                 }
  90.                 break;

  91.         case TA0IV_3:
  92.                 break;                       // reserved

  93.         case TA0IV_4:
  94.                 break;                       // reserved

  95.         case TA0IV_5:
  96.                 break;                       // reserved

  97.         case TA0IV_6:
  98.                 break;                       // reserved

  99.         case TA0IV_TAIFG:
  100.                 break;                            // overflow

  101.         default: break;
  102.         }
  103. }
复制代码
  1. /**
  2. * brief  DHT_Read
  3. * note   DHT读取温湿度
  4. * param  None
  5. * retval None
  6. */
  7. void DHT_Read(uint8_t *RHTdat)
  8. {
  9.         uint8_t timeOut;
  10.         uint8_t checkSum,U8CK_DATA;
  11.         uint8_t U8RH_DATH=0,U8RH_DATL=0;
  12.         uint8_t U8TH_DATH=0,U8TH_DATL=0;


  13.         /* 主机拉低DHT11 18ms */
  14.         DHT11_DAT_DIR |= DHT11_DAT_BIT;
  15.         DHT11_DAT_POUT &= ~DHT11_DAT_BIT;

  16.         /* 延时18ms左右 */
  17.         __delay_cycles(18000);

  18.         /* 主机拉高DHT11 */
  19.         DHT11_DAT_POUT |= DHT11_DAT_BIT;

  20.         /* 总线由上拉电阻拉高 主机延时20us */
  21.         __delay_cycles(20);

  22.         /* 主机设为输入 判断从机响应信号 */
  23.         DHT11_DAT_DIR &= ~DHT11_DAT_BIT;

  24.         /* 判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行 */
  25.         if ( !(DHT11_DAT_PIN&DHT11_DAT_BIT) ) {

  26.                 timeOut = 1;
  27.                 /* 判断从机发出 80us的低电平响应信号是否结束 */
  28.                 while( (!(DHT11_DAT_PIN&DHT11_DAT_BIT)) && timeOut++ );

  29.                 timeOut = 1;
  30.                 /* 判断从机是否发出 80us的高电平,如发出则进入数据接收状态 */
  31.                 while( (DHT11_DAT_PIN&DHT11_DAT_BIT) && timeOut++ );

  32.                 /* 数据接收 */
  33.                 U8RH_DATH = DHT_ReadByte();                    // 读取湿度数据高字节,即整数部分
  34.                 U8RH_DATL = DHT_ReadByte();                    // 读取湿度数据低字节,即小数部分,DHT11精度有限,小数为空
  35.                 U8TH_DATH = DHT_ReadByte();                  // 读取温度数据高字节,即整数部分
  36.                 U8TH_DATL = DHT_ReadByte();                 // 读取温度数据低字节,即小数部分,DHT11精度有限,小数为空
  37.                 U8CK_DATA = DHT_ReadByte();                    // 读取校验和字节

  38.                 /* 数据校验 */
  39.                 checkSum = (U8TH_DATH + U8TH_DATL + U8RH_DATH + U8RH_DATL);
  40.                 if (checkSum == U8CK_DATA) {
  41.                         RHTdat[0] = U8RH_DATH;                  // 存储湿度数据
  42.                         RHTdat[1] = U8TH_DATH;                   // 存储温度数据
  43.                 }
  44.         }
  45. }
复制代码



PHP服务器相关代码
  1.    
  2.     //传输文本
  3.     private function transmitText($object, $content)
  4.     {
  5.         $textTpl = "<xml>
  6.                     <ToUserName><![CDATA[%s]]></ToUserName>
  7.                     <FromUserName><![CDATA[%s]]></FromUserName>
  8.                     <CreateTime>%s</CreateTime>
  9.                     <MsgType><![CDATA[text]]></MsgType>
  10.                     <Content><![CDATA[%s]]></Content>
  11.                     <FuncFlag>0</FuncFlag>
  12.                     </xml>";
  13.         $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content);
  14.         return $result;
  15.     }

  16.     //传输NEWS
  17.     private function transmitNews($object, $newsArray)
  18.     {
  19.         if(!is_array($newsArray)){
  20.             return;
  21.         }
  22.         $itemTpl = "<item>
  23.                           <Title><![CDATA[%s]]></Title>
  24.                            <Description><![CDATA[%s]]></Description>
  25.                            <PicUrl><![CDATA[%s]]></PicUrl>
  26.                     <Url><![CDATA[%s]]></Url>
  27.                     </item>";
  28.         $item_str = "";
  29.         
  30.         foreach ($newsArray as $item){
  31.             $item_str .= sprintf($itemTpl, $item['Title'], $item['Description'], $item['PicUrl'], $item['Url']);
  32.         }
  33.         $newsTpl = "<xml>
  34.                     <ToUserName><![CDATA[%s]]></ToUserName>
  35.                     <FromUserName><![CDATA[%s]]></FromUserName>
  36.                     <CreateTime>%s</CreateTime>
  37.                     <MsgType><![CDATA[news]]></MsgType>
  38.                     <Content><![CDATA[]]></Content>
  39.                     <ArticleCount>%s</ArticleCount>
  40.                     <Articles>
  41.                     $item_str</Articles>
  42.                     </xml>";

  43.         $result = sprintf($newsTpl, $object->FromUserName, $object->ToUserName, time(), count($newsArray));
  44.         return $result;
  45.     }

  46.    
  47.     //接收事件
  48.     private function receiveEvent($object)
  49.     {
  50.         $content = "";
  51.         switch ($object->Event)
  52.         {
  53.             case "subscribe":
  54.             {
  55.                 $content = "欢迎关注Chip-Sensor\r\n输入<help>获取帮助";
  56.             }break;
  57.         }
  58.         
  59.         $result = $this->transmitText($object, $content);
  60.         return $result;
  61.     }

  62.     //接收文本   
  63.     private function receiveText($object)
  64.     {
  65.         $keyword         = trim($object->Content);
  66.         $url                 = "http://apix.sinaapp.com/weather/?appkey=".$object->ToUserName."&city=".urlencode($keyword);
  67.         $output         = file_get_contents($url);
  68.         $content         = json_decode($output, true);

  69.         $result         = $this->transmitNews($object, $content);
  70.         return $result;
  71.     }
复制代码

  1. else if($keyword == "switchoff" || $keyword == "关灯")
  2.             {
  3.                 $con = mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
  4.                 // 获取时间戳
  5.                         $dates = date("h:i:sa");
  6.                         mysql_select_db("app_chipsensor1", $con);
  7.                 // 修改开关状态值
  8.                         $sql ="UPDATE switch SET timestamp='$dates',value = '1' WHERE ID = '1'";
  9.                         if(!mysql_query($sql,$con)){
  10.                             die('Error: ' . mysql_error());
  11.                         }else{
  12.                         mysql_close($con);
  13.                         }        
  14.                                 // 返回给微信的信息
  15.                        $tips = "灯关闭!";
  16.                
  17.                 $resultStr = $resultStr = $this->transmitText($postObj, $tips);
  18.                 echo $resultStr;
  19.             }
  20.             
  21.             else if($keyword == "switchon" || $keyword == "开灯")
  22.             {
  23.                 $con = mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
  24.                 // 获取时间戳
  25.                         $dates = date("h:i:sa");
  26.                         mysql_select_db("app_chipsensor1", $con);
  27.                 // 修改开关状态值
  28.                         $sql ="UPDATE switch SET timestamp='$dates',value = '2' WHERE ID = '1'";
  29.                         if(!mysql_query($sql,$con)){
  30.                             die('Error: ' . mysql_error());
  31.                         }else{
  32.                         mysql_close($con);
  33.                         }        
  34.                                 // 返回给微信的信息
  35.                        $tips = "灯打开!";
  36.                
  37.                 $resultStr = $resultStr = $this->transmitText($postObj, $tips);
  38.                 echo $resultStr;
  39.             }
  40.             
  41.             else if($keyword == "switch" || $keyword == "SWITCH" || $keyword == "状态")
  42.             {
  43.                 // MySQL连接语句
  44.                 $con = mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
  45.                
  46.                 // 选择数据库进行连接
  47.                         mysql_select_db("app_chipsensor1", $con);
  48.                         $result = mysql_query("SELECT * FROM switch");
  49.                
  50.                         while($arr = mysql_fetch_array($result)){
  51.                                   if ($arr['ID'] == 1) {
  52.                         // 如果数据库连接正常读取value值
  53.                                   $tempr = $arr['value'];
  54.                                   }
  55.                         }
  56.                 // 关闭数据库连接
  57.                 mysql_close($con);
  58.                 if($tempr == 1){
  59.                     $tips="关闭";
  60.                 }else if($tempr == 2){
  61.                     $tips="打开";
  62.                 }
  63.            
  64.                 $resultStr = $resultStr = $this->transmitText($postObj, "当前灯状态:".$tips);
  65.                 echo $resultStr;
  66.             }
  67.             
复制代码


基本上这些内容我相信大家就能够自己diy一个类似的应用了,有问题欢迎大家一起交流。

最新回复

求联系,对微信通讯这方面比较感兴趣。  详情 回复 发表于 2016-6-5 22:59
 
点赞 关注
个人签名电工

回复
举报

2453

帖子

19

TA的资源

五彩晶圆(中级)

沙发
 
不错,质量挺高。慢慢看
 
个人签名    懒得很
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

板凳
 
附上我的公众微信号chipsensor,这几天在线欢迎大家玩弄他,没多少豆子了之前开过一段时间,豆子消耗有点大,主要是因为需要实时查询控制状态,如果仅是传感器值的话会好很多








 
个人签名电工
 
 

回复

1488

帖子

2

TA的资源

纯净的硅(中级)

4
 
楼主有时间搞个微信公众号与服务器接口的教程吧

点评

这个我也是现学的,现在都有点忘记了,回头看一下,是要写个东西记录一下了  详情 回复 发表于 2014-12-20 20:18
 
个人签名专业从事于在线监测振动、转速、轴振动、位移等,设备管理及故障检测振动诊断系统在线监测点巡检系统-现场动平衡仪-测振仪、便携式测振仪
 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

5
 
qq849682862 发表于 2014-12-20 16:10
楼主有时间搞个微信公众号与服务器接口的教程吧
这个我也是现学的,现在都有点忘记了,回头看一下,是要写个东西记录一下了
 
个人签名电工
 
 

回复

3471

帖子

11

TA的资源

五彩晶圆(高级)

6
 
感谢楼主的分享啊,虽然说“豆子消耗有点大”,但还能用一万多年呢

点评

呵呵,很久没开了,那个统计不准哦,平均到每个月的,这个月才开了两天。。  详情 回复 发表于 2014-12-22 09:44
 
 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

7
 
ienglgge 发表于 2014-12-20 20:22
感谢楼主的分享啊,虽然说“豆子消耗有点大”,但还能用一万多年呢
呵呵,很久没开了,那个统计不准哦,平均到每个月的,这个月才开了两天。。
 
个人签名电工
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

8
 
你好,楼主,有没有详解的教程呀,或者可以叫我吗?
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

9
 
求联系,对微信通讯这方面比较感兴趣。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表