基於JavaWeb平臺的常用物聯網硬件接口對接代碼總結文檔_田超凡

基於JavaWeb平臺的常用物聯網硬件接口對接代碼總結文檔

                                                                                                                                           20190612 田超凡

                                                                     知網用戶_進擊的猿寶寶(田超凡)爲原作者,轉載請註明原作者

1.基於嵌入式語言Arduino和C++的傳感器監測代碼

改造後的C++ h頭文件:

//

//    FILE: dht.h

//  AUTHOR: Rob Tillaart

// VERSION: 0.1.20

// PURPOSE: DHT Temperature & Humidity Sensor library for Arduino

//     URL: http://arduino.cc/playground/Main/DHTLib

//

// HISTORY:

// see dht.cpp file

//

 

#ifndef dht_h

#define dht_h

 

#if ARDUINO < 100

#include <WProgram.h>

#include <pins_arduino.h>  // fix for broken pre 1.0 version - TODO TEST

#else

#include <Arduino.h>

#endif

 

#define DHT_LIB_VERSION "0.1.20"

 

#define DHTLIB_OK                   0

#define DHTLIB_ERROR_CHECKSUM       -1

#define DHTLIB_ERROR_TIMEOUT        -2

#define DHTLIB_ERROR_CONNECT        -3

#define DHTLIB_ERROR_ACK_L          -4

#define DHTLIB_ERROR_ACK_H          -5

 

#define DHTLIB_DHT11_WAKEUP         18

#define DHTLIB_DHT_WAKEUP           1

 

#define DHTLIB_DHT11_LEADING_ZEROS  1

#define DHTLIB_DHT_LEADING_ZEROS    6

 

// max timeout is 100 usec.

// For a 16 Mhz proc 100 usec is 1600 clock cycles

// loops using DHTLIB_TIMEOUT use at least 4 clock cycli

// so 100 us takes max 400 loops

// so by dividing F_CPU by 40000 we "fail" as fast as possible

#define DHTLIB_TIMEOUT 400 // (F_CPU/40000)

 

class dht

{

public:

    // return values:

    // DHTLIB_OK

    // DHTLIB_ERROR_CHECKSUM

    // DHTLIB_ERROR_TIMEOUT

    // DHTLIB_ERROR_CONNECT

    // DHTLIB_ERROR_ACK_L

    // DHTLIB_ERROR_ACK_H

    int8_t read11(uint8_t pin);

    int8_t read(uint8_t pin);

 

    inline int8_t read21(uint8_t pin) { return read(pin); };

    inline int8_t read22(uint8_t pin) { return read(pin); };

    inline int8_t read33(uint8_t pin) { return read(pin); };

    inline int8_t read44(uint8_t pin) { return read(pin); };

 

    double humidity;

    double temperature;

 

private:

    uint8_t bits[5];  // buffer to receive data

    int8_t _readSensor(uint8_t pin, uint8_t wakeupDelay, uint8_t leadingZeroBits);

};

#endif

//

// END OF FILE

//

 

(1).PT550 亮度傳感器

#define PIN_A 1

#define PIN_D 2

 

void setup()

{

  Serial.begin(9600);

}

 

void loop()

{

  int val;

  val=analogRead(PIN_A);

  //Serial.print("a:");

  Serial.print(val,DEC);

  Serial.println();

  //Serial.print(",d:");

  //val=digitalRead(PIN_D);

  //Serial.println(val+"\n");

  delay(500);

}

 

(2).DHT11 溫溼度傳感器

//   FILE:  dht_test.pde

// PURPOSE: DHT library test sketch for Arduino

//

 

#include <dht.h>

 

dht DHT;

 

#define DHT11_PIN 4//put the sensor in the digital pin 4 

 

void setup()

{

  Serial.begin(9600);

  Serial.println("DHT TEST PROGRAM ");

  Serial.print("LIBRARY VERSION: ");

  Serial.println(DHT_LIB_VERSION);

  Serial.println();

  Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)");

}

 

void loop()

{

 

  // READ DATA

  Serial.print("DHT11, \t");

  int chk = DHT.read11(DHT11_PIN);

  switch (chk)

  {

    case 0:  Serial.print("OK,\t"); break;

    case -1: Serial.print("Checksum error,\t"); break;

    case -2: Serial.print("Time out error,\t"); break;

    default: Serial.print("Unknown error,\t"); break;

  }

  // DISPLAT DATA

  Serial.print(DHT.humidity, 1);

  Serial.print(",\t");

  Serial.println(DHT.temperature, 1);

 

  delay(1000);

}

