JPEG Camer 图片上传

JPEG Camer 图片上传
/* Linksprite */



#include <SoftwareSerial.h>

#include <Ethernet.h>

#include <SPI.h>

#define ReadLen 0x30



byte mac[] = { 0xDE, 0xAC, 0xEA, 0xEF, 0xFF, 0xE2 };

// if you don't want to use DNS (and reduce your sketch size)

// use the numeric IP instead of the name for the server:

//IPAddress server(74,125,232,128);  // numeric IP for Google (no DNS)

char server[] = "192.168.9.6";    // name address for Google (using DNS)

char HexTable[] = "0123456789ABCDEF";

// Set the static IP address to use if the DHCP fails to assign

IPAddress ip(192,168,16,121);

IPAddress gateway(192,168,1,1);

IPAddress dns_server(60,191,134,196);

IPAddress subnet(255,255,0,0);

// Initialize the Ethernet client library

// with the IP address and port of the server 

// that you want to connect to (port 80 is default for HTTP):

EthernetClient client;



byte incomingbyte;

SoftwareSerial mySerial(4,5);                     //Configure pin 4 and 5 as soft serial port

int a=0x0000,j=0,k=0,count=0;                    //Read Starting address       

uint8_t MH,ML;

boolean EndFlag=0;

int errCount=0;

int led=8;



                               

void SendResetCmd();

void SendTakePhotoCmd();

void SendReadDataCmd();

void StopTakePhotoCmd();

void httpRequest(byte bytes[]);



void setup()

{ 

  Serial.begin(9600);

  mySerial.begin(38400);



  if (Ethernet.begin(mac) == 0) {

    Serial.println("Failed to configure Ethernet using DHCP");

    Ethernet.begin(mac, ip,dns_server,gateway,subnet);

  }

  

                             

  setImgSize();

  delay(1000);

  readEcho(false);

  Serial.println("Ready");

}



void loop() 

{



     SendResetCmd();

     delay(2000);//After reset, wait 2-3 second to send take picture command

     EndFlag=0;

     a=0x0000;j=0;k=0; count=0;  

     MH=0;ML=0;

     SendTakePhotoCmd();

     readEcho(false); 

      byte a[ReadLen];

      while(!EndFlag)

      {  

         j=0;

         k=0;

         count=0;

         SendReadDataCmd();

         delay(25);

    

          while(mySerial.available()>0)

          {

               incomingbyte=mySerial.read();

               k++;

               if((k>5)&&(j<ReadLen)&&(!EndFlag))

               {

                 a[j]=incomingbyte;

                 if((a[j-1]==0xFF)&&(a[j]==0xD9)){      //Check if the picture is over

                  EndFlag=1;

                  StopTakePhotoCmd(); 

                  readEcho(false); 

                 }                  

                 j++;

             count++;

               }

          }

//         for(j=0;j<count;j++)

//         {   if(a[j]<10)

//             Serial.print("00");

//             if(a[j]>=10 && a[j]<100)

//              Serial.print("0");

//             Serial.print(a[j]);

//             Serial.print(" ");

//         }                                       //Send jpeg picture over the serial port

//        Serial.println();

          

          while(!client.connected()){

             byte aa[]={0,0,0};

             httpRequest(aa,3);

          }

          httpRequest(a,count);

//          for(j=0;j<count;j++)

//          {   if(a[j]<0x10)

//              Serial.print("0");

//              Serial.print(a[j],HEX);

//              Serial.print(" ");

//          }                                       //Send jpeg picture over the serial port

//          Serial.println();

      }      

    // delay(30000);

}



//==============byte to hex string===============

 String toHex(byte bs[],int count){

  String bundle="";

   for(int i=0;i<count;i++){

     bundle += (String)( HexTable[ bs[i] / 16]) + (String)( HexTable[bs[i] % 16]);

     

   }

   return bundle;

}

//==============End byte to hex string=============



//================Http Request Code========================

