微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 与8266通讯,连接中国移动OneNet(程序移植)

与8266通讯,连接中国移动OneNet(程序移植)

时间:10-02 整理:3721RD 点击:

OneNet开发板使用的是8266的wifi模块进行网络通讯的。而8266模块使用的是串口方式进行AT指令的设置与通讯的,所以这里只要移植好串口的低层通讯,其他的使用源有的通讯程序与协议就可以了。

转接板上连接的是串口5.




官方提供的是STM32的开发例程,这要移植起来也很方便。为了更快的移植,一些函数名与变量名保留为原名,没有再更改。也就是你看到的uart2并不是使用串口2进行的,还要看文件描述符fd。 其中EDP的协议文件基本上是不需要更改的,只要添加到Makefile中就可以了。




主要更改的是esp8266.c与esp8266.h两个文件。其中esp8266.h产要更改APIID与设备ID与wifi参数。如下图中。




DEVICEID与设备有关的,在上篇中已经提到。APIKEY是与产品有关的,在产品概要界面可以查到。CWJAP是wifi的名字与密码。CIPSTART是OneNet的服务器IP地址与端口号。只有前三项要更改,其他的可以不更改。 对于esp8266.c的修改就比较多了,与硬件有关。8266模块需要一个复位引脚与串口。复位引脚在转接板上连接的是通过修改设备树dts文件,将这个引脚设备为GPIO功能。 ESP8266初始化函数。

  1. void ESP8266_Init(int fd)
  2. {
  3.                 ESP8266_Rst();
  4.        
  5.                 printf("%s\r\n","[ESP8266_Init]ENTER AT.");
  6.                 SendCmd(AT,"OK",1000,fd);                        
  7.                 printf("%s\r\n","[ESP8266_Init]EXIT AT.");
  8.                
  9.                 printf("%s\r\n","[ESP8266_Init]ENTER CWMODE.");
  10.                 SendCmd(CWMODE,"OK",1000,fd);               
  11.                 printf("%s\r\n","[ESP8266_Init]EXIT CWMODE.");
  12.        
  13.                 printf("%s\r\n","[ESP8266_Init]ENTER RST.");
  14.                 SendCmd(RST,"OK",2000,fd);       
  15.                 printf("%s\r\n","[ESP8266_Init]EXIT RST.");
  16.        
  17.                 printf("%s\r\n","[ESP8266_Init]ENTER CIFSR.");
  18.                 SendCmd(CIFSR,"OK",1000,fd);       
  19.                 printf("%s\r\n","[ESP8266_Init]EXIT CIFSR.");
  20.        
  21.                 printf("%s\r\n","[ESP8266_Init]ENTER CWJAP.");
  22.                 SendCmd(CWJAP,"OK",2200,fd);       
  23.                 printf("%s\r\n","[ESP8266_Init]EXIT CWJAP.");

  24.                 printf("%s\r\n","[ESP8266_Init]ENTER CIPSTART.");
  25.                 SendCmd(CIPSTART,"OK",3000,fd);
  26.                 printf("%s\r\n","[ESP8266_Init]EXIT CIPSART.");
  27.                
  28.                 printf("%s\r\n","[ESP8266_Init]ENTER CIPMODE.");
  29.                 SendCmd(CIPMODE,"OK",1000,fd);
  30.                 printf("%s\r\n","[ESP8266_Init]EXIT CIPMODE.");
  31. }

复制代码


其中SendCmd函数源码,也是通过串口发送数据,再检查出到的数据状态是否是“OK”

  1. void SendCmd(char* cmd, char* result, int timeOut,int fd)
  2. {
  3.     while(1)
  4.     {
  5.         memset(usart2_rcv_buf,0,sizeof(usart2_rcv_buf));
  6.                 usart2_rcv_len=0;
  7.         usart2_write((unsigned char *)cmd, strlen((const char *)cmd),fd);
  8.         mdelay(timeOut);
  9.         read(fd, usart2_rcv_buf, 0x02);
  10.         if((NULL != strstr((const char *)usart2_rcv_buf, result)))        //判断结果
  11.         {
  12.             break;
  13.         }
  14.         else
  15.         {
  16.             mdelay(100);
  17.         }
  18.     }
  19. }

