diff --git a/simpleVideoRecorder/src/simpleVideoRecorder.cpp b/simpleVideoRecorder/src/simpleVideoRecorder.cpp index 04574beb930637aae7e2eb6b865ccdf172caf36d..d2a3f56a1b271c16cddde2a61a37b210dcf9cf6e 100644 --- a/simpleVideoRecorder/src/simpleVideoRecorder.cpp +++ b/simpleVideoRecorder/src/simpleVideoRecorder.cpp @@ -26,7 +26,7 @@ const uint16_t localUdpPort = 2333; LightUDP streamSender; // 绑定sn后续为mac 作为sn 代表后续内容是SN 后一位是 6表示SN长度 空位的0 将填充mac -int channel_index = -1; +uint8_t channel_index[2] = {0, 0}; void connectWifi(const char *ssid, const char *passphrase) { @@ -101,11 +101,11 @@ void setup() { WiFiClient client; uint8_t bind_sn[] = {'S', 'N', ':', 6, 0, 0, 0, 0, 0, 0}; - // 将mac设置到 bind_sn 第3位 + // 将mac设置到 bind_sn 第4位 WiFi.macAddress(&bind_sn[4]); Serial.printf("MAC is:%02X%02X%02X%02X%02X%02X\n", bind_sn[4], bind_sn[5], bind_sn[6], bind_sn[7], bind_sn[8], bind_sn[9]); - int index; + int length; do { while (!client.connect(host, channelBindPort)) { log_i("connection failed,wait 3 sec..."); @@ -115,13 +115,9 @@ void setup() { client.write(bind_sn, 10); client.flush(); delay(3000); - index = client.read(); - } while (index == -1); - - if (index <= 255) { - channel_index = index; - log_i("channel_index is : %d ", channel_index); - } + length = client.read(channel_index, 2); + } while (length == -1); + log_i("channel_index is : %d ", channel_index[1] | (static_cast(channel_index[0]) << 8)); client.stop(); streamSender.begin(WiFi.localIP(), localUdpPort); @@ -129,14 +125,7 @@ void setup() { } void loop() { - // [[noreturn]] 不会执行return这里使用 goto回到行首 - return_: Serial.println("do loop"); - if (channel_index == -1) { - log_i("delay 3 sec"); - delay(3000); - goto return_; - } camera_fb_t *fb = NULL; size_t len; log_i("send image"); @@ -148,8 +137,9 @@ void loop() { break; } len = fb->len; - fb->buf[len] = channel_index; - streamSender.send(fb->buf, len + 1); + fb->buf[len++] = channel_index[0]; + fb->buf[len++] = channel_index[1]; + streamSender.send(fb->buf, len); esp_camera_fb_return(fb); } } \ No newline at end of file diff --git a/src/light-video.properties b/src/light-video.properties index c7b1e070639cd12240ac241009beb7f74afea886..07cd50f7e8b5180e5122f09d8957abac25e22acd 100644 --- a/src/light-video.properties +++ b/src/light-video.properties @@ -7,4 +7,4 @@ stream.bind.port=8004 frame.delay.skip.timeout=300 udp.video.buffer.pool.size=500 udp.video.dispatcher.thread.size=8 -udp.video.channel.size=128 \ No newline at end of file +udp.video.channel.size=300 \ No newline at end of file diff --git a/src/org/btik/server/video/UDP2Main.java b/src/org/btik/server/video/UDP2Main.java index c60494f986289582b69f87f649aeb0cd96130f60..f36d1c7227d0efd262f62f54f5525f2ce3803211 100644 --- a/src/org/btik/server/video/UDP2Main.java +++ b/src/org/btik/server/video/UDP2Main.java @@ -12,7 +12,7 @@ import java.io.IOException; import java.util.Properties; public class UDP2Main { - private static final String version = "0.0.3.1"; + private static final String version = "0.0.3.2"; static Properties properties; static { diff --git a/src/org/btik/server/video/device/udp2/NewUDPDeviceChannel.java b/src/org/btik/server/video/device/udp2/NewUDPDeviceChannel.java index 82819ae72cdfde46337aecd29a091f90a255e1a1..fd85270e5e0413394bca1725b94bd3af13807eb3 100644 --- a/src/org/btik/server/video/device/udp2/NewUDPDeviceChannel.java +++ b/src/org/btik/server/video/device/udp2/NewUDPDeviceChannel.java @@ -120,9 +120,9 @@ public class NewUDPDeviceChannel extends Thread implements DevChannel { DatagramPacket datagramPacket = new DatagramPacket(frameBuffer.data, 0, frameBuffer.data.length); while (runFlag) { serverSocket.receive(datagramPacket); - // 最后一位是通道索引,故长度 -1 才是照片数据 - frameBuffer.size = datagramPacket.getLength() - 1; - frameBuffer.channelIndex = frameBuffer.data[frameBuffer.size] & 0xff; + // 最后二位是通道索引,故长度 -2 才是照片数据 + frameBuffer.size = datagramPacket.getLength() - 2; + frameBuffer.channelIndex = ((frameBuffer.data[frameBuffer.size] & 0xff) << 8) | (frameBuffer.data[frameBuffer.size + 1] & 0xff); frameBuffer.time = System.currentTimeMillis(); frameDispatchers[frameBuffer.channelIndex & dispatcherPoolSize - 1].messages.add(frameBuffer); // 切换缓冲区 @@ -208,7 +208,7 @@ public class NewUDPDeviceChannel extends Thread implements DevChannel { System.arraycopy(snHexVal, 0, snAddr, 1, SN_LEN); VideoChannel channel = videoServer.createChannel(snAddr); videoChannelTable[channelIndex] = channel; - if(channel instanceof SoSendCheckTarget){ + if (channel instanceof SoSendCheckTarget) { soSendTimeoutTicker.registerChannel(channelIndex, (SoSendCheckTarget) channel); } } diff --git a/src/org/btik/server/video/device/udp2/bind/DeviceSnChannelBinder.java b/src/org/btik/server/video/device/udp2/bind/DeviceSnChannelBinder.java index 50cf6cf335f5c3dc9cccf155425ec149b5b2f02b..5d3b3c1c33d735942cfbf002869443d07b8e6731 100644 --- a/src/org/btik/server/video/device/udp2/bind/DeviceSnChannelBinder.java +++ b/src/org/btik/server/video/device/udp2/bind/DeviceSnChannelBinder.java @@ -41,8 +41,8 @@ public class DeviceSnChannelBinder extends Thread { public DeviceSnChannelBinder(int size, int port) { super("UDPDeviceSnChannelBinder"); - if (size < 0 || size > 0xff) { - throw new IllegalArgumentException("The count of channels can only be between 0~255 "); + if (size < 0 || size > 0xffff) { + throw new IllegalArgumentException("The count of channels can only be between 0~65535 "); } for (int i = 0; i < size; i++) { channelIndexQueue.add(i); @@ -94,7 +94,8 @@ public class DeviceSnChannelBinder extends Thread { } OutputStream outputStream = cam.getOutputStream(); - outputStream.write(index); + outputStream.write((index >> 8) & 0xff); + outputStream.write(index & 0xff); outputStream.flush(); newUDPDeviceChannel.onNewChannelOpen(index, snBytes); } catch (IOException e) { diff --git a/src/org/btik/server/video/device/web/SoSendTimeoutTicker.java b/src/org/btik/server/video/device/web/SoSendTimeoutTicker.java index 21bf52190f21775b56ed099bb739026c7bcb98cd..bd576484acc613ddc29ccdc9640b4c2ccf35492b 100644 --- a/src/org/btik/server/video/device/web/SoSendTimeoutTicker.java +++ b/src/org/btik/server/video/device/web/SoSendTimeoutTicker.java @@ -24,7 +24,7 @@ public class SoSendTimeoutTicker extends Thread { private int timeout = 300; - private final SoSendCheckTarget[] checkTargets; + private SoSendCheckTarget[] checkTargets; public void setVideoChannelCount(int videoChannelCount) { this.videoChannelCount = Math.max(videoChannelCount, 1); @@ -36,11 +36,12 @@ public class SoSendTimeoutTicker extends Thread { public SoSendTimeoutTicker() { super("SoSendTimeoutTicker"); - checkTargets = new SoSendCheckTarget[videoChannelCount]; + } @Override public void run() { + checkTargets = new SoSendCheckTarget[videoChannelCount]; while (runFlag) { synchronized (lock) { try {