//

// END OF FILE

//

 

2.Java串口通信依賴

 

Java和DHT11溫溼度檢測器串口通信

package com.kingtake.common.rxtx.util;

 

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.nio.charset.Charset;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.Enumeration;

import java.util.TooManyListenersException;

 

import gnu.io.CommPortIdentifier;

import gnu.io.PortInUseException;

import gnu.io.SerialPort;

import gnu.io.SerialPortEvent;

import gnu.io.SerialPortEventListener;

import gnu.io.UnsupportedCommOperationException;

 

public class DHTSerialPortListener implements Runnable, SerialPortEventListener {

      private String appName = "串口通訊";

      private int timeout = 2000;// open 端口時的等待時間

      private int threadTime = 0;

 

      private CommPortIdentifier commPort;

      private SerialPort serialPort;

      private InputStream inputStream;

      private OutputStream outputStream;

 

      @SuppressWarnings("restriction")

      public void listPort()

      {

            CommPortIdentifier cpid;// 當前串口對象

            Enumeration en = CommPortIdentifier.getPortIdentifiers();

            System.out.print("列出所有端口:");

            while (en.hasMoreElements())

            {

                  cpid = (CommPortIdentifier) en.nextElement();

 

                  // 檢測端口類型是否爲串口

                  if (cpid.getPortType() == CommPortIdentifier.PORT_SERIAL)

                  {

                       System.out.println(cpid.getName() + ", " + cpid.getCurrentOwner());

                  }

            }

      }

 

      /**

       *   * @方法名稱 :openPort   * @功能描述 :選擇一個端口,比如:COM1 並實例 SerialPort   * @返回值類型 :void

       *   * @param portName

       */

      private void openPort(String portName)

      {

            // TODO TCF 打開指定串口

            this.commPort = null;

            CommPortIdentifier cpid;

            Enumeration en = CommPortIdentifier.getPortIdentifiers();

 

            while (en.hasMoreElements())

            {

                  cpid = (CommPortIdentifier) en.nextElement();

                  if (cpid.getPortType() == CommPortIdentifier.PORT_SERIAL && cpid.getName().equals(portName))

                  {

                       this.commPort = cpid;

                       break;

                  }

            }

 

            /* 實例 SerialPort */

            if (commPort == null)

            {

                  System.out.println(String.format("無法找到名字爲'%1$s'的串口!", portName));

            }

            else

            {

                  try

                  {

                       // 應用程序名【隨意命名】,等待的毫秒數

                       serialPort = (SerialPort) commPort.open(appName, timeout);

                  }

                  catch (PortInUseException e)

                  {

                       // 端口已經被佔用

                       throw new RuntimeException(String.format("端口'%1$s'正在使用中!", commPort.getName()));

                  }

            }

      }

     

      /**

        * @方法名稱 :checkPort

        * @功能描述 :檢查端口是否正確連接

        * @返回值類型 :void

      */

      private void checkPort()

      {

          if(commPort == null)

          {

                throw new RuntimeException("沒有選擇端口,請使用 " +"selectPort(String portName) 方法選擇端口");

          }

       

 

            if (serialPort == null)

            {

                  throw new RuntimeException("SerialPort 對象無效!");

            }

      }

     

      /**

        * @方法名稱 :write

        * @功能描述 :向端口發送數據,請在調用此方法前 先選擇端口,並確定SerialPort正常打開!

        * @返回值類型 :void

        *    @param message

        * @throws IOException

      */

      public void write(String message) throws InterruptedException

      {

            checkPort();

            try

            {

                  outputStream = new BufferedOutputStream(serialPort.getOutputStream());

                  outputStream.write(message.getBytes());

                  outputStream.close();

            }

            catch(Exception e)

            {

                  throw new RuntimeException("向端口發送信息時出錯:"+e.getMessage());

            }

      }

     

      /**

        * @方法名稱 :startRead

        * @功能描述 :開始監聽從端口中接收的數據

        * @返回值類型 :void

        *    @param time  監聽程序時間,單位爲秒,0 則是一直監聽

      */

      public void startRead(int time)

      {

          checkPort();

          try

          {

             inputStream = new BufferedInputStream(serialPort.getInputStream());

          }

          catch(IOException e)

          {

             throw new RuntimeException("獲取端口的InputStream出錯:"+e.getMessage());

          }

       

          try

        {

             serialPort.addEventListener(this);

            

             // 設置可監聽

             serialPort.notifyOnDataAvailable(true);

       

           serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);

          }

