|
隨著(zhù)物聯(lián)網(wǎng)逐漸進(jìn)入我們的生活,我們需要隨時(shí)隨地查看遠端的設備運行狀態(tài)及對設備進(jìn)行控制,Yeelink為我們提供了一
個(gè)很好的云端服務(wù)器平臺,設備通過(guò)網(wǎng)絡(luò )連接到Yeelink服務(wù)器,上傳本地檢測數據,電腦或手機通過(guò)手機訪(fǎng)問(wèn)即可看到設備數據,
網(wǎng)上也有很多朋友使用Yeelink來(lái)做遠程監控的示例,下面我們來(lái)介紹如何使用Yeelink做遠程檢測與控制,如有錯誤還請大家指正。
下面是Yeelink遠程監控的一個(gè)大致框圖
![]()
1、首先進(jìn)入Yeelink主頁(yè)注冊一個(gè)自己的帳號,下面是主頁(yè)為我們開(kāi)發(fā)者提供的一個(gè)簡(jiǎn)單的開(kāi)發(fā)流程
![]()
2、按照上面的流程點(diǎn)擊添加設備,輸入設備信息,在下面的地圖中選擇設備所在地
![]()
3、進(jìn)入到設備管理界面,設置設備圖片,添加傳感器
![]()
4、添加傳感器,這里我們添加一個(gè)數值型傳感器和一個(gè)開(kāi)關(guān)型傳感器,通過(guò)下面選擇設置傳感器信息
![]()
5、傳感器添加完成之后寶馬1768設備下面出現兩個(gè)傳感器:AD轉換值和LED1,AD轉換值屬于數值型傳感器,顯示AD轉換電壓,
LED1屬于開(kāi)關(guān)型傳感器,用于控制寶馬開(kāi)發(fā)板LED燈亮滅,注意下面標記出來(lái)的地方藍色框框第一個(gè)是設備ID即寶馬1768的ID,第
二個(gè)為傳感器ID即對應AD轉換值和LED1各自的ID,由于兩個(gè)傳感器同屬于寶馬1768設備下面的兩個(gè)傳感器所以設備ID相同,而傳感
器ID不同,這幾個(gè)ID會(huì )在后面編程中使用到
![]()
6、進(jìn)入我的賬戶(hù)找到API KEY,當要進(jìn)行傳輸數據時(shí)需要使用到該密碼
![]()
7、上面Yeelink的設置基本完成了,就要開(kāi)始進(jìn)行程序編寫(xiě)了,這里我們直接使用寶馬開(kāi)發(fā)板搭建好的TCP客戶(hù)端例程進(jìn)行添加修改,
在系統配置完成之后初始化ADC和LED
- ADC_Init(); // ADC初始化
- LPC_GPIO2->FIODIR = 0x000000ff; // LED配置
- LPC_GPIO0->FIODIR = 0x00200000;
- LPC_GPIO0->FIOPIN |= 0x00200000;
- while(1)
- {
- tcpclient("42.96.164.52",80 ,1); //AD轉換值上傳
- tcpclient("42.96.164.52",80 ,2); //獲取LED狀態(tài)并改變開(kāi)發(fā)板LED狀態(tài)
- rt_thread_delay(RT_TICK_PER_SECOND * 4); //延時(shí)4s
- }
- //TCP客戶(hù)端實(shí)驗
- int tcpclient(const char* url, int port,int num)
- {
- char *recv_data;
- struct hostent *host;
- int sock, bytes_received;
- struct sockaddr_in server_addr;
- int Buf = 0;
- /* 通過(guò)函數入口參數url獲得host地址(如果是域名,會(huì )做域名解析) */
- host = gethostbyname(url);
- /* 分配用于存放接收數據的緩沖 */
- recv_data = rt_malloc(BUFSZ);
- if (recv_data == RT_NULL)
- {
- rt_kprintf("No memory\n");
- return;
- }
- /* 創(chuàng )建一個(gè)socket,類(lèi)型是SOCKET_STREAM,TCP類(lèi)型 */
- if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
- {
- /* 創(chuàng )建socket失敗 */
- rt_kprintf("Socket error\n");
- /* 釋放接收緩沖 */
- rt_free(recv_data);
- return 1;
- }
- if(num == 1) /
- {
- Buf = ADC_Get();
- Buf = (Buf * 3300)/4096;
- INT_CHAR(Buf);
- send_data1[234] = dis[0]; //更改上傳數據內容即AD值
- send_data1[234+1] = '.';
- send_data1[234+2] = dis[0+1];
- send_data1[234+3] = dis[0+2];
- }
- /* 初始化預連接的服務(wù)端地址 */
- server_addr.sin_family = AF_INET;
- server_addr.sin_port = htons(port);
- server_addr.sin_addr = *((struct in_addr *)host->h_addr);
- rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));
- /* 連接到服務(wù)端 */
- while (connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1)
- {
- /* 連接失敗 */
- rt_kprintf("Connect fail!\n");
- lwip_close(sock);
- /*釋放接收緩沖 */
- rt_free(recv_data);
- return 1;
- }
- rt_kprintf("Connect OK!\n");
- if(num == 1)
- {
- /* 發(fā)送數據到sock連接 */
- if(send(sock,send_data1,strlen(send_data1), 0) < 0)
- {
- /* 發(fā)送失敗,關(guān)閉這個(gè)連接 */
- rt_kprintf("\nSend error ");
- lwip_close(sock);
- /* 釋放接收緩沖 */
- rt_free(recv_data);
- }
- else
- {
- rt_kprintf("\nSend OK ");
- bytes_received = recv(sock, recv_data, BUFSZ - 1, 0);
- lwip_close(sock);
- /* 釋放接收緩沖 */
- rt_free(recv_data);
- }
- }
- else if(num == 2)
- {
- /* 發(fā)送數據到sock連接 */
- if(send(sock,send_data2,strlen(send_data2), 0) < 0)
- {
- /* 發(fā)送失敗,關(guān)閉這個(gè)連接 */
- rt_kprintf("\nSend error ");
- lwip_close(sock);
- /* 釋放接收緩沖 */
- rt_free(recv_data);
- }
- else
- {
- rt_kprintf("\nSend OK ");
- /* 從sock連接中接收最大BUFSZ - 1字節數據 */
- bytes_received = recv(sock, recv_data, BUFSZ - 1, 0);
- Buf = Search_str(recv_data,"\"value\":");
- if(recv_data[Buf] == '0')
- LPC_GPIO2->FIOPIN &= ~0xff; //關(guān)閉LED
- else
- LPC_GPIO2->FIOPIN |= 0xff; //打開(kāi)LED
- rt_kprintf("\n%s ",recv_data+Buf);
- lwip_close(sock);
- /* 釋放接收緩沖 */
- rt_free(recv_data);
- }
- }
- return 1;
- }
復制代碼
8、我們可以看到程序中通過(guò)判斷num值來(lái)發(fā)送兩個(gè)不同的字符串,這里num就是用來(lái)區別是用來(lái)上傳AD轉換值還是LED狀態(tài)獲取的
下面看看兩個(gè)字符串數據,我們可以看到下面兩個(gè)字符串中第一行都出現了我們設備的ID和傳感器ID,send_data1對應是AD轉換值
上傳,所以ID為20165,而send_data2為L(cháng)ED控制,ID對應為20166,U-ApiKey后面緊跟著(zhù)就是我們上面在賬戶(hù)設置里面的密碼,
Yeelink的API格式比較固定,至于其他一些參數可以參考Yeelink API文檔
- char send_data1[300] = "POST /v1.0/device/12402/sensor/20165/datapoints HTTP/1.1\r\n\
- Host: api.yeelink.net\r\n\
- Accept: */*\r\n\
- U-ApiKey: 615e52feacb3a8b18ab424703c00bfbf\r\n\
- Content-Length: 14\r\n\
- Content-Type: application/json;charset=utf-8\r\n\
- Connection: close\r\n\
- \r\n\
- {\"value\":96 }\r\n"; /* 發(fā)送用到的數據 */
- 這里有一點(diǎn)需要注意的是Content-Length的長(cháng)度必須為”value”后面跟著(zhù)字符串的長(cháng)度值加10,上面設置為14即”value”后面的值為4位,
- 這里初始化是”96 “
- char send_data2[300] = "GET /v1.0/device/12402/sensor/20166/datapoints HTTP/1.1\r\n\
- Host: api.yeelink.net\r\n\
- Accept: */*\r\n\
- U-ApiKey: 615e52feacb3a8b18ab424703c00bfbf\r\n\
- Content-Length: 0\r\n\
- Connection: close\r\n\
- \r\n\
- print get done.\r\n"; /* 發(fā)送用到的數據 */
復制代碼
另外還有一點(diǎn)需要注意的是,當我們查詢(xún)LED狀態(tài)時(shí)需要接收Yeelink服務(wù)器數據,那么數據的哪部分才是對我們有用的呢,我們可以使用
網(wǎng)絡(luò )調試助手,將調試助手連接到Yeelink服務(wù)器,發(fā)送字符串send_data2的內容,即可獲取服務(wù)器返回消息,其中”value”后面的0是我們
需要的數據,表明現在開(kāi)關(guān)是關(guān)著(zhù)的,若開(kāi)關(guān)打開(kāi)則返回為1
![]()
9、上面Yeelink設置和程序都介紹完了,下面就開(kāi)始測試了下面是電腦顯示波形
![]()
手機可以查看設備地址
![]()
![]()
下面在看一下LED控制
![]()
|
|