1. 程式人生 > >wifi智慧小車專案(伺服器端的登入註冊)

wifi智慧小車專案(伺服器端的登入註冊)

wifi智慧小車專案,伺服器端主要是基於路由板上跑一個openwrt作業系統。openwrt配置ser2net、mjpg-stream兩個軟體,同時配置json、sqlite3;

ser2net-----通過wifi接受上位機發送的指令,將資料原封不動的網口轉串列埠,發給下位機處理;

mjpg-stream-----通過usb輸入的視訊資料流進行編碼,通過wifi通道給上位機解碼,輸出視屏;

json-----解析上位機發送的json包資訊;

sqlite3----將解析的上位機發送的密碼和賬號插入資料庫,每次遍歷資料庫看是否存在賬號,不存在則註冊;

------------------------------------------------------------------------------------------------------------

這裡就簡單的把程式碼拿出來吧,openwrt的系統裁剪和移植還有交叉編譯工具鏈在沒有文件下,花了很多時間,由於細節太多,有需要的可以私聊;

#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <json/json.h>
#include <sqlite3.h>
#include <string.h>
/****************************************************************/
#define REGISER   0
#define LOGIN     1

int buf0[]={0};
int buf1[]={1};

void handler_message(int signum)
{
    waitpid(-1,NULL,WNOHANG);//非阻塞
    return;
}


void do_register(int sockfd,sqlite3 *pdb,char *_username,char *_password,char *filename)
{
        int ret=0;
        char sql[1024]={0};
        int nrow=0,ncolumn=0;
        char *errmsg;
        char **dbresult;

        sprintf(sql,"select *from userinfo where userName='%s';",_username);

        ret=sqlite3_open(filename,&pdb);
        if(ret!=SQLITE_OK)
        {
            fprintf(stderr,"fail to sqlite3_open:%s\n",sqlite3_errmsg(pdb));
            return ;
        }
        

        if(sqlite3_get_table(pdb,sql,&dbresult,&nrow,&ncolumn,&errmsg)!=0)
        {
            fprintf(stderr,"sqlite3 get table error:%s\n",errmsg);
            return ;
        }


        /***********查詢若使用者不存在*****************/
        if(nrow==0)/*******註冊**********/
        {

            bzero(sql,sizeof(sql));
            sprintf(sql,"insert into userinfo values('%s','%s');",_username,_password);
            sqlite3_exec(pdb,sql,NULL,NULL,&errmsg);
          //  printf("ok.....\n");


            if(send(sockfd,buf1,sizeof(buf1),0)<0)
            {
                perror("fail to send");
                return ;
            }

        }
        /************查詢若使用者名稱存在***************/
        else
        {
            if(send(sockfd,buf1,sizeof(buf1),0)<0)
            {
                perror("fail to send");
                return ;
            }
        }

       sqlite3_free_table(dbresult);
}

void do_login(int sockfd,sqlite3 *pdb,char *_username,char *_password,char *filename)
{

    int ret=0;
    char sql[1024]={0};
    int nrow=0,ncolumn=0;
    char *errmsg;
    char **dbresult;


    sprintf(sql,"select *from userinfo where userName='%s';",_username);

    ret=sqlite3_open(filename,&pdb);
    if(ret!=SQLITE_OK)
    {
        fprintf(stderr,"fail to sqlite3_open:%s\n",sqlite3_errmsg(pdb));
        return ;
    }
        
    /************查詢查資料表****************/          
    if(sqlite3_get_table(pdb,sql,&dbresult,&nrow,&ncolumn,&errmsg)!=0)
    {
        fprintf(stderr,"sqlite3 get table error:%s\n",errmsg);
        return ;
    }


    /***********使用者不存在*****************/
    if(nrow==0)
    {
        if(send(sockfd,buf0,sizeof(buf0),0)<0)
        {
            perror("fail to send");
            return ;
        }
    }
    /************使用者名稱存在***************/
    else
    {
        if(send(sockfd,buf1,sizeof(buf1),0)<0)
        {
            perror("fail to send");
            return ;
        }
    }
    sqlite3_free_table(dbresult);
    return;

}