        catch(TooManyListenersException e)

        {

             //端口監聽者過多;  

           throw new RuntimeException(e.getMessage());

          }

        catch (UnsupportedCommOperationException e)

        {

             //"端口操作命令不支持";  

           e.printStackTrace();

        }

       

        /* 關閉監聽 */

          if(time>0)

          {

              this.threadTime = time*1000;

              Thread t = new Thread(this);

              t.start();

          } 

      }       

     

      /**

        * @方法名稱 :close

      * @功能描述 :關閉 SerialPort

      * @返回值類型 :void

      */

      public void close()

      {

          serialPort.close();

          serialPort = null;

          commPort = null;

      }

 

      @Override

      public void serialEvent(SerialPortEvent arg0)

      {

            switch (arg0.getEventType())

            {

            case SerialPortEvent.BI:/* Break interrupt,通訊中斷 */

            case SerialPortEvent.OE:/* Overrun error,溢位錯誤 */

            case SerialPortEvent.FE:/* Framing error,傳幀錯誤 */

            case SerialPortEvent.PE:/* Parity error,校驗錯誤 */

            case SerialPortEvent.CD:/* Carrier detect,載波檢測 */

            case SerialPortEvent.CTS:/* Clear to send,清除發送 */

            case SerialPortEvent.DSR:/* Data set ready,數據設備就緒 */

            case SerialPortEvent.RI:/* Ring indicator,響鈴指示 */

            case SerialPortEvent.OUTPUT_BUFFER_EMPTY:/* Output buffer is empty,輸出緩衝區清空 */

                  break;

            case SerialPortEvent.DATA_AVAILABLE:/* Data available at the serial port,端口有可用數據。讀到緩衝數組,輸出到終端 */

                  byte[] readBuffer = new byte[1024];

                  String readStr = "";

                  String s2 = "";

                  try

                  {

                       while (inputStream.available() > 0)

                       {

                             inputStream.read(readBuffer);

                             readStr += new String(readBuffer,"UTF-8").trim();

                       }

                      

                       //System.out.println("接收到端口返回數據(長度爲" + readStr.length() + "):" + readStr);

                     

                       if(readStr.length()>=4)

                       {

                             System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+"溫度:"+new String(readStr.getBytes(),"UTF-8"));

                       }

                  }

                  catch (IOException e)

                  {

                       throw new RuntimeException(e.getMessage());

                  }

            }

      }

 

      @Override

      public void run()

      {

            try

            {

                  Thread.sleep(threadTime);

                  serialPort.close();

                  System.out.println(String.format("端口'%1$s'監聽關閉了!", commPort.getName()));

            }

            catch(Exception e)

            {

                  e.printStackTrace();

            }

      }

     

      /**

        * 測試

        * */

      public static void main(String[] args) throws Exception

      {

            DHTSerialPortListener sp = new DHTSerialPortListener();

           

            //列出所有端口

            sp.listPort();

           

            //打開相應端口

            sp.openPort("COM3");

           

            //設置爲一直監聽

            sp.startRead(0);

           

            //首次連接後需暫停5秒再繼續執行否則數據會有問題

            Thread.sleep(5000);

      }

}

 

Java和PT550亮度檢測器串口通信:

package com.kingtake.common.rxtx.util;

 

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.nio.charset.Charset;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.Enumeration;

import java.util.TooManyListenersException;

 

import gnu.io.CommPortIdentifier;

import gnu.io.PortInUseException;

import gnu.io.SerialPort;

import gnu.io.SerialPortEvent;

import gnu.io.SerialPortEventListener;

import gnu.io.UnsupportedCommOperationException;

 

public class PTSerialPortListener implements Runnable, SerialPortEventListener {

      private String appName = "串口通訊";

      private int timeout = 2000;// open 端口時的等待時間

      private int threadTime = 0;

 

      private CommPortIdentifier commPort;

      private SerialPort serialPort;

      private InputStream inputStream;

      private OutputStream outputStream;

 

      @SuppressWarnings("restriction")

      public void listPort()

      {

            CommPortIdentifier cpid;// 當前串口對象

            Enumeration en = CommPortIdentifier.getPortIdentifiers();

            System.out.print("列出所有端口:");

            while (en.hasMoreElements())

            {

                  cpid = (CommPortIdentifier) en.nextElement();

 

                  // 檢測端口類型是否爲串口

                  if (cpid.getPortType() == CommPortIdentifier.PORT_SERIAL)

                  {

                       System.out.println(cpid.getName() + ", " + cpid.getCurrentOwner());

                  }

            }

      }

 

