Điều khiển LEDs trên board BeagleBone Black.
Bài viết sẽ giúp bạn kết nối thiết bị với máy chủ Internet Of Things một cách nhanh chóng nhất. Trong bài viết này sẽ có một số yêu cầu mà bạn cần thực hiện trong các bài viết khác và sẽ được chỉ định trong quá trình bạn làm theo đó.
Để làm được theo bài viết này, trước tiên bạn cần có tài khoản hợp lệ sử dụng được ứng dụng Box Of Connections. Chắc chắn rằng, trong dự án của bạn có ít nhất một kết nối chứa sẵn 4 giao diện điều khiển Digital Switcher. Hướng dẫn tạo Connection cho dự án của bạn tại đây. Hướng dẫn tạo Digital Switcher cho dự án của bạn tại đây.
Source code tham khảo được sử dụng để tạo kết nối TCP đến máy chủ Internet Of Things trên board BeagleBone Black.
Tải xuống:
Toàn bộ source code sử dụng trong bài viết này lấy nguồn từ www.qnx.com được chỉnh sửa, viết lại. Bao gồm BSP QNX 660 cho SoC AM335, Driver LEDs, và ứng dụng tạo kết nối TCP Client để phù hợp với mong muốn của tác giả bài viết này. Ngoài ra một số source code được tham khảo nguồn trên Internet. Tích hợp lên board BeagleBone Black:
Để thực hiện được những bước tiếp theo, bạn cần tải xuống những file cần thiết ở phía trên.Ngoài ra cần một số phụ kiện như:
Kết các nối thiết bị theo hình dưới:
Bạn có thể thử với mmc: 0 hoặc 1
Sau khi boot QNX thành công, phía dưới là màn hình console của QNX:
Video demo:
Nguồn: http://floatbeans.com/blog/?p=42
Bài viết sẽ giúp bạn kết nối thiết bị với máy chủ Internet Of Things một cách nhanh chóng nhất. Trong bài viết này sẽ có một số yêu cầu mà bạn cần thực hiện trong các bài viết khác và sẽ được chỉ định trong quá trình bạn làm theo đó.
Để làm được theo bài viết này, trước tiên bạn cần có tài khoản hợp lệ sử dụng được ứng dụng Box Of Connections. Chắc chắn rằng, trong dự án của bạn có ít nhất một kết nối chứa sẵn 4 giao diện điều khiển Digital Switcher. Hướng dẫn tạo Connection cho dự án của bạn tại đây. Hướng dẫn tạo Digital Switcher cho dự án của bạn tại đây.
Source code tham khảo được sử dụng để tạo kết nối TCP đến máy chủ Internet Of Things trên board BeagleBone Black.
Code:
/* * $QNXLicenseC: * Copyright 2015 QNX Software Systems. * * Licensed under the Apache License, Version 2.0 (the "License"). You * may not reproduce, modify or distribute this software except in * compliance with the License. You may obtain a copy of the License * at: http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTIES OF ANY KIND, either express or implied. * * This file may contain contributions from others, either as * contributors under the License or as licensors under other terms. * Please review this entire file for other proprietary rights or license * notices, as well as the QNX Development Suite License Guide at * http://licensing.qnx.com/license-guide/ for other information. * $ */ #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #define API_LEN_1 (strlen(API_NODE_1)) #define API_NODE_1 "REG ?api=3616be14990617eb327de5280839b654134a9ed41ad84 82c&node_id=ed7396417216cd63\n" #define API_LEN_2 (strlen(API_NODE_2)) #define API_NODE_2 "REG ?api=3616be14990617eb327de5280839b654134a9ed41ad84 82c&node_id=bebe7de988873fdc\n" #define API_LEN_3 (strlen(API_NODE_3)) #define API_NODE_3 "REG ?api=3616be14990617eb327de5280839b654134a9ed41ad84 82c&node_id=9724671bcea5b477\n" #define API_LEN_4 (strlen(API_NODE_4)) #define API_NODE_4 "REG ?api=3616be14990617eb327de5280839b654134a9ed41ad84 82c&node_id=cf935939ed38ae26\n" #define LED1 (1<<0) #define LED2 (1<<1) #define LED3 (1<<2) #define LED4 (1<<3) /*---------------UTIL_StringReplace---------------*/ inline static char * UTIL_CharReplace ( char *str, const char garbage) { char *src, *dst; for (src = dst = str; *src != '\0'; src++) { *dst = *src; if (*dst != garbage) dst++; } *dst = '\0'; return str; } inline void UTIL_StringRemoveChars ( char *str, char *garbage) { while( *garbage != '\0') { str = UTIL_CharReplace(str,*garbage++); } } /*---------------UTIL_GetVarFromURL---------------*/ inline int UTIL_SplitString (const char *str, char c , char ***arr ) { int count = 1; int token_len = 1; int i = 0; const char *p = str; char *t; while (*p != '\0') { if (*p == c) count++; p++; } *arr = (char**) malloc(sizeof(char*) * count); if (*arr == NULL) { return 0; } p = str; while (*p != '\0') { if (*p == c) { (*arr)[i] = (char*) malloc( sizeof(char) * token_len + 2 ); if ((*arr)[i] == NULL) { return 0; } memset((*arr)[i],0x00,sizeof(char) * token_len + 2); token_len = 0; i++; } p++; token_len++; } (*arr)[i] = (char*) malloc( sizeof(char) * token_len + 2 ); if ((*arr)[i] == NULL) { return 0; } memset((*arr)[i],0x00,sizeof(char) * token_len + 2); i = 0; p = str; t = ((*arr)[i]); while (*p != '\0') { if (*p != c && *p != '\0') { *t = *p; t++; } else { *t = '\0'; i++; t = ((*arr)[i]); } p++; } return count; } int main(int argc, char *argv[]) { int sockfd = 0, n = 0; char recvBuff[1024]; struct sockaddr_in serv_addr; if(argc != 2) { printf("\n Usage: %s <ip of server> \n",argv[0]); return 1; } memset(recvBuff, '0',sizeof(recvBuff)); if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("\n Error : Could not create socket \n"); return 1; } memset(&serv_addr, '0', sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(8081); if(inet_pton(AF_INET, argv[1], &serv_addr.sin_addr)<=0) { printf("\n inet_pton error occured\n"); return 1; } if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { printf("\n Error : Connect Failed \n"); return 1; } /* reg node to server */ write(sockfd, API_NODE_1 , API_LEN_1); usleep(500); write(sockfd, API_NODE_2 , API_LEN_2); usleep(500); write(sockfd, API_NODE_3 , API_LEN_3); usleep(500); write(sockfd, API_NODE_4 , API_LEN_4); usleep(500); const char *nodes[] = { "ed7396417216cd63", "bebe7de988873fdc", "9724671bcea5b477", "cf935939ed38ae26" }; uint8_t LEDS[] = { LED1,LED2,LED3,LED4 }; while ( (n = read(sockfd, recvBuff, sizeof(recvBuff)-1)) > 0) { if(n){ recvBuff[n] = 0; /* split string received */ char *str = strtok(recvBuff," "); if(!strcmp("UPDATE",str)){ int var_num = 0; char *ptr = strtok(NULL,"?"); UTIL_StringRemoveChars(ptr,"\r\n"); char **arr = NULL; var_num = UTIL_SplitString(ptr,'&',&arr); if(var_num>2) { int i = 0; char *tmp_ptr = strtok(arr[1],"="); char *nodeId = strtok(NULL,"="); tmp_ptr = strtok(arr[2],"="); char *value = strtok(NULL,"="); printf("node %s val %s\n",nodeId,value); for(i = 0;i < 4;i++) { if(!strcmp(nodes[i],nodeId)) { /* read current value of LEDS */ int fd = open("/dev/leds", O_RDWR); uint8_t val = 0; char buf[512]; if(fd != -1) { int n = read(fd,buf,512); if(n) { buf[n] = 0; UTIL_StringRemoveChars(buf,"\r\n"); char *p = strtok(buf,"="); p = strtok(NULL,"="); sscanf(p, "%x", &val); } /* ON/OFF */ if(!strcmp(value,"ON")) { val |= LEDS[i]; } if(!strcmp(value,"OFF")) { val &= ~LEDS[i]; } char val_str[32] = {'\0'}; sprintf(val_str,"0x%x\n",val); printf("%s",val_str); write(fd, val_str, strlen(val_str)+1); } close(fd); break; } } // for (i=0; i<var_num; ++i) { // free((*arr)[i]); // } // free(arr); } } /*printf(recvBuff);*/ } } if(n < 0) { printf("\n Read error \n"); } return 0; }
- MLO, u-boot.img: Tệp tin bootloader cho board BeagleBone Black nếu cần thiết.
- ifs-ti-am335x-evm.bin (13MB) : Tệp tin chứa hệ điều hành QNX và ứng dụng kết nối TCP Client.
- bb-iot-client, beaglebone-iot-client.zip: Tệp tin ứng dụng sử dụng tạo kết nối TCP Client với máy chủ Internet Of Things và nhận IoT Messages để điều khiển các LEDs trên board BeagleBone Black. Mặc định ứng dụng này được cài trong ifs-ti-am335x-evm.bin.
- dev-leds-beaglebone, leds.zip : Driver và source code dành cho các LEDs trên board BeagleBone Black, đây là source code đã được chỉnh sửa từ nguồn tham khảo tại www.qnx.com.
- auth.cfg: Tệp tin chứa chuỗi xác minh giúp bb-iot-client tạo luồng dữ liệu IoT Messages điều khiển cho 4 LEDs, tệp tin này cũng được đính kèm sẵn trong ifs-ti-am335x-evm.bin tại đường dẫn /usr/local/floatbeans/auth.cfg. Tham khảo thêm bài viết về luồng dữ liệu IoT Messages tại đây.
Toàn bộ source code sử dụng trong bài viết này lấy nguồn từ www.qnx.com được chỉnh sửa, viết lại. Bao gồm BSP QNX 660 cho SoC AM335, Driver LEDs, và ứng dụng tạo kết nối TCP Client để phù hợp với mong muốn của tác giả bài viết này. Ngoài ra một số source code được tham khảo nguồn trên Internet. Tích hợp lên board BeagleBone Black:
Để thực hiện được những bước tiếp theo, bạn cần tải xuống những file cần thiết ở phía trên.Ngoài ra cần một số phụ kiện như:
- Một cable Ethernet hỗ trợ kết nối Internet
- Một smartphone hoặc máy tính để bàn để sử dụng ứng dụng IoT Box.
- Một board chuyển đổi USB sang Serial để kết nối với cổng Debug trên board BeaglBone.
- Một board BeagleBone Black.
Kết các nối thiết bị theo hình dưới:
- Chép file mlo, u-boot.img bạn đã tải xuống và đặt vào Micro SD Card nếu bạn sử dụng boot từ Micro SD Card.
- Chép file ifs-ti-am335x-evm.bin bạn đã tải xuống và đặt vào Micro SD Card.
- Sử dụng một thiết bị Serial RS232 và kết nối Terminal trên máy tính với cổng Debug trên board. Trên hệ điều hành Windows, bạn có thể sử dụng một phần mềm Terminal bất kỳ, đối với Linux, có thể sử dụng minicom, cấu hình cho Terminal theo thông số phía dưới:
- Gắn Micro SD Card vào board BeagleBone Black. Cấp nguồn hoạt động, khi mới khởi động board sẽ chạy U Boot trước. Bạn hãy nhanh tay nhấn phím Enter để giữ lại màn hình console của Uboot trên board.
- Tại màn hình console của Uboot, sử dụng command phía dưới để chắc chắn rằng Uboot của bạn đã nhận được Micro SD Card và thấy file ifs-ti-am335x-evm.bin trong đó:
U-boot# fat ls mmc 0
- Bạn có thể thử với mmc: 0 hoặc 1
- Nếu như màn hình hiển thị ra nội dung chứa tên file ifs-ti-am335x-evm.bin, thì lúc này bạn sẽ sử dụng command sau để nạp và chạy:
U-boot# fatload mmc 0 0x81000000 ifs-ti-am335x-evm.bin U-boot# go 0x81000000
Bạn có thể thử với mmc: 0 hoặc 1
Sau khi boot QNX thành công, phía dưới là màn hình console của QNX:
- Trước khi chạy ứng dụng bb-iot-client, bạn đảm bảo đã kết nối đầy đủ các
- Sau khi boot thành công ifs-ti-am335x-evm.bin, tại màn hình console của QNX, bạn sử dụng command sau để chạy ứng dụng bb-iot-client:
# bb-iot-client 52.32.76.171 5050 /usr/local/floatbeans/auth.cfg
- Cuối cùng, bạn cần đi tới ứng dụng Box Of Connections để điều khiển đèn LEDs trên board BeagleBone.
Video demo:
Nguồn: http://floatbeans.com/blog/?p=42