void httpRequest(byte bytes[],int count){

    // if you get a connection, report back via serial:

 

  if(!client.connected()){

     Serial.println("disconnecting.");

     client.stop();

     if (client.connect(server, 7896)) {

        Serial.println("connected");

     }else{

     // kf you didn't get a connection to the server:

        Serial.println("connection failed"); 

        errCount++;

        if(errCount>=3){

          digitalWrite(led,HIGH);

          delay(1000);

        } 

    }

  } else{

       

    String bundle=toHex(bytes,count);

    //Serial.println(bundle);

    client.println("GET /main.ashx?m=img&mil=" + String(millis()) + "&b="+ bundle  +" HTTP/1.1");

    client.println("Host:192.168.9.6");

    //client.println("Connection: close");



    client.println();

    delay(10);

    String reply="";

    // if there are incoming bytes available 

    // from the server, read them and print them:

    while (client.available()) {

      char c = client.read();

      reply+=c;

      

    }



    //Serial.println(reply);

    if(reply.indexOf("\"Model\":\"OPEN\"")>=0){

      Serial.println("OPEN");

     

    }

    if(reply.indexOf("\"Model\":\"CLOSE\"")>=0){

      Serial.println("CLOSE");

        

    }

    errCount=0;

    

    //wdt_reset();

  }



  



}

//================End Http Request Code===============





void readEcho(bool show){

 while(mySerial.available()>0){

   char c=mySerial.read();

   if(show){

   Serial.print(c);

   }

 }

}

//160 * 120

void setImgSize(){

  mySerial.write(0x56);

  mySerial.write((byte)0x00);

  mySerial.write(0x31);

  mySerial.write(0x05);

  mySerial.write(0x04);

  mySerial.write(0x01);

  mySerial.write((byte)0x00);

  mySerial.write(0x19);

  mySerial.write(0x22);

  

}

//Send Reset command

void SendResetCmd()

{

      mySerial.write(0x56);

      mySerial.write((byte)0x00);

      mySerial.write(0x26);

      mySerial.write((byte)0x00);

}



//Send take picture command

void SendTakePhotoCmd()

{

      mySerial.write(0x56);

      mySerial.write((byte)0x00);

      mySerial.write(0x36);

      mySerial.write(0x01);

      mySerial.write((byte)0x00);

}



//Read data

void SendReadDataCmd()

{

      MH=a/0x100;

      ML=a%0x100;

      mySerial.write(0x56);

      mySerial.write((byte)0x00);

      mySerial.write(0x32);

      mySerial.write(0x0c);

      mySerial.write((byte)0x00);

      mySerial.write(0x0a);

      mySerial.write((byte)0x00);

      mySerial.write((byte)0x00);

      mySerial.write(MH);

      mySerial.write(ML);  

      mySerial.write((byte)0x00);

      mySerial.write((byte)0x00);

      mySerial.write((byte)0x00);

      mySerial.write(ReadLen);

      mySerial.write((byte)0x00);

      mySerial.write(0x0a);

      a+=ReadLen;                            //address increases 32,set according to buffer size

}



void StopTakePhotoCmd()

{

      mySerial.write(0x56);

      mySerial.write((byte)0x00);

      mySerial.write(0x36);

      mySerial.write(0x01);

      mySerial.write(0x03);       

}
View Code
JPEG Camer 图片上传
using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Collections.Concurrent;

using System.Threading;

namespace ColorRecognition.JPEGCamera

{

    public class JPEGCameraRecord

    {

        private  static long GRecId = 0;



        private static int C_MAXLen = 100;

        private static int C_ShrinkageLen = 60;

        private List<byte> Bytes { get; set; } //正在收集的图片(单张)

        private Queue<byte[]> Queue { get; set; } //已经收集的图片集合

        private DateTime? BTime { get; set; }

        private DateTime? ETime { get; set; }

        public Queue<int> SpeedQueue = new Queue<int>();

        public string IP { get; set; }

        public long? LastClientMillis { get; set; }

        public DateTime? LastEditTime { get; set; }

        public long RecId { get; set; }

        /// <summary>

        /// 上传一张要多少秒

        /// </summary>

        public int? Speed { get; set; }



        public void ConcatImg(byte[] bytes)

