一、測(cè)試環(huán)境說(shuō)明
程序測(cè)試硬件為:樹(shù)莓派3B+ ,以及4根杜邦線,1塊面包板,1個(gè)藍(lán)色led燈
杜邦線均為公-母線, 其母頭分別接樹(shù)莓派40GPIO口處的 3.3v(pin1),GND(pin39),pin11,pin18
LED燈的 正極連 pin18,負(fù)極連pin1 (在面包板上)
接pin11的杜邦線另一端公頭懸空,測(cè)試時(shí)可分別在面包板上與 pin1 或 pin39 連接,模擬一個(gè)撥動(dòng)開(kāi)關(guān)(如果有撥動(dòng)開(kāi)關(guān)可以直接利用)
基本系統(tǒng):rasbian
nodejs:10.2.1
npm:6.1.0
gcc: 6.3.0
wiringPi & gpio:2.46
-------------------------------------------
二、關(guān)鍵代碼解析
1. 利用wiringPi和socket編寫(xiě)本地tcp服務(wù),具體代碼見(jiàn)項(xiàng)目代碼 rpi-express-demo/localSvc/server.c
#include #include #include #include #include #include #include #include #include #include #include #include #include #define SERVER_PORT 5555#define LEDpin 5#define KEYpin 0#define LINE_MAX 1024int setLEDon(void){ // 定義亮燈處理 digitalWrite(LEDpin,HIGH); return HIGH;} int setLEDoff(void){ // 定義滅燈處理 digitalWrite(LEDpin,LOW); return LOW;} int getKEY( ){ // 獲取燈狀態(tài)值 return digitalRead(KEYpin);}int main(){ //調(diào)用socket函數(shù)返回的文件描述符int serverSocket; //聲明兩個(gè)套接字sockaddr_in結(jié)構(gòu)體變量,分別表示客戶(hù)端和服務(wù)器struct sockaddr_in server_addr;struct sockaddr_in clientAddr;int addr_len = sizeof(clientAddr);//用于接收連接,因?yàn)橹挥幸粋€(gè),所以同時(shí)只允許一個(gè)連接int client;char buffer[ LINE_MAX ];char rtmsg[ LINE_MAX ];int iDataNum;int LEDflag = LOW ;int KEYflag ;char *LED_ON = "on" ;char *LED_OFF = "off" ;char *KEY_GET = "get" ;char *CLOSE_MSG = "quit"; int Ec=0;/ //socket函數(shù),失敗返回-1 //int socket(int domain, int type, int protocol); //第一個(gè)參數(shù)表示使用的地址類(lèi)型,一般都是ipv4,AF_INET //第二個(gè)參數(shù)表示套接字類(lèi)型:tcp:面向連接的穩(wěn)定數(shù)據(jù)傳輸SOCK_STREAM //第三個(gè)參數(shù)設(shè)置為0if((serverSocket = socket(AF_INET, SOCK_STREAM, 0)) < 0){perror("socket");return 1;}bzero(&server_addr, sizeof(server_addr)); //初始化服務(wù)器端的套接字,并用htons和htonl將端口和地址轉(zhuǎn)成網(wǎng)絡(luò)字節(jié)序server_addr.sin_family = AF_INET;server_addr.sin_port = htons(SERVER_PORT); //ip可是是本服務(wù)器的ip,也可以用宏INADDR_ANY代替,代表0.0.0.0,表明所有地址server_addr.sin_addr.s_addr = htonl(INADDR_ANY); //對(duì)于bind,accept之類(lèi)的函數(shù),里面套接字參數(shù)都是需要強(qiáng)制轉(zhuǎn)換成(struct sockaddr *) //bind三個(gè)參數(shù):服務(wù)器端的套接字的文件描述符, if(bind(serverSocket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0){perror("connect");return 1;} //設(shè)置服務(wù)器上的socket為監(jiān)聽(tīng)狀態(tài)if(listen(serverSocket, 15) < 0) {perror("listen");return 1;}while(1){printf("Listening on port: %d ", SERVER_PORT); //調(diào)用accept函數(shù)后,會(huì)進(jìn)入阻塞狀態(tài) //accept返回一個(gè)套接字的文件描述符,這樣服務(wù)器端便有兩個(gè)套接字的文件描述符, //serverSocket和client。 //serverSocket仍然繼續(xù)在監(jiān)聽(tīng)狀態(tài),client則負(fù)責(zé)接收和發(fā)送數(shù)據(jù) //clientAddr是一個(gè)傳出參數(shù),accept返回時(shí),傳出客戶(hù)端的地址和端口號(hào) //addr_len是一個(gè)傳入-傳出參數(shù),傳入的是調(diào)用者提供的緩沖區(qū)的clientAddr的長(zhǎng)度,以避免緩沖區(qū)溢出。 //傳出的是客戶(hù)端地址結(jié)構(gòu)體的實(shí)際長(zhǎng)度。 //出錯(cuò)返回-1client = accept(serverSocket, (struct sockaddr*)&clientAddr, (socklen_t*)&addr_len);if(client < 0){perror("accept");continue;}printf(" recv client data...n"); //inet_ntoa ip地址轉(zhuǎn)換函數(shù),將網(wǎng)絡(luò)字節(jié)序IP轉(zhuǎn)換為點(diǎn)分十進(jìn)制IP //表達(dá)式:char *inet_ntoa (struct in_addr);printf("IP is %s ", inet_ntoa(clientAddr.sin_addr));printf("Port is %d ", htons(clientAddr.sin_port));while(1){iDataNum = recv(client, buffer, 1024, 0);if(iDataNum <= 0){ Ec++; if(Ec>5) break;continue;}buffer[iDataNum] = ' 主站蜘蛛池模板: 好吊色7777sao在线视频观看| 国产妇女在线| 夜夜骑狠狠干| 在线看免费视频| 在线一区观看| 国产超爽人人爽人人做| 欧美高清一级片| 神马影院午夜在线| 日本妞xxxxxxxxx69| 欧美19禁| 老头天天吃我奶躁我的动图| 手机亚洲第一页| 激激婷婷综合五| 久久精品视频免费观看| 永久免费看| 一区二区影视| 欧美成人一区二区三区在线视频| 天天干天天爽| 黄免费网站| 国产一区二区丁香婷婷| 国产成人精品影视| 嘿嘿嘿视频在线观看网站| 久久国产香蕉一区精品| 天天干网站| 中文字幕在线资源| 国产农村妇女毛片精品久久| 免费在线观看一级片| 一区二区三区伦理高清| 国产精品一区在线观看你懂的| 欧美最猛性xxxx免费| 日本成片免费高清| 精品一区二区在线观看| 四虎影院最新网址| 国产片无遮挡在线看床戏| 免费在线观看的网站| 欧美日韩一区二区三区视频在线观看| 日日拍拍| 色综合久久中文综合网| 天天操狠狠干| 黄网站视频在线观看| 国产成都一二三四区|