概述 web
工具:物聯網雲平臺Yeelink DHT11溫溼度傳感器 W5500EVBapi
編譯環境:Keil4緩存
目的:經過以太網實時監控遠程某個位置的溫度和溼度網絡
在W5500EVB端鏈接LED燈。經過W5500與網絡鏈接。並與物聯網雲平臺Yeelink中加入設備創建鏈接;以後系統會將讀取的溫度和溼度上傳到物聯網雲平臺Yeelink。這樣就可以隨時經過網絡觀察溫度和溼度變化。 物聯網雲平臺Yeelink還提供了一個簡單的手機。登錄 Yeelink帳號,也可以隨時隨地的觀察溫度和溼度的變化。app
物聯網雲平臺Yeelink在以前發的帖子裏有簡單的介紹。官方站點也有具體的介紹。在此就再也不多講了。socket
假設有問題的可以回覆我。謝謝。函數
圖1是設備加入號之後本身主動生成的一個開關模型。點擊它可以控制LED燈的亮滅。工具
韓國WIZnet公司生產的以太網控制芯片W5500整合了五層結構中的前四層,即物理層、數據鏈路層、網絡層和傳輸層。並在內部利用硬件實現了TCP/IP協議棧。ui
開發人員無需專業的網絡知識,使用W5500如同控制外部存儲器同樣簡單。爲用戶提供了最簡單的網絡接入方法。
全硬件TCP/IP協議棧全然獨立於主控芯片,可以減小主芯片負載且無需移植繁瑣的TCP/IP協議棧。便於產品實現網絡化更新。
以太網控制芯片W5500具備下面特色:
一、W5500支持硬件TCP/IP協議,包含TCP、UDP、ICMP、IPv四、ARP、IGMP、PPPoE和以太網的PHY和MAC層,TCP/IP協議的硬件實現,使得應用協議的實現更簡單easy;
二、支持8個獨立的SOCKET同一時候工做,可同一時候工做在不一樣的工做模式;
三、支持掉電模式。並支持網絡喚醒,最大程度地下降功率消耗和發熱;
四、支持快速SPI接口(SPI MODE 0,3),SPI的時鐘最高可達到80MHz,極大地提升了網絡通訊的傳輸數據速率。
五、內部集成32KB存儲器用於發送/接收緩存;
六、內嵌10BaseT/100BaseTX以太網物理層(PHY)。
七、支持本身主動協商(10/100-Based全雙工/半雙工);
八、不支持IP分片;
九、工做電壓爲3.3V,但I/O信號口可承受5V電壓;
十、具備多功能LED指示輸出(全雙工/半雙工。網絡鏈接,網絡速度,活動狀態等);
十一、48引腳LQFP無鉛封裝(7x7mm, 0.5mm 間距)。
1. 電路設計
電路很是easy,在W5500EVB板上有STM32最小系統電路,所有引腳引出,咱們僅僅要在不論什麼一個未被佔用的port接入一個LED登就可以。
好多愛好者可能沒有這個板子,只是不要緊。淘寶上有好多W5500的模塊,經過SPI方式於大家本身的最小系統鏈接,再在程序中相應的引腳相應好,就可以方便控制
2. 程序分析
char postT[]={//提交溫度
「GET /v1.0/device/15804/sensor/27168/datapoints HTTP/1.1\r\n」
「Host:api.yeelink.net\r\n」
「Accept:*/*\r\n」
「U-ApiKey:fea57b9cc1ed5ad34d48430785b44e8f\r\n」
「Content-Length:12\r\n」
「Content-Type:application/x-www-form-urlencoded\r\n」
「Connection:close\r\n」
「\r\n」
「{\」value\」:x}\r\n」
};//xx用來填充數值
這當中。device/ID/sensor/ID 這兩處ID 已經在Yeelink站點上註冊獲得,一個是設備ID,一個是設備上的傳感器的ID,同一時候,一個設備可以有若干個傳感器。
U-ApiKey則是你的身份識別碼,相同是註冊後得到,僅僅有正確提交U-ApiKey才幹夠在Yeelink上面更新數據。Content-Length:後面的12。指的就是 {「value」:24} 的長度,更詳細的格式可以翻閱Yeelink的API文檔。
需要注意的是。在C語言中,雙引號 「」需要使用轉義字符。
在分析細節代碼以前,依照慣例咱們仍是先來看一下主函數。在這裏完畢了對W5500EVB的初始化。並在主循環裏面完畢了向Yeelink提交數據。
由於這個程序需要訪問Yeelink平臺,也就要求W5500EVB能訪問外網,所以這裏咱們要確保給W5500配置IP地址能訪問外網。
置W5500爲client模式的調用過程:W5500_Init()–>Socket_Init(s)–>Socket_Connect(s),設置過程即完畢,並與遠程server鏈接。鏈接後就可以發送數據,在這裏,數據發送完畢後。連接會被Yeelink斷開,下次發送需要又一次進行Socket_Init(s)–>Socket_Connect(s)的過程。
主程序第7行到第19行實現W5500EVB的初始化,初始化工做完畢以後,單片機就可以讀取數據和向Yeelink發送數據了。
W5500EVB做爲Yeelinkclient。在向Yeelink上傳數據時爲TCP鏈接。因此這裏依照TCP的狀態機模式敲代碼。
第25行。socket初始化以後,W5500EVB就向Yeelink發送鏈接請求,從而完畢了每分鐘向Yeelink提交一次開關狀態。
27到50行是創建鏈接後數據的讀取和燈光控制過程。第27行,socket鏈接創建創建完畢。首先把Sn_IR的第0位置1來清空中斷,而後向物聯網平臺提交報文/請求命令,發送成功之後再經過網絡讀Yeelink平臺開關的狀態並保存在Buffer中。讀到開關狀態之後就行輕鬆控制LED燈了。。
第42行是socket等待關閉狀態。這個狀態很是easy,由於這個狀態是一方斷開鏈接,還能夠繼續向server發送數據。因此就和socket創建鏈接狀態基本一樣了。
第53行,socket關閉狀態,打開socket並初始化TCP模式。
int main(void)
{
static uint8 i=0;
uint8 ch=SOCK_HUMTEM;
uint16 anyport=3000;
uint8 server_ip[4]={42,96,164,52};// api.yeelink.net 的ip地址
RCC_Configuration(); /* 配置單片機系統時鐘*/
GPIO_Configuration();/* 配置GPIO*/
NVIC_Configuration();/* 配置嵌套中斷向量*/
// Timer_Configuration();
Systick_Init(72);/* 初始化Systick工做時鐘*/
USART1_Init(); /*初始化串口通訊:115200@8-n-1*/
at24c16_init();/*初始化eeprom*/
// printf(「W5500 EVB initialization over.\r\n」);
Reset_W5500();/*硬從新啓動W5500*/
WIZ_SPI_Init();/*初始化SPI接口*/
// printf(「W5500 initialized!\r\n」);
set_default();
set_network();
while(1)
{
switch(getSn_SR(ch))
{
case SOCK_INIT:
connect(ch, server_ip ,80);
break;
case SOCK_ESTABLISHED:
//case SOCK_CLOSE_WAIT:
if(getSn_IR(ch) & Sn_IR_CON)
{
setSn_IR(ch, Sn_IR_CON);
}
memcpy(Buffer,post,strlen(post));
send(ch,(const uint8 *)Buffer,sizeof(Buffer));
memset(Buffer,0,sizeof(Buffer));
// printf(「%d:Socket Send OK\r\n」,ch);
recv(ch,Buffer,405);/*W5500接收來自Sever的數據*/
// printf(「%s\r\n」,Buffer);
Buffer[401]=Buffer[401]-48;
if(Buffer[401]==0)
{
LED3 =1;
printf(「LED OFF\r\n」);
}
else
{
LED3 =0;
printf(「LED ON\r\n」);
}
Delay_ms(200);
close(ch);
// disconnect(ch);
break;
case SOCK_CLOSE_WAIT:
printf(「Send to Yeelink:OK\r\n」);
break;
case SOCK_CLOSED:
socket(ch, Sn_MR_TCP,anyport++ , 0×00);
break;
default:
break;
}
}
}
4、測試效果
下面視屏是我本身實驗的效果,經過點擊開關可以看到LED燈的變化。也可以經過手機APP來控制,效果仍是可以的。
點擊開關發現開關顏色會發生變化,假設是綠色就是開。假設是灰色就是關。手機APP端控制button標有ON/OFF,可以一目瞭然。
5、注意事項
1.在申請帳號時要注意API KEY,加入設備時會生成一個URL請求,裏面提供了設備ID device,傳感器ID sensor。
2. 要理解Http方法:Get請求與Post請求的差異
Get是向server發送索取數據的一種請求。Get是獲取信息。而不是改動信息。而Post是向server提交數據的一種請求。Post請求則做爲http消息的實際內容發送給webserver,數據放置在HTML Header內提交,Post沒有限制提交的數據。
控制燈光是W5500做爲client向物聯網平臺獲取信息,獲取開關狀態來控制LED的亮與滅。因此選用GET請求。
3.把以前獲得的API KEY、設備ID、傳感器ID加入到程序中的請求報文中
4.好多人可能會發現。獲得的開關狀態不知道去哪了。也不知道怎樣獲得,我可以給你們提供一個比較簡單的方法。當咱們從物聯網平臺Yeelink端獲得狀態並保存在Buffer後,可以經過串口打印Buffer信息。
如圖2所看到的,{「timestamp」:」2014-11-21T17:39:24″,」value」:0}的value後就是開關狀態,而後經過打開的測試就可以的到詳細的開關狀態。
圖2 串口信息打印
5.在讀取數據的過程當中,每讀一次數據Socket就要關閉在開一次。但是測試發現在等待關閉的狀況讀取幾回之後就不能正常關閉,假設出現這樣的問題可以直接關閉Socket後再打開。
演示視頻:http://www.iwiznet.cn/blog/?
By Andy
不少其它交流:
WIZnet中文官方站點:http://www.iwiznet.cn
WIZnet企業微博:http://weibo.com/wiznet2012