void do_client(int sockfd)
{
    int n = 0;
    unsigned char buf[1024]={0};
    json_object *obj;//定義json物件 
    char _username[25];
    char _password[25];     
    int ret=0;
    char sql[1024]={0};
    char *errmsg;
    char **dbresult;
    sqlite3 *pdb=NULL;
    char* filename = "/home/ubuntu/project/carinfo.db";
    

    while(1)
    {
        bzero(buf,sizeof(buf));
        n = recv(sockfd,buf,sizeof(buf),0);
        if(n <= 0)
        {
            perror("fail to recv");
            exit(EXIT_FAILURE);
        }        
/***json解析***/
        printf("recv_buf= %s\n",buf);//接受對方發來的JSON物件
        printf("buf[0]=%d\n",buf[0]);


        obj=json_tokener_parse(buf+1);//解析json物件
        json_object *new_object=json_object_object_get(obj,"userName");//根據鍵名獲取小物件
        printf("%s\n",json_object_get_string(new_object));//獲取json物件裡的字串
        strcpy(_username,json_object_get_string(new_object));

        new_object=json_object_object_get(obj,"passWord");//根據鍵名獲取小物件
        printf("%s\n",json_object_get_string(new_object));//獲取json物件裡的字串
        strcpy(_password,json_object_get_string(new_object));

/***SQL*******/
        sprintf(sql,"select *from userinfo where userName='%s';",_username);

        ret=sqlite3_open(filename,&pdb);
        if(ret!=SQLITE_OK)
        {
            fprintf(stderr,"fail to sqlite3_open:%s\n",sqlite3_errmsg(pdb));
            return ;
        }
/***登入******/
        if(buf[0]=='1')
        {
              do_login(sockfd,pdb,_username,_password,filename);
        }
/***註冊*****/
        else if(buf[0]=='2')
        {
            do_register(sockfd,pdb,_username,_password,filename);
        }
        exit(EXIT_SUCCESS);
}


//./a.out ip port
int main(int argc, const char *argv[])
{
    int listen_fd;
    int connect_fd;
    struct sockaddr_in ser_addr;
    struct sockaddr_in client_addr;
    socklen_t len = sizeof(struct sockaddr);
    int n = 0;
    char buf[1024] = {0};
    pid_t pid;


    if(argc != 3)
    {
        fprintf(stderr,"Uage: %s ip port ",argv[0]);
        exit(EXIT_FAILURE);
    }
    
    if(signal(SIGCHLD,handler_message) == SIG_ERR)
    {
        perror("fail to signal");
        exit(EXIT_FAILURE);
    }
    //1.建立一個監聽套接字
    listen_fd = socket(AF_INET,SOCK_STREAM,0);
    if(listen_fd < 0)
    {
        perror("fail to socket");
        exit(EXIT_FAILURE);
    }

    //2.伺服器地址賦值
    bzero(&ser_addr,len);
    ser_addr.sin_family = AF_INET;
    ser_addr.sin_port = htons(atoi(argv[2]));
    ser_addr.sin_addr.s_addr = inet_addr(argv[1]);

    //3.繫結套接字
    if(bind(listen_fd,(struct sockaddr *)&ser_addr,len) < 0)
    {
        perror("fail to bind");
        exit(EXIT_FAILURE);
    }

    //4.開啟監聽,設定監聽佇列的長度10
    listen(listen_fd,10);
    printf("listen ......I\n");
    while(1)
    {

        connect_fd = accept(listen_fd,(struct sockaddr *)&client_addr,&len);
        if(connect_fd < 0)
        {
            perror("fail to accept");
            exit(EXIT_FAILURE);
        }

        printf("----------------------------------------------------");
        printf("connect_fd = %d\n",connect_fd);
        printf("client_addr.sin_port = %d\n",ntohs(client_addr.sin_port));
        printf("client_addr.sin_addr = %s\n",inet_ntoa(client_addr.sin_addr));

        //
        pid = fork();

        if(pid < 0)
        {
            perror("fail to fork");
            exit(EXIT_FAILURE);
        }else if(pid == 0)    //子程序負責資料的接收
        {
            do_client(connect_fd);
            close(listen_fd);

        }else{
            close(connect_fd);
        }

    }
    
    return 0;
  }
}

相關推薦

wifi智慧小車專案伺服器登入註冊

wifi智慧小車專案,伺服器端主要是基於路由板上跑一個openwrt作業系統。openwrt配置ser2net、mjpg-stream兩個軟體,同時配置json、sqlite3;ser2net-----通過wifi接受上位機發送的指令,將資料原封不動的網口轉串列埠,發給下位機

Servlet中路徑跳轉伺服器跳轉JSP

Servlet中路徑跳轉(伺服器端跳轉)JSP 1.相對路徑  注意這裡的相對含義,相對於誰而言 經過多次試驗總結,servlet相對路徑跳轉相對於servlet配置的xml路徑(或servlet3.0註解路徑) 如下: //XML檔案 <servlet-mapp

網路線上遊戲開發心得伺服器、Java

  一個多人線上的棋牌類網路遊戲的專案臨近尾聲,我參與了該專案的整個設計流程,並且完成了90%的核心程式碼。關於這個專案,有很多地方值得聊一聊。本系列不打算把這個專案將得多麼詳細規範,那是設計文件應該描述的,我打算只說說一些值得注意的地方。   這個專案的一個特別之處是,客戶端是手機,使用者通過行動網路與伺服

MQTT+ActiveMQ實現訊息推送伺服器java實現

上一篇文章已經介紹了mqtt+activemq實現訊息推送移動端的實現,也介紹了利用自帶的web console進行訊息釋出的方法。但是在具體的專案應用中,當我們將需要將該訊息推送模組嵌入到一個後臺管理系統當中,我們就需要在web端來訪問activeMQ來進行訊

