查看: 2838|回复: 1

麒麟座mini之四-WIFI驱动、OneNet、家庭温湿度

[复制链接]

该用户从未签到

发表于 2017-9-24 23:15:04 | 显示全部楼层 |阅读模式
分享到:
本帖最后由 zhouzpd 于 2017-9-25 21:31 编辑

麒麟座mini之四-WIFI驱动、OneNet、家庭温湿度
上期简单介绍了一下模块设计和分层。
这期实现一个功能,将温湿度采集并上传到OneNet
WIFI驱动
AT指令
AT指令是应用于终端设备与PC应用之间的连接与通信的指令。现在很多串口设备都采用了AT指令协议,如串口WIFI模块,串口GPRS模块等,但每家的AT指令又不尽相同,因此为了便于移植,将AT指令通信进行抽象分层。
AT通信驱动
AT指令通信分为通信结构和协议,当使用不同的WIFI模块,或新增指令时,只需修改对协议接口。
通信包括发送和接收处理,采用了状态机模式。
协议包括AT指令发送格式编码和接收数据解析。
  1. U16 WIFI_CmdTx(WIFICOM *pcom)
  2. {
  3.     WIFI *pwifi = &Wifi;
  4.     U16 txtotal = 0;
  5.    
  6.     switch(pcom->cmd)
  7.     {
  8.         case WIFICMD_CWJAP:
  9.             txtotal = sWIFI_CmdCWJAP(pcom->txBuf, pwifi->wifiSSID, pwifi->wifiKey);
  10.             break;
  11.         case WIFICMD_CIPSTART:
  12.             txtotal = sWIFI_CmdCIPSTART(pcom->txBuf, pwifi->IP, pwifi->port, pwifi->protocol);
  13.             break;
  14.         case WIFICMD_CIPSEND:
  15.             txtotal = sWIFI_CmdCIPSEND(pcom->txBuf, pwifi->ctxLength);
  16.             break;
  17.         case WIFICMD_SENDDATA:
  18.             txtotal = sWIFI_CmdSendData(pcom->txBuf, pwifi->ctx, pwifi->ctxLength);
  19.             break;
  20.         case WIFICMD_CIPCLOSE:
  21.             txtotal = sWIFI_CmdCIPCLOSE(pcom->txBuf);
  22.             break;
  23.     }

  24.     return txtotal;
  25. }

  26. WIFIRESP WIFI_CmdRx(WIFICOM *pcom)
  27. {
  28.     WIFIRESP resp = WIFIRESP_ERR;
  29.    
  30.     switch(pcom->cmd)
  31.     {
  32.         case WIFICMD_CIPSEND:
  33.             if(strstr(pcom->rxBuf, ">"))
  34.             {

  35.                 resp = WIFIRESP_CONT;
  36.                 pcom->cmd = WIFICMD_SENDDATA;
  37.             }
  38.             break;
  39.         case WIFICMD_SENDDATA:
  40.         default:
  41.             if(strstr(pcom->rxBuf, "OK"))
  42.             {
  43.                 resp = WIFIRESP_OK;
  44.             }
  45.             break;
  46.     }

  47.     return resp;
  48. }

  49. void WIFI_Tx(void)
  50. {
  51.     WIFICOM *pcom = &WifiCom;

  52.     switch(pcom->txStep)
  53.     {
  54.         case WIFI_TX_STEP_IDEL:
  55.             //if(pcom->rxStep == WIFI_RX_STEP_IDEL)
  56.             {
  57.                 if((pcom->txTotal = WIFI_CmdTx(pcom)) != 0)
  58.                 {
  59.                     pcom->txStep = WIFI_TX_STEP_START;
  60.                 }
  61.             }
  62.             break;
  63.         case WIFI_TX_STEP_START:
  64.             pcom->resp = WIFIRESP_NONE;
  65.             HDW_UartTxStart(UARTWIFI, pcom->txTotal);
  66.             pcom->txStep = WIFI_TX_STEP_TX;
  67.             break;
  68.         case WIFI_TX_STEP_TX:
  69.             if(HDW_UartTxIsFinish(UARTWIFI))
  70.             {
  71.                 pcom->txStep = WIFI_TX_STEP_FINISH;
  72.             }
  73.             break;
  74.         case WIFI_TX_STEP_FINISH:
  75.             if(pcom->resp != WIFIRESP_NONE)
  76.             {
  77.                 pcom->resp = WIFIRESP_NONE;
  78.                 pcom->txStep = WIFI_TX_STEP_IDEL;
  79.             }
  80.             break;
  81.         default:
  82.             pcom->txStep = WIFI_TX_STEP_IDEL;
  83.             break;
  84.     }
  85. }

  86. void WIFI_Rx(void)
  87. {
  88.     WIFICOM *pcom = &WifiCom;

  89.     switch(pcom->rxStep)
  90.     {
  91.         case WIFI_RX_STEP_IDEL:
  92.             HDW_UartRxStart(UARTWIFI);
  93.             pcom->rxStep = WIFI_RX_STEP_START;
  94.             break;
  95.         case WIFI_RX_STEP_START:
  96.             if(HDW_UartRxIsFinish(UARTWIFI))
  97.             {
  98.                 pcom->rxTotal = HDW_UartRxCnt(UARTWIFI);
  99.                 pcom->rxStep = WIFI_RX_STEP_FINISH;
  100.             }
  101.             break;
  102.         case WIFI_RX_STEP_FINISH:
  103.             pcom->resp = WIFI_CmdRx(pcom);
  104.             switch(pcom->resp)
  105.             {

  106.                 case WIFIRESP_CONT:
  107.                     break;
  108.                 default:
  109.                     pcom->cmd = WIFICMD_NONE;
  110.                     break;
  111.             }
  112.             pcom->rxStep = WIFI_RX_STEP_IDEL;
  113.             break;
  114.         default:
  115.             pcom->rxStep = WIFI_RX_STEP_IDEL;
  116.             break;
  117.     }
  118. }