复制代码


usart2_write函数更改为linux下的串口发送函数,这里使用write函数进行发送。


  1. void usart2_write(char *Data,unsigned int len,int fd)
  2. {
  3.    write(fd, Data, len);
  4. }

复制代码


与OneNet建立连接函数。

  1. void ESP8266_DevLink(const char* devid, const char* auth_key, int timeOut,int fd)
  2. {
  3.                 int count=0;
  4.        
  5.                 memset(usart2_rcv_buf,0,strlen((const char *)usart2_rcv_buf));
  6.                 usart2_rcv_len=0;                       
  7.                
  8.                 printf("%s\r\n","[ESP8266_DevLink]ENTER device link...");
  9.                 usart2_write(CIPSEND,strlen(CIPSEND),fd);  //向ESP8266发送数据透传指令
  10.                 for(count=0;count ")))
  11.                                 {
  12.                                                 break;
  13.                                 }
  14.                 }       

  15.                 send_pkg = PacketConnect1(devid,auth_key);
  16.                 mdelay(200);
  17.                 usart2_write(send_pkg->_data,send_pkg->_write_pos,fd);  //发送设备连接请求数据
  18.                 mdelay(500);
  19.                 DeleteBuffer(&send_pkg);
  20.                 mdelay(200);
  21.                 usart2_write("+++",3,fd);  //向ESP8266发送+++结束透传,ESP8266返回指令模式
  22.                 mdelay(50);
  23.                 printf("%s\r\n","[ESP8266_DevLink]EXIT device link...");
  24. }

复制代码


如下函数生成发送数据,可以看到其中的use_status与Electricity都是我们在OneNet中建的数据流的名称。

  1. void GetSendBuf(void)
  2. {
  3.                 char text[25] = {0};
  4.                        
  5.                 Check_Data();

  6.                 memset(send_buf,0,MAX_SEND_BUF_LEN);
  7.                
  8.                 strcat(send_buf, ",;");       
  9.                 strcat(send_buf, "use_status,");
  10.                 sprintf(text,"%d",use_status);
  11.                 strcat(send_buf, text);
  12.                 strcat(send_buf, ";");
  13.                
  14.                 strcat(send_buf, "Electricity,");
  15.                 sprintf(text,"%d",electricity);
  16.                 strcat(send_buf, text);
  17.                 strcat(send_buf, ";");
  18.        
  19. }

复制代码


数据发送。

  1. void ESP8266_SendDat(int fd)
  2. {               
  3.                 int count=0;

  4.                 memset(usart2_rcv_buf,0,sizeof(usart2_rcv_buf));
  5.                 usart2_rcv_len=0;                       
  6.                 printf("%s\r\n","[ESP8266_SendDat]ENTER Senddata...");
  7.                 usart2_write(CIPSEND,strlen(CIPSEND),fd);  //向ESP8266发送数据透传指令
  8.                 for(count=0;count ")))
  9.                                 {
  10.                                                 break;
  11.                                 }
  12.                 }       
  13.        
  14.                 GetSendBuf();               
  15.                 send_pkg = PacketSavedataSimpleString(DEVICEID,send_buf);   
  16.                 usart2_write(send_pkg->_data,send_pkg->_write_pos,fd);        //向平台上传数据点
  17.                 DeleteBuffer(&send_pkg);
  18.                 mdelay(500);

  19.                 usart2_write("+++",3,fd);  //向ESP8266发送+++结束透传,使ESP8266返回指令模式
  20.                 mdelay(200);
  21.                 printf("%s\r\n","[ESP8266_SendDat]EXIT Senddata...");
  22. }

复制代码


主要的功能函数就是上面的几个,其他的函数都是比较简单的,这里不再赘述,可以参考OneNet的例程进行更改。

基本功能已经可以实现了。

例如,下面是设备的使用状态在OneNet上的显示。刷卡后为使用中,再刷卡为未使用。使用中为1,未使用为0。




大神能教教我吗

我想通过esp8266把单片机的数据传到onenet上  该怎么弄啊

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top