遗忘海岸

江湖程序员 -Feiph(LM战士)

导航

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

posted on 2015-06-03 10:07  遗忘海岸  阅读(292)  评论(1编辑  收藏  举报