        {

            lock (this)

            {

                #region

                if (bytes.Length >= 2)

                {

                    if (bytes[0] == 0xFF && bytes[1] == 0xD8)

                    {

                        

                        //开始

                        Bytes.Clear();

                        Bytes = new List<byte>();

                        Bytes.AddRange(bytes);

                        BTime = DateTime.Now;

                    }

                    else if (bytes[bytes.Length - 2] == 0xFF && bytes[bytes.Length - 1] == 0xD9)

                    {

                        //结束

                        Bytes.AddRange(bytes);

                        Queue.Enqueue(Bytes.ToArray());

                        Bytes.Clear();

                        Bytes = new List<byte>();

                        if (Queue.Count >= C_MAXLen)

                        {

                            byte[] r = null;

                            while (Queue.Count > C_ShrinkageLen)

                            {

                                Queue.Dequeue();

                            }

                        }

                        ETime = DateTime.Now;

                        var due =(int)((TimeSpan) (ETime - BTime)).TotalSeconds;

                        SpeedQueue.Enqueue(due);

                        if (SpeedQueue.Count >=5)

                        {

                            SpeedQueue.Dequeue();

                        }

                        Speed=(int) SpeedQueue.Average();

                    }

                    else

                    {

                        if (Bytes.Count > 0)

                        {

                            Bytes.AddRange(bytes);

                        }

                        if (Bytes.Count > 1024 * 1024 * 10) //丢弃超过10M的图片

                        {

                            Bytes.Clear();

                            Bytes = new List<byte>();

                        }

                    }



                }

                #endregion

            }

        }

        public List<byte[]> GetImages()

        {

            lock (this)

            {

                var list = new List<byte[]>();

                foreach (var img in Queue)

                {

                    list.Add(img);

                }

                return list;

            }

        }

        public JPEGCameraRecord()

        {

            Bytes = new List<byte>();

            Queue = new Queue<byte[]>();

            Interlocked.Increment(ref GRecId);

            RecId = GRecId;

        }

        public long? BufferLen

        {

            get

            {

                lock (this)

                {

                    return Bytes.Count;

                }

            }

        }

        public long? ImageCount

        {

            get

            {

                lock (this)

                {

                    return Queue.Count;

                }

            }

        }

        

    }

    public class JPEGCameraRecordMgr

    {

        private static int C_MAXLen = 200;

        private static int C_ShrinkageLen = 120;

        public readonly static ConcurrentQueue<JPEGCameraRecord> Queue = new ConcurrentQueue<JPEGCameraRecord>();

        public static void Add(byte[] bytes, string ip, long? clientMillis)

        {

            var it = Queue.FirstOrDefault(ent => string.Compare(ent.IP , ip,true)==0);

            if (it == null)

            {

                var record = new JPEGCameraRecord();

                record.IP = ip;

                Queue.Enqueue(record);



                if (Queue.Count > C_MAXLen)

                {

                    JPEGCameraRecord r=null;

                    while (Queue.Count >= C_ShrinkageLen)

                    {

                        Queue.TryDequeue(out r);

                    }

                }

                it = record;

            }

            it.LastClientMillis = clientMillis;

            it.LastEditTime = DateTime.Now;

            it.ConcatImg(bytes);

        }

       



    }

}
View Code
JPEG Camer 图片上传
using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Web;



namespace ColorRecognition.JPEGCamera

{

    public class CameraHttpHandle:IHttpHandler

    {

        public HttpRequest Request { get; set; }

        public HttpResponse Response { get; set; }

        public void ProcessRequest(HttpContext context)

        {



            Request = context.Request;

            Response = context.Response;



            Response.ContentType = "text/plain";

            Response.Expires = -1;



            var response = new ResponseBase<String>() { Code = 1 };

            try

            {

                var method = Request["m"];

                if (string.Compare(method, "img", true) == 0)

                {

                    DoCollect();

                }

                else

                {

                    throw new Exception("未知道的方法");

                }



                response.Code = 0;

                response.Msg = "OK";



            }

            catch (Exception ex)

            {

                response.Code = -1;

                response.Msg = ex.Message;

                

            }



            Response.Write(this.ToJson(response));





        }

        public virtual void  DoCollect()

        {

            long? millis = this.TryParser<long?>(Request["mil"], 0);

            var imgSegment = Request["b"];

            var ip = this.GetClientIP();

            if (!string.IsNullOrWhiteSpace(imgSegment))

            {

                var bytes=new byte[imgSegment.Length/2];

                int j = 0;

                for(int i=0;i<imgSegment.Length;i+=2){

                    var v = imgSegment.Substring(i, 2);

                    bytes[j] = byte.Parse(v,System.Globalization.NumberStyles.HexNumber);

                    j++;

                }

                JPEGCameraRecordMgr.Add(bytes, ip, millis);

            }

        }