      /**

       *   * @方法名稱 :openPort   * @功能描述 :選擇一個端口,比如:COM1 並實例 SerialPort   * @返回值類型 :void

       *   * @param portName

       */

      private void openPort(String portName)

      {

            // TODO TCF 打開指定串口

            this.commPort = null;

            CommPortIdentifier cpid;

            Enumeration en = CommPortIdentifier.getPortIdentifiers();

 

            while (en.hasMoreElements())

            {

                  cpid = (CommPortIdentifier) en.nextElement();

                  if (cpid.getPortType() == CommPortIdentifier.PORT_SERIAL && cpid.getName().equals(portName))

                  {

                       this.commPort = cpid;

                        break;

                  }

            }

 

            /* 實例 SerialPort */

            if (commPort == null)

            {

                  System.out.println(String.format("無法找到名字爲'%1$s'的串口!", portName));

            }

            else

            {

                  try

                  {

                       // 應用程序名【隨意命名】,等待的毫秒數

                       serialPort = (SerialPort) commPort.open(appName, timeout);

                  }

                  catch (PortInUseException e)

                  {

                       // 端口已經被佔用

                       throw new RuntimeException(String.format("端口'%1$s'正在使用中!", commPort.getName()));

                  }

            }

      }

     

      /**

        * @方法名稱 :checkPort

        * @功能描述 :檢查端口是否正確連接

        * @返回值類型 :void

      */

      private void checkPort()

      {

          if(commPort == null)

          {

                throw new RuntimeException("沒有選擇端口,請使用 " +"selectPort(String portName) 方法選擇端口");

          }

       

 

            if (serialPort == null)

            {

                  throw new RuntimeException("SerialPort 對象無效!");

            }

      }

     

      /**

        * @方法名稱 :write

        * @功能描述 :向端口發送數據,請在調用此方法前 先選擇端口,並確定SerialPort正常打開!

        * @返回值類型 :void

        *    @param message

        * @throws IOException

      */

      public void write(String message) throws InterruptedException

      {

            checkPort();

            try

            {

                  outputStream = new BufferedOutputStream(serialPort.getOutputStream());

                  outputStream.write(message.getBytes());

                  outputStream.close();

            }

            catch(Exception e)

            {

                  throw new RuntimeException("向端口發送信息時出錯:"+e.getMessage());

            }

      }

     

      /**

        * @方法名稱 :startRead

        * @功能描述 :開始監聽從端口中接收的數據

        * @返回值類型 :void

        *    @param time  監聽程序時間,單位爲秒,0 則是一直監聽

      */

      public void startRead(int time)

      {

          checkPort();

          try

          {

             inputStream = new BufferedInputStream(serialPort.getInputStream());

          }

          catch(IOException e)

          {

             throw new RuntimeException("獲取端口的InputStream出錯:"+e.getMessage());

          }

       

          try

        {

             serialPort.addEventListener(this);

            

             // 設置可監聽

             serialPort.notifyOnDataAvailable(true);

       

           serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);

          }

        catch(TooManyListenersException e)

        {

             //端口監聽者過多;  

           throw new RuntimeException(e.getMessage());

          }

        catch (UnsupportedCommOperationException e)

        {

             //"端口操作命令不支持";  

           e.printStackTrace();

        }

       

        /* 關閉監聽 */

          if(time>0)