复制代码
OnenetOneNet简介
OneNet上可建立设备,并生成设备对应ID,终端上通过网络向这个终端发送数据,数据就会记录在OneNet网络上了。
获得数据后可利用应用工具生成图表等,并且可以发布出来,十分方便。
看完这个视频就差不多清楚了:
http://www.iqiyi.com/w_19rstn04wt.html
设备
创建产品会得到APIKeymH06bbJVBxxx5htWfSha6nGDQbU=
创建设备会得到设备ID135xx150
在实例《4.ESP8266-HTTP_TYPE3-温湿度》中修改对应的宏定义就可以用了
#define DEVID     "135xx150"
#define APIKEY    "mH06bbJVBxxx5htWfSha6nGDQbU="
通信协议
OneNet支持多种通信协议,如HTTPMQTTEDP等,其实就是数据的解析方式。在创建设备时需要选择对应的通信协议。
家庭温湿度
利用麒麟座mini上的温湿度传感器,可实现一个建议的家庭温湿度计,并将数据传到网上。
数据采集
通过模拟I2C协议,读取温湿度SHT20数据,可以使用例程的模块,也可以自己写。
HTTP协议
通信协议采用HTTP协议,将数据封装到成个文本即可发送了,发送的实体如下
POST /devices/135xx150/datapoints?type=3HTTP/1.1
api-key:mH06bbJVBxxx5htWfSha6nGDQbU=
Host:api.heclouds.com
Content-Length:38
{"Temperature":31.16,"Humidity":72.00}
Content-Length:38其中的38市后续JSON数据的长度。类似的需要发送更多个数据时,继续添加即可。
通信
由于采用HTTP协议,因此当无数据发送时,隔一段时间会自动断开TCP连接,因此通信模型改为“连接-发送-断开”模式:
  1. BOL WORK_SendData(void)
  2. {
  3.     enum{
  4.     STEP_OPEN,
  5.     STEP_SEND,
  6.     STEP_CLOSE,
  7.     STEP_S_FINISH,
  8.     } static step;
  9.     BOL finish = FALSE;
  10.    
  11.     switch(step)
  12.     {

  13.         case STEP_OPEN:
  14.             if(WIFI_LinkServer("183.230.40.33", 80, 1))
  15.                 step = STEP_SEND;
  16.             break;
  17.         case STEP_SEND:
  18.             if(WIFI_Idel())
  19.             if(WIFI_SendData(WorkBufTx, WORK_FillBuf(WorkBufTx)))
  20.             {
  21.                 step = STEP_CLOSE;
  22.             }
  23.             break;
  24.         case STEP_CLOSE:
  25.             if(WIFI_DisconnServer())
  26.             {
  27.                 step = STEP_S_FINISH;
  28.             }
  29.             break;
  30.         case STEP_S_FINISH:
  31.             if(WIFI_Idel())
  32.             {
  33.                 finish = TRUE;
  34.                 step = STEP_OPEN;
  35.             }
  36.             break;
  37.     }

  38.     return finish;
  39. }
复制代码
结果
传到OneNet,并添加一个应用,如下图
https://open.iot.10086.cn/appview/p/8f59d388745c8789ccfe9209333d6a7

4.0.png


回复

使用道具 举报

  • TA的每日心情
    开心
    2020-6-22 21:16
  • 签到天数: 45 天

    连续签到: 2 天

    [LV.5]常住居民I

    发表于 2017-11-13 21:40:24 | 显示全部楼层
    good data for me
    回复 支持 反对

    使用道具 举报

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

    本版积分规则



    手机版|小黑屋|与非网

    GMT+8, 2024-4-24 10:40 , Processed in 0.117668 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.