本帖最后由 zhouzpd 于 2017-9-25 21:31 编辑
麒麟座mini之四-WIFI驱动、OneNet、家庭温湿度 上期简单介绍了一下模块设计和分层。 这期实现一个功能,将温湿度采集并上传到OneNet。 WIFI驱动
AT指令AT指令是应用于终端设备与PC应用之间的连接与通信的指令。现在很多串口设备都采用了AT指令协议,如串口WIFI模块,串口GPRS模块等,但每家的AT指令又不尽相同,因此为了便于移植,将AT指令通信进行抽象分层。 AT通信驱动将AT指令通信分为通信结构和协议,当使用不同的WIFI模块,或新增指令时,只需修改对协议接口。 通信包括发送和接收处理,采用了状态机模式。 协议包括AT指令发送格式编码和接收数据解析。- U16 WIFI_CmdTx(WIFICOM *pcom)
- {
- WIFI *pwifi = &Wifi;
- U16 txtotal = 0;
-
- switch(pcom->cmd)
- {
- case WIFICMD_CWJAP:
- txtotal = sWIFI_CmdCWJAP(pcom->txBuf, pwifi->wifiSSID, pwifi->wifiKey);
- break;
- case WIFICMD_CIPSTART:
- txtotal = sWIFI_CmdCIPSTART(pcom->txBuf, pwifi->IP, pwifi->port, pwifi->protocol);
- break;
- case WIFICMD_CIPSEND:
- txtotal = sWIFI_CmdCIPSEND(pcom->txBuf, pwifi->ctxLength);
- break;
- case WIFICMD_SENDDATA:
- txtotal = sWIFI_CmdSendData(pcom->txBuf, pwifi->ctx, pwifi->ctxLength);
- break;
- case WIFICMD_CIPCLOSE:
- txtotal = sWIFI_CmdCIPCLOSE(pcom->txBuf);
- break;
- }
- return txtotal;
- }
- WIFIRESP WIFI_CmdRx(WIFICOM *pcom)
- {
- WIFIRESP resp = WIFIRESP_ERR;
-
- switch(pcom->cmd)
- {
- case WIFICMD_CIPSEND:
- if(strstr(pcom->rxBuf, ">"))
- {
- resp = WIFIRESP_CONT;
- pcom->cmd = WIFICMD_SENDDATA;
- }
- break;
- case WIFICMD_SENDDATA:
- default:
- if(strstr(pcom->rxBuf, "OK"))
- {
- resp = WIFIRESP_OK;
- }
- break;
- }
- return resp;
- }
- void WIFI_Tx(void)
- {
- WIFICOM *pcom = &WifiCom;
- switch(pcom->txStep)
- {
- case WIFI_TX_STEP_IDEL:
- //if(pcom->rxStep == WIFI_RX_STEP_IDEL)
- {
- if((pcom->txTotal = WIFI_CmdTx(pcom)) != 0)
- {
- pcom->txStep = WIFI_TX_STEP_START;
- }
- }
- break;
- case WIFI_TX_STEP_START:
- pcom->resp = WIFIRESP_NONE;
- HDW_UartTxStart(UARTWIFI, pcom->txTotal);
- pcom->txStep = WIFI_TX_STEP_TX;
- break;
- case WIFI_TX_STEP_TX:
- if(HDW_UartTxIsFinish(UARTWIFI))
- {
- pcom->txStep = WIFI_TX_STEP_FINISH;
- }
- break;
- case WIFI_TX_STEP_FINISH:
- if(pcom->resp != WIFIRESP_NONE)
- {
- pcom->resp = WIFIRESP_NONE;
- pcom->txStep = WIFI_TX_STEP_IDEL;
- }
- break;
- default:
- pcom->txStep = WIFI_TX_STEP_IDEL;
- break;
- }
- }
- void WIFI_Rx(void)
- {
- WIFICOM *pcom = &WifiCom;
- switch(pcom->rxStep)
- {
- case WIFI_RX_STEP_IDEL:
- HDW_UartRxStart(UARTWIFI);
- pcom->rxStep = WIFI_RX_STEP_START;
- break;
- case WIFI_RX_STEP_START:
- if(HDW_UartRxIsFinish(UARTWIFI))
- {
- pcom->rxTotal = HDW_UartRxCnt(UARTWIFI);
- pcom->rxStep = WIFI_RX_STEP_FINISH;
- }
- break;
- case WIFI_RX_STEP_FINISH:
- pcom->resp = WIFI_CmdRx(pcom);
- switch(pcom->resp)
- {
- case WIFIRESP_CONT:
- break;
- default:
- pcom->cmd = WIFICMD_NONE;
- break;
- }
- pcom->rxStep = WIFI_RX_STEP_IDEL;
- break;
- default:
- pcom->rxStep = WIFI_RX_STEP_IDEL;
- break;
- }
- }
复制代码 OnenetOneNet简介OneNet上可建立设备,并生成设备对应ID,终端上通过网络向这个终端发送数据,数据就会记录在OneNet网络上了。 获得数据后可利用应用工具生成图表等,并且可以发布出来,十分方便。 看完这个视频就差不多清楚了: http://www.iqiyi.com/w_19rstn04wt.html 设备创建产品会得到APIKey:mH06bbJVBxxx5htWfSha6nGDQbU= 创建设备会得到设备ID: 135xx150, 在实例《4.ESP8266-HTTP_TYPE3-温湿度》中修改对应的宏定义就可以用了 #define DEVID "135xx150" #define APIKEY "mH06bbJVBxxx5htWfSha6nGDQbU=" 通信协议OneNet支持多种通信协议,如HTTP、MQTT、EDP等,其实就是数据的解析方式。在创建设备时需要选择对应的通信协议。 家庭温湿度利用麒麟座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连接,因此通信模型改为“连接-发送-断开”模式:- BOL WORK_SendData(void)
- {
- enum{
- STEP_OPEN,
- STEP_SEND,
- STEP_CLOSE,
- STEP_S_FINISH,
- } static step;
- BOL finish = FALSE;
-
- switch(step)
- {
- case STEP_OPEN:
- if(WIFI_LinkServer("183.230.40.33", 80, 1))
- step = STEP_SEND;
- break;
- case STEP_SEND:
- if(WIFI_Idel())
- if(WIFI_SendData(WorkBufTx, WORK_FillBuf(WorkBufTx)))
- {
- step = STEP_CLOSE;
- }
- break;
- case STEP_CLOSE:
- if(WIFI_DisconnServer())
- {
- step = STEP_S_FINISH;
- }
- break;
- case STEP_S_FINISH:
- if(WIFI_Idel())
- {
- finish = TRUE;
- step = STEP_OPEN;
- }
- break;
- }
- return finish;
- }
复制代码 结果传到OneNet,并添加一个应用,如下图 https://open.iot.10086.cn/appview/p/8f59d388745c8789ccfe9209333d6a7
|