          {

              this.threadTime = time*1000;

              Thread t = new Thread(this);

              t.start();

          } 

      }       

     

      /**

        * @方法名稱 :close

      * @功能描述 :關閉 SerialPort

      * @返回值類型 :void

      */

      public void close()

      {

          serialPort.close();

          serialPort = null;

          commPort = null;

      }

 

      @Override

      public void serialEvent(SerialPortEvent arg0)

      {

            switch (arg0.getEventType())

            {

            case SerialPortEvent.BI:/* Break interrupt,通訊中斷 */

            case SerialPortEvent.OE:/* Overrun error,溢位錯誤 */

            case SerialPortEvent.FE:/* Framing error,傳幀錯誤 */

            case SerialPortEvent.PE:/* Parity error,校驗錯誤 */

            case SerialPortEvent.CD:/* Carrier detect,載波檢測 */

            case SerialPortEvent.CTS:/* Clear to send,清除發送 */

            case SerialPortEvent.DSR:/* Data set ready,數據設備就緒 */

            case SerialPortEvent.RI:/* Ring indicator,響鈴指示 */

            case SerialPortEvent.OUTPUT_BUFFER_EMPTY:/* Output buffer is empty,輸出緩衝區清空 */

                  break;

            case SerialPortEvent.DATA_AVAILABLE:/* Data available at the serial port,端口有可用數據。讀到緩衝數組,輸出到終端 */

                  byte[] readBuffer = new byte[1024];

                  String readStr = "";

                  String s2 = "";

                  try

                  {

                       while (inputStream.available() > 0)

                       {

                             inputStream.read(readBuffer);

                             readStr += new String(readBuffer,"UTF-8").trim();

                       }

                      

                       //System.out.println("接收到端口返回數據(長度爲" + readStr.length() + "):" + readStr);

                     

                       if(readStr.length()>=3)

                       {

                             System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+"亮度:"+new String(readStr.getBytes(),"UTF-8"));

                       }

                  }

                  catch (IOException e)

                  {

                       throw new RuntimeException(e.getMessage());

                  }

            }

      }

 

      @Override

      public void run()

      {

            try

            {

                  Thread.sleep(threadTime);

                  serialPort.close();

                  System.out.println(String.format("端口'%1$s'監聽關閉了!", commPort.getName()));

            }

            catch(Exception e)

            {

                  e.printStackTrace();

            }

      }

     

      /**

        * 測試

        * */

      public static void main(String[] args) throws Exception

      {

            PTSerialPortListener sp = new PTSerialPortListener();

           

            //列出所有端口

            sp.listPort();

           

            //打開相應端口

            sp.openPort("COM3");

           

            //設置爲一直監聽

            sp.startRead(0);

           

            //首次連接後需暫停1秒再繼續執行否則數據會有問題

            Thread.sleep(1000);

      }

}

 

3.Java對接百度雲平臺的人臉活體檢測

package com.kingtake.gacp.common.util;

 

import org.springframework.boot.context.properties.ConfigurationProperties;

 

import com.baidu.aip.face.AipFace;

 

@ConfigurationProperties(prefix="baidu")

public class AipFaceUtil {

 

     //TODO TCF 百度雲配置項

     //appId

     private static String appId="16304725";

    

     //apiKey

     private static String apiKey="I6BPAytoqc7kw5LdWqca3pRN";

    

     //secretKey

     private static String secretKey="frtmb1IhapyYONzN6ecOBqz2VdNaFx8F";

    

     //TODO TCF 核心控制器AipFace,單例

     private static AipFace client;

    

     public static AipFace getInstance()

     {

           if(client==null)

           {

                client=new AipFace(appId, apiKey, secretKey);

               

                // 可選:設置網絡連接參數

             client.setConnectionTimeoutInMillis(2000);

             client.setSocketTimeoutInMillis(60000);

           }

          

           return client;

     }

}

 