android開發之網路棋牌類線上遊戲開發心得伺服器、Java

  這個專案的一個特別之處是,客戶端是手機,使用者通過行動網路與伺服器通訊。和PC相比,手機的處理能力極弱,而且網路流量費用昂貴。因為除了要考慮普通網路遊戲的一些問題之外,這兩點也需要在設計中充分考慮。  首先是開發語言的選擇,由於伺服器是Linux的環境,MS的技術直接排除,至於MONO嘛,我實在不放心。可

Javaweb學習筆記——十四—————— 伺服器驗證註冊登入表單專案

專案:https://download.csdn.net/download/qq_40223688/10463436專案功能:*註冊*登入------------------------------------------------------------------JSP

Android專案開發筆記之登入註冊模組實現客戶+服務

寫在前面   斷斷續續開發了幾個月的App終於告一段落,雖然它可能還很不完美,不過作為上手Android的第一個完整專案,確實從中學到了蠻多,所以開個系列記錄一下~本篇先從基本上每個App都會有的登入註冊講起,包含自動登入、記住密碼功能的實現=w= 實現

idea+maven + spring security +springmvc入門 自定義登入頁面,附idea如何建立web專案

第一次使用idea,上午在eclipse中 學習了spring security 入門,下午試試在idea中搭建。 剛開始 我以為 直接將eclipse的 檔案 copy過來就行了,結果發現copy過來以後 各種報錯。 後來把m

在datasnap 中使用unidac 訪問資料伺服器

  從delphi 6 開始,datasnap 作為delphi 自帶的多層框架,一直更新到最新的delphi 10.3 。同時逐步增加了很多新的功能 ,比如支援REST 呼叫,支援 IIS ,apache 等伺服器。今天簡單介紹一下如何在datasnap 中使用unidac 訪問資料庫。 首

C#伺服器與客戶的通訊伺服器

Tcp協議+socket 1.伺服器端開始監聽 //通過winform視窗輸入的伺服器ip地址和埠號  myip = IPAddress.Parse(textBox1.Text);  myport = Int32.Parse(textBox2.Text);

小白入智慧小車

1、背景: 入手一輛智慧小車,深入研究,提高自己的知識儲備和技能。 作為非科班的資深小白,我從頭學習智慧小車知識。 需要準備的知識 1、直流電機基礎知識 1、H橋是什麼? 全橋式直流電機驅動電路 3、L293D全橋驅動器驅動程式編寫 2、對於一個機械畢業生,不熟悉直流

Windows server部署專案前後分離

環境搭建 後端: 安裝 jdk,maven,配置環境變數 安裝 nginx,並配置代理模式 安裝Git 前端: 安裝node, cnpm, 配置node及cnpm環境變數 安裝JDK 下載傳送門 選擇 jdk版本

基於vue現有專案伺服器渲染SSR改造

前面的話   不論是官網教程,還是官方DEMO,都是從0開始的服務端渲染配置。對於現有專案的伺服器端渲染SSR改造,特別是基於vue cli生成的專案,沒有特別提及。本文就小火柴的前端小站這個前臺專案進行SSR改造 效果 概述 【定義】   伺服器渲染的Vue應用程式被認為是"同構"

Android-使用者登陸的例子伺服器開發到客戶實現

1.回顧        上篇實現總結了App介面開發課程講解的內容 2.此篇      這篇將總結app介面開發裡的 使用者登入的例子! 3.基本步驟     (1)服務端實現 登陸介面 開發     (2)實現 json 和xml資料封裝類     (3)編寫 介面開

Android之ListView分頁獲取網路資料伺服器

資料庫分頁: mysql:select pname from product limit 0,2;第一個引數是指要開始的地方,第二個引數是指每頁顯示多少條資料;注意:第一頁用0表示。 oracle:rownumber SqlServer:top 一、伺服器端 ①新建包com

springBoot 搭建web專案前後分離,附專案原始碼地址

springBoot 搭建web專案(前後端分離,附專案原始碼地址)    概述 該專案包含springBoot-example-ui 和 springBoot-example,分別為前端與後端,前後端分離,利用ajax互動。 springBoot-exam

如何使用手機預覽Vue專案移動

1、在命令列中輸入npm run dev ,啟動自己的vue專案,例:http://localhost:8081/#/goods,可以在瀏覽器預覽2、那麼如何在手機端預覽vue專案呢?WIN+R,輸入cmd啟動命令列工具,輸入ipconfig檢視本機ip3、本機ip替換loc

前後分離專案解決跨域問題方式解決

新建CorsFilter類實現Filter介面,程式碼如下: package com.rl.config; import org.springframework.stereotype.Component; import javax.servlet.*; import javax.servle

簡單WiFi控制小車系統樹莓派+python+web控制介面)

  下面是小車      好醜 對不對 ,不過反正可以蛇皮走位就行。    蛇皮走位演示視訊: https://pan.baidu.com/s/1RHHr8bRHWzSEAkrpwu99aw

使用手機預覽Vue專案移動

1、在命令列中輸入npm run dev ,啟動自己的vue專案,例:http://localhost:8081/#/goods,可以在瀏覽器預覽2、那麼如何在手機端預覽vue專案呢?WIN+R,輸入cmd啟動命令列工具,輸入ipconfig檢視本機ip3.將vue專案中的i