        public bool IsReusable

        {

            get { return false; }

        }

    }

}
View Code

 //调整后Arduino端

JPEG Camer 图片上传
/* Linksprite */

#include <avr/io.h>

#include <avr/wdt.h>  

#include <SoftwareSerial.h>

#include <Ethernet.h>

#include <SPI.h>

#define ReadLen 0x30



byte mac[] = { 0xDE, 0xAC, 0xEA, 0xEF, 0xFF, 0xE2 };

// if you don't want to use DNS (and reduce your sketch size)

// use the numeric IP instead of the name for the server:

//IPAddress server(74,125,232,128);  // numeric IP for Google (no DNS)

char server[] = "192.168.9.6";    // name address for Google (using DNS)

char HexTable[] = "0123456789ABCDEF";

// Set the static IP address to use if the DHCP fails to assign

IPAddress ip(192,168,16,121);

IPAddress gateway(192,168,1,1);

IPAddress dns_server(60,191,134,196);

IPAddress subnet(255,255,0,0);

// Initialize the Ethernet client library

// with the IP address and port of the server 

// that you want to connect to (port 80 is default for HTTP):

EthernetClient client;



byte incomingbyte;

SoftwareSerial mySerial(4,5);                     //Configure pin 4 and 5 as soft serial port

int a=0x0000,j=0,k=0,count=0;                    //Read Starting address       

uint8_t MH,ML;

boolean EndFlag=0;

int errCount=0;

int led=8;

int led2=9;

long btime=0;

boolean picGetOutTime=false; 

                               

void SendResetCmd();

void SendTakePhotoCmd();

void SendReadDataCmd();

void StopTakePhotoCmd();

void httpRequest(byte bytes[]);



void setup()

{ 

  

    pinMode(led,OUTPUT);

    pinMode(led2,OUTPUT);

    digitalWrite(led2,LOW);

    digitalWrite(led,LOW);   

  

  Serial.begin(9600);

  mySerial.begin(38400);



  if (Ethernet.begin(mac) == 0) {

    Serial.println("Failed to configure Ethernet using DHCP");

    Ethernet.begin(mac, ip,dns_server,gateway,subnet);

  }

  

  SendResetCmd();

 delay(4000);

  readEcho(false); 

  setImgSize();

  delay(1000);

  readEcho(false);

  

  //wdt_enable(WDTO_8S);  

  Serial.println("Ready");

  

  

}



void loop() 

{

     Serial.println("loop!");

     SendResetCmd();

     delay(2000);//After reset, wait 2-3 second to send take picture command

     EndFlag=0;

     a=0x0000;j=0;k=0; count=0;  

     MH=0;ML=0;

     SendTakePhotoCmd();

     readEcho(false); 

      byte a[ReadLen];

      

      

      btime=millis();

      while(!EndFlag)

      {  

         j=0;

         k=0;

         count=0;

         SendReadDataCmd();

         delay(25);

    

          if((millis() - btime) > (1000 * 30)){

            digitalWrite(led2,HIGH);

            Serial.write("break1");

            picGetOutTime=true;

            break; 

          }

          while(mySerial.available()>0)

          {

               if((millis() - btime) > (1000 * 30)){

                 picGetOutTime=true;

                 break; 

               }



               incomingbyte=mySerial.read();

               k++;

               if((k>5)&&(j<ReadLen)&&(!EndFlag))

               {

                 a[j]=incomingbyte;

                 if((a[j-1]==0xFF)&&(a[j]==0xD9)){      //Check if the picture is over

                  EndFlag=1;

                  picGetOutTime=false;

                  StopTakePhotoCmd(); 

                  readEcho(false); 

                  Serial.println("end pic");

                  digitalWrite(led2,LOW);

                 }                  

                 j++;

             count++;

               }

          }

//         for(j=0;j<count;j++)

//         {   if(a[j]<10)

//             Serial.print("00");

//             if(a[j]>=10 && a[j]<100)

//              Serial.print("0");

//             Serial.print(a[j]);

//             Serial.print(" ");

//         }                                       //Send jpeg picture over the serial port

//        Serial.println();



         if(picGetOutTime){

               digitalWrite(led2,HIGH);

               digitalWrite(led,HIGH);

               delay(1000);

         }

         // Serial.println(count);

          while(!client.connected()){

             byte aa[]={0,0,0};

             httpRequest(aa,3);

          }

          

  

           httpRequest(a,count);





         

//          for(j=0;j<count;j++)

//          {   if(a[j]<0x10)

//              Serial.print("0");

//              Serial.print(a[j],HEX);

//              Serial.print(" ");

//          }                                       //Send jpeg picture over the serial port

//          Serial.println();

      }      

    // delay(30000);

}