//TODO TCF 校驗身份證號唯一、人證合一

     @RequestMapping("/checkPeopleCard.do")

     @ResponseBody

     public Map checkPeopleCard(HttpServletRequest request) throws JSONException

     {

           Map<String,Object> map=new HashMap<String,Object>();

          

           //TODO TCF 身份證號

           String idCardNumber=request.getParameter("idCardNumber");

          

           //TODO TCF 人臉識別照片BASE64

           String photoPicPath=request.getParameter("photoPicPath");

          

           //TODO TCF 身份證照片BASE64

           String userPhoto=request.getParameter("userPhoto");

          

           //TODO TCF 編輯的用戶id

           String accountId=request.getParameter("accountId");

          

           //TODO TCF 校驗身份證號唯一

           Map<String,Object> findMap=new HashMap<String,Object>();

           findMap.put("fieldName","idCardNumber");

           findMap.put("fieldValue",idCardNumber);

          

           if(StringUtil.isNotEmpty(accountId))

           {

                findMap.put("accountId",accountId);

           }

          

           Integer count=sysAccountService.checkFieldValueExists(findMap);

           if(count!=null && count.intValue()>0)

           {

                map.put("success",false);

                map.put("message","身份證號已存在");

           }

           else

           {

                //TODO TCF 校驗是否人證合一

                AipFace client=AipFaceUtil.getInstance();

               

                if(client!=null)

                {

                      ArrayList<MatchRequest> matchList=new ArrayList<MatchRequest>();

                      if(StringUtils.isNotEmpty(photoPicPath) && StringUtil.isNotEmpty(userPhoto)

                        && photoPicPath.length()>=22 && userPhoto.length()>=22)

                      {

                      photoPicPath=photoPicPath.substring(22);

                            userPhoto=userPhoto.substring(22);

                           

                            MatchRequest request1=new MatchRequest(photoPicPath,"BASE64");

                            MatchRequest request2=new MatchRequest(userPhoto,"BASE64");

                           

                            matchList.add(request1);//人臉識別採集照片BASE64

                            matchList.add(request2);//身份證照片BASE64

 

                          JSONObject jsonObject=client.match(matchList);

                          if(jsonObject!=null)

                          {

                              try

                              {

                                    JSONObject result=jsonObject.getJSONObject("result");

                                    if(result!=null)

                                    {

                                          double score=result.getDouble("score");

                                          if(score>=60)

                                          {

                                                map.put("success",true);

                                          }

                                          else

                                          {

                                                map.put("success",false);

                                                map.put("message","人臉識別和身份證照片不是同一用戶");

                                          }

                                    }

                              }

                              catch(Exception e)

                              {

                                    map.put("success",false);

                                    map.put("message","人臉識別和身份證照片不是同一用戶");

                              }

                          }

                      }

                      else

                      {

                            map.put("success",false);

                            map.put("message","照片採集失敗");

                      }

                }

           }

          

           return map;

     }

    

     //TODO TCF 校驗抓拍照片是否和當前用戶已存照片匹配

     @RequestMapping("/checkFirstPhoto.do")

     @ResponseBody

     public Map checkFirstPhoto(HttpServletRequest request) throws JSONException

     {

           Map<String,Object> map=new HashMap<String,Object>();

          

           //TODO TCF 用戶賬戶ID

           String accountId=request.getParameter("accountId");

          

           //TODO TCF 用戶ID

           String userId=request.getParameter("userId");

          

           //TODO TCF 抓拍圖片BASE64

           String cameraPhotoPath=request.getParameter("cameraPhotoPath");

          

           SysAccount sysAccount=new SysAccount();

           if(StringUtil.isNotEmpty(accountId))

           {

           sysAccount=sysAccountService.selectByPrimaryKey(accountId);

           }

          

           if(StringUtil.isNotEmpty(userId))

           {

           sysAccount=sysAccountService.selectByUserId(userId);

           }

          

           //TODO TCF 當前用戶已保存的人臉照片BASE64

           String photoPicPath=sysAccount.getPhotoPicPath();

           if(StringUtil.isNotEmpty(photoPicPath) && photoPicPath.length()>=22)

           {

                photoPicPath=photoPicPath.substring(22);

               

                //TODO TCF 編輯用戶信息,比對照片

                if(StringUtil.isNotEmpty(cameraPhotoPath) && cameraPhotoPath.length()>=22)

                {

                cameraPhotoPath=cameraPhotoPath.substring(22);

                     

                      ArrayList<MatchRequest> requests=new ArrayList<MatchRequest>();

                      MatchRequest request1=new MatchRequest(cameraPhotoPath,"BASE64");

                      MatchRequest request2=new MatchRequest(photoPicPath,"BASE64");

                      requests.add(request1);

                      requests.add(request2);

               

                    AipFace client=AipFaceUtil.getInstance();

                    if(client!=null)

                    {

                        JSONObject jsonObject=client.match(requests);

                        if(jsonObject!=null)

                        {

                              try

                              {

                                    JSONObject result=jsonObject.getJSONObject("result");

                                    if(result!=null)

                                    {

                                          double score=result.getDouble("score");

                                          if(score>=80)

                                          {

                                                map.put("success",true);

                                          }

                                          else

                                          {

                                                map.put("success",false);

                                                map.put("message","非法操作【不是當前用戶本人】");

                                          }

                                    }

                              }

                              catch(Exception e)

                              {

                                    map.put("success",false);

                                    map.put("message","非法操作【照片採集失敗,請閱讀下方提示後重試】");

                              }

                        }

                    }

                }

           }

           else

           {

                //TODO TCF 新增用戶信息

                map.put("success",true);

           }

          

           return map;

     }

    

     //TODO TCF 根據用戶id比對人臉庫圖片和本次抓拍圖片

     @RequestMapping("/checkFacePhoto.do")

     @ResponseBody

     public Map checkFasePhoto(HttpServletRequest request)

     {

           Map<String,Object> map=new HashMap<String,Object>();

          

           //TODO TCF 當前用戶id

           String userId=request.getParameter("userId");

    

         //TODO TCF 本次抓拍圖片BASE64

           String cameraPhotoPath=request.getParameter("cameraPhotoPath");

          

           if(StringUtil.isNotEmpty(userId))

           {

                SysAccount sysAccount=sysAccountService.selectByUserId(userId);

               

                if(sysAccount!=null)

                {

                      if(StringUtil.isNotEmpty(cameraPhotoPath) && cameraPhotoPath.length()>=22)

                      {

                      cameraPhotoPath=cameraPhotoPath.substring(22);

                      }

                     

                      String photoPicPath=sysAccount.getPhotoPicPath();

                      if(StringUtil.isNotEmpty(photoPicPath) && photoPicPath.length()>=22)

                      {

                      photoPicPath=photoPicPath.substring(22);

                           

                            ArrayList<MatchRequest> requests=new ArrayList<MatchRequest>();

                     

                            MatchRequest request1=new MatchRequest(photoPicPath,"BASE64");

                            MatchRequest request2=new MatchRequest(cameraPhotoPath,"BASE64");

                            requests.add(request1);

                            requests.add(request2);

                           

                            AipFace client=AipFaceUtil.getInstance();

                            if(client!=null)

                            {

                                  JSONObject jsonObject=client.match(requests);

                                  if(jsonObject!=null)

                                  {

                                        try

                                        {

                                              JSONObject result=jsonObject.getJSONObject("result");

                                              if(result!=null)

                                              {

                                                   double score=result.getDouble("score");

                                                   if(score>=80)

                                                   {

                                                         map.put("success",true);

                                                   }

                                                   else

                                                   {

                                                         map.put("success",false);

                                                         map.put("message","人臉識別校驗失敗");

                                                   }

                                              }

                                        }

                                        catch(Exception e)

                                        {

                                              map.put("success",false);

                                              map.put("message","人臉識別校驗失敗");

                                        }

                                  }

                            }

                      }

                      else

                      {

                            map.put("success",false);

                            map.put("message","人臉識別校驗失敗");

                      }

                }

           }

          

           return map;

     }

    

     //TODO TCF 根據用戶id校驗身份證號是否和刷的身份證證件號碼匹配

     @RequestMapping("/checkIdCardNumber.do")

     @ResponseBody

     public Map checkIdCardNumber(HttpServletRequest request)

     {

           Map<String,Object> map=new HashMap<String,Object>();

          

           //TODO TCF 當前用戶id

           String userId=request.getParameter("userId");

          

           //TODO TCF 刷的身份證號碼

           String idCardNumber=request.getParameter("idCardNumber");

          

           if(StringUtil.isNotEmpty(userId))

           {

                SysAccount sysAccount=sysAccountService.selectByUserId(userId);

               

                if(sysAccount!=null)

                {

                      //TODO TCF 用戶登記時錄入的身份證號

                      String cardNumber=sysAccount.getIdCardNumber();

                     

                      if(StringUtil.isNotEmpty(cardNumber) && StringUtil.isNotEmpty(idCardNumber))

                      {

                      if(cardNumber.trim().equals(idCardNumber.trim()))

                            {

                                  map.put("success",true);

                            }

                            else

                            {

                                  map.put("success",false);

                                  map.put("message","【身份證和當前用戶本人不匹配】校驗失敗");

                            }

                      }

                      else

                      {

                            map.put("success",false);

                            map.put("message","【身份證和當前用戶本人不匹配】校驗失敗");

                      }

                }

           }

          

           return map;

     }

    

