日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

智能家居 (7) ——网络服务器线程控制

發布時間:2023/12/10 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 智能家居 (7) ——网络服务器线程控制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 網絡線程控制代碼
    • inputCommand.h
    • mainPro.c
    • socketControl.c
  • 代碼測試
  • 往期文章

網絡線程控制代碼

inputCommand.h

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <wiringPi.h> #include <wiringSerial.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h>struct Command {char commandName[128]; //“控制方式”名char deviceFilesName[128]; //存放初始化所需文件的路徑char command[32]; //存放指令int fd; //存放文件描述符(串口/網絡)int (*Init)(struct Command *file); //“初始化”函數指針int s_fd; //存放服務器套接字描述符char ipAdress[32]; //存放 IP地址char port[12]; //存放端口號int (*getCommand)(struct Command *cmd); //“獲取指令”函數指針struct Command *next; };struct Command *addSocketControlToCommandLink(struct Command *phead); //“網絡控制”加入指令鏈表函數聲明

mainPro.c

#include <stdio.h> #include <string.h> #include "inputCommand.h" #include <pthread.h> #include <unistd.h>struct Command *findCommandByName(char *name,struct Command *phead); //尋找鏈節函數聲明 void *socketControlThread(void *data); //“網絡控制”線程函數聲明 void *socketReadThread(void *data); //“讀取端口”線程函數聲明struct Command *cmdhead = NULL; //創建“指令”鏈表全局變量 struct Command *socketHandler = NULL; //創建“鏈節處理”全局變量int main() {cmdhead = addSocketControlToCommandLink(cmdhead); //“網絡控制”對象加入鏈表pthread_t socketControl_thread;pthread_create(&socketControl_thread,NULL,socketControlThread,NULL); //創建“網絡控制”線程pthread_join(socketControl_thread, NULL); //主函數等待“網絡控制”線程退出return 0; }void *socketControlThread(void *data) //“網絡控制”線程 {int c_fd; //文件描述符struct sockaddr_in c_addr;memset(&c_addr,0,sizeof(struct sockaddr_in));socklen_t clen = sizeof(struct sockaddr_in);pthread_t socketRead_thread; //存放線程 IDsocketHandler = findCommandByName("socketControl",cmdhead); //尋找并返回“網絡控制”所處鏈節if(socketHandler == NULL){ //若找不到printf("find socketHandler error\n");pthread_exit(NULL);}if(socketHandler->Init(socketHandler) < 0){ //執行“網絡控制”功能初始化函數printf("socketControl init error\n");pthread_exit(NULL);}while(1){//不斷等待連接 只要有連接進來,就創建線程去對接c_fd = accept(socketHandler->s_fd,(struct sockaddr*)&c_addr,&clen); //接收連接請求socketHandler->fd = c_fd; //發送文件描述符pthread_create(&socketRead_thread,NULL,socketReadThread,NULL); //創建“讀取端口”線程 連接一個客戶端就去對接 可接納10個客戶端} } //創建新線程:用于讀取TCP端口指令 //只要有連接,就創建線程去對接。線程共用內存資源,同一時刻,所有設備只有一種狀態。也可PV操作 //所有線程 只操控一個結構體 再新來一個線程(新手機客戶端接入) 前一個客戶端失效 因為c_fd被改了。fork()可實現多個客戶端同時控制 //不過好像寄存器和內存不是完全同步的 可能緩存沒改?還可以多個客戶端同時控制? //如果直接把socketReadThread()拿過來循環的話,則同時刻不能接受新的客戶端接入了,因為循環卡在了socketReadThread()函數里面了//“讀取端口”線程 void *socketReadThread(void *data) //實際沒傳參 {int nread;memset(socketHandler->command,'\0',sizeof(socketHandler->command)); //每次讀取前,清空 “command(存放指令)”nread = read(socketHandler->fd,socketHandler->command,sizeof(socketHandler->command)); //讀取客戶端并存放到 “command”if(nread == 0){printf("No command received\n");}else{printf("Get command:%s\n",socketHandler->command); //讀取成功,打印數據} }struct Command *findCommandByName(char *name,struct Command *phead) //通過“名字”尋找鏈節函數 {struct Command *tmp = phead;if(phead == NULL){return NULL;}while(tmp != NULL){if(strcmp(name,tmp->commandName) == 0){return tmp;}tmp = tmp->next;}return NULL; }

socketControl.c

#include "inputCommand.h" #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <string.h> #include <unistd.h>int socketControlInit(struct Command *file); //“網絡控制”功能初始化函數聲明 struct Command *addSocketControlToLink(struct Command *phead); //“網絡控制”(對象)加入指令鏈表函數聲明struct Command socketControl = { //定義“網絡控制”對象.commandName = "socketControl", //名字.command = {'\0'}, //初始化儲存“指令”的空間.Init = socketControlInit, //指定“網絡控制”功能初始化函數.ipAdress = "192.168.0.19", //樹莓派 IP地址.port = "8088", //打開的端口號 };int socketControlInit(struct Command *file) {int s_fd; //套接字描述符struct sockaddr_in s_addr;memset(&s_addr,0,sizeof(struct sockaddr_in));s_fd = socket(AF_INET,SOCK_STREAM,0); //創建套接字if(s_fd == -1){ //若創建套接字失敗perror("socketControl error");exit(-1);}s_addr.sin_family = AF_INET;s_addr.sin_port = htons(atoi(file->port));inet_aton(file->ipAdress,&s_addr.sin_addr);if(bind(s_fd,(struct sockaddr*)&s_addr,sizeof(struct sockaddr_in)) == -1){ //套接字與端口號綁定perror("bind error");exit(-1);}if(listen(s_fd,10) == -1){ //打開監聽perror("listen error");exit(-1);}file->s_fd = s_fd; //發送套接字描述符 }struct Command *addSocketControlToCommandLink(struct Command *phead) //“網絡控制”(對象)加入指令鏈表函數 {if(phead == NULL){return &socketControl;}else{socketControl.next = phead;phead = &socketControl;return phead;} }

代碼測試

手機下載網絡調試助手,和樹莓派連入同一個WIFI,輸入樹莓派IP地址以及端口號,發送消息:Today is 520,樹莓派接收消息成功。

往期文章

智能家居 (1) ——智能家居整體功能框架
智能家居 (2) ——設計模式的引入
智能家居 (3) ——工廠模式繼電器控制燈
智能家居 (4) ——工廠模式火焰報警
智能家居 (5) —— LD3320語音模塊二次開發
智能家居 (6) ——語音識別線程控制
智能家居 (7) ——網絡服務器線程控制
智能家居 (8) ——智能家居項目整合(網絡控制線程、語音控制線程,火災報警線程)
網絡編程知識預備(1) ——了解OSI網絡模型
網絡編程知識預備(2) ——淺顯易懂的三次握手與四次揮手
網絡編程知識預備(3) ——SOCKET、TCP、HTTP之間的區別與聯系
網絡編程知識預備(4) ——了解HTTP協議與HTTPS協議
網絡編程知識預備(5) ——libcurl庫簡介及其編程訪問百度首頁
智能家居 (9) ——人臉識別攝像頭安裝實現監控功能
智能家居 (10) ——人臉識別祥云平臺編程使用
智能家居 (11) ——樹莓派攝像頭捕捉人臉并識別
智能家居 (12) ——人臉識別整合到智能家居系統
智能家居 (13) ——智能家居加入手機app端控制

總結

以上是生活随笔為你收集整理的智能家居 (7) ——网络服务器线程控制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。