//==============byte to hex string===============

 String toHex(byte bs[],int count){

  String bundle="";

   for(int i=0;i<count;i++){

     bundle += (String)( HexTable[ bs[i] / 16]) + (String)( HexTable[bs[i] % 16]);

     

   }

   return bundle;

}

//==============End byte to hex string=============



//================Http Request Code========================

void httpRequest(byte bytes[],int count){

    // if you get a connection, report back via serial:

 

  if(!client.connected()){

     Serial.println("disconnecting.");

     client.stop();

     if (client.connect(server, 7896)) {

        Serial.println("connected");

     }else{

     // kf you didn't get a connection to the server:

        Serial.println("connection failed"); 

        errCount++;

        if(errCount>=3){

          digitalWrite(led,HIGH);

          delay(1000);

        } 

    }

  } else{

       

    String bundle=toHex(bytes,count);

    //Serial.println(bundle);

    client.println("GET /main.ashx?m=img&mil=" + String(millis()) + "&b="+ bundle  +" HTTP/1.1");

    client.println("Host:192.168.9.6");

    //client.println("Connection: close");



    client.println();

    delay(10);

    String reply="";

    // if there are incoming bytes available 

    // from the server, read them and print them:

    while (client.available()) {

      char c = client.read();

      reply+=c;

      

    }



    //Serial.println(reply);

    if(reply.indexOf("\"Model\":\"OPEN\"")>=0){

      Serial.println("OPEN");

     

    }

    if(reply.indexOf("\"Model\":\"CLOSE\"")>=0){

      Serial.println("CLOSE");

        

    }

    errCount=0;

    

    //wdt_reset();

  }



  



}

//================End Http Request Code===============





void readEcho(bool show){

 while(mySerial.available()>0){

   char c=mySerial.read();

   if(show){

   Serial.print(c);

   }

 }

}

//160 * 120

void setImgSize(){

  mySerial.write(0x56);

  mySerial.write((byte)0x00);

  mySerial.write(0x31);

  mySerial.write(0x05);

  mySerial.write(0x04);

  mySerial.write(0x01);

  mySerial.write((byte)0x00);

  mySerial.write(0x19);

  mySerial.write(0x22);

  

}

//Send Reset command

void SendResetCmd()

{

      mySerial.write(0x56);

      mySerial.write((byte)0x00);

      mySerial.write(0x26);

      mySerial.write((byte)0x00);

}



//Send take picture command

void SendTakePhotoCmd()

{

      mySerial.write(0x56);

      mySerial.write((byte)0x00);

      mySerial.write(0x36);

      mySerial.write(0x01);

      mySerial.write((byte)0x00);

}



//Read data

void SendReadDataCmd()

{

      MH=a/0x100;

      ML=a%0x100;

      mySerial.write(0x56);

      mySerial.write((byte)0x00);

      mySerial.write(0x32);

      mySerial.write(0x0c);

      mySerial.write((byte)0x00);

      mySerial.write(0x0a);

      mySerial.write((byte)0x00);

      mySerial.write((byte)0x00);

      mySerial.write(MH);

      mySerial.write(ML);  

      mySerial.write((byte)0x00);

      mySerial.write((byte)0x00);

      mySerial.write((byte)0x00);

      mySerial.write(ReadLen);

      mySerial.write((byte)0x00);

      mySerial.write(0x0a);

      a+=ReadLen;                            //address increases 32,set according to buffer size

}



void StopTakePhotoCmd()

{

      mySerial.write(0x56);

      mySerial.write((byte)0x00);

      mySerial.write(0x36);

      mySerial.write(0x01);

      mySerial.write(0x03);       

}
View Code

12,13,设置pinMode(OUTPUT)时无效(连网络扩展板上)

9V 1A,外接电源,错误时,无法带动继电器

你可能感兴趣的:(图片上传)