• 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
    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
    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端

    /* 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,外接电源,错误时,无法带动继电器

  • 相关阅读:
    Linux中大括号{}的应用
    shell script编程(1)>>学生成绩管理系统
    不同版本的Linux防火墙关闭和开启
    shell script的执行方式区别
    包管理介绍(DPKG,APT,RPM,YUM,DNF)
    MBR与GPT,BIOS与UEFI..总结
    Windows10下安装Ubuntu的错误总结
    学生管理系统及票务管理系统总结
    python 3.x和python 2.x下的换行问题
    输出整数各位数字
  • 原文地址:https://www.cnblogs.com/wdfrog/p/4548415.html
Copyright © 2020-2023  润新知