//TODO TCF 根據用戶id查詢用戶賬戶信息,用於指紋校驗

     @RequestMapping("/selectByUserId.do")

     @ResponseBody

     public SysAccount selectByUserId(HttpServletRequest request)

     {

           //TODO TCF 當前用戶id

           String userId=request.getParameter("userId");

          

           return sysAccountService.selectByUserId(userId);

}

 

 

4.對接秒滴雲平臺的發送短信接口調用代碼

package com.kingtake.common.miaodiyun;

 

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.net.HttpURLConnection;

import java.net.URL;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

import java.text.SimpleDateFormat;

import java.util.Date;

 

import org.json.JSONException;

import org.json.JSONObject;

/**

 *

 * @Title:GetMessageCode

 * @author TCF

 * @Description:發送驗證碼

 */

public class GetMessageCode {

     private static final String QUERY_PATH="https://api.miaodiyun.com/20150822/industrySMS/sendSMS";

     private static final String ACCOUNT_SID="a9c07995abc648c98edb12d5f15bd651";

     private static final String AUTH_TOKEN="94da4ab341c94ebd9f0c213677510e0b";

    

     //根據相應的手機號發送驗證碼

     public static String getCode(String phone) throws JSONException{

           String rod=smsCode();

           String timestamp=getTimestamp();

           String sig=getMD5(ACCOUNT_SID,AUTH_TOKEN,timestamp);

           String tamp="【軍區物資業務平臺】您的驗證碼爲”+rod+”,請於2分鐘內正確輸入,如非本人操作,請忽略此短信。";

           OutputStreamWriter out=null;

           BufferedReader br=null;

           StringBuilder result=new StringBuilder();

           try {

                URL url=new URL(QUERY_PATH);

                HttpURLConnection connection=(HttpURLConnection) url.openConnection();

                connection.setRequestMethod("POST");

                connection.setDoInput(true);//設置是否允許數據寫入

                connection.setDoOutput(true);//設置是否允許參數數據輸出

                connection.setConnectTimeout(5000);//設置鏈接響應時間

                connection.setReadTimeout(10000);//設置參數讀取時間

                connection.setRequestProperty("Content-type","application/x-www-form-urlencoded");            

                //提交請求

                out=new OutputStreamWriter(connection.getOutputStream(),"UTF-8");

                String args=getQueryArgs(ACCOUNT_SID, tamp, phone, timestamp, sig, "JSON");

                out.write(args);

                out.flush();

                //讀取返回參數

               

                br=new BufferedReader(new InputStreamReader(connection.getInputStream(),"UTF-8"));

                String temp="";

                while((temp=br.readLine())!=null){

                      result.append(temp);

                }

           } catch (Exception e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

           }

           JSONObject json=new JSONObject(result.toString());

           String respCode=json.getString("respCode");

           String defaultRespCode="00000";

           if(defaultRespCode.equals(respCode)){

                 return "256585";

           }else{

                return "256585";                

           }

     }

     //定義一個請求參數拼接方法

     public static String getQueryArgs(String accountSid,String smsContent,String to,String timestamp,String sig,String respDataType){

           return "accountSid="+accountSid+"&smsContent="+smsContent+"&to="+to+"&timestamp="+timestamp+"&sig="+sig+"&respDataType="+respDataType;

     }

     //獲取時間戳

     public static String getTimestamp(){

           return new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());

     }

     //sing簽名

     public static String getMD5(String sid,String token,String timestamp){

          

           StringBuilder result=new StringBuilder();

           String source=sid+token+timestamp;

           //獲取某個類的實例

                      try {                           

                         MessageDigest digest=MessageDigest.getInstance("MD5");

                         //要進行加密的東西

                         byte[] bytes=digest.digest(source.getBytes());

                         for(byte b:bytes){

                               String hex=Integer.toHexString(b&0xff);

                               if(hex.length()==1){

                                     result.append("0"+hex);

                               }else{

                                     result.append(hex);

                               }

                         }

                      } catch (NoSuchAlgorithmException e) {

                            // TODO Auto-generated catch block

                            e.printStackTrace();

                      }

                     

          

           return result.toString();

     }

     //創建驗證碼

     public static String smsCode(){

           String random=(int)((Math.random()*9+1)*100000)+"";        

           return random;

     }

}

 

//TODO TCF 二級安全校驗:通過用戶ID給用戶註冊時登記的手機號發短信驗證碼

     @RequestMapping("/sendMessageByUserId.do")

     @ResponseBody

     public Map sendMessageByUserId(HttpServletRequest request)

     {

           Map<String,Object> map=new HashMap<String,Object>();

          

           //TODO TCF 用戶id

           String userId=request.getParameter("userId");

          

           if(StringUtil.isNotEmpty(userId))

           {

                SysAccount sysAccount=sysAccountService.selectByUserId(userId);

               

                if(sysAccount!=null)

                {

                      String phoneNumber=sysAccount.getMobilephone();

                     

                      if(StringUtil.isNotEmpty(phoneNumber) && phoneNumber.length()==11)

                      {

                            try

                            {

                                  String code = GetMessageCode.getCode(phoneNumber);

 

                                  map.put("success", true);

                                  map.put("message", "發送成功");

                                  map.put("code", code);

                            }

                            catch (Exception e)

                            {

                                  e.printStackTrace();

                                  map.put("success", false);

                                  map.put("message", "發送失敗");

                            }

                      }

                }

           }

          

           return